記録 browse — search, activity strip, honest per-day fetch #20

Closed
opened 2026-07-29 17:32:08 +00:00 by aiko · 1 comment
Owner

What to build

Cards 5c and 7b. The server is the source of truth and the header says so (中継局が保持 · 端末はのぞき窓).

  • Search with a match count and highlighted hits; a 中継 filter toggle.
  • Activity strip — bar height is how much you talked that day, faint stubs are silence, today glows. Tap a bar to jump. 5c's 7-day strip and 7b's full-month strip are the same component — build it once and parameterise the window. 7b is explicitly not a month grid, and carries three shortcuts matching how people actually remember: 今日, 最も多い日, はじまり.
  • Day dividers, older days dimmed, and an honest per-day fetch row ("7月28日を取得中" with a live meter) instead of an infinite spinner.

Design reference: docs/design/denpa-receiver/README.md (card ids 1a, 4a… index into Denpa Receiver.dc.html, openable in a browser).

Acceptance criteria

  • Search returns a count and highlights matches
  • One activity-strip component serves both the 7-day and full-month cases
  • Tapping a bar jumps to that day
  • Paging older days shows the named fetch row, never a bare spinner
  • No export affordance is added
  • Tests cover the strip's day bucketing and the jump target

Blocked by


Reality audit

Governing rule: build to reality, Hermes leads. Not doing something is acceptable if it does not break core functionality. Breaking the design is acceptable. Building UI that does nothing is not.

