@vegastack/skills 0.9.1 → 0.11.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 (85) hide show
  1. package/README.md +8 -3
  2. package/dist/index.js +5 -5
  3. package/package.json +1 -1
  4. package/skill/dev-architect/SKILL.md +96 -0
  5. package/skill/dev-architect/agents/openai.yaml +4 -0
  6. package/skill/dev-architect/references/ai-agents.md +89 -0
  7. package/skill/dev-architect/references/conventions.md +93 -0
  8. package/skill/{architect → dev-architect}/references/data.md +43 -44
  9. package/skill/dev-architect/references/infra.md +98 -0
  10. package/skill/dev-architect/references/mobile.md +75 -0
  11. package/skill/{architect → dev-architect}/references/pinned-facts.md +17 -16
  12. package/skill/dev-architect/references/principles.md +117 -0
  13. package/skill/{architect → dev-architect}/references/security.md +37 -44
  14. package/skill/dev-architect/references/stack.md +38 -0
  15. package/skill/dev-architect/references/web.md +102 -0
  16. package/skill/{architect → dev-architect}/refresh/REFRESH.md +8 -6
  17. package/skill/{architect → dev-architect}/refresh/sources.json +5 -10
  18. package/skill/dev-chronicle/SKILL.md +45 -0
  19. package/skill/dev-chronicle/agents/openai.yaml +4 -0
  20. package/skill/dev-chronicle/references/conventions.md +93 -0
  21. package/skill/dev-chronicle/refresh/REFRESH.md +3 -0
  22. package/skill/dev-chronicle/refresh/sources.json +6 -0
  23. package/skill/dev-debug/SKILL.md +43 -0
  24. package/skill/dev-debug/agents/openai.yaml +4 -0
  25. package/skill/dev-debug/references/conventions.md +93 -0
  26. package/skill/dev-debug/references/loop-ladder.md +20 -0
  27. package/skill/dev-debug/refresh/REFRESH.md +3 -0
  28. package/skill/dev-debug/refresh/sources.json +6 -0
  29. package/skill/dev-implement/SKILL.md +41 -36
  30. package/skill/dev-implement/references/conventions.md +93 -0
  31. package/skill/dev-implement/references/ledger-and-resume.md +27 -0
  32. package/skill/dev-implement/scripts/evidence-check.mjs +57 -0
  33. package/skill/dev-implement/scripts/lib/gh.mjs +93 -0
  34. package/skill/dev-implement/scripts/preflight.mjs +101 -0
  35. package/skill/dev-intake/SKILL.md +39 -33
  36. package/skill/dev-intake/references/brief-template.md +27 -12
  37. package/skill/dev-intake/references/conventions.md +93 -0
  38. package/skill/dev-intake/scripts/brief-lint.mjs +87 -0
  39. package/skill/dev-plan/SKILL.md +53 -0
  40. package/skill/dev-plan/agents/openai.yaml +4 -0
  41. package/skill/dev-plan/references/conventions.md +93 -0
  42. package/skill/dev-plan/references/plan-format.md +54 -0
  43. package/skill/dev-plan/refresh/REFRESH.md +3 -0
  44. package/skill/dev-plan/refresh/sources.json +6 -0
  45. package/skill/dev-plan/scripts/plan-lint.mjs +86 -0
  46. package/skill/dev-review/SKILL.md +69 -0
  47. package/skill/dev-review/agents/openai.yaml +4 -0
  48. package/skill/dev-review/assets/review-known-patterns.md.template +30 -0
  49. package/skill/dev-review/references/conventions.md +93 -0
  50. package/skill/dev-review/references/cross-agent.md +39 -0
  51. package/skill/dev-review/references/dispatch-prompts.md +104 -0
  52. package/skill/dev-review/references/security-axis.md +33 -0
  53. package/skill/dev-review/refresh/REFRESH.md +3 -0
  54. package/skill/dev-review/refresh/sources.json +6 -0
  55. package/skill/dev-setup/SKILL.md +14 -9
  56. package/skill/dev-setup/assets/agents-section.md.template +2 -2
  57. package/skill/dev-setup/assets/dev-profile.md.template +23 -5
  58. package/skill/dev-setup/references/conventions.md +93 -0
  59. package/skill/dev-setup/references/stack-playbooks.md +1 -1
  60. package/skill/dev-ship/SKILL.md +14 -7
  61. package/skill/dev-ship/references/conventions.md +93 -0
  62. package/skill/dev-ship/references/runbook.md +1 -1
  63. package/skill/dev-ship/scripts/ship-gate.mjs +213 -0
  64. package/skill/dev-status/SKILL.md +45 -0
  65. package/skill/dev-status/agents/openai.yaml +4 -0
  66. package/skill/dev-status/references/conventions.md +93 -0
  67. package/skill/dev-status/refresh/REFRESH.md +3 -0
  68. package/skill/dev-status/refresh/sources.json +6 -0
  69. package/skill/dev-status/scripts/status.mjs +152 -0
  70. package/skill/skill-maintainer/references/release-ops.md +3 -3
  71. package/skill/skillify/SKILL.md +1 -1
  72. package/skill/skillify/references/eval-playbook.md +6 -0
  73. package/skill-integrity.json +93 -33
  74. package/skill/architect/SKILL.md +0 -68
  75. package/skill/architect/agents/openai.yaml +0 -4
  76. package/skill/architect/assets/adr-template.md +0 -21
  77. package/skill/architect/assets/arch-template.md +0 -20
  78. package/skill/architect/references/advisory.md +0 -102
  79. package/skill/architect/references/ai-agents.md +0 -95
  80. package/skill/architect/references/infra.md +0 -128
  81. package/skill/architect/references/mobile.md +0 -78
  82. package/skill/architect/references/principles.md +0 -91
  83. package/skill/architect/references/project-profile.md +0 -37
  84. package/skill/architect/references/stack.md +0 -38
  85. package/skill/architect/references/web.md +0 -152
