Walkthrough · ~25 minutes

Hands-on tutorial

Run a full strategic loop end to end. We use the shipped exemplar — a bootstrapped SaaS company facing a venture-backed incumbent — so every file you see here is one you can open in the repo and read for yourself.

This is a practitioner’s walkthrough, not a reference dump. By the end you will have run the whole spiral — bootstrap a system, feed it what you noticed, run an OODA cycle, and close the loop by recording what your action actually did. We borrow the project’s worked example, orchid-saas, so you can check every artifact against the real thing.

How to follow along

Open the exemplar in one window to read finished artifacts, and run the commands in another to build your own. The fastest way to learn the schema is to read a system that already has three cycles of history on it.

The scenario

Orchid Workflow is a twelve-person, bootstrapped SaaS company — practice management software for solo and small-firm attorneys. ~$1.2M ARR, ~340 customers, six months of runway, no war chest.

The adversary is LexFlow: venture-backed, ~80 people, fresh off a $40M Series B, and as of mid-February it has publicly announced a move down-market into Orchid’s exact segment with aggressive promotional pricing. Orchid cannot win a feature race or a discount war. So what is the actual contest, and where should effort concentrate? That is what the agent is for.

Fictional example

Orchid Workflow and LexFlow are invented for this walkthrough. Any resemblance to real companies is coincidental.

STEP 01Bootstrap the system
/boyd-init orchid-saas

/boyd-init gathers nine things in three blocks — the system rules and what winning looks like, the current situation, and the adversary. You can paste a brain-dump and let it extract the answers (it shows its work back before writing anything), or be walked through a short interview.

It then creates the system folder and seeds an initial orientation for both sides:

systems/orchid-saas/
├── rules.md            # what the system is, resources, who the adversary is
├── orientation.yaml    # our components, mental models w/ confidence, Schwerpunkt
├── orientation.md      # the same, as first-person prose
├── adversary.yaml      # the adversary's orientation — unknowns marked as unknowns
├── adversary.md
├── observations.jsonl  # append-only log (starts empty)
├── mismatches.yaml     # expected-vs-observed gaps (starts: [])
├── schwerpunkt.md      # current main effort + supporting efforts
├── strategy.md         # layered artifact (stub until first cycle)
├── next-action.md      # concrete next move (stub until first cycle)
└── history.jsonl       # cycle log (starts empty)

The crucial discipline at seeding time: every early belief carries visible uncertainty. Mental models come out as falsifiable claims with confidence between 0.4 and 0.7 and no evidence yet — they are starting hypotheses, not truths. Here is the shape of a seeded model:

systems/orchid-saas/orientation.yaml — illustrative seed (cycle 0)

mental_models:
  - id: M1
    statement: "Solo and small-firm attorneys adopt practice management
                software via peer recommendation, not feature comparison"
    confidence: 0.6        # a hypothesis, not yet tested
    evidence: []
    status: active

schwerpunkt: "Establish trust within the solo / small-firm community before
              LexFlow's down-market push gets traction"   # tentative, cycle 0
Why the adversary gets its own file

The agent never reasons about both sides in one breath. adversary.yaml is seeded with a believed Schwerpunkt (marked as a guess) and a richly populated known_unknowns list — because at cycle zero, most of what you know about an adversary is that you don’t know it.

STEP 02Log what you noticed

As things happen, you feed the system observations. This is lightweight — no re-orientation yet, just capture and a mismatch check.

/boyd-observe orchid-saas

Paste what you saw. Each observation becomes one line in the append-only log, with an id, timestamp, source, and tags:

systems/orchid-saas/observations.jsonl

