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

21
data/actuals/README.md Normal file
View file

@ -0,0 +1,21 @@
# Monthly technical usage observations
After each provider billing period, add `YYYY-MM.json` conforming to
`schemas/monthly-resource-observation.schema.json` with
`record_type: usage_observation`. These records contain technical and labor
observations. Authoritative booked financial actuals come from fin-hub and are
referenced during reconciliation rather than copied into a second ledger.
Set `forecast_ref` to the forecast file used for the decision. Evidence should
identify, without secrets, the provider usage export/invoice, PostgreSQL/CNPG
measurement, restore drill, and internal time record.
Required proxies are database GB, provider stored GB, WAL GB, restore egress,
write/read requests, infrastructure invoice cost, internal labor hours/cost,
and total cost. Also capture backup success, maximum observed RPO, and restore
RTO when available.
Run:
```bash
make variance ACTUAL=data/actuals/YYYY-MM.json
```

View file

@ -0,0 +1,27 @@
{
"schema_version": "0.1",
"workload": "platform-pg",
"cost_attribution_key": "platform:audit-storage",
"currency": "EUR",
"retention_days": 30,
"base_backups_per_day": 1,
"monthly_restore_drills": 1,
"observation": {
"observed_at": "2026-08-10T15:54:12Z",
"database_bytes": 39573871,
"wal_bytes": 19744568,
"wal_stats_reset": "2026-08-10T13:37:53Z",
"extrapolated_wal_gb_per_day": 0.208,
"source": "read-only pg_database_size and pg_stat_wal query on platform-pg-1"
},
"scenarios": {
"low": {"initial_database_gb": 1, "monthly_database_growth_pct": 5, "wal_gb_per_day": 0.25, "restore_egress_gb": 1, "write_requests_per_month": 1000, "read_requests_per_month": 500, "operator_hours_per_month": 0.5, "operator_hourly_eur": 60},
"base": {"initial_database_gb": 5, "monthly_database_growth_pct": 10, "wal_gb_per_day": 1, "restore_egress_gb": 5, "write_requests_per_month": 2500, "read_requests_per_month": 1000, "operator_hours_per_month": 1, "operator_hourly_eur": 60},
"high": {"initial_database_gb": 20, "monthly_database_growth_pct": 20, "wal_gb_per_day": 5, "restore_egress_gb": 20, "write_requests_per_month": 12000, "read_requests_per_month": 5000, "operator_hours_per_month": 2, "operator_hourly_eur": 60}
},
"notes": [
"Observed workload is less than one day old; scenario floors intentionally dominate the raw sample.",
"Storage forecast assumes 30 retained daily base backups plus 30 days of WAL and is conservative because it does not model compression or Barman's exact point-of-recoverability deletion timing.",
"Provider exit is modeled as one full stored-byte egress event and is reported separately from recurring monthly cost."
]
}

View file

@ -0,0 +1,24 @@
{
"schema_version": "0.1",
"record_type": "forecast",
"workload": "platform-pg",
"cost_attribution_key": "platform:audit-storage",
"provider_id": "scaleway-standard-multi-az",
"created_at": "2026-08-10T17:10:00Z",
"scenario": "base",
"forecast_ref": null,
"rows": [
{"period":"2026-09","database_gb":5,"stored_gb":180,"wal_gb":30,"restore_egress_gb":5,"write_requests":2500,"read_requests":1000,"infrastructure_eur":2.89,"internal_labor_hours":1,"internal_labor_eur":60,"total_eur":62.89},
{"period":"2026-10","database_gb":5.5,"stored_gb":195,"wal_gb":30,"restore_egress_gb":5,"write_requests":2500,"read_requests":1000,"infrastructure_eur":3.13,"internal_labor_hours":1,"internal_labor_eur":60,"total_eur":63.13},
{"period":"2026-11","database_gb":6.05,"stored_gb":211.5,"wal_gb":30,"restore_egress_gb":5,"write_requests":2500,"read_requests":1000,"infrastructure_eur":3.4,"internal_labor_hours":1,"internal_labor_eur":60,"total_eur":63.4},
{"period":"2026-12","database_gb":6.655,"stored_gb":229.65,"wal_gb":30,"restore_egress_gb":5,"write_requests":2500,"read_requests":1000,"infrastructure_eur":3.69,"internal_labor_hours":1,"internal_labor_eur":60,"total_eur":63.69},
{"period":"2027-01","database_gb":7.321,"stored_gb":249.615,"wal_gb":30,"restore_egress_gb":5,"write_requests":2500,"read_requests":1000,"infrastructure_eur":4.01,"internal_labor_hours":1,"internal_labor_eur":60,"total_eur":64.01},
{"period":"2027-02","database_gb":8.053,"stored_gb":271.577,"wal_gb":30,"restore_egress_gb":5,"write_requests":2500,"read_requests":1000,"infrastructure_eur":4.36,"internal_labor_hours":1,"internal_labor_eur":60,"total_eur":64.36},
{"period":"2027-03","database_gb":8.858,"stored_gb":295.734,"wal_gb":30,"restore_egress_gb":5,"write_requests":2500,"read_requests":1000,"infrastructure_eur":4.75,"internal_labor_hours":1,"internal_labor_eur":60,"total_eur":64.75},
{"period":"2027-04","database_gb":9.744,"stored_gb":322.308,"wal_gb":30,"restore_egress_gb":5,"write_requests":2500,"read_requests":1000,"infrastructure_eur":5.18,"internal_labor_hours":1,"internal_labor_eur":60,"total_eur":65.18},
{"period":"2027-05","database_gb":10.718,"stored_gb":351.538,"wal_gb":30,"restore_egress_gb":5,"write_requests":2500,"read_requests":1000,"infrastructure_eur":5.65,"internal_labor_hours":1,"internal_labor_eur":60,"total_eur":65.65},
{"period":"2027-06","database_gb":11.79,"stored_gb":383.692,"wal_gb":30,"restore_egress_gb":5,"write_requests":2500,"read_requests":1000,"infrastructure_eur":6.16,"internal_labor_hours":1,"internal_labor_eur":60,"total_eur":66.16},
{"period":"2027-07","database_gb":12.969,"stored_gb":419.061,"wal_gb":30,"restore_egress_gb":5,"write_requests":2500,"read_requests":1000,"infrastructure_eur":6.73,"internal_labor_hours":1,"internal_labor_eur":60,"total_eur":66.73},
{"period":"2027-08","database_gb":14.266,"stored_gb":457.968,"wal_gb":30,"restore_egress_gb":5,"write_requests":2500,"read_requests":1000,"infrastructure_eur":7.35,"internal_labor_hours":1,"internal_labor_eur":60,"total_eur":67.35}
]
}

