cairn-ai 0.3.0 → 0.4.1

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.
@@ -8,7 +8,7 @@ Goal: show an initial plan and goal before triage can be interrupted, then leave
8
8
 
9
9
  Paths: routine known-target Git/GitHub operations (status, fetch, checkout, branch, merge, push, PR management) stay plan/goal-free unless they require code edits, conflict resolution, destructive recovery, release/deploy, or design. Quick Path needs no `docs/plan` artifact and no goal when all hold: unambiguous requirements; about 3 files or fewer inside existing layers; no Heavy Path signal; no external-state mutation; one or two verification commands. Implement, run one focused check plus the project's normal check, and report; if any criterion fails, escalate to Light Path (plan + goal) before further edits. Otherwise use Light Path by default and Heavy Path only when a Heavy Path condition clearly applies.
10
10
 
11
- Complexity is staged: request checkpoint, planning checkpoint after exploration, and code checkpoint immediately before the first edit. Before editing, either route may change; after editing begins, only Light → Heavy promotion is allowed. Every change synchronizes the plan artifact, repository goal task roadmap through `goal replan`, native UI plan, and reasoning effort profile. Models always inherit; request Light `medium`, Heavy `high`, final verification/review `xhigh`.
11
+ Complexity is staged: request checkpoint, planning checkpoint after exploration, and code checkpoint immediately before the first edit. Before editing, either route may change; after editing begins, only Light → Heavy promotion is allowed. Every change synchronizes the plan artifact, repository goal task roadmap through `goal replan`, native UI plan, and reasoning effort profile. Choose each task's model by its nature (fast, balanced, stronger, strongest) and pass it with effort through the host option; request Light `medium`, Heavy `high`, final verification/review `xhigh`.
12
12
 
13
13
  Procedure:
14
14
 
@@ -6,7 +6,7 @@ Read the installed Cairn runtime locator at `{{CAIRN_RUNTIME_LOCATOR_JSON}}`. Re
6
6
 
7
7
  Goal: execute the active goal's current task without bypassing complexity triage, then keep advancing tasks until goal-level final review completes or the goal is explicitly paused, blocked, or cancelled. Quick Path work has no plan or goal: implement, run one focused check plus the project's normal check, and report; escalate to Light Path (plan + goal) before further edits if any Quick Path criterion fails.
8
8
 
9
- Record the code checkpoint after exact file/caller/test inspection immediately before the first edit. After editing begins, a new Heavy Path signal promotes Light Path to Heavy Path: stop further edits, mark affected evidence stale, synchronize the plan artifact, `goal replan` roadmap, and native UI plan, and repeat the code checkpoint. Models always inherit; request Light `medium`, Heavy `high`, final verification/review `xhigh`.
9
+ Record the code checkpoint after exact file/caller/test inspection immediately before the first edit. After editing begins, a new Heavy Path signal promotes Light Path to Heavy Path: stop further edits, mark affected evidence stale, synchronize the plan artifact, `goal replan` roadmap, and native UI plan, and repeat the code checkpoint. Choose each task's model by its nature (fast, balanced, stronger, strongest) and pass it with effort through the host option; request Light `medium`, Heavy `high`, final verification/review `xhigh`.
10
10
 
11
11
  Procedure:
12
12
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cairn",
3
- "version": "0.3.0",
3
+ "version": "0.4.1",
4
4
  "description": "Token-efficient agent harness with tool readiness for Codex, Claude Code, and Antigravity.",
