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:
tegwick 2026-08-14 09:28:44 +02:00
parent 54dd45c926
commit 2c2a6073ff
63 changed files with 4662 additions and 69 deletions

View file

@ -0,0 +1 @@
{"schema_version":"0.1","record_id":"actual:apps-pg:2026-09","record_type":"actual","resource_id":"resource:railiance:apps-pg","resource_class":"shared_platform_service","period":"2026-09","created_at":"2026-10-02T00:00:00Z","scenario":"observed","forecast_ref":"forecast:apps-pg:2026-09:base:v1","revision_of":null,"usage_proxies":{"database_gb":{"value":6,"unit":"GB"},"connections":{"value":18,"unit":"peak"}},"capacity":{"model":"hybrid","provisioned":{"storage":{"value":20,"unit":"GiB"}},"used":{"storage":{"value":6,"unit":"GB"}}},"costs":{"currency":"EUR","infrastructure":15,"internal_labor":90,"external_labor":0,"total":105,"booked_cost_refs":["financial-fact:example-shared-allocation-2026-09"]},"allocation":{"method":"proportional","driver":"database_gb","method_version":"1","unattributed_eur":5},"service_constraints":{"rpo_minutes":{"value":5,"unit":"minutes"},"rto_minutes":{"value":60,"unit":"minutes"}},"variance_attribution":{"database_gb":"demand","connections":"model","costs.internal_labor":"labor"},"evidence":["illustrative actual; replace with RAILIANCE-WP-0016 evidence"]}

View file

@ -0,0 +1 @@
{"schema_version":"0.1","record_id":"forecast:apps-pg:2026-09:base:v1","record_type":"forecast","resource_id":"resource:railiance:apps-pg","resource_class":"shared_platform_service","period":"2026-09","created_at":"2026-08-11T00:00:00Z","scenario":"base","forecast_ref":null,"revision_of":null,"usage_proxies":{"database_gb":{"value":5,"unit":"GB"},"connections":{"value":20,"unit":"peak"}},"capacity":{"model":"hybrid","provisioned":{"storage":{"value":20,"unit":"GiB"}},"used":{"storage":{"value":5,"unit":"GB"}}},"costs":{"currency":"EUR","infrastructure":15,"internal_labor":60,"external_labor":0,"total":75,"booked_cost_refs":[]},"allocation":{"method":"proportional","driver":"database_gb","method_version":"1","unattributed_eur":5},"service_constraints":{"rpo_minutes":{"value":5,"unit":"minutes"},"rto_minutes":{"value":60,"unit":"minutes"}},"uncertainty":{"level":"high","notes":["Illustrative until platform evidence arrives"]},"evidence":["RAILIANCE-WP-0016"]}

View file

@ -0,0 +1 @@
{"schema_version":"0.1","record_id":"actual:reef-railiance:2026-09","record_type":"actual","resource_id":"resource:railiance:reef-railiance:k3s","resource_class":"cluster_compute","period":"2026-09","created_at":"2026-10-02T00:00:00Z","scenario":"observed","forecast_ref":"forecast:reef-railiance:2026-09:base:v1","revision_of":null,"usage_proxies":{"cpu_requested":{"value":3,"unit":"vCPU"},"memory_requested":{"value":7,"unit":"GiB"}},"capacity":{"model":"fixed","provisioned":{"cpu":{"value":4,"unit":"vCPU"},"memory":{"value":16,"unit":"GiB"}},"used":{"cpu":{"value":3,"unit":"vCPU"},"memory":{"value":7,"unit":"GiB"}}},"costs":{"currency":"EUR","infrastructure":40,"internal_labor":150,"external_labor":0,"total":190,"booked_cost_refs":["financial-fact:example-host-2026-09"]},"allocation":{"method":"proportional","driver":"cpu_and_memory_requests","method_version":"1","unattributed_eur":10},"service_constraints":{"availability_pct":{"value":99,"unit":"percent"}},"variance_attribution":{"cpu_requested":"demand","memory_requested":"demand","costs.internal_labor":"labor"},"evidence":["illustrative actual; replace with RAIL-BS-WP-0014 evidence"]}

View file

