litclaude-ai 0.3.10 → 0.3.11

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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.11 - 2026-06-21 — native goal/workflow/team route hardening
4
+
5
+ - Add honest native `/goal` binding guidance with degraded-mode `BLOCKED:` fallback when Claude Code exposes no supported programmatic goal surface.
6
+ - Add safe natural-language workflow/team routes (`lit workflow`, `lit ultracode`, `lit team`) with disabled-surface gates and no phantom launch/spawn claims.
7
+ - Preserve slash/path false-positive protections and natural-language `lit start work` handoff safety.
8
+
3
9
  ## 0.3.10 - 2026-06-20 — build-decision gate and reuse self-review
4
10
 
5
11
  - Add a pre-write minimum-first build-decision gate and a necessity/reuse self-review to the
package/README.md CHANGED
@@ -9,7 +9,7 @@
9
9
  </p>
10
10
  <p align="center">
11
11
  <img src="https://img.shields.io/badge/npm-litclaude--ai-cb3837" />
12
- <img src="https://img.shields.io/badge/version-0.3.10-2ea44f" />
12
+ <img src="https://img.shields.io/badge/version-0.3.11-2ea44f" />
13
13
  <img src="https://img.shields.io/badge/Claude%20Code-plugin-blueviolet" />
14
14
  <img src="https://img.shields.io/badge/license-MIT-blue" />
15
15
  </p>
@@ -22,13 +22,12 @@
22
22
  > `litclaude@litclaude-ai`, so normal `claude` launches can load the
23
23
  > LitClaude skills and hooks without a long `--plugin-dir` command.
24
24
 
25
- This checkout is prepared as `litclaude-ai@0.3.10` for personal install
25
+ This checkout is prepared as `litclaude-ai@0.3.11` for personal install
26
26
  convenience. The repo can remain quiet; preparing npm package metadata here does
27
27
  not imply public repo promotion, marketplace publication, or advertisement.
28
- Future package releases still require explicit user approval. The v0.3.10
29
- release materials preserve the v0.3.8 skill-depth work and add Claude-native
30
- hook activation, prompt/mode contract, safe mode-transition, primary-order, and
31
- installer permission-preference discipline.
28
+ Future package releases still require explicit user approval. The v0.3.11
29
+ release materials preserve the v0.3.10 build-decision gate and add honest native
30
+ goal binding attempts plus workflow/team setup gates while retaining installer permission-preference discipline.
32
31
 
33
32
  ## Features
34
33
 
@@ -43,6 +42,12 @@ installer permission-preference discipline.
43
42
  - **v0.2.2 Dynamic workflow hardening** - adds stricter subagent assignment
44
43
  contracts, `start-work-next`, context-pressure resume guidance, precise
45
44
  mutated-file detection, and richer `workflow-check --json` readiness checks
45
+ - **v0.3.10 build-decision gate** - a minimum-first check that runs before the
46
+ language gate and prefers the standard library, a native feature, or an
47
+ installed dependency over hand-rolled code, with a reuse review after writing
48
+ - **v0.3.11 native route hardening** - `lit goal` / `lit workflow` / `lit team`
49
+ routes attempt native Claude surfaces honestly, report degraded mode when a
50
+ host trigger is unavailable, and avoid phantom goal/workflow/team success
46
51
  - **5-lane review** - `/review-work` checks goal/constraint verification,
47
52
  hands-on QA execution, code quality, security, and local-first context mining
48
53
  - **Native goal guidance** - LIT context points Claude toward `/goal` or
@@ -95,7 +100,7 @@ directory, the normal install command works:
95
100
 
96
101
  ```bash
97
102
  cd /tmp
98
- npx --yes litclaude-ai@0.3.10 install
103
+ npx --yes litclaude-ai@0.3.11 install
99
104
  ```
100
105
 
101
106
  Validate the installed plugin:
@@ -108,7 +113,7 @@ The installer also sets Claude Code's `statusLine` command to the packaged
108
113
  LitClaude HUD. A typical no-color render starts like:
109
114
 
110
115
  ```text
111
- [🔥LITCLAUDE v0.3.10] | O4.8 │ ctx [▎░░] 9%/1000k │ 5h [▏░] 4% ↻2h15m │ 1w [▊░] 35% ↻3d6h │ git main +3 ✓
116
+ [🔥LITCLAUDE v0.3.11] | O4.8 │ ctx [▎░░] 9%/1000k │ 5h [▏░] 4% ↻2h15m │ 1w [▊░] 35% ↻3d6h │ git main +3 ✓
112
117
  ```
113
118
 
114
119
  The `↻` suffix is a compact rate-limit reset countdown. It is separated from
@@ -194,6 +199,12 @@ lit plan <what you want planned>
194
199
  lit review <scope to review>
195
200
  lit research <research question>
196
201
  lit goal <outcome and criteria>
202
+ lit workflow <parallel or delegated objective>
203
+ lit dynamic workflow <parallel or delegated objective>
204
+ lit ultracode <parallel or delegated objective>
205
+ lit team <collaborative objective>
206
+ lit team mode <collaborative objective>
207
+ lit teammates <collaborative objective>
197
208
  lit start work <approved plan>
198
209
  $lit-plan <what you want planned>
199
210
  /lit-plan <what you want planned>
@@ -223,28 +234,39 @@ execution, then the matching skill and agent instructions steer Claude toward
223
234
  test-first work, native goal handling, manual QA evidence, cleanup receipts, and
224
235
  explicit approval before future release steps.
225
236
 
226
- LitClaude does not auto-type `/goal` or send slash command text for you.
227
- Instead, the hook and LIT skills add run-context guidance: use Claude Code's
228
- native goal surface when available, inspect `get_goal`, call `create_goal` only
229
- when no matching goal is active, and reserve `update_goal` for verified
230
- completion or a genuine blocker. When goal tools are unavailable or not exposed,
231
- LitClaude keeps the local evidence ledger authoritative and may suggest an
232
- exact `/goal <completion condition>` before long execution without repeatedly
233
- printing fallback chatter.
237
+ LitClaude attempts native goal binding first, but it does not auto-type `/goal`
238
+ or send slash command text for you. The observed Claude Code hook surface can
239
+ add context or block a prompt; it does not expose a supported run-slash-command
240
+ channel. So the hook and LIT skills inspect for future `get_goal`,
241
+ `create_goal`, and `update_goal` tools when available, avoid clobbering a
242
+ different active goal without explicit replacement, and otherwise return an
243
+ explicit `BLOCKED:` degraded-mode note instead of claiming success. In degraded
244
+ mode, LitClaude keeps the durable `litgoal` ledger authoritative and may suggest
245
+ one exact `/goal <completion condition>` or `claude -p "/goal <completion
246
+ condition>"` for the native user surface.
234
247
  For large independent work, LitClaude applies the same principle to Claude