View 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
}
]
}

View file

@ -0,0 +1,200 @@
{
"schema_version": "0.1",
"record_scope": "operational",
"case_id": "opt:reef-railiance-k3s:2026-08",
"case_type": "rightsizing",
"trigger": "cadence",
"review_period": "2026-08",
"created_at": "2026-08-14T00:00:00Z",
"resource_ids": [
"resource:railiance:reef-railiance:k3s",
"resource:hosteurope:railiance01"
],
"baseline": {
"option_id": "railiance01-single-node",
"label": "Current single-node k3s on the Host Europe railiance01 server (4 vCPU, 15.62 GiB)",
"one_time_eur": 0,
"recurring_infrastructure_eur_month": null,
"recurring_internal_labor_eur_month": null,
"recurring_external_labor_eur_month": 0,
"utilization": {
"cpu": {
"provisioned": { "value": 4, "unit": "vCPU" },
"used": { "value": 0.564, "unit": "vCPU" }
},
"memory": {
"provisioned": { "value": 15.62, "unit": "GiB" },
"used": { "value": 5.83, "unit": "GiB" }
},
"root_filesystem": {
"provisioned": { "value": 192.69, "unit": "GiB" },
"used": { "value": 66.77, "unit": "GiB" }
}
},
"uncertainty": {
"level": "high",
"notes": [
"Capacity and usage are a single live observation on 2026-08-11, not a utilization history",
"A one-off sample cannot distinguish steady-state headroom from a quiet moment; peak and growth are unknown",
"The server carries Helix Forge, Coulomb Social, rapp-qonto, and shared platform services, so downsizing headroom is shared, not per-workload"
]
},
"service_constraints": {
"nodes": { "value": 1, "unit": "count" },
"pod_limit": { "value": 110, "unit": "count" }
},
"failure_domains": [
"provider:host-europe",
"host:railiance01",
"cluster:reef-railiance"
],
"exit_path": "Provision replacement capacity, restore or redeploy the cluster and stateful services, switch DNS and ingress, verify workloads, then cancel and erase the server.",
"unknowns": [
"railiance01 product, booked monthly price, tax treatment, and renewal or cancellation dates (owner: railiance-infra, RAIL-HO-WP-0008)",
"cluster operations labour hours per month (owner: railiance-cluster, RAIL-BS-WP-0014)",
"requested-versus-used capacity history and peak load (owner: railiance-cluster, RAIL-BS-WP-0014)",
"declared service objectives for the workloads sharing the node (owner: workload repositories)"
]
},
"alternatives": [
{
"option_id": "smaller-single-server",
"label": "Consolidate onto a smaller Host Europe server sized to observed usage plus headroom",
"one_time_eur": null,
"recurring_infrastructure_eur_month": null,
"recurring_internal_labor_eur_month": null,
"recurring_external_labor_eur_month": 0,
"utilization": {
"cpu": {
"provisioned": { "value": null, "unit": "vCPU" },
"used": { "value": 0.564, "unit": "vCPU" }
},
"memory": {
"provisioned": { "value": null, "unit": "GiB" },
"used": { "value": 5.83, "unit": "GiB" }
}
},
"uncertainty": {
"level": "high",
"notes": [
"No target instance can be sized without peak-load history; observed mean usage is not a sizing basis",
"Migration requires a full cluster rebuild and stateful restore, so one-time labour is material and unmeasured",
"Retains the single-host failure domain the baseline already carries"
]
},
"service_constraints": {
"nodes": { "value": 1, "unit": "count" }
},
"failure_domains": [
"provider:host-europe",
"host:railiance01",
"cluster:reef-railiance"
],
"exit_path": null,
"unknowns": [
"Host Europe server catalogue, sizes, and prices available to this account (owner: railiance-infra, RAIL-HO-WP-0008)",
"peak CPU and memory over a full billing period, required to size the target (owner: railiance-cluster, RAIL-BS-WP-0014)",
"one-time migration labour and workload downtime budget (owner: railiance-cluster)"
]
},
{
"option_id": "threephoenix-ha-cluster",
"label": "Three-node HA cluster per RAIL-BS-WP-0007, removing the single-host failure domain",
"one_time_eur": null,
"recurring_infrastructure_eur_month": null,
"recurring_internal_labor_eur_month": null,
"recurring_external_labor_eur_month": 0,
"utilization": {
"cpu": {
"provisioned": { "value": null, "unit": "vCPU" },
"used": { "value": 0.564, "unit": "vCPU" }
},
"memory": {
"provisioned": { "value": null, "unit": "GiB" },
"used": { "value": 5.83, "unit": "GiB" }
}
},
"uncertainty": {
"level": "high",
"notes": [
"This option raises recurring cost by design; it is justified by availability, not by saving, and payback is the wrong test for it",
"Node count and placement are owned by RAIL-BS-WP-0007, not by this case"
]
},
"service_constraints": {
"nodes": { "value": 3, "unit": "count" }
},
"failure_domains": [
"provider:host-europe",
"cluster:reef-railiance"
],
"exit_path": null,
"unknowns": [
"per-node infrastructure price and whether nodes span independent failure domains (owner: railiance-cluster, RAIL-BS-WP-0014)",
"operations labour for a multi-node cluster versus a single node (owner: railiance-cluster)",
"declared availability objective that would justify the added recurring cost (owner: workload repositories)",
"replicated-storage requirement created by removing local-path storage (owner: railiance-cluster)"
]
}
],
"decision": {
"state": "blocked_on_evidence",
"recommended_option_id": null,
"rationale": "Observed utilization is genuinely low: 14 percent of CPU, 37 percent of memory, and 35 percent of the root filesystem on a single sample. That is a real rightsizing signal, and it is not sufficient to act on. No option can be costed because the railiance01 booked price is unknown, so no saving, no payback, and no comparison between downsizing and the HA alternative can be computed. The case stays open and blocked against the named delegated workplans rather than producing a rightsizing recommendation from a mean-usage sample.",
"approver": null,
"approved_on": null,
"delegated_to": [
"railiance-infra",
"railiance-cluster"
]
},
"financial_handoff": {
"cost_attribution_key": null,
"sent": false,
"reference": null
},
"outcome": {
"feeds_forecast": [
"examples/control-cycle/cluster-forecast.json"
],
"actual_refs": []
},
"evidence": [
{
"kind": "telemetry",
"ref": "kubernetes:reef-railiance/node/239.62.205.92.host.secureserver.net@2026-08-11T09:05:25Z",
"authority": "reef-railiance Kubernetes API",
"observed_at": "2026-08-11"
},
{
"kind": "telemetry",
"ref": "ssh:railiance01 host capacity observation 2026-08-11T09:05:25Z",
"authority": "railiance01 operating system",
"observed_at": "2026-08-11"
},
{
"kind": "document",
"ref": "docs/evidence/RESOURCE-WP-0003-initial-portfolio-discovery-2026-08-11.md",
"authority": "resource-control",
"observed_at": "2026-08-11"
},
{
"kind": "workplan",
"ref": "RAIL-HO-WP-0008",
"authority": "railiance-infra",
"observed_at": null
},
{
"kind": "workplan",
"ref": "RAIL-BS-WP-0014",
"authority": "railiance-cluster",
"observed_at": null
},
{
"kind": "workplan",
"ref": "RAIL-BS-WP-0007",
"authority": "railiance-cluster",
"observed_at": null
}
]
}

View file

@ -0,0 +1,20 @@
{
"schema_version": "0.1",
"observed_at": "2026-08-11T09:05:25Z",
"inventory_records": 7,
"coverage": [
{"group": "helix-forge", "status": "covered-by-shared-forge", "resource_ids": ["resource:railiance:forgejo", "resource:railiance:reef-railiance:k3s", "resource:hosteurope:railiance01"]},
{"group": "coulomb-social", "status": "covered", "resource_ids": ["resource:tenant:coulomb:coulomb-social", "resource:railiance:apps-pg", "resource:railiance:reef-railiance:k3s", "resource:hosteurope:railiance01"]},
{"group": "shared-railiance", "status": "covered-substrate-and-selected-services", "resource_ids": ["resource:railiance:reef-railiance:k3s", "resource:railiance:forgejo", "resource:railiance:apps-pg", "resource:hosteurope:railiance01", "resource:platform:audit-storage"]},
{"group": "representative-tenant", "status": "covered", "tenant_id": "tenant:friendly:binky", "resource_ids": ["resource:tenant:friendly:binky:rapp-qonto", "resource:railiance:reef-railiance:k3s", "resource:hosteurope:railiance01"]}
],
"owned_gaps": [
{"owner": "railiance-infra", "gap": "Host Europe product, provider resource ID, account reference, country/region evidence, contract price, tax treatment, order date, renewal and cancellation dates", "delegated_workplan": "RAIL-HO-WP-0008", "state_hub_workplan_id": "7122657f-87c8-46b5-a725-a1af1ba0af12"},
{"owner": "railiance-cluster", "gap": "cluster-wide requested/used capacity history, allocation driver, generic persistent-storage contract, and independent failure domains", "delegated_workplan": "RAIL-BS-WP-0014", "state_hub_workplan_id": "ea6ec98a-0d65-4afa-b6c5-6e7ed34011ac"},
{"owner": "railiance-forge", "gap": "Forgejo resource requests/utilization, storage growth, operations labor, and cost-allocation driver", "delegated_workplan": "RAILIANCE-WP-0002", "state_hub_workplan_id": "72f935a5-d921-48a4-96e4-2365556c7374"},
{"owner": "railiance-platform", "gap": "apps-pg utilization, backup/restore evidence, operations labor, and consumer allocation driver", "delegated_workplan": "RAILIANCE-WP-0016", "state_hub_workplan_id": "49084fb8-de63-4f32-a4a9-3a42d4e708ac"},
{"owner": "coulomb-social", "gap": "declared CPU/memory demand, usage proxies, service objectives, and application operations labor", "delegated_workplan": "CSOC-WP-0005", "state_hub_workplan_id": "00de1578-6150-40d3-b193-e852666ed945"},
{"owner": "rapp-qonto", "gap": "request/cold-start frequency, external API costs, runtime utilization, and recurring operator labor", "delegated_workplan": "RAPP-QONTO-WP-0002", "state_hub_workplan_id": "25b3b715-9a56-499e-a85c-a09ebd9bbb79"},
{"owner": "fin-hub", "gap": "booked Host Europe financial facts joined to resource:hosteurope:railiance01", "delegated_workplan": "FIN-WP-0004", "state_hub_workplan_id": "67b6de6c-4820-4478-9789-f50260204c27", "delegated_tasks": ["FIN-WP-0004-T04", "FIN-WP-0004-T05", "FIN-WP-0004-T06"]}
]
}