@ -0,0 +1 @@
{"schema_version":"0.1","record_id":"forecast:reef-railiance:2026-09:base:v1","record_type":"forecast","resource_id":"resource:railiance:reef-railiance:k3s","resource_class":"cluster_compute","period":"2026-09","created_at":"2026-08-11T00:00:00Z","scenario":"base","forecast_ref":null,"revision_of":null,"usage_proxies":{"cpu_requested":{"value":2.5,"unit":"vCPU"},"memory_requested":{"value":6,"unit":"GiB"}},"capacity":{"model":"fixed","provisioned":{"cpu":{"value":4,"unit":"vCPU"},"memory":{"value":16,"unit":"GiB"}},"used":{"cpu":{"value":2.5,"unit":"vCPU"},"memory":{"value":6,"unit":"GiB"}}},"costs":{"currency":"EUR","infrastructure":40,"internal_labor":120,"external_labor":0,"total":160,"booked_cost_refs":[]},"allocation":{"method":"proportional","driver":"cpu_and_memory_requests","method_version":"1","unattributed_eur":10},"service_constraints":{"availability_pct":{"value":99,"unit":"percent"}},"uncertainty":{"level":"high","notes":["Illustrative until delegated cluster observations arrive"]},"evidence":["RAIL-BS-WP-0014"]}

View file

@ -0,0 +1 @@
{"schema_version":"0.1","record_id":"actual:platform-audit-storage:2026-09","record_type":"actual","resource_id":"resource:platform:audit-storage","resource_class":"storage","period":"2026-09","created_at":"2026-10-02T00:00:00Z","scenario":"observed","forecast_ref":"forecast:platform-audit-storage:2026-09:base:v1","revision_of":null,"usage_proxies":{"stored_gb":{"value":350,"unit":"GB-month"},"egress_gb":{"value":5,"unit":"GB"}},"capacity":{"model":"elastic","provisioned":{},"used":{"stored_gb":{"value":350,"unit":"GB-month"}}},"costs":{"currency":"EUR","infrastructure":5.62,"internal_labor":60,"external_labor":0,"total":65.62,"booked_cost_refs":["financial-fact:example-storage-2026-09"]},"allocation":{"method":"direct","driver":"stored_gb","method_version":"1","unattributed_eur":0},"service_constraints":{"rpo_minutes":{"value":5,"unit":"minutes"},"rto_minutes":{"value":55,"unit":"minutes"}},"variance_attribution":{"stored_gb":"demand","costs.infrastructure":"provider_price"},"evidence":["illustrative actual; replace with provider and platform evidence"]}

View file

@ -0,0 +1 @@
{"schema_version":"0.1","record_id":"forecast:platform-audit-storage:2026-09:base:v1","record_type":"forecast","resource_id":"resource:platform:audit-storage","resource_class":"storage","period":"2026-09","created_at":"2026-08-11T00:00:00Z","scenario":"base","forecast_ref":null,"revision_of":null,"usage_proxies":{"stored_gb":{"value":320,"unit":"GB-month"},"egress_gb":{"value":5,"unit":"GB"}},"capacity":{"model":"elastic","provisioned":{},"used":{"stored_gb":{"value":320,"unit":"GB-month"}}},"costs":{"currency":"EUR","infrastructure":5.14,"internal_labor":60,"external_labor":0,"total":65.14,"booked_cost_refs":[]},"allocation":{"method":"direct","driver":"stored_gb","method_version":"1","unattributed_eur":0},"service_constraints":{"rpo_minutes":{"value":5,"unit":"minutes"},"rto_minutes":{"value":60,"unit":"minutes"}},"uncertainty":{"level":"high","notes":["No booked provider fact exists yet"]},"evidence":["data/demand/platform-audit-storage.json"]}

View file

@ -0,0 +1,15 @@
{
"schema_version": "0.2", "record_scope": "example",
"id": "resource:example:garage:cluster", "resource_class": "self_managed_service",
"status": "proposed", "management_model": "self_managed",
"provider": {"name": "Example IaaS provider", "account_ref": null, "product_ref": "three-vm-topology", "provider_resource_id": null},
"service": {"name": "Garage object storage", "service_id": "object-storage", "class": "S3-compatible replicated service", "capacity_model": "fixed"},
"location": {"region": "example-eu", "country": "DE", "failure_domains": ["provider:example", "region:example-eu"], "residency": "European Union"},
"capacity": [{"metric": "usable_storage", "value": 320, "unit": "GB", "kind": "usable", "observed_at": null}, {"metric": "nodes", "value": 3, "unit": "count", "kind": "provisioned", "observed_at": null}],
"ownership": {"owner": "railiance-platform", "environment": "production", "workload_ids": [], "tenant_id": null, "allocation": {"mode": "shared", "cost_attribution_key": "platform:object-storage", "driver": "stored-gb-month", "method_version": "storage-share-v1"}},
"cost": {"currency": "EUR", "tax_status": "unknown", "billing_model": "fixed VM capacity plus internal operations labor", "commitment_ref": null, "price_evidence": null},
"lifecycle": {"proposed_on": null, "ordered_on": null, "commissioned_on": null, "renews_on": null, "cancel_by": null, "retired_on": null, "exit_path": "Export objects to a verified S3-compatible target, revoke credentials, and retire nodes after consumers move."},
"relationships": [{"type": "hosted_on", "resource_id": "resource:example:garage:nodes"}],
"requirements": [{"kind": "recovery", "ref": "example:restore-test-required"}],
"evidence": [{"kind": "example", "ref": "RESOURCE-WP-0003-T01", "observed_at": "2026-08-11", "authority": "resource-control"}]
}

