@vegastack/skills 0.7.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -14,10 +14,10 @@ npx @vegastack/skills add architect
14
14
  | `architect` | Architecture advisor: the locked stack and lean-first principles as evidence-distilled decision tables, dated source-verified platform facts, a per-project `.vegastack/arch.md` profile with repo-wins drift detection, and an advisory-only review discipline |
15
15
  | `skill-maintainer` | Encodes the Agent Skills standards (Claude Code, Codex, Hermes, agentskills.io) for creating, updating, and releasing skills in a skills repo |
16
16
  | `skillify` | Turns a feature or workflow into a complete skill conforming to the VegaStack skills contract, or audits an existing one |
17
- | `dev-setup` | Bootstraps a project for the issue-driven dev workflow: profile, AGENTS.md section, labels, decision register |
17
+ | `dev-setup` | Bootstraps any project, greenfield included, for the issue-driven dev workflow: stack-playbook-drafted profile, AGENTS.md section, labels, guards, decision register |
18
18
  | `dev-intake` | Turns ideas, brainstorms, and SOWs into agent-ready GitHub issues with recorded user approval |
19
19
  | `dev-implement` | Implements an approved issue end to end, dark: preflight, claim, build, test, review, evidence in the issue |
20
- | `dev-ship` | Opens the PR and merges, each only on the user's explicit word |
20
+ | `dev-ship` | Opens the PR, merges, and runs the project's Ship runbook, each only on the user's explicit word |
21
21
 
22
22
  ## Commands
23
23
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vegastack/skills",
3
- "version": "0.7.0",
3
+ "version": "0.9.0",
4
4
  "description": "Installer and verifier for VegaStack Agent Skills (Claude Code, Codex, and Hermes)",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -1,41 +1,47 @@
1
1
  ---
2
2
  name: dev-implement
3
- description: Implement an approved GitHub issue end to end without further user input. Use when given an issue to build - "do issue 12", "implement" plus an issue URL or number, "pick up the next ready issue", "go dark on" an issue - when returning to apply corrections the user left on a for-you issue, or when the user directly asks in chat for a quick fix or small change. Runs preflight, claims the issue, builds on a task branch, tests, gets independent review, and posts one evidence comment in the issue. Not for writing or approving issues (dev-intake), not for creating PRs or merging (dev-ship).
3
+ description: Implement an approved GitHub issue end to end without further user input. Use when given an issue to build - "do issue 12", "implement" plus an issue URL or number, "pick up the next ready issue", "go dark on" an issue - when returning to apply corrections the user left on a for-operator issue, or when the user directly asks in chat for a quick fix or small change. Runs preflight, claims the issue, builds on a task branch, tests, gets independent review, and posts one evidence comment in the issue. Not for writing or approving issues (dev-intake), not for creating PRs or merging (dev-ship).
4
4
  ---
5
5
 
6
6
  # dev-implement
7
7
 
8
8
  One issue, one session, end to end: preflight → claim → build dark → verify → review → evidence in the issue → stop. The user reads the result in the issue on their own time; nothing here creates a PR or merges — those are `dev-ship`, on the user's word.
9
9
 
10
- Nearest neighbor: `dev-intake` writes the brief this skill executes; if the issue turns out to need decisions, that's intake work — hand it back via `needs-you`, don't guess. `.vegastack/dev.md` missing → run `dev-setup` first. Read dev.md before anything; its knobs (review, ui-evidence, tests, branch, stop-list) govern this whole skill.
10
+ Nearest neighbor: `dev-intake` writes the brief this skill executes; if the issue turns out to need decisions, that's intake work — hand it back via `needs-operator`, don't guess. `.vegastack/dev.md` missing → run `dev-setup` first. Read dev.md before anything; its knobs (review, ui-evidence, tests, branch, stop-list) govern this whole skill.
11
11
 
12
12
  ## Direct requests
13
13
 
14
- The gates exist to stop agent-invented authority, never to slow the user down. When the user directly asks in chat for a change ("fix this typo", "bump that timeout"), their words are the approval — do it, verify it, and report; no issue required. Offer to record an issue when the change is material enough that its brief or evidence will matter later. Everything below is the path for issue-driven work.
14
+ The gates exist to stop agent-invented authority, never to slow the user down. When the user directly asks in chat for a change ("fix this typo", "bump that timeout"), their words are the approval — do it, verify it, and report; no issue required. Branch as `<type>/<slug>` (no issue segment); the changelog rule below applies unchanged when the change is behavior-changing; shipping still goes through dev-ship's words, with the chat request standing in for the approval and the report for the evidence comment. Offer to record an issue when the change is material enough that its brief or evidence will matter later. Everything below is the path for issue-driven work.
15
15
 
16
16
  ## Preflight — all must hold, or stop and say which failed
17
17
 
18
18
  - `gh auth status` works and the issue's repo matches dev.md.
19
19
  - The issue is open, labeled `ready`, and carries the recorded approval comment (`Approved by … : "…"`). A label without the comment is not approval.
20
20
  - No open blockers (issue dependencies) and no other assignee — an assigned or `working` issue belongs to someone else. A claim from a dead session is released only by the user: take over a `working` issue only when they explicitly hand it to you.
21
- - Read the complete brief, plus parent issue and milestone for context. If the brief leaves a material decision open — including an unresolved Assumptions entry — do not start: label `needs-you`, comment the smallest question that unblocks it, stop.
22
- - Re-verify the brief against reality before coding: its cited touch points against the current code (things drift between approval and execution), and volatile dependency claims when stale or version-sensitive. Reality contradicting the brief is a stop — label `needs-you` with the discrepancy; an approved brief is never a license to improvise past what's actually there.
21
+ - Read the complete brief, plus parent issue and milestone for context. If the brief leaves a material decision open — including an unresolved Assumptions entry — do not start: label `needs-operator`, comment the smallest question that unblocks it, stop.
22
+ - Re-verify the brief against reality before coding: its cited touch points against the current code (things drift between approval and execution), and volatile dependency claims when stale or version-sensitive. Reality contradicting the brief is a stop — label `needs-operator` with the discrepancy; an approved brief is never a license to improvise past what's actually there.
23
23
 
24
24
  ## Claim and branch
25
25
 
26
- Assign yourself, swap `ready` → `working`. Branch from the default branch: `<type>/<issue-number>-<short-slug>` (type from dev.md: feat, fix, docs, chore, refactor).
26
+ Assign yourself, swap `ready` → `working`. Branch from the default branch per dev.md's `branch:` knob the knob is the only source of the pattern and its type list.
27
27
 
28
28
  ## Build — dark
29
29
 
30
- No progress updates, no questions. A spike the brief flagged runs first — its result opens the evidence comment and shapes the rest of the build. Decide routine things yourself: file layout, helpers, fixtures, and root-cause fixes inside the issue's change areas. The brief's out-of-scope section and the dev.md stop-list bound you; hitting a stop condition (scope change, new dependency, spending, destructive/production action, unresolvable blocker) ends dark mode — post one `needs-you` comment stating the smallest decision needed with your recommendation, and stop.
30
+ No progress updates, no questions. A spike the brief flagged runs first — its result opens the evidence comment and shapes the rest of the build. Decide routine things yourself: file layout, helpers, fixtures, and root-cause fixes inside the issue's change areas. The brief's out-of-scope section and the dev.md stop-list bound you; hitting a stop condition (scope change, new dependency, spending, destructive/production action, unresolvable blocker) ends dark mode — post one `needs-operator` comment stating the smallest decision needed with your recommendation, and stop.
31
31
 
32
32
  Honesty over green: a failing test gets fixed at the root or reported as failing. Weakening a test, an assertion, or acceptance to pass is a cover-up, and cover-ups surface at review with interest.
33
33
 
