Skip to content

QEP-3: Accepted - #29

Merged
mmcky merged 1 commit into
mainfrom
claude/qep3-accept-status
Sep 8, 2026
Merged

QEP-3: Accepted#29
mmcky merged 1 commit into
mainfrom
claude/qep3-accept-status

Conversation

@quantecon-services

Copy link
Copy Markdown
Collaborator

Applies QEP-3's 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. Three lines across two files; no version field, so QEP-3 stays implicitly v0 until first amended.

Why this PR exists

QEP-3 has been merged to main carrying status: Draft since 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 its discussion: 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

Checks

node .github/scripts/check.mjsQEP checks passed.
node .github/scripts/check-labels.mjsLabel 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:

🤖 Generated with Claude Code

https://claude.ai/code/session_01Hwm5shrGXmaq4r3Lp9kS33


Generated by Claude Code

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
@mmcky
mmcky merged commit d7b1f24 into main Sep 8, 2026
1 check passed
@mmcky
mmcky deleted the claude/qep3-accept-status branch September 8, 2026 22:40
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>
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.

3 participants