View file

@ -0,0 +1,15 @@
{
"schema_version": "0.2", "record_scope": "example",
"id": "resource:example:railiance:kubernetes-capacity", "resource_class": "kubernetes_capacity",
"status": "active", "management_model": "shared_capacity",
"provider": {"name": "Example infrastructure provider", "account_ref": "account:example", "product_ref": "virtual-machines", "provider_resource_id": null},
"service": {"name": "Railiance Kubernetes worker capacity", "service_id": "kubernetes", "class": "shared worker pool", "capacity_model": "shared"},
"location": {"region": "example-region", "country": "DE", "failure_domains": ["cluster:example", "region:example-region"], "residency": "Germany"},
"capacity": [{"metric": "cpu", "value": 24, "unit": "vCPU", "kind": "usable", "observed_at": "2026-08-11"}, {"metric": "memory", "value": 64, "unit": "GiB", "kind": "usable", "observed_at": "2026-08-11"}],
"ownership": {"owner": "railiance-cluster", "environment": "production", "workload_ids": ["helix-forge", "coulomb-social"], "tenant_id": null, "allocation": {"mode": "shared", "cost_attribution_key": "platform:kubernetes", "driver": "requested-cpu-memory-hours", "method_version": "k8s-requests-v1"}},
"cost": {"currency": "EUR", "tax_status": "unknown", "billing_model": "fixed node cost allocated by resource requests", "commitment_ref": null, "price_evidence": null},
"lifecycle": {"proposed_on": null, "ordered_on": null, "commissioned_on": "2026-01-01", "renews_on": null, "cancel_by": null, "retired_on": null, "exit_path": "Drain workloads to replacement capacity, verify persistent data and ingress, then terminate nodes."},
"relationships": [{"type": "provides_capacity_to", "resource_id": "resource:example:shared:ingress"}],
"requirements": [{"kind": "service_objective", "ref": "example:cluster-capacity-slo"}],
"evidence": [{"kind": "example", "ref": "RESOURCE-WP-0003-T01", "observed_at": "2026-08-11", "authority": "resource-control"}]
}

View file

@ -0,0 +1,15 @@
{
"schema_version": "0.2", "record_scope": "example",
"id": "resource:example:shared:ingress", "resource_class": "shared_platform_service",
"status": "active", "management_model": "self_managed",
"provider": {"name": "Railiance", "account_ref": null, "product_ref": "platform-ingress", "provider_resource_id": null},
"service": {"name": "Shared application ingress", "service_id": "platform-ingress", "class": "cluster platform service", "capacity_model": "shared"},
"location": {"region": null, "country": "DE", "failure_domains": ["cluster:example"], "residency": "Germany"},
"capacity": [{"metric": "requests", "value": null, "unit": "requests/month", "kind": "unknown", "observed_at": null}],
"ownership": {"owner": "railiance-platform", "environment": "production", "workload_ids": ["helix-forge", "coulomb-social"], "tenant_id": null, "allocation": {"mode": "shared", "cost_attribution_key": "platform:shared-ingress", "driver": "request-count", "method_version": "ingress-requests-v1"}},
"cost": {"currency": "EUR", "tax_status": "not_applicable", "billing_model": "allocated share of hosting capacity and operator labor", "commitment_ref": null, "price_evidence": null},
"lifecycle": {"proposed_on": null, "ordered_on": null, "commissioned_on": "2026-01-01", "renews_on": null, "cancel_by": null, "retired_on": null, "exit_path": "Move routes and certificates to replacement ingress, verify traffic, then remove the service."},
"relationships": [{"type": "hosted_on", "resource_id": "resource:example:railiance:kubernetes-capacity"}],
"requirements": [{"kind": "service_objective", "ref": "example:ingress-availability-slo"}],
"evidence": [{"kind": "example", "ref": "RESOURCE-WP-0003-T01", "observed_at": "2026-08-11", "authority": "resource-control"}]
}