JevHero

Unlisted remix of stevekrouse/typesafe-typewriter, served at https://jevhero.val.run/. Follow the user's explicit design constraints:

  • Minimal mobile game. Literal labels only: Target, axis name, range. No slogans, jokes, explanatory copy, stage titles or console-like panels on the play screen.
  • No page scrolling, including short viewports with a phone keyboard. Use visualViewport height and compact layout rules. Extra classifications open over the game.
  • Keep the same textarea mounted between rounds and retain focus on Enter and submit. Normal editing is the default. The user requested optional Hard mode in Settings: when enabled, block deletion or replacement of committed text through Backspace, Delete, cut, undo and input events. In Hard mode, paste appends and uncommitted IME composition can still change. Preserve the same textarea across mode changes and rounds. Save the preference locally.
  • While the phone keyboard is open, use a single-line entry with inline submit and give the target meters the available space. Hide the secondary footer and Target caption; keep classifications accessible from Settings. Restore the footer when the keyboard closes.
  • All 16 original classifications run together. Fourteen classifiers are gameplay axes. Difficulty 1: warmth, urgency, conviction, formality, passive-aggressiveness, asks_question. Difficulty 2: asks_for_action, makes_promise, states_opinion, checkable_claim, names_specifics, expresses_emotion, starts_argument, gets_a_reply. Skip reads_ai_written and audience as targets; keep their readings. Never use stale results to score newer text.
  • Use weighted slots: 1 slot initially, 2 after three clears, 3 after five, 4 after eleven. Sum classifier difficulty exactly to the slot budget; a difficulty-3 axis would be solo at budget 3 and can pair at 4. Prefer compatible combinations. Current internal ratings are provisional, not empirically calibrated Elo.
  • Each run must get shuffled target sequences, not a fixed rotation that a demo reveals. Preserve seeded targets across refreshes. Keep the Remix on Val Town link prominent below the game when the keyboard is closed.
  • Award fewer words. Success sound defaults on; no music controls or backing track.
  • The user deferred further camera changes while deciding their screen-recording workflow. Keep the existing optional camera feature.
  • Optional front-camera preview in the bottom half for the user's own screen recorder, shrinking at keyboard heights. Include a saved 1×–3× digital zoom slider. No recording/export/download code and no microphone request.

Files

  • 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.

Operation

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.