34
+ ## Changelog — before hand-back
35
+
36
+ Every behavior-changing branch carries its changelog entry per dev.md's `changelog:` knob; a ship-time guard catches misses, but don't rely on it. `changesets` → write `.changeset/<slug>.md` directly (frontmatter `"<package-name>": <bump>` from the brief's version-impact line, plus a one-paragraph summary — the changeset CLI prompt is interactive, never invoke it here). `keep-a-changelog` / `pubspec+changelog` → one bullet under `## [Unreleased]` (Added/Changed/Fixed/Removed subsection as fits); no CHANGELOG.md yet → create it in the same branch with the skeleton (`# Changelog` + `## [Unreleased]`). `none` → skip. Docs the brief names as affected get updated in the same branch.
37
+
34
38
  ## Verify
35
39
 
36
40
  - Run the tests dev.md requires (`tests: required` → every changed behavior has a test that runs and passes; `logic-only` → content/config tweaks may skip). Record commands and results for the evidence comment.
37
41
  - A `risky` issue gets focused security, failure, and recovery checks on top of the required tests.
38
- - UI changed and `ui-evidence: playwright` capture screenshots of the key states and flows, push them to the evidence repo (dev.md `evidence-repo`) under `<repo>/<issue-number>/`, and link them. Links, not embeds private-repo images don't render inline in issues. Evidence repo missing or unreachable name the local file paths in the evidence comment and say so; the hand-back never blocks on it.
42
+ - When dev.md has a `## Verify` runbook, follow it run the app and smoke-check the flows it names; that live result belongs in the evidence comment alongside the test output. Verify is pre-merge only; post-release checks live in `## Ship` and belong to dev-ship.
43
+ - UI changed and `ui-evidence: playwright` → capture screenshots of the key states and flows and upload them to the shared evidence repo (dev.md `evidence-repo`) under `<this-repo-name>/<issue-number>/<timestamp>-<name>.png` — via the contents API so the repo is never cloned: `base64 < <file> | tr -d '\n' | gh api -X PUT repos/<evidence-repo>/contents/<path> -f message="evidence #<issue>" -F content=@-` (piped stdin, so large screenshots never hit argv limits; timestamped names keep re-captures from colliding; a 409 from a concurrent upload just means retry). Link them in the evidence comment — links, not embeds; private-repo images don't render inline in issues. Evidence repo missing or unreachable → name the local file paths and say so; the hand-back never blocks on it.
44
+ - dev.md's Ship or Verify section is an empty TODO while release/deploy machinery visibly exists → finish this issue normally, then suggest re-running dev-setup so detection can fill it.
39
45
 
40
46
  ## Independent review — per the dev.md knob
41
47
 
@@ -50,13 +56,15 @@ Honesty over green: a failing test gets fixed at the root or reported as failing
50
56
  **Done:** what changed, in behavior terms
51
57
  **Tests:** <command> → <result summary>
52
58
  **Review:** <mode> — <findings fixed / none / disputed with reason>
59
+ **Changelog:** <entry added / none, with reason> (when the knob is not `none`)
53
60
  **UI evidence:** <links> (when applicable)
61
+ **Decision:** <one line in the register format> (only a dark-mode choice that passes dev.md's Decisions test — a proposal; dev-ship records it after naming it in the merge confirmation)
54
62
  **Not done / limits:** the honest list
55
63
  Branch: <name> @ <short-sha>
56
64
  ```
57
65
 
58
- Post it, swap `working` → `for-you`, unassign nothing, stop. Later corrections update this same comment — a stack of stale result comments hides the current truth.
66
+ Post it, swap `working` → `for-operator`, unassign nothing, stop. Later corrections update this same comment — a stack of stale result comments hides the current truth.
59
67
 
60
68
  ## Corrections loop
61
69
 
62
- The user's comments on a `for-you` issue are the new frontier: apply them, re-verify what they touch, update the evidence comment, back to `for-you`. Their corrections never need re-approval ceremony unless they change scope — then it's `needs-you` and dev-intake's recording rule.
70
+ The user's comments on a `for-operator` issue are the new frontier: apply them, re-verify what they touch, update the evidence comment, back to `for-operator`. Their corrections never need re-approval ceremony unless they change scope — then it's `needs-operator` and dev-intake's recording rule.
@@ -1,3 +1,3 @@
1
1
  # Refresh contract — dev-implement
2
2
 
3
- Evergreen: this skill asserts no version pins, vendor mechanism names beyond long-stable `gh` subcommands, numeric vendor limits, or dated facts — its content is workflow discipline (preflight, claiming, dark-mode bounds, review modes, the evidence-comment contract), all versionless. Harness mechanics are tracked by `dev-setup`'s registry. Revisit if a future edit introduces a volatile fact.
3
+ Evergreen: this skill asserts no version pins, vendor mechanism names beyond long-stable `gh` subcommands and the GitHub contents API shape (deliberately treated as durable), numeric vendor limits, or dated facts — its content is workflow discipline (preflight, claiming, dark-mode bounds, review modes, the evidence-comment contract), all versionless. Harness mechanics are tracked by `dev-setup`'s registry. Revisit if a future edit introduces a volatile fact.
@@ -32,7 +32,7 @@ Work the design the way a joint product-and-tech review would; each round's answ
32
32
 
33
33
  1. **Product** — who this is for, the observable outcome, what's in and out of scope now, how it splits into slices or phases, priority.
34
34
  2. **Behavior** — primary and alternate flows, rules, permissions, validations, edge and failure cases; for UI, the states, components, and copy.
35
- 3. **Technical** — only the choices that are genuinely the user's: approach trade-offs, data and interface implications, integrations, migration; recommend one and say why. Routine implementation stays the implementer's.
35
+ 3. **Technical** — only the choices that are genuinely the user's: approach trade-offs, data and interface implications, integrations, migration; recommend one and say why. When the project versions releases (dev.md `changelog:` knob), settle the intended version impact (patch/minor/major) here — the brief records it and dev-implement's changelog entry starts from it. Routine implementation stays the implementer's.
36
36
  4. **Quality and risk** — what proves it works (test cases, acceptance), what earns the `risky` label, what should stop a dark run beyond the standing stop-list.
37
37
 
38
38
  These are the brief template's sections in interview form — a question exists only where reading the material, the codebase, and sensible defaults cannot fill a section.
@@ -50,13 +50,13 @@ Every issue body follows [brief-template](references/brief-template.md): Outcome
50
50
 
51
51
  ## Labels and approval
52
52
 
53
- - A new issue starts at `needs-you`. Add `risky` when it touches security, money, user data, or production.
53
+ - A new issue starts at `needs-operator`. Add `risky` when it touches security, money, user data, or production. (Label names come from dev.md's `labels:` knob; the defaults are used throughout this skill family's prose.)
54
54
  - Approval is only the user's explicit words — "approved", "go ahead", clearly tied to this issue, in chat or on the issue. Labels, silence, or the passage of time never create approval.
55
- - Record it once: comment `Approved by <user> on <date>: "<their words>"`, then swap `needs-you` → `ready`. That comment is what dev-implement's preflight looks for.
55
+ - Record it once: comment `Approved by <user> on <date>: "<their words>"`, then swap `needs-operator` → `ready`. That comment is what dev-implement's preflight looks for.
56
56
  - An issue with an unconfirmed entry in its Assumptions section cannot go `ready` — the recorded approval covers the ledger the user saw, so resolve every entry (confirmed, corrected, or moved to a spike) first.
57
- - An issue that settles a material cross-cutting decision records it as one comment starting `Decision:` dev-ship appends that line to the project's decision register at merge.
57
+ - An issue that settles a directional decision — one that passes the Decisions test in `.vegastack/dev.md` — records it as one comment starting `Decision:`, in the register's line format; dev-ship appends it at merge after naming it in the merge confirmation. A decision that stands regardless of the issue's fate may go into the register immediately on the user's explicit yes in the same conversation — note "recorded" on the comment so dev-ship doesn't append it twice. Choices that fail the test are brief content, never register lines.
58
58
  - The user edits or corrects a draft → apply, and summarize what changed since they last read it.
59
59
 
60
60
  ## After approval
61
61
 
62
- An approved issue that later needs a material change flips back to `needs-you` with one comment naming what changed; the new approval is recorded the same way. Small wording fixes that change no behavior don't reopen anything.
62
+ An approved issue that later needs a material change flips back to `needs-operator` with one comment naming what changed; the new approval is recorded the same way. Small wording fixes that change no behavior don't reopen anything.
@@ -28,6 +28,11 @@ user-facing text. Responsive and keyboard behavior when it matters.
28
28
  The chosen technical approach in a few lines: which parts of the codebase change,
29
29
  new/changed interfaces or schemas, data migrations. Routine choices (file names,
30
30
  helpers, fixtures) stay the implementer's — don't specify them.
31
+ Name the docs and changelog surfaces this change must update (README section, user
32
+ docs, the changelog entry's gist).
33
+ **Version impact:** patch | minor | major, one-line reason — only when the project
34
+ versions releases (dev.md `changelog:` knob); dev-implement's changelog entry or
35
+ changeset starts from this line.
31
36
 
32
37
  ## Tests and acceptance
33
38
 
@@ -54,3 +59,4 @@ their evidence. Delete the section once every entry is resolved.
54
59
  - Concrete over abstract: "rejects amounts over 10,000 with error E402" beats "validates input".
55
60
  - Evidence over confidence: touch points name real file paths; a dependency capability claim carries the doc check and its date; what couldn't be verified goes to Assumptions, never stated as fact.
56
61
  - The brief binds the agent, so ambiguity is a bug in the brief — if two readings exist, the interview wasn't done.
62
+ - A `Decision:` comment exists only for a choice that passes the Decisions test in `.vegastack/dev.md` — feature requests and implementation details never qualify; they are brief content, not register lines.
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  name: dev-setup
3
- description: Bootstrap a project for issue-driven agent development. Use when asked to "set up the dev workflow", "bootstrap this project for agents", "install the dev workflow here", or invoked as dev-setup; also run automatically when dev-intake, dev-implement, or dev-ship find no .vegastack/dev.md in the project. Creates the project profile, the AGENTS.md dev section plus CLAUDE.md import, the five workflow labels on the GitHub repo, and the decision register. Not for architecture profiles or advice (that is architect and .vegastack/arch.md), not for authoring skills, not for repos without git.
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.
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, 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.
9
9
 
10
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.
11
11
 
@@ -19,30 +19,36 @@ Facts are your job; decisions are the user's. Gather these silently and present
19
19
  | gh authenticated | `gh auth status` |
20
20
  | stack and commands | package.json scripts, lockfiles, framework configs |
21
21
  | web app (UI evidence relevant) | framework dependencies (next, react, vue, …) |
22
- | existing files | AGENTS.md, CLAUDE.md, `.vegastack/dev.md`, `.vegastack/arch.md`, docs/decisions.md |
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
+ | 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 |
23
25
  | existing labels | `gh label list` |
24
26
 
25
- Not a git repo, or no origin remote: stop and say exactly what is missing. A half-installed workflow is worse than none.
27
+ 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.
26
28
 
27
29
  ## Step 2 — The interview
28
30
 
29
31
  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.
30
32
 
31
- **Round A — confirm the detected facts** in one compact summary (repo, stack, commands, web app or not). Ask only about what detection could not fill.
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.
32
34
 
33
- **Round B — the four workflow knobs**, recommended default first:
35
+ **Round B — the workflow knobs**, recommended default first:
34
36
 
35
37
  1. Review of finished work: **subagent** · cross-agent (Codex↔Claude) · cross-agent only on `risky` issues
36
38
  2. Proof for UI work: **playwright screenshots** · none
37
- 3. Gates: **3** (approve → PR → merge as separate user words) · 2 (approve → one "ship it" covers PR and merge)
39
+ 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)
38
40
  4. Tests: **required for every change** · required for logic changes only
39
41
 
40
42
  **Round C — only when the situation exists:**
41
43
 
44
+ - Playbook matched → show the drafted `## Ship` runbook (each step `auto:`, `ask:`, or `guard:` — every `guard:` line carries its runnable command inline), the `changelog:` convention, and the `release:` knob (per-merge or on-request) for confirmation; a keep-a-changelog convention with no CHANGELOG.md yet → offer to seed the skeleton; no machinery → "Ship: merge only" and move on
45
+ - 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
+ - Environments or run commands detected → confirm the drafted `## Environments` and `## Verify` bullets
47
+ - 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)
48
+ - 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
42
49
  - AGENTS.md already has content → append the marked section (default) or show a merge proposal first
43
50
  - 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
44
- - Evidence repo for UI screenshots default `<owner>/dev-review-assets`; offer to create it (`gh repo create --private`) if missing
45
- - Different label names or a different decision-register path, if the user brings it up
51
+ - Different label names, `gates: 1` with branch protection on the default branch (it blocks direct pushes — surface the conflict), or a different decision-register path, if the situation or the user brings it up
46
52
 
47
53
  Everything else — merge style, branch naming, the stop-and-ask list — takes its documented default straight into dev.md. The profile is plain text the user can edit anytime; the interview is a convenience, not the source of truth.
48
54
 
@@ -50,11 +56,12 @@ Everything else — merge style, branch naming, the stop-and-ask list — takes
50
56
 
51
57
  | Target | Action |
52
58
  |---|---|
53
- | `.vegastack/dev.md` | render [dev-profile template](assets/dev-profile.md.template) with the answers |
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) |
54
60
  | `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 |
55
61
  | `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 |