@@ -0,0 +1,39 @@
1
+ # Cross-agent review
2
+
3
+ The independence upgrade: the review runs on the *other* agent — Codex when Claude built the code, Claude when Codex did — so the reviewer shares no model, no session, and no authorship with the implementer. Used on `risky` issues by default and whenever dev.md's `review:` knob says `cross-agent`.
4
+
5
+ ## Announce, invoke, summarize — the operator is never blind
6
+
7
+ 1. **At trigger time**, tell the operator in plain language: "invoking Codex for the cross-agent review of issue #N" — before the call, not after.
8
+ 2. **Invoke** non-interactively with the handoff below passed as ONE argument through an exec arg array — `execFile('codex', ['exec', handoff])` from Claude, `execFile('claude', ['-p', handoff])` from Codex — never interpolated into a shell string (the exact pattern this skill's own known-patterns template says to still-flag).
9
+ 3. **At the end**, summarize: which agent reviewed, the verdict, where its comment is, and what's worth the operator double-checking.
10
+
11
+ ## The handoff — exact format
12
+
13
+ ```
14
+ REVIEW REQUEST (vsk cross-agent v1)
15
+ repo: <absolute path> · issue: <url> · branch: <name> · range: <base7>..<head7>
16
+ brief: the issue description (marker type=brief) · plan: the issue comment
17
+ marked type=plan · package: <path to the review package file> · known-patterns:
18
+ .vegastack/review-known-patterns.md · conventions: references/conventions.md inside ANY installed dev-family skill
19
+ (e.g. .claude/skills/dev-review/references/conventions.md — every dev skill ships a copy)
20
+ axes: spec, standards[, security]
21
+ output contract: post exactly ONE issue comment in the review-comment format
22
+ (marker: <!-- vsk:v1 type=review round=<n> sha=<head7> agent=codex verdict=... -->;
23
+ the reverse direction writes agent=claude);
24
+ on a re-review round, EDIT that same comment — update its single top marker to the
25
+ new round/sha/verdict and append the round section below (never a second marker,
26
+ never a second comment),
27
+ findings as Finding [N] with severities [CRITICAL|MUST-FIX|SHOULD-FIX|NIT] and
28
+ path:line evidence; nitpicks and low-confidence collapsed in <details>.
29
+ constraints: READ-ONLY — never commit, push, edit files, or change labels; your
30
+ only write is the review comment, via gh.
31
+ ```
32
+
33
+ The reviewing agent posts its own comment with its own `agent=` key — independence stays verifiable in the record, never paraphrased by the author.
34
+
35
+ ## Fallbacks and failure honesty
36
+
37
+ - The other agent's CLI is not installed → fall back to the manual relay (tell the operator which agent to point at the issue), and note that `dev-setup` records the gap and recommends installing it.
38
+ - The invocation fails or times out → say so plainly, fall back to a fresh-subagent review, and label the evidence comment's Review line accordingly — never silently substitute and call it cross-agent.
39
+ - The other agent's review misses the output contract (no marker, no severities) → treat its content as raw findings: post them yourself in the correct format with `agent=` credited, and note the reformatting.
@@ -0,0 +1,104 @@
1
+ # Reviewer dispatch prompts
2
+
3
+ The verbatim briefs each axis subagent receives. Compose with paths and constraints — never pasted history. Every dispatch carries the shared preamble, then its axis brief.
4
+
5
+ ## Shared preamble (every axis)
6
+
7
+ ```
8
+ You are a fresh-context reviewer with no memory of writing this change and no
9
+ stake in it passing. Inputs (read them all): the brief at <issue url or path>,
10
+ the plan comment (marker type=plan), the review package at <package path>, and
11
+ the constraints below, copied verbatim from the brief/plan:
12
+
13
+ <constraints block>
14
+
15
+ Write your FULL report to <report path> — complete findings there, each as:
16
+ Finding [N]: <title> — [SEVERITY] (confidence: high|medium|low) path:line,
17
+ issue, why it matters, fix (fenced snippet when code).
18
+ Return only short status: verdict, per-severity counts, and one line per
19
+ finding (title + severity + path:line) — the detail lives in the report file.
20
+
21
+ You do not dispatch subagents. Do all reading and judging yourself — a reviewer
22
+ you spawn duplicates this review at full cost and its opinion counts for
23
+ nothing in the process. Read full files where the diff needs context (30+
24
+ lines around a hunk) — diff-only review misses invariants.
25
+
26
+ Report findings or verified absence of findings, never praise. Do not soften a
27
+ finding because the change is large, late, or almost done.
28
+ ```
29
+
30
+ ## Spec axis brief
31
+
32
+ ```
33
+ Judge the diff against the CURRENT brief and plan only:
34
+ (a) MISSING — requirements asked for that are absent or partial;
35
+ (b) SCOPE CREEP — behavior in the diff nobody asked for;
36
+ (c) WRONG — requirements that look implemented but don't do what the brief
37
+ says.
38
+ Quote the exact brief/plan line for every finding. If code and brief diverge
39
+ because the operator changed direction, that is still a finding — the brief
40
+ must be revision-updated before review can pass; say so.
41
+
42
+ Tests-are-real rubric — flag as [MUST-FIX] any acceptance-relevant test that is:
43
+ - implementation-coupled: mocks internal collaborators, asserts call
44
+ counts/order, or breaks on refactor without behavior change;
45
+ - tautological: the assertion recomputes the expected value the way the code
46
+ does, so it can never disagree;
47
+ - horizontal-sliced: bulk tests asserting imagined shapes rather than the
48
+ behavior the brief names.
49
+ A changed behavior with no covering test at the brief's named seams is MISSING.
50
+ ```
51
+
52
+ ## Standards axis brief
53
+
54
+ ```
55
+ Judge the diff against, in priority order:
56
+ 1. .vegastack/review-known-patterns.md — its never-flag entries suppress
57
+ findings UNLESS their "Still flag if:" clause applies;
58
+ 2. the project's documented standards (dev.md Project rules, CONTRIBUTING);
59
+ a documented repo standard always overrides the baseline below;
60
+ 3. the smell baseline — each a labeled judgment call ("possible feature
61
+ envy"), never a hard violation; skip anything tooling already enforces:
62
+
63
+ - Mysterious name: a name that doesn't reveal what it does or holds → rename.
64
+ - Duplicated code: the same logic shape in more than one hunk/file → extract.
65
+ - Feature envy: a method reaching into another object's data more than its
66
+ own → move it to the data it envies.
67
+ - Data clumps: the same fields/params traveling together → bundle into a type.
68
+ - Primitive obsession: a primitive standing in for a domain concept → type it.
69
+ - Repeated switches: the same case-cascade on the same type recurring → one
70
+ shared map or polymorphism.
71
+ - Shotgun surgery: one logical change forcing scattered edits everywhere →
72
+ gather it into one module.
73
+ - Divergent change: one module edited for several unrelated reasons → split.
74
+ - Speculative generality: abstraction or hooks for needs the brief doesn't
75
+ have → delete, inline until a real need shows.
76
+ - Message chains: long a.b().c().d() walks the caller depends on → hide the
77
+ walk behind one method.
78
+ - Middle man: a unit that mostly delegates onward → cut it, call direct.
79
+ - Refused bequest: an implementer ignoring most of what it inherits → compose
80
+ instead.
81
+
82
+ Quiet profile: report style only where a documented rule exists. Hard
83
+ violations of documented standards may be [MUST-FIX]; baseline smells are
84
+ [SHOULD-FIX] or [NIT].
85
+ ```
86
+
87
+ ## Security axis brief
88
+
89
+ Compose the security dispatch from [security-axis](security-axis.md): the shared preamble above, then that file's Method steps, finding format (the three extra lines), severity definitions, and standing red lines, quoted into the prompt — the reviewer must receive them in full, not a pointer it cannot follow.
90
+
91
+ ## Re-review brief (scoped, every fix round)
92
+
93
+ ```
94
+ Findings under verification: <the open findings, verbatim>.
95
+ Inputs: the same brief and plan, the implementer's report file (its fix
96
+ reports are the test evidence — do not re-run suites), and the SCOPED package
97
+ at <fix package path> covering only <FIX_BASE>..<HEAD>.
98
+
99
+ For each finding, in order: ADDRESSED or NOT ADDRESSED, with path:line
100
+ evidence. "Attempted" is not addressed — the specific defect must no longer
101
+ exist. Then: new breakage the fix diff itself introduced (severity + line),
102
+ and out-of-scope observations (non-blocking, one line each). Final line:
103
+ "Fix round: all addressed | findings remain open".
104
+ ```
@@ -0,0 +1,33 @@
1
+ # The security axis
2
+
3
+ Runs on `risky` issues, and whenever the diff's touch points hit an auth surface, money, user data, or externally-controlled input — the trigger is the surface, not the label alone.
4
+
5
+ ## Method — evidence before severity
6
+
7
+ 1. **Trace the data flow** for every candidate finding: origin → transformations → sink. Is the value attacker-controlled at the point of use? A finding without a traced flow is a hunch, not a finding.
8
+ 2. **Check defense in depth before flagging a gap.** A missing check at one layer is not a vulnerability if another layer enforces it on every path — name the enforcing layer instead. Flag it only when no layer holds, or the only holding layer is UX (client-side, middleware-as-convenience).
9
+ 3. **Verify library defaults** before "missing configuration" findings — frameworks ship safe defaults more often than training-data memory suggests; check the current docs per `dev-architect`'s verify protocol.
10
+ 4. **Assess exploitability**: what does the attacker need (auth level, network position, timing, knowledge)? What mitigating controls exist? Severity follows exploitability, never vibes.
11
+
12
+ ## Finding format — three extra lines
13
+
14
+ On top of the standard finding shape, every security finding carries:
15
+
16
+ ```
17
+ Data flow: <origin> → <transformations> → <sink>
18
+ Attack prerequisites: <what the attacker needs>
19
+ Mitigating controls: <existing defenses that reduce but don't eliminate>
20
+ ```
21
+
22
+ A finding that can't fill the Data flow line goes to the collapsed low-confidence block, not the main list.
23
+
24
+ ## Severity
25
+
26
+ - **[CRITICAL]** — exploitable now: auth bypass at the enforcement layer, injection with a traced user-input path, secret/credential exposure, unprotected sensitive mutation. Blocks, above MUST-FIX.
27
+ - **[MUST-FIX]** — a real weakness needing prerequisites an attacker can plausibly meet.
28
+ - **[SHOULD-FIX]** — hardening: rate limits, PII in logs, missing timeouts, defense-in-depth gaps with a holding layer.
29
+ - Never round up to look thorough; judge against the project's Architecture facts — platform-scale concerns are not defects on a small internal tool.
30
+
31
+ ## Standing red lines (summary — `dev-architect` remains their home)
32
+
33
+ Middleware/proxy is never the authorization boundary; authorization lives server-side per resource. No secret in plaintext anywhere — code, config, logs, events, agent state. Permission checks fail closed, and the deny is still audited.
@@ -0,0 +1,3 @@
1
+ # Refresh contract — dev-review
2
+
3
+ Evergreen: this skill asserts no version pins, numeric vendor limits, or dated claims — its content is review discipline (axes, severities, the bounded loop, dispatch briefs, the smell baseline, cross-agent handoff shape), all versionless. The `codex exec` / `claude -p` invocation forms are deliberately treated as durable CLI surfaces; dev-setup's detection covers their presence per machine. Revisit if a future edit introduces a volatile fact.
@@ -0,0 +1,6 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "retrievalBaseline": "2026-08-28",
4
+ "note": "Evergreen waiver recorded in REFRESH.md; sources deliberately empty.",
5
+ "sources": []
6
+ }
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  name: dev-setup
3
- description: Bootstrap a project for issue-driven agent development — existing repo or brand-new empty directory. Use when asked to "set up the dev workflow", "bootstrap this project for agents", "install the dev workflow here", "set up this new project", or invoked as dev-setup; also run automatically when dev-intake, dev-implement, or dev-ship find no .vegastack/dev.md in the project. Detects the stack and drafts its native release, changelog, and guard conventions; creates the project profile, the AGENTS.md dev section plus CLAUDE.md import, the workflow labels, and the decision register; offers release-guard workflows and the decision-capture hook on the user's yes. Not for architecture profiles or advice (that is architect and .vegastack/arch.md), not for authoring skills, not for general CI or app scaffolding.
3
+ description: Bootstrap a project for issue-driven agent development — existing repo or brand-new empty directory. Use when asked to "set up the dev workflow", "bootstrap this project for agents", "install the dev workflow here", "set up this new project", "wire the release guards", "create the workflow labels", "set up the changelog convention", "fill the architecture profile section", to re-run setup after machinery appeared or knobs changed, or invoked as dev-setup; also run automatically when any dev-family skill finds no .vegastack/dev.md in the project. Not for architecture advice (dev-architect reads the section this skill writes), authoring skills (skillify), or general CI and app scaffolding.
4
4
  ---
