T06: optimization-case schema, fail-closed evaluator, cadence and decision template. Every option including the baseline must present all ten decision fields; one unknown blocks the comparison. Validated on the storage case (Hetzner computes and loses to Scaleway by EUR 29.14/month on operator labour; Host Europe blocks on four named gaps) and on the non-storage reef-railiance k3s rightsizing case (low utilization is real, but nothing is costable while the railiance01 price is unknown). T07: portfolio report over coverage, lifecycle, utilization, cost, renewals, risks, open cases, and next actions, derived only from committed evidence. Portfolio spend is reported null rather than as a partial sum, unattributed cost is a named list rather than a spread, and unmeasurable resources are reported rather than dropped. RESOURCE-WP-0003 is finished; both cases remain blocked_on_evidence against live delegated records in other repositories. RESOURCE-WP-0002 is untouched. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
157 lines
6.1 KiB
JSON
157 lines
6.1 KiB
JSON
{
|
|
"schema_version": "0.1",
|
|
"record_scope": "operational",
|
|
"case_id": "opt:platform-audit-storage:2026-08",
|
|
"case_type": "provider_switch",
|
|
"trigger": "procurement",
|
|
"review_period": "2026-08",
|
|
"created_at": "2026-08-14T00:00:00Z",
|
|
"resource_ids": [
|
|
"resource:platform:audit-storage"
|
|
],
|
|
"baseline": {
|
|
"option_id": "scaleway-standard-multi-az",
|
|
"label": "Scaleway Standard Multi-AZ object storage (nl-ams), provisional primary from due diligence",
|
|
"one_time_eur": 0,
|
|
"recurring_infrastructure_eur_month": 7.35,
|
|
"recurring_internal_labor_eur_month": 60,
|
|
"recurring_external_labor_eur_month": 0,
|
|
"utilization": {
|
|
"stored_gb": {
|
|
"provisioned": { "value": 457.968, "unit": "GB" },
|
|
"used": { "value": 457.968, "unit": "GB" }
|
|
}
|
|
},
|
|
"uncertainty": {
|
|
"level": "medium",
|
|
"notes": [
|
|
"Month-12 base-scenario figures from tools/cost_model.py, not a booked invoice",
|
|
"Elastic capacity: provisioned equals used by construction, so the ratio does not signal waste",
|
|
"Published list price; no account quote or committed discount"
|
|
]
|
|
},
|
|
"service_constraints": {
|
|
"retention_days": { "value": 30, "unit": "days" },
|
|
"target_rpo_minutes": { "value": 5, "unit": "minutes" }
|
|
},
|
|
"failure_domains": [
|
|
"provider:scaleway",
|
|
"region:nl-ams"
|
|
],
|
|
"exit_path": "Delete objects and buckets, revoke the scoped access key, close the project, and confirm removal; modelled exit cost EUR 243.83.",
|
|
"unknowns": []
|
|
},
|
|
"alternatives": [
|
|
{
|
|
"option_id": "hetzner-object-storage",
|
|
"label": "Hetzner Object Storage (nbg1), monthly base price including 1 TB storage and egress",
|
|
"one_time_eur": 0,
|
|
"recurring_infrastructure_eur_month": 6.49,
|
|
"recurring_internal_labor_eur_month": 90.0,
|
|
"recurring_external_labor_eur_month": 0,
|
|
"utilization": {
|
|
"stored_gb": {
|
|
"provisioned": { "value": 1000, "unit": "GB" },
|
|
"used": { "value": 457.968, "unit": "GB" }
|
|
}
|
|
},
|
|
"uncertainty": {
|
|
"level": "medium",
|
|
"notes": [
|
|
"Priced only within the included 1 TB quota; excess storage and egress rates are not published in the recorded source",
|
|
"The base scenario stays inside the quota, so the high scenario cannot be evaluated from this option"
|
|
]
|
|
},
|
|
"service_constraints": {
|
|
"retention_days": { "value": 30, "unit": "days" },
|
|
"target_rpo_minutes": { "value": 5, "unit": "minutes" }
|
|
},
|
|
"failure_domains": [
|
|
"provider:hetzner",
|
|
"region:nbg1"
|
|
],
|
|
"exit_path": "Delete objects and buckets, revoke the S3 credential, cancel the subscription; modelled exit cost EUR 240.00.",
|
|
"unknowns": []
|
|
},
|
|
{
|
|
"option_id": "host-europe-cloud-storage",
|
|
"label": "Host Europe Cloud Storage, same provider as the reef-railiance compute host",
|
|
"one_time_eur": null,
|
|
"recurring_infrastructure_eur_month": null,
|
|
"recurring_internal_labor_eur_month": 120,
|
|
"recurring_external_labor_eur_month": 0,
|
|
"utilization": {
|
|
"stored_gb": {
|
|
"provisioned": { "value": null, "unit": "GB" },
|
|
"used": { "value": 457.968, "unit": "GB" }
|
|
}
|
|
},
|
|
"uncertainty": {
|
|
"level": "high",
|
|
"notes": [
|
|
"Only a historical published price and service specification exists; current orderability for this account is unconfirmed",
|
|
"Co-located with railiance01, so a provider-level failure would remove the primary host and the backup copy together"
|
|
]
|
|
},
|
|
"service_constraints": {
|
|
"retention_days": { "value": 30, "unit": "days" },
|
|
"target_rpo_minutes": { "value": 5, "unit": "minutes" }
|
|
},
|
|
"failure_domains": [
|
|
"provider:host-europe"
|
|
],
|
|
"exit_path": null,
|
|
"unknowns": [
|
|
"current S3 orderability for this account (owner: human account authority via Host Europe support)",
|
|
"storage_eur_per_gb_month, monthly_minimum_eur, egress_eur_per_gb, operations_eur_per_month, support_eur_per_month",
|
|
"cancellation terms and minimum contract period",
|
|
"correlated-failure acceptance for same-provider placement (owner: human financial and risk authority)"
|
|
]
|
|
}
|
|
],
|
|
"decision": {
|
|
"state": "blocked_on_evidence",
|
|
"recommended_option_id": null,
|
|
"rationale": "This case exercises the optimization process against real cost-model output; it is not the procurement decision, which RESOURCE-WP-0002-T03 owns and human financial authority approves. Hetzner computes fully and is EUR 29.14 per month more expensive than the Scaleway baseline at month-12 base demand, driven by operator labour rather than storage price. Host Europe cannot be compared at all: its price, cancellation terms, and current orderability are unknown, and it shares a failure domain with the compute host it is meant to protect. No provider is recommended until Host Europe returns written account evidence.",
|
|
"approver": null,
|
|
"approved_on": null,
|
|
"delegated_to": []
|
|
},
|
|
"financial_handoff": {
|
|
"cost_attribution_key": "platform:audit-storage",
|
|
"sent": false,
|
|
"reference": null
|
|
},
|
|
"outcome": {
|
|
"feeds_forecast": [
|
|
"data/forecasts/platform-audit-storage-scaleway-base-2026-08.json"
|
|
],
|
|
"actual_refs": []
|
|
},
|
|
"evidence": [
|
|
{
|
|
"kind": "forecast",
|
|
"ref": "tools/cost_model.py base scenario month 12 over data/demand/platform-audit-storage.json",
|
|
"authority": "resource-control",
|
|
"observed_at": "2026-08-14"
|
|
},
|
|
{
|
|
"kind": "document",
|
|
"ref": "docs/evidence/RESOURCE-WP-0002-provider-due-diligence-2026-08-10.md",
|
|
"authority": "resource-control",
|
|
"observed_at": "2026-08-10"
|
|
},
|
|
{
|
|
"kind": "document",
|
|
"ref": "docs/evidence/RESOURCE-WP-0002-expanded-storage-comparison-2026-08-10.md",
|
|
"authority": "resource-control",
|
|
"observed_at": "2026-08-10"
|
|
},
|
|
{
|
|
"kind": "workplan",
|
|
"ref": "RESOURCE-WP-0002-T03",
|
|
"authority": "resource-control",
|
|
"observed_at": null
|
|
}
|
|
]
|
|
}
|