56
- | labels | `gh label create <name> --color <hex> --description "<text>"`, skipping ones that exist: `needs-you` FBCA04 (waiting on the user) · `ready` 0E8A16 (approved, agent may start) · `working` 1D76DB (claimed by an agent) · `for-you` 5319E7 (result awaiting user review) · `risky` B60205 (security, money, data, or production) |
57
- | decision register | create the file the `decisions:` knob names (default `docs/decisions.md`) with a two-line header and one example entry, when missing; a project with an existing register keeps it and the knob points there |
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 |
64
+ | guard workflows / hook files | only the ones the user said yes to in Round C |
58
65
 
59
66
  ## Step 4 — Report
60
67
 
@@ -62,4 +69,4 @@ One summary: what was created, what was skipped and why, what remains TODO. When
62
69
 
63
70
  ## Re-runs
64
71
 
65
- Re-running is safe and is how knobs get revisited: show what differs per target and change only what the user confirms. The marked block is the only part of AGENTS.md this skill owns. Hand edits inside dev.md win — read them and keep them; the templates are for creation, not for resetting.
72
+ Re-running is safe and is how knobs get revisited and empty sections get filled: diff fresh detection against the existing dev.md, show what differs per target, and change only what the user confirms — propose the delta, never reset. The other dev skills send the user here when they notice an empty Ship/Verify section next to newly present machinery. The marked block is the only part of AGENTS.md this skill owns. Hand edits inside dev.md win — read them and keep them; the templates are for creation, not for resetting.
@@ -1,4 +1,4 @@
1
1
  interface:
2
2
  display_name: "dev-setup"
3
- short_description: "Bootstrap a repo for the issue-driven dev workflow"
3
+ short_description: "Bootstrap any repo, greenfield included, for the issue-driven dev workflow"
4
4
  default_prompt: "Use $dev-setup to bootstrap this project's dev workflow."
@@ -3,7 +3,11 @@
3
3
 
4
4
  Read `.vegastack/dev.md` for this project's stack, commands, and workflow knobs.
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-you`. Start only on `ready` issues. These five labels are the whole workflow vocabulary use them and no others: `needs-you` (waiting on the user) → `ready` (approved) → `working` (claimed by an agent) → `for-you` (result awaiting user review); `risky` flags security, money, data, or production work.
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.
7
7
 
8
- The user holds the gates: they approve the issue, say the word for a PR, and say a separate word to merge (see `gates` in dev.md). Material decisions get one dated line in the decision register dev.md names (`decisions:` knob).
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
+
10
+ Directional decisions — see `## Decisions` in dev.md for what qualifies — get one dated line in the register dev.md names. When any session, skill-driven or not, settles a choice that passes that test, propose the line and add it only on the user's yes.
11
+
12
+ dev.md is the project's self-maintained handbook: when a gotcha, surprise, or repeated instruction surfaces in any run, propose one line for the right dev.md section that would have prevented it — fold into existing lines, never append a log — and add it on the user's yes.
9
13
  <!-- vsk-dev:end -->
@@ -1,23 +1,59 @@
1
1
  # Dev profile — {{owner/repo}}
2
2
 
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
+
3
5
  repo: {{owner/repo}} · default branch {{branch}}
4
6
  stack: {{one line, or "see .vegastack/arch.md"}}
5
7
  commands: test `{{test}}` · build `{{build}}` · dev `{{dev}}`
8
+ authority: {{ordered — e.g. "CONTRIBUTING.md → this file → skill defaults"; delete the line when this file is the only process doc}}
6
9
 
7
10
  ## Knobs
8
11
 
9
12
  review: subagent # subagent | cross-agent | cross-agent-risky
10
13
  ui-evidence: playwright # playwright | none
11
- evidence-repo: {{owner}}/dev-review-assets
12
- gates: 3 # 3 = approve/PR/merge · 2 = approve/ship
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
+ gates: 3 # 3 = approve/PR/merge · 2 = approve + one "ship it" · 1 = direct-to-main, ship word merges locally and pushes, no PR
13
16
  tests: required # required | logic-only
14
17
  merge: squash
