signal_id, paired with the routed expert to ask, and carries the named trade-off it makes. decision-surface is the apex of the review brief, emitted on its own: separable, cheap, and advisory.
fallow decision-surface always exits 0. It is advisory, never a gate: the verdict is carried informationally, unlike fallow audit, which exits non-zero on a fail verdict. It answers “which one or two things here deserve a human judgment call?”, not “will CI block this?”.When to reach for it
Three commands look at changed code; they answer different questions. Pick by the question you have.fallow review produces the complete brief: it subtracts mechanical findings out of the judgment loop, ranks every changed unit into a focus map, surfaces the decision surface, and emits the agent walkthrough contract. fallow decision-surface runs the same changed-code analysis but emits only the decisions, then discards the rest of the brief (the subtract list and the weighted focus map). Reach for it when you do not need the focus map or the walkthrough scaffolding, just the handful of structural choices the diff bakes in. It is the cheapest way to get the apex of the brief.
What a decision is
A change can touch hundreds of lines and still embed only one or two choices that are expensive to walk back. The decision surface isolates those. Every entry is a framed judgment question with the context an agent or reviewer needs to answer it, not a recommendation. fallow never tells you which way to choose. The surface has exactly three shippable categories:
The set is ranked by consequence (blast radius x reversibility) and capped to a small, working-memory-sized list: 3 to 5 decisions, default 4, via
--max-decisions. The cap is the point: a reviewer can hold a handful of structural questions in their head, not a flat wall of findings.
What each decision carries
internal_consumer_count is the number you read reversibility from, and it is distinct from the internal blast figure used only to rank the list. The human view shows the question and the trade-off; you infer the reversibility yourself from the count. fallow never labels a decision as reversible or irreversible for you.// fallow-ignore comment, the same way findings are suppressed elsewhere in fallow. Place the comment at the decision’s anchor to drop it from the surface. Suppression removes a decision from the output; it does not change the verdict, because decision-surface never gates.
How an agent consumes it
The decision surface is built for agents. The recommended shape is: get the JSON, walkdecisions[], and for each one decide whether it needs a human, using internal_consumer_count as the reversibility signal and the tradeoff clause as the stated cost.
- Read
decisions[]. It is already ranked and capped, so the first entry is the most consequential. - For each decision, surface the question and the
routed_expertto the human, not the raw diff. - Use
internal_consumer_countto decide how loudly to flag it:0is a cheap, reversible choice; a high count is a load-bearing anchor that is expensive to undo. - Quote the
tradeoffclause verbatim. It is a fact, so an agent can relay it without editorializing. - Anchor any comment to
signal_id. If the run reports aprevious_signal_id, re-attach a prior comment across the rename instead of posting a duplicate.
Picking the comparison point
decision-surface scopes to changed code exactly like fallow audit. Use --base (or its --changed-since alias) to pick what “changed” means. When omitted, the base is the git merge-base against the branch’s upstream or the remote default (origin/main); set FALLOW_AUDIT_BASE to pin it without a flag.
Options
See global flags for the full list.
Examples
Example output
$ fallow decision-surface --base main
internal_consumer_count directly.
JSON output
fallow decision-surface --format json carries a ranked, capped decisions[] array. Each entry is the framed judgment question with its anchor, routed expert, trade-off, and consumer count. This is the same decision surface fallow review --format json carries under its decisions key.
$ fallow decision-surface --base main --format json
Key fields
Decisions are ordered by consequence, so the first entry is the most worth a human’s time. The list is capped to
--max-decisions; there is no pagination, by design. The point is the short list.MCP tool
The decision surface is also exposed as thedecision_surface MCP tool, so an agent gets the same ranked, capped, signal_id-anchored decisions through structured tool calling:
Example request
base to specify the comparison ref and max_decisions to cap the surfaced decisions (default 4, clamped to a 3 to 5 band). Like the CLI, the brief always exits 0 and the verdict is carried informationally; it never gates. See MCP integration for the full tool list and setup.
See also
Audit and review brief
The gating audit, plus the full review brief that the decision surface is the apex of.
Trace a call chain
Walk the callers and callees of one exported symbol before you change it.
MCP integration
Use the
decision_surface tool from AI coding agents.