resource-control/data/resources/apps-pg.json
tegwick 17de8b831e 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

162 lines
4.2 KiB
JSON

{
"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"
}
]
}