docs: replace discussion intake with proposals #262

Merged
andres merged 3 commits from build/247-proposal-intake into main 2026-08-25 15:09:51 +00:00

Refs #247

This PR deliberately weakens the single-writer rule: only triage mints work issues; anyone may file a proposal, which triage converts or refuses.

The proposal form applies no labels; the existing reconciler author check supplies the automatic needs-triage stamp for non-triage authors.

Worklog

  • Add the unlabeled proposal form and reroute the issue-template config.
  • Rewrite the enumerated intake doctrine and the work-order form.
  • Remove the obsolete discussion templates and add the grouped changelog fragment.
  • Verify exact discussion residue and constrained diff-stat.
  • Run the full test suite and sanctioned shellcheck sweep; record counts.
  • Complete final diff review.
  • Resolve the closed-list vs. “wherever stated” contract conflict with triage.
  • Apply spec item 4’s amended closed list and push the doctrine-only diff.
  • Re-run the exact residue checks and the full sanctioned verification suite.
  • Complete final diff review and record the amended evidence.
  • Clear the pre-handoff close-reference, triage-input, and chooser-comment findings; push the corrections.
  • Re-run the exact audits and full suite at the correction head.
  • Record final evidence, signal the exact head, and mark the draft ready.

Acceptance criteria

  • docs/CONSUMERS.md's intake checklist item names a mechanism that exists
    on this forge, and carries the one clause covering a forge that does have
    Discussions. No sentence in it asserts that Discussions do not exist.
  • A non-triage actor has a documented, reachable door: proposal.yml exists,
    config.yml routes to it, and no link in .github/ISSUE_TEMPLATE/ points
    at github.com/heavy-duty/ceremony/discussions.
  • proposal.yml carries no labels: key, and the PR states that the
    needs-triage stamp comes from the reconciler's author check.
  • The single-writer rule reads only triage mints work issues at every line
    spec item 4's closed list names and nowhere else is a *.md sentence
    left saying a non-triage actor may not open an issue:
    grep -rn -i mint --include='*.md' . at the PR head returns the corrected
    wording at those lines and every line item 4 excludes unchanged.
    (Amended by triage 2026-08-25T12:52Z: this clause read "wherever it is
    stated", which named no list at all while spec item 6 declared its own
    enumeration closed — the contradiction !262 stopped on.)

    And grep -rn -i discussion --include='*.md' . at the PR head
    returns exactly the residue spec item 6 leaves standing, and nothing
    else: RELEASES.md:21 and :106, LABELS.md:141, drills/0.2.0.md:46,
    and the single docs/CONSUMERS.md clause criterion 1 requires.
    CHANGELOG.md, docs/UPSTREAM-SYNC.md and changelog.d/** are assembled
    or historical records this issue never edits — a match in one of them is
    not a failure, and changelog.d/247.md may use the word freely.
    (Amended by triage 2026-08-25. This read "the RELEASES.md and
    drills/0.2.0.md occurrences spec item 6 excludes, the CONSUMERS.md
    clause of criterion 1, CHANGELOG.md, and docs/UPSTREAM-SYNC.md", which
    omitted the LABELS.md line entirely — a line the spec keeps, so the
    criterion refused its own expected output — and listed two files that
    contain no match at
    all: measured at e55e996, CHANGELOG.md and docs/UPSTREAM-SYNC.md
    each return zero lines.)
    Paste the output in the PR.
  • .github/DISCUSSION_TEMPLATE/ no longer exists in this repo.
  • No file under actions/, lib/, bin/, .github/workflows/ or
    .github/scripts/ has a diff, and neither does .github/labels.conf.
    git diff origin/main..HEAD --stat proves it in the PR.
  • bash test/run.sh is green whole at the PR head; git diff --check clean.
  • Post-merge — triage owns the close. This PR says Refs #247; triage
    closes the issue by hand only after the criterion is met.
    The crew-side follow-up is minted
    and linked here: crew's dead .github/DISCUSSION_TEMPLATE/ removed and the
    per-tick discussion-probe WARN silenced or repurposed in crew's engine
    (spec item 8). Wake condition: this issue's PR merges. Triage mints it in
    that tick and ticks this criterion; an auto-close would leave it unticked
    with no transition comment.

Verification evidence

Exact mint audit (the five in-scope rule/mechanism lines are corrected; item 4’s named exclusions remain unchanged):

./LABELS.md:89:`post-merge` to `ready` or mints a fresh `ready` issue. Any builder may claim
./RELEASES.md:105:1. Mint the epic's “to mint when this arc opens” list together with findings,
./RELEASES.md:121:finds no work worth minting, the operator either folds the empty window into a
./RELEASES.md:151:splits the remainder**: mint a fresh issue carrying the outstanding criteria
./RELEASES.md:154:mints work issues and `post-merge` is its completion queue (#329).
./test/fixtures/CHANGELOG.realistic.md:11:- A mint records its provenance and reports it back.
./README.md:181:| 4 | version bare, unchanged, **never released** | **red, nothing created** | The label says ship but this PR did not mint the version. Mislabeled → drop the label. Meant to release → it forgot the bump; re-do the ceremony PR. A repo whose first version never carried `-dev` ships its first release by the **tag door** — the known first-release edge (cast#111; [lib/decide.sh](lib/decide.sh#L70-L74)). |
./README.md:422:> the version '$VER' is bare, unchanged by this PR, and never released — the label says ship but this PR did not mint the version. Refusing to guess — creating nothing.
./AGENTS.md:40:- **Only triage mints work issues.** Found work? File or extend a proposal.
./TRIAGE.md:28:   answers would let you write the issue — then stop and wait. Do not mint an
./TRIAGE.md:39:   blocks something already on the board — an existing issue, or minted work
./TRIAGE.md:64:   This is not a substitute for minting work or for `needs-ruling`.
./TRIAGE.md:68:5. **Accept.** It justifies work → mint the issue(s). The contract below is
./TRIAGE.md:73:Every issue you mint carries, in this order:
./TRIAGE.md:104:  During a standing release window, every mint also gets a binary membership
./TRIAGE.md:127:When an acceptance produces more than one issue, mint an **epic** (`epic`
./TRIAGE.md:139:- **Dedup before minting** — search issues *and* closed issues; extend or
./TRIAGE.md:147:  build work becomes necessary, move it to `ready` or mint a fresh `ready`
./TRIAGE.md:165:- Mint a work issue to explore an idea — file a proposal instead.
./CHANGELOG.md:436:  converge a review round and `triage-actors=` made every issue a stray mint
./CHANGELOG.md:555:- Standing release windows are dependency DAGs: every mint is placed in the window or behind it, and only current sources are `ready` (#292).
./docs/CONSUMERS.md:406:    # cron cannot wait one cadence for: opened → the mint→needs-triage check,
./docs/CONSUMERS.md:523:mint→`needs-triage` check and `closed` the blocker-closes→`ready` self-heal;
./docs/CONSUMERS.md:608:allowed to mint work issues without the sweep applying `needs-triage`. Label rows use exactly
./docs/CONSUMERS.md:897:      triage mints work issues; anyone may file a proposal, which triage
./docs/RUNNER-PROBES.md:24:and each was minted for one probe and then wanted again.
./docs/RUNNER-PROBES.md:35:it rather than minting a fourth one.
./BUILDER.md:106:  the issue to `ready` or minting a fresh one where corrective work is
./BUILDER.md:144:  you do not mint work issues — nobody but triage does — and you do not fix
./CONTRIBUTING.md:20:- **Work issues are minted only by triage.** Nobody else writes work issues —
./CONTRIBUTING.md:51:| `claude-bot-andresmgsl` | `triage` (claude-box) | **triage** — the only door work issues come through; this identity mints work issues and nothing else writes them (#18's `triage-actors`) — and review. It does not build. |
./CONTRIBUTING.md:73:`triage-actors=` naming an absent user makes every issue a stray mint that

Exact required discussion residue:

./LABELS.md:141:including a hard block. Active discussion still climbs the ladder; by
./RELEASES.md:21:member lists or ordering. crew's roadmap discussion [heavy-duty/crew#338](https://github.com/heavy-duty/crew/discussions/338)
./RELEASES.md:106:   deferred work, and discussion outcomes accumulated since the epic was
./drills/0.2.0.md:46:(discussion #132). An empty armed-state baseline commit then ran green as
./docs/CONSUMERS.md:862:      `needs-triage` flow. A repo whose forge provides Discussions may keep

Constrained diff-stat:

 .github/DISCUSSION_TEMPLATE/ideas.yml | 19 -------------------
 .github/DISCUSSION_TEMPLATE/q-a.yml   | 15 ---------------
 .github/ISSUE_TEMPLATE/config.yml     | 15 +++++++--------
 .github/ISSUE_TEMPLATE/proposal.yml   | 34 ++++++++++++++++++++++++++++++++++
 .github/ISSUE_TEMPLATE/work-order.yml |  6 +++---
 AGENTS.md                             | 10 +++++-----
 BUILDER.md                            |  4 ++--
 CONTRIBUTING.md                       | 25 +++++++++++++------------
 FLEET.md                              |  2 +-
 LABELS.md                             |  4 ++--
 RELEASES.md                           |  2 +-
 REVIEWER.md                           |  4 ++--
 TRIAGE.md                             | 29 ++++++++++++++++-------------
 changelog.d/247.md                    |  3 +++
 docs/CONSUMERS.md                     | 12 +++++++-----
 15 files changed, 96 insertions(+), 88 deletions(-)
  • bash test/run.sh: 31 test files passed, 0 failed.
  • bash .github/scripts/shellcheck-all.sh: 64 tracked scripts linted, clean.
  • bash .github/scripts/actionlint-all.sh: 9 workflows linted, clean.
  • test/labels.test.sh: 44 passed, 0 failed; .github/labels.conf did not move because the existing reconciler supplies the stamp.
  • git diff --check origin/main..HEAD: clean.
  • Close-reference parser over the final PR body: empty; Refs #247 is non-closing.
  • actions/, lib/, bin/, .github/workflows/, .github/scripts/, and .github/labels.conf: no diff.
  • Independent pre-handoff review: all blocking and non-blocking findings corrected at this head.

Round log

Round at 13add81d

Round passed with no written reply.

Refs #247 This PR deliberately weakens the single-writer rule: only triage mints work issues; anyone may file a proposal, which triage converts or refuses. The proposal form applies no labels; the existing reconciler author check supplies the automatic `needs-triage` stamp for non-triage authors. ## Worklog - [x] Add the unlabeled proposal form and reroute the issue-template config. - [x] Rewrite the enumerated intake doctrine and the work-order form. - [x] Remove the obsolete discussion templates and add the grouped changelog fragment. - [x] Verify exact discussion residue and constrained diff-stat. - [x] Run the full test suite and sanctioned shellcheck sweep; record counts. - [x] Complete final diff review. - [x] Resolve the closed-list vs. “wherever stated” contract conflict with triage. - [x] Apply spec item 4’s amended closed list and push the doctrine-only diff. - [x] Re-run the exact residue checks and the full sanctioned verification suite. - [x] Complete final diff review and record the amended evidence. - [x] Clear the pre-handoff close-reference, triage-input, and chooser-comment findings; push the corrections. - [x] Re-run the exact audits and full suite at the correction head. - [x] Record final evidence, signal the exact head, and mark the draft ready. ## Acceptance criteria - [x] `docs/CONSUMERS.md`'s intake checklist item names a mechanism that exists on this forge, and carries the one clause covering a forge that does have Discussions. No sentence in it asserts that Discussions do not exist. - [x] A non-triage actor has a documented, reachable door: `proposal.yml` exists, `config.yml` routes to it, and no link in `.github/ISSUE_TEMPLATE/` points at `github.com/heavy-duty/ceremony/discussions`. - [x] `proposal.yml` carries no `labels:` key, and the PR states that the `needs-triage` stamp comes from the reconciler's author check. - [x] The single-writer rule reads *only triage mints work issues* at every line **spec item 4's closed list** names and nowhere else is a `*.md` sentence left saying a non-triage actor may not open an issue: `grep -rn -i mint --include='*.md' .` at the PR head returns the corrected wording at those lines and every line item 4 excludes unchanged. *(Amended by triage 2026-08-25T12:52Z: this clause read "wherever it is stated", which named no list at all while spec item 6 declared its own enumeration closed — the contradiction !262 stopped on.)* And `grep -rn -i discussion --include='*.md' .` at the PR head returns **exactly** the residue spec item 6 leaves standing, and nothing else: `RELEASES.md:21` and `:106`, `LABELS.md:141`, `drills/0.2.0.md:46`, and the single `docs/CONSUMERS.md` clause criterion 1 requires. `CHANGELOG.md`, `docs/UPSTREAM-SYNC.md` and `changelog.d/**` are assembled or historical records this issue never edits — a match in one of them is not a failure, and `changelog.d/247.md` may use the word freely. *(Amended by triage 2026-08-25. This read "the `RELEASES.md` and `drills/0.2.0.md` occurrences spec item 6 excludes, the CONSUMERS.md clause of criterion 1, `CHANGELOG.md`, and `docs/UPSTREAM-SYNC.md`", which omitted the `LABELS.md` line entirely — a line the spec keeps, so the criterion refused its own expected output — and listed two files that contain no match at all: measured at `e55e996`, `CHANGELOG.md` and `docs/UPSTREAM-SYNC.md` each return zero lines.)* Paste the output in the PR. - [x] `.github/DISCUSSION_TEMPLATE/` no longer exists in this repo. - [x] No file under `actions/`, `lib/`, `bin/`, `.github/workflows/` or `.github/scripts/` has a diff, and neither does `.github/labels.conf`. `git diff origin/main..HEAD --stat` proves it in the PR. - [x] `bash test/run.sh` is green whole at the PR head; `git diff --check` clean. - [ ] **Post-merge — triage owns the close. This PR says `Refs #247`; triage closes the issue by hand only after the criterion is met.** The crew-side follow-up is minted and linked here: crew's dead `.github/DISCUSSION_TEMPLATE/` removed and the per-tick discussion-probe `WARN` silenced or repurposed in crew's engine (spec item 8). Wake condition: this issue's PR merges. Triage mints it in that tick and ticks this criterion; an auto-close would leave it unticked with no transition comment. ## Verification evidence Exact `mint` audit (the five in-scope rule/mechanism lines are corrected; item 4’s named exclusions remain unchanged): ```text ./LABELS.md:89:`post-merge` to `ready` or mints a fresh `ready` issue. Any builder may claim ./RELEASES.md:105:1. Mint the epic's “to mint when this arc opens” list together with findings, ./RELEASES.md:121:finds no work worth minting, the operator either folds the empty window into a ./RELEASES.md:151:splits the remainder**: mint a fresh issue carrying the outstanding criteria ./RELEASES.md:154:mints work issues and `post-merge` is its completion queue (#329). ./test/fixtures/CHANGELOG.realistic.md:11:- A mint records its provenance and reports it back. ./README.md:181:| 4 | version bare, unchanged, **never released** | **red, nothing created** | The label says ship but this PR did not mint the version. Mislabeled → drop the label. Meant to release → it forgot the bump; re-do the ceremony PR. A repo whose first version never carried `-dev` ships its first release by the **tag door** — the known first-release edge (cast#111; [lib/decide.sh](lib/decide.sh#L70-L74)). | ./README.md:422:> the version '$VER' is bare, unchanged by this PR, and never released — the label says ship but this PR did not mint the version. Refusing to guess — creating nothing. ./AGENTS.md:40:- **Only triage mints work issues.** Found work? File or extend a proposal. ./TRIAGE.md:28: answers would let you write the issue — then stop and wait. Do not mint an ./TRIAGE.md:39: blocks something already on the board — an existing issue, or minted work ./TRIAGE.md:64: This is not a substitute for minting work or for `needs-ruling`. ./TRIAGE.md:68:5. **Accept.** It justifies work → mint the issue(s). The contract below is ./TRIAGE.md:73:Every issue you mint carries, in this order: ./TRIAGE.md:104: During a standing release window, every mint also gets a binary membership ./TRIAGE.md:127:When an acceptance produces more than one issue, mint an **epic** (`epic` ./TRIAGE.md:139:- **Dedup before minting** — search issues *and* closed issues; extend or ./TRIAGE.md:147: build work becomes necessary, move it to `ready` or mint a fresh `ready` ./TRIAGE.md:165:- Mint a work issue to explore an idea — file a proposal instead. ./CHANGELOG.md:436: converge a review round and `triage-actors=` made every issue a stray mint ./CHANGELOG.md:555:- Standing release windows are dependency DAGs: every mint is placed in the window or behind it, and only current sources are `ready` (#292). ./docs/CONSUMERS.md:406: # cron cannot wait one cadence for: opened → the mint→needs-triage check, ./docs/CONSUMERS.md:523:mint→`needs-triage` check and `closed` the blocker-closes→`ready` self-heal; ./docs/CONSUMERS.md:608:allowed to mint work issues without the sweep applying `needs-triage`. Label rows use exactly ./docs/CONSUMERS.md:897: triage mints work issues; anyone may file a proposal, which triage ./docs/RUNNER-PROBES.md:24:and each was minted for one probe and then wanted again. ./docs/RUNNER-PROBES.md:35:it rather than minting a fourth one. ./BUILDER.md:106: the issue to `ready` or minting a fresh one where corrective work is ./BUILDER.md:144: you do not mint work issues — nobody but triage does — and you do not fix ./CONTRIBUTING.md:20:- **Work issues are minted only by triage.** Nobody else writes work issues — ./CONTRIBUTING.md:51:| `claude-bot-andresmgsl` | `triage` (claude-box) | **triage** — the only door work issues come through; this identity mints work issues and nothing else writes them (#18's `triage-actors`) — and review. It does not build. | ./CONTRIBUTING.md:73:`triage-actors=` naming an absent user makes every issue a stray mint that ``` Exact required `discussion` residue: ```text ./LABELS.md:141:including a hard block. Active discussion still climbs the ladder; by ./RELEASES.md:21:member lists or ordering. crew's roadmap discussion [heavy-duty/crew#338](https://github.com/heavy-duty/crew/discussions/338) ./RELEASES.md:106: deferred work, and discussion outcomes accumulated since the epic was ./drills/0.2.0.md:46:(discussion #132). An empty armed-state baseline commit then ran green as ./docs/CONSUMERS.md:862: `needs-triage` flow. A repo whose forge provides Discussions may keep ``` Constrained diff-stat: ```text .github/DISCUSSION_TEMPLATE/ideas.yml | 19 ------------------- .github/DISCUSSION_TEMPLATE/q-a.yml | 15 --------------- .github/ISSUE_TEMPLATE/config.yml | 15 +++++++-------- .github/ISSUE_TEMPLATE/proposal.yml | 34 ++++++++++++++++++++++++++++++++++ .github/ISSUE_TEMPLATE/work-order.yml | 6 +++--- AGENTS.md | 10 +++++----- BUILDER.md | 4 ++-- CONTRIBUTING.md | 25 +++++++++++++------------ FLEET.md | 2 +- LABELS.md | 4 ++-- RELEASES.md | 2 +- REVIEWER.md | 4 ++-- TRIAGE.md | 29 ++++++++++++++++------------- changelog.d/247.md | 3 +++ docs/CONSUMERS.md | 12 +++++++----- 15 files changed, 96 insertions(+), 88 deletions(-) ``` - `bash test/run.sh`: 31 test files passed, 0 failed. - `bash .github/scripts/shellcheck-all.sh`: 64 tracked scripts linted, clean. - `bash .github/scripts/actionlint-all.sh`: 9 workflows linted, clean. - `test/labels.test.sh`: 44 passed, 0 failed; `.github/labels.conf` did not move because the existing reconciler supplies the stamp. - `git diff --check origin/main..HEAD`: clean. - Close-reference parser over the final PR body: empty; `Refs #247` is non-closing. - `actions/`, `lib/`, `bin/`, `.github/workflows/`, `.github/scripts/`, and `.github/labels.conf`: no diff. - Independent pre-handoff review: all blocking and non-blocking findings corrected at this head. ## Round log <!-- round:13add81d628980ffbb03fbc03aab950c9a5266c5 --> **Round at 13add81d** _Round passed with no written reply._
codex-bot-andresmgsl added 1 commit 2026-08-25 12:16:21 +00:00
docs: add proposal intake
All checks were successful
CI / test (pull_request) Successful in 3m49s
CI / release-exercise (pull_request) Successful in 25s
CI / self-guards (pull_request) Successful in 21s
CI / action-exercise (pull_request) Successful in 20s
CI / docs-sync-exercise (pull_request) Successful in 20s
labels / labels (pull_request) Successful in 22s
Refs guard / refs-not-closing (pull_request) Successful in 20s
bb984de133
codex-bot-andresmgsl changed title from docs: replace discussion intake with proposals to WIP: docs: replace discussion intake with proposals 2026-08-25 12:16:35 +00:00
Author
Member

⟲ resuming from bb984de133

⟲ resuming from bb984de1339bf05539fec9c999194b75c10de809
codex-bot-andresmgsl added 1 commit 2026-08-25 12:33:37 +00:00
docs: distinguish proposals from work issues
All checks were successful
CI / test (pull_request) Successful in 3m49s
CI / release-exercise (pull_request) Successful in 25s
CI / self-guards (pull_request) Successful in 21s
CI / action-exercise (pull_request) Successful in 20s
CI / docs-sync-exercise (pull_request) Successful in 20s
labels / labels (pull_request) Successful in 22s
Refs guard / refs-not-closing (pull_request) Successful in 20s
988d8a2cce
forgejo-actions added the
state:building
label 2026-08-25 12:40:10 +00:00
codex-bot-andresmgsl added 1 commit 2026-08-25 12:45:25 +00:00
docs: clarify proposal intake paths
All checks were successful
CI / test (pull_request) Successful in 3m48s
CI / release-exercise (pull_request) Successful in 25s
CI / self-guards (pull_request) Successful in 21s
CI / action-exercise (pull_request) Successful in 20s
CI / docs-sync-exercise (pull_request) Successful in 20s
labels / labels (pull_request) Successful in 22s
Refs guard / refs-not-closing (pull_request) Successful in 20s
13add81d62
Author
Member

📣 round answered at head 13add81d62

📣 round answered at head 13add81d628980ffbb03fbc03aab950c9a5266c5
codex-bot-andresmgsl changed title from WIP: docs: replace discussion intake with proposals to docs: replace discussion intake with proposals 2026-08-25 12:48:16 +00:00
forgejo-actions added
state:addressing
and removed
state:building
labels 2026-08-25 12:51:56 +00:00
forgejo-actions added the
scope:docs
scope:labels
labels 2026-08-25 13:08:48 +00:00
codex-bot-andresmgsl requested review from glm-bot-andresmgsl 2026-08-25 13:25:54 +00:00
codex-bot-andresmgsl requested review from claude-bot-andresmgsl 2026-08-25 13:25:55 +00:00
codex-bot-andresmgsl requested review from kimi-bot-andresmgsl 2026-08-25 13:25:55 +00:00
codex-bot-andresmgsl added the
state:bots-reviewing
label 2026-08-25 13:25:56 +00:00
forgejo-actions removed the
state:addressing
label 2026-08-25 13:28:13 +00:00

🔎 reviewing head 13add81d62

  • criteria 1–6 verified at this head in a detached worktree (greps, diff-stat, template parse, close-reference parser, full suite)
  • test/run.sh: 28/31 files pass here; the 3 yq-dependent files fail identically at origin/main — box gap, not this PR
  • verdict next
🔎 reviewing head 13add81d628980ffbb03fbc03aab950c9a5266c5 - criteria 1–6 verified at this head in a detached worktree (greps, diff-stat, template parse, close-reference parser, full suite) - `test/run.sh`: 28/31 files pass here; the 3 `yq`-dependent files fail identically at `origin/main` — box gap, not this PR - verdict next

🔎 reviewing head 13add81d62

  • Verified acceptance criteria 1-7 pass: diff-stat matches the spec; grep residues for mint and discussion match the PR evidence; proposal.yml has no labels: key; config.yml routes to the proposal form; .github/DISCUSSION_TEMPLATE/ is gone; no diff under actions/, lib/, bin/, .github/workflows/, .github/scripts/, or .github/labels.conf.
  • bash test/run.sh: 27 of 31 test files pass. The 4 failing files fail only on package-json version-source cases because node is not installed in this box; every other case passes.
  • bash .github/scripts/shellcheck-all.sh: 64 tracked scripts linted, clean.
  • bash .github/scripts/actionlint-all.sh: could not run — actionlint is not installed in this box.
  • git diff --check origin/main..HEAD: clean.
  • Verdict: approve.
🔎 reviewing head 13add81d628980ffbb03fbc03aab950c9a5266c5 - Verified acceptance criteria 1-7 pass: diff-stat matches the spec; grep residues for `mint` and `discussion` match the PR evidence; `proposal.yml` has no `labels:` key; `config.yml` routes to the proposal form; `.github/DISCUSSION_TEMPLATE/` is gone; no diff under `actions/`, `lib/`, `bin/`, `.github/workflows/`, `.github/scripts/`, or `.github/labels.conf`. - `bash test/run.sh`: 27 of 31 test files pass. The 4 failing files fail only on `package-json` version-source cases because `node` is not installed in this box; every other case passes. - `bash .github/scripts/shellcheck-all.sh`: 64 tracked scripts linted, clean. - `bash .github/scripts/actionlint-all.sh`: could not run — `actionlint` is not installed in this box. - `git diff --check origin/main..HEAD`: clean. - Verdict: approve.

🔎 reviewing head 13add81d62

  • 13:33Z announced; spec #247 read in full; detached worktree at head.
  • 13:36Z diff-stat = exactly the 15 allowed files; no code/labels.conf diff; DISCUSSION_TEMPLATE gone; diff --check clean.
  • 13:38Z both grep audits exact at head; all 22 item-4-excluded lines byte-identical to origin/main; no labels: key; no dead link; strict close-reference regex clean.
  • 13:40Z test/run.sh 31/31 green; shellcheck 64 clean; actionlint clean; CI combined success.
  • all acceptance criteria verified; composing verdict (approve).
🔎 reviewing head 13add81d628980ffbb03fbc03aab950c9a5266c5 - 13:33Z announced; spec #247 read in full; detached worktree at head. - 13:36Z diff-stat = exactly the 15 allowed files; no code/labels.conf diff; DISCUSSION_TEMPLATE gone; diff --check clean. - 13:38Z both grep audits exact at head; all 22 item-4-excluded lines byte-identical to origin/main; no labels: key; no dead link; strict close-reference regex clean. - 13:40Z test/run.sh 31/31 green; shellcheck 64 clean; actionlint clean; CI combined success. - all acceptance criteria verified; composing verdict (approve).
kimi-bot-andresmgsl approved these changes 2026-08-25 13:37:40 +00:00
kimi-bot-andresmgsl left a comment
Member

Reviewed the whole PR at 13add81d628980ffbb03fbc03aab950c9a5266c5 against #247's acceptance criteria and the repo's load-bearing constraints.

What I verified:

  • The PR is Refs #247 (non-closing), and the post-merge crew follow-up is correctly left as a triage-owned post-merge criterion.
  • docs/CONSUMERS.md intake checklist now says "Open the intake door" and includes the Discussions clause for forges that have them; no sentence asserts Discussions do not exist.
  • .github/ISSUE_TEMPLATE/proposal.yml exists, carries no labels: key, and config.yml routes non-triage filers to it instead of the dead GitHub Discussions link.
  • .github/DISCUSSION_TEMPLATE/ is removed.
  • grep -rn -i mint --include='*.md' . and grep -rn -i discussion --include='*.md' . at the PR head return exactly the residues the issue expects; the five in-scope single-writer lines now read "work issues".
  • git diff origin/main..HEAD --stat matches the allowed set and touches nothing under actions/, lib/, bin/, .github/workflows/, .github/scripts/, or .github/labels.conf.
  • bash .github/scripts/shellcheck-all.sh: 64 scripts, clean.
  • git diff --check origin/main..HEAD: clean.

What I could not fully verify:

  • bash test/run.sh: 27 of 31 test files pass. The 4 failing files fail only on package-json version-source cases because node is not installed in this box; the failures are unrelated to this docs/templates change.
  • bash .github/scripts/actionlint-all.sh: could not run because actionlint is not installed in this box. No workflow files are changed in this PR, so the risk is low.

This is a doctrine-only change. The intake rule is weakened exactly as triage decided in #247, the mechanism relies on the already-running reconciler author check, and no runtime code moves. Approving.

Reviewed the whole PR at `13add81d628980ffbb03fbc03aab950c9a5266c5` against #247's acceptance criteria and the repo's load-bearing constraints. What I verified: - The PR is `Refs #247` (non-closing), and the post-merge crew follow-up is correctly left as a triage-owned post-merge criterion. - `docs/CONSUMERS.md` intake checklist now says "Open the intake door" and includes the Discussions clause for forges that have them; no sentence asserts Discussions do not exist. - `.github/ISSUE_TEMPLATE/proposal.yml` exists, carries no `labels:` key, and `config.yml` routes non-triage filers to it instead of the dead GitHub Discussions link. - `.github/DISCUSSION_TEMPLATE/` is removed. - `grep -rn -i mint --include='*.md' .` and `grep -rn -i discussion --include='*.md' .` at the PR head return exactly the residues the issue expects; the five in-scope single-writer lines now read "work issues". - `git diff origin/main..HEAD --stat` matches the allowed set and touches nothing under `actions/`, `lib/`, `bin/`, `.github/workflows/`, `.github/scripts/`, or `.github/labels.conf`. - `bash .github/scripts/shellcheck-all.sh`: 64 scripts, clean. - `git diff --check origin/main..HEAD`: clean. What I could not fully verify: - `bash test/run.sh`: 27 of 31 test files pass. The 4 failing files fail only on `package-json` version-source cases because `node` is not installed in this box; the failures are unrelated to this docs/templates change. - `bash .github/scripts/actionlint-all.sh`: could not run because `actionlint` is not installed in this box. No workflow files are changed in this PR, so the risk is low. This is a doctrine-only change. The intake rule is weakened exactly as triage decided in #247, the mechanism relies on the already-running reconciler author check, and no runtime code moves. Approving.
claude-bot-andresmgsl approved these changes 2026-08-25 13:39:06 +00:00
claude-bot-andresmgsl left a comment
Member

Approve — head 13add81d628980ffbb03fbc03aab950c9a5266c5, reviewed whole in a detached worktree against #247's spec as amended (items 4 and 6 closed lists).

What I ran

  • grep -rn -i discussion --include='*.md' . → exactly the five allowed lines and nothing else: LABELS.md:141, RELEASES.md:21, :106, drills/0.2.0.md:46, docs/CONSUMERS.md:862 (criterion 1's clause). CHANGELOG.md and docs/UPSTREAM-SYNC.md return zero, as triage's amendment measured.
  • git grep -in mint over *.md at origin/main vs HEAD, diffed: the only content changes are item 4's five lines (CONTRIBUTING.md:20, :51, BUILDER.md:144, RELEASES.md:154, docs/CONSUMERS.md:608) plus item 6's three (AGENTS.md:40, docs/CONSUMERS.md:896, TRIAGE.md:162). Every line item 4 excludes is byte-identical — the TRIAGE.md entries move by line number only.
  • git diff origin/main..HEAD --stat: 15 files, no diff under actions/, lib/, bin/, .github/workflows/, .github/scripts/, and none to .github/labels.conf (criterion 5). git diff --check: clean.
  • .github/DISCUSSION_TEMPLATE/ is gone; proposal.yml carries no labels: key; no link under .github/ISSUE_TEMPLATE/ points at github.com/heavy-duty/ceremony/discussions. All three template YAMLs parse.
  • The PR body states the needs-triage stamp comes from the reconciler's author check, and I confirmed the mechanism exists at this head: issueflow-reconcile.sh reads .user.login, runs is_triage_actor, and author_decision returns ADD_NEEDS_TRIAGE; .github/labels.conf has triage-actors=claude-bot-andresmgsl. Spec item 2's "ships no code" claim holds.
  • lib/closes_references.sh over the PR body: empty (sanity-checked against a synthetic Closes #247, which returns 247). Refs #247 with a post-merge criterion is the shape #247 directs; the Refs guard / refs-not-closing check is green on this head.
  • bash .github/scripts/shellcheck-all.sh: rc=0, clean (no shell files diffed anyway).
  • Forge-side evidence for "reachable door": the instance's issue_templates endpoint parses this repo's existing form and maps description:about, so proposal.yml — same shape, same fields — will list in the chooser as its own entry, independent of the contact link.

What I could not verify, and what I relied on instead

  • bash test/run.sh is not green whole in my box: 28 of 31 files pass; labels-bootstrap, labels-dispatch and labels-triggers fail because yq is not installed here. I ran those same three files in a second worktree at origin/main and got identical failure counts (7/7, 7/14, 28/4), so the failures are my environment, not this PR. Criterion 6 rests on that baseline comparison plus CI, which reports success for the whole check set on this head.
  • actionlint is not installed here — I relied on the PR's recorded run and CI. No workflow file is diffed.
  • Whether Forgejo honours ?template=proposal.yml in the contact-link URL: not probed. It does not gate the criterion — the form is a chooser entry in its own right, and the URL resolves to this repo's new-issue page either way.

Non-blocking

  1. actions/labels-reconcile/labels-reconcile.sh:718 still ships the core needs-triage description as "Did not come through triage — owes normalization or conversion to a discussion", and :726's comment still reads "a question is a discussion". Doctrine and the label text written to every governed board now disagree. Correctly not fixed here — criterion 5 and the test plan's "what must fail" forbid an actions/ diff — but it is real residue and wants a proposal.
  2. TRIAGE.md's two inputs — "every open proposal" and "stray issues … filed outside the proposal form" — are the same board query now that the form applies no labels: both arrive as unlabeled issues stamped needs-triage, with nothing recording which door was used. That is inherited from option A rather than introduced by this build, so it is not a request-changes; if it bites triage in practice, the fix is a proposal, not a review round.
  3. CONTRIBUTING.md:26 and TRIAGE.md:15 say a stray issue is "converted into a proposal and closed" — under the new model the stray already is an issue on the same board, so the sentence reads a little circular. Prose only.
**Approve** — head `13add81d628980ffbb03fbc03aab950c9a5266c5`, reviewed whole in a detached worktree against #247's spec as amended (items 4 and 6 closed lists). ## What I ran - `grep -rn -i discussion --include='*.md' .` → exactly the five allowed lines and nothing else: `LABELS.md:141`, `RELEASES.md:21`, `:106`, `drills/0.2.0.md:46`, `docs/CONSUMERS.md:862` (criterion 1's clause). `CHANGELOG.md` and `docs/UPSTREAM-SYNC.md` return zero, as triage's amendment measured. - `git grep -in mint` over `*.md` at `origin/main` vs `HEAD`, diffed: the only content changes are item 4's five lines (`CONTRIBUTING.md:20`, `:51`, `BUILDER.md:144`, `RELEASES.md:154`, `docs/CONSUMERS.md:608`) plus item 6's three (`AGENTS.md:40`, `docs/CONSUMERS.md:896`, `TRIAGE.md:162`). Every line item 4 excludes is byte-identical — the TRIAGE.md entries move by line number only. - `git diff origin/main..HEAD --stat`: 15 files, no diff under `actions/`, `lib/`, `bin/`, `.github/workflows/`, `.github/scripts/`, and none to `.github/labels.conf` (criterion 5). `git diff --check`: clean. - `.github/DISCUSSION_TEMPLATE/` is gone; `proposal.yml` carries no `labels:` key; no link under `.github/ISSUE_TEMPLATE/` points at `github.com/heavy-duty/ceremony/discussions`. All three template YAMLs parse. - The PR body states the `needs-triage` stamp comes from the reconciler's author check, and I confirmed the mechanism exists at this head: `issueflow-reconcile.sh` reads `.user.login`, runs `is_triage_actor`, and `author_decision` returns `ADD_NEEDS_TRIAGE`; `.github/labels.conf` has `triage-actors=claude-bot-andresmgsl`. Spec item 2's "ships no code" claim holds. - `lib/closes_references.sh` over the PR body: empty (sanity-checked against a synthetic `Closes #247`, which returns `247`). `Refs #247` with a post-merge criterion is the shape #247 directs; the `Refs guard / refs-not-closing` check is green on this head. - `bash .github/scripts/shellcheck-all.sh`: rc=0, clean (no shell files diffed anyway). - Forge-side evidence for "reachable door": the instance's `issue_templates` endpoint parses this repo's existing form and maps `description:` → `about`, so `proposal.yml` — same shape, same fields — will list in the chooser as its own entry, independent of the contact link. ## What I could not verify, and what I relied on instead - **`bash test/run.sh` is not green whole in my box**: 28 of 31 files pass; `labels-bootstrap`, `labels-dispatch` and `labels-triggers` fail because `yq` is not installed here. I ran those same three files in a second worktree at `origin/main` and got **identical** failure counts (7/7, 7/14, 28/4), so the failures are my environment, not this PR. Criterion 6 rests on that baseline comparison plus CI, which reports `success` for the whole check set on this head. - **actionlint is not installed here** — I relied on the PR's recorded run and CI. No workflow file is diffed. - **Whether Forgejo honours `?template=proposal.yml`** in the contact-link URL: not probed. It does not gate the criterion — the form is a chooser entry in its own right, and the URL resolves to this repo's new-issue page either way. ## Non-blocking 1. `actions/labels-reconcile/labels-reconcile.sh:718` still ships the core `needs-triage` description as "Did not come through triage — owes normalization or conversion to a discussion", and `:726`'s comment still reads "a `question` is a discussion". Doctrine and the label text written to every governed board now disagree. Correctly **not** fixed here — criterion 5 and the test plan's "what must fail" forbid an `actions/` diff — but it is real residue and wants a proposal. 2. `TRIAGE.md`'s two inputs — "every open proposal" and "stray issues … filed outside the proposal form" — are the same board query now that the form applies no labels: both arrive as unlabeled issues stamped `needs-triage`, with nothing recording which door was used. That is inherited from option A rather than introduced by this build, so it is not a request-changes; if it bites triage in practice, the fix is a proposal, not a review round. 3. `CONTRIBUTING.md:26` and `TRIAGE.md:15` say a stray issue is "converted into a proposal and closed" — under the new model the stray already *is* an issue on the same board, so the sentence reads a little circular. Prose only.
glm-bot-andresmgsl approved these changes 2026-08-25 13:42:43 +00:00
glm-bot-andresmgsl left a comment
Member

Verdict: approve — head 13add81d628980ffbb03fbc03aab950c9a5266c5 reviewed whole against #247; every acceptance criterion verified by running it, not by reading it.

What I ran at the head (detached throwaway worktree):

  • grep -rn -i discussion --include='*.md' . returns exactly the allowed residue — RELEASES.md:21/:106, LABELS.md:141, drills/0.2.0.md:46, and the single docs/CONSUMERS.md:862 clause — matching the PR's pasted audit line for line; CHANGELOG.md and docs/UPSTREAM-SYNC.md return zero.
  • grep -rn -i mint --include='*.md' . reads work issues at every rule line (spec item 4's five: CONTRIBUTING.md:20/:51, BUILDER.md:144, RELEASES.md:154, docs/CONSUMERS.md:608; plus the item-6 lines AGENTS.md:40, docs/CONSUMERS.md:897), and all 22 lines item 4 excludes are byte-identical to origin/main (checked per line, scripted, not by eyeball).
  • git diff origin/main..HEAD --stat names exactly the 15 files the test plan allows; the diff over actions/, lib/, bin/, .github/workflows/, .github/scripts/, .github/labels.conf is empty; git diff --check clean; .github/DISCUSSION_TEMPLATE/ no longer exists.
  • proposal.yml carries no labels: key (anchored ^labels: absent; the match is the header comment recording the #24 D2 reason) and config.yml keeps blank_issues_enabled: false, routes its contact link to issues/new?template=proposal.yml, and no link under .github/ISSUE_TEMPLATE/ points at the dead github.com/…/discussions URL (grep empty). The PR states the reconciler's author check as the stamp's origin, and states the single-writer weakening in one sentence as the spec asks.
  • bash test/run.sh whole: 31 test files passed, 0 failed; shellcheck-all.sh: 64 tracked scripts, clean; actionlint-all.sh: clean — all three matching the PR's recorded counts.
  • Close-reference: a strict closing-keyword regex over the entire PR body finds nothing before #247 (Refs #247 is genuinely non-closing; the repo's refs-not-closing guard is green too). The one unchecked criterion is the post-merge crew follow-up, the issue-directed shape #247 specifies — triage owns that close, correctly unticked.

Could not verify, and what I relied on instead: the CI exercise jobs on this head (test, release-exercise, self-guards, action-exercise, docs-sync-exercise) were read from the combined commit status (success) rather than re-triggered; the lint gates they carry I re-ran locally instead, with the counts above. Nothing else in this verdict rests on opinion.

Nit (non-blocking, builder's discretion): CONTRIBUTING.md "A work issue is a work order" doubles "work" — accurate and readable, no change requested.

Verdict: **approve** — head `13add81d628980ffbb03fbc03aab950c9a5266c5` reviewed whole against #247; every acceptance criterion verified by running it, not by reading it. What I ran at the head (detached throwaway worktree): - `grep -rn -i discussion --include='*.md' .` returns **exactly** the allowed residue — `RELEASES.md:21`/`:106`, `LABELS.md:141`, `drills/0.2.0.md:46`, and the single `docs/CONSUMERS.md:862` clause — matching the PR's pasted audit line for line; `CHANGELOG.md` and `docs/UPSTREAM-SYNC.md` return zero. - `grep -rn -i mint --include='*.md' .` reads *work issues* at every rule line (spec item 4's five: `CONTRIBUTING.md:20`/`:51`, `BUILDER.md:144`, `RELEASES.md:154`, `docs/CONSUMERS.md:608`; plus the item-6 lines `AGENTS.md:40`, `docs/CONSUMERS.md:897`), and **all 22 lines item 4 excludes are byte-identical to `origin/main`** (checked per line, scripted, not by eyeball). - `git diff origin/main..HEAD --stat` names exactly the 15 files the test plan allows; the diff over `actions/`, `lib/`, `bin/`, `.github/workflows/`, `.github/scripts/`, `.github/labels.conf` is empty; `git diff --check` clean; `.github/DISCUSSION_TEMPLATE/` no longer exists. - `proposal.yml` carries no `labels:` key (anchored `^labels:` absent; the match is the header comment recording the #24 D2 reason) and `config.yml` keeps `blank_issues_enabled: false`, routes its contact link to `issues/new?template=proposal.yml`, and no link under `.github/ISSUE_TEMPLATE/` points at the dead `github.com/…/discussions` URL (grep empty). The PR states the reconciler's author check as the stamp's origin, and states the single-writer weakening in one sentence as the spec asks. - `bash test/run.sh` whole: **31 test files passed, 0 failed**; `shellcheck-all.sh`: 64 tracked scripts, clean; `actionlint-all.sh`: clean — all three matching the PR's recorded counts. - Close-reference: a strict closing-keyword regex over the entire PR body finds nothing before `#247` (`Refs #247` is genuinely non-closing; the repo's `refs-not-closing` guard is green too). The one unchecked criterion is the post-merge crew follow-up, the issue-directed shape #247 specifies — triage owns that close, correctly unticked. Could not verify, and what I relied on instead: the CI exercise jobs on this head (test, release-exercise, self-guards, action-exercise, docs-sync-exercise) were read from the combined commit status (`success`) rather than re-triggered; the lint gates they carry I re-ran locally instead, with the counts above. Nothing else in this verdict rests on opinion. Nit (non-blocking, builder's discretion): `CONTRIBUTING.md` "A work issue is a work order" doubles "work" — accurate and readable, no change requested.
forgejo-actions added
state:needs-human
and removed
state:bots-reviewing
labels 2026-08-25 13:42:57 +00:00
codex-bot-andresmgsl requested review from andres 2026-08-25 13:46:00 +00:00
andres merged commit aa167fd4ef into main 2026-08-25 15:09:51 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
4 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: heavy-duty/ceremony#262
No description provided.