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>
2026-08-14 09:28:44 +02:00
{
feat(portfolio): fold in RAILIANCE-WP-0016 apps-pg evidence
First delegated evidence from RESOURCE-WP-0003-T04 to land. railiance-platform
delivered apps-pg capacity, utilization, consumers, and the apps-pg-dbbytes-v1
allocation driver, and correctly delivered no EUR.
- data/resources/apps-pg.json: real capacity; allocation unattributed -> shared
under apps-pg-dbbytes-v1; second consumer vergabe-teilnahme registered
- data/control-cycle/apps-pg-2026-09-base.json: first operational control-cycle
record in the repository
- examples/control-cycle/apps-pg-*.json retired; the invented fixture collided
with the real record's identifier
- data/portfolio-coverage-2026-08-14.json: gap marked delivered with three
residual unknowns still open
The real evidence exposed a design gap in the T05 schema: v0.1 required a number
for every cost field, so recording genuine usage without a booked cost meant
inventing one. Schema 0.2 permits null costs, null unattributed_eur, a technical
unattributed_share, and null measurements. Null is unknown, never zero; an
unknown component makes the total null rather than the sum of the known parts;
and the comparator classifies unknown amounts as data_quality instead of
computing a variance. Existing 0.1 records are not rewritten.
apps-pg is now measured (idle at 5.8% of volume) and attributed, and remains
unpriced: delivered technical evidence does not create a booked cost.
86 tests pass.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-14 09:36:57 +02:00
"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" : "provisioned" ,
"observed_at" : "2026-08-14"
} ,
{
"metric" : "instances" ,
"value" : 1 ,
"unit" : "count" ,
"kind" : "observed" ,
"observed_at" : "2026-08-14"
} ,
{
"metric" : "storage" ,
"value" : 10 ,
"unit" : "GiB" ,
"kind" : "provisioned" ,
"observed_at" : "2026-08-14"
} ,
{
"metric" : "storage_used" ,
"value" : 0.5766 ,
"unit" : "GiB" ,
"kind" : "observed" ,
"observed_at" : "2026-08-14"
} ,
{
"metric" : "wal_since_init" ,
"value" : 0.5469 ,
"unit" : "GiB" ,
"kind" : "observed" ,
"observed_at" : "2026-08-14"
} ,
{
"metric" : "cpu_usage" ,
"value" : 0.009 ,
"unit" : "vCPU" ,
"kind" : "observed" ,
"observed_at" : "2026-08-14"
} ,
{
"metric" : "memory_usage" ,
"value" : 0.0996 ,
"unit" : "GiB" ,
"kind" : "observed" ,
"observed_at" : "2026-08-14"
} ,
{
"metric" : "max_connections" ,
"value" : 100 ,
"unit" : "count" ,
"kind" : "limit" ,
"observed_at" : "2026-08-14"
} ,
{
"metric" : "sessions" ,
"value" : 7 ,
"unit" : "count" ,
"kind" : "observed" ,
"observed_at" : "2026-08-14"
}
] ,
"ownership" : {
"owner" : "railiance-platform" ,
"environment" : "production" ,
"workload_ids" : [
"coulomb-social" ,
"vergabe-teilnahme"
] ,
"tenant_id" : null ,
"allocation" : {
"mode" : "shared" ,
"cost_attribution_key" : "platform:apps-pg" ,
"driver" : "database_gb" ,
"method_version" : "apps-pg-dbbytes-v1"
}
} ,
"cost" : {
"currency" : "EUR" ,
"tax_status" : "not_applicable" ,
"billing_model" : "shared cluster and operations cost allocated by declared-consumer database bytes (apps-pg-dbbytes-v1: coulomb-social 0.5386, vergabe-teilnahme 0.4614); the 94.8 percent WAL and catalog residual is attributed to platform:apps-pg-overhead and no booked cost exists yet" ,
"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/evidence/RAILIANCE-WP-0016-apps-pg-resource-evidence.md#t02--recovery-and-operations"
} ,
{
"kind" : "other" ,
"ref" : "/home/worsch/railiance-platform/docs/apps-pg.md"
}
] ,
"evidence" : [
{
"kind" : "telemetry" ,
"ref" : "/home/worsch/railiance-platform/docs/evidence/RAILIANCE-WP-0016-apps-pg-observation.json" ,
"observed_at" : "2026-08-14" ,
"authority" : "railiance-platform (reef-railiance Kubernetes API + postgres catalog)"
} ,
{
"kind" : "workload" ,
"ref" : "/home/worsch/railiance-platform/docs/evidence/RAILIANCE-WP-0016-apps-pg-resource-evidence.md" ,
"observed_at" : "2026-08-14" ,
"authority" : "railiance-platform, RAILIANCE-WP-0016"
} ,
{
"kind" : "workload" ,
"ref" : "/home/worsch/railiance-platform/helm/apps-pg-cluster.yaml" ,
"observed_at" : "2026-08-11" ,
"authority" : "railiance-platform"
}
]
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>
2026-08-14 09:28:44 +02:00
}