c4d2afa6
Adopt the sprint-delivery workflow, adapted for this repo
a73x 2026-09-06 08:36
Commit message
.agents/skills/sprint-delivery/SKILL.md
| Old | New | ||
|---|---|---|---|
| @@ -0,0 +1,146 @@ | |||
| 1 | --- | ||
| 2 | name: sprint-delivery | ||
| 3 | description: Deliver one working slice of git-collab at a time, with opening and closing cleanup, adversarial review, real-boundary validation, a demonstrable result, and a durable retrospective with checkable actions. Use when the user asks for sprint delivery; ordinary isolated edits do not need it. | ||
| 4 | --- | ||
| 5 | |||
| 6 | # Sprint delivery | ||
| 7 | |||
| 8 | Deliver one useful, working slice at a time. Keep session continuity in the | ||
| 9 | repository, not in the conversation. This skill supplies a workflow; it does | ||
| 10 | not authorize a new sprint, a deployment, or publishing anything. | ||
| 11 | |||
| 12 | Adapted for git-collab from the maintained copy in `~/code/rad/mux` | ||
| 13 | (`docs/skills/sprint-delivery/SKILL.md`), which has closed 49 retrospective | ||
| 14 | actions this way. Differences from that copy are noted where they matter. | ||
| 15 | |||
| 16 | ## Use with any agent | ||
| 17 | |||
| 18 | This file is ordinary Markdown; a skill loader is optional. For tools without | ||
| 19 | automatic discovery, ask: "Read `.agents/skills/sprint-delivery/SKILL.md` and | ||
| 20 | use it to resume the sprint." `AGENTS.md` points here and at `CLAUDE.md`. | ||
| 21 | |||
| 22 | Do not restate rules that live in `CLAUDE.md` — invariants, working rules, | ||
| 23 | gates, and the context-hazard list are there, and one rule per question is | ||
| 24 | itself an invariant. Read it first; this file is the procedure, that file is | ||
| 25 | the law. | ||
| 26 | |||
| 27 | ## Resume from evidence | ||
| 28 | |||
| 29 | Read `CLAUDE.md`, `git status`, recent commits, the current spec/plan, and | ||
| 30 | **the open actions and retained debt in `RETRO.md`** — that file is an input, | ||
| 31 | not a diary. Read relevant sections rather than full history; the repo is | ||
| 32 | large and every token is re-billed each turn. | ||
| 33 | |||
| 34 | Report what is implemented, validated, accepted, and still open as **distinct | ||
| 35 | facts**. A green suite is not user acceptance; say what was verified and what | ||
| 36 | was only asserted. | ||
| 37 | |||
| 38 | ## Run a bounded sprint | ||
| 39 | |||
| 40 | 1. **Scope and acceptance.** Choose the smallest functional deliverable within | ||
| 41 | the authorized plan. Define observable acceptance scenarios. Carry forward | ||
| 42 | applicable `RETRO.md` actions, and honour any debt whose *trigger* this | ||
| 43 | slice fires. Clarify material unknowns early; continue independent work | ||
| 44 | while waiting. | ||
| 45 | 2. **Opening cleanup.** Inspect the touched code for small refactors that help | ||
| 46 | the slice; commit them separately. If the code is ready, say so — there is | ||
| 47 | no cleanup quota. | ||
| 48 | 3. **Implement with adversarial review.** See the pairing below. Deliver | ||
| 49 | through real user interactions and system boundaries, not through unit | ||
| 50 | tests alone. | ||
| 51 | 4. **Closing cleanup.** Explicitly review duplication, obsolete paths, | ||
| 52 | temporary scaffolding, and unnecessary state. Refactor what the slice | ||
| 53 | exposed — a second predicate for a question the codebase already answers is | ||
| 54 | the specific thing to look for. Record retained debt with its location, | ||
| 55 | consequence, and **next owner or trigger**. | ||
| 56 | 5. **Validate and demonstrate.** Run the gates, then verify real behaviour | ||
| 57 | beyond your own agreement. Freeze the source before final checks and rerun | ||
| 58 | affected ones after any change. Demonstrate the result, including its | ||
| 59 | failure paths. | ||
| 60 | 6. **Close and hand off.** Commit validated work. Update the spec/plan status | ||
| 61 | and `RETRO.md`: what was delivered, what worked, lessons, retained debt, and | ||
| 62 | **checkable actions for the next slice**. Promote anything that generalises | ||
| 63 | into `CLAUDE.md` — `RETRO.md` is not read at decision time, `CLAUDE.md` is. | ||
| 64 | Record demo acceptance only when it is given. | ||
| 65 | |||
| 66 | ## Plans state invariants, not just steps | ||
| 67 | |||
| 68 | A plan in `docs/superpowers/plans/` is a hypothesis, not an authority. The only | ||
| 69 | bug in the lease slice came from a plan step that was implemented faithfully | ||
| 70 | (2026-09-06: it said delete the row, which resets the fencing counter). So: | ||
| 71 | |||
| 72 | - Write the **invariant** beside the steps that must preserve it, and check new | ||
| 73 | steps against `CLAUDE.md`'s invariants section. | ||
| 74 | - A step that contradicts an invariant is a **bug in the plan**, to be fixed in | ||
| 75 | the plan document — not worked around in the code. | ||
| 76 | - Before writing the happy path, enumerate the **boundary members**: empty, | ||
| 77 | single, first/root, duplicate or already-seen, freed-then-reused. Five | ||
| 78 | file-history bugs and one lease bug were all this one shape. | ||
| 79 | |||
| 80 | ## Pairing and review | ||
| 81 | |||
| 82 | **Independent review is the goal; sequential self-review is the fallback.** | ||
| 83 | Where subagents are available, use one economical implementer and one capable | ||
| 84 | adversarial reviewer, give each the deliverable, file paths, edit ownership, | ||
| 85 | constraints, acceptance checks, and its partner's name, and have the reviewer | ||
| 86 | send concrete findings — trigger, consequence, expected behaviour — directly to | ||
| 87 | the implementer. Re-review changed parts, not the whole slice, each round. | ||
| 88 | |||
| 89 | Where they are not available (the common case in this repo today), implement | ||
| 90 | and then make a **separate, deliberately hostile review pass** over the diff, | ||
| 91 | and **disclose that the review was not independent**. Do not claim a check ran | ||
| 92 | that did not. Keep the same acceptance scenarios, gates, demo, and | ||
| 93 | retrospective either way. | ||
| 94 | |||
| 95 | Escalate a specific hard problem to a stronger model when justified; do not | ||
| 96 | silently inherit an expensive one. | ||
| 97 | |||
| 98 | ## Validation that answers the claim | ||
| 99 | |||
| 100 | Gates: `make lint` before a commit, `make ci` before delivery, | ||
| 101 | `cargo clippy --all-targets` silent. **The baseline is not green** — see | ||
| 102 | `CLAUDE.md`'s Gates section for the ten known failures and why. Consequences | ||
| 103 | for this workflow: | ||
| 104 | |||
| 105 | - `cargo test --no-fail-fast` is the only way to see every target. | ||
| 106 | - A new failure must be told apart from those ten **by name**, and named in the | ||
| 107 | report. "Same as before" is not a verification. | ||
| 108 | - Never answer "did I break this?" by touching the index or HEAD. Use | ||
| 109 | `git worktree add --detach /tmp/base-check <ref>`. | ||
| 110 | |||
| 111 | Ask the outside about the inside — a component reporting on itself cannot catch | ||
| 112 | itself being wrong. In this repo that means: | ||
| 113 | |||
| 114 | - Keys come from `ssh-keygen`, never our own encoder; SSH behaviour is asserted | ||
| 115 | through the real `ssh` client, and git behaviour through real `git`. | ||
| 116 | - Server work goes through `tests/common/mod.rs::ServerHarness`, which runs a | ||
| 117 | real `git-collab-server` subprocess. A claim about two principals racing | ||
| 118 | needs two authorized keys, not one key twice. | ||
| 119 | - `--json` output is the machine-checkable oracle; assert on it rather than on | ||
| 120 | prose. Prose abbreviates ids, JSON does not. | ||
| 121 | - Capture `$?` before piping: `cargo test | grep -c ok` reports grep's status. | ||
| 122 | |||
| 123 | ## Demonstrating a CLI and a web UI | ||
| 124 | |||
| 125 | git-collab has no GUI to record, so a demo is: | ||
| 126 | |||
| 127 | - **Transcripts** of the real binaries doing the real thing, including the | ||
| 128 | failure paths — a refused claim and a lost race, not only the happy one. | ||
| 129 | - **Rendered pages** from a live server for anything the web UI shows. | ||
| 130 | - **`README.md` checked against reality.** It is where a claim about the CLI's | ||
| 131 | output gets verified; writing the section is how the un-abbreviated lease ids | ||
| 132 | were caught. If the README and the binary disagree, one of them is a bug. | ||
| 133 | |||
| 134 | Do not quote a performance number measured in a debug build. | ||
| 135 | |||
| 136 | ## Repository hygiene | ||
| 137 | |||
| 138 | - **Branch before the first commit of a slice.** Committing onto the base | ||
| 139 | branch renders an empty diff in Delta's Changes view while the work piles up | ||
| 140 | invisibly. | ||
| 141 | - **Stage by path, never `git add -A`.** | ||
| 142 | - Commit messages are plain imperative ("Enforce one review vote per author per | ||
| 143 | revision"). Keep each task's commit separate; the history should tell the | ||
| 144 | feature's story. | ||
| 145 | - Do not embed current phase numbers, commit ids, or temporary URLs in this | ||
| 146 | skill. | ||
.gitignore
| Old | New | ||
|---|---|---|---|
| @@ -1,3 +1,7 @@ | |||
| 1 | /target | 1 | /target |
| 2 | /man | 2 | /man |
| 3 | /.claude/worktrees/ | 3 | /.claude/worktrees/ |
| 4 | # Agent scratch: tool markers and brainstorm state, not project files. | ||
| 5 | # Untracked and unignored is how `git add -A` once swept these into a commit. | ||
| 6 | /.codex | ||
| 7 | /.superpowers/ | ||
AGENTS.md
| Old | New | ||
|---|---|---|---|
| @@ -0,0 +1,14 @@ | |||
| 1 | # Agent instructions | ||
| 2 | |||
| 3 | Read [CLAUDE.md](CLAUDE.md) for this repository's invariants, working rules, | ||
| 4 | gates and context hazards; those instructions apply to every coding agent. | ||
| 5 | The invariants section is load-bearing — a plan step that contradicts one is a | ||
| 6 | bug in the plan. | ||
| 7 | |||
| 8 | When the user asks for sprint delivery, read and follow | ||
| 9 | [the sprint-delivery skill](.agents/skills/sprint-delivery/SKILL.md). It is | ||
| 10 | ordinary Markdown and can be followed without a skill loader. Ordinary | ||
| 11 | isolated edits do not require the sprint workflow. | ||
| 12 | |||
| 13 | Before scoping a slice, read the open actions and retained debt in | ||
| 14 | [RETRO.md](RETRO.md). | ||
RETRO.md
| Old | New | ||
|---|---|---|---|
| @@ -111,9 +111,11 @@ judgement or process. | |||
| 111 | - [ ] Add a `make base-check REF=<ref>` target wrapping | 111 | - [ ] Add a `make base-check REF=<ref>` target wrapping |
| 112 | `git worktree add --detach` + test + `worktree remove`, so the safe way to | 112 | `git worktree add --detach` + test + `worktree remove`, so the safe way to |
| 113 | inspect a baseline is one command. A note alone demonstrably did not hold. | 113 | inspect a baseline is one command. A note alone demonstrably did not hold. |
| 114 | - [ ] Add the boundary-member checklist (empty, single, first/root, | 114 | - [x] Add the boundary-member checklist (empty, single, first/root, |
| 115 | duplicate/already-seen, freed-then-reused) to the plan-writing routine, and | 115 | duplicate/already-seen, freed-then-reused) to the plan-writing routine, and |
| 116 | require plans to state invariants beside steps. | 116 | require plans to state invariants beside steps. Evidence: the "Plans state |
| 117 | invariants, not just steps" section of | ||
| 118 | `.agents/skills/sprint-delivery/SKILL.md`, adopted 2026-09-06. | ||
| 117 | 119 | ||
| 118 | ### Retained debt | 120 | ### Retained debt |
| 119 | 121 | ||
| @@ -130,6 +132,7 @@ judgement or process. | |||
| 130 | at any plausible size (one row per ever-claimed issue) and deliberate — the | 132 | at any plausible size (one row per ever-claimed issue) and deliberate — the |
| 131 | rows carry the fencing high-water mark — but it is unbounded growth with no | 133 | rows carry the fencing high-water mark — but it is unbounded growth with no |
| 132 | sweeper. | 134 | sweeper. |
| 133 | - **Whoever tracks this file:** `RETRO.md` is still untracked in git. An | 135 | - **Whoever runs the next slice:** the sprint-delivery workflow is adopted but |
| 134 | untracked retro cannot be reviewed, referenced from a commit, or read by | 136 | unexercised — no slice has been delivered under it, and its independent-review |
| 135 | anyone else, which is part of why its lessons did not propagate. | 137 | step degrades to a disclosed self-review while subagents are unavailable here. |
| 138 | The first real use is also its test. | ||