@erclx/canon 5.72.1 → 5.74.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/CHANGELOG.md +40 -0
- package/claude/.claude-plugin/plugin.json +1 -1
- package/claude/skills/api-design/references/adopted.md +5 -3
- package/claude/skills/app-drive/REQUIREMENT.md +2 -2
- package/claude/skills/app-drive/SKILL.md +22 -5
- package/claude/skills/app-drive/references/config.md +2 -1
- package/claude/skills/app-drive/references/drive-record.md +13 -0
- package/claude/skills/app-drive/references/isolate.md +1 -1
- package/claude/skills/build-in-slices/references/adopted.md +4 -2
- package/claude/skills/code-craft/references/adopted.md +9 -7
- package/claude/skills/codebase-layout/references/adopted.md +8 -6
- package/claude/skills/create-skill/references/skill-practice.md +5 -0
- package/claude/skills/deprecation-migration/references/adopted.md +5 -3
- package/claude/skills/design-pick/references/board.md +2 -2
- package/claude/skills/plan-feature/SKILL.md +3 -2
- package/claude/skills/plan-feature/references/plan.md +12 -2
- package/claude/skills/plan-groundwork/SKILL.md +2 -0
- package/claude/skills/plan-intake/references/intake.md +3 -2
- package/claude/skills/pr-evidence/REQUIREMENT.md +1 -0
- package/claude/skills/pr-evidence/SKILL.md +2 -0
- package/claude/skills/pr-evidence/references/evidence.md +11 -4
- package/claude/skills/{ui-film/references/pr-clip.md → pr-evidence/references/reel.md} +21 -21
- package/claude/skills/proposal-critique/REQUIREMENT.md +34 -0
- package/claude/skills/proposal-critique/SKILL.md +126 -0
- package/claude/skills/review-craft/references/adopted.md +4 -4
- package/claude/skills/role-orchestrator/SKILL.md +3 -2
- package/claude/skills/role-orchestrator/references/orchestrator-filing.md +8 -0
- package/claude/skills/role-orchestrator/references/orchestrator-handback.md +4 -1
- package/claude/skills/role-orchestrator/references/orchestrator-review-dispatch.md +26 -2
- package/claude/skills/role-orchestrator/references/orchestrator-reviewer-launch.md +22 -3
- package/claude/skills/role-planner/SKILL.md +3 -1
- package/claude/skills/role-reviewer/SKILL.md +15 -4
- package/claude/skills/search-craft/references/adopted.md +9 -7
- package/claude/skills/systematic-debugging/REQUIREMENT.md +1 -0
- package/claude/skills/systematic-debugging/SKILL.md +21 -8
- package/claude/skills/systematic-debugging/references/adopted.md +15 -4
- package/claude/skills/teach-craft/references/adopted.md +8 -6
- package/claude/skills/test-craft/references/adopted.md +14 -12
- package/claude/skills/test-first/SKILL.md +1 -1
- package/claude/skills/test-first/references/adopted.md +9 -5
- package/claude/skills/ui-film/REQUIREMENT.md +5 -6
- package/claude/skills/ui-film/SKILL.md +21 -13
- package/claude/skills/ui-film/references/compose-craft.md +3 -2
- package/claude/skills/ui-film/references/handoff.md +12 -8
- package/claude/skills/ui-film/references/take-craft.md +10 -0
- package/claude/skills/write-human/references/adopted.md +8 -3
- package/docs/agents/records.md +1 -1
- package/docs/target/index.md +1 -0
- package/docs/target/outside-tools.md +39 -0
- package/docs/workflow/operating-model.md +8 -8
- package/docs/workflow/parallel-features.md +1 -1
- package/docs/workflow/skill-map.md +2 -1
- package/governance/ledger/canon/plan.md +20 -0
- package/governance/ledger/skills/build-in-slices/SKILL.md +55 -0
- package/governance/ledger/skills/proposal-critique/SKILL.md +66 -0
- package/governance/ledger/skills/search-craft/SKILL.md +54 -0
- package/governance/ledger/skills/systematic-debugging/SKILL.md +64 -0
- package/governance/ledger/skills/test-first/SKILL.md +28 -0
- package/governance/ledger/skills/write-human/SKILL.md +62 -0
- package/governance/ledger/skills/write-human/density.md +36 -0
- package/governance/ledger/skills/write-human/machine-tells.md +30 -0
- package/governance/rules/canon/plan.md +1 -0
- package/package.json +1 -1
- package/scripts/ci/docs-only.sh +24 -0
- package/src/claude/cases/misc.ts +14 -0
- package/src/claude/skills-audit.ts +89 -8
- package/src/commands/intake.ts +4 -1
- package/src/commands/pr.ts +110 -13
- package/src/gate/measures.ts +1 -1
- package/src/gate/sequencer.ts +7 -1
- package/src/gate/stages.ts +36 -24
- package/src/intake/drive-check.ts +75 -4
- package/src/markdown/scope.ts +2 -0
- package/src/pr/checks.ts +75 -3
- package/src/pr/evidence.ts +62 -1
- package/src/pr/lift.ts +23 -2
- package/src/pr/merge.ts +13 -3
- package/src/records/backup.ts +1 -0
- package/src/targets/pulls.ts +42 -0
|
@@ -1,31 +1,31 @@
|
|
|
1
1
|
---
|
|
2
|
-
title:
|
|
3
|
-
description:
|
|
2
|
+
title: Reel
|
|
3
|
+
description: The reel pr-evidence films for an evidence comment with no operator present, covering the beat choice from the checklist, the length cap, the still check that stands in for approval, the reel flag, and the push to the frames branch
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# Reel
|
|
7
7
|
|
|
8
|
-
Read
|
|
8
|
+
Read by the reel step of `evidence.md`, passing the pull request number, the `url` its `canon pr local` read returned, and the checklist text.
|
|
9
9
|
|
|
10
|
-
This
|
|
10
|
+
This file films a short reel of what the checklist asks a reviewer to try, hosts it on `canon/frames`, and hands back the link or the reason it skipped. The filming rules are `ui-film`'s, in `${CLAUDE_SKILL_DIR}/../ui-film/references/take-craft.md`, and so is the config's `access` value, in `${CLAUDE_SKILL_DIR}/../ui-film/references/config.md`.
|
|
11
11
|
|
|
12
12
|
## Contents
|
|
13
13
|
|
|
14
|
-
- [
|
|
14
|
+
- [How the reel runs](#how-the-reel-runs)
|
|
15
15
|
- [Choose the beats](#choose-the-beats)
|
|
16
16
|
- [Film the reel](#film-the-reel)
|
|
17
17
|
- [Check each still](#check-each-still)
|
|
18
18
|
- [Push the reel](#push-the-reel)
|
|
19
|
-
- [What goes back to the
|
|
19
|
+
- [What goes back to the reel step](#what-goes-back-to-the-reel-step)
|
|
20
20
|
|
|
21
|
-
##
|
|
21
|
+
## How the reel runs
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
No operator is present, so the run is unattended end to end.
|
|
24
24
|
|
|
25
|
-
-
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
- Write inside `.canon/tmp/
|
|
25
|
+
- Film the address the caller passed, joined to the config's `access` value, and start no server
|
|
26
|
+
- Approve nothing. The beats come from a checklist a reviewer already reads, and the still check below is the guard against posting a wrong take.
|
|
27
|
+
- Compose nothing, since the reel is the product
|
|
28
|
+
- Write inside `.canon/tmp/pr/reel/<number>/` at the current worktree's root, since a reel is thrown away once posted
|
|
29
29
|
- Ask nothing at any step. Every stop below is a skip with a reason, since the ship chain runs this with nobody to answer.
|
|
30
30
|
|
|
31
31
|
## Choose the beats
|
|
@@ -56,7 +56,7 @@ A checklist with one group gives up to three beats from it. A checklist with fou
|
|
|
56
56
|
Write one plan entry for each beat chosen, then skip when none was.
|
|
57
57
|
|
|
58
58
|
- Name each beat after its box's text, cut to the action
|
|
59
|
-
- Write the plan per `${CLAUDE_SKILL_DIR}/references/take-craft.md`, finding each target on the served page rather than guessing it
|
|
59
|
+
- Write the plan per `${CLAUDE_SKILL_DIR}/../ui-film/references/take-craft.md`, finding each target on the served page rather than guessing it
|
|
60
60
|
- With no interactive box, skip as `no-interactive-box` and film nothing
|
|
61
61
|
- With interactive boxes that the filter removed, whether negative, static, or marked `(taste)`, skip as `no-visible-change` and film nothing
|
|
62
62
|
|
|
@@ -67,7 +67,7 @@ Keep the whole reel at or under 12 seconds. Each beat opens and closes on a 0.6
|
|
|
67
67
|
## Film the reel
|
|
68
68
|
|
|
69
69
|
```bash
|
|
70
|
-
canon take <url> .canon/tmp/
|
|
70
|
+
canon take <url> .canon/tmp/pr/reel/<number>/plan.json --out .canon/tmp/pr/reel/<number>/takes --reel .canon/tmp/pr/reel/<number>/reel.webp --json
|
|
71
71
|
```
|
|
72
72
|
|
|
73
73
|
Branch on the record's `reason`, never on the exit code.
|
|
@@ -86,23 +86,23 @@ Open each beat's `still.jpg`, the closing frame the record names in its `still`
|
|
|
86
86
|
|
|
87
87
|
- A still showing the wrong state skips the reel as `wrong-state`, naming the beat and what the still shows
|
|
88
88
|
- A record whose beats carry no `still` field comes from a `canon` predating the still, so skip as `no-still` rather than posting a reel nothing checked
|
|
89
|
-
- Read `fallback` on each beat
|
|
89
|
+
- Read `fallback` on each beat. A beat filmed by screencast still joins the reel, since the reel shrinks every beat to one width.
|
|
90
90
|
|
|
91
91
|
## Push the reel
|
|
92
92
|
|
|
93
93
|
Stamp the pass in compact UTC and push the file:
|
|
94
94
|
|
|
95
95
|
```bash
|
|
96
|
-
canon pr frames <number> --reel .canon/tmp/
|
|
96
|
+
canon pr frames <number> --reel .canon/tmp/pr/reel/<number>/reel.webp --pass "$(date -u +%Y%m%dT%H%M%SZ)" --json
|
|
97
97
|
```
|
|
98
98
|
|
|
99
99
|
- `ok`: hold the record's `link`
|
|
100
100
|
- `reel-too-large`: skip as `reel-too-large`, since GitHub would not render it
|
|
101
101
|
- Any other `reason`: skip under it with the record's `message`
|
|
102
102
|
|
|
103
|
-
## What goes back to the
|
|
103
|
+
## What goes back to the reel step
|
|
104
104
|
|
|
105
|
-
Hand
|
|
105
|
+
Hand the reel step one of two things and print nothing of your own:
|
|
106
106
|
|
|
107
|
-
- The `link` from the push, which
|
|
108
|
-
- A skip, as the reason and a one-line message, which
|
|
107
|
+
- The `link` from the push, which the evidence step passes to `canon pr evidence --reel`
|
|
108
|
+
- A skip, as the reason and a one-line message, which the closing report names
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: proposal-critique
|
|
3
|
+
description: Scope boundary for questioning a proposal before it is built, the two directions it checks, and the one verdict it ends on
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Proposal critique requirement
|
|
7
|
+
|
|
8
|
+
## Gap
|
|
9
|
+
|
|
10
|
+
Without this skill, a session builds a proposal as stated. A fix for an upstream failure ships before anyone checks whether the cause is ours. A proposal that holds back too far, such as a gate serializing work it never needed to hold, passes too, since an improvised critique asks only whether a change does too much.
|
|
11
|
+
|
|
12
|
+
When a session does question a proposal, it asks the same long list of a one-line revertible edit and of a published release, so it either stalls small work or waves through large work. It ends on a list of concerns with no call, and it answers from its own reading of the conversation without saying the proposal was its own.
|
|
13
|
+
|
|
14
|
+
## Must
|
|
15
|
+
|
|
16
|
+
- Ask whether the proposal does too much and whether it is too cautious
|
|
17
|
+
- Scale the question count by reversibility and reach, two questions for a two-way local change and every group for a one-way or shipped change or an unverified cause
|
|
18
|
+
- Answer each question from evidence in the tree, the history, or the record, and put a preference question through the question surface
|
|
19
|
+
- End on exactly one verdict of go, probe first, absorb, or stop, naming the questions that decided it
|
|
20
|
+
- Say where the proposal was read from, and say when this session wrote it
|
|
21
|
+
|
|
22
|
+
## Must not
|
|
23
|
+
|
|
24
|
+
- Write a section into the plan, task, or intake item it critiques, since the operator decides what moves into a record
|
|
25
|
+
- Run on its own initiative or from another skill by default
|
|
26
|
+
- Stay in the catalog if the operator and the planning skills' pointers never reach it at the costly moment, which is the review criterion for whether it earns its place
|
|
27
|
+
- Give a conditional verdict, which is a probe stated as a go
|
|
28
|
+
|
|
29
|
+
## Out of scope
|
|
30
|
+
|
|
31
|
+
- Batching decisions that turn on the operator's preference, which `decision-escalate` owns
|
|
32
|
+
- Investigating a failing test or a bug in hand, which `systematic-debugging` owns
|
|
33
|
+
- Judging a finished change, which `review-pr` owns
|
|
34
|
+
- Writing the plan a go lets through, which `plan-feature` owns
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: proposal-critique
|
|
3
|
+
description: Questions a plan, a fix, a triage call, or a feature ask before it is built, in both directions, whether it does too much and whether it is too cautious, scaling the questions to how reversible the change is and how far it reaches, and ends on one verdict of go, probe first, absorb, or stop. Use when asked to "critique this plan", "poke holes in this", "is this fix worth it", "should we even build this", "challenge this proposal", or "is the cause actually ours". Do NOT use to batch open decisions that turn on the operator's preference, which is `decision-escalate`, to investigate a failing test, which is `systematic-debugging`, or to review a finished change, which is `review-pr`. Do NOT auto-trigger.
|
|
4
|
+
metadata:
|
|
5
|
+
family: decide
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Proposal critique
|
|
9
|
+
|
|
10
|
+
Question a proposal before anything is built from it, answer each question with evidence from the tree or the record, and end on one verdict.
|
|
11
|
+
|
|
12
|
+
A proposal fails two ways. It does too much, fixing a cause nobody showed is ours, or it holds back so far that the work it guards stalls. Ask both.
|
|
13
|
+
|
|
14
|
+
## Guards
|
|
15
|
+
|
|
16
|
+
- If no proposal is named and the conversation holds none, stop: `❌ Nothing to critique. Name a plan, an issue, or the proposal in a sentence.`
|
|
17
|
+
- Critique only what is not built yet. A finished change is a review, so stop and name `review-pr`.
|
|
18
|
+
- Write nothing into the proposal or any other record. The verdict goes to chat, and the operator decides what moves into a record.
|
|
19
|
+
|
|
20
|
+
## Step 1: read the proposal
|
|
21
|
+
|
|
22
|
+
Read it from its written record where one exists, being a plan path, an issue, a task, or an intake item. Read every file it names before asking anything.
|
|
23
|
+
|
|
24
|
+
- Say in the output that it was read from the conversation when no record exists, since a restated proposal drifts from the one asked for
|
|
25
|
+
- Say in the output when this session wrote the proposal, since a critique by its author is the weak form and catches less than an independent read
|
|
26
|
+
- Read the project's requirements record where one exists, since two questions test the proposal against its goals and non-goals
|
|
27
|
+
|
|
28
|
+
## Step 2: size the critique
|
|
29
|
+
|
|
30
|
+
Rate the proposal on two axes before asking anything, and let the rating set how many questions run.
|
|
31
|
+
|
|
32
|
+
- Reversibility: a two-way change is undone by a revert with nothing left behind, and a one-way change leaves state, a published release, a migration, or a habit a revert cannot reach
|
|
33
|
+
- Reach: a local change touches one surface in this repository, and a shipped change reaches targets, other repositories, or other people's work
|
|
34
|
+
|
|
35
|
+
| Rating | Groups to ask |
|
|
36
|
+
| ----------------------------- | ----------------------------------------------------- |
|
|
37
|
+
| Two-way and local | Real problem only, its first two questions, then stop |
|
|
38
|
+
| One-way, or shipped | Every group |
|
|
39
|
+
| A fix for an unverified cause | Every group, whatever the rating, starting with cause |
|
|
40
|
+
|
|
41
|
+
State the rating and its reason in one line. Never run the full set on a two-way local change to look thorough.
|
|
42
|
+
|
|
43
|
+
## Step 3: ask in both directions
|
|
44
|
+
|
|
45
|
+
Answer each question from evidence found in the tree, the history, CI, or the record, quoting what was found. A question nothing answers is answered as unknown, and an unknown feeds the probe.
|
|
46
|
+
|
|
47
|
+
### Real problem
|
|
48
|
+
|
|
49
|
+
These two run on every proposal, and alone on a two-way local one.
|
|
50
|
+
|
|
51
|
+
- What does it solve, and who hits it? A proposal with no named user or measured failure is a guess
|
|
52
|
+
- Which goal does it serve, and does it cross a non-goal?
|
|
53
|
+
|
|
54
|
+
### Cause
|
|
55
|
+
|
|
56
|
+
These test the cause before the fix, so a fix for someone else's fault never ships as ours.
|
|
57
|
+
|
|
58
|
+
- Is the cause ours? Name the evidence that separates our fault from an upstream one, such as failures bunched by day or other repositories hit at once
|
|
59
|
+
- What is the strongest rival explanation, and what would prove the proposal wrong?
|
|
60
|
+
- Where did the numbers come from? A figure the proposal predicts rather than measured is a guess until read
|
|
61
|
+
|
|
62
|
+
### Worth it
|
|
63
|
+
|
|
64
|
+
These weigh the fix against doing nothing, and the last one asks the cautious direction.
|
|
65
|
+
|
|
66
|
+
- What does doing nothing cost, being how often it hurts and what one occurrence costs, such as a rerun?
|
|
67
|
+
- Does the fix route around the cause, or retry into it?
|
|
68
|
+
- Has its mechanism worked once, anywhere this project can see?
|
|
69
|
+
- Is it too cautious? Name the work a gate, a hold, or a narrowed scope stalls, and whether the risk it guards is worth that cost
|
|
70
|
+
|
|
71
|
+
### Premortem
|
|
72
|
+
|
|
73
|
+
Treating the failure as already happened surfaces reasons a forward-looking question misses.
|
|
74
|
+
|
|
75
|
+
- Assume it shipped and failed. What is the likeliest story of how?
|
|
76
|
+
|
|
77
|
+
### Cheapest probe
|
|
78
|
+
|
|
79
|
+
An unknown found above becomes a check here rather than a guess carried into the build.
|
|
80
|
+
|
|
81
|
+
- What small, reversible check would settle the largest unknown before the build, and what would it cost?
|
|
82
|
+
|
|
83
|
+
### Stop rule
|
|
84
|
+
|
|
85
|
+
A chain of mitigations needs an end point, set before the first one fails.
|
|
86
|
+
|
|
87
|
+
- After which failed attempt does the work stop mitigating and measure the cause instead?
|
|
88
|
+
|
|
89
|
+
## Step 4: route what evidence cannot answer
|
|
90
|
+
|
|
91
|
+
Settle every question the tree or the record can answer yourself. A question whose answer turns on what the operator wants, such as how much a rerun costs them, goes to them.
|
|
92
|
+
|
|
93
|
+
- Put every such question as one batch through the structured question surface, the way `decision-escalate` shapes a batch
|
|
94
|
+
- Hold the verdict until the batch is answered when an answer could move it, and give it now when none could
|
|
95
|
+
|
|
96
|
+
## Step 5: give one verdict
|
|
97
|
+
|
|
98
|
+
Pick one of four, and name the questions that decided it.
|
|
99
|
+
|
|
100
|
+
- **Go**: the problem is real, the cause is shown, and the fix is worth its cost. Build it as proposed
|
|
101
|
+
- **Probe first**: an unknown could flip the verdict, and a cheap reversible check settles it. Name the check
|
|
102
|
+
- **Absorb**: the cost of doing nothing is smaller than the fix, so live with the problem and record why
|
|
103
|
+
- **Stop**: the problem is not shown, the cause is not ours, or the proposal crosses a non-goal
|
|
104
|
+
|
|
105
|
+
On a two-way local change, go rests on the two real-problem answers alone, since a revert undoes a wrong go. Never give two verdicts or a verdict with a condition attached. A condition is a probe, so the verdict is probe first.
|
|
106
|
+
|
|
107
|
+
## Output
|
|
108
|
+
|
|
109
|
+
```plaintext
|
|
110
|
+
Proposal: <path, issue, or "read from the conversation">
|
|
111
|
+
Rating: <two-way|one-way>, <local|shipped>, because <reason>
|
|
112
|
+
Author: <independent read|written by this session, so the weak form>
|
|
113
|
+
|
|
114
|
+
<group>
|
|
115
|
+
- <question>: <answer>, per <evidence>
|
|
116
|
+
|
|
117
|
+
Verdict: <go|probe first|absorb|stop>, decided by <the questions that settled it>
|
|
118
|
+
<Probe: the check and its cost, on probe first alone>
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## What this delegates
|
|
122
|
+
|
|
123
|
+
- Batching questions only the operator can answer: `decision-escalate`
|
|
124
|
+
- Investigating a failure already in hand: `systematic-debugging`
|
|
125
|
+
- Judging a finished change: `review-pr`
|
|
126
|
+
- Writing the plan the verdict lets through: `plan-feature`
|
|
@@ -7,7 +7,7 @@ description: Which external review patterns this skill adopted, which it decline
|
|
|
7
7
|
|
|
8
8
|
External sources were read and filtered rather than imported. This file is the record. A later session extending the skill adds to it rather than re-arguing an item already settled here.
|
|
9
9
|
|
|
10
|
-
The `addyosmani/agent-skills` citations below all pin commit `addyosmani/agent-skills@2686b620`.
|
|
10
|
+
A bullet's source is linked in its row of the toolkit's per-bullet ledger at `governance/ledger/skills/review-craft/`, outside the plugin, and this file links only a source no row cites. The `addyosmani/agent-skills` citations below all pin commit `addyosmani/agent-skills@2686b620`.
|
|
11
11
|
|
|
12
12
|
## Adopted
|
|
13
13
|
|
|
@@ -19,9 +19,9 @@ The `addyosmani/agent-skills` citations below all pin commit `addyosmani/agent-s
|
|
|
19
19
|
- Backs asking what each unit hides, and flagging a unit that passes its arguments straight through
|
|
20
20
|
- Parnas's criterion that a boundary hides a decision likely to change, [On the Criteria To Be Used in Decomposing Systems into Modules](https://dl.acm.org/doi/10.1145/361598.361623)
|
|
21
21
|
- Backs the opening step, naming the next likely change and counting what it touches
|
|
22
|
-
- Beck's design rules as Fowler records them, especially no duplication and fewest elements,
|
|
22
|
+
- Beck's design rules as Fowler records them, especially no duplication and fewest elements, BeckDesignRules
|
|
23
23
|
- Backs the one-place step, and matching each pattern to a problem the code has today
|
|
24
|
-
- Google's reviewer guide on design, complexity, and over-engineering,
|
|
24
|
+
- Google's reviewer guide on design, complexity, and over-engineering, What to look for in a code review
|
|
25
25
|
- Backs the frame for the whole walk, and the reason a speculative abstraction is a finding
|
|
26
26
|
|
|
27
27
|
The procedure stays in the body rather than a reference, since every review reads the design axis and a reference would cost a read on every run.
|
|
@@ -30,7 +30,7 @@ The procedure stays in the body rather than a reference, since every review read
|
|
|
30
30
|
|
|
31
31
|
Three scope checks come from outside sources, each adopted as one check.
|
|
32
32
|
|
|
33
|
-
- **Change sizing as a split.** Google's
|
|
33
|
+
- **Change sizing as a split.** Google's small CLs and `skills/code-review-and-quality/SKILL.md` ask for one self-contained change, so the check names a split when two concerns could land apart.
|
|
34
34
|
- **Relocate versus reduce.** The same `code-review-and-quality` skill counts the concepts a reader holds before and after a refactor, so moved complexity reports as moved.
|
|
35
35
|
- **Chesterton's Fence.** `skills/code-simplification/SKILL.md` reads why code exists before removing it, so the check reads `git blame` and the adding commit before calling a path dead.
|
|
36
36
|
|
|
@@ -22,7 +22,7 @@ Read the board in parallel, resolving the paths at the main worktree root the wa
|
|
|
22
22
|
- `.canon/plans/*.md`: features already planned and ready to hand off
|
|
23
23
|
- open PRs via `gh pr list --json number,title,headRefName,isDraft`
|
|
24
24
|
|
|
25
|
-
Then output the state of play
|
|
25
|
+
Then output the state of play, naming what to launch, review, and merge.
|
|
26
26
|
|
|
27
27
|
### Reading the order
|
|
28
28
|
|
|
@@ -164,6 +164,7 @@ Two tracks sharing a file both build, and the one merging second rebases and res
|
|
|
164
164
|
|
|
165
165
|
- Merge the branch with the smallest shared-file footprint first, so the rebases spread across the wave
|
|
166
166
|
- Merge a branch touching `CLAUDE.md`, a Claude context entry, or a regenerated `index.md` last
|
|
167
|
+
- Merge a review batch back to back in least-rebase order as each pass closes
|
|
167
168
|
- Have every sibling the merged diff touches rebase on the new `main` before the next merge
|
|
168
169
|
- 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.
|
|
169
170
|
|
|
@@ -171,4 +172,4 @@ Two tracks sharing a file both build, and the one merging second rebases and res
|
|
|
171
172
|
|
|
172
173
|
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.
|
|
173
174
|
|
|
174
|
-
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.
|
|
175
|
+
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, the batch, and how that pass reaches each brief.
|
|
@@ -17,6 +17,14 @@ A filed row carries what this seat saw and nothing it did not measure.
|
|
|
17
17
|
- A finding placed in another task's `## Findings` is filing under a second name and takes the same rule
|
|
18
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
19
|
|
|
20
|
+
## Filing a bundle
|
|
21
|
+
|
|
22
|
+
A ready list can name a bundle row, items whose fixes share a file. File an agreed bundle as one task with an outcome per item, one plan, and one branch.
|
|
23
|
+
|
|
24
|
+
- Ask the operator before filing one when a ready list reaches this seat with no bundle agreed, since a bundle drops per-item revert and that is the operator's call
|
|
25
|
+
- Leave a small fix with no shared file as its own row
|
|
26
|
+
- Cut a dropped item with the strike form, and the rest close as one pull request
|
|
27
|
+
|
|
20
28
|
## Which measurements stay here
|
|
21
29
|
|
|
22
30
|
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.
|
|
@@ -50,7 +50,10 @@ A reviewer reports that `canon sessions list --branch` returned no session or an
|
|
|
50
50
|
|
|
51
51
|
A worker reports that the reviewer's sessionId resolved to no live session, or sends a re-review request with no reviewer named in its dispatch. Launch a fresh reviewer through the reviewer shape in `orchestrator-reviewer-launch.md`, never a pass in place, rather than messaging a name that no longer answers.
|
|
52
52
|
|
|
53
|
-
A re-review this session sends goes to the reviewer that took the first pass.
|
|
53
|
+
A re-review this session sends goes to the reviewer that took the first pass. Message it to re-run `review-pr` for that number alone, and launch a fresh one only when none is live.
|
|
54
|
+
|
|
55
|
+
- Find it through `canon sessions list --json` by a `reviewer-<project>-` name whose trailing numbers include the pull request's number
|
|
56
|
+
- Match among the trailing numbers rather than the whole name, since a batch reviewer's name lists every number it holds
|
|
54
57
|
|
|
55
58
|
### When no session is live
|
|
56
59
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Orchestrator review dispatch runbook
|
|
3
|
-
description: Which pull requests take a reviewer dispatched under role-reviewer, the model it runs on, when a UI reviewer goes beside it, and how the cross-branch pass per wave reaches each brief
|
|
3
|
+
description: Which pull requests take a reviewer dispatched under role-reviewer, the model it runs on, when a UI reviewer goes beside it, when small pull requests share one reviewer pair, and how the cross-branch pass per wave reaches each brief
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Run this on every first pass, from `### The review dispatch` in the skill body. Review splits by what each side can see rather than by pass number. A dispatched reviewer holds one pull request and reads it deeper than this session can while holding a wave, and this session holds the wave and reads what no single pull request shows.
|
|
@@ -22,6 +22,29 @@ A pull request whose evidence record carries a checklist takes a second reviewer
|
|
|
22
22
|
- The UI reviewer reads no diff and never hears the code verdict, so neither brief carries the other's result
|
|
23
23
|
- Each posts its own family and runs `canon pr lift` on its close, and the verb lifts the draft mark only once both read closed at the head
|
|
24
24
|
|
|
25
|
+
## A batch of small pull requests
|
|
26
|
+
|
|
27
|
+
Small pull requests landing together can share one reviewer pair rather than taking a pair each. Rows stay one per fix, so only the review is batched, and this session decides the batch without asking the operator.
|
|
28
|
+
|
|
29
|
+
### The batch test
|
|
30
|
+
|
|
31
|
+
A pull request joins a batch only when every condition below holds. No size number decides, since a row the planner kept to one fix is already small.
|
|
32
|
+
|
|
33
|
+
- Its plan names no contract under `## Risks` that another track consumes
|
|
34
|
+
- It needs no design pick, and its Testing section names no billed run
|
|
35
|
+
- It opens in the same wave as every other pull request in the batch
|
|
36
|
+
|
|
37
|
+
A pull request failing any condition takes its own reviewer pair, as above. A row found touching a consumed contract after launch comes back from the batch reviewer. Launch it a fresh pair, leaving that reviewer out of the live check below, since its name still lists the number.
|
|
38
|
+
|
|
39
|
+
### One pair per batch
|
|
40
|
+
|
|
41
|
+
Launch one code reviewer for the whole batch, and one UI reviewer beside it when any batched evidence record carries a checklist. `orchestrator-reviewer-launch.md` carries both batch shapes.
|
|
42
|
+
|
|
43
|
+
- Each pull request still takes its own pass, its own verdict comment, and its own `canon pr lift`, since the poll routes on each comment's heading
|
|
44
|
+
- Never ask for one summary comment across the set, since a second comment is a second verdict the poll cannot route
|
|
45
|
+
- Name the batch and the test it passed in the dispatch report, so the operator can split it before the first pass posts
|
|
46
|
+
- The skill body's `### Merge order and ports` states how a batch merges, and a pull request whose pass stays open waits for its own re-review while the rest merge
|
|
47
|
+
|
|
25
48
|
## The cross-branch pass
|
|
26
49
|
|
|
27
50
|
This session keeps one pass per wave beside the dispatched reviews. It reads the file sets of every open pull request against each other, the board, and the merge order, and never the diffs themselves.
|
|
@@ -43,7 +66,8 @@ A pull request whose Testing section names a billed run waits on the operator's
|
|
|
43
66
|
|
|
44
67
|
Take the reviewer shape in `orchestrator-reviewer-launch.md`, or its UI reviewer shape for a pull request carrying a checklist.
|
|
45
68
|
|
|
46
|
-
- Check `canon sessions list --json` first for a live `reviewer-<project
|
|
69
|
+
- Check `canon sessions list --json` first for a live `reviewer-<project>-` or `reviewer-ui-<project>-` session whose trailing numbers include `<number>`, and message it instead of launching
|
|
70
|
+
- Match a number among the trailing ones rather than the whole name, since a batch reviewer's name lists every pull request it holds
|
|
47
71
|
- Two reviewers on one pull request post two verdicts
|
|
48
72
|
- The re-review after a worker's address pass reaches the reviewer from the worker, and this session sends it only as the fallback `orchestrator-handback.md` states
|
|
49
73
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Orchestrator reviewer launch runbook
|
|
3
|
-
description: The launch shapes that start a reviewer rather than a builder, being the code reviewer, the cloud reviewer,
|
|
3
|
+
description: The launch shapes that start a reviewer rather than a builder, being the code reviewer, the cloud reviewer, the UI reviewer driving a pull request's checklist, and the batch shapes holding several small pull requests
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Run this once `orchestrator-review-dispatch.md` has sent a pull request to a dispatched reviewer. The build, review-address, and planning shapes, and the rules every launch shares, stay in `orchestrator-launch.md`.
|
|
@@ -19,7 +19,7 @@ claude --bg --model <model> -n "reviewer-<project>-<number>" "Run /canon:role-re
|
|
|
19
19
|
- `<model>` comes from `## Pick the model` in `orchestrator-dispatch.md`, which states the test for a reviewer as for every other role
|
|
20
20
|
- `<dispatcher-id>` and `<project>` resolve the same way they do in `orchestrator-launch.md`
|
|
21
21
|
- Append the cross-branch facts after the controller clause, per `### What the brief may carry` in `orchestrator-launch.md`
|
|
22
|
-
- Check `canon sessions list --json` for a live `reviewer-<project
|
|
22
|
+
- Check `canon sessions list --json` before launching for a live `reviewer-<project>-` session whose trailing numbers include `<number>`, and message it instead when one holds the pull request
|
|
23
23
|
|
|
24
24
|
### Record the reviewer on the task
|
|
25
25
|
|
|
@@ -29,7 +29,7 @@ A reviewer writes no task file, so this session names it on the task the pull re
|
|
|
29
29
|
canon tasks session <reviewer-id> <task> --json
|
|
30
30
|
```
|
|
31
31
|
|
|
32
|
-
Record the UI reviewer below the same way after its launch. A `no-name` refusal means the reviewer exited before the read, so rerun with `--name` and the name the launch passed to `-n`.
|
|
32
|
+
Record the UI reviewer below the same way after its launch, and a batch reviewer on every task its batch closes, one call per task. A `no-name` refusal means the reviewer exited before the read, so rerun with `--name` and the name the launch passed to `-n`.
|
|
33
33
|
|
|
34
34
|
### The channel clauses
|
|
35
35
|
|
|
@@ -57,3 +57,22 @@ The model is `sonnet`, always, as the UI reviewer line in `## Pick the model` in
|
|
|
57
57
|
Name an address only when the evidence record carries no `preview` and no `local` field, as `Drive <url>.` after the controller clause. An address the record holds is the one the pass reads first, and a second in the brief is a second source for one fact.
|
|
58
58
|
|
|
59
59
|
Name a CLI config path the same way when the operator keeps a GPU recipe for this machine, since the pass renders in software otherwise.
|
|
60
|
+
|
|
61
|
+
## Dispatch a batch to one reviewer
|
|
62
|
+
|
|
63
|
+
`orchestrator-review-dispatch.md` decides when small pull requests share a reviewer pair. The batch shapes run the single shapes above once per number, in the order the name lists them.
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
claude --bg --model <model> -n "reviewer-<project>-<n1>-<n2>" "Run /canon:role-reviewer, then run /canon:review-pr once for each of <n1> <n2>, in that order, posting each verdict on its own pull request and never one comment across the set. Your controller is the session whose sessionId is <dispatcher-id>. Resolve its current name from that id through canon sessions list --json, which carries sessionId per row, at the moment you send, and never resolve an addressee by name prefix. When a pass posts under ## Review, message the worker holding that pull request's branch to run review-address, carrying your own sessionId and the number, and send it to the controller instead when no worker resolves. When a pass posts ## Review closed, run canon pr lift <that number> --json and message the controller with the number, the heading, the count line, and the reason the verb returned, unless that reason names the UI review as still open or missing. A re-review request names one number, so re-run that pass alone. Message the controller again if you stop on a question."
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
- The name lists every number, so the live check and the handback match a number among the trailing ones
|
|
70
|
+
- `canon pr lift` runs once per number on that number's close, so a closed pull request lifts while another in the batch stays open
|
|
71
|
+
- Append each pull request's cross-branch facts after the controller clause, prefixed with its number
|
|
72
|
+
|
|
73
|
+
### The UI batch shape
|
|
74
|
+
|
|
75
|
+
The UI reviewer takes `reviewer-ui-<project>-<n1>-<n2>` and `review-ui` once per number, with the code shape's clauses for that family. Name only the pull requests whose evidence record carries a checklist, since a pass on one without a checklist stops on arrival.
|
|
76
|
+
|
|
77
|
+
- The model is `sonnet`, as for the single UI shape
|
|
78
|
+
- `canon pr lift` runs once per number on that number's `## UI review closed`, unless the reason names the code review as still open or missing
|
|
@@ -46,7 +46,8 @@ Each item below is something a record needed and a launch string did not carry.
|
|
|
46
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.
|
|
47
47
|
|
|
48
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,
|
|
49
|
+
- `${CLAUDE_SKILL_DIR}/../plan-feature/references/plan.md` for the shape, read through the `plan-feature` invocation rather than in its place
|
|
50
|
+
- `canon records validate plans` and `canon markdown audit <the plan file>` once it is written
|
|
50
51
|
|
|
51
52
|
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.
|
|
52
53
|
|
|
@@ -121,6 +122,7 @@ The operator being present is an assumption the launch carries. A talk planner w
|
|
|
121
122
|
## Lifetime
|
|
122
123
|
|
|
123
124
|
- 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.
|
|
125
|
+
- Invoke that record's skill again for a second row, being `plan-feature`, `plan-groundwork`, or `plan-intake`, rather than writing from the reference of the one run before
|
|
124
126
|
- A reused session's picture of the tree ages, and a compaction silently drops the reasoning behind its earlier records
|
|
125
127
|
- Run the in-flight read again before each handed row, and stop when the operator ends the session or a compaction nears, telling the controller which rows are still unplanned
|
|
126
128
|
- 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.
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: role-reviewer
|
|
3
|
-
description: Asserts the reviewer role for a session dispatched to review one pull request another session built, holding what it may write, what it reads and never reads, the messages it owes the worker and the controller, the lift it runs on a close, and the acts it refuses. Use when asked to "be the reviewer", "you are a reviewer session", at the start of a dispatched or hand-launched review of one pull request, or when a reviewing session needs to know what it may not write or who it answers to. Do NOT use to run the pass itself, which is `review-pr` for the code and `review-ui` for the running app, or to make the cross-branch call across a wave.
|
|
3
|
+
description: Asserts the reviewer role for a session dispatched to review one pull request another session built, or a batch of small ones, holding what it may write, what it reads and never reads, the messages it owes the worker and the controller, the lift it runs on a close, and the acts it refuses. Use when asked to "be the reviewer", "you are a reviewer session", at the start of a dispatched or hand-launched review of one pull request or a batch, or when a reviewing session needs to know what it may not write or who it answers to. Do NOT use to run the pass itself, which is `review-pr` for the code and `review-ui` for the running app, or to make the cross-branch call across a wave.
|
|
4
4
|
metadata:
|
|
5
5
|
family: parallel
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Role reviewer
|
|
9
9
|
|
|
10
|
-
This session reads one pull request it did not write and posts a verdict on
|
|
10
|
+
This session reads one pull request it did not write, or each in a batch the launch named, and posts a verdict on each. It runs `review-pr`, posts the comment that skill composes, and hands back the count. Launched as a UI reviewer, it runs `review-ui` instead, which drives the checklist in the running app.
|
|
11
11
|
|
|
12
12
|
It does not fix what it finds, decide what merges before what, or merge. Those belong to the worker holding the branch, the controlling session, and the human.
|
|
13
13
|
|
|
@@ -33,7 +33,17 @@ The rules below close off everything else.
|
|
|
33
33
|
|
|
34
34
|
Keep a task list from launch, one item per step of the pass, and tick each as it completes. Skip it on a host that offers no list tool, since the list is for the operator watching and not a gate.
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
### The pull requests the launch named
|
|
37
|
+
|
|
38
|
+
Review each pull request the launch named and no other. Report one met while reading rather than reviewing it, since which pull requests take a dispatched pass is the controller's call.
|
|
39
|
+
|
|
40
|
+
A batch launch names several small pull requests, and each still takes a pass of its own. The batch shares this session and nothing the poll reads.
|
|
41
|
+
|
|
42
|
+
- Run the pass once per number, in the launch's order, and post each verdict on its own pull request. A summary across the set is a second verdict the poll cannot route.
|
|
43
|
+
- Run `canon pr lift <number>` on each close alone, so a closed pull request lifts while another in the batch stays open
|
|
44
|
+
- Re-run the pass only for the number a re-review request names, since every other pull request in the batch keeps its own head
|
|
45
|
+
- Skip a pull request whose evidence record carries no checklist as a UI reviewer, and drive the rest
|
|
46
|
+
- Report a batched pull request found touching a contract another track consumes to the controller and leave it unreviewed, since the diff overturned the reading that admitted it
|
|
37
47
|
|
|
38
48
|
## What to read and what to leave
|
|
39
49
|
|
|
@@ -102,6 +112,7 @@ One rung stays here because it differs between roles. A reviewer holds no featur
|
|
|
102
112
|
|
|
103
113
|
## Lifetime
|
|
104
114
|
|
|
105
|
-
- The role runs from the launch to the merge of
|
|
115
|
+
- The role runs from the launch to the merge of each pull request it reviewed, across every pass. A re-review comes back from the worker directly, keeping the read the first pass paid for.
|
|
106
116
|
- A session handed a second pull request is a new reviewer under a new launch, since the first one's reading of the change is exactly what the second must not carry.
|
|
117
|
+
- A batch launch is the one exception. The controller names its pull requests at launch, and the batch test keeps them small and contract-free, so a reading carried across them costs little.
|
|
107
118
|
- Treat this body as possibly older than the branch under review. A plugin skill loads from the marketplace cache rather than from the working tree.
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Adopted and declined
|
|
3
|
-
description: Which comparable research skills this skill was read against, what it took from them, what it declined, and which of its rules
|
|
3
|
+
description: Which comparable research skills this skill was read against, what it took from them, what it declined, and which of its rules no comparable skill states
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Adopted and declined
|
|
7
7
|
|
|
8
|
-
Three third-party research skills were read before this one was written
|
|
8
|
+
Three third-party research skills were read before this one was written, and none was imported. Most of the body rests on library-science and search-tool sources cited per bullet, with paired open and scoped searches as supporting evidence.
|
|
9
|
+
|
|
10
|
+
Each source is linked once, in its bullet's row of the toolkit's per-bullet ledger at `governance/ledger/skills/search-craft/`, which ships outside the plugin. This file keeps the adopted and declined record, linking only a source no row cites, and a later session adds to it rather than re-arguing an item settled here.
|
|
9
11
|
|
|
10
12
|
## Adopted
|
|
11
13
|
|
|
12
14
|
### Recording each route's failure
|
|
13
15
|
|
|
14
|
-
|
|
16
|
+
`aghori3004/claude-research-stack` keeps one `research-sources` skill that orders sources cheapest first and writes down how each one fails. Adopted as the access note, which records a refusal a session hit rather than leaving the next session to learn it by failing.
|
|
15
17
|
|
|
16
18
|
### Calling the tools directly
|
|
17
19
|
|
|
@@ -19,7 +21,7 @@ The same skill ships no wrapper scripts, so it calls the command-line tools and
|
|
|
19
21
|
|
|
20
22
|
### Treating a paid route as the operator's call
|
|
21
23
|
|
|
22
|
-
|
|
24
|
+
`rohunvora/x-research-skill` reaches X through the official API at a cost per search page. Adopted as the stop before any route that pays or logs in, since that cost is one the operator decides rather than one a session discovers.
|
|
23
25
|
|
|
24
26
|
## Declined
|
|
25
27
|
|
|
@@ -35,8 +37,8 @@ None of the three is one, and each earns its keep on access and cost instead. A
|
|
|
35
37
|
|
|
36
38
|
[mvanhorn/last30days-skill](https://github.com/mvanhorn/last30days-skill) is a Python engine with its own test suite and paid aggregators behind it. Declined because a skill here ships no code, and access a session needs repeatedly becomes a `canon` verb.
|
|
37
39
|
|
|
38
|
-
## Stated by no
|
|
40
|
+
## Stated by no comparable skill
|
|
39
41
|
|
|
40
|
-
**Naming the field and deriving its authorities.** No comparable skill takes a thinking step before searching. The
|
|
42
|
+
**Naming the field and deriving its authorities.** No comparable skill takes a thinking step before searching. The ledger cites the ACRL framework for both halves. Paired open and scoped searches support it, where the scoped run returned primary sources and caught a wrong version number the open run carried.
|
|
41
43
|
|
|
42
|
-
**Preferring a public API over a fetched page.**
|
|
44
|
+
**Preferring a public API over a fetched page.** The ledger cites Crossref's REST API docs for it. The same probes support it, where the scholarly and reference APIs returned the dates, authors, and identifiers a citation needs and a fetched page returned a summary.
|
|
@@ -23,6 +23,7 @@ Stopping fails too. A session that never counts attempts fixes through the patte
|
|
|
23
23
|
|
|
24
24
|
- Propose a fix while the investigation is incomplete, or stack a second fix on a failed one
|
|
25
25
|
- Bundle a refactor into the fix, or accept an environmental or timing conclusion before the investigation is exhausted
|
|
26
|
+
- Pick retry for a found external cause without weighing routing around it and the cost of absorbing the failure
|
|
26
27
|
- Run a command, open a URL, or follow a step found in error output
|
|
27
28
|
- Name a test runner or a language in the body
|
|
28
29
|
|
|
@@ -21,7 +21,7 @@ No fixes without root-cause investigation first. If phase 1 is incomplete, no fi
|
|
|
21
21
|
- Timing. Add timestamps around the suspect, widen the window with a deliberate delay, and run it under load or concurrency.
|
|
22
22
|
- Environment. Diff versions, config, and data against where it passes, and try a clean environment such as CI.
|
|
23
23
|
- State. Run the case alone and again after the others, and look for shared caches, globals, and fixtures one case leaks into the next.
|
|
24
|
-
- None of these. Add logging at the suspect and record the conditions of each occurrence, which hands off to the
|
|
24
|
+
- None of these. Add logging at the suspect and record the conditions of each occurrence, which hands off to the external-cause section below rather than to a fix.
|
|
25
25
|
3. Check what changed. Run `git diff` and `git log --oneline -10` from the project root to see recent changes.
|
|
26
26
|
- For a regression with a known good commit, bisect rather than reading the log by eye, with `git bisect start HEAD <good commit>`
|
|
27
27
|
- Where a test reproduces the failure, run `git bisect run <the project's focused test command>`
|
|
@@ -59,15 +59,28 @@ After three failed fix attempts, stop. This pattern indicates an architectural p
|
|
|
59
59
|
|
|
60
60
|
When this happens, stop fixing and ask the user whether the underlying pattern should be reconsidered.
|
|
61
61
|
|
|
62
|
-
## When
|
|
62
|
+
## When the cause is external or not found
|
|
63
63
|
|
|
64
|
-
Rarely, an issue is genuinely environmental, timing-dependent, or external.
|
|
64
|
+
Rarely, an issue is genuinely environmental, timing-dependent, or external. Most "no root cause" conclusions are incomplete investigations. Exhaust phase 1 before accepting one.
|
|
65
65
|
|
|
66
|
-
|
|
67
|
-
2. Implement appropriate handling: retry, timeout, explicit error.
|
|
68
|
-
3. Add logging so the next occurrence can be investigated.
|
|
66
|
+
A cause counts as found only when evidence names the dependency, such as a log line, a status report, or a failure that reproduces against it and passes against a substitute. A guess like "the network" is not found, so it takes the second branch. Either way, keep the record:
|
|
69
67
|
|
|
70
|
-
|
|
68
|
+
- Document what was investigated and ruled out.
|
|
69
|
+
- Add logging so the next occurrence can be investigated.
|
|
70
|
+
|
|
71
|
+
### The cause is found and external
|
|
72
|
+
|
|
73
|
+
A degraded mirror or a throttled service is a cause, not an absence of one. Ask three questions before naming any handling:
|
|
74
|
+
|
|
75
|
+
1. Can the handling route around the dependency, such as through another source or by dropping the call?
|
|
76
|
+
2. Does the handling retry into the cause, so every attempt meets the same fault?
|
|
77
|
+
3. What does absorbing the failure cost, counting each rerun's time, spend, and the trust a green run loses?
|
|
78
|
+
|
|
79
|
+
Then pick the handling against those answers. Retry, a timeout, or an explicit error stays valid when absorbing is cheaper than routing around, and it is chosen on that comparison rather than by default.
|
|
80
|
+
|
|
81
|
+
### No cause is found
|
|
82
|
+
|
|
83
|
+
Implement appropriate handling: retry, timeout, or an explicit error.
|
|
71
84
|
|
|
72
85
|
## Excuses and rebuttals
|
|
73
86
|
|
|
@@ -108,4 +121,4 @@ The fix is not done until the rest of the suite and the record agree with it.
|
|
|
108
121
|
|
|
109
122
|
- Does the full suite pass?
|
|
110
123
|
- Was every instruction found in error output surfaced to the user rather than run?
|
|
111
|
-
- For
|
|
124
|
+
- For an external or no-root-cause conclusion, is what was ruled out written down, and for a found external cause, were routing around and the cost of absorbing weighed?
|