Commit ed52e19
docs(skills): add the epic-closeout skill (#170)
## What this is
Promotes the orchestrator epic close-out **sequence** out of the one
epic it was written in and into
a project-level, user-invocable skill at
`.claude/skills/epic-closeout/SKILL.md`, taking a **`slug`**.
**One file added, nothing else touched.** Footprint is
`.claude/skills/epic-closeout/SKILL.md` alone.
### Why a skill rather than a document per epic
The source is
`.plan/local/orchestrator/api-sheriff-roadmap/epic-closeout.md`, which
lives in **the
first epic that will close**. Two live epics (`api-sheriff-0-2-0`,
`api-sheriff-0-3-0`) would
otherwise depend on a mechanism document inside a closed-and-archived
tree, and each would carry its
own copy of the sequence.
### The split it preserves
| | Lives in | Example |
|---|---|---|
| **Mechanism** | the skill | *how* a lesson is consumed, *how* a bundle
round is delivered |
| **State** | each epic's ledger | which round is next and how many rows
it carries; which defects owe verification |
Same split as `status.json` (authority) vs. a generated START-HERE block
(rendering). The skill names
no epic, no round number, no defect id and no lesson id.
### The rules carried across
1. **Consume means archive, never delete** —
`archive/lessons-consumed/{lesson-id}.md`, a fourth
sibling to `bundle-handoffs/`, `plans-shipped/`, `plans-struck/`;
**persist-then-remove**, so an
interrupted pass loses at most the lesson in flight and a re-run is a
no-op.
2. **A discard is archived too**, with its rationale.
3. **Archive the corrected text of a superseded lesson, not the
original.**
4. **The lessons corpus is global to the repository, not per-epic** —
hence the convention must be
identical in every epic.
5. **An assertion of re-homing is not a re-homing** — verify it in the
target tree, with the
structural cause (the write boundary) stated so it reads as a mechanism,
not sloppiness.
6. **Bundle hand-off rules** — the index is the durable dedup base
checked before compiling; rows
flip `UNSENT` → sent **in the same action as the send**; round numbering
**restarts at 1 per
epic**, with the epic's name distinguishing carriers.
7. **A cover note about a class beats N disconnected rows.**
Plus two things the skill states plainly: it **disposes and never calls
`close`**, and it is **not
runnable by accident** (explicit slug, no plan in flight, operator
asked, state document read first).
### One correction to the source
`epic-closeout.md` shows the removal as `manage-lessons remove
--lesson-id {id}`. That invocation is
rejected: `--reason` and `--coverage-verdict` are **required**, and
`completely_covered` additionally
requires `--covering-clause` and `--covering-input`. The skill carries
the full form.
## Gate
**Documentation-only, gate not run.** Per `CLAUDE.md` § Pre-Commit
Process as it now stands
(`ae52984`), the exemption is by file class and mixed commits are
explicitly not exempt. This commit
adds exactly one file under `.claude/**` — no `*.java`, no `pom.xml`, no
`src/**`, no workflow, no
Dockerfile — so it cannot change build output.
## Concurrency with PLAN-48
PLAN-48 owns `.claude/skills/release/SKILL.md`,
`.github/workflows/release.yml`,
`doc/development/release-process.adoc` and `CLAUDE.md`. **None of them
is touched here** — the only
reference to PLAN-48's surface is a *See also* line pointing at the
release skill as a shape
precedent. Disjoint footprints.
---
## Requested follow-up — reduce `epic-closeout.md` to state only
**Outside my write boundary** (`.plan/local/orchestrator/**` is the
orchestrator's tree), so this is
reported rather than applied. This is the same boundary that produces
rule 5 above; it bites here too.
**Target:**
`.plan/local/orchestrator/api-sheriff-roadmap/epic-closeout.md`,
rewritten to *this
epic's state*, opening with a pointer to
`.claude/skills/epic-closeout/SKILL.md` for the how.
**Keep (state):**
- **Bundle round** — round 7 delivered
(`archive/bundle-handoffs/plan-marshall-bundle-findings-round-7.md`);
round 8 is next, compiled 2026-08-03 and **UNSENT**. **The row count in
the document is stale:
it says 26, and `bundle-handoff-index.md` now carries 27 `(round 8 item
N)` rows.** Either restate
it as 27 or, better, drop the number and say *read the count from the
index* — a second copy of a
count is a second thing to go stale.
- Rows 21–26 (now –27) added 2026-08-05 have not been deduped against
rounds 1–7; specifically
21 vs 16, and 24 as a *recurrence* of the standing `--delete-branch`
clause.
- **Ledger sweep candidates** — (30) empty deep-lane
component-assessment sink, a two-plan
recurrence (PLAN-42, PLAN-45); (31) `q_gate_validation: once` vs
`plan_without_asking: true`;
(25) empty `documentation.skills_by_profile.module_testing`; (16) no
sanctioned execution path for
the main-branch `deploy-snapshot` check; (49) `ci pr merge` reports
`merged: true` for an enqueue.
- The **named class instance**: rows 21, 23, 25 and the `[OK]`
self-review are all *a mechanism
reporting a clean result it never computed*.
- **Lessons** — the corpus stands at **19 active**; note
`2026-08-05-10-001` was corrected on
2026-08-05 after its root cause was refuted, so its **corrected** text
is what gets archived.
- **Defects owing re-homing verification** — **(4), (10b), (21), (43)**,
each asserting
*"RE-HOMED … TRACK IT THERE, NOT HERE"*; (37) is the discharged
precedent (asserted-but-unwritten
for a day, enacted 2026-08-05).
- **Memory** — 21 files; `coderabbit-oss-rate-limit-blocks-merge`
corrected 2026-08-05, its
"budget re-triggers" advice wrong.
- **The 0.1.0 pre-cut checklist** to implant into `api-sheriff-0-2-0`
(re-run Trivy immediately
before dispatch; rebuild the scan target from the tree under test; bump
`.github/project.yml` `current-version`; assert GHCR `visibility ==
"public"` via `gh api`; never
`--delete-branch`). **State, because it is the record of one cut** — the
skill's step 8 states only
the rule that such knowledge is harvested into the successor.
- **Sequencing** — runs after PLAN-48 lands and is reconciled, before
`close`; item 5 (memory) may
run at any point.
**Drop (now in the skill):**
- § *Why this is not a plan* — the Ledger Write-Boundary argument,
verbatim in the skill.
- The four-destinations table and the *removal is the last step, never
the disposition* trap.
- § *The consume mechanism — archive, never delete*, in full: the
archive path, persist-then-remove
and its rationale, discards-archived-with-rationale,
corrected-text-not-original.
- The bundle-index rules: durable dedup base, check-before-compiling,
flip-in-the-same-action, the
permanent pre-2026-07-29 dedup gap **as a rule** (the epic keeps the
concrete gap as state).
- The *cover note about a class* rule (the epic keeps this epic's
instance).
- The *assertion of re-homing is not a re-homing* rule and its
structural cause (the epic keeps the
four entries owing verification).
- Items **6 and 7** almost entirely — implanting the mechanism and
adding a close-out document to
each successor, including per-epic round-1 numbering and the
corpus-is-global argument.
- Item **8**'s framing; only the 0.1.0 checklist content stays.
Net: `epic-closeout.md` goes from ~179 lines of mixed mechanism and
state to roughly a third of that,
all state, headed by one pointer to the skill.
## Not done, deliberately
**The close-out itself has not been run.** Authoring the mechanism was
the job; the first execution
is the orchestrator's, after PLAN-48 lands.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_016zTCGAUEzEbQowHT6yfMjP
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Added a guided epic closeout workflow for formally dispositioning
completed work without closing the epic.
* Supports bundle handoffs, lesson and knowledge consolidation, defect
and watch-item re-homing, successor setup, and completion reporting.
* Includes validation steps and safety safeguards to help ensure no
follow-up items or learnings are lost.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
---------
Co-authored-by: cuioss oliver <23139298+cuioss@users.noreply.github.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>1 parent ae52984 commit ed52e19
1 file changed
Lines changed: 350 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
| 320 | + | |
| 321 | + | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
| 325 | + | |
| 326 | + | |
| 327 | + | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + | |
| 344 | + | |
| 345 | + | |
| 346 | + | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + | |
0 commit comments