.github/ISSUE_TEMPLATE/ — ship the proposal door CONTRIBUTING.md already promises #50

Closed
opened 2026-09-01 15:15:29 +00:00 by claude-bot-andresmgsl · 5 comments

Context

CONTRIBUTING.md L54
says, in this repository's own voice:

Only triage mints work issues; anyone may file a proposal, which triage converts
or refuses.

There is no proposal to file. Measured 2026-09-01T15:13Z against this instance:
GET /repos/heavy-duty/stoke/issue_templatesHTTP 200, body null, and
.github/
holds exactly two files, labeler.yml and labels.conf. No ISSUE_TEMPLATE/, no
config.yml, no chooser. A contributor who follows that sentence lands on a blank
issue box with no shape and no route, and the sentence is the only instruction the
repository gives them.

The doctrine this repository vendors assumes the door exists. .ceremony/TRIAGE.md
L15-L19
names triage's inputs as "Every open proposal in the repo you serve" and
"Stray issues — anything filed outside the proposal form by a non-triage
actor"
, and outcome 4 instructs triage to "convert its substance into a proposal
and close it"
— none of which is executable here today. .ceremony/AGENTS.md
L34/L40
draws the same pipeline (proposal ──▶ triage ──▶ work issue) and tells every agent
"Found work? File or extend a proposal."

The measurement that makes this buildable rather than aspirational. At 0.6.1 the
intake door was impossible on this forge: Forgejo exposes no Discussions surface
(/discussions → 404, no repo field), which is why this board recorded since
2026-08-21 that the issue door was the only door. The 2026-08-30 re-vendor to 0.6.3
replaced discussion with a YAML issue form, and this Forgejo renders them
GET /repos/heavy-duty/ceremony/issue_templates200, serving
Proposal (anyone) (4 fields) and Work order (triage only) (7 fields), parsed, on
this same instance, re-measured 2026-09-01T15:11Z. The door was not renamed from
unreachable to unreachable; an impossible one was replaced with a buildable one.

Prior art, and it is a copy job. ceremony at
0.6.3
ships exactly three files — config.yml (714 B), proposal.yml (1204 B),
work-order.yml (2754 B). Both forms are repository-agnostic: they name doctrine
files (TRIAGE.md, LABELS.md) that stoke vendors at .ceremony/, and no repository.
Only config.yml carries a ceremony-qualified URL.

Why this is being minted now, having been declined once. Triage recorded this gap
on #36 (comment
30456)
as a live mint candidate and deliberately did not mint it: at the time it was a
doctrine-versus-repo gap in which stoke itself claimed nothing, and minting on that
basis would have been board-shaping rather than repair. That changed at
2026-09-01T13:08Z, when #46/!47 merged CONTRIBUTING.md and the repository began
asserting the door exists. A promise the repository authors and cannot keep is a
different defect from a doctrine it has not yet adopted, and repairing it is triage's
ordinary work.

Spec

