docs: replace discussion intake with proposals #262
No reviewers
Labels
No labels
attention
blocked
blocker:ci-red
blocker:conflict
blocker:drill-pending
blocker:unrequested
bug
claimed
documentation
enhancement
epic
merge-next
needs-ruling
needs-triage
offsite
post-merge
ready
release
scope:docs
scope:guards
scope:labels
scope:release-flow
stale
state:addressing
state:bots-reviewing
state:building
state:needs-human
No milestone
No project
No assignees
4 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: heavy-duty/ceremony#262
Loading…
Reference in a new issue
No description provided.
Delete branch "build/247-proposal-intake"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
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-triagestamp for non-triage authors.Worklog
Acceptance criteria
docs/CONSUMERS.md's intake checklist item names a mechanism that existson this forge, and carries the one clause covering a forge that does have
Discussions. No sentence in it asserts that Discussions do not exist.
proposal.ymlexists,config.ymlroutes to it, and no link in.github/ISSUE_TEMPLATE/pointsat
github.com/heavy-duty/ceremony/discussions.proposal.ymlcarries nolabels:key, and the PR states that theneeds-triagestamp comes from the reconciler's author check.spec item 4's closed list names and nowhere else is a
*.mdsentenceleft saying a non-triage actor may not open an issue:
grep -rn -i mint --include='*.md' .at the PR head returns the correctedwording 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 headreturns exactly the residue spec item 6 leaves standing, and nothing
else:
RELEASES.md:21and:106,LABELS.md:141,drills/0.2.0.md:46,and the single
docs/CONSUMERS.mdclause criterion 1 requires.CHANGELOG.md,docs/UPSTREAM-SYNC.mdandchangelog.d/**are assembledor historical records this issue never edits — a match in one of them is
not a failure, and
changelog.d/247.mdmay use the word freely.(Amended by triage 2026-08-25. This read "the
RELEASES.mdanddrills/0.2.0.mdoccurrences spec item 6 excludes, the CONSUMERS.mdclause of criterion 1,
CHANGELOG.md, anddocs/UPSTREAM-SYNC.md", whichomitted the
LABELS.mdline entirely — a line the spec keeps, so thecriterion refused its own expected output — and listed two files that
contain no match at
all: measured at
e55e996,CHANGELOG.mdanddocs/UPSTREAM-SYNC.mdeach return zero lines.) Paste the output in the PR.
.github/DISCUSSION_TEMPLATE/no longer exists in this repo.actions/,lib/,bin/,.github/workflows/or.github/scripts/has a diff, and neither does.github/labels.conf.git diff origin/main..HEAD --statproves it in the PR.bash test/run.shis green whole at the PR head;git diff --checkclean.Refs #247; triagecloses 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 theper-tick discussion-probe
WARNsilenced 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
mintaudit (the five in-scope rule/mechanism lines are corrected; item 4’s named exclusions remain unchanged):Exact required
discussionresidue:Constrained diff-stat:
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.confdid not move because the existing reconciler supplies the stamp.git diff --check origin/main..HEAD: clean.Refs #247is non-closing.actions/,lib/,bin/,.github/workflows/,.github/scripts/, and.github/labels.conf: no diff.Round log
Round at
13add81dRound passed with no written reply.
docs: replace discussion intake with proposalsto WIP: docs: replace discussion intake with proposals⟲ resuming from
bb984de133📣 round answered at head
13add81d62WIP: docs: replace discussion intake with proposalsto docs: replace discussion intake with proposals🔎 reviewing head
13add81d62test/run.sh: 28/31 files pass here; the 3yq-dependent files fail identically atorigin/main— box gap, not this PR🔎 reviewing head
13add81d62mintanddiscussionmatch the PR evidence;proposal.ymlhas nolabels:key;config.ymlroutes to the proposal form;.github/DISCUSSION_TEMPLATE/is gone; no diff underactions/,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 onpackage-jsonversion-source cases becausenodeis 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 —actionlintis not installed in this box.git diff --check origin/main..HEAD: clean.🔎 reviewing head
13add81d62Reviewed the whole PR at
13add81d628980ffbb03fbc03aab950c9a5266c5against #247's acceptance criteria and the repo's load-bearing constraints.What I verified:
Refs #247(non-closing), and the post-merge crew follow-up is correctly left as a triage-owned post-merge criterion.docs/CONSUMERS.mdintake 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.ymlexists, carries nolabels:key, andconfig.ymlroutes non-triage filers to it instead of the dead GitHub Discussions link..github/DISCUSSION_TEMPLATE/is removed.grep -rn -i mint --include='*.md' .andgrep -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 --statmatches the allowed set and touches nothing underactions/,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 onpackage-jsonversion-source cases becausenodeis not installed in this box; the failures are unrelated to this docs/templates change.bash .github/scripts/actionlint-all.sh: could not run becauseactionlintis 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.
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.mdanddocs/UPSTREAM-SYNC.mdreturn zero, as triage's amendment measured.git grep -in mintover*.mdatorigin/mainvsHEAD, 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 underactions/,lib/,bin/,.github/workflows/,.github/scripts/, and none to.github/labels.conf(criterion 5).git diff --check: clean..github/DISCUSSION_TEMPLATE/is gone;proposal.ymlcarries nolabels:key; no link under.github/ISSUE_TEMPLATE/points atgithub.com/heavy-duty/ceremony/discussions. All three template YAMLs parse.needs-triagestamp comes from the reconciler's author check, and I confirmed the mechanism exists at this head:issueflow-reconcile.shreads.user.login, runsis_triage_actor, andauthor_decisionreturnsADD_NEEDS_TRIAGE;.github/labels.confhastriage-actors=claude-bot-andresmgsl. Spec item 2's "ships no code" claim holds.lib/closes_references.shover the PR body: empty (sanity-checked against a syntheticCloses #247, which returns247).Refs #247with a post-merge criterion is the shape #247 directs; theRefs guard / refs-not-closingcheck is green on this head.bash .github/scripts/shellcheck-all.sh: rc=0, clean (no shell files diffed anyway).issue_templatesendpoint parses this repo's existing form and mapsdescription:→about, soproposal.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.shis not green whole in my box: 28 of 31 files pass;labels-bootstrap,labels-dispatchandlabels-triggersfail becauseyqis not installed here. I ran those same three files in a second worktree atorigin/mainand 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 reportssuccessfor the whole check set on this head.?template=proposal.ymlin 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
actions/labels-reconcile/labels-reconcile.sh:718still ships the coreneeds-triagedescription as "Did not come through triage — owes normalization or conversion to a discussion", and:726's comment still reads "aquestionis 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 anactions/diff — but it is real residue and wants a proposal.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 stampedneeds-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.CONTRIBUTING.md:26andTRIAGE.md:15say 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.Verdict: approve — head
13add81d628980ffbb03fbc03aab950c9a5266c5reviewed 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 singledocs/CONSUMERS.md:862clause — matching the PR's pasted audit line for line;CHANGELOG.mdanddocs/UPSTREAM-SYNC.mdreturn 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 linesAGENTS.md:40,docs/CONSUMERS.md:897), and all 22 lines item 4 excludes are byte-identical toorigin/main(checked per line, scripted, not by eyeball).git diff origin/main..HEAD --statnames exactly the 15 files the test plan allows; the diff overactions/,lib/,bin/,.github/workflows/,.github/scripts/,.github/labels.confis empty;git diff --checkclean;.github/DISCUSSION_TEMPLATE/no longer exists.proposal.ymlcarries nolabels:key (anchored^labels:absent; the match is the header comment recording the #24 D2 reason) andconfig.ymlkeepsblank_issues_enabled: false, routes its contact link toissues/new?template=proposal.yml, and no link under.github/ISSUE_TEMPLATE/points at the deadgithub.com/…/discussionsURL (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.shwhole: 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.#247(Refs #247is genuinely non-closing; the repo'srefs-not-closingguard 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.