@erclx/canon 5.27.0 → 5.29.0
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/claude/.claude-plugin/plugin.json +1 -1
- package/claude/skills/draft-ready/SKILL.md +3 -1
- package/claude/skills/git-pr/references/evidence.md +1 -1
- package/claude/skills/review-address/REQUIREMENT.md +4 -2
- package/claude/skills/review-address/SKILL.md +16 -7
- package/claude/skills/review-address/references/rebase-conflicts.md +4 -2
- package/claude/skills/review-craft/references/ui.md +4 -4
- package/claude/skills/review-ui/REQUIREMENT.md +2 -2
- package/claude/skills/review-ui/SKILL.md +13 -11
- package/claude/skills/review-ui/references/driving.md +8 -8
- package/claude/skills/review-ui/references/post.md +19 -7
- package/claude/skills/review-ui/references/tick.md +22 -0
- package/claude/skills/role-orchestrator/REQUIREMENT.md +15 -15
- package/claude/skills/role-orchestrator/SKILL.md +24 -26
- package/claude/skills/role-orchestrator/references/orchestrator-dispatch.md +18 -16
- package/claude/skills/role-orchestrator/references/orchestrator-handback.md +12 -2
- package/claude/skills/role-orchestrator/references/orchestrator-inbound.md +1 -1
- package/claude/skills/role-orchestrator/references/orchestrator-launch.md +1 -1
- package/claude/skills/role-orchestrator/references/orchestrator-output.md +4 -4
- package/claude/skills/role-orchestrator/references/orchestrator-parked.md +5 -5
- package/claude/skills/role-orchestrator/references/orchestrator-poll.md +11 -2
- package/claude/skills/role-orchestrator/references/orchestrator-refill.md +6 -6
- package/claude/skills/role-orchestrator/references/orchestrator-sweep.md +2 -2
- package/claude/skills/role-orchestrator/scripts/poll.ts +304 -10
- package/claude/skills/role-planner/REQUIREMENT.md +1 -1
- package/claude/skills/role-planner/SKILL.md +2 -2
- package/claude/skills/role-reviewer/SKILL.md +1 -1
- package/claude/skills/role-worker/SKILL.md +3 -2
- package/claude/skills/ui-checklist/SKILL.md +1 -1
- package/docs/agents/canvas.md +12 -4
- package/docs/agents/gate.md +3 -1
- package/docs/agents/index.md +2 -1
- package/docs/agents/pr-evidence.md +15 -14
- package/docs/agents/pr-tick.md +72 -0
- package/docs/agents/sandbox.md +2 -2
- package/docs/agents/tasks-plans.md +1 -1
- package/docs/agents/tasks-validate.md +18 -18
- package/docs/agents/tasks.md +1 -1
- package/docs/workflow/operating-model.md +10 -15
- package/docs/workflow/parallel-features.md +7 -7
- package/package.json +1 -1
- package/src/audits/baseline.ts +1 -1
- package/src/audits/run.ts +1 -1
- package/src/canvas/capture.ts +1 -1
- package/src/canvas/client/app.tsx +105 -4
- package/src/canvas/client/inspector/field.tsx +61 -2
- package/src/canvas/client/inspector/fields.css +78 -0
- package/src/canvas/client/inspector/token-select.tsx +109 -0
- package/src/canvas/client/inspector/values.ts +74 -2
- package/src/canvas/client/inspector.tsx +134 -15
- package/src/canvas/client/keys.ts +71 -0
- package/src/canvas/client/pages-panel.tsx +5 -1
- package/src/canvas/client/panel-handle.tsx +90 -0
- package/src/canvas/client/selection.tsx +3 -1
- package/src/canvas/client/shell.css +194 -4
- package/src/canvas/client/state.ts +255 -11
- package/src/canvas/client/surface.tsx +231 -18
- package/src/canvas/client/tools.tsx +153 -0
- package/src/canvas/content.ts +66 -1
- package/src/canvas/edit.ts +207 -25
- package/src/canvas/history.ts +116 -0
- package/src/canvas/server.ts +119 -13
- package/src/canvas/tokens.ts +1 -1
- package/src/claude/seeds.ts +2 -2
- package/src/claude/skills-reach.ts +1 -1
- package/src/{exec.ts → cli/exec.ts} +2 -2
- package/src/{help.ts → cli/help.ts} +1 -1
- package/src/cli.ts +1 -1
- package/src/commands/audits.ts +9 -1
- package/src/commands/autoship.ts +1 -1
- package/src/commands/canvas.ts +2 -2
- package/src/commands/capture.ts +1 -1
- package/src/commands/census.ts +1 -1
- package/src/commands/claude.ts +5 -5
- package/src/commands/comments.ts +1 -1
- package/src/commands/context.ts +1 -1
- package/src/commands/demo.ts +9 -1
- package/src/commands/deps.ts +1 -1
- package/src/commands/design.ts +12 -4
- package/src/commands/docs.ts +2 -2
- package/src/commands/driver.ts +9 -1
- package/src/commands/feedback.ts +3 -3
- package/src/commands/gate.ts +10 -3
- package/src/commands/gov.ts +3 -3
- package/src/commands/indexes.ts +1 -1
- package/src/commands/init.ts +11 -3
- package/src/commands/intake.ts +1 -1
- package/src/commands/inventory.ts +9 -1
- package/src/commands/labels.ts +1 -1
- package/src/commands/markdown.ts +1 -1
- package/src/commands/migrate.ts +2 -2
- package/src/commands/pr.ts +324 -9
- package/src/commands/records.ts +1 -1
- package/src/commands/repo.ts +1 -1
- package/src/commands/sandbox.ts +11 -14
- package/src/commands/secrets.ts +9 -1
- package/src/commands/sessions.ts +1 -1
- package/src/commands/slides.ts +2 -2
- package/src/commands/standards.ts +1 -1
- package/src/commands/sync.ts +3 -3
- package/src/commands/targets.ts +1 -1
- package/src/commands/tasks.ts +20 -3
- package/src/commands/teach.ts +1 -1
- package/src/commands/tooling.ts +2 -2
- package/src/commands/transcripts.ts +2 -2
- package/src/commands/upgrade.ts +2 -2
- package/src/commands/wiki.ts +2 -2
- package/src/commands/worktrees.ts +1 -1
- package/src/context/architecture.ts +1 -1
- package/src/context/citations.ts +2 -2
- package/src/context/classify/extract.ts +1 -1
- package/src/context/folders.ts +2 -2
- package/src/context/requirements.ts +1 -1
- package/src/docs/read.ts +1 -1
- package/src/feedback/github.ts +1 -1
- package/src/gate/measures.ts +2 -2
- package/src/gate/sequencer.ts +55 -3
- package/src/gate/stages.ts +8 -0
- package/src/gate/suite-lock.ts +214 -0
- package/src/init/run.ts +1 -1
- package/src/intake/folder.ts +1 -1
- package/src/labels/map.ts +1 -1
- package/src/labels/phase.ts +3 -3
- package/src/migrate/record-layout.ts +1 -1
- package/src/migrate/records.ts +11 -11
- package/src/migrate/rename.ts +1 -1
- package/src/migrate/scratch-evidence.ts +1 -1
- package/src/migrate/surface-roots.ts +6 -6
- package/src/pr/evidence.ts +188 -16
- package/src/pr/tick.ts +56 -0
- package/src/process/harness.ts +1 -1
- package/src/records/backup.ts +1 -1
- package/src/records/ordinal.ts +1 -1
- package/src/records/prune.ts +1 -1
- package/src/records/size.ts +1 -1
- package/src/records/stale-canonical.ts +1 -1
- package/src/records/stale.ts +1 -1
- package/src/records/validate.ts +2 -2
- package/src/{project-root.ts → roots/project.ts} +2 -2
- package/src/{record-root.ts → roots/record.ts} +1 -1
- package/src/sandbox/coverage.ts +11 -12
- package/src/sandbox/equivalence.ts +57 -26
- package/src/sandbox/headless/run.ts +1 -1
- package/src/sandbox/hooks.ts +1 -1
- package/src/sandbox/provision.ts +79 -29
- package/src/sandbox/scenario.ts +588 -0
- package/src/serve/report.ts +1 -1
- package/src/sessions/live.ts +4 -1
- package/src/sessions/transfer/bundle.ts +1 -1
- package/src/slides/decks.ts +1 -1
- package/src/standards/read.ts +1 -1
- package/src/sync/engine.ts +2 -2
- package/src/sync/git.ts +1 -1
- package/src/sync/layout.ts +2 -2
- package/src/sync/stamp.ts +1 -1
- package/src/sync/workflow.ts +1 -1
- package/src/targets/validate.ts +2 -2
- package/src/tasks/answers.ts +1 -1
- package/src/tasks/archive.ts +1 -1
- package/src/tasks/label.ts +1 -1
- package/src/tasks/reach.ts +1 -1
- package/src/tasks/validate.ts +38 -14
- package/src/teach/nav.ts +1 -1
- package/src/teach/workspace.ts +1 -1
- package/src/tooling/inject.ts +2 -2
- package/src/tooling/read.ts +1 -1
- package/src/tooling/scan.ts +1 -1
- package/src/tooling/verify-stack.ts +1 -1
- package/src/version/installed.ts +1 -1
- package/src/version/skew.ts +1 -1
- package/standards/board.md +3 -3
- package/standards/plan.md +13 -7
- package/tsconfig.json +1 -1
- /package/src/{cli-run.ts → cli/run.ts} +0 -0
- /package/src/{ui.ts → cli/ui.ts} +0 -0
- /package/src/{legacy-path.ts → roots/legacy.ts} +0 -0
- /package/src/{surface-root.ts → roots/surface.ts} +0 -0
|
@@ -79,7 +79,9 @@ canon tasks plan-link <task-stem> .canon/plans/feature-<slug>.md --json
|
|
|
79
79
|
|
|
80
80
|
Branch on the record rather than on the exit. The `Ready:` line orients a worker reading the task, and `canon tasks archive` reads it to move the folder on ship.
|
|
81
81
|
|
|
82
|
-
A task file with no row is a dropped task, so place the row in the same pass. The plan exists, so the row takes `## Run now
|
|
82
|
+
A task file with no row is a dropped task, so place the row in the same pass. The plan exists, so the row takes `## Run now`, per the tests in `${CLAUDE_SKILL_DIR}/../../standards/board.md`. A path `canon tasks plan-reach` reports as claimed is a shared file rather than a hold. Name each one and its holder wherever the row is reported below, so whoever controls the board decides whether a contract, a relocation, or a sweep moves the row to `## Up next`.
|
|
83
|
+
|
|
84
|
+
Check the roster the way `canon:task-board` Step 4 does, reading `canon sessions list --self --json` for this session and `canon sessions list --json` for a row from the same repository, under another `sessionId`, whose `name` starts with `orchestrator-`. Treat a refused read as a roster read that failed.
|
|
83
85
|
|
|
84
86
|
- **Orchestrator found.** Write neither file. Message that session with the row's title, the plan link, and the group with its reason, so it places the row itself rather than two sessions writing the board at once.
|
|
85
87
|
- **Not found, and this session's name starts with `worker-` or `planner-`.** Write neither file, since both role bodies ban a board write with no exception. Report the row and its group in Step 8.
|
|
@@ -98,7 +98,7 @@ rmdir <main-root>/.canon/tmp/handoff/ui-checklist 2>/dev/null || true
|
|
|
98
98
|
|
|
99
99
|
The `rmdir` is a no-op when another branch's pending checklist still sits in the folder, which keeps this step from deleting a handoff that is not its own.
|
|
100
100
|
|
|
101
|
-
Deleting the file is what makes the later re-render safe. `git-followup` re-runs `canon pr evidence` with no `--checklist`, and the verb carries the checklist forward out of the comment it is editing, so the
|
|
101
|
+
Deleting the file is what makes the later re-render safe. `git-followup` re-runs `canon pr evidence` with no `--checklist`, and the verb carries the checklist forward out of the comment it is editing, so the checklist survives the push. A tick survives a render at the head its stamp names and is cleared by one at a newer head, which leaves the next UI pass to earn it again.
|
|
102
102
|
|
|
103
103
|
## Post the preview address
|
|
104
104
|
|
|
@@ -19,6 +19,8 @@ A declined finding fails on a third axis, which is where its reason ends up. A w
|
|
|
19
19
|
- Handle each finding independently, so one unresolved item does not block the others
|
|
20
20
|
- Verify before pushing, since a red follow-up costs the reviewer a second pass
|
|
21
21
|
- Rebase onto `origin/main` when the branch no longer merges, after the findings are addressed and before the push, so one force-push carries both
|
|
22
|
+
- Rebase as well when the branch still merges but `main` changed a file it writes since it branched, since a clean merge can hide a semantic conflict and the pull request's green run tested a `main` that no longer exists
|
|
23
|
+
- Leave a branch alone when `main` moved only on files it does not write, since rebasing on every merge is a merge queue's cost without its batching
|
|
22
24
|
- Test staleness on every invocation, including one carrying no findings, since a branch goes stale from `main` moving rather than from anything the review said
|
|
23
25
|
- Re-test once the fixes are commits, since the first test reads committed history and cannot see a fix that touches lines `main` moved
|
|
24
26
|
- Rebuild a generated file through the project check rather than resolving its conflict by hand
|
|
@@ -45,8 +47,8 @@ A declined finding fails on a third axis, which is where its reason ends up. A w
|
|
|
45
47
|
## Guards
|
|
46
48
|
|
|
47
49
|
- No open pull request for the current branch: stop
|
|
48
|
-
- The pull request carries no review comments or threads
|
|
49
|
-
- A conflict needing a decision the tree does not carry: stop with the branch left on its old base
|
|
50
|
+
- The pull request carries no review comments or threads, the branch still merges, and `main` changed no file it writes: stop with a pass. A closed review says nothing about whether the branch still merges, so the staleness test decides this one rather than the finding count.
|
|
51
|
+
- A conflict needing a decision the tree does not carry: stop with the branch left on its old base, and message the controlling session when the launch named one, since a stopped worker reaches nobody otherwise
|
|
50
52
|
|
|
51
53
|
## Out of scope
|
|
52
54
|
|
|
@@ -13,7 +13,7 @@ the PR from an independent session. This skill consumes them: fix, reply, push.
|
|
|
13
13
|
## Guards
|
|
14
14
|
|
|
15
15
|
- Resolve `<number>` and `<tip>` off `canon pr head --json`. An `ambiguous-pull` refusal stops: `❌ Two open PRs on this branch. Name the one to address.` A record with no `number` takes the lookup in `${CLAUDE_SKILL_DIR}/references/rest-reads.md`. Nothing resolving stops: `❌ No open PR. Nothing to address.`
|
|
16
|
-
- If the PR has no review comments or threads, run step 5's staleness test before deciding. A branch that
|
|
16
|
+
- If the PR has no review comments or threads, run step 5's staleness test before deciding. A branch that passes both of its halves stops here: `✅ No review findings to address.` One that fails either skips steps 1 through 4 and runs step 5 onward, since a branch goes stale from `main` moving and a closed review says nothing about whether it still merges.
|
|
17
17
|
- Fix findings. Do not merge.
|
|
18
18
|
|
|
19
19
|
## Step 1: pull the review findings and CI status
|
|
@@ -54,12 +54,20 @@ reports no conflict on a branch that has one.
|
|
|
54
54
|
```bash
|
|
55
55
|
git fetch origin main
|
|
56
56
|
git merge-tree --write-tree origin/main HEAD
|
|
57
|
+
fork=$(git merge-base origin/main HEAD)
|
|
58
|
+
git diff -z --name-only --no-renames "$fork" HEAD |
|
|
59
|
+
xargs -0 -r git --literal-pathspecs diff --name-only --no-renames "$fork" origin/main --
|
|
57
60
|
```
|
|
58
61
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
62
|
+
`merge-tree` exiting non-zero means the branch no longer merges, and a path the
|
|
63
|
+
last command prints means `main` changed a file it writes after it branched, so
|
|
64
|
+
its green run tested a merge nobody will make. Even a clean merge can hide
|
|
65
|
+
semantic conflicts, per Fowler's [Mainline Integration](https://martinfowler.com/articles/branching-patterns.html#mainline-integration),
|
|
66
|
+
so either one sends the branch to `${CLAUDE_SKILL_DIR}/references/rebase-conflicts.md`
|
|
67
|
+
for the sequence, the conflict rules, and the check to re-run. When that check
|
|
68
|
+
fails after a clean rebase, the failure is the semantic conflict, fixed on the
|
|
69
|
+
branch like any other. Neither firing skips to step 6, which covers a `main` that
|
|
70
|
+
moved only on files the branch does not write.
|
|
63
71
|
|
|
64
72
|
`git merge-tree` reads committed history, so this test says nothing about the
|
|
65
73
|
fixes still sitting in the working tree. A branch that merges clean as committed,
|
|
@@ -141,8 +149,9 @@ full pass rather than a delta, and the reader is owed the reason.
|
|
|
141
149
|
A run the second guard sent straight to step 5 has no findings to map, so it
|
|
142
150
|
takes a different body rather than an empty list. Open it with `## Rebase`, not
|
|
143
151
|
`## Review response`, since nothing on the pull request is being responded to and
|
|
144
|
-
that heading claims a review this run never read. State
|
|
145
|
-
|
|
152
|
+
that heading claims a review this run never read. State which half of the test
|
|
153
|
+
fired, being a branch that stopped merging or one `main` changed files under,
|
|
154
|
+
name what landed on `main`, name the files resolved by hand and those
|
|
146
155
|
the regen rebuilt, and close the same way. The heading stays outside the
|
|
147
156
|
`## Review` family so the close-out's equality test on the first line never
|
|
148
157
|
matches it.
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Rebase a stale branch
|
|
3
|
-
description: The stash-and-rebase sequence, the conflict resolution rules,
|
|
3
|
+
description: The stash-and-rebase sequence, the conflict resolution rules, the two recovery messages a hunk needing a decision takes, and the message it owes the controlling session
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Rebase a stale branch
|
|
7
7
|
|
|
8
|
-
Mechanics for Step 5 of `review-address` once `git merge-tree`
|
|
8
|
+
Mechanics for Step 5 of `review-address` once either half of its staleness test fires, being `git merge-tree` exiting non-zero or `main` having changed a file the branch writes. A branch passing both skips this file entirely, which is the ordinary run.
|
|
9
9
|
|
|
10
10
|
## The sequence
|
|
11
11
|
|
|
@@ -34,6 +34,8 @@ These rules apply to a hunk from the rebase and a hunk from the stash pop alike:
|
|
|
34
34
|
|
|
35
35
|
Both sides of every hunk sit in the conflict and `git log origin/main` names what landed, so the tree carries the context. Do not wait on the orchestrator for it.
|
|
36
36
|
|
|
37
|
+
The stop still owes a message. When the launch named a controlling session, send it the stop line through `canon:session-relay` before halting, adding the commit on `main` that wrote the other side of the hunk, per the worker channel the `role-worker` skill states. Nothing else surfaces the halt, since the next review pass that would read it as a finding never starts on a branch nobody pushed. With nobody named, print the two lines above and stop.
|
|
38
|
+
|
|
37
39
|
## After the rebase
|
|
38
40
|
|
|
39
41
|
Re-run the project check. It rebuilds the generated files and covers what the replayed commits broke, and step 6 commits the result alongside the fixes.
|
|
@@ -45,7 +45,7 @@ mkdir -p .canon/tmp/pr/review/evidence/<number>
|
|
|
45
45
|
git show <sha>:<path> > .canon/tmp/pr/review/evidence/<number>/<side>-<name>.png
|
|
46
46
|
```
|
|
47
47
|
|
|
48
|
-
Take the sha from the row, so the base and head sides are exactly what the comment shows. Then open each file with the file-reading tool. A `*(new)*` base cell has no before image.
|
|
48
|
+
Take the sha from the row, so the base and head sides are exactly what the comment shows. Then open each file with the file-reading tool. A `*(new)*` base cell has no before image, and a state whose cases are all added has no Base column at all. Read the URL out of the `src=` of each `<img>`, or out of ``. Drive to the state, capture the frame, and mark it needs eyes. Drive a ticked box the same as an unchecked one, since a tick is
|
|
97
|
+
Never judge a box ending in `(taste)`. Drive to the state, capture the frame, and mark it needs eyes. Drive a ticked box the same as an unchecked one, since a tick is a claim this pass exists to check. A tick stamped at the current head still gets driven.
|
|
98
98
|
|
|
99
99
|
A frame the verdict rests on is published only when the worker's evidence lacks it. Compare the box's route, width, and theme against the `states` Step 2 kept, and when a state and stem show the same thing, cite that stem and push nothing. The match is this pass's judgment over the box's wording, so the verb never makes it. Otherwise push the frame and keep the `link` the record returns:
|
|
100
100
|
|
|
@@ -118,9 +118,13 @@ Close the browser with `${CLAUDE_SKILL_DIR}/scripts/pw.sh -s=<project>-<number>
|
|
|
118
118
|
|
|
119
119
|
## Step 7: post
|
|
120
120
|
|
|
121
|
-
Read `${CLAUDE_SKILL_DIR}/references/post.md` for the heading rule, the body shape, the marker every body ends on, and the post command. Each Evidence cell
|
|
121
|
+
Read `${CLAUDE_SKILL_DIR}/references/post.md` for the heading rule, the body shape, the marker every body ends on, and the post command. Each Evidence cell holds words and names the evidence stem it matched, and the `link` its Step 5 push returned goes as given into the Frames block below the table.
|
|
122
122
|
|
|
123
|
-
## Step 8:
|
|
123
|
+
## Step 8: tick the passed boxes
|
|
124
|
+
|
|
125
|
+
Read `${CLAUDE_SKILL_DIR}/references/tick.md` once the verdict has posted, for how every box that passed is ticked through `canon pr tick` at the head this pass drove, and what a refusal reports.
|
|
126
|
+
|
|
127
|
+
## Step 9: read the review-event checks
|
|
124
128
|
|
|
125
129
|
The `pull_request_review` runs start on the post and gate the body it carried. `canon pr checks` reports one aggregate `state` for every run on the tip and names no run, so an unrelated pending or failing run would hold or fail this step. Read the review-event run of the label gate itself instead, keyed on the head and on the post. The code review posts its own review on the same head and fires a run of the same gate, so a head match alone can read a sibling's finished run as this pass's:
|
|
126
130
|
|
|
@@ -130,7 +134,7 @@ gh run list --workflow phase-label-gate.yml --event pull_request_review --limit
|
|
|
130
134
|
|
|
131
135
|
`<posted-at>` is the instant Step 7 recorded before the post. Re-read until a run that survives the filter reads `completed`, for up to two minutes. A `conclusion` of `failure` means a review posted at that moment failed the scan, so carry that into the result line. No surviving run at the bound, or one still going, reads as unread rather than passed, since a run that never started looks the same as one still going.
|
|
132
136
|
|
|
133
|
-
## Step
|
|
137
|
+
## Step 10: output
|
|
134
138
|
|
|
135
139
|
Read `<heading>` off the first line of the file Step 7 posted, never composed here, so the line reports what the review carries.
|
|
136
140
|
|
|
@@ -138,9 +142,7 @@ Read `<heading>` off the first line of the file Step 7 posted, never composed he
|
|
|
138
142
|
P passed, F failed, E need eyes, N not driven. Posted to PR #<number> under <heading>.
|
|
139
143
|
```
|
|
140
144
|
|
|
141
|
-
Add `Review-event checks: <passing|failing|unread>.` after it.
|
|
142
|
-
|
|
143
|
-
Add `S sweep finding(s).` when the sweep raised any. Report no merge recommendation, since this pass saw the app and not the change.
|
|
145
|
+
Add `Review-event checks: <passing|failing|unread>.` and `Ticks: <ticked N|reason>.` after it, the second naming the count Step 8 ticked or the verb's refusal `reason`. Add `S sweep finding(s).` when the sweep raised any. Report no merge recommendation, since this pass saw the app and not the change.
|
|
144
146
|
|
|
145
147
|
## Rules
|
|
146
148
|
|
|
@@ -148,4 +150,4 @@ Add `S sweep finding(s).` when the sweep raised any. Report no merge recommendat
|
|
|
148
150
|
- Drive the checklist and the sweep, and nothing else. Open exploration has no end a dispatcher can predict.
|
|
149
151
|
- Never check out, build, or serve the head. An address is handed to this pass or the pass refuses.
|
|
150
152
|
- Never read a value off the snapshot file whole. Search it for the ref a box needs, and read text, styles, and geometry with `eval`.
|
|
151
|
-
- Write only under `.canon/tmp/pr/review-ui/`, at the main worktree root,
|
|
153
|
+
- Write only under `.canon/tmp/pr/review-ui/`, at the main worktree root, to the frames branch through `canon pr frames`, which goes through the API and checks nothing out, and to the evidence comment's boxes through `canon pr tick`.
|
|
@@ -38,14 +38,14 @@ A box written before that format may carry no route, no width, and a verb such a
|
|
|
38
38
|
|
|
39
39
|
Each box takes exactly one.
|
|
40
40
|
|
|
41
|
-
| Verdict | When | Evidence it carries
|
|
42
|
-
| ------------------- | ------------------------------------------------------- |
|
|
43
|
-
| pass or fail, read | The result is a fact the page reports | The value read, quoted, such as `scrollWidth 436 against clientWidth 320`
|
|
44
|
-
| pass or fail, frame | The result has a stated criterion only an image settles | The pushed frame's link
|
|
45
|
-
| needs eyes | The box ends in `(taste)` | The pushed frame's link
|
|
46
|
-
| not driven | The state could not be reached | The reason, such as an unreachable address, a `(local only)` box on a hosted preview, or a target the snapshot does not hold
|
|
47
|
-
|
|
48
|
-
A frame verdict carries one image at most, and never one the worker's evidence already shows. When a state and stem in the evidence record match the box's route, width, and theme, the evidence names that stem and nothing is pushed. Otherwise the frame goes up through `canon pr frames` and the
|
|
41
|
+
| Verdict | When | Evidence it carries |
|
|
42
|
+
| ------------------- | ------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
43
|
+
| pass or fail, read | The result is a fact the page reports | The value read, quoted, such as `scrollWidth 436 against clientWidth 320` |
|
|
44
|
+
| pass or fail, frame | The result has a stated criterion only an image settles | The matching evidence stem or the pushed frame's link going to the Frames block, and what the frame shows, in words |
|
|
45
|
+
| needs eyes | The box ends in `(taste)` | The matching evidence stem or the pushed frame's link going to the Frames block, and what the frame showed, with nothing about whether it looks right |
|
|
46
|
+
| not driven | The state could not be reached | The reason, such as an unreachable address, a `(local only)` box on a hosted preview, or a target the snapshot does not hold |
|
|
47
|
+
|
|
48
|
+
A frame verdict carries one image at most, and never one the worker's evidence already shows. When a state and stem in the evidence record match the box's route, width, and theme, the evidence names that stem and nothing is pushed. Otherwise the frame goes up through `canon pr frames` and the `link` the record returned, which names the frame's path on the frames branch, goes under the Frames block and never inside the table row. Either way the words stay, describing the value or region judged, such as the element, its position, and the colors or text read, so a reader whose image fails to load can still check it.
|
|
49
49
|
|
|
50
50
|
A push that refuses leaves the words alone, with the reason named. Never cite the local frame path. A path under `.canon/` is a board identifier the label scan rejects, and it resolves only on this machine.
|
|
51
51
|
|
|
@@ -25,11 +25,17 @@ Write it to `.canon/tmp/pr/review-ui/body-<number>-<short-sha>.md` at the main w
|
|
|
25
25
|
|
|
26
26
|
P passed, F failed, E need eyes, N not driven. Drove <address> at <short-sha>, rendered by <renderer>.
|
|
27
27
|
|
|
28
|
-
| Box
|
|
29
|
-
|
|
|
30
|
-
| 1. <the box as written, shortened> |
|
|
31
|
-
| 2. <box>
|
|
32
|
-
| 3. <box> |
|
|
28
|
+
| Box | Evidence |
|
|
29
|
+
| -------------------------------------------- | --------------------------------------------- |
|
|
30
|
+
| **Fail.** 1. <the box as written, shortened> | <the value read against what the box expects> |
|
|
31
|
+
| **Needs eyes.** 2. <box> | <what the frame showed, in words> |
|
|
32
|
+
| **Pass.** 3. <box> | Evidence `<stem>` <what it showed, in words> |
|
|
33
|
+
|
|
34
|
+
**Frames**
|
|
35
|
+
|
|
36
|
+
- Box 2, needs eyes:
|
|
37
|
+
|
|
38
|
+

|
|
33
39
|
|
|
34
40
|
**Sweep**
|
|
35
41
|
|
|
@@ -44,7 +50,11 @@ P passed, F failed, E need eyes, N not driven. Drove <address> at <short-sha>, r
|
|
|
44
50
|
<!-- review-ui: head=<head> -->
|
|
45
51
|
```
|
|
46
52
|
|
|
47
|
-
|
|
53
|
+
The table has two columns and each Box cell opens on its verdict in bold with a period: `**Pass.**`, `**Fail.**`, `**Needs eyes.**`, or `**Not driven.**`. A column holding only those short words loses its width beside two long ones and GitHub breaks its header mid-word, so the verdict rides in the Box cell instead.
|
|
54
|
+
|
|
55
|
+
An Evidence cell resting on a frame holds words only, so the table's text columns keep the body's width. A frame Step 5 pushed goes in the Frames block below the table, one `Box <n>, <verdict>` label then the `` embed for each framed box, with the link exactly as `canon pr frames` returned it. It names the frame's path on the frames branch, which stays put while other pull requests' frames are dropped and carries this pass's stamp, so a later pass never changes the image.
|
|
56
|
+
|
|
57
|
+
The row still says what the frame showed, so it reads without the image. A state the worker's evidence already shows names the evidence stem in backticks and embeds nothing, since the evidence comment carries that image. A push that refused leaves the words alone and names the reason. Omit the Frames block when no box pushed a frame. Never cite the local frame path, since a path under `.canon/` is a board identifier the label scan rejects.
|
|
48
58
|
|
|
49
59
|
A pass where every box needs eyes and nothing else is owed takes the closed heading:
|
|
50
60
|
|
|
@@ -64,7 +74,7 @@ End every body on `<!-- review-ui: head=<head> -->`, carrying the full sha Step
|
|
|
64
74
|
|
|
65
75
|
Run `canon labels scan --body-file .canon/tmp/pr/review-ui/body-<number>-<short-sha>.md` against the body first, which applies the rule in `${CLAUDE_SKILL_DIR}/../../standards/publish.md`, since nothing gates a file under `.canon/tmp/` before the review-event run does. Fix the body and scan again on a finding. Then post it as a review rather than an issue comment, since the poll reads the UI family off reviews:
|
|
66
76
|
|
|
67
|
-
Record the instant just before the post, in UTC, as `<posted-at>`. Step
|
|
77
|
+
Record the instant just before the post, in UTC, as `<posted-at>`. Step 9 keeps only review-event runs created after it, since the code review posts its own review on the same head and fires a run of the same gate.
|
|
68
78
|
|
|
69
79
|
```bash
|
|
70
80
|
date -u +%Y-%m-%dT%H:%M:%SZ
|
|
@@ -73,4 +83,6 @@ gh api -X POST 'repos/{owner}/{repo}/pulls/<number>/reviews' -f event=COMMENT -F
|
|
|
73
83
|
|
|
74
84
|
The post goes through the REST reviews endpoint rather than the `gh pr` review subcommand, which runs on GraphQL and fails where a cloud session's GitHub proxy refuses it. `-F` reads the file into the body, where `-f` would post the path itself.
|
|
75
85
|
|
|
86
|
+
The ticks come after the post, in Step 8, so the verdict and the ticks report the same `<head>`. The post never ticks, and a pass that stops before posting ticks nothing.
|
|
87
|
+
|
|
76
88
|
Never pass `event=APPROVE` or `event=REQUEST_CHANGES`, which carry a state the poll does not read and a weight this pass has not earned.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Tick the passed boxes
|
|
3
|
+
description: Step 8 of review-ui, which ticks each box that passed through canon pr tick once the verdict has posted, and reports a stale head instead of retrying
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Tick the passed boxes
|
|
7
|
+
|
|
8
|
+
Step 8 of `review-ui`. The verdict has posted, so the ticks and the verdict name the same `<head>`.
|
|
9
|
+
|
|
10
|
+
Tick every box that took a `pass` verdict, whatever the heading, so a partly passed checklist shows its progress:
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
canon pr tick <number> --boxes <n,...> --head <head> --json
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Number the boxes off the `boxes` field Step 2 kept. Leave a box that failed, needs eyes, or was not driven empty.
|
|
17
|
+
|
|
18
|
+
The verb refuses a taste box and a head that is no longer the remote tip, writing nothing in either case. Branch on the record's `reason`, which reads `ticked` on success.
|
|
19
|
+
|
|
20
|
+
- `stale-head`: a push landed while this pass drove. Report it on the `Ticks:` line of Step 10 and never retry at the new tip, since the boxes were driven at the old one.
|
|
21
|
+
- Any other refusal: report the `reason` on the `Ticks:` line and tick nothing further.
|
|
22
|
+
- A binary whose `canon pr` lacks `tick` predates the verb. Report that on the `Ticks:` line and tick nothing.
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: role-orchestrator
|
|
3
|
-
description: What the one warm control session owns, why it plans and reviews without building or merging, and the
|
|
3
|
+
description: What the one warm control session owns, why it plans and reviews without building or merging, and the conflict test that holds a parallel build
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Role orchestrator requirement
|
|
7
7
|
|
|
8
8
|
## Gap
|
|
9
9
|
|
|
10
|
-
Without this skill, the session holding the cross-feature picture starts building, and the picture goes with it. Two features land on the
|
|
10
|
+
Without this skill, the session holding the cross-feature picture starts building, and the picture goes with it. Two features land where one depends on the other or consumes a contract the other changes, because nobody read their plans against each other, and the second pull request rebases onto a tree it was never planned against. Findings from a merged pull request stay in a thread nobody re-reads, so the rule they should have changed never changes. Holding on one shared path costs as much, and ran six canvas rows one at a time on 2026-10-04 though no practitioner source serializes on a shared file.
|
|
11
11
|
|
|
12
12
|
The queue fails in both directions. It empties and a free worker waits, or it fills with whatever is oldest rather than with what establishes a mechanism. A plan handed over unverified is the quiet one, since it goes stale from whatever merged after it was written, and a worker that trusts its account of the tree builds against a shape that no longer exists. A second orchestrator makes all of this unrecoverable, because the board is gitignored and neither session can read the other's writes.
|
|
13
13
|
|
|
@@ -15,7 +15,7 @@ Refilling on a merge and on a thinning ready list leaves the window between them
|
|
|
15
15
|
|
|
16
16
|
Every one of those triggers looks forward, so a row already parked is measured once and re-tested never. A blocker cell is a claim about the tree that was true the day it was written, and a merge changes the tree under every parked row at once rather than under the rows naming it. A row therefore sits on a condition that stopped holding weeks earlier with nothing reporting the gap.
|
|
17
17
|
|
|
18
|
-
Re-measuring one goes wrong twice over, and both ways return a confident number rather than an error. A count read looser than its consumer defines the shape answers a question nobody asked, and a condition measured against the tree at hand reads as unreachable while it stays live in the corpus a shipped command runs against. Waiting is not evidence either, and a task
|
|
18
|
+
Re-measuring one goes wrong twice over, and both ways return a confident number rather than an error. A count read looser than its consumer defines the shape answers a question nobody asked, and a condition measured against the tree at hand reads as unreachable while it stays live in the corpus a shipped command runs against. Waiting is not evidence either, and a task conflicting with everything by construction gets re-measured every pass rather than split.
|
|
19
19
|
|
|
20
20
|
Writing those plans against the tree alone is the second half, since several branches are already changing the shape a plan describes. A plan carrying a bare path list rather than a constraint per in-flight track leaves the worker guessing which act each path forbids, which is the dangling citation the rule against bare paths already exists to prevent.
|
|
21
21
|
|
|
@@ -39,20 +39,20 @@ The dispatch's return leg is unplaced for the same reason. A reply reaches this
|
|
|
39
39
|
|
|
40
40
|
Both halves of that channel are written here and one of them is performed elsewhere, so a worker owes what nothing it loads states. The review trigger inherits the same asymmetry: firing on a dispatch spends an interval against a building worker that has no pull request, and a trigger matching pull requests alone stays silent through a worker that crashes, which only a roster read the poll script cannot make would catch.
|
|
41
41
|
|
|
42
|
-
Cost never enters the decision to widen a wave. The rule weighing how many tracks to open measures
|
|
42
|
+
Cost never enters the decision to widen a wave. The rule weighing how many tracks to open measures conflict and review attention, and both describe what a worker writes rather than what the loop spends. Claude Code delivers a message from another session as a fresh turn carrying the whole accumulated context, and a recurring poll bills that same window on its own interval, so a wave's spend tracks this session's context rather than the work coming back. The one setting that bounds it reads as available to whoever finds it, and the two values that would bound it break the handback the loop runs on.
|
|
43
43
|
|
|
44
44
|
The session also records nothing of what it learns. Both other callers of memory capture are ship-chain skills and this one never ships, so the session taking every operator correction is the session with no moment that writes one down. Hanging that moment on the merge sweep answers it and bills the operator a capture pass per batch of merges while nothing is being built, which is a cost paid on the days shipping is fastest.
|
|
45
45
|
|
|
46
|
-
Dispatch parts from what it checked in three ways. The gate and the worker each derive the branch from their own reading of one plan and reach different strings, a launched worker inherits its launcher's model rather than the configured default, and a
|
|
46
|
+
Dispatch parts from what it checked in three ways. The gate and the worker each derive the branch from their own reading of one plan and reach different strings, a launched worker inherits its launcher's model rather than the configured default, and a declared file set does not hold, since a track crosses the set its plan named.
|
|
47
47
|
|
|
48
48
|
## Must
|
|
49
49
|
|
|
50
50
|
- Read the priority file for execution order, since the index sorts by filename and states no order
|
|
51
51
|
- Report the state of play so the human knows what to launch, what to review, and what to merge
|
|
52
52
|
- Verify a plan against the tree before handing it over, counting the sites it claims and opening the files it describes
|
|
53
|
-
-
|
|
54
|
-
- State what a wave costs in inbound turns beside the
|
|
55
|
-
- Place every finding a merged pull request produced against the surface that owns it, and write the board so a row's readiness and
|
|
53
|
+
- Hold a candidate only on a dependency, a contract, a relocation, a sweep, or a stated reason, since those predict a conflict a merge cannot settle and a shared file does not
|
|
54
|
+
- State what a wave costs in inbound turns beside the conflict rule, and name the control that bounds it together with the reason it stays unset, since a lever recorded without its conclusion reads as available to set
|
|
55
|
+
- Place every finding a merged pull request produced against the surface that owns it, and write the board so a row's readiness and hold claims stay checkable
|
|
56
56
|
- Place what the return leg carries by what it changes, sending an answer that settles a finding onto the pull request and one that corrects this session's model of the world to the task owning that surface, since neither becomes a record by being read
|
|
57
57
|
- Keep one planned, non-conflicting task in reserve beyond what is running
|
|
58
58
|
- Refill the queue while a wave is still building, rather than on a merge and a thinning list alone, since neither of those fires across the window planning costs nothing
|
|
@@ -75,10 +75,10 @@ Dispatch parts from what it checked in three ways. The gate and the worker each
|
|
|
75
75
|
- Measure a condition the way the code consuming it defines the shape, and settle which tree the condition is about before counting, since both errors return a number rather than a failure
|
|
76
76
|
- Write each re-test into the row and its measurement into that task's Findings, since a result reported in chat is gone at the next compaction and the next pass measures the same thing
|
|
77
77
|
- Plan a row the re-test clears, since a cleared row carrying no plan is one the next pass looks at again
|
|
78
|
-
- Split a task
|
|
78
|
+
- Split a task that conflicts with every other by construction, rather than re-measuring a scoping defect that reads as a blocker
|
|
79
79
|
- Check a candidate branch is unclaimed by an existing worktree or a live session before dispatching a background worker for it, since the measured failure this closes is a worker colliding with someone else's work already sitting in the row
|
|
80
|
-
- Dispatch
|
|
81
|
-
-
|
|
80
|
+
- Dispatch a candidate sharing only files with a track in flight and name the shared paths, and have the branch merging second resolve after the first merges, since every source the gate cites tests at integration
|
|
81
|
+
- Write a stated reason on the hold it makes, since two tracks interact in ways no plan reading shows
|
|
82
82
|
- Name each self-dispatched worker explicitly with the `worker-` prefix, since that is the role the name marks and a client-derived name is a fragment of the session's identifier
|
|
83
83
|
- Carry the dispatcher's `sessionId` in the launch prompt, since a worker owed two messages has no property on the roster that resolves a controller and a name goes stale inside the window it builds in
|
|
84
84
|
- Report each self-dispatch and the row it fired against loudly enough to follow, since a person no longer watches the launch step happen
|
|
@@ -89,9 +89,9 @@ Dispatch parts from what it checked in three ways. The gate and the worker each
|
|
|
89
89
|
|
|
90
90
|
- Implement a feature or edit any tracked file from this session, at any size, since the ban offers no proportionality exception
|
|
91
91
|
- Merge. Recommend merge or changes and leave the gate to the human.
|
|
92
|
-
- Spawn a worker with the Agent tool, since an in-process subagent shares this session's context and cannot be steered or reached independently. A dispatched `claude --bg` process is not this: it is a separate session with its own worktree and its own PR, gated by the
|
|
92
|
+
- Spawn a worker with the Agent tool, since an in-process subagent shares this session's context and cannot be steered or reached independently. A dispatched `claude --bg` process is not this: it is a separate session with its own worktree and its own PR, gated by the branch check and the conflict check.
|
|
93
93
|
- Hand a worker anything but a plan, because scope lives there
|
|
94
|
-
- Name a count of the defect's extent or the mechanism behind it while filing a row, since this seat measures a defect from where it stands and the planner is the reader who commits to that scope. A blocker re-test, a
|
|
94
|
+
- Name a count of the defect's extent or the mechanism behind it while filing a row, since this seat measures a defect from where it stands and the planner is the reader who commits to that scope. A blocker re-test, a branch check, and a conflict check decide whether a row can start rather than how big it is, and they stay.
|
|
95
95
|
- Run a second orchestrator against the same board
|
|
96
96
|
- Promote a task to fill the queue when nothing qualifies. A thin queue is a real answer.
|
|
97
97
|
- Promote a parked row on how long it has waited, since age is not a measurement of the blocker
|
|
@@ -106,8 +106,8 @@ Dispatch parts from what it checked in three ways. The gate and the worker each
|
|
|
106
106
|
- Cross-version sequencing asked for: say no surface carries it, rather than asserting an active version the tree does not state
|
|
107
107
|
- This body dropped from a long session approaching a compaction: name the re-invocation and the runbook paths, since the routing lives in the body and a user-invoked skill routes nothing once it is gone
|
|
108
108
|
- Blocker only an operator can clear: record the row as untestable this pass and name the action owed, rather than re-measuring what no session can move
|
|
109
|
-
-
|
|
110
|
-
- Candidate
|
|
109
|
+
- Branch check refuses, with no session registry or no repository resolved: treat the candidate as unverified and fall back to the human-launch line, rather than reading a check that could not run as a clear one
|
|
110
|
+
- Candidate holds under the conflict check: leave the row ready and name the hold, rather than dispatching onto a contract still moving
|
|
111
111
|
- Operator states a cap for the session: honor it for that session alone, rather than treating it as a standing rule or writing the number into a file
|
|
112
112
|
|
|
113
113
|
## Out of scope
|
|
@@ -12,8 +12,8 @@ This session is the orchestrator: the one warm session that holds the
|
|
|
12
12
|
cross-feature picture. It plans and reviews.
|
|
13
13
|
|
|
14
14
|
It does not build, and it does not merge. Building happens in cold worker
|
|
15
|
-
sessions, dispatched by this skill once the
|
|
16
|
-
by the human when
|
|
15
|
+
sessions, dispatched by this skill once the branch is unclaimed and no conflict
|
|
16
|
+
holds the row, or launched by the human when either fails. Merging is the human's gate.
|
|
17
17
|
|
|
18
18
|
This skill holds the framing, the board procedure, and the dispatch. Every step
|
|
19
19
|
that builds something runs an existing skill. The queue rules below decide which
|
|
@@ -59,16 +59,16 @@ Report the state of play in the invocation block, and open every later sweep rep
|
|
|
59
59
|
|
|
60
60
|
## The loop
|
|
61
61
|
|
|
62
|
-
1. Plan the next feature. The cross-feature call stays in this warm session, being which rows
|
|
63
|
-
2. Decide parallelism and merge order. Note which plans
|
|
62
|
+
1. Plan the next feature. The cross-feature call stays in this warm session, being which rows conflict, what merges before what, and whether a row should run at all. Per-row planning runs either way: `plan-feature` here with that context, or a cold planner dispatched under `role-planner` through the planning shape in `${CLAUDE_SKILL_DIR}/references/orchestrator-launch.md`. Every plan written from here also carries a constraint per track in flight, which the paragraph below this list states.
|
|
63
|
+
2. Decide parallelism and merge order. Note which plans depend on another or change a contract another consumes, since those hold, and which merely share a file, since those build together and the second to merge rebases.
|
|
64
64
|
3. Verify the plan against the tree. Reading it is not enough, since a plan goes stale from whatever merged after it was written. Grep for each construct it names and count the sites against the count it claims. Check that every phase label it cites is still open. Open each file it describes rather than trusting its account of the contents. Correct the plan before handing it over.
|
|
65
|
-
4. Hand off. Read `${CLAUDE_SKILL_DIR}/references/orchestrator-dispatch.md` and follow it: check the branch is unclaimed,
|
|
65
|
+
4. Hand off. Read `${CLAUDE_SKILL_DIR}/references/orchestrator-dispatch.md` and follow it: check the branch is unclaimed, run its conflict check against every track in flight, then dispatch a background worker with `claude --bg`. Fall back to the human-launch line it replaces when the branch check refuses or the conflict check holds the row behind something already out.
|
|
66
66
|
5. Review the PR. When a worker opens a PR, its first pass runs through `review-pr` in a reviewer dispatched under `role-reviewer` when `### The review dispatch` below fires, and in this session otherwise. Either is the deep, independent pass. The worker's autoship self-review was only the green gate.
|
|
67
67
|
- Learning that a PR moved is the mechanical half, so read `${CLAUDE_SKILL_DIR}/references/orchestrator-poll.md` and run the poll under the condition it states rather than checking the board by hand. That runbook holds the routing and the trigger, and a summary of it here is a second source that drifts from it.
|
|
68
|
-
6. Dispatch the handback. A pass posting anything owed, a finding at any severity or a testing question, tells the session holding that branch to run `review-address`, rather than waiting for a person to relay it. Re-review when the worker's own message says the address pass finished, per the channel `role-worker` states, rather than polling for an answer nothing else marks as landed, and send the re-review back to the dispatched reviewer when one took the first pass. Once a pass posts `## Review closed`, a UI close names the current head wherever the PR carries a checklist, and `--check` reports `settled`, lift the pull request's draft mark yourself, per Boundaries below. Then the human merges. Tell
|
|
68
|
+
6. Dispatch the handback. A pass posting anything owed, a finding at any severity or a testing question, tells the session holding that branch to run `review-address`, rather than waiting for a person to relay it. Re-review when the worker's own message says the address pass finished, per the channel `role-worker` states, rather than polling for an answer nothing else marks as landed, and send the re-review back to the dispatched reviewer when one took the first pass. Once a pass posts `## Review closed`, a UI close names the current head wherever the PR carries a checklist, the poll run as `--check <number>` prints `CLEAR`, and `--check` reports `settled`, lift the pull request's draft mark yourself, per Boundaries below. Then the human merges. Tell each trailing worker whose files the merged diff touches to run `review-address`, which rebases it when it no longer merges or when `main` changed a file it writes, after each merge rather than once per wave.
|
|
69
69
|
- Read `${CLAUDE_SKILL_DIR}/references/orchestrator-handback.md` on reaching this step. It holds how the message is addressed and worded, what to do when no live session holds the branch, and where a worker's reply goes.
|
|
70
70
|
|
|
71
|
-
A plan written here is written against a tree several branches are already changing, so it names the file set of every track in flight as a constraint, one set per track, read from the Touches column of that track's row. State for each set which of the two acts it forbids, per Constraints in `${CLAUDE_SKILL_DIR}/../../standards/plan.md`. A bare path list leaves the worker guessing, which is how a plan ends up forbidding the repair of a citation the change broke.
|
|
71
|
+
A plan written here is written against a tree several branches are already changing, so it names the file set of every track in flight as a constraint, one set per track, read from the Touches column of that track's row. State for each set which of the two acts it forbids, per Constraints in `${CLAUDE_SKILL_DIR}/../../standards/plan.md`. A bare path list leaves the worker guessing, which is how a plan ends up forbidding the repair of a citation the change broke. A path the two share forbids an act only where the conflict check in `orchestrator-dispatch.md` holds the pair, and otherwise names what the second branch to merge rebases over.
|
|
72
72
|
|
|
73
73
|
Stamp the block with the commit this session read the tree at, which the same section fixes the form of. A plan written during a refill sits in the ready queue while the wave it names merges, so the constraint is true when written and false when a worker reads it. The stamp is what lets that worker test the difference, and the standard carries the test.
|
|
74
74
|
|
|
@@ -79,7 +79,7 @@ Stamp the block with the commit this session read the tree at, which the same se
|
|
|
79
79
|
- Do not merge. Recommend merge or changes. The human merges.
|
|
80
80
|
- Lift a pull request's draft mark once its review closes, whether this session or a reviewer it dispatched closed it, acting directly on the pull request rather than dispatching a worker. Hold it on any `canon pr evidence <number> --check --json` reason but `settled`, reporting that reason, and where that record carries a `checklist`, until a UI close names the current head. `role-worker` and `role-reviewer` state the mirroring refusal: neither can verify who is asking or whether review actually closed, so the act stays with this session.
|
|
81
81
|
- Do not spawn a worker with the Agent tool. An in-process subagent shares this session's context and cannot be steered or reached independently, which breaks the property this boundary protects rather than the mechanism it names. The launch in `orchestrator-launch.md` is a separate `claude --bg` process with its own worktree and its own PR, so it preserves that property instead.
|
|
82
|
-
- Dispatch a background worker only once the
|
|
82
|
+
- Dispatch a background worker only once the branch check in `orchestrator-dispatch.md` clears and its conflict check holds the row behind no track in flight. Colliding with an existing worktree or session is what the branch check exists to catch rather than a judgment call this session makes case by case, and a shared file alone is not a hold. No fixed count binds how many tracks run at once, and Parallelism below states what does.
|
|
83
83
|
- Do not edit tracked files from this session, at any size. The boundary offers no proportionality exception and nothing enforces it.
|
|
84
84
|
- Do not hand a worker anything but a plan, since scope lives there. A plan carries exact diffs only when they are already known, otherwise it states the scope and the open questions and lets the worker write the diff.
|
|
85
85
|
|
|
@@ -91,9 +91,9 @@ Filing a row states the defect and the surface it was seen on, and stops there.
|
|
|
91
91
|
|
|
92
92
|
A finding placed into another task's `## Findings` is filing under a second name and takes the same rule. An unverified cause costs more than an unverified count, since a count fails loudly at the first re-measurement while a mechanism nobody opened the module to check sends real work in the wrong direction.
|
|
93
93
|
|
|
94
|
-
What the measurement decides is the test, rather than whether one was taken. A measurement that decides whether a row can start stays in this seat, which covers the blocker re-test in `${CLAUDE_SKILL_DIR}/references/orchestrator-parked.md`, the
|
|
94
|
+
What the measurement decides is the test, rather than whether one was taken. A measurement that decides whether a row can start stays in this seat, which covers the blocker re-test in `${CLAUDE_SKILL_DIR}/references/orchestrator-parked.md`, the branch and conflict checks before a dispatch, and the hold refill step 6 tests against every track in flight. One that decides how big the row is goes to the planner.
|
|
95
95
|
|
|
96
|
-
Both kinds read the same tree, and only a sizing count commits a plan to a scope this seat cannot see the whole of. A row filed under `## Needs a plan` carries no `Touches` column either, so filing it unmeasured owes no file set and the
|
|
96
|
+
Both kinds read the same tree, and only a sizing count commits a plan to a scope this seat cannot see the whole of. A row filed under `## Needs a plan` carries no `Touches` column either, so filing it unmeasured owes no file set and the conflict check is untouched. A position claim in that group's cell is in scope as well: name the row it outranks or the class it belongs to, each a judgment about order, and never reach for a count of the defect's extent to justify the rank, which is the untested number this boundary keeps off the row wearing a ranking argument.
|
|
97
97
|
|
|
98
98
|
## Refilling the ready queue
|
|
99
99
|
|
|
@@ -103,27 +103,25 @@ Read `${CLAUDE_SKILL_DIR}/references/orchestrator-refill.md` on reaching any of
|
|
|
103
103
|
|
|
104
104
|
## Parallelism
|
|
105
105
|
|
|
106
|
-
No fixed number caps worker tracks
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
attention each output gets,
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
106
|
+
No fixed number caps worker tracks, and a shared file does not hold one. A
|
|
107
|
+
candidate waits behind a track in flight only on a conflict, which the check in
|
|
108
|
+
`orchestrator-dispatch.md` states once along with the sources it follows. What
|
|
109
|
+
binds is the review attention each output gets, which thins as tracks multiply,
|
|
110
|
+
so add a track while you can still review every one properly and stop when you
|
|
111
|
+
cannot. Widening dispatch makes that bound bite sooner rather than lifting it.
|
|
112
|
+
An operator can also cap this session's workers by saying so, and a spoken cap
|
|
113
|
+
binds for that session rather than standing as a number in a file.
|
|
113
114
|
|
|
114
115
|
Read `${CLAUDE_SKILL_DIR}/references/orchestrator-inbound.md` before widening a
|
|
115
116
|
wave, for what each inbound turn costs this session and why the one control over
|
|
116
117
|
it stays unset.
|
|
117
118
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
Merge the branch with the smallest shared-file footprint first, and merge a
|
|
125
|
-
branch touching `CLAUDE.md`, a Claude context entry, or a regenerated `index.md`
|
|
126
|
-
last. Have every sibling rebase on the new `main` before the next merge. Two
|
|
119
|
+
Two tracks sharing a file both build, and the one merging second rebases and
|
|
120
|
+
resolves in its own session, after the first lands. Merge the branch with the
|
|
121
|
+
smallest shared-file footprint first, so the rebases spread across the wave, and
|
|
122
|
+
merge a branch touching `CLAUDE.md`, a Claude context entry, or a regenerated
|
|
123
|
+
`index.md` last. Have every sibling the merged diff touches rebase on the new
|
|
124
|
+
`main` before the next merge. Two
|
|
127
125
|
workers running a server take a port apiece without being told to, since a
|
|
128
126
|
stack derives it from the worktree it runs in through `scripts/worktree-port.sh`.
|
|
129
127
|
Read that value rather than assigning one, and set `WORKTREE_PORT_OFFSET` by
|