feat(portfolio): complete RESOURCE-WP-0003 T06 optimization cases and T07 reporting
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>
This commit is contained in:
parent
54dd45c926
commit
2c2a6073ff
63 changed files with 4662 additions and 69 deletions
157
data/optimization/platform-audit-storage-2026-08.json
Normal file
157
data/optimization/platform-audit-storage-2026-08.json
Normal file
|
|
@ -0,0 +1,157 @@
|
|||
{
|
||||
"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
|
||||
}
|
||||
]
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue