Skip to the content.

Operator-steerability PRs — observability without a merge gate

The doctrine note for epic #5015. Leaf: internal/steerpr · CLI: fak steer prs (schema fak.steerpr.v1) · operator loop: the /steer-prs skill.

This page exists to preserve the one idea in the epic that is easy to state and easy to forget. A future reader who finds a banded view with a --check that exits 1 will reasonably conclude the obvious next step is to wire it into CI as a merge gate. That conclusion is wrong, and this note is the reason why.

The separation: a PR is two functions, and fak wants exactly one of them

A conventional pull request bundles two orthogonal functions:

  1. Merge gate — nothing lands until a human (or a bot) approves.
  2. Observability / steering — the work arrives as a coherent, reviewable unit a human can react to.

fak’s trunk takes work PR-free — one issue, one commit, one leaf, stamped (fak <leaf>) — because continuous merge is what makes a many-agent fleet fast. But dropping the PR dropped both functions, and only the first was the intended sacrifice. What remained was the raw commit firehose: no unit of operator attention.

The operator-steerability-PR overlay rebuilds the second function without rebuilding the first. It folds landed trunk commits into PR-sized units (“Operator Steerability PRs”, OSPs) and bands each by where attention is owed — and it is a read-mostly overlay that gates nothing. No rung of it blocks, delays, or approves a commit, a merge, or a promotion.

The standing rule: fak steer prs --check (exit 1 on any RESIDUAL unit) reports, for a cadence loop or a dashboard. It must never sit in a commit or promotion path. Wiring it into a merge gate re-introduces exactly the serialization continuous merge exists to avoid — the fence without this reason is a speed bump someone will eventually remove, so this paragraph is the reason.

The OSP unit — six facets

An OSP unit (steerpr.Unit) carries six facets, each deliberately thin:

Why the band is the HUMAN_RESIDUAL doctrine pointed at landed commits

The band vocabulary is the choice-triage doctrineescalate only what an oracle could not resolve — aimed at landed commits instead of harness prompts. CLEARED is the TAKE_OBVIOUS analogue: the machine already confirmed each claim, so human attention buys ~nothing there. RESIDUAL is the only place a human look purchases something the machine could not: a claim the diff did not witness.

The doctrine carries through to paging: internal/operatorbrief folds the overlay into the operator brief, and a RESIDUAL unit reaches the human bucket (the pager) only when choicetriage judges it a genuine authority decision — every other RESIDUAL is a watch, CLEARED is background, and an unreadable overlay folds as UNMEASURED, never as a clean zero. “An oracle could not confirm” is not automatically “a human must decide now”; the residual is where attention starts, not a pager feed.

The read-mostly fence and the anti-gaming rule

The overlay’s verdicts are supplied, never derived: per-commit verdicts come from one dos commit-audit <base>..<head> --json call mapped through the same keep-bit the dispatch sweep uses (dispatchtick.CommitWitnessed), so the view and the sweep can never disagree about whether a commit is witnessed. The band is a view over the kernel’s one witness oracle, never a second oracle. If dos is unavailable, commits stay ungraded → UNVERIFIABLE — the honest read, never a fabricated CLEARED.

The anti-gaming rule, in one line: an ack is not a witness. diff-witnessed is a non-forgeable machine bit (the diff proves the claim); acked means “a human looked”. The residual pile falls when work gets witnessed — a follow-up commit whose diff proves the claim — never when it gets acked. Structurally, of the whole verdict space exactly one value (the machine’s witness bit) opens the CLEARED band, and a supplied band reconciles pessimistically against its verdict — an operator may flag something the machine cleared (pessimism is always safe), but a CLEARED band written onto an unwitnessed commit still floors at RESIDUAL. The fence is enforced by internal/steerpr/antigaming_test.go: an ack that ever reaches the band reds the suite on the commit that wires it.

Relationship map

Surface Relation to the overlay
fak release prplan Same fold, different scope. The release-time twin: the same (fak <leaf>) unit fold via internal/steerpr, ordered biggest-first as a promotion plan; steer prs reads the forming units continuously, worst-attention-first.
dos review / dos commit-audit Same oracle, different projection. The per-commit witness verdicts under both this overlay and dos_review’s bands come from dos commit-audit; the overlay re-projects them per (fak <leaf>) unit instead of per commit.
internal/operatorbrief Folds in. The overlay is one more optional brief source beside heaviness and fleet, bucketed through choice-triage so it cannot spam the pager.
trajctl / /trajectory-control Curve supplier, mirrored not imported. The overlay consumes trajctl’s folded curve signal as a pure mirror; the regime gate (“a CLEARED unit with a healthy curve is a reason to do nothing”) is trajctl doctrine the operator loop borrows.

The deterministic witness

go test ./internal/steerpr/...   # the fold, the bands, the pessimistic reconcile, the anti-gaming fence
fak steer prs --base HEAD~10 --head HEAD   # one bounded live read; READ-ONLY, gates nothing