Skip to content

chore: compact _context.md to the current state - #487

Merged
sungjunlee merged 4 commits into
mainfrom
chore/context-compaction
Sep 20, 2026
Merged

sungjunlee merged 4 commits into
mainfrom
chore/context-compaction

Conversation

@sungjunlee

@sungjunlee sungjunlee commented Sep 20, 2026 •

Copy link
Copy Markdown
Owner

Summary

.dev-backlog/sprints/_context.md is the first file every session reads, and several of its lines had gone false across 36 completed sprints. This rewrites it against today's contracts (skills/dev-backlog/SKILL.md, references/authority-contract.md, charter rev 20, spec/capabilities.md, CHANGELOG 0.12.0–Unreleased) so a fresh session reads only what is still true and still changes behaviour.

55 → 31 lines (wc -l, after three review rounds). The three headings (Architecture Decisions / Conventions / Known Gotchas) stay; one line per item, no dates that carry no meaning, no per-model reviewer attributions. Completed sprint files and spec/* are untouched.

Dropped, and why

Dropped Why
"GitHub-only since v0.12.0 … .tracker is parked … a leftover .tracker is ignored" False since v0.15.0: .tracker is the one-line declared task authority (absent = github; backlog/files; gitlab), read by readTaskAuthority in lib.js and a mirrored bash guard in sprint-close.sh.
"Tracker generality is a charter Non-Goal (rev 19) … do not re-add … a selection file" Superseded by charter rev 20: the Non-Goal is a tracker abstraction in code; the one-line selection is the supported mechanism.
Relay-shaped lines (JSON as a dev-relay contract, Learnings routing) Relay deprecated 2026-09-19. The sprint-state JSON is the fresh-session recovery rail; [~] is moored by → PR #N (state) or [branch:name] only.
docs/conformance/2026-09-17-tracker-wave.md as the harness recipe That file no longer exists. The recipe and the retention rule live in docs/conformance/README.md; the only report is docs/conformance/2026-09-18-wave5.md.
Script line-count inventories (2,255 lines / 11 files, the 13-vs-14 miscount) Stale every wave. Replaced by the rule not to quote counts in this file at all — the tests/tools/ drift-check warning is kept.
#366-closed-without-a-matrix, wave-3/wave-4 epic framing, the lib.sh DEFAULT_BACKLOG_DIR incident, setup/config.yml preservation, "prefer minimal-diff refactors", "script interfaces stay stable" History or bookkeeping with no behaviour attached; config.yml is gone from the tree and the last two are subsumed by the keep test.

Merged rather than dropped: the keep test appeared twice; the several "Astra caught X" gotchas collapse into one cross-family-review convention plus the two-parsers-drift rule; the spec-fallback boundary (two lines → one), the optional objectives:/component: rules (two → one), and the measurement-hygiene lessons (one stated glob, path.join, no quoted line counts) are one line each.

Kept

Every behaviour-changing rule survives: the one scopesOverlap predicate; commit the sprint file when opening it; JSON surfaces as the machine path (extend, don't add parsers); no unconditional cross-repo ../spec-charter/ read and the consumption-side-only references/spec-fallback.md; optional objectives:/component:; SKILL.md goal/rail/Done-when discipline and "re-add prose only after a conformance run shows a repeated mistake"; evals in tests/evals/; the keep test's three criteria (delete, don't rewrite); the four surfaces scripts own; the fail-closed Work rail (gh issue view N --json body,comments, Agent Brief, spec_ref:); session-written GitHub-only backlog-triage and its protection rule; the gh issue create no---json trap; the fully offline smoke test; v1.0.0 is not a cleanup cut; capture $? before gh pr merge; the in-flight pointer grammar; reject deleted flags explicitly; amend acceptance on the issue rather than trim to a number; path.join in Windows-facing tests; one stated test glob; two parsers of one file drift → route through node; no line budgets for subagents; and every change landing via a PR with independent cross-family review until LGTM.

Verification

node --test --test-concurrency=1 tests/*.test.js tests/*/*.test.js && bash tests/smoke/smoke-test.sh
  • node: 188 tests, 187 pass, 0 fail, 1 skipped (unchanged from main)
  • smoke: 167 tests, 167 passed, 0 failed (unchanged from main)
  • chain exit code 0; node tests/tools/doc-drift-check.js → OK: no dangling script mentions (7 docs against 14 scripts)

