Files
rune/scripts/admit_release_reporting.py
Nick f18b6cc363
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
feat(changelog): committed CI-checkable changelog — deterministic regen gate (#2582)
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.
2026-10-24 12:44:18 +01:00

93 lines
3.8 KiB
Python

"""Admission dispatch for #2582 release reporting (owner: plain-English
version reads with what-to-test).
The version-push reader bug tri-diagnosed: (1) latest_release_tag sorted
all tag namespaces, so the TUI build tag captured the main-line range;
(2) the Go narrative prepend ran before body finalization and failed
silently; (3) no try-actions existed. This contract admits: the
namespace-aware tag resolution, the try-action narrative, the workflow
rewiring, and the retroactive v0.346.0 body rebuild.
"""
import json
import os
import sys
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "src"))
from rune import construction_activation as cact # noqa: E402
from rune import construction_admission as cadm # noqa: E402
from rune import construction_mode as cmode # noqa: E402
from rune import scaffold as sc # noqa: E402
ROOT = os.path.join(os.path.dirname(__file__), "..")
OBJECTIVE = (
"#2582 release reporting: make a pushed version read like a changelog "
"for a non-technical owner — plain English what-changed, what-to-try "
"derived from touched surfaces, how-it-was-verified. Namespace-aware "
"tag resolution (main vs tui-v), the try-action narrative section, "
"workflow wiring, retroactive v0.346.0 body rebuild."
)
AFFECTED = [
"scripts/tag_repair.py",
"tests/test_tag_repair.py",
"src/go/release-notes/narrative.go",
"src/go/release-notes/narrative_test.go",
"src/go/release-notes/cli_narrative.go",
".gitea/workflows/auto-version.yml",
".gitea/workflows/maintenance.yml",
"src/go/release-notes/main.go", "src/go/release-notes/cli_changelog.go", "CHANGELOG.md", "scripts/admit_release_reporting.py",
]
def main() -> int:
store = os.path.join(ROOT, "store", "scaffold")
scaffold = sc.Scaffold(store, "rune")
md = cmode.classify_mode(OBJECTIVE, target_project="rune", project_exists=True,
affected_surface=AFFECTED)
need = {
"need_id": "need-release-reporting",
"objective": OBJECTIVE,
"origin": "worker",
"project": "rune",
"task_ref": "release-reporting",
"affected_surface": AFFECTED,
"evidence_refs": ["tests/test_tag_repair.py", "src/go/release-notes/narrative_test.go"],
}
act = cact.activate(md, need=need, scaffold=scaffold, builder="release-reporting")
env = cadm.admit(
act,
objective=OBJECTIVE,
builder="release-reporting",
affected_surface=AFFECTED,
evidence_refs=need["evidence_refs"],
origin="worker",
task_ref="release-reporting",
expected_new_entities=[
"src/go/release-notes/main.go", "src/go/release-notes/cli_changelog.go", "CHANGELOG.md", "scripts/admit_release_reporting.py", "tests/test_tag_repair.py",
],
expected_runtime_effects=[
"every pushed version's release body opens with plain English "
"what-changed + what-to-try + how-verified; ranges start at the "
"main v* tag, never the tui build tag",
],
verification_obligations=[
"pytest tests/test_tag_repair.py green (namespace law)",
"go test ./... in src/go/release-notes green (try-section law)",
"v0.346.0 body visibly rebuilt with the template",
],
regression_obligations=[
"no runtime behavior change: release reporting content only",
"the evidence store (release_history init) still receives its exit-note",
],
approval_ref="user: 'can you fix my gitea ... explains what was improved. and what could be tested' (session 2026-10-23)",
contract_id="ADMIT-release-reporting",
project_store=store,
project_id="rune",
)
print(json.dumps(env, indent=2, default=str)[:2400])
return 0 if env.get("success") else 1
if __name__ == "__main__":
sys.exit(main())