Skip to content

Adopt the coordinating-epics skill for #24 #52

Closed

Description

@gregoryfoster

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

  1. Vendor it. skills-vendor/gregoryfoster-skills is at 5ff7a82, older than the skill. Bump it to fef0611 or later, then symlink skills/coordinating-epics and .claude/skills/coordinating-epics (managing-skills, Step 2/2b). The auto-refresh hook bumps the pointer but creates no symlinks.
  2. 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>; its since comes from the header's Last check-in. Then make one epic-edit.sh --repo CannObserv/processor --epic 24 --adopt-live --scan <report> --ops <file> call, dry-run first, with header ops for Last check-in ({checked}), Last probe, Last issue seen ({last_seen}) and Last verified SHA.
  3. After that, every body edit goes through epic-edit.sh, and each check-in starts with scan.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 header op on Last check-in rewrites that whole line, so Last probe and the watermark need their own header ops in the same call, and the notes belong in that call's log line. The call applies cleanly.
  • Last number seen becomes Last issue seen. That is the name scan.sh reads; until then it finds no watermark.
  • --lint-all would flag 33 lines, nearly all short refs such as watcher#326, broker#85 and cannobserv#536, which GitHub does not link. Rewriting 33 lines in the adoption call is a large edit, so the steps above leave --lint-all out. 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-all if 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

  1. gregoryfoster commented on Oct 15, 2026

    @gregoryfoster
    ContributorAuthor

    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)

    Step 1 brief

    Touchpoints (checked against main at 244ca3f):

    • the submodule skills-vendor/gregoryfoster-skills;
    • two new symlinks, skills/coordinating-epics → ../skills-vendor/gregoryfoster-skills/skills/coordinating-epics and .claude/skills/coordinating-epics → ../../skills/coordinating-epics (docs/SKILLS.md's layout table; managing-skills Step 2/2b);
    • docs/SKILLS.md's inventory line.

    Traps:

    1. tests/test_skills.py::test_skills_md_inventory_matches_the_links holds docs/SKILLS.md's **gregoryfoster-skills (N …):** line to the links. Add coordinating-epics to it and bump the count. The other tests (both discovery paths list the same skills; .claude/skills routes through skills/) fail if either link is missing.
    2. The bump spans 100 commits, so every skill already linked from that repo moves too. Run bash .skills/doctor.sh and 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.
    3. The refresh hook pushes submodule bumps to main daily. If it lands during the PR, the pointer conflicts. Rebase, and keep whichever commit is newer, as long as it is at or after fef0611. After the merge, run git pull --ff-only in the main checkout, or the hook's next push is rejected.
    4. No runtime path changes, so there's no deploy, and the drift check stays ok. .socraticodeignore already excludes skills/ and skills-vendor/.

    Done when:

    • the pointer is at fef0611 or later, and both links resolve;
    • .claude/skills/coordinating-epics/scripts/epic-edit.sh --help runs (SKILL.md's script-path resolution finds it);
    • the skills tests and doctor.sh pass, and CI is green on the PR and on main;
    • the PR says Refs #52, not Closes, 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:

    Pick up processor#52, step 1 only (vendor coordinating-epics). Read its hand-off comment from epic #24 first. Don't edit #24.

  2. gregoryfoster commented on Oct 15, 2026

    @gregoryfoster
    ContributorAuthor

    Step 1 shipped in #53, FF-merged as 4b3a500. #52 stays open for step 2, the coordinator's adoption call on #24.

    • Pointer at fef0611 or later. skills-vendor/gregoryfoster-skills is at fef0611 (upstream HEAD). The daily refresh hook moved it on main in 98c5032 at 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.
    • Both links resolve. skills/coordinating-epics → ../skills-vendor/gregoryfoster-skills/skills/coordinating-epics, and .claude/skills/coordinating-epics → ../../skills/coordinating-epics. readlink -e resolves both in the main checkout, and Claude Code lists the skill.
    • .claude/skills/coordinating-epics/scripts/epic-edit.sh --help exits 0. SKILL.md's skill-scripts block resolves both epic-edit.sh and scan.sh under .claude/skills/coordinating-epics/scripts/. This repo's own scripts/ is checked first and has neither.
    • Tests and doctor.
      • tests/test_skills.py failed on the inventory line alone, then passed with both links (8 passed).
      • bash .skills/doctor.sh exits 0. Its advisory that the brainstorming override lags obra-superpowers predates this change: that pointer didn't move.
      • Full suite (-m 'not integration'): 594 passed, 14 skipped. Ruff is clean.
    • CI is green. On the PR: run 38762837707. On main at 4b3a500: run 38763356964. Both lint and test passed.
    • docs/SKILLS.md: gregoryfoster-skills goes from 12 to 13, with 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 only skills/coordinating-epics/ (new), skills/patching-hosts/, and upstream's .skills/ and docs/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.

  3. gregoryfoster commented on Oct 15, 2026

    @gregoryfoster
    ContributorAuthor

    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 the main push run. The coordinator checked independently:

      • both links resolve;
      • the scripts resolve through SKILL.md's block from .claude/skills/coordinating-epics/scripts;
      • of the linked skills, only coordinating-epics changed across 5ff7a82..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 --scan in one call. Exit 0, "readback": "matches", and --lint-all passed on the whole body. The cursors came from scan.sh ({checked}, {last_seen} = #52 chore: vendor coordinating-epics #53). From here every body edit goes through epic-edit.sh, and every check-in starts with scan.sh.

    Known limits (v1, reported on gregoryfoster/skills#348):

    • scan.sh's cross_repo reads with one token, so CannObserv/cannobserv refs come back 404. The coordinator checks those by hand.
    • No op renames a heading or edits the intro paragraph. A header op takes only cursor fields. So Measured state's heading keeps its 15:01Z time, and the protocol note lives in the Parking-lot section.

    Follow-ups: none here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions