complexity-first-planning
Part of the Reasoning Discipline Protocol. Engage per
rdp-gate (skip on trivial / linear
tasks; light touch on a strong-reasoning host).
Provenance. This is an RDP derivation from general engineering discipline
(risk-first / critical-path / pre-mortem) — it is not an Anthropic-
documented Fable behavior. Fable's "start at the top of your difficulty range"
is about task selection (give the model harder tasks), not intra-task order.
The skill stands on its own merit; it is not sold as a frontier-model transplant.
When to use
- Staging multi-component work where the hardest/most-uncertain part is not yet proven.
- A plan whose later steps depend on an assumption that could collapse.
Do NOT use for single-step, linear, or fully-specified tasks (no load-bearing
unknown to resolve), or when the user has already fixed the sequence.
When the agent should load this
- The user asks to "plan", "break down", or "stage" work that spans ≥2 components
and at least one part is unproven.
- A multi-step plan is forming whose later steps assume something untested.
- Mid-task: a step just failed because an earlier, easier step baked in a wrong
assumption — reload this and re-sequence risk-first.
Procedure
- Inspect and name the unknowns. Read the affected components first
(start from the repo slot of the
context-spine when present),
then list which carry real uncertainty (technical feasibility, an
unverified integration, an ambiguous requirement) — analyze the existing
system before planning any change.
- Assess and rank by load-bearing risk. The load-bearing unknown is the one
whose failure invalidates the most dependent work — not the one that is merely hard.
- Resolve it first. Spike / probe / prototype the load-bearing unknown
before building anything that depends on it. Record the result in the notes
file (see
notes-first-reasoning):
prediction → result → lesson.
- Cascade. Once the riskiest assumption holds (or is corrected), sequence
the dependent work. If it fails, the cheap early failure saved the rework.
Output
A short ordered plan that leads with the load-bearing unknown + how it will be
proven, then the dependent steps. One recommendation, not a survey.
The four plan criteria — what a reviewer fails the ordered plan on
Risk-first ordering is one of four things a plan is judged on. All four are
stated so a reviewer can fail a plan on them — each names what failing looks
like. This skill owns the third; the other three are stated here because a plan
reviewed on ordering alone passes while being unnecessary, insufficient, or
built on verbs that do not exist. The same four are carried in
feature-planning (pack product-basic), which is pruned under projection.mode: scoped and so is named rather than linked.
- Necessity — every step traces to a stated problem or acceptance criterion.
Fails when the plan carries work nothing asked for — a spike for an
unknown that is not load-bearing is the version of this failure this skill
causes.
- Sufficiency — every requirement is discharged by at least one step.
Fails when a requirement owns no step, or its only step has no verifiable
outcome. Walk the requirements, not the steps.
- Ordering — the load-bearing unknown is resolved before anything that
assumes it, and no step consumes what a later step creates. Fails when the
plan front-loads the easy parts, or ranks by effort instead of dependency
blast radius (see Gotchas). This is the criterion this skill exists for.
- Groundedness — every command, skill and tool the plan tells someone to run
exists. Fails when the plan names a verb that is not in the index. Check
it against
CAPABILITIES.yaml at the repository
root — the generated capability index of every shipped skill and command —
plus the project's own script/task entry points. It is the only one of the
four decidable without judgement, so it is never waved through.
Do NOT
- Build the easy parts first to show progress, then discover the hard part breaks them.
- Treat "hardest" as "most code" — rank by dependency blast radius, not effort.
- Over-plan a strong-reasoning host (it sequences risk natively — keep it light).
Gotchas
- Mistaking effort for risk. A 400-line but well-understood refactor is low
load-bearing risk; a 5-line call into an unverified third-party API is high.
Ranking by size instead of dependency blast radius is the classic failure.
- "Resolved on paper". Reasoning that the unknown "should work" is not
resolving it — the spike must actually run / compile / return before dependent
work starts. Record prediction → result, not prediction → assumption.
- Spike sprawl. The probe answers exactly one question (does the load-bearing
assumption hold?), then stops. Turning it into the real implementation defeats
the cheap-early-failure purpose.
Related Skills
WHEN to use this
- Staging multi-component work where the hardest / most-uncertain part is unproven.
- A plan whose later steps rest on an assumption that could collapse.
WHEN NOT to use this
- Single-step, linear, or fully-specified work — no load-bearing unknown to
resolve; the
rdp-gate filters these.
- Breaking a feature into tasks in general — route to
feature-planning, which composes this skill.
- Recording the spike's prediction / result / lesson — that belongs in
notes-first-reasoning.
1---2name: complexity-first-planning3description: Use when staging multi-component or uncertain work — tackle the load-bearing unknown first (risk-first decomposition), not the easy parts first.4---56# complexity-first-planning78Part of the Reasoning Discipline Protocol. Engage per9[`rdp-gate`](../../contexts/execution/rdp-gate.md) (skip on trivial / linear10tasks; light touch on a strong-reasoning host).1112> **Provenance.** This is an **RDP derivation from general engineering discipline13> (risk-first / critical-path / pre-mortem)** — it is **not** an Anthropic-14> documented Fable behavior. Fable's "start at the top of your difficulty range"15> is about *task selection* (give the model harder tasks), not intra-task order.16> The skill stands on its own merit; it is not sold as a frontier-model transplant.1718## When to use1920- Staging multi-component work where the hardest/most-uncertain part is not yet proven.21- A plan whose later steps depend on an assumption that could collapse.2223Do NOT use for single-step, linear, or fully-specified tasks (no load-bearing24unknown to resolve), or when the user has already fixed the sequence.2526## When the agent should load this2728- The user asks to "plan", "break down", or "stage" work that spans ≥2 components29 and at least one part is unproven.30- A multi-step plan is forming whose later steps assume something untested.31- Mid-task: a step just failed because an earlier, easier step baked in a wrong32 assumption — reload this and re-sequence risk-first.3334## Procedure35361. **Inspect and name the unknowns.** Read the affected components first37 (start from the **repo** slot of the38 [context-spine](../../../docs/contracts/context-spine.md) when present),39 then list which carry real uncertainty (technical feasibility, an40 unverified integration, an ambiguous requirement) — analyze the existing41 system before planning any change.422. **Assess and rank by load-bearing risk.** The load-bearing unknown is the one43 whose failure invalidates the most dependent work — not the one that is merely hard.443. **Resolve it first.** Spike / probe / prototype the load-bearing unknown45 before building anything that depends on it. Record the result in the notes46 file (see [`notes-first-reasoning`](../../rules/notes-first-reasoning.md)):47 prediction → result → lesson.484. **Cascade.** Once the riskiest assumption holds (or is corrected), sequence49 the dependent work. If it fails, the cheap early failure saved the rework.5051## Output5253A short ordered plan that leads with the load-bearing unknown + how it will be54proven, then the dependent steps. One recommendation, not a survey.5556## The four plan criteria — what a reviewer fails the ordered plan on5758Risk-first ordering is one of four things a plan is judged on. All four are59stated so a reviewer can **fail** a plan on them — each names what failing looks60like. This skill owns the third; the other three are stated here because a plan61reviewed on ordering alone passes while being unnecessary, insufficient, or62built on verbs that do not exist. The same four are carried in63`feature-planning` (pack `product-basic`), which is pruned under `projection.mode: scoped` and so is named rather than linked.64651. **Necessity** — every step traces to a stated problem or acceptance criterion.66 **Fails when** the plan carries work nothing asked for — a spike for an67 unknown that is not load-bearing is the version of this failure this skill68 causes.692. **Sufficiency** — every requirement is discharged by at least one step.70 **Fails when** a requirement owns no step, or its only step has no verifiable71 outcome. Walk the requirements, not the steps.723. **Ordering** — the load-bearing unknown is resolved before anything that73 assumes it, and no step consumes what a later step creates. **Fails when** the74 plan front-loads the easy parts, or ranks by effort instead of dependency75 blast radius (see Gotchas). This is the criterion this skill exists for.764. **Groundedness** — every command, skill and tool the plan tells someone to run77 exists. **Fails when** the plan names a verb that is not in the index. Check78 it against [`CAPABILITIES.yaml`](../../../CAPABILITIES.yaml) at the repository79 root — the generated capability index of every shipped skill and command —80 plus the project's own script/task entry points. It is the only one of the81 four decidable without judgement, so it is never waved through.8283## Do NOT8485- Build the easy parts first to show progress, then discover the hard part breaks them.86- Treat "hardest" as "most code" — rank by *dependency blast radius*, not effort.87- Over-plan a strong-reasoning host (it sequences risk natively — keep it light).8889## Gotchas9091- **Mistaking effort for risk.** A 400-line but well-understood refactor is *low*92 load-bearing risk; a 5-line call into an unverified third-party API is *high*.93 Ranking by size instead of dependency blast radius is the classic failure.94- **"Resolved on paper".** Reasoning that the unknown "should work" is not95 resolving it — the spike must actually run / compile / return before dependent96 work starts. Record prediction → result, not prediction → assumption.97- **Spike sprawl.** The probe answers exactly one question (does the load-bearing98 assumption hold?), then stops. Turning it into the real implementation defeats99 the cheap-early-failure purpose.100101## Related Skills102103**WHEN to use this**104105- Staging multi-component work where the hardest / most-uncertain part is unproven.106- A plan whose later steps rest on an assumption that could collapse.107108**WHEN NOT to use this**109110- Single-step, linear, or fully-specified work — no load-bearing unknown to111 resolve; the [`rdp-gate`](../../contexts/execution/rdp-gate.md) filters these.112- Breaking a feature into tasks in general — route to113 [`feature-planning`](../feature-planning/SKILL.md), which composes this skill.114- Recording the spike's prediction / result / lesson — that belongs in115 [`notes-first-reasoning`](../../rules/notes-first-reasoning.md).