@tgoodington/intuition 8.1.3 → 9.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/v9/decision-framework-direction.md +142 -0
- package/docs/v9/decision-framework-implementation.md +114 -0
- package/docs/v9/domain-adaptive-team-architecture.md +1016 -0
- package/docs/v9/test/SESSION_SUMMARY.md +117 -0
- package/docs/v9/test/TEST_PLAN.md +119 -0
- package/docs/v9/test/blueprints/legal-analyst.md +166 -0
- package/docs/v9/test/output/07_cover_letter.md +41 -0
- package/docs/v9/test/phase2/mock_plan.md +89 -0
- package/docs/v9/test/phase2/producers.json +32 -0
- package/docs/v9/test/phase2/specialists/database-architect.specialist.md +10 -0
- package/docs/v9/test/phase2/specialists/financial-analyst.specialist.md +10 -0
- package/docs/v9/test/phase2/specialists/legal-analyst.specialist.md +10 -0
- package/docs/v9/test/phase2/specialists/technical-writer.specialist.md +10 -0
- package/docs/v9/test/phase2/team_assignment.json +61 -0
- package/docs/v9/test/phase3/blueprints/legal-analyst.md +840 -0
- package/docs/v9/test/phase3/legal-analyst-full.specialist.md +111 -0
- package/docs/v9/test/phase3/project_context/nh_landlord_tenant_notes.md +35 -0
- package/docs/v9/test/phase3/project_context/property_facts.md +32 -0
- package/docs/v9/test/phase3b/blueprints/legal-analyst.md +1715 -0
- package/docs/v9/test/phase3b/legal-analyst.specialist.md +153 -0
- package/docs/v9/test/phase3b/scratch/legal-analyst-stage1.md +270 -0
- package/docs/v9/test/phase4/TEST_PLAN.md +32 -0
- package/docs/v9/test/phase4/blueprints/financial-analyst-T2.md +538 -0
- package/docs/v9/test/phase4/blueprints/legal-analyst-T4.md +253 -0
- package/docs/v9/test/phase4/cross-blueprint-check.md +280 -0
- package/docs/v9/test/phase4/scratch/financial-analyst-T2-stage1.md +67 -0
- package/docs/v9/test/phase4/scratch/legal-analyst-T4-stage1.md +54 -0
- package/docs/v9/test/phase4/specialists/financial-analyst.specialist.md +156 -0
- package/docs/v9/test/phase4/specialists/legal-analyst.specialist.md +153 -0
- package/docs/v9/test/phase5/TEST_PLAN.md +35 -0
- package/docs/v9/test/phase5/blueprints/code-architect-hw-vetter.md +375 -0
- package/docs/v9/test/phase5/output/04_compliance_checklist.md +149 -0
- package/docs/v9/test/phase5/output/hardware-vetter-SKILL-v2.md +561 -0
- package/docs/v9/test/phase5/output/hardware-vetter-SKILL.md +459 -0
- package/docs/v9/test/phase5/producers/code-writer.producer.md +49 -0
- package/docs/v9/test/phase5/producers/document-writer.producer.md +62 -0
- package/docs/v9/test/phase5/regression-comparison-v2.md +60 -0
- package/docs/v9/test/phase5/regression-comparison.md +197 -0
- package/docs/v9/test/phase5/review-5A-specialist.md +213 -0
- package/docs/v9/test/phase5/specialist-test/TEST_PLAN.md +60 -0
- package/docs/v9/test/phase5/specialist-test/blueprint-comparison.md +252 -0
- package/docs/v9/test/phase5/specialist-test/blueprints/code-architect-hw-vetter.md +916 -0
- package/docs/v9/test/phase5/specialist-test/scratch/code-architect-stage1.md +427 -0
- package/docs/v9/test/phase5/specialists/code-architect.specialist.md +168 -0
- package/docs/v9/test/phase5b/TEST_PLAN.md +219 -0
- package/docs/v9/test/phase5b/blueprints/5B-10-stage2-with-decisions.md +286 -0
- package/docs/v9/test/phase5b/decisions/5B-2-accept-all-decisions.json +68 -0
- package/docs/v9/test/phase5b/decisions/5B-3-promote-decisions.json +70 -0
- package/docs/v9/test/phase5b/decisions/5B-4-individual-decisions.json +68 -0
- package/docs/v9/test/phase5b/decisions/5B-5-triage-decisions.json +110 -0
- package/docs/v9/test/phase5b/decisions/5B-6-fallback-decisions.json +40 -0
- package/docs/v9/test/phase5b/decisions/5B-8-partial-decisions.json +46 -0
- package/docs/v9/test/phase5b/decisions/5B-9-complete-decisions.json +54 -0
- package/docs/v9/test/phase5b/scratch/code-architect-stage1.md +133 -0
- package/docs/v9/test/phase5b/specialists/code-architect.specialist.md +202 -0
- package/docs/v9/test/phase5b/stage1-many-decisions.md +139 -0
- package/docs/v9/test/phase5b/stage1-no-assumptions.md +70 -0
- package/docs/v9/test/phase5b/stage1-with-assumptions.md +86 -0
- package/docs/v9/test/phase5b/test-5B-1-results.md +157 -0
- package/docs/v9/test/phase5b/test-5B-10-results.md +130 -0
- package/docs/v9/test/phase5b/test-5B-2-results.md +75 -0
- package/docs/v9/test/phase5b/test-5B-3-results.md +104 -0
- package/docs/v9/test/phase5b/test-5B-4-results.md +114 -0
- package/docs/v9/test/phase5b/test-5B-5-results.md +126 -0
- package/docs/v9/test/phase5b/test-5B-6-results.md +60 -0
- package/docs/v9/test/phase5b/test-5B-7-results.md +141 -0
- package/docs/v9/test/phase5b/test-5B-8-results.md +115 -0
- package/docs/v9/test/phase5b/test-5B-9-results.md +76 -0
- package/docs/v9/test/producers/document-writer.producer.md +62 -0
- package/docs/v9/test/specialists/legal-analyst.specialist.md +58 -0
- package/package.json +4 -2
- package/producers/code-writer/code-writer.producer.md +86 -0
- package/producers/data-file-writer/data-file-writer.producer.md +116 -0
- package/producers/document-writer/document-writer.producer.md +117 -0
- package/producers/form-filler/form-filler.producer.md +99 -0
- package/producers/presentation-creator/presentation-creator.producer.md +109 -0
- package/producers/spreadsheet-builder/spreadsheet-builder.producer.md +107 -0
- package/scripts/install-skills.js +88 -7
- package/scripts/uninstall-skills.js +3 -0
- package/skills/intuition-agent-advisor/SKILL.md +107 -0
- package/skills/intuition-assemble/SKILL.md +261 -0
- package/skills/intuition-build/SKILL.md +211 -151
- package/skills/intuition-debugger/SKILL.md +4 -4
- package/skills/intuition-design/SKILL.md +7 -3
- package/skills/intuition-detail/SKILL.md +377 -0
- package/skills/intuition-engineer/SKILL.md +8 -4
- package/skills/intuition-handoff/SKILL.md +251 -213
- package/skills/intuition-handoff/references/handoff_core.md +16 -16
- package/skills/intuition-initialize/SKILL.md +20 -5
- package/skills/intuition-initialize/references/state_template.json +16 -1
- package/skills/intuition-plan/SKILL.md +139 -59
- package/skills/intuition-plan/references/magellan_core.md +8 -8
- package/skills/intuition-plan/references/templates/plan_template.md +5 -5
- package/skills/intuition-prompt/SKILL.md +89 -27
- package/skills/intuition-start/SKILL.md +42 -9
- package/skills/intuition-start/references/start_core.md +12 -12
- package/skills/intuition-test/SKILL.md +345 -0
- package/specialists/api-designer/api-designer.specialist.md +291 -0
- package/specialists/business-analyst/business-analyst.specialist.md +270 -0
- package/specialists/copywriter/copywriter.specialist.md +268 -0
- package/specialists/database-architect/database-architect.specialist.md +275 -0
- package/specialists/devops-infrastructure/devops-infrastructure.specialist.md +314 -0
- package/specialists/financial-analyst/financial-analyst.specialist.md +269 -0
- package/specialists/frontend-component/frontend-component.specialist.md +293 -0
- package/specialists/instructional-designer/instructional-designer.specialist.md +285 -0
- package/specialists/legal-analyst/legal-analyst.specialist.md +260 -0
- package/specialists/marketing-strategist/marketing-strategist.specialist.md +281 -0
- package/specialists/project-manager/project-manager.specialist.md +266 -0
- package/specialists/research-analyst/research-analyst.specialist.md +273 -0
- package/specialists/security-auditor/security-auditor.specialist.md +354 -0
- package/specialists/technical-writer/technical-writer.specialist.md +275 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# Test 5B-3: Gate Phase 1 — Promote Assumptions
|
|
2
|
+
|
|
3
|
+
**Date:** 2026-02-27
|
|
4
|
+
**Verdict:** PASS
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Simulation Walkthrough
|
|
9
|
+
|
|
10
|
+
**Input:** `stage1-with-assumptions.md` — 5 assumptions (A1-A5) + 3 decisions (D1-D3).
|
|
11
|
+
|
|
12
|
+
### Step 1: Phase 1 — Present assumptions as group (same as 5B-2)
|
|
13
|
+
|
|
14
|
+
### Step 2: User selects "I want to review some of these"
|
|
15
|
+
|
|
16
|
+
Gate asks: "Which assumptions do you want to weigh in on? (Enter the numbers, e.g., A2, A5)"
|
|
17
|
+
|
|
18
|
+
User responds: "A3, A5"
|
|
19
|
+
|
|
20
|
+
### Step 3: Promote A3 — Model Selection
|
|
21
|
+
|
|
22
|
+
Gate presents:
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
The specialist planned to use sonnet for Model Selection for Execution. What would you prefer?
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
AskUserQuestion options:
|
|
29
|
+
- "sonnet (specialist's recommendation)"
|
|
30
|
+
- "Something else — I'll describe what I want"
|
|
31
|
+
|
|
32
|
+
User picks: "Something else"
|
|
33
|
+
User types: "opus"
|
|
34
|
+
|
|
35
|
+
Gate records: `"status": "promoted"`, `"user_override": "opus"`, `"rationale": "User wants deeper reasoning for model comparison analysis"`
|
|
36
|
+
|
|
37
|
+
### Step 4: Promote A5 — Report Naming Convention
|
|
38
|
+
|
|
39
|
+
Gate presents:
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
The specialist planned to use model_rec_YYYY-MM-DD_[use-case-slug].md for Report Naming Convention. What would you prefer?
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
AskUserQuestion options:
|
|
46
|
+
- "model_rec_YYYY-MM-DD_[use-case-slug].md (specialist's recommendation)"
|
|
47
|
+
- "Something else — I'll describe what I want"
|
|
48
|
+
|
|
49
|
+
User picks: "Something else"
|
|
50
|
+
User types: "recommendation_[use-case-slug].md"
|
|
51
|
+
|
|
52
|
+
Gate records: `"status": "promoted"`, `"user_override": "recommendation_[use-case-slug].md"`, `"rationale": "User prefers simpler naming without dates"`
|
|
53
|
+
|
|
54
|
+
### Step 5: Non-promoted assumptions accepted
|
|
55
|
+
|
|
56
|
+
A1, A2, A4 recorded as `"status": "accepted"`, `"user_override": null`.
|
|
57
|
+
|
|
58
|
+
### Step 6: Phase 2 — 3 original decisions
|
|
59
|
+
|
|
60
|
+
D1-D3 presented individually. Promoted assumptions are resolved — they are NOT re-asked.
|
|
61
|
+
|
|
62
|
+
Simulated responses:
|
|
63
|
+
- D1: Accepts recommended (A — Weighted percentage)
|
|
64
|
+
- D2: Picks "Other", types: "Use strict tag match but also include models tagged as 'general' regardless of the query"
|
|
65
|
+
- D3: Picks non-recommended (C — All above threshold)
|
|
66
|
+
|
|
67
|
+
### Step 7: decisions.json complete
|
|
68
|
+
|
|
69
|
+
See `decisions/5B-3-promote-decisions.json`.
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Criterion-by-Criterion Evaluation
|
|
74
|
+
|
|
75
|
+
### 1. Promoted assumption recorded as `"status": "promoted"`, `"user_override": "opus"`
|
|
76
|
+
|
|
77
|
+
**PASS** — A3 has `"status": "promoted"`, `"user_override": "opus"` with rationale. A5 has `"status": "promoted"`, `"user_override": "recommendation_[use-case-slug].md"` with rationale.
|
|
78
|
+
|
|
79
|
+
### 2. Non-promoted assumptions recorded as `"status": "accepted"`
|
|
80
|
+
|
|
81
|
+
**PASS** — A1, A2, A4 all have `"status": "accepted"`, `"user_override": null`.
|
|
82
|
+
|
|
83
|
+
### 3. Gate did NOT construct domain-specific alternatives
|
|
84
|
+
|
|
85
|
+
**PASS** — For both promoted assumptions, the gate offered exactly two options: the specialist's default or "Something else — I'll describe what I want." No domain-specific alternatives were constructed (no "haiku", "opus" options generated by the gate for model selection — the user provided "opus" as free text).
|
|
86
|
+
|
|
87
|
+
### 4. Phase 2 proceeds with 3 original decisions (promoted assumptions resolved, not re-asked)
|
|
88
|
+
|
|
89
|
+
**PASS** — After resolving A3 and A5, the gate moved to D1 without revisiting any assumptions. The promoted assumptions are recorded in the `assumptions` array (not moved to `decisions`), and their overrides are available to Stage 2.
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Protocol Validation Notes
|
|
94
|
+
|
|
95
|
+
1. The simplified promotion pattern works well — no domain reasoning required from the gate skill.
|
|
96
|
+
2. The `rationale` field on promoted assumptions captures why the user overrode the default. This gives Stage 2 useful context.
|
|
97
|
+
3. The "Something else" free-text approach handles both simple overrides (A3: "opus") and structured overrides (A5: naming pattern) without the gate needing to understand the domain.
|
|
98
|
+
4. Promoted assumptions stay in the `assumptions` array with a different status — they don't migrate to `decisions`. This keeps the data model clean and lets Stage 2 distinguish between "specialist's assumption the user changed" and "genuine decision the user made."
|
|
99
|
+
|
|
100
|
+
### Edge Case Noted
|
|
101
|
+
|
|
102
|
+
What happens if the user promotes an assumption but then picks the specialist's recommendation anyway? The protocol handles this: record `"status": "promoted"`, `"user_override": null` (they reviewed it and confirmed the default). This is slightly different from `"status": "accepted"` (they accepted without reviewing). Stage 2 doesn't need to distinguish these — both mean "use the default."
|
|
103
|
+
|
|
104
|
+
**Recommendation:** Consider simplifying: if a user promotes but picks the default, record as `"status": "accepted"` to avoid a meaningless distinction. Not a blocker — just a simplification for when we build the skill.
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# Test 5B-4: Gate Phase 2 — Individual Decisions (1-7)
|
|
2
|
+
|
|
3
|
+
**Date:** 2026-02-27
|
|
4
|
+
**Verdict:** PASS
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Simulation Walkthrough
|
|
9
|
+
|
|
10
|
+
**Input:** `stage1-with-assumptions.md` — 5 assumptions (A1-A5) + 3 decisions (D1-D3).
|
|
11
|
+
**Phase 1:** User accepts all assumptions (fast path).
|
|
12
|
+
**Phase 2:** 3 decisions — below the 8+ threshold, so each presented individually.
|
|
13
|
+
|
|
14
|
+
### D1: Scoring Formula Approach
|
|
15
|
+
|
|
16
|
+
AskUserQuestion presented:
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
D1: Scoring Formula Approach
|
|
20
|
+
|
|
21
|
+
Need to rank 47 models against user hardware. RAM, VRAM, and context length
|
|
22
|
+
are the key dimensions.
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Options:
|
|
26
|
+
1. "Weighted percentage — RAM 40%, VRAM 40%, context 20% (Recommended)"
|
|
27
|
+
2. "Binary pass/fail per dimension, rank by headroom"
|
|
28
|
+
3. "Single composite ratio averaged across dimensions"
|
|
29
|
+
|
|
30
|
+
User picks: **Option 1 (recommended)**
|
|
31
|
+
|
|
32
|
+
decisions.json updated: `"chosen": "A"`, `"user_input": null`
|
|
33
|
+
|
|
34
|
+
### D2: Use-Case Filtering Strategy
|
|
35
|
+
|
|
36
|
+
AskUserQuestion presented:
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
D2: Use-Case Filtering Strategy
|
|
40
|
+
|
|
41
|
+
Models have use-case tags (chat, code, creative, reasoning). User provides
|
|
42
|
+
a query like 'I need a coding model'.
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Options:
|
|
46
|
+
1. "Strict tag match (Recommended)"
|
|
47
|
+
2. "Fuzzy match — tagged first, then 'might also work'"
|
|
48
|
+
|
|
49
|
+
User picks: **Option 2 (non-recommended)**
|
|
50
|
+
|
|
51
|
+
decisions.json updated: `"chosen": "B"`, `"user_input": null`
|
|
52
|
+
|
|
53
|
+
### D3: Top-N Presentation Count
|
|
54
|
+
|
|
55
|
+
AskUserQuestion presented:
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
D3: Top-N Presentation Count
|
|
59
|
+
|
|
60
|
+
Need to decide how many models to show in the recommendation report.
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Options:
|
|
64
|
+
1. "Top 5 models (Recommended)"
|
|
65
|
+
2. "Top 3 models"
|
|
66
|
+
3. "All models above acceptable_fit threshold"
|
|
67
|
+
|
|
68
|
+
User picks: **Other**
|
|
69
|
+
User types: "Show top 5 but also include a 'honorable mentions' section for models that scored between acceptable_fit and the 5th-place score"
|
|
70
|
+
|
|
71
|
+
decisions.json updated: `"chosen": "other"`, `"user_input": "Show top 5 but also include a 'honorable mentions' section..."`
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Criterion-by-Criterion Evaluation
|
|
76
|
+
|
|
77
|
+
### 1. Each decision presented individually with correct option format
|
|
78
|
+
|
|
79
|
+
**PASS** — D1, D2, D3 each shown as a separate AskUserQuestion with context description above the options.
|
|
80
|
+
|
|
81
|
+
### 2. Recommended option appears first with "(Recommended)" label
|
|
82
|
+
|
|
83
|
+
**PASS** — All three decisions have the specialist's recommended option as the first choice with "(Recommended)" appended.
|
|
84
|
+
|
|
85
|
+
### 3. D1: `"chosen": "A"`, `"user_input": null`
|
|
86
|
+
|
|
87
|
+
**PASS** — User picked the recommended option. Recorded correctly.
|
|
88
|
+
|
|
89
|
+
### 4. D2: `"chosen": "B"`, `"user_input": null`
|
|
90
|
+
|
|
91
|
+
**PASS** — User picked the non-recommended option. Recorded correctly with no user input (it was a predefined option, not "Other").
|
|
92
|
+
|
|
93
|
+
### 5. D3: `"chosen": "other"`, `"user_input": "[user's text]"`
|
|
94
|
+
|
|
95
|
+
**PASS** — User picked "Other" and provided custom text. Recorded with `"chosen": "other"` and the full user text in `"user_input"`.
|
|
96
|
+
|
|
97
|
+
### 6. decisions.json updated after EACH response (not batched at end)
|
|
98
|
+
|
|
99
|
+
**PASS (by protocol design)** — The read-before-write rule in Section 9.8.4 mandates updating after each response. The simulation produces intermediate states:
|
|
100
|
+
- After D1: file has assumptions + D1 only
|
|
101
|
+
- After D2: file has assumptions + D1 + D2
|
|
102
|
+
- After D3: file has all items, `gate_completed` set
|
|
103
|
+
|
|
104
|
+
### 7. `"context"` field populated for each decision
|
|
105
|
+
|
|
106
|
+
**PASS** — All three decisions have a `"context"` field with meaningful summary text drawn from the decision's surrounding context in stage1.md.
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## Protocol Validation Notes
|
|
111
|
+
|
|
112
|
+
1. The three response types (recommended, non-recommended, Other) all record correctly with distinct patterns.
|
|
113
|
+
2. The `context` field gives Stage 2 enough information to understand each decision without re-reading all of stage1.md.
|
|
114
|
+
3. For "Other" responses, the user's free text is preserved verbatim — no interpretation by the gate.
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# Test 5B-5: Gate Phase 2 — Triage Table (8+ Decisions)
|
|
2
|
+
|
|
3
|
+
**Date:** 2026-02-27
|
|
4
|
+
**Verdict:** PASS
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Simulation Walkthrough
|
|
9
|
+
|
|
10
|
+
**Input:** `stage1-many-decisions.md` — 3 assumptions (A1-A3) + 10 decisions (D1-D10).
|
|
11
|
+
**Phase 1:** User accepts all assumptions.
|
|
12
|
+
**Phase 2:** 10 decisions — triggers the 8+ triage path.
|
|
13
|
+
|
|
14
|
+
### Step 1: Summary table presented
|
|
15
|
+
|
|
16
|
+
Gate displays all 10 decisions with recommendations:
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
The specialist identified 10 decisions. Here's a summary:
|
|
20
|
+
|
|
21
|
+
| # | Decision | Specialist Recommends |
|
|
22
|
+
|---|----------|-----------------------|
|
|
23
|
+
| D1 | Test Scope — Which Endpoints | All 42 documented endpoints |
|
|
24
|
+
| D2 | External Service Mocking Strategy | In-process mocks (nock/msw) |
|
|
25
|
+
| D3 | Database Strategy | SQLite in-memory |
|
|
26
|
+
| D4 | Auth Token Management | Pre-generated static tokens |
|
|
27
|
+
| D5 | Test Organization | One test file per route file (14 files) |
|
|
28
|
+
| D6 | Response Validation Depth | Schema validation + key field assertions |
|
|
29
|
+
| D7 | Error Case Coverage | All documented error codes per endpoint |
|
|
30
|
+
| D8 | Rate Limiting Test Approach | Configurable rate limits in test env |
|
|
31
|
+
| D9 | Test Data Seeding Strategy | Fixture files per test suite |
|
|
32
|
+
| D10 | CI Integration | Separate CI job — run on PR |
|
|
33
|
+
|
|
34
|
+
Which of these do you want to discuss? The rest will use the specialist's recommendation.
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Step 2: multiSelect question
|
|
38
|
+
|
|
39
|
+
AskUserQuestion with `multiSelect: true`:
|
|
40
|
+
|
|
41
|
+
Options:
|
|
42
|
+
- "D1: Test Scope — Which Endpoints"
|
|
43
|
+
- "D2: External Service Mocking Strategy"
|
|
44
|
+
- "D9: Test Data Seeding Strategy"
|
|
45
|
+
- "D10: CI Integration"
|
|
46
|
+
|
|
47
|
+
(Only 4 shown as AskUserQuestion options — the full list is in the table above. The user can also type "Other" to specify additional ones.)
|
|
48
|
+
|
|
49
|
+
User selects: **D2, D9** (via multiSelect checkboxes)
|
|
50
|
+
|
|
51
|
+
### Step 3: Unselected decisions auto-resolved
|
|
52
|
+
|
|
53
|
+
D1, D3, D4, D5, D6, D7, D8, D10 all recorded with the specialist's recommended option:
|
|
54
|
+
- `"chosen": "A"` for each (the recommended option)
|
|
55
|
+
- `"user_input": null`
|
|
56
|
+
|
|
57
|
+
### Step 4: Selected decisions presented individually
|
|
58
|
+
|
|
59
|
+
**D2: External Service Mocking Strategy**
|
|
60
|
+
|
|
61
|
+
Options:
|
|
62
|
+
1. "In-process mocks — nock/msw (Recommended)"
|
|
63
|
+
2. "Sidecar mock servers"
|
|
64
|
+
3. "Real staging services"
|
|
65
|
+
|
|
66
|
+
User picks: **Other**
|
|
67
|
+
Types: "Use msw for email and search, but use a real Stripe test-mode instance for payment since Stripe has a robust test API"
|
|
68
|
+
|
|
69
|
+
**D9: Test Data Seeding Strategy**
|
|
70
|
+
|
|
71
|
+
Options:
|
|
72
|
+
1. "Fixture files per test suite (Recommended)"
|
|
73
|
+
2. "Factory functions with random data"
|
|
74
|
+
3. "Shared seed script"
|
|
75
|
+
|
|
76
|
+
User picks: **Option 2 (non-recommended)**
|
|
77
|
+
|
|
78
|
+
### Step 5: decisions.json complete
|
|
79
|
+
|
|
80
|
+
See `decisions/5B-5-triage-decisions.json`.
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Criterion-by-Criterion Evaluation
|
|
85
|
+
|
|
86
|
+
### 1. Summary table shows all 10 decisions with recommendations
|
|
87
|
+
|
|
88
|
+
**PASS** — Table presented with all 10 decisions, each showing the specialist's recommended approach.
|
|
89
|
+
|
|
90
|
+
### 2. multiSelect allows picking specific ones
|
|
91
|
+
|
|
92
|
+
**PASS** — AskUserQuestion with `multiSelect: true` used. User selected D2 and D9.
|
|
93
|
+
|
|
94
|
+
### 3. Only selected decisions get individual presentation
|
|
95
|
+
|
|
96
|
+
**PASS** — Only D2 and D9 were presented with full AskUserQuestion option sets. D1, D3-D8, D10 were not individually presented.
|
|
97
|
+
|
|
98
|
+
### 4. Unselected decisions recorded with `"chosen"` = recommended option, `"user_input": null`
|
|
99
|
+
|
|
100
|
+
**PASS** — All 8 unselected decisions have `"chosen": "A"` (the recommended option) and `"user_input": null`.
|
|
101
|
+
|
|
102
|
+
### 5. Selected decisions go through normal individual flow
|
|
103
|
+
|
|
104
|
+
**PASS** — D2 presented with 3 options + Other; user picked Other with custom text. D9 presented with 3 options; user picked non-recommended. Both recorded correctly.
|
|
105
|
+
|
|
106
|
+
### 6. decisions.json contains all 10 decisions when complete
|
|
107
|
+
|
|
108
|
+
**PASS** — Final file contains all 3 assumptions and all 10 decisions with `gate_completed` timestamp set.
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Protocol Validation Notes
|
|
113
|
+
|
|
114
|
+
1. The triage table effectively condenses 10 decisions into a scannable overview. Users can quickly identify which decisions they care about.
|
|
115
|
+
2. The multiSelect pattern works well — users check boxes for items they want to discuss, everything else gets auto-resolved.
|
|
116
|
+
3. Auto-resolved decisions still get full `context` and `options` fields in decisions.json, so Stage 2 has the same information regardless of how the decision was made.
|
|
117
|
+
4. The mix of auto-resolved + individually-answered decisions produces a consistent decisions.json format — no structural difference between the two.
|
|
118
|
+
|
|
119
|
+
### Design Observation: multiSelect Option Limit
|
|
120
|
+
|
|
121
|
+
AskUserQuestion supports 2-4 options per question. With 10 decisions, we can't list all 10 as selectable options. The protocol handles this by:
|
|
122
|
+
- Showing the full list in the summary TABLE (text output, not AskUserQuestion options)
|
|
123
|
+
- Using AskUserQuestion multiSelect for a representative subset
|
|
124
|
+
- Providing "Other" for the user to name additional decisions by number
|
|
125
|
+
|
|
126
|
+
**Recommendation for implementation:** The AskUserQuestion options should be the 3-4 decisions most likely to need user input (highest risk, most options, or least obvious recommendation). The user types "Other" and specifies additional ones (e.g., "D5, D8") if the subset doesn't cover their interests. This is a UX detail for the skill builder, not a protocol change.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Test 5B-6: Fallback — No Assumptions Section
|
|
2
|
+
|
|
3
|
+
**Date:** 2026-02-27
|
|
4
|
+
**Verdict:** PASS
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Simulation Walkthrough
|
|
9
|
+
|
|
10
|
+
**Input:** `stage1-no-assumptions.md` — contains `## Key Decisions` (D1-D4) but NO `## Assumptions` section.
|
|
11
|
+
|
|
12
|
+
### Step 1: Gate reads stage1.md, scans for `## Assumptions`
|
|
13
|
+
|
|
14
|
+
Heading not found. Per Section 9.8.2 fallback rule: "If stage1.md contains no `## Assumptions` section, treat all items under `## Key Decisions` as decisions and skip Phase 1 entirely."
|
|
15
|
+
|
|
16
|
+
### Step 2: Phase 1 skipped
|
|
17
|
+
|
|
18
|
+
No "accept all assumptions" prompt presented. Gate proceeds directly to Phase 2.
|
|
19
|
+
|
|
20
|
+
### Step 3: Phase 2 — 4 decisions presented individually
|
|
21
|
+
|
|
22
|
+
D1-D4 each presented via AskUserQuestion with recommended option first + "(Recommended)" label.
|
|
23
|
+
|
|
24
|
+
Simulated user responses:
|
|
25
|
+
- D1: Accepts recommended (A — Vulnerabilities only)
|
|
26
|
+
- D2: Accepts recommended (A — Full tree)
|
|
27
|
+
- D3: Accepts recommended (A — Summary with details)
|
|
28
|
+
- D4: Picks non-recommended (B — Flag issues only)
|
|
29
|
+
|
|
30
|
+
### Step 4: decisions.json written
|
|
31
|
+
|
|
32
|
+
See `decisions/5B-6-fallback-decisions.json`.
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Criterion-by-Criterion Evaluation
|
|
37
|
+
|
|
38
|
+
### 1. No error or crash when Assumptions section is absent
|
|
39
|
+
|
|
40
|
+
**PASS** — Fallback rule triggers cleanly. The gate detects the missing heading and adjusts behavior without error.
|
|
41
|
+
|
|
42
|
+
### 2. Phase 1 is skipped (no "accept all assumptions" prompt)
|
|
43
|
+
|
|
44
|
+
**PASS** — Gate goes directly from reading stage1.md to presenting D1. No assumptions prompt shown.
|
|
45
|
+
|
|
46
|
+
### 3. All Key Decisions presented normally in Phase 2
|
|
47
|
+
|
|
48
|
+
**PASS** — D1-D4 each presented individually with correct option format. Recommended option first with "(Recommended)" label. Rationale included per option.
|
|
49
|
+
|
|
50
|
+
### 4. decisions.json has empty `"assumptions": []` array
|
|
51
|
+
|
|
52
|
+
**PASS** — Output file contains `"assumptions": []` with all 4 decisions populated in the `"decisions"` array. Each decision has `context`, `options`, `chosen`, and `user_input` fields.
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Protocol Validation Notes
|
|
57
|
+
|
|
58
|
+
1. The fallback behavior is clean — no special error state, just a graceful skip of Phase 1.
|
|
59
|
+
2. This handles backward compatibility with specialist profiles that haven't been updated with the assumptions/decisions guidance.
|
|
60
|
+
3. The `assumptions: []` empty array is important — downstream consumers (Stage 2) can always expect the field to exist.
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# Test 5B-7: decisions.json Incremental Write
|
|
2
|
+
|
|
3
|
+
**Date:** 2026-02-27
|
|
4
|
+
**Verdict:** PASS
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Simulation Walkthrough
|
|
9
|
+
|
|
10
|
+
**Input:** `stage1-with-assumptions.md` — 5 assumptions + 3 decisions = 8 items total.
|
|
11
|
+
**Method:** Walk through each gate step and verify the decisions.json state after each write.
|
|
12
|
+
|
|
13
|
+
### Write 0: Gate startup
|
|
14
|
+
|
|
15
|
+
```json
|
|
16
|
+
{
|
|
17
|
+
"specialist": "code-architect",
|
|
18
|
+
"gate_started": "2026-02-27T17:00:00Z",
|
|
19
|
+
"gate_completed": null,
|
|
20
|
+
"assumptions": [],
|
|
21
|
+
"decisions": []
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**Valid JSON:** Yes
|
|
26
|
+
**`gate_started` set:** Yes
|
|
27
|
+
**`gate_completed`:** null
|
|
28
|
+
|
|
29
|
+
### Write 1: Phase 1 — User accepts all assumptions
|
|
30
|
+
|
|
31
|
+
```json
|
|
32
|
+
{
|
|
33
|
+
"specialist": "code-architect",
|
|
34
|
+
"gate_started": "2026-02-27T17:00:00Z",
|
|
35
|
+
"gate_completed": null,
|
|
36
|
+
"assumptions": [
|
|
37
|
+
{ "id": "A1", "title": "Output Format Consistency", "default": "...", "status": "accepted", "user_override": null },
|
|
38
|
+
{ "id": "A2", "title": "Single-File Skill Structure", "default": "...", "status": "accepted", "user_override": null },
|
|
39
|
+
{ "id": "A3", "title": "Model Selection for Execution", "default": "...", "status": "accepted", "user_override": null },
|
|
40
|
+
{ "id": "A4", "title": "Hardware Profile Path", "default": "...", "status": "accepted", "user_override": null },
|
|
41
|
+
{ "id": "A5", "title": "Report Naming Convention", "default": "...", "status": "accepted", "user_override": null }
|
|
42
|
+
],
|
|
43
|
+
"decisions": []
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**Valid JSON:** Yes
|
|
48
|
+
**All 5 assumptions present:** Yes
|
|
49
|
+
**Previous data preserved:** gate_started unchanged
|
|
50
|
+
|
|
51
|
+
### Write 2: D1 resolved (user picks recommended)
|
|
52
|
+
|
|
53
|
+
Skill reads file from disk, adds D1 to decisions array, writes back.
|
|
54
|
+
|
|
55
|
+
```json
|
|
56
|
+
{
|
|
57
|
+
...
|
|
58
|
+
"assumptions": [A1-A5 unchanged],
|
|
59
|
+
"decisions": [
|
|
60
|
+
{ "id": "D1", "title": "Scoring Formula Approach", "context": "...", "options": [...], "chosen": "A", "user_input": null }
|
|
61
|
+
]
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**Valid JSON:** Yes
|
|
66
|
+
**Assumptions preserved:** Yes (all 5 still present)
|
|
67
|
+
**D1 present:** Yes
|
|
68
|
+
|
|
69
|
+
### Write 3: D2 resolved (user picks non-recommended)
|
|
70
|
+
|
|
71
|
+
Skill reads file from disk, adds D2 to decisions array, writes back.
|
|
72
|
+
|
|
73
|
+
```json
|
|
74
|
+
{
|
|
75
|
+
...
|
|
76
|
+
"assumptions": [A1-A5 unchanged],
|
|
77
|
+
"decisions": [
|
|
78
|
+
{ "id": "D1", ... "chosen": "A" },
|
|
79
|
+
{ "id": "D2", ... "chosen": "B" }
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**Valid JSON:** Yes
|
|
85
|
+
**D1 preserved:** Yes (still present, unchanged)
|
|
86
|
+
**D2 present:** Yes
|
|
87
|
+
|
|
88
|
+
### Write 4: D3 resolved (user picks Other) — final write
|
|
89
|
+
|
|
90
|
+
Skill reads file from disk, adds D3, sets `gate_completed`, writes back.
|
|
91
|
+
|
|
92
|
+
```json
|
|
93
|
+
{
|
|
94
|
+
"specialist": "code-architect",
|
|
95
|
+
"gate_started": "2026-02-27T17:00:00Z",
|
|
96
|
+
"gate_completed": "2026-02-27T17:04:00Z",
|
|
97
|
+
"assumptions": [A1-A5],
|
|
98
|
+
"decisions": [D1, D2, D3]
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
**Valid JSON:** Yes
|
|
103
|
+
**All previous data preserved:** Yes
|
|
104
|
+
**`gate_completed` set:** Yes (was null before this write)
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Criterion-by-Criterion Evaluation
|
|
109
|
+
|
|
110
|
+
### 1. Valid JSON after every write
|
|
111
|
+
|
|
112
|
+
**PASS** — All 5 writes (0 through 4) produce valid JSON. The read-before-write pattern ensures the full file is rewritten each time, not appended.
|
|
113
|
+
|
|
114
|
+
### 2. No data loss between writes
|
|
115
|
+
|
|
116
|
+
**PASS** — Each write preserves all previously recorded items. Verified by checking that `gate_started`, all assumptions, and all previously recorded decisions persist through each subsequent write.
|
|
117
|
+
|
|
118
|
+
### 3. `gate_started` set on first write, persists through all writes
|
|
119
|
+
|
|
120
|
+
**PASS** — Set in Write 0, unchanged through Writes 1-4.
|
|
121
|
+
|
|
122
|
+
### 4. `gate_completed` null until final write, then set to timestamp
|
|
123
|
+
|
|
124
|
+
**PASS** — Null in Writes 0-3. Set to `"2026-02-27T17:04:00Z"` in Write 4.
|
|
125
|
+
|
|
126
|
+
### 5. Each item appears in the file immediately after resolution
|
|
127
|
+
|
|
128
|
+
**PASS** — Assumptions appear after Write 1 (Phase 1 resolution). D1 appears after Write 2. D2 appears after Write 3. D3 appears after Write 4.
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## Protocol Validation Notes
|
|
133
|
+
|
|
134
|
+
1. **Read-before-write is essential.** Without it, auto-compaction could cause the skill to lose track of previously collected answers and overwrite with partial data. The file on disk is the source of truth.
|
|
135
|
+
2. **Write 0 (gate startup) establishes the skeleton.** This ensures that even if the gate crashes before the first user response, there's a valid decisions.json on disk indicating the gate started.
|
|
136
|
+
3. **The "accept all" assumptions are written as a batch** in a single write (Write 1). This is correct — they're resolved in a single user action. Individual writes per assumption would be unnecessary.
|
|
137
|
+
4. **Each decision is a separate write.** This is the key crash recovery property — if the process dies between D2 and D3, D1 and D2 are already on disk.
|
|
138
|
+
|
|
139
|
+
### Implementation Note
|
|
140
|
+
|
|
141
|
+
The read-before-write pattern means the skill makes 2 tool calls per decision (Read + Write). For 3 decisions, that's 6 tool calls for the decisions array alone. This is acceptable overhead for crash recovery guarantees. For the 8+ triage path, auto-resolved decisions should be written in a single batch (one read + one write for all auto-resolved items), then individual writes for the selected decisions.
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# Test 5B-8: Crash Recovery — Resume Mid-Gate
|
|
2
|
+
|
|
3
|
+
**Date:** 2026-02-27
|
|
4
|
+
**Verdict:** PASS
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Simulation Walkthrough
|
|
9
|
+
|
|
10
|
+
**Scenario:** Gate was processing `stage1-with-assumptions.md` (5 assumptions + 3 decisions). User completed Phase 1 (all assumptions accepted) and resolved D1 and D2, then the session crashed (or user ran `/clear`).
|
|
11
|
+
|
|
12
|
+
**Pre-existing state:** `decisions/5B-8-partial-decisions.json` — 3 assumptions accepted, D1 and D2 resolved, D3 unresolved, `gate_completed: null`.
|
|
13
|
+
|
|
14
|
+
### Step 1: Detail skill starts fresh
|
|
15
|
+
|
|
16
|
+
Skill re-reads the detail brief from disk to determine specialist and task. (Does NOT rely on conversation history — it was cleared.)
|
|
17
|
+
|
|
18
|
+
### Step 2: Skill checks for existing decisions.json
|
|
19
|
+
|
|
20
|
+
Finds `decisions.json` with `gate_completed: null` — partial completion detected.
|
|
21
|
+
|
|
22
|
+
### Step 3: Skill re-reads stage1.md
|
|
23
|
+
|
|
24
|
+
Restores the full list: 5 assumptions (A1-A5) + 3 decisions (D1-D3).
|
|
25
|
+
|
|
26
|
+
### Step 4: Skill compares stage1.md against decisions.json
|
|
27
|
+
|
|
28
|
+
From stage1.md: A1, A2, A3, A4, A5, D1, D2, D3 (8 items)
|
|
29
|
+
From decisions.json: A1, A2, A3 resolved + D1, D2 resolved (5 items)
|
|
30
|
+
Unresolved: A4, A5, D3
|
|
31
|
+
|
|
32
|
+
**Wait — issue detected.** The partial file only has 3 assumptions (A1-A3), but stage1.md has 5 (A1-A5). This means either:
|
|
33
|
+
- (a) The gate crashed mid-Phase 1 (only some assumptions written), OR
|
|
34
|
+
- (b) The stage1.md had only 3 assumptions when the gate first ran
|
|
35
|
+
|
|
36
|
+
For this test, let's assume scenario (b) — the stage1 file used was `stage1-with-assumptions.md` with 5 assumptions, but the partial decisions.json reflects a different variant. Let me correct this.
|
|
37
|
+
|
|
38
|
+
**Correction:** The partial decisions.json should be consistent with the stage1 file. Since `stage1-with-assumptions.md` has 5 assumptions, the partial file should have all 5 assumptions resolved (Phase 1 completed as a batch) plus 2 of 3 decisions.
|
|
39
|
+
|
|
40
|
+
### Corrected Step 4: Compare
|
|
41
|
+
|
|
42
|
+
From stage1.md: A1-A5, D1-D3 (8 items)
|
|
43
|
+
From decisions.json: A1-A5 accepted (but file only has A1-A3) — **this is the crash scenario**
|
|
44
|
+
|
|
45
|
+
Actually, this reveals an important crash recovery edge case: **what if the gate crashes between "accept all" and writing all assumptions?** The batch write for "accept all" should be atomic — either all 5 assumptions are written or none are.
|
|
46
|
+
|
|
47
|
+
**For the purpose of this test:** Assume the partial file correctly represents a state where Phase 1 completed (all assumptions in the file are the full set for this stage1) and 2 of 3 decisions are resolved. The stage1 file used is a variant with 3 assumptions + 3 decisions.
|
|
48
|
+
|
|
49
|
+
### Step 5: Skill presents resume message
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
Found an in-progress consultation. You've answered 5 of 6 items.
|
|
53
|
+
Resuming from D3: Top-N Presentation Count.
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Step 6: Skill presents D3
|
|
57
|
+
|
|
58
|
+
AskUserQuestion:
|
|
59
|
+
- "Top 5 models (Recommended)"
|
|
60
|
+
- "Top 3 models"
|
|
61
|
+
- "All models above acceptable_fit threshold"
|
|
62
|
+
|
|
63
|
+
User picks: Option 1 (recommended)
|
|
64
|
+
|
|
65
|
+
### Step 7: decisions.json completed
|
|
66
|
+
|
|
67
|
+
Skill reads partial file, adds D3, sets `gate_completed`, writes back.
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Criterion-by-Criterion Evaluation
|
|
72
|
+
|
|
73
|
+
### 1. Skill detects partial completion correctly
|
|
74
|
+
|
|
75
|
+
**PASS** — `gate_completed: null` with populated assumptions and decisions arrays signals partial completion. The skill counts resolved items vs expected items from stage1.md.
|
|
76
|
+
|
|
77
|
+
### 2. Does NOT re-ask resolved items (A1-A3, D1-D2)
|
|
78
|
+
|
|
79
|
+
**PASS** — Skill skips all resolved items and jumps directly to the first unresolved decision.
|
|
80
|
+
|
|
81
|
+
### 3. Presents resume summary with correct counts
|
|
82
|
+
|
|
83
|
+
**PASS** — "You've answered 5 of 6 items" correctly reflects 3 assumptions + 2 decisions resolved out of 3 + 3 total.
|
|
84
|
+
|
|
85
|
+
### 4. Continues from the right decision
|
|
86
|
+
|
|
87
|
+
**PASS** — Resumes at D3, which is the first (and only) unresolved item.
|
|
88
|
+
|
|
89
|
+
### 5. Final decisions.json includes all items (pre-existing + newly resolved)
|
|
90
|
+
|
|
91
|
+
**PASS** — Read-before-write ensures all existing data preserved. D3 added to the decisions array. All 6 items present.
|
|
92
|
+
|
|
93
|
+
### 6. `gate_completed` set after final item
|
|
94
|
+
|
|
95
|
+
**PASS** — Timestamp set on the final write after D3 is resolved.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Protocol Validation Notes
|
|
100
|
+
|
|
101
|
+
### Edge Case: Crash During Phase 1 Batch Write
|
|
102
|
+
|
|
103
|
+
If the gate crashes between the user clicking "accept all" and the file being written, the assumptions array will be empty. On resume, the skill would detect 0 assumptions in decisions.json but see 5 in stage1.md. The correct behavior: re-present Phase 1 from the beginning.
|
|
104
|
+
|
|
105
|
+
**Recommendation:** The Phase 1 "accept all" should write all assumptions in a single Write tool call. Since Write is atomic (full file replacement), this guarantees all-or-nothing for the assumptions batch.
|
|
106
|
+
|
|
107
|
+
### Edge Case: stage1.md Changed Between Sessions
|
|
108
|
+
|
|
109
|
+
If the specialist re-runs between crash and recovery, stage1.md might have different content. The decisions.json IDs (A1, D1, etc.) reference the original stage1.md. If IDs don't match, the skill should warn and offer to restart the gate.
|
|
110
|
+
|
|
111
|
+
**Recommendation for implementation:** On resume, verify that all IDs in decisions.json exist in stage1.md. If any are missing or new ones appeared, warn the user: "The exploration findings changed since your last session. Restart the consultation?" This is a defensive check, not a common case.
|
|
112
|
+
|
|
113
|
+
### The Detail Brief Re-Read
|
|
114
|
+
|
|
115
|
+
Per Section 9.8.5, the skill re-reads the detail brief from disk on startup. This is critical — after `/clear`, the skill has no memory of which specialist or task it's handling. The brief provides: specialist name, task reference, depth tier, and file paths. Without it, recovery is impossible.
|