Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ Each entry links the GitHub issue (the canonical spec) and the merge PR (the shi

### Changed

- `spec/capabilities.md` and the SKILL.md Complete rail: the sprint-close Expected Behavior now matches `sprint-close.sh` (warn on remaining items, never refuse), and the session's close condition is stated the same way — every Plan item `[x]`, or the rest struck or carried with a Progress entry; decision row 2026-09-20; no script change.
- **Relay deprecated.** dev-backlog names no delegate: the `[run:id]` Plan pointer and the `sprint-state` JSON `run_id` field are deleted (an in-flight `[~]` is moored by `→ PR #N (state)` or `[branch:name]`), the JSON is documented as the fresh-session recovery rail rather than a dev-relay contract, and every "Relay optional" sentence in SKILL.md, references, README, and `spec/*` is gone (charter/capabilities decision rows 2026-09-19). BREAKING for any external reader of `run_id` (none known).
- `related-skills` frontmatter drops the deprecated relay skills (dev-backlog: `backlog-triage, spec-charter, spec-grill`; backlog-triage: `dev-backlog, spec-charter`); SKILL.md names "a delegate" instead of dev-relay for in-flight/done markers and delegation.
- `docs/` keeps only the current conformance run: seven earlier conformance reports, the #433 fixture A/B raw directory, `github-resilience.md` (its fail-loud rules moved into `references/authority-contract.md`), and the Removed-docs index are deleted; git history is the record. `tests/evals/README.md` drops its revision log.
Expand Down
2 changes: 1 addition & 1 deletion skills/dev-backlog/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ admitted, sprint progress.
### Complete

Goal: nothing stale left behind.
Rail, per task: re-read the live Issue and verify every AC against the current specification, then merge or commit and close it with the Close verb. Plan item `[x]` and Progress too when a sprint is admitted. Done for the task when the Issue is closed with every AC verified; the sprint stays open until its Plan is done.
Rail, per task: re-read the live Issue and verify every AC against the current specification, then merge or commit and close it with the Close verb. Plan item `[x]` and Progress too when a sprint is admitted. Done for the task when the Issue is closed with every AC verified; the sprint stays open until every Plan item is `[x]` or the session has struck or carried the rest with a Progress entry (`sprint-close.sh` only warns about them).
Rail, per sprint: `sprint-close.sh` runs `backlog-doctor.js`, flips `status: completed`, appends the final Progress entry, and prints the doctor verdicts; after it succeeds, promote project-level Running Context to `_context.md` and leave the sprint file as the permanent record.
Done when there is no stale active sprint or rediscovery-prone context trapped in the closed sprint.

Expand Down
3 changes: 2 additions & 1 deletion spec/capabilities.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ Mutation: [`spec/README.md`](README.md) § Mutation.
- The default Issue → implementation → PR → closure path creates no sprint. A sprint is admitted only for ordered multi-Issue batches, delegated/parallel handoff, cross-Issue or cross-session context, or concurrent track coordination; duration, estimate, and milestone membership alone never trigger one.
- 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; once more than one track is active, any track without a declared axis cannot be proven disjoint and surfaces an informational doctor warning.
- Every `[~]` line carries a PR or branch pointer in-line — never an unmoored `[~]`.
- One successful `sprint-close.sh` invocation flips the sprint to `status: completed` and appends final Progress; it runs only when every Plan item is `[x]` or explicitly struck in Progress.
- One successful `sprint-close.sh` invocation flips the sprint to `status: completed` and appends the final Progress entry (`N/M tasks completed`); remaining `[ ]` / `[~]` items only print a warning and never block the close, so before closing the session decides whether to finish them, strike them with a Progress entry, or carry them to the next sprint.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Align the live close contracts with warn-only closure

This amendment permits closing with unfinished Plan items, but the live execution contract still says “the sprint stays open until its Plan is done” in skills/dev-backlog/SKILL.md:122, while spec/system-map.md:38 says to close a sprint only when its whole Plan is done. Agents consulting these authoritative surfaces will therefore apply conflicting completion rules; update them in the same change, or retain the previous capability behavior, so sprint closure has one consistent contract.

AGENTS.md reference: AGENTS.md:L7-L9

Useful? React with 👍 / 👎.


### Hard Constraints
- Never mutate a sprint's `status: completed` back to `active`; completed sprints are immutable history.
Expand All @@ -103,6 +103,7 @@ Mutation: [`spec/README.md`](README.md) § Mutation.
| 2026-09-17 | Spec-axis linters removed: `objectives:` and `component:` are unchecked metadata; `component:` is a free track-scope string compared only by `scopesOverlap`; no line budget on this file (#421, #426; gate 2026-09-17) | same upkeep species as the rev-15 status ladder; no consumer read their output | `component:` must resolve to a `## Capability:` heading |
| 2026-09-18 | The doctor keeps three checks — `active_sprint` (track overlap), `sprint_shape`, `in_flight_trace` (unmoored `[~]`); `in_flight_staleness` and `context_bloat` are deleted (v0.13.0, epic #456, #458). `next.sh` / `status.sh` render through `sprint-state.js --format text`, so the next batch has one implementation (v0.14.0, epic #467, #468) | staleness and bloat were judgments the session makes by reading the file; two parsers of one sprint file could disagree on the next batch | 2026-09-17 doctor row (five checks); bash-side batch selection in `next.sh` |
| 2026-09-19 | Relay deprecated: the `sprint-state` JSON is the fresh-session recovery rail, not a consumer contract; `[run:id]` pointers and the `run_id` field are deleted; `[~]` is moored by a PR or branch pointer only | no reader left for run pointers | the `[run:id]` pointer grammar and the "explicit no-work-yet annotation" clause in sprint-execution's Expected Behaviors (multi-track PRD, 2026-07) |
| 2026-09-20 | Sprint close stays warn-only: `sprint-close.sh` prints `Warning: N todo, M in-flight items remaining` and closes anyway, and the Expected Behavior is amended to say so; no script change | whether an item is "explicitly struck in Progress" is prose the session writes and no deterministic check can read, and the irreversible part (`status: completed` never flips back) is already a Hard Constraint; adding a refusal plus a `--force` flag would be a new rail against the charter's subtraction direction | the "runs only when every Plan item is `[x]` or explicitly struck in Progress" clause in this capability's Expected Behaviors |

---

Expand Down
Loading