# RESOURCE-WP-0003 portfolio reporting and cadence — 2026-08-14 ## Result `RESOURCE-WP-0003-T07` established the portfolio view and the operating cadence. The implementation consists of: - `tools/portfolio_report.py` — coverage, lifecycle, utilization, cost, renewals, risks, open optimization cases, and next actions, derived entirely from committed evidence; - `docs/portfolio-operating-cadence.md` — monthly observation, monthly report, quarterly calibration, pre-renewal review, and event-driven triggers, each with named inputs, consumers, and outputs; - `make portfolio-report`; - 22 tests in `tests/test_portfolio_report.py`, including a suite that renders the real committed portfolio rather than fixtures. Nothing in the report is typed by hand. It reads `data/resources/`, the latest `data/portfolio-coverage-*.json`, and `data/optimization/`, and it re-validates every record it reads. ## Not forcing false precision T07 requires reporting missing evidence and unapportioned cost rather than forcing false precision. Two decisions carry that requirement: - **`known_monthly_spend_eur` is `null`, never `0`.** Six of seven resources carry no price evidence and no booked cost has arrived from `fin-hub`. Summing the one priced resource would report a portfolio spend roughly an order of magnitude below reality while looking authoritative. The field stays unknown, accompanied by a note stating how many resources are unpriced. - **Unattributed cost is a list of resources, not a spread.** Four resources have allocation mode `unattributed`. They are named, with the repository that owes the allocation driver; their cost is not divided across consumers by a plausible default. Resources whose capacity cannot be measured appear in `utilization.unmeasured` with the reason, rather than being dropped from the ratios and thereby flattering the portfolio average. ## What the current report tells an operator T07 is done when an operator can identify material spend, idle or saturated capacity, forecast error, approaching commitments, and the next evidence-backed action. Against the portfolio as committed on 2026-08-14: | Question | Answer | |---|---| | Material spend | **Unknown, explicitly.** Only the proposed backup storage carries price evidence; the rest waits on `RAIL-HO-WP-0008` and `FIN-WP-0004`. | | Idle capacity | `resource:hosteurope:railiance01` and `resource:railiance:reef-railiance:k3s`, idle on every measured metric at 14 percent CPU and 37 percent memory. Five resources are unmeasurable. | | Saturated capacity | None. | | Forecast error | **Not yet computable.** The control-cycle mechanism is proven on paired examples, but no operational actual observation exists, so no variance is reported and none is fabricated. | | Approaching commitments | None visible within 90 days — and the finding is that six active resources have **no** renewal or cancellation date at all, so no cancellation window can be respected. | | Next action | The `next_actions` list: seven delegated workplans, the booked-cost dependency on `fin-hub`, and six missing contract-date records, each addressed to its owner. | ## Structural risk surfaced The risk section reports concentration mechanically rather than in prose: six of seven resources share `host:railiance01` and five share `cluster:reef-railiance`. That includes every workload the proposed backup storage exists to protect, which is the standing argument against same-provider placement recorded in `opt:platform-audit-storage:2026-08`. Thresholds are explicit in the tool — idle at or below 35 percent, saturated at or above 85 percent, renewal horizon 90 days, failure-domain concentration above two resources. ## Boundaries held The report reads; it does not write to any other repository. Every unknown it prints is attributed to the repository or authority that owns it, and the `next_actions` list is the message sent back to those owners on the monthly cadence. No booked financial fact is reproduced here; spend remains `fin-hub`'s authority under `docs/fin-hub-resource-control-contract-v0.1.md`.