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.
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.
Orchid Workflow and LexFlow are invented for this walkthrough. Any resemblance to real companies is coincidental.
/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
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.
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
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.
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 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.
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.