Scope architect
Skill nguyenvanphituoc/shapeup-sdlc-plugin/skills/scope-architect
Use this skill to map, remap, or split the vertical scopes of a feature — Shape Up's "map the scopes" (step 8) as committed, mechanically enforceable contracts. Triggers on: "map the scopes", "write the scope contracts", "scope contract", "remap this scope", "split this stuck scope", "the discovered tasks don't fit any scope", "re-slice the substrate", or a tech-lead --order dispatch (operations map-scopes | remap | split-scope). Writes the committed scopes/*.json contracts by import-graph slicing along business flow, with write-whitelist substrates and e2e fixtures. NOT for decomposing a pitch into tasks (ba-pitch-analyzer) or cutting scope at ship time (scope-hammer).From its SKILL.md
npx -y skills add nguyenvanphituoc/shapeup-sdlc-plugin --skill scope-architectAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
- runs commandsInstructs the agent to run 4 commands, including `node skills/ba-pitch-analyzer/scripts/spec-lint.mjs --slug <slug>` and 3 more.
SKILL.md
7.4 KB, ~1.4k tokens by cl100k_base, as published. Nobody here has run it
Scope Architect (pure worker v1.0)
Slice by flow, never by directory — and write it as a contract a hook can enforce.
Groups a feature's tasks into independent, vertically-sliced scopes and writes each as a
committed contract (docs/shapeup-sdlc/<slug>/scopes/<scope-id>.json) the rest of the
harness enforces mechanically: the sandbox hook denies writes outside a substrate, t0-verify
runs the fixtures, the evaluator asserts only against the affordance manifest. This skill is
the sole writer of scope contracts — a distinct authority from the planner (task
decomposition) and a distinct failure mode (directory-thinking, PA1) deserving its own
anti-rationalization table.
Input contract — the WorkOrder
| Field | What it is |
|---|---|
operation | map-scopes (first slicing after the board exists) · remap (fold discovered items into scope contracts) · split-scope (re-slice one stuck scope) |
payload.feature / payload.spec_folder | Slug + committed spec (read ux-behavior.md for manifests; usecases for flows) |
payload.tasks[] | The board's tasks with their touched files — the slicing input |
payload.discovered_ledger | (remap) items that fit no existing substrate |
payload.scope_id | (split-scope) the stuck scope (rounds_at_position ≥ 3, or an approved substrate-expansion) |
substrate.allowed | scopes/*.json + scope-board.md — your ONLY write surface |
Core process
1 SLICE build an import/business-flow graph over the tasks' touched files (grep heuristic
is fine; AST is an optimization). One scope = one call chain: the UI screen + the
API route + the use case + the repository it drives. Scopes aligning 1:1 with a
top-level directory (all-frontend, all-backend) FAIL — that is layer-thinking.
2 CLASSIFY topology_type: LAYER_CAKE (thin balanced UI+backend) | ICEBERG (complexity on one
side) | CHOWDER (true strays with no shared flow — the one deliberate exception)
3 CONTRACT per scope, write scopes/<scope-id>.json:
scope_id, topology_type, tasks[] — the stable join key is the scope
allowed_file_substrate[] — exact globs; the sandbox hook's
write-whitelist; wrong here =
a legitimate ESCALATE later
shared_substrate[] — files ≥2 scopes both touch;
every write there forces a full
seesaw run at the next gate
affordance_manifest — from ux-behavior.md state
tables: every interactive
element as {test_id, role} +
required_states [idle, loading,
success, error, empty]
e2e_verification_fixtures[] — the command(s)/spec file(s)
that drive this scope
end-to-end (T0 layer); too
speculative to fixture → mark
TBD and flag it, never invent
a fixture for unbuilt behavior
hill_phase: "UPHILL_UNKNOWN" — ALWAYS; phase is derived from
T0/T1/seesaw facts later,
never authored (DD-10)
4 LINT node skills/ba-pitch-analyzer/scripts/spec-lint.mjs --slug <slug>
→ PA1 (directory alignment), PA2 (>~15 files), DISJOINT (undeclared overlap).
Fix reds by re-slicing, not by silencing.
5 BOARD regenerate scope-board.md (scope_id, topology, task count, substrate size, lint)
remap: a discovered item joins the nearest scope only if the flow matches (extend that
substrate minimally); otherwise propose a NEW scope — never silently widen an existing one.
split-scope: re-run step 1 on just that scope's task+file set → N new contracts; mark the
old one superseded_by: [ids] — never delete (branch and T0 history stay attributable).
Anti-rationalization table
| Excuse | Reality |
|---|---|
| "The discovered item obviously fits scope A" | Run the flow match. 'Obviously' is how substrates silently widen. |
| "One scope per directory is cleaner" | That's PA1 — a layer, not a flow. A scope must ship something a user can do. |
| "I'll widen the substrate a little so the doer stops escalating" | A wide substrate is no substrate. Split or add a shared_substrate entry, deliberately. |
| "This scope looks downhill, I'll set the phase" | hill_phase is UPHILL_UNKNOWN at write, always. Facts move dots, not authors. |
| "The old contract is superseded, delete it" | supersede-never-delete. History must stay attributable. |
| "Fixtures can come later, leave the field empty" | Fixture at contract time or an explicit TBD flag — silence is how T0 goes blind. |
Output contract — the WorkResult
scopes/*.json + scope-board.md in your substrate, then
.shapeup-sdlc/<slug>/results/<order-suffix>.json: status, artifacts[] (the contracts
written/superseded), escalates[] (e.g. a discovered item implying a new UC — the planner's
territory), deviations[] (any lint warn left standing and why). You never touch task files,
tasks/_index.md, spec docs, or run-state.
Verification checklist
- Every scope crosses layers or is declared CHOWDER; spec-lint PA1 = 0 red
- Substrates disjoint except declared shared_substrate (DISJOINT = 0 red)
- Every interactive element in scope screens appears in exactly one affordance_manifest
- Every scope has fixtures or an explicit TBD flag
- Every hill_phase written is UPHILL_UNKNOWN; superseded contracts kept
- The WorkResult validates against
work-result.schema.json
Invocation
# Orchestrated — compile-order --operation map-scopes|remap|split-scope --worker scope-architect …
/scope-architect --order .shapeup-sdlc/checkout-vnpay/orders/map-scopes.json
# Standalone shims (compile the same envelope)
/scope-architect --map docs/shapeup-sdlc/checkout-vnpay/
/scope-architect --split cart-creation docs/shapeup-sdlc/checkout-vnpay/
What ships with it: 32 files
29.4 KB alongside SKILL.md
evals/
- day1-rubric.json10.1 KB
- fixtures/mixed-partial/SC-capture.md575 B
- fixtures/mixed-partial/SC-complete.md533 B
- fixtures/mixed-partial/SC-organise.md580 B
- fixtures/mixed-partial/SC-review.md577 B
- fixtures/mixed-strong/SC-capture.md575 B
- fixtures/mixed-strong/SC-complete.md533 B
- fixtures/mixed-strong/SC-organise.md598 B
- fixtures/mixed-strong/SC-review.md577 B
- fixtures/mixed-weak/SC-app.md496 B
- fixtures/mixed-weak/SC-cli.md406 B
- fixtures/scopes-large-partial/SC-capture.md618 B
- fixtures/scopes-large-partial/SC-complete.md548 B
- fixtures/scopes-large-partial/SC-organise.md564 B
- fixtures/scopes-large-partial/SC-report.md582 B
- fixtures/scopes-large-partial/SC-review.md570 B
- fixtures/scopes-large-strong/SC-capture.md618 B
- fixtures/scopes-large-strong/SC-complete.md548 B
- fixtures/scopes-large-strong/SC-organise.md564 B
- fixtures/scopes-large-strong/SC-report.md621 B
- fixtures/scopes-large-strong/SC-review.md570 B
- fixtures/scopes-large-weak/SC-app.md570 B
- fixtures/scopes-large-weak/SC-cli.md404 B
- fixtures/scopes-partial/SC-capture.md800 B
- fixtures/scopes-partial/SC-complete.md876 B
- fixtures/scopes-partial/SC-review.md795 B
- fixtures/scopes-strong/SC-capture.md800 B
- fixtures/scopes-strong/SC-complete.md877 B
- fixtures/scopes-strong/SC-review.md795 B
- fixtures/scopes-weak/SC-app.md655 B
- fixtures/scopes-weak/SC-cli.md457 B
- trigger-evals.json1.5 KB