Audited against the actual wire surface:

  • Hermes (hermes-agent 0.19.0, verified running): /health, /v1/models, /v1/runs, /v1/runs/{id}, /v1/runs/{id}/events, /v1/runs/{id}/stop, /v1/runs/{id}/approval
  • Run events: message.delta, tool.started, tool.completed, run.completed, run.cancelled, run.failed/run.errored, reasoning.available, approval.request (carries a per-request choices array and sets run status waiting_for_approval; the go-between discards it today — see #19)
  • Go-between → client: full-text, audio, control, error, set-model-and-conf, config-switched, config-files, background-files, history-list, history-data, new-history-created, history-deleted, user-input-transcription, backend-synth-complete, force-new-message, tool_call_status, interrupt-signal, heartbeat-ack, group-update
  • Client → go-between: text-input, mic-audio-data, mic-audio-end, raw-audio-data, ai-speak-signal, interrupt-signal, fetch-history-list, fetch-and-set-history, create-new-history, delete-history, fetch-configs, switch-config, fetch-backgrounds, audio-play-start, request-init-config, heartbeat

Mostly real, one structural mismatch

fetch-history-list / history-list and fetch-and-set-history / history-data are real, so the log, search and highlighting all have data behind them.

The mismatch: history is addressed per conversation uid, not per day. The design''s day dividers, per-day fetch row and activity strip all assume a day-addressable server log. Bucket by timestamp client-side over fetched history instead, and only claim what has actually been fetched — an activity strip that implies a full month while holding one conversation is a lie in chart form.

If the fetched window is partial, the strip must show its own edge rather than fading the unknown into silence. Silence and not-yet-loaded look identical in a bar chart, and the design explicitly makes silence meaningful (faint 4px stubs).

The 7-day and full-month strips remain the same component, parameterised, as designed.

## What to build Cards 5c and 7b. **The server is the source of truth and the header says so** (中継局が保持 · 端末はのぞき窓). - **Search** with a match count and highlighted hits; a 中継 filter toggle. - **Activity strip** — bar height is how much you talked that day, faint stubs are silence, today glows. Tap a bar to jump. **5c's 7-day strip and 7b's full-month strip are the same component** — build it once and parameterise the window. 7b is explicitly **not a month grid**, and carries three shortcuts matching how people actually remember: 今日, 最も多い日, はじまり. - Day dividers, older days dimmed, and an **honest per-day fetch row** ("7月28日を取得中" with a live meter) instead of an infinite spinner. Design reference: `docs/design/denpa-receiver/README.md` (card ids `1a`, `4a`… index into `Denpa Receiver.dc.html`, openable in a browser). ## Acceptance criteria - [ ] Search returns a count and highlights matches - [ ] One activity-strip component serves both the 7-day and full-month cases - [ ] Tapping a bar jumps to that day - [ ] Paging older days shows the named fetch row, never a bare spinner - [ ] No export affordance is added - [ ] Tests cover the strip's day bucketing and the jump target ## Blocked by - #17 --- ## Reality audit Governing rule: **build to reality, Hermes leads. Not doing something is acceptable if it does not break core functionality. Breaking the design is acceptable. Building UI that does nothing is not.** Audited against the actual wire surface: - **Hermes** (`hermes-agent 0.19.0`, verified running): `/health`, `/v1/models`, `/v1/runs`, `/v1/runs/{id}`, `/v1/runs/{id}/events`, `/v1/runs/{id}/stop`, `/v1/runs/{id}/approval` - **Run events**: `message.delta`, `tool.started`, `tool.completed`, `run.completed`, `run.cancelled`, `run.failed`/`run.errored`, `reasoning.available`, `approval.request` (carries a per-request `choices` array and sets run status `waiting_for_approval`; the go-between discards it today — see #19) - **Go-between → client**: `full-text`, `audio`, `control`, `error`, `set-model-and-conf`, `config-switched`, `config-files`, `background-files`, `history-list`, `history-data`, `new-history-created`, `history-deleted`, `user-input-transcription`, `backend-synth-complete`, `force-new-message`, `tool_call_status`, `interrupt-signal`, `heartbeat-ack`, `group-update` - **Client → go-between**: `text-input`, `mic-audio-data`, `mic-audio-end`, `raw-audio-data`, `ai-speak-signal`, `interrupt-signal`, `fetch-history-list`, `fetch-and-set-history`, `create-new-history`, `delete-history`, `fetch-configs`, `switch-config`, `fetch-backgrounds`, `audio-play-start`, `request-init-config`, `heartbeat` ### Mostly real, one structural mismatch `fetch-history-list` / `history-list` and `fetch-and-set-history` / `history-data` are real, so the log, search and highlighting all have data behind them. **The mismatch: history is addressed per conversation uid, not per day.** The design''s day dividers, per-day fetch row and activity strip all assume a day-addressable server log. Bucket by timestamp client-side over fetched history instead, and **only claim what has actually been fetched** — an activity strip that implies a full month while holding one conversation is a lie in chart form. If the fetched window is partial, the strip must show its own edge rather than fading the unknown into silence. Silence and not-yet-loaded look identical in a bar chart, and the design explicitly makes silence meaningful (faint 4px stubs). The 7-day and full-month strips remain the same component, parameterised, as designed.
Author
Owner

Closing in favour of #30, rewritten against the ADRs.

This issue's premise changed with ADR-0001: Denpa is a Hermes gateway Platform adapter and the api_server HTTP surface is abandoned entirely. Patching the body would have left a trail of corrections on top of a stale audit block - the same pattern that got 承認 wrongly cut once already.

Decisions now live in docs/adr/ in the go-between repo (branch docs/hermes-platform-adrs). The replacement issue references them rather than restating them.

Closing in favour of #30, rewritten against the ADRs. This issue's premise changed with ADR-0001: Denpa is a Hermes gateway Platform adapter and the `api_server` HTTP surface is abandoned entirely. Patching the body would have left a trail of corrections on top of a stale audit block - the same pattern that got 承認 wrongly cut once already. Decisions now live in `docs/adr/` in the go-between repo (branch `docs/hermes-platform-adrs`). The replacement issue references them rather than restating them.
aiko closed this issue 2026-07-30 00:03:50 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
aiko/denpa#20
No description provided.