Repository navigation
Adopt the coordinating-epics skill for #24 #52
Description
coordinating-epics v1 shipped in gregoryfoster/skills (gregoryfoster/skills#348, fef0611). It packages the protocol #24's coordinator has run by hand, and several of its rules came from #24's own findings (F101, F122, F129, F134, and parking-lot mode from F135, F137 and F138). This issue moves #24 onto it.
What v1 brings
epic-edit.sh: one guarded call per body edit. It refuses foreign edits against a saved baseline (a tick you have verified passes with--accept-ticks), anchors each operation by ref, derives checkbox counts, lints refs, placeholders and secrets, compare-and-swaps before the PATCH, and reads the body back.scan.sh: the three re-scan cursors (number watermark, updated-since, and the commit range attributed to children), the epic's own new comments, and cross-repo ref states, as JSON.assets/epic-template.md: the header cursor lines both scripts read.
#24 is in parking-lot mode, with #21 and #37 parked. The skill's close-out.md ("Parking-lot mode") covers that: a check-in runs only on a trigger, and scan.sh is its first step.
Steps
- Vendor it.
skills-vendor/gregoryfoster-skillsis at5ff7a82, older than the skill. Bump it tofef0611or later, then symlinkskills/coordinating-epicsand.claude/skills/coordinating-epics(managing-skills, Step 2/2b). The auto-refresh hook bumps the pointer but creates no symlinks. - Adopt at the next triggered check-in, as that check-in's one write (SKILL.md, "Adopt an epic that exists"). Run
scan.sh --repo CannObserv/processor --epic 24 --watermark 51 --from-sha <last verified SHA>; itssincecomes from the header'sLast check-in. Then make oneepic-edit.sh --repo CannObserv/processor --epic 24 --adopt-live --scan <report> --ops <file>call, dry-run first, withheaderops forLast check-in({checked}),Last probe,Last issue seen({last_seen}) andLast verified SHA. - After that, every body edit goes through
epic-edit.sh, and each check-in starts withscan.sh.
What a dry run on today's body found (a copy of the body, run against the fake gh in the skill's tests; nothing was written):
- The header holds three fields in one paragraph, each with a note in parentheses. A
headerop onLast check-inrewrites that whole line, soLast probeand the watermark need their ownheaderops in the same call, and the notes belong in that call's log line. The call applies cleanly. Last number seenbecomesLast issue seen. That is the namescan.shreads; until then it finds no watermark.--lint-allwould flag 33 lines, nearly all short refs such aswatcher#326,broker#85andcannobserv#536, which GitHub does not link. Rewriting 33 lines in the adoption call is a large edit, so the steps above leave--lint-allout. Each line is then linted the first time it changes, and must be fixed then (check-in.md, "A lint refusal on a line you only ticked"). Add--lint-allif you'd rather fix them all at once.
Known limits in v1: CI by job is still checked by hand (gregoryfoster/skills#394), and comments are not linted before posting (gregoryfoster/skills#395).
When the run ends: journal it in the skill's process log. The skill is vendored here, so draft the entry in this repo and file it upstream as an issue on gregoryfoster/skills ("Adding an entry" in references/process-log.md).
Activity
gregoryfoster commentedon Oct 15, 2026
Hand-off from the burn-down epic #24, 2026-10-15. Step 1 (vendoring) is next, in its own thread. Step 2, the adoption, stays with #24's coordinator: it is that thread's next write, at the check-in after step 1 merges.
Pre-flight (coordinator, 2026-10-15, measured)
The vendored pointer on
main(244ca3f) is5ff7a82, 100 commits behindfef0611. The daily hook last bumped it on 2026-10-13.skills/coordinating-epicsdoesn't exist yet.The dry run of v1 against Burn-down: open issues after v1 go-live (done 2026-10-11; next: #37; parked: #54) #24's live body (the skill's scripts at
fef0611, run from a scratch copy; nothing written):--lint-all: 55 problems on 33 lines (48 short refs, plus 7 bare numbers from other repos). That confirms this issue's count.headerop keeps the line's existing lead. Burn-down: open issues after v1 go-live (done 2026-10-11; next: #37; parked: #54) #24's cursors were in a paragraph, so the call applied without errors butLast check-instayed in the paragraph, andLast probe,Last issue seenandLast verified SHAwere appended after the Milestones list. Reading the diff showed it; exit 0 didn't.Operator decision (2026-10-15): pre-flight now. At 15:05Z, Burn-down: open issues after v1 go-live (done 2026-10-11; next: #37; parked: #54) #24's last write by the old protocol:
Last check-in,Last probe,Last issue seenAdopt the coordinating-epics skill for #24 #52,Last verified SHA244ca3f,Next);owner/repo#N.The skill's own
lint()now finds 0 problems in the body.The adoption call, dry-run against the new body:
scan.sh, thenepic-edit.sh --adopt-live --lint-all --scan … --ops(headerops with{checked}and{last_seen}, plus a log line). It exits 0, and the header op rewrites the cursor in place. So step 2 no longer needs this issue's explicit--watermark 51 --from-sha …: the header supplies both.A v1 limit, new here:
scan.sh'scross_reporeport reads with one token. With this repo'sGH_TOKEN, it read 23 of 28 refs; the 5CannObserv/cannobservrefs came back 404. The coordinator keeps checking cannobserv by hand withGH_TOKEN_CANNOBSERVuntil that changes. Reported on New skill: burning-down-an-epic - a lightweight, interactive, operator-paced counterpart to orchestrating-issue-backlog gregoryfoster/skills#348.Step 1 brief
Touchpoints (checked against
mainat244ca3f):skills-vendor/gregoryfoster-skills;skills/coordinating-epics→../skills-vendor/gregoryfoster-skills/skills/coordinating-epicsand.claude/skills/coordinating-epics→../../skills/coordinating-epics(docs/SKILLS.md's layout table; managing-skills Step 2/2b);Traps:
tests/test_skills.py::test_skills_md_inventory_matches_the_linksholds docs/SKILLS.md's**gregoryfoster-skills (N …):**line to the links. Addcoordinating-epicsto it and bump the count. The other tests (both discovery paths list the same skills;.claude/skillsroutes throughskills/) fail if either link is missing.bash .skills/doctor.shand the skills tests, and check that no linked skill was renamed or removed upstream (a dangling link). List the skills this repo uses whose content changed:reviewing-code-python-fastapi,shipping-work-python-fastapi,using-git-worktrees,writing-plans,init-socraticode,using-mayfly-chat,managing-skills. Don't re-derive what changed in them; just name them.maindaily. If it lands during the PR, the pointer conflicts. Rebase, and keep whichever commit is newer, as long as it is at or afterfef0611. After the merge, rungit pull --ff-onlyin the main checkout, or the hook's next push is rejected.ok..socraticodeignorealready excludesskills/andskills-vendor/.Done when:
fef0611or later, and both links resolve;.claude/skills/coordinating-epics/scripts/epic-edit.sh --helpruns (SKILL.md's script-path resolution finds it);doctor.shpass, and CI is green on the PR and onmain;Refs #52, notCloses, because Adopt the coordinating-epics skill for #24 #52 closes only after step 2's read-back.Out of scope: any edit to #24's body (step 2, the coordinator's). Fixing upstream skills (change those upstream).
Ship: branch in a worktree → PR → FF merge →
git pull --ff-only. The closing note goes on #52 as a comment: each box with its evidence, plus the list from trap 2.Kickoff prompt:
gregoryfoster commentedon Oct 15, 2026
Step 1 shipped in #53, FF-merged as
4b3a500. #52 stays open for step 2, the coordinator's adoption call on #24.fef0611or later.skills-vendor/gregoryfoster-skillsis atfef0611(upstream HEAD). The daily refresh hook moved it onmainin98c5032at 2026-10-15T15:40Z, before this thread branched, so #52 chore: vendor coordinating-epics #53 carries no bump and trap 3's conflict never came up.skills/coordinating-epics→../skills-vendor/gregoryfoster-skills/skills/coordinating-epics, and.claude/skills/coordinating-epics→../../skills/coordinating-epics.readlink -eresolves both in the main checkout, and Claude Code lists the skill..claude/skills/coordinating-epics/scripts/epic-edit.sh --helpexits 0. SKILL.md'sskill-scriptsblock resolves bothepic-edit.shandscan.shunder.claude/skills/coordinating-epics/scripts/. This repo's ownscripts/is checked first and has neither.tests/test_skills.pyfailed on the inventory line alone, then passed with both links (8 passed).bash .skills/doctor.shexits 0. Its advisory that thebrainstormingoverride lags obra-superpowers predates this change: that pointer didn't move.-m 'not integration'): 594 passed, 14 skipped. Ruff is clean.mainat4b3a500: run 38763356964. Bothlintandtestpassed.coordinating-epics(Burn-down: open issues after v1 go-live (done 2026-10-11; next: #37; parked: #54) #24 since Adopt the coordinating-epics skill for #24 #52).Trap 2 (
5ff7a82..fef0611, 100 commits). None of the linked skills changed:reviewing-code-python-fastapi,shipping-work-python-fastapi,using-git-worktrees,writing-plans,init-socraticode,using-mayfly-chat,managing-skills, and the other five. The span touched onlyskills/coordinating-epics/(new),skills/patching-hosts/, and upstream's.skills/anddocs/plans/. Nothing linked here was renamed or removed.Aside, out of scope:
patching-hosts(upstream, predates this span) is neither linked here nor on docs/SKILLS.md's "Not linked" list.No runtime path changed, so there was no deploy, and the drift check is unaffected.
gregoryfoster commentedon Oct 15, 2026
Done, both steps (2026-10-15).
Step 1, vendoring: #52 chore: vendor coordinating-epics #53 (
4b3a500, FF). CI green by job (lint,test) on the PR run and themainpush run. The coordinator checked independently:.claude/skills/coordinating-epics/scripts;coordinating-epicschanged across5ff7a82..fef0611.The pointer arrived through the refresh hook's daily bump (
98c5032), not through the PR. No deploy (no runtime path changed).Step 2, the adoption: Burn-down: open issues after v1 go-live (done 2026-10-11; next: #37; parked: #54) #24 was written by
epic-edit.sh --adopt-live --lint-all --scanin one call. Exit 0,"readback": "matches", and--lint-allpassed on the whole body. The cursors came fromscan.sh({checked},{last_seen}= #52 chore: vendor coordinating-epics #53). From here every body edit goes throughepic-edit.sh, and every check-in starts withscan.sh.Known limits (v1, reported on gregoryfoster/skills#348):
scan.sh'scross_reporeads with one token, soCannObserv/cannobservrefs come back 404. The coordinator checks those by hand.headerop takes only cursor fields. SoMeasured state's heading keeps its 15:01Z time, and the protocol note lives in the Parking-lot section.Follow-ups: none here.