ad9c4c8 committed with TSC_EXIT=2 (I batched the commit with its own failing
verification). Two regressions, now fixed and tsc -b + eslint verified (TSC=0,
ESLINT=0):
- L1WalkTreeVariant.tsx: the ai_build JSX branch referenced isAiBuild/node/
nodeLoading/nodeError/advanceNode/isTerminalNode that were never declared (the
import + state Edits had silently failed). Add the import (useEffect/useCallback,
TreeNode) and the state/effect/advanceNode/isTerminalNode block.
- L1Dashboard.tsx: had reverted to the original (no dispatch). Re-add outcome
dispatch as minimal edits on the real page (matched/build->walker; suggest->
use-flow/build-new; out_of_scope->escalate-without-walk).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Tasks 14 (df7150f) and 15 (f483196) were committed with broken TypeScript (I
misread eslint EXIT=0 as 'tsc clean'). Corrections:
- L1Dashboard: revert the speculative rewrite (it imported a non-existent
StartWalkPanel and dropped the real PageMeta/greeting/inputs layout). Re-apply
outcome dispatch as a MINIMAL edit on the real page — handleStart branches on
outcome (matched/build -> walker; suggest -> use-flow/build-new; out_of_scope ->
escalate-without-walk), preserving the original structure.
- L1WalkTreeVariant: revert the rewrite (it imported a non-existent WalkModals and
changed the props contract, breaking L1WalkPage). Re-apply on the real component:
keep {session,onSessionUpdate,onDone} + ResolveModal/EscalateModal + header +
transcript sidebar; add an ai_build branch that walks nodes via /next-node (passing
node_text), a disclaimer banner, and terminal -> existing resolve/escalate modals.
flow/proposal keep the Phase-1 synthetic path.
Verified: tsc -b EXIT=0 + eslint EXIT=0 (whole-project typecheck). L1WalkPage
unchanged (already routes ai_build -> tree variant).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Frontend CI failed on @typescript-eslint/no-explicit-any in three L1
post-review fix sites. Replace `(err as any).response...` with the
codebase's established structural cast
`(err as { response?: { data?: { detail?: string } } })`, matching
TicketPickerModal / FolderEditModal / ProceduralEditorPage. The
AccountSettingsPage 402 handler gets the fuller seat-limit detail shape.
tsc clean, eslint clean.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Final review flagged silent failure on intake error. Adds a toast with
the backend detail message (or fallback) on catch.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Replaces the T20 stub. L1 dashboard renders greeting, "Describe the
problem" intake card (autofocus textarea, optional customer fields,
primary "Start walk" CTA), open-tickets queue (Phase 1: display-only),
and a "Resume in progress" widget listing the L1's active sessions
ordered by last_step_at DESC. Empty-state card shows on accounts with
no queue + no active sessions (first-run nudge to upload KB or auth flows).
Adds /api/l1.ts (full L1 API client surface) and /types/l1.ts.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
L1RouteGuard wraps the new routes and redirects users without
canUseL1Surface back to /. Page components are stubs in this task
(real UI in T21-T24): L1Dashboard, L1WalkPage, L1DraftsPage,
L1TicketsPage.
Routes: /l1, /l1/walk/:sessionId, /l1/drafts, /l1/tickets — all gated.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>