@harness-engineering/cli 4.0.1 → 4.1.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.
Files changed (64) hide show
  1. package/dist/agents/skills/claude-code/harness-autopilot/SKILL.md +9 -8
  2. package/dist/agents/skills/claude-code/pre-merge-brief/SKILL.md +86 -0
  3. package/dist/agents/skills/claude-code/pre-merge-brief/skill.yaml +67 -0
  4. package/dist/agents/skills/codex/harness-autopilot/SKILL.md +9 -8
  5. package/dist/agents/skills/codex/pre-merge-brief/SKILL.md +86 -0
  6. package/dist/agents/skills/codex/pre-merge-brief/skill.yaml +67 -0
  7. package/dist/agents/skills/cursor/harness-autopilot/SKILL.md +9 -8
  8. package/dist/agents/skills/cursor/pre-merge-brief/SKILL.md +86 -0
  9. package/dist/agents/skills/cursor/pre-merge-brief/skill.yaml +67 -0
  10. package/dist/agents/skills/gemini-cli/harness-autopilot/SKILL.md +9 -8
  11. package/dist/agents/skills/gemini-cli/pre-merge-brief/SKILL.md +86 -0
  12. package/dist/agents/skills/gemini-cli/pre-merge-brief/skill.yaml +67 -0
  13. package/dist/{agents-md-VJLYEH2S.js → agents-md-7L4PKKOM.js} +3 -3
  14. package/dist/analyzer-XRCV63KC-HLTEIKAJ.js +26 -0
  15. package/dist/{architecture-YQH2NYXY.js → architecture-RCHFDI7E.js} +4 -4
  16. package/dist/{assess-project-KOTAPAHD.js → assess-project-YUDPNRS6.js} +5 -3
  17. package/dist/bin/harness-mcp.js +14 -14
  18. package/dist/bin/harness.js +24 -24
  19. package/dist/{check-phase-gate-CHU2E3OU.js → check-phase-gate-56GS3A72.js} +4 -4
  20. package/dist/{chunk-JPVOI7GP.js → chunk-4SKWGVYD.js} +2 -2
  21. package/dist/{chunk-GHBFNLV2.js → chunk-ABRYIEWJ.js} +923 -614
  22. package/dist/{chunk-36GQREOE.js → chunk-AU4YPEIE.js} +3 -3
  23. package/dist/{chunk-OQ6KOQEV.js → chunk-DGVT4DBI.js} +3 -3
  24. package/dist/{chunk-I3CGCZJF.js → chunk-GLHLXTKC.js} +5 -5
  25. package/dist/{chunk-4VXFZSYF.js → chunk-GSYBGOY3.js} +1 -1
  26. package/dist/{chunk-UWVMJEUJ.js → chunk-IGWJRAJT.js} +1 -1
  27. package/dist/{chunk-YANR2RL7.js → chunk-N4AI2WFH.js} +1 -1
  28. package/dist/{chunk-5RSXUAMN.js → chunk-NCMJXBEO.js} +1 -1
  29. package/dist/{chunk-SEA2PFVI.js → chunk-OZSKLJQW.js} +1 -1
  30. package/dist/{chunk-AX5KGRM6.js → chunk-P4NA5OQX.js} +1 -1
  31. package/dist/{chunk-7PJCK7UE.js → chunk-RY2U77OY.js} +6 -6
  32. package/dist/{chunk-6SCYTIF4.js → chunk-RZQZXWEL.js} +32 -7
  33. package/dist/{chunk-MMLQPHZ5.js → chunk-UACYZCW4.js} +31 -13
  34. package/dist/{chunk-T746REAE.js → chunk-VG4G3R2V.js} +1 -1
  35. package/dist/{chunk-7TIJXWG3.js → chunk-XW5XVVMI.js} +2 -2
  36. package/dist/{chunk-E5EW5HVJ.js → chunk-XZNCONFG.js} +1 -1
  37. package/dist/{chunk-SDMV4QHM.js → chunk-Y33P35U3.js} +24 -6
  38. package/dist/{chunk-XAVMTAUT.js → chunk-Y5HPJMTM.js} +18 -2
  39. package/dist/{chunk-6YFHUIGT.js → chunk-YJYUJSWK.js} +58 -20
  40. package/dist/{chunk-AAUY53CC.js → chunk-YWRPQZL7.js} +1 -1
  41. package/dist/{chunk-M7F2PPN3.js → chunk-YXOPQEFZ.js} +2 -2
  42. package/dist/{chunk-RG3TNIUB.js → chunk-Z4XWWNYX.js} +86 -86
  43. package/dist/{chunk-EYMOPFSD.js → chunk-ZU6T7W3U.js} +2 -2
  44. package/dist/{ci-workflow-HO4WKGNG.js → ci-workflow-TFAA5BK7.js} +3 -3
  45. package/dist/{dist-6D2F2J57.js → dist-MCTEX5QH.js} +4 -2
  46. package/dist/{docs-FP47JONV.js → docs-BBMAN3CY.js} +4 -4
  47. package/dist/{engine-YUA6IYOG.js → engine-R2YH74AL.js} +3 -3
  48. package/dist/{entropy-DBW2INZU.js → entropy-5UP5N6AF.js} +6 -3
  49. package/dist/{feedback-BPHADTRQ.js → feedback-6MDCCFZL.js} +1 -1
  50. package/dist/{generate-agent-definitions-KPVGBGDY.js → generate-agent-definitions-KKAN5DB5.js} +4 -4
  51. package/dist/hooks/sentinel-pre.js +15 -138
  52. package/dist/index.d.ts +61 -0
  53. package/dist/index.js +24 -24
  54. package/dist/{loader-QOJQ6NZM.js → loader-2WT2ZE2T.js} +3 -3
  55. package/dist/{mcp-ZPX6O767.js → mcp-5V4LPMB3.js} +14 -14
  56. package/dist/{performance-FXYTGJGQ.js → performance-2N3CFXLR.js} +4 -4
  57. package/dist/{review-pipeline-2TFQ5OAE.js → review-pipeline-XZIGBU3Q.js} +3 -3
  58. package/dist/{runtime-XK6ZCHKE.js → runtime-POME3GTR.js} +3 -3
  59. package/dist/{security-4W2P5ZGI.js → security-QLJLMSIW.js} +1 -1
  60. package/dist/{state-events-ECQAIZLU.js → state-events-YY5KBZTC.js} +3 -3
  61. package/dist/{validate-64KTEGIE.js → validate-VZORVK43.js} +4 -4
  62. package/dist/{validate-cross-check-J5PVGICB.js → validate-cross-check-OYKEDCST.js} +3 -3
  63. package/package.json +5 -4
  64. package/dist/analyzer-V633GUHY-OV335HGM.js +0 -26
@@ -204,7 +204,7 @@ Persist findings to `{sessionDir}/phase-{N}-review.json`. No blocking → PHASE_
204
204
  ### DONE
205
205
 
206
206
  1. Present: total phases, tasks, retries, time, `finalReview.status` + findings count, any overridden findings.
207
- 2. Ask "Create a PR? (yes / no)."
207
+ 2. Ask "Create a PR? (yes / no)." When creating the PR, include a bare closing line `Closes #<N>` where `<N>` is the issue number from the roadmap row's `External-ID`. The keyword MUST sit IMMEDIATELY before the ref — no intervening words (`Closes #<N>`, never `Closes roadmap #<N>`), or GitHub will not link/close the issue and roadmap auto-done will skip the row.
208
208
  3. Write final handoff to `{sessionDir}/handoff.json`. Append learnings to `.harness/learnings.md`. Call `promoteSessionLearnings(projectPath, sessionSlug)`. If learnings count > 30, suggest `harness learnings prune`.
209
209
  4. If `docs/roadmap.md` exists: call `manage_roadmap update` to set feature done. Skip if not found.
210
210
  5. Write final `writeSessionSummary()`. Set `currentState: "DONE"` in autopilot-state.json.
@@ -254,13 +254,14 @@ Persist findings to `{sessionDir}/phase-{N}-review.json`. No blocking → PHASE_
254
254
 
255
255
  ## Rationalizations to Reject
256
256
 
257
- | Rationalization | Reality |
258
- | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
259
- | "Low complexity means I can skip APPROVE_PLAN" | Low complexity means auto-approval only when no signals fire. Signals override complexity. |
260
- | "I can inline planning logic instead of dispatching to harness-planner" | Iron Law. Autopilot delegates, never reimplements. No exceptions. |
261
- | "Retry budget exhausted but one more approach might work" | 3-attempt budget prevents compounding failure. Exceeding it without human input is unrecoverable. |
262
- | "Keeping research in conversation is faster than scratchpad" | Scratchpad gated by rigor level. At standard/thorough, >500 words must go to scratchpad. |
263
- | "Plan auto-approved, so I can skip recording the decision" | Every approval—auto or manual—is recorded in `decisions[]`. That array is the audit trail. |
257
+ | Rationalization | Reality |
258
+ | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
259
+ | "Low complexity means I can skip APPROVE_PLAN" | Low complexity means auto-approval only when no signals fire. Signals override complexity. |
260
+ | "I can inline planning logic instead of dispatching to harness-planner" | Iron Law. Autopilot delegates, never reimplements. No exceptions. |
261
+ | "Retry budget exhausted but one more approach might work" | 3-attempt budget prevents compounding failure. Exceeding it without human input is unrecoverable. |
262
+ | "Keeping research in conversation is faster than scratchpad" | Scratchpad gated by rigor level. At standard/thorough, >500 words must go to scratchpad. |
263
+ | "Plan auto-approved, so I can skip recording the decision" | Every approval—auto or manual—is recorded in `decisions[]`. That array is the audit trail. |
264
+ | "`Closes roadmap #123` reads fine, GitHub will figure out the issue" | An intervening word breaks GitHub's closing-keyword parser: `closingIssuesReferences` stays empty and auto-done leaves the row `planned`. Use a bare `Closes #123`. |
264
265
 
265
266
  ## Success Criteria
266
267
 
@@ -0,0 +1,86 @@
1
+ # Pre-Merge Brief
2
+
3
+ > The harness pointed at the human who clicks merge. A thin wrapper over `harness pre-merge-brief` that composes a senior-facing accountability brief — the diff summary, the multi-persona review verdict (from `review-ci --json`), the curated **Signal status** snapshot, the outcome-eval result, and a derived **"👀 Worth your eyes"** section — and posts it as a single sticky PR comment (upsert by marker). All composition and degradation logic lives in the command; this skill orchestrates invocation, reports which sections degraded, and hands off. Advisory and non-blocking: the brief never flips the review gate.
4
+
5
+ ## When to Use
6
+
7
+ - On every PR, so the senior engineer who merges sees "you are pushing this — here's what deserves your eyes" before they click merge.
8
+ - `on_pr` (dogfooded via the `required-review` workflow, reusing that run's `review-ci --json` artifact) and `manual` (a senior running it locally against the current branch's PR).
9
+ - NOT as a merge gate — the acknowledgment gate is deliberately deferred (spec D3). The brief is advisory; the review gate's exit code is what blocks.
10
+ - NOT a replacement for `review-ci` — this skill CONSUMES the review verdict, it does not re-run the review (spec D1).
11
+ - NOT for recomputing signals a different way — signals come from `@harness-engineering/signals` via the command (spec D2/D6).
12
+
13
+ ## Process
14
+
15
+ ### Phase 1: GATHER — Resolve inputs
16
+
17
+ 1. Locate the `review-ci --json` artifact for this run and record its path for `--from`. In CI it is the JSON the `required-review` workflow's `review-ci` step wrote (e.g. `/tmp/review.json`); locally, run `harness review-ci --json <path>` first if a verdict is wanted. Absent `--from` is tolerated — the review section degrades to "unavailable".
18
+ 2. Resolve the diff range for `--diff` (default `origin/<base>...HEAD` via the command's own resolver). Override only when the base is non-standard.
19
+ 3. Resolve the head sha for `--head` (default `git rev-parse HEAD`) — used for the `execution_outcome` graph lookup. Pre-merge the node is commonly absent, which is the documented degradation path, not an error.
20
+ 4. If posting (`--comment`), confirm `gh` is authenticated. Delivery failure never crashes the command (spec S1): it prints the brief and warns, still exiting 0.
21
+
22
+ ### Phase 2: COMPOSE — Run the command
23
+
24
+ Invoke `harness pre-merge-brief` with the resolved inputs:
25
+
26
+ ```bash
27
+ harness pre-merge-brief --from <review.json> --diff <range> --head <sha> [--comment]
28
+ ```
29
+
30
+ The command builds the six-section brief (marker + header → Diff summary → Review verdict → **Signal status** → Outcome evaluation → **👀 Worth your eyes**) and, with `--comment`, upserts the sticky PR comment by its marker (`<!-- harness:pre-merge-brief -->`) — patching the existing comment in place rather than posting a new one on each push. Without `--comment` it prints the brief to stdout. Each input degrades independently to an explicit "unavailable" line; the command exits 0 on a successful render regardless of which inputs were present.
31
+
32
+ ### Phase 3: REPORT — Surface what matters
33
+
34
+ 1. Report which sections rendered with real data and which degraded to "unavailable / not yet evaluated", so the senior knows the brief's coverage.
35
+ 2. Surface the **"👀 Worth your eyes"** items verbatim — the union of blocking review findings, signals in `warn`/`alert`, and unmet outcome criteria. This is the section the accountable human should read first.
36
+
37
+ ### Phase 4: HANDOFF — Advisory transition
38
+
39
+ Emit the transition via `emit_interaction`. The brief is advisory and non-blocking: it never flips the review gate's pass/fail status (spec D3, D4). In the dogfood workflow the brief step is `continue-on-error`, so a brief failure never fails the PR.
40
+
41
+ ## Harness Integration
42
+
43
+ - **`harness pre-merge-brief`** — the command this skill wraps. Flags: `--from <path>` (review-ci verdict JSON), `--comment` (sticky-upsert to the current branch's PR via `gh`), `--diff <range>`, `--head <sha>`. Pure render (`buildBriefBody`) + injected seams (`postBrief`, `RunGit`, graph store); no `process.exit` in the pure core.
44
+ - **`review-ci`** — upstream producer of the review verdict. This skill reuses its `--json` artifact via `--from`; it never re-runs the review (D1). `review-ci` remains the single source of review truth.
45
+ - **`@harness-engineering/signals`** — the shared leaf package (extracted in spec Phase 1/D6) providing `gatherSignals`. The command computes the Signal status snapshot from it; the CLI does not route signal computation through the dashboard app.
46
+ - **`execution_outcome` graph nodes** — the outcome-eval result, looked up by head sha from `.harness/graph`; commonly absent pre-merge (degrades to "not yet evaluated").
47
+ - **`required-review.yml` (dogfood)** — the `on_pr` delivery path: a `continue-on-error` step runs the brief after the existing `review-ci` run, reusing its artifact (spec Phase 4/D4). Adopter template graduation is a tracked follow-up (D5).
48
+
49
+ ## Gates
50
+
51
+ - **Never re-run the review.** Consume `review-ci --json`; do not invoke the review pipeline from this skill (D1).
52
+ - **Never block the merge.** The brief is advisory; the review gate's exit code is authoritative. No acknowledgment gate in v1 (D3).
53
+ - **Never crash `--comment`.** A `gh`/PR delivery failure prints the brief and warns, still exiting 0 (S1).
54
+ - **Thin wrapper only.** No brief composition, signal computation, or union logic in the skill — all of it lives in the command.
55
+
56
+ ## Success Criteria
57
+
58
+ Maps to spec `docs/changes/senior-accountability-surface/proposal.md`. This skill satisfies criterion #2 (the skill wrapping the command, `on_pr` + `manual`) and supports #1/#3/#4 by driving the command whose pure functions are unit-tested. Introduces no new `harness validate` findings.
59
+
60
+ ## Escalation
61
+
62
+ - **No PR for the current branch (`--comment`).** The command warns and prints the brief to stdout instead of posting, still exiting 0. Surface the warning; do not treat it as a failure.
63
+ - **No review artifact (`--from` missing/absent).** The review-verdict section degrades to "unavailable". If a verdict is wanted, run `harness review-ci --json <path>` first and pass it.
64
+ - **`gh` unauthenticated or API error while posting.** Delivery fails soft (brief printed, one-line stderr warning, exit 0). Fix `gh auth` and re-run; nothing is lost.
65
+ - **Signals or outcome-eval unavailable.** Each degrades independently to its "unavailable"/"not yet evaluated" line — expected pre-merge, not an error. Do not block the brief on them.
66
+ - **Someone asks to make the brief block merges.** That is the deferred acknowledgment gate (spec D3), a separate future spec. Keep the brief advisory; point them at the follow-up roadmap row.
67
+
68
+ ## Examples
69
+
70
+ ### Example: brief on a PR in CI (dogfood)
71
+
72
+ The `required-review.yml` workflow runs `review-ci --json /tmp/review.json`, then this skill's command:
73
+
74
+ ```bash
75
+ harness pre-merge-brief --from /tmp/review.json --diff "origin/main...HEAD" --comment
76
+ ```
77
+
78
+ The brief is composed and upserted as a sticky PR comment. The review found one blocking finding and two `alert` signals, so **👀 Worth your eyes** lists exactly those three; the outcome section shows "not yet evaluated" (no `execution_outcome` node pre-merge). The step is `continue-on-error`, so even if `gh` posting fails the review gate is unaffected.
79
+
80
+ ### Example: senior running it locally
81
+
82
+ ```bash
83
+ harness pre-merge-brief --comment
84
+ ```
85
+
86
+ No `--from`, so the review-verdict section renders "unavailable"; signals are gathered live and the diff summary uses the default `origin/<base>...HEAD` range. The senior sees the current signal status and diff before clicking merge.
@@ -0,0 +1,67 @@
1
+ name: harness-pre-merge-brief
2
+ version: "0.1.0"
3
+ description: >-
4
+ Thin-wrapper skill that runs the `harness pre-merge-brief` command to compose
5
+ and post the senior-facing pre-merge accountability brief — the diff summary,
6
+ the multi-persona review verdict (from review-ci --json), the curated Signal
7
+ status snapshot, the outcome-eval result, and a derived "Worth your eyes"
8
+ section — as a single sticky PR comment (upsert by marker). All composition and
9
+ degradation logic lives in the command; the skill orchestrates invocation,
10
+ communicates which sections degraded to "unavailable", and hands off. Runs on
11
+ on_pr and manual. The harness pointed at the human who clicks merge.
12
+ stability: draft
13
+ cognitive_mode: constructive-architect
14
+ triggers:
15
+ - on_pr
16
+ - manual
17
+ platforms:
18
+ - claude-code
19
+ - gemini-cli
20
+ - cursor
21
+ - codex
22
+ tools:
23
+ - Bash
24
+ - Read
25
+ - Glob
26
+ - Grep
27
+ - emit_interaction
28
+ cli:
29
+ command: harness pre-merge-brief
30
+ args:
31
+ - name: from
32
+ description: Path to the review-ci --json CiReviewResult artifact to reuse
33
+ required: false
34
+ - name: comment
35
+ description: Upsert the brief as a sticky PR comment via gh (by marker)
36
+ required: false
37
+ - name: diff
38
+ description: "git diff range for the diff summary (e.g. origin/main...HEAD)"
39
+ required: false
40
+ - name: head
41
+ description: "head commit sha for the outcome-eval lookup (default: git rev-parse HEAD)"
42
+ required: false
43
+ mcp:
44
+ tool: run_skill
45
+ input:
46
+ skill: harness-pre-merge-brief
47
+ path: string
48
+ type: rigid
49
+ tier: 2
50
+ phases:
51
+ - name: gather
52
+ description: Locate the review-ci --json artifact, resolve the diff range, confirm gh auth for --comment
53
+ required: true
54
+ - name: compose
55
+ description: Run `harness pre-merge-brief` with the resolved inputs; the command builds the brief and (with --comment) upserts the sticky PR comment
56
+ required: true
57
+ - name: report
58
+ description: Report which sections rendered and which degraded to "unavailable"; surface the "Worth your eyes" items
59
+ required: true
60
+ - name: handoff
61
+ description: Emit the transition; the brief is advisory (non-blocking) and never flips the review gate
62
+ required: true
63
+ state:
64
+ persistent: false
65
+ depends_on:
66
+ - harness-code-review
67
+ - outcome-eval
@@ -204,7 +204,7 @@ Persist findings to `{sessionDir}/phase-{N}-review.json`. No blocking → PHASE_
204
204
  ### DONE
205
205
 
206
206
  1. Present: total phases, tasks, retries, time, `finalReview.status` + findings count, any overridden findings.
207
- 2. Ask "Create a PR? (yes / no)."
207
+ 2. Ask "Create a PR? (yes / no)." When creating the PR, include a bare closing line `Closes #<N>` where `<N>` is the issue number from the roadmap row's `External-ID`. The keyword MUST sit IMMEDIATELY before the ref — no intervening words (`Closes #<N>`, never `Closes roadmap #<N>`), or GitHub will not link/close the issue and roadmap auto-done will skip the row.
208
208
  3. Write final handoff to `{sessionDir}/handoff.json`. Append learnings to `.harness/learnings.md`. Call `promoteSessionLearnings(projectPath, sessionSlug)`. If learnings count > 30, suggest `harness learnings prune`.
209
209
  4. If `docs/roadmap.md` exists: call `manage_roadmap update` to set feature done. Skip if not found.
210
210
  5. Write final `writeSessionSummary()`. Set `currentState: "DONE"` in autopilot-state.json.
@@ -254,13 +254,14 @@ Persist findings to `{sessionDir}/phase-{N}-review.json`. No blocking → PHASE_
254
254
 
255
255
  ## Rationalizations to Reject
256
256
 
257
- | Rationalization | Reality |
258
- | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
259
- | "Low complexity means I can skip APPROVE_PLAN" | Low complexity means auto-approval only when no signals fire. Signals override complexity. |
260
- | "I can inline planning logic instead of dispatching to harness-planner" | Iron Law. Autopilot delegates, never reimplements. No exceptions. |
261
- | "Retry budget exhausted but one more approach might work" | 3-attempt budget prevents compounding failure. Exceeding it without human input is unrecoverable. |
262
- | "Keeping research in conversation is faster than scratchpad" | Scratchpad gated by rigor level. At standard/thorough, >500 words must go to scratchpad. |
263
- | "Plan auto-approved, so I can skip recording the decision" | Every approval—auto or manual—is recorded in `decisions[]`. That array is the audit trail. |
257
+ | Rationalization | Reality |
258
+ | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
259
+ | "Low complexity means I can skip APPROVE_PLAN" | Low complexity means auto-approval only when no signals fire. Signals override complexity. |
260
+ | "I can inline planning logic instead of dispatching to harness-planner" | Iron Law. Autopilot delegates, never reimplements. No exceptions. |
261
+ | "Retry budget exhausted but one more approach might work" | 3-attempt budget prevents compounding failure. Exceeding it without human input is unrecoverable. |
262
+ | "Keeping research in conversation is faster than scratchpad" | Scratchpad gated by rigor level. At standard/thorough, >500 words must go to scratchpad. |
263
+ | "Plan auto-approved, so I can skip recording the decision" | Every approval—auto or manual—is recorded in `decisions[]`. That array is the audit trail. |
264
+ | "`Closes roadmap #123` reads fine, GitHub will figure out the issue" | An intervening word breaks GitHub's closing-keyword parser: `closingIssuesReferences` stays empty and auto-done leaves the row `planned`. Use a bare `Closes #123`. |
264
265
 
265
266
  ## Success Criteria
266
267
 
@@ -0,0 +1,86 @@
1
+ # Pre-Merge Brief
2
+
3
+ > The harness pointed at the human who clicks merge. A thin wrapper over `harness pre-merge-brief` that composes a senior-facing accountability brief — the diff summary, the multi-persona review verdict (from `review-ci --json`), the curated **Signal status** snapshot, the outcome-eval result, and a derived **"👀 Worth your eyes"** section — and posts it as a single sticky PR comment (upsert by marker). All composition and degradation logic lives in the command; this skill orchestrates invocation, reports which sections degraded, and hands off. Advisory and non-blocking: the brief never flips the review gate.
4
+
5
+ ## When to Use
6
+
7
+ - On every PR, so the senior engineer who merges sees "you are pushing this — here's what deserves your eyes" before they click merge.
8
+ - `on_pr` (dogfooded via the `required-review` workflow, reusing that run's `review-ci --json` artifact) and `manual` (a senior running it locally against the current branch's PR).
9
+ - NOT as a merge gate — the acknowledgment gate is deliberately deferred (spec D3). The brief is advisory; the review gate's exit code is what blocks.
10
+ - NOT a replacement for `review-ci` — this skill CONSUMES the review verdict, it does not re-run the review (spec D1).
11
+ - NOT for recomputing signals a different way — signals come from `@harness-engineering/signals` via the command (spec D2/D6).
12
+
13
+ ## Process
14
+
15
+ ### Phase 1: GATHER — Resolve inputs
16
+
17
+ 1. Locate the `review-ci --json` artifact for this run and record its path for `--from`. In CI it is the JSON the `required-review` workflow's `review-ci` step wrote (e.g. `/tmp/review.json`); locally, run `harness review-ci --json <path>` first if a verdict is wanted. Absent `--from` is tolerated — the review section degrades to "unavailable".
18
+ 2. Resolve the diff range for `--diff` (default `origin/<base>...HEAD` via the command's own resolver). Override only when the base is non-standard.
19
+ 3. Resolve the head sha for `--head` (default `git rev-parse HEAD`) — used for the `execution_outcome` graph lookup. Pre-merge the node is commonly absent, which is the documented degradation path, not an error.
20
+ 4. If posting (`--comment`), confirm `gh` is authenticated. Delivery failure never crashes the command (spec S1): it prints the brief and warns, still exiting 0.
21
+
22
+ ### Phase 2: COMPOSE — Run the command
23
+
24
+ Invoke `harness pre-merge-brief` with the resolved inputs:
25
+
26
+ ```bash
27
+ harness pre-merge-brief --from <review.json> --diff <range> --head <sha> [--comment]
28
+ ```
29
+
30
+ The command builds the six-section brief (marker + header → Diff summary → Review verdict → **Signal status** → Outcome evaluation → **👀 Worth your eyes**) and, with `--comment`, upserts the sticky PR comment by its marker (`<!-- harness:pre-merge-brief -->`) — patching the existing comment in place rather than posting a new one on each push. Without `--comment` it prints the brief to stdout. Each input degrades independently to an explicit "unavailable" line; the command exits 0 on a successful render regardless of which inputs were present.
31
+
32
+ ### Phase 3: REPORT — Surface what matters
33
+
34
+ 1. Report which sections rendered with real data and which degraded to "unavailable / not yet evaluated", so the senior knows the brief's coverage.
35
+ 2. Surface the **"👀 Worth your eyes"** items verbatim — the union of blocking review findings, signals in `warn`/`alert`, and unmet outcome criteria. This is the section the accountable human should read first.
36
+
37
+ ### Phase 4: HANDOFF — Advisory transition
38
+
39
+ Emit the transition via `emit_interaction`. The brief is advisory and non-blocking: it never flips the review gate's pass/fail status (spec D3, D4). In the dogfood workflow the brief step is `continue-on-error`, so a brief failure never fails the PR.
40
+
41
+ ## Harness Integration
42
+
43
+ - **`harness pre-merge-brief`** — the command this skill wraps. Flags: `--from <path>` (review-ci verdict JSON), `--comment` (sticky-upsert to the current branch's PR via `gh`), `--diff <range>`, `--head <sha>`. Pure render (`buildBriefBody`) + injected seams (`postBrief`, `RunGit`, graph store); no `process.exit` in the pure core.
44
+ - **`review-ci`** — upstream producer of the review verdict. This skill reuses its `--json` artifact via `--from`; it never re-runs the review (D1). `review-ci` remains the single source of review truth.
45
+ - **`@harness-engineering/signals`** — the shared leaf package (extracted in spec Phase 1/D6) providing `gatherSignals`. The command computes the Signal status snapshot from it; the CLI does not route signal computation through the dashboard app.
46
+ - **`execution_outcome` graph nodes** — the outcome-eval result, looked up by head sha from `.harness/graph`; commonly absent pre-merge (degrades to "not yet evaluated").
47
+ - **`required-review.yml` (dogfood)** — the `on_pr` delivery path: a `continue-on-error` step runs the brief after the existing `review-ci` run, reusing its artifact (spec Phase 4/D4). Adopter template graduation is a tracked follow-up (D5).
48
+
49
+ ## Gates
50
+
51
+ - **Never re-run the review.** Consume `review-ci --json`; do not invoke the review pipeline from this skill (D1).
52
+ - **Never block the merge.** The brief is advisory; the review gate's exit code is authoritative. No acknowledgment gate in v1 (D3).
53
+ - **Never crash `--comment`.** A `gh`/PR delivery failure prints the brief and warns, still exiting 0 (S1).
54
+ - **Thin wrapper only.** No brief composition, signal computation, or union logic in the skill — all of it lives in the command.
55
+
56
+ ## Success Criteria
57
+
58
+ Maps to spec `docs/changes/senior-accountability-surface/proposal.md`. This skill satisfies criterion #2 (the skill wrapping the command, `on_pr` + `manual`) and supports #1/#3/#4 by driving the command whose pure functions are unit-tested. Introduces no new `harness validate` findings.
59
+
60
+ ## Escalation
61
+
62
+ - **No PR for the current branch (`--comment`).** The command warns and prints the brief to stdout instead of posting, still exiting 0. Surface the warning; do not treat it as a failure.
63
+ - **No review artifact (`--from` missing/absent).** The review-verdict section degrades to "unavailable". If a verdict is wanted, run `harness review-ci --json <path>` first and pass it.
64
+ - **`gh` unauthenticated or API error while posting.** Delivery fails soft (brief printed, one-line stderr warning, exit 0). Fix `gh auth` and re-run; nothing is lost.
65
+ - **Signals or outcome-eval unavailable.** Each degrades independently to its "unavailable"/"not yet evaluated" line — expected pre-merge, not an error. Do not block the brief on them.
66
+ - **Someone asks to make the brief block merges.** That is the deferred acknowledgment gate (spec D3), a separate future spec. Keep the brief advisory; point them at the follow-up roadmap row.
67
+
68
+ ## Examples
69
+
70
+ ### Example: brief on a PR in CI (dogfood)
71
+
72
+ The `required-review.yml` workflow runs `review-ci --json /tmp/review.json`, then this skill's command:
73
+
74
+ ```bash
75
+ harness pre-merge-brief --from /tmp/review.json --diff "origin/main...HEAD" --comment
76
+ ```
77
+
78
+ The brief is composed and upserted as a sticky PR comment. The review found one blocking finding and two `alert` signals, so **👀 Worth your eyes** lists exactly those three; the outcome section shows "not yet evaluated" (no `execution_outcome` node pre-merge). The step is `continue-on-error`, so even if `gh` posting fails the review gate is unaffected.
79
+
80
+ ### Example: senior running it locally
81
+
82
+ ```bash
83
+ harness pre-merge-brief --comment
84
+ ```
85
+
86
+ No `--from`, so the review-verdict section renders "unavailable"; signals are gathered live and the diff summary uses the default `origin/<base>...HEAD` range. The senior sees the current signal status and diff before clicking merge.
@@ -0,0 +1,67 @@
1
+ name: harness-pre-merge-brief
2
+ version: "0.1.0"
3
+ description: >-
4
+ Thin-wrapper skill that runs the `harness pre-merge-brief` command to compose
5
+ and post the senior-facing pre-merge accountability brief — the diff summary,
6
+ the multi-persona review verdict (from review-ci --json), the curated Signal
7
+ status snapshot, the outcome-eval result, and a derived "Worth your eyes"
8
+ section — as a single sticky PR comment (upsert by marker). All composition and
9
+ degradation logic lives in the command; the skill orchestrates invocation,
10
+ communicates which sections degraded to "unavailable", and hands off. Runs on
11
+ on_pr and manual. The harness pointed at the human who clicks merge.
12
+ stability: draft
13
+ cognitive_mode: constructive-architect
14
+ triggers:
15
+ - on_pr
16
+ - manual
17
+ platforms:
18
+ - claude-code
19
+ - gemini-cli
20
+ - cursor
21
+ - codex
22
+ tools:
23
+ - Bash
24
+ - Read
25
+ - Glob
26
+ - Grep
27
+ - emit_interaction
28
+ cli:
29
+ command: harness pre-merge-brief
30
+ args:
31
+ - name: from
32
+ description: Path to the review-ci --json CiReviewResult artifact to reuse
33
+ required: false
34
+ - name: comment
35
+ description: Upsert the brief as a sticky PR comment via gh (by marker)
36
+ required: false
37
+ - name: diff
38
+ description: "git diff range for the diff summary (e.g. origin/main...HEAD)"
39
+ required: false
40
+ - name: head
41
+ description: "head commit sha for the outcome-eval lookup (default: git rev-parse HEAD)"
42
+ required: false
43
+ mcp:
44
+ tool: run_skill
45
+ input:
46
+ skill: harness-pre-merge-brief
47
+ path: string
48
+ type: rigid
49
+ tier: 2
50
+ phases:
51
+ - name: gather
52
+ description: Locate the review-ci --json artifact, resolve the diff range, confirm gh auth for --comment
53
+ required: true
54
+ - name: compose
55
+ description: Run `harness pre-merge-brief` with the resolved inputs; the command builds the brief and (with --comment) upserts the sticky PR comment
56
+ required: true
57
+ - name: report
58
+ description: Report which sections rendered and which degraded to "unavailable"; surface the "Worth your eyes" items
59
+ required: true
60
+ - name: handoff
61
+ description: Emit the transition; the brief is advisory (non-blocking) and never flips the review gate
62
+ required: true
63
+ state:
64
+ persistent: false
65
+ depends_on:
66
+ - harness-code-review
67
+ - outcome-eval
@@ -204,7 +204,7 @@ Persist findings to `{sessionDir}/phase-{N}-review.json`. No blocking → PHASE_
204
204
  ### DONE
205
205
 
206
206
  1. Present: total phases, tasks, retries, time, `finalReview.status` + findings count, any overridden findings.
207
- 2. Ask "Create a PR? (yes / no)."
207
+ 2. Ask "Create a PR? (yes / no)." When creating the PR, include a bare closing line `Closes #<N>` where `<N>` is the issue number from the roadmap row's `External-ID`. The keyword MUST sit IMMEDIATELY before the ref — no intervening words (`Closes #<N>`, never `Closes roadmap #<N>`), or GitHub will not link/close the issue and roadmap auto-done will skip the row.
208
208
  3. Write final handoff to `{sessionDir}/handoff.json`. Append learnings to `.harness/learnings.md`. Call `promoteSessionLearnings(projectPath, sessionSlug)`. If learnings count > 30, suggest `harness learnings prune`.
209
209
  4. If `docs/roadmap.md` exists: call `manage_roadmap update` to set feature done. Skip if not found.
210
210
  5. Write final `writeSessionSummary()`. Set `currentState: "DONE"` in autopilot-state.json.
@@ -254,13 +254,14 @@ Persist findings to `{sessionDir}/phase-{N}-review.json`. No blocking → PHASE_
254
254
 
255
255
  ## Rationalizations to Reject
256
256
 
257
- | Rationalization | Reality |
258
- | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
259
- | "Low complexity means I can skip APPROVE_PLAN" | Low complexity means auto-approval only when no signals fire. Signals override complexity. |
260
- | "I can inline planning logic instead of dispatching to harness-planner" | Iron Law. Autopilot delegates, never reimplements. No exceptions. |
261
- | "Retry budget exhausted but one more approach might work" | 3-attempt budget prevents compounding failure. Exceeding it without human input is unrecoverable. |
262
- | "Keeping research in conversation is faster than scratchpad" | Scratchpad gated by rigor level. At standard/thorough, >500 words must go to scratchpad. |
263
- | "Plan auto-approved, so I can skip recording the decision" | Every approval—auto or manual—is recorded in `decisions[]`. That array is the audit trail. |
257
+ | Rationalization | Reality |
258
+ | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
259
+ | "Low complexity means I can skip APPROVE_PLAN" | Low complexity means auto-approval only when no signals fire. Signals override complexity. |
260
+ | "I can inline planning logic instead of dispatching to harness-planner" | Iron Law. Autopilot delegates, never reimplements. No exceptions. |
261
+ | "Retry budget exhausted but one more approach might work" | 3-attempt budget prevents compounding failure. Exceeding it without human input is unrecoverable. |
262
+ | "Keeping research in conversation is faster than scratchpad" | Scratchpad gated by rigor level. At standard/thorough, >500 words must go to scratchpad. |
263
+ | "Plan auto-approved, so I can skip recording the decision" | Every approval—auto or manual—is recorded in `decisions[]`. That array is the audit trail. |
264
+ | "`Closes roadmap #123` reads fine, GitHub will figure out the issue" | An intervening word breaks GitHub's closing-keyword parser: `closingIssuesReferences` stays empty and auto-done leaves the row `planned`. Use a bare `Closes #123`. |
264
265
 
265
266
  ## Success Criteria
266
267
 
@@ -0,0 +1,86 @@
1
+ # Pre-Merge Brief
2
+
3
+ > The harness pointed at the human who clicks merge. A thin wrapper over `harness pre-merge-brief` that composes a senior-facing accountability brief — the diff summary, the multi-persona review verdict (from `review-ci --json`), the curated **Signal status** snapshot, the outcome-eval result, and a derived **"👀 Worth your eyes"** section — and posts it as a single sticky PR comment (upsert by marker). All composition and degradation logic lives in the command; this skill orchestrates invocation, reports which sections degraded, and hands off. Advisory and non-blocking: the brief never flips the review gate.
4
+
5
+ ## When to Use
6
+
7
+ - On every PR, so the senior engineer who merges sees "you are pushing this — here's what deserves your eyes" before they click merge.
8
+ - `on_pr` (dogfooded via the `required-review` workflow, reusing that run's `review-ci --json` artifact) and `manual` (a senior running it locally against the current branch's PR).
9
+ - NOT as a merge gate — the acknowledgment gate is deliberately deferred (spec D3). The brief is advisory; the review gate's exit code is what blocks.
10
+ - NOT a replacement for `review-ci` — this skill CONSUMES the review verdict, it does not re-run the review (spec D1).
11
+ - NOT for recomputing signals a different way — signals come from `@harness-engineering/signals` via the command (spec D2/D6).
12
+
13
+ ## Process
14
+
15
+ ### Phase 1: GATHER — Resolve inputs
16
+
17
+ 1. Locate the `review-ci --json` artifact for this run and record its path for `--from`. In CI it is the JSON the `required-review` workflow's `review-ci` step wrote (e.g. `/tmp/review.json`); locally, run `harness review-ci --json <path>` first if a verdict is wanted. Absent `--from` is tolerated — the review section degrades to "unavailable".
18
+ 2. Resolve the diff range for `--diff` (default `origin/<base>...HEAD` via the command's own resolver). Override only when the base is non-standard.
19
+ 3. Resolve the head sha for `--head` (default `git rev-parse HEAD`) — used for the `execution_outcome` graph lookup. Pre-merge the node is commonly absent, which is the documented degradation path, not an error.
20
+ 4. If posting (`--comment`), confirm `gh` is authenticated. Delivery failure never crashes the command (spec S1): it prints the brief and warns, still exiting 0.
21
+
22
+ ### Phase 2: COMPOSE — Run the command
23
+
24
+ Invoke `harness pre-merge-brief` with the resolved inputs:
25
+
26
+ ```bash
27
+ harness pre-merge-brief --from <review.json> --diff <range> --head <sha> [--comment]
28
+ ```
29
+
30
+ The command builds the six-section brief (marker + header → Diff summary → Review verdict → **Signal status** → Outcome evaluation → **👀 Worth your eyes**) and, with `--comment`, upserts the sticky PR comment by its marker (`<!-- harness:pre-merge-brief -->`) — patching the existing comment in place rather than posting a new one on each push. Without `--comment` it prints the brief to stdout. Each input degrades independently to an explicit "unavailable" line; the command exits 0 on a successful render regardless of which inputs were present.
31
+
32
+ ### Phase 3: REPORT — Surface what matters
33
+
34
+ 1. Report which sections rendered with real data and which degraded to "unavailable / not yet evaluated", so the senior knows the brief's coverage.
35
+ 2. Surface the **"👀 Worth your eyes"** items verbatim — the union of blocking review findings, signals in `warn`/`alert`, and unmet outcome criteria. This is the section the accountable human should read first.
36
+
37
+ ### Phase 4: HANDOFF — Advisory transition
38
+
39
+ Emit the transition via `emit_interaction`. The brief is advisory and non-blocking: it never flips the review gate's pass/fail status (spec D3, D4). In the dogfood workflow the brief step is `continue-on-error`, so a brief failure never fails the PR.
40
+
41
+ ## Harness Integration
42
+
43
+ - **`harness pre-merge-brief`** — the command this skill wraps. Flags: `--from <path>` (review-ci verdict JSON), `--comment` (sticky-upsert to the current branch's PR via `gh`), `--diff <range>`, `--head <sha>`. Pure render (`buildBriefBody`) + injected seams (`postBrief`, `RunGit`, graph store); no `process.exit` in the pure core.
44
+ - **`review-ci`** — upstream producer of the review verdict. This skill reuses its `--json` artifact via `--from`; it never re-runs the review (D1). `review-ci` remains the single source of review truth.
45
+ - **`@harness-engineering/signals`** — the shared leaf package (extracted in spec Phase 1/D6) providing `gatherSignals`. The command computes the Signal status snapshot from it; the CLI does not route signal computation through the dashboard app.
46
+ - **`execution_outcome` graph nodes** — the outcome-eval result, looked up by head sha from `.harness/graph`; commonly absent pre-merge (degrades to "not yet evaluated").
47
+ - **`required-review.yml` (dogfood)** — the `on_pr` delivery path: a `continue-on-error` step runs the brief after the existing `review-ci` run, reusing its artifact (spec Phase 4/D4). Adopter template graduation is a tracked follow-up (D5).
48
+
49
+ ## Gates
50
+
51
+ - **Never re-run the review.** Consume `review-ci --json`; do not invoke the review pipeline from this skill (D1).
52
+ - **Never block the merge.** The brief is advisory; the review gate's exit code is authoritative. No acknowledgment gate in v1 (D3).
53
+ - **Never crash `--comment`.** A `gh`/PR delivery failure prints the brief and warns, still exiting 0 (S1).
54
+ - **Thin wrapper only.** No brief composition, signal computation, or union logic in the skill — all of it lives in the command.
55
+
56
+ ## Success Criteria
57
+
58
+ Maps to spec `docs/changes/senior-accountability-surface/proposal.md`. This skill satisfies criterion #2 (the skill wrapping the command, `on_pr` + `manual`) and supports #1/#3/#4 by driving the command whose pure functions are unit-tested. Introduces no new `harness validate` findings.
59
+
60
+ ## Escalation
61
+
62
+ - **No PR for the current branch (`--comment`).** The command warns and prints the brief to stdout instead of posting, still exiting 0. Surface the warning; do not treat it as a failure.
63
+ - **No review artifact (`--from` missing/absent).** The review-verdict section degrades to "unavailable". If a verdict is wanted, run `harness review-ci --json <path>` first and pass it.
64
+ - **`gh` unauthenticated or API error while posting.** Delivery fails soft (brief printed, one-line stderr warning, exit 0). Fix `gh auth` and re-run; nothing is lost.
65
+ - **Signals or outcome-eval unavailable.** Each degrades independently to its "unavailable"/"not yet evaluated" line — expected pre-merge, not an error. Do not block the brief on them.
66
+ - **Someone asks to make the brief block merges.** That is the deferred acknowledgment gate (spec D3), a separate future spec. Keep the brief advisory; point them at the follow-up roadmap row.
67
+
68
+ ## Examples
69
+
70
+ ### Example: brief on a PR in CI (dogfood)
71
+
72
+ The `required-review.yml` workflow runs `review-ci --json /tmp/review.json`, then this skill's command:
73
+
74
+ ```bash
75
+ harness pre-merge-brief --from /tmp/review.json --diff "origin/main...HEAD" --comment
76
+ ```
77
+
78
+ The brief is composed and upserted as a sticky PR comment. The review found one blocking finding and two `alert` signals, so **👀 Worth your eyes** lists exactly those three; the outcome section shows "not yet evaluated" (no `execution_outcome` node pre-merge). The step is `continue-on-error`, so even if `gh` posting fails the review gate is unaffected.
79
+
80
+ ### Example: senior running it locally
81
+
82
+ ```bash
83
+ harness pre-merge-brief --comment
84
+ ```
85
+
86
+ No `--from`, so the review-verdict section renders "unavailable"; signals are gathered live and the diff summary uses the default `origin/<base>...HEAD` range. The senior sees the current signal status and diff before clicking merge.
@@ -0,0 +1,67 @@
1
+ name: harness-pre-merge-brief
2
+ version: "0.1.0"
3
+ description: >-
4
+ Thin-wrapper skill that runs the `harness pre-merge-brief` command to compose
5
+ and post the senior-facing pre-merge accountability brief — the diff summary,
6
+ the multi-persona review verdict (from review-ci --json), the curated Signal
7
+ status snapshot, the outcome-eval result, and a derived "Worth your eyes"
8
+ section — as a single sticky PR comment (upsert by marker). All composition and
9
+ degradation logic lives in the command; the skill orchestrates invocation,
10
+ communicates which sections degraded to "unavailable", and hands off. Runs on
11
+ on_pr and manual. The harness pointed at the human who clicks merge.
12
+ stability: draft
13
+ cognitive_mode: constructive-architect
14
+ triggers:
15
+ - on_pr
16
+ - manual
17
+ platforms:
18
+ - claude-code
19
+ - gemini-cli
20
+ - cursor
21
+ - codex
22
+ tools:
23
+ - Bash
24
+ - Read
25
+ - Glob
26
+ - Grep
27
+ - emit_interaction
28
+ cli:
29
+ command: harness pre-merge-brief
30
+ args:
31
+ - name: from
32
+ description: Path to the review-ci --json CiReviewResult artifact to reuse
33
+ required: false
34
+ - name: comment
35
+ description: Upsert the brief as a sticky PR comment via gh (by marker)
36
+ required: false
37
+ - name: diff
38
+ description: "git diff range for the diff summary (e.g. origin/main...HEAD)"
39
+ required: false
40
+ - name: head
41
+ description: "head commit sha for the outcome-eval lookup (default: git rev-parse HEAD)"
42
+ required: false
43
+ mcp:
44
+ tool: run_skill
45
+ input:
46
+ skill: harness-pre-merge-brief
47
+ path: string
48
+ type: rigid
49
+ tier: 2
50
+ phases:
51
+ - name: gather
52
+ description: Locate the review-ci --json artifact, resolve the diff range, confirm gh auth for --comment
53
+ required: true
54
+ - name: compose
55
+ description: Run `harness pre-merge-brief` with the resolved inputs; the command builds the brief and (with --comment) upserts the sticky PR comment
56
+ required: true
57
+ - name: report
58
+ description: Report which sections rendered and which degraded to "unavailable"; surface the "Worth your eyes" items
59
+ required: true
60
+ - name: handoff
61
+ description: Emit the transition; the brief is advisory (non-blocking) and never flips the review gate
62
+ required: true
63
+ state:
64
+ persistent: false
65
+ depends_on:
66
+ - harness-code-review
67
+ - outcome-eval
@@ -204,7 +204,7 @@ Persist findings to `{sessionDir}/phase-{N}-review.json`. No blocking → PHASE_
204
204
  ### DONE
205
205
 
206
206
  1. Present: total phases, tasks, retries, time, `finalReview.status` + findings count, any overridden findings.
207
- 2. Ask "Create a PR? (yes / no)."
207
+ 2. Ask "Create a PR? (yes / no)." When creating the PR, include a bare closing line `Closes #<N>` where `<N>` is the issue number from the roadmap row's `External-ID`. The keyword MUST sit IMMEDIATELY before the ref — no intervening words (`Closes #<N>`, never `Closes roadmap #<N>`), or GitHub will not link/close the issue and roadmap auto-done will skip the row.
208
208
  3. Write final handoff to `{sessionDir}/handoff.json`. Append learnings to `.harness/learnings.md`. Call `promoteSessionLearnings(projectPath, sessionSlug)`. If learnings count > 30, suggest `harness learnings prune`.
209
209
  4. If `docs/roadmap.md` exists: call `manage_roadmap update` to set feature done. Skip if not found.
210
210
  5. Write final `writeSessionSummary()`. Set `currentState: "DONE"` in autopilot-state.json.
@@ -254,13 +254,14 @@ Persist findings to `{sessionDir}/phase-{N}-review.json`. No blocking → PHASE_
254
254
 
255
255
  ## Rationalizations to Reject
256
256
 
257
- | Rationalization | Reality |
258
- | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
259
- | "Low complexity means I can skip APPROVE_PLAN" | Low complexity means auto-approval only when no signals fire. Signals override complexity. |
260
- | "I can inline planning logic instead of dispatching to harness-planner" | Iron Law. Autopilot delegates, never reimplements. No exceptions. |
261
- | "Retry budget exhausted but one more approach might work" | 3-attempt budget prevents compounding failure. Exceeding it without human input is unrecoverable. |
262
- | "Keeping research in conversation is faster than scratchpad" | Scratchpad gated by rigor level. At standard/thorough, >500 words must go to scratchpad. |
263
- | "Plan auto-approved, so I can skip recording the decision" | Every approval—auto or manual—is recorded in `decisions[]`. That array is the audit trail. |
257
+ | Rationalization | Reality |
258
+ | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
259
+ | "Low complexity means I can skip APPROVE_PLAN" | Low complexity means auto-approval only when no signals fire. Signals override complexity. |
260
+ | "I can inline planning logic instead of dispatching to harness-planner" | Iron Law. Autopilot delegates, never reimplements. No exceptions. |
261
+ | "Retry budget exhausted but one more approach might work" | 3-attempt budget prevents compounding failure. Exceeding it without human input is unrecoverable. |
262
+ | "Keeping research in conversation is faster than scratchpad" | Scratchpad gated by rigor level. At standard/thorough, >500 words must go to scratchpad. |
263
+ | "Plan auto-approved, so I can skip recording the decision" | Every approval—auto or manual—is recorded in `decisions[]`. That array is the audit trail. |
264
+ | "`Closes roadmap #123` reads fine, GitHub will figure out the issue" | An intervening word breaks GitHub's closing-keyword parser: `closingIssuesReferences` stays empty and auto-done leaves the row `planned`. Use a bare `Closes #123`. |
264
265
 
265
266
  ## Success Criteria
266
267