immune-brain 4.1.0 → 4.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/README.md CHANGED
@@ -198,29 +198,55 @@ The three repair/maintenance skills are host-native: they never create a managed
198
198
 
199
199
  ## Lifecycle
200
200
 
201
+ ```mermaid
202
+ flowchart TD
203
+ subgraph Planning ["1. Planning Phase"]
204
+ B["imm-brainstorm<br/>Clarify Requirements & Constraints"] --> P["imm-planner<br/>Author Spec & TaskIntent"]
205
+ P --> TI["TaskIntent (.intent.json)<br/>• goal / scope_hint<br/>• risk tier<br/>• acceptance descriptors"]
206
+ end
207
+
208
+ subgraph Enrollment ["2. Enrollment Gate"]
209
+ TI --> EG{"Native User Gate<br/>Host Modal Confirmation"}
210
+ EG -->|Confirm| KS[(".imm/state/kernel.sqlite<br/>Atomic TaskRecord<br/>Exclusive Workspace Claim")]
211
+ end
212
+
213
+ subgraph Loop ["3. Execution & Assurance Loop (imm-loop)"]
214
+ KS --> EX["Executor Role<br/>Edit code strictly inside scope_hint"]
215
+ EX --> FRZ["advance_assurance<br/>Artifacts frozen (active:frozen)"]
216
+ FRZ --> QA["Deterministic QA Engine<br/>Run acceptance verification commands<br/>Generate QA Attestation"]
217
+
218
+ QA -->|Fail| RW1["Rework / Fix"]
219
+ RW1 --> EX
220
+
221
+ QA -->|Pass| RK{"Risk Tier?"}
222
+ RK -->|routine| ST["Settlement"]
223
+ RK -->|material / critical| RV["Review Role<br/>Structured verdict (Pass / Rework)"]
224
+
225
+ RV -->|Rework| RW2["Rework"]
226
+ RW2 --> EX
227
+ RV -->|Pass| ST
228
+ end
229
+
230
+ subgraph Settlement ["4. Settlement & Learnings"]
231
+ ST --> CLS["Atomic Closure<br/>• Lifecycle: done<br/>• Audit evidence in .imm/audit/<br/>• Release Workspace Claim"]
232
+ CLS -.-> CP["Compounder Role<br/>Extract Learnings to docs/solutions/"]
233
+ end
201
234
  ```
202
- Ordinary request: normal coding / Q&A (Host-native, zero overhead)
203
- │
204
- Explicit skill call (/imm-brainstorm or /imm-planner)
205
- │
206
- ┌──────────────┴──────────────┐
207
- ▼ ▼
208
- imm-brainstorm imm-planner
209
- (clarify requirements, (author Spec + TaskIntent,
210
- read-only framing) define acceptance checks)
211
- │ │
212
- └──────────────┬──────────────┘
213
- ▼
214
- Native Host Confirmation
215
- (Pi TUI dialog / Claude MCP elicitation)
216
- │
217
- ▼
218
- imm-loop
219
- ├── Executor (edits strictly inside scope)
220
- ├── Deterministic QA (runs all acceptance checks)
221
- ├── Isolated Review (independent subagent audit)
222
- └── Settled (.imm/audit/<task-id>/)
223
- ```
235
+
236
+ ### Core Logic: Three Pillars
237
+
238
+ 1. **Two Paths**
239
+ - **Host-native Path**: Daily conversation, code inspections, and ad-hoc fixes stay 100% native with zero workflow overhead.
240
+ - **Managed Path**: Explicitly entered via `imm-brainstorm`, `imm-planner`, or `imm-loop`, strictly governed by the Assurance Kernel.
241
+
242
+ 2. **Authority & Contract**
243
+ - **TaskIntent (`.intent.json`)**: Machine-readable behavioral contract locking `scope_hint` (file boundaries), `risk` tier, and `acceptance` descriptors.
244
+ - **Native Gate (Enrollment)**: The single human-authority confirmation gate; Kernel atomically acquires exclusive workspace ownership (`.imm/state/kernel.sqlite` CAS) to prevent concurrency conflicts and scope drift.
245
+
246
+ 3. **Deterministic Assurance**
247
+ - **QA-First**: The Kernel directly runs verification commands and checks exit codes/byte bounds; never relies on conversational claims.
248
+ - **Risk-Tiered Gates**: `routine` tasks complete upon QA pass; `material` and `critical` tasks require an isolated Review subagent to issue a structured verdict.
249
+ - **Unattended Batch**: Serial execution driven by GitHub Issues and bound by `plan_digest`, where each child independently completes its own Enrollment → QA → Review → Commit cycle.
224
250
 
225
251
  Key invariants:
226
252
 
package/README.zh-CN.md CHANGED
@@ -198,29 +198,55 @@ Executor、QA、Review、Compounder 等为 `imm-loop` 内部调度的角色,
198
198
 
199
199
  ## 生命周期
200
200
 
201
+ ```mermaid
202
+ flowchart TD
203
+ subgraph Planning ["1. 规划阶段"]
204
+ B["imm-brainstorm<br/>需求澄清/约束"] --> P["imm-planner<br/>编写 Spec & TaskIntent"]
205
+ P --> TI["TaskIntent (.intent.json)<br/>• goal / scope_hint<br/>• risk tier<br/>• acceptance descriptors"]
206
+ end
207
+
208
+ subgraph Enrollment ["2. 准入登记"]
209
+ TI --> EG{"Native User Gate<br/>当前 Host 弹窗确认"}
210
+ EG -->|确认| KS[(".imm/state/kernel.sqlite<br/>原子生成 TaskRecord<br/>独占 Workspace Claim")]
211
+ end
212
+
213
+ subgraph Loop ["3. 执行与验证循环 (imm-loop)"]
214
+ KS --> EX["Executor 角色<br/>在 scope_hint 范围内修改代码"]
215
+ EX --> FRZ["advance_assurance<br/>制品冻结 (active:frozen)"]
216
+ FRZ --> QA["确定性 QA 引擎<br/>原子运行 acceptance 校验命令<br/>生成 QA Attestation"]
217
+
218
+ QA -->|失败| RW1["Rework 返工修正"]
219
+ RW1 --> EX
220
+
221
+ QA -->|通过| RK{"Risk 等级?"}
222
+ RK -->|routine| ST["Settlement 结算"]
223
+ RK -->|material / critical| RV["Review 审查角色<br/>结构化裁决 (Pass / Rework)"]
224
+
225
+ RV -->|Rework| RW2["Rework 驳回"]
226
+ RW2 --> EX
227
+ RV -->|Pass| ST
228
+ end
229
+
230
+ subgraph Settlement ["4. 结算与沉淀"]
231
+ ST --> CLS["原子结项<br/>• Lifecycle: done<br/>• 写入审计日志 .imm/audit/<br/>• 释放 Workspace Claim"]
232
+ CLS -.-> CP["Compounder 角色<br/>提取经验至 docs/solutions/"]
233
+ end
201
234
  ```
202
- 普通请求:日常编程 / 问答(Host-native,零流程开销)
203
- │
204
- 显式调用 Skill(/imm-brainstorm 或 /imm-planner)
205
- │
206
- ┌──────────────┴──────────────┐
207
- ▼ ▼
208
- imm-brainstorm imm-planner
209
- (澄清需求、约束与风险, (编写 Spec + TaskIntent,
210
- 只读输出 framing) 定义可自动化验证的验收条件)
211
- │ │
212
- └──────────────┬──────────────┘
213
- ▼
214
- 当前 Host 原生确认
215
- (Pi TUI 弹窗 / Claude MCP elicitation)
216
- │
217
- ▼
218
- imm-loop
219
- ├── Executor(严格在 scope 内修改代码)
220
- ├── 确定性 QA(前台逐项执行验收命令)
221
- ├── 隔离式 Review(独立 subagent 审查代码)
222
- └── 落盘结算(.imm/audit/<task-id>/)
223
- ```
235
+
236
+ ### 核心逻辑三要素
237
+
238
+ 1. **双轨制 (Two Paths)**
239
+ - **Host-native Path**:日常对话、代码检视、单点修改,不触碰 Kernel 权限,零流程开销。
240
+ - **Managed Path**:由 `imm-brainstorm` / `imm-planner` / `imm-loop` 显式驱动,全程受 Kernel 约束。
241
+
242
+ 2. **权限与契约 (Authority & Contract)**
243
+ - **TaskIntent (`.intent.json`)**:机器契约本体,严格锁定 `scope_hint`(文件修改范围)、`risk`(风险层级)与 `acceptance`(确定性断言)。
244
+ - **Native Gate (Enrollment)**:唯一一次人工介入确认,Kernel 原子抢占工作区所有权(SQLite CAS),防止多任务并发冲突与范围漂移。
245
+
246
+ 3. **客观验证 (Deterministic Assurance)**
247
+ - **QA 优先**:由 Kernel 直接前台执行命令并校验退出码/输出,不依赖 LLM 口头汇报。
248
+ - **按险定级**:`routine` 仅需 QA;`material`/`critical` 必须追加独立只读 Reviewer 产出结构化裁决。
249
+ - **批处理 (Unattended Batch)**:基于 GitHub Issue / `plan_digest` 串行推进,每个子任务独立走完 Enrollment → QA → Review → Commit 闭环。
224
250
 
