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
21
data/actuals/README.md
Normal file
21
data/actuals/README.md
Normal 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
|
||||
```
|
||||
27
data/demand/platform-audit-storage.json
Normal file
27
data/demand/platform-audit-storage.json
Normal 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."
|
||||
]
|
||||
}
|
||||
|
|
@ -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}
|
||||
]
|
||||
}
|
||||
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
|
||||
}
|
||||
]
|
||||
}
|
||||
200
data/optimization/reef-railiance-k3s-2026-08.json
Normal file
200
data/optimization/reef-railiance-k3s-2026-08.json
Normal 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
|
||||
}
|
||||
]
|
||||
}
|
||||
20
data/portfolio-coverage-2026-08-11.json
Normal file
20
data/portfolio-coverage-2026-08-11.json
Normal 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"]}
|
||||
]
|
||||
}
|
||||
86
data/providers/object-storage.json
Normal file
86
data/providers/object-storage.json
Normal 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/"
|
||||
}
|
||||
]
|
||||
}
|
||||
15
data/resources/apps-pg.json
Normal file
15
data/resources/apps-pg.json
Normal 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"}]
|
||||
}
|
||||
26
data/resources/binky-rapp-qonto.json
Normal file
26
data/resources/binky-rapp-qonto.json
Normal 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"}
|
||||
]
|
||||
}
|
||||
19
data/resources/coulomb-social-production.json
Normal file
19
data/resources/coulomb-social-production.json
Normal 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"}
|
||||
]
|
||||
}
|
||||
23
data/resources/hosteurope-railiance01.json
Normal file
23
data/resources/hosteurope-railiance01.json
Normal 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"}
|
||||
]
|
||||
}
|
||||
67
data/resources/platform-audit-storage.proposed.json
Normal file
67
data/resources/platform-audit-storage.proposed.json
Normal 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"}
|
||||
]
|
||||
}
|
||||
23
data/resources/railiance-forgejo.json
Normal file
23
data/resources/railiance-forgejo.json
Normal 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"}
|
||||
]
|
||||
}
|
||||
26
data/resources/reef-railiance-k3s.json
Normal file
26
data/resources/reef-railiance-k3s.json
Normal 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"}
|
||||
]
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue