spec: amend capabilities singleton invariant to track disjointness (#294)#308
Conversation
) Human-gated spec-grill pass (run 2026-07-12 on operator instruction) — the three governed capabilities.md edits from #294: - sprint-execution Expected Behavior: "exactly one status: active sprint" → "no two active tracks with overlapping scope" via the one shared scopesOverlap predicate; disjoint tracks coexist as a portfolio, single-track behavior unchanged, scopeless pairs warn informationally. - backlog-sync sprint-mirror predicate: "exits non-zero when there is no single unambiguous active sprint" → per-track mirror semantics (--track selects; portfolio without --track refuses naming tracks). - Header component: prose: single-slug routing kept, now also documented as the track's scope key (component: equality, else scope: globs — one axis per track, never both). - Decisions rows appended in sprint-execution and backlog-sync recording the invariant flip and its supersession. Descriptive (non-governed) prose: system-map Core Flows 4/5 lose the singular-active phrasing (--track selection noted). The :36 line cited in #294 no longer existed after the tracker-adapter refactor rewrote system-map.md; Flows 4/5 were the surviving equivalent. 3-axis check: predicates are frontmatter-defined (distribution-safe), name the single shared implementation guarded by enforced smoke gates GATE_MT_DISJOINT/GATE_MT_OVERLAP (manipulation-resistant), and encode fail-loud-on-overlap + never-guess intent (authority). Doctor: all 8 checks pass, capability spec within budget (5 capabilities, 198 lines); smoke 187/187. Refs #294, #289. Unblocks #295. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
Warning Review limit reached
Next review available in: 18 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (3)
✨ 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 |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1d0200dd41
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
|
||
| ### Expected Behaviors | ||
| - Exactly one sprint file with `status: active` exists per `backlog/sprints/` at all times — concurrent actives fail loud (find_active_sprint surfaces the conflict). | ||
| - No two sprint files with `status: active` declare overlapping scope — overlap fails loud through the one shared `scopesOverlap` predicate (`component:` equality or `scope:` path-prefix collision; surfaced by `sprint-init` refusal, `sprint-state` `OVERLAPPING_TRACKS`, and the doctor's `Active tracks overlap on scope` verdict). Disjoint-scope tracks coexist as a portfolio; a single active track behaves exactly as before; two scopeless actives cannot be proven disjoint and surface an informational doctor warning. |
There was a problem hiding this comment.
Guard mixed scope axes before promising disjointness
When one active track uses component: and another uses scope:, the implementation does not run either equality or prefix overlap check (scopesOverlap falls through to false, and the doctor only warns when both tracks are scopeless), so backlog-doctor reports mixed-axis portfolios as scopes disjoint. This new invariant promises active overlap is fail-loud and only documents two scopeless tracks as uncertain, so users can mix axes and lose the promised warning/failure. Please either require a single portfolio-wide axis or document/implement a mixed-axis warning.
Useful? React with 👍 / 👎.
…schema 2 (#295) (#309) Documentation flip off the single-active-sprint singleton, gated by the #294 human-run spec amendment (merged in #308): - references/integration-contract.md: actor JSON surface documented as schema_version 2 — active_sprints[] portfolio + retained v1 single- track fields (byte-compatible when N==1); "ambiguous active state is fail-loud" replaced by "portfolio for disjoint tracks, fail-loud only on overlapping scope (OVERLAPPING_TRACKS)"; component routing gains the track-scope-key rule ("two active tracks MUST NOT share a component:"); Relay-Merge Sprint Update Format and Capability Learnings Append Contract gain track-resolution paragraphs (sprint-state.js --component/--track, never guess across tracks); doctor section documents per-track fan-out + track tags and corrects the zero-active state from hard-failure to informational warn; Versioning updated (grammar unchanged, JSON additive). - SKILL.md: core contract, frontmatter table (+ scope: row), Orient/ Plan paths, script list, and eval prompts rewritten for "one active track per scope; disjoint tracks coexist"; the gated multi-track eval prompt is un-gated (behavior landed in #291/#293/#292). - references/process.md: Orient portfolio path, overlap-only Plan refusal, close --track, next --track, unplanned-work concurrent-track option. - references/scripts.md: full flag inventory updated (--track, --scope, sprint-state.js row); last "single active sprint" claim removed. - README.md: new "Multi-Track Sprints" section (when to open a second track, scope declaration, invariant, portfolio commands). - CHANGELOG.md: multi-track headline + phased entry (#291/#293/#292/ #294/#295) and the sprint-init.test.js cwd-rot fix note. No script changes; smoke 187/187, doctor 8/8 PASS. No residual "exactly one active sprint" claim outside the PRD's historical context. Refs #295, #289. Coordination comment to follow on dev-relay#954. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Summary
#294 (Phase 1e, HUMAN-GATED) — the
spec-grillamendment pass for the multi-track invariant flip, run 2026-07-12 on explicit operator instruction. This is the governance step that lets #295 flip the SKILL/process prose.Governed edits (
spec/capabilities.md, via spec-grill)sprint-executionExpected Behavior 1status: active… concurrent actives fail loud" → no two active tracks with overlapping scope (one sharedscopesOverlappredicate:component:equality /scope:path-prefix collision; fail-loud surfaces named); disjoint tracks coexist as a portfolio; single active unchanged; scopeless pairs = informational warnbacklog-syncsprint-mirrorbehavior--track(refuses naming tracks), no-match/zero exit non-zero, never guesses, still single-parsercomponent:proseAppend-only
### Decisionsrows added in both capabilities recording the flip and what it supersedes. In-scope bullets updated to name the track key andresolve_track.Descriptive prose (not governed)
spec/system-map.mdCore Flows 4/5 de-singularized (--trackselection noted). Note: the:36line cited in the issue ("writes one active file…") no longer existed — the tracker-adapter refactor rewrote system-map.md; Flows 4/5 were the surviving singular-active phrasing.Compatible, unchanged
charter.mdO1 (single execution state) untouched, per the issue.3-axis predicate check
scopesOverlapimplementation, structurally guarded by the enforced smoke gatesGATE_MT_DISJOINT/GATE_MT_OVERLAPand the G4 byte-identity fixtures.Verification
backlog-doctor: all 8 checks PASS; capability spec within budget (5 capabilities, 198 lines)bash smoke-test.sh→ 187/187 passskills/dev-backlog/SKILL.md:46still carries the old prose by design — that flip is Phase 3: docs + integration-contract schema_version → 2 #295, gated by this PRRefs #294, #289. Unblocks #295.
🤖 Generated with Claude Code