CHANGELOG gains one line at the top of ## [Unreleased] → ### Changed.

🤖 Generated with Claude Code

https://claude.ai/code/session_01X9gZYk7FcYSLAZBBe7JXvZ

Independent review

  • Round 1 (GPT-6 Astra, codex exec): CHANGES REQUESTED — scripted authority exceptions, sprint-init field truth, commit-to-main rule. Fixed.
  • Round 2: CHANGES REQUESTED — Agent Brief scope, G4 text anchor, conformance cadence, setup re-run preservation. Fixed.
  • Round 3: CHANGES REQUESTED — CLI-contract rule, triage evidence lookup rule, PR body count. Fixed.

@coderabbitai

coderabbitai Bot commented Sep 20, 2026 •

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Advanced

Run ID: 1d4e0555-5ab7-430d-8c18-60c75c12d4eb


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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 20, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-09-20T04:32:32.616052Z 3331076 New commits
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

`_context.md` is read first by every session, so it has to be true today,
not a record of 36 sprints. 55 -> 30 lines (`wc -l`), one line per item,
three headings kept.

Dropped as false or superseded:

- "GitHub-only since v0.12.0 ... `.tracker` is parked ... a leftover
  `.tracker` is ignored" — v0.15.0 made `.tracker` the one-line declared
  task authority (absent = github; backlog/files; gitlab), read by
  `readTaskAuthority` in `lib.js` and a mirrored guard in `sprint-close.sh`.
- "Tracker generality is a charter Non-Goal (rev 19) ... do not re-add ...
  a selection file" — charter rev 20 scopes the Non-Goal to a tracker
  abstraction *in code*; the one-line selection IS the supported mechanism.
- Relay-shaped lines: relay was deprecated 2026-09-19, so the
  `sprint-state` JSON is the fresh-session recovery rail rather than a
  consumer contract, and `[~]` is moored by `-> PR #N (state)` or
  `[branch:name]` only.
- `docs/conformance/2026-09-17-tracker-wave.md` — deleted from the tree;
  the harness recipe and the retention rule now live in
  `docs/conformance/README.md`.
- Script line-count inventories (2,255 lines / 11 files, the 13-vs-14
  miscount) — stale every wave; replaced by the rule not to quote counts
  here at all.
- Historical bookkeeping with no behaviour attached: #366 closing without
  a matrix, the wave-3/wave-4 epic framing, the `lib.sh`
  `DEFAULT_BACKLOG_DIR` incident, setup/`config.yml` preservation
  (`config.yml` is gone), "prefer minimal-diff refactors" and "script
  interfaces stay stable" (both subsumed by the keep test).

Merged, not dropped: the keep test appeared twice; the per-model
"Astra caught X" gotchas collapse into one cross-family-review convention
plus the two-parsers-drift rule; the spec-fallback boundary, the optional
`objectives:`/`component:` rules, and the measurement-hygiene lessons
(one stated glob, `path.join`, no quoted line counts) are one line each.
Attributions to a specific reviewer model and dates that carry no meaning
are gone.

Every "keep" rule survives: the one `scopesOverlap` predicate, commit the
sprint file when opening it, JSON surfaces as the machine path, no
unconditional cross-repo `../spec-charter/` read, SKILL.md
goal/rail/Done-when discipline, evals in `tests/evals/`, the four surfaces
scripts own, the fail-closed Work rail, session-written GitHub-only
triage, the `gh issue create` flag-parsing trap, the offline smoke test,
v1.0.0 not being a cleanup cut, capturing `$?` before `gh pr merge`, the
in-flight pointer grammar, explicit rejection of deleted flags, amending
acceptance instead of trimming to a number, and no line budgets for
subagents.

Completed sprint files and `spec/*` are untouched.

Verification: `node --test --test-concurrency=1 tests/*.test.js
tests/*/*.test.js` 188 tests / 187 pass / 0 fail / 1 skipped, and the
smoke test 167/167; the doc-drift check reports no dangling script
mentions.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X9gZYk7FcYSLAZBBe7JXvZ
@sungjunlee
sungjunlee force-pushed the chore/context-compaction branch from 71f1add to 5e72836 Compare September 20, 2026 04:25

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 71f1add5bb