Decisions, made here so the builder makes none of them.

  1. Ship all three files, mirroring ceremony 0.6.3's set — not proposal.yml
    alone. With blank_issues_enabled: false and a single form, the web chooser leaves
    no route to mint a work order by hand: stoke's only declared triage actor
    (.github/labels.conf triage-actors=claude-bot-andresmgsl) files through the API,
    but a human standing in for triage would be locked into the proposal form. Shipping
    the full set also keeps a future re-sync a straight copy instead of a diff, which
    matters in a repository whose .ceremony/ mirror is hand-vendored.
  2. proposal.yml is copied byte-identical. It names no repository. Do not reword it.
  3. work-order.yml is copied with exactly one adaptation. Its description: reads
    "gh issue create --body-file bypasses forms and stays legitimate for the triage
    identity."
    gh targets github.com and is wrong on this forge; stoke ships the
    equivalent — --body-file at
    src/cli.js L763,
    documented at
    README.md L515.
    Change that phrase to stoke issue create --body-file and nothing else. This is the
    only wording change anywhere in the two forms; a builder tempted to "improve" more
    prose should not.
  4. config.yml keeps blank_issues_enabled: false and re-points its one contact
    link
    to
    https://forgejo.heavyduty.builders/heavy-duty/stoke/issues/new?template=proposal.yml.
    The name: and about: text is repository-agnostic and is copied as-is.
  5. The hazard that gated this for eight days is settled: blank_issues_enabled: false
    does not disable API issue creation.
    It landed on ceremony main at
    2026-08-25T12:15:47Z (bb984de1, refined by 13add81d at 12:45:14Z). Eight
    issues have been created on that board since (ceremony #263, #265, #268, #269, #271,
    #273, #275, #276), all by fleet agents — and
    ceremony#275 and ceremony#276 both carry created_at 2026-08-31T20:27:37Z, the
    same second
    , which no human web-form path produces. The flag is a web-chooser
    setting; POST /repos/{owner}/{repo}/issues does not consult it. Stated at the
    strength of the evidence: this is a fingerprint of scripted API creation on a board
    that has the flag live, not a direct test — so the direct test is in the test plan
    below and is owed before the close, because every fleet agent files through the
    API and this repository would be unusable if it were wrong.
  6. The forms apply no labels, and none are added. Both ceremony forms carry an empty
    labels: by design (ceremony#24 D2: queue labels are triage's explicit act), verified
    from the live endpoint. stoke's taxonomy is complete for this work — 28 labels
    before and 28 after
    ; this issue requires no labels.conf row and therefore no
    bootstrap=yes dispatch.
  7. No new scope row is owed. .github/labeler.yml maps .github/**scope:ci,
    which covers all three new paths — measured, not assumed, with the same
    path.matchesGlob that
    scripts/check-governance.js L115-L118
    uses: all three return true. CONTRIBUTING.md is covered by *.mdscope:docs,
    and the changelog.d/ fragment required by the Tasks below is covered by
    changelog.d/**scope:packaging. The derived set on the PR is therefore three
    labels, not two
    — no row is added to the map, but three of its five existing rows
    match.
  8. These files are not under the .ceremony/ byte-identity regime. They live in
    .github/, which test/governance.test.js reads only for labels.conf and
    labeler.yml. No governance test asserts their contents, and none should be added —
    the adaptation in decision 3 is deliberate and byte-identity would forbid it.
  9. Scope addition, named rather than slipped in. This issue's subject is
    .github/ISSUE_TEMPLATE/, and CONTRIBUTING.md is outside it. One line is folded in
    anyway: L54's sentence is the promise this issue repairs, and shipping the door while
    leaving the sentence that points nowhere would fix the mechanism and leave the
    instruction. It is one link on an existing line; splitting it would create two issues
    that must land together to be coherent.

Tasks

  • Create .github/ISSUE_TEMPLATE/proposal.yml as a byte-identical copy of
    ceremony 0.6.3
    (1204 B, including its leading three-line comment about applying no labels)
  • Create .github/ISSUE_TEMPLATE/work-order.yml from
    ceremony 0.6.3
    with the single phrase change in spec decision 3, and no other edit
  • Create .github/ISSUE_TEMPLATE/config.yml from
    ceremony 0.6.3
    with the contact-link URL re-pointed at stoke per spec decision 4
  • Add the proposal-form link to CONTRIBUTING.md L54 so the sentence names the door
    it promises
  • Add a changelog.d/ fragment — this is a contributor-facing change to how work is
    filed, not internal plumbing
  • Run npm test and npm run check:governance locally before opening the PR
  • Open the PR from a same-repo branch on heavy-duty/stoke, not a fork (fork PRs
    stall on the CI approval gate — see !28/!29)
  • When the PR reaches state:needs-human, request @andres by hand — do not
    wait for the engine (heavy-duty/ceremony#276: HUMAN_REVIEWER has no plumbing, so
    the sweep logs HTTP 404 … requested_reviewers and still reports success).
    Done by @codex-bot-andresmgsl at 2026-09-01T16:40:59Z; ticked by triage off the
    review_request timeline event (assignee andres), not off the thread.
    !52 was
    moved to state:needs-human and andres was put on requested_reviewers in the
    same second, while the PR was open — so unlike !42 under #36, the condition this
    clause was written for actually arose and the step was taken inside it. The engine
    then proved the clause 25 s later rather than making it unnecessary: sweeps
    853 and
    854 POSTed
    danmt to this same PR anyway, took HTTP 404 … User 'danmt' not exist, logged
    labels: #52: requested danmt (round passed) and concluded success
  • Reference this issue with Refs #50, not Closes #50 — the post-merge
    criterion below outlives the merge, and this issue's checkboxes stay current while
    it is open, because the derived transition comment publishes every unticked line
  • Keep this issue's checkboxes current as you go — on this machinery they are
    published, not private (see the note under Acceptance criteria)

Acceptance criteria

Pre-merge, reviewable on the PR:

  • .github/ISSUE_TEMPLATE/ contains exactly config.yml, proposal.yml and
    work-order.yml, and nothing else
  • proposal.yml is byte-identical to ceremony 0.6.3's, proven on the PR by
    curl -sS "$API/repos/heavy-duty/ceremony/raw/.github/ISSUE_TEMPLATE/proposal.yml?ref=0.6.3" | md5sum
    matching md5sum .github/ISSUE_TEMPLATE/proposal.yml
  • work-order.yml differs from ceremony 0.6.3's in exactly one hunk, the
    phrase in spec decision 3 — diff against the fetched original shows one changed
    line and no others
  • config.yml sets blank_issues_enabled: false and its single contact_links
    entry points at heavy-duty/stoke; grep -c 'heavy-duty/ceremony' .github/ISSUE_TEMPLATE/config.yml
    returns 0
  • CONTRIBUTING.md L54's sentence links the proposal form
  • npm test and npm run check:governance are green on the PR head, with
    check:governance still printing governance: 4 identities resolved; 5 scope rows valid
    five rows, not six: no scope row is added by this work
  • ci / test green on the PR head
  • The PR carries scope:ci, scope:docs and scope:packaging, derived by the
    labels-scope job from the base map — not hand-set. Read it off a synchronize
    run's labels-scope: line, never off the PR's label set: on this forge a label event
    re-derives scopes from the head map (defect 8 on #36), so a label set is not evidence.
    Met 2026-09-01T15:39Z on !52, read off the log and not the labels: run
    834
    (pull_request_target, head fd22c160, the synchronize push) logged
    labels-scope: #52: scopes -> scope:packaging,scope:ci,scope:docs.
    Triage corrected this criterion at 15:44Z — as first written it named only two
    scopes and was wrong.
    The changelog.d/ fragment that this issue's own Tasks
    require maps to scope:packaging via changelog.d/**, so three is the correct
    derived set. The two scope:* labels on this issue are right as they stand: a
    PR's derived scopes routinely exceed its issue's triage-set scopes — !49 carried
    these same three against #48's lone scope:ci

Post-merge — this cannot be checked before the merge because the endpoint reads the
default branch, the PR references this issue with Refs #50, the merge moves this
issue to post-merge, and triage owns the close:

  • GET /repos/heavy-duty/stoke/issue_templates returns HTTP 200 with both
    forms parsed — Proposal (anyone) with 4 fields and Work order (triage only)
    with 7 — and each with an empty labels array. Wake condition: the merge. Today
    the same call returns 200 with body null, so the before/after is a measurement
    of this work and not of the forge. Do not substitute a fetch of
    /heavy-duty/stoke/issues/new?template=proposal.yml for this
    — see the failing
    case in the test plan; that URL cannot tell the two states apart

    **Met 2026-09-01T20:01:20Z**, the wake condition having arrived when @andres merged
    !52 at **2026-09-01T19:14:51Z** (`967efa02`). `GET
    /repos/heavy-duty/stoke/issue_templates` → **HTTP 200** with a two-element array:
    `Proposal (anyone)`, `body` length **4**, `file_name`
    `.github/ISSUE_TEMPLATE/proposal.yml`; `Work order (triage only)`, `body` length
    **7**, `file_name` `.github/ISSUE_TEMPLATE/work-order.yml`. Before the merge the
    same call returned `200` with body `null`, so this is a before/after on this work
    and not on the forge.
    
    **One deviation from the criterion as written, stated rather than rounded off.**
    `labels` serializes as **`null`**, not `[]`. The criterion asked for "an empty
    `labels` array" and that literal shape does not occur: neither form declares a
    `labels:` key at all — `proposal.yml` is the byte-identical ceremony copy whose own
    leading comment says the form "applies no labels" — and a **ceremony control taken
    in the same second returns `null` for both of its forms too**, on the board this
    criterion was modelled from. The substance the criterion was written to protect
    (the forms pre-judge no queue state, spec decision 6) holds and is what was
    verified; `[]` was my error in writing the criterion, not a shortfall in the work
    

Test plan

API=https://forgejo.heavyduty.builders/api/v1

# 1. the gap, before (200 + null today; both forms after the merge)
curl -sS -H "Authorization: token $FORGE_TOKEN" "$API/repos/heavy-duty/stoke/issue_templates" \
  | jq -r '.[]? | "\(.name) fields=\(.body|length) labels=\(.labels // [] | length)"'

# 2. byte-identity of proposal.yml, and the single-hunk diff of work-order.yml
for f in proposal.yml work-order.yml; do
  curl -sS -H "Authorization: token $FORGE_TOKEN" \
    "$API/repos/heavy-duty/ceremony/raw/.github/ISSUE_TEMPLATE/$f?ref=0.6.3" > "/tmp/$f.orig"
  diff -u "/tmp/$f.orig" ".github/ISSUE_TEMPLATE/$f"
done
# proposal.yml: no output. work-order.yml: one changed line, the `gh` → `stoke` phrase.

# 3. no ceremony-qualified URL survives in config.yml
grep -c 'heavy-duty/ceremony' .github/ISSUE_TEMPLATE/config.yml   # 0

# 4. scope coverage holds with three new tracked paths
npm run check:governance   # governance: 4 identities resolved; 5 scope rows valid
npm test

The case that must fail — coverage is real, not incidental. Delete the .github/**
glob from .github/labeler.yml and re-run npm run check:governance: it must exit 1
with tracked paths have no scope mapping: naming all three new files. Restore the glob.
If it exits 0 with the glob removed, the three files are being covered by something other
than the scope:ci row and spec decision 7 is wrong.

The case that must fail — the API door stays open under blank_issues_enabled: false.
This is the hazard spec decision 5 settles by inference and this step settles directly,
and it is owed before triage closes this issue, not before the merge. After the merge,
file a throwaway issue through the API and close it immediately:

curl -sS -X POST -H "Authorization: token $FORGE_TOKEN" -H 'Content-Type: application/json' \
  -d '{"title":"probe: API issue creation under blank_issues_enabled=false","body":"Throwaway; closing immediately."}' \
  "$API/repos/heavy-duty/stoke/issues" -w '\nHTTP %{http_code}\n'

It must return 201. If it returns 4xx, the API intake door has been closed for every
fleet agent, and the fix is to flip blank_issues_enabled back to true in a fresh
ready issue — the chooser interception is worth less than the door.

Run 2026-09-01T20:01:17Z, after the merge and before this issue's close, as the step
requires. It returned HTTP 201
— issue #53, author claude-bot-andresmgsl,
created 20:01:17Z, closed 20:01:22Z, no labels, five seconds open. The hazard spec
decision 5 settled by inference — a fingerprint of scripted creation on ceremony's board
— is now settled directly on this board, under this repository's own live
blank_issues_enabled: false
: POST /repos/{owner}/{repo}/issues does not consult the
flag. No follow-up issue is owed; the API intake door every fleet agent files through is
open.

A measurement that does NOT work, recorded so nobody repeats it. Fetching the web
chooser URL proves nothing on this instance: measured 2026-09-01T15:12Z,
GET /heavy-duty/ceremony/issues/new?template=proposal.yml303 and
GET /heavy-duty/stoke/issues/new?template=proposal.yml303, identical, even
though ceremony has the form and stoke does not. It redirects to login before it ever
consults templates. Use /api/v1/repos/{owner}/{repo}/issue_templates, which
distinguishes the two today.

Dependencies

None. Each edge was checked rather than assumed, 2026-09-01T15:13Z:

  • No collision edge is owed. .ceremony/TRIAGE.md requires one only when an open
    ready, claimed or blocked issue already carries the deliverable. The board has
    two open issues — #36 (enhancement, post-merge, scope:ci) and #27 (epic,
    needs-ruling, scope:cli) — and neither carries ready, claimed or blocked;
    all three labels return zero at state=all. There is no open PR.
  • No release-window membership call is owed. The release label is carried only by
    closed items — #40, #32 and #1 — so no standing window is open; v1.4.0 shipped
    2026-08-31.
  • Not a member of epic #27. #27 organizes the five CLI gaps, and this is repository
    intake governance, not a CLI gap — the same call that correctly kept #48 out of it.
  • Not a duplicate, and nothing to extend or reopen. Searched state=all for
    ISSUE_TEMPLATE, proposal, intake and template: the only hits are #46 (closed —
    its deliverable was CONTRIBUTING.md's repo-specific facts, and it is the issue whose
    merge created this gap), #48 (closed — the scope map) and #36 (open — the ceremony
    re-pin, which records this gap in comment 30456 and explicitly places it out of scope).
    None of the three should absorb this.
  • Related, not blocking: heavy-duty/ceremony#276 (HUMAN_REVIEWER has no plumbing)
    is why this issue's Tasks carry a by-hand reviewer request. It gates nothing here.
## Context `CONTRIBUTING.md` [L54](https://forgejo.heavyduty.builders/heavy-duty/stoke/src/commit/bef059d7b750179b44334e156dd7bc1a8db9dbd8/CONTRIBUTING.md#L54) says, in this repository's own voice: > Only triage mints work issues; anyone may file a proposal, which triage converts > or refuses. **There is no proposal to file.** Measured 2026-09-01T15:13Z against this instance: `GET /repos/heavy-duty/stoke/issue_templates` → **HTTP 200, body `null`**, and [`.github/`](https://forgejo.heavyduty.builders/heavy-duty/stoke/src/commit/bef059d7b750179b44334e156dd7bc1a8db9dbd8/.github) holds exactly two files, `labeler.yml` and `labels.conf`. No `ISSUE_TEMPLATE/`, no `config.yml`, no chooser. A contributor who follows that sentence lands on a blank issue box with no shape and no route, and the sentence is the only instruction the repository gives them. The doctrine this repository vendors assumes the door exists. `.ceremony/TRIAGE.md` [L15-L19](https://forgejo.heavyduty.builders/heavy-duty/stoke/src/commit/bef059d7b750179b44334e156dd7bc1a8db9dbd8/.ceremony/TRIAGE.md#L15-L19) names triage's inputs as *"Every open **proposal** in the repo you serve"* and *"**Stray issues** — anything filed outside the **proposal form** by a non-triage actor"*, and outcome 4 instructs triage to *"convert its substance into a proposal and close it"* — none of which is executable here today. `.ceremony/AGENTS.md` [L34/L40](https://forgejo.heavyduty.builders/heavy-duty/stoke/src/commit/bef059d7b750179b44334e156dd7bc1a8db9dbd8/.ceremony/AGENTS.md#L34) draws the same pipeline (`proposal ──▶ triage ──▶ work issue`) and tells every agent *"Found work? File or extend a proposal."* **The measurement that makes this buildable rather than aspirational.** At `0.6.1` the intake door was *impossible* on this forge: Forgejo exposes no Discussions surface (`/discussions` → 404, no repo field), which is why this board recorded since 2026-08-21 that the issue door was the only door. The 2026-08-30 re-vendor to `0.6.3` replaced *discussion* with a **YAML issue form**, and **this Forgejo renders them** — `GET /repos/heavy-duty/ceremony/issue_templates` → **200**, serving `Proposal (anyone)` (4 fields) and `Work order (triage only)` (7 fields), parsed, on this same instance, re-measured 2026-09-01T15:11Z. The door was not renamed from unreachable to unreachable; an impossible one was replaced with a buildable one. **Prior art, and it is a copy job.** ceremony at [`0.6.3`](https://forgejo.heavyduty.builders/heavy-duty/ceremony/src/tag/0.6.3/.github/ISSUE_TEMPLATE) ships exactly three files — `config.yml` (714 B), `proposal.yml` (1204 B), `work-order.yml` (2754 B). Both forms are **repository-agnostic**: they name doctrine files (`TRIAGE.md`, `LABELS.md`) that stoke vendors at `.ceremony/`, and no repository. Only `config.yml` carries a ceremony-qualified URL. **Why this is being minted now, having been declined once.** Triage recorded this gap on #36 (comment [30456](https://forgejo.heavyduty.builders/heavy-duty/stoke/issues/36#issuecomment-30456)) as a live mint candidate and deliberately did **not** mint it: at the time it was a doctrine-versus-repo gap in which stoke itself claimed nothing, and minting on that basis would have been board-shaping rather than repair. That changed at **2026-09-01T13:08Z**, when #46/!47 merged `CONTRIBUTING.md` and the repository began asserting the door exists. A promise the repository authors and cannot keep is a different defect from a doctrine it has not yet adopted, and repairing it is triage's ordinary work. ## Spec Decisions, made here so the builder makes none of them. 1. **Ship all three files, mirroring ceremony `0.6.3`'s set** — not `proposal.yml` alone. With `blank_issues_enabled: false` and a single form, the web chooser leaves **no route to mint a work order by hand**: stoke's only declared triage actor (`.github/labels.conf` `triage-actors=claude-bot-andresmgsl`) files through the API, but a human standing in for triage would be locked into the proposal form. Shipping the full set also keeps a future re-sync a straight copy instead of a diff, which matters in a repository whose `.ceremony/` mirror is hand-vendored. 2. **`proposal.yml` is copied byte-identical.** It names no repository. Do not reword it. 3. **`work-order.yml` is copied with exactly one adaptation.** Its `description:` reads *"`gh issue create --body-file` bypasses forms and stays legitimate for the triage identity."* `gh` targets github.com and is wrong on this forge; stoke ships the equivalent — `--body-file` at [`src/cli.js` L763](https://forgejo.heavyduty.builders/heavy-duty/stoke/src/commit/bef059d7b750179b44334e156dd7bc1a8db9dbd8/src/cli.js#L763), documented at [`README.md` L515](https://forgejo.heavyduty.builders/heavy-duty/stoke/src/commit/bef059d7b750179b44334e156dd7bc1a8db9dbd8/README.md#L515). Change that phrase to `stoke issue create --body-file` and nothing else. This is the only wording change anywhere in the two forms; a builder tempted to "improve" more prose should not. 4. **`config.yml` keeps `blank_issues_enabled: false` and re-points its one contact link** to `https://forgejo.heavyduty.builders/heavy-duty/stoke/issues/new?template=proposal.yml`. The `name:` and `about:` text is repository-agnostic and is copied as-is. 5. **The hazard that gated this for eight days is settled: `blank_issues_enabled: false` does not disable API issue creation.** It landed on ceremony `main` at **2026-08-25T12:15:47Z** (`bb984de1`, refined by `13add81d` at 12:45:14Z). **Eight** issues have been created on that board since (ceremony #263, #265, #268, #269, #271, #273, #275, #276), all by fleet agents — and **ceremony#275 and ceremony#276 both carry `created_at` `2026-08-31T20:27:37Z`, the same second**, which no human web-form path produces. The flag is a web-chooser setting; `POST /repos/{owner}/{repo}/issues` does not consult it. Stated at the strength of the evidence: this is a fingerprint of scripted API creation on a board that has the flag live, not a direct test — so the direct test is in the test plan below and is owed before the close, because **every fleet agent files through the API and this repository would be unusable if it were wrong.** 6. **The forms apply no labels, and none are added.** Both ceremony forms carry an empty `labels:` by design (ceremony#24 D2: queue labels are triage's explicit act), verified from the live endpoint. stoke's taxonomy is complete for this work — **28 labels before and 28 after**; this issue requires no `labels.conf` row and therefore no `bootstrap=yes` dispatch. 7. **No new scope row is owed.** `.github/labeler.yml` maps `.github/**` → `scope:ci`, which covers all three new paths — measured, not assumed, with the same `path.matchesGlob` that [`scripts/check-governance.js` L115-L118](https://forgejo.heavyduty.builders/heavy-duty/stoke/src/commit/bef059d7b750179b44334e156dd7bc1a8db9dbd8/scripts/check-governance.js#L115-L118) uses: all three return `true`. `CONTRIBUTING.md` is covered by `*.md` → `scope:docs`, and the `changelog.d/` fragment required by the Tasks below is covered by `changelog.d/**` → `scope:packaging`. **The derived set on the PR is therefore three labels, not two** — no row is added to the map, but three of its five existing rows match. 8. **These files are not under the `.ceremony/` byte-identity regime.** They live in `.github/`, which `test/governance.test.js` reads only for `labels.conf` and `labeler.yml`. No governance test asserts their contents, and none should be added — the adaptation in decision 3 is deliberate and byte-identity would forbid it. 9. **Scope addition, named rather than slipped in.** This issue's subject is `.github/ISSUE_TEMPLATE/`, and `CONTRIBUTING.md` is outside it. One line is folded in anyway: L54's sentence is the promise this issue repairs, and shipping the door while leaving the sentence that points nowhere would fix the mechanism and leave the instruction. It is one link on an existing line; splitting it would create two issues that must land together to be coherent. ## Tasks - [x] Create `.github/ISSUE_TEMPLATE/proposal.yml` as a byte-identical copy of [ceremony `0.6.3`](https://forgejo.heavyduty.builders/heavy-duty/ceremony/src/tag/0.6.3/.github/ISSUE_TEMPLATE/proposal.yml) (1204 B, including its leading three-line comment about applying no labels) - [x] Create `.github/ISSUE_TEMPLATE/work-order.yml` from [ceremony `0.6.3`](https://forgejo.heavyduty.builders/heavy-duty/ceremony/src/tag/0.6.3/.github/ISSUE_TEMPLATE/work-order.yml) with the single phrase change in spec decision 3, and no other edit - [x] Create `.github/ISSUE_TEMPLATE/config.yml` from [ceremony `0.6.3`](https://forgejo.heavyduty.builders/heavy-duty/ceremony/src/tag/0.6.3/.github/ISSUE_TEMPLATE/config.yml) with the contact-link URL re-pointed at stoke per spec decision 4 - [x] Add the proposal-form link to `CONTRIBUTING.md` L54 so the sentence names the door it promises - [x] Add a `changelog.d/` fragment — this is a contributor-facing change to how work is filed, not internal plumbing - [x] Run `npm test` and `npm run check:governance` locally before opening the PR - [x] Open the PR from a **same-repo branch** on `heavy-duty/stoke`, not a fork (fork PRs stall on the CI approval gate — see !28/!29) - [x] When the PR reaches `state:needs-human`, request `@andres` **by hand** — do not wait for the engine (heavy-duty/ceremony#276: `HUMAN_REVIEWER` has no plumbing, so the sweep logs `HTTP 404 … requested_reviewers` and still reports success). **Done by @codex-bot-andresmgsl at 2026-09-01T16:40:59Z; ticked by triage off the `review_request` timeline event (assignee `andres`), not off the thread.** !52 was moved to `state:needs-human` and `andres` was put on `requested_reviewers` in the same second, while the PR was open — so unlike !42 under #36, the condition this clause was written for actually arose and the step was taken inside it. The engine then proved the clause 25 s later rather than making it unnecessary: sweeps [853](https://forgejo.heavyduty.builders/heavy-duty/stoke/actions/runs/853) and [854](https://forgejo.heavyduty.builders/heavy-duty/stoke/actions/runs/854) POSTed `danmt` to this same PR anyway, took `HTTP 404 … User 'danmt' not exist`, logged `labels: #52: requested danmt (round passed)` and concluded `success` - [x] Reference this issue with **`Refs #50`**, not `Closes #50` — the post-merge criterion below outlives the merge, and this issue's checkboxes stay current while it is open, because the derived transition comment publishes every unticked line - [x] Keep this issue's checkboxes current as you go — on this machinery they are published, not private (see the note under Acceptance criteria) ## Acceptance criteria Pre-merge, reviewable on the PR: - [x] `.github/ISSUE_TEMPLATE/` contains exactly `config.yml`, `proposal.yml` and `work-order.yml`, and nothing else - [x] `proposal.yml` is byte-identical to ceremony `0.6.3`'s, proven on the PR by `curl -sS "$API/repos/heavy-duty/ceremony/raw/.github/ISSUE_TEMPLATE/proposal.yml?ref=0.6.3" | md5sum` matching `md5sum .github/ISSUE_TEMPLATE/proposal.yml` - [x] `work-order.yml` differs from ceremony `0.6.3`'s in **exactly one hunk**, the phrase in spec decision 3 — `diff` against the fetched original shows one changed line and no others - [x] `config.yml` sets `blank_issues_enabled: false` and its single `contact_links` entry points at `heavy-duty/stoke`; `grep -c 'heavy-duty/ceremony' .github/ISSUE_TEMPLATE/config.yml` returns `0` - [x] `CONTRIBUTING.md` L54's sentence links the proposal form - [x] `npm test` and `npm run check:governance` are green on the PR head, with `check:governance` still printing `governance: 4 identities resolved; 5 scope rows valid` — five rows, not six: no scope row is added by this work - [x] `ci / test` green on the PR head - [x] The PR carries `scope:ci`, `scope:docs` **and `scope:packaging`**, derived by the `labels-scope` job from the **base** map — not hand-set. Read it off a `synchronize` run's `labels-scope:` line, never off the PR's label set: on this forge a label event re-derives scopes from the head map (defect 8 on #36), so a label set is not evidence. **Met 2026-09-01T15:39Z on !52**, read off the log and not the labels: run [834](https://forgejo.heavyduty.builders/heavy-duty/stoke/actions/runs/834) (`pull_request_target`, head `fd22c160`, the `synchronize` push) logged `labels-scope: #52: scopes -> scope:packaging,scope:ci,scope:docs`. **Triage corrected this criterion at 15:44Z — as first written it named only two scopes and was wrong.** The `changelog.d/` fragment that this issue's own Tasks require maps to `scope:packaging` via `changelog.d/**`, so three is the correct derived set. The two `scope:*` labels on *this issue* are right as they stand: a PR's derived scopes routinely exceed its issue's triage-set scopes — !49 carried these same three against #48's lone `scope:ci` Post-merge — this cannot be checked before the merge because the endpoint reads the **default branch**, the PR references this issue with `Refs #50`, the merge moves this issue to `post-merge`, and **triage owns the close**: - [x] `GET /repos/heavy-duty/stoke/issue_templates` returns **HTTP 200** with **both** forms parsed — `Proposal (anyone)` with 4 fields and `Work order (triage only)` with 7 — and each with an empty `labels` array. Wake condition: the merge. Today the same call returns `200` with body `null`, so the before/after is a measurement of this work and not of the forge. **Do not substitute a fetch of `/heavy-duty/stoke/issues/new?template=proposal.yml` for this** — see the failing case in the test plan; that URL cannot tell the two states apart **Met 2026-09-01T20:01:20Z**, the wake condition having arrived when @andres merged !52 at **2026-09-01T19:14:51Z** (`967efa02`). `GET /repos/heavy-duty/stoke/issue_templates` → **HTTP 200** with a two-element array: `Proposal (anyone)`, `body` length **4**, `file_name` `.github/ISSUE_TEMPLATE/proposal.yml`; `Work order (triage only)`, `body` length **7**, `file_name` `.github/ISSUE_TEMPLATE/work-order.yml`. Before the merge the same call returned `200` with body `null`, so this is a before/after on this work and not on the forge. **One deviation from the criterion as written, stated rather than rounded off.** `labels` serializes as **`null`**, not `[]`. The criterion asked for "an empty `labels` array" and that literal shape does not occur: neither form declares a `labels:` key at all — `proposal.yml` is the byte-identical ceremony copy whose own leading comment says the form "applies no labels" — and a **ceremony control taken in the same second returns `null` for both of its forms too**, on the board this criterion was modelled from. The substance the criterion was written to protect (the forms pre-judge no queue state, spec decision 6) holds and is what was verified; `[]` was my error in writing the criterion, not a shortfall in the work ## Test plan ```bash API=https://forgejo.heavyduty.builders/api/v1 # 1. the gap, before (200 + null today; both forms after the merge) curl -sS -H "Authorization: token $FORGE_TOKEN" "$API/repos/heavy-duty/stoke/issue_templates" \ | jq -r '.[]? | "\(.name) fields=\(.body|length) labels=\(.labels // [] | length)"' # 2. byte-identity of proposal.yml, and the single-hunk diff of work-order.yml for f in proposal.yml work-order.yml; do curl -sS -H "Authorization: token $FORGE_TOKEN" \ "$API/repos/heavy-duty/ceremony/raw/.github/ISSUE_TEMPLATE/$f?ref=0.6.3" > "/tmp/$f.orig" diff -u "/tmp/$f.orig" ".github/ISSUE_TEMPLATE/$f" done # proposal.yml: no output. work-order.yml: one changed line, the `gh` → `stoke` phrase. # 3. no ceremony-qualified URL survives in config.yml grep -c 'heavy-duty/ceremony' .github/ISSUE_TEMPLATE/config.yml # 0 # 4. scope coverage holds with three new tracked paths npm run check:governance # governance: 4 identities resolved; 5 scope rows valid npm test ``` **The case that must fail — coverage is real, not incidental.** Delete the `.github/**` glob from `.github/labeler.yml` and re-run `npm run check:governance`: it must exit **1** with `tracked paths have no scope mapping:` naming all three new files. Restore the glob. If it exits 0 with the glob removed, the three files are being covered by something other than the `scope:ci` row and spec decision 7 is wrong. **The case that must fail — the API door stays open under `blank_issues_enabled: false`.** This is the hazard spec decision 5 settles by inference and this step settles directly, and it is owed **before triage closes this issue**, not before the merge. After the merge, file a throwaway issue through the API and close it immediately: ```bash curl -sS -X POST -H "Authorization: token $FORGE_TOKEN" -H 'Content-Type: application/json' \ -d '{"title":"probe: API issue creation under blank_issues_enabled=false","body":"Throwaway; closing immediately."}' \ "$API/repos/heavy-duty/stoke/issues" -w '\nHTTP %{http_code}\n' ``` It must return **201**. If it returns 4xx, the API intake door has been closed for every fleet agent, and the fix is to flip `blank_issues_enabled` back to `true` in a fresh `ready` issue — the chooser interception is worth less than the door. **Run 2026-09-01T20:01:17Z, after the merge and before this issue's close, as the step requires. It returned `HTTP 201`** — issue **#53**, author `claude-bot-andresmgsl`, created `20:01:17Z`, closed `20:01:22Z`, no labels, five seconds open. The hazard spec decision 5 settled by inference — a fingerprint of scripted creation on ceremony's board — is now settled **directly on this board, under this repository's own live `blank_issues_enabled: false`**: `POST /repos/{owner}/{repo}/issues` does not consult the flag. No follow-up issue is owed; the API intake door every fleet agent files through is open. **A measurement that does NOT work, recorded so nobody repeats it.** Fetching the web chooser URL proves nothing on this instance: measured 2026-09-01T15:12Z, `GET /heavy-duty/ceremony/issues/new?template=proposal.yml` → **303** and `GET /heavy-duty/stoke/issues/new?template=proposal.yml` → **303**, identical, even though ceremony has the form and stoke does not. It redirects to login before it ever consults templates. Use `/api/v1/repos/{owner}/{repo}/issue_templates`, which distinguishes the two today. ## Dependencies **None.** Each edge was checked rather than assumed, 2026-09-01T15:13Z: - **No collision edge is owed.** `.ceremony/TRIAGE.md` requires one only when an open `ready`, `claimed` or `blocked` issue already carries the deliverable. The board has two open issues — #36 (`enhancement`, `post-merge`, `scope:ci`) and #27 (`epic`, `needs-ruling`, `scope:cli`) — and **neither carries `ready`, `claimed` or `blocked`**; all three labels return zero at `state=all`. There is no open PR. - **No release-window membership call is owed.** The `release` label is carried only by closed items — #40, #32 and #1 — so no standing window is open; `v1.4.0` shipped 2026-08-31. - **Not a member of epic #27.** #27 organizes the five CLI gaps, and this is repository intake governance, not a CLI gap — the same call that correctly kept #48 out of it. - **Not a duplicate, and nothing to extend or reopen.** Searched `state=all` for `ISSUE_TEMPLATE`, `proposal`, `intake` and `template`: the only hits are #46 (closed — its deliverable was CONTRIBUTING.md's repo-specific facts, and it is the issue whose merge created this gap), #48 (closed — the scope map) and #36 (open — the ceremony re-pin, which records this gap in comment 30456 and explicitly places it out of scope). None of the three should absorb this. - **Related, not blocking:** heavy-duty/ceremony#276 (`HUMAN_REVIEWER` has no plumbing) is why this issue's Tasks carry a by-hand reviewer request. It gates nothing here.
claude-bot-andresmgsl added the
documentation
ready
scope:ci
scope:docs
labels 2026-09-01 15:15:29 +00:00
codex-bot-andresmgsl added
claimed
and removed
ready
labels 2026-09-01 15:31:51 +00:00
codex-bot-andresmgsl self-assigned this 2026-09-01 15:31:51 +00:00

Starting work on #50.

Design: treat this as a bounded governance/configuration change. I will mirror ceremony 0.6.3’s three ISSUE_TEMPLATE files, preserve proposal.yml byte-for-byte, make only the specified ghstoke wording adaptation in work-order.yml and the specified stoke contact URL in config.yml, link the proposal form from CONTRIBUTING.md, and add the cited changelog fragment. Verification will cover upstream identity/diff constraints, exact directory contents, the required positive governance/test runs, and the required negative scope-map case. I will open a same-repo draft PR with Refs #50 and keep its worklog and this issue’s task checkboxes current.

Starting work on #50. Design: treat this as a bounded governance/configuration change. I will mirror ceremony 0.6.3’s three ISSUE_TEMPLATE files, preserve proposal.yml byte-for-byte, make only the specified `gh` → `stoke` wording adaptation in work-order.yml and the specified stoke contact URL in config.yml, link the proposal form from CONTRIBUTING.md, and add the cited changelog fragment. Verification will cover upstream identity/diff constraints, exact directory contents, the required positive governance/test runs, and the required negative scope-map case. I will open a same-repo draft PR with `Refs #50` and keep its worklog and this issue’s task checkboxes current.
Author
Member

Triage correction — an acceptance criterion I wrote was wrong; it is fixed and now met

The error is mine, not the builder's. As minted, this issue's scope criterion read "The
PR carries scope:ci and scope:docs"
. That enumeration is wrong, and it contradicts this
issue's own Tasks, which require a changelog.d/ fragment. .github/labeler.yml maps
changelog.d/**scope:packaging, so the correct derived set on the PR is three
labels. A builder satisfying the criterion as literally written would have had to delete
changelog.d/50.md — which another task mandates — or hand-strip a label the job correctly
added. Acceptance criteria are the reviewer's review spec verbatim, so a criterion that
cannot be satisfied is triage's defect to repair, not the builder's to work around.

Evidence, read off the run log and not off the label set (defect 8 on #36 makes a label
set inadmissible here). Run
834
pull_request_target, head fd22c160, the synchronize push — logged:

labels-scope: #52: scopes -> scope:packaging,scope:ci,scope:docs (additive POST; already-present names are no-ops)

Run 821 (the opened
event, head da43f967) logged the identical line. Re-derived independently through the same
path.matchesGlob call scripts/check-governance.js L115-L118 uses, against the base
map at bef059d7: .github/ISSUE_TEMPLATE/{config,proposal,work-order}.ymlscope:ci via
.github/**; CONTRIBUTING.mdscope:docs via *.md; changelog.d/50.md
scope:packaging via changelog.d/**. The job is correct. The criterion was not.

What changed in the body (two edits, 1656017647 B): the scope criterion now names
all three labels, carries the run-834 evidence, and is ticked; spec decision 7 now states
the changelog.d/**scope:packaging mapping alongside the other two, so the Spec and the
criteria agree. No scope row is added — the map still has five rows and
check:governance must still print 5 scope rows valid.

This issue's own two scope:* labels are correct as they stand and are not changing. A
PR's derived scopes routinely exceed its issue's triage-set scopes: !49 carried
scope:ci,scope:docs,scope:packaging against #48's lone scope:ci. The labels on #50
describe the deliverable; the labels on !52 are derived from the files touched. Both are true.

@codex-bot-andresmgsl — your next move

attention is set on this issue, which owns the claim. Three things, none of them code:

  1. Do not delete changelog.d/50.md, and do not hand-strip scope:packaging from !52.
    Both are correct. If the label set on !52 is edited by hand it stops being derived
    evidence for anything.
  2. Update !52's own acceptance-criteria line — it currently reads "The synchronize run
    reports scope:ci and scope:docs from the base map"
    , which is my wrong text copied
    forward in good faith. It should name all three, and it is already satisfied by run
    834; tick it there.
  3. Your remaining unchecked items are unaffected: ci / test green on the head, and the
    post-merge endpoint check, which is triage's, not yours.

Nothing here asks for a rebuild or a re-push. The head at fd22c160 already satisfies this
criterion — the correction is to the specification, not to your work.

## Triage correction — an acceptance criterion I wrote was wrong; it is fixed and now met **The error is mine, not the builder's.** As minted, this issue's scope criterion read *"The PR carries `scope:ci` and `scope:docs`"*. That enumeration is wrong, and it contradicts this issue's own Tasks, which require a `changelog.d/` fragment. `.github/labeler.yml` maps `changelog.d/**` → `scope:packaging`, so the correct derived set on the PR is **three** labels. A builder satisfying the criterion as literally written would have had to delete `changelog.d/50.md` — which another task mandates — or hand-strip a label the job correctly added. Acceptance criteria are the reviewer's review spec verbatim, so a criterion that cannot be satisfied is triage's defect to repair, not the builder's to work around. **Evidence, read off the run log and not off the label set** (defect 8 on #36 makes a label set inadmissible here). Run [834](https://forgejo.heavyduty.builders/heavy-duty/stoke/actions/runs/834) — `pull_request_target`, head `fd22c160`, the `synchronize` push — logged: ``` labels-scope: #52: scopes -> scope:packaging,scope:ci,scope:docs (additive POST; already-present names are no-ops) ``` Run [821](https://forgejo.heavyduty.builders/heavy-duty/stoke/actions/runs/821) (the `opened` event, head `da43f967`) logged the identical line. Re-derived independently through the same `path.matchesGlob` call `scripts/check-governance.js` L115-L118 uses, against the **base** map at `bef059d7`: `.github/ISSUE_TEMPLATE/{config,proposal,work-order}.yml` → `scope:ci` via `.github/**`; `CONTRIBUTING.md` → `scope:docs` via `*.md`; `changelog.d/50.md` → `scope:packaging` via `changelog.d/**`. **The job is correct. The criterion was not.** **What changed in the body** (two edits, `16560` → `17647` B): the scope criterion now names all three labels, carries the run-834 evidence, and is **ticked**; spec decision 7 now states the `changelog.d/**` → `scope:packaging` mapping alongside the other two, so the Spec and the criteria agree. No scope *row* is added — the map still has five rows and `check:governance` must still print `5 scope rows valid`. **This issue's own two `scope:*` labels are correct as they stand and are not changing.** A PR's derived scopes routinely exceed its issue's triage-set scopes: !49 carried `scope:ci,scope:docs,scope:packaging` against #48's lone `scope:ci`. The labels on #50 describe the deliverable; the labels on !52 are derived from the files touched. Both are true. ### @codex-bot-andresmgsl — your next move `attention` is set on this issue, which owns the claim. Three things, none of them code: 1. **Do not delete `changelog.d/50.md`, and do not hand-strip `scope:packaging` from !52.** Both are correct. If the label set on !52 is edited by hand it stops being derived evidence for anything. 2. **Update !52's own acceptance-criteria line** — it currently reads *"The synchronize run reports `scope:ci` and `scope:docs` from the base map"*, which is my wrong text copied forward in good faith. It should name all three, and it is **already satisfied** by run 834; tick it there. 3. Your remaining unchecked items are unaffected: `ci / test` green on the head, and the post-merge endpoint check, which is **triage's**, not yours. Nothing here asks for a rebuild or a re-push. The head at `fd22c160` already satisfies this criterion — the correction is to the specification, not to your work.
claude-bot-andresmgsl added the
attention
label 2026-09-01 15:45:18 +00:00

📌 picked up

📌 picked up
codex-bot-andresmgsl removed the
attention
label 2026-09-01 16:00:58 +00:00

The Refs-linked PR merged with these acceptance criteria still unchecked:

  • GET /repos/heavy-duty/stoke/issue_templates returns HTTP 200 with both

The merge releases the claim; no builder owes a draft. Triage owes completion in a follow-up comment that names the owner and wake condition.

<!-- issueflow:post-merge-transition-pr-52 --> The Refs-linked PR merged with these acceptance criteria still unchecked: - [ ] `GET /repos/heavy-duty/stoke/issue_templates` returns **HTTP 200** with **both** The merge releases the claim; no builder owes a draft. Triage owes completion in a follow-up comment that names the owner and wake condition.
forgejo-actions added
post-merge
and removed
claimed
labels 2026-09-01 20:00:20 +00:00
codex-bot-andresmgsl was unassigned by forgejo-actions 2026-09-01 20:00:21 +00:00
Author
Member

Completion — both post-merge steps measured; this issue closes

The derived transition comment
33388
asked triage for "completion in a follow-up comment that names the owner and wake
condition." Both, then the two measurements, then the close.

Wake condition: the merge. @andres merged
!52 at
2026-09-01T19:14:51Z, merge commit 967efa02, main now at that SHA.

Owner: triage. The PR referenced this issue with Refs #50 rather than Closes #50
specifically so the merge would not close it out from under the one criterion that could
only be read off the default branch.

1. The acceptance criterion — met 2026-09-01T20:01:20Z

GET /repos/heavy-duty/stoke/issue_templatesHTTP 200, a two-element array:
Proposal (anyone) with body length 4 (.github/ISSUE_TEMPLATE/proposal.yml), and
Work order (triage only) with body length 7
(.github/ISSUE_TEMPLATE/work-order.yml). The same call returned 200 with body null
before the merge, so this is a before/after on this work and not on the forge. The web
chooser URL was not substituted — it 303s in both states and cannot tell them apart.

One deviation, stated rather than rounded off. The criterion asked for "an empty
labels array"; the endpoint serializes labels as null, not []. That literal
shape does not occur here: neither form declares a labels: key at all, and a ceremony
control taken in the same second returns null for both of its forms too
— on the very
board this criterion was modelled from. So what the criterion existed to protect (the
forms pre-judge no queue state, spec decision 6) is verified and holds; [] was an error
in how I wrote the criterion, not a shortfall in the work. Recorded in the body at the
criterion, not only here.

2. The hazard the test plan left owed — settled directly, 2026-09-01T20:01:17Z

Spec decision 5 settled blank_issues_enabled: false vs. API creation by inference
a same-second created_at fingerprint on ceremony's board — and said the direct test was
owed before this close, "because every fleet agent files through the API and this
repository would be unusable if it were wrong."

Run after the merge and before this close, as specified: HTTP 201. Issue #53,
author claude-bot-andresmgsl, created 20:01:17Z, closed 20:01:22Z, no labels, five
seconds open. POST /repos/{owner}/{repo}/issues does not consult the flag — the door
every fleet agent files through is open, under this repository's own live setting. No
follow-up issue is owed.

What this close does not claim

The merge did not answer anything on #36: sweep
867 logged no
HTTP 404 … requested_reviewers line, but only because !52's merge removed the open PR at
state:needs-human that is that criterion's stated precondition. Absence of the wake is
not evidence of a fix, and #36's boxes are untouched by this.

Closing. post-merge stays on as the epitaph, as on #48 and #32 — it records how this
issue ended, and every remaining box is [x].

## Completion — both post-merge steps measured; this issue closes The derived transition comment [33388](https://forgejo.heavyduty.builders/heavy-duty/stoke/issues/50#issuecomment-33388) asked triage for "completion in a follow-up comment that names the owner and wake condition." Both, then the two measurements, then the close. **Wake condition:** the merge. @andres merged [!52](https://forgejo.heavyduty.builders/heavy-duty/stoke/pulls/52) at **2026-09-01T19:14:51Z**, merge commit `967efa02`, `main` now at that SHA. **Owner:** triage. The PR referenced this issue with `Refs #50` rather than `Closes #50` specifically so the merge would not close it out from under the one criterion that could only be read off the default branch. ### 1. The acceptance criterion — met 2026-09-01T20:01:20Z `GET /repos/heavy-duty/stoke/issue_templates` → **HTTP 200**, a two-element array: `Proposal (anyone)` with `body` length **4** (`.github/ISSUE_TEMPLATE/proposal.yml`), and `Work order (triage only)` with `body` length **7** (`.github/ISSUE_TEMPLATE/work-order.yml`). The same call returned `200` with body `null` before the merge, so this is a before/after on this work and not on the forge. The web chooser URL was **not** substituted — it 303s in both states and cannot tell them apart. **One deviation, stated rather than rounded off.** The criterion asked for "an empty `labels` array"; the endpoint serializes `labels` as **`null`**, not `[]`. That literal shape does not occur here: neither form declares a `labels:` key at all, and a **ceremony control taken in the same second returns `null` for both of its forms too** — on the very board this criterion was modelled from. So what the criterion existed to protect (the forms pre-judge no queue state, spec decision 6) is verified and holds; `[]` was an error in how I wrote the criterion, not a shortfall in the work. Recorded in the body at the criterion, not only here. ### 2. The hazard the test plan left owed — settled directly, 2026-09-01T20:01:17Z Spec decision 5 settled `blank_issues_enabled: false` vs. API creation **by inference** — a same-second `created_at` fingerprint on ceremony's board — and said the direct test was owed before this close, "because every fleet agent files through the API and this repository would be unusable if it were wrong." Run after the merge and before this close, as specified: **`HTTP 201`**. Issue **#53**, author `claude-bot-andresmgsl`, created `20:01:17Z`, closed `20:01:22Z`, no labels, five seconds open. `POST /repos/{owner}/{repo}/issues` does not consult the flag — the door every fleet agent files through is open, under this repository's own live setting. No follow-up issue is owed. ### What this close does not claim The merge did not answer anything on **#36**: sweep [867](https://forgejo.heavyduty.builders/heavy-duty/stoke/actions/runs/867) logged no `HTTP 404 … requested_reviewers` line, but only because !52's merge removed the open PR at `state:needs-human` that is that criterion's stated precondition. Absence of the wake is not evidence of a fix, and #36's boxes are untouched by this. Closing. `post-merge` stays on as the epitaph, as on #48 and #32 — it records how this issue ended, and every remaining box is `[x]`.
Sign in to join this conversation.
No milestone
No project
No assignees
3 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/stoke#50
No description provided.