235
- Code's available orchestration surfaces: when `Workflow` is exposed and the task
236
- is broad, risky, parallel, or long-running, LitClaude **proposes a Dynamic
237
- workflow and calls the `Workflow` tool once you opt in**. The tool can fan out
238
- many subagents and spend a large token budget, so it asks first — this opt-in
239
- gate (not a host limitation) is why a Dynamic workflow only starts after the
240
- proposal. When isolated edits need a model-facing worktree lane, use
241
- `EnterWorktree`. If only the CLI surface is available for a fresh isolated lane,
242
- use `claude --worktree <short-name> --tmux`.
248
+ Code's available orchestration surfaces: `lit workflow`, `lit dynamic workflow`,
249
+ and `lit ultracode` prefer current `ultracode` or explicit “run a workflow” /
250
+ “use a workflow wording, not casual mentions. If `Workflow` is exposed and the
251
+ task is broad, risky, parallel, or long-running, LitClaude **proposes a Dynamic
252
+ workflow and calls the `Workflow` tool once you opt in**. If
253
+ `CLAUDE_CODE_DISABLE_WORKFLOWS=1` is set, LitClaude reports the setup gate and
254
+ falls back to normal planning/subagent delegation. When isolated edits need a
255
+ model-facing worktree lane, use `EnterWorktree`. If only the CLI surface is
256
+ available for a fresh isolated lane, use `claude --worktree <short-name> --tmux`.
257
+
258
+ Native agent teams are experimental and setup-gated. `lit team`, `lit team
259
+ mode`, and `lit teammates` steer Claude to spawn named teammates only when
260
+ `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` is enabled and the user approves the
261
+ roles, file-scope boundaries, acceptance criteria, wait instructions, and final
262
+ synthesis. Optional display setup is `claude --teammate-mode auto` or
263
+ `"teammateMode": "auto"`; if the env gate is absent, LitClaude says so and
264
+ offers subagent/Dynamic workflow fallback without pretending teammates launched.
243
265
 
244
266
  For v0.2.2 Dynamic workflow hardening, `/dynamic-workflow` is the consolidated
245
- bootstrap route for broad delegated work. It keeps `/goal` user-controlled,
246
- checks model-facing goal tools when exposed, asks for an exact fallback
247
- `/goal <completion condition>` when needed, and maps subagent delegation to
267
+ bootstrap route for broad delegated work. It attempts native goal binding when a
268
+ supported goal tool surface exists, reports degraded `BLOCKED:` mode when it
269
+ does not, keeps `/goal` user-controlled, and maps subagent delegation to
248
270
  `prometheus-planner`, `boulder-executor`, `oracle-verifier`, `qa-runner`,
249
271
  `quality-reviewer`, and `librarian-researcher`. Child assignments are expected
250
272
  to start with `TASK:` and include `DELIVERABLE`, `SCOPE`, and `VERIFY`, so
package/README_ko-KR.md CHANGED
@@ -9,7 +9,7 @@
9
9
  </p>
10
10
  <p align="center">
11
11
  <img src="https://img.shields.io/badge/npm-litclaude--ai-cb3837" />
12
- <img src="https://img.shields.io/badge/version-0.3.10-2ea44f" />
12
+ <img src="https://img.shields.io/badge/version-0.3.11-2ea44f" />
13
13
  <img src="https://img.shields.io/badge/Claude%20Code-plugin-blueviolet" />
14
14
  <img src="https://img.shields.io/badge/license-MIT-blue" />
15
15
  </p>
@@ -26,13 +26,12 @@
26
26
  > 설치되므로, 매번 긴 `--plugin-dir` 없이 일반 `claude` 실행에서
27
27
  > LitClaude skill과 hook을 불러올 수 있습니다.
28
28
 
29
- 현재 checkout은 `litclaude-ai@0.3.10` 배포 준비용으로 정리되어 있습니다. 목적은
29
+ 현재 checkout은 `litclaude-ai@0.3.11` 배포 준비용으로 정리되어 있습니다. 목적은
30
30
  다른 PC에서도 빠르게 설치하기 위한 개인용 package metadata를 갖추는 것입니다.
31
31
  npm package metadata를 준비했다고 해서 홍보, 공개 저장소 운영, Claude
32
32
  marketplace 등록을 의미하지는 않습니다. 새 버전 배포는 항상 별도의 명시적
33
- 승인 후에 진행합니다. v0.3.10 release material은 v0.3.8 skill-depth 작업을
34
- 보존하고, Claude-native hook activation, prompt/mode contract, safe
35
- mode-transition, primary-order, installer permission preference discipline을
33
+ 승인 후에 진행합니다. v0.3.11 release material은 v0.3.10 build-decision
34
+ gate를 보존하고, native goal binding 시도와 workflow/team setup gate를
36
35
  추가합니다.
37
36
 
38
37
  ## 기능
@@ -48,6 +47,12 @@ mode-transition, primary-order, installer permission preference discipline을
48
47
  - **v0.2.2 Dynamic workflow hardening** - 더 엄격한 subagent assignment
49
48
  contract, `start-work-next`, context-pressure resume guidance, 정확한
50
49
  mutated-file 감지, 강화된 `workflow-check --json` readiness check를 추가
50
+ - **v0.3.10 build-decision gate** - language gate 앞에서 minimum-first check를
51
+ 돌려 표준 라이브러리·네이티브 기능·이미 설치된 의존성을 직접 작성보다 먼저
52
+ 쓰게 하고, 작성 후 reuse review를 추가
53
+ - **v0.3.11 native route hardening** - `lit goal` / `lit workflow` / `lit team`
54
+ route가 Claude native surface를 정직하게 시도하고, host trigger가 없으면
55
+ degraded mode를 보고하며 가짜 goal/workflow/team 성공을 피함
51
56
  - **5-lane review** - `/review-work`가 goal/constraint verification,
52
57
  hands-on QA execution, code quality, security, local-first context mining을
53
58
  한 번에 점검
@@ -100,7 +105,7 @@ checkout을 먼저 해석해서 `sh: litclaude-ai: command not found`로 실패
100
105
 
101
106
  ```bash
102
107
  cd /tmp
103
- npx --yes litclaude-ai@0.3.10 install
108
+ npx --yes litclaude-ai@0.3.11 install
104
109
  ```
105
110
 
106
111
  설치 상태를 확인합니다.
@@ -113,7 +118,7 @@ installer는 Claude Code의 `statusLine` command도 packaged LitClaude HUD로
113
118
  설정합니다. 색상을 제거한 예시는 다음처럼 시작합니다.
114
119
 
115
120
  ```text
116
- [🔥LITCLAUDE v0.3.10] | O4.8 │ ctx [▎░░] 9%/1000k │ 5h [▏░] 4% ↻2h15m │ 1w [▊░] 35% ↻3d6h │ git main +3 ✓
121
+ [🔥LITCLAUDE v0.3.11] | O4.8 │ ctx [▎░░] 9%/1000k │ 5h [▏░] 4% ↻2h15m │ 1w [▊░] 35% ↻3d6h │ git main +3 ✓
117
122
  ```
118
123
 
119
124
  `↻` 표시는 rate-limit reset까지 남은 시간을 짧게 보여주는 countdown입니다.
@@ -1,13 +1,12 @@
1
1
  # LitClaude Release Checklist