5
5
 
6
6
  # dev-setup
7
7
 
8
- Re-runnable bootstrap that gives a project everything the dev workflow needs: a profile file holding the knobs and runbooks, a thin AGENTS.md section that both Claude Code and Codex read, the GitHub labels, and the decision register. The other dev skills call this automatically when `.vegastack/dev.md` is missing, then continue with their original request.
8
+ Re-runnable bootstrap that gives a project everything the dev workflow needs: a profile file holding the knobs and runbooks, a thin AGENTS.md section that both Claude Code and Codex read, the GitHub labels, and the decision register. The other dev skills call this automatically when `.vegastack/dev.md` is missing, then continue with their original request. The workflow-wide artifact spec — comment markers, operator identity, revision markers, scope classes, ledger format, `.vegastack/.tmp/` workspace — lives in [conventions](references/conventions.md); dev skills cite it rather than restating it (the v3 rewrites adopt it skill by skill).
9
9
 
10
- Nearest neighbor: `architect` owns `.vegastack/arch.md` (architecture facts and advice); dev-setup owns `.vegastack/dev.md` (workflow facts and knobs). When arch.md exists, point dev.md at it for stack facts instead of duplicating them.
10
+ Nearest neighbor: `dev-architect` consumes dev.md's `## Architecture` section and gives architecture advice; dev-setup detects the facts and writes the section. There is no separate architecture profile dev.md is the one file.
11
11
 
