resource-control/workplans/RESOURCE-WP-0003-managed-infrastructure-portfolio-control.md
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

315 lines
14 KiB
Markdown

---
id: RESOURCE-WP-0003
type: workplan
title: "Establish managed-infrastructure portfolio control"
domain: financials
repo: resource-control
status: finished
owner: codex
topic_slug: railiance
created: "2026-08-10"
updated: "2026-08-14"
related:
- RESOURCE-WP-0002
- FIN-WP-0004
state_hub_workstream_id: "b4d541d2-c114-4189-b431-e301c4dcef4e"
---
# RESOURCE-WP-0003 — managed-infrastructure portfolio control
## Goal
Turn the revised repository intent into an operational, provider-neutral
control loop for infrastructure serving Railiance itself, Helix Forge, Coulomb
Social, shared platform services, and tenant workloads. Establish the portfolio
model, authority contracts, delegated evidence interfaces, and a repeatable
forecast-to-actual optimization cycle without duplicating financial, workload,
or platform authority.
The PostgreSQL backup work in `RESOURCE-WP-0002` is the first proving case and
input to this workplan, not the limit of its scope.
## Boundaries
- `resource-control` owns portfolio identity, lifecycle, technical economics,
allocation evidence, forecasts, variance analysis, and optimization cases.
- `fin-hub` owns authoritative booked financial facts, budgets, commitments,
burn, runway, and viability signals.
- Workload repositories own demand meaning and service requirements.
- Cluster and platform repositories own provisioning, operations, and source
telemetry.
- Human authorities approve contractual commitments and material lifecycle
changes.
This workplan defines and validates interfaces. Cross-repository implementation
must be handed off as work records in the repository that owns the source.
## T01 — Define the portfolio and lifecycle model
```task
id: RESOURCE-WP-0003-T01
status: done
priority: high
state_hub_task_id: "9c396da2-9cae-4681-8d7e-3ebcbf9db29f"
```
Define the minimum resource classes, lifecycle states, ownership fields,
capacity forms, provider/account identity, shared-versus-dedicated placement,
tenant and workload attribution, contract dates, and evidence provenance.
Reuse the current backup inventory and forecast schemas where they generalize;
identify and migrate assumptions that are storage-specific. Include validation
rules for stable identifiers and lifecycle transitions.
Done when a versioned schema and examples can represent provider-managed
object storage, self-managed Garage on VMs, cluster capacity, and a shared
platform service without ambiguous ownership or cost attribution.
Completed 2026-08-11: introduced portfolio schema v0.2 with resource classes,
management models, capacity dimensions, lifecycle states, shared and dedicated
allocation, relationships, requirements, and provenance-bearing evidence.
Migrated the real proposed backup record and added explicitly non-authoritative
Garage, Kubernetes-capacity, and shared-ingress examples. Semantic validation
covers identifier, lifecycle, allocation, capacity, and example-scope rules.
Evidence: `docs/evidence/RESOURCE-WP-0003-portfolio-model-v0.2-2026-08-11.md`.
## T02 — Record the authority and fin-hub exchange contract
```task
id: RESOURCE-WP-0003-T02
status: done
priority: high
state_hub_task_id: "efa64dce-7b5e-435e-b010-7aee9e0a410e"
```
Create an authority matrix and a versioned exchange contract with `fin-hub`.
Define the two directions separately:
- resource-control to fin-hub: resource references, allocation keys, forecasts,
technical usage, commitment candidates, and optimization scenarios;
- fin-hub to resource-control: booked costs, credits, tax and currency treatment,
financial commitments, budget constraints, and viability signals.
Specify period, currency, net/gross semantics, provenance, corrections,
idempotency, uncertainty, and identifiers including `resource_id`, `service_id`,
`workload_id`, `tenant_id`, `environment`, and `cost_attribution_key`.
Done when both repositories link the same reviewed contract and no field has
two authoritative writers. Coordinate with `FIN-WP-0004`.
Progress 2026-08-11: verified fin-hub commit `0034330` and its 46-test suite;
the six review remediations satisfy the authority, exact-money, typed-evidence,
idempotency, dimensional-reporting, and model-parity conditions. Added the
resource-control ratification, producer-owned planning schema, canonical
forecast exporter, booked-cost consumer validation, and reconciliation seam.
The 12-row backup forecast preflight and cross-repository compatibility check
remain before this task is complete. A real booked backup cost is deliberately
reserved for `FIN-WP-0004-T05` after procurement.
Completed 2026-08-11: all 12 resource-control producer records matched
fin-hub's executable schema and adapter output, and duplicate ingestion retained
exactly 12 planning rows. Evidence is in
`docs/evidence/RESOURCE-WP-0003-fin-hub-contract-preflight-2026-08-11.md`.
The authority contract is accepted from resource-control. The separate real
booked-cost round trip remains gated on `RESOURCE-WP-0002` procurement and is
not simulated as operational evidence.
## T03 — Inventory the first managed-infrastructure portfolio
```task
id: RESOURCE-WP-0003-T03
status: done
priority: high
state_hub_task_id: "4afbb2ea-8021-4dd7-968b-50c113a8c108"
```
Discover and register the material infrastructure serving Helix Forge,
Coulomb Social, shared Railiance services, and a representative tenant
workload. Record unknowns explicitly and separate observed resources from
inferred relationships.
For each resource, identify the authoritative workload and platform repository,
owner, lifecycle state, capacity, service objective or requirement reference,
provider/account, failure domain, contract or renewal evidence, and allocation
key. Do not retrieve or record credentials.
Done when portfolio coverage and evidence gaps are measurable and every
material discovered resource has an owner or a human-review record.
Completed 2026-08-11: registered seven evidence-backed resources covering the
Host Europe host, reef-railiance k3s capacity, Forgejo/Helix Forge, shared
applications PostgreSQL, Coulomb Social, Binky's `rapp-qonto`, and proposed
backup storage. Live read-only observation confirmed capacity, current
workloads, PVCs, and the shared single-host/local-storage failure domain.
Unknown commercial, utilization-history, labor, and allocation facts remain
explicit and are assigned to authoritative repository owners in
`data/portfolio-coverage-2026-08-11.json`. Evidence:
`docs/evidence/RESOURCE-WP-0003-initial-portfolio-discovery-2026-08-11.md`.
## T04 — Delegate demand and telemetry evidence
```task
id: RESOURCE-WP-0003-T04
status: done
priority: high
state_hub_task_id: "b4053889-69fd-4e3c-888b-0764eee2e9e4"
```
Create scoped work records in the authoritative workload and platform
repositories for missing demand declarations, service objectives, capacity,
utilization, reliability, and allocation-driver evidence. Initial targets are
`helix-forge`, `coulomb-social`, `railiance-cluster`, `rail-kubernetes`,
`rail-knative`, and `railiance-platform`; add only repositories supported by
the inventory evidence.
Each handoff must define a stable non-secret interface and acceptance evidence,
not prescribe unrelated internal implementation.
Done when all required source evidence is either available through a versioned
interface or represented by a live delegated work record with an owner.
Completed 2026-08-11: created and registered repository-local evidence plans
`RAIL-HO-WP-0008`, `RAIL-BS-WP-0014`, railiance-forge
`RAILIANCE-WP-0002`, railiance-platform `RAILIANCE-WP-0016`,
`CSOC-WP-0005`, and `RAPP-QONTO-WP-0002`. The booked-cost boundary remains in
fin-hub and is linked to existing `FIN-WP-0004-T04..T06`. The exact State Hub
workplan identifiers are recorded in
`data/portfolio-coverage-2026-08-11.json`. No duplicate plan was created in
`helix-forge`, `rail-kubernetes`, or `rail-knative`: their relevant evidence is
owned respectively by railiance-forge, railiance-cluster, and the workload plus
cluster layers.
## T05 — Generalize forecast-to-actual control
```task
id: RESOURCE-WP-0003-T05
status: done
priority: high
state_hub_task_id: "76986764-5e23-4e51-aaed-6bbb92d08915"
```
Generalize the immutable forecast and monthly actual-observation controls from
`RESOURCE-WP-0002`. Support resource-specific usage proxies, fixed and elastic
capacity, internal and external labor, infrastructure cost, booked cost
references, allocation methods, service-level constraints, and low/base/high
uncertainty.
Classify variance as demand, provider price, allocation, labor, model, or
data-quality error. Preserve the original forecast and create explicit
revisions rather than overwriting it.
Done when the same mechanism can evaluate at least storage, VM or cluster
compute, and one shared platform service.
Completed 2026-08-11: added the generic immutable control-cycle schema and
comparator, controlled six-way variance attribution, revision and booked-fact
references, and paired contract examples for elastic storage, fixed cluster
compute, and the hybrid shared apps-pg service. The examples are illustrative,
not operational facts. Evidence:
`docs/evidence/RESOURCE-WP-0003-generalized-control-cycle-2026-08-11.md`.
## T06 — Produce and govern optimization cases
```task
id: RESOURCE-WP-0003-T06
status: done
priority: medium
state_hub_task_id: "08d5a687-6ce4-4bbf-950a-9682b1f7b003"
```
Define the review cadence and decision template for rightsizing,
consolidation, commitment, renewal, migration, retirement, and provider
switching. Every recommendation must show baseline, alternative, one-time
cost, recurring infrastructure and labor cost, utilization, uncertainty,
service-level constraints, failure domains, exit path, and expected payback.
Validate the process using the backup case and at least one non-storage
portfolio candidate. Send financial implications to `fin-hub`; delegate any
approved implementation to the owning platform or workload repository.
Done when recommendations are reproducible from evidence and their eventual
outcomes feed the next forecast cycle.
Completed 2026-08-14: added the optimization-case schema, a fail-closed
evaluator, and the cadence and decision template in `docs/optimization-cases.md`.
Every option, baseline included, must present all ten decision fields; one
unknown blocks the comparison. Validated on the storage case, where Hetzner
computes fully and loses to Scaleway by EUR 29.14 per month on operator labour
rather than storage price while Host Europe blocks on four named gaps, and on
the non-storage reef-railiance k3s rightsizing case, which reports genuinely low
utilization and still refuses to recommend because the railiance01 booked price
is unknown and the utilization figure is a single sample. Neither case decides:
procurement remains `RESOURCE-WP-0002-T03`, and the cluster unknowns are
delegated to `RAIL-HO-WP-0008` and `RAIL-BS-WP-0014`. Evidence:
`docs/evidence/RESOURCE-WP-0003-optimization-cases-2026-08-14.md`.
## T07 — Establish portfolio reporting and operating cadence
```task
id: RESOURCE-WP-0003-T07
status: done
priority: medium
state_hub_task_id: "3927e658-6807-4737-ae15-ea1997dc210f"
```
Publish a portfolio view covering coverage, lifecycle, capacity, utilization,
forecast and actual variance, unattributed cost, renewals, risks, and open
optimization opportunities. Report missing evidence and unapportioned cost
rather than forcing false precision.
Define monthly observation, quarterly model calibration, and pre-renewal review
cadences with named inputs and consumers.
Done when an operator can identify material spend, idle or saturated capacity,
forecast error, approaching commitments, and the next evidence-backed action.
Completed 2026-08-14: added `tools/portfolio_report.py` and
`make portfolio-report`, rendering coverage, lifecycle, utilization, cost,
renewals, risks, open cases, and next actions from committed evidence only, plus
the cadence in `docs/portfolio-operating-cadence.md`. The report refuses false
precision: portfolio spend is `null` rather than a partial sum, unattributed
cost is a named list rather than a spread, and unmeasurable resources are
reported instead of dropped. Against the current portfolio it reports spend as
unknown, railiance01 and the k3s cluster as idle at 14 percent CPU and 37 percent
memory, no computable forecast error, no dated commitments but six active
resources with no contract dates at all, and six of seven resources sharing
`host:railiance01`. Evidence:
`docs/evidence/RESOURCE-WP-0003-portfolio-reporting-2026-08-14.md`.
## Acceptance
- [x] Portfolio schema and lifecycle rules cover the initial resource classes.
- [x] The fin-hub authority and exchange contract is jointly reviewed.
- [x] Helix Forge, Coulomb Social, shared Railiance, and tenant coverage is
measured.
- [x] Missing source evidence has live delegated work records.
- [x] Forecast-to-actual control works for storage and non-storage resources.
- [x] At least two optimization cases complete the evidence-to-decision loop.
- [x] Portfolio reporting exposes unknown and unattributed values explicitly.
## Post-completion record
2026-08-14: `railiance-platform` delivered `RAILIANCE-WP-0016`, the first
delegated evidence from T04 to land. Folded in: the apps-pg resource record now
carries real capacity and the `apps-pg-dbbytes-v1` allocation driver, the first
operational control-cycle record replaced the illustrative apps-pg fixture, and
coverage moved to `data/portfolio-coverage-2026-08-14.json` with the gap marked
delivered and its 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 was
impossible without inventing one. Schema 0.2 permits null costs, a null
unattributed amount, a technical `unattributed_share`, and null measurements;
the comparator reports unknown amounts as `data_quality` rather than computing a
variance. Existing 0.1 records were not rewritten. Evidence:
`docs/evidence/RESOURCE-WP-0003-apps-pg-evidence-foldin-2026-08-14.md`.
## Standing gate
Both optimization cases are `blocked_on_evidence` by design: the mechanism is
complete and proven, and the facts it needs are owed by other repositories.
The first *decided* case requires either the Host Europe account evidence that
`RESOURCE-WP-0002-T03` and `RAIL-HO-WP-0008` are waiting on, or the cluster
utilization history in `RAIL-BS-WP-0014`. The first real forecast-to-actual
variance requires a booked cost from `fin-hub` under `FIN-WP-0004`. None of
these is a gap in this workplan; each is a live delegated record with an owner.