Skip to content

Record the two-campaign night's lessons in ship-campaign - #2548

Merged
KyleMit merged 3 commits into
mainfrom
claude/cq5-campaign-lessons
Sep 30, 2026
Merged

KyleMit merged 3 commits into
mainfrom
claude/cq5-campaign-lessons

Conversation

@KyleMit

@KyleMit KyleMit commented Sep 30, 2026 •

Copy link
Copy Markdown
Owner

The self-heal pass that closes campaign #2529. It writes four lessons from that night's run into the ship-campaign sources (.ruler/, then regenerated). Left open for the owner: a skill change is outside the campaign's queue, so the orchestrator does not merge it.

What happened, and where each lesson now lives

  1. Two campaigns on one queue. Leftovers campaign from #2500: 9 decisions and 10 follow-ups (2026-09-29 night) #2529 (Claude) and Ship campaign: #2500 leftover decisions and follow-ups #2530 (Codex) started 94 seconds apart on the same Code-smell burndown campaign, 2026-09-29 evening (4 hours) #2500 leftovers comment. Free-form units carry no in-progress label, so neither preflight could see the other. They collided on decisions 1–3 before either noticed.
    • Preflight bullet "No second campaign on the same queue" (SKILL.md step 1): search for another open issue or PR that references the same source, and for another runner's branches.
    • Step 2 re-check, repeated before every launch, because a peer that starts after this preflight is invisible to it. It covers both cases: splitting with a peer that is running, and leaving a stopped peer's drafts to that peer.
  2. The same outside change, read two ways. A newly published brace-expansion advisory failed pnpm audit on main's own lockfile.
  3. Mechanical coupled verdicts (references/parallel.md). After a merge changes pnpm-lock.yaml or eslint.config.js, every later catch-up surveys coupled. That means a quick full reconcile pass, not a reason to leave a PR behind. The rival review of this campaign's takeover decision caught exactly that wrong assumption.
  4. Harness facts for lanes (references/parallel.md):
    • The auto-mode classifier refused the orchestrator's end-of-campaign batch removal of its own clean worktrees, so the reference now prefers cleanup after each merge.
    • Worktree-isolated lanes cannot run a brokered command that invokes git in the rival's worktree. The reference says how to answer the rival instead.

The skill note (.ruler/skill-notes/ship-campaign.md.template) records the incident chronology.

Not healed, as not durable: npm run show:free-port -- --help prints a Node stack. The error line already names the unknown option, and the script takes no flags worth documenting.

Checks

  • npm run ruler:apply, then npm run ruler:check: in sync.
  • npm run format:check, check:skill-refs, check:doc-refs: all exit 0.
  • npm run test:tools: 279 files, 6391 tests passed.

Update (2026-09-30 afternoon)

This branch caught up with main after #2537 merged. #2537 edited other lines of the same ship-campaign sources; the merge was clean, with no overlapping hunks. Step 2's stopped-peer rule no longer says a peer's drafts "stay its own". It now says adopting them needs the user's explicit hand-over, plus a survey, a fresh rival review and a new CI round. That afternoon's adoption and merge of #2532 and #2537 is the evidence, and the note records it. ruler:check, format:check, check:doc-refs and check:skill-refs all exit 0.

Refs #2529 · Refs #2500

🤖 Generated with Claude Code

Campaign #2529 and a parallel Codex campaign (#2530) started 94 seconds
apart on the same queue. Free-form units carry no claim label, so
neither preflight could see the other until they collided on three
decisions. The same night, a new pnpm audit advisory failed main's own
lockfile. One campaign stopped the queue and the other repaired the gate,
because step 3 read both ways.

- Preflight searches for another campaign on the same queue, and step 2
  repeats the check before every launch. It also says how to split with
  a running peer and what to do with a stopped peer's drafts.
- Step 3 says an outside change failing a check on main's own tree is a
  gate repair when the gate's own conventional remedy fixes it.
- The parallel reference covers three things: surveys that go coupled
  after a lockfile or eslint.config.js change, cleanup after each merge
  rather than one batch at the end, and brokered git commands refused
  inside a worktree-isolated lane.
- The skill note records the incident.

Refs #2529

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@KyleMit KyleMit left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Independent review by the codex rival agent, round 1, of pull request 2548.

Reviewed the full diff, checking peer-campaign coordination, gate-repair rules, cleanup guidance, and broker handling against the existing workflow and tools. Generated copies match their sources; Markdown and reference checks pass, along with 193 targeted tests. Direct checks confirmed the documented catch-up classifications. No substantiated defects found.

KyleMit and others added 2 commits September 30, 2026 13:15
The overnight rule said a stopped peer's drafts stay its own. That
afternoon the user handed them over explicitly, and #2529 adopted and
merged #2532 and #2537. The rule now says what adoption needs, and the
note records the sequence.

Refs #2529

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@KyleMit KyleMit left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Independent review by the codex rival agent, round 2, of pull request 2548.

Round 1 reported no findings, so none required resolution. Reviewed the new hand-over requirement and fresh survey, rival-review, and CI requirements for adopted drafts. Generated copies match their sources, and Markdown and reference checks pass. No new defects found.

@KyleMit
KyleMit merged commit e2cc3ae into main Sep 30, 2026
19 checks passed
@KyleMit
KyleMit deleted the claude/cq5-campaign-lessons branch September 30, 2026 18:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant