tlc-claude-code 2.0.1 β†’ 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/.claude/agents/builder.md +144 -0
  2. package/.claude/agents/planner.md +143 -0
  3. package/.claude/agents/reviewer.md +160 -0
  4. package/.claude/commands/tlc/build.md +4 -0
  5. package/.claude/commands/tlc/deploy.md +194 -2
  6. package/.claude/commands/tlc/e2e-verify.md +214 -0
  7. package/.claude/commands/tlc/guard.md +191 -0
  8. package/.claude/commands/tlc/help.md +32 -0
  9. package/.claude/commands/tlc/init.md +73 -37
  10. package/.claude/commands/tlc/llm.md +19 -4
  11. package/.claude/commands/tlc/preflight.md +134 -0
  12. package/.claude/commands/tlc/review-plan.md +363 -0
  13. package/.claude/commands/tlc/review.md +172 -57
  14. package/.claude/commands/tlc/watchci.md +159 -0
  15. package/.claude/hooks/tlc-block-tools.sh +41 -0
  16. package/.claude/hooks/tlc-capture-exchange.sh +50 -0
  17. package/.claude/hooks/tlc-post-build.sh +38 -0
  18. package/.claude/hooks/tlc-post-push.sh +22 -0
  19. package/.claude/hooks/tlc-prompt-guard.sh +69 -0
  20. package/.claude/hooks/tlc-session-init.sh +123 -0
  21. package/CLAUDE.md +13 -0
  22. package/bin/install.js +268 -2
  23. package/bin/postinstall.js +102 -24
  24. package/bin/setup-autoupdate.js +206 -0
  25. package/bin/setup-autoupdate.test.js +124 -0
  26. package/bin/tlc.js +0 -0
  27. package/dashboard-web/dist/assets/index-CdS5CHqu.css +1 -0
  28. package/dashboard-web/dist/assets/index-CwNPPVpg.js +483 -0
  29. package/dashboard-web/dist/assets/index-CwNPPVpg.js.map +1 -0
  30. package/dashboard-web/dist/index.html +2 -2
  31. package/docker-compose.dev.yml +18 -12
  32. package/package.json +4 -2
  33. package/scripts/project-docs.js +1 -1
  34. package/server/index.js +228 -2
  35. package/server/lib/capture-bridge.js +242 -0
  36. package/server/lib/capture-bridge.test.js +363 -0
  37. package/server/lib/capture-guard.js +140 -0
  38. package/server/lib/capture-guard.test.js +182 -0
  39. package/server/lib/command-runner.js +159 -0
  40. package/server/lib/command-runner.test.js +92 -0
  41. package/server/lib/cost-tracker.test.js +49 -12
  42. package/server/lib/deploy/runners/dependency-runner.js +106 -0
  43. package/server/lib/deploy/runners/dependency-runner.test.js +148 -0
  44. package/server/lib/deploy/runners/secrets-runner.js +174 -0
  45. package/server/lib/deploy/runners/secrets-runner.test.js +127 -0
  46. package/server/lib/deploy/security-gates.js +11 -24
  47. package/server/lib/deploy/security-gates.test.js +9 -2
  48. package/server/lib/deploy-engine.js +182 -0
  49. package/server/lib/deploy-engine.test.js +147 -0
  50. package/server/lib/docker-api.js +137 -0
  51. package/server/lib/docker-api.test.js +202 -0
  52. package/server/lib/docker-client.js +297 -0
  53. package/server/lib/docker-client.test.js +308 -0
  54. package/server/lib/input-sanitizer.js +86 -0
  55. package/server/lib/input-sanitizer.test.js +117 -0
  56. package/server/lib/launchd-agent.js +225 -0
  57. package/server/lib/launchd-agent.test.js +185 -0
  58. package/server/lib/memory-api.js +3 -1
  59. package/server/lib/memory-api.test.js +3 -5
  60. package/server/lib/memory-bridge-e2e.test.js +160 -0
  61. package/server/lib/memory-committer.js +18 -4
  62. package/server/lib/memory-committer.test.js +21 -0
  63. package/server/lib/memory-hooks-capture.test.js +69 -4
  64. package/server/lib/memory-hooks-integration.test.js +98 -0
  65. package/server/lib/memory-hooks.js +42 -4
  66. package/server/lib/memory-store-adapter.js +105 -0
  67. package/server/lib/memory-store-adapter.test.js +141 -0
  68. package/server/lib/memory-wiring-e2e.test.js +93 -0
  69. package/server/lib/nginx-config.js +114 -0
  70. package/server/lib/nginx-config.test.js +82 -0
  71. package/server/lib/ollama-health.js +91 -0
  72. package/server/lib/ollama-health.test.js +74 -0
  73. package/server/lib/orchestration/agent-dispatcher.js +114 -0
  74. package/server/lib/orchestration/agent-dispatcher.test.js +110 -0
  75. package/server/lib/orchestration/orchestrator.js +130 -0
  76. package/server/lib/orchestration/orchestrator.test.js +192 -0
  77. package/server/lib/orchestration/tmux-manager.js +101 -0
  78. package/server/lib/orchestration/tmux-manager.test.js +109 -0
  79. package/server/lib/orchestration/worktree-manager.js +132 -0
  80. package/server/lib/orchestration/worktree-manager.test.js +129 -0
  81. package/server/lib/port-guard.js +44 -0
  82. package/server/lib/port-guard.test.js +65 -0
  83. package/server/lib/project-scanner.js +37 -2
  84. package/server/lib/project-scanner.test.js +152 -0
  85. package/server/lib/remember-command.js +2 -0
  86. package/server/lib/remember-command.test.js +23 -0
  87. package/server/lib/review/plan-reviewer.js +260 -0
  88. package/server/lib/review/plan-reviewer.test.js +269 -0
  89. package/server/lib/review/review-schemas.js +173 -0
  90. package/server/lib/review/review-schemas.test.js +152 -0
  91. package/server/lib/security/crypto-utils.test.js +2 -2
  92. package/server/lib/semantic-recall.js +1 -1
  93. package/server/lib/semantic-recall.test.js +17 -0
  94. package/server/lib/ssh-client.js +184 -0
  95. package/server/lib/ssh-client.test.js +127 -0
  96. package/server/lib/vps-api.js +184 -0
  97. package/server/lib/vps-api.test.js +208 -0
  98. package/server/lib/vps-bootstrap.js +124 -0
  99. package/server/lib/vps-bootstrap.test.js +79 -0
  100. package/server/lib/vps-monitor.js +126 -0
  101. package/server/lib/vps-monitor.test.js +98 -0
  102. package/server/lib/workspace-api.js +182 -1
  103. package/server/lib/workspace-api.test.js +474 -0
  104. package/server/package-lock.json +737 -0
  105. package/server/package.json +3 -0
  106. package/server/setup.sh +271 -271
  107. package/dashboard-web/dist/assets/index-Uhc49PE-.css +0 -1
  108. package/dashboard-web/dist/assets/index-W36XHPC5.js +0 -431
  109. package/dashboard-web/dist/assets/index-W36XHPC5.js.map +0 -1