2
2
 
3
- Status: `litclaude-ai@0.3.10` is the current release candidate — a Claude-native
4
- hook activation and mode-discipline parity pass based on LitOpenCode v0.1.17.
5
- It routes natural `lit` prompts by mode, blocks natural-language start-work with
6
- a safe handoff, reinforces planning/execution/review/research/goal contracts,
7
- documents primary role order, and records installer permission preferences
8
- without copying OpenCode-only permission objects.
9
- `package.json` is aligned to `0.3.10`, and
10
- `plugins/litclaude/.claude-plugin/plugin.json` is aligned to `0.3.10`.
3
+ Status: `litclaude-ai@0.3.11` is the current release candidate — a Claude-native
4
+ goal/workflow/team route-hardening pass. It attempts native goal binding
5
+ honestly, reports degraded `BLOCKED:` mode when Claude exposes no supported
6
+ programmatic goal trigger, gates Dynamic workflow and native agent-team routes,
7
+ and preserves safe natural-language start-work handoff behavior.
8
+ `package.json` is aligned to `0.3.11`, and
9
+ `plugins/litclaude/.claude-plugin/plugin.json` is aligned to `0.3.11`.
11
10
 
12
11
  This release carries the v0.2.2 Dynamic workflow hardening surfaces:
13
12
  `/dynamic-workflow`, `workflow-check --json`, native `/goal` fallback guidance,
@@ -56,8 +55,8 @@ No npm publication is required for this track.
56
55
  Before requesting publication approval, confirm these artifacts from the current
57
56
  checkout:
58
57
 
59
- - `package.json` version is `0.3.10`.
60
- - `plugins/litclaude/.claude-plugin/plugin.json` version is `0.3.10`.
58
+ - `package.json` version is `0.3.11`.
59
+ - `plugins/litclaude/.claude-plugin/plugin.json` version is `0.3.11`.
61
60
  - `plugins/litclaude/commands/dynamic-workflow.md` documents subagent delegation.
62
61
  - `node bin/litclaude-ai.js workflow-check --json` reports `status: pass`.
63
62
  - `node bin/litclaude-ai.js workflow-check --json` reports
package/docs/agents.md CHANGED
@@ -3,6 +3,14 @@
3
3
  LitClaude agents map the LitClaude team workflow into Claude Code subagents
4
4
  with bounded responsibilities.
5
5
 
6
+ Native Claude Code agent teams are separate from these plugin subagents. The
7
+ natural routes `lit team`, `lit team mode`, and `lit teammates` are setup-gated
8
+ by `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1`; when enabled, LitClaude asks Claude
9
+ to spawn approved teammates with roles, file-scope boundaries, acceptance
10
+ criteria, wait instructions, and synthesis. Optional display setup is
11
+ `claude --teammate-mode auto` or `"teammateMode": "auto"`. When the env gate is
12
+ absent, use the subagent/Dynamic workflow routes below.
13
+
6
14
  Primary order:
7
15
 
8
16
  1. `lit-loop` — the default execution-loop skill for direct, evidence-driven work.
package/docs/hooks.md CHANGED
@@ -24,6 +24,12 @@ lit plan
24
24
  lit review
25
25
  lit research
26
26
  lit goal
27
+ lit workflow
28
+ lit dynamic workflow
29
+ lit ultracode
30
+ lit team
31
+ lit team mode
32
+ lit teammates
27
33
  lit start work
28
34
  $lit-plan
29
35
  $lit-loop
@@ -44,24 +50,38 @@ returns a `BLOCKED:` handoff that tells the user to run `/start-work` or
44
50
  `/litclaude:start-work` with the approved plan, because a prompt hook cannot
45
51
  switch Claude Code agents.
46
52
 
47
- LitClaude follows the LitClaude goal pattern as model-facing run context, not
48
- as slash-command injection. If Claude Code exposes the native goal surface, the
53
+ LitClaude follows the LitClaude goal pattern as an honest native-binding attempt,
54
+ not as slash-command injection. If Claude Code exposes native goal tools, the
49
55
  guidance tells Claude to inspect `get_goal`, call `create_goal` only when no
50
56
  matching goal is active, and delay `update_goal` until verified completion or a
51
- genuine blocker. It may also point Claude toward the user-visible `/goal`
52
- surface, but it does not auto-type `/goal` or send slash command text.
57
+ genuine blocker. The hook also refuses to clobber a different active goal
58
+ without explicit replacement.
53
59
 
54
- If goal tools are unavailable or not exposed in the running Claude Code session,
55
- the hook context keeps the local evidence ledger authoritative. It may suggest
56
- `/goal <completion condition>` before long execution, but it should not repeat
57
- fallback chatter on every LIT turn.
60
+ Source-backed capability note: the observed `UserPromptSubmit` hook surface can
61
+ add `additionalContext` or block; it cannot replace the prompt or run another
62
+ slash command. If goal tools are unavailable or not exposed in the running
63
+ Claude Code session, the hook returns explicit `BLOCKED:` / degraded-mode
64
+ guidance, does not claim native goal success, keeps the local `litgoal` evidence
65
+ ledger authoritative, and may suggest `/goal <completion condition>` or
66
+ `claude -p "/goal <completion condition>"` for the native user surface.
58
67
 
59
68
  For broad work, the same context ports the LitClaude model-facing principle to