5
5
  "author": {
6
6
  "name": "WkNam"
package/README.ko.md CHANGED
@@ -28,7 +28,7 @@ Cairn은 실행 정책에서는 LazyCodex와 다릅니다. LazyCodex의 role-cha
28
28
 
29
29
  선택된 path와 근거는 계획 산출물이 있을 때 `docs/plan/<topic>.md`에 기록합니다. Light Path에서도 두 검증 게이트는 유지됩니다. subagent 도구가 없으면 main agent가 implementation을 직접 인계하고, 그 takeover를 evidence에 기록합니다.
30
30
 
31
- Cairn은 host/user model을 상속하고 reasoning effort만 라우팅합니다. Light 계획·구현·검증은 `medium`, Heavy 계획·검토·구현은 `high`, 최종 검증·검토는 `xhigh`를 요청합니다. Requested는 Cairn이 원하는 profile이고 Effective는 dispatch 결과가 확인한 적용값입니다. `effective: inherited`는 task별 override가 확인되지 않았다는 뜻이지 host capability 부재의 증거가 아닙니다. Host capability는 노출된 interface 또는 dispatch 응답으로만 판단하고, Cairn이 option을 통합/사용하지 않기로 한 선택과 host 미지원은 구분합니다. path가 바뀌면 plan artifact, 저장소 goal task roadmap, native UI plan, effort profile을 함께 동기화하고 완료 profile은 보존하며 미완료 profile은 재계산합니다.
31
+ Cairn은 task 성격에 따라 task별 model(fast `haiku`, balanced `sonnet`, stronger `opus`, strongest `fable`)을 정하고 reasoning effort도 라우팅합니다. `MEMORY.md`나 계획에 `Model routing: inherited`를 적으면 작업별 model 선택이 꺼집니다. Light 계획·구현·검증은 `medium`, Heavy 계획·검토·구현은 `high`, 최종 검증·검토는 `xhigh`를 요청합니다. Requested는 Cairn이 원하는 profile이고 Effective는 dispatch 결과가 확인한 적용값입니다. 새 task/worker dispatch마다 정한 model과 요청 effort를 host option으로 반드시 넘깁니다(Claude Code: Agent `model`/`effort`, `fork` 금지). Effective는 넘긴 값이고, 넘기지 않았으면 `not-applied: <사유>`, host에 option이 없을 때만 `inherited`입니다. Host capability는 노출된 interface 또는 dispatch 응답으로만 판단하고, Cairn이 option을 통합/사용하지 않기로 한 선택과 host 미지원은 구분합니다. path가 바뀌면 plan artifact, 저장소 goal task roadmap, native UI plan, effort profile을 함께 동기화하고 완료 profile은 보존하며 미완료 profile은 재계산합니다.
32
32
 
33
33
  subagent 도구가 progress-reporting channel을 제공하면 subagent는 작업 시작, 방향 결정/확인, 주기적 진행, 완료 시점에 orchestrator에게 상태를 보고합니다. orchestrator는 받은 status event를 즉시 사용자에게 전달합니다. mid-run reporting channel이 없으면 orchestrator는 할당, 대기, 최종 완료처럼 관측 가능한 event를 사용자에게 전달합니다.
34
34
 
package/README.md CHANGED
@@ -36,7 +36,7 @@ Every implementation task passes complexity triage first, before agent, plugin,
36
36
 
37
37
  The selected path and rationale are recorded in `docs/plan/<topic>.md` when a plan artifact exists. Even on Light Path, the two verification gates remain. If subagent tools are unavailable, the main agent takes over implementation directly and records that takeover in evidence.
38
38
 
39
- Cairn inherits the host/user model and routes only reasoning effort. Light planning, implementation, and verification request `medium`; Heavy planning, review, and implementation request `high`; final verification/review requests `xhigh`. `Requested` is Cairn's desired profile; `Effective` records what the dispatch actually applied. `Effective: inherited` means no task-level override was confirmed, not that the host lacks the capability. Host capability may be claimed only from an exposed interface or dispatch result; Cairn choosing not to integrate or use an option is a separate decision. Only a newly dispatched task/worker may receive a supported effort option. When the path changes, the plan artifact, repository goal task roadmap, native UI plan, and effort profile are synchronized together; completed profiles are preserved and incomplete profiles are recalculated.
39
+ Cairn chooses each task's model by its nature (fast `haiku`, balanced `sonnet`, stronger `opus`, strongest `fable`) and routes reasoning effort; `Model routing: inherited` in `MEMORY.md` or the plan disables per-task model selection. Light planning, implementation, and verification request `medium`; Heavy planning, review, and implementation request `high`; final verification/review requests `xhigh`. `Requested` is Cairn's desired profile; `Effective` records what the dispatch actually applied. Every new task/worker dispatch must pass the chosen model and requested effort through the host option (Claude Code: Agent `model`/`effort`, never `fork`); `Effective` is the passed value, `not-applied: <reason>` when it was not passed, and `inherited` only when the host has no option. Host capability may be claimed only from an exposed interface or dispatch result; Cairn choosing not to integrate or use an option is a separate decision. Only a newly dispatched task/worker may receive a supported effort option. When the path changes, the plan artifact, repository goal task roadmap, native UI plan, and effort profile are synchronized together; completed profiles are preserved and incomplete profiles are recalculated.
40
40
 
41
41
  When the subagent tool provides a progress-reporting channel, subagents report status to the orchestrator when starting work, when deciding or confirming direction, during periodic progress, and when finishing. The orchestrator immediately relays received status events to the user. If no mid-run reporting channel exists, the orchestrator relays observable events such as assignment, waiting, and final completion.
42
42
 
package/agents/worker.md CHANGED
@@ -29,7 +29,7 @@ Never edit, weaken, skip, or delete existing tests, fixtures, or verification co
29
29
 
30
30
  Before the first edit, inspect the assigned exact files, callers, and tests and report evidence for the plan's code checkpoint. If you discover a new Heavy Path signal before or during implementation, stop further edits and report it to the orchestrator so the plan artifact, repository goal task roadmap, native UI plan, review requirements, and stale evidence can be updated. Resume only after a new code checkpoint is recorded.
31
31
 
32
- Keep the model inherited. Read the task's `Requested reasoning effort` and `Effective reasoning effort`: Requested is Cairn's desired profile; Effective is what the dispatch response confirms. A newly delegated task or new worker may receive requested effort only through a host-exposed task/subagent reasoning-effort option or host-native equivalent; omit model overrides. For an unsupported host or value, report Effective `inherited`; this means no task override was confirmed, not proof that the host lacks capability. Describe capability only from the exposed interface or dispatch response, distinguish Cairn non-integration from host non-support, and do not alter model/global config.
32
+ Read the task's `Requested model` and `Effective model` too: model is chosen per task (fast `haiku`, balanced `sonnet`, stronger `opus`, strongest `fable`). Read the task's `Requested reasoning effort` and `Effective reasoning effort`: Requested is Cairn's desired profile; Effective is what the dispatch response confirms. Every child task/worker you dispatch MUST receive the requested model and effort through the host-exposed task/subagent reasoning-effort option or host-native equivalent (Claude Code: Agent `model`/`effort`, never `fork`); recording without passing is a defect. Report Effective as the requested value when passed and not rejected, `not-applied: <reason>` when not passed, and `inherited` only when the host exposes no effort option. Describe capability only from the exposed interface or dispatch response, distinguish Cairn non-integration from host non-support, and do not alter global/user config.
33
33
 
34
34
  Use this prompt format:
35
35
 
@@ -8,7 +8,7 @@ Goal: show an initial plan and goal before triage can be interrupted, then leave
8
8
 
9
9
  Paths: routine known-target Git/GitHub operations (status, fetch, checkout, branch, merge, push, PR management) stay plan/goal-free unless they require code edits, conflict resolution, destructive recovery, release/deploy, or design. Quick Path needs no `docs/plan` artifact and no goal when all hold: unambiguous requirements; about 3 files or fewer inside existing layers; no Heavy Path signal; no external-state mutation; one or two verification commands. Implement, run one focused check plus the project's normal check, and report; if any criterion fails, escalate to Light Path (plan + goal) before further edits. Otherwise use Light Path by default and Heavy Path only when a Heavy Path condition clearly applies.
10
10
 
11
- Complexity is staged: request checkpoint, planning checkpoint after exploration, and code checkpoint immediately before the first edit. Before editing, either route may change; after editing begins, only Light → Heavy promotion is allowed. Every change synchronizes the plan artifact, repository goal task roadmap through `goal replan`, native UI plan, and reasoning effort profile. Models always inherit; request Light `medium`, Heavy `high`, final verification/review `xhigh`.
11
+ Complexity is staged: request checkpoint, planning checkpoint after exploration, and code checkpoint immediately before the first edit. Before editing, either route may change; after editing begins, only Light → Heavy promotion is allowed. Every change synchronizes the plan artifact, repository goal task roadmap through `goal replan`, native UI plan, and reasoning effort profile. Choose each task's model by its nature (fast, balanced, stronger, strongest) and pass it with effort through the host option; request Light `medium`, Heavy `high`, final verification/review `xhigh`.
12
12
 
13
13
  Procedure:
14
14
 
@@ -6,7 +6,7 @@ Prerequisite: resolve the installed Cairn runtime from the plugin or skill locat
6
6
 
7
7
  Goal: execute the active goal's current task without bypassing complexity triage, then keep advancing tasks until goal-level final review completes or the goal is explicitly paused, blocked, or cancelled. Quick Path work has no plan or goal: implement, run one focused check plus the project's normal check, and report; escalate to Light Path (plan + goal) before further edits if any Quick Path criterion fails.
8
8
 
9
- Record the code checkpoint after exact file/caller/test inspection immediately before the first edit. After editing begins, a new Heavy Path signal promotes Light Path to Heavy Path: stop further edits, mark affected evidence stale, synchronize the plan artifact, `goal replan` roadmap, and native UI plan, and repeat the code checkpoint. Models always inherit; request Light `medium`, Heavy `high`, final verification/review `xhigh`.
9
+ Record the code checkpoint after exact file/caller/test inspection immediately before the first edit. After editing begins, a new Heavy Path signal promotes Light Path to Heavy Path: stop further edits, mark affected evidence stale, synchronize the plan artifact, `goal replan` roadmap, and native UI plan, and repeat the code checkpoint. Choose each task's model by its nature (fast, balanced, stronger, strongest) and pass it with effort through the host option; request Light `medium`, Heavy `high`, final verification/review `xhigh`.
10
10
 
11
11
  Procedure:
12
12
 
@@ -48,14 +48,16 @@ The goal is not to make prompts long by model. The goal is to stabilize the same
48
48
  - Character budgets are regression proxies for cache-friendly prompt shape, not measurements of provider cache hits or cost. Cairn does not require provider cache keys, breakpoints, or live API telemetry.
49
49
  - Do not add read receipts that claim model attention. Restore references on every re-entry and use readable state plus fresh bound evidence as the enforceable contract.
50
50
 
51
- ## Reasoning Effort Routing
51
+ ## Model and Reasoning Effort Routing
52
52
 
53
- - Models always inherit the host or user default; Cairn never selects or overrides a model.
53
+ - The plan decides each task's model from its nature and records `Requested model` and `Effective model`; models are not always inherited. Tiers: fast = read-only exploration, search, inventory, summarization (Claude Code `haiku`); balanced = Light Path implementation and routine verification (`sonnet`); stronger = planning, complexity triage, Heavy Path implementation, review, and final verification/review (`opus`); strongest = Heavy Path design only (`fable`), run as a separate `kind: "design"` task dispatched to that tier rather than part of planning. Antigravity `invoke_subagent` `Model` accepts only a tier enum (fast `flash_lite`, balanced `flash`, stronger `pro`, strongest `pro`; no tier above `pro`) and has no effort option, so Effective reasoning effort is `inherited`. Codex slugs: fast `gpt-6-luna`, balanced `gpt-6.1-terra`, stronger `gpt-6-sol`, strongest `gpt-6-astra`.
54
+ - Model Effective: passed and not rejected is that value; not passed is `not-applied: <reason>`; `inherited` only when the host has no model option. If a lower-tier worker fails a gate, re-dispatch that task one tier up (fast, balanced, stronger, strongest) before recording a blocker.
55
+ - Routing is per dispatch only; never change model or global/user config files. `Model routing: inherited` in `MEMORY.md` or the plan disables per-task selection.
54
56
  - Light Path planning, implementation, and verification request `medium`.
55
57
  - Heavy Path planning, review, and implementation request `high`; final verification and review request `xhigh`.
56
58
  - Every plan task records `Requested reasoning effort` and `Effective reasoning effort`. Requested is Cairn's desired profile; Effective is the value confirmed by the dispatch result.
57
- - Only a newly dispatched task or worker may receive the requested value, and only through a host-exposed reasoning-effort option or host-native equivalent. Omit every model override.
58
- - For an unsupported host or value, use `Effective reasoning effort: inherited`; this means no task-level override was confirmed and does not prove the host lacks the capability. Describe host capability only from an exposed interface or dispatch result, and distinguish Cairn's choice not to integrate or use an option from host non-support. Do not change the model or global config and do not silently choose a nearby value.
59
+ - Every new task/worker dispatch MUST pass the task's requested effort through the host-exposed reasoning-effort option or host-native equivalent (Claude Code: Agent tool `effort`; `fork` ignores `model` and `effort`). Pass the chosen model the same way (Claude Code: Agent tool `model`). Recording without passing is a defect.
60
+ - Effective is the requested value when the dispatch passed it and the host did not reject it, `not-applied: <reason>` when it was not passed, and `inherited` only when the host exposes no effort option. Describe host capability only from an exposed interface or dispatch result, and distinguish Cairn's choice not to integrate or use an option from host non-support. Do not change the model or global config and do not silently choose a nearby value.
59
61
  - A route change synchronizes the plan artifact, repository goal task roadmap through `goal replan`, native UI plan, and reasoning effort profile before edits resume. Preserve completed task profiles as audit history and recalculate incomplete task profiles for the new path.
60
62
 
61
63
  ## Delegation Defaults
@@ -18,7 +18,8 @@ Claude-family models are strong at long-context retention, policy interpretation
18
18
  - Do not skip the two verification gates even on Light Path.
19
19
  - Do not approve a plan that lacks dry-run or check evidence for external-state-changing work.
20
20
  - Do not allow open-ended verification loops. Require a blocker or sub-task split after two failed passes.
21
- - Keep the model inherited. `Requested reasoning effort` is Cairn's desired profile; `Effective reasoning effort` is what the dispatch response confirms. Apply the requested value only to a newly dispatched task or worker through a host-native task/subagent option, never a model override. For an unsupported host or value, record Effective `inherited`; this means no task override was confirmed, not proof of missing host capability. Infer capability only from the exposed interface or dispatch response, distinguish Cairn non-integration from host non-support, and make no model/global configuration change.
21
+ - Choose the model per task (fast `haiku`, balanced `sonnet`, stronger `opus`: planning, triage, Heavy implementation, review, final verification/review; strongest `fable`: Heavy design only, as a separate `kind: "design"` task dispatched to that tier rather than part of planning) and record `Requested model`/`Effective model`; Effective is the passed value, `not-applied: <reason>`, or `inherited` when the host has no model option. Re-dispatch one tier up (fast, balanced, stronger, strongest) if a lower-tier worker fails a gate. `Model routing: inherited` disables this. `Requested reasoning effort` is Cairn's desired profile; `Effective reasoning effort` is what the dispatch response confirms. Every new task/worker dispatch MUST pass the task's requested effort through the host option together with the chosen model; recording without passing is a defect. Effective is the requested value when the dispatch passed it and the host did not reject it, `not-applied: <reason>` when it was not passed, and `inherited` only when the host exposes no effort option. Infer capability only from the exposed interface or dispatch response, distinguish Cairn non-integration from host non-support, and change no global/user configuration.
22
+ - In Claude Code, pass model with the Agent tool `model` parameter (`haiku|sonnet|opus|fable`) and effort with `effort` (`low|medium|high|xhigh|max`, same as Cairn values), for example `{"description": "Implement task-1", "subagent_type": "general-purpose", "model": "sonnet", "effort": "medium", "prompt": "..."}`. `subagent_type: "fork"` ignores `model` and `effort`; never dispatch routed work as a fork.
22
23
  - On Heavy Path, check plan gaps before implementation.
23
24
  - Review all three complexity records: the provisional request checkpoint, post-exploration planning checkpoint, and code checkpoint after exact file/caller/test inspection immediately before the first edit. Before editing, evidence may change either route. Every change must synchronize the plan artifact, repository goal task roadmap through `goal replan`, and native UI plan, including reviews and required evidence. After editing begins, a new Heavy signal promotes Light Path to Heavy Path: stop further edits, mark affected evidence stale, synchronize all three roadmaps, and repeat the code checkpoint.
24
25
  - Before asking the user, use repository evidence and available `explorer`/`worker` delegation when it materially improves speed or quality.
@@ -19,7 +19,7 @@ Codex-family models are strong at small implementation tasks, explicit tool use,
19
19
 
20
20
  - On every fresh entry, compaction recovery, restart, delegation, or handoff, restore optional root `MEMORY.md` → current phase skill → active plan → current-task references → recorded model guidance. Missing `MEMORY.md` never blocks and must not trigger another memory service. If persisted state or the assignment requires another missing, unreadable, or inconsistent reference, fail closed and report a blocker before editing, delegating, approving, or completing. Delegation means the delegated agent restores on its own entry; the orchestrator does not re-read this chain after dispatching or collecting a subagent, and within one unbroken context it rereads only references that changed, which keeps the cached prompt prefix stable.
21
21
  - Do not start implementation without a plan.
22
- - Keep the model inherited. `Requested reasoning effort` is Cairn's desired profile; `Effective reasoning effort` is what the dispatch response confirms. Only a newly dispatched task or worker may receive the requested effort through the host's task/subagent option, with no model override. For an unsupported host or value, record Effective `inherited`; this means no task override was confirmed, not proof of missing host capability. Infer capability only from the exposed interface or dispatch response, distinguish Cairn non-integration from host non-support, and leave model/global configuration unchanged.
22
+ - Choose the model per task by tier (fast, balanced, stronger, strongest) and pass it through the host-native model option as fast `gpt-6-luna`, balanced `gpt-6.1-terra`, stronger `gpt-6-sol`, strongest `gpt-6-astra`; record `Requested model`/`Effective model` (`inherited` when the host exposes no model option). Re-dispatch one tier up if a lower-tier worker fails a gate. `Model routing: inherited` disables this. `Requested reasoning effort` is Cairn's desired profile; `Effective reasoning effort` is what the dispatch response confirms. Every new task/worker dispatch MUST pass the task's requested effort through the host's task/subagent option together with the chosen model; recording without passing is a defect. Effective is the requested value when passed and not rejected, `not-applied: <reason>` when not passed, and `inherited` only when the host exposes no effort option. Infer capability only from the exposed interface or dispatch response, distinguish Cairn non-integration from host non-support, and change no global/user configuration.
23
23
  - Do not treat complexity as a one-time choice. Require the provisional request checkpoint, post-exploration planning checkpoint, and code checkpoint after exact file/caller/test inspection immediately before the first edit. Before editing, evidence may change either route. Every change must synchronize the plan artifact, repository goal task roadmap through `goal replan`, and native UI plan, including reviews and required evidence. After editing begins, a new Heavy signal promotes Light Path to Heavy Path: stop further edits, mark affected evidence stale, synchronize all three roadmaps, and repeat the code checkpoint.
24
24
  - Do not stop before local implementation solely because subagent tools are unavailable; the main agent takes over implementation directly and records that takeover in evidence.
25
25
  - Keep work units small. Split large changes into smaller plan tasks.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cairn-ai",
3
- "version": "0.3.0",
3
+ "version": "0.4.1",
4
4
  "description": "Token-efficient agent harness with tool readiness for Codex, Claude Code, and Antigravity",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -2,6 +2,7 @@ import { resolveRepoRoot } from "./cairn-paths.mjs";
2
2
 
3
3
  export async function runGoalCli(args, {
4
4
  stdout = console.log,
5
+ stderr = console.error,
5
6
  defaultGoalEvidence,
6
7
  operations,
7
8
  }) {
@@ -52,6 +53,8 @@ export async function runGoalCli(args, {
52
53
  taskId: options.task ?? (taskAction ? positional[1] : positional[0]),
53
54
  status: options.status ?? taskAction ?? positional[1],
54
55
  blocker: options.reason,
56
+ effortWaiver: options["allow-inherited-effort"],
57
+ designWaiver: options["allow-no-design-model"],
55
58
  });
56
59
  emit(JSON.stringify(state));
57
60
  return state;
@@ -71,7 +74,19 @@ export async function runGoalCli(args, {
71
74
  root,
72
75
  taskId: options.task ?? positional[0],
73
76
  agentId: options.agent ?? positional[1] ?? null,
77
+ effort: options.effort,
78
+ effortSource: options["effort-source"],
79
+ route: options.route,
80
+ effortWaiver: options["allow-inherited-effort"],
81
+ kind: options.kind,
82
+ model: options.model,
83
+ modelSource: options["model-source"],
84
+ designWaiver: options["allow-no-design-model"],
74
85
  });
86
+ const task = state.tasks.find((item) => item.id === String(options.task ?? positional[0]).trim());
87
+ if (task?.route === "heavy" && task.assignedAgentId && (!task.effort || task.effortSource === "not-applied")) {
88
+ stderr(`Cairn warning: Heavy task ${task.id} is assigned without an applied effort (effort ${task.effort ?? "none"}, source ${task.effortSource ?? "none"}); dispatch with the plan's effort and record --effort <level> --effort-source host-option.`);
89
+ }
75
90
  emit(JSON.stringify(state));
76
91
  return state;
77
92
  }
@@ -204,10 +219,10 @@ function allowedOptions(command) {
204
219
  const byCommand = {
205
220
  start: ["goal", "plan", "tasks", "criteria", "requiredEvidence", "session", "evidencePolicy", "evidence-policy"],
206
221
  status: [],
207
- task: ["task", "status", "reason"],
222
+ task: ["task", "status", "reason", "allow-inherited-effort", "allow-no-design-model"],
208
223
  replan: ["tasks"],
209
224
  claim: ["session"],
210
- assign: ["task", "agent"],
225
+ assign: ["task", "agent", "effort", "effort-source", "route", "allow-inherited-effort", "kind", "model", "model-source", "allow-no-design-model"],
211
226
  receipt: ["task", "kind", "scope", "command", "exitCode", "exit-code", "exit", "timestamp", "goalId", "goal-id", "plan"],
212
227
  verify: ["task", "kind", "scope", "watch", "timeout-ms"],
213
228
  finish: ["watch", "timeout-ms"],
@@ -175,6 +175,18 @@ export function goalStats(state, root = process.cwd()) {
175
175
  byKind,
176
176
  reruns,
177
177
  stale,
178
+ tasks: state.tasks.map((task) => ({
179
+ id: task.id,
180
+ status: task.status,
181
+ route: task.route ?? null,
182
+ effort: task.effort ?? null,
183
+ effortSource: task.effortSource ?? null,
184
+ ...(task.effortWaiver ? { effortWaiver: task.effortWaiver } : {}),
185
+ ...(task.kind ? { kind: task.kind } : {}),
186
+ ...(task.model ? { model: task.model } : {}),
187
+ ...(task.modelSource ? { modelSource: task.modelSource } : {}),
188
+ ...(task.designWaiver ? { designWaiver: task.designWaiver } : {}),
189
+ })),
178
190
  };
179
191
  }
180
192
 
@@ -5,9 +5,9 @@ import { assertNoSymlinkComponents } from "./cairn-safe-fs.mjs";
5
5
  import { goalStatePath, readGoalState, readGoalStateUnlocked, withGoalStateLock, writeGoalStateUnlocked } from "./cairn-goal-state.mjs";
6
6
  import {
7
7
  GOAL_STATE_VERSION, PLAN_ID_MAX_LENGTH, assertRecoveryReferenceBudget, boundedRequiredText,
8
- assertCanBeActive, assertTaskGraph,
8
+ assertCanBeActive, assertEffortRecord, assertModelRecord, assertTaskGraph,
9
9
  defaultGoalEvidence, normalizeCriteria, normalizeTask, optionalText, requiredText,
10
- terminalGoalStatuses, timestamp, validEvidencePolicy, validGoalStatus, validTaskStatus, validateState,
10
+ terminalGoalStatuses, timestamp, validEvidencePolicy, validGoalStatus, validTaskKind, validTaskRoute, validTaskStatus, validateState,
11
11
  } from "./cairn-goal-state-validation.mjs";
12
12
  import {
13
13
  advanceGoal, assertGoalMutable, ensureGoalCanComplete, ensureTaskCanComplete,
@@ -119,9 +119,13 @@ function applyGoalTransition(state, nextStatus, blocker, root) {
119
119
  return state;
120
120
  }
121
121
 
122
- export async function setTaskStatus({ root = process.cwd(), taskId, status, blocker } = {}) {
122
+ export async function setTaskStatus({ root = process.cwd(), taskId, status, blocker, effortWaiver, designWaiver } = {}) {
123
123
  const nextStatus = validTaskStatus(status);
124
124
  const normalizedTaskId = requiredText(taskId, "taskId");
125
+ const normalizedWaiver = optionalText(effortWaiver, "effortWaiver");
126
+ if (normalizedWaiver !== null && nextStatus !== "completed") throw new Error("--allow-inherited-effort applies only when completing a task");
127
+ const normalizedDesignWaiver = optionalText(designWaiver, "designWaiver");
128
+ if (normalizedDesignWaiver !== null && nextStatus !== "completed") throw new Error("--allow-no-design-model applies only when completing a task");
125
129
  return mutateGoal(root, (state) => {
126
130
  assertGoalMutable(state);
127
131
  const task = taskById(state, normalizedTaskId);
@@ -130,7 +134,13 @@ export async function setTaskStatus({ root = process.cwd(), taskId, status, bloc
130
134
  if (nextStatus === "active") {
131
135
  assertCanBeActive(state.tasks, task, state.tasks.filter((item) => item.id !== task.id && item.status === "active"));
132
136
  }
133
- if (nextStatus === "completed") ensureTaskCanComplete(state, task, root);
137
+ if (nextStatus === "completed") {
138
+ if (normalizedWaiver !== null) task.effortWaiver = normalizedWaiver;
139
+ if (normalizedDesignWaiver !== null) task.designWaiver = normalizedDesignWaiver;
140
+ ensureHeavyEffortApplied(task);
141
+ ensureHeavyDesignRecorded(state, task);
142
+ ensureTaskCanComplete(state, task, root);
143
+ }
134
144
  if (nextStatus === "blocked") task.blocker = requiredText(blocker, "blocker");
135
145
  if (nextStatus === "active" || nextStatus === "pending") task.blocker = null;
136
146
  task.status = nextStatus;
@@ -186,13 +196,67 @@ export async function claimGoal({ root = process.cwd(), sessionId } = {}) {
186
196
  });
187
197
  }
188
198
 
189
- export async function assignTask({ root = process.cwd(), taskId, agentId = null } = {}) {
199
+ // A Heavy task delegated to a worker must record the effort the host actually applied; a missing, not-applied, or
200
+ // inherited effort needs an explicit waiver reason. Unassigned (main-agent) and Light tasks are not checked.
201
+ function ensureHeavyEffortApplied(task) {
202
+ if (task.route !== "heavy" || !task.assignedAgentId || task.effortWaiver) return;
203
+ const source = task.effortSource ?? null;
204
+ if (task.effort && source !== "not-applied" && source !== "inherited") return;
205
+ throw new Error(`Heavy task ${task.id} assigned to ${task.assignedAgentId} has no applied effort (effort ${task.effort ?? "none"}, source ${source ?? "none"}); record goal assign ${task.id} --effort <low|medium|high|xhigh|max> --effort-source host-option, or complete with --allow-inherited-effort <reason>`);
206
+ }
207
+
208
+ // A kind "design" task must record the strongest-tier model it was dispatched with (host-option). Any other assigned
209
+ // Heavy task needs a completed design task in the goal. A designWaiver reason bypasses both; Light and unassigned
210
+ // tasks are not checked.
211
+ function ensureHeavyDesignRecorded(state, task) {
212
+ if (task.designWaiver) return;
213
+ if (task.kind === "design") {
214
+ if (task.model && task.modelSource === "host-option") return;
215
+ throw new Error(`Design task ${task.id} has no recorded design model (model ${task.model ?? "none"}, source ${task.modelSource ?? "none"}); dispatch it to the strongest tier and record goal assign ${task.id} --model <value> --model-source host-option, or complete with --allow-no-design-model <reason>`);
216
+ }
217
+ if (task.route !== "heavy" || !task.assignedAgentId) return;
218
+ if (state.tasks.some((item) => item.kind === "design" && item.status === "completed")) return;
219
+ throw new Error(`Heavy task ${task.id} assigned to ${task.assignedAgentId} has no completed design task; add a kind "design" task with goal replan, complete it with goal assign <design-task> --model <value> --model-source host-option, or complete with --allow-no-design-model <reason>`);
220
+ }
221
+
222
+ // Omitted effort/route/waiver options keep stored values, so a reassignment can change only the agent. When effort
223
+ // or effortSource is given, both are replaced together; an omitted source is inferred from the effort.
224
+ export async function assignTask({
225
+ root = process.cwd(), taskId, agentId = null, effort, effortSource, route, effortWaiver, kind, model, modelSource, designWaiver,
226
+ } = {}) {
190
227
  const normalizedTaskId = requiredText(taskId, "taskId");
191
228
  const normalizedAgentId = agentId === null ? null : requiredText(agentId, "agentId");
229
+ const effortGiven = effort !== undefined || effortSource !== undefined;
230
+ const normalizedEffort = effort ?? null;
231
+ const normalizedSource = effortSource ?? (normalizedEffort === null ? null : normalizedEffort === "inherited" ? "inherited" : "host-option");
232
+ if (effortGiven) {
233
+ if (normalizedEffort === null && normalizedSource !== "not-applied") throw new Error("--effort-source requires --effort unless it is not-applied");
234
+ assertEffortRecord(normalizedEffort, normalizedSource, "assign");
235
+ }
236
+ const modelGiven = model !== undefined || modelSource !== undefined;
237
+ const normalizedModel = model === undefined || model === null ? null : requiredText(model, "model");
238
+ const normalizedModelSource = modelSource ?? (normalizedModel === null ? null : normalizedModel === "inherited" ? "inherited" : "host-option");
239
+ if (modelGiven) assertModelRecord(normalizedModel, normalizedModelSource, "assign");
240
+ const normalizedKind = kind === undefined ? undefined : validTaskKind(kind);
241
+ const normalizedDesignWaiver = designWaiver === undefined ? undefined : requiredText(designWaiver, "designWaiver");
242
+ const normalizedRoute = route === undefined ? undefined : validTaskRoute(route);
243
+ const normalizedWaiver = effortWaiver === undefined ? undefined : requiredText(effortWaiver, "effortWaiver");
192
244
  return mutateGoal(root, (state) => {
193
245
  assertGoalMutable(state);
194
246
  const task = taskById(state, normalizedTaskId);
195
247
  task.assignedAgentId = normalizedAgentId;
248
+ if (effortGiven) {
249
+ task.effort = normalizedEffort;
250
+ task.effortSource = normalizedSource;
251
+ }
252
+ if (modelGiven) {
253
+ task.model = normalizedModel;
254
+ task.modelSource = normalizedModelSource;
255
+ }
256
+ if (normalizedKind !== undefined) task.kind = normalizedKind;
257
+ if (normalizedDesignWaiver !== undefined) task.designWaiver = normalizedDesignWaiver;
258
+ if (normalizedRoute !== undefined) task.route = normalizedRoute;
259
+ if (normalizedWaiver !== undefined) task.effortWaiver = normalizedWaiver;
196
260
  task.updatedAt = timestamp();
197
261
  state.goal.updatedAt = timestamp();
198
262
  return state;
@@ -33,7 +33,7 @@ export function evaluateStop(state, { subagent = false, agentId } = {}) {
33
33
  if (!assigned) return { block: false };
34
34
  return {
35
35
  block: true,
36
- reason: `Cairn task ${assigned.id} (${assigned.title}) is assigned to this subagent and is ${assigned.status}. Continue only this assigned task, record a successful evidence record, then hand off.`,
36
+ reason: `Cairn task ${assigned.id} (${assigned.title}) is assigned to this subagent and is ${assigned.status}. Continue only this assigned task, record a successful evidence record, then hand off.${effortWarning([assigned])}`,
37
37
  };
38
38
  }
39
39
  const active = state.tasks.filter((item) => item.status === "active");
@@ -41,15 +41,21 @@ export function evaluateStop(state, { subagent = false, agentId } = {}) {
41
41
  const list = active.map((item) => `${item.id} (${clip(item.title, 40)})`).join(", ");
42
42
  return {
43
43
  block: true,
44
- reason: `Cairn goal "${state.goal.title}" is active with parallel tasks ${list}. Collect or continue each one; record successful evidence before marking a task complete.`,
44
+ reason: `Cairn goal "${state.goal.title}" is active with parallel tasks ${list}. Collect or continue each one; record successful evidence before marking a task complete.${effortWarning(active)}`,
45
45
  };
46
46
  }
47
47
  return {
48
48
  block: true,
49
- reason: `Cairn goal "${state.goal.title}" is active. Continue current task ${task.id} (${task.title}); its status is ${task.status}. Record a successful evidence record before marking it complete.`,
49
+ reason: `Cairn goal "${state.goal.title}" is active. Continue current task ${task.id} (${task.title}); its status is ${task.status}. Record a successful evidence record before marking it complete.${effortWarning(active)}`,
50
50
  };
51
51
  }
52
52
 
53
+ // Delegated work must record the effort the host applied; flag assigned tasks whose effort source is still empty.
54
+ function effortWarning(tasks) {
55
+ const ids = tasks.filter((item) => item.assignedAgentId && !item.effortSource).map((item) => item.id);
56
+ return ids.length === 0 ? "" : ` Effort unrecorded for assigned task ${ids.join(", ")}: record goal assign --effort/--effort-source.`;
57
+ }
58
+
53
59
  function clip(value, maxLength) {
54
60
  const text = String(value ?? "");
55
61
  return text.length <= maxLength ? text : `${text.slice(0, maxLength - 1)}…`;
@@ -21,6 +21,11 @@ export const defaultTaskEvidence = ["moduleAcceptance", "surfaceIntegration"];
21
21
  export const defaultGoalEvidence = ["finalReview"];
22
22
 
23
23
  const evidencePolicies = new Set(["declared", "tool-bound"]);
24
+ export const TASK_ROUTES = new Set(["light", "heavy"]);
25
+ export const CONCRETE_EFFORTS = new Set(["low", "medium", "high", "xhigh", "max"]);
26
+ export const TASK_EFFORTS = new Set([...CONCRETE_EFFORTS, "inherited"]);
27
+ export const EFFORT_SOURCES = new Set(["host-option", "inherited", "not-applied"]);
28
+ export const TASK_KINDS = new Set(["design"]);
24
29
 
25
30
  export function validateState(value) {
26
31
  if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error("Cairn goal state must be an object");
@@ -58,6 +63,13 @@ export function validateState(value) {
58
63
  if (!Array.isArray(task.requiredEvidence) || task.requiredEvidence.length === 0) throw new Error(`task ${task.id} requiredEvidence must be a non-empty array`);
59
64
  task.requiredEvidence.forEach((kind, index) => requiredText(kind, `task ${task.id} requiredEvidence[${index}]`));
60
65
  if (task.blocker !== null && task.blocker !== undefined) requiredText(task.blocker, `task ${task.id} blocker`);
66
+ // Optional since v3 states predate them; absent means unrecorded.
67
+ if (task.route !== null && task.route !== undefined) validTaskRoute(task.route, `task ${task.id} route`);
68
+ assertEffortRecord(task.effort ?? null, task.effortSource ?? null, `task ${task.id}`);
69
+ if (task.effortWaiver !== null && task.effortWaiver !== undefined) requiredText(task.effortWaiver, `task ${task.id} effortWaiver`);
70
+ if (task.kind !== null && task.kind !== undefined) validTaskKind(task.kind, `task ${task.id} kind`);
71
+ assertModelRecord(task.model ?? null, task.modelSource ?? null, `task ${task.id}`);
72
+ if (task.designWaiver !== null && task.designWaiver !== undefined) requiredText(task.designWaiver, `task ${task.id} designWaiver`);
61
73
  validTimestamp(task.createdAt);
62
74
  validTimestamp(task.updatedAt);
63
75
  }
@@ -108,12 +120,50 @@ export function normalizeTask(task, index, defaultStatus, previousTaskId = null)
108
120
  writeScope: source.writeScope === undefined || source.writeScope === null
109
121
  ? null
110
122
  : normalizeWriteScope(source.writeScope, `tasks[${index}].writeScope`),
123
+ route: source.route === undefined || source.route === null ? null : validTaskRoute(source.route, `tasks[${index}].route`),
124
+ effort: null,
125
+ effortSource: null,
126
+ effortWaiver: null,
127
+ kind: source.kind === undefined || source.kind === null ? null : validTaskKind(source.kind, `tasks[${index}].kind`),
128
+ model: null,
129
+ modelSource: null,
130
+ designWaiver: null,
111
131
  blocker: null,
112
132
  createdAt: timestamp(),
113
133
  updatedAt: timestamp(),
114
134
  };
115
135
  }
116
136
 
137
+ export function validTaskRoute(value, label = "route") {
138
+ if (!TASK_ROUTES.has(value)) throw new Error(`${label} must be one of: ${[...TASK_ROUTES].join(", ")}`);
139
+ return value;
140
+ }
141
+
142
+ export function validTaskKind(value, label = "kind") {
143
+ if (!TASK_KINDS.has(value)) throw new Error(`${label} must be one of: ${[...TASK_KINDS].join(", ")}`);
144
+ return value;
145
+ }
146
+
147
+ // A model is a non-empty host-specific string; source "host-option" needs a model, and a model needs a source.
148
+ export function assertModelRecord(model, source, label = "task") {
149
+ if (model !== null) requiredText(model, `${label} model`);
150
+ if (source !== null && !EFFORT_SOURCES.has(source)) throw new Error(`${label} modelSource must be one of: ${[...EFFORT_SOURCES].join(", ")}`);
151
+ if (source === "host-option" && model === null) throw new Error(`${label} modelSource host-option requires a model`);
152
+ if (source === "inherited" && model === null) throw new Error(`${label} modelSource inherited requires a model`);
153
+ if (model !== null && source === null) throw new Error(`${label} model requires a modelSource`);
154
+ }
155
+
156
+ // effort "inherited" pairs only with source "inherited"; source "host-option" needs a concrete level; a source
157
+ // without an effort is only meaningful as "not-applied".
158
+ export function assertEffortRecord(effort, source, label = "task") {
159
+ if (effort !== null && !TASK_EFFORTS.has(effort)) throw new Error(`${label} effort must be one of: ${[...TASK_EFFORTS].join(", ")}`);
160
+ if (source !== null && !EFFORT_SOURCES.has(source)) throw new Error(`${label} effortSource must be one of: ${[...EFFORT_SOURCES].join(", ")}`);
161
+ if (effort === "inherited" && source !== "inherited") throw new Error(`${label} effort inherited requires effortSource inherited`);
162
+ if (source === "host-option" && !CONCRETE_EFFORTS.has(effort)) throw new Error(`${label} effortSource host-option requires a concrete effort (${[...CONCRETE_EFFORTS].join(", ")})`);
163
+ if (source === "inherited" && effort === null) throw new Error(`${label} effortSource inherited requires an effort`);
164
+ if (effort !== null && source === null) throw new Error(`${label} effort requires an effortSource`);
165
+ }
166
+
117
167
  export function migrateState(value) {
118
168
  if (!value || typeof value !== "object" || Array.isArray(value)) return value;
119
169
  let state = value;
@@ -25,9 +25,10 @@ export { finishGoal, goalStats, recordReceipt, verifyAndRecord } from "./cairn-g
25
25
  export { currentTask, evaluateStop, isGoalOwnedBySession } from "./cairn-goal-policy.mjs";
26
26
  export { readyTasks } from "./cairn-goal-operations-mutations.mjs";
27
27
 
28
- export async function handleGoalCli(args = process.argv.slice(2), { stdout = console.log } = {}) {
28
+ export async function handleGoalCli(args = process.argv.slice(2), { stdout = console.log, stderr = console.error } = {}) {
29
29
  return runGoalCli(args, {
30
30
  stdout,
31
+ stderr,
31
32
  defaultGoalEvidence,
32
33
  operations: {
33
34
  assignTask,
@@ -66,7 +66,7 @@ This file is a short index of active and completed work plans.
66
66
  - Run complexity triage before applying agent, plugin, or delegated workflow guidance.
67
67
  - Record the selected Light Path or Heavy Path and the checked Heavy Path signals in \`docs/plan/<topic>.md\`.
68
68
  - Record request, planning, and code checkpoints. When the route changes before editing, synchronize the plan artifact, repository goal task roadmap through \`goal replan\`, and native UI plan. After editing starts, a new Heavy Path signal promotes Light Path to Heavy Path; stop further edits, mark affected evidence stale, synchronize all three roadmaps, and repeat the code checkpoint.
69
- - Keep models inherited. Record requested/effective reasoning effort per task: Light planning/implementation/verification=\`medium\`; Heavy planning/review/implementation=\`high\`; final verification/review=\`xhigh\`. A route change also synchronizes the reasoning effort profile, preserving completed profiles and recalculating incomplete profiles. Unsupported host/value means effective=\`inherited\` with no model/global config change.
69
+ - Choose each task's model by nature (fast/balanced/stronger/strongest) and record requested/effective model and reasoning effort per task: Light planning/implementation/verification=\`medium\`; Heavy planning/review/implementation=\`high\`; final verification/review=\`xhigh\`. A route change also synchronizes the reasoning effort profile, preserving completed profiles and recalculating incomplete profiles. Every new task/worker dispatch MUST pass the requested effort through the host option (Claude Code: Agent \`effort\`, never fork) and the chosen model the same way (Agent \`model\`); Effective is the passed value, \`not-applied: <reason>\` when not passed, \`inherited\` only when the host has no option. Never change global/user config.
70
70
  - Split implementation into small module tasks.
71
71
  - Detect repository stack and required LSP/check tools before implementation.
72
72
  - Record missing required tools and suggested commands. Run only pinned, supported installation steps after explicit user approval.
@@ -100,7 +100,7 @@ const planTemplateKo = `# PLAN
100
100
  - 에이전트, 플러그인, 위임 워크플로 지침을 적용하기 전에 복잡도 트리아지를 실행합니다.
101
101
  - 선택한 Light Path 또는 Heavy Path와 확인한 Heavy Path 신호를 \`docs/plan/<topic>.md\`에 기록합니다.
102
102
  - 요청, 계획, 코드 체크포인트를 기록합니다. 편집 전에 경로가 바뀌면 plan artifact, 저장소 goal task roadmap, native UI plan을 동기화합니다. 편집 뒤 새 Heavy Path 신호가 나오면 추가 편집을 중단하고 관련 증거를 stale로 표시한 뒤 세 roadmap과 코드 체크포인트를 다시 맞춥니다.
103
- - 모델은 상속하고 task별 requested/effective reasoning effort를 기록합니다. Light 계획/구현/검증은 \`medium\`, Heavy 계획/검토/구현은 \`high\`, 최종 검증/검토는 \`xhigh\`입니다. 경로 변경 시 reasoning effort profile도 동기화하고 완료 profile은 보존하며 미완료 profile은 재계산합니다. 미지원 host/value는 model/global config 변경 없이 effective=\`inherited\`입니다.
103
+ - task 성격에 따라 task별 모델(fast/balanced/stronger/strongest)을 정하고 requested/effective model과 reasoning effort를 기록합니다. Light 계획/구현/검증은 \`medium\`, Heavy 계획/검토/구현은 \`high\`, 최종 검증/검토는 \`xhigh\`입니다. 경로 변경 시 reasoning effort profile도 동기화하고 완료 profile은 보존하며 미완료 profile은 재계산합니다. 모든 새 task/worker dispatch는 정한 모델과 요청 effort를 host option으로 반드시 전달합니다(Claude Code: Agent \`model\`/\`effort\`, fork 금지). Effective는 전달한 값, 전달하지 못하면 \`not-applied: <사유>\`, host에 option이 없을 때만 \`inherited\`이며 전역/사용자 config는 바꾸지 않습니다.
104
104
  - 구현은 작은 모듈 작업으로 나눕니다.
105
105
  - 구현 전에 저장소 스택과 필요한 LSP/check 도구를 감지합니다.
106
106
  - 필요한 도구가 없으면 누락 상태와 제안 명령을 기록합니다. 명시적 사용자 승인 뒤에만 고정된 지원 설치 단계를 실행합니다.
package/scripts/cairn.mjs CHANGED
@@ -84,7 +84,7 @@ const workExecutionPolicy = "The user-called/main agent orchestrates, while work
84
84
  const tokenEfficientWorkPolicy = "Use a test contract for requirements, invariants, boundaries, and failure modes before the minimum implementation. The tool exit code is authoritative. Run goal verify -- <argv> and expand only failures. Inspect package lifecycle scripts: content-producing or unknown scripts must never use --ignore-scripts; only absent or proven content-neutral scripts may use it while prior full-check evidence remains fresh.";
85
85
  const stagedTriagePolicy = "Use request, planning, and code checkpoints. Before the first edit, evidence may change either route; synchronize the plan artifact, repository goal task roadmap through goal replan, and native UI plan. After editing starts, a new Heavy Path signal promotes Light Path to Heavy Path: stop further edits, mark affected evidence stale, synchronize all three roadmaps, and repeat the code checkpoint.";
86
86
  const stagedTriagePolicyKo = "요청, 계획, 코드 체크포인트를 사용합니다. 첫 편집 전에는 증거에 따라 어느 경로로든 바꿀 수 있으며 plan artifact, 저장소 goal task roadmap, native UI plan을 동기화합니다. 편집 뒤 새 Heavy Path 신호가 나오면 Light Path를 Heavy Path로 승격하고 추가 편집을 중단하며 관련 증거를 stale로 표시한 뒤 세 roadmap과 코드 체크포인트를 다시 맞춥니다.";
87
- const reasoningEffortPolicy = "Inherit models; route reasoning effort by task: Light planning/implementation/verification=medium; Heavy planning/review/implementation=high; final verification/review=xhigh. Only new task dispatch may use a supported host option. Unsupported host/value means effective=inherited; never change model/global config.";
87
+ const reasoningEffortPolicy = "Choose a model per task (fast/balanced/stronger/strongest) and pass it like effort; route reasoning effort by task: Light planning/implementation/verification=medium; Heavy planning/review/implementation=high; final verification/review=xhigh. Every new task/worker dispatch MUST pass the requested effort through the host option (Claude Code: Agent `effort`, never fork) and the chosen model the same way (Agent `model`); Effective is the passed value, `not-applied: <reason>` when not passed, `inherited` only when the host has no option. Never change global/user config.";
88
88
  const artifactLocalePolicy = "Write user-visible responses and generated or updated documentation, plans, and memory artifacts in the OS locale unless the user asks for another language.";
89
89
  const artifactLocalePolicyKo = "사용자가 다른 언어를 요청하지 않는 한, 사용자에게 보이는 응답과 생성 또는 갱신하는 문서, 계획, 메모리 산출물은 OS locale 언어로 작성합니다.";
90
90
 
@@ -57,7 +57,7 @@ node "<pluginRoot>/scripts/cairn.mjs" goal start --root "<repoRoot>" --goal "<ob
57
57
  10. Advance a UI step only after the matching repository task transition succeeds.
58
58
  11. Ask the user only when evidence and local checks cannot decide. Use the OS locale for user-visible output and artifacts unless asked otherwise.
59
59
 
60
- Reasoning effort: models always inherit. Request Light `medium`, Heavy `high`, and final verification/review `xhigh`; record Requested and Effective reasoning effort per task (`delegation.md`).
60
+ Model and reasoning effort: This skill explicitly instructs the effort level for delegated work. Pick each task's model tier (fast `haiku`, balanced `sonnet`, stronger `opus`, strongest `fable`) and request Light `medium`, Heavy `high`, final verification/review `xhigh`. Every new task/worker dispatch MUST pass the task's model and effort via the host option (Claude Code: Agent `model`/`effort`; never `fork`). Recording without passing is a defect. Record Requested/Effective model and effort per task; mark Heavy tasks `route: "heavy"` (details: `delegation.md`).
61
61
 
62
62
  ## Completion Criteria
63
63
 
@@ -28,16 +28,35 @@ Reference for `cairn-plan`. Read before dispatching `explorer` or `worker` agent
28
28
  TASK: Produce <role> input needed for the <topic> plan.
29
29
  EXPECTED OUTCOME: Return concrete decisions, file paths, dependencies, risks, and evidence requirements.
30
30
  REQUIRED TOOLS: Read-only repository exploration, tool readiness checks, LSP/symbol tools, local command checks.
31
- MUST DO: Read the project-root `MEMORY.md` before doing assigned work. Preserve proper nouns exactly. Prefer repository evidence. Report missing tools and obtain explicit user approval before any installation. Identify assumptions. Follow the subagent lifecycle rules (status reporting when a channel exists, final report before leaving, recursive delegation only for bounded sub-tasks). Tell workers they are not alone in the codebase and must not revert others' edits. Use the OS locale for user-visible responses and generated or updated documentation, plans, and memory artifacts.
31
+ MODEL: <tier/value> (passed via host option)
32
+ REASONING EFFORT: <value> (passed via host option)
33
+ MUST DO: Read the project-root `MEMORY.md` before doing assigned work. Preserve proper nouns exactly. Prefer repository evidence. Report missing tools and obtain explicit user approval before any installation. Identify assumptions. Follow the subagent lifecycle rules (status reporting when a channel exists, final report before leaving, recursive delegation only for bounded sub-tasks, passing each child's reasoning effort through the host option). Tell workers they are not alone in the codebase and must not revert others' edits. Use the OS locale for user-visible responses and generated or updated documentation, plans, and memory artifacts.
32
34
  MUST NOT DO: Edit production code. Ask the user. Expand scope. Delegate vague or unbounded work.
33
35
  CONTEXT: User request, MEMORY.md, relevant docs/memory notes, applied model guidance, repository root, Cairn CLI prefix line from the session-start hook.
34
36
  ```
35
37
 
36
- ## Reasoning Effort Routing
38
+ ## Model and Reasoning Effort Routing
37
39
 
38
- - Models always inherit the host/user default; never configure or override them.
40
+ This skill explicitly instructs the effort level for delegated work. It also instructs each task's model.
41
+
42
+ - The plan decides each task's model from its nature and records `Requested model` and `Effective model`; models are not always inherited. Tiers: fast = read-only exploration, search, inventory, summarization (Claude Code `haiku`); balanced = Light Path implementation and routine verification (`sonnet`); stronger = planning, complexity triage, Heavy Path implementation, review, and final verification/review (`opus`); strongest = Heavy Path design only (`fable`).
43
+ - Model Effective: passed and not rejected is that value; not passed is `not-applied: <reason>`; `inherited` only when the host has no model option. Codex passes the tier's slug (table below) through the host-native model option, else `inherited`.
44
+ - If a lower-tier worker fails a gate, re-dispatch that task one tier up (fast, balanced, stronger, strongest) before recording a blocker.
45
+ - Routing is per dispatch only; never change model or global/user config files. `Model routing: inherited` in `MEMORY.md` or the plan disables per-task selection.
39
46
  - Light Path planning, implementation, and verification request `medium`.
40
47
  - Heavy Path planning, review, and implementation request `high`; final verification and review request `xhigh`.
41
- - Every module task records `Requested reasoning effort` and `Effective reasoning effort` in `docs/plan/<topic>.md`. Requested is Cairn's desired profile; Effective is what the dispatch result confirms.
42
- - Pass requested effort only when dispatching a new task/worker and the host exposes a reasoning-effort option or host-native equivalent. Omit model overrides. Effective `inherited` means no task-level override was confirmed, not proof of missing host capability. Describe capability only from the exposed interface or dispatch response, distinguish Cairn non-integration from host non-support, and leave model/global config unchanged.
48
+ - Every new task/worker dispatch MUST pass the task's requested effort through the host option. Recording without passing is a defect. Pass the chosen model the same way (Claude Code: Agent `model`). Child (recursive) dispatches follow the same rule.
49
+ - Every module task records `Requested reasoning effort` and `Effective reasoning effort` in `docs/plan/<topic>.md`. Requested is Cairn's desired profile; Effective is decided by the dispatch call:
50
+ - Effort passed and not rejected: Effective is the requested value.
51
+ - Effort not passed: `not-applied: <reason>`; the reason is required.
52
+ - `inherited` only when the host exposes no effort option. Describe host capability only from the exposed interface or dispatch response, and distinguish Cairn non-integration from host non-support.
53
+
54
+ | Host | Model / effort option | Effective |
55
+ | --- | --- | --- |
56
+ | Claude Code | Agent tool `model` parameter (`haiku\|sonnet\|opus\|fable`). `effort` parameter (`low\|medium\|high\|xhigh\|max`), matching Cairn values one to one. `subagent_type: "fork"` ignores `model` and `effort`, so never dispatch routed work as a fork. | requested value |
57
+ | Codex | Host-native model option (fast `gpt-6-luna`, balanced `gpt-6.1-terra`, stronger `gpt-6-sol`, strongest `gpt-6-astra`) and task/subagent reasoning-effort option or equivalent. | requested value |
58
+ | Antigravity | `invoke_subagent` `Model` takes only a tier enum: fast `flash_lite`, balanced `flash`, stronger `pro`, strongest `pro` (no tier above `pro`); `inherit` is not used for routed work. No effort option. | model: passed value; effort: `inherited` |
59
+ | Host without an option | None. | `inherited` |
60
+
61
+ - After each dispatch, record state with `goal assign --task <id> --agent <id> --effort <value> --effort-source <host-option|inherited|not-applied>`; for a `kind: "design"` task also `--model <value> --model-source host-option`. Mark Heavy tasks with `route: "heavy"` (tasks JSON field or `goal assign --route heavy`). A Heavy task with no effort, `not-applied`, or `inherited` fails `goal task --status completed` unless `--allow-inherited-effort <reason>` records why.
43
62
  - On every route change, synchronize the plan artifact, repository goal task roadmap through `goal replan`, native UI plan, and reasoning effort profile before mutation. Completed task profiles are preserved as audit history; incomplete task profiles are recalculated for the new path.
@@ -4,8 +4,9 @@ Reference for `cairn-plan`. Read only when a Heavy Path signal is present or a r
4
4
 
5
5
  ## Heavy Path Flow
6
6
 
7
- Heavy Path flow: plan -> pre-implementation review -> bounded `worker` implementation -> verification worker or read-only review.
7
+ Heavy Path flow: plan -> Heavy design task -> pre-implementation review -> bounded `worker` implementation -> verification worker or read-only review.
8
8
 
9
+ - On a Heavy route, `goal replan` adds a `kind: "design"` task (`heavy-design`, `route: "heavy"`, `requiredEvidence: ["designRecord"]`) after `triage-plan`, and implementation tasks depend on it. The main agent never does this design inline: dispatch it read-only to the strongest tier (Claude Code Agent `model: "fable"`, `effort: "high"`, never `fork`), record `goal assign heavy-design --model <value> --model-source host-option`, merge the result into the plan's `## Heavy Design`, and bind that plan with `goal verify --kind designRecord`. `--allow-no-design-model <reason>` is the only bypass.
9
10
  - Record the pre-implementation decisions that review must resolve before any mutation.
10
11
  - Every Heavy Path task includes an explicit automated test command and a `Tests:` evidence line; completion cannot rely on generic verification wording without test evidence.
11
12
  - Planning, review, and implementation request `high` reasoning effort; final verification and review request `xhigh` (see `cairn://skills/cairn-plan/delegation.md`).
@@ -23,7 +23,7 @@ The session-start hook prints `Cairn CLI: node "<abs>/scripts/cairn.mjs" goal <c
23
23
  node "<pluginRoot>/scripts/cairn.mjs" goal task status --root "<repoRoot>"
24
24
  node "<pluginRoot>/scripts/cairn.mjs" goal ready --root "<repoRoot>"
25
25
  node "<pluginRoot>/scripts/cairn.mjs" goal replan --quiet --root "<repoRoot>" --tasks '[{"id":"<task-id>","title":"<task-title>","requiredEvidence":["moduleAcceptance","surfaceIntegration"]}]'
26
- node "<pluginRoot>/scripts/cairn.mjs" goal assign --quiet --root "<repoRoot>" --task "<task-id>" --agent "<agent-id>"
26
+ node "<pluginRoot>/scripts/cairn.mjs" goal assign --quiet --root "<repoRoot>" --task "<task-id>" --agent "<agent-id>" --effort "<value>" --effort-source "<host-option|inherited|not-applied>"
27
27
  node "<pluginRoot>/scripts/cairn.mjs" goal verify --quiet --root "<repoRoot>" --task "<task-id>" --kind "moduleAcceptance|surfaceIntegration" --watch "<path|path>" -- <tool> <arg> ...
28
28
  node "<pluginRoot>/scripts/cairn.mjs" goal task --quiet --root "<repoRoot>" --task "<task-id>" --status completed
29
29
  node "<pluginRoot>/scripts/cairn.mjs" goal finish --quiet --root "<repoRoot>" --watch "<path|path>" -- <tool> <arg> ...
@@ -61,7 +61,7 @@ Read a reference only when the selected path or situation requires it (Quick and
61
61
  - Any relevant mutation after a gate makes that result stale evidence; rerun the affected gate before completing the current task. Do not rerun earlier completed tasks' checks after later edits: one fresh goal-scope receipt for every goal requiredEvidence kind recorded after all task receipts supersedes their fingerprints (if goal requiredEvidence is empty, task freshness is still rechecked).
62
62
  - Never edit, weaken, skip, or delete existing tests, fixtures, snapshots, or recorded verification commands to make a gate pass; record a genuine contract change in the plan first. After a defect fix, search for other implementations of the same rule or pattern.
63
63
  - At most two verification passes per task; after two failures, record the blocker (`recovery.md`).
64
- - Reasoning effort: models always inherit. Request Light `medium`, Heavy `high`, final verification/review `xhigh`; record Requested and Effective reasoning effort per task. Route changes resync the reasoning effort profile: completed profiles are preserved, incomplete profiles are recalculated.
64
+ - Model and reasoning effort: This skill explicitly instructs the effort level for delegated work. Use each task's recorded model and request Light `medium`, Heavy `high`, final verification/review `xhigh`. Every new task/worker dispatch MUST pass the task's model and effort through the host option (Claude Code: Agent `model`/`effort`; never `fork`). Recording without passing is a defect. Record Requested/Effective model and reasoning effort per task (details, Heavy completion gate: `delegation.md`). Route changes resync the reasoning effort profile: completed profiles are preserved, incomplete profiles are recalculated.
65
65
  - Missing, failed, skipped, stale, or placeholder evidence never completes work. Use the OS locale for output and artifacts.
66
66
 
67
67
  ## Completion Criteria
@@ -28,16 +28,35 @@ Reference for `cairn-work`. Read before dispatching a `worker` or `explorer`, or
28
28
  TASK: Implement task <task-id> for <topic>.
29
29
  EXPECTED OUTCOME: Minimal code or documentation change satisfying the task contract.
30
30
  REQUIRED TOOLS: Scoped file editing, tool readiness checks, existing test/build commands, surface QA commands.
31
- MUST DO: Read the project-root `MEMORY.md` before doing assigned work and follow its policy. Stay within the listed file scope and the task's `writeScope`. Assume you are not alone in the codebase; do not revert others' edits. Follow the subagent lifecycle rules (status reporting when a channel exists, final report before leaving, recursive delegation only for bounded sub-tasks with these same constraints). Obtain explicit user approval before installing missing tools. Run dry-run or check mode before external-state mutation when available. Provide module evidence, surface evidence, and a structured handoff scoped to the assigned goal/task. Never edit, weaken, skip, or delete existing tests, fixtures, or verification commands to pass a gate without a reason recorded in the plan. After a defect fix, search for other implementations of the same rule or pattern and report them. Copy the Cairn CLI prefix line literally; never store it in a shell variable. Use the OS locale for user-visible responses and generated or updated documentation, plans, and memory artifacts.
31
+ MODEL: <tier/value> (passed via host option)
32
+ REASONING EFFORT: <value> (passed via host option)
33
+ MUST DO: Read the project-root `MEMORY.md` before doing assigned work and follow its policy. Stay within the listed file scope and the task's `writeScope`. Assume you are not alone in the codebase; do not revert others' edits. Follow the subagent lifecycle rules (status reporting when a channel exists, final report before leaving, recursive delegation only for bounded sub-tasks with these same constraints, passing each child's reasoning effort through the host option). Obtain explicit user approval before installing missing tools. Run dry-run or check mode before external-state mutation when available. Provide module evidence, surface evidence, and a structured handoff scoped to the assigned goal/task. Never edit, weaken, skip, or delete existing tests, fixtures, or verification commands to pass a gate without a reason recorded in the plan. After a defect fix, search for other implementations of the same rule or pattern and report them. Copy the Cairn CLI prefix line literally; never store it in a shell variable. Use the OS locale for user-visible responses and generated or updated documentation, plans, and memory artifacts.
32
34
  MUST NOT DO: Ask the user. Skip LSP/typecheck/lint because a tool is missing without attempting installation. Refactor unrelated code. Continue an open-ended verification loop. Treat a side question as permission to abandon the active task. Delegate vague or unbounded work. Claim completion without evidence. Modify files outside the assigned ownership.
33
35
  CONTEXT: docs/plan/<topic>.md task, relevant docs/memory notes, applied model guidance, exact files, verification commands, Cairn CLI prefix line.
34
36
  ```
35
37
 
36
- ## Reasoning Effort Routing
38
+ ## Model and Reasoning Effort Routing
37
39
 
38
- - Models always inherit the host/user default; never configure or override them.
40
+ This skill explicitly instructs the effort level for delegated work. It also instructs each task's model.
41
+
42
+ - The plan decides each task's model from its nature and records `Requested model` and `Effective model`; models are not always inherited. Tiers: fast = read-only exploration, search, inventory, summarization (Claude Code `haiku`); balanced = Light Path implementation and routine verification (`sonnet`); stronger = planning, complexity triage, Heavy Path implementation, review, and final verification/review (`opus`); strongest = Heavy Path design only (`fable`).
43
+ - Model Effective: passed and not rejected is that value; not passed is `not-applied: <reason>`; `inherited` only when the host has no model option. Codex passes the tier's slug (table below) through the host-native model option, else `inherited`.
44
+ - If a lower-tier worker fails a gate, re-dispatch that task one tier up (fast, balanced, stronger, strongest) before recording a blocker.
45
+ - Routing is per dispatch only; never change model or global/user config files. `Model routing: inherited` in `MEMORY.md` or the plan disables per-task selection.
39
46
  - Light Path planning, implementation, and verification request `medium`.
40
47
  - Heavy Path planning, review, and implementation request `high`; final verification and review request `xhigh`.
41
- - Every module task records `Requested reasoning effort` and `Effective reasoning effort` in `docs/plan/<topic>.md`. Requested is Cairn's desired profile; Effective is what the dispatch result confirms.
42
- - Pass requested effort only when dispatching a new task/worker and the host exposes a reasoning-effort option or host-native equivalent. Omit model overrides. Effective `inherited` means no task-level override was confirmed, not proof of missing host capability. Describe capability only from the exposed interface or dispatch response, distinguish Cairn non-integration from host non-support, and leave model/global config unchanged.
48
+ - Every new task/worker dispatch MUST pass the task's requested effort through the host option. Recording without passing is a defect. Pass the chosen model the same way (Claude Code: Agent `model`). Child (recursive) dispatches follow the same rule.
49
+ - Every module task records `Requested reasoning effort` and `Effective reasoning effort` in `docs/plan/<topic>.md`. Requested is Cairn's desired profile; Effective is decided by the dispatch call:
50
+ - Effort passed and not rejected: Effective is the requested value.
51
+ - Effort not passed: `not-applied: <reason>`; the reason is required.
52
+ - `inherited` only when the host exposes no effort option. Describe host capability only from the exposed interface or dispatch response, and distinguish Cairn non-integration from host non-support.
53
+
54
+ | Host | Model / effort option | Effective |
55
+ | --- | --- | --- |
56
+ | Claude Code | Agent tool `model` parameter (`haiku\|sonnet\|opus\|fable`). `effort` parameter (`low\|medium\|high\|xhigh\|max`), matching Cairn values one to one. `subagent_type: "fork"` ignores `model` and `effort`, so never dispatch routed work as a fork. | requested value |
57
+ | Codex | Host-native model option (fast `gpt-6-luna`, balanced `gpt-6.1-terra`, stronger `gpt-6-sol`, strongest `gpt-6-astra`) and task/subagent reasoning-effort option or equivalent. | requested value |
58
+ | Antigravity | `invoke_subagent` `Model` takes only a tier enum: fast `flash_lite`, balanced `flash`, stronger `pro`, strongest `pro` (no tier above `pro`); `inherit` is not used for routed work. No effort option. | model: passed value; effort: `inherited` |
59
+ | Host without an option | None. | `inherited` |
60
+
61
+ - After each dispatch, record state with `goal assign --task <id> --agent <id> --effort <value> --effort-source <host-option|inherited|not-applied>`; for a `kind: "design"` task also `--model <value> --model-source host-option`. Mark Heavy tasks with `route: "heavy"` (tasks JSON field or `goal assign --route heavy`). A Heavy task with no effort, `not-applied`, or `inherited` fails `goal task --status completed` unless `--allow-inherited-effort <reason>` records why.
43
62
  - On every route change, synchronize the plan artifact, repository goal task roadmap through `goal replan`, native UI plan, and reasoning effort profile before edits resume. Completed task profiles are preserved as audit history; incomplete task profiles are recalculated for the new path.
@@ -5,6 +5,7 @@ Reference for `cairn-work`. Read only when the recorded route is Heavy Path, a n
5
5
  ## Heavy Path Execution
6
6
 
7
7
  - Follow the full planning and review pipeline recorded in the plan without role-mapping shortcuts: pre-implementation review before mutation, bounded `worker` implementation, then verification worker or read-only review after evidence exists.
8
+ - Heavy implementation cannot complete until a completed `kind: "design"` task exists (`--allow-no-design-model <reason>` is the only bypass).
8
9
  - Run the recorded automated test command and record explicit `Tests:` evidence in the plan before claiming completion. This is required even when module acceptance uses a broader check command.
9
10
  - Planning, review, and implementation request `high` reasoning effort; final verification and review request `xhigh`.
10
11
 
package/templates/PLAN.md CHANGED
@@ -6,7 +6,7 @@ Short index of work plans. Link detailed plans under `docs/plan/`.
6
6
 
7
7
  - For non-trivial implementation or continuation of planned work, write or restore a plan with `triage-plan` active and synchronize it before exploration. Known-target Git/GitHub operations stay plan/goal-free unless they require code edits, conflict resolution, destructive recovery, release/deploy, or design.
8
8
  - Record request, planning, and code checkpoints. When the route changes, synchronize the plan artifact, repository goal task roadmap, and native UI plan before editing; mark affected evidence stale after a late Heavy promotion.
9
- - Keep models inherited and record requested/effective reasoning effort per task. Route changes also synchronize the reasoning effort profile, preserving completed profiles and recalculating incomplete profiles.
9
+ - Choose each task's model by its nature (fast/balanced/stronger/strongest), pass it and the requested reasoning effort through the host option on every dispatch, and record requested/effective model and reasoning effort per task. Route changes also synchronize the reasoning effort profile, preserving completed profiles and recalculating incomplete profiles.
10
10
  - Detect repository stack and required LSP/check tools before implementation.
11
11
  - Install or bootstrap missing required tools before declaring them unavailable.
12
12
  - Heavy Path completion requires explicit automated test evidence.
@@ -41,14 +41,16 @@ Describe the observable result.
41
41
 
42
42
  ## Reasoning Effort Profile
43
43
 
44
- - Model: inherited from the host/user default; never override it.
44
+ - Model: decided per task (fast `haiku` for read-only exploration/search/summarization; balanced `sonnet` for Light implementation and routine verification; stronger `opus` for planning, complexity triage, Heavy implementation, review, and final verification/review; strongest `fable` for Heavy design only, as a separate `kind: "design"` task dispatched to that tier rather than part of planning). Pass it through the host option on every dispatch (Claude Code: Agent `model`, never `fork`); re-dispatch one tier up (fast, balanced, stronger, strongest) if a lower-tier worker fails a gate; `Model routing: inherited` disables this. Never change model/global config.
45
45
  - Light Path: planning=`medium`, implementation=`medium`, verification=`medium`.
46
46
  - Heavy Path: planning/review=`high`, implementation=`high`, final verification/review=`xhigh`.
47
- - Host boundary: pass a requested value only when dispatching a new task/worker and the host exposes a reasoning-effort option or host-native equivalent. Unsupported host/value means `Effective reasoning effort: inherited`; do not alter model/global config.
47
+ - Host boundary: every new task/worker dispatch MUST pass the task's requested effort through the host option (Claude Code: Agent `effort`, never `fork`; Codex: host-native option). Recording without passing is a defect. Use `inherited` only when the host has no option.
48
48
  - Route-change gate: synchronize the plan artifact, repository goal task roadmap through `goal replan`, native UI plan, and reasoning effort profile before edits resume. Completed task profiles are preserved as audit history; incomplete task profiles are recalculated for the new path.
49
49
  - Every module task records:
50
- - Requested reasoning effort:
51
- - Effective reasoning effort: `inherited` until a new dispatch confirms an accepted override.
50
+ - Requested model:
51
+ - Effective model: <applied value | not-applied: reason | inherited: host has no option>
52
+ - Requested reasoning effort:
53
+ - Effective reasoning effort: <applied value | not-applied: reason | inherited: host has no option>
52
54
 
53
55
  ## Complexity Triage
54
56
 
@@ -84,6 +86,10 @@ Describe the observable result.
84
86
  - `worker`: bounded implementation tasks with clear file ownership, or scoped verification work.
85
87
  - Local main session: urgent blocking work when the next step depends immediately on the result.
86
88
 
89
+ | Task | Agent | Route | model | dispatch effort |
90
+ | --- | --- | --- | --- | --- |
91
+ | `<task-id>` | `<agent>` | `light` or `heavy` | <tier/value passed via host option> | <value passed via host option> |
92
+
87
93
  ## Tool Readiness
88
94
 
89
95
  - Detected stack:
@@ -114,8 +120,10 @@ Describe the observable result.
114
120
 
115
121
  - Task ID: `triage-plan`
116
122
  - Initial status: `active`
123
+ - Requested model:
124
+ - Effective model: <applied value | not-applied: reason | inherited: host has no option>
117
125
  - Requested reasoning effort:
118
- - Effective reasoning effort:
126
+ - Effective reasoning effort: <applied value | not-applied: reason | inherited: host has no option>
119
127
  - Contract: execute the investigation scope and Heavy Path criteria declared by the initial plan, then update this file and the Codex UI plan to the decision-complete implementation revision.
120
128
  - Required evidence records:
121
129
  - `planArtifact`: command, exit code 0, timestamp, goal ID, task ID, and plan ID.
@@ -125,8 +133,10 @@ Describe the observable result.
125
133
 
126
134
  - Task ID: `task-1`
127
135
  - Initial status: `pending` or `active`
136
+ - Requested model:
137
+ - Effective model: <applied value | not-applied: reason | inherited: host has no option>
128
138
  - Requested reasoning effort:
129
- - Effective reasoning effort:
139
+ - Effective reasoning effort: <applied value | not-applied: reason | inherited: host has no option>
130
140
  - Contract:
131
141
  - Sub-tasks, if needed:
132
142
  - Files: