Unlisted remix of stevekrouse/typesafe-typewriter, served at https://jevhero.val.run/. Follow the user's explicit design constraints:
index.ts: HTTP shell, config and guarded all-16 judgment route.questions.ts, typesafe.ts: original rubrics and Jev REST client.budget.ts: atomic project-scoped reserve/reconcile SQLite budget.rate-limit.ts: inherited burst limits.frontend/root.tsx: HTML, custom CSS, fixed viewport, compact layouts and immutable assets.frontend/components/App.tsx: game state, persistent input, sound, Settings and local usage.frontend/components/GameInput.tsx: shared normal/Hard-mode textarea, native input guard and IME handling.frontend/components/HeroMeter.tsx: simple colored bar and target window.frontend/components/OtherReadings.tsx: muted inactive results overlay.frontend/components/CameraPreview.tsx: front-facing video-only preview, zoom, shared CameraPanel view and track cleanup.frontend/lib/game.ts: deterministic progression, compatible targets, score and labeled local simulation.frontend/lib/useHeroJudge.ts: serial scheduler, stale-response guard, cache, actual usage and explicit retry.frontend/lib/display.ts, types.ts: original formatting and API types.tests/: focused rules checks, actual-model calibration observations and mobile layout harness.Keep code unlisted and HTTP access available by link. Maintain Source in Settings. Never expose TYPESAFE_API_KEY or log user text. No OpenAI/transcription API is needed. Keep live and simulated progress/costs separate. No polling or automatic retry loops.
Jev price checked 2026-09-16: $0.042/M input, free output. Ten measured probes averaged 873 tokens each with all 16 questions: roughly 136,364 updates/$5. Levels depend on editing updates per clear. Clearly label scenario assumptions; actual browser receipts are local samples. Do not spend money merely to approach a target dollar amount. The budget defaults to $2.
Before shipping, fetch the endpoint/module and check logs; use browser checks for material interaction/layout changes. Phone viewport tests do not establish physical iOS camera/dictation compatibility.
Analytics: preserve /api/events, analytics.ts, and frontend/lib/useLevelAnalytics.ts. Owner report is scripts/stats.ts; no public analytics UI/endpoint. Use ?analytics=test for browser QA to exclude test outcomes and historical development counters. Never equate budget calls with levels. Keep recovered local historical counts separate from newly tracked events, and distinguish starts/clears/skips/unfinished. Do not store player text in analytics. Preserve idempotent level IDs, revisions, outbox retry, terminal statuses, and request-start attribution across round changes. Keep all 16 Steve classifiers; fourteen currently drive targets. Classifier weights were explicitly assigned by Charlie. Model target compatibility and internal Elo remain provisional.