View file

@ -0,0 +1,86 @@
{
"schema_version": "0.1",
"observed_at": "2026-08-10",
"prices_exclude_vat": true,
"fx": {"usd_per_eur": 1.1555, "observed_at": "2026-08-10", "source": "https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml"},
"providers": [
{
"id": "host-europe-cloud-storage",
"provider": "Host Europe",
"service_class": "Cloud Storage (historical S3 specification)",
"region": null,
"storage_eur_per_gb_month": null,
"monthly_minimum_eur": null,
"included_storage_gb": 0,
"included_egress_gb": 0,
"egress_eur_per_gb": null,
"operations_eur_per_month": null,
"support_eur_per_month": null,
"operator_hours_per_month": 2,
"status": "blocked-account-confirmation",
"source": "https://www.hosteurope.de/download/PVL/Preis_und_Leistungsverzeichnis_CloudStorage_1-0-1.pdf"
},
{
"id": "scaleway-standard-multi-az",
"provider": "Scaleway",
"service_class": "Standard Multi-AZ",
"region": "nl-ams",
"storage_eur_per_gb_month": 0.01606,
"monthly_minimum_eur": 0,
"included_storage_gb": 0,
"included_egress_gb": 75,
"egress_eur_per_gb": 0.01,
"operations_eur_per_month": 0,
"support_eur_per_month": 0,
"operator_hours_per_month": 1,
"status": "priced",
"source": "https://www.scaleway.com/en/pricing/storage/"
},
{
"id": "hetzner-object-storage",
"provider": "Hetzner",
"service_class": "Object Storage",
"region": "nbg1",
"storage_eur_per_gb_month": null,
"monthly_minimum_eur": 6.49,
"included_storage_gb": 1000,
"included_egress_gb": 1000,
"egress_eur_per_gb": null,
"operations_eur_per_month": 0,
"support_eur_per_month": 0,
"operator_hours_per_month": 1.5,
"status": "priced-within-included-quota",
"source": "https://www.hetzner.com/storage/object-storage/"
},
{
"id": "host-europe-garage-1", "provider": "Host Europe", "service_class": "Self-managed Garage, 1 VM", "region": "Germany", "storage_eur_per_gb_month": null, "monthly_minimum_eur": 31.92, "included_storage_gb": 400, "included_egress_gb": 100000, "egress_eur_per_gb": 0, "operations_eur_per_month": 0, "support_eur_per_month": 0, "operator_hours_per_month": 2, "setup_operator_hours": 8, "topology": "1 x 8 vCPU / 16 GB / 400 GB NVMe; replication factor 1; no redundancy", "status": "estimate-not-production", "source": "https://www.hosteurope.de/Server/Virtual-Server/"
},
{
"id": "host-europe-garage-2", "provider": "Host Europe", "service_class": "Self-managed Garage, 2 VMs", "region": "Germany", "storage_eur_per_gb_month": null, "monthly_minimum_eur": 63.85, "included_storage_gb": 400, "included_egress_gb": 100000, "egress_eur_per_gb": 0, "operations_eur_per_month": 0, "support_eur_per_month": 0, "operator_hours_per_month": 3, "setup_operator_hours": 12, "topology": "2 x 8 vCPU / 16 GB / 400 GB NVMe; replication factor 2; one provider/location", "status": "estimate-degraded-quorum", "source": "https://www.hosteurope.de/Server/Virtual-Server/"
},
{
"id": "host-europe-garage-3", "provider": "Host Europe", "service_class": "Self-managed Garage, 3 VMs", "region": "Germany", "storage_eur_per_gb_month": null, "monthly_minimum_eur": 95.77, "included_storage_gb": 400, "included_egress_gb": 100000, "egress_eur_per_gb": 0, "operations_eur_per_month": 0, "support_eur_per_month": 0, "operator_hours_per_month": 4, "setup_operator_hours": 16, "topology": "3 x 8 vCPU / 16 GB / 400 GB NVMe; replication factor 3; one provider/location", "status": "estimate-production-candidate", "source": "https://www.hosteurope.de/Server/Virtual-Server/"
},
{
"id": "hetzner-garage-1", "provider": "Hetzner", "service_class": "Self-managed Garage, 1 VM", "region": "nbg1", "storage_eur_per_gb_month": null, "monthly_minimum_eur": 30.09, "included_storage_gb": 320, "included_egress_gb": 20000, "egress_eur_per_gb": 0, "operations_eur_per_month": 0, "support_eur_per_month": 0, "operator_hours_per_month": 2, "setup_operator_hours": 8, "topology": "1 x CX53 / 16 vCPU / 32 GB / 320 GB local SSD plus IPv4; replication factor 1", "status": "estimate-not-production", "source": "https://docs.hetzner.com/general/infrastructure-and-availability/price-adjustment/"
},
{
"id": "hetzner-garage-2", "provider": "Hetzner", "service_class": "Self-managed Garage, 2 VMs", "region": "nbg1", "storage_eur_per_gb_month": null, "monthly_minimum_eur": 60.18, "included_storage_gb": 320, "included_egress_gb": 20000, "egress_eur_per_gb": 0, "operations_eur_per_month": 0, "support_eur_per_month": 0, "operator_hours_per_month": 3, "setup_operator_hours": 12, "topology": "2 x CX53 / 16 vCPU / 32 GB / 320 GB local SSD plus IPv4; replication factor 2", "status": "estimate-degraded-quorum", "source": "https://docs.hetzner.com/general/infrastructure-and-availability/price-adjustment/"
},
{
"id": "hetzner-garage-3", "provider": "Hetzner", "service_class": "Self-managed Garage, 3 VMs", "region": "nbg1", "storage_eur_per_gb_month": null, "monthly_minimum_eur": 90.27, "included_storage_gb": 320, "included_egress_gb": 20000, "egress_eur_per_gb": 0, "operations_eur_per_month": 0, "support_eur_per_month": 0, "operator_hours_per_month": 4, "setup_operator_hours": 16, "topology": "3 x CX53 / 16 vCPU / 32 GB / 320 GB local SSD plus IPv4; replication factor 3 in one location", "status": "estimate-production-candidate", "source": "https://docs.hetzner.com/general/infrastructure-and-availability/price-adjustment/"
},
{
"id": "aws-s3-standard", "provider": "AWS", "service_class": "S3 Standard", "region": "eu-central-1", "storage_eur_per_gb_month": 0.02120, "monthly_minimum_eur": 0, "included_storage_gb": 0, "included_egress_gb": 100, "egress_eur_per_gb": 0.07789, "write_eur_per_1000": 0.00467, "read_eur_per_1000": 0.00037, "operations_eur_per_month": 0, "support_eur_per_month": 0, "operator_hours_per_month": 1.5, "setup_operator_hours": 4, "status": "priced", "source": "https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/eu-central-1/index.json"
},
{
"id": "azure-blob-hot-zrs", "provider": "Microsoft Azure", "service_class": "Blob Storage Hot ZRS (not S3 API)", "region": "germanywestcentral", "storage_eur_per_gb_month": 0.0197, "monthly_minimum_eur": 0, "included_storage_gb": 0, "included_egress_gb": 0, "egress_eur_per_gb": 0.08, "write_eur_per_1000": 0.00474, "read_eur_per_1000": 0.00038, "operations_eur_per_month": 0, "support_eur_per_month": 0, "operator_hours_per_month": 2, "setup_operator_hours": 6, "status": "priced-egress-estimate", "source": "https://prices.azure.com/api/retail/prices"
},
{
"id": "gcp-cloud-storage-standard", "provider": "Google Cloud", "service_class": "Cloud Storage Standard regional (not S3 API)", "region": "europe-west3", "storage_eur_per_gb_month": 0.01731, "monthly_minimum_eur": 0, "included_storage_gb": 0, "included_egress_gb": 0, "egress_eur_per_gb": 0.10, "write_eur_per_1000": 0.00433, "read_eur_per_1000": 0.00035, "operations_eur_per_month": 0, "support_eur_per_month": 0, "operator_hours_per_month": 2, "setup_operator_hours": 6, "status": "priced-egress-estimate", "source": "https://cloud.google.com/storage/pricing"
},
{
"id": "stackit-object-storage", "provider": "STACKIT", "service_class": "Object Storage Premium-EU01", "region": "Germany South", "storage_eur_per_gb_month": 0.02662, "monthly_minimum_eur": 0, "included_storage_gb": 0, "included_egress_gb": 100000, "egress_eur_per_gb": 0, "write_eur_per_1000": 0, "read_eur_per_1000": 0, "operations_eur_per_month": 0, "support_eur_per_month": 0, "operator_hours_per_month": 1.5, "setup_operator_hours": 4, "status": "priced", "source": "https://www.stackit.de/de/preise__trashed/cloud-services/iaas/stackit-storage/"
}
]
}

View file

@ -0,0 +1,15 @@
{
"schema_version": "0.2", "record_scope": "inventory",
"id": "resource:railiance:apps-pg", "resource_class": "database",
"status": "active", "management_model": "self_managed",
"provider": {"name": "Railiance", "account_ref": null, "product_ref": "cloudnative-pg", "provider_resource_id": "kubernetes:databases/cluster/apps-pg"},
"service": {"name": "Shared applications PostgreSQL", "service_id": "apps-pg", "class": "CloudNativePG database service", "capacity_model": "shared"},
"location": {"region": null, "country": null, "failure_domains": ["cluster:reef-railiance", "host:railiance01", "storage:local-path"], "residency": null},
"capacity": [{"metric": "instances", "value": 1, "unit": "count", "kind": "observed", "observed_at": "2026-08-11"}, {"metric": "storage", "value": 10, "unit": "GiB", "kind": "provisioned", "observed_at": "2026-08-11"}],
"ownership": {"owner": "railiance-platform", "environment": "production", "workload_ids": ["coulomb-social"], "tenant_id": null, "allocation": {"mode": "unattributed", "cost_attribution_key": null, "driver": null, "method_version": null}},
"cost": {"currency": "EUR", "tax_status": "not_applicable", "billing_model": "shared cluster and operations cost; allocation method unknown", "commitment_ref": null, "price_evidence": null},
"lifecycle": {"proposed_on": null, "ordered_on": null, "commissioned_on": "2026-08-09", "renews_on": null, "cancel_by": null, "retired_on": null, "exit_path": "Restore databases to a replacement PostgreSQL service, rotate application connections, verify consumers, then retire the cluster and volume."},
"relationships": [{"type": "hosted_on", "resource_id": "resource:railiance:reef-railiance:k3s"}],
"requirements": [{"kind": "recovery", "ref": "/home/worsch/railiance-platform/docs/apps-pg.md"}],
"evidence": [{"kind": "telemetry", "ref": "kubernetes:reef-railiance/databases/cluster/apps-pg@2026-08-11", "observed_at": "2026-08-11", "authority": "reef-railiance Kubernetes API"}, {"kind": "workload", "ref": "/home/worsch/railiance-platform/helm/apps-pg-cluster.yaml", "observed_at": "2026-08-11", "authority": "railiance-platform"}]
}

View file

@ -0,0 +1,26 @@
{
"schema_version": "0.2", "record_scope": "inventory",
"id": "resource:tenant:friendly:binky:rapp-qonto", "resource_class": "self_managed_service",
"status": "active", "management_model": "shared_capacity",
"provider": {"name": "Railiance", "account_ref": null, "product_ref": "rail-knative", "provider_resource_id": "knative:rapp-qonto/rapp-qonto"},
"service": {"name": "Binky Qonto assistant", "service_id": "rapp-qonto", "class": "tenant Knative application with dedicated egress proxy", "capacity_model": "elastic"},
"location": {"region": null, "country": null, "failure_domains": ["cluster:reef-railiance", "host:railiance01"], "residency": null},
"capacity": [
{"metric": "minimum_replicas", "value": 0, "unit": "count", "kind": "limit", "observed_at": "2026-08-11"},
{"metric": "maximum_replicas", "value": 1, "unit": "count", "kind": "limit", "observed_at": "2026-08-11"},
{"metric": "workload_cpu_request", "value": 0.05, "unit": "vCPU", "kind": "allocated", "observed_at": "2026-08-11"},
{"metric": "workload_memory_request", "value": 128, "unit": "MiB", "kind": "allocated", "observed_at": "2026-08-11"},
{"metric": "egress_cpu_request", "value": 0.02, "unit": "vCPU", "kind": "allocated", "observed_at": "2026-08-11"},
{"metric": "egress_memory_request", "value": 64, "unit": "MiB", "kind": "allocated", "observed_at": "2026-08-11"}
],
"ownership": {"owner": "rapp-qonto", "environment": "production", "workload_ids": ["rapp-qonto"], "tenant_id": "tenant:friendly:binky", "allocation": {"mode": "dedicated", "cost_attribution_key": "resource:tenant:friendly:binky:rapp-qonto", "driver": "direct-workload", "method_version": "direct-v1"}},
"cost": {"currency": "EUR", "tax_status": "not_applicable", "billing_model": "allocated cluster and operator cost plus external Qonto/API costs; values unknown", "commitment_ref": null, "price_evidence": null},
"lifecycle": {"proposed_on": null, "ordered_on": null, "commissioned_on": "2026-07-27", "renews_on": null, "cancel_by": null, "retired_on": null, "exit_path": "Deploy the verified Knative revision and egress policy on replacement capacity, verify tenant authorization and Qonto access, then retire old revisions and credentials."},
"relationships": [{"type": "hosted_on", "resource_id": "resource:railiance:reef-railiance:k3s"}],
"requirements": [{"kind": "security", "ref": "/home/worsch/rapp-qonto/docs/security-and-reliability-gates.md"}],
"evidence": [
{"kind": "telemetry", "ref": "kubernetes:reef-railiance/rapp-qonto/ksvc/rapp-qonto@2026-08-11", "observed_at": "2026-08-11", "authority": "reef-railiance Kubernetes API"},
{"kind": "workload", "ref": "/home/worsch/rapp-qonto/bindings/rail-knative.yaml", "observed_at": "2026-08-11", "authority": "rapp-qonto"},
{"kind": "test", "ref": "/home/worsch/rapp-qonto/evidence/live/2026-07-29-railiance01.json", "observed_at": "2026-07-29", "authority": "rapp-qonto"}
]
}

View file

@ -0,0 +1,19 @@
{
"schema_version": "0.2", "record_scope": "inventory",
"id": "resource:tenant:coulomb:coulomb-social", "resource_class": "self_managed_service",
"status": "active", "management_model": "shared_capacity",
"provider": {"name": "Railiance", "account_ref": null, "product_ref": "coulomb-social", "provider_resource_id": "kubernetes:coulomb-social/deployment/coulomb-social"},
"service": {"name": "Coulomb Social production", "service_id": "coulomb-social", "class": "tenant application", "capacity_model": "shared"},
"location": {"region": null, "country": null, "failure_domains": ["cluster:reef-railiance", "host:railiance01"], "residency": null},
"capacity": [{"metric": "replicas", "value": 1, "unit": "count", "kind": "observed", "observed_at": "2026-08-11"}],
"ownership": {"owner": "coulomb-social", "environment": "production", "workload_ids": ["coulomb-social"], "tenant_id": "tenant:coulomb", "allocation": {"mode": "dedicated", "cost_attribution_key": "resource:tenant:coulomb:coulomb-social", "driver": "direct-workload", "method_version": "direct-v1"}},
"cost": {"currency": "EUR", "tax_status": "not_applicable", "billing_model": "allocated share of cluster, database, ingress, identity dependencies, and operations labor; values unknown", "commitment_ref": null, "price_evidence": null},
"lifecycle": {"proposed_on": null, "ordered_on": null, "commissioned_on": "2026-08-09", "renews_on": null, "cancel_by": null, "retired_on": null, "exit_path": "Deploy the application and restore tenant data on replacement capacity, verify identity and health paths, switch app.coulomb.social, then retire the old release."},
"relationships": [{"type": "hosted_on", "resource_id": "resource:railiance:reef-railiance:k3s"}, {"type": "depends_on", "resource_id": "resource:railiance:apps-pg"}],
"requirements": [{"kind": "security", "ref": "/home/worsch/coulomb-social/INTENT.md"}],
"evidence": [
{"kind": "telemetry", "ref": "kubernetes:reef-railiance/coulomb-social/deployment/coulomb-social@2026-08-11", "observed_at": "2026-08-11", "authority": "reef-railiance Kubernetes API"},
{"kind": "workload", "ref": "/home/worsch/railiance-apps/helm/coulomb-social-values.yaml", "observed_at": "2026-08-11", "authority": "railiance-apps"},
{"kind": "workload", "ref": "/home/worsch/coulomb-social/INTENT.md", "observed_at": "2026-08-11", "authority": "coulomb-social"}
]
}

