Projects, lanes, and plans
Three nested ideas carry all of mcue's structure. Understanding what each one is for — and what it deliberately is not — makes the command surface obvious.
Projects
A project is a governed intent: the durable identity for a body of work whose continuity mcue governs. It has a stable id, a registry entry, and a state directory. From the CLI, it is usually created where the code lives:
mcue init payments-api --name "Payments API" # register and scaffold
mcue attach payments-api # anchor an existing project to this directory
mcue detach # remove the footprint, keep the state
The directory is an attachment, not the project. A project can have several
repositories attached or none; one created in Hub with no CLI involved is the same
kind of thing, and mcue attach joins a repository to it later. The project is the
boundary for identity, ownership, membership, shared decisions, and portfolio
visibility. It is not the smallest thing you resume — that is a lane.
The id is yours to choose and appears in every later command. Keep it short and
stable; if you must change it, mcue project rename <old-id> <new-id> moves the id
across all local state rather than leaving you to fix references by hand.
Projects have a lifecycle beyond deletion:
mcue project archive payments-api # out of the active portfolio, state retained
mcue project delete payments-api # hard delete: registry entry and state
Archiving is the one you usually want. mcue index stops showing archived
projects without destroying anything.
Lanes
A lane is an independently resumable stream of work inside a project. It has its
own objective, blockers, next action, resume pointer, plan, and checkpoint history
— and its own freshness, trust, and drift signals. mcue closeout writes to a
lane; mcue resume reads from one. The lane is the primary continuity unit.
mcue lane create payments-api refunds
mcue lane close payments-api
mcue lane delete payments-api
A lane is not a Git branch. The distinction matters:
- A branch partitions code. A lane partitions attention.
- A branch merges. A lane reconciles — and only when two perspectives on the same lane diverge.
- You can work one lane across several branches, or several lanes on one branch. mcue does not care what your VCS is doing.
Every project starts with a default lane, so you can ignore lanes entirely until you are genuinely running two strands of work and find their closeouts polluting each other.
Plans
A plan is the current intended sequence of steps on a lane. It is scoped to the lane, not the project, because two lanes have two different next actions.
mcue plan create payments-api
mcue plan show payments-api
mcue plan update payments-api # change it outside a closeout
mcue plan close payments-api # archive the active plan
mcue plan list payments-api # active and archived
Plans are archived rather than deleted when closed, so "what did we think the sequence was in March" stays answerable.
How they compose
project payments-api
├── lane default
│ ├── plan (active)
│ └── checkpoints/
└── lane refunds
├── plan (active)
└── checkpoints/
mcue closeout writes to a lane. mcue resume reads from a lane. mcue index
aggregates across projects. When a lane accumulates two unreconciled perspectives —
usually because two machines wrote to it independently — mcue reconcile is how
you resolve it.
Choosing a granularity
The failure mode at both ends is real:
- Too many projects. A project is one governed intent — the body of work you
would describe as a single thing with one owner and one set of decisions. Often
that maps to a repository; sometimes it spans several, or has none yet. One per
feature means
mcue indexbecomes noise and nothing is ever resumed. - Too many lanes. Create a lane when two strands genuinely have different next actions and different blockers. Otherwise a single lane with good closeouts beats five with sparse ones.
When in doubt, fewer. Splitting later is cheap; merging a fragmented history is not.