|
| 1 | += Architecture Decision Record: 0008-contractile-ci |
| 2 | +<!-- SPDX-License-Identifier: PMPL-1.0-or-later --> |
| 3 | +<!-- Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) <j.d.a.jewell@open.ac.uk> --> |
| 4 | + |
| 5 | +# 8. Contractile-check stays informational, not required |
| 6 | + |
| 7 | +Date: 2026-05-14 |
| 8 | + |
| 9 | +## Status |
| 10 | + |
| 11 | +Accepted |
| 12 | + |
| 13 | +## Context |
| 14 | + |
| 15 | +`.machine_readable/contractiles/` carries org-wide policy machinery |
| 16 | +(Mustfile, Trustfile, Dustfile, Intendfile — see ADR-0001 RSR |
| 17 | +adoption). The `just contractile-check` recipe shells out and prints |
| 18 | +OK / MISSING for each file. Nothing in CI fails when the recipe |
| 19 | +reports MISSING. |
| 20 | + |
| 21 | +Two coherent positions exist: |
| 22 | + |
| 23 | +1. **Wire it in.** Add a CI job that runs `just contractile-check` |
| 24 | + and fails the build on missing files. Force every PR to keep |
| 25 | + the contractile machinery in shape. |
| 26 | +2. **Leave it informational.** Treat the contractiles as documentation |
| 27 | + (which they currently are — no executable consumer reads them) and |
| 28 | + stop pretending they're enforced. If a consumer materialises later, |
| 29 | + re-open this ADR. |
| 30 | +
|
| 31 | +## Decision |
| 32 | + |
| 33 | +**Leave it informational** until a real consumer reads the |
| 34 | +contractile files programmatically. |
| 35 | + |
| 36 | +The argument for wiring it in is straightforward: the org adopted |
| 37 | +the RSR template (ADR-0001) and the contractile files are part of |
| 38 | +that template. CI enforcement makes drift visible. |
| 39 | + |
| 40 | +The argument against wins on present cost/benefit: |
| 41 | + |
| 42 | +* Nothing in this repo *consumes* the contractile files at runtime. |
| 43 | + `verisimiser` itself doesn't read them. The Justfile only checks |
| 44 | + file existence. |
| 45 | +* "File exists" is the only invariant we can usefully check. We |
| 46 | + can't verify that the *content* of e.g. `Mustfile.a2ml` is |
| 47 | + meaningful without a parser, which we haven't built. |
| 48 | +* Failing the build on a missing file produces churn-noise more |
| 49 | + than signal: contributors will copy the file from another repo |
| 50 | + to satisfy CI without understanding what it's for. |
| 51 | +* The RSR-antipattern workflow (`rsr-antipattern.yml`) already |
| 52 | + flags structural drift in adjacent files; the contractiles are |
| 53 | + inside its scope on the day a contractile parser exists. |
| 54 | +
|
| 55 | +This ADR records: today, the contractile-check is **informational |
| 56 | +only**. The `just contractile-check` recipe stays (so contributors |
| 57 | +can still verify the files are present), but no CI job invokes it |
| 58 | +as a required check. |
| 59 | + |
| 60 | +When a real consumer exists — a Rust crate that parses the |
| 61 | +contractile files at build time, an external validator, a |
| 62 | +governance dashboard — re-open this ADR and flip the decision. |
| 63 | + |
| 64 | +### Alternative considered |
| 65 | + |
| 66 | +Wire it in as a required CI job. Rejected for the reasons above. |
| 67 | + |
| 68 | +### Alternative considered (also rejected) |
| 69 | + |
| 70 | +Delete the contractile files entirely. Rejected because the org-wide |
| 71 | +RSR template adoption (ADR-0001) is a real commitment, and removing |
| 72 | +the files locally would make this repo a drift point. They are kept |
| 73 | +for that reason alone, even if no current consumer reads them. |
| 74 | + |
| 75 | +## Consequences |
| 76 | + |
| 77 | +### Positive |
| 78 | + |
| 79 | +* No CI churn-noise on contractile-file drift. |
| 80 | +* The repo's required-check count stays manageable (V-L3-F1 / #59 |
| 81 | + is the parent concern; this ADR contributes one fewer required |
| 82 | + check). |
| 83 | +* Future contractile work has a clear bar to clear: "ship a |
| 84 | + parser, then re-open this ADR". |
| 85 | +
|
| 86 | +### Negative |
| 87 | + |
| 88 | +* The contractile files can rot without surfacing. If `Mustfile.a2ml` |
| 89 | + loses its closing bracket, nothing complains until someone |
| 90 | + reads it manually. |
| 91 | +* New contributors may be confused — "why does this Justfile recipe |
| 92 | + exist if nothing fails on it?". The contractile-check recipe |
| 93 | + needs a comment-line answering that ("informational; see |
| 94 | + ADR-0008"). |
| 95 | +
|
| 96 | +### Neutral |
| 97 | + |
| 98 | +* The `rsr-antipattern.yml` workflow continues to enforce broader |
| 99 | + RSR-template structural rules. Anything reaching the "is this |
| 100 | + file present" level is already covered there. |
| 101 | +
|
| 102 | +## Cross-references |
| 103 | + |
| 104 | +* ADR-0001 — adopted RSR template (the contractile files are part |
| 105 | + of that template). |
| 106 | +* V-L3-F1 / issue #59 — CI noise pruning, of which this ADR is one |
| 107 | + contributing decision. |
| 108 | +* `Justfile::contractile-check` — the recipe whose output is now |
| 109 | + explicitly informational. |
| 110 | +* `.machine_readable/contractiles/` — where the files live. |
0 commit comments