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>
This commit is contained in:
tegwick 2026-08-14 09:36:57 +02:00
parent b64b5683df
commit 17de8b831e
16 changed files with 908 additions and 71 deletions

View file

@ -1,15 +1,162 @@
{
"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"}]
"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"
}
]
}