Skip to content

Commit 1b40ed1

Browse files
docs(adr): 0008-contractile-ci — informational only until a real consumer exists (#96)
Closes #60. The `just contractile-check` recipe prints OK/MISSING for the four contractile files. Nothing in CI currently fails when one is missing. The question: should CI enforce that, or stop pretending contractiles are enforced? ADR-0008 picks **informational-only**. Rationale: - Nothing in this repo *consumes* the contractile files at runtime. The Justfile only checks file existence; that's the only invariant we can usefully verify without a parser we haven't built. - Failing the build on a missing file produces churn-noise. Contributors will copy the file from another repo to satisfy CI without understanding what it's for. - The RSR-antipattern workflow already enforces broader structural rules; this is duplicative. When a real consumer exists (Rust crate parsing the files at build time, governance dashboard, etc.) reopen the ADR and flip the decision. Also adds a one-line comment to the Justfile recipe pointing at ADR-0008, so future contributors know why the recipe runs but isn't required. Contributes one fewer required check toward V-L3-F1 / #59. Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
1 parent 9973f06 commit 1b40ed1

2 files changed

Lines changed: 111 additions & 1 deletion

File tree

Justfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ install:
5050
assail:
5151
@command -v panic-attack >/dev/null 2>&1 && panic-attack assail . || echo "panic-attack not found — install from https://github.com/hyperpolymath/panic-attacker"
5252

53-
# Run contractile checks
53+
# Run contractile checks (informational only — not required by CI per ADR-0008)
5454
contractile-check:
5555
@echo "Running contractile validation..."
5656
@test -f .machine_readable/contractiles/must/Mustfile.a2ml && echo "Mustfile: OK" || echo "Mustfile: MISSING"
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
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

Comments
 (0)