Public: anyone can read this; the crew can change it.
The planner defers work that serves no pillar, and says so #706
Check · Review · Land · Live done — Landed and live in production.
Closes #612
shipped production is serving it for issue #612 — its issue is already done deploy 2fa0c24
What a person sees. When work is planned, each issue says what it is for. An issue that serves a pillar stands under that pillar's umbrella on the map. An issue that serves none is not on the ready list: it waits behind the Later gate, and its first line says why.
What is in it
src/core/pillars.ts: a repository's pillars, read from its open umbrella issues by title (P0 Trust: …), with the Later gate (Later gate: …) and the Later umbrella (Later: …). Nothing is stored: an issue serves the pillar whose umbrella waits for it.src/actions/plan.ts: in a repository that has pillars, an item with nopillaris refused (no_pillar, naming the item and the pillars there are) unless it haslater: trueandwhy. A pillar item is linked under its umbrella. A later item opens blocked by the gate, under the Later umbrella, withLater: <why>at the top of its body. All or nothing, as before.src/http/mcp.ts: theplantool takespillar,laterandwhy, and its answer lists what waits (later, and a sentence naming the gate).src/crew/brief.ts: the planner is told to link every issue it opens under its pillar, or behind the Later gate with one sentence why.test/plan-pillars.test.ts, inGATE: 11 tests, through the MCP and the map page.- docs/PLANNING.md and docs/MCP.md.
Done means reachable
- Page. Deferred items show behind the gate on the map with no page change: the map draws the links. Tested on
/alice/forge/map: the deferred cards readblocked, the pillar card readsready. - MCP.
planwith a pillar, without one, and for later; all tested throughPOST /mcp. - Test. No pillar refused and nothing opened; later entries blocked by the gate and off the ready list; unknown pillar; later with no sentence; pillar work that would wait on deferred work (a loop, refused).
- Look. The map after a plan, taken from a local forge seeded with two pillars, a gate and a five-item plan: the two ready issues on top, their umbrellas under them, the Later gate under the umbrellas, the two deferred issues behind the gate, the Later umbrella last. The forge has no way to attach an image to a pull, so the picture is with the steward (
map-after-plan.png, and a phone-width one).
Choices worth a reviewer's eye
- A repository with no umbrella issues has no pillars and plans exactly as before. Requiring a pillar everywhere would break
planfor every app that has none. - The pillar is the link, not a label or a line in the body. #610 can derive its labels from the same
pillarsOfcall. The one thing written into a body is the reason a deferred issue waits, because it has no other home. - Only open umbrellas are pillars, and a later item needs an open gate: if the owner closed the gate, there is nothing to defer behind and the tool says so (
no_later_gate). - The crew's planner opens issues with curl, not with this tool, so for it the rule is the brief's text. The refusal covers every MCP caller.
Not touched. The release workflow, the chart, other repositories.
Verified
bun x tsc --noEmitclean.test/plan-pillars.test.ts11/11;test/mcp.test.ts,test/map-closing.test.ts,test/check-list.test.tspass.bun run checklocally: 1392 tests in 100 files, 1 failed:test/crew.test.ts"assignment: clone, branch, brief…", which fails onmainon macOS only (#707) and passes on Linux.- Follow-up filed: #713, a
planroute in the JSON API so the rule is a refusal for the crew's own planner too.
🤖 Generated with Claude Code
Review round 1: who may make a pillar. pillarsOf trusted any open issue by its title. It no longer does.
- An issue stands for a pillar, the Later gate or the Later umbrella only when its author is a person (not an agent) who can write the repository, and the issue was written here (
origin_author IS NULL). The person and native-issue conditions are in the query; write access iscanWrite, asked once per author and before the cap of 64, so no number of a stranger's issues takes a real umbrella's place. pillarsOf(db, repo)now takes the repository, not its id, because the rule needs it. #708 can take the rule from this one function.- The planner's brief says "opened by the owner or a writer of the repository; an issue so titled by anyone else is not a pillar", and the same for the gate. docs/PLANNING.md says it too.
Refusing tests (test/plan-pillars.test.ts, 16, five new, on a public repository through the real openIssue action):
- a stranger's "P0 Anything: …" makes no pillar: a plan with no pillar still opens,
pillar: "P0"is refused as before, and nothing is linked under their issue; - a stranger's "Later gate: …" and "Later: …" hold nothing:
later: trueis refused withno_later_gate, so closing their issue opens nothing; - an agent's issue (on the crew) and an imported issue are not pillars;
- the owner's umbrella and gate count, a second writer's counts, and a stranger's older issue of the same name does not take their place;
- with 80 issues of a stranger's titled like pillars, the owner's later umbrella is still found.
Verified. tsc clean; on main 41a27d2: plan-pillars, mcp, map-closing, reserved-names, studio, check-list and hollow, 253/253 in one run; bun scripts/hollow.ts clean.
🤖 Generated with Claude Code
Closes #612
In progress. A repository's pillars are read from its umbrella issues (
src/core/pillars.ts, here now). Coming in this pull: theplantool refuses an entry with no pillar unlesslater: true, links a pillar entry under its umbrella and a later entry behind the Later gate with its one sentence why; the planner's brief says the same; tests through the MCP; the map after a plan. The full description will be the first comment, since a pull's body cannot be edited.🤖 Generated with Claude Code