The Intelligence Dispatch · Notebook

The roadmap cannot lie about maturity

Every roadmap card shows how mature its foundation is. That number is not typed into the card — it is read out of the audit at build time, which means nobody can round it up.

Every prototype on the roadmap carries a maturity chip: production, dev, prototype, or nothing at all. The interesting part is not the chip. It is that the person writing the card cannot choose what it says.

The problem with roadmaps

A roadmap card is a sales pitch aimed at your own colleagues. It wants to look ready. The failure mode is not lying — it is drift: a card written when something was nearly done, read six months later as though it were finished. By then the card and the codebase disagree, and the card is the thing in the meeting.

Every roadmap tool we have used treats maturity as a field you fill in. Fields you fill in are fields that go stale.

What we did instead

A card declares which audited components it builds on, and nothing more:

{
  "title": "Permission gate",
  "summary": "Role meets acts: draft a credit, do not post it.",
  "foundation": ["guardrails/agent-tool-policies", "frontend/policy-rules-ui"]
}

No tier. No percentage. No status field. At build time the generator opens inventory/guardrails/agent-tool-policies.md, reads its status:, and renders the strongest tier it finds across the card's references.

def inventory_tier(ref):
    """Read `status:` from inventory/<dimension>/<name>.md. None if there is no entry."""
    path = REPO / "inventory" / f"{ref}.md"
    if not path.exists():
        return None
    match = re.search(r"^status:\s*(\S+)", path.read_text(encoding="utf-8"), re.M)
    return match.group(1) if match else None

That is the whole mechanism. Twelve lines, no database, no sync job.

What it buys

A tier change propagates by itself. When a component is re-audited from dev to production, the next build moves every card that depends on it. Nobody updates the roadmap. There is no roadmap to update.

An empty foundation is visible. A card that references nothing renders "No audited foundation" — not a blank space, not an optimistic guess. Seven of nineteen cards say this today. That is uncomfortable and correct: they are explorations with no audited component underneath them yet, and the card says so before anyone asks.

A broken reference shouts. If a component is renamed in inventory/, the card's reference stops resolving, the build prints it, and the chip reads unknown. Silence would be worse than a wrong tier.

The rule underneath

The audit is upstream of everything that makes a claim. The roadmap reports maturity, it never asserts it. Release notes say what shipped, and now carry the same component references, so the chips there are read the same way. The FAQ is generated directly from the audit repo's own docs/FAQ.md, so the answers and the evidence cannot drift apart either.

None of this makes the roadmap right. It makes it checkable, which is a lower bar and a far more useful one. A card can still describe a bad idea. It just cannot describe a bad idea as if it were nearly shipped.

↑