View file

@ -0,0 +1,23 @@
{
"schema_version": "0.2", "record_scope": "inventory",
"id": "resource:hosteurope:railiance01", "resource_class": "compute_instance",
"status": "active", "management_model": "provider_managed",
"provider": {"name": "Host Europe", "account_ref": null, "product_ref": null, "provider_resource_id": null},
"service": {"name": "railiance01", "service_id": "railiance01", "class": "virtual server", "capacity_model": "fixed"},
"location": {"region": null, "country": null, "failure_domains": ["provider:host-europe", "host:railiance01"], "residency": null},
"capacity": [
{"metric": "cpu", "value": 4, "unit": "vCPU", "kind": "usable", "observed_at": "2026-08-11"},
{"metric": "memory", "value": 15.62, "unit": "GiB", "kind": "usable", "observed_at": "2026-08-11"},
{"metric": "root_filesystem", "value": 192.69, "unit": "GiB", "kind": "provisioned", "observed_at": "2026-08-11"},
{"metric": "root_filesystem_used", "value": 66.77, "unit": "GiB", "kind": "observed", "observed_at": "2026-08-11"}
],
"ownership": {"owner": "railiance-infra", "environment": "production", "workload_ids": ["reef-railiance"], "tenant_id": null, "allocation": {"mode": "unattributed", "cost_attribution_key": null, "driver": null, "method_version": null}},
"cost": {"currency": "EUR", "tax_status": "unknown", "billing_model": "fixed recurring provider server; exact product and booked price unknown", "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": "Provision replacement capacity, restore or redeploy cluster and stateful services, switch DNS and ingress, verify workloads, then cancel and erase the server."},
"relationships": [{"type": "provides_capacity_to", "resource_id": "resource:railiance:reef-railiance:k3s"}],
"requirements": [{"kind": "other", "ref": "/home/worsch/railiance-cluster/workplans/RAIL-BS-WP-0007-threephoenix-ha-cluster.md"}],
"evidence": [
{"kind": "telemetry", "ref": "ssh:railiance01 host capacity observation 2026-08-11T09:05:25Z", "observed_at": "2026-08-11", "authority": "railiance01 operating system"},
{"kind": "workload", "ref": "/home/worsch/railiance-apps/docs/operator-setup.md", "observed_at": "2026-08-11", "authority": "railiance-apps"}
]
}

View file

@ -0,0 +1,67 @@
{
"schema_version": "0.2",
"record_scope": "inventory",
"id": "resource:platform:audit-storage",
"resource_class": "storage",
"status": "proposed",
"management_model": "provider_managed",
"provider": {
"name": "Scaleway",
"account_ref": null,
"product_ref": "scaleway-standard-multi-az",
"provider_resource_id": null
},
"service": {
"name": "platform audit storage",
"service_id": "object-storage",
"class": "Standard Multi-AZ object storage",
"capacity_model": "elastic"
},
"location": {
"region": "nl-ams",
"country": "NL",
"failure_domains": ["provider:scaleway", "region:nl-ams"],
"residency": "European Union"
},
"capacity": [
{"metric": "stored_data", "value": null, "unit": "GB", "kind": "unknown", "observed_at": null}
],
"ownership": {
"owner": "resource-control",
"environment": "production",
"workload_ids": ["rapp-postgres/platform-pg"],
"tenant_id": null,
"allocation": {
"mode": "dedicated",
"cost_attribution_key": "platform:audit-storage",
"driver": "direct-resource",
"method_version": "direct-v1"
}
},
"cost": {
"currency": "EUR",
"tax_status": "excluded",
"billing_model": "usage-based storage and egress; no commitment",
"commitment_ref": null,
"price_evidence": "data/providers/object-storage.json#scaleway-standard-multi-az"
},
"lifecycle": {
"proposed_on": "2026-08-10",
"ordered_on": null,
"commissioned_on": null,
"renews_on": null,
"cancel_by": null,
"retired_on": null,
"exit_path": "Copy and verify all Barman objects in an independent S3-compatible target, run full and PITR restore, revoke the scoped key, then delete source objects and bucket after evidence is durable."
},
"relationships": [],
"requirements": [
{"kind": "recovery", "ref": "workplans/RESOURCE-WP-0002-procure-postgres-backup-storage.md#acceptance-requirements"},
{"kind": "retention", "ref": "data/demand/platform-audit-storage.json"}
],
"evidence": [
{"kind": "provider", "ref": "https://www.scaleway.com/en/pricing/storage/", "observed_at": "2026-08-10", "authority": "Scaleway"},
{"kind": "provider", "ref": "https://www.scaleway.com/en/object-storage/", "observed_at": "2026-08-10", "authority": "Scaleway"},
{"kind": "decision", "ref": "docs/evidence/RESOURCE-WP-0002-provider-due-diligence-2026-08-10.md", "observed_at": "2026-08-10", "authority": "resource-control"}
]
}

View file