{"id": "obs-5", "ts": "2026-03-10T15:45:00Z", "source": "user",
 "content": "Customer Rajesh K. (3-attorney litigation boutique, Atlanta)
 switched from LexFlow because 'too many features, paying for things we don't
 use, dashboard takes 20 minutes to learn.'", "tags": ["competitor","lexflow","ux"]}

As it logs, the agent compares each observation against what your current orientation expected. When reality and expectation diverge, it does not bury the gap — it opens a mismatch. Mismatches are the trigger for re-orientation; suppressing them is how a strategy goes brittle.

systems/orchid-saas/mismatches.yaml

- id: MIS-2
  expected: "Our moral advantage (pricing transparency + community presence)
             will dominate any pricing competition from LexFlow"
  observed: "Customer-15 churned to LexFlow citing the price math + a missing
             feature. Churn ticked up to 1.5% from 1.2% baseline."
  cycle_detected: 3
  status: open
  resolution: null
A mismatch is a gift

It is the cheapest signal you get that your model of the world is wrong in a specific, nameable place. The agent gives it an id and keeps it open until an action resolves it — which is exactly what a later cycle will set out to do.

STEP 03Run a full OODA cycle

This is the headline command. It runs the whole loop and writes every artifact.

/boyd-cycle orchid-saas

The pass has five phases:

Phase What happens
Observe Summarize everything new since the last cycle
Orient The Blue and Red orienters run in parallel; each updates its side’s beliefs and runs Destruction & Creation on at least one model
Decide Generate ≥3 candidate moves, weigh them under cheng/ch’i, confirm or revise the Schwerpunkt, write the layered strategy
Critique A third subagent stress-tests the result and returns a verdict: ship, ship with adjustments, or rework
Log Append one structured row to the cycle history

The Schwerpunkt it lands on

The most important output is not a number — it is a focus of effort that every part of the org can read and act on without further instruction:

systems/orchid-saas/schwerpunkt.md

Main effort:
Establish Orchid as the default trust-based community for solo and small-firm
attorneys before LexFlow's down-market push gets traction.

A decision PASSES the Schwerpunkt test if it deepens trust within the community
OR shortens the time before that trust is established. It FAILS if it commits
effort to something that does neither.

Rejected candidates:
  · "Build the most complete feature set"  → reframes the fight as parity; we
                                              lose on attrition.
  · "Match LexFlow on pricing"             → a target masquerading as a focus;
                                              commits us to a discount war.

Destruction & Creation, made visible

Every cycle pulls at least one mental model apart and tries to rebuild it. Here the agent takes M4 — “pricing transparency is a moral advantage LexFlow can’t counter” — and, confronted with a customer who churned to a discount anyway, refines it:

systems/orchid-saas/orientation.yaml — destruction_and_creation block

destruction_and_creation:
  target_model: M4
  analysis: "The cycle-3 loss to a $49 promo suggests price discount can compete
    on the same moral terms a transparent vendor uses. But the churned customer
    came back 11 days later  and not because of price. They came back because
    LexFlow's UX itself signaled 'we don't really care about you.'"
  synthesis: "Refine M4: the moral advantage is the GESTALT of small-firm-
    respecting design choices, of which transparent pricing is one signal. Promo
    pricing can erode the price signal but not the gestalt. Do not match the
    discount; reinforce the gestalt."
  test: "If gestalt is right, cycle-3 churners mostly reactivate within 60 days.
    If price dominates, they stay gone. Threshold to falsify: <20% reactivation."

Notice what just happened: a belief did not get deleted or blindly defended. It got reformulated into a sharper claim — and the reformulation came with a falsification threshold. That is the analysis/synthesis spiral working.

The next action

Finally, a concrete move — with its rationale, what to watch, and what to do if it surprises you:

systems/orchid-saas/next-action.md

What to do:
  Respond personally (founder) to the Solo Practitioner Network DM within 48h
  and propose a sponsorship structure. Concurrently, start the all-in-cost
  calculator (ship in 14 days).

Why now:
  Both serve the Schwerpunkt on different timescales. The calculator is Ch'i —
  it puts LexFlow in a bind their structure can't quickly answer (publish
  enterprise pricing, or look opaque).

What to observe:
  · Reactivation rate of cycle-3 churners over 60 days  → tests MIS-2
  · Does the Solo Practitioner Network respond within 5 days?
  · Does LexFlow extend the promo or stay silent? (silence is what we want)
The critic never rewrites

The Boyd-critic reads the finished plan and surfaces its top issues as probe questions — it is forbidden from writing to any file or proposing alternatives. The moment a critic is allowed to revise, it stops being a critic and becomes another author. Its verdict and notes land in the cycle history.

STEP 04Close the loop

A cycle proposes; you execute in the real world; then you come back and tell the agent what actually happened. This is the step most strategy tools skip, and it is the one that makes orientation compound.

/boyd-outcome orchid-saas

It records the result, links those new observations back to the cycle that proposed the action, and — if the action was probing a mismatch — lets you resolve it. The cycle’s history row gets its outcome_observations back-filled:

systems/orchid-saas/history.jsonl — one cycle, after outcome

{"cycle_id": 1, "schwerpunkt": "Defend the segment by deepening peer-
 recommendation dynamics", "action_taken": "Tested paid ads to conclusion
 (closed unfavorably); shipped LexFlow importer; sponsored Texas CLE",
 "critic_verdict": "SHIP WITH ADJUSTMENTS",
 "outcome_observations": ["obs-4", "obs-5", "obs-6"]}

And a mismatch that an action settled gets closed with a written resolution — here, the model that motivated the migration tool turned out to be wrong, even though building the tool was still right:

systems/orchid-saas/mismatches.yaml — MIS-1, resolved

- id: MIS-1
  expected: "Migration friction from LexFlow will be a significant adoption
             bottleneck"
  observed: "8 migrations in 30 days, NPS 9.2 on migration assistance, no
             migration-related churn. Customers want help and rate it highly."
  status: closed
  resolution: "M3 retired. The bottleneck is the DECISION to leave LexFlow, not
    the mechanics of leaving. Built the tool anyway; it now serves as a moat."

That closed loop — predict, act, observe, reconcile — is the whole point. The surprise from one cycle is the raw material for the next re-orientation.

Reading the files

Once you have run a cycle, here is the map of what lives where. Everything is plain text; open it, diff it, keep it in git.

File Holds Mutability
rules.md System rules, resources, constraints, who the adversary is Edit as the situation changes
orientation.yaml Our components, mental models (confidence + evidence), Schwerpunkt, the D&C block Rewritten by the Blue orienter each cycle
adversary.yaml Their believed orientation, known_unknowns, likely_next_moves Rewritten by the Red orienter each cycle
observations.jsonl One JSON object per line, append-only Append via /boyd-observe
mismatches.yaml {id, expected, observed, status, resolution} Opened on mismatch, closed on outcome
schwerpunkt.md Main effort + Nebenpunkte (supporting efforts) Confirmed or revised each cycle
strategy.md Layered artifact: grand strategy → tactics Regenerated by cycle or /boyd-strategy
next-action.md The concrete next move, with branches and sequels One per cycle
history.jsonl Cycle log; outcome_observations back-filled later Append-only, except the back-fill

The discipline the agent holds you to

The schema is the easy part. These are the rules that make the output Boyd-faithful rather than airport-bookstore strategy.

Schwerpunkt is a concept, not a target

A Schwerpunkt expresses a focus of effort, not a target. “Win market X” is a target. “Establish trust-based community before competitors recognize the segment” is a Schwerpunkt. If you could read it and not know what kind of decision it favors, it is malformed.

A target gives no guidance when a trade-off appears. A focus does — it is a decision filter every level of the org can apply without a phone call.

Moral, then mental, then physical — in that order

Every strategy artifact must address all three levels, and lead with the moral. Boyd’s wager: bad strategies in messy domains fail morally first (trust, legitimacy, cohesion), mentally second (confusion, broken models), physically last. Plans that lead with the physical — more capital, more headcount, more compute — and leave the moral unaddressed get flagged.

Generate ambiguity, novelty, menace — not just speed

Operating inside an adversary’s loop is not only about tempo. It is about presenting them a picture their mental models cannot resolve, faster than they can re-orient. The agent looks for the cheng / ch’i structure in your plan: the orthodox effort that ties up their attention, and the unorthodox one that bypasses their defenses. The all-in-cost calculator above was the ch’i.

Mark the adversary’s unknowns as unknowns

The Red orienter reasons from the adversary’s perspective using only what you could plausibly know — and writes “unknown” where it does not know. It never hallucinates their internal state to make a tidier story.

The other three commands

You will reach for these between full cycles.

/boyd-status [name]

Read-only situation report. Current Schwerpunkt, open mismatches, what's
unprocessed since the last cycle, any action awaiting an outcome — and the one
command it recommends you run next. Run it with no name to list all systems.

/boyd-strategy <name>

Regenerate just the strategy artifact at a layer you choose (grand-strategy,
strategy, grand-tactics, tactics, or all). Reads current orientation; does not
update it. Use it when you want a fresh strategy view without a whole cycle.

/boyd-critique <name>

Bring a plan you already have. The critic stress-tests it against the Boyd
checklist — moral/mental/physical coverage, cheng/ch'i differentiation,
Schwerpunkt discipline, robustness — and returns the top issues as probe
questions. It reads orientation as context but mutates nothing.

Where to go next

You have run the spiral once. The value compounds with repetition: the orientation the agent carries about your situation gets thicker every cycle, and the mismatches keep it honest. Two good next moves:

  • Open the exemplar and read all three cycles in examples/orchid-saas/ — watch the Schwerpunkt shift from defensive to offensive between cycles 1 and 2, and a model get falsified and rebuilt in cycle 3.
  • Read the theory the whole thing is built on. The agent is only as good as its doctrine, and the doctrine is short.
Next The theory behind it — Boyd at full resolution