feat: restate the backup case in ITC-CAP terms; add evidence basis; publish consumption-mode signal

Three things.

1. CANON RESTATEMENT (info-tech-canon's ask after accepting our demand)
data/capability/platform-audit-storage.json restates the backup case against
ITC-CAP 0.2.0: requirement with profile, targets and the failure-domain
constraint that decided the procurement; two provisions (data.object and
data.backup); all four data.backup evidence hooks satisfied and measured; and
consumption in native units — GB, hours, tokens — with unknown never zero.

tools/capability.py reads their capabilities.yaml directly rather than copying
it, so drift in either repo fails here. The requirement asks D5, the provision
is D4, and the review reports below_requirement rather than inflating maturity.

2. EVIDENCE BASIS (tools/basis.py, docs/evidence-basis.md)
Every value declares how it was obtained on an ordered scale: invoiced,
measured, quoted, derived, projected, estimated, assumed, unknown. A derived
value resolves to the weakest basis among its inputs, so precise arithmetic
cannot launder weak assumptions.

First application is a finding about our own biggest decision: the Scaleway vs
Hetzner comparison, EUR 29.14/month stated to the cent, grades "indicative" —
1 of 4 load-bearing values evidenced, weakest "assumed". The direction is
robust; the magnitude is a model output. The cheapest fix is recording real
operator hours, not better arithmetic.

3. CONSUMPTION-MODE SIGNAL (railiance-platform RAILIANCE-WP-0017)
settlement.py gains a consumption-mode command projecting statements into the
signal they consume; make consumption-mode PERIOD=YYYY-MM publishes
data/consumption-mode/current.json. Currently an empty list: no live charges for
2026-09, so no entity is restricted. Publishing the empty list makes that an
assertion rather than an absence, which their contract distinguishes. The
validator fails if the published signal is stale.

185 tests pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
tegwick 2026-08-15 18:42:06 +02:00
parent d09924b3fc
commit 13c2b82281
11 changed files with 1163 additions and 3 deletions

View file

@ -8,7 +8,8 @@ from entities import REQUIRED_ENTITY_IDS, load_register, load_terms, require_ent
from optimization import validate_case
from portfolio import validate_record
from portfolio_report import build as build_portfolio_report
from settlement import close_fixture, close_live
from capability import load_canon, review as review_capability
from settlement import close_fixture, close_live, consumption_mode_signal
def load(path: str) -> dict:
@ -138,6 +139,25 @@ def main() -> int:
assert any("reef-storage" in note for note in view.get("notes") or [])
if view["reef_id"] == "reef-storage":
assert view["role"] == "storage_substrate"
# Capability restatements bind to the live ITC-CAP catalog rather than a
# copy of it, so drift in either repository fails here.
canon = load_canon()
capability_records = [load(str(p)) for p in Path("data/capability").glob("*.json")]
assert capability_records, "no capability restatement present"
for record in capability_records:
report = review_capability(record, canon)
assert report["provisions"], f"{record['record_id']} declares no provision"
for provision in report["provisions"]:
# Unknown consumption must be named, never silently absent.
assert provision["consumption"]["count"] > 0
backup = next(
p for r in capability_records for p in review_capability(r, canon)["provisions"]
if p["capability"] == "data.backup"
)
assert backup["evidence"]["complete"], "the backup provision must satisfy every declared hook"
signal = consumption_mode_signal(close_live(Path("."), "2026-09"), "2026-09")
published = load("data/consumption-mode/current.json")
assert published == signal, "consumption-mode signal is stale; run make consumption-mode"
print("resource-control declarations: valid")
return 0