runcastle 1.5.4 → 1.5.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/runcastle.js +376 -245
- package/drizzle/0054_careless_stellaris.sql +3 -0
- package/drizzle/meta/0054_snapshot.json +1268 -0
- package/drizzle/meta/_journal.json +7 -0
- package/index.js +376 -245
- package/package.json +1 -1
- package/skills/packs/runcastle/skills/feature/SKILL.md +2 -2
- package/skills/packs/runcastle/skills/feature/references/design.md +29 -3
- package/skills/packs/runcastle/skills/feature/references/grilling.md +6 -4
- package/skills/packs/runcastle/skills/feature/references/planning-alone.md +59 -9
- package/skills/packs/runcastle/skills/feature/references/rounds.md +2 -0
- package/skills/packs/runcastle/skills/project/SKILL.md +92 -51
- package/skills/packs/runcastle/skills/project/references/health-sweeps.md +6 -5
- package/skills/packs/runcastle/skills/project/references/triage.md +17 -12
- package/web/assets/{index-CT9k1kz0.css → index-B1MyomR6.css} +1 -1
- package/web/assets/{index-DVR7VbWW.js → index-CPgKzYyE.js} +50 -50
- package/web/index.html +2 -2
package/package.json
CHANGED
|
@@ -29,7 +29,7 @@ When the feature changes how a screen looks, offer to show it live before you ta
|
|
|
29
29
|
|
|
30
30
|
## The human's yes
|
|
31
31
|
|
|
32
|
-
Before the first round, draw the plan preview (`./references/preview.md`, from `./references/preview-starter.html`) and get the human's **explicit yes in chat**. Ask again before any round the agreed plan did not settle. This is the only approval there is; nothing on the server checks it, so it rests on you. Work the plan already settled — a fix round, a retry, the next round it describes — needs no new yes.
|
|
32
|
+
Before the first round, draw the plan preview (`./references/preview.md`, from `./references/preview-starter.html`) and get the human's **explicit yes in chat**. Ask again before any round the agreed plan did not settle. This is the only approval there is; nothing on the server checks it, so it rests on you. Work the plan already settled — a fix round, a retry, the next round it describes — needs no new yes. Designs left uncommitted for the human are approved by that yes as they stand: commit them before the round (`./references/design.md`, section 8).
|
|
33
33
|
|
|
34
34
|
Then run rounds: `./references/rounds.md`.
|
|
35
35
|
|
|
@@ -62,7 +62,7 @@ Commit what you write, docs included, with conventional subjects (`feat(scope):
|
|
|
62
62
|
|
|
63
63
|
## Situations
|
|
64
64
|
|
|
65
|
-
- **An orchestrator relay** — a message from the project's orchestrator, not the human: act on it as far as the agreed plan allows, and mark any decision it changes as the orchestrator's (`./references/grilling.md`).
|
|
65
|
+
- **An orchestrator relay** — a message that opens with a line saying it is from the project's orchestrator, not the human: act on it as far as the agreed plan allows, and mark any decision it changes as the orchestrator's. When that opening line says instead that it relays the human's own answer, treat it as the human confirming (`./references/grilling.md`). It never approves a design unless it relays the human's own answer: designs wait for the human (`./references/design.md`, section 8).
|
|
66
66
|
- **A merge conflict to resolve** — resolve it on the feature branch so both sides' intent survives, run the checks, commit.
|
|
67
67
|
- **A shipped feature** — it is done: answer questions and amend its docs only.
|
|
68
68
|
- **No human present** (a headless planning run) — follow `./references/planning-alone.md`.
|
|
@@ -17,8 +17,9 @@ your first reply, before you ask about layout or styling in words: say you can
|
|
|
17
17
|
show the current screen beside the chat and change it live, and that the first
|
|
18
18
|
time takes a few minutes to install and start. Open it when they say yes, and
|
|
19
19
|
without asking when they ask to see something. Do not wait for them to name
|
|
20
|
-
design mode; most people will not know it exists. With no human present
|
|
21
|
-
|
|
20
|
+
design mode; most people will not know it exists. With no human present, design
|
|
21
|
+
by `./planning-alone.md` ("Designing alone"): look at your screens yourself, never
|
|
22
|
+
show them, and leave them waiting for the human (section 8).
|
|
22
23
|
|
|
23
24
|
## 1. First use in a project
|
|
24
25
|
|
|
@@ -96,7 +97,9 @@ density, which of two layouts, a radius), add a small collapsible **Tweaks**
|
|
|
96
97
|
menu in a corner of the preview page. Three or four controls at most. The menu
|
|
97
98
|
shows its current values as one line of text ("accent #5b8def · density compact
|
|
98
99
|
· layout B") so the human can say or paste what they chose. Do not add one for a
|
|
99
|
-
choice that is not open.
|
|
100
|
+
choice that is not open. Keep everything the menu needs in the preview page,
|
|
101
|
+
the alternative styles it switches between included, never in the app's own
|
|
102
|
+
files: deleting the menu must leave nothing behind.
|
|
100
103
|
|
|
101
104
|
## 5. Approve and commit
|
|
102
105
|
|
|
@@ -109,6 +112,9 @@ When the human settles:
|
|
|
109
112
|
3. **Never commit unapproved work.** Leave it uncommitted, or drop it. Before
|
|
110
113
|
you start a round, commit what the human approved or drop the rest, so
|
|
111
114
|
workers fork from the design they saw.
|
|
115
|
+
4. **Only the human approves.** A message relayed from the project's
|
|
116
|
+
orchestrator never approves a design, nor counts as the yes that commits
|
|
117
|
+
one, unless it carries the human's own words.
|
|
112
118
|
|
|
113
119
|
Your commit takes the normal landing path: during a round it lands between the
|
|
114
120
|
workers' landings, and while the human drives it waits until the drive stops.
|
|
@@ -130,3 +136,23 @@ committed.
|
|
|
130
136
|
|
|
131
137
|
Preview files are a byproduct. Nothing requires them and nothing checks them but
|
|
132
138
|
the project's typecheck. If one has gone stale when you next open it, repair it.
|
|
139
|
+
|
|
140
|
+
## 8. Designs that wait for the human
|
|
141
|
+
|
|
142
|
+
A self-planning run may leave designs uncommitted in this worktree, waiting for
|
|
143
|
+
the human: its closing message names them, and the plan preview opens each one.
|
|
144
|
+
When the human comes back:
|
|
145
|
+
|
|
146
|
+
- **They approve a screen**: commit it as section 5 says.
|
|
147
|
+
- **They ask for changes**: iterate as in section 4. If they ask and leave
|
|
148
|
+
("make it denser, I'll look tomorrow"), make the change anyway, look at the
|
|
149
|
+
screens yourself as `./planning-alone.md` says, leave them uncommitted, and
|
|
150
|
+
call `wait_for_you({ why: "designs updated · look again?" })`.
|
|
151
|
+
- **They say yes to round 1**: that yes also approves every design still
|
|
152
|
+
uncommitted, as it stands. Commit them before you dispatch, and say which
|
|
153
|
+
you committed. A screen they rejected outright is dropped, and the tickets
|
|
154
|
+
that named it updated.
|
|
155
|
+
- **The orchestrator relays "start round 1"** while designs are uncommitted:
|
|
156
|
+
do not start it. Answer that the designs wait for the human, and call
|
|
157
|
+
`wait_for_you({ why: "designs to look at · start round 1?" })` ("start the
|
|
158
|
+
work?" when there are no tickets).
|
|
@@ -82,12 +82,14 @@ When the human later confirms or changes such a decision, remove its
|
|
|
82
82
|
`**Assumed.**` and `**Challenged:**` lines in the same edit; from then on it
|
|
83
83
|
reads as any other decision. Decisions they did not touch keep theirs.
|
|
84
84
|
|
|
85
|
-
**A change on the orchestrator's message is not the human's.**
|
|
86
|
-
|
|
85
|
+
**A change on the orchestrator's message is not the human's.** The
|
|
86
|
+
orchestrator's messages open with a line saying they are from the project's
|
|
87
|
+
orchestrator. When a message comes from it, a decision it changes keeps its
|
|
87
88
|
`**Assumed.**` line, or gains one, and adds
|
|
88
89
|
`**Changed by the orchestrator:** <why>`. The human has not seen it, and the
|
|
89
|
-
record must say who decided. A message
|
|
90
|
-
the human confirming: remove the marks, that
|
|
90
|
+
record must say who decided. A message whose opening line says instead that it
|
|
91
|
+
relays the human's own answer is the human confirming: remove the marks, that
|
|
92
|
+
line included.
|
|
91
93
|
|
|
92
94
|
**Later information supersedes, it does not rewrite.** When the human comes
|
|
93
95
|
back with something new after decisions were written — a constraint they
|
|
@@ -7,10 +7,13 @@ instead (`./grilling.md`); nothing here binds that conversation.
|
|
|
7
7
|
You still look facts up, model the domain and park scope creep as
|
|
8
8
|
`./grilling.md` says. What changes is who answers.
|
|
9
9
|
|
|
10
|
-
**This run plans; it does not build.**
|
|
11
|
-
never call `dispatch_round` in this run
|
|
12
|
-
|
|
13
|
-
and, when the work is worth handing to workers, its tickets
|
|
10
|
+
**This run plans; it does not build.** Whatever the plan says,
|
|
11
|
+
never call `dispatch_round` in this run: no round starts without the human's
|
|
12
|
+
yes. You write the feature's docs (`decisions.md`, `spec.md`, `preview.html`)
|
|
13
|
+
and, when the work is worth handing to workers, its tickets. The one exception
|
|
14
|
+
is designing its screens (**Designing alone**, below): for that, and only that,
|
|
15
|
+
you may install dependencies and write components, preview pages and sample
|
|
16
|
+
data. Write no other code.
|
|
14
17
|
|
|
15
18
|
- **One turn.** Do the whole plan in this one turn. Never end the turn to ask a
|
|
16
19
|
question or to report progress: nobody will reply, and ending the turn ends
|
|
@@ -48,7 +51,49 @@ and, when the work is worth handing to workers, its tickets — nothing else.
|
|
|
48
51
|
guesses about their intent the brief did not settle, decisions that force
|
|
49
52
|
several others, and decisions the challenger disagreed with. They open the
|
|
50
53
|
preview's decisions part (`./preview.md`).
|
|
51
|
-
- **
|
|
54
|
+
- **Design, but never show.** You may design the feature's screens
|
|
55
|
+
(**Designing alone**, below), but never call `show_panel`: nobody is there to
|
|
56
|
+
look, and the human opens the designs when they choose.
|
|
57
|
+
|
|
58
|
+
## Designing alone
|
|
59
|
+
|
|
60
|
+
Design when the feature **adds a screen or changes a screen's layout**. A small
|
|
61
|
+
visual change (a colour, a label, one control) is described in the plan
|
|
62
|
+
instead: it would not repay the install. A feature with no screen designs
|
|
63
|
+
nothing.
|
|
64
|
+
|
|
65
|
+
- **When.** Once the decisions are recorded and before the spec, so the spec,
|
|
66
|
+
the tickets and the preview can name the designed components.
|
|
67
|
+
- **How.** As `./design.md` says for an attended chat: the project's own
|
|
68
|
+
install, the project's own frontend dev server, one preview page per state,
|
|
69
|
+
sample data, navigation off, real components, the project's design docs.
|
|
70
|
+
Design against the components on the feature's base branch; never read
|
|
71
|
+
another feature's worktree. If a screen needs a shared component changed, change
|
|
72
|
+
it here and say so in the closing message.
|
|
73
|
+
- **Tweaks for taste.** Where a look is genuinely open (two layouts, a density,
|
|
74
|
+
an accent), leave a Tweaks menu on that preview page instead of guessing
|
|
75
|
+
(`./design.md`, Tweaks). **At most two
|
|
76
|
+
open choices per screen**: past that, pick, and list your picks in the
|
|
77
|
+
closing message. Everything the menu needs, the alternative styles included,
|
|
78
|
+
lives in the preview page, never in the app's own files.
|
|
79
|
+
- **Look at your own screens.** Call `start_design_server({ command })`, which
|
|
80
|
+
also records the command so the human's Open in design starts it later. Then
|
|
81
|
+
check every preview page. With `agent-browser` on the PATH: `agent-browser
|
|
82
|
+
open <url>`, `agent-browser screenshot <path>` (a temporary path, never in the
|
|
83
|
+
repo), read the image, critique it against the project's design docs, fix it,
|
|
84
|
+
and look again; `agent-browser close` when done. Without it, check that each
|
|
85
|
+
page compiles and serves, and say in the closing message that you never saw
|
|
86
|
+
them. The design server stops by itself when this run ends.
|
|
87
|
+
- **A screen you cannot serve** (no frontend dev server you can work out, a
|
|
88
|
+
page the server builds, native mobile) is a hand mock in `preview.html`, as
|
|
89
|
+
any plan draws one. Say so in the closing message. Do not stop or ask.
|
|
90
|
+
- **Leave the designs uncommitted.** Never commit a component, preview page,
|
|
91
|
+
sample data or `.runcastle/design.json` you designed: only the human's
|
|
92
|
+
approval commits them. Commit your docs by path, so nothing designed rides
|
|
93
|
+
along.
|
|
94
|
+
- **In the preview**, each designed screen is a designed-screen entry
|
|
95
|
+
(`./preview.md`, Designed screens) naming its component file and preview page.
|
|
96
|
+
A ticket that wires one follows `./tickets.md` on designed screens.
|
|
52
97
|
|
|
53
98
|
## Straight through, then ask
|
|
54
99
|
|
|
@@ -62,9 +107,14 @@ and, when the work is worth handing to workers, its tickets — nothing else.
|
|
|
62
107
|
first (by number and title), whether it is tickets or work you will do
|
|
63
108
|
yourself, and anything that stopped you doing the job (a refused or failed
|
|
64
109
|
tool the plan needed, and what you decided without it). Leave out the state
|
|
65
|
-
of tools and connectors the plan did not need.
|
|
110
|
+
of tools and connectors the plan did not need. **If you designed**, also
|
|
111
|
+
name each designed screen, the open Tweaks choices, any shared component you
|
|
112
|
+
changed, and whether you saw the screens in screenshots or only checked that
|
|
113
|
+
they compile, and say that the yes commits the designs as they stand. Close the message by asking
|
|
66
114
|
the human for their yes to start round 1 (or to start the work, if there are
|
|
67
115
|
no tickets).
|
|
68
|
-
6. Call `mcp__runcastle__wait_for_you({ why: "start round 1?" })`,
|
|
69
|
-
|
|
70
|
-
|
|
116
|
+
6. Call `mcp__runcastle__wait_for_you({ why: "start round 1?" })`, or
|
|
117
|
+
`mcp__runcastle__wait_for_you({ why: "designs to look at · start round 1?" })`
|
|
118
|
+
if you designed. With no tickets, say "start the work?" in place of "start
|
|
119
|
+
round 1?". Then end the turn. The human answers in this chat when they
|
|
120
|
+
are back; their yes is what starts the work, in a later turn.
|
|
@@ -10,6 +10,8 @@ plan the next move.
|
|
|
10
10
|
|
|
11
11
|
Start the first round only after the human's explicit yes in chat, and ask again
|
|
12
12
|
before any round the agreed plan did not settle (SKILL.md, "The human's yes").
|
|
13
|
+
If designs wait uncommitted in the worktree, the human's yes commits them first;
|
|
14
|
+
an orchestrator relay never does (`./design.md`, section 8).
|
|
13
15
|
|
|
14
16
|
## What you run on
|
|
15
17
|
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: project
|
|
3
|
-
description: The runcastle project session. Take a lump of raw intent, consult the portfolio first, shape-grill it and advise on how it should be cut, and create the features with real briefs — plus portfolio Q&A, routing to one of five destinations, advisory-only curation, and the charter (CONTEXT.md), which this is the only session allowed to write. Entry skill for kind=project sessions.
|
|
3
|
+
description: The runcastle project session, which is always the project's orchestrator. Take a lump of raw intent, consult the portfolio first, shape-grill it and advise on how it should be cut, and create the features with real briefs; then plan, start, message, drive and merge features as far as the human asked — plus portfolio Q&A, routing to one of five destinations, advisory-only curation, and the charter (CONTEXT.md), which this is the only session allowed to write. Entry skill for kind=project sessions.
|
|
4
4
|
disable-model-invocation: false
|
|
5
5
|
---
|
|
6
6
|
<!-- Forked from Matt Pocock's grilling + domain-modeling skills, via https://github.com/mattpocock/skills, 2026-07-14, adapted for runcastle's project-level session -->
|
|
7
7
|
|
|
8
8
|
# Project session
|
|
9
9
|
|
|
10
|
-
You belong to the **project**, not to any feature.
|
|
10
|
+
You belong to the **project**, not to any feature. You have no feature state of your own to move and no planning step to report.
|
|
11
11
|
|
|
12
12
|
Your defining job is the one no other surface in runcastle can do: **intake and decomposition terminating in feature creation**. Every other door into the pipeline demands a title and a one-liner up front, which means it demands the human has already cut their thought into a feature. You are where they don't have to — and, because you are the only session that can see the *whole portfolio*, you are the only one that can tell them their thought is really two features, or one they already shipped.
|
|
13
13
|
|
|
@@ -15,24 +15,38 @@ You are a **shape griller, not a design griller.** You grill across the whole lu
|
|
|
15
15
|
|
|
16
16
|
Everything else you do — portfolio Q&A, routing, curation, the charter — is support for that job or a consequence of being the one session at project scope.
|
|
17
17
|
|
|
18
|
-
**
|
|
18
|
+
**You are also always this project's orchestrator.** **Orchestrating** below is standing guidance, in force in every conversation: it is how you act on features — plan, start, message, drive and merge them — when the human asks, and how far. Everything else here — the shape grill, the cut, the portfolio, the charter — governs you alongside it.
|
|
19
19
|
|
|
20
20
|
## Your tools
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
None of them is the feature pipeline's own. Writing tickets and running rounds is a feature agent's work — `emit_tickets`, `dispatch_round` and the ticket-surgery tools are not registered for this kind at all. The three project-notes tools and `set_feature_dependencies` run the other way: they are registered for **this kind only**, because the project session is the only surface that marks a note triaged or re-orders the portfolio.
|
|
23
|
+
|
|
24
|
+
**Reading and creating:**
|
|
23
25
|
|
|
24
26
|
- `mcp__runcastle__get_project_context()` — the project row, the charter (`CONTEXT.md`) in full, an **index** of every live ADR (superseded ones omitted), `baseBranches` (the checkout's `current` branch, whether it is a selectable base (`currentIsSelectable`), every `selectable` base, and the `detectedMain` line), and a feature index of one `<slug> — <title> [state]` line per feature: every in-flight feature and draft, then the 50 most recently shipped. Older shipped and archived features collapse into one closing line that counts them and says how to reach them. ADR bodies and one-liners are *not* inlined.
|
|
25
27
|
- `mcp__runcastle__read_adr({ relPath })` — one ADR in full, from the index. This is how you read the decisions that bind the idea in front of you, one at a time, instead of swallowing them all.
|
|
26
|
-
- `mcp__runcastle__read_feature_brief({ slug })` — one feature's title, one-liner, status
|
|
27
|
-
- `mcp__runcastle__get_work_record({ featureSlug? , seam? , seq? })` — what features actually **did**. Send exactly one of `featureSlug` or `seam`. The **seam** form lists matching tickets as rows — feature slug, `seq`, title, status, seams, commits, error — with no digests. The **featureSlug** form tells the whole story: tickets by status, seams, commits, errors, run summaries, and each
|
|
28
|
+
- `mcp__runcastle__read_feature_brief({ slug })` — one feature's title, one-liner, status and brief: off disk for a shipped feature, from the database for an in-flight or draft one. This is how you go from "that title sounds related" to what the feature is for.
|
|
29
|
+
- `mcp__runcastle__get_work_record({ featureSlug? , seam? , seq? })` — what features actually **did**. Send exactly one of `featureSlug` or `seam`. The **seam** form lists matching tickets as rows — feature slug, `seq`, title, status, seams, commits, error — with no digests. The **featureSlug** form tells the whole story: tickets by status, seams, commits, errors, run summaries, and each worker's digest of what it actually did, what surprised it and what it left undone; a digest too large to fit is moved out and its ticket marked `digestNotInlined: true`. **`featureSlug` + `seq`** returns that one ticket with its digest. Facts, never intent.
|
|
28
30
|
- `mcp__runcastle__create_feature({ title, oneLiner, baseBranch?, brief?, draft?, dependsOn? })` — the end of intake. `dependsOn` (feature slugs, drafts only) records merge order (§1c).
|
|
29
31
|
- `mcp__runcastle__set_feature_dependencies({ slug, dependsOn })` — replaces a draft's whole merge-order set (§1c).
|
|
30
32
|
- `mcp__runcastle__record_event({ type, message })` — a note on the project timeline.
|
|
31
33
|
- `mcp__runcastle__list_project_notes()` — the project's **open notes**, oldest first: id, text, createdAt, and for a note with a screenshot its absolute host path (`Read` it) plus a ready-made attachment sentence to paste into a ticket string. A note taken during a project test drive also carries `driveBranch` and `driveCommit`: it was noted while driving `<driveBranch>` @ `<driveCommit>`, which tells you whether it predates a fix.
|
|
32
34
|
- `mcp__runcastle__triage_project_note({ noteIds, outcome, featureId? })` — marks one or several notes triaged, with the one-line outcome they are frozen with.
|
|
33
35
|
- `mcp__runcastle__update_project_note({ noteId, text })` — rewrites an open note's text.
|
|
36
|
+
- `mcp__runcastle__get_feature_context({ slug })`, `mcp__runcastle__read_feature_doc({ slug, relPath })`, `mcp__runcastle__list_tickets({ slug })` and `mcp__runcastle__get_ticket({ slug, seq })` — any feature's own record: its state, docs, tickets and rounds, whether its agent is waiting and why, and `humanTypedAt`, when the human last typed in its chat (**Orchestrating**, *Talking to a feature's agent*).
|
|
37
|
+
|
|
38
|
+
**Acting on a feature** — each refuses only what the human's own button would refuse:
|
|
34
39
|
|
|
35
|
-
|
|
40
|
+
- `mcp__runcastle__start_feature({ slug, baseBranch })` — starts a backlog feature: cuts its branch from the base you state (§1c).
|
|
41
|
+
- `mcp__runcastle__plan_feature({ slug })` — has the feature plan itself, headless: its agent grills alone, writes its decisions and spec, and then waits for the yes to start round 1.
|
|
42
|
+
- `mcp__runcastle__send_to_feature({ slug, message, relaysHuman? })` — delivers a message into the feature's chat, to its agent. It arrives marked as the orchestrator's; with `relaysHuman: true` it arrives as the human's own answer, relayed.
|
|
43
|
+
- `mcp__runcastle__read_feature_chat({ slug })` — the last turns of the feature's chat, and the transcript's path: what its agent said back, or the question behind its wait.
|
|
44
|
+
- `mcp__runcastle__stop_feature_run({ slug })` — stops the feature's running work, as its **Stop** does.
|
|
45
|
+
- `mcp__runcastle__drive({ slug?, action })` — starts or stops a test drive of a feature branch, or of the base branch.
|
|
46
|
+
- `mcp__runcastle__merge_feature({ slug })` — merges the feature through runcastle (**Orchestrating**, *Merging*).
|
|
47
|
+
- `mcp__runcastle__add_to_brief({ slug, text })` — appends to a feature's brief: the one write you have on a feature's docs.
|
|
48
|
+
|
|
49
|
+
**What the feature index makes readable.** A **shipped** feature's docs are on disk here at `docs/features/<slug>/` — read them with ordinary `Read`/`Grep`, and grep `docs/features/*/brief.md` for the older ones the index collapsed into its closing line. An **in-flight** one's docs are on an unmerged branch, but its index line is `<slug> — <title> [in flight, X pending]` (`in flight: round running` while a round is going) and `read_feature_brief({ slug })` returns its brief, `read_feature_doc({ slug, relPath })` its other docs. **That slug is the handle**: `get_work_record({ featureSlug })` works on in-flight features too. So "it's in flight, I can't see it" is not an answer.
|
|
36
50
|
|
|
37
51
|
**Three procedures load on demand**, beside this file — read one only when that job actually arrives: `./references/charter.md` (writing or amending `CONTEXT.md` and project ADRs — §5), `./references/health-sweeps.md` (running a sweep — §6) and `./references/triage.md` (triaging the project's jotted notes — **Notes triage**).
|
|
38
52
|
|
|
@@ -61,9 +75,9 @@ A feature idea has landed. The order is fixed, and it is the whole point of this
|
|
|
61
75
|
|
|
62
76
|
Your first move on a feature idea is a **lookup, not a question**. You are the only session that can see across features, and an intake that skips the lookup is a form with a chat bubble around it.
|
|
63
77
|
|
|
64
|
-
- `get_project_context` — the feature index (what exists at all, shipped and in flight, each in-flight one with its slug,
|
|
78
|
+
- `get_project_context` — the feature index (what exists at all, shipped and in flight, each in-flight one with its slug, whether a round is running, and its ticket counts) and the index of live ADRs. A title that sounds related is a lead, not an answer: `read_feature_brief({ slug })` says what that feature is for.
|
|
65
79
|
- `read_adr({ relPath })` — the one or two ADRs the index says already bind this area. A live ADR is the current answer regardless of what any feature argued on the way there.
|
|
66
|
-
- `get_work_record({ featureSlug })` — what a neighbouring feature actually **did**: its status, its ship date, its run summaries, and its tickets each carrying the
|
|
80
|
+
- `get_work_record({ featureSlug })` — what a neighbouring feature actually **did**: its status, its ship date, its run summaries, and its tickets each carrying the worker's own digest of what it built, what surprised it, and what it left undone. That "left undone" line is where the idea in front of you has most often already been half-answered. **This works on in-flight features too** — take the slug straight off the index line.
|
|
67
81
|
- `get_work_record({ seam })` — the same, asked sideways: *who has touched this area before, and what happened to them?* Use it whenever the idea names a surface rather than a feature. It returns ticket rows without digests; read one ticket's digest with `get_work_record({ featureSlug, seq })`.
|
|
68
82
|
- `docs/features/<slug>/` on disk — a **merged** feature's unabridged argument: its `decisions.md` says what was settled and why.
|
|
69
83
|
|
|
@@ -82,11 +96,11 @@ Now talk. In this order, and all of it before any `create_feature`:
|
|
|
82
96
|
|
|
83
97
|
If you cannot say which way an answer would swing the cut, you do not need to ask it. The grill **stops at the cut**: it locks no decisions and writes no feature docs.
|
|
84
98
|
- **Recommend, don't interrogate.** Put your proposed cut to them and say why it is the cut. They correct or confirm. Never ask a bare question with no recommendation attached.
|
|
85
|
-
- **Suggest how to split the work.** This is the advice they came for: is this one feature or three? What lands first, and what is it that later work needs from it? What should
|
|
99
|
+
- **Suggest how to split the work.** This is the advice they came for: is this one feature or three? What lands first, and what is it that later work needs from it? What should be built first, if the obvious version is too big to be worth doing whole? Say which order you would take and why.
|
|
86
100
|
- **Cut until every feature fits one ideation window.** Each feature you propose must be thinkable in a single `/runcastle:feature` session. A piece that is not gets cut further, or its later parts are parked as drafts. Big intent never reaches ideation as one feature — you are the size gate.
|
|
87
101
|
- **Push on the cut, not the design.** For each candidate: *what must this feature NOT swallow?* A boundary nobody can state is not a boundary.
|
|
88
102
|
|
|
89
|
-
**This is a shape grill, not a design grill, and you must not run a design grill.** No data shapes, no UX detail, no edge cases, no pushing until the design resolves, no locking decisions, and no writing to any feature's docs. That is `/runcastle:feature`'s job and it does it with the feature's whole context in one unbroken window — a design grill here
|
|
103
|
+
**This is a shape grill, not a design grill, and you must not run a design grill.** No data shapes, no UX detail, no edge cases, no pushing until the design resolves, no locking decisions, and no writing to any feature's docs. That is `/runcastle:feature`'s job and it does it with the feature's whole context in one unbroken window — a design grill here spends the human's patience twice and produces the worse version, because you are working from a one-line index where the grill session has the repo. Stop at the cut. When the human starts answering design questions rather than scope questions, say so and point them at the feature's own session.
|
|
90
104
|
|
|
91
105
|
### 1c. Create — once the split is agreed
|
|
92
106
|
|
|
@@ -116,9 +130,9 @@ Each one carries a real `brief` — what the shape grill learned, in prose, so i
|
|
|
116
130
|
- **open** — what is still unsure, and what the human wants to test-drive first;
|
|
117
131
|
- **ordering** — where it sits relative to its sibling features from the same cut: what must merge before it, and what waits on it. State the order in prose; nothing enforces it.
|
|
118
132
|
|
|
119
|
-
It is written into `brief.md` verbatim and it is what the
|
|
133
|
+
It is written into `brief.md` verbatim and it is what the feature's agent (and eventually its workers) reads. A brief that just restates the one-liner throws away the entire conversation; that reasoning has no other home once this terminal closes.
|
|
120
134
|
|
|
121
|
-
**
|
|
135
|
+
**Creating a feature sets nothing working.** The new cards appearing in the rail are the feedback. Whether you then plan or start one is what the human asked, or what the cut's working agreement says (**Orchestrating**); never your own reading of what should be worked next.
|
|
122
136
|
|
|
123
137
|
## 2. Routing — five destinations, and that is the whole list
|
|
124
138
|
|
|
@@ -126,8 +140,8 @@ Anything that arrives (from the human, or from a sweep in §6) goes to exactly o
|
|
|
126
140
|
|
|
127
141
|
1. **A new feature** — it has real design questions, which its *own* grill session will work. `create_feature` with a brief.
|
|
128
142
|
2. **A small, concrete change** — work too small to deserve a conversation ("make this darker"; "expected X, got Y, repro like this"). Still `create_feature({ title, oneLiner, brief })`, with a brief concrete enough that nothing is left to grill: what to change, and the repro or the expected/got for a bug. Its own agent reads the brief and the code, does a small change itself or writes tickets, and asks the human for the yes in its chat. **One feature per change, not per fix:** several small fixes that belong to the same change go in that one brief; creating one each would give you a feature each. **During notes triage that rule widens to one batched feature per triage session** — every small theme of the pass goes into that single brief (**Notes triage**).
|
|
129
|
-
3. **An existing feature's change** — it belongs to a feature already in flight.
|
|
130
|
-
4. **More rounds** — the
|
|
143
|
+
3. **An existing feature's change** — it belongs to a feature already in flight. Once the human agrees that is where it goes, **send it to that feature's agent** with `send_to_feature`, carrying the reasoning, not a pointer to this chat. When the feature is busy (**Orchestrating**), wait, or give the human the line to say in its chat themselves.
|
|
144
|
+
4. **More rounds** — the feature is ready and the drive taught them it is not right yet. Send what is wrong to its agent with `send_to_feature`, or the human says so in that feature's chat or with **Send to agent** from the drive; its agent runs more rounds.
|
|
131
145
|
5. **Nothing** — it is already decided, already built, or not worth doing. Say so plainly, with the ADR or the shipped feature that settles it.
|
|
132
146
|
|
|
133
147
|
Say which destination and why. Do not invent a sixth.
|
|
@@ -138,7 +152,7 @@ Say which destination and why. Do not invent a sixth.
|
|
|
138
152
|
|
|
139
153
|
Answer from `get_project_context` + `read_adr` (the charter and the live ADRs bind you and bind everyone), `get_work_record` (facts: what a feature's tickets touched, what failed), and ordinary reads of `docs/features/<slug>/` on disk for the unabridged argument.
|
|
140
154
|
|
|
141
|
-
Cite the address you read — `docs/adr/0007-….md`, `docs/features/
|
|
155
|
+
Cite the address you read — `docs/adr/0007-….md`, `docs/features/notes-inbox/decisions.md#3`, a commit sha. An answer with no address is a guess with a confident tone. If a live ADR settles it, say so and stop; that is the current answer regardless of what any feature's docs argued on the way there.
|
|
142
156
|
|
|
143
157
|
## 4. Curation — advisory only
|
|
144
158
|
|
|
@@ -175,23 +189,27 @@ The human jots one-line notes (often with a screenshot) from any screen in the p
|
|
|
175
189
|
|
|
176
190
|
## Orchestrating
|
|
177
191
|
|
|
178
|
-
This
|
|
192
|
+
This is standing guidance: you are this project's orchestrator in every conversation, and nothing turns it on or off.
|
|
193
|
+
|
|
194
|
+
**You are the senior engineer running this project's agents.** The human talks to you, agrees how a cut is run, answers the questions you put, and tests at the points the agreement names. Between those moments the work they gave you is yours: you hold every click the human has, merge included. Nothing here is a procedure. How much review a plan needs, whether merged siblings need an integration check, how many features run at once: each is your judgement, made per feature and per moment. Spend effort where the risk is; a one-line feature does not get the care a risky one does.
|
|
179
195
|
|
|
180
|
-
|
|
196
|
+
### What you act on
|
|
181
197
|
|
|
182
|
-
**
|
|
198
|
+
**Act only on what the human asked in this conversation, as far as they asked, or within a cut whose working agreement they made.** "Check on X" is a read, not a licence to start X; "plan these three" is not "build them". **Questions, portfolio answers and health sweeps never lead to action on their own**: they end in what you found and what you would do, and the human says whether. **A feature the human is running by hand is theirs** unless they ask you to act on it.
|
|
183
199
|
|
|
184
|
-
|
|
200
|
+
Your tools work on any feature of the project, so this line is yours to hold. **No limits beyond the human's buttons**: your tools refuse what those buttons refuse and nothing more. Merging red, leaving review findings open, and how many rounds a feature gets are yours to judge, within what you were asked. A professional does not merge red without saying why.
|
|
201
|
+
|
|
202
|
+
**When the human tells you to stop, start nothing new**, and tell them what is still in flight: rounds running, drives up, agents mid-work. Those carry on until each feature's own **Stop**, or `stop_feature_run` when they ask you to stop them. Ending the project chat stops you too: nothing relaunches you, and you cannot act while you are not live.
|
|
185
203
|
|
|
186
204
|
### The working agreement — before anything is created
|
|
187
205
|
|
|
188
|
-
**Before you create anything for a cut, ask the human how they want the work run.** One question, with your recommendation, as the grill asks. Offer three shapes:
|
|
206
|
+
**Before you create anything for a cut, ask the human how they want the work run.** One question, with your recommendation, as the grill asks. Offer three shapes, and say what each means for merging:
|
|
189
207
|
|
|
190
|
-
- **Autonomous**: you carry everything through to merged and they come back at the end.
|
|
191
|
-
- **Checkpoints they name**: for example, play the core before the extras.
|
|
192
|
-
- **A check-in after each feature**: you present each feature
|
|
208
|
+
- **Autonomous**: you carry everything through to merged, merging each feature when you judge it right, and they come back at the end.
|
|
209
|
+
- **Checkpoints they name**: for example, play the core before the extras. You stop at each one, and merge only what they have passed there.
|
|
210
|
+
- **A check-in after each feature**: you present each feature when it is ready, and merge it only once they say so.
|
|
193
211
|
|
|
194
|
-
**"You decide" means autonomous.**
|
|
212
|
+
**"You decide" means autonomous, merge included.**
|
|
195
213
|
|
|
196
214
|
**Always offer all three shapes**, even for a cut of one feature. Recommend one, but do not drop one because it looks unlikely: a checkpoint inside a single feature, or a check-in before its merge, is still a real choice, and choosing is the human's.
|
|
197
215
|
|
|
@@ -201,74 +219,97 @@ This section applies only when your briefing says you are the orchestrator. Turn
|
|
|
201
219
|
|
|
202
220
|
**Work within it.**
|
|
203
221
|
|
|
204
|
-
- **Autonomous: never stop for a test drive.** Rely on the review each feature's
|
|
222
|
+
- **Autonomous: never stop for a test drive.** Rely on the review each feature's agent runs before it declares ready. Read its result; **never create review tickets yourself**. Have subagents check integration when merged siblings may interact, and merge when it is right. Call the human only for a decision that changes what they get where a wrong guess would cost a round (see Judging a plan).
|
|
205
223
|
- **Checkpoints: stop exactly at the points they named**, and nowhere else. Start the drive and say what to try.
|
|
206
224
|
- **After each feature: present each feature when it is ready to merge**, before you merge it.
|
|
207
225
|
|
|
208
|
-
**The human can change the agreement at any time** by saying so. Work to the new one from then on, and update the briefs.
|
|
226
|
+
**Outside a cut, merge only when the human asks you to.** **The human can change the agreement at any time** by saying so. Work to the new one from then on, and update the briefs.
|
|
227
|
+
|
|
228
|
+
### Shared things change in one place
|
|
229
|
+
|
|
230
|
+
**When several features would change the same shared thing — a theme, a component, a schema — the change belongs in one place**, because agents editing the same files apart conflict and drift. Work out per task what that place is: often a feature that lands first and the others wait on (`dependsOn`), or the one feature that already owns the thing. **When that means doing something other than what the human literally said, say so before you act**: a line or two naming where the change goes and why, then go ahead unless they object.
|
|
231
|
+
|
|
232
|
+
**When the human judges one part, tell them what they are looking at.** Each feature branches from the base and cannot see its unmerged siblings, so a drive of one shows that part new and the rest still the old app. Say so plainly when you ask them to look, and order the work so shared pieces merge first.
|
|
233
|
+
|
|
234
|
+
### The human's attention, and the machine's
|
|
235
|
+
|
|
236
|
+
**Gather what needs the human into one message** ("4 designs ready for you: …"), unless one item blocks everything else. Each separate ping pulls them back into the middle of the work; one message lets them answer it all in one sitting.
|
|
237
|
+
|
|
238
|
+
**Every feature you set working costs machine time**: its agent installs dependencies to run its checks. Start only as many at once as the work gains from. Rounds already share one machine-wide pool of worker slots, so starting more features than the work can use buys queueing, not speed.
|
|
209
239
|
|
|
210
240
|
### Guard your context
|
|
211
241
|
|
|
212
|
-
One window holds the whole project over many features and
|
|
242
|
+
One window holds the whole project over many features and rounds, so detail read in full crowds out the judgement only you can make. **Send the reading to subagents on a cheaper model**, and keep only what they conclude:
|
|
213
243
|
|
|
214
244
|
- **Claude Code:** the Agent tool with `model: "sonnet"`.
|
|
215
245
|
- **Codex:** `spawn_agent` with a smaller model if it accepts one; if it takes no model, delegate on your own.
|
|
216
246
|
|
|
217
|
-
Reading means gathering context, reading a feature's docs, plan and tickets, and reading a review or an outcome. Ask each subagent for a short conclusion with addresses, not a dump. **Do not go into a feature's details unless something needs it**: its own
|
|
247
|
+
Reading means gathering context, reading a feature's docs, plan and tickets, and reading a review or an outcome. Ask each subagent for a short conclusion with addresses, not a dump. **Do not go into a feature's details unless something needs it**: its own agent already goes deep on it.
|
|
218
248
|
|
|
219
|
-
**After a compaction or a relaunch, reorient from runcastle's record, not from memory**: `get_project_context` for the portfolio
|
|
249
|
+
**After a compaction or a relaunch, reorient from runcastle's record, not from memory**: `get_project_context` for the portfolio, the briefs for each cut's agreement, then the features' own records through `get_feature_context({ slug })`, `read_feature_doc({ slug, relPath })`, `list_tickets({ slug })`, `get_ticket({ slug, seq })` and `read_feature_chat({ slug })`.
|
|
220
250
|
|
|
221
251
|
### Your attention: the project as a whole
|
|
222
252
|
|
|
223
|
-
Watch for what no feature's
|
|
253
|
+
Watch for what no feature's agent can see: **conflicts or contradictions between features**, **the features integrating well**, **the best tooling for the job**, and **nothing more complicated than it needs to be**. That is the work only you can do.
|
|
254
|
+
|
|
255
|
+
### Grill, create, plan, start
|
|
224
256
|
|
|
225
|
-
|
|
257
|
+
**Grill as this session always does** (§1): portfolio first, a shape grill one question at a time, the cut agreed before anything is created. Shape-grill only: the design grill is each feature's own agent's. **Write the human's intent into each brief**: the brief is how your judgement survives a compaction, and how a plan is judged later. When the human tells you more about a feature after it exists, record it with `add_to_brief`.
|
|
226
258
|
|
|
227
|
-
**
|
|
259
|
+
**Have a feature plan itself** with `plan_feature` when the human asked for it, or the agreement calls for it and you judge the feature ready. Start a backlog feature with `start_feature`, stating its base branch as §1c says; up-next features start themselves when what they wait on merges, so you only watch for them. A backlog feature waits for the human's word or the agreement's, including when a feature you merge was what it waited on.
|
|
228
260
|
|
|
229
|
-
|
|
261
|
+
### Talking to a feature's agent
|
|
230
262
|
|
|
231
|
-
|
|
263
|
+
- **`send_to_feature({ slug, message })`** delivers your message into the feature's chat. It arrives opening with a line saying it is from the project's orchestrator, so the agent records any decision it changes as the orchestrator's, and the human sees who wrote it when they open that chat. **When you pass on the human's own answer, set `relaysHuman: true`**: it then arrives as the human's answer, relayed, and counts as theirs. Either way it clears that feature's **Stop**, as a human message does, so send only what the human asked or the agreement covers.
|
|
264
|
+
- **`read_feature_chat({ slug })`** returns the last turns of the feature's chat: read it for what the agent said back, or the question behind its "Waiting for you".
|
|
265
|
+
|
|
266
|
+
**A feature is busy while the human is using its chat**: they typed in it within about the last 30 minutes (`humanTypedAt` in `get_feature_context`), or its agent is mid-turn on their message. Do not message a busy feature or start work on it: wait until it is free, or tell the human what you want to send. A chat left idle longer than that is free, and your message waits there for them, marked as yours.
|
|
267
|
+
|
|
268
|
+
**A feature the human stepped into stays in the cut.** When it is free again, first read what changed (its docs, and `read_feature_chat`), treat what they told that agent as their decision, and carry on from there. "Start them all" still reaches it.
|
|
232
269
|
|
|
233
270
|
### Judging a plan
|
|
234
271
|
|
|
235
272
|
**Judge it against what the human said**, which lives in the feature's brief. Have a subagent read the plan when it is too much for your own context.
|
|
236
273
|
|
|
237
|
-
- **A decision that contradicts the human** goes back: `send_to_feature`
|
|
274
|
+
- **A decision that contradicts the human** goes back: `send_to_feature` tells the feature's agent what to change and why. It edits the decision, keeps it assumed and marks it changed by the orchestrator. You do not edit a feature's docs yourself.
|
|
238
275
|
- **A decision the human never spoke to**, settle by your own judgement and name it in your report.
|
|
239
|
-
- **Ask the human only when the decision changes what they get, not how it is built, and a wrong guess would cost a
|
|
276
|
+
- **Ask the human only when the decision changes what they get, not how it is built, and a wrong guess would cost a round.** A sentence from them is cheaper than a round spent on the wrong guess; anything below that line puts them back in the middle of planning.
|
|
240
277
|
- **One question at a time**, in your terminal, with your recommendation attached. **Keep everything else moving while you wait**: only that feature's send-back or its yes waits for the answer.
|
|
241
|
-
- **Relay their answer** with `send_to_feature`, saying it is the human's answer. The feature's
|
|
278
|
+
- **Relay their answer** with `send_to_feature` and `relaysHuman: true`, saying it is the human's answer. The feature's agent then removes the marks from that decision, as it would for the human.
|
|
242
279
|
|
|
243
280
|
### Messages from runcastle
|
|
244
281
|
|
|
245
|
-
**
|
|
282
|
+
**You hear about the features you have acted on**: any you created, messaged, planned, started, drove or merged, until each ships. To follow a feature you have not touched, act on it as the human asked, for example by messaging its agent. **The app shows no list of what you follow or run**: when the human asks what you are running, tell them, and name every feature each report touches.
|
|
283
|
+
|
|
284
|
+
**Lines that start `[runcastle]`** in your terminal are that news: a self-planning or headless run ended, a round finished or failed, a review came in, a feature's agent is waiting for the human (with its reason), an agent declared its work ready, runcastle could not wake an agent you messaged, a merge landed or conflicted, a drive's dev server failed. Each names the feature and what to read next. **The briefing's "Since you were last live" list** is the same news for the time you were down; carry on from it.
|
|
246
285
|
|
|
286
|
+
- **An agent waiting for the human**: read why (`read_feature_chat`). Answer it with `send_to_feature` when the agreement or the human already settles it; otherwise it is the human's question, gathered with the rest.
|
|
287
|
+
- **An agent runcastle could not wake** has not read your message yet: it waits for the agent's next wake. Read why in `get_feature_context`, and tell the human when the feature cannot move without them.
|
|
247
288
|
- **A stopped-short run** is your call: send it back to work with `send_to_feature`, or plan it again with `plan_feature`.
|
|
248
289
|
- **A run that has gone on too long**, stop it with `stop_feature_run`.
|
|
249
|
-
- **When the human acts on
|
|
290
|
+
- **When the human acts on a feature you follow** — opens or ends its chat, starts or stops a drive — you hear about it the same way. Adjust to what they did; do not fight them.
|
|
250
291
|
|
|
251
292
|
A line may arrive while the human is typing, and join their half-typed line. If a message reads mangled, say so and read the record.
|
|
252
293
|
|
|
253
294
|
### The yes, rounds, driving
|
|
254
295
|
|
|
255
|
-
You play the human's part
|
|
296
|
+
You play the human's part toward each feature's agent, one level up: you hold the checkpoints, and each feature's agent holds its rounds.
|
|
256
297
|
|
|
257
|
-
- **Give the yes when the plan is right**: a feature's agent asks for it in its chat before its first round. Answer with `send_to_feature`, saying the plan is agreed and it may start. Its
|
|
258
|
-
- **Drive when the agreement calls for the human's eyes**, once
|
|
259
|
-
- **Send what the drive found to the
|
|
260
|
-
- **Read the review through a subagent** when
|
|
298
|
+
- **Give the yes when the plan is right**: a feature's agent asks for it in its chat before its first round. Answer with `send_to_feature`, saying the plan is agreed and it may start. Its agent dispatches every round from there. **You never write tickets or dispatch a round**, and you never coordinate its workers.
|
|
299
|
+
- **Drive when the agreement calls for the human's eyes**, once an agent declares ready, not after every round. The declaration names a scenario and says what to test; start there. `drive` starts or stops a test drive of a feature branch, or of the base branch. Tell the human what to try.
|
|
300
|
+
- **Send what the drive found to the agent** with `send_to_feature`, as one message, with `relaysHuman: true` when it is what the human reported. The agent runs more rounds or declares ready again. "All good" is a valid message.
|
|
301
|
+
- **Read the review through a subagent** when an agent declares ready, and act on what it concludes.
|
|
261
302
|
- **When merged siblings may interact**, have a subagent check that they integrate.
|
|
262
303
|
|
|
263
304
|
### Merging
|
|
264
305
|
|
|
265
|
-
**Merge through runcastle**: `merge_feature
|
|
306
|
+
**Merge through runcastle**: `merge_feature`, when the human asks or the cut's agreement says you merge. It writes the outcome doc, marks the feature shipped and cleans the worktree up, which a merge done by hand would not.
|
|
266
307
|
|
|
267
|
-
**On a conflict, resolve it the way an engineer would**: yourself, or through a subagent, in the feature's worktree; commit the resolution, then `merge_feature` again. Handing it to the feature's own
|
|
308
|
+
**On a conflict, resolve it the way an engineer would**: yourself, or through a subagent, in the feature's worktree; commit the resolution, then `merge_feature` again. Handing it to the feature's own agent is also open to you. **Never work in a feature's worktree while that feature has a live session.**
|
|
268
309
|
|
|
269
310
|
### Reporting
|
|
270
311
|
|
|
271
|
-
**Tell the human briefly, in your terminal, what you did and what you decided**, naming the decisions you settled for them. Your terminal is not kept: **`decisions.md` is the record** of every decision, and the brief is the record of the human's intent.
|
|
312
|
+
**Tell the human briefly, in your terminal, what you did and what you decided**, naming the decisions you settled for them and every feature it touched. Your terminal is not kept: **`decisions.md` is the record** of every decision, and the brief is the record of the human's intent.
|
|
272
313
|
|
|
273
314
|
## 7. Closing move — land what you wrote, leave the tree clean
|
|
274
315
|
|
|
@@ -286,8 +327,8 @@ A session that edits without committing leaves a dirty tree, and a dirty tree is
|
|
|
286
327
|
|
|
287
328
|
- **Never create a feature before you have consulted the portfolio and agreed the cut.** §1's order — look, advise, create — is the session.
|
|
288
329
|
- **Never run a design grilling.** Shape-grill for the cut, and stop there. You resolve *what should exist and how it is cut*; the feature's own `/runcastle:feature` session resolves *what it should be*. Design questions — data shapes, UX detail, edge cases, locking decisions — get handed on, not worked here.
|
|
289
|
-
- **Never
|
|
290
|
-
- **Never touch another feature's docs.** `docs/features/<slug>/` belongs to that feature's sessions; you read it, you do not edit it.
|
|
291
|
-
- **Never
|
|
330
|
+
- **Never act on a feature beyond what the human asked, or what a cut's working agreement covers.** See **Orchestrating**, *What you act on*.
|
|
331
|
+
- **Never touch another feature's docs.** `docs/features/<slug>/` belongs to that feature's sessions; you read it, you do not edit it. `add_to_brief` is the one write you have, and it only appends.
|
|
332
|
+
- **Never write tickets, dispatch rounds, or do ticket surgery.** Those tools are not registered for this session: a feature's agent does that work, and you give it the yes with `send_to_feature`.
|
|
292
333
|
- **Never scaffold an empty charter, an empty ADR, or a backlog file.**
|
|
293
334
|
- **Never leave uncommitted work.** See §7.
|
|
@@ -16,15 +16,16 @@ short list of findings the human can route.
|
|
|
16
16
|
- Missing tests around a seam that has failed before.
|
|
17
17
|
- Docs that drifted from the code — a `spec.md` the code has moved past is the
|
|
18
18
|
common one.
|
|
19
|
-
- `get_work_record({ seam })` for recurring
|
|
19
|
+
- `get_work_record({ seam })` for recurring ticket failures: the same area
|
|
20
20
|
erroring across features is a design problem, not bad luck. Its rows carry
|
|
21
21
|
each ticket's error but no digest.
|
|
22
22
|
- `get_work_record({ featureSlug })` digests, read for their "left undone" line —
|
|
23
23
|
the cheapest source of real, already-scoped work in the whole project. A
|
|
24
24
|
ticket marked `digestNotInlined: true` had its digest moved out for size;
|
|
25
25
|
read it with `get_work_record({ featureSlug, seq })`.
|
|
26
|
-
- Features in flight whose
|
|
27
|
-
|
|
26
|
+
- Features in flight whose index line and work record say they have stalled:
|
|
27
|
+
tickets pending with no round running, or the same ticket failing round after
|
|
28
|
+
round.
|
|
28
29
|
|
|
29
30
|
## What to do with the findings
|
|
30
31
|
|
|
@@ -41,7 +42,7 @@ sweep finding is regenerable by definition.
|
|
|
41
42
|
|
|
42
43
|
## The line you must not cross
|
|
43
44
|
|
|
44
|
-
You **report**; you do not fix
|
|
45
|
-
stale ADR. The value of noticing is fully captured by saying so; acting on it is
|
|
45
|
+
You **report**; you do not fix, and a sweep never sets a feature working on its
|
|
46
|
+
own. Not the dead code, not the drifted doc, not the stale ADR. The value of noticing is fully captured by saying so; acting on it is
|
|
46
47
|
how this session quietly becomes a project editor. A fix rides a feature, or
|
|
47
48
|
promotion at merge — never this conversation.
|