Reckon models sprints, milestones, ROI and effort — all of which answer when and
how much. None answers toward what. A milestone is a dated target that
completes and is gone; a project's durable direction is a different kind of object, and its
absence shows: across twelve mounted projects and 352 plans, the phrase "north-star" already
appears as prose in dozens of imas-ambix documents, doing real work informally
with no structure behind it.
The purpose of making it structural is not decoration. It is to make it visible
when a plan points nowhere. The majority of plans should point at a north-star; a
project should carry a handful at most, because a dozen directions is no direction.
§2 — Deliverables
North-stars in project state. A north_stars collection
alongside sprints and milestones in docs/state/<project>/, each carrying a
stable id, a name, a one-sentence statement of what winning looks like, and an optional
href to a strategy or research document. The href is the escape
hatch that keeps the entry cheap while allowing depth where a direction needs argument rather
than a sentence. Schema-validated with an advisory cap on the count, so a project drifting
past a handful is reported rather than silently accepted.
The plan label.<meta name="plan-north-star">, parsed
into plan state and validated against the owning project's declared set. A plan naming an
unknown north-star is a wiring finding, consistent with how dangling dependency slugs are
already handled.
Server prominence. A north-star band on the cockpit showing each
direction, its statement, and how much live work points at it; a badge on plan pages and in
the plan list; a filter on the plans list. Follow the repository's minimal-ink discipline —
aligned labels and hairline rules, no card grids or status pills, and a table where the
content is labels and values.
Orientation reporting.roadmap gains a per-north-star rollup
— plans, completion and remaining effort pointing at each — plus an
unoriented-plan finding at info severity for live actionable plans that declare
none. Info rather than warn: an unoriented plan is a prompt to think, not a defect to
block on.
Adopt it here first. Declare reckon's own north-stars and label the seven
plans of sprints S7 to S9 against them. Partner projects adopt when they choose; the label is
optional everywhere and its absence never blocks execution.
§3 — Evidence gates
Measure
Required evidence
Declared and rendered
Reckon's own north-stars are declared in project state and render in the cockpit
band with their statements and live-work counts. Screenshot banked as a figure.
Plans point at them
All seven S7–S9 plans carry plan-north-star, each resolving to a declared
id, shown as a badge on the plan page and filterable in the list.
Dangling reference caught
A test proving a plan naming an undeclared north-star produces a wiring finding
rather than passing silently.
Orientation rollup
roadmap reports plans, completion and remaining effort per north-star,
and lists unoriented live plans at info severity. Recorded output for reckon.
Count discipline
A test proving a project exceeding the advisory cap is reported, and that the report
does not block a write.
Optional everywhere
A project with no north-stars declared, and a plan with no label, both continue to
read, scan and execute unchanged — asserted by test against an unmigrated project.
Suite green
Full reckon suite passes; new-test count recorded.
§4 — The collection needs a write path, not only a read path
Declaring reckon's own directions was blocked by a gap the earlier work left behind. The
collection validates, composes and reads correctly, and the served surfaces render it — but it
cannot be written through the documented write surface. edit_plan refuses
north_stars with unsupported index set path, because the allowed set of
top-level project keys admits only active_sprint_id. Validation was added at the
project-state layer and exercised through that layer's own writer, so nothing in the node's own
gate detected that the surface every agent actually calls has no route to it.
Hand-editing the state file would have hidden exactly that: the adoption step would have
succeeded while the write path stayed missing and untested, and the next project to adopt a
direction would hit the same wall with no test to explain it. So the write path comes first and
adoption follows it.
The general lesson is worth stating beyond this collection: a state field is finished when it is
writable, readable and rendered through the same surfaces its neighbours use. A field that only
one internal writer can reach is a field with a private door.
Measure
Required evidence
Writable through the tool
Setting the whole collection through edit_plan succeeds and the value
round-trips through a subsequent read, asserted by test.
Addressable per entry
A single entry's field is settable by id in the same dotted style sprints and milestones
already use, asserted by test.
Validation still applies
A write missing a required field, and one carrying a duplicate id, are both refused
through the tool rather than only through the internal writer.
Advisory cap still advisory
A write exceeding the cap succeeds through the tool and returns the warning, matching the
behaviour already proven at the state layer.
§5 — Adopt the directions here first
Once the write path exists, reckon declares its own directions and every plan of the three
execution sprints points at one. Four are proposed, inside the advisory cap of five, each a durable
direction rather than a dated target:
Direction
What winning looks like
State that tells the truth
Every status, number and gate verdict is derived from evidence a reader can re-check, and nothing computable is stored as an assertion.
Unattended execution
An orchestrator carries a sprint from ready node to committed evidence without a human in the loop, and holds recoverably rather than failing when it must stop.
Legible to human and agent alike
A person and an agent read the same plan state through surfaces suited to each, with neither a second store nor a second truth.
Portable across harnesses
Reckon's contracts hold whichever agent harness runs the work, so adding a backend never adds a second execution path.
The plan's prose says seven plans span the three sprints; the sprint resources hold
eight. All eight are labelled, and each of the four directions receives at least
one — which is the useful check on the set, since a direction nothing points at is either premature
or misnamed.
Measure
Required evidence
Declared
The four directions are present in project state and returned by a read of the project
resource.
Every plan oriented
All eight plans of the three execution sprints carry a label resolving to a declared id,
and the dependency scan reports no undeclared-reference finding.
Rollup non-trivial
The per-direction rollup reports a non-zero plan count for each of the four, with the
recorded figures.
Rendered
The cockpit band shows the four with their live-work counts against a restarted server,
banked as a figure.
§ Decisions
How is a north-star modelled?
Reuses the existing rollup machinery that sprints and milestones already use, and the optional href gives prose room without adding a typed root, route resolution, schema type and archive path. A milestone flavour was rejected because milestones complete and north-stars do not — conflating a dated target with a durable direction loses the distinction that makes the label worth having.
How severe is a live plan that declares no north-star?
Orientation is a prompt to think about direction, not a structural fault. Raising it to warn would put it beside genuine wiring errors and train readers to ignore the category. Some plans legitimately point nowhere — infrastructure repairs and cleanups among them.
§ Followups
Make north-stars first-class and orient this sprint set against them
Land the project-state collection with schema and advisory cap, the plan meta label with dangling-reference validation, cockpit prominence and a plans filter, the roadmap orientation rollup with an info-severity unoriented finding, then declare reckon's own north-stars and label the S7–S9 plans.
/reckon-ship north-star-orientation
Adopt the directions once the server and MCP carry the new write path
Everything §5 needs is landed and green: the collection is writable through edit_plan (commit e8efbc7, 5 tool-boundary tests), the rollup reports per-direction work, and the cockpit band, plan badge and list facet all render. The declaration itself cannot be written from this session because server, parse and render code is not hot — the running HTTP server and every connected MCP stdio process hold the pre-merge code, so both write routes still refuse north_stars with unsupported index set path, and reckon exposes no CLI route to project state.
The unblock is reckon service restart plus an MCP reconnect. That was not taken unilaterally: this server is shared infrastructure that several concurrent agent sessions on this workstation read, and restarting it out from under them is the lead's call rather than a coordinator's. The same restart discharges the four measures across this sprint that need a live instance — the cockpit screenshot here, the 3-second dispatch-to-working latency and the ss -ltnp single-listener check on in-flight visibility, and the watcher navigability screenshot.
After the restart: declare the four directions on the project resource, label all eight plans of the three execution sprints, then re-run the dependency scan and confirm no undeclared-reference finding and a non-zero plan count against each direction.
/reckon-ship north-star-orientation §5
north-star-project-state landed — commit cb230a2f7402a39405af252f27d4b53f963f979c; gate passed; measure: tests/test_project_state.py + tests/test_schema.py 1,121 passed / 0 failed in 20.3s with 6 new parameter-expanded cases; six entries against an advisory cap of five write successfully while audit_project_state returns one north-star-advisory-cap-exceeded warning, and a project omitting north_stars composes without the key; artifacts reckon/_schema.py, reckon/project_state.py, tests/test_project_state.py, docs/evidence/archive/north-star-orientation-landed.html#project-state
north-star-plan-label landed — commit d7dfd50ae2f9a217fce0f545d10847c16fc51d63; gate passed; measure: tests/test_mcp_store.py + tests/test_schema.py 1,094 passed / 0 failed in 91.1s with 4 new tests, and the full suite at the integrated commit 1,731 passed / 0 failed in 276s; plan-north-star round-trips through semantic HTML, typed state and the regenerated public schema, an undeclared id returns a non-fatal undeclared-north-star diagnostic naming it while the write still succeeds, and an unlabelled plan gains neither north_star nor validation_diagnostics with a no-op write leaving bytes and version unchanged. Recorded scope-changed: docs/_shared/plan.schema.json was granted mid-flight because it is a committed derived artifact of the typed model, so this run is excluded from calibration. Artifacts docs/evidence/archive/north-star-orientation-landed.html#plan-label
orientation-rollup landed — commit d4d15023f06f11be7abb6f9dd07ad3252a5fd2b5; gate passed; measure: tests/test_roadmap.py + tests/test_mcp_roadmap.py 25 passed / 0 failed in 1.0s with 4 new tests, ruff clean; roadmap returns a declaration-ordered north_stars rollup and three declared directions produced 2 plans / 1 complete / 50.0% / 3.0 remaining, 1 / 0 / 0.0% / 1.0 and 0 / 0 / 0.0% / 0, so a direction nothing points at is still reported with zeroes rather than hidden. An authorised non-terminal plan with no label yields exactly one unoriented-plan finding at info severity while draft and completed plans yield none; a plan naming an undeclared id yields undeclared-north-star at error severity naming both slug and id, matching how a dangling dependency slug is already handled; a project declaring no directions returns an empty rollup and neither finding. Artifacts docs/evidence/archive/north-star-orientation-landed.html#orientation-rollup
north-star-prominence landed — commit 9ded8c0b03a625677e0681102a86d88656ade53b; gate passed; measure: tests/test_build.py 14 passed / 0 failed in 4.3s with 16 new assertions, reckon build exit 0, ruff clean, and the three SPA entry-point script sets verified identical at 11 = 11 = 11 JSX paths; served discovery and state routes both return declarations and inventory alignment, the cockpit band renders every declaration in declaration order with statement and live-work count over pending/active/in-progress/blocked plans, title and plan-list rows name the resolved direction, one facet selects exactly one id, and zero declarations omit the band and facet while zero labels omit both badges. The node first refused to write and audited instead, correctly reporting the deliverable unreachable from its original fence — served state carried no declarations and inventory rows no label — citing shell.jsx:1042, shell.jsx:134-256 and :950-977, serve.py:529-584 and :598-607, and state-loader.js, leaving the worktree clean. Recorded scope-changed: four files granted mid-flight. Two measures stay partial — the screenshot needs the restarted server and the labelling of all seven S7–S9 plans is the adoption node's work. Artifacts docs/evidence/archive/north-star-orientation-landed.html#prominence
Adoption blocked on a missing write path, found by attempting it. edit_plan refuses north_stars with 'unsupported index set path' because _INDEX_SET_TOP admits only active_sprint_id; validation and composition were added at the project_state layer and exercised through that layer's own writer, so the node's gate never touched the surface agents actually call. Not hand-edited: writing docs/state/reckon/project.json directly would have let adoption succeed while the write path stayed missing and untested, so the next project to adopt a direction would hit the same wall with no test explaining it. Recorded as §4 with four measures, and adoption becomes §5 behind it. Denominator grew from 5 nodes to 6, so impl reads 4/6.
direction-write-path landed — commit e8efbc740199bebff99a022f1849819a6199118b; gate passed; measure: tests/test_mcp_store.py + tests/test_project_state.py 80 passed / 0 failed in 4.4s with 5 new tool-boundary tests; edit_plan now round-trips a whole north_stars collection and updates one entry by dotted id in the same style sprints and milestones use, a missing statement returns schema_validation with no write, a duplicate id returns op_error with no write, and six entries write successfully while returning the warning 'project declares 6 north-stars; the advisory cap is 5'. The private door is closed: the collection is now writable, readable and rendered through the same surfaces its neighbours use. Adoption (§5) is unblocked but held behind the failed integration suite gate. Artifacts docs/evidence/archive/north-star-orientation-landed.html
Adoption attempted and blocked on a stale runtime, not on missing work. The write path landed in commit e8efbc7 and its 5 tool-boundary tests pass, but edit_plan still refuses north_stars with 'unsupported index set path' because the live MCP stdio process and the HTTP server both hold pre-merge code — server, parse and render changes are not hot — and no CLI route to project state exists. Recorded as followup f-nso-002 under the authority-required exemption: the unblock is reckon service restart plus an MCP reconnect, and this server is shared infrastructure that several concurrent agent sessions read, so restarting it is the lead's call rather than a coordinator's. Not worked around by hand-editing docs/state/reckon/project.json, for the same reason §4 exists: that would leave the write path unexercised on the one case it was built for.