15
- branch: <type>/<issue>-<slug> # type: feat | fix | docs | chore | refactor
16
- decisions: docs/decisions.md
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
20
+ changelog: {{changesets | keep-a-changelog | pubspec+changelog | none (reason)}}
21
+ decisions: .vegastack/decisions.md
22
+ release: on-request # per-merge = Ship runbook runs as part of shipping · on-request = only when the operator says "release"
23
+
24
+ ## Ship — what happens after merge, in order
25
+
26
+ Line prefixes: `auto:` (agent just does it) · `ask:` (operator's word first) · `guard:` (deterministic check run locally at this position, its runnable command inline on the line; the CI copy is the backstop).
27
+
28
+ - {{playbook-drafted release steps for the detected stack}}
29
+ - {{guard: lines from the playbook}}
30
+ - {{post-release verification — how to see the release/deploy landed}}
31
+ - {{rollback one-liner from the playbook}}
32
+ - {{versioning policy in 1–2 bullets when the project has one; delete the section's placeholders — "Ship: merge only" is a valid runbook}}
33
+
34
+ ## Verify — how to see it working (pre-merge)
35
+
36
+ - {{start: command · URL}}
37
+ - {{the flows worth smoke-checking after a change}}
38
+
39
+ ## Environments
40
+
41
+ - {{environments and their targets; which the agent may touch}}
42
+ - {{where secret NAMES are defined — values never appear in this file}}
43
+
44
+ ## Design
45
+
46
+ - {{pointers: design system / component rules / .vegastack/arch.md / UI conventions}}
47
+
48
+ ## Decisions
49
+
50
+ 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
+
52
+ - DD-MM-YYYY (github-username) — the decision
17
53
 
18
54
  ## Stop and ask
19
55
 
20
- Dark execution ends and the user decides when work would involve: a change of scope or product behavior, a significant new dependency or runtime, spending money, anything destructive or touching production, or a blocker the brief cannot resolve.
56
+ Dark execution ends and the operator decides when work would involve: a change of scope or product behavior, a significant new dependency or runtime, spending money, anything destructive or touching production, or a blocker the brief cannot resolve. Nothing ships without the operator's explicit instruction — see the AGENTS.md dev section.
21
57
 
22
58
  ## Project rules
23
59
 
@@ -8,6 +8,7 @@ Verified mechanics of the two harnesses this workflow targets. Everything here i
8
8
  - `CLAUDE.local.md` in the project root loads after CLAUDE.md and is meant to be gitignored — leave it alone; it is the user's personal file. <!-- source: CC-MEMORY -->
9
9
  - Project skills load from `.claude/skills/<name>/SKILL.md`; personal skills from `~/.claude/skills/`. <!-- source: CC-SKILLS -->
10
10
  - The structured question tool is **AskUserQuestion**. It is unavailable in non-interactive runs (`claude -p`); a configurable timeout can auto-submit pre-selected options. <!-- source: CC-TOOLS -->
11
+ - Hooks live in settings files (`.claude/settings.json` project-level) under a `hooks` key mapping event names to command entries. The `Stop` event fires when Claude finishes a turn; its stdin JSON includes `session_id`, `stop_hook_active`, and `last_assistant_message`; a hook keeps the agent going by emitting `{"decision": "block", "reason": "…"}` (or exit 2 with the reason on stderr) — `reason` is shown to the agent. `SessionEnd` cannot block. `SubagentStop` is a separate event — leave it unwired so subagents don't fire nudges. <!-- source: CC-HOOKS -->
11
12
 
12
13
  ## Codex
13
14
 
@@ -15,6 +16,31 @@ Verified mechanics of the two harnesses this workflow targets. Everything here i
15
16
  - Skills load from `.agents/skills/` in each directory from the working directory up to the repo root, plus `~/.agents/skills/` for the user. Frontmatter requires only `name` and `description`; an optional `agents/openai.yaml` adds display metadata and invocation policy. <!-- source: CODEX-SKILLS -->
16
17
  - The structured question tool is **`request_user_input`** — collaboration-mode-gated (available in Plan mode; elsewhere it fails fast with a clear error, and it is not available to subagents). Community posts mention an "ask_user_question"/"clarify" tool; that is a proposal, not a shipped tool — do not design against it. <!-- source: CODEX-SKILLS -->
17
18
  - Non-interactive mode is `codex exec`: fully unattended, human-input tools unavailable, AGENTS.md discovery unchanged. <!-- source: CODEX-EXEC -->
19
+ - Codex has lifecycle hooks too: configured in `~/.codex/hooks.json` / `<repo>/.codex/hooks.json` (or inline `[hooks]` tables in config.toml); project-local hooks load only when the repo's `.codex/` layer is trusted, and older Codex versions gate the engine behind a features flag. Its `Stop` event mirrors Claude Code's: stdin JSON with `stop_hook_active` and `last_assistant_message`, `{"decision": "block", "reason": "…"}` or exit 2 to continue the turn, `SubagentStop` separate. <!-- source: CODEX-HOOKS -->
20
+
21
+ ## Decision-capture Stop hook (optional, offered in Round C)
22
+
23
+ Because both Stop contracts match, one shared script serves both harnesses. Write it to `.vegastack/hooks/decision-nudge.sh` and wire it as `sh .vegastack/hooks/decision-nudge.sh` (no exec bit needed). Only on the user's explicit yes, and only the `Stop` event. The wiring shape is doubly nested — matcher groups each holding their own `hooks` array — identical in Claude Code's `.claude/settings.json` and Codex's `<repo>/.codex/hooks.json` (merge into existing hook config, never overwrite): <!-- source: CC-HOOKS --> <!-- source: CODEX-HOOKS -->
24
+
25
+ ```json
26
+ { "hooks": { "Stop": [ { "hooks": [ { "type": "command", "command": "sh .vegastack/hooks/decision-nudge.sh" } ] } ] } }
27
+ ```
28
+
29
+ ```sh
30
+ #!/bin/sh
31
+ # Nudge at most once per session, and only when the last message smells directional.
32
+ command -v jq >/dev/null 2>&1 || exit 0 # no jq -> no nudge, never break the harness
33
+ input=$(cat)
34
+ [ "$(printf '%s' "$input" | jq -r '.stop_hook_active')" = "true" ] && exit 0
35
+ marker="${TMPDIR:-/tmp}/vsk-decision-nudge-$(printf '%s' "$input" | jq -r '.session_id')"
36
+ [ -e "$marker" ] && exit 0
37
+ printf '%s' "$input" | jq -r '.last_assistant_message // ""' \
38
+ | grep -qiE 'decided|chose|instead of|convention|from now on|standardi[sz]|switch(ed|ing)? to' || exit 0
39
+ : > "$marker"
40
+ printf '%s' '{"decision":"block","reason":"Before finishing: if this session settled a directional choice (the Decisions test in .vegastack/dev.md), propose one dated register line and ask the user to confirm; otherwise finish."}'
41
+ ```
42
+
43
+ The marker lives under the OS temp dir, never inside the repo. The prose instruction in the AGENTS.md dev section is the portable base on both harnesses; this hook is a deterministic nudge on top, not a replacement.
18
44
 
19
45
  ## What this means for the dev skills
20
46
 
@@ -0,0 +1,124 @@
1
+ # Stack playbooks
2
+
3
+ Detection-to-draft mapping for Step 1 and Round C: match the signals, propose the matching draft for `.vegastack/dev.md`, confirm with the user. Every draft is a starting proposal — the user's edits win. Mechanism names here are long-stable; anything version- or vendor-volatile lives in [harness-facts](harness-facts.md) under the refresh contract. Non-GitHub hosting is out of scope for this workflow — the issue/label machinery is GitHub-native.
4
+
5
+ Each playbook fills the same six slots: **detect** (file signals) · **ship draft** (runbook lines) · **changelog** (the `changelog:` knob value and what dev-implement adds per change) · **version identity** (the one place a version lives) · **guards** (from the library below) · **rollback** (one line for `## Ship`).
6
+
7
+ ## npm package (published)
8
+
9
+ - **Detect:** `.changeset/config.json`, or a publish workflow / `"private": false` package.json with a registry config.
10
+ - **Ship draft:**
11
+ - `auto: apply pending changesets (changeset version) and refresh the lockfile, commit as chore: release <version>`
12
+ - `ask: tag v<version> and push — the tag triggers the publish pipeline`
13
+ - `guard: tag matches the package version` · `guard: changelog has an entry for the tagged version`
14
+ - `auto: confirm the registry shows the new version; report old → new`
15
+ - **Changelog:** `changesets`. Per behavior-changing branch, dev-implement writes `.changeset/<slug>.md` **directly** — frontmatter `"<package-name>": <patch|minor|major>` (from the brief's version-impact line) plus a one-paragraph summary. `changeset add` (the bare `changeset` prompt) is interactive; never invoke it in a dark run — `changeset version` at release time is the only CLI use. The release changelog is changesets-written — never hand-edited.
16
+ - **Version identity:** `package.json` `version`, changesets-managed. Monorepos: identity is per-package; changesets handles multiple packages natively — the guard reads the released package's manifest. A private workspace root carries **no** version field (nothing maintains it; delete it rather than let it drift).
17
+ - **Guards:** changeset-presence (PR-time) · tag↔version · changelog-entry.
18
+ - **Rollback:** `Rollback is roll-forward: revert on main, release previous-good as a new patch, deprecate the bad version on the registry.`
19
+
20
+ ## Node web app (deployed, not published — Next.js, Vite, Express, …)
21
+
22
+ - **Detect:** framework config (`next.config.*`, `vite.config.*`, …) with a deploy workflow, platform config (wrangler/Vercel/Netlify), or Dockerfile — and no publish machinery.
23
+ - **Ship draft:**
24
+ - `auto: move the [Unreleased] changelog entries under a new dated version heading, commit`
25
+ - `ask: deploy to production (<the project's deploy command or pipeline>)`
26
+ - `guard: changelog has an entry for the version being released` (when the app versions releases; date-based releases skip the version guard)
27
+ - `auto: smoke-check the deployed URL against the Verify flows; report`
28
+ - **Changelog:** `keep-a-changelog`. Per behavior-changing branch, dev-implement adds one bullet under `## [Unreleased]` (Added/Changed/Fixed/Removed subsection as fits).
29
+ - **Version identity:** `package.json` `version` + the changelog heading, when the project versions releases at all; many apps release by date/deploy — then the changelog heading is the identity and no manifest bump exists.
30
+ - **Guards:** changelog-entry; tag↔version only when the project tags releases.
31
+ - **Rollback:** `Rollback is redeploying the previous known-good build/revision via the platform; a code fix rolls forward through the normal flow.`
32
+
33
+ ## Flutter app
34
+
35
+ - **Detect:** `pubspec.yaml` with a `flutter:` section.
36
+ - **Ship draft:**
37
+ - `auto: bump pubspec version (semver + incremented build number), move [Unreleased] changelog entries under the new version, commit`
38
+ - `ask: build and submit the store release / trigger the release pipeline`
39
+ - `guard: tag matches the pubspec version` · `guard: changelog has an entry for the version`
40
+ - `auto: report submitted version + build number`
41
+ - **Changelog:** `pubspec+changelog` — keep-a-changelog `CHANGELOG.md` (also the source for store release notes), with the version bump living in `pubspec.yaml`.
42
+ - **Version identity:** `pubspec.yaml` `version: x.y.z+build` — semver plus a build number the stores require to strictly increase.
43
+ - **Guards:** tag↔version (pubspec read) · changelog-entry.
44
+ - **Rollback:** `Stores do not roll back a released binary: halt the staged rollout if still in progress, then roll forward with a fixed build.`
45
+
46
+ ## Python (package or app)
47
+
48
+ - **Detect:** `pyproject.toml`.
49
+ - **Ship draft:**
50
+ - `auto: bump [project] version, move [Unreleased] changelog entries under it, commit`
51
+ - `ask: tag v<version> and push — tag triggers the publish/deploy pipeline`
52
+ - `guard: tag matches the pyproject version` · `guard: changelog has an entry for the version`
53
+ - **Changelog:** `keep-a-changelog`.
54
+ - **Version identity:** `pyproject.toml` `[project] version` (a project pinning it elsewhere names that place in dev.md instead — one place only).
55
+ - **Guards:** tag↔version (pyproject read) · changelog-entry.
56
+ - **Rollback:** `Roll forward: yank the bad release on the index if supported, publish previous-good as a new patch.`
57
+
58
+ ## Go module
59
+
60
+ - **Detect:** `go.mod`.
61
+ - **Ship draft:**
62
+ - `auto: move [Unreleased] changelog entries under the new version, commit`
63
+ - `ask: tag v<version> and push — the tag IS the release for module consumers`
64
+ - `guard: changelog has an entry for the tagged version`
65
+ - **Changelog:** `keep-a-changelog`.
66
+ - **Version identity:** the git tag `vX.Y.Z` — Go modules carry no manifest version, so no tag↔version guard exists or is needed.
67
+ - **Guards:** changelog-entry.
68
+ - **Rollback:** `Roll forward and add a retract directive for the bad version in go.mod, released as a new patch.`
69
+
70
+ ## Generic / none of the above
71
+
72
+ - **Detect:** none of the signals matched.
73
+ - **Ship draft:** `Ship: merge only` — a valid runbook.
74
+ - **Changelog:** `keep-a-changelog` if the user wants a history; otherwise `none (<reason>)`. A project with an existing convention that matches no knob value records `none (<its convention>)` — the knob never silently mismatches reality.
75
+ - **Version identity / guards / rollback:** none until machinery appears; sections render their TODO line and the self-heal rule covers the rest.
76
+
77
+ ## Guard library
78
+
79
+ Each guard is one small shell block with **two uses**: a `guard:` line in `## Ship` that dev-ship runs locally at its runbook position (fast feedback), and the same block as a CI step (the backstop that actually blocks a bad publish — order it **before** the publish step, and offer to write it on the user's yes). Render every `guard:` line in dev.md with its runnable command inline, variables bound (dev-ship reads dev.md, not this file — a guard without its command is an improvisation invitation). Adapt paths/commands per the stack; never offer a guard whose machinery the project lacks.
80
+
81
+ **changelog-entry** — fail when the changelog has no section for the version. Handles both heading styles (`## 1.2.3` changesets, `## [1.2.3]` keep-a-changelog):
82
+
83
+ ```sh
84
+ awk -v ver="$VERSION" '
85
+ $0 == "## " ver || index($0, "## [" ver "]") == 1 { inside = 1; next }
86
+ inside && /^## / { exit }
87
+ inside && /^\[.*\]:/ { next }
88
+ inside { print }
89
+ ' "$CHANGELOG" | grep -q '[^[:space:]]' \
90
+ || { echo "no changelog entry for $VERSION in $CHANGELOG"; exit 1; }
91
+ ```
92
+
93
+ (The `^\[.*\]:` skip keeps keep-a-changelog's trailing link-reference block from counting as entry content.)
94
+
95
+ **tag↔version** — fail when the tag disagrees with the manifest:
96
+
97
+ ```sh
98
+ # VERSION per stack ($TAG is the tag being created locally, or $GITHUB_REF_NAME in CI):
99
+ # npm: node -p "require('./package.json').version"
100
+ # Flutter: sed -n 's/^version:[[:space:]]*"\{0,1\}\([0-9][^+" ]*\).*/\1/p' pubspec.yaml
101
+ # Python: python3 -c "import tomllib; print(tomllib.load(open('pyproject.toml','rb'))['project']['version'])" # tomllib needs Python >= 3.11; older: tomli
102
+ [ "v$VERSION" = "$TAG" ] || { echo "tag $TAG != manifest version $VERSION"; exit 1; }
103
+ ```
104
+
105
+ **changeset-presence** (npm stacks, PR-time) — fail when a behavior-changing branch carries no changeset:
106
+
107
+ ```sh
108
+ npx changeset status --since "origin/$DEFAULT_BRANCH" # or bunx, per the project's runner
109
+ ```
110
+
111
+ Blind spot: `changeset status` sees changed **workspace packages** only — content outside any package (docs, repo tooling) is invisible to it, so the evidence comment's `**Changelog:**` line stays the human check.
112
+
113
+ ## Greenfield playbook
114
+
115
+ No git repo or no origin remote is a greenfield run, not an error. Detection has nothing to read, so the interview supplies intent:
116
+
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
+ 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).
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
+
122
+ ## Decision-capture hooks
123
+
124
+ The Stop-hook recipe (both harnesses), its wiring, and the hook API facts live in [harness-facts](harness-facts.md) — volatile vendor surface under the refresh contract. Offer it in Round C; write hook files only on the user's explicit yes.
@@ -4,10 +4,10 @@ Instructions for the scheduled refresh agent (and any human running a manual ref
4
4
 
5
5
  ## What this skill claims
6
6
 
7
- - **Durable rules** (SKILL.md, assets): the detect-then-ask discipline, the interview rounds and knobs, the marked-section AGENTS.md contract, the label set, the defaults-plus-TODO fallback. Versionless; the refresh agent NEVER edits these — if evidence invalidates one, open an issue quoting it.
8
- - **Volatile facts**: everything in `references/harness-facts.md` — Claude Code memory/import/skill/question-tool mechanics and Codex AGENTS.md/skills/question-tool/exec mechanics. That file is the only refresh-tracked file; its sentences carry `<!-- source: SOURCE-ID -->` markers matching the registry.
7
+ - **Durable rules** (SKILL.md, assets): the detect-then-ask discipline, the interview rounds and knobs, the marked-section AGENTS.md contract, the default label set, the defaults-plus-TODO fallback. Versionless; the refresh agent NEVER edits these — if evidence invalidates one, open an issue quoting it.
8
+ - **Volatile facts**: everything in `references/harness-facts.md` — Claude Code memory/import/skill/question-tool/hooks mechanics and Codex AGENTS.md/skills/question-tool/exec/hooks mechanics, plus the shared Stop-hook recipe. That file is the only refresh-tracked file; its sentences carry `<!-- source: SOURCE-ID -->` markers matching the registry. `references/stack-playbooks.md` carries only long-stable mechanism names (changesets and its `status`/`version` CLI, keep-a-changelog, store release flows, `gh` subcommands and flags like `--add-readme`, the GitHub contents API shape) — deliberately treated as durable, no pins; if one drifts, open an issue rather than editing in a refresh run.
9
9
 
10
10
  ## How to refresh
11
11
 
12
- 1. Run the shared runner against this registry; on drift, read the changed page and propose edits to the marked sentences in `references/harness-facts.md` — and to the three harness-mechanism mentions in SKILL.md that mirror it (the two question tools in Step 2, the `@AGENTS.md` import in Step 3) — in the same PR as the registry update.
12
+ 1. Run the shared runner against this registry; on drift, read the changed page and propose edits to the marked sentences in `references/harness-facts.md` — and to the harness-mechanism mentions in SKILL.md that mirror it (the two question tools in Step 2, the `@AGENTS.md` imports in Round C and Step 3, the Round C Stop-hook offer) — in the same PR as the registry update.
13
13
  2. Never auto-apply harness behavior changes; a human reviews — these facts change what dev-setup writes into user projects.
@@ -126,6 +126,52 @@
126
126
  "checksum": "44aa6d490f4567c0b1fb064deab642bfac590f0e721228e0c53fe738db191026",
127
127
  "retrievedAt": "2026-08-27T08:19:24.132Z"
128
128
  },
129
+ {
130
+ "id": "CC-HOOKS",
131
+ "service": "Claude Code hooks (Stop event, settings.json wiring, block/reason contract)",
132
+ "kind": "official-docs",
133
+ "stability": "vendor-docs",
134
+ "thresholdDays": 14,
135
+ "critical": false,
136
+ "urls": {
137
+ "primary": "https://code.claude.com/docs/en/hooks.md"
138
+ },
139
+ "versionDetection": {
140
+ "type": "manual-review"
141
+ },
142
+ "topics": [
143
+ "claude-code-hooks"
144
+ ],
145
+ "affected": [
146
+ "references/harness-facts.md",
147
+ "SKILL.md"
148
+ ],
149
+ "checksum": "936bd443066df08a514972673358e102fd23b80bee9a289d3d53a1ed8aca1a64",
150
+ "retrievedAt": "2026-08-27T14:41:39.189Z"
151
+ },
152
+ {
153
+ "id": "CODEX-HOOKS",
154
+ "service": "Codex hooks (hooks.json locations, trust gating, Stop event contract)",
155
+ "kind": "official-docs",
156
+ "stability": "vendor-docs",
157
+ "thresholdDays": 14,
158
+ "critical": false,
159
+ "urls": {
160
+ "primary": "https://learn.chatgpt.com/docs/hooks.md"
161
+ },
162
+ "versionDetection": {
163
+ "type": "manual-review"
164
+ },
165
+ "topics": [
166
+ "codex-hooks"
167
+ ],
168
+ "affected": [
169
+ "references/harness-facts.md",
170
+ "SKILL.md"
171
+ ],
172
+ "checksum": "430f2d85a4791dc695bcdc063193c225343104a342e8adf80a544ab87ae4223d",
173
+ "retrievedAt": "2026-08-27T14:41:39.189Z"
174
+ },
129
175
  {
130
176
  "id": "CODEX-EXEC",
131
177
  "service": "Codex non-interactive mode (codex exec)",
@@ -1,33 +1,44 @@
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. Use when the user says "make the PR", "open a pull request" for an issue, "ship it", "merge it", "merge issue 12", or asks to close out a reviewed issue. Verifies the issue is at for-you with evidence, links the PR to the issue, and squash-merges on the separate merge instruction. Not for implementing issues (dev-implement) or writing and approving them (dev-intake).
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).
4
4
  ---
5
5
 
6
6
  # dev-ship
7
7
 
8
- Two gates, each one sentence from the user, each spent when used: their words asking for a PR authorize the PR and nothing more; their words asking to merge authorize the merge. With `gates: 2` in `.vegastack/dev.md`, one "ship it" covers both that's the only case where they combine. Passing checks, PR permissions, and the calendar authorize nothing by themselves.
8
+ Gates spent only by the user's words: their words asking for a PR authorize the PR and nothing more; their words asking to merge authorize the merge. The dev.md `gates` knob sets how many actions one word covers — `3` keeps PR and merge as separate words, `2` lets one "ship it" cover both, `1` is direct-to-main (the ship word merges locally and pushes; no PR object, everything else identical). Passing checks, PR permissions, and the calendar authorize nothing by themselves.
9
9
 
10
- Nearest neighbor: `dev-implement` produces the `for-you` issue with its evidence comment; ship packages and lands it. Corrections found here go back through implement's corrections loop.
10
+ Nearest neighbor: `dev-implement` produces the `for-operator` issue with its evidence comment; ship packages and lands it. Corrections found here go back through implement's corrections loop.
11
11
 
12
12
  ## Gate 1 — the PR
13
13
 
14
14
  On the user's PR instruction:
15
15
 
16
- - Verify the issue is at `for-you` with the evidence comment present, and the branch is pushed. Not there yet → say what's missing instead of creating a premature PR.
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.
17
+ - 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.
17
18
  - `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.
18
19
  - No draft PRs unless the user asks for one.
19
- - 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.
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
+ - 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.
20
22
  - 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.
21
23
 
24
+ 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
+
22
26
  ## Gate 2 — the merge
23
27
 
24
- On the user's separate merge instruction:
28
+ On the user's merge instruction:
25
29
 
26
30
  - 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.
27
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.
28
- - Merge per the dev.md `merge` knob (default `gh pr merge --squash`). `Closes #<n>` closes the issue; confirm both happened.
29
- - If the issue carries a `Decision:` comment (the dev-intake convention), append its one dated line to the register dev.md names (`decisions:` knob) nowthe register is append-only and this is its moment.
33
+ - 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
+ - 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
+
36
+ ## After the merge — the Ship runbook
37
+
38
+ 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
+
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.
30
41
 
31
42
  ## Report
32
43
 
33
- One short confirmation each gate: what was created or merged, the link, and anything that still needs the user (failing check, moved head, missing evidence). When a gate's condition isn't met, the answer is what's missing — the gate itself never gets skipped to be helpful.
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.
@@ -1,4 +1,4 @@
1
1
  interface:
2
2
  display_name: "dev-ship"
3
- short_description: "Open the PR and merge, each on the user's word"
3
+ short_description: "PR, merge, and release runbook, each on the user's word"
4
4
  default_prompt: "Use $dev-ship to create the PR or merge this issue's work."
@@ -0,0 +1,36 @@
1
+ # Runbook execution
2
+
3
+ How dev-ship runs a dev.md `## Ship` section and the ship situations the gates themselves don't spell out.
4
+
5
+ ## Line prefixes
6
+
7
+ - `auto:` — do it, report the outcome.
8
+ - `ask:` — stop and wait for the operator's word for that step; the word that opened the gate does not cover an `ask:` line.
9
+ - `guard:` — a deterministic check. Run its command locally at this position in the runbook order; the CI copy of the same guard is the backstop and stays authoritative for anything that publishes. A failing guard stops the sequence exactly like a failing `auto:` step.
10
+
11
+ A failing step stops the runbook at that step: report what failed and what remains unrun, hand the failure to the operator (or to dev-implement's corrections loop when it's code), and never skip ahead. A gotcha — a step that surprised you or an instruction the operator had to repeat — is one proposed line folded into the runbook; if the gotcha is directional rather than operational, it's a decision-register candidate instead (on the user's yes, per dev.md `## Decisions`).
12
+
13
+ ## Release batching (`release: on-request`)
14
+
15
+ "Release" covers everything merged since the last release. Enumerate it: `git log <last-tag>..HEAD --oneline` (no tags yet → everything since the first commit). Before running the release steps, check completeness — every behavior-changing merge in that range has its changelog entry per the `changelog:` knob. A missing entry is corrections work on a fresh branch, not a reason to hand-write the release record.
16
+
17
+ ## Direct-to-main (`gates: 1`)
18
+
19
+ The ship word authorizes: merge the task branch onto the default branch locally per the `merge:` knob, push, done — no PR object. Everything else is unchanged: the issue must be `for-operator` with its evidence comment, guards run, the changelog entry must exist. Closing the issue: with `merge: squash`, put `Closes #<n>` in the squash commit message; with any other merge style there is no new commit to carry it — after pushing, close explicitly with `gh issue close <n> --comment "merged to <default> as <sha>"`. Either way, confirm the issue actually closed. Branch protection that blocks direct pushes breaks this mode — dev-setup checks at setup time; if it bites later, tell the operator rather than working around it.
20
+
21
+ ## Decisions under compressed gates
22
+
23
+ With `gates: 2` or `1`, the ship word arrives before decisions could be named. Pending `Decision:` lines still get their own naming: acknowledge the word, state "merging will record: …", and act on the operator's confirmation — a decision is never covered by a word that didn't name it. This costs one extra exchange only when decisions are pending. A PR closed without merging hands its pending `Decision:` lines back to the operator (they may stand independently of the implementation's fate) — they are never silently dropped.
24
+
25
+ ## Bot PRs (Renovate, Dependabot, …)
26
+
27
+ A bot PR has no issue, no brief, no evidence comment — and merging it is still shipping. Green checks qualify it; only the operator's explicit word merges it, per PR or per an explicitly named batch ("merge this Renovate batch"). No standing approval exists: a knob, a schedule, or past practice never merges a bot PR. Red-flag updates (majors, security advisories) get named to the operator before their merge word is acted on.
28
+
29
+ ## Rollback and hotfix
30
+
31
+ - Rollback is never a force-push or history rewrite. Follow the Ship section's rollback line — the shape is always roll-forward: revert or fix on the default branch through the normal flow, release/deploy the good state as a new version.
32
+ - A hotfix is a normal issue at higher priority: brief (short is fine), approval, implement, evidence, ship. Urgency compresses the words, never removes them.
33
+
34
+ ## Guard failure at ship time
35
+
36
+ A local `guard:` failure (missing changelog entry, tag/version mismatch) means the branch or release prep is incomplete: route it to dev-implement's corrections loop, get the evidence comment updated, then resume at the failed step. Never edit release artifacts inline just to get past a guard.
@@ -1,3 +1,3 @@
1
1
  # Refresh contract — dev-ship
2
2
 
3
- Evergreen: this skill asserts no version pins, vendor mechanism names beyond long-stable `gh` subcommands, numeric vendor limits, or dated facts — its content is the two-gate discipline, all versionless. Revisit if a future edit introduces a volatile fact.
3
+ Evergreen: this skill asserts no version pins, numeric vendor limits, or dated facts — its content (SKILL.md and `references/runbook.md`) is the gate discipline and runbook-execution mechanics: long-stable `git`/`gh` subcommands only, everything else read from the project's dev.md at run time. Revisit if a future edit introduces a volatile fact.
@@ -5,7 +5,7 @@ description: Maintainer skill for the vegastack-skills repository itself. Use wh
5
5
 
6
6
  # VegaStack Skill Maintainer
7
7
 
8
- Maintenance skill for this repository. Every change under `skills/` must satisfy the per-skill contract and the tri-harness standards below. Obey them in your own edits; enforce them in review. When a rule here disagrees with `CONTRIBUTING.md` or `docs/policies/` at the repo root, those win — then fix this skill.
8
+ Maintenance skill for this repository. Every change under `skills/` must satisfy the per-skill contract and the tri-harness standards below. Obey them in your own edits; enforce them in review. When a rule here disagrees with `CONTRIBUTING.md` or `.vegastack/dev.md` at the repo root, those win — then fix this skill.
9
9
 
10
10
  ## Operating rules
11
11
 
@@ -26,7 +26,7 @@ Maintenance skill for this repository. Every change under `skills/` must satisfy
26
26
  | new skill: should-it-exist gate, scaffolding, the 8-item contract audit, behavioral evals | the `skillify` skill |
27
27
  | release, rename, deprecate, rollback mechanics | [release ops](references/release-ops.md) |
28
28
  | this skill's own freshness contract | [REFRESH](refresh/REFRESH.md), [sources](refresh/sources.json) |
29
- | authoritative repo policy | `CONTRIBUTING.md`, `docs/policies/content-versioning.md`, `docs/policies/release-and-rollback.md` at the repo root |
29
+ | authoritative repo policy | `CONTRIBUTING.md` and `.vegastack/dev.md` at the repo root (release runbook, content semver, rollback) |
30
30
 
31
31
  ## Workflow: scaffold a new skill
32
32
 
@@ -37,7 +37,7 @@ Maintenance skill for this repository. Every change under `skills/` must satisfy
37
37
 
38
38
  ## Workflow: update or maintain
39
39
 
40
- - **Content versioning.** New rules/references and new recorded decisions are MINOR; weakening a normative rule, removing or renaming a skill, or breaking a per-project profile format is MAJOR; factual refreshes (pins, URLs, checksums) are PATCH (`docs/policies/content-versioning.md`).
40
+ - **Content versioning.** New rules/references and new recorded decisions are MINOR; weakening a normative rule, removing or renaming a skill, or breaking a per-project profile format is MAJOR — except pre-1.0 with zero deployed profile consumers, where a profile-format break may ship MINOR per a recorded decision; factual refreshes (pins, URLs, checksums) are PATCH (the content-semver bullet in `.vegastack/dev.md`; detail in [release-ops](references/release-ops.md)).
41
41
  - **Tag volatile claims.** Any sentence carrying a vendor version, mechanism name, or numeric budget gets a source marker comment mapping to an ID in that skill's `refresh/sources.json`, and the registry entry's `affected` list must name the reference it lives in. Untagged volatile facts rot silently.
42
42
  - **Description budgets.** Stay within 1024 chars and keep triggers in the first sentence: Codex truncates its skill list at 2% of the context window / 8,000 chars, Claude Code truncates a skill's always-loaded listing at 1,536 chars — the tail of a long description is the first thing lost.
43
43
  - **Packaged-file changes.** Any add/remove/rename of a packaged file must update that skill's `packages/cli/packaging.json` entry in the same PR.
@@ -48,7 +48,7 @@ Full playbook in [release ops](references/release-ops.md). Short form: a rename
48
48
 
49
49
  ## Workflow: release
50
50
 
51
- Changeset lands with the PR → maintainer runs `bunx changeset version`, `bun install`, commits → tags `v<version>` → tag-driven pipeline runs check, tag↔version guard, npm trusted publishing, SBOM, GitHub release. Two decoupled version identities **package version** (npm, changesets) and **foundation version** (content contract for deployed profiles) must never be conflated; bumping the package must never invalidate a deployed profile. Rollback is roll-forward (publish previous-good as a new patch) plus `npm deprecate` of the bad version; unpublish only within 72 hours and only in addition. Details: [release ops](references/release-ops.md).
51
+ Changeset lands with the PR → maintainer runs `bunx changeset version`, `bun install`, commits → tags `v<version>` → tag-driven pipeline runs check, tag↔version guard, npm trusted publishing, SBOM, GitHub release. One version identity: the package version covers the installer and every bundled skill's content snapshot there is no separate content-contract version, and bumping the package must never invalidate a deployed per-project profile. Rollback is roll-forward (publish previous-good as a new patch) plus `npm deprecate` of the bad version; unpublish only within 72 hours and only in addition. Details: [release ops](references/release-ops.md).
52
52
 
53
53
  ## Workflow: portability check
54
54
 
@@ -1,6 +1,6 @@
1
1
  # Release, rename, and rollback operations
2
2
 
3
- Condensed operational playbook. The authoritative policies live at the repo root `docs/policies/release-and-rollback.md` and `docs/policies/content-versioning.md` and this file must never contradict them; when in doubt, they win.
3
+ The expanded release/rename/rollback detail behind the `## Ship` runbook and content-semver bullet in `.vegastack/dev.md` at the repo root. dev.md is the canonical process doc and wins on any disagreement; this file only elaborates it and must never contradict it.
4
4
 
5
5
  ## Semver for skill content
6
6
 
@@ -23,8 +23,8 @@ profile carries a schema version to validate against.
23
23
 
24
24
  ## Release flow (tag-driven)
25
25
 
26
- 1. Every PR that changes released behavior lands with a changeset (`bunx changeset`) whose bump follows the table above.
27
- 2. Maintainer, at release time: `bunx changeset version` (applies changesets to `packages/cli/package.json` and the changelog), then `bun install` so `bun.lock` does not go stale, commit. Root `CHANGELOG.md` gets a human-readable entry for every release.
26
+ 1. Every PR that changes released behavior lands with a changeset — a `.changeset/<slug>.md` written directly, since the `changeset` add prompt is interactive (`bunx changeset version` at release time is the only CLI use) whose bump follows the table above.
27
+ 2. Maintainer, at release time: `bunx changeset version` (applies changesets to `packages/cli/package.json` and the changelog), then `bun install` so `bun.lock` does not go stale, commit. The release record is `packages/cli/CHANGELOG.md`, changesets-written — never by hand; the root `CHANGELOG.md` is the frozen pre-0.3.0 record pointing there.
28
28
  3. Tag the release commit `v<version>`, push the tag.
29
29
  4. The release workflow runs on the tag: `bun run check`, tag↔version guard, `npm publish` via trusted publishing (OIDC, token-free, provenance by default; idempotently skipped if already on the registry), SBOM, GitHub release. Never pass `--provenance` explicitly — it conflicts with trusted-publishing config.
30
30
 
@@ -4,7 +4,7 @@ Instructions for the scheduled refresh agent (and any human running a manual ref
4
4
 
5
5
  ## What this skill claims
6
6
 
7
- - **Durable content** (`SKILL.md` workflows and operating rules, `references/release-ops.md`): repo process, derived from `docs/policies/*` — the refresh agent NEVER edits these. If a policy doc changes, that is a normal human PR, not a refresh.
7
+ - **Durable content** (`SKILL.md` workflows and operating rules, `references/release-ops.md`): repo process, elaborating `.vegastack/dev.md` — the refresh agent NEVER edits these. If the process changes, that is a normal human PR, not a refresh.
8
8
  - **Volatile standards claims**: sentences marked `<!-- source: SOURCE-ID -->` inside `references/standards.md`. These carry the tri-harness standards — discovery paths, frontmatter rules, numeric context budgets, install surfaces. They are the compliance basis of every skill in this repo, so **all standards changes are semantic drift requiring a human-reviewed PR**: the agent may propose edits to marked sentences only, in the same PR as the registry update that evidences the change, and a maintainer must review before merge. The hard-limits table in `SKILL.md` mirrors several marked sentences; update it in the same PR (this is the one sanctioned SKILL.md touch, and only when a mirrored number changed).
9
9
  - **Volatile layer** (the only file the agent edits freely): `refresh/sources.json` — the source registry and staleness snapshot (checksums, retrieval times).
10
10
 
@@ -24,47 +24,49 @@
24
24
  },
25
25
  "dev-implement": {
26
26
  "files": {
27
- "SKILL.md": "7a3f700cb116b9ad70596851536c74794497f780b0a79626fa44658556eaa005",
27
+ "SKILL.md": "af85df8c37745552001110191a3954976333c7767556fe03cd1f63423e9254a9",
28
28
  "agents/openai.yaml": "1abab383deca54d32749fd9156f9a6211fe96e02e0166dc8a16ff8459ac31b74",
29
- "refresh/REFRESH.md": "013d7f667e489a08bbe12768ca2093fc305113920c1e510b5e96ba335af8de48",
29
+ "refresh/REFRESH.md": "7b854109d897b78b3055bf1ab89517afdca65c12eb65a4d009141e3ee11cf58f",
30
30
  "refresh/sources.json": "7bd883e5b3512e236a909ad6ff20c97f3555785867c31fd728256c7c2c514c74"
31
31
  }
32
32
  },
33
33
  "dev-intake": {
34
34
  "files": {
35
- "SKILL.md": "1b9bdabf2c5aae56d3511972b2800f0328ac07d91dbfa7b23ea3c76dc37ed0f3",
35
+ "SKILL.md": "50318e312c73220f5940110f144ce47dfa4d2191321d5ccfff23814090e689b1",
36
36
  "agents/openai.yaml": "5473d2d3efffc518c07dfa8e6788c6535a5054ceca696119c5856ad265ef5581",
37
- "references/brief-template.md": "c09e6b7964ad524d5c5bad11206df200dea6ab3d72d23bb950b21a2f11b1263a",
37
+ "references/brief-template.md": "98662ec19bca5785a2a9b49aa070ca1d05f1317ea7cc610f913886a11efabcc8",
38
38
  "refresh/REFRESH.md": "bb5265cee98c243c775c3e5fbc59de4b84ab54e828f3290d7c19e47291d66f71",
39
39
  "refresh/sources.json": "7bd883e5b3512e236a909ad6ff20c97f3555785867c31fd728256c7c2c514c74"
40
40
  }
41
41
  },
42
42
  "dev-setup": {
43
43
  "files": {
44
- "SKILL.md": "6fda960bcb0c729c5acac8edfa0e1f40b2f72178c3323f31a77c3e6cdb73b741",
45
- "agents/openai.yaml": "0b53bece25736b0dfbe990c05973f06d83905bfd6314d36fe64ae23d46393941",
46
- "assets/agents-section.md.template": "615b1b69a62ccca351a00cc85435fc663ad6c35a478ddcff6e1ecc777a35f342",
47
- "assets/dev-profile.md.template": "6a586ff63af64098252a4910eb093db9139d66ed849a30cdb5c1af158806db6d",
48
- "references/harness-facts.md": "cabecde6ad6d2a2aa16ad1f6acdb57fd47c335948e734938cb0f7fdb27e085e6",
49
- "refresh/REFRESH.md": "9d5eef2ee900819120334ae9cf7dfc591d33bdeef241bbab6653c11c10ecff30",
50
- "refresh/sources.json": "1c8c5ebd22472b4c88630e3f626986b0aad97da367e122c4c7cd3f9677f41948"
44
+ "SKILL.md": "1b7ad5c64074c8eec35313a19dd50c821fe1b14ffb8366129480c14148c082d1",
45
+ "agents/openai.yaml": "be790c04fdf910e71642cfadf1a7c07c217bf7fad18581610feb4c31a79651f2",
46
+ "assets/agents-section.md.template": "591479cd2beacd5bc80457625fb1e67bf41947f6c2df326a52f0789fa455e8ec",
47
+ "assets/dev-profile.md.template": "eca122d2b8816728243eb40f8d7f41e4a79b55a59a0b6e2ea3b5461df0bb1ee2",
48
+ "references/harness-facts.md": "2be1d81f6a616d40dc865aaeefaf53c61bc13ade4ba1de8fb406c520bf15be40",
49
+ "references/stack-playbooks.md": "112227283dc52e8c215a84b3e97ffb4e07c2b43c6567ae9cdd37985ce7740139",
50
+ "refresh/REFRESH.md": "debda6ab96e899dd7e38309f714e9d65a3fbc53fd8ca68b8156f1348226c87b9",
51
+ "refresh/sources.json": "3deab13addeff1d8c6aac17955694c914064a9eba89eb4c833163448b2351497"
51
52
  }
52
53
  },
53
54
  "dev-ship": {
54
55
  "files": {
55
- "SKILL.md": "18af2ac434b0b5b7b9f04fb32b5558337234d83aa910e06c1ce463f7cf45f722",
56
- "agents/openai.yaml": "4eae616fb85e1e637a73a0aec5b132c644bf9bbc33d3958525c65c8db59ca87f",
57
- "refresh/REFRESH.md": "4c6b46b211604006da943604845127a1f9939cf7e5e31d941452ba02d05db7c9",
56
+ "SKILL.md": "2938dadc743e03a3113ae15a971e376cd72ccfc6ffca4646d80e6fc701e6c621",
57
+ "agents/openai.yaml": "8f18cfd505131557eb4c9f7b7f54e9069f787be4c162403fc30253eed49a06ea",
58
+ "references/runbook.md": "d8ca232f2abd2bd69c2dbdde0eabf22ff47841fa44036b2553a132367d04441b",
59
+ "refresh/REFRESH.md": "06894b54fcbde12d3b5804523f20d5544ba1a18bb5e36960caa4f98454c6203e",
58
60
  "refresh/sources.json": "7bd883e5b3512e236a909ad6ff20c97f3555785867c31fd728256c7c2c514c74"
59
61
  }
60
62
  },
61
63
  "skill-maintainer": {
62
64
  "files": {
63
- "SKILL.md": "d0ee972f67301fcb65973496a5d3f328866f78b8a68aaa528dc1a6a2c229a30f",
65
+ "SKILL.md": "0947155a4e7c87d6f200a1e565013beac8e3093b17e3216d6901a20be863bb21",
64
66
  "agents/openai.yaml": "0b89d4e6416cf20b448f5322f3d7433cfde333d2b4a05b42ed53db3759701fb4",
65
- "references/release-ops.md": "710a2cd61269106e49623dde970f89026915f99910b6a87dfb377f448fef7dd0",
67
+ "references/release-ops.md": "9fe9a09c37c803c3c9a6cfb3f41a523c365fa09b4a30fb431db7af14f03ed7b3",
66
68
  "references/standards.md": "3646d0dd0560a87b333f70febf670b093c89b35111132cdb641b763bf184b02f",
67
- "refresh/REFRESH.md": "7f355694ca24a9bb12f4044570559383cea60680921f476cafd5441ec869f91e",
69
+ "refresh/REFRESH.md": "3955bff5f0a14c83336a73cdbd07ba18d9398996934af87fac4454206cd14023",
68
70
  "refresh/sources.json": "cf38cdf8123a50ea7ef2d1466a87faa648c12e5bc90d9ee9b6ae45632e7d0800"
69
71
  }
70
72
  },