Skip to content

initiative-decompose

The coxswain dispatches initiative-decompose during scoping, before any ticket is planned: it reads an initiative and proposes the epics and tickets that would carry it. What lands is a draft decomposition for a human to accept, trim, or reshape, never tickets filed directly onto the active board.

initiative-decompose

The front of the pipeline, and the step that makes everything after it parallelisable. An idea arrives as prose; what comes out is phases, tasks, and the dependency edges between them — and one item_create proposal per task.

flowchart LR
    n0["decompose<br/>step · 1"]
    n1["adversary<br/>step · 2"]
    n2["emit<br/>step · 3"]
    n0 --> n1
    n1 --> n2
    style n0 fill:#f96,stroke:#333,stroke-width:2px
Node Step
decompose 1
adversary 2
emit 3

initiative-decompose — specification

The front of the pipeline. An idea arrives as prose; phases, tasks, and the dependency edges between them come out. Everything downstream — what can run in parallel, what has to wait — is decided here.

Node Role Tier Notes
decompose decompose standard idea → phases → tasks, with edges and surfaces
adversary review_adversary deep attacks the dependency edges
emit one item_create proposal per task

Args: run_id, date, cartridge (resolved, required, no fallback), idea.

Returns: {run_id, date, idea, shape, phases, tasks, challenge, proposals[], totals}

The adversary is pointed at the edges, deliberately

This is the highest-leverage adversarial pass in the system, and it has one job: find dependency edges that are not real.

Every spurious edge silently serialises work that could have run at the same time, and nothing downstream will ever question it — the phase runner simply sees a blocked task and waits. The person who just drew the graph is also the last person likely to notice they drew too many edges, which is exactly the situation a second, hostile reader is for.

It works in both directions. Dropping a false edge buys parallelism; adding a real one that was missed prevents a task starting on ground that is not there yet, which is the failure that parallelism would otherwise cause. Two things it is not allowed to do: invent a task that does not exist, and make a task depend on itself.

Refusing to emit nonsense

A cycle means nothing in it can ever become ready — the phase would stall with no explanation — so a decomposition containing one is refused before anything is proposed, and refused again by the work store on read. Both checks exist because the failure is silent and the cost of finding it late is a stalled phase nobody can diagnose.

totals reports edges_dropped and immediately_startable, which is the number worth watching: it is how much of the phase can begin at once.

Status: implemented in initiative_decompose.py.