Intents

Every loop turn starts with an intent: a first-class object that names the aim, selects and scopes analyzers, and acts as the container for everything upstream of the proposal pool. Intents are the root of the provenance chain — every epic ultimately answers “why does this exist” with an INT-n.

Two archetypes

  • Directed — you name the work: “Add CSV export”. Directed intents default to targeted analysis such as feature pre-scoping, which maps what already exists before anything is built. Even hand-initiated features get analysis by default, so commitment always follows evidence.
  • North Star-driven — you name only the aim: “Move us toward the constellation”. These fan out a broad analyzer battery and let the evidence decide what gets proposed.

Lifecycle

draft → awaiting approval → approved → analyzing → proposing → concluded

Submitting an intent emits the intent.activate checkpoint — whether a human approves, an agent with authority approves over the CLI, or policy auto-approves is decided by your gate configuration. Once approved, firing the intent fans out its analyzers; when analysis settles, proposal derivation runs; when that completes, a standing intent re-arms and a one-shot intent concludes.

A failed run (every analyzer failed) re-arms the intent with the reason stated plainly — a failed run produced nothing, so the intent stays retryable. From approval onward an intent is permanent, because reports, proposals, and epics point back at it; only drafts can be discarded.

Standing intents

An intent’s triggers are what make the outer loop continuous. An intent with no triggers fires once on approval and concludes; an intent with triggers re-arms after each run:

Trigger Fires when
Manual You (or an agent) run Fire
Schedule A cron occurrence arrives (UTC)
Post-merge An epic merges in one of the scoped repositories
Score drop A score crosses a threshold you set — relative drop, absolute floor, or both

Triggers arriving while a run is already active coalesce into a single follow-up run rather than queueing in parallel — three merges during one run yield exactly one re-fire, which analyzes the repository’s latest state anyway.

Run history you can trust

Every firing produces an immutable run record: what fired it (the exact trigger provenance — which merge, which score movement, which person), a snapshot of the scope at fire time, per-analyzer outcomes, timings, and cost. History renders from the snapshot, never live scope — renaming an analyzer later cannot falsify what run 3 actually analyzed.

Seeded intents

Finished work seeds the next aim. Review learnings, report findings, and triaged signals all create draft intents carrying seed provenance — “Seeded from EPC-12 review learnings”, “Seeded from SIG-238” — which enter the normal approval gate like any other intent. This is the loop’s closure: the output of one turn becomes the input of the next.

Working with intents

Action Web CLI
Create Intents → New intent stella intent create [--submit]
Submit / approve intent actions stella intent submit|approve <INT-n>
Fire Fire action stella intent fire <INT-n>
Stop the active run Stop run stella intent stop-run <INT-n>
Run history Analysis tab → run picker stella intent runs <INT-n>
Conclude Conclude action stella intent conclude <INT-n>

The intent view shows the live analyzer rows for the selected run, the proposals it produced, and the full activity trail.