docs: sprint retrospective improvements (2026-07-27) - #1233
Conversation
Sprint 2026-07-18b closed with 19 PRs merged. Seven improvements, each traceable to something that actually went wrong or was caught by luck. CodeRabbit's fourth surface (coderabbit-ops/SKILL.md, workflow.md): the `CodeRabbit` commit-status context is not one of the documented three layers, yet it renders as `CodeRabbit=SUCCESS` in `statusCheckRollup` — the command everyone runs for CI. Its `state` is `success` whether the bot reviewed, was rate limited, or skipped by config; only the `description` distinguishes them. Three PRs this sprint carried a green rollup with no review behind it. Re-running bootstrap against a live deployment (multi-user-setup-guide.md): `--force` replaces every unit parameter not passed explicitly. The live service ran on a non-default port, so the flag needed to clear a unit conflict would have moved it. Adds a read-then-preview procedure and the narrower-operation principle. Consult permission vs report duty (orchestrator/SKILL.md): granting the worker-to-architect channel in one clause reads as also waiving the report. A ruling that decided a PR's merge authority never reached the Orchestrator. Two separate sentences, with the reason the collapse happens. Absence of a signal (workflow.md, Inference vs Verification sub-pattern 5): waiting on something with no path to arrive. CI that cannot fire on a branch with no PR; an agent whose `idle` state cannot distinguish finished from stuck. Hypothesis exhaustion (workflow.md, sub-pattern 6): after several disproven mechanisms, stop generating and start reducing. Pair every negative with a positive control; prefer the control experiment that holds all but one variable; go wide when each iteration costs a round trip. main health during quiet periods (sprint-lifecycle.md): `main` is only exercised when something merges, so a wait produces no observation at all. It was red for four days. AC verifiability before implementation (pre-pr-completeness.md Q12): an AC mandating a real-environment check assumes that check is runnable. Run it once against unmodified main first — a blocker found there is a finding. Also documents architect-unresponsive escalation, judging on output rather than session state. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Important Review skippedIgnore keyword(s) in the title. ⛔ Ignored keywords (1)
Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Test Coverage CheckNo production files matching coverage patterns were changed. Rule/Skill Duplication Check✅ No rule paragraphs found verbatim in any skill file. Language Check (public artifacts)✅ All public artifacts use Latin / Greek / Cyrillic scripts only. Source-Comment Blame-Shift Check✅ No new Issue / PR / dated CodeRabbit references in source comments. |
…1235) * docs: narrative on the four-day red main and four wrong hypotheses Sprint 2026-07-18b's retrospective produced rules about control experiments, hypothesis exhaustion, and checking main when the pipeline goes quiet. The rules are correct and will be easy to skip, because at the moment each applies you will be holding a hypothesis that feels like evidence. This narrative records what that felt like from the inside: four disproven mechanisms in one day (two mine, two the delegate's), the Architect independently producing my wrong first hypothesis, and the two experiments that settled it without proposing any mechanism at all. Also records two owner questions that were each more accurate than my own detailed analysis, and one occasion where I blocked a delegate on a concern I could have checked in two commands but did not. Fixes a stale count introduced by PR #1233: workflow.md said "four sub-patterns" after gaining a fifth and sixth. Adds the rule-side link so the narrative is reachable when the rule feels arbitrary. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * docs: translate quoted architect phrasing per Language Policy The narrative quoted the architect's classification verbatim in Japanese. Language Policy requires quoted remarks be translated in public artifacts; check:lang caught it. Paraphrased in English, meaning preserved. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sprint 2026-07-18b retrospective improvements. 19 PRs merged; the sprint's defining event was
mainsitting red for four days without anyone observing it.Each change below is traceable to something that actually went wrong, or to something that was caught by luck and should not have to be next time.
1. CodeRabbit's fourth surface
.claude/skills/coderabbit-ops/SKILL.md,.claude/rules/workflow.mdThe skill documents a 3-layer verdict (Pre-merge checks /
reviewDecision/ inline comments). None of the three is theCodeRabbitcommit-status context — which nonetheless appears ingh pr view --json statusCheckRollup, the command everyone runs to confirm CI, rendered next totestandpreflightasCodeRabbit=SUCCESS.Its
stateissuccessin all three of these cases:descriptionReview completedReview rate limitedReview skipped: ignored keyword in the PR title.coderabbit.yamlThree PRs this sprint (#1227, #1231, #1229) showed a green rollup with no review behind it. #1227 later produced a Major finding — a factually wrong claim about
spyOnisolation that would have shipped in a standards document.Adds the read command, the table, and a note that the status is per-head-SHA so updating a branch invalidates an earlier
Review completed.2. Re-running the bootstrap script against a live deployment
docs/multi-user-setup-guide.mdsetup-multiuser-for-ubuntu.shrefuses to overwrite a differing systemd unit and tells you to re-run with--force.--forcethen replaces every parameter not passed explicitly with the script's defaults. The live service ran on a non-default port; a bare--forcewould have moved it and broken the URL in use.Adds: read the live unit first, preview with
--dry-run, carry over everything that differs. Plus the more general point — prefer the narrowest operation. The provisioning step actually needed was oneinstallcommand; re-running the whole bootstrap was the wrong tool.3. Consult permission is not a waiver of the report
.claude/skills/orchestrator/SKILL.mdA delegation prompt said "you may consult the architect directly — no need to route through me", meaning no pre-approval. The Architect then ruled on whether a PR required a production-side extraction — the thing that decides whether it is Orchestrator-mergeable or owner-gated — and asked for the outcome to reach the Orchestrator. It never did.
Asked directly, the delegate confirmed they knew who the Orchestrator was and had reported everything else correctly. The gap was the prompt. Adds a two-sentence template and names why the collapse happens: a worker who resolves a question has, from their side, handled it.
4-5. Two new Inference vs Verification sub-patterns
.claude/rules/workflow.mdSub-pattern 5 — absence of a signal. The existing four sub-patterns all cover over-trusting a weak signal. These are the inverse: waiting on something with no path to arrive.
ci.ymlfires onpull_requestonly, so a push to a branch with no PR runs nothing — a delegate waited ~40 minutes after removing a temporary debug workflow that had a push trigger. AndactivityState: idlecannot distinguish an agent that replied from one that is stuck.Sub-pattern 6 — hypothesis exhaustion. Four single-mechanism hypotheses for #1225 were disproven in sequence, each individually reasonable. What resolved it was re-running the last green CI run byte-identically (exonerating the repository in one step, isolating the runner image as the only changed variable) and then delta-debugging the real file. #1211 was settled the same day by the same shape: the identical config and binary run outside Docker. Codifies: pair every negative with a positive control, stop generating after ~3 disproven, prefer the control experiment, go wide when iterations cost a round trip.
6. Check
mainwhen the pipeline goes quiet.claude/skills/orchestrator/sprint-lifecycle.mdmainis only exercised when something merges. During a wait — an owner gate, a dogfood pass — nothing merges, so nothing runs, so a redmainproduces no signal. It is not that the failure is missed; no observation is being made.It surfaced only because unrelated backfill work was dispatched and its CI failed. Four completed PRs had been silently unmergeable for days. Also notes the cause need not be in the repository.
7. Is the AC's own verification still satisfiable?
.claude/rules/pre-pr-completeness.mdQ12An AC mandating a real-environment check ("run the Docker smoke on a fresh checkout") asserts that check is currently runnable — an assumption nobody validates when writing it. On PR #1228, implementation finished and then the smoke could not run: a second, unrelated defect broke
bun installon any fresh clone.Q12 runs before implementation, unlike every other question here — run the verification once against unmodified
mainto see it execute, not to see it pass. Registered in "When to apply" including the not-required carve-out, since a single-file fix can still carry a real-environment AC.Also
Architect-unresponsive escalation (
orchestrator/SKILL.md): judge on whether the Architect produced output for anyone, not on session state; escalate to a fresh generation rather than re-sending.Deferred to Issues
sprint-retro.js's time-to-mergeable is wall-clock and is dominated by owner gates,mainoutages, and bot rate limits. All five flagged outliers this sprint were waiting, and none matched the interpretation the script suggests. Needs a script change, not a doc change.Test plan
bun run check:lang— clean, 114 filesnode .claude/skills/orchestrator/rule-skill-duplication-check.js— no rule paragraphs duplicated into skills🤖 Generated with Claude Code