12
12
  ## Step 1 — Detect before asking
13
13
 
@@ -21,8 +21,11 @@ Facts are your job; decisions are the user's. Gather these silently and present
21
21
  | web app (UI evidence relevant) | framework dependencies (next, react, vue, …) |
22
22
  | release/changelog machinery | match signals against [stack-playbooks](references/stack-playbooks.md) — the matched playbook drafts the `## Ship` runbook, the `changelog:` knob, and the guards to offer |
23
23
  | environments and run commands | CI/deploy configs, env examples (names only), dev/start scripts — these draft `## Environments` and `## Verify` |
24
- | existing files | AGENTS.md, CLAUDE.md, `.vegastack/dev.md`, `.vegastack/arch.md`, the decision register |
24
+ | architecture (app repos) | wrangler files (a `d1_databases` binding with no Postgres driver = the D1-only class), drizzle config, better-auth usage, `@aws-sdk/client-s3`/R2 bindings, pg-boss dependency, `eve`/`ai` packages, Dockerfiles/compose, pubspec.yaml these draft `## Architecture` |
25
+ | existing files | AGENTS.md, CLAUDE.md, `.vegastack/dev.md`, a legacy `.vegastack/arch.md`, the decision register |
25
26
  | existing labels | `gh label list` |
27
+ | native issue types | `gh api orgs/<org>/issue-types` — an `Epic` type routes parents to it; absent endpoint or type → the `epic` label fallback ([conventions](references/conventions.md)) |
28
+ | Codex CLI (cross-agent review) | `command -v codex` — absent → record the gap in dev.md `## Environments` and recommend installing it |
26
29
 
27
30
  Not a git repo, or no origin remote → this is a **greenfield run, not an error**: follow the greenfield playbook in [stack-playbooks](references/stack-playbooks.md) — interview for the intended stack, offer `git init` and `gh repo create` each on its own yes, and render dev.md from the chosen playbook's conventions with TODO lines where machinery doesn't exist yet. A declined remote skips labels and records the TODO plainly.
28
31
 
@@ -30,11 +33,11 @@ Not a git repo, or no origin remote → this is a **greenfield run, not an error
30
33
 
31
34
  Ask with your harness's question tool — AskUserQuestion in Claude Code, `request_user_input` in Codex where the mode allows it (availability details: [harness-facts](references/harness-facts.md)). When no question tool is available (headless run, gated mode), write the defaults, mark every unconfirmed knob `# TODO confirm`, and say so in your reply — a wrong invented preference costs more than a TODO.
32
35
 
33
- **Round A — confirm the detected facts** in one compact summary (repo, stack, commands, web app or not, matched playbook). Ask only about what detection could not fill.
36
+ **Round A — confirm the detected facts** in one compact summary (repo, stack, commands, web app or not, matched playbook, detected architecture facts). Ask only about what detection could not fill.
34
37
 
35
38
  **Round B — the workflow knobs**, recommended default first:
36
39
 
37
- 1. Review of finished work: **subagent** · cross-agent (Codex↔Claude) · cross-agent only on `risky` issues
40
+ 1. Review of finished work (`review:` knob, mapped by dev-review): **cross-agent-risky** (subagent axes, the other agent on `risky` — recommended where the Codex CLI was detected; otherwise recommend `subagent`) · `subagent` (never cross-agent) · `cross-agent` (always)
38
41
  2. Proof for UI work: **playwright screenshots** · none
39
42
  3. Gates: **3** (approve → PR → merge as separate user words) · 2 (approve → one "ship it" covers PR and merge) · 1 (direct-to-main for single-operator projects: the ship word merges locally and pushes, no PR — everything else unchanged)
40
43
  4. Tests: **required for every change** · required for logic changes only
@@ -45,6 +48,8 @@ Ask with your harness's question tool — AskUserQuestion in Claude Code, `reque
45
48
  - Guards drafted → offer to write their CI backstop steps into the project's workflow files (the local `guard:` lines run without CI); each file on the user's yes — release guards only, never general CI
46
49
  - Environments or run commands detected → confirm the drafted `## Environments` and `## Verify` bullets
47
50
  - Evidence repo (`ui-evidence: playwright`) → default is the owner's **shared** `<owner>/dev-review-evidence`; if it doesn't exist, offer `gh repo create <owner>/dev-review-evidence --private --add-readme` + the layout/retention README — created once, every project points at it. An org naming policy that rejects the name → pick the closest compliant name with the user and record it in the knob (the name is a knob value, not a contract)
