Resources
2Install
npx skillscat add dmitrydf/q/solution-slicer Install via the SkillsCat registry.
/solution-slicer — Delivery Slicing Assessor
Assess a draft plan and either confirm it needs no slicing, or produce a verified, rule-driven partition into delivery slices — each ending with a closing implementation-verification slice that confirms the whole plan shipped.
This skill is a self-orchestrating multi-perspective assessor (per ~/.claude/rules/code_first_architecture.md §AI Adapter, lines 81–102). It mirrors the /double-check pattern: multi-agent dispatch + consolidator + post-verification. The consolidator is the producer; /double-check is the external verifier. Producer-never-verifies is preserved by the topology.
Trigger
Activate when user says:
/solution-slicer/solution-slicer --help- "recommend delivery slices"
- "slice this plan"
- "assess this plan for slicing"
- "should this be sliced"
- "partition this plan into sessions"
When to Use
Activate in two situations:
- Technical-design step (Phase 2 /
/solution-design) — after clarification, when the agreed solution needs to be partitioned into delivery sessions before handing off to/plan. - Planning-step dedicated session (
/plan/ Slice I) — a dedicated session inside plan mode invokes this skill to assess whether the plan's Coherent Actions should be partitioned across implementation sessions.
In both situations the skill consumes the same Input Artifact and emits the same Output Contract. The skill does not decide whether slicing should be attempted at all — when invoked, it always assesses.
Invariants
The skill MUST obey the following invariants. Non-negotiable.
- Assess-before-slice. The skill's first step is always to decide whether slicing is needed. The default outcome is "do not slice"; slicing is recommended only when the assessor finds a clear violation of the four slicing rules in the un-sliced plan.
- Slicing is for delivery efficiency + trust — not scope reduction. The recommended slices cover 100% of the planned scope. No work is dropped during delivery partitioning.
- Closing implementation-verification slice always present. Every recommended slice sequence ends with a slice of
type: "implementation_verification"whose job is to confirm the whole plan shipped against the desired outcome. If the consolidated list does not already end with one, Step 4 appends it. - Producer-never-verifies (external). The consolidator (this skill) does not verify its own consolidated recommendation.
/double-checkis the external verifier invoked at Step 5. User sees only PASS results. - Multi-perspective dispatch. Assessors are
readonly-checkersubagents with isolated context — no shared conversation history, no producer reasoning injected. - Stateless persistence-wise. The skill MUST NOT write
_thoughtfiles. It MUST NOT callpre_plan_gates.pywrite-side commands. The artifact write at Step 3 is volatile per-invocation (~/.claude/state/solution_slicer/adhoc/).
Parameters
All optional (defaults shown):
| Flag | Default | Description |
|---|---|---|
--routine N |
1 | Number of routine-model (Sonnet) assessors |
--more-capable N |
1 | Number of more-capable-model (Opus) assessors |
--rounds N |
1 | Max convergence rounds |
--against TEXT |
(none) | Desired outcome text for post-verification. The skill auto-appends the four slicing rules; the user need only pass the desired outcome. |
Minimum 1 assessor total (--routine + --more-capable ≥ 1).
Note: defaults here (1,1,1) intentionally diverge from /double-check's defaults (3,0,2) — this skill's role-based model-pair is editorial per user rule #7.
Input Artifact
Schema
{
"plan_path_or_content": "<file path (string starting with / or ~/) OR inline plan markdown body>",
"desired_outcome": "<text describing the operational outcome the plan aims to achieve>",
"context_budget_per_agent": {
"routine": "<optional — estimated token budget for this plan content, e.g. '8000 tokens'>",
"more_capable": "<optional — estimated token budget for the more-capable model>"
}
}Field rules
| Field | Required | Semantics |
|---|---|---|
plan_path_or_content |
yes | File path → read with the Read tool. Inline markdown → use directly. If a path is given and the file does not exist, return a deterministic error. |
desired_outcome |
yes | Plain-text description of the operational outcome. The skill appends the four slicing rules to this string when calling /double-check --against. |
context_budget_per_agent |
no | Token-budget hints the caller passes so the assessor can reason about context-window fit. If absent, the skill uses no numeric budget; assessors apply qualitative judgment for context-window fit. |
Deterministic errors
If either required field is missing, empty, or whitespace-only, return:
{
"error": "<one of: plan_path_or_content required, desired_outcome required, plan file not found: <path>>",
"assessment": null,
"slices": [],
"aggregation_metadata": null,
"verification_metadata": null,
"confidence": null,
"assumptions": []
}Do not dispatch assessors on a deterministic error.
Output Contract
Schema
{
"assessment": {
"slicing_needed": true,
"rationale": "<why slicing is or is not recommended>"
},
"slices": [
{
"id": "S1",
"name": "<short noun phrase for this slice>",
"description": "<what this slice implements, in plain business words>",
"type": "implementation",
"cohesion_rationale": "<why this set of changes belongs together>",
"single_reason_for_change": "<the single reason this slice would change — the cohesion axis>",
"slicing_idea_applied": "walking_skeleton",
"agent_choice": "routine",
"agent_justification": "",
"context_fit_assessment": "<assessment that this slice fits the chosen agent's working capacity for one focused session>",
"depends_on": [],
"write_targets": ["<repo-relative path this slice will write>"]
},
{
"id": "S-final",
"name": "Implementation verification",
"description": "<what is confirmed — the whole plan shipped against the desired outcome>",
"type": "implementation_verification",
"cohesion_rationale": "Validation-V closing step — confirms the aggregate delivery matches the desired outcome.",
"single_reason_for_change": "Desired outcome or aggregate scope changes.",
"slicing_idea_applied": "knowledge_vs_implementation",
"agent_choice": "routine",
"agent_justification": "",
"context_fit_assessment": "<assessment for the verification slice>",
"depends_on": ["S1", "..."],
"write_targets": []
}
],
"aggregation_metadata": {
"assessors_run": ["routine-1", "more_capable-1"],
"disagreements": []
},
"verification_metadata": {
"double_check_verdict": "PASS",
"claims_checked": 12,
"rounds_run": 1,
"against": "<the --against string used>"
},
"confidence": "high",
"assumptions": []
}Field rules
| Field | Rules |
|---|---|
assessment.slicing_needed |
Boolean. When false: slices MUST be [] and rationale MUST be non-empty. |
slices |
Non-empty list when slicing_needed == true; empty list [] when slicing_needed == false. |
slices[-1].type |
MUST be "implementation_verification" when slicing_needed == true. Code-enforced in eval.py. |
type |
Enum: "implementation" or "implementation_verification". No other values. |
slicing_idea_applied |
For type == "implementation" slices: MUST be one of {walking_skeleton, sentence_extension, partial_step, different_ways, data_rules, knowledge_vs_implementation}. For type == "implementation_verification" slices: no constraint (the verification slice is not bounded by the six ideas). |
agent_choice |
Enum: "routine" or "more_capable". Default is "routine". |
agent_justification |
MUST be non-empty when agent_choice == "more_capable". MUST be empty string "" when agent_choice == "routine". |
context_fit_assessment |
MUST be non-empty for every slice. |
single_reason_for_change |
MUST be non-empty for every slice. |
write_targets |
List of repo-relative paths this slice will WRITE (create or edit). Name the files, not directories, wherever the slice is specific enough to know them. MUST be present on every slice; [] is legitimate for a slice that authors nothing in the checkout (a verification or promotion slice that only runs suites and ships). Overlap across slices is expected and correct — a file touched by three slices appears in all three. This declares blast radius, NOT scope: it is what /execute-plan's entry gate narrows an in-flight block to, so an omitted path silently stops being gated rather than failing loudly. Under-declaring is the failure mode to guard against; when unsure whether a slice will touch a file, declare it. |
aggregation_metadata.assessors_run |
Non-empty list of assessor descriptions. |
verification_metadata.double_check_verdict |
Enum: "PASS" or "ESCALATE". |
confidence |
Enum: "low" / "medium" / "high". Low if ESCALATE verdict, or assessors disagreed on slice count. |
Execution
Six internal steps. Run in order; no step is skipped unless the assess-first short-circuit fires at Step 2.
Step 0 — Help
If invoked with --help or no plan is available in session context, output the Parameters table and stop. Do not proceed to Step 1.
Step 1 — Identify plan and desired outcome
- Read the plan from
plan_path_or_content:- If it starts with
/or~/: treat as a file path; use the Read tool to load it. - Otherwise: use the value directly as inline plan markdown.
- If the file does not exist: return the deterministic error envelope and stop.
- If it starts with
- Confirm the desired-outcome string:
- If
desired_outcomeis provided in the input: use it directly. - If absent or ambiguous: ask the user before proceeding. Default: the last stated desired outcome in this session. If still ambiguous, ask.
- If
- If multiple plans are open in the session, confirm which one to assess.
Step 2 — Assess whether slicing is needed
Apply all four slicing rules to the plan as one single slice:
- Meaningful piece — does the plan as one unit represent one cohesive piece of work? Is there a single over-arching "reason this plan exists"?
- Single reason to change — does everything in the plan change for the same underlying reason? Would a future requirement change affect all parts of the plan uniformly, or would different parts respond to different drivers?
- Context-window fit — does the whole plan fit the routine model's working capacity for one focused implementation session? Consider the plan length, the number of files touched, and the depth of logic involved.
- Agent justification — would implementing the whole plan as one slice require the more-capable model? If yes, is there a concrete reason that justifies the cost?
If all four rules pass for the plan as a single unit:
- Emit
assessment.slicing_needed = false - Write a non-empty
rationaleexplaining why - Set
slices = [] - Set
aggregation_metadata.assessors_run = ["assess-first-short-circuit"] - Set
verification_metadatawithdouble_check_verdict = "PASS",claims_checked = 0,rounds_run = 0,against = "" - Set
confidence = "high"(no assessors disagreed; no post-verification needed for the trivial no-slicing case) - Stop. Skip Steps 3–6.
If any rule fails: proceed to Step 3 to gather multi-perspective slice candidates.
Step 3 — Write artifact and dispatch assessor agents
Write the assessment bundle to:
~/.claude/state/solution_slicer/adhoc/draft_<session_id_first8>_<timestamp>.mdThe bundle contains: the plan content + the desired-outcome string + the four slicing rules (verbatim) + the Cockburn six-ideas toolbox (verbatim below).
Build the structural-claim addendum by scanning the plan for: file paths (e.g.
path/to/file.py), line number references, function/method names, configuration keys, named constraints. Format as a numbered list (per/double-checkStep 2c pattern).Dispatch
--routine N+--more-capable Nassessor agents in parallel (single message, multiple Agent tool calls). Default: 1 routine Sonnet + 1 more-capable Opus.
For each assessor, use:
subagent_type: readonly-checkermodel: sonnet(routine) oropus(more-capable)description: "Round [R] assessor [i/total] — solution-slicer"
Assessor prompt template:
You are an independent delivery-slicing assessor. You have no access to the conversation that produced this plan.
Your task:
1. Read the plan + desired outcome + rules bundle at: `[artifact_path]`
2. Apply the four slicing rules to identify candidate slice boundaries:
- Rule 1 (Meaningful piece): each slice must cover one cohesive unit of implementation work.
- Rule 2 (Single reason to change): things that change for the same reason stay together; things that change for different reasons stay apart.
- Rule 3 (Context-window fit): each slice must fit the chosen agent's working capacity for one focused session.
- Rule 4 (Agent justification): default agent is "routine" (Sonnet); "more_capable" (Opus) requires a stated reason per slice.
3. Use the Cockburn Six Ideas to find candidate slice boundaries:
- Idea 1 (walking_skeleton): find the thin end-to-end path; make that Slice 1.
- Idea 2 (sentence_extension): extend the walking skeleton one step at a time.
- Idea 3 (partial_step): implement part of a step (simple data/flows first, complex later).
- Idea 4 (different_ways): separate alternative paths or variations into distinct slices.
- Idea 5 (data_rules): slice on data complexity — simple data/rules first, complex later.
- Idea 6 (knowledge_vs_implementation): spike/learn first, then implement.
4. Produce a candidate slice list. Each slice must have:
- id, name, description, type ("implementation" or "implementation_verification")
- cohesion_rationale (why this set of changes belongs together)
- single_reason_for_change (the cohesion axis)
- slicing_idea_applied (which of the six ideas grounded this boundary — for implementation slices)
- agent_choice ("routine" or "more_capable")
- agent_justification (required and non-empty only when agent_choice is "more_capable")
- context_fit_assessment (non-empty; qualitative judgment of fit)
- depends_on (list of slice ids this depends on, or empty list)
5. The LAST slice in your list MUST have type "implementation_verification" — it confirms the whole plan shipped against the desired outcome.
6. Additionally verify these structural claims from the plan:
[scope_addendum built in Step 3, item 2 — the structural-claim addendum]
Return your candidate slice list as a JSON array (the "slices" field). Also return:
assessor_id: [your assessor description]
slicing_needed: true
slice_count: [N]
notes: [any observations or caveats]For more-capable (Opus) assessors only, append after the JSON instruction:
## Scope-Coverage Assessment (advisory — Opus only)
After proposing your candidate slices, assess:
1. Do the candidate slices together cover 100% of the plan scope? Is any planned work absent?
2. Append to your return:
scope_coverage: COVERS | PARTIAL | GAPS_FOUND
scope_notes: [1-3 sentences]Track round number R (starts at 1). Assessors are stateless; each round dispatches fresh agents.
Step 4 — Consolidate
- Collect all assessor responses.
- Merge candidate slice lists using the four rules:
- Apply cohesion + meaningful-piece to merge over-fine slices (slices that have the same reason-to-change belong together).
- Apply single-reason-to-change to split incorrectly-merged slices (slices with different reasons-to-change must be separated).
- Ensure context-window fit for the chosen agent per slice.
- Enforce agent justification: if a slice has
agent_choice = "more_capable", the justification must be non-empty.
- Note any assessor disagreements in
aggregation_metadata.disagreements. If assessors disagree on slice count, the consolidator picks the smallest count that still satisfies cohesion + meaningful-piece (cohesion takes precedence over granularity). - Closing-slice rule: check
slices[-1].type. If the consolidated list does NOT already end with a slice of type"implementation_verification", append a closing implementation-verification slice now:{ "id": "S-final", "name": "Implementation verification", "description": "Confirm the whole plan shipped against the desired outcome: [desired_outcome_text]", "type": "implementation_verification", "cohesion_rationale": "Validation-V closing step (Cockburn) — every multi-slice delivery ends with an aggregate verification V.", "single_reason_for_change": "Desired outcome or aggregate scope changes.", "slicing_idea_applied": "knowledge_vs_implementation", "agent_choice": "routine", "agent_justification": "", "context_fit_assessment": "Verification work is lightweight relative to implementation slices; fits routine model.", "depends_on": ["<all prior slice ids>"] }
Step 5 — Post-verify via /double-check
Build the --against string:
<desired_outcome>; slicing rules: (1) each slice is a meaningful piece, (2) single reason to change per slice, (3) each slice fits the chosen agent's working capacity, (4) routine model is the default — more_capable requires a stated justification; (5) the final slice is always type implementation_verificationInvoke:
/double-check --class check --rounds 2 --against "[against_string above]"- PASS (0 discrepancies): Record in
verification_metadata. Proceed to Step 6. - DISCREPANCY (round 1):
/double-checkre-dispatches diff-only on round 2. - ESCALATE (
max_roundsreached with unresolved discrepancies): Surface the discrepancies verbatim and present the user a two-option choice (do NOT default-proceed):- (a) One more round — re-invoke
/double-checkwith the same--againststring; round counter increments pastmax_rounds; fresh isolated checkers. - (b) Proceed as is — accept the unresolved discrepancies. Set
verification_metadata.double_check_verdict = "ESCALATE", record the discrepancy list inverification_metadata.escalate_disposition, setconfidence = "low", proceed to Step 6. - No
override_reasoncapture — the user's pick is recorded.
- (a) One more round — re-invoke
Step 6 — Present
Present the final recommendation only after /double-check returns PASS. Include:
- The
assessmentblock (slicing_needed+rationale). - The
slices[]with all required fields, formatted as a readable table or list. - The
aggregation_metadata(assessors run + any disagreements). - The
verification_metadata(verdict + claims checked + rounds + against-string) so the user can audit the chain. - The
confidenceandassumptions[].
Invocation Surfaces
The skill is invokable from two surfaces. Both pass the same Input Artifact and consume the same Output Contract. The surface layer is the only changing locus when adding a new caller (Cockburn Evolution Test — single-locus change).
Surface 1 — Technical-design step (Phase 2 / /solution-design)
Called by either the user directly (after /clarification produces a locked # Discovery) or by the /solution-design orchestrator (B3) as part of the design-to-delivery-plan handoff. The desired outcome is drawn from the locked ## Desired Outcome field in # Discovery. The plan content is the agreed solution description from ## Agreed Solution Description.
Surface 2 — Plan-mode dedicated session (/plan / Slice I)
Slice I (the /plan enhancement) embeds a dedicated session that invokes this skill against the draft Coherent Actions table. The desired outcome is drawn from Gate 0b of the active plan mode session. The plan content is the Coherent Actions table + supporting narrative.
Constraints
- Assessors are
readonly-checkeragents — dispatched with isolated context, custom system prompt, no shared conversation history with the producer. Producer-never-verifies is preserved by the topology. (factcheck-convergence.md§2 — isolation property preserved.) - Main-session-only — this skill cannot be invoked from inside a subagent (matches
/double-checkconstraint at~/.claude/skills/double-check/SKILL.md:5). - Artifact = file only — write the plan + outcome + rules bundle to
~/.claude/state/solution_slicer/adhoc/draft_<session_id_first8>_<timestamp>.mdusing the Write tool before dispatching assessors. Never pass plan content inline in the agent prompt. - Post-verification required — user sees the recommendation only after
/double-checkreturns PASS. An ESCALATE result surfaces unresolved discrepancies to the user; the user decides whether to revise the plan before re-invoking. - Trust Hierarchy exception — convergence orchestration lives in skill text, not Python code, because the engine cannot call the Agent tool. (Same documented exception as
/double-check; seeThoughts/double-check-skill-subprocess_THOUGHT.md.) - Scope-coverage rule — 100% of plan scope must appear in the consolidated slices. The consolidator must reject any merge operation that drops work.
Optionality Boundary
This skill does NOT decide whether the slicing assessment should be run at all. That decision lives in the caller (the /solution-design orchestrator or the Slice I plan-mode session).
When this skill is invoked, it always assesses (subject to the deterministic input-validation errors in the Input Artifact section). Only the result of the assessment may be "no slicing needed." The boundary keeps this skill a clean adapter.
Edge Cases
| # | Condition | Handling |
|---|---|---|
| E1 | Empty plan or missing plan_path_or_content |
Return deterministic error envelope; no assessors dispatched. |
| E2 | Missing desired outcome | Ask the user for the desired outcome before proceeding. Do not default to a guess. |
| E3 | Plan file path given but file does not exist | Return deterministic error envelope with error: "plan file not found: <path>". |
| E4 | Plan exceeds even more-capable agent's working capacity | slicing_needed = true; partition the plan further; note capacity issue in context_fit_assessment for each slice; record assumption that the most-capable available model is the ceiling. |
| E5 | All assessors disagree on slice count | Consolidator picks the smallest count that satisfies cohesion + meaningful-piece (cohesion takes precedence over granularity). Record disagreements in aggregation_metadata.disagreements. |
| E6 | /double-check ESCALATE after one revision |
Return ESCALATE to user with unresolved discrepancies verbatim. Do not loop a second revision. User must revise the plan or the desired outcome before re-invoking. |
| E7 | Invalid parameters: --routine 0 --more-capable 0 |
Error: "minimum 1 assessor required (--routine + --more-capable ≥ 1)." |
| E8 | --rounds 0 |
Error: "minimum 1 round required." |
| E9 | Invoked inside a subagent | Reject with: "solution-slicer is main-session-only — cannot be invoked from inside a subagent." |
| E10 | Re-invocation after a prior run in the same session | Fresh assessment; no shared state with the prior run. Each invocation is independent. |
| E11 | Plan explicitly contains "do not slice" instruction | Run the assessment anyway. If the assessors agree with the plan's instruction (no violations found), emit slicing_needed = false with a note that the plan's instruction was consistent with the four rules. If assessors recommend slicing despite the instruction, surface the tension to the user — present the candidate slices AND note the plan's instruction — and defer to the user to decide. |
| E12 | Closing implementation-verification slice already present at the end of the input plan | Consolidator detects slices[-1].type == "implementation_verification" after merging and does NOT append a second one. eval.py sees one closing slice and passes. |
| E13 | Single-assessor mode (--routine 1 --more-capable 0 or --routine 0 --more-capable 1) |
Valid; aggregation_metadata.assessors_run lists one assessor; no disagreements possible. |
Source
~/.claude/skills/double-check/SKILL.md— primary pattern (multi-agent dispatch + aggregator + configurable counts + post-verification + artifact-file pattern + structural-claim addendum).~/.claude/rules/code_first_architecture.md:81-102— AI Adapter / judgment-port pattern.~/.claude/rules/code_first_architecture.md:112— Producer-never-verifies invariant.~/.claude/rules/factcheck-convergence.md§1 — minimum 1 checker total (≥1 assessor).~/.claude/rules/factcheck-convergence.md§2 — independence / isolated context.<KL>/Development/Sources/Books/slice-the-problem-grow-the-solution-cockburn-v0.9b/slice-the-problem-grow-the-solution-cockburn-v0.9b.md:493-502— Six Ideas for Slicing a Use Case (Ch 8).slice-the-problem-grow-the-solution-cockburn-v0.9b.md:696-704— Four Context-Dependent Factors for Slice Size (Ch 12).slice-the-problem-grow-the-solution-cockburn-v0.9b.md:125-129— Validation-V: closing implementation-verification slice grounding.<KL>/Development/Sources/Books/simplifying-software-design-cockburn/simplifying-software-design-cockburn.md:73— Responsibility Alignment Test (basis for "single reason to change" rule).simplifying-software-design-cockburn.md:69-80— Six Design Tests.Thoughts/workflow-phases-redesign_H_v2_B2_PLAN.md— locked plan this skill implements.
Non-goals
- This skill does not write
_thoughtfiles. Stateless. - It does not decide whether Phase 2 (
/solution-design) should run at all. That decision lives in the calling orchestrator. - It does not select among multiple Agreed Solution Descriptions. Selection is the orchestrator's responsibility.
- It does not produce more than one consolidated recommendation per invocation.
- It does not bypass the post-verification step (Step 5). The user always sees only PASS results.
- It does not omit the closing implementation-verification slice when slicing is recommended (the consolidator always appends it at Step 4 if missing).
- It does not reduce plan scope. Coverage rule: 100% of planned work appears in the recommended slices.