A Release owns its items, and what a roadmap gives over a backlog is a MEASURED DEVIATION from a declared course — reported, never refused

Accepted

ontoref
MEASURED 2026-08-09, populating the roadmap for the first time.

Context

MEASURED 2026-08-09, populating the roadmap for the first time.

· THE ROADMAP SURFACE WAS COMPLETE AND UNFEEDABLE. `RoadmapItem` is declared in reflection/schemas/surface-entities.ncl and projected across CLI / HTTP / GraphQL / md with a Rust coherence oracle. `roadmap list` runs, with a daemon route and a local fallback. `presentation.ncl` (adr-053) already declares 'Timeline, 'Gantt and 'Board panel kinds and 'Milestone as a click-through target. Everything to RENDER a roadmap existed.

And `roadmap list` returned 56 items with `horizon = ""` on every one, because chronicle.nu reads `$item.horizon?`, `$item.mechanism?` and `$item.target_date?` and the backlog item schema DECLARED NONE OF THE THREE. Nickel record contracts are closed, so writing `horizon = "now"` failed with `extra field 'horizon'` — observed refusing before the fix. The field was not unpopulated. It was unwritable, and nothing anywhere said so.

· THE FIRST DERIVATION WAS THE WRONG AXIS, AND IT SAID SO ITSELF. With the fields declared, horizon was derived from priority (Critical → now, High → next, rest → later). That mapping is defensible as a starting proposal and worthless as a rule: priority states IMPORTANCE, horizon states SEQUENCE AND COMMITMENT. A Low-priority item that unblocks three others belongs in "now". The day the derivation becomes automatic, `horizon` carries nothing `priority` did not carry already and the roadmap is the backlog sorted differently.

· THE QUESTION THAT PRODUCED THIS DECISION. Asked directly: *"¿cómo se va a controlar que se sigue el rumbo de proyecto y prioridades, que es lo que te da un roadmap por encima de un backlog?"* It is the correct question and the schema could not answer it. A backlog is a SET of wanted things. A roadmap is a COMMITMENT plus a way to notice that the commitment was not kept. Everything built up to this point delivered the first half.

· FOUR INSTANCES OF ONE PATHOLOGY IN ONE SESSION. `verify-served` (a step that described an act and executed nothing, adr-070, closed by migration 0058); `generate-case-file` (13 steps, zero with a cmd, asserting in its postconditions that a positioning proof records the case); `positioning` (an explicit criterion since adr-035 that nothing on the authoring path ever read); and `horizon` (three fields read by a consumer and declared by no producer). Same shape every time: THE HALF THAT READS EXISTS AND THE HALF THAT WRITES DOES NOT, and because nothing fails, the silence reads as "not needed yet". A roadmap with no deviation reading would be the fifth, and it would be the worst of them, because a plan nobody measures against does not merely fail to help — it certifies.

· WHAT ALREADY SITS AT THE SEAM AND HAS NO OWNER. `roadmap list` lists the 14 Done items, which makes it a changelog with a horizon column. CHANGELOG [Unreleased] and outreach/presentations/rev_*.md are prose, authored independently, tied to no item and to each other by nothing but a version number in their titles. The three describe the same release and cannot be compared.

Decision

A RELEASE IS A DECLARED ENTITY THAT OWNS ITS ITEMS, AND THE ROADMAP'S SPECIFIC CONTRIBUTION IS A DEVIATION READING.

1. THE ENTITY. `.ontoref/reflection/releases.ncl` declares each release against `reflection/schemas/release.ncl`, in the same producer/schema pair shape as the backlog:

{ version, date, status | 'Planned|'Active|'Cut, focus | Array { id, statement }, # the declared course, in the author's words owed | Array String } # outward surface this release owes

`focus` is the load-bearing field and it is PROSE ON PURPOSE: "empaquetado, distro, install y setup con domains-ontoref y tiers" is a course, and reducing it to a tag vocabulary would make it checkable and false. What is typed is that the course EXISTS, is declared BEFORE the work, and is immutable once the release is 'Active — not what it says.

2. THE OWNERSHIP EDGE. A backlog item carries `release` (added 2026-08-09, additive, optional). That single field is what turns a set into a plan: an item now answers "committed to what", and `horizon` becomes DERIVED FROM A DECISION rather than from how important the item looked — the active release is "now", the next is "next", spanning work is "next" with no version, unassigned is "later".

3. THE DEVIATION READING — `release audit`, the sibling of `positioning audit`. Three numbers, and they are the entire argument for a roadmap over a backlog:

OFF-FOCUS items that shipped in this release whose work does not answer any declared focus statement. The course was set and something else was done. ORPHAN items that shipped carrying NO release. Work done outside any declared course at all — invisible to any plan, by construction. ABANDONED items assigned to the release that did not ship. The plan overpromised, which is a fact about the plan.

None of the three can be computed from a backlog: they all require something to have been COMMITTED TO BEFOREHAND. That is the whole of what a roadmap adds.

