← Files get-fableARCHIVED FILE

skills/fable-plan/references/risk-and-dependency-decomposition.md

2.97 KB · Oct 2, 2026 · 00:30 UTC

↓ Download file

# Risk and Dependency Decomposition

Use this when a task is too large for one bounded edit but naive file-based splitting would hide semantic coupling.

## Build a change graph before cards
For each component identify:
- contract consumed/provided;
- state it reads/writes;
- migration format;
- external dependency;
- tests that prove it;
- cards that must precede/follow it.

Two files are not independent merely because they are different paths. If they change the same contract, invariant, schema, or rollout assumption, model that dependency explicitly.

## Useful dependency types

### Build dependency
Card B cannot compile/run until A exists.

### Contract dependency
Both cards depend on one interface/schema. Stabilize the contract first or serialize changes.

### Data dependency
A changes persisted shape used by B. Plan compatibility/backfill/rollback.

### Verification dependency
Worker-local tests pass, but only combined integration proves the outcome. Assign integration ownership.

### Operational dependency
Deploy order, feature flags, external configuration, or registry state constrains sequence.

## Risk-first ordering
Prefer early cards that falsify the biggest assumptions cheaply.

Examples:
- prove an SDK supports the required behavior before refactoring every call site;
- create a compatibility reader before writing a data backfill;
- add a regression test before changing a concurrency primitive;
- validate package contents before tagging a release.

## Parallelism test
Parallelize only if all are true:
- no write/write conflict;
- no shared invariant is being redefined independently;
- contract between workers is already stable;
- acceptance can be checked locally;
- parent integration has a named verification step;
- a failed worker does not invalidate another worker's assumptions.

If only file ownership is disjoint, that is not enough.

## Migration planning questions
- Can old and new readers coexist?
- Can old and new writers coexist?
- Is the migration idempotent?
- What happens if it stops halfway?
- Is rollback data-lossless?
- Does rollout need dual-read/dual-write?
- Which metric/log tells us the migration is healthy?

## Acceptance strength
A good acceptance condition can fail when the requirement is broken.

Weak:
- file exists;
- command exits 0 without exercising behavior;
- snapshot updated;
- "all tests pass" with no affected-path proof.

Stronger:
- regression test reproduces old failure then passes;
- compatibility fixture proves old and new format readers;
- clean-install smoke proves packaged CLI entrypoint;
- integration test crosses the exact changed contract.

## Card-size heuristic
A card is too large when:
- it contains multiple independent failure stories;
- implementation could be rejected in one area while accepted in another;
- rollback differs across subparts;
- the acceptance command does not prove all of it.

A card is too small when its only independent meaning is a filename or mechanical step that cannot be reviewed usefully on its own.

SHA-256: 483214f522456612eabc12df3461b475a01dc4fd6c3ae2b9c1e455dbe7f30339