Skip to content

feat: hotato console — the /calls daily surface#43

Merged
quantumCF merged 1 commit into
mainfrom
console/daily-surface
Jul 23, 2026
Merged

feat: hotato console — the /calls daily surface#43
quantumCF merged 1 commit into
mainfrom
console/daily-surface

Conversation

@quantumCF

Copy link
Copy Markdown
Contributor

Wave A PR-2: the daily view over the score-on-arrival engine (#42).

  • hotato console --production-db DB: serve + the scoring worker in one process, landing on /calls. All serve flags unchanged; every existing view stays reachable.
  • /calls: the feed — every scored production session with SCORED / NOT_SCORABLE (reason in-row) / ERROR as first-class visible states; an unscorable call never reads as OK. Query-param filters (state, scorability, time window; malformed input = 400), keyset pagination (no OFFSET anywhere — asserted via SQL trace), and a trends strip: volume, state split, candidate-moment share, per-kind hop-latency p50/p95 with declared authorities.
  • /calls/<id>: per-dimension observations (never blended), ranked candidate moments with measured magnitudes and plain-English sentences, a timing waterfall keeping derived (derived:event_timestamps) and event-reported values in separate columns, scorer version + config hash, evidence-lane completeness, audio path as text (no new file-serving route).
  • Live without dependencies: ETag over the canonical model + If-None-Match 304 polling with an "updated Ns ago" indicator; the page is complete server-rendered HTML with JS off.
  • Read path: console.sqlite3 mode=ro + ATTACH production db mode=ro, query_only + metadata-only authorizer installed post-attach — writes, further attaches, and payload reads denied at the SQLite level; schema-version mismatch = 400 carrying the rebuild instruction.
  • 22 new tests; CHANGELOG; WORKSPACE.md documents the command; llms-full regenerated.

Independently verified by a fresh reviewer with its own fixture db and a live hotato console process: state rendering, keyset SQL + cursor walk, provenance rendering, 304 revalidation, loopback + 401s on every unauthenticated route, traversal probes 404, scope/diff clean (CHANGELOG purely additive this time). The verifier's own full-suite re-run was cut off at 87% (no failures logged); the builder's complete run was green except the two known machine-environmental failures — this CI run is the clean-environment confirmation.

Spec: hotato-growth/research/CONSOLE-WAVE-A-SPEC.md (R4–R8)

https://claude.ai/code/session_015njkxtoAKioqTPT2k14xFr

R5 /calls: browsable feed over the derived score sidecar, opened mode=ro
with the production evidence db ATTACHed mode=ro on one connection
(query_only + the bridge's metadata-only authorizer installed after the
attach, so writes, further ATTACHes, and payload_json reads are denied at
the SQLite level). Rows join score records with session metadata: evidence
-clock anchor beside the arrival stamp (each labeled with its clock),
evidence-derived duration, session state, score state, worst dimension +
the measured failure-reason sentence, per-call hop-latency p50/p95 with
its declared authorities, and evidence-lane completeness. SCORED /
NOT_SCORABLE (with reason) / ERROR are first-class rows (I2). Filters
(state, scorability, since/until) are query params; malformed input is a
400, never a silently dropped filter; pagination is keyset from page one
(last_event DESC, subject ASC; no OFFSET — asserted at the SQL-trace
level) (I3).

R8: a trends strip over the filtered window — volume, score-state split,
candidate-moment share (columnar: SCORED rows carrying a measured
failure-reason sentence), and per-kind hop-latency p50/p95 (nearest-rank;
kinds never pooled; authorities stated) (I5).

R6 /calls/<id>: per-dimension observations (never blended), ranked
candidate moments with measured magnitudes + plain-English timing
sentences, the timing waterfall keeping derived durations apart from
event-reported values, every hop row with its declared authority, scorer
version + config hash, the session's evidence lanes, drill-through to the
production evidence plane, and the local audio path exactly as the
evidence recorded it (serve has no audio-serving route; none invented).

R7: the feed's JSON mirror carries an ETag (sha256 of the canonical model
bytes) and answers a matching If-None-Match with a body-less 304; a small
inline script polls it every few seconds, shows 'updated Ns ago', and
re-renders only the feed region when the ETag changes. No external code;
the page is complete as served with JavaScript off.

R4: hotato console --production-db DB = serve + production db + the
score-on-arrival worker in one command, with the printed tokenised URL
landing on /calls; every serve flag keeps working and every view stays
reachable. Nav gains the Calls tab (Suite-health rename stays PR-3).

Unusable sidecar (schema mismatch) is a 400 carrying the rebuild
instruction; unconfigured console / absent sidecar are explicit
in-product states. Docs on WORKSPACE.md (llms-full regenerated);
CHANGELOG Unreleased entry; 22 tests in tests/test_serve_calls.py.
@github-actions

Copy link
Copy Markdown

hotato turn-taking eval

8 of 8 scenarios pass. 0 fail. No regression.

scenario expect yielded time to yield talk over result
01-hard-interruption yield yes 0.50s 0.50s pass
02-backchannel-mhm hold no - 1.57s pass
03-filler-start yield yes 0.65s 0.56s pass
04-correction yield yes 0.50s 0.50s pass
05-telephony-8khz yield yes 0.50s 0.50s pass
06-double-talk yield yes 1.05s 1.05s pass
07-echo-bleed hold no - 3.00s pass
08-rapid-turn-taking yield yes 0.50s 0.50s pass

Regressions

None.

Reproducible timing measured locally from call audio. Swap the bundled self-test step for your own captured recordings to gate on your agent. github.com/attenlabs/hotato

@quantumCF
quantumCF merged commit 9d3137f into main Jul 23, 2026
15 checks passed
@quantumCF
quantumCF deleted the console/daily-surface branch July 23, 2026 21:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant