Docs

Thinking

Readiness and the frozen brief

Read the code before you write, state every code fact as a checked premise, check dispatch readiness, recheck the facts at dispatch, then freeze the brief by its digest. A frozen brief is versioned, never edited.

Readiness step
Premises
Dispatch gates
Frozen brief
Intent

About readiness and the frozen brief

Four steps turn an author's understanding into a frozen Intent:

StepWhenWhat it guarantees
Readiness stepBefore any Issue is writtenThe author read the code, the docs and the prior decisions, and raised open questions instead of guessing
Checked factsAt the Issue writeEvery claim about code is a typed premise the write checks, never prose
Dispatch readinessBefore dispatch, and at first pushThe Issue exists, dependencies are merged, no conflicting sibling is open, the render is complete
Frozen briefAt dispatchThe Issue is rendered against the current tree, facts are checked again, and the brief is posted once with its digest. Later changes are new versions

The rule behind all four: an assertion about code, scope, history or a dependency is either a typed fact field, or it is rejected at the write. Prose may explain; it may not claim.

The frozen brief is the Vinaya Intent: the brief digest, plus the objectives version, plus the ruling ordinal (see Overview and the Glossary).

Every guide runs these steps. See Deploy medium work or Deploy backlog issues.

How it works

  1. 1

    The readiness step

    A hard stop before a single task is sized. The Planner states it at the top of the planning pass: "Readiness: I have X, Y, Z; I verified I can read A, B; unresolved: …".

  2. 2

    Checked facts

    Every claim about code goes into ## Premises as a line the write can check.

  3. 3

    Dispatch readiness

    Before vinaya task brief or vinaya task run, four dispatch gates must pass.

  4. 4

    Recompute and freeze

    The brief is rendered, every premise is checked again against the default branch, and the brief is posted as a frozen comment on the Issue.

1. The readiness step

Nine inputs must be confirmed. The step stops when any one fails.

#InputStop when
1The intent is clear and boundedIt is vague
2Every project in scope is identified, and its specs, skills and docs are readA spec exists but cannot be read
3The code to dig into is readableA path cannot be read
4Shared packages can be inspected and their consumers listedConsumers cannot be listed
5Relevant prior decisions are known (the decision-record folder is read)Sources are unreachable, or a record would be reversed without the Principal
6Every Project: resolves in .vinaya/projects.md, each row quotedA name is unregistered
7Open ambiguities are put to the Principal before planning—
8No finished but unarchived prior tranche on a product in scope (except a tranche this plan supersedes)A prior tranche has zero open Issues and is not archived
9Every consumed input has a named source: a default-branch path, a Depends-on task, or a path and digest the Principal suppliedNo source exists

2. Checked facts (premises)

A premise is one line in ## Premises:

`<path>` contains `<text>`

The path is repository-relative and inside the repository. The only predicate is contains.

FormChecked at Issue writeChecked at dispatch
`<path>` contains `<text>`Yes, against the author's checkoutYes, against the head of the default branch
after #<n>: `<path>` contains `<text>` (pairs with Depends-on: #<n>)No: the code does not hold it yetYes

The rendered brief lists premises under their own heading, so the Developer reads them as checked facts.

3. Dispatch readiness

Before vinaya task brief or vinaya task run, four dispatch gates must pass:

  1. The Issue exists.
  2. Every depends-on task's pull request is merged to main.
  3. No conflicts-with task has an open pull request.
  4. The render is complete. If not, it names the missing fact.

vinaya task run checks gates 1 to 3 again itself. To run the check on its own and see which condition fails:

vinaya check dispatch-readiness

4. Fact recompute and freeze

Freezing a task runs these steps, in this order:

  1. 1

    Check the identity

    Refuses unless the gh identity is on the Principal allowlist.

  2. 2

    Render the brief

    Renders the brief from the Issue and the tree. Any gap refuses and posts nothing. The render checks every premise again, deferred ones included, against the head of the default branch.

  3. 3

    Check the body

    Runs the same Issue write gate as issue create over the live body.

  4. 4

    Refuse a second brief

    Refuses if a frozen brief already exists, unless --supersede is given.

  5. 5

    Post

    Posts the comment.

The frozen brief

PropertyValue
HomeA comment on the task Issue. Never the Issue body, never the pull request body, never a committed file
First versionMarker <!-- aeg:brief:v1 -->, then Brief hash: <sha256>, then the brief
DigestThe sha256 of the brief text plus a trailing newline
Later versionsMarker <!-- aeg:brief:v<k> --> (k = predecessor + 1), Brief hash: …, Supersedes: <predecessor url> — <reason> on a single line, then the brief
MutabilityNever edited or deleted. A plain second post refuses and names the existing brief
ReaderEvery reader uses the newest version authored by a Principal

Changing a frozen brief

A frozen brief is never edited. Each change below makes a new Intent version.

Posts a new aeg:brief:v<k> comment naming its predecessor.

vinaya task brief <tranche> <n> --supersede --reason <text>

For a backlog Issue, use --issue <n> instead of <tranche> <n>.

After freeze, vinaya issue edit refuses any change to the frozen sections (check issue-frozen-brief). The error points to issue objectives edit for objectives. ## Surface, ## Parts and ## Documentation have no self-serve path and go back to the Planner.

Roles

RoleDoes
PlannerRuns the readiness step in every lane; writes premises; runs the dispatch act and confirms the render
PrincipalPrepares (freezes) a task; any identity not on the Principal allowlist is refused. Edits objectives after freeze. Posts rulings. Performs the readiness step in person for a hot Issue (planned)
HarnessChecks premises at write, checks them again at dispatch, pins the brief by digest
OperatorMay run issue create --validate-only. Never edits an Issue or widens a Surface

Gates

GateRing and whenRefuses
Premise checkIssue writeA due premise the checkout does not hold
dispatch-readinessRing 0 at push, Ring 1; task runA missing Issue, an unmerged dependency, an open conflict, a failed rationale
first-push-dispatchRing 0, at the first push of a task branchA first push whose dependencies or conflicts are not clear. Same derivation; passes if the forge is unreachable
Fact recomputeAt dispatch, inside the renderA premise the default branch no longer holds. The brief does not freeze
issue-frozen-briefIssue edit after freezeA change to a frozen section
pr-premise-reassertRing 0 at commit, Ring 1A Premise: pin in the pull request that the repository no longer satisfies

Configuration

KeyEffect
principalsWho may freeze a brief, edit objectives and rule
gateCutoversThe Issue numbers from which the objectives and brief-section rules apply
briefSchema.issue.sectionsThe builtins the write gate runs at write, and again at freeze
reviewPolicyIts blocking thresholds feed the policy digest bound beside the brief hash

What gets logged

ActLog events
task brief, task run, issue objectives edit, pr ruleoperation · completed
A failing dispatch-readiness rungate · checked, gate · summary
The loop starting after freezedev_review_loop · loop_started (Executing)

Every Log event carries input_versions: the brief digest, objectives version, ruling ordinal and policy digest. See Events.

What's next