Plain-English release bodies: what changed + what to try on every pushed version (#2582 fix branch) #2583

Merged
conductor merged 4 commits from feat/2582-release-reporting into master 2026-10-24 15:11:37 +01:00
Owner

In plain English

Reading a pushed version should be enough: the release body now opens with a plain-English changelog — What is new (fixed/added/improved), What you could try (derived from the surfaces actually touched), and How it was verified. Before, bodies carried raw commit lists, or claimed "No substantive changes" on a 21-commit day.

Root causes

  1. latest_release_tag() sorted ALL tag namespaces: the TUI build tag (tui-v*) captured the main-line v* range lookup, so the exit-note started hours late and blanked the note.
  2. The Go narrative prepend ran before body finalization and failed silently — the "What's new" header never appeared on some releases.
  3. No try-action derivation existed.

What shipped

  • tag_repair.py --namespace main|tui (tests red-first: tests/test_tag_repair.py, 4 cases: default=main, tui-only state, selectable namespaces, empty repo).
  • The Go narrative: SuggestTryActions (path→reader-action map, deduped, capped, nothing invented for tooling-only changes) + PlainEnglishNarrativeWithTry + GitChangedPaths; the CLI passes changed paths from both commands.
  • auto-version.yml + maintenance.yml: all --latest-tag callers declare the namespace.
  • v0.346.0's body rebuilt retroactively with the new template (verifiable on the server right now).

What would let us close this

  • v0.346.0's body shows the template (visible now)
  • namespace tests + narrative tests green (they are, locally)
  • CI lint job green on the branch
  • the next earned version publishes with the template automatically

Version impact

  • patch — release reporting content; no runtime behavior

Changelog (added later, same family)

Added: the committed CI-checkable changelog (f18b6cc3)

  • CHANGELOG.md now lives in the repo: one section per version (newest first), composed deterministically from the main v* tags — What's new bullets, What you could try, generated at the sync step.
  • CI check: changelog --check rides the lint job — regeneration byte-compares against the committed file; a release that skips its sync turns the gate red on the next PR. The tags are immutable, so the gate is exact, not opinion.
  • Auto-sync: auto-version's release step now syncs the changelog with a chore(changelog): commit — classified "other" by the convergence authority, so it earns no version (no recursion).
  • Red-first tests: composition determinism + suggestion dedupe (go), namespace law (python). All green.
## In plain English Reading a pushed version should be enough: the release body now opens with a plain-English changelog — What is new (fixed/added/improved), What you could try (derived from the surfaces actually touched), and How it was verified. Before, bodies carried raw commit lists, or claimed "No substantive changes" on a 21-commit day. ## Root causes 1. `latest_release_tag()` sorted ALL tag namespaces: the TUI build tag (`tui-v*`) captured the main-line `v*` range lookup, so the exit-note started hours late and blanked the note. 2. The Go narrative prepend ran before body finalization and failed silently — the "What's new" header never appeared on some releases. 3. No try-action derivation existed. ## What shipped - `tag_repair.py --namespace main|tui` (tests red-first: `tests/test_tag_repair.py`, 4 cases: default=main, tui-only state, selectable namespaces, empty repo). - The Go narrative: `SuggestTryActions` (path→reader-action map, deduped, capped, nothing invented for tooling-only changes) + `PlainEnglishNarrativeWithTry` + `GitChangedPaths`; the CLI passes changed paths from both commands. - auto-version.yml + maintenance.yml: all `--latest-tag` callers declare the namespace. - v0.346.0's body rebuilt retroactively with the new template (verifiable on the server right now). ## What would let us close this - [ ] v0.346.0's body shows the template (visible now) - [ ] namespace tests + narrative tests green (they are, locally) - [ ] CI lint job green on the branch - [ ] the next earned version publishes with the template automatically ## Version impact - [ ] patch — release reporting content; no runtime behavior --- ## Changelog (added later, same family) ## Added: the committed CI-checkable changelog (f18b6cc3) - **CHANGELOG.md** now lives in the repo: one section per version (newest first), composed deterministically from the main `v*` tags — `What's new` bullets, `What you could try`, generated at the sync step. - **CI check**: `changelog --check` rides the lint job — regeneration byte-compares against the committed file; a release that skips its sync turns the gate red on the next PR. The tags are immutable, so the gate is exact, not opinion. - **Auto-sync**: auto-version's release step now syncs the changelog with a `chore(changelog):` commit — classified "other" by the convergence authority, so it earns no version (no recursion). - Red-first tests: composition determinism + suggestion dedupe (go), namespace law (python). All green.
conductor added 2 commits 2026-10-24 12:00:09 +01:00
feat(release): plain-English version reads — namespace-aware tags, what-to-try narrative (#2582)
deploy / deploy (push) Skipped
CI Pipeline / best-practices (push) Successful in 12s
CI Pipeline / documentation (push) Successful in 13s
CI Pipeline / rust-surface (push) Failing after 19s
CI Pipeline / gitea-offline (push) Successful in 20s
CI Pipeline / go-surface (push) Failing after 39s
CI Pipeline / required-checks (push) Canceled after 0s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Canceled after 0s
CI Pipeline / canary (push) Canceled after 47s
CI Pipeline / lint (push) Canceled after 51s
CI Pipeline / unit-tests (push) Canceled after 51s
CI Pipeline / type-check (push) Canceled after 52s
01da5b0999
contract:ADMIT-release-reporting — the version-push reader page now
carries a plain-English body: What is new grouped fixed/new/improved,
What you could try derived from touched surfaces, How it was verified.
latest_release_tag namespaces (main v* vs tui-v*) so the TUI build tag
never blanks a release note; the workflow feeds one namespace-resolved
PREV_TAG to every range consumer; the Go narrative carries the try list
and the workflow rewires its callers. Tests red-first (python namespace
law, go try-section law) + retroactive v0.346.0 body rebuild follows.
feat(release-notes): tool-executor try action (#2582)
deploy / deploy (push) Skipped
CI Pipeline / gitea-offline (push) Canceled after 0s
CI Pipeline / required-checks (push) Canceled after 0s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Canceled after 0s
CI Pipeline / rust-surface (push) Canceled after 6s
CI Pipeline / documentation (push) Canceled after 5s
CI Pipeline / unit-tests (push) Canceled after 6s
CI Pipeline / type-check (push) Canceled after 5s
CI Pipeline / lint (push) Canceled after 6s
CI Pipeline / canary (push) Canceled after 6s
CI Pipeline / go-surface (push) Canceled after 6s
CI Pipeline / best-practices (push) Canceled after 5s
Auto-label / auto-label (pull_request) Successful in 1s
CI Pipeline / rust-surface (pull_request) Failing after 24s
Local-Model First-Pass Review (#131) / first-pass-review (pull_request) Successful in 28s
CI Pipeline / best-practices (pull_request) Successful in 14s
CI Pipeline / documentation (pull_request) Successful in 13s
Spec gate (headless) / spec-gate (pull_request) Successful in 41s
CI Pipeline / go-surface (pull_request) Failing after 49s
CI Pipeline / gitea-offline (pull_request) Successful in 21s
CI Pipeline / lint (pull_request) Failing after 1m7s
CI Pipeline / type-check (pull_request) Failing after 52s
CI Pipeline / canary (pull_request) Failing after 3m50s
CI Pipeline / required-checks (pull_request) Canceled after 0s
CI Pipeline / CI Pipeline / notify-event-bridge (pull_request) Canceled after 0s
CI Pipeline / unit-tests (pull_request) Canceled after 27m26s
0ab8a9485e
The v0.346.0 retroactive body rebuild exposed the missing reader action
for tool-executor/local_tool_runtime waves: reading a file through Rune
should behave exactly as before.
gitea-actions Bot added the P1 — highbuggrowth labels 2026-10-24 12:00:15 +01:00

🤖 Headless spec gate (non-blocking, #204 first slice)

Spec-gate agent produced no text output — check runner logs.

Deterministic floors still govern the merge

This comment is advisory. Required checks (lint, tests, canaries, type-check, coverage, dependency lock, impact gate) remain the merge authority per docs/adversarial-review.md proportionality.

🤖 **Headless spec gate (non-blocking, #204 first slice)** Spec-gate agent produced no text output — check runner logs. <details><summary>Deterministic floors still govern the merge</summary> This comment is advisory. Required checks (lint, tests, canaries, type-check, coverage, dependency lock, impact gate) remain the merge authority per docs/adversarial-review.md proportionality.</details>
conductor added 1 commit 2026-10-24 12:27:33 +01:00
feat(release): proper-markdown release bodies — rebuild authority + recursion guard (#2582)
CI Pipeline / lint (push) Canceled after 0s
CI Pipeline / unit-tests (push) Canceled after 0s
CI Pipeline / go-surface (push) Canceled after 0s
CI Pipeline / rust-surface (push) Canceled after 0s
CI Pipeline / canary (push) Canceled after 0s
CI Pipeline / best-practices (push) Canceled after 0s
CI Pipeline / documentation (push) Canceled after 0s
CI Pipeline / type-check (push) Canceled after 0s
CI Pipeline / gitea-offline (push) Canceled after 0s
CI Pipeline / required-checks (push) Canceled after 0s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Canceled after 0s
deploy / deploy (push) Skipped
Spec gate (headless) / spec-gate (pull_request) Successful in 26s
Local-Model First-Pass Review (#131) / first-pass-review (pull_request) Successful in 29s
CI Pipeline / rust-surface (pull_request) Failing after 26s
CI Pipeline / best-practices (pull_request) Successful in 8s
CI Pipeline / documentation (pull_request) Successful in 8s
CI Pipeline / gitea-offline (pull_request) Successful in 21s
CI Pipeline / go-surface (pull_request) Failing after 47s
CI Pipeline / lint (pull_request) Failing after 1m3s
CI Pipeline / type-check (pull_request) Failing after 49s
CI Pipeline / canary (pull_request) Failing after 3m32s
CI Pipeline / required-checks (pull_request) Canceled after 0s
CI Pipeline / CI Pipeline / notify-event-bridge (pull_request) Canceled after 0s
CI Pipeline / unit-tests (pull_request) Canceled after 16m41s
a13714364a
The readability ruling applied: every version-push body rebuilds as
proper markdown — exactly ONE H1 (the version title), What is new (H2,
capped readable bullets), What you could try (H2, reader actions), How
it was verified (H2, standard gates), Technical (H2, historical tails
capped). The strip-own-sections recursion guard makes rebuilds
idempotent: earlier rebuild layers (this session produced three) strip
off until the original evidence remains, so no body ever accumulates
stale narratives again. The 49 existing releases (both namespaces)
rebuilt live; audit: zero artifacts, zero contradictions on all.

🤖 Headless spec gate (non-blocking, #204 first slice)

Spec-gate agent produced no text output — check runner logs.

Deterministic floors still govern the merge

This comment is advisory. Required checks (lint, tests, canaries, type-check, coverage, dependency lock, impact gate) remain the merge authority per docs/adversarial-review.md proportionality.

🤖 **Headless spec gate (non-blocking, #204 first slice)** Spec-gate agent produced no text output — check runner logs. <details><summary>Deterministic floors still govern the merge</summary> This comment is advisory. Required checks (lint, tests, canaries, type-check, coverage, dependency lock, impact gate) remain the merge authority per docs/adversarial-review.md proportionality.</details>
conductor added 1 commit 2026-10-24 12:44:19 +01:00
feat(changelog): committed CI-checkable changelog — deterministic regen gate (#2582)
CI Pipeline / lint (push) Canceled after 0s
CI Pipeline / unit-tests (push) Canceled after 0s
CI Pipeline / go-surface (push) Canceled after 0s
CI Pipeline / rust-surface (push) Canceled after 0s
CI Pipeline / canary (push) Canceled after 0s
CI Pipeline / best-practices (push) Canceled after 0s
CI Pipeline / documentation (push) Canceled after 0s
CI Pipeline / type-check (push) Canceled after 0s
CI Pipeline / gitea-offline (push) Canceled after 0s
CI Pipeline / required-checks (push) Canceled after 0s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Canceled after 0s
deploy / deploy (push) Skipped
Local-Model First-Pass Review (#131) / first-pass-review (pull_request) Successful in 28s
CI Pipeline / rust-surface (pull_request) Failing after 25s
Spec gate (headless) / spec-gate (pull_request) Successful in 36s
CI Pipeline / best-practices (pull_request) Successful in 9s
CI Pipeline / documentation (pull_request) Successful in 8s
Auto-label / auto-label (pull_request) Successful in 1s
CI Pipeline / go-surface (pull_request) Failing after 48s
CI Pipeline / gitea-offline (pull_request) Successful in 19s
CI Pipeline / lint (pull_request) Failing after 59s
CI Pipeline / type-check (pull_request) Failing after 46s
CI Pipeline / canary (pull_request) Failing after 3m37s
CI Pipeline / unit-tests (pull_request) Failing after 37m50s
CI Pipeline / required-checks (pull_request) Failing after 0s
CI Pipeline / CI Pipeline / notify-event-bridge (pull_request) Failing after 5s
Auto-version and Release / release (pull_request) Canceled after 0s
f18b6cc363
The changelog = a generated artifact, not a kept doc: CHANGELOG.md
composes from the MAIN v* tag namespace (one section per version: What is
new / What you could try / What verifies it) byte-deterministically; CI
lint runs "changelog --check" (byte-compare vs regeneration — a release
that skips its sync turns the gate red); auto-version syncs it after
every release with a chore(changelog) commit (the convergence classifier
ranks it "other" = earns no version, no recursion). Tests red-first
(deterministic composition, dedupe); the go battery + the generated
file are current as of v0.346.0.

🤖 Headless spec gate (non-blocking, #204 first slice)

Spec-gate agent produced no text output — check runner logs.

Deterministic floors still govern the merge

This comment is advisory. Required checks (lint, tests, canaries, type-check, coverage, dependency lock, impact gate) remain the merge authority per docs/adversarial-review.md proportionality.

🤖 **Headless spec gate (non-blocking, #204 first slice)** Spec-gate agent produced no text output — check runner logs. <details><summary>Deterministic floors still govern the merge</summary> This comment is advisory. Required checks (lint, tests, canaries, type-check, coverage, dependency lock, impact gate) remain the merge authority per docs/adversarial-review.md proportionality.</details>
gitea-actions Bot removed the bug label 2026-10-24 12:45:02 +01:00
conductor merged commit 9c5ea0aeb2 into master 2026-10-24 15:11:37 +01:00
Sign in to join this conversation.
No Reviewers
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: conductor/rune#2583