@erclx/canon 5.37.0 → 5.39.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/README.md +1 -1
- package/claude/.claude-plugin/plugin.json +1 -1
- package/claude/skills/api-design/SKILL.md +12 -9
- package/claude/skills/auto-ship/SKILL.md +43 -23
- package/claude/skills/backlog-triage/SKILL.md +62 -53
- package/claude/skills/backlog-triage/references/apply.md +69 -0
- package/claude/skills/build-in-slices/SKILL.md +8 -4
- package/claude/skills/canon-cli/SKILL.md +5 -1
- package/claude/skills/canon-feedback/SKILL.md +18 -8
- package/claude/skills/canon-feedback-triage/SKILL.md +10 -3
- package/claude/skills/canvas-board/SKILL.md +36 -17
- package/claude/skills/ci-workflow/SKILL.md +5 -4
- package/claude/skills/code-craft/SKILL.md +10 -6
- package/claude/skills/codebase-layout/SKILL.md +3 -5
- package/claude/skills/context-fold/REQUIREMENT.md +4 -4
- package/claude/skills/context-fold/SKILL.md +42 -23
- package/claude/skills/context-fold/references/context-refresh.md +4 -3
- package/claude/skills/context-fold/references/context.md +79 -64
- package/claude/skills/create-rule/SKILL.md +7 -3
- package/claude/skills/create-skill/SKILL.md +27 -7
- package/claude/skills/create-skill/references/skill-reference.md +41 -17
- package/claude/skills/decision-escalate/SKILL.md +8 -5
- package/claude/skills/deploy-app/SKILL.md +1 -1
- package/claude/skills/deprecation-migration/SKILL.md +12 -4
- package/claude/skills/design-taste/SKILL.md +17 -11
- package/claude/skills/docs-sync/REQUIREMENT.md +1 -0
- package/claude/skills/docs-sync/SKILL.md +17 -6
- package/claude/skills/docs-sync/references/docs.md +54 -21
- package/claude/skills/docs-sync/references/readme.md +32 -8
- package/claude/skills/document-health/SKILL.md +3 -4
- package/claude/skills/draft-and-pick/SKILL.md +73 -47
- package/claude/skills/draft-doc/SKILL.md +9 -4
- package/claude/skills/draft-doc/references/context.md +4 -4
- package/claude/skills/draft-doc/references/docs.md +1 -0
- package/claude/skills/draft-doc/references/wiki.md +3 -2
- package/claude/skills/draft-figure/SKILL.md +9 -7
- package/claude/skills/draft-identity/SKILL.md +24 -52
- package/claude/skills/draft-identity/references/card-route.md +46 -0
- package/claude/skills/draft-ready/SKILL.md +19 -7
- package/claude/skills/draft-screencast/SKILL.md +6 -112
- package/claude/skills/draft-screencast/references/beats-template.md +119 -0
- package/claude/skills/draft-slides/SKILL.md +7 -4
- package/claude/skills/git-branch/SKILL.md +3 -3
- package/claude/skills/git-commit/SKILL.md +5 -3
- package/claude/skills/git-followup/SKILL.md +16 -9
- package/claude/skills/git-issue/SKILL.md +6 -5
- package/claude/skills/git-issue/references/issue.md +11 -10
- package/claude/skills/git-pr/SKILL.md +56 -44
- package/claude/skills/git-ship/SKILL.md +43 -34
- package/claude/skills/git-ship/references/ci-watch.md +31 -0
- package/claude/skills/git-split/SKILL.md +28 -100
- package/claude/skills/git-split/references/independent.md +40 -0
- package/claude/skills/git-split/references/stacked.md +73 -0
- package/claude/skills/git-stage/SKILL.md +9 -7
- package/claude/skills/git-worktree/SKILL.md +27 -49
- package/claude/skills/git-worktree/references/cleanup.md +55 -0
- package/claude/skills/markdown-craft/SKILL.md +2 -2
- package/claude/skills/markdown-craft/references/markdown.md +82 -52
- package/claude/skills/plan-feature/SKILL.md +52 -46
- package/claude/skills/plan-feature/references/batches.md +46 -0
- package/claude/skills/plan-groundwork/SKILL.md +60 -74
- package/claude/skills/plan-groundwork/references/groundwork.md +53 -24
- package/claude/skills/plan-groundwork/references/output.md +48 -0
- package/claude/skills/plan-intake/SKILL.md +28 -21
- package/claude/skills/plan-intake-answer/SKILL.md +14 -13
- package/claude/skills/read-frames/SKILL.md +2 -0
- package/claude/skills/record-screencast/SKILL.md +31 -11
- package/claude/skills/review-address/SKILL.md +76 -158
- package/claude/skills/review-address/references/rebase-only.md +34 -0
- package/claude/skills/review-craft/SKILL.md +27 -11
- package/claude/skills/review-pr/SKILL.md +91 -40
- package/claude/skills/review-pr/references/post.md +1 -1
- package/claude/skills/review-ui/SKILL.md +62 -37
- package/claude/skills/review-ui/references/hosted-preview.md +30 -0
- package/claude/skills/role-orchestrator/SKILL.md +105 -74
- package/claude/skills/role-orchestrator/references/orchestrator-filing.md +26 -0
- package/claude/skills/role-orchestrator/references/orchestrator-parked.md +1 -1
- package/claude/skills/role-planner/SKILL.md +66 -64
- package/claude/skills/role-reviewer/SKILL.md +57 -46
- package/claude/skills/role-worker/SKILL.md +68 -63
- package/claude/skills/search-craft/SKILL.md +7 -5
- package/claude/skills/session-compact/SKILL.md +16 -11
- package/claude/skills/session-map/SKILL.md +31 -10
- package/claude/skills/session-relay/SKILL.md +32 -65
- package/claude/skills/session-resume/SKILL.md +18 -13
- package/claude/skills/session-worktree/SKILL.md +70 -42
- package/claude/skills/systematic-debugging/SKILL.md +6 -1
- package/claude/skills/target-check/SKILL.md +13 -6
- package/claude/skills/target-setup/SKILL.md +41 -30
- package/claude/skills/target-setup/references/verify.md +6 -5
- package/claude/skills/task-board/SKILL.md +68 -60
- package/claude/skills/task-board/references/create-report.md +36 -0
- package/claude/skills/task-board/references/tasks.md +3 -1
- package/claude/skills/task-complete/SKILL.md +20 -18
- package/claude/skills/teach-workspace/SKILL.md +61 -33
- package/claude/skills/test-craft/SKILL.md +2 -1
- package/claude/skills/test-first/SKILL.md +15 -9
- package/claude/skills/ui-checklist/SKILL.md +18 -16
- package/claude/skills/ux-audit/SKILL.md +9 -10
- package/claude/skills/ux-measure/SKILL.md +22 -18
- package/claude/skills/video-craft/SKILL.md +15 -7
- package/claude/skills/write-human/SKILL.md +9 -1
- package/claude/skills/youtube-transcripts/SKILL.md +2 -1
- package/docs/agents/context-audit-checks.md +19 -1
- package/docs/agents/context-audit.md +2 -2
- package/docs/agents/driver.md +1 -1
- package/docs/agents/hooks.md +21 -1
- package/docs/agents/index.md +10 -14
- package/docs/agents/indexes.md +25 -29
- package/docs/agents/install-and-sync.md +124 -235
- package/docs/agents/markdown-audit-density.md +39 -0
- package/docs/agents/markdown-audit-weight.md +9 -7
- package/docs/agents/markdown-audit.md +18 -14
- package/docs/agents/migrate.md +41 -16
- package/docs/agents/output-shape.md +60 -45
- package/docs/agents/overview.md +36 -12
- package/docs/agents/routing.md +1 -1
- package/docs/agents/rule-citations.md +1 -1
- package/docs/agents/skills-reach.md +1 -1
- package/docs/agents/targets.md +25 -77
- package/docs/target/migrations.md +1 -1
- package/docs/target/projects.md +3 -3
- package/docs/target/scenarios.md +1 -1
- package/docs/workflow/ai-workflow.md +2 -2
- package/docs/workflow/parallel-features.md +2 -2
- package/docs/workflow/skill-map.md +1 -1
- package/docs/workflow/visual-design-workflow.md +1 -1
- package/governance/detect.toml +6 -1
- package/package.json +6 -3
- package/scripts/core/install-check.sh +1 -1
- package/src/commands/claude.ts +1 -2
- package/src/commands/context.ts +106 -7
- package/src/commands/hooks.ts +63 -0
- package/src/commands/markdown.ts +169 -32
- package/src/commands/pr.ts +1 -1
- package/src/commands/records.ts +0 -1
- package/src/context/audit.ts +256 -5
- package/src/context/classify/prompts.ts +1 -1
- package/src/context/gate.ts +23 -7
- package/src/context/shape-gated.ts +28 -0
- package/src/design/document.ts +1 -1
- package/src/design/tokens.ts +1 -1
- package/src/docs/read.ts +15 -21
- package/src/gate/measures.ts +15 -190
- package/src/gate/stages.ts +21 -23
- package/src/hooks/reply-links.ts +110 -0
- package/src/markdown/density.ts +258 -0
- package/src/markdown/gate.ts +57 -18
- package/src/markdown/reference-shape.ts +103 -0
- package/src/markdown/scope.ts +174 -0
- package/src/markdown/structure.ts +10 -60
- package/src/sandbox/equivalence.ts +7 -9
- package/src/shipped/references.ts +1 -1
- package/src/teach/browser/head.ts +2 -2
- package/src/teach/browser/sidebar.ts +3 -3
- package/src/teach/browser/theme.ts +2 -2
- package/src/tooling/inject.ts +2 -2
- package/src/tooling/package.ts +15 -18
- package/src/tooling/verify-stack.ts +6 -3
- package/tooling/astro/configs/.oxfmtrc.json +8 -0
- package/tooling/astro/configs/.prettierrc +13 -0
- package/tooling/astro/manifest.toml +13 -0
- package/tooling/astro/reference.md +15 -5
- package/tooling/base/configs/.oxfmtrc.json +7 -0
- package/tooling/base/configs/scripts/verify.ts +1 -1
- package/tooling/base/manifest.toml +6 -6
- package/tooling/base/reference.md +12 -9
- package/tooling/base/seeds/.lintstagedrc +1 -3
- package/tooling/base/seeds/canon/context/ci.md +3 -3
- package/tooling/base/seeds/canon/context/development.md +2 -2
- package/tooling/claude/manifest.toml +5 -1
- package/tooling/claude/seeds/.claude/hooks/reply-links.sh +72 -0
- package/tooling/claude/seeds/.claude/hooks/standards-audit.sh +22 -1
- package/tooling/claude/seeds/.claude/settings.json +4 -0
- package/tooling/go/reference.md +2 -2
- package/tooling/nextjs/configs/.oxlintrc.json +223 -0
- package/tooling/nextjs/manifest.toml +2 -5
- package/tooling/nextjs/reference.md +4 -4
- package/tooling/php/manifest.toml +6 -1
- package/tooling/php/reference.md +2 -2
- package/tooling/python/manifest.toml +6 -1
- package/tooling/python/reference.md +4 -4
- package/tooling/vite-react/manifest.toml +1 -4
- package/tooling/vite-react/reference.md +3 -3
- package/tooling/web/configs/.oxlintrc.json +213 -0
- package/tooling/web/manifest.toml +9 -13
- package/tooling/web/reference.md +14 -14
- package/docs/agents/commands.md +0 -154
- package/docs/agents/docs.md +0 -27
- package/docs/agents/drift-surfaces.md +0 -201
- package/docs/agents/gov-detect.md +0 -47
- package/docs/agents/scripting.md +0 -142
- package/src/markdown/growth.ts +0 -43
- package/tooling/base/configs/.prettierrc +0 -12
- package/tooling/base/seeds/.prettierignore +0 -0
- package/tooling/nextjs/configs/eslint.config.js +0 -91
- package/tooling/web/configs/eslint.config.js +0 -82
|
@@ -8,20 +8,9 @@ metadata:
|
|
|
8
8
|
|
|
9
9
|
# Role orchestrator
|
|
10
10
|
|
|
11
|
-
This session is the orchestrator
|
|
12
|
-
cross-feature picture. It plans and dispatches every review.
|
|
11
|
+
This session is the orchestrator, the one warm session holding the cross-feature picture. It plans and dispatches every review. Cold workers build, dispatched once the branch is unclaimed and no conflict holds the row or launched by the human otherwise, and the human merges.
|
|
13
12
|
|
|
14
|
-
|
|
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
|
-
|
|
18
|
-
This skill holds the framing, the board procedure, and the dispatch. Every step
|
|
19
|
-
that builds something runs an existing skill. The queue rules below decide which
|
|
20
|
-
one runs and when.
|
|
21
|
-
|
|
22
|
-
Run `canon docs operating-model` for the model this skill enacts: the two roles
|
|
23
|
-
and what each owns, the loop end to end, why a dispatched reviewer's pass is
|
|
24
|
-
the first one a change gets, and how a feature is sized.
|
|
13
|
+
This skill holds the framing, the board procedure, and the dispatch, and every building step runs an existing skill. Run `canon docs operating-model` for the model it enacts, being the two roles, the loop end to end, why a dispatched review comes first, and how a feature is sized.
|
|
25
14
|
|
|
26
15
|
## On invocation
|
|
27
16
|
|
|
@@ -35,23 +24,38 @@ Read the board in parallel, resolving the paths at the main worktree root the wa
|
|
|
35
24
|
|
|
36
25
|
Then output the state of play so the human knows what to launch, review, and merge.
|
|
37
26
|
|
|
38
|
-
|
|
27
|
+
### Reading the order
|
|
28
|
+
|
|
29
|
+
`priority.md` is the ordering source. `index.md` sorts by filename and says nothing about order, so never infer the sequence from it. When `priority.md` is absent, report the queue and say the order is unrecorded.
|
|
30
|
+
|
|
31
|
+
- Row position under `## Needs a plan` is what gets planned next, top first, per `${CLAUDE_SKILL_DIR}/../task-board/references/board.md`
|
|
32
|
+
- `backlog.md` is explicitly unordered, so read it for what exists and never as a queue. Report a count rather than its rows, which would put the length back in front of the reader.
|
|
33
|
+
- That count says nothing about whether each row still belongs. `references/orchestrator-parked.md` re-tests a backlog row's currency, on its own trigger below.
|
|
34
|
+
|
|
35
|
+
### What the board does not say
|
|
39
36
|
|
|
40
|
-
|
|
37
|
+
No surface carries cross-version sequencing, so report none, since reasoning spanning several rows reaches this session only through whoever remembers it. Say nothing about an active version, which nothing in the tree states.
|
|
41
38
|
|
|
42
|
-
|
|
39
|
+
## Runbooks on request
|
|
43
40
|
|
|
44
|
-
A compaction is a moment this skill cannot detect, so the human asks for each side of it and this skill reads the matching runbook
|
|
41
|
+
A compaction is a moment this skill cannot detect, so the human asks for each side of it and this skill reads the matching runbook.
|
|
45
42
|
|
|
46
|
-
On a request to write the handoff
|
|
43
|
+
- On a request to write the handoff, follow `${CLAUDE_SKILL_DIR}/references/orchestrator-handoff.md`. It sends the generic half to `canon:session-map` and adds decisions taken under delegated authority.
|
|
44
|
+
- That map follows `${CLAUDE_SKILL_DIR}/../session-map/references/session.md`. Write nothing to the handoff that the board, a task file, or a groundwork folder already carries.
|
|
45
|
+
- A lesson about how to work goes to the owning task's Findings, as a bold-labeled line per `${CLAUDE_SKILL_DIR}/../task-board/references/tasks.md`
|
|
46
|
+
- On a request to resume after a compaction, read `${CLAUDE_SKILL_DIR}/references/orchestrator-resume.md`, which reads that file back with the board and the groundwork behind the live work
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
### The poll and the parked rows
|
|
49
49
|
|
|
50
|
-
The review trigger takes the same shape. `references/orchestrator-poll.md` holds the loop prompt and
|
|
50
|
+
The review trigger takes the same shape. `references/orchestrator-poll.md` holds the loop prompt and its condition, and `scripts/poll.ts` is what the prompt invokes. No hook starts or cancels that loop, so the condition holds only while whoever holds it applies it.
|
|
51
51
|
|
|
52
|
-
A board that is not moving is a third such moment. On a request to re-test the parked rows,
|
|
52
|
+
A board that is not moving is a third such moment. On a request to re-test the parked rows, follow `${CLAUDE_SKILL_DIR}/references/orchestrator-parked.md`, which re-tests every blocker and backlog row against the tree and plans what it clears. The refill sweep fires on a merge instead.
|
|
53
53
|
|
|
54
|
-
|
|
54
|
+
### When the body has dropped
|
|
55
|
+
|
|
56
|
+
That routing lives in this body and this skill is user-invoked, so a session that has dropped the body routes nothing and the request lands as ordinary conversation. Approaching a compaction, when the handoff matters, is when a long session is likeliest to have dropped it.
|
|
57
|
+
|
|
58
|
+
Re-invoke `/canon:role-orchestrator` first whenever the session has run long or the ask goes unanswered. The three runbooks sit at `references/orchestrator-handoff.md`, `references/orchestrator-resume.md`, and `references/orchestrator-parked.md`, so a person who knows their plugin root can follow one without this skill loaded.
|
|
55
59
|
|
|
56
60
|
## Output
|
|
57
61
|
|
|
@@ -59,44 +63,82 @@ Report the state of play in the invocation block, and open every later sweep rep
|
|
|
59
63
|
|
|
60
64
|
## The loop
|
|
61
65
|
|
|
62
|
-
1. Plan the next feature
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
66
|
+
### 1. Plan the next feature
|
|
67
|
+
|
|
68
|
+
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. Every plan written from here carries a constraint per track in flight, which `### Constraints from the tracks in flight` below states.
|
|
69
|
+
|
|
70
|
+
- Per-row planning runs through `plan-feature` here, or a cold planner dispatched under `role-planner` by the planning shape in `${CLAUDE_SKILL_DIR}/references/orchestrator-launch.md`
|
|
71
|
+
- A talk planner launches from that file's talk shape when the operator wants to shape the row with the session
|
|
72
|
+
|
|
73
|
+
### 2. Decide parallelism and merge order
|
|
74
|
+
|
|
75
|
+
Note which plans depend on another or change a contract another consumes, since those hold. Note which merely share a file, since those build together and the second to merge rebases.
|
|
76
|
+
|
|
77
|
+
### 3. Verify the plan against the tree
|
|
78
|
+
|
|
79
|
+
Reading the plan is not enough, since a plan goes stale from whatever merged after it was written. Correct the plan before handing it over.
|
|
80
|
+
|
|
81
|
+
- Grep for each construct it names and count the sites against the count it claims
|
|
82
|
+
- Check that every phase label it cites is still open
|
|
83
|
+
- Open each file it describes rather than trusting its account of the contents
|
|
84
|
+
|
|
85
|
+
### 4. Hand off
|
|
86
|
+
|
|
87
|
+
Read `${CLAUDE_SKILL_DIR}/references/orchestrator-dispatch.md` and follow it. Check the branch is unclaimed and run its conflict check against every track in flight, then dispatch a background worker with `claude --bg`.
|
|
88
|
+
|
|
89
|
+
- 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
|
|
90
|
+
- Where the operator wants to talk with the worker, launch the talk build from the talk shape in the launch runbook after the same checks clear
|
|
70
91
|
|
|
71
|
-
|
|
92
|
+
### 5. Dispatch the review
|
|
72
93
|
|
|
73
|
-
|
|
94
|
+
When a worker opens a PR, its first pass runs through `review-pr` in a reviewer dispatched under `role-reviewer`, per `### The review dispatch` below, and never in this session. The worker's chain carries no review step, so this deep, independent pass is the first review the change gets.
|
|
95
|
+
|
|
96
|
+
Learning that a PR moved is the mechanical half. Read `${CLAUDE_SKILL_DIR}/references/orchestrator-poll.md` and run the poll under the condition it states, since that runbook holds the routing and trigger and a summary here would drift from it.
|
|
97
|
+
|
|
98
|
+
### 6. Back the round up
|
|
99
|
+
|
|
100
|
+
A pass posting anything owed reaches the session holding the branch from the reviewer directly, and the re-review request goes straight back to that reviewer, per `role-reviewer` and `role-worker`. Read `${CLAUDE_SKILL_DIR}/references/orchestrator-handback.md` on reaching this step.
|
|
101
|
+
|
|
102
|
+
- This session sends either leg only where a cloud reviewer posted the pass or one side reports the other unreachable
|
|
103
|
+
- Each reviewer runs `canon pr lift` on its close. The verb lifts the draft once both reviews read closed at the head, the evidence settled, the head current, and CI passed.
|
|
104
|
+
- Run it yourself when a close message reports a refusal other than the other review being open, or when a cloud reviewer's close posts, per Boundaries below
|
|
105
|
+
- Then the human merges. After each merge, tell each trailing worker whose files the merged diff touches to run `review-address`, which rebases it where needed.
|
|
106
|
+
|
|
107
|
+
The handback runbook 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.
|
|
108
|
+
|
|
109
|
+
### Constraints from the tracks in flight
|
|
110
|
+
|
|
111
|
+
A plan written here targets a tree several branches are changing, so it names each in-flight track's file set as a constraint, read from that track's Touches column. State for each set which of the two acts it forbids, per Constraints in `${CLAUDE_SKILL_DIR}/../plan-feature/references/plan.md`.
|
|
112
|
+
|
|
113
|
+
- A bare path list leaves the worker guessing, and can end up forbidding the repair of a citation the change broke
|
|
114
|
+
- A shared path forbids an act only where the conflict check in `orchestrator-dispatch.md` holds the pair. Otherwise it names what the second branch to merge rebases over.
|
|
115
|
+
- Stamp the block with the commit this session read the tree at, in the form that section fixes. A plan waits while its wave merges, and the stamp lets the worker test what changed.
|
|
74
116
|
|
|
75
117
|
## Boundaries
|
|
76
118
|
|
|
77
|
-
- Run one orchestrator at a time. The board is gitignored, so a second session sees none of this one's writes
|
|
119
|
+
- Run one orchestrator at a time. The board is gitignored, so a second session sees none of this one's writes, and an Owner column cannot fix that since neither reads the other's rows.
|
|
78
120
|
- Do not implement features in this session. Hand the plan to a worker.
|
|
79
121
|
- Do not merge. Recommend merge or changes. The human merges.
|
|
80
|
-
- Lift a
|
|
122
|
+
- Lift a draft mark through `canon pr lift <number>` alone, never by readying the pull request directly. Report the reason a refusal names rather than retrying it.
|
|
123
|
+
- This session is the fallback lifter for a cloud reviewer, whose proxy refuses the mutation, and for a refusal a reviewer reports. The verb reads every gate itself, so no one vouches for the asker.
|
|
81
124
|
|
|
82
125
|
### Workers and files
|
|
83
126
|
|
|
84
|
-
|
|
85
|
-
- 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.
|
|
86
|
-
- Do not edit tracked files from this session, at any size. The boundary offers no proportionality exception and nothing enforces it.
|
|
87
|
-
- 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.
|
|
127
|
+
A worker is a separate process the controller can steer, and scope reaches it through a plan alone.
|
|
88
128
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
129
|
+
- Do not spawn a worker with the Agent tool. A subagent shares this session's context and cannot be reached independently, where the `claude --bg` launch gets its own process, worktree, and PR.
|
|
130
|
+
- 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
|
|
131
|
+
- That check catches a collision with an existing worktree or session, and a shared file alone is not a hold. No fixed count binds how many tracks run, as Parallelism below states.
|
|
132
|
+
- Do not edit tracked files from this session, at any size. The boundary offers no proportionality exception and nothing enforces it.
|
|
133
|
+
- Do not hand a worker anything but a plan, which carries exact diffs only when already known and otherwise states scope and open questions
|
|
92
134
|
|
|
93
|
-
|
|
135
|
+
The tracked-file boundary collides with `CLAUDE.md`, which says to handle a small edit immediately, and this rule wins wherever the two meet. A session that writes a change cannot review it independently afterwards, which is the separation `review-pr` exists to supply.
|
|
94
136
|
|
|
95
|
-
|
|
137
|
+
### Filing a row
|
|
96
138
|
|
|
97
|
-
|
|
139
|
+
Record a change identified while orchestrating against the task that owns it, fold one no task owns into the next task touching the same surface, and file a task only when none exists or is expected.
|
|
98
140
|
|
|
99
|
-
|
|
141
|
+
Read `${CLAUDE_SKILL_DIR}/references/orchestrator-filing.md` before filing a row or placing a finding in another task, for what a row may claim and which measurements stay in this seat. A pass filing nothing skips it.
|
|
100
142
|
|
|
101
143
|
## Refilling the ready queue
|
|
102
144
|
|
|
@@ -106,35 +148,24 @@ Read `${CLAUDE_SKILL_DIR}/references/orchestrator-refill.md` on reaching any of
|
|
|
106
148
|
|
|
107
149
|
## Parallelism
|
|
108
150
|
|
|
109
|
-
No fixed number caps worker tracks, and a shared file does not hold one. A
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
so
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
smallest shared-file footprint first, so the rebases spread across the wave, and
|
|
125
|
-
merge a branch touching `CLAUDE.md`, a Claude context entry, or a regenerated
|
|
126
|
-
`index.md` last. Have every sibling the merged diff touches rebase on the new
|
|
127
|
-
`main` before the next merge. Two
|
|
128
|
-
workers running a server take a port apiece without being told to, since a
|
|
129
|
-
stack derives it from the worktree it runs in through `scripts/worktree-port.sh`.
|
|
130
|
-
Read that value rather than assigning one, and set `WORKTREE_PORT_OFFSET` by
|
|
131
|
-
hand only when two worktrees derive the same offset.
|
|
151
|
+
No fixed number caps worker tracks, and a shared file does not hold one. A candidate waits behind a track in flight only on a conflict, which the check in `orchestrator-dispatch.md` states once along with its sources.
|
|
152
|
+
|
|
153
|
+
What binds is the review attention each output gets, which thins as tracks multiply. Add a track while you can still review every one properly and stop when you cannot, since widening dispatch makes that bound bite sooner.
|
|
154
|
+
|
|
155
|
+
- An operator can cap this session's workers by saying so, and a spoken cap binds for that session rather than standing as a number in a file
|
|
156
|
+
- Read `${CLAUDE_SKILL_DIR}/references/orchestrator-inbound.md` before widening a wave, for what each inbound turn costs and why the one control over it stays unset
|
|
157
|
+
|
|
158
|
+
### Merge order and ports
|
|
159
|
+
|
|
160
|
+
Two tracks sharing a file both build, and the one merging second rebases and resolves in its own session after the first lands.
|
|
161
|
+
|
|
162
|
+
- Merge the branch with the smallest shared-file footprint first, so the rebases spread across the wave
|
|
163
|
+
- Merge a branch touching `CLAUDE.md`, a Claude context entry, or a regenerated `index.md` last
|
|
164
|
+
- Have every sibling the merged diff touches rebase on the new `main` before the next merge
|
|
165
|
+
- Two workers running a server take a port apiece, derived from the worktree by `scripts/worktree-port.sh`. Read it, and set `WORKTREE_PORT_OFFSET` only when two worktrees derive the same one.
|
|
132
166
|
|
|
133
167
|
### The review dispatch
|
|
134
168
|
|
|
135
|
-
Review splits by what each side can see. A reviewer dispatched under
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
per wave, over file sets, the board, and merge order. Read
|
|
139
|
-
`${CLAUDE_SKILL_DIR}/references/orchestrator-review-dispatch.md` on every first
|
|
140
|
-
pass for the model pick, the UI reviewer, and how that pass reaches each brief.
|
|
169
|
+
Review splits by what each side can see. A reviewer dispatched under `role-reviewer` takes every pull request's read but a release one's, first pass included, and this session reviews none in place.
|
|
170
|
+
|
|
171
|
+
This session keeps one cross-branch pass per wave, over file sets, the board, and merge order. Read `${CLAUDE_SKILL_DIR}/references/orchestrator-review-dispatch.md` on every first pass for the model pick, the UI reviewer, and how that pass reaches each brief.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Orchestrator filing
|
|
3
|
+
description: What a row the orchestrator files may claim, why it carries no count or cause, and which measurements stay in the orchestrator's seat rather than going to the planner
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Orchestrator filing
|
|
7
|
+
|
|
8
|
+
Read from `### Filing a row` in `role-orchestrator` before this session files a row or places a finding in another task's `## Findings`. A pass that files nothing skips this file.
|
|
9
|
+
|
|
10
|
+
## What a row claims
|
|
11
|
+
|
|
12
|
+
A filed row carries what this seat saw and nothing it did not measure.
|
|
13
|
+
|
|
14
|
+
- A filed row states the defect and the surface it was seen on, and stops there. Its extent and cause belong to whoever plans it.
|
|
15
|
+
- Where the row's shape invites a count, say in a plain sentence in the task file that it was not taken
|
|
16
|
+
- The board's cell has no room for it, since a `Waiting on` cell caps at two clauses per `${CLAUDE_SKILL_DIR}/../task-board/references/board.md`
|
|
17
|
+
- A finding placed in another task's `## Findings` is filing under a second name and takes the same rule
|
|
18
|
+
- An unverified cause costs more than an unverified count. A count fails loudly at re-measurement, while an unchecked mechanism sends real work the wrong way.
|
|
19
|
+
|
|
20
|
+
## Which measurements stay here
|
|
21
|
+
|
|
22
|
+
What the measurement decides is the test. One deciding whether a row can start stays in this seat, and one deciding how big the row is goes to the planner, since only a sizing count commits a plan to a scope this seat cannot see whole.
|
|
23
|
+
|
|
24
|
+
- This seat keeps 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
|
|
25
|
+
- A row under `## Needs a plan` carries no `Touches` column, so filing it unmeasured owes no file set and leaves the conflict check untouched
|
|
26
|
+
- A position claim in that cell names the row it outranks or the class it belongs to. Never justify a rank with a count of the defect's extent.
|
|
@@ -31,7 +31,7 @@ The blocker cell states what the row waits on, and each kind is tested different
|
|
|
31
31
|
|
|
32
32
|
Every measurement this pass takes is a blocker re-test on a row already filed, and it decides whether that row can start rather than how big it is. Sizing a row is the filing boundary `role-orchestrator` states under `## Boundaries`, which leaves the extent and the cause to whoever plans the row.
|
|
33
33
|
|
|
34
|
-
Write the result into the row. A re-test reported in chat is lost at the next compaction and the next pass measures the same thing again. Rewrite a blocker cell whose test no longer holds, move the row to the group its new state puts it in, and record the measurement in that task's `## Findings` with the date it was taken. `### Writing the board` in `role-orchestrator` owns the method, and `canon tasks validate` runs once the board is rewritten and before the report.
|
|
34
|
+
Write the result into the row. A re-test reported in chat is lost at the next compaction and the next pass measures the same thing again. Rewrite a blocker cell whose test no longer holds, move the row to the group its new state puts it in, and record the measurement in that task's `## Findings` as a line labeled with this session and the date it was taken, per `${CLAUDE_SKILL_DIR}/../task-board/references/tasks.md`. `### Writing the board` in `role-orchestrator` owns the method, and `canon tasks validate` runs once the board is rewritten and before the report.
|
|
35
35
|
|
|
36
36
|
## Re-testing a backlog row
|
|
37
37
|
|
|
@@ -7,115 +7,117 @@ metadata:
|
|
|
7
7
|
|
|
8
8
|
# Role planner
|
|
9
9
|
|
|
10
|
-
This session thinks rather than builds. It reads the row, measures what the row
|
|
11
|
-
claims against the tree, writes one record, and hands back the path. The record
|
|
12
|
-
is a feature plan under `plan-feature`, a groundwork track under
|
|
13
|
-
`plan-groundwork`, or an intake pass under `plan-intake`, and the role is the
|
|
14
|
-
same across all three.
|
|
10
|
+
This session thinks rather than builds. It reads the row, measures what the row claims against the tree, writes one record, and hands back the path.
|
|
15
11
|
|
|
16
|
-
It does not implement,
|
|
17
|
-
not review. Those belong to a worker, to the controlling session, and to the
|
|
18
|
-
human.
|
|
12
|
+
The record is a feature plan under `plan-feature`, a groundwork track under `plan-groundwork`, or an intake pass under `plan-intake`, and the role is the same across all three. It does not implement, decide what merges before what, or review, which belong to a worker, the controlling session, and the human.
|
|
19
13
|
|
|
20
|
-
|
|
21
|
-
starts no step of its own. Each of the three skills owns the steps that write
|
|
22
|
-
its record and cites the standard fixing that record's shape, so read the
|
|
23
|
-
procedure there and reach it from the launch rather than from here.
|
|
14
|
+
## What this body owns
|
|
24
15
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
produces.
|
|
16
|
+
This body states the role, the reads, the boundaries, and the channel, and starts no step of its own. Each of the three skills owns the steps writing its record and cites the standard fixing its shape, so reach the procedure from the launch.
|
|
17
|
+
|
|
18
|
+
"Planner" stretches to cover measuring and triage. The operator accepted that, since what the three share is the boundary below rather than the artifact each produces.
|
|
28
19
|
|
|
29
20
|
## Where the session stands
|
|
30
21
|
|
|
31
|
-
- Write records, never source. A tracked file under `src/`, a standard, a rule, a reference doc, and a seed all sit outside what this session may touch
|
|
32
|
-
- Write only into the folder the running skill names
|
|
33
|
-
-
|
|
22
|
+
- Write records, never source. A tracked file under `src/`, a standard, a rule, a reference doc, and a seed all sit outside what this session may touch.
|
|
23
|
+
- Write only into the folder the running skill names, being `.canon/plans/`, `.canon/groundwork/<nn>-<slug>/`, or `.canon/intake/<nn>-<slug>/`
|
|
24
|
+
- Each skill's own `## Write scope` carries its exceptions, so a change to one scope edits one body
|
|
25
|
+
- Resolve those folders, and `.canon/tasks/` and `.canon/review/`, at the main worktree root. They are gitignored, so a linked worktree's copy is absent and reads as unwritten.
|
|
34
26
|
|
|
35
27
|
### Worktrees and rows
|
|
36
28
|
|
|
37
|
-
|
|
38
|
-
|
|
29
|
+
A thinking session that builds has stopped being one, and the row loses the independent read the worker was going to bring.
|
|
30
|
+
|
|
31
|
+
- Never enter a worktree, never create a branch, and never write a tracked file
|
|
32
|
+
- Send each record out as a heredoc, the main-root route `session-worktree` states, since this session holds no worktree. That route skips the write-matched hooks, which are no-ops on a record.
|
|
39
33
|
- Work the row the launch named. Report a second row met while reading rather than taking it on, since which rows run is the controller's call.
|
|
40
34
|
|
|
41
35
|
## What to read before deciding
|
|
42
36
|
|
|
43
37
|
Each item below is something a record needed and a launch string did not carry.
|
|
44
38
|
|
|
45
|
-
- The task file, and its `## Findings` before deciding anything
|
|
46
|
-
- The source files themselves, opened rather than summarized. Never a count quoted from the task file, which
|
|
47
|
-
- `CLAUDE.md` and the context entries the row touches, for the decision and the alternative it was taken against rather than for the decision alone
|
|
48
|
-
- `.canon/tasks/priority.md` for the row's Touches column and its
|
|
39
|
+
- The task file, and its `## Findings` before deciding anything, since a row can carry its own disproof under a title still stating the original claim
|
|
40
|
+
- The source files themselves, opened rather than summarized. Never a count quoted from the task file, which goes wrong or stale.
|
|
41
|
+
- `CLAUDE.md` and the context entries the row touches, for the decision and the alternative it was taken against rather than for the decision alone
|
|
42
|
+
- `.canon/tasks/priority.md` for the row's Touches column and its blocker. Read it for the shared-path lines and holds of the constraint block, never as a gate a plan must clear.
|
|
49
43
|
|
|
50
|
-
|
|
51
|
-
track nor an intake pass is sequenced behind another row or validated as a plan:
|
|
44
|
+
### Reads for a feature plan alone
|
|
52
45
|
|
|
53
|
-
|
|
54
|
-
- `${CLAUDE_SKILL_DIR}/../plan-feature/references/plan.md` for the shape, then `canon records validate plans` and `canon markdown audit <the plan file>` on the file once it is written. Nothing else opens a plan, since `.canon/plans/` is gitignored and the audit's default path set is what git lists.
|
|
46
|
+
Two reads belong to the `plan-feature` path, since neither a groundwork track nor an intake pass is sequenced behind another row or validated as a plan.
|
|
55
47
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
48
|
+
- The plan of any row this one is sequenced behind, including one moved to `.canon/plans/archive/`, since a shipped plan can carry the strongest constraint
|
|
49
|
+
- `${CLAUDE_SKILL_DIR}/../plan-feature/references/plan.md` for the shape, then `canon records validate plans` and `canon markdown audit <the plan file>` once it is written
|
|
50
|
+
|
|
51
|
+
Nothing else opens a plan, since `.canon/plans/` is gitignored and the audit's default path set is what git lists. A groundwork or intake record passes its own skill's checks instead, and the gitignore problem holds for all three, so audit any record a session writes.
|
|
60
52
|
|
|
61
53
|
## Read what is in flight rather than inferring it
|
|
62
54
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
55
|
+
Read the in-flight file sets from the roster and the pull requests, once per row, since a session working several rows ages its picture of the tree.
|
|
56
|
+
|
|
57
|
+
1. Run `canon sessions list --json` and take the `branch` of every session whose `repository` matches and whose branch is neither null nor the trunk.
|
|
58
|
+
2. Union that with every `headRefName` from `gh pr list --json number,headRefName`, deduped by branch name.
|
|
59
|
+
3. Diff each with `git diff --name-only main...<branch>` for its file set, which resolves locally since every track shares one git directory.
|
|
60
|
+
|
|
61
|
+
### What the read misses
|
|
62
|
+
|
|
63
|
+
A bare branch or worktree with no live session or pull request behind it is not evidence, since this repository squash-merges and leaves both behind. The roster is already filtered to live sessions.
|
|
64
|
+
|
|
65
|
+
It still misses a live session that reached its worktree through the direct-path fallback rather than `EnterWorktree`, since that session's registered branch never moves off the trunk.
|
|
66
|
+
|
|
67
|
+
### Name each set as a constraint
|
|
68
|
+
|
|
69
|
+
Name each in-flight set as a hold saying which act it forbids, or a shared path saying which branch rebases, and stamp the block with the commit the tree was read at. A bare path list leaves the reader guessing.
|
|
70
|
+
|
|
71
|
+
The plan standard fixes that block for a feature plan, and a groundwork or intake record carries the same three parts in its own standard's shape.
|
|
67
72
|
|
|
68
73
|
## The board is read-only
|
|
69
74
|
|
|
70
75
|
- Never write `.canon/tasks/priority.md` or `.canon/tasks/backlog.md`. Both are gitignored, so an overwrite drops a row with no history to recover it from.
|
|
71
|
-
- Never write the task file. The record is the whole output, and a row edited from here changes what the controller reads back as the state
|
|
72
|
-
-
|
|
73
|
-
-
|
|
74
|
-
|
|
76
|
+
- Never write the task file. The record is the whole output, and a row edited from here changes what the controller reads back as the board's state.
|
|
77
|
+
- Report what the row got wrong rather than repairing it, such as a stale count or a dead path, in the record and the handback. The controller decides which carries the correction.
|
|
78
|
+
- Leave the cross-feature call alone. `priority.md` shows enough to write a confident merge order off a partial picture, which is the failure this boundary prevents.
|
|
79
|
+
|
|
80
|
+
### The groundwork exception
|
|
81
|
+
|
|
82
|
+
One exception belongs to `plan-groundwork` alone, which writes a single task file at close recording what the track concluded. Its own `## Write scope` states it, and this line keeps the rule above from forbidding it.
|
|
83
|
+
|
|
84
|
+
Each finding in that file opens with the bold source-and-date label that `${CLAUDE_SKILL_DIR}/../task-board/references/tasks.md` fixes.
|
|
75
85
|
|
|
76
86
|
## The channel
|
|
77
87
|
|
|
78
|
-
The controlling session cannot watch this one read, so two messages are owed and
|
|
79
|
-
nothing else.
|
|
88
|
+
The controlling session cannot watch this one read, so two messages are owed and nothing else.
|
|
80
89
|
|
|
81
90
|
- Announce the record as the file lands, carrying its path and what the task file got wrong. Write no summary beside it, which is a second account of a document the reader is about to open.
|
|
82
91
|
- Send a block out as a message before it becomes an interactive prompt.
|
|
83
|
-
- Send nothing on progress
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
One rung stays here, because it is the rung that differs between roles.
|
|
92
|
-
Inferring an addressee discriminates less for a thinking session than for a
|
|
93
|
-
worker. The inference takes the sessions holding no feature branch, which
|
|
94
|
-
separates a controller from a worker because a worker holds one, and a session
|
|
95
|
-
in this role holds none either, so every sibling comes back beside the
|
|
96
|
-
controller. Report the candidates and stop where more than one does, rather than
|
|
97
|
-
addressing the first. Send to the single row where exactly one comes back, and
|
|
98
|
-
say the addressee was inferred.
|
|
92
|
+
- Send nothing on progress, which rebuilds on this side the poll the announcement retires on the other
|
|
93
|
+
|
|
94
|
+
### Addressing
|
|
95
|
+
|
|
96
|
+
Address the session the launch named as a `sessionId`. `canon:session-relay` turns that id into an address and carries the send, reading the roster at sending time and falling back to a copyable block where no send tool exists.
|
|
97
|
+
|
|
98
|
+
One rung stays here because it differs between roles. Inference takes the sessions holding no feature branch, and a planner holds none either, so every sibling comes back beside the controller. Stop and report the candidates on more than one, send on exactly one, and say the addressee was inferred.
|
|
99
99
|
|
|
100
100
|
## Talk launch
|
|
101
101
|
|
|
102
102
|
A launch whose brief says it is a talk session puts the operator in this one. Everything above holds, and the clause below changes how questions are answered and when the role ends. A launch carrying no such sentence takes none of this.
|
|
103
103
|
|
|
104
|
-
- Put each open question to the operator through the structured question surface before writing the record, and record a settled pick in place per the plan standard
|
|
104
|
+
- Put each open question to the operator through the structured question surface before writing the record, and record a settled pick in place per the plan standard
|
|
105
|
+
- Never fill an `- Answer:` slot the operator did not answer
|
|
105
106
|
- Keep answering under `plan-feature`'s discussion rounds after the record lands, since the operator launched this session to keep talking.
|
|
106
107
|
- Owe the landing announcement as usual, plus a close message when the operator ends the conversation.
|
|
107
|
-
- Skip the before-prompt block message for a question put to the operator
|
|
108
|
+
- Skip the before-prompt block message for a question put to the operator in the session. Keep it for a block the operator cannot answer, since a controller learns of a stall only from a message.
|
|
108
109
|
|
|
109
110
|
The operator being present is an assumption the launch carries. A talk planner whose operator has walked away waits silently on its first question, so say what the session is waiting on in the turn it stops.
|
|
110
111
|
|
|
111
112
|
## Refusing is part of the job
|
|
112
113
|
|
|
113
114
|
- Refuse an instruction the tree contradicts, and carry the evidence with it. Name the commands read and what complying would produce, rather than reporting reluctance.
|
|
114
|
-
- Correct a premise the brief carried when the tree disagrees with it
|
|
115
|
-
- Answer a plan question rather than halting on it
|
|
115
|
+
- Correct a premise the brief carried when the tree disagrees with it, then continue, and record what the correction changed in a plan question
|
|
116
|
+
- Answer a plan question rather than halting on it, since each carries a `- Suggested:` line the operator accepts or overrules and a written judgment is the deliverable
|
|
117
|
+
- Halt only on what blocks writing the record at all, and send it as a message before it becomes a prompt. A talk launch puts a question to the operator instead.
|
|
116
118
|
|
|
117
119
|
## Lifetime
|
|
118
120
|
|
|
119
|
-
- The role runs from the launch to the record landing
|
|
120
|
-
- A reused session
|
|
121
|
+
- The role runs from the launch to the record landing, and the operator closes a talk session. A session handed a second row works it under the same role and reads the tree again for it.
|
|
122
|
+
- A reused session's picture of the tree ages, and it nears a compaction that silently drops the reasoning behind its earlier records. Cap a reused session rather than letting it run the board.
|
|
121
123
|
- Treat this body as possibly older than the branch under it. A plugin skill loads from the marketplace cache rather than from the working tree.
|