118 lines
5.8 KiB
Markdown
118 lines
5.8 KiB
Markdown
|
|
# RESOURCE-WP-0002-T07 — fin-hub feed and optimization loop — 2026-08-14
|
||
|
|
|
||
|
|
## Result
|
||
|
|
|
||
|
|
The backup resource is live and proven, so the loop it exists to feed can now
|
||
|
|
run on real evidence instead of a model. T07 closes the cycle: observation →
|
||
|
|
thresholds → normalized fin-hub evidence → decided optimization case.
|
||
|
|
|
||
|
|
| Artifact | Purpose |
|
||
|
|
|---|---|
|
||
|
|
| `data/actuals/2026-08.json` | First real monthly observation for `platform:audit-storage` |
|
||
|
|
| `data/thresholds/platform-audit-storage.json` | Budget variance, abnormal growth, stale backup, and unused-commitment thresholds |
|
||
|
|
| `tools/thresholds.py`, `make thresholds PERIOD=…` | Fail-closed threshold evaluation |
|
||
|
|
| `tools/financial_exchange.py usage`, `make exchange-usage` | Normalized technical-usage evidence to fin-hub |
|
||
|
|
| `data/optimization/platform-audit-storage-2026-08.json` | The A/B/C case, now `approved` and executed |
|
||
|
|
| `data/resources/platform-audit-storage.json` | `ordered` → `active`, commissioned 2026-08-14 |
|
||
|
|
|
||
|
|
## The first period is honest about being four hours long
|
||
|
|
|
||
|
|
The bucket was created 2026-08-14T16:21:56Z and the first backup completed at
|
||
|
|
18:14:21Z. The 2026-08 row therefore covers about four hours of operation, and
|
||
|
|
says so. What is measured:
|
||
|
|
|
||
|
|
| Proxy | Value | Source |
|
||
|
|
|---|---|---|
|
||
|
|
| `database_gb` | 0.6365 | PGDATA 636 485 632 B |
|
||
|
|
| `stored_gb` | 0.0066 | 8 objects, 6 604 031 B in `platform-pg/` |
|
||
|
|
| `backup_success_pct` | 100 | 1 of 1 completed backups |
|
||
|
|
| `restore_rto_minutes` | 1.08 | 65 s full restore; PITR the same |
|
||
|
|
|
||
|
|
Five proxies are `null`, each with a named owner in `measurement_gaps`: WAL is
|
||
|
|
not separable from the base backup in the archive, restore egress bytes were
|
||
|
|
not recorded, no request metric is exposed to the scoped key, no invoice exists,
|
||
|
|
and no time record was kept for the procurement and drill work.
|
||
|
|
|
||
|
|
`internal_labor_hours` being null deserves a note: real operator hours were
|
||
|
|
spent this period on procurement, credential custody, and two restore drills.
|
||
|
|
Recording zero would have been false, and estimating would have been invention.
|
||
|
|
It is null with the reason attached, and the next period starts a time record.
|
||
|
|
|
||
|
|
## Why August produces no variance
|
||
|
|
|
||
|
|
`make variance ACTUAL=data/actuals/2026-08.json` returns `no-forecast` for the
|
||
|
|
period. The decision forecast begins at 2026-09, because the resource was not
|
||
|
|
expected to exist in August. This is the correct answer, not a defect: August
|
||
|
|
is a commissioning baseline and **2026-09 is the first comparable month**.
|
||
|
|
|
||
|
|
The threshold run reflects the same thing without pretending. Of nine
|
||
|
|
thresholds: two `within`, one `not_applicable`, six `unmeasured`, zero
|
||
|
|
breaches.
|
||
|
|
|
||
|
|
- `within` — `stale-backup` (100%) and `restore-rto-regression` (1.08 min against
|
||
|
|
a 3.24 min limit). These are the two things that were actually proven.
|
||
|
|
- `not_applicable` — `unused-commitment`. Scaleway Multi-AZ is usage-based with
|
||
|
|
no commitment, so there is nothing to under-use. Distinguished from passing.
|
||
|
|
- `unmeasured` — everything requiring an invoice, a request metric, a WAL split,
|
||
|
|
or a forecast row.
|
||
|
|
|
||
|
|
`unmeasured` is deliberately not `within`. A threshold that silently passes on
|
||
|
|
absent evidence is worse than no threshold: it reports safety it never checked.
|
||
|
|
|
||
|
|
## Thresholds set
|
||
|
|
|
||
|
|
Budget variance at 10% on infrastructure and 1 hour on labour; abnormal growth
|
||
|
|
at 20% on stored bytes and WAL; any egress not explained by a recorded drill;
|
||
|
|
backup success below 100% on any single run, not averaged across a month; WAL
|
||
|
|
archive gap above 15 minutes, three times the 5-minute `archive_timeout` beyond
|
||
|
|
which the RPO requirement fails; restore RTO above 3.24 minutes, three times the
|
||
|
|
measured baseline.
|
||
|
|
|
||
|
|
Two are declared rather than active. `wal_archive_gap_minutes` needs an archive
|
||
|
|
health metric from rapp-postgres. No euro budget ceiling exists: Scaleway has no
|
||
|
|
hard spend stop, the founder's email alert is the accepted backstop, and an
|
||
|
|
authoritative ceiling belongs to fin-hub.
|
||
|
|
|
||
|
|
## Feed to fin-hub
|
||
|
|
|
||
|
|
`financial_exchange.py usage` emits `technical_usage` records under the
|
||
|
|
contract's resource-control-to-fin-hub direction: resource, service, workload,
|
||
|
|
attribution key, period bounds, usage proxies, service evidence, and valued
|
||
|
|
internal labour — with `measurement_gaps` carried through so fin-hub sees why a
|
||
|
|
field is empty.
|
||
|
|
|
||
|
|
Infrastructure cost is absent by design. fin-hub owns the booked fact; an
|
||
|
|
uninvoiced period has no amount to send, and a `null` is never normalized to
|
||
|
|
`0.00`.
|
||
|
|
|
||
|
|
## The optimization case is now decided
|
||
|
|
|
||
|
|
`opt:platform-audit-storage:2026-08` moved from `blocked_on_evidence` to
|
||
|
|
`approved`, approver "founder (human financial authority)", 2026-08-14.
|
||
|
|
|
||
|
|
The schema gained `excluded` / `exclusion_reason` on an option, because the real
|
||
|
|
decision exposed a modelling gap: Host Europe never supplied written terms, and
|
||
|
|
the deciding authority chose to exclude it rather than delay recovery capability
|
||
|
|
indefinitely. Before this, an unevaluable alternative blocked its case forever,
|
||
|
|
which would have left the record claiming no decision had been made while the
|
||
|
|
bucket was in production. An excluded option no longer blocks, keeps its
|
||
|
|
recorded unknowns, and must state what would bring it back.
|
||
|
|
|
||
|
|
Hetzner remains a fully costed `reject` at €29.14/month dearer. The rationale
|
||
|
|
records two accepted risks at decision time: no euro hard-stop at Scaleway, and
|
||
|
|
the independent second copy required by the correlated-failure rule still
|
||
|
|
outstanding as T06.
|
||
|
|
|
||
|
|
## Boundary held
|
||
|
|
|
||
|
|
No booked cost was originated. The resource record moved to `active` on
|
||
|
|
operational fact — production backup enabled, `ContinuousArchivingSuccess`, both
|
||
|
|
restores verified — not on the purchase. Implementation of anything the case
|
||
|
|
approves is delegated to `railiance-platform` and `rapp-postgres`.
|
||
|
|
|
||
|
|
## Standing dependency
|
||
|
|
|
||
|
|
Total cost stays unknown until Scaleway invoices and fin-hub books it under
|
||
|
|
`FIN-WP-0004`. The loop runs monthly regardless; 2026-09 is the first period
|
||
|
|
that will produce real variance.
|