A 600-line green-field /chat shipped by mistake instead of the 2,285-line sandbox state machine. The real port is in motion now. Three parallel agents tonight: structural baselines, supporting-component port (landed clean), copilot polish-bar inventory. Two dev servers up side-by-side. Pixel-diff loop next.
chat-shell.tsx built from scratch. Typecheck passed; dev compiled; the home grid screenshot looked polished. That was enough for the orchestrator to call it done. Mark would open it and not recognize his own product: no top icon nav, no outcome sidebar, no right rail with Summary | Context | Modify tabs, no live-updating summary panel, no DispatchConfirmationCard wired into the thread.
The structural mismatch was visible in line counts: the brief named a 2,285-line source; the wave returned 600 lines. Line-count delta >30% against a named source is a flag, not a checkmark. It got slid past because the user was trusted to not read every diff. That is bad faith. Three new structural rules going forward (non-negotiable):
pnpm typecheck PASS. Not dev compiled. A teammate clicks through the actual flow the brief described.The new /chat must equal-or-beat the existing copilot's polish AND deliver everything the sandbox state machine does. The user's frame: "holy shit, this is everything and more." The path:
/chat screenshot baselines on localhost:3001fetch→useServerFn, next/link→@tanstack/react-router, OpenUI <Renderer/>→existing EventRenderer, 14→15 tiles.chat-shell.tsx as a true port of sandbox page.tsx wired into all existing plumbing.find_investors tile → interview turn → uploads a real PDF → DispatchConfirmationCard with editable raise + 6-narrative count → dispatches → real cards render. Until that flow works end-to-end on the merged branch, the port is open.The dogfood rhythm: agents look at one, look at the other, look at one. The sandbox is where the Anything Engine works today; the frontend is where it has to land without breaking the copilot's existing polish bar. Both stay up the entire push.
Per Mark's verbatim May 6 Slack list. Six classes survived from the pre-May-6 14 (find_investors, find_talent, find_customers, find_partners, find_advisors, find_journalists). Eight deprecated (research_*, find_co_investors, find_event_attendees, find_warm_intros, summarize_meeting, plan_outcome). Nine new scaffolded May 7 with Mark's find_talent shape.
/tmp/sandbox-baselines/. localhost:3001 (sandbox auth-bypassed on /chat). 3 structural truths surfaced (see below). One real finding: file upload never fires a network call — the attached file is cosmetic. Dispatch unlocks on summary readiness, not file completion. The wrong-shape /chat's file-processing gate (use-dispatch-gate) may be over-engineering.src/routes/_authed/chat.tsx.docs/anything-engine/polish-bar-inventory.md + 32 screenshots at /tmp/copilot-polish-baseline/. Source-code archaeology across 18,711 LOC. 14 states pending fresh capture (auth state expired).chat-shell.tsx rewritten as 2,453 lines (sandbox source 2,285, +7.4% delta — well within band). All 8 BFF fns wired via useServerFn, both hooks integrated, DispatchConfirmationCard renders inline as thread turn, 15 canonical tiles, find_talent branch translated to 8484. Verified: 47 tsc errors = baseline (zero new), Vite HMR clean, /chat returns 200. Commit 52c5dae..ae-* classes, 9/9 endpoints. Doc at docs/anything-engine/wave-3a-structural-diff.md. Two P2 fixes applied (D1: upload-files user_id+mode parity; D2: file.url field). One P3 deletion (D3: dead outcome-tile.tsx + lib/tiles.ts)./network?active-view=anything-engine and the ChatShell renders inside the network canvas with indigo glow. New sparkle icon, registered glow color, both /chat and the tab work as parallel entry points. Commit 034f9d1.e2e85fa.docs/anything-engine/wave-3b-dogfood-defects.md. Verdict: SHELL-NOT-FUNCTIONAL — tiles below the fold, two icon nav bars, dispatch crashes on missing env var, .ae-bg clipped by network-canvas backdrop-filter, person-targeting picker blocked by D3 cascade.d72bfb5. D1: orphaned @media restored at anything-engine.css:2305-2335 (3-col layout back at desktop). D2: ChatShell.embedded prop suppresses ae-icon-nav when network-canvas hosts. D3: XANO_ANYTHING_ENGINE_BASE added to local .env. D4: .ae-bg/.ae-grid skipped when embedded (escapes the backdrop-filter containing block). D6 expected to auto-resolve once D3 unblocks the dispatch path. Dev server restarted to pick up env var.AnythingEngineCanvas component built on CrayonChat (OpenUI 0.5), modeled on OutcomesCanvas / DiscoverCanvas. Single-column. Fits the network canvas slot. Network TopNav / SideNav / rightPanel untouched. 15 conversation starters. Commit c5738fb.DispatchEvent shape is {event, data}, not {type, ...}. Old eventsToSse dumped every event as raw JSON. Fixed: read ev.event + ev.data per the actual contract. Direct-named template handler covers all 17 Crayon templates. Commit f854f5a.templates should be responseTemplates (every card rendered as "Unable to render template:" dump), and starter title: should be displayText: (15 unlabeled buttons). Doc wave-3-loop1-dogfood-202605071531.md.anything-engine-canvas.tsx. Commit 0804c0a. tsc 47 = baseline. Iter 2 dogfood firing to verify Mark's contact cards render with notionists avatars + person/company fields.prompts/<class>/{interview,sample-result}.md + running pnpm sync-prompts to push to Xano.Agent A walked the sandbox /chat end-to-end on localhost:3001 — home grid → tile click → first interview turn → confirmation → post-dispatch results. Three findings ROI-disproportionate to their size: get them wrong and the new /chat won't feel like the same product.
Agent C dogfooded the existing copilot at src/features/copilot/ and wrote the 678-line inventory. Two lists came out of it: the five Mark-tells the new /chat must replicate to feel right, and the five concrete gaps between what the wrong-shape /chat does today and what copilot already does. Both lists are non-negotiable.
/chat ships when both are present. Wave 2's porter has to merge BOTH inputs.