@ -0,0 +1,23 @@
{
"schema_version": "0.2", "record_scope": "inventory",
"id": "resource:railiance:forgejo", "resource_class": "shared_platform_service",
"status": "active", "management_model": "self_managed",
"provider": {"name": "Railiance", "account_ref": null, "product_ref": "forgejo-11.0.3", "provider_resource_id": "kubernetes:forgejo/deployment/forgejo-gitea"},
"service": {"name": "Forgejo source and package forge", "service_id": "forgejo", "class": "shared source forge and package registry", "capacity_model": "shared"},
"location": {"region": null, "country": null, "failure_domains": ["cluster:reef-railiance", "host:railiance01", "storage:local-path"], "residency": null},
"capacity": [
{"metric": "replicas", "value": 1, "unit": "count", "kind": "observed", "observed_at": "2026-08-11"},
{"metric": "forge_storage", "value": 10, "unit": "GiB", "kind": "provisioned", "observed_at": "2026-08-11"},
{"metric": "database_storage", "value": 10, "unit": "GiB", "kind": "provisioned", "observed_at": "2026-08-11"}
],
"ownership": {"owner": "railiance-forge", "environment": "production", "workload_ids": ["helix-forge", "coulomb-social", "railiance"], "tenant_id": null, "allocation": {"mode": "unattributed", "cost_attribution_key": null, "driver": null, "method_version": null}},
"cost": {"currency": "EUR", "tax_status": "not_applicable", "billing_model": "shared share of cluster, persistent storage, database, backup, and operations labor; allocation unknown", "commitment_ref": null, "price_evidence": null},
"lifecycle": {"proposed_on": null, "ordered_on": null, "commissioned_on": "2026-07-03", "renews_on": null, "cancel_by": null, "retired_on": null, "exit_path": "Restore repositories, packages, configuration, and database to a replacement forge, verify clone/push/package workflows, switch DNS, then retire the deployment."},
"relationships": [{"type": "hosted_on", "resource_id": "resource:railiance:reef-railiance:k3s"}],
"requirements": [{"kind": "recovery", "ref": "/home/worsch/railiance-apps/docs/forgejo-package-registry.md"}],
"evidence": [
{"kind": "telemetry", "ref": "kubernetes:reef-railiance/forgejo/deployment/forgejo-gitea@2026-08-11", "observed_at": "2026-08-11", "authority": "reef-railiance Kubernetes API"},
{"kind": "workload", "ref": "/home/worsch/railiance-apps/helm/forgejo-values.yaml", "observed_at": "2026-08-11", "authority": "railiance-apps"},
{"kind": "decision", "ref": "/home/worsch/railiance-apps/docs/forge-source-of-truth-decision.md", "observed_at": "2026-08-11", "authority": "railiance-apps"}
]
}

View file

@ -0,0 +1,26 @@
{
"schema_version": "0.2", "record_scope": "inventory",
"id": "resource:railiance:reef-railiance:k3s", "resource_class": "kubernetes_capacity",
"status": "active", "management_model": "self_managed",
"provider": {"name": "Railiance", "account_ref": null, "product_ref": "k3s", "provider_resource_id": "k3s://239.62.205.92.host.secureserver.net"},
"service": {"name": "reef-railiance k3s", "service_id": "reef-railiance", "class": "single-node Kubernetes runtime", "capacity_model": "shared"},
"location": {"region": null, "country": null, "failure_domains": ["provider:host-europe", "host:railiance01", "cluster:reef-railiance"], "residency": null},
"capacity": [
{"metric": "cpu", "value": 4, "unit": "vCPU", "kind": "usable", "observed_at": "2026-08-11"},
{"metric": "memory", "value": 15.62, "unit": "GiB", "kind": "usable", "observed_at": "2026-08-11"},
{"metric": "ephemeral_storage", "value": 183.06, "unit": "GiB", "kind": "usable", "observed_at": "2026-08-11"},
{"metric": "pods", "value": 110, "unit": "count", "kind": "limit", "observed_at": "2026-08-11"},
{"metric": "nodes", "value": 1, "unit": "count", "kind": "observed", "observed_at": "2026-08-11"},
{"metric": "cpu_usage", "value": 0.564, "unit": "vCPU", "kind": "observed", "observed_at": "2026-08-11"},
{"metric": "memory_usage", "value": 5.83, "unit": "GiB", "kind": "observed", "observed_at": "2026-08-11"}
],
"ownership": {"owner": "railiance-cluster", "environment": "production", "workload_ids": ["helix-forge", "coulomb-social", "rapp-qonto", "railiance-platform"], "tenant_id": null, "allocation": {"mode": "unattributed", "cost_attribution_key": null, "driver": null, "method_version": null}},
"cost": {"currency": "EUR", "tax_status": "unknown", "billing_model": "allocated share of railiance01 plus cluster operations labor; method not established", "commitment_ref": null, "price_evidence": null},
"lifecycle": {"proposed_on": null, "ordered_on": null, "commissioned_on": "2026-03-10", "renews_on": null, "cancel_by": null, "retired_on": null, "exit_path": "Deploy a replacement cluster, restore stateful services, promote workloads and ingress, verify health, then remove the old node and credentials."},
"relationships": [{"type": "hosted_on", "resource_id": "resource:hosteurope:railiance01"}],
"requirements": [{"kind": "service_objective", "ref": "/home/worsch/railiance-cluster/INTENT.md"}, {"kind": "recovery", "ref": "/home/worsch/railiance-cluster/workplans/RAIL-BS-WP-0007-threephoenix-ha-cluster.md"}],
"evidence": [
{"kind": "telemetry", "ref": "kubernetes:reef-railiance/node/239.62.205.92.host.secureserver.net@2026-08-11T09:05:25Z", "observed_at": "2026-08-11", "authority": "reef-railiance Kubernetes API"},
{"kind": "workload", "ref": "/home/worsch/railiance-cluster/docs/rail-kubernetes-substrate-profile.md", "observed_at": "2026-08-11", "authority": "railiance-cluster"}
]
}