Docs

Thinking

Goals and milestones

A Goal is a GitHub Milestone the Architect declares once: goal prose, an optional Release line and the tranches that serve it. Its lifecycle is derived from those tranches.

Architect
Milestone
Optional
Derived lifecycle

About Goals

A Goal is a product outcome and the tranches that serve it. It lives as a real GitHub Milestone. It is the one level above the tranche, and it is optional: most tranches have no Milestone and need none.

To plan work from a Goal end to end, follow Deploy complex work.

How it works

  1. 1

    Declare the Goal

    The Architect declares the Goal once, naming its tranches up front in ### Tranche intents. A tranche that already exists can also be adopted later. This is the only stage a human decision truly gates.

  2. 2

    Tranches run

    Each named tranche runs its own flow: plan, dispatch, archive. The Milestone does not orchestrate; the Principal or a thin dispatch script decides when each tranche starts.

  3. 3

    Close

    When every declared tranche is complete, the Milestone reads complete. Cutting a release for the Release: version is a separate, largely manual act.

When an open Milestone names a tranche's slug, vinaya issue create attaches each new task Issue to that Milestone by itself. The Planner takes no step.

The Milestone description

The Milestone's title is free text for people. It is never parsed. The description carries three parts:

PartRequiredGrammarMeaning
GoalYesProse: whatever remains once the two parts below are removedThe product outcome
Release:NoLine-anchored, ** optional on both sides, code fences stripped first, first match winsThe only source of the target version. Never the title
### Tranche intentsNoOne bullet per tranche: - <slug>: <intent text>Which tranches serve this Goal and what each contributes

A tranche's goal is derived, never stored. It is the intent line whose slug matches the tranche's label, found by searching every Milestone's description. An intent line for a slug with no Issues yet is a real tranche in the planned state.

Commands

CommandWhat it doesWho
vinaya milestone create --title <title> --body-file <path>Checks the body's shape, then writes one Milestone through the GitHub APIArchitect
vinaya milestone edit <n> --body-file <path>Same check as create, then rewrites the descriptionPrincipal
vinaya milestone adopt --target <title> --slug <slug> [--slug …]Reattaches every Issue carrying each named tranche label to the target Milestone, then closes (never deletes) each slug's old legacy MilestoneNo role is named
vinaya milestone status <n>Read-only. For each - <slug>: line, prints the slug, its derived lifecycle and its Issues' counts (merged, open, not planned)Anyone
vinaya milestone close --slug <slug>Finds the tranche's Milestone, checks every Issue carrying vinaya/tranche:<slug> is attached to it, refuses naming each unattached or foreign Issue, then closes itTranche Archivist

milestone adopt refuses the whole call, before any write, on an unknown slug, a slug with no Issues, a missing or closed target, or a slug already adopted elsewhere.

Lifecycle

The state is derived from the Milestone's tranches. It is never written to the Milestone.

StateWhen
plannedEvery named tranche is planned, or the Milestone names no tranches
activeAt least one named tranche is active
completeEvery named tranche is complete. A Milestone naming zero tranches never reads complete

Roles

RoleDoesNever does
ArchitectCreates the Milestone, once, with vinaya milestone create. Invoked by hand, on demand; no dispatch queue, no brief formatCut or size a task, decide edges, read a version from the title, edit, move or close a Milestone, write status
PlannerReads the derived goal as context when planningEdit a Milestone description, treat an intent line as an instruction on sizing or edges, create a Milestone
PrincipalCorrects a written Milestone's goal or Release: with vinaya milestone edit, as a product call—
Tranche ArchivistCloses the Milestone at tranche close. See Tranche and Milestone close—

The Architect refuses when the goal is absent, when Release: is present but not a version, when ### Tranche intents does not parse, or when asked to cut a task, size a task or read a version from the title.

The hand-off from Architect to Planner carries exactly one field: the intent line, matched by slug. It carries no sizing, edges, traps, agent class, stop conditions, documentation list or status.

Gates

GateWhenRefuses
Milestone shape checkmilestone create and milestone edit, before any GitHub callA missing goal; Release: present but not a version; unparseable ### Tranche intents
Adopt checkmilestone adopt, before any writeAn unknown slug, a slug with no Issues, a missing or closed target, a slug already adopted
issue-milestone-attachIssue edit (Ring 1)On edit, a task Issue whose Milestone is not the one its tranche label resolves to (not checked on create)
Attachment checkmilestone close, before closingAny tranche Issue not attached to the Milestone

No config flag ever turns off the Milestone shape check.

Configuration

KeyEffect
briefSchema.milestone.sectionsExtra sections a Milestone write must carry. Vinaya's own repository does not set it
principalsWho may edit a Milestone's goal

What gets logged

ActLog events
Every milestone * commandoperation · completed
An Architect agent turn, when dispatcheddispatch, role_attempt, usage

There is no pull request to carry the Architect's token count, so it reports tokens wherever it reports back, as Tokens: milestone — Architect — <model> — in/out/cost.

What's next