ℹ️ 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".

Comment thread .dev-backlog/sprints/_context.md Outdated
- Milestones, PR relationships, comments, and closing semantics are plain `gh` calls the session (or one small bash guard in `sprint-close.sh`) makes. (Mirrors and progress issues were removed by #340/#347.)
- Setup re-runs preserve user-authored configuration and task bytes; `config.yml` is neither read nor written by this skill.
- Active sprints partition by track scope (2026-07, epic #289): `component:` equality or explicit `scope:` globs decide overlap through the ONE `scopesOverlap()` in `scripts/lib.js` — never re-implement it. Disjoint tracks coexist as a portfolio; overlap fails loud; single-track behavior is the G4 text-byte-identity compatibility surface (anchored in the smoke test; never snapshot `--json`, which is schema-versioned instead).
- One declared task authority: `.dev-backlog/.tracker` is one line the session reads (absent = `github`; `backlog` for the Backlog.md CLI, `files` as its legacy spelling; `gitlab`), parsed by `readTaskAuthority` in `scripts/lib.js` and by a mirrored guard in `scripts/sprint-close.sh`. The rails are the SKILL.md Task Authority table; there is no adapter in code (charter rev 20 Non-Goal), so adding an authority is one table row plus one allow-list entry and needs a measured consumer (GitLab is the stated exception). Scripts never call `gh`/`backlog`/`glab` for task state; milestones, comments, PR links, and closing are calls the session makes.

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 Keep the scripted authority-call exceptions

This now tells every session that authority mutations are exclusively session calls, but sprint-close.sh --close-milestone invokes gh api, while triage-apply.js --apply invokes gh issue view/comment/close/edit; the authority contract explicitly preserves both scripted exceptions. A maintainer following this operational context could incorrectly duplicate or remove those guarded paths, so retain the prior exception or point readers to the authoritative exclusion list.

AGENTS.md reference: AGENTS.md:L39-L41

Useful? React with 👍 / 👎.

…mit rule, and sprint-init field truth

Astra round 1: (1) milestone close and triage-apply are scripted
authority calls kept by authority-contract.md; (2) sprint-init never
emits objectives: and takes --component as a free string; (3) the
sprint file must reach main, not just a branch, to be visible to
delegate worktrees.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X9gZYk7FcYSLAZBBe7JXvZ
@sungjunlee

Copy link
Copy Markdown
Owner Author

Independent review round 1 (GPT-6 Astra via codex exec, with the pre-PR _context.md, authority-contract, and charter as extra context): CHANGES REQUESTED — (1) dropped the two scripted authority exceptions (--close-milestone, triage-apply --apply); (2) objectives:/component: line still implied a spec lookup; (3) "commit to main" lost its target branch. All three fixed in the second commit.

…ce cadence, setup re-run preservation

Astra round 2: four still-true rules had been dropped or widened.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X9gZYk7FcYSLAZBBe7JXvZ
@sungjunlee

Copy link
Copy Markdown
Owner Author

Independent review round 2 (GPT-6 Astra): CHANGES REQUESTED — (1) Agent Brief precedence widened beyond GitHub and spec_ref: lost its body-only scope; (2) single-track G4 text anchor / never-snapshot-JSON rule dropped; (3) conformance cadence (per release tag + rail change) dropped; (4) setup re-run byte preservation dropped. All four restored in the third commit; 55 → 31 lines.

Astra round 3.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X9gZYk7FcYSLAZBBe7JXvZ
@sungjunlee

Copy link
Copy Markdown
Owner Author

Independent review round 3 (GPT-6 Astra): CHANGES REQUESTED — (1) script CLI contracts change only via an explicit issue; (2) triage fetches comments/closing PRs only when a judgment needs them. Both restored in the fourth commit; PR body count corrected to 55 → 31.

@sungjunlee

Copy link
Copy Markdown
Owner Author

Independent review round 4 (GPT-6 Astra): LGTM.

@sungjunlee
sungjunlee merged commit ad32042 into main Sep 20, 2026
3 checks passed
@sungjunlee
sungjunlee deleted the chore/context-compaction branch September 20, 2026 04:31
sungjunlee added a commit that referenced this pull request Sep 20, 2026
…, five contradictions)

Round-1 findings from the independent cumulative release review (GPT-6 Astra)
over v0.15.0..release. Seven items:

1. Numbers. The CHANGELOG Headline and the PR body quoted the delta excluding
   the release commit. Re-measured `git diff --numstat v0.15.0..HEAD`:
   +298 / -3,659 over 69 files (was +166 / -3,210 over 59). Shipped scripts
   were not unchanged: 2,301 -> 2,298 lines, 11 files both.
2. Review history. "seven reviewed PRs" overstated it: #482 (docs prune) had no
   independent review before merge. Now stated as six reviewed to LGTM before
   merge (#481, #483-#487), with #482 covered by the cumulative release review
   of the v0.16.0 PR.
3. `spec/system-map.md` Complete flow said "close an admitted sprint only when
   its whole Plan is done", contradicting SKILL.md and capabilities: close when
   every Plan item is `[x]` or the rest are struck or carried with a Progress
   entry (`sprint-close.sh` only warns).
4. `README.md` in-flight example used `-> PR #87`, which is not the parser
   grammar and so reads as unmoored; now `-> PR #87 (reviewing)` with U+2192,
   matching `PR_RE` in `sprint-state.js`. `spec/capabilities.md` Hard
   Constraint now says convert to `[~]` moored by a PR or branch pointer plus a
   parking note, since a note alone leaves it unmoored.
5. `skills/dev-backlog/references/authority-contract.md` claimed `triage-apply
   --apply` is one call per accepted action and that re-running a failed command
   is safe except for a create. It is not: a close is comment-then-close and a
   priority change looks the labels up first, so a lost response can duplicate a
   comment. Reworded to no automatic retry, and verify the target's state before
   re-running any non-idempotent write (create, comment, close).
6. `spec/charter.md` Non-Goals said the GitLab row "costs one line of prose and
   no code", contradicting capabilities and `_context.md`; now "one table row
   and one allow-list entry, no adapter code". Prose only; Decision rows
   untouched.
7. `CLAUDE.md` said "scripts own everything checkable", contradicting the keep
   test; now names the four kept surfaces (sprint-file contract, fail-loud
   shared-state guards, the `sprint-state` JSON recovery rail, the
   `triage-apply` human gate) and says anything else is deleted, not rewritten.

Verification: `node --test --test-concurrency=1 tests/*.test.js
tests/*/*.test.js` 188 tests / 187 pass / 0 fail / 1 skipped, then
`bash tests/smoke/smoke-test.sh` 167 tests / 167 passed / 0 failed; chained
with `&&`, exit 0. No test asserted any of the replaced sentences, so no
assertion needed updating.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X9gZYk7FcYSLAZBBe7JXvZ
sungjunlee added a commit that referenced this pull request Sep 20, 2026
* chore(release): v0.16.0

The deprecation release: dev-backlog names no delegate, its docs and
dogfood state describe only the current lightweight direction, and the
spec says what the scripts do.

- VERSION 0.15.0 -> 0.16.0
- CHANGELOG: the Unreleased items become [0.16.0] - 2026-09-20 with a
  Headline paragraph (measured deltas, conformance file, BREAKING,
  rollback point); the .dev-backlog leftover cleanup (#483) and the new
  conformance record get their own bullets; Unreleased is left empty
- docs/conformance/2026-09-20-v0160.md + 2026-09-20-v0160/ (prompt and
  both model outputs); the wave-5 report and raw dir are deleted per the
  retention rule in docs/conformance/README.md

Range v0.15.0..HEAD is PRs #481-#487: +166 / -3,210 lines over 59 files;
SKILL.md 165 -> 164; sprint-state.js 697 -> 694; shipped scripts 11 files
/ 2,298 lines; smoke 170 -> 167 assertions.

Conformance (deletion-and-wording wave, one after-run per model against
the wave-5 record, current 13-scenario evals x current SKILL.md):
Claude Fable 5.1 13/13 PASS, GPT-6 Astra 13/13 PASS with the same single
Plan-fold MUT note as wave 5. Identical profile, no regression.

BREAKING: the sprint-state JSON run_id field is deleted and the [run:id]
Plan grammar is dropped; a legacy trailing [run:...] is stripped and
ignored rather than parsed. Rollback point: tag v0.15.0.

Verified: node --test 188 tests / 187 pass / 0 fail / 1 skipped (includes
the doc-drift check); smoke 167/167.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X9gZYk7FcYSLAZBBe7JXvZ

* chore(release): apply release review round 1 (numbers, review history, five contradictions)

Round-1 findings from the independent cumulative release review (GPT-6 Astra)
over v0.15.0..release. Seven items:

1. Numbers. The CHANGELOG Headline and the PR body quoted the delta excluding
   the release commit. Re-measured `git diff --numstat v0.15.0..HEAD`:
   +298 / -3,659 over 69 files (was +166 / -3,210 over 59). Shipped scripts
   were not unchanged: 2,301 -> 2,298 lines, 11 files both.
2. Review history. "seven reviewed PRs" overstated it: #482 (docs prune) had no
   independent review before merge. Now stated as six reviewed to LGTM before
   merge (#481, #483-#487), with #482 covered by the cumulative release review
   of the v0.16.0 PR.
3. `spec/system-map.md` Complete flow said "close an admitted sprint only when
   its whole Plan is done", contradicting SKILL.md and capabilities: close when
   every Plan item is `[x]` or the rest are struck or carried with a Progress
   entry (`sprint-close.sh` only warns).
4. `README.md` in-flight example used `-> PR #87`, which is not the parser
   grammar and so reads as unmoored; now `-> PR #87 (reviewing)` with U+2192,
   matching `PR_RE` in `sprint-state.js`. `spec/capabilities.md` Hard
   Constraint now says convert to `[~]` moored by a PR or branch pointer plus a
   parking note, since a note alone leaves it unmoored.
5. `skills/dev-backlog/references/authority-contract.md` claimed `triage-apply
   --apply` is one call per accepted action and that re-running a failed command
   is safe except for a create. It is not: a close is comment-then-close and a
   priority change looks the labels up first, so a lost response can duplicate a
   comment. Reworded to no automatic retry, and verify the target's state before
   re-running any non-idempotent write (create, comment, close).
6. `spec/charter.md` Non-Goals said the GitLab row "costs one line of prose and
   no code", contradicting capabilities and `_context.md`; now "one table row
   and one allow-list entry, no adapter code". Prose only; Decision rows
   untouched.
7. `CLAUDE.md` said "scripts own everything checkable", contradicting the keep
   test; now names the four kept surfaces (sprint-file contract, fail-loud
   shared-state guards, the `sprint-state` JSON recovery rail, the
   `triage-apply` human gate) and says anything else is deleted, not rewritten.

Verification: `node --test --test-concurrency=1 tests/*.test.js
tests/*/*.test.js` 188 tests / 187 pass / 0 fail / 1 skipped, then
`bash tests/smoke/smoke-test.sh` 167 tests / 167 passed / 0 failed; chained
with `&&`, exit 0. No test asserted any of the replaced sentences, so no
assertion needed updating.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X9gZYk7FcYSLAZBBe7JXvZ

* chore(release): before/after conformance pair, strict regrade, release-review record

Astra release review round 1 items 3 and 4: add the v0.15.0-SKILL.md
before-runs for both models, regrade scenarios 1 and 8 as PARTIAL under
the Expected text, count Astra MUT 0, and record the review round.
Also fix the ASCII arrow in the file-format in-flight example.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X9gZYk7FcYSLAZBBe7JXvZ

* chore(release): re-measure the cumulative delta

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X9gZYk7FcYSLAZBBe7JXvZ

* chore(release): thousands separator

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X9gZYk7FcYSLAZBBe7JXvZ

* chore(release): release review round 2 — consistent strict grading, _context.md baseline 52

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X9gZYk7FcYSLAZBBe7JXvZ

* chore(release): release review round 3 — Astra before scenario 7 regraded PARTIAL

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X9gZYk7FcYSLAZBBe7JXvZ

* chore(release): release review round 4 LGTM — narrow the scenario-9 claim

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X9gZYk7FcYSLAZBBe7JXvZ

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
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