4. WARN-ONLY, AND THIS IS THE DECISION, NOT A CONCESSION. The audit reports and never refuses. It does not block a cut, fail CI, or reject an off-focus item. `enforcement-vs-emergence` is a named Spiral and this project's evidence sits firmly on the emergent side: every one of the four defects above was found by following a thread, not by executing a plan, and a roadmap empowered to refuse off-focus work would have refused all four. A high OFF-FOCUS reading is information about the PLAN as much as about the work; which of the two was wrong is a human judgement and the mechanism must not pre-empt it.

The precedent is already in the repo and is followed rather than invented: `is_orphan_milestone` (proof-candidate.ncl) surfaces an orphan WARN-ONLY, and the anti-pattern that guards it is named `reality-collapses-intent` (adr-051 M3). This is that pattern applied to execution instead of to evidence.

5. THE CHANGELOG AND THE DECK BECOME PROJECTIONS OF THE RELEASE, NOT SIBLINGS OF IT. The release declaration supplies the SKELETON — which items, under which focus, owing which outward surface. The PROSE stays human: a changelog entry states what moved and why, and a deck is an argument, and neither is derivable. What ends is three independent authorings of the same release that cannot be compared.

WHAT IS DELIBERATELY NOT DECIDED HERE. Whether the roadmap is PUBLISHED, and whether readers rank or vote on it, is a `reach-vs-qualification` question with its own alternatives. This decision governs the internal instrument only. A roadmap must be trustworthy before it is broadcast, and it is not trustworthy until it has produced at least one deviation reading that somebody acted on.

Constraints

  • Hard A backlog item can declare which release it is committed to; the field exists on the producer, not only on the projection.
  • Hard Each release declares a `focus` — the course, in prose — and it is declared before the release becomes 'Active, never reconstructed afterwards.
  • Hard The deviation reading is warn-only: no gate, hook or CI step may fail because work was off-focus, orphan, or abandoned.
  • Soft Once an item declares a release, its horizon follows from that release rather than from its priority.
  • Soft The CHANGELOG section and the difusión deck for a release take their item list from the release declaration rather than from an independent authoring.

Alternatives considered

  • Keep the backlog and add nothing — sort by priority and call it a roadmaprejected: That is the state this decision starts from, and it cannot produce any of the three readings, because none of them is computable without a prior commitment to compare against. It also makes `horizon` carry no information `priority` did not already carry.
  • A separate roadmap store, written by hand alongside the backlogrejected: A second source of truth about the same items. `roadmap list` is a PROJECTION over two producers (backlog ⊕ positioning), and adr-053 C2 forbids a rendered surface becoming a second source. The roadmap must stay derived; what was missing was a field on the producer, not a new store.
  • Make the roadmap enforcing — refuse or flag off-focus work at commit or at cutrejected: Collapses `enforcement-vs-emergence` onto the enforcement pole against this project's own evidence: the four defects measured on 2026-08-09 were all found off-plan, and every one of them would have been refused. A plan that can veto discovery optimises for the plan.
  • Type `focus` as a controlled vocabulary of tags so OFF-FOCUS is computed exactlyrejected: Makes the reading precise and the course false. A release focus is a sentence a human meant; a tag set that approximates it would be measured instead of the thing itself — the proxy-instead-of-measure shape adr-072 forbids. The classification stays a judgement the audit PRESENTS rather than decides.
  • Bind items to releases through git history instead of a declared fieldrejected: History records what happened, never what was committed to. ABANDONED — items promised and not shipped — is invisible in a log by construction, and it is the reading that says most about a plan.

Anti-patterns

  • A plan that may refuse the work — Wiring the deviation reading into a gate so off-focus work is blocked, flagged as a failure, or requires justification to proceed. It converts a measuring instrument into a governor and optimises for the plan rather than for the project. Every defect measured on 2026-08-09 was found off-plan.
  • The course declared after the journey — Writing or amending a release's `focus` once the work is done so the OFF-FOCUS reading comes out clean. The audit reports a perfect course and measures nothing — the reading survives while its meaning is gone. This is `reality-collapses-intent` (adr-051 M3) applied to execution, and no mechanical check closes it: the file's content is prose by design.
  • A horizon derived from priority, permanently — Leaving `horizon` as a function of `priority` after the derivation's first pass. The field then carries no information the backlog did not already have, and the roadmap is the same set displayed in a different order — which is exactly what it was before this work, only now it looks like a plan.
  • Work that belonged to no declared course — An item reaching Done while carrying no release. It is not forbidden — unplanned work is legitimate and often the best work here — but it must be COUNTED, because the alternative is that a project whose entire output was unplanned reports a perfectly kept roadmap.
Was this useful? Rate it
Got something to add? Tell me what you think, what you'd suggest, or whether we should keep exploring this topic.
· reads

We use cookies to help this site function, understand service usage, and support marketing efforts. Cookie Policy for more info.