60
- Claude Code's exposed orchestration surfaces: if `Workflow` is available,
61
- propose it first and call the `Workflow` tool only after user opt-in or existing
62
- session permission, binding every lane to evidence and cleanup. If isolated edits need a model-facing worktree lane, use
63
- `EnterWorktree`; when only the CLI surface is available, the actionable launch
64
- form is `claude --worktree <short-name> --tmux`.
69
+ Claude Code's exposed orchestration surfaces: `lit workflow`, `lit dynamic
70
+ workflow`, and `lit ultracode` prefer current `ultracode` or explicit “run a
71
+ workflow” / “use a workflow” wording, not casual mentions. If `Workflow` is
72
+ available, propose it first and call the `Workflow` tool only after user opt-in
73
+ or existing session permission, binding every lane to evidence and cleanup. If
74
+ `CLAUDE_CODE_DISABLE_WORKFLOWS=1` is set, report the setup gate and fall back to
75
+ normal LitClaude planning/subagent delegation. If isolated edits need a
76
+ model-facing worktree lane, use `EnterWorktree`; when only the CLI surface is
77
+ available, the actionable launch form is `claude --worktree <short-name> --tmux`.
78
+
79
+ For native agent teams, `lit team`, `lit team mode`, and `lit teammates` are
80
+ setup-gated by `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1`. When enabled, steer
81
+ Claude to spawn named teammates only after user approval, with roles, file-scope
82
+ boundaries, acceptance criteria, wait instructions, and final synthesis. When
83
+ disabled, say so and offer subagent/Dynamic workflow fallback. Optional display
84
+ setup is `claude --teammate-mode auto` or `"teammateMode": "auto"`.
65
85
 
66
86
  `/dynamic-workflow` and `$dynamic-workflow` are the v0.2.2 consolidated route
67
87
  for that behavior. They load `/litclaude:dynamic-workflow` / `Skill(lit-loop)`,
package/docs/migration.md CHANGED
@@ -55,18 +55,22 @@ manual `--plugin-dir` launch commands, or a remote Claude marketplace entry.
55
55
 
56
56
  ## Goal And Dynamic Workflow Parity
57
57
 
58
- Reference goal integration is model-facing guidance around goal tools; it does
59
- not type a `/goal` slash command for the user. LitClaude mirrors that contract:
60
- lit hook context and lit skills mention Claude Code's native goal surface, ask
61
- Claude to inspect `get_goal`, create a goal with `create_goal` only when no
62
- matching active goal exists, and defer `update_goal` until the evidence gate has
63
- passed or a real blocker is recorded.
58
+ Reference goal integration is an honest native-binding attempt around goal
59
+ tools; it does not type a `/goal` slash command for the user. LitClaude mirrors
60
+ that contract: lit hook context and lit skills mention Claude Code's native goal
61
+ surface, ask Claude to inspect `get_goal`, create a goal with `create_goal` only
62
+ when no matching active goal exists, refuse to clobber a different active goal
63
+ without explicit replacement, and defer `update_goal` until the evidence gate
64
+ has passed or a real blocker is recorded.
64
65
 
65
66
  Current Claude Code sessions may not expose model-facing goal tools to the
66
- model. When goal tools are unavailable or not exposed, LitClaude should not
67
- pretend the native goal was bound. It keeps the local evidence ledger
68
- authoritative and may suggest `/goal <completion condition>` before
69
- long-running lit execution without repeatedly printing fallback chatter.
67
+ model. The observed hook output schema can add context or block; it cannot run
68
+ another slash command. When goal tools are unavailable or not exposed, LitClaude
69
+ returns explicit `BLOCKED:` / degraded-mode guidance, should not pretend the
70
+ native goal was bound, keeps the local evidence ledger authoritative, and may
71
+ suggest `/goal <completion condition>` or `claude -p "/goal <completion
72
+ condition>"` before long-running lit execution without repeatedly printing
73
+ fallback chatter.
70
74
 
71
75
  When the user explicitly chooses Claude Code `/goal`, that native session goal
72
76
  remains user-visible and user-controlled. LitClaude does not auto-type
@@ -76,10 +80,11 @@ execution, bind each lane to criteria and evidence, and use `EnterWorktree` for
76
80
  isolated model-facing worktree lanes. When only the CLI surface is available,
77
81
  the concrete isolated-lane launch form is `claude --worktree <short-name> --tmux`.
78
82
 
79
- `/dynamic-workflow`, `$dynamic-workflow`, and `/litclaude:dynamic-workflow`
80
- consolidate that behavior into one route. The route keeps `/goal`
81
- user-controlled, calls model-facing goal tools only when exposed, and maps
82
- subagent delegation to `prometheus-planner`, `boulder-executor`,
83
+ `/dynamic-workflow`, `$dynamic-workflow`, `lit workflow`, `lit dynamic
84
+ workflow`, `lit ultracode`, and `/litclaude:dynamic-workflow` consolidate that
85
+ behavior into one route. The route keeps `/goal` user-controlled, calls
86
+ model-facing goal tools only when exposed, reports `CLAUDE_CODE_DISABLE_WORKFLOWS=1`
87
+ as a setup gate, and maps subagent delegation to `prometheus-planner`, `boulder-executor`,
83
88
  `oracle-verifier`, `qa-runner`, `quality-reviewer`, and `librarian-researcher`.
84
89
  Child assignments use `TASK:`, `DELIVERABLE`, `SCOPE`, and `VERIFY`;
85
90
  `workflow-check --json` now verifies both subagent reliability and command/hook
@@ -93,6 +98,14 @@ Long `$start-work` runs can also use `litclaude-ai start-work-next --json` to
93
98
  recover the active plan, ledger path, and first unchecked top-level task from
94
99
  local `.litclaude` state after a compacted or interrupted session.
95
100
 
101
+ Native agent teams remain experimental and disabled unless
102
+ `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` is present. The natural routes `lit
103
+ team`, `lit team mode`, and `lit teammates` steer Claude to request approved
104
+ teammates with roles, boundaries, acceptance criteria, wait, and synthesis; when
105
+ the env gate is absent, LitClaude falls back to subagents or Dynamic workflow.
106
+ Optional display setup is `claude --teammate-mode auto` or `"teammateMode":
107
+ "auto"`.
108
+
96
109
  ## Review And Litgoal Parity
97
110
 
98
111
  The workflow parity surface is local-first and evidence-bound. It does not imply
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "litclaude-ai",
3
- "version": "0.3.10",
3
+ "version": "0.3.11",
4
4
  "description": "Claude Code-native workflow distribution.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "litclaude",
3
3
  "description": "Claude Code-native workflow plugin.",
4
- "version": "0.3.10",
4
+ "version": "0.3.11",
5
5
  "author": {
6
6
  "name": "LitClaude contributors"
7
7
  },
@@ -6,6 +6,7 @@ import { extractMutatedFilePaths } from "../lib/mutated-file-paths.mjs";
6
6
  import { litgoalGoalsPath } from "../lib/litgoal/paths.mjs";
7
7
  import { readLitgoalState } from "../lib/litgoal/state.mjs";
8
8
  import { evaluateAutoloop, readAutoloopState, writeAutoloopState } from "../lib/litgoal/autoloop.mjs";
9
+ import { buildNativeGoalBindingGuidance, normalizeGoalObjective } from "../lib/native-goal-binding.mjs";
9
10
 
10
11
  const eventName = process.argv[2] ?? "";
11
12
 