@@ -0,0 +1,134 @@
1
+ # /tlc:preflight - Completeness Check Before Done
2
+
3
+ Never declare a task complete without running this. Catches gaps, loose ends, and half-solutions before they ship.
4
+
5
+ ## Philosophy
6
+
7
+ **Assume nothing is complete.** Every task has edges you didn't think about. This skill forces you to actively look for what's missing rather than confirming what's present.
8
+
9
+ ## When This Runs
10
+
11
+ This is a **plugin** β€” it fires automatically via PostToolUse hook whenever Claude is about to declare work "done." You don't invoke it manually.
12
+
13
+ It also runs:
14
+ - After `/tlc:build` (via guard + preflight chain)
15
+ - After any multi-file change
16
+ - Before recommending a commit or push
17
+
18
+ ## Process
19
+
20
+ ### Step 1: Inventory What Was Changed
21
+
22
+ List every file that was created, modified, or deleted in this session. For each one:
23
+ - What was the intent?
24
+ - Was the change completed or left partial?
25
+
26
+ ### Step 2: Trace All References
27
+
28
+ For every file changed, check:
29
+ - **Is it registered/imported where needed?** (e.g., new module added to an index, new command added to a commands array, new route added to a router)
30
+ - **Does anything else reference it?** (e.g., config files, package.json, install scripts, documentation)
31
+ - **Are there parallel systems that need the same update?** (e.g., install.js AND postinstall.js, package.json `files` AND `bin`, CLAUDE.md AND help.md)
32
+
33
+ This is the #1 source of half-solutions: changing the thing but not updating everything that points to the thing.
34
+
35
+ ### Step 3: Check Consistency Across Layers
36
+
37
+ For each change, verify consistency across ALL layers:
38
+
39
+ | Layer | Check |
40
+ |-------|-------|
41
+ | **Source files** | Does the code do what was intended? |
42
+ | **Tests** | Do tests exist and pass? |
43
+ | **Config** | Are config files updated (package.json, .tlc.json, settings.json)? |
44
+ | **Distribution** | Will this ship to end users? (files array, install scripts, postinstall) |
45
+ | **Documentation** | Is the change reflected in docs, help text, command tables? |
46
+ | **Integration** | Do other systems that depend on this still work? |
47
+
48
+ ### Step 4: Ask the Hard Questions
49
+
50
+ Before declaring done, explicitly answer each:
51
+
52
+ 1. **"If someone installs this fresh right now, will it work?"**
53
+ - Not "does it work on my machine" β€” does it work from a clean install?
54
+
55
+ 2. **"What did I assume exists that might not?"**
56
+ - Files, directories, env vars, running services, permissions
57
+
58
+ 3. **"What's the blast radius?"**
59
+ - What else touches the same files/systems I changed?
60
+ - Did I update ALL of those touchpoints?
61
+
62
+ 4. **"Is there a parallel path I forgot?"**
63
+ - Two install scripts? Two config files? Multiple places the same list appears?
64
+
65
+ 5. **"What would a user try that I didn't test?"**
66
+ - Edge cases in usage, not just happy path
67
+
68
+ ### Step 5: Report
69
+
70
+ **If gaps found:**
71
+ ```
72
+ PREFLIGHT CHECK β€” GAPS FOUND
73
+
74
+ Changes made: 3 files created, 2 files modified
75
+
76
+ Gaps:
77
+ 1. Created new-feature.md but not added to COMMANDS array in install.js
78
+ 2. Modified settings.json but init.md template not updated to match
79
+ 3. No test file for new utility function
80
+
81
+ Fix these before declaring done.
82
+ ```
83
+
84
+ **If clean:**
85
+ ```
86
+ PREFLIGHT CHECK β€” CLEAR
87
+
88
+ Changes made: 3 files created, 2 files modified
89
+ All references updated: βœ…
90
+ Distribution verified: βœ…
91
+ Tests exist: βœ…
92
+ Config consistent: βœ…
93
+
94
+ Task is complete.
95
+ ```
96
+
97
+ ## Common Gap Patterns
98
+
99
+ These are the most frequent gaps this skill catches:
100
+
101
+ | Pattern | Example |
102
+ |---------|---------|
103
+ | **Registry miss** | New file created but not added to install array, export list, or index |
104
+ | **Parallel system miss** | Updated install.js but not postinstall.js |
105
+ | **Config drift** | Changed settings.json but init.md still generates the old version |
106
+ | **Distribution miss** | File exists in repo but won't ship (not in package.json files) |
107
+ | **Doc drift** | New command added but not in CLAUDE.md dispatch table or help.md |
108
+ | **Test miss** | New code without corresponding test |
109
+ | **Cross-reference miss** | Renamed something but didn't grep for all references |
110
+
111
+ ## Example
112
+
113
+ ```
114
+ PREFLIGHT CHECK β€” GAPS FOUND
115
+
116
+ Session changes:
117
+ + .claude/commands/tlc/watchci.md (new skill)
118
+ + .claude/commands/tlc/e2e-verify.md (new skill)
119
+ + .claude/commands/tlc/guard.md (new skill)
120
+ + .claude/hooks/tlc-post-push.sh (new hook)
121
+ + .claude/hooks/tlc-post-build.sh (new hook)
122
+ ~ .claude/settings.json (added PostToolUse hooks)
123
+ ~ CLAUDE.md (added dispatch entries)
124
+
125
+ Gaps:
126
+ ❌ watchci.md, e2e-verify.md, guard.md not in COMMANDS array (bin/install.js)
127
+ ❌ .claude/hooks/ not in package.json files array β€” won't ship
128
+ ❌ postinstall.js doesn't copy hooks β€” fresh install broken
129
+ ❌ init.md settings template doesn't include new hooks
130
+ ❌ help.md doesn't list new commands
131
+ ❌ bootstrap.md was already missing from COMMANDS array (pre-existing gap)
132
+
133
+ 6 gaps found. Fix before declaring done.
134
+ ```
@@ -0,0 +1,363 @@
1
+ # /tlc:review-plan - Review a TLC Phase Plan
2
+
3
+ Review a `.planning/phases/{N}-PLAN.md` file for structure, scope, architecture, and completeness. Uses Claude in-session plus Codex (if available) for consensus.
4
+
5
+ ## What This Does
6
+
7
+ 1. Auto-detects the target plan file (or uses the phase number you provide)
8
+ 2. **Runs Claude in-session analysis** against all quality dimensions
9
+ 3. **Invokes Codex** (if available in router state) for a second opinion
10
+ 4. Combines verdicts β€” both must APPROVE for overall APPROVED
11
+ 5. Generates a structured report with per-provider attribution
12
+
13
+ ## Usage
14
+
15
+ ```
16
+ /tlc:review-plan # Auto-detect latest PLAN.md
17
+ /tlc:review-plan 7 # Review .planning/phases/7-PLAN.md
18
+ /tlc:review-plan 12 # Review .planning/phases/12-PLAN.md
19
+ ```
20
+
21
+ ## Process
22
+
23
+ ### Step 1: Load Context
24
+
25
+ **Read router state first**, then load the plan file.
26
+
27
+ ```javascript
28
+ // 1. Read persistent router state (written by session-init hook)
29
+ const routerState = JSON.parse(fs.readFileSync('.tlc/.router-state.json', 'utf-8'));
30
+
31
+ // 2. Read config for capability mappings
32
+ const config = JSON.parse(fs.readFileSync('.tlc.json', 'utf-8'));
33
+ const reviewProviders = config.router?.capabilities?.['review-plan']?.providers
34
+ || config.router?.capabilities?.review?.providers
35
+ || ['claude'];
36
+
37
+ // 3. Filter to only AVAILABLE providers (from state file)
38
+ const availableReviewers = reviewProviders.filter(p =>
39
+ routerState.providers[p]?.available === true
40
+ );
41
+ ```
42
+
43
+ **The state file (`.tlc/.router-state.json`) is authoritative for availability.** Never run `which codex` yourself β€” read the state file. If the state file is missing or stale (>1 hour), probe manually and write a fresh one.
44
+
45
+ **Locate the plan file:**
46
+
47
+ ```bash
48
+ # If phase number provided (e.g., "7"):
49
+ PLAN_FILE=".planning/phases/7-PLAN.md"
50
+
51
+ # If no argument β€” find the highest-numbered PLAN.md:
52
+ ls .planning/phases/*-PLAN.md | sort -t- -k1 -n | tail -1
53
+ ```
54
+
55
+ Also optionally read for context (if they exist):
56
+ - `.planning/phases/{N}-DISCUSSION.md` β€” design decisions
57
+ - `PROJECT.md` β€” project name, tech stack
58
+ - `.planning/ROADMAP.md` β€” phase dependencies
59
+
60
+ ### Step 2: Claude In-Session Review
61
+
62
+ Analyze the plan across four dimensions. For each, produce a list of issues (empty = passing).
63
+
64
+ #### Dimension 1: Structure
65
+
66
+ Check every `### Task N:` block for:
67
+
68
+ | Field | Check | Fail Condition |
69
+ |-------|-------|----------------|
70
+ | `**Goal:**` | Present and non-empty | Missing or blank |
71
+ | `**Files:**` | At least one file listed | No files listed |
72
+ | `**Acceptance Criteria:**` | At least one `- [ ]` checkbox | Missing or empty section |
73
+ | `**Test Cases:**` | At least one bullet | Missing or empty section |
74
+
75
+ #### Dimension 2: Scope
76
+
77
+ | Check | Fail Condition |
78
+ |-------|----------------|
79
+ | Task title specificity | Title contains vague words: `system`, `entire`, `all`, `everything`, `complete`, `whole`, `full` |
80
+ | Vertical slice | Task mixes unrelated concerns (e.g., "Add auth AND refactor DB") |
81
+ | No files listed | Task has empty `**Files:**` section |
82
+
83
+ #### Dimension 3: Architecture
84
+
85
+ | Check | Fail Condition |
86
+ |-------|----------------|
87
+ | File line estimates | Any file has `estimated: NNN lines` where NNN > 1000 |
88
+ | Folder density | Any folder listed that already has > 15 files (check disk if accessible) |
89
+ | Module structure | Files dumped into flat `src/services/` or `src/controllers/` with > 5 items |
90
+
91
+ #### Dimension 4: Completeness
92
+
93
+ | Check | Fail Condition |
94
+ |-------|----------------|
95
+ | Prerequisites section | No `## Prerequisites` block in the plan |
96
+ | Dependencies section | No `## Dependencies` block (warn, not fail) |
97
+ | Phase ordering | Prerequisites reference phases that don't exist in ROADMAP (if readable) |
98
+
99
+ #### Dimension 5: TDD Readiness
100
+
101
+ Every task must have testable acceptance criteria:
102
+
103
+ | Check | Fail Condition |
104
+ |-------|----------------|
105
+ | Criteria are checkboxes | Criteria written as prose instead of `- [ ] ...` checkboxes |
106
+ | Criteria are specific | Criterion is too vague to write a test for (e.g., "works correctly") |
107
+ | Test cases listed | `**Test Cases:**` section is absent or has zero items |
108
+ | Test cases cover happy + sad paths | Only happy-path tests listed (warn) |
109
+
110
+ **Scoring:**
111
+ - 0 structure issues + 0 scope issues + 0 completeness issues + all tasks TDD-ready = **APPROVED**
112
+ - Any issues in structure, completeness, or TDD = **CHANGES_REQUESTED**
113
+ - Scope/architecture issues alone = **CHANGES_REQUESTED**
114
+
115
+ ### Step 3: Invoke Codex (if available)
116
+
117
+ **CRITICAL: This step runs automatically when Codex is available in router state.**
118
+
119
+ Check availability:
120
+ ```javascript
121
+ const codexAvailable = routerState.providers?.codex?.available === true
122
+ && availableReviewers.includes('codex');
123
+ ```
124
+
125
+ If Codex is available, invoke it with `exec` in read-only sandbox mode:
126
+
127
+ ```bash
128
+ # Write the plan-review JSON schema to a temp file
129
+ cat > /tmp/plan-review-schema.json << 'EOF'
130
+ {
131
+ "$schema": "http://json-schema.org/draft-07/schema#",
132
+ "type": "object",
133
+ "required": ["verdict", "structureIssues", "scopeIssues", "suggestions"],
134
+ "properties": {
135
+ "verdict": { "type": "string", "enum": ["APPROVED", "CHANGES_REQUESTED"] },
136
+ "structureIssues": { "type": "array", "items": { "type": "string" } },
137
+ "scopeIssues": { "type": "array", "items": { "type": "string" } },
138
+ "suggestions": { "type": "array", "items": { "type": "string" } }
139
+ }
140
+ }
141
+ EOF
142
+
143
+ # Invoke Codex with the plan content
144
+ codex exec -s read-only --output-schema /tmp/plan-review-schema.json \
145
+ "Review this TLC phase plan for quality. Check:
146
+ 1. Structure: every task has Goal, Files, Acceptance Criteria (checkboxes), and Test Cases.
147
+ 2. Scope: no vague titles, each task is a vertical slice with specific deliverables.
148
+ 3. Architecture: no files planned >1000 lines, no folders >15 files.
149
+ 4. Completeness: Prerequisites section present, dependencies are explicit.
150
+ 5. TDD: every acceptance criterion is a testable, specific checkbox; test cases cover happy and sad paths.
151
+
152
+ Respond with JSON matching the output schema.
153
+
154
+ PLAN CONTENT:
155
+ $(cat .planning/phases/${PHASE_NUMBER}-PLAN.md)"
156
+ ```
157
+
158
+ If `codex exec` is not available (older Codex without `exec` subcommand), fall back to:
159
+
160
+ ```bash
161
+ codex --print \
162
+ "Review this TLC phase plan. For each issue found, format as:
163
+ - [structure|scope|architecture|completeness|tdd] <description>
164
+ End your response with either: Verdict: APPROVED or Verdict: CHANGES_REQUESTED
165
+
166
+ $(cat .planning/phases/${PHASE_NUMBER}-PLAN.md)"
167
+ ```
168
+
169
+ Parse the fallback output using the `Verdict: APPROVED|CHANGES_REQUESTED` pattern.
170
+
171
+ **If Codex is unavailable:** Skip this step. Claude-only review proceeds. Note in the report: `Codex: unavailable (skipped)`.
172
+
173
+ ### Step 4: Combine Verdicts
174
+
175
+ ```
176
+ Overall verdict rules:
177
+ - ALL available providers approve β†’ APPROVED
178
+ - ANY provider requests changes β†’ CHANGES_REQUESTED
179
+ - Only 1 provider available β†’ that provider's verdict is final
180
+ ```
181
+
182
+ Combine issues from all providers. Tag each issue with its source: `[Claude]` or `[Codex]`.
183
+
184
+ ### Step 5: Generate Report
185
+
186
+ ```markdown
187
+ # Plan Review Report
188
+
189
+ **Plan:** .planning/phases/{N}-PLAN.md
190
+ **Phase:** {N}
191
+ **Tasks:** {count}
192
+ **Date:** {ISO timestamp}
193
+
194
+ ## Verdict: APPROVED | CHANGES_REQUESTED
195
+
196
+ ## Dimension Results
197
+
198
+ ### Structure
199
+ βœ… All tasks have Goal, Files, Acceptance Criteria, and Test Cases
200
+ β€” or β€”
201
+ ❌ 2 tasks missing acceptance criteria
202
+ β”œβ”€β”€ Task 3: "Add OAuth flow" β€” missing **Acceptance Criteria:** section
203
+ └── Task 5: "Write migration" β€” missing **Test Cases:** section
204
+
205
+ ### Scope
206
+ βœ… All task titles are specific and scoped
207
+ β€” or β€”
208
+ ⚠️ Task 2: "Complete user system" β€” title too vague (contains "complete", "system")
209
+
210
+ ### Architecture
211
+ βœ… No files planned over 1000 lines
212
+ βœ… No folders over 15 files
213
+
214
+ ### Completeness
215
+ βœ… Prerequisites section present
216
+ ⚠️ No ## Dependencies section (recommended)
217
+
218
+ ### TDD Readiness
219
+ βœ… All tasks have testable criteria as checkboxes
220
+ β€” or β€”
221
+ ❌ Task 4 criteria written as prose, not checkboxes
222
+
223
+ ## Provider Results
224
+
225
+ βœ… Claude: APPROVED
226
+ βœ… Codex: APPROVED (GPT-5.2)
227
+ β€” or β€”
228
+ ❌ Codex: unavailable (skipped)
229
+
230
+ ## Combined Issues
231
+
232
+ [Claude] Task 3 missing acceptance criteria
233
+ [Codex] Task 2 scope too broad β€” split into separate tasks
234
+
235
+ ## Action Required
236
+
237
+ 1. Add **Acceptance Criteria:** checkboxes to Task 3
238
+ 2. Narrow Task 2 title and split "auth" from "profile" concerns
239
+ 3. Add test cases covering auth failure paths in Task 1
240
+ ```
241
+
242
+ ## Example Output
243
+
244
+ ### Plan Passes Review
245
+
246
+ ```
247
+ /tlc:review-plan 7
248
+
249
+ Loading router state from .tlc/.router-state.json...
250
+ Plan review providers: claude, codex
251
+
252
+ Target plan: .planning/phases/7-PLAN.md (5 tasks)
253
+
254
+ ─────────────────────────────────────────
255
+ Claude in-session review...
256
+ ─────────────────────────────────────────
257
+
258
+ Structure: βœ… All 5 tasks complete
259
+ Scope: βœ… All titles specific
260
+ Architecture: βœ… No oversized files planned
261
+ Completeness: βœ… Prerequisites present
262
+ TDD: βœ… All criteria as checkboxes
263
+
264
+ Claude verdict: βœ… APPROVED
265
+
266
+ ─────────────────────────────────────────
267
+ Invoking Codex (GPT-5.2) for plan review...
268
+ ─────────────────────────────────────────
269
+
270
+ Codex verdict: βœ… APPROVED
271
+ - Clear task decomposition
272
+ - Good test coverage planning
273
+ - Prerequisites are explicit
274
+
275
+ Provider Results:
276
+ βœ… Claude: APPROVED
277
+ βœ… Codex: APPROVED
278
+
279
+ ─────────────────────────────────────────
280
+ βœ… APPROVED β€” Plan is ready for /tlc:build (2/2 agree)
281
+ ─────────────────────────────────────────
282
+ ```
283
+
284
+ ### Plan Needs Changes
285
+
286
+ ```
287
+ /tlc:review-plan 12
288
+
289
+ Loading router state from .tlc/.router-state.json...
290
+ Plan review providers: claude, codex
291
+
292
+ Target plan: .planning/phases/12-PLAN.md (4 tasks)
293
+
294
+ ─────────────────────────────────────────
295
+ Claude in-session review...
296
+ ─────────────────────────────────────────
297
+
298
+ Structure: ❌ 2 issues
299
+ β”œβ”€β”€ Task 2: missing **Acceptance Criteria:**
300
+ └── Task 4: missing **Test Cases:**
301
+ Scope: ⚠️ 1 issue
302
+ └── Task 1: "Complete full system" β€” title too vague
303
+ Architecture: βœ… No oversized files planned
304
+ Completeness: ❌ 1 issue
305
+ └── No ## Prerequisites section
306
+ TDD: ❌ 1 issue
307
+ └── Task 3: criteria written as prose, not checkboxes
308
+
309
+ Claude verdict: ❌ CHANGES_REQUESTED
310
+
311
+ ─────────────────────────────────────────
312
+ Invoking Codex (GPT-5.2) for plan review...
313
+ ─────────────────────────────────────────
314
+
315
+ Codex verdict: ❌ CHANGES_REQUESTED
316
+ - Task 2 has no way to verify completion
317
+ - Task 1 scope covers too many concerns
318
+ - Missing error-path test cases throughout
319
+
320
+ Provider Results:
321
+ ❌ Claude: CHANGES_REQUESTED
322
+ ❌ Codex: CHANGES_REQUESTED
323
+
324
+ Combined Issues:
325
+ [Claude] Task 2 missing acceptance criteria
326
+ [Claude] Task 4 missing test cases
327
+ [Claude] Task 1 title too vague ("complete", "system")
328
+ [Claude] No ## Prerequisites section
329
+ [Claude] Task 3 criteria are prose, not checkboxes
330
+ [Codex] Task 2 has no verifiable completion criteria
331
+ [Codex] Task 1 mixes auth, profile, and settings concerns
332
+ [Codex] Missing error/failure path test cases in Tasks 1–3
333
+
334
+ ─────────────────────────────────────────────────────
335
+ ❌ CHANGES_REQUESTED (0/2 approved)
336
+
337
+ Action required:
338
+ 1. Add **Acceptance Criteria:** checkboxes to Task 2
339
+ 2. Add **Test Cases:** to Task 4
340
+ 3. Rename Task 1 β€” split auth/profile/settings into separate tasks
341
+ 4. Add ## Prerequisites section listing prior phases
342
+ 5. Rewrite Task 3 criteria as - [ ] checkboxes
343
+ 6. Add sad-path test cases to Tasks 1–3 (Codex)
344
+ ─────────────────────────────────────────────────────
345
+ ```
346
+
347
+ ## Flags
348
+
349
+ | Flag | Description |
350
+ |------|-------------|
351
+ | `--no-external` | Skip Codex, use Claude only |
352
+ | `--codex-only` | Use only Codex (skip Claude in-session deep checks) |
353
+ | `--strict` | Treat warnings (vague titles, missing deps) as failures |
354
+
355
+ ## Integration
356
+
357
+ This review runs automatically:
358
+ - At the end of `/tlc:plan` (informational β€” does not block)
359
+ - Can be run manually before `/tlc:build` to validate a plan
360
+
361
+ ## ARGUMENTS
362
+
363
+ $ARGUMENTS