99 lines
4.6 KiB
Markdown
99 lines
4.6 KiB
Markdown
|
|
# Backup case restated in ITC-CAP terms — 2026-08-15
|
||
|
|
|
||
|
|
## Result
|
||
|
|
|
||
|
|
info-tech-canon accepted `demand/CapabilityProvisionEconomics.md` in full and
|
||
|
|
shipped canon 0.3.0 / ITC-CAP 0.2.0. They asked resource-control to restate the
|
||
|
|
backup case against the new shape, and said they would treat that restatement as
|
||
|
|
the real-provision proof for their §10 promotion requirement 3 rather than
|
||
|
|
inventing a worked example.
|
||
|
|
|
||
|
|
Delivered:
|
||
|
|
|
||
|
|
- `data/capability/platform-audit-storage.json` — the restatement
|
||
|
|
- `tools/capability.py`, `make capability` — validation against the live catalog
|
||
|
|
- `tools/basis.py`, `docs/evidence-basis.md` — the evidence-basis vocabulary
|
||
|
|
- 44 tests across `tests/test_capability.py` and `tests/test_basis.py`
|
||
|
|
|
||
|
|
`tools/capability.py` reads
|
||
|
|
`info-tech-canon/infospace/models/capability/capabilities.yaml` directly rather
|
||
|
|
than copying it. Every capability id, profile, quality dimension, maturity level,
|
||
|
|
resource class, native unit, and constraint predicate we use is checked against
|
||
|
|
what the canon actually declares, so drift in either repository fails here.
|
||
|
|
|
||
|
|
## What the restatement says
|
||
|
|
|
||
|
|
**The requirement is now expressible.** The constraint that decided the
|
||
|
|
procurement — the backup must not sit in the failure domain of the host it
|
||
|
|
protects — was prose in an acceptance-requirements section. It is now:
|
||
|
|
|
||
|
|
```yaml
|
||
|
|
constraints:
|
||
|
|
- dimension: geographical_separation
|
||
|
|
predicate: not_in
|
||
|
|
of: [{kind: host, id: railiance01}, {kind: provider, id: host-europe}]
|
||
|
|
```
|
||
|
|
|
||
|
|
**Two provisions, not one.** `resource:platform:audit-storage` provides
|
||
|
|
`data.object`; the CNPG/Barman configuration provides `data.backup` and depends
|
||
|
|
on it. This is the layering our resource records already had and could not name.
|
||
|
|
|
||
|
|
**The requirement is not met, and the record says so.** The requirement asks for
|
||
|
|
`data.backup` at D5. The provision is D4. Thresholds are declared, but the
|
||
|
|
evidence behind them is one backup, one full restore, one PITR, and about four
|
||
|
|
hours of operation; `wal_archive_gap_minutes` is declared and not yet emitted.
|
||
|
|
Reliability is claimed, not substantiated. The review reports
|
||
|
|
`status: below_requirement` rather than inflating the maturity to match.
|
||
|
|
|
||
|
|
**All four `data.backup` evidence hooks are satisfied** —
|
||
|
|
`successful_backup`, `successful_restore_test`, `measured_rpo`, `measured_rto` —
|
||
|
|
each `measured`, each pointing at the T05 evidence file. The `data.object`
|
||
|
|
provision is honestly incomplete: it satisfies neither `object_integrity_tests`
|
||
|
|
nor `availability_metrics`.
|
||
|
|
|
||
|
|
**Consumption is in native units.** Storage in GB, human effort in hours, tokens
|
||
|
|
for intelligence, and `P` for the purchased service — with unknown recorded as
|
||
|
|
unknown and never as zero. Two rows the old model could not have carried:
|
||
|
|
|
||
|
|
- `H` on the `data.backup` provision is `unknown`, because real operator time
|
||
|
|
was spent on procurement, credential custody, and two restore drills and no
|
||
|
|
time record was kept. A time record starts in 2026-09.
|
||
|
|
- `I` is `unknown` on both provisions. We do not meter tokens against a
|
||
|
|
provision yet.
|
||
|
|
|
||
|
|
## The evidence-basis addition
|
||
|
|
|
||
|
|
Beyond what the canon asked for, every value in the restatement declares how it
|
||
|
|
was obtained, on an ordered scale from `invoiced` through `measured`, `quoted`,
|
||
|
|
`derived`, `projected`, `estimated`, `assumed`, to `unknown`. A derived value
|
||
|
|
resolves to the weakest basis among its inputs.
|
||
|
|
|
||
|
|
The rule earns its place immediately. The provider comparison that produced the
|
||
|
|
decision — Scaleway over Hetzner by €29.14/month, stated to the cent — grades:
|
||
|
|
|
||
|
|
| | |
|
||
|
|
|---|---|
|
||
|
|
| by basis | `quoted` 1, `projected` 1, `assumed` 2 |
|
||
|
|
| weakest | `assumed` |
|
||
|
|
| evidenced ratio | 0.25 |
|
||
|
|
| **grade** | **`indicative`** |
|
||
|
|
|
||
|
|
One of four load-bearing values is evidenced. The two labour figures — the ones
|
||
|
|
that actually inverted the ranking — are `derived` from an `assumed` hour count
|
||
|
|
and an `assumed` rate, so they resolve to `assumed`.
|
||
|
|
|
||
|
|
This does not overturn the decision. The direction is robust under any plausible
|
||
|
|
rate, and the remaining alternative was five times dearer. It does say that the
|
||
|
|
*magnitude* is a model output rather than a measurement, and it identifies the
|
||
|
|
cheapest way to strengthen it: record real operator hours, not better arithmetic.
|
||
|
|
|
||
|
|
Note that this is a finding about our own most consequential decision, produced
|
||
|
|
by a mechanism that did not exist yesterday. It is the intended effect.
|
||
|
|
|
||
|
|
## Boundary held
|
||
|
|
|
||
|
|
No canon artifact was copied into this repository, and nothing was written into
|
||
|
|
info-tech-canon for this restatement. The capability catalog stays theirs; the
|
||
|
|
provisioned facts stay ours; the join is by capability id, which is exactly the
|
||
|
|
durable interface CAP-R5 describes and the reason the canon was not split.
|