Skip to main content
Stored under refs/notes/gitvow/<session-id> (gitvow 0.1 used the single ref refs/notes/sessions). First line gitvow-session, then JSON:

attribution

decisions[]

edits_outside_repository (schema 7)

Empty when every edit stayed inside this repository. The gate evaluated those edits; this repository’s note is the only record of them. The schema is additive. New fields may appear; existing fields keep their meaning. Consumers should ignore unknown fields. Schema 9 added owner and unowned to decisions[]; schema 8 added intent and decisions[].intent_covered; schema 7 added observed as an answer and the edits_outside_repository object; schema 6 added to to decisions[]; a note written by an older gitvow reads the same as it always did.

The claim note

Stored under refs/notes/gitvow/claims on the empty commit gitvow claims confirm|reject writes. First line gitvow-claim, then JSON (schema 1): claim_id, verdict (confirmed or rejected), by, authority (speaker when the confirmer is the person who said it, else policy, commit-access or none), decided_at, text (as recorded), original_text (as extracted, verbatim), edited, paths, reach (repo), speaker, kind, source (a pointer: kind, file, message index; never the source content), said_at, classification (the extractor’s opinion), reason. The trailer carries the id, the person, the bound paths and the first 120 characters; the note carries the rest. Person-reach preferences are never written to git; they live in ~/.gitvow/claims/preferences.jsonl on the speaker’s own machine.

The outcome note

gitvow outcomes (0.31) grades each decision-bearing commit by what happened to it and writes the grade under refs/notes/gitvow/outcomes: its own ref, appended beside the decision, never rewriting the session note. First line gitvow-outcome, then JSON: See Did the decision hold? for the grading table.

The rule-decision note

Accepting or rejecting a proposed rule is itself a decision, so it is recorded the way decisions are. gitvow rules accept|reject writes an empty commit carrying the trailer and attaches a note under refs/notes/gitvow/rules — its own ref, because a rule decision is not a session. First line gitvow-rule-decision, then JSON: rules[].evidence[] is the run the proposal rested on, oldest first, at most 8 entries of date, by, answer and sha. It is stored at the moment of the verdict so the record says not only that a rule was accepted but what was in front of the person who accepted it.

Trailers

Added by prepare-commit-msg when .git/gitvow-session.json holds a session id and a pending_commit timestamp younger than five minutes, which the PreToolUse gate sets when the agent runs git commit and PostToolUse clears afterwards. Idempotent: a message that already has Gitvow-Session: is left alone. A note is written only when the commit at HEAD carries the trailer. Gitvow-Accepted, Gitvow-Declined and Gitvow-Referred are written for every finding decided with gitvow decide before the commit, on agent and human commits alike. Gitvow-Open is written for each finding nobody decided, on the agent’s commit once the card has been shown and on a person’s commit directly (policy decisions.mode open; in strict neither commit happens until every finding is decided). Gitvow-Observed is written for each finding an observe-tier rule recorded; it is neither debt nor an answer and never reaches the card. An immediate confirm nobody answered writes nothing: the command never ran. The post-commit hook clears the findings the commit carried. Gitvow-Revisits marks an empty commit written by gitvow revisit; its decision trailers answer the named commit’s findings again. Gitvow-Rule-Accepted and Gitvow-Rule-Rejected mark an empty commit written by gitvow rules accept|reject; answer= says which run the verdict was about, so a later contradicting decision does not inherit it. See Decisions. The grammar grows by new trailer names, never by new tail tokens on a name that has already shipped. Gitvow-Referred and its to= arrived together in 0.16: an older gitvow does not match the new name at all, so it reads the commit exactly as it would have before, which is the safe direction. Adding a token to a trailer that already exists is not safe, and the reason is in the pattern above — the finding is matched lazily and every suffix is optional, so an older parser that does not know the token backtracks it into the finding. Gitvow-Accepted: edit foo.go class=k7 by nikhil would parse on 0.15 as a decision about edit foo.go class=k7, silently forking the identity of every decision that carried it, with nothing anywhere reporting an error. Treat the token set of a released trailer as closed: a new fact belongs in a new trailer name, or in the note, which is versioned and genuinely additive. Within that constraint every part after the finding is optional, so a commit written by any earlier gitvow parses exactly as it did when it was made, and no existing trailer name has changed meaning. Gitvow-Rule-Accepted is deliberately not a Gitvow-Accepted: accepting a rule is not an answer to a finding on that commit, and a parser looking for decisions must not pick it up.