@@ -49,6 +50,7 @@ const compoundWordBoundary = /^[A-Za-z0-9_-]$/u;
49
50
  const triggerByToken = {
50
51
  "deep-interview": { command: "/litclaude:deep-interview", skill: "Skill(deep-interview)", discipline: "deep-interview" },
51
52
  "dynamic-workflow": { command: "/litclaude:dynamic-workflow", skill: "Skill(lit-loop)", discipline: "dynamic-workflow" },
53
+ "agent-team": { command: "/litclaude:lit-loop", skill: "Skill(lit-loop)", discipline: "agent-team" },
52
54
  "lit-plan": { command: "/litclaude:lit-plan", skill: "Skill(lit-plan)", discipline: "lit-plan" },
53
55
  "lit-loop": { command: "/litclaude:lit-loop", skill: "Skill(lit-loop)", discipline: "lit-loop" },
54
56
  "start-work": { command: "/litclaude:start-work", skill: "Skill(start-work)", discipline: "start-work" },
@@ -66,6 +68,7 @@ const modeContracts = {
66
68
  litgoal: "Mode contract: litgoal binds one outcome-shaped objective plus checkable criteria, each with scenario, real surface, and observable evidence.",
67
69
  "deep-interview": "Mode contract: deep-interview clarifies vague requirements before planning or implementation, without inventing acceptance criteria.",
68
70
  "dynamic-workflow": "Mode contract: dynamic-workflow is opt-in orchestration for broad, risky, parallel, or long-running work; propose it first and only call Workflow after user opt-in or existing session permission.",
71
+ "agent-team": "Mode contract: agent-team is setup-gated native Claude Code teammate orchestration. Spawn teammates only when experimental teams are enabled and the user approves roles, scope boundaries, acceptance criteria, wait, and synthesis instructions.",
69
72
  };
70
73
 
71
74
  const withoutCode = (text) => text.replace(/```[\s\S]*?```/gu, " ").replace(/`[^`]*`/gu, " ");
@@ -132,12 +135,17 @@ const findDollarCommandTrigger = (raw) => {
132
135
 
133
136
  const hasLitTrigger = (raw) => containsCompoundBoundedWord(raw, "lit") || containsCompoundBoundedWord(raw, "litwork");
134
137
 
138
+ const hasExplicitWorkflowRoute = (normalized) => /\blit(?:work)?\s+(?:dynamic\s+workflow|workflow|ultracode)\b/u.test(normalized);
139
+ const hasExplicitTeamRoute = (normalized) => /\blit(?:work)?\s+(?:team(?:\s+mode)?|teammates)\b/u.test(normalized);
140
+
135
141
  const findNaturalLitTrigger = (prompt) => {
136
142
  const raw = rawTriggerText(prompt);
137
143
  if (containsSlashCommandMention(raw)) return undefined;
138
144
  if (!hasLitTrigger(raw)) return undefined;
139
145
 
140
146
  const normalized = normalizedTriggerText(prompt);
147
+ if (hasExplicitTeamRoute(normalized)) return { ...triggerByToken["agent-team"], source: "natural-language" };
148
+ if (hasExplicitWorkflowRoute(normalized)) return { ...triggerByToken["dynamic-workflow"], source: "natural-language" };
141
149
  if (containsPlainWord(normalized, "review")) return { ...triggerByToken["review-work"], source: "natural-language" };
142
150
  if (containsPlainWord(normalized, "start") && containsPlainWord(normalized, "work")) {
143
151
  return { ...triggerByToken["start-work"], source: "natural-language", safetyBlock: true };
@@ -161,7 +169,34 @@ const isDiagnosticLiteralPrompt = (prompt) =>
161
169
  && /do not inspect or modify files/iu.test(prompt)
162
170
  && /reply with exactly one line/iu.test(prompt);
163
171
 
164
- const litworkContext = ({ command, skill, discipline, softConfirm, safetyBlock, source }) => [
172
+ const objectiveTail = (prompt) => {
173
+ const raw = withoutCode(prompt);
174
+ const match = /\blit(?:work)?\b\s*(.*)$/isu.exec(raw);
175
+ return normalizeGoalObjective(match?.[1] ?? raw);
176
+ };
177
+
178
+ const goalBindingContext = ({ discipline, prompt, activeGoal }) => {
179
+ if (!["lit-loop", "lit-plan", "litgoal", "dynamic-workflow"].includes(discipline)) return [];
180
+ return [buildNativeGoalBindingGuidance({ objective: objectiveTail(prompt), activeGoal }).message];
181
+ };
182
+
183
+ const workflowGateContext = (discipline) => {
184
+ if (discipline !== "dynamic-workflow") return [];
185
+ if (process.env.CLAUDE_CODE_DISABLE_WORKFLOWS === "1") {
186
+ return ["Dynamic workflow setup gate: CLAUDE_CODE_DISABLE_WORKFLOWS=1 is set, so do not claim a native workflow launch. Fallback to normal LitClaude planning/subagent delegation unless the user re-enables Claude Code workflows."];
187
+ }
188
+ return ["Dynamic workflow native trigger guidance: prefer current Claude Code `ultracode` or explicit `run a workflow` / `use a workflow` wording; do not rely on casual bare workflow mentions or hook-injected text to launch orchestration. If the Workflow tool is visible, call it only after opt-in or existing permission, and never claim a workflow started until Claude Code confirms it."];
189
+ };
190
+
191
+ const teamGateContext = (discipline) => {
192
+ if (discipline !== "agent-team") return [];
193
+ if (process.env.CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS === "1") {
194
+ return ["Native agent team guidance: CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1 is enabled. Ask Claude to spawn named teammates only after user approval, with security, QA, architecture, or other requested roles; assign file-scope boundaries, acceptance criteria, wait instructions, and final synthesis. Do not claim teammates spawned until Claude Code confirms the spawn."];
195
+ }
196
+ return ["Native agent team setup gate: CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1 is not set, so do not claim a teammate launch. To enable native teams, launch with `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1 claude --teammate-mode auto` or set `env.CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS` plus optional `teammateMode: auto`; fallback to subagent delegation or Dynamic workflow meanwhile."];
197
+ };
198
+
199
+ const litworkContext = ({ command, skill, discipline, softConfirm, safetyBlock, source }, input) => [
165
200
  ...(safetyBlock
166
201
  ? ["BLOCKED: Natural-language start-work activation cannot switch the active Claude Code agent. Run `/start-work` (or `/litclaude:start-work`) with the approved plan so Claude Code can use the correct execution surface; do not continue implementation from this prompt hook."]
167
202
  : []),
@@ -172,10 +207,12 @@ const litworkContext = ({ command, skill, discipline, softConfirm, safetyBlock,
172
207
  modeContracts[discipline],
173
208
  `Activation source: ${source ?? "legacy"}. Slash commands and slash-command mentions are handled by Claude Code's native command surface and do not activate this prompt hook. Code spans, code fences, substrings, and compound tokens are ignored. Secret-bearing prompt material is never persisted raw; record only redacted summaries and evidence paths in durable state.`,
174
209
  "Use evidence-bound planning, tests, manual QA, and cleanup receipts.",
175
- "Native goal binding (read this first): Claude Code's /goal (v2.1.139+) is a USER-TYPED slash command that sets an autonomous completion condition — a hook or skill CANNOT invoke it, and Claude Code currently exposes NO model-facing goal tools. So the real path is: when a goal is worth binding, propose a concrete, ready-to-paste /goal <completion condition> for the user, and keep driving the LitClaude evidence ledger meanwhile.",
176
- "Forward-compat goal tools: if a future Claude Code build does expose model-facing goal tools, prefer them — first inspect get_goal, call create_goal with an objective-only payload when no matching goal is active, and reserve update_goal for verified completion or a genuine blocker. These are unavailable / not exposed today, so the /goal proposal above is the actual mechanism.",
177
- "Do not auto-type or inject the user's slash commands; LitClaude does not auto-type /goal — treat /goal as Claude Code's native user surface, not as prompt text for this hook to send.",
210
+ ...goalBindingContext({ discipline, prompt: input.prompt, activeGoal: input.native_goal ?? input.active_goal ?? input.goal }),
211
+ "Forward-compat goal tools: if a future Claude Code build exposes model-facing goal tools, prefer them — first inspect get_goal, call create_goal only when no matching goal is active, and reserve update_goal for verified completion or a genuine blocker. If they are unavailable, report degraded mode and keep durable litgoal evidence authoritative.",
212
+ "Do not auto-type or inject the user's slash commands; treat /goal as Claude Code's native user surface, not as prompt text for this hook to send.",
178
213
  "Dynamic workflow integration: when Claude Code exposes the Workflow tool and the task is broad, risky, parallel, or long-running, briefly propose a Dynamic workflow and call the Workflow tool once the user opts in (or when the session already permits orchestration) before serial execution, binding each lane to explicit criteria, artifacts, and cleanup receipts. The Workflow tool can fan out many subagents and spend a large token budget, so it requires explicit user opt-in — surface the proposal, do not launch it silently. This opt-in gate (not a host limitation) is why a Dynamic workflow only starts after you offer it.",
214
+ ...workflowGateContext(discipline),
215
+ ...teamGateContext(discipline),
179
216
  "Dynamic worktree integration: when Claude Code exposes EnterWorktree and isolated edits are needed, use EnterWorktree for the selected lane; otherwise use or recommend claude --worktree <short-name> --tmux. Never mutate unrelated user state.",
180
217
  "Subagent delegation: route planning to litclaude:prometheus-planner, implementation to litclaude:boulder-executor, verification to litclaude:oracle-verifier, hands-on QA to litclaude:qa-runner, code/security review to litclaude:quality-reviewer, and local-first research to litclaude:librarian-researcher when Claude Code subagents or Dynamic workflow lanes are available. LitClaude subagents are exposed under the litclaude: namespace, so pass the exact namespaced id (e.g. litclaude:boulder-executor) as the Agent/Task tool subagent_type, not the bare name.",
181
218
  "Subagent reliability: each child assignment starts with TASK: and includes DELIVERABLE, SCOPE, and VERIFY; use short wait cycles, treat timeouts as no-update signals, and fallback only after a missing deliverable, acknowledgement-only reply, or BLOCKED: report.",
@@ -200,7 +237,7 @@ switch (eventName) {
200
237
  const systemMessage = trigger.discipline === "deep-interview"
201
238
  ? `LitClaude deep-interview engaged (${trigger.discipline} guidance injected).`
202
239
  : `🔥 LITBURN IGNITED 🔥 — LitClaude lit hook active: ${trigger.discipline} guidance injected.`;
203
- writeContext(litworkContext(trigger), systemMessage);
240
+ writeContext(litworkContext(trigger, input), systemMessage);
204
241
  } else {
205
242
  writeContext("LitClaude prompt hook checked: no workflow activation.");
206
243
  }
@@ -6,15 +6,21 @@ argument-hint: '<objective>'
6
6
  Use the `lit-loop` skill for the user's current objective, with this
7
7
  Dynamic-workflow bootstrap first.
8
8
 
9
- 1. Inspect native goal state when model-facing tools are exposed: call
10
- `get_goal`, call `create_goal` only when no matching active goal exists, and
11
- reserve `update_goal` for verified completion or a genuine blocker. If only
12
- the user-visible goal surface is available, ask for one exact
13
- `/goal <completion condition>` instead of claiming LitClaude set it.
9
+ 1. Attempt native goal binding honestly: inspect native goal state when
10
+ model-facing tools are exposed, call `get_goal`, call `create_goal` only when
11
+ no matching active goal exists, and reserve `update_goal` for verified
12
+ completion or a genuine blocker. Do not clobber a different active goal
13
+ without explicit replacement. If only the user-visible goal surface is
14
+ available, report `BLOCKED:` / degraded mode and ask for one exact
15
+ `/goal <completion condition>` or `claude -p "/goal <completion condition>"`
16
+ instead of claiming LitClaude set it.
14
17
  2. Run `litclaude-ai workflow-check --json` when the package CLI is available.
15
18
  Treat a failing check as BLOCKED until the missing route, command, or
16
19
  subagent delegation surface is fixed.
17
- 3. For broad, risky, parallel, or long-running work, briefly propose a Dynamic
20
+ 3. For broad, risky, parallel, or long-running work, prefer current `ultracode`
21
+ or explicit “run a workflow” / “use a workflow” wording. If
22
+ `CLAUDE_CODE_DISABLE_WORKFLOWS=1` is set, report the setup gate and fall back
23
+ to normal LitClaude planning/subagents. Otherwise briefly propose a Dynamic
18
24
  workflow and call the `Workflow` tool once the user opts in (or when the
19
25
  session already permits orchestration). The tool can fan out many subagents
20
26
  and spend a large token budget, so it needs explicit user opt-in — surface
@@ -23,8 +23,12 @@ litclaude litgoal steer --kind scope --note "<what changed and why>" --json
23
23
  ```
24
24
 
25
25
  The ledger lives under `.litclaude/litgoal/` unless test environment variables
26
- override it. Bind work to native goal tools when they are available; when goal
27
- tools are unavailable, record clear criteria and evidence in the local ledger.
26
+ override it. Attempt native binding through goal tools when they are available:
27
+ inspect `get_goal`, call `create_goal` only when no matching active goal exists,
28
+ and avoid clobbering a different active goal without explicit replacement. When
29
+ goal tools are unavailable, return explicit `BLOCKED:` / degraded-mode wording
30
+ instead of claiming native success, and record clear criteria and evidence in
31
+ the local ledger.
28
32
  For broad goal execution, use Dynamic workflow when Claude Code exposes it, and
29
33
  use `claude --worktree <short-name> --tmux` only when isolated worktree
30
34
  execution is needed.
@@ -0,0 +1,53 @@
1
+ const MAX_OBJECTIVE_CHARS = 180;
2
+
3
+ const secretPatterns = [
4
+ /sk-[A-Za-z0-9_-]{20,}/gu,
5
+ /(?:api[_-]?key|token|secret|password)\s*=\s*\S+/giu,
6
+ ];
7
+
8
+ const normalizeSpaces = (value) => value.replace(/\s+/gu, " ").trim();
9
+
10
+ export const normalizeGoalObjective = (value) => {
11
+ if (typeof value !== "string") return "";
12
+ const cleaned = value
13
+ .split(/\r?\n/gu)
14
+ .filter((line) => !line.trimStart().startsWith("/"))
15
+ .join(" ");
16
+ const redacted = secretPatterns.reduce(
17
+ (text, pattern) => text.replace(pattern, "[REDACTED]"),
18
+ cleaned,
19
+ );
20
+ return normalizeSpaces(redacted).slice(0, MAX_OBJECTIVE_CHARS).trim();
21
+ };
22
+
23
+ const canonical = (value) => normalizeGoalObjective(value).toLowerCase();
24
+
25
+ const activeGoalObjective = (activeGoal) => {
26
+ if (!activeGoal || typeof activeGoal !== "object") return "";
27
+ return normalizeGoalObjective(activeGoal.objective ?? activeGoal.goal ?? activeGoal.text ?? "");
28
+ };
29
+
30
+ export const buildNativeGoalBindingGuidance = ({ objective, activeGoal } = {}) => {
31
+ const normalizedObjective = normalizeGoalObjective(objective);
32
+ const activeObjective = activeGoalObjective(activeGoal);
33
+ const activeStatus = typeof activeGoal?.status === "string" ? activeGoal.status.toLowerCase() : "";
34
+
35
+ if (!normalizedObjective) {
36
+ return {
37
+ status: "blocked-missing-objective",
38
+ message: "Native goal binding attempt: BLOCKED: missing objective. Provide one outcome-shaped objective with checkable evidence; keep the durable `litgoal` ledger authoritative until Claude Code exposes a supported programmatic goal surface.",
39
+ };
40
+ }
41
+
42
+ if (activeObjective && (!activeStatus || activeStatus === "active") && canonical(activeObjective) !== canonical(normalizedObjective)) {
43
+ return {
44
+ status: "blocked-conflict",
45
+ message: `Native goal binding attempt: BLOCKED: active native goal differs (${activeObjective}). LitClaude will not clobber it without explicit replacement; use Claude Code's user-visible /goal replacement flow or provide explicit replacement approval. Keep the durable \`litgoal\` ledger authoritative meanwhile.`,
46
+ };
47
+ }
48
+
49
+ return {
50
+ status: "blocked-unavailable",
51
+ message: "Native goal binding attempt: BLOCKED: native `/goal` not programmatically bound. Evidence: the supported UserPromptSubmit hook surface can add context or block, but does not expose a run-slash-command channel; this session exposes no callable get_goal/create_goal/update_goal tools to LitClaude. I will not claim host goal activation. To bind Claude Code's native user surface, paste `/goal <completion condition>` in the session, or run `claude -p \"/goal <completion condition>\"` in a non-interactive flow. Until then, keep the durable `litgoal` ledger authoritative for objective, criteria, evidence, checkpoints, and blockers.",
52
+ };
53
+ };
@@ -59,28 +59,40 @@ When uncertain, treat the task as HEAVY.
59
59
 
