|
| 1 | +# SPDX-License-Identifier: MPL-2.0 |
| 2 | +# Bustfile.a2ml — breakage contract for echo-types: what counts as a |
| 3 | +# busted state, how it is detected, and how to respond. |
| 4 | +# |
| 5 | +# Format: TOML-A2ML (parses with tomllib; `#` comments, [section], key = "value") |
| 6 | +# |
| 7 | +# Provenance: the flat-contractile completion of the estate layout |
| 8 | +# (PR #185 supplied Adjustfile/Intentfile/Justfile/Mustfile/Trustfile but |
| 9 | +# no Bustfile, and no nested bust/ contractile ever existed in this repo |
| 10 | +# or its visible siblings). Written fully from repo-true obligations on |
| 11 | +# 2026-06-12: the busted-state definitions, detection commands, and |
| 12 | +# response ladder below are the repo's own existing gates (Agda suite, |
| 13 | +# kernel-guard, guardrail scripts, CI workflows), not new policy. |
| 14 | + |
| 15 | +[bustfile] |
| 16 | +version = "1.0.0" |
| 17 | +format = "a2ml" |
| 18 | +repo = "echo-types" |
| 19 | +last-updated = "2026-06-12" |
| 20 | + |
| 21 | +# ============================================================ |
| 22 | +# Busted-state definition (any one of these means the repo is busted) |
| 23 | +# ============================================================ |
| 24 | + |
| 25 | +[definition] |
| 26 | +busted-states = [ |
| 27 | + "proofs/agda/All.agda fails to typecheck under --safe --without-K", |
| 28 | + "proofs/agda/Smoke.agda fails to typecheck (a pinned headline theorem broke)", |
| 29 | + "a postulate appears outside the enumerated proof-debt module (docs/proof-debt.md: proofs/agda/EchoImageFactorizationPropPostulated.agda)", |
| 30 | + "scripts/kernel-guard.sh fails (kernel/derived classification drift)", |
| 31 | + "tools/check-guardrails.sh fails (guardrail policy violation)", |
| 32 | + "a retracted claim from docs/retractions.adoc reappears in canonical docs", |
| 33 | + "main is red on the agda / governance / hypatia-scan workflows", |
| 34 | +] |
| 35 | + |
| 36 | +# ============================================================ |
| 37 | +# Detection (run these to decide whether the repo is busted) |
| 38 | +# ============================================================ |
| 39 | + |
| 40 | +[[detection]] |
| 41 | +name = "full-suite" |
| 42 | +doc = "The verified suite: every module imported by All.agda typechecks." |
| 43 | +run = "agda -i proofs/agda proofs/agda/All.agda" |
| 44 | +severity = "critical" |
| 45 | + |
| 46 | +[[detection]] |
| 47 | +name = "smoke-pins" |
| 48 | +doc = "Every headline theorem pinned via `using` clauses still exists." |
| 49 | +run = "agda -i proofs/agda proofs/agda/Smoke.agda" |
| 50 | +severity = "critical" |
| 51 | + |
| 52 | +[[detection]] |
| 53 | +name = "kernel-guard" |
| 54 | +doc = "Kernel-vs-derived module classification is consistent (docs/echo-types/echo-kernel-note.adoc)." |
| 55 | +run = "scripts/kernel-guard.sh" |
| 56 | +severity = "high" |
| 57 | + |
| 58 | +[[detection]] |
| 59 | +name = "guardrails" |
| 60 | +doc = "Repo guardrail checks (incl. comment-stripping postulate check, the real postulate gate)." |
| 61 | +run = "tools/check-guardrails.sh" |
| 62 | +severity = "high" |
| 63 | + |
| 64 | +[[detection]] |
| 65 | +name = "no-unsafe" |
| 66 | +doc = "No unsafe escape hatches outside the documented exceptions." |
| 67 | +run = "scripts/check-no-unsafe.sh" |
| 68 | +severity = "high" |
| 69 | + |
| 70 | +# ============================================================ |
| 71 | +# Response ladder (in order; stop at the first step that restores green) |
| 72 | +# ============================================================ |
| 73 | + |
| 74 | +[response] |
| 75 | +step-1 = "Do not merge anything while a critical detection fails on main; CI green precedes merge (admin-merges before CI green are a known anti-pattern in this repo's history — see CLAUDE.md PR #133 note)." |
| 76 | +step-2 = "If the breakage is uncommitted local work: run the Dustfile source-rollback task (git checkout HEAD -- .) and clean-build, then re-run detection." |
| 77 | +step-3 = "If the breakage landed on a branch: fix forward on that branch or close it as superseded at the next rung consolidation; never force-push over another session's work without re-fetching first." |
| 78 | +step-4 = "If the breakage landed on main: git revert the offending commit (history is append-only; no force-push to main)." |
| 79 | +step-5 = "Record the incident: open an issue with the failing command + output; if a proof rung was lost, note it in the session ledger per the CLAUDE.md rung-consolidation policy." |
| 80 | + |
| 81 | +[escalation] |
| 82 | +owner = "hyperpolymath" |
| 83 | +contact = "MAINTAINERS.adoc" |
| 84 | +bot-rule = "automated agents open an issue and stop; they do not auto-revert main, do not auto-merge fixes, and do not spam PR comments" |
| 85 | + |
| 86 | +# ============================================================ |
| 87 | +# Known exceptions (NOT busted states; do not 'fix' these) |
| 88 | +# ============================================================ |
| 89 | + |
| 90 | +[[known-exceptions]] |
| 91 | +name = "proof-debt-postulates" |
| 92 | +detail = "The four propositional-truncation postulates in proofs/agda/EchoImageFactorizationPropPostulated.agda are enumerated proof debt under Disposition (c) NECESSARY AXIOM (docs/proof-debt.md, PR #172). The module is isolated, guardrail-exempt by design, and not imported by All.agda or Smoke.agda." |
| 93 | + |
| 94 | +[[known-exceptions]] |
| 95 | +name = "hypatia-verified-false-positives" |
| 96 | +detail = "The entries in .hypatia-ignore (agda_postulate on Smoke.agda comments; the SVG xmlns http:// constant in tools/banner/build-banner.mjs) are verified false positives with in-file rationale; see bot_directives/hypatia.a2ml." |
| 97 | + |
| 98 | +[[known-exceptions]] |
| 99 | +name = "ordinal-track-open-gates" |
| 100 | +detail = "Ordinal-track Gate 1 (tail-rank-equality discharge, CHECKED-REFUTED unblock routes per PR #146) and Gate 3 (Path-4+ extensions) are documented OPEN work, not breakage. See STATE [blockers]." |
0 commit comments