51
+ - App architecture detected → confirm the drafted `## Architecture` (hosting, stage, and kind are what detection usually can't fill — ask those); nothing detected → delete the section, the `stack:` line is enough
52
+ - A legacy `.vegastack/arch.md` exists → fold its knob lines into `## Architecture`, offer each dated `notes:` line to the decision register on the user's yes, then offer to delete arch.md
48
53
  - Decision-capture hook → offer the Stop-hook from [harness-facts](references/harness-facts.md) for the harnesses in use; hook files and settings wiring are written only on the user's explicit yes, merging into existing hook config, never overwriting
49
54
  - AGENTS.md already has content → append the marked section (default) or show a merge proposal first
50
55
  - CLAUDE.md already has content → add the `@AGENTS.md` import as its first line (default) or move its content into AGENTS.md and leave only the import
@@ -56,11 +61,11 @@ Everything else — merge style, branch naming, the stop-and-ask list — takes
56
61
 
57
62
  | Target | Action |
58
63
  |---|---|
59
- | `.vegastack/dev.md` | render [dev-profile template](assets/dev-profile.md.template) with the answers — the project's single canonical process doc (short directional bullets; Ship/Verify/Environments/Design drafted from the playbook, Decisions test included, placeholders deleted, TODO lines where machinery is absent) |
64
+ | `.vegastack/dev.md` | render [dev-profile template](assets/dev-profile.md.template) with the answers — the project's single canonical process doc (short directional bullets; Ship/Verify/Environments/Design drafted from the playbook, Architecture drafted from detection, Decisions test included, placeholders deleted, TODO lines where machinery is absent) |
60
65
  | `AGENTS.md` | create it, or insert/replace only the block between `<!-- vsk-dev:start -->` and `<!-- vsk-dev:end -->` using the [agents-section template](assets/agents-section.md.template); content outside the markers is the user's and stays untouched |
61
66
  | `CLAUDE.md` | ensure its first line is `@AGENTS.md` — Claude Code does not read AGENTS.md natively and needs this import ([harness-facts](references/harness-facts.md)); create the file when absent |
62
- | labels | `gh label create <name> --color <hex> --description "<text>"` for the names the `labels:` knob records, skipping ones that exist; default names and creation colors: `needs-operator` FBCA04 (waiting on the user) · `ready` 0E8A16 (approved, agent may start) · `working` 1D76DB (claimed by an agent) · `for-operator` 5319E7 (result awaiting user review) · `risky` B60205 (security, money, data, or production) |
63
- | decision register | create the file the `decisions:` knob names (default `.vegastack/decisions.md`) when missing, with a two-line header stating the format: `- DD-MM-YYYY (github-username) — the decision` (username via `gh api user -q .login`, fallback `git config user.name`); a project with an existing register keeps it and the knob points there |
67
+ | labels | `gh label create <name> --color <hex> --description "<text>"` for the names the `labels:` knob records, skipping ones that exist; default names and creation colors ([conventions](references/conventions.md) holds meanings): state `needs-operator` FBCA04 · `needs-plan` E36209 · `ready` 0E8A16 · `working` 1D76DB · `for-operator` 5319E7; modifiers `risky` B60205 · scope `research` C5DEF5 · `quick-build` 76C7C0 · `full-plan` 2A9D8F · `epic` 24292E (only when the org has no native Epic issue type) |
68
+ | decision register | create the file the `decisions:` knob names (default `.vegastack/decisions.md`) when missing, with a two-line header stating the format: `- DD-MM-YYYY operator (github-username) — the decision` (username via `gh api user -q .login`, fallback `git config user.name`); a project with an existing register keeps it and the knob points there |
64
69
  | guard workflows / hook files | only the ones the user said yes to in Round C |
65
70
 
66
71
  ## Step 4 — Report
@@ -1,9 +1,9 @@
1
1
  <!-- vsk-dev:start -->
2
2
  ## Dev workflow
3
3
 
4
- Read `.vegastack/dev.md` for this project's stack, commands, and workflow knobs.
4
+ Read `.vegastack/dev.md` for this project's stack, commands, and workflow knobs. The workflow's stages are the dev-family skills: dev-setup (bootstrap) · dev-intake (ideas to briefs) · dev-plan (approved briefs to plans) · dev-architect (stack judgment) · dev-implement (dark builds) · dev-debug (reproduce-first fixes) · dev-review (independent review) · dev-ship (gated landing) · dev-status (the operator's board) · dev-chronicle (the project's story).
5
5
 
6
- Work flows through GitHub issues. An issue labeled `ready` carries the user's recorded approval and a complete brief — implement it end to end per the `dev-implement` skill, post the evidence in the issue, and hand it back with `for-operator`. Start only on `ready` issues. The workflow vocabulary is the labels dev.md's `labels:` knob names (defaults: `needs-operator` waiting on the user → `ready` approved → `working` claimed by an agent → `for-operator` result awaiting review; `risky` flags security, money, data, or production) — use them and no others.
6
+ Work flows through GitHub issues. An issue labeled `ready` carries the user's recorded approval and a complete brief — implement it end to end per the `dev-implement` skill, post the evidence in the issue, and hand it back with `for-operator`. Start only on `ready` issues. The workflow vocabulary is the labels dev.md's `labels:` knob names (defaults — state: `needs-operator` waiting on the user → `needs-plan` awaiting the planning stage → `ready` approved → `working` claimed → `for-operator` result awaiting review; modifiers: `risky` for security/money/data/production, scope `research`/`quick-build`/`full-plan`, `epic` on map parents) — use them and no others. Artifact formats (comment markers, ledger, revisions, operator identity) follow the dev-setup skill's `references/conventions.md`.
7
7
 
8
8
  **Nothing ships without the operator's explicit instruction** — no push to the default branch, merge, tag, publish, or deploy on green checks, schedules, or standing approvals alone. The `gates` knob in dev.md changes how many of those actions one instruction covers, never whether an instruction is needed. Behavior changes carry their changelog entry per dev.md's `changelog:` knob before hand-back; after merge, the `## Ship` runbook in dev.md says what happens next and which steps need the operator's word.
9
9
 
@@ -3,23 +3,24 @@
3
3
  This file is the project's handbook and its only process document: short directional bullets, not prose. Skills read the section they need. When reality disagrees with a line, fix the line; when a gotcha or repeated instruction surfaces, fold ONE line into the right section — never append a log. A section left as TODO because its machinery didn't exist yet: re-run dev-setup detection when the machinery appears.
4
4
 
5
5
  repo: {{owner/repo}} · default branch {{branch}}
6
- stack: {{one line, or "see .vegastack/arch.md"}}
6
+ stack: {{one line; the `## Architecture` section below carries the architecture facts}}
7
7
  commands: test `{{test}}` · build `{{build}}` · dev `{{dev}}`
8
8
  authority: {{ordered — e.g. "CONTRIBUTING.md → this file → skill defaults"; delete the line when this file is the only process doc}}
9
9
 
10
10
  ## Knobs
11
11
 
12
- review: subagent # subagent | cross-agent | cross-agent-risky
12
+ review: cross-agent-risky # subagent (never cross-agent) | cross-agent-risky (other agent on risky) | cross-agent (always) — dev-review maps these
13
13
  ui-evidence: playwright # playwright | none
14
14
  evidence-repo: {{owner}}/dev-review-evidence # shared across projects; this project's folder = repo name; delete the line when ui-evidence is none
15
15
  gates: 3 # 3 = approve/PR/merge · 2 = approve + one "ship it" · 1 = direct-to-main, ship word merges locally and pushes, no PR
16
16
  tests: required # required | logic-only
17
17
  merge: squash
18
18
  branch: <type>/<issue>-<slug> # type: feat | fix | docs | chore | refactor — the only place this list lives
19
- labels: needs-operator ready working for-operator risky
19
+ labels: needs-operator needs-plan ready working for-operator risky research quick-build full-plan epic # epic label marks map parents only where the org has no native Epic issue type
20
20
  changelog: {{changesets | keep-a-changelog | pubspec+changelog | none (reason)}}
21
21
  decisions: .vegastack/decisions.md
22
22
  release: on-request # per-merge = Ship runbook runs as part of shipping · on-request = only when the operator says "release"
23
+ chronicle: on # on = dev-implement writes a .vegastack/chronicle.md story entry per behavior-changing branch · off
23
24
 
24
25
  ## Ship — what happens after merge, in order
25
26
 
@@ -43,13 +44,30 @@ Line prefixes: `auto:` (agent just does it) · `ask:` (operator's word first) ·
43
44
 
44
45
  ## Design
45
46
 
46
- - {{pointers: design system / component rules / .vegastack/arch.md / UI conventions}}
47
+ - {{pointers: design system / component rules / UI conventions}}
48
+
49
+ ## Architecture
50
+
51
+ Facts dev-architect reads before advising — knobs, not prose. Decisions with rationale go
52
+ to the register, never here. The repo wins on drift; dev-architect proposes the one-line
53
+ fix. Delete this whole section for repos with no app architecture (pure tooling, docs, or
54
+ content repos) — the `stack:` line at the top is enough.
55
+
56
+ hosting: {{cloudflare-workers-opennext | self-managed-server | both | vercel (exception - say why)}}
57
+ database: {{postgres via hyperdrive | postgres self-managed | d1 (recorded exception) | none}}
58
+ auth: {{better-auth | none}} # orgs plugin when multi-tenant
59
+ storage: {{r2 | s3 | minio | none}}
60
+ jobs: {{none | pg-boss}}
61
+ agents: {{none | eve | ai-features}} # ai-features = AI SDK calls only, no agent runtime
62
+ stage: {{pre-launch | live}} # pre-launch = delete-not-migrate applies
63
+ kind: {{internal | client | oss}}
64
+ mobile: {{no | flutter (separate repo)}}
47
65
 
48
66
  ## Decisions
49
67
 
50
68
  Record a decision only when it is directional — it steers work beyond this issue: a real alternative was rejected; it constrains work not yet written; and no dev.md line, lint rule, or guard can enforce it instead (if one can, write the rule). Feature requests, one-off fixes, and routine implementation choices never qualify. Every entry needs the user's explicit yes. One line in the register (`decisions:` knob), append-only, no other metadata:
51
69
 
52
- - DD-MM-YYYY (github-username) — the decision
70
+ - DD-MM-YYYY operator (github-username) — the decision
53
71
 
54
72
  ## Stop and ask
55
73
 
@@ -0,0 +1,93 @@
1
+ # Workflow conventions
2
+
3
+ The single spec for the artifacts every dev-family skill reads and writes. One home per rule: skills cite this file, never restate it. Everything here is harness-neutral.
4
+
5
+ ## Comment metadata markers
6
+
7
+ Every workflow-generated issue comment opens with an invisible HTML marker followed by a human heading:
8
+
9
+ ```markdown
10
+ <!-- vsk:v1 type=<type> rev=<n> [key=value ...] -->
11
+ ## <Human title> (v<n>)
12
+ ```
13
+
14
+ | type | required keys | instances |
15
+ |---|---|---|
16
+ | `approval` | `scope=<brief\|brief+plan\|plan>` | one per approval event |
17
+ | `plan` | `rev` | one, edited in place |
18
+ | `ledger` | `branch` | one, edited in place |
19
+ | `evidence` | `rev branch sha` | one, edited in place |
20
+ | `review` | `round sha agent=<claude\|codex> verdict=<clean\|needs-fixes>` | one per review cycle, rounds appended inside |
21
+ | `decision` | — | one per decision proposal |
22
+ | `handback` | — | one per stop event |
23
+
24
+ `rev=<n>` and the matching `(v<n>)` heading suffix appear only on revisable artifacts — the brief (issue description), `plan`, and `evidence` — starting at `rev=1`/`(v1)`. Single-event comments (`approval`, `decision`, `handback`) and the `ledger` carry neither. Scripts and agents locate comments strictly by marker, never by heading text. A comment without its marker does not count as the artifact — there is no legacy fallback.
25
+
26
+ ## Operator identity
27
+
28
+ Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — is written `operator (<github-username>)`:
29
+
30
+ - Approval: `Approved by operator (<username>) on DD-MM-YYYY: "<their words>"`
31
+ - Register line: `- DD-MM-YYYY operator (<username>) — <decision>`
32
+
33
+ ## Revision markers
34
+
35
+ Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per operator (<username>) correction`. Existing revision lines are never rewritten.
36
+
37
+ ## Scope classes
38
+
39
+ Set at intake, applied as a label, announced with its reason (operator can override):
40
+
41
+ - **`research`** — a question to answer; throwaway code allowed, never merged. No branch/PR/changelog; findings + recommendation are the evidence comment.
42
+ - **`quick-build`** — small change and the flow being changed already exists in the repo to read. Brief (description) + plan (comment) are drafted in the same conversation; **one approval covers both**; then straight to `ready`.
43
+ - **`full-plan`** — big or new ground. Brief approval → `needs-plan` → a separate, fresh-grounded planning session posts the plan → `needs-operator` → "plan approved" → `ready`. Multi-deliverable work becomes an epic; each sub-issue is classified independently.
44
+
45
+ Scope calls are revisited through the one-way ratchet, whose rules and mechanics live in the `dev-plan` skill — the one home for upgrade/downgrade behavior.
46
+
47
+ ## Labels
48
+
49
+ State — exactly one per issue (creation colors live in dev-setup's labels row, their one home):
50
+
51
+ | label | meaning |
52
+ |---|---|
53
+ | `needs-operator` | waiting on the operator: a question, a brief or plan to approve, a proposal |
54
+ | `needs-plan` | brief approved; waiting for the planning stage (full-plan only) |
55
+ | `ready` | fully approved — an agent may start |
56
+ | `working` | claimed, in progress; the ledger comment shows live progress |
57
+ | `for-operator` | done — evidence posted, awaiting operator review |
58
+
59
+ Modifiers (may coexist with the state label): `risky` · scope `research` / `quick-build` / `full-plan` · `epic` (map parents, only where the org has no native Epic issue type).
60
+
61
+ ## Titles, types, hierarchy
62
+
63
+ - **Title prefixes** on issues, branches, and PRs identically: dev.md's `branch:` knob type list (that knob stays the list's one home) plus `research:` for research issues. PR title = issue title.
64
+ - **Native issue types** where the org defines them: Feature (feat) · Bug (fix) · Task (docs/chore/refactor/research) · Epic for parents (label fallback otherwise).
65
+ - **Hierarchy:** epic parent = map only (Destination · Decisions so far as one-line gists · Not clear yet · Out of scope), children attached as native sub-issues; issues = the unit of work (brief in description, own approvals/branch/PR/evidence); tasks = checkboxes **in the plan comment only**. Blockers use native issue dependencies; phases use milestones. Only issues — never epics — get `ready`. GitHub caps issue bodies and comments at ~65,536 characters; what a plan nearing that cap means is the `dev-plan` ratchet's call.
66
+
67
+ ## The ledger
68
+
69
+ Maintained by the implement session as one comment, edited in place:
70
+
71
+ ```markdown
72
+ <!-- vsk:v1 type=ledger branch=<branch> -->
73
+ ## Ledger — <branch>
74
+ - Task <N>: complete (commits <base7>..<head7>[, review clean | K parked])
75
+ - Task <N>: fix round <R>/3 (<X> addressed, <Y> open — <one-liners>; commits <a>..<b>)
76
+ - Ruling: <what> — <why> — cost if wrong: <cost>
77
+ - Task <N>: parked — <finding> — Ruling: <why the code stands>
78
+ - Deferred minor: <one-liner>
79
+ ```
80
+
81
+ **Resume protocol:** a fresh, compacted, or (operator-handed) takeover session reads, in order: the brief → the plan comment → the ledger → `git log` on the branch — **nothing else**. Tasks with a `complete` line are DONE, never re-executed; a task whose last line is a fix round resumes at the next round. After compaction, trust the ledger and `git log` over recollection. Every `Ruling:` line surfaces in the evidence comment — a ruling that dies with the session was a decision made in secret.
82
+
83
+ ## `.vegastack/.tmp/` workspace
84
+
85
+ All transitory artifacts — subagent reports, review packages, plan drafts, extracted diffs — live at `.vegastack/.tmp/<issue-number>-<title-slug>/` (pre-issue intake drafts, which have no number yet: `.vegastack/.tmp/intake-<slug>/`), kept out of git by a self-ignoring `.gitignore` (`printf '*\n' > .vegastack/.tmp/.gitignore`, created on first use). Subagents write full reports to files there and return only short status — a dead subagent's findings survive on disk, and the primary session never holds full reports in context. The workspace lives in the working tree (never under `.git/`, which harnesses protect from writes).
86
+
87
+ ## Verification gate
88
+
89
+ Before claiming any status: **IDENTIFY** the command that proves the claim → **RUN** it fresh and complete → **READ** the full output and exit code → only then claim, with the evidence. "Should pass", a previous run, or a subagent's say-so are never evidence. Guard scripts follow the same doctrine: machine-verifiable facts **block** (exit 2 with the reason); regex or judgment heuristics only **warn** — no AI inference inside guards, and an unverifiable state fails closed.
90
+
91
+ ## Plain-language collaboration
92
+
93
+ Every skill run ends with a simple-language summary: what happened, which paths were taken — cross-agent invocations announced at trigger time AND summarized at the end — and what is worth the operator double-checking. Use mermaid or ASCII diagrams in issues wherever a picture beats prose. A vague or self-contradicting operator answer gets pushback with concrete options, never silent absorption.
@@ -116,7 +116,7 @@ No git repo or no origin remote is a greenfield run, not an error. Detection has
116
116
 
117
117
  1. Ask the intended stack (offer the playbook list above) and whether the project will publish, deploy, or neither — this picks the draft conventions up front.
118
118
  2. Offer, each on its own yes: `git init` (default branch `main`) · `gh repo create <owner>/<name> --private` + first push · a stack-appropriate `.gitignore`.
119
- 3. Scaffolding the app itself (create-next-app, flutter create, …) is **not** this skill's job — name the conventional command for the chosen stack and leave running it to the user (or `architect` guidance).
119
+ 3. Scaffolding the app itself (create-next-app, flutter create, …) is **not** this skill's job — name the conventional command for the chosen stack and leave running it to the user (or `dev-architect` guidance).
120
120
  4. Render dev.md from the chosen playbook's conventions; every section whose machinery doesn't exist yet gets its `TODO — re-run dev-setup when it appears` line. Declined remote → skip labels, record the TODO, and say what was skipped.
121
121
 
122
122
  ## Decision-capture hooks
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: dev-ship
3
- description: Create the pull request and merge for a finished issue, each only on the user's explicit word, then run the project's Ship runbook — releases, guards, deploys. Use when the user says "make the PR", "open a pull request" for an issue, "ship it", "merge it", "merge issue 12", "release", "release everything since the last tag", or asks to close out a reviewed issue, merge a bot PR, or roll back a bad release (roll-forward). Verifies the issue is at for-operator with evidence and its changelog entry, links the PR to the issue, merges on the separate merge instruction, and records approved decisions. Not for implementing issues (dev-implement) or writing and approving them (dev-intake).
3
+ description: Land finished work, each step only on the operator's explicit word. Use when the user says "make the PR", "open a pull request" for an issue, "ship it", "merge it", "merge issue 12", "release", "release everything since the last tag", or asks to close out a reviewed for-operator issue, merge a bot PR (Renovate, Dependabot), or roll back a bad release. Not for implementing issues (dev-implement), reviewing them (dev-review), or writing and approving them (dev-intake).
4
4
  ---
5
5
 
6
6
  # dev-ship
@@ -13,23 +13,28 @@ Nearest neighbor: `dev-implement` produces the `for-operator` issue with its evi
13
13
 
14
14
  On the user's PR instruction:
15
15
 
16
- - Verify the issue is at `for-operator` with the evidence comment present, and the branch is pushed. Not there yet say what's missing instead of creating a premature PR.
16
+ - Run the deterministic guard first: `node <path-to-this-skill>/scripts/ship-gate.mjs --issue <n> --branch <name> --json` (add `--repo <o/r> --dev-md <path>` outside the project root) — it re-runs the project check command fresh from the branch's own checkout, requires the evidence sha to equal the branch head (the corrections loop is the only reconciliation path), the changelog entry, the chronicle entry where the knob says `on`, a clean-or-adjudicated review verdict, and greps added lines for leftover `[DEBUG-` tags; exit 2 stops you with its reasons, warnings are read-twice signals.
17
+ - Verify the issue is at `for-operator` with the evidence comment present — including its `**Docs:**` line (brief/plan revisions in sync) — and the branch is pushed. Not there yet → say what's missing instead of creating a premature PR. Docs out of sync is corrections work: never patch a brief or plan from inside dev-ship.
17
18
  - Verify the changelog state matches the evidence comment's `**Changelog:**` line: a behavior-changing branch carries its entry per dev.md's `changelog:` knob (changesets: a `.changeset/*.md` in the diff; keep-a-changelog: the diff adds lines to CHANGELOG.md), while `none` with a reason that holds up (docs-only, test-only) is fine. An unexplained miss → corrections loop, not a PR.
18
19
  - `gh pr create` from the task branch: title from the issue, body is `Closes #<n>` plus a link to the evidence comment — the issue holds the report; the PR links it rather than duplicating it.
19
20
  - No draft PRs unless the user asks for one.
20
- - If required checks fail on the PR, that's implement work: hand the failures to the corrections loop, update the evidence comment, and tell the user. Under `gates: 2` the standing ship word holds once checks are green again — unless the fix changed behavior, which goes back to the user (same rule as a merge conflict).
21
+ - If required checks fail on the PR, that's implement work: hand the failures to the corrections loop, update the evidence comment, and tell the user. Under `gates: 2` the standing ship word holds once checks are green again — subject to Gate 2's staleness bound (behavior change or >7 days one-sentence re-confirm).
21
22
  - A direct chat change (dev-implement's no-issue path) ships on the same words: the chat request stands in for the recorded approval, the PR body carries the evidence instead of linking an issue comment, and the changelog rule applies unchanged.
22
23
  - User corrections left on the PR itself flow through the same corrections loop on the same branch — the PR updates with the push; nothing gets recreated.
23
24
 
24
25
  With `gates: 1` there is no PR: the same verifications run, then the ship word triggers the merge below directly ([runbook](references/runbook.md) has the mechanics).
25
26
 
27
+ | Excuse (observed) | Reality |
28
+ |---|---|
29
+ | "Opening a PR is preparation, not shipping — it pushes nothing… exactly the state the workflow wants finished work parked in." | Under `gates: 3` the PR is a gate spent only by the operator's word. Finished work parks on the pushed branch; a draft PR is still a PR nobody asked for. |
30
+
26
31
  ## Gate 2 — the merge
27
32
 
28
33
  On the user's merge instruction:
29
34
 
30
35
  - Re-check that the PR head is still the revision the evidence comment names and checks are green — a branch that moved since review gets re-verified before it lands.
31
- - Pending `Decision:` lines exist (issue comments, or the evidence comment's `**Decision:**` line) → name them in the merge confirmation — "merging will record: …" — so the operator's word demonstrably covers them; never append on inferred consent. On the word, append each to the register dev.md names (`decisions:` knob) in its `- DD-MM-YYYY (github-username) — …` format; the register is append-only and this is its moment.
32
- - A merge conflict with the default branch is corrections work: update the branch, re-verify what the update touched, and the standing merge instruction holds once checks are green again — unless the update changed behavior, which goes back to the user.
36
+ - Pending `Decision:` lines exist (issue comments, or the evidence comment's `**Decision:**` line) → name them in the merge confirmation — "merging will record: …" — so the operator's word demonstrably covers them; never append on inferred consent. On the word, append each to the register dev.md names (`decisions:` knob) in its `- DD-MM-YYYY operator (github-username) — …` format; the register is append-only and this is its moment.
37
+ - A merge conflict with the default branch is corrections work: update the branch, re-verify what the update touched, and the standing merge instruction holds once checks are green again — unless the update changed behavior, or more than 7 days have passed since the word; either way, re-confirm with one sentence rather than acting on a stale instruction.
33
38
  - Merge per the dev.md `merge` knob (default `gh pr merge --squash`; `gates: 1` merges locally per the same knob and pushes). `Closes #<n>` closes the issue; confirm both happened.
34
39
  - A bot PR (Renovate, Dependabot) has no issue or evidence comment and merging it is still shipping: green checks qualify it, only the operator's explicit word — per PR or per named batch — merges it; majors and security advisories get named before their word is acted on.
35
40
 
@@ -37,8 +42,10 @@ On the user's merge instruction:
37
42
 
38
43
  Merge is not the end when dev.md has a `## Ship` section: follow its steps in order — `auto:` lines you just do, `ask:` lines wait for the operator's word, `guard:` lines are deterministic checks you run locally at their position (their CI copies are the backstop). With `release: per-merge`, the runbook is part of shipping the issue; with `release: on-request`, it runs only when the operator says "release" (covering everything merged since the last one). Report each step's outcome; a failing step — guard included — stops the sequence and goes to the operator, never skipped past. Execution detail, release batching, direct-to-main, bot PRs, and rollback: [runbook](references/runbook.md).
39
44
 
40
- Rollback is never a force-push: follow the Ship section's rollback line — roll forward through the normal flow. A gotcha here (a step that surprised you, an instruction the operator had to repeat) is one proposed line folded into the runbook; a directional gotcha that passes dev.md's Decisions test is a register proposal instead, on the user's yes.
45
+ Rollback is never a force-push: follow the Ship section's rollback line — roll forward through the normal flow. Gotchas surfaced here feed the Report's closing retro below.
41
46
 
42
47
  ## Report
43
48
 
44
- One short confirmation each gate: what was created or merged, the link, decisions recorded, and anything that still needs the user (failing check, failing guard, moved head, missing evidence or changelog entry). When a gate's condition isn't met, the answer is what's missing — the gate itself never gets skipped to be helpful.
49
+ One short confirmation each gate, in plain language: what was created or merged, the link, decisions recorded, and anything that still needs the operator (failing check, failing guard, moved head, missing evidence or changelog entry). When a gate's condition isn't met, the answer is what's missing — the gate itself never gets skipped to be helpful.
50
+
51
+ Close every ship with the retro: any bounce, gotcha, or instruction the operator had to repeat during this issue? Propose the ONE dev.md (or runbook) line that would have prevented it — fold into an existing line, never append a log; a directional gotcha becomes a register proposal instead. Each lands only on the operator's yes.