60
60
  ## Native Goal + Dynamic Workflow
61
61
 
62
- Claude Code's `/goal` (v2.1.139+) is a **user-typed slash command** that sets an autonomous
63
- completion condition; a hook or skill **cannot invoke it**, and Claude Code exposes no
64
- model-facing goal tools today. Bind goals like this:
65
-
66
- - When a goal is worth binding, **propose a concrete, ready-to-paste `/goal <completion
67
- condition>`** for the user, and keep driving the local evidence ledger meanwhile. LitClaude
68
- must not auto-type or send `/goal` text.
62
+ Attempt native goal binding first. Claude Code's `/goal` (v2.1.139+) is the
63
+ native user surface, but the observed hook/skill surface cannot run another
64
+ slash command and this session may expose no model-facing goal tools. Bind goals
65
+ like this:
66
+
67
+ - If model-facing tools are exposed, inspect `get_goal`, call `create_goal` only
68
+ when no matching active goal exists, avoid clobbering a different active goal
69
+ without explicit replacement, and call `update_goal` only after every success
70
+ criterion has evidence or the work is genuinely blocked.
71
+ - When goal tools are unavailable, report explicit `BLOCKED:` / degraded mode,
72
+ **propose a concrete, ready-to-paste `/goal <completion condition>`** or
73
+ `claude -p "/goal <completion condition>"` for the user, and keep driving the
74
+ local evidence ledger meanwhile. LitClaude must not auto-type or send `/goal`
75
+ text or claim native activation without observed evidence.
69
76
  - Forward-compat only: if a future Claude Code build exposes model-facing goal tools, prefer
70
- them call `get_goal`, call `create_goal` only when no matching active goal exists, and call
71
- `update_goal` only after every success criterion has evidence or the work is genuinely blocked.
72
- - While model-facing goal tools are not exposed (the case today), the local litgoal ledger is the
73
- durable record; surface the `/goal` proposal for long-running goals and don't spam fallback status.
77
+ them according to the no-clobber rule above.
78
+ - While model-facing goal tools are not exposed, the local litgoal ledger is the
79
+ durable record; surface the degraded-mode note once for long-running goals and
80
+ don't spam fallback status.
74
81
 
75
82
  Dynamic workflow orchestration is the right tool for broad, risky, parallel, or
76
- long-running work: briefly **propose a Dynamic workflow and call `Workflow`
77
- once the user opts in** (or when the session already permits orchestration)
78
- instead of merely mentioning it. The `Workflow` tool can fan out many subagents
79
- and spend a large token budget, so it needs explicit user opt-in — this opt-in
80
- gate, not a host limitation, is why a Dynamic workflow only starts after you
81
- offer it. Dynamic worktree isolation is mandatory for risky edit lanes: call
82
- `EnterWorktree` when exposed. If only the CLI surface is available, use or
83
- recommend `claude --worktree <short-name> --tmux`.
83
+ long-running work: prefer current `ultracode` or explicit “run a workflow” /
84
+ “use a workflow” wording, respect `CLAUDE_CODE_DISABLE_WORKFLOWS=1`, then briefly
85
+ **propose a Dynamic workflow and call `Workflow` once the user opts in** (or when
86
+ the session already permits orchestration) instead of merely mentioning it. The
87
+ `Workflow` tool can fan out many subagents and spend a large token budget, so it
88
+ needs explicit user opt-in. Native agent teams are setup-gated by
89
+ `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1`; if enabled, ask Claude to spawn
90
+ approved teammates with roles, acceptance criteria, wait, and synthesis; if not,
91
+ fall back to subagents/Dynamic workflow. Optional display setup is
92
+ `claude --teammate-mode auto` or `"teammateMode": "auto"`. Dynamic worktree
93
+ isolation is mandatory for risky edit lanes: call `EnterWorktree` when exposed.
94
+ If only the CLI surface is available, use or recommend `claude --worktree
95
+ <short-name> --tmux`.
84
96
 
85
97
  ## Subagent Assignment Contract
86
98
 
@@ -135,20 +135,29 @@ exploration found no conflicts; log the skip explicitly.
135
135
 
136
136
  ## Native Goal + Dynamic Workflow
137
137
 
138
- Include native goal handling. Claude Code's `/goal` (v2.1.139+) is a **user-typed slash command**,
139
- not a model-facing tool, and a hook/skill **cannot invoke it**:
140
-
141
- - Include an exact, ready-to-paste `/goal <completion condition>` line in the plan for the user to
142
- run — this is the real way to bind the native goal — plus a quiet local ledger for tracking.
143
- - Forward-compat only: if a future Claude Code build exposes model-facing goal tools, call
144
- `get_goal`, create with `create_goal` only when no matching active goal exists, and delay
145
- `update_goal` until verified completion or a real blocker. These goal tools are not exposed today.
138
+ Include native goal handling as an honest binding attempt. Claude Code's
139
+ `/goal` (v2.1.139+) is the native user surface, but the observed hook/skill
140
+ surface cannot run another slash command and model-facing goal tools may be
141
+ unavailable:
142
+
143
+ - If goal tools are exposed, call `get_goal`, create with `create_goal` only
144
+ when no matching active goal exists, avoid clobbering a different active goal
145
+ without explicit replacement, and delay `update_goal` until verified
146
+ completion or a real blocker.
147
+ - If goal tools are unavailable, include explicit `BLOCKED:` / degraded-mode
148
+ wording plus an exact, ready-to-paste `/goal <completion condition>` or
149
+ `claude -p "/goal <completion condition>"` line for the user, plus a quiet
150
+ local ledger for tracking.
146
151
  - Do not auto-type or send `/goal` text from a skill, and never claim native activation without evidence.
