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>
48 lines
1.9 KiB
Makefile
48 lines
1.9 KiB
Makefile
.PHONY: test forecast variance control-cycle exchange-forecast exchange-usage optimization portfolio-report settlement capability consumption-mode thresholds
|
|
|
|
test:
|
|
python3 -m unittest discover -s tests -p 'test_*.py'
|
|
python3 tools/validate.py
|
|
|
|
forecast:
|
|
python3 tools/cost_model.py data/demand/platform-audit-storage.json data/providers/object-storage.json
|
|
|
|
variance:
|
|
@test -n "$(ACTUAL)" || { echo 'ACTUAL=data/actuals/YYYY-MM.json is required' >&2; exit 2; }
|
|
python3 tools/variance.py data/forecasts/platform-audit-storage-scaleway-base-2026-08.json $(ACTUAL)
|
|
|
|
control-cycle:
|
|
@test -n "$(FORECAST)" -a -n "$(ACTUAL)" || { echo 'FORECAST=... ACTUAL=... are required' >&2; exit 2; }
|
|
python3 tools/control_cycle.py $(FORECAST) $(ACTUAL)
|
|
|
|
exchange-forecast:
|
|
python3 tools/financial_exchange.py forecast data/forecasts/platform-audit-storage-scaleway-base-2026-08.json
|
|
|
|
exchange-usage:
|
|
@test -n "$(ACTUAL)" || { echo 'ACTUAL=data/actuals/YYYY-MM.json is required' >&2; exit 2; }
|
|
python3 tools/financial_exchange.py usage $(ACTUAL) resource:platform:audit-storage
|
|
|
|
thresholds:
|
|
@test -n "$(PERIOD)" || { echo 'PERIOD=YYYY-MM is required' >&2; exit 2; }
|
|
python3 tools/thresholds.py data/thresholds/platform-audit-storage.json \
|
|
data/actuals/$(PERIOD).json $(PERIOD) \
|
|
data/forecasts/platform-audit-storage-scaleway-base-2026-08.json
|
|
|
|
optimization:
|
|
python3 tools/optimization.py $(CASE)
|
|
|
|
portfolio-report:
|
|
python3 tools/portfolio_report.py .
|
|
|
|
capability:
|
|
python3 tools/capability.py
|
|
|
|
consumption-mode:
|
|
@test -n "$(PERIOD)" || { echo 'PERIOD=YYYY-MM is required' >&2; exit 2; }
|
|
python3 tools/settlement.py consumption-mode --period $(PERIOD) \
|
|
> data/consumption-mode/current.json
|
|
@echo "wrote data/consumption-mode/current.json for $(PERIOD)"
|
|
|
|
settlement:
|
|
@test -n "$(PERIOD)" || { echo 'PERIOD=YYYY-MM is required' >&2; exit 2; }
|
|
python3 tools/settlement.py close --period $(PERIOD)
|