PR #343 Ship Readiness — May 12 2026 REVIEW READY

PR #343
Where it stands for merge

23 commits this session brought feat/anything-engine to a clean state: 0 typecheck errors, 0 lint warnings, 30/30 tests passing, build clean. Mark’s real bugs fixed, dead code removed, all gates green. This page tracks ship readiness vs what’s still gated on Mark or Robert decisions.

23
Session commits
0
Quality gate failures
100
Files cleaned
~23K
Lines deleted
Section 1

Quality gates — all green

typecheckpnpm exec tsc --noEmit exit 0 across all 907 source files
lintpnpm exec biome lint --error-on-warnings src/ reports zero warnings
tests — 30 of 30 vitest cases pass across 4 test files (1.13 s)
buildpnpm build succeeds in 1 m 7 s, all chunks emit
canvas dogfood — live screenshot verified clean post each chunk
chat-shell dogfood — full find_investors flow verified end-to-end (ContactCards render, "+ Outcome" works)
Repo state at HEAD ef2649c.

All gates passed at every commit through the session. The pnpm build output produces all expected chunks (largest: maplibre 1.5 MB, three.js 1.0 MB, audio 2.6 MB — same as baseline, no regression). 23 commits landed cleanly.

Section 2 — what shipped

What this PR delivers to Mark

2 cross-account user_id leak bugs fixed
chat-shell.tsx and upload-files-fn.ts both hardcoded Robert’s WorkOS id "15". Mark’s Zep memory writes + uploaded decks were attributing to Robert’s account. Now wired to useAuth().user.id. Per-user data isolation restored. (See user_id audit)
P0 BUG FIX
5 BFF wrappers now ship authenticated user_id
openui05DispatchFn, dispatchFn (legacy), interviewFn, findTalentInterviewFn, startOutcomeFn, uploadFilesFn. Backend may ignore the field today (Xano discards unknown body keys); Mark wires server-side at his pace.
SYSTEMIC FIX
coerceConversationTitle helper — left rail no longer cluttered with MCQ fragments
"$5M-$15M", "B2B SaaS", "Choose File" labels no longer become permanent conversation titles. Live-verified: new conversations now show "New outcome · Series A" prefix instead of raw fragments. 13 unit tests cover the helper. Backend update_conversation_title endpoint still needed from Mark for full fix.
VISIBLE UX FIX
~23,000 lines of dead code removed across 100 files
53 dead AE component files (15,981 lines). 4 lib/hook/constants files (613 lines). 28 components across 7 features (3,479 lines). 796 dead CSS lines from anything-engine.css. 15 dead non-component modules (2,419 lines). Reviewer trust: every line in the diff is meaningful. (See dead-code sweep)
CLEANUP
13 typecheck errors closed across the repo
8 patterns: TanStack Router search-reducer cast, useRef no-arg TS5+ migration, JSX namespace import, sonner ToastProps style prop, boolean coercions, Zod-inferred type swap, vestigial myEmails prop, Avatar size enum. Plus 2 test type bridges. (See typecheck cleanup)
TYPE DEBT
97 lint warnings closed
All in anything-engine.css. All !important declarations on overrides scoped to dead parent classes. Removing the parent classes dropped the warnings.
LINT DEBT
Section 3

What’s gated on Mark before merge

Frontend is shipped. Backend follow-ups are needed for full Mark dogfood readiness.

All these were already known going into this session — nothing new surfaced as a Mark blocker. The frontend now sends every field correctly; backend honors them at Mark’s pace.

ep 8411 / 8417 / 8420 / 8484 / 8506 — honor user_id field
Frontend now sends authenticated WorkOS user.id on every BFF that touches user state. Xano ignores unknown body keys today, so memory writes still don’t key per-user until Mark adds the field to the endpoint signatures + writes to user_id-keyed Zep collections.
MARK
8 outcome classes missing synthesize.md
find_acquisition, find_cofounder, find_collaborators, find_deal_flow, find_job, find_speakers, make_purchase, get_advice. Match the backend’s "9 classes stuck at clarify gate" finding from W13. Each needs Mark’s voice-rule prompt to ship cards.
MARK
Backend update_conversation_title endpoint
Frontend coerceConversationTitle helper is the mitigation. Real fix re-titles the row after classification + summary land — needs Mark’s endpoint.
MARK
PATH A opening move skip on canvas
ep 8506 prompt missing the deck-first opening move per prompts/find_investors/interview.md. $prompt_find_investors in Xano needs update to ask "Do you have a pitch deck?" first.
MARK
find_advisors / find_journalists return 0 results
FalkorDB graph data gap. No advisor or journalist nodes exist. Mark needs to backfill the dataset or add a gate that skips these classes for v0.
MARK
find_customers returns wrong entity type
Returns VC firms / accelerators instead of SaaS prospects. Vector search needs entity-type filter in the synth step.
MARK
Section 4

What’s gated on Robert decisions

Interview-gate auto-dispatch fix proposal
When interview returns ready=true, canvas auto-dispatches. Mark spec: render editable summary card → user reviews/edits → user confirms → THEN dispatch. Proposal at docs/anything-engine/wave-3-loop13-INTERVIEW-GATE-FIX-PROPOSAL-202605111200.md. ~106 net lines. Mirrors awaitingResultCountRef pattern. 3 design questions for Robert before implementation.
ROBERT
Duplicate "Outcomes" tabs in top nav
viewTitles["anything-engine"]: "Outcomes" AND viewTitles.outcomes: "Outcomes". Visible duplication in the tablist. Decision: rename one, delete the legacy outcomes tab, or keep both with disambiguating subtitles.
ROBERT
Section 5 — merge path

What it takes to ship

The PR is reviewable today.

Mark can open PR #343 and review the substance. The diff is now actually readable — ~23,000 lines deleted dwarfs the actual surface area changes (a few hundred lines of real fixes). Without the dead-code sweep, this would have been a 23K-line review on top of the actual changes.

Merge dependencies

Mark reviews + approves feat/anything-engine
No reviews submitted yet. Mark opens PR #343 (https://github.com/M-Pederson/orbiter-frontend/pull/343), reads the changes, approves or requests changes.
MARK
Resolve interview-gate auto-dispatch (Robert decision)
Either accept the proposal as-is, modify it, or defer. Defer-to-merge is fine — the current behavior works for the result-count picker case; only the editable-summary case is missing.
ROBERT
CI green — already there
Lint + build + tests + Netlify deploy preview all pass at HEAD ef2649c. No CI work remaining.
DONE
Section 6 — risk assessment

What could go wrong post-merge

Backend rejects the new user_id field on some endpoint
Risk: low. Verified Xano discards unknown body keys (per W13 XANO-PROBE). All 5 BFFs send user_id additively; existing fields preserved. If an endpoint hard-rejects, fix is a 1-line revert of the user_id addition on that BFF.
LOW
Dead-code deletion accidentally removes something Mark needs
Risk: low. Each of the 100 deleted files was verified via grep -F to have zero importers anywhere in src/. Cross-feature deletion (28 files) was verified by typecheck + lint + tests + canvas dogfood. If Mark imports something we deleted, error appears immediately on his side — restore from git history is one command.
LOW
CSS deletion breaks a visual we missed
Risk: medium-low. 796 dead CSS lines deleted across 4 commits. Each chunk verified by canvas screenshot dogfood. .ae-chat-surface and .ae-chat-shell parent classes had ZERO JSX usage so descendant rules were definitionally unreachable. /chat standalone route uses different selectors (.ae-msg-*, .ae-bg, .ae-grid) that all stayed intact.
MED-LOW
Behavior change from coerceConversationTitle
Risk: low. Helper is additive — only affects new conversations. Existing conversation titles unchanged. The "New outcome · " prefix is recognizable and doesn’t collide with any existing title pattern.
LOW