QEP-3: Accepted - #29
Merged
Merged
Conversation
Applies the terminal outcome in the three places AGENTS.md requires: the YAML frontmatter, the in-document header table's Status row, and the README index row. QEP-3 has been merged to main carrying status Draft since 2026-07-10 (d5490fe), with no open PR — a state QEP-1's lifecycle table does not admit, since it defines Draft as "under discussion on an open PR" and records that Accepted, Rejected and Withdrawn QEPs are all merged. Its discussion field points at its own merged PR, so there has been no venue in which the discussion its status asserted could take place. Accepting rather than re-opening: the naming families are in live use across the org (status-*, project-*, workspace-*, action-*) and are load-bearing for the projects registry; the document has drawn no objection in two months; and the Adoption-is-obligations rule it establishes is already cited by QEP-1 v2. This also unblocks #25, which holds the proposal-*/grant-* family question and states that it lands as an amendment to QEP-3 after acceptance. No version field: implicitly v0 until first amended. Discussion of the anomaly and the two options is on #27. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Hwm5shrGXmaq4r3Lp9kS33
This was referenced Sep 8, 2026
mmcky
added a commit
that referenced
this pull request
Sep 9, 2026
…cend (#30) Two mechanical changes and the `AGENTS.md` text that follows from them. Ruled 2026-09-08; discussion on #26, items 2 and 4. **No QEP text changes**, so no version question — QEP-1's own *Automation* section wants a matching edit and that lands with the v4 amendment carrying #26's other items. ## 1. The README index is generated `stamp.mjs` previously synced the `Type` and `Version` columns of rows that already existed. It now **rebuilds the whole table from each QEP's frontmatter, ordered by number** (`renderIndex`/`buildRow` in `qeps.mjs`, which read column positions from the table header so a reordered or extended table needs no code change). `check.mjs` no longer requires a PR to carry its own row and no longer enforces `Type`/`Status`/`Version` parity — a stale table is a **warning, not a failure**. **Why.** The table is a merge-conflict magnet: four open QEP PRs contend for rows in one table, and #18 is currently unmergeable on that single line against QEP-3's row. **What this does and does not fix.** A branch that *already* carries a row will still conflict textually — strip the row. But a **mis-resolved index conflict is now self-healing**, because the post-merge regeneration restores the table from frontmatter whatever the resolution did to it. So a QEP that merges out of numeric order slots into position automatically, and gaps while drafts are open need no later hand-insertion. That last point is the answer to "what if QEP-6 merges before QEP-5". ## 2. Ordered-list markers must ascend in source Markdown **renumbers an ordered list on render**, so a source list reading `1., 2., 2., 3., 4.` displays as 1–5 while every external *"clause N"* citation silently shifts by one. QEP-6's Adoption section is exactly that, and it survived a twelve-amendment review (#19), a field report and four PR comments. Fenced blocks are exempt; blank lines do not end a run; a more-indented line is treated as an item's continuation and a deeper list as independent. ## 3. `AGENTS.md` follows, in four places - The index section now says the table is generated and must not be hand-edited, with the gap and conflict behaviour spelled out. - *Drafting* and *Accepting* stop telling authors to write a row — status lives in **two** places in the document, not three. - A new section: **cite a section by its heading, not its number.** Inserting §2 into QEP-6 mid-draft renumbered §2–§7 to §3–§8 and forced a correction onto a ruling that had already cited them; the `qe` skills, the dashboard's tracker contract and several tracking issues all cite these. - *Accepting* also records that a merged QEP may not carry `status: Draft` — QEP-3 did, for two months (#27, being fixed in #29). ## Verification Each claim was tested rather than reasoned about: | Test | Result | |---|---| | Generator against the current index | reproduces it **byte-for-byte** — a no-op on correct input | | `check.mjs` with QEP-6's file present and no row for it | passes, with the warning — the relaxation works | | Monotonic check against the real `qep-0006-project-trackers.md` | reports line 364 against line 349 — catches the live defect | | `stamp.mjs` on a correct tree | *nothing to stamp or sync* | | `stamp.mjs` after deleting QEP-3's row **and** flipping QEP-2's `Status` to `Draft` | both repaired; tree returns to the committed content exactly | `node .github/scripts/check.mjs` → *QEP checks passed.* `node .github/scripts/check-labels.mjs` → *Label appendix checks passed (1 companion file(s)).* ## Suggested landing order Before #18's QEP-6 repairs — it makes that PR's one-line `dirty` conflict disappear rather than needing a both-rows resolution. The `check.mjs` condition refusing `status: Draft` on `main` is deliberately **not** here: it must land after #29, or it fails on QEP-3 itself. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01Hwm5shrGXmaq4r3Lp9kS33 --- _Generated by [Claude Code](https://claude.ai/code/session_01Hwm5shrGXmaq4r3Lp9kS33)_ --------- Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Matt McKay <mmcky@users.noreply.github.com>
mmcky
added a commit
that referenced
this pull request
Sep 14, 2026
…d QEPs (#35) Found while verifying the stamp after #34: QEP-5 merged Accepted with no `version` and a `–` in the index, as QEP-3 did at #29. QEP-1 v3 (§ Automation, and Adoption item 4) says the post-merge stamp writes `version: 0` alongside the hash into any QEP that has left Draft and carries no `version`, and backfills already-merged QEPs with the most recent commit that touched each. AGENTS.md documents that behaviour too. `stamp.mjs` never got the change: it still skips an unversioned QEP with `// v0 — no version to stamp`. **What changes** - `stamp.mjs` stamps every non-Draft QEP that has no `version`: a QEP merged by this push takes this SHA; one already on `main` takes the last non-bot commit that touched it. Changed, versioned QEPs are re-stamped exactly as before. A run that starts from the bot's own `[skip-stamp]` commit treats nothing as changed, so a manual run never re-anchors a QEP to a stamp commit. Drafts are never stamped. - `stamp-version.yml` also fires on `.github/scripts/**` (so this backfill runs when this PR merges) and on `workflow_dispatch`. - A comment in `qeps.mjs` no longer calls an absent `version` an implicit v0. **What the merge will do**, from a local run of the script on `main`: | QEP | Before | After | |---|---|---| | QEP-3 | – | v0 @ `d7b1f24` (#29, its acceptance merge) | | QEP-5 | – | v0 @ `8cdca64` (#34, its acceptance merge) | Nothing in `qeps/` is edited by hand in this PR. QEP-1 and QEP-2 are already stamped and are untouched. A second local run reports nothing to stamp, so the script stays idempotent. **Not in scope:** the "theme's version pill" QEP-1 v3 also names has no implementation in this repo (the site is the stock book-theme), so #22 stays open for that half. `check.mjs` is unchanged: after the backfill no QEP on `main` is unversioned, so its "a first version must be 1" rule only ever meets a hand-written `version` on a new QEP, which AGENTS.md already says to omit. Assisted-by: Claude Code (Claude Fable 5.1) 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Applies QEP-3's terminal outcome in the three places
AGENTS.mdrequires: the YAML frontmatter, the in-document header table's Status row, and the README index row. Three lines across two files; noversionfield, so QEP-3 stays implicitly v0 until first amended.Why this PR exists
QEP-3 has been merged to
maincarryingstatus: Draftsince 2026-07-10 (d5490fe), with no open PR. QEP-1's lifecycle table defines Draft as "Under discussion on an open PR" and records that "Accepted, Rejected, and Withdrawn QEPs are all merged … only abandoned or spam drafts are closed without merging." QEP-3 is in neither category, and itsdiscussion:field points at its own merged PR #7 — so there has been no venue in which the discussion its status asserted could take place.The anomaly and the two ways out are discussed on #27.
Why accept rather than re-open
status-*,project-*,workspace-*,action-*— and are load-bearing for the projects registry's programme and project rows.proposal-*andgrant-*families in place of the grant singletons #25, which holds theproposal-*/grant-*family question and states in its first line that it "lands as an amendment to QEP-3 after acceptance". That issue also describes QEP-3 as "pending in QEP-3: Repository Naming and Types #7", which is stale — QEP-3: Repository Naming and Types #7 merged.Checks
node .github/scripts/check.mjs→ QEP checks passed.node .github/scripts/check-labels.mjs→ Label appendix checks passed (1 companion file(s)).The header table's Status cell was re-padded to the file's fixed column width, so the diff is three content lines and no whitespace noise.
Not merged by this PR
Per
AGENTS.md, an accepted QEP's PR is merged, not closed — but the merge is the maintainers' call, so this is left open for that. Two follow-ups are proposed elsewhere and are deliberately not in this diff:check.mjscondition refusingstatus: Draftonmain, which would have caught this at the merge commit (Process: the decision deadline is unenforced — four open QEPs, none decidable #26; it must land after this PR, or it fails on QEP-3 itself);🤖 Generated with Claude Code
https://claude.ai/code/session_01Hwm5shrGXmaq4r3Lp9kS33
Generated by Claude Code