147
152
 
148
153
  For broad, risky, parallel, or long-running implementation, include Dynamic workflow
149
154
  and Dynamic worktree instructions:
150
155
 
156
+ - prefer current `ultracode` or explicit “run a workflow” / “use a workflow” wording
157
+ - report `CLAUDE_CODE_DISABLE_WORKFLOWS=1` as a setup gate when present
151
158
  - call `Workflow` when Claude Code exposes it
159
+ - for native teams, require `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1`, user-approved roles,
160
+ acceptance criteria, wait, and synthesis; otherwise fall back to subagents/workflows
152
161
  - call `EnterWorktree` for isolated model-facing edit lanes when available
153
162
  - otherwise recommend `claude --worktree <short-name> --tmux` for explicit
154
163
  operator-managed isolation
@@ -56,18 +56,24 @@ Represent every litgoal run as:
56
56
 
57
57
  ### Binding the native Claude Code goal
58
58
 
59
- Claude Code's `/goal` (v2.1.139+) is a **user-typed slash command** that sets an autonomous
60
- completion condition; it is **not a model-facing tool**, and a hook or skill **cannot invoke
61
- it**. So when this skill activates, derive the objective into a crisp completion condition and
62
- **offer the user a ready-to-paste `/goal <completion condition>`** (e.g. ``/goal all litgoal
63
- criteria pass and `litclaude litgoal status` shows complete``). Then keep the durable record in
64
- the local litgoal ledger. Never auto-type `/goal`, never claim slash-command activation without
65
- evidence, and never mark a goal complete until the local litgoal criteria have passed.
66
-
67
- Forward-compat only: if a future Claude Code build exposes model-facing goal tools, inspect
68
- `get_goal` before creating a new active goal, use `create_goal` for the objective, and
69
- `update_goal` only on verified completion. These are not exposed today — the `/goal` proposal is
70
- the actual mechanism.
59
+ Claude Code's `/goal` (v2.1.139+) is the native user surface, but the observed
60
+ hook/skill surface cannot run another slash command and model-facing goal tools
61
+ may be unavailable. So when this skill activates, attempt native binding only
62
+ through supported tools: inspect `get_goal`, use `create_goal` only when no
63
+ matching active goal exists, avoid clobbering a different active goal without
64
+ explicit replacement, and use `update_goal` only on verified completion or a
65
+ real blocker. If goal tools are unavailable, report explicit `BLOCKED:` /
66
+ degraded mode, derive the objective into a crisp completion condition, and
67
+ **offer the user a ready-to-paste `/goal <completion condition>`** or
68
+ `claude -p "/goal <completion condition>"` (e.g. ``/goal all litgoal criteria
69
+ pass and `litclaude litgoal status` shows complete``). Then keep the durable
70
+ record in the local litgoal ledger. Never auto-type `/goal`, never claim
71
+ slash-command activation without evidence, and never mark a goal complete until
72
+ the local litgoal criteria have passed.
73
+
74
+ Forward-compat rule: if a future Claude Code build exposes model-facing goal
75
+ tools, use them according to the no-clobber sequence above. Otherwise, the
76
+ degraded-mode `/goal` proposal plus durable ledger is the honest mechanism.
71
77
 
72
78
  ### Autoloop — a plugin-controlled `/goal`-equivalent (no `/goal` typing)
73
79
 
@@ -57,26 +57,35 @@ ledger entry. The tier ratchets up only — never downgrade.
57
57
 
58
58
  ## Native Goal + Dynamic Workflow
59
59
 
60
- Before the first checkbox, bind the native goal. Claude Code's `/goal` (v2.1.139+) is a
61
- **user-typed slash command**, not a model-facing tool, and a hook/skill **cannot invoke it**:
62
-
63
- - For a long plan, offer the user one ready-to-paste `/goal <plan completion condition>` line —
64
- this is the real way to bind the native session goal — and keep the Boulder/ledger discipline.
65
- - Forward-compat only: if a future Claude Code build exposes model-facing goal tools, call
66
- `get_goal` if exposed, `create_goal` with the plan objective only when no matching active goal
67
- exists, and `update_goal` only after all top-level checkboxes and final gates are complete (or
68
- when the plan is genuinely blocked). These are not exposed today.
60
+ Before the first checkbox, attempt native goal binding honestly. Claude Code's
61
+ `/goal` (v2.1.139+) is the native user surface, but the observed hook/skill
62
+ surface cannot run another slash command and model-facing goal tools may be
63
+ unavailable:
64
+
65
+ - If goal tools are exposed, call `get_goal` if exposed, `create_goal` with the
66
+ plan objective only when no matching active goal exists, avoid clobbering a
67
+ different active goal without explicit replacement, and `update_goal` only
68
+ after all top-level checkboxes and final gates are complete (or when the plan
69
+ is genuinely blocked).
70
+ - If goal tools are unavailable, report explicit `BLOCKED:` / degraded mode and
71
+ offer the user one ready-to-paste `/goal <plan completion condition>` line or
72
+ `claude -p "/goal <plan completion condition>"`, then keep the Boulder/ledger
73
+ discipline.
69
74
  - Do not auto-type or send `/goal` text from a skill; if the user invokes `/goal`, respect it.
70
75
 
71
76
  If model-facing goal tools are absent (the case today), continue with Boulder/ledger discipline.
72
77
  If goal tools are not exposed, do not print repeated fallback status; just keep
73
78
  the plan ledger accurate and continue with verified evidence.
74
79
 
75
- For broad, risky, or parallel checkbox waves, use Dynamic workflow orchestration
76
- and call `Workflow` when exposed. Use Dynamic worktree isolation with
77
- `EnterWorktree` for isolated model-facing edit lanes when available. When
78
- only the CLI path is available, use or recommend
79
- `claude --worktree <short-name> --tmux`.
80
+ For broad, risky, or parallel checkbox waves, prefer current `ultracode` or
81
+ explicit “run a workflow” / “use a workflow” wording, respect
82
+ `CLAUDE_CODE_DISABLE_WORKFLOWS=1`, use Dynamic workflow orchestration, and call `Workflow`
83
+ when exposed. Native agent teams require
84
+ `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1`; if enabled, ask for approved teammate
85
+ roles, boundaries, acceptance criteria, wait, and synthesis, otherwise fall back
86
+ to subagents/workflows. Use Dynamic worktree isolation with `EnterWorktree` for
87
+ isolated model-facing edit lanes when available. When only the CLI path is
88
+ available, use or recommend `claude --worktree <short-name> --tmux`.
80
89
 
81
90
  ## Subagent Assignment Contract
82
91