Changes for docs/index.md: 1 added line, 0 removed lines.
Original line number
Diff line number
Diff line
@@ -2,6 +2,7 @@
| Doc | Description |
|---|---|
| [20260901_1155_kubernetescluster-estimate-scales-with-nodecount.md](20260901_1155_kubernetescluster-estimate-scales-with-nodecount.md) | `KubernetesCluster.estimateProfile` now scales with the requested `nodeCount`: a fixed control-plane part plus a per-node increment, calibrated so the default 3-node cluster reproduces the spec's original flat profile. Reads `nodeCount` from the request (not the singleton's mutable field, which the background OPERATION callback would race on), following the `RadioEngineer` pattern; falls back to 3 nodes when the characteristic is absent, unparseable, or outside `1..500`. New `KubernetesClusterTest` (6 tests); suite 22/22 on the estimator group. |
| [20260827_1600_do-not-release-an-allocation-you-did-not-make.md](20260827_1600_do-not-release-an-allocation-you-did-not-make.md) | The X.731 pass this morning left `setResourceStatus(AVAILABLE)` standing in all ten specs, on the reasoning that `resourceStatus` no longer decides anything. It does not decide the service state, but it is how the platform records **pool allocation** — and OSOM builds the outbound `ResourceUpdate` from the live catalog entry, so that line overwrote an orchestrator's `RESERVED` and returned a pooled resource to the free pool while an order was using it, where a second order can take it and the end-of-operating-date sweep can terminate it. A reference project was teaching every controller author to do it. All ten specs now call the platform's new `declareResourceStatus`, which applies a verdict over a condition or over nothing and leaves a `RESERVED`/`STANDBY` alone; the three health attributes are still set unconditionally, because health is the controller's own to state. Teardown still clears the allocation outright. `ResourceA`/`ResourceB` carry the full explanation as the specs an author reads first. Adds three tests run against every spec in the catalogue; suite 123/123. |
| [20260827_1305_x731-health-on-every-path.md](20260827_1305_x731-health-on-every-path.md) | Adopt the ITU-T X.731 health contract on every path. OSOM now decides a supporting service's state from `Resource.deriveHealth()` — `operationalState` + `administrativeState` — and no longer from `resourceStatus`, so this controller, which reported only `resourceStatus`, derived to `PENDING` and hung every order it backed at `RESERVED` forever, silently, with the delete path equally unable to terminate anything. All ten specs now declare `AVAILABLE` + `ENABLE`/`UNLOCKED`/`ACTIVE` explicitly (written out per spec, not hidden in a base-class helper — a spec is copied as a template); `ResourceRepoService` sends per-phase health headers on the planning callbacks (`HELD` → `UP` on create, `GONE` on teardown), derived by asking `Resource.applyHealth` rather than re-tabulating the mapping, and writes the `SHUTDOWN` tombstone on the real delete. Fixes a dead store that made the delete echo report `AVAILABLE`, and teaches the new contract in the authoring guide (new "Health, not status" section). Two pre-existing failures fixed in passing: the promised `status.*` characteristics were never registered on the spec, and an invented labour rate had drifted from its tests. Suite goes from 67 run / 20 failures to 93/93. |
| [20260719_0017_writing-an-openslice-controller.md](20260719_0017_writing-an-openslice-controller.md) | **Start here to write your own controller.** Architecture and authoring guide: what a generic controller is and why the category is the whole contract; the component map and the one-registry-not-four-lists decision; both request paths end to end (production writes vs planning callbacks) with sequence diagrams; the simulation contract — run the real logic, suppress side effects, model deployment as taking time, target the id OSOM acknowledged; the estimate contract including the null-is-not-zero rule and the duty-cycled operation phase; a step-by-step walkthrough for building your own; and the gotchas that fail silently (spec names as a JMS join key, `specType()` only honoured on first registration, lenient catalog reply parsing, singleton specs and concurrency, `Math.abs` on a hash). Also rewrites the stale README, which still described the original two-spec state. |