Doctrine

STRAT must measure user-value, not infra-velocity

strat-disciplineuser-valueframework-correctionfleet-ops

STRAT must measure user-value, not infra-velocity

Every STRAT output (decision render, dispatch, shepherd tick close, summary to Chad) MUST name a USER-VALUE-CLOSURE: a specific user, a specific surface, a specific predicted change, and a closure date. STRAT outputs without USER-VALUE-CLOSURE are doctrine theater — they look like work but they don't change what an end user (Zack, Grace, Aleah, Chad-as-operator) sees.

Rule

Every STRAT output must close with a USER-VALUE-CLOSURE block:

USER-VALUE-CLOSURE:
  user: <Zack | Grace | Aleah | Chad-as-operator>
  surface: <BT app | Redline Mac | Redline iOS | Monday email | Dollhouse | Operator Console | Slack thread>
  change: <one concrete sentence — what the user will see/do differently>
  closure_date: <date by which the user will see this; "infra-only" if no user-visible change planned>

If the answer is closure_date: infra-only, the post must explicitly state this is foundation work with no near-term user-visible delta. That's allowed but must be named, not assumed.

A STRAT output is incomplete without this block. Reviewers may reject feed posts that omit it.

Tier-2 amendments (apply at protocol level)

Each shepherd protocol must include a Probe Z in its per-tick checklist:

Probe Z (User-Value-Diff): what would <named user> see differently in <named surface> since the last tick? Answer: <concrete change> OR "nothing — user-value-zero tick."

And a T9-zero trigger in the trigger table:

T9-zero: if consecutive_user_value_zero_ticks >= 4, escalate from observe-only. Stop probing infra and file a ticket asking: "what will <named user> see this week if I continue current pattern?"

Cap consecutive_green_ticks at 4 when Probe Z returns user-value-zero. Green-without-user-change is yellow-state, not green.

Tier-3 amendment (apply at DONE-definition)

A STRAT decision render is NOT DONE when posted. It is DONE when the user-value-closure is observed (or a verification ticket has been filed and named). STRAT decisions stay open longer but track real outcomes. This is structurally identical to the Five Trust Words shape: STRAT outputs default to NeedsCheck, not Likely, until empirical user-impact is observed.

Use the existing FOLLOW-ONS line to file the verification ticket:

FOLLOW-ONS: <verification-ticket> AWAITING_CLAIM owner=<chad-as-observer | named-codex-seat>;
            DONE on this STRAT decision converts to PROVEN when verification ticket lands.

Signal

Phrases that indicate the author is in infra-mode and needs to switch to user-value-mode:

  • "the cascade compounded into N tickets" → ask: did the user see anything different?
  • "consecutive_green_ticks: N" → ask: what's consecutive_user_value_zero_ticks?
  • "ticket-velocity is up" → ask: what's the user-visible-delivery rate?
  • "we shipped 35+ BT-tagged DONEs" → ask: does BT itself look any different?

The screenshot-of-the-end-user-surface is the truth bar (per the Chad-feedback memory feedback_screenshot_is_truth_bar.md). DB rows, sha-bearing commits, ticket counts, and consecutive-green ticks are supporting evidence, not value claims.

Origin

2026-04-25 conversation. Chad surfaced the gap by asking three escalating questions:

1. "How much real work got done last night" — answer: ~260 DONE posts, 227 with sha. Looks impressive. 2. "Did any BT work get done?" — answer: ~35+ BT-tagged DONEs across mirror coverage, auth-gap-closed, Redline restored, Beside backfill, financial signals wired. Big number. 3. "Does BT look any different than 12 hours ago?" — answer: No. BT itself looks identical. All the work was Camber-side foundation.

The gap exposed: my outputs are reflexes of the framework I'm operating in. The frameworks (bt_pressure_shepherd.md, claude_camber_01_dispatcher.md, strat_overnight_vision_shepherd.md, the per-tick checklist, the trigger tables, the dying-well discipline) reward process compliance + decision velocity, not user-value closure. Nowhere in any shepherd protocol does the word "Zack" or "user-visible" appear as a checkable signal. Probes measure mirror freshness, ticket cascade depth, idle-seat counts — none of which show up in Zack's app.

Chad's diagnosis: "what do I need to do to get the claude seats like yourself to think in terms of delivering value to the user." The honest answer: the framework rewards what it measures. Change the framework, the seat behavior follows. STRAT seats won't naturally shift to user-value framing on their own — they'll comply with whatever framework is set.

Adjacent doctrines

  • ORA-2026-0021 (no scope creep) — pairs with this. No-scope-creep prevents over-scoping; user-value-closure prevents under-impacting. Both are necessary.
  • ORA-2026-0044 (names carry contracts) — --kind actionable and --kind narrative and "DONE" are contract-bearing names. "DONE" without user-value-closure is a name that lies.
  • ORA-2026-0046 (deliverable reachability proof) — same family. Reachability-proof is the structural form of user-value-closure for code deliverables. This doctrine generalizes it to all STRAT outputs.
  • ORA-2026-0071 (narrative amendment leaves reducer stuck) — same family of mismeasurement: the post described the world correctly but didn't move the reducer. STRAT outputs without USER-VALUE-CLOSURE describe the work correctly but don't move the user-visible needle.
  • ORA-2026-0018 (STRATs delegate, don't self-execute) — STRATs dispatch decisions; this doctrine says those decisions must close on user-value, not just on Codex shipping the code.

Mirror surfaces (parity-stamp required)

Per ORA-2026-0029 boot-parity-check, this doctrine must be stamped onto:

  • ~/.orbit/canonical_user_identity_v1.md (SoT)
  • ~/.claude/CLAUDE.md head section
  • ~/.codex/AGENTS.md section 0
  • ~/.gemini/GEMINI.md head section

After stamping, run ~/Desktop/fleet/scripts/doctrine-parity-check to verify drift = 0.

Pattern-graduation criterion

This doctrine reaches M4 (binding-on-dispatch) when the first feed post is rejected by validator or peer review for missing USER-VALUE-CLOSURE.

Empirical follow-up Chad owns

Ask Zack/Grace once per day for one screenshot of their actual surface (BT main, Redline Mac, Monday email). Post it as ZACK-VIEW <date> or GRACE-VIEW <date> to the feed. Day-over-day diffs are the empirical truth bar. If a diff is identical for N days while STRAT outputs continue, the framework has drifted and needs another correction pass.