225
251
  核心不变量:
226
252
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "immune-brain",
3
- "version": "4.1.0",
3
+ "version": "4.2.0",
4
4
  "description": "Immune-Brain agent skill system",
5
5
  "publishConfig": {
6
6
  "access": "public",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "immune-brain",
3
- "version": "4.1.0",
3
+ "version": "4.2.0",
4
4
  "description": "Immune-Brain Claude Code Host: native Enrollment, QA, Review, and Kernel settlement.",
5
5
  "author": {
6
6
  "name": "Immune-Brain Team"
@@ -588,11 +588,12 @@ export default function (
588
588
  }
589
589
  const projection = await projectAssuranceState(ctx.cwd, taskId);
590
590
  if (projection.error) {
591
+ const nextAction = recoveryActionForAssuranceFailure(projection.error) ?? "inspect authority state";
591
592
  const details = {
592
593
  state: "blocked",
593
594
  operation: action.op,
594
595
  result: projection.error,
595
- next_action: "inspect authority state",
596
+ next_action: nextAction,
596
597
  };
597
598
  presentTaskRailResult(ctx, taskId, details);
598
599
  return failCanaryTool(taskId, action.op, "blocked", "projection_unavailable", projection.error, details.next_action);
@@ -1536,7 +1537,7 @@ async function buildAssuranceSnapshot(
1536
1537
  })
1537
1538
  : null;
1538
1539
  const taskSnapshot = !reviewBundle && !reviewManifest
1539
- ? captureGitTaskSnapshot(root, intent.scope_hint)
1540
+ ? captureGitTaskSnapshot(root, intent.scope_hint, taskId)
1540
1541
  : null;
1541
1542
  const dirtyFiles = reviewManifest
1542
1543
  ? Object.keys(reviewManifest.changed_paths)
@@ -1760,6 +1761,10 @@ async function enrichAssuranceResult(
1760
1761
  }
1761
1762
 
1762
1763
  function nextActionForAssuranceResult(result: Record<string, unknown>, taskState: AssuranceTaskState): string {
1764
+ const recovery = recoveryActionForAssuranceFailure(
1765
+ "error" in taskState ? taskState.error : result.reason,
1766
+ );
1767
+ if (recovery) return recovery;
1763
1768
  if ("error" in taskState) return "inspect authority state";
1764
1769
  if (result.state === "review_preparation_failed") return "repair Review preparation, then retry advance_assurance; QA is already committed";
1765
1770
  if (result.code === "verdict_invalid") return "fix the verdict payload and resubmit submit_review; the Review reservation remains active; do not re-dispatch the reviewer";
@@ -1779,6 +1784,17 @@ function nextActionForAssuranceResult(result: Record<string, unknown>, taskState
1779
1784
  }
1780
1785
  }
1781
1786
 
1787
+ function recoveryActionForAssuranceFailure(reason: unknown): string | null {
1788
+ if (typeof reason !== "string") return null;
1789
+ if (reason.includes("task scope contains unstaged or untracked changes:"))
1790
+ return "stage only the listed task-owned paths, then retry the blocked operation";
1791
+ if (reason.includes("QA resolution failed ("))
1792
+ return "repair the verification command or delivery environment, then retry advance_assurance";
1793
+ if (reason.includes("task delivery contains paths outside the authorization envelope:"))
1794
+ return "reconcile the listed paths: unstage unrelated paths or revise TaskIntent scope for task-owned paths, then retry advance_assurance";
1795
+ return null;
1796
+ }
1797
+
1782
1798
  function toolResult(text: string, details?: Record<string, unknown>) {
1783
1799
  return { content: [{ type: "text" as const, text }], details };
1784
1800
  }
@@ -6,7 +6,9 @@
6
6
  from `dist/`; nested modes, examples, recovery, and references load on demand.
7
7
  - Ask only when missing information would change the goal, scope, observable behavior, compatibility, risk acceptance, a protected effect, or a fact only the user can supply. Resolve repository facts and delegated technical choices with bounded evidence instead of asking.
8
8
  - Keep edits inside the user-requested Direct scope or the enrolled TaskIntent acceptance and `scope_hint`.
9
- - Stage only explicit task-owned paths. Never use `git add .` or `git add -A` in a dirty worktree.
9
+ - Stage only explicit task-owned paths. This staging authority does not grant
10
+ commit, push, broad staging, or authority over pre-existing user changes.
11
+ Never use `git add .` or `git add -A` in a dirty worktree.
10
12
  - Do not create, switch, or delete Git worktrees; operate only in the Host launch directory.
11
13
  - Record reproducible evidence before reporting closure.
12
14
  - Required verification must pass before reporting completion; disclosing a gap is not a substitute. Autonomously diagnose, repair, and rerun failing conventional local checks within the authorized scope; never delete, skip, or weaken a valid check to manufacture a pass. If a required check remains failing or cannot run, report the work as incomplete with the concrete blocker.
@@ -46,7 +48,9 @@ routing. A new Managed workflow starts only from explicit `imm-brainstorm`,
46
48
  Managed owner remains authoritative; the user resumes it with `imm-loop`.
47
49
  2. **Start explicitly**: the selected Immune-Brain Skill owns its planning or
48
50
  coordination work. It creates only requested artifacts and their required
49
- parent directories; it does not install project-wide contract files.
51
+ parent directories. Explicit Planner entry also owns absent routing-policy
52
+ activation under Planner's Kernel TaskIntent Routing section;
53
+ it does not otherwise install project-wide contract files.
50
54
  3. **Preserve authority**: Planner output is a candidate for later literal-user
51
55
  Enrollment, and Fast-Track preserves TaskIntent scope, Enrollment, QA,
52
56
  Review, authorization, and completion boundaries.
@@ -39,7 +39,7 @@ function probeHost(env = process.env, platform = process.platform, hostVersion)
39
39
  }
40
40
 
41
41
  // plugins/immune-brain/runtime/plugin_version.ts
42
- var PLUGIN_VERSION = "4.1.0";
42
+ var PLUGIN_VERSION = "4.2.0";
43
43
 
44
44
  // plugins/immune-brain/runtime/claude/interaction.ts
45
45
  import { createHash, randomUUID } from "node:crypto";
@@ -55,7 +55,12 @@ Continue while the current projection has a valid action:
55
55
  1. For active artifacts, implement only the enrolled acceptance within the
56
56
  `scope_hint` envelope in the current conversation. New helpers or tests
57
57
  inside an approved directory or glob do not require a revision. Run focused
58
- checks. Executor checks are diagnostic evidence, not a QA or Review approval.
58
+ checks. Before `advance_assurance`, inspect ownership and stage only the exact
59
+ task-owned paths needed for delivery. Do not hand routine task-owned staging
60
+ to the user. If a file mixes pre-existing user changes with task changes and
61
+ the task-owned hunks cannot be isolated reliably, stop with that ownership
62
+ conflict instead of staging the whole file. Staging grants no commit or push
63
+ authority. Executor checks are diagnostic evidence, not a QA or Review approval.
59
64
  2. Call `advance_assurance` in the foreground and consume its direct terminal
60
65
  result. The Kernel freezes the artifacts itself before QA: it binds Git
61
66
  content identity in place without relocating source paths. A simple task has
@@ -76,7 +76,8 @@ Then route deterministically:
76
76
  coordination, except a Loop-requested revision follows Enrolled Intent Revision
77
77
  below to prepare a non-authoritative proposal for that same owner;
78
78
  - an active or otherwise nonterminal v3 Plan remains on its existing v3 route;
79
- - no routing policy preserves the legacy v3 Planner behavior;
79
+ - no routing policy on an otherwise unowned workspace triggers automatic policy
80
+ activation below before producing any planning artifact;
80
81
  - a valid `kernel_task_intent` retirement policy produces one TaskIntent draft
81
82
  through the current Host's explicit `imm-planner`;
82
83
  - an invalid, unreadable, untracked, or tracked-deleted policy rejects new
@@ -107,6 +108,46 @@ workspace claim, and final authority preconditions without executing acceptance
107
108
  descriptors. A routine task proceeds from that single confirmation through
108
109
  enrollment, execution and QA without a second human stop.
109
110
 
111
+ **Automatic policy activation**
112
+
113
+ Explicit `imm-planner` entry includes local routing setup, including for plan-only
114
+ requests. When the routing projection reports `policy_status: legacy_v3` and
115
+ `ownership: absent`, and neither Kernel nor nonterminal v3 ownership exists,
116
+ perform these steps without a separate enablement question:
117
+
118
+ 1. Create `docs/plans/` if needed. Require real directories without symlink
119
+ components; create `docs/plans/managed-task-routing-policy.json` exclusively
120
+ (fail if it already exists), using exactly the JSON below with two-space
121
+ indentation, the shown field order, and one trailing newline.
122
+ 2. Run `git add -- docs/plans/managed-task-routing-policy.json` only for the file
123
+ created in this activation. Preserve all other worktree and index changes;
124
+ do not commit, force-add an ignored file, or alter Git configuration.
125
+ 3. Re-run `imm-plan --routing-status --json` through the resolved wrapper.
126
+ Continue canonical TaskIntent authoring only when `policy_status: active`,
127
+ `route: kernel_task_intent`, and `ownership: tracked_clean` all hold. Report
128
+ automatic activation briefly and continue planning in the same turn.
129
+
130
+ ```json
131
+ {
132
+ "contract": "immune_brain/managed_task_routing_policy/v1",
133
+ "revision": 1,
134
+ "new_task_route": "kernel_task_intent",
135
+ "v3_new_plan_sync": "retired",
136
+ "legacy_v3_mode": "drain_read_only",
137
+ "terminal_import": "disabled"
138
+ }
139
+ ```
140
+
141
+ An already active policy needs no write or staging. An existing invalid,
142
+ untracked, unreadable, tracked-deleted, or divergent policy is not an activation
143
+ candidate: preserve it and report `routing_policy_invalid`. If creation,
144
+ staging, or verification fails, report the concrete blocker and retain any
145
+ created file; stop before authoring, without overwriting existing bytes or
146
+ falling back to v3. A repository/user prohibition on policy setup or staging
147
+ blocks only this dependent planning step. Activation grants no execution
148
+ authority; the native Enrollment gate remains required. Read-only routing
149
+ queries and the canonical author command retain their existing runtime behavior.
150
+
110
151
  ## Candidate Authoring
111
152
 
112
153
  Read this section before creating new candidate artifacts, after request routing
@@ -133,6 +174,12 @@ file creation; then it validates the created artifact with
133
174
  continue through Kernel `revise_intent` authority and are not a Planner
134
175
  overwrite path.
135
176
 
177
+ After authoring, inspect ownership and stage only the exact Planner-produced
178
+ Spec and TaskIntent paths before validation and handoff. Do not hand routine
179
+ Planner-owned staging to the user. This grants no commit, push, broad staging,
180
+ or authority over pre-existing user changes; a mixed-change ownership conflict
181
+ stops only the affected handoff.
182
+
136
183
  Before authoring a TaskIntent that adds a field or verdict branch to a state
137
184
  machine, enumerate every consumer of that value and of the version gates around
138
185
  it: the producing side, each branch or switch that reads it, and any migration or
@@ -263,7 +310,12 @@ script or host tool through its literal `command`; do not infer a language,
263
310
  package manager, or runner. Add `environment.prepare` only when the check needs
264
311
  explicit setup, and declare only the generated directories it needs in
265
312
  `environment.writable_paths`. Never hide package installation inside an
266
- acceptance command. Prefer the highest existing observable behavioral test seam
313
+ acceptance command. For every descriptor, identify whether its executable is
314
+ provided by the QA host or by tracked delivery content, where every dependency
315
+ comes from in the disposable delivery, what explicit setup is required, and
316
+ which declared writable paths that setup or check creates. A dependency found
317
+ only in the Planner's live worktree, including an absolute local `node_modules`
318
+ path, is not delivery provenance. Prefer the highest existing observable behavioral test seam
267
319
  and the fewest sufficient seams; never use the full test suite, a build, network
268
320
  access, or redundant heavyweight checks as acceptance. Cite relevant test prior
269
321
  art and explain how the selected seam catches the intended regression. This is
@@ -271,7 +323,9 @@ a planning heuristic: it must not weaken acceptance-specific focused
271
323
  verification descriptors or add a mandatory user confirmation. Use the smallest
272
324
  `timeout_ms` and `max_output_bytes` that cover deterministic post-implementation
273
325
  QA. A v1 descriptor is historical-only and requires explicit Intent revision
274
- before execution.
326
+ before execution. Report `valid` and `enrollment_ready` only as structural and
327
+ Enrollment readiness; only a completed deterministic QA result proves that a
328
+ descriptor executed and passed.
275
329
 
276
330
  ## Core Responsibilities
277
331
 
@@ -410,7 +464,7 @@ optional advisory dispatch fails, continue inline and record the reason.
410
464
 
411
465
  ## Boundary
412
466
 
413
- - **Allowed**: Write a TaskIntent. Add a Spec only for complex work. Initiative planning carriers and necessary domain vocabulary.
467
+ - **Allowed**: Write a TaskIntent. Add a Spec only for complex work. Activate an absent routing policy under Kernel TaskIntent Routing. Initiative planning carriers and necessary domain vocabulary.
414
468
  - **Blocked**: Implementation edits, direct Kernel-store writes, enrolled intent overwrites, and QA/Review decisions.
415
469
  - **Workflow guard**: Execution continues through native Enrollment and explicit `imm-loop`. Planner owns design and decomposition, not execution authority.
416
470
 
@@ -1,2 +1,2 @@
1
1
  // Generated by scripts/plugin_versioning.ts from the root package.json.
2
- export const PLUGIN_VERSION = "4.1.0" as const;
2
+ export const PLUGIN_VERSION = "4.2.0" as const;
@@ -6,7 +6,9 @@
6
6
  from `dist/`; nested modes, examples, recovery, and references load on demand.
7
7
  - Ask only when missing information would change the goal, scope, observable behavior, compatibility, risk acceptance, a protected effect, or a fact only the user can supply. Resolve repository facts and delegated technical choices with bounded evidence instead of asking.
8
8
  - Keep edits inside the user-requested Direct scope or the enrolled TaskIntent acceptance and `scope_hint`.
9
- - Stage only explicit task-owned paths. Never use `git add .` or `git add -A` in a dirty worktree.
9
+ - Stage only explicit task-owned paths. This staging authority does not grant
10
+ commit, push, broad staging, or authority over pre-existing user changes.
11
+ Never use `git add .` or `git add -A` in a dirty worktree.
10
12
  - Do not create, switch, or delete Git worktrees; operate only in the Host launch directory.
11
13
  - Record reproducible evidence before reporting closure.
12
14
  - Required verification must pass before reporting completion; disclosing a gap is not a substitute. Autonomously diagnose, repair, and rerun failing conventional local checks within the authorized scope; never delete, skip, or weaken a valid check to manufacture a pass. If a required check remains failing or cannot run, report the work as incomplete with the concrete blocker.
@@ -46,7 +48,9 @@ routing. A new Managed workflow starts only from explicit `imm-brainstorm`,
46
48
  Managed owner remains authoritative; the user resumes it with `imm-loop`.
47
49
  2. **Start explicitly**: the selected Immune-Brain Skill owns its planning or
48
50
  coordination work. It creates only requested artifacts and their required
49
- parent directories; it does not install project-wide contract files.
51
+ parent directories. Explicit Planner entry also owns absent routing-policy
52
+ activation under Planner's Kernel TaskIntent Routing section;
53
+ it does not otherwise install project-wide contract files.
50
54
  3. **Preserve authority**: Planner output is a candidate for later literal-user
51
55
  Enrollment, and Fast-Track preserves TaskIntent scope, Enrollment, QA,
52
56
  Review, authorization, and completion boundaries.