Wayfinder map — the conversation works (v1) #41

Open
opened 2026-07-30 13:15:03 +00:00 by aiko · 3 comments
Owner

Destination

The conversation works. A real voice conversation — you speak, she answers in
her own voice, Live2D renders, the log records it — held on all three surfaces:
the Windows desktop shell, the OnePlus Pad, and an Android phone. v1 ends there.
v2 is whatever the days after it surface.

Notes

Domain. Denpa is single-user: one operator, one server, many devices. The
Receiver (denpa-client) is a Tauri app; the go-between (denpa) is a Hermes
gateway plugin; hermes-agent is NousResearch upstream and read-only.
ADR-0011 (denpa/docs/adr/0011-devices-pair-to-the-go-between.md) is the
decision that reshaped this effort — devices enrol with the go-between, not with
Hermes — and every ticket here sits downstream of it. ADR-0002
(hardware-goes-through-rust) is the other standing rule.

v1 is you, on your own hardware. Nobody else installs it. That is what puts
packaging, install docs and public distribution out of scope below.

Skills every session should consult: /grilling and /domain-modeling by
default; /prototype for the shape questions; /research for anything outside
this working directory; /codebase-design where a ticket decides a module seam.

Standing preferences. Cite file:line or say "unverified". Reviews must RUN
the code, not read it. Paste the real test tail, never paraphrase it. Never
merge, never push — report the branch. .denpa-work/ is always safe to write;
a repo with a wave in flight is not.

Execution already decided, deliberately not ticketed here. The enrolment
chain — ollvt-hermes-bridge#25#26denpa#40, then closing
ollvt-hermes-bridge#23 by deletion — is filed, sequenced and unblocked by
ADR-0011. It is build work, not fog. This map does not restate it.

Decisions so far

Not yet specified

  • What failure behaviour v1 actually needs, beyond typing. Resolved in part:
    the conversation was attempted on 2026-07-30 and the answer was the compose
    surface, now #53. What else must be legible in the
    moment — as opposed to the full taxonomy in #15 — still waits on a proof run
    that gets further than the first mic press.
  • What foreground service the microphone actually needs, on Android 17. With the
    overlay gone and #36 deferred to v2, nothing competes for the process — the mic
    is the only foreground service v1 needs. But the phone runs SDK 37, newer than the
    sources #44 could reach, and every release since 14 has tightened these rules.
  • Whether her voice is good enough. TTS quality was deferred as the human's
    call and never revisited. "The conversation works" may or may not include it;
    answerable only by listening, once the conversation runs.
  • What the go-between still drops. ollvt-hermes-bridge#22 closed the frame
    translation table on a branch. Whether anything the v1 conversation needs is
    still unrouted has not been checked against the merged tree.

Out of scope

  • denpa#30 — 記録 browse. Read-through to Hermes sessions. No wire exists
    and the per-day paging model is unsettled. Not needed to hold a conversation.
  • denpa#15 — failure screens. What is left of the taxonomy after four
    splits: 6b (auth, waits on ADR-0011 enrolment), 6c (no model, waits on #52),
    the reconnect toast (waits on #57), and the six-part card treatment. The fog
    entry anticipated that some of it would return, and on 2026-07-30 it did, four
    times — #53 the compose surface,
    #57 reconnect,
    #58 WAITING, and
    #59 the two fault screens v1 needs. All four are
    in v1; this remainder is not.
  • denpa#23 — the Android overlay pal. Ruled out by #47: a second way of being present, not a way of having a conversation, and its foreground service competes with the microphone rather than helping it. Disabled in place.
  • denpa#36 — screen capture into Rust. 画面共有 works on desktop and stays
    in v1; only the migration waits, travelling with Android capture.
  • denpa#37 — re-enrol / reset path. Consequence accepted: a wrong
    enrolment is recoverable only by editing state by hand.
  • The web build. A debugging harness, not a product surface. It loses audio
    by construction under ADR-0002 and no degraded-mode treatment is owed to it.
  • Packaging, install docs, release artifacts, distribution, licence and
    third-party audit.
    v1 ships to one operator on hardware they already own.
## Destination **The conversation works.** A real voice conversation — you speak, she answers in her own voice, Live2D renders, the log records it — held on all three surfaces: the Windows desktop shell, the OnePlus Pad, and an Android phone. v1 ends there. v2 is whatever the days after it surface. ## Notes **Domain.** Denpa is single-user: one operator, one server, many devices. The Receiver (`denpa-client`) is a Tauri app; the go-between (`denpa`) is a Hermes gateway plugin; `hermes-agent` is NousResearch upstream and **read-only**. `ADR-0011` (`denpa/docs/adr/0011-devices-pair-to-the-go-between.md`) is the decision that reshaped this effort — devices enrol with the go-between, not with Hermes — and every ticket here sits downstream of it. `ADR-0002` (`hardware-goes-through-rust`) is the other standing rule. **v1 is you, on your own hardware.** Nobody else installs it. That is what puts packaging, install docs and public distribution out of scope below. **Skills every session should consult:** `/grilling` and `/domain-modeling` by default; `/prototype` for the shape questions; `/research` for anything outside this working directory; `/codebase-design` where a ticket decides a module seam. **Standing preferences.** Cite `file:line` or say "unverified". Reviews must RUN the code, not read it. Paste the real test tail, never paraphrase it. Never merge, never push — report the branch. `.denpa-work/` is always safe to write; a repo with a wave in flight is not. **Execution already decided, deliberately not ticketed here.** The enrolment chain — `ollvt-hermes-bridge#25` → `#26` → `denpa#40`, then closing `ollvt-hermes-bridge#23` by deletion — is filed, sequenced and unblocked by ADR-0011. It is build work, not fog. This map does not restate it. ## Decisions so far <!-- one line per closed ticket --> - [What does one unified log look like at phone width?](https://git.aiko.works/aiko/denpa/issues/46) — no width-specific design; the row's 320px density is the point at every width. `#34` turned out mostly built already, and is rescoped to deleting the dead `ChatHistoryPanel` path plus two device checks. - [Get an Android phone attached with the APK installed on it](https://git.aiko.works/aiko/denpa/issues/48) — done; Pixel 7 Pro (Android 17) and OnePlus Pad (Android 16), both `arm64-v8a`. Surfaced [#49](https://git.aiko.works/aiko/denpa/issues/49) (onboarding is a fixed 292x600 card on device) and the NDK r28 prerequisite for `#35`. - [How does each of the three surfaces actually enrol?](https://git.aiko.works/aiko/denpa/issues/42) — the code is minted at the server's **CLI**, printed as text and as a terminal QR. Desktop types it; tablet and phone scan. The QR carries **origin and code**, so a scanned device is never asked for a `ws://` address. Hermes-relayed enrolment stays v2. - [Is 画面共有 part of v1, and does Android MediaProjection block it?](https://git.aiko.works/aiko/denpa/issues/45) — 画面共有 is **in v1** and already works on desktop; moving it into Rust (`#36`) is **v2** and travels with the Android capture path. Accepted cost: a known ADR-0002 violation stays in the tree, and no screen sharing on tablet or phone. - [What crosses the Rust/webview boundary for audio?](https://git.aiko.works/aiko/denpa/issues/43) — barge-in is supported and **togglable**, so the boundary carries two modes and a capability flag. Android takes Kotlin `AudioRecord` for its echo cancellation; the Windows AEC path is unknown and is now [#54](https://git.aiko.works/aiko/denpa/issues/54). - [Is the Android overlay pal part of v1?](https://git.aiko.works/aiko/denpa/issues/47) — **no, v2**; the overlay's foreground service does not help the microphone path, so it was a competing service rather than a shared asset. `#23` is disabled in place, not reverted. - [Does silero-via-ort run on Android, and does cpal hold up on Windows?](https://git.aiko.works/aiko/denpa/issues/44) — yes on arm64-v8a only, pinned to NDK r28; and `#35`'s "cpal on Android is unreliable" is **refuted** — the real Android question is echo cancellation, not reliability. ## Not yet specified - **What failure behaviour v1 actually needs, beyond typing.** Resolved in part: the conversation was attempted on 2026-07-30 and the answer was the compose surface, now [#53](https://git.aiko.works/aiko/denpa/issues/53). What else must be legible in the moment — as opposed to the full taxonomy in `#15` — still waits on a proof run that gets further than the first mic press. <!-- resolved 2026-07-30 by #42: the console path covers every surface, and the Hermes-relayed path is v2 (ollvt-hermes-bridge#25). --> - **What foreground service the microphone actually needs, on Android 17.** With the overlay gone and `#36` deferred to v2, nothing competes for the process — the mic is the only foreground service v1 needs. But the phone runs SDK 37, newer than the sources `#44` could reach, and every release since 14 has tightened these rules. - **Whether her voice is good enough.** TTS quality was deferred as the human's call and never revisited. "The conversation works" may or may not include it; answerable only by listening, once the conversation runs. - **What the go-between still drops.** `ollvt-hermes-bridge#22` closed the frame translation table on a branch. Whether anything the v1 conversation needs is still unrouted has not been checked against the merged tree. ## Out of scope - **`denpa#30` — 記録 browse.** Read-through to Hermes sessions. No wire exists and the per-day paging model is unsettled. Not needed to hold a conversation. - **`denpa#15` — failure screens.** What is left of the taxonomy after four splits: 6b (auth, waits on ADR-0011 enrolment), 6c (no model, waits on `#52`), the reconnect toast (waits on `#57`), and the six-part card treatment. The fog entry anticipated that some of it would return, and on 2026-07-30 it did, four times — [#53](https://git.aiko.works/aiko/denpa/issues/53) the compose surface, [#57](https://git.aiko.works/aiko/denpa/issues/57) reconnect, [#58](https://git.aiko.works/aiko/denpa/issues/58) WAITING, and [#59](https://git.aiko.works/aiko/denpa/issues/59) the two fault screens v1 needs. All four are **in v1**; this remainder is not. - **`denpa#23` — the Android overlay pal.** Ruled out by [#47](https://git.aiko.works/aiko/denpa/issues/47): a second way of being present, not a way of having a conversation, and its foreground service competes with the microphone rather than helping it. Disabled in place. - **`denpa#36` — screen capture into Rust.** 画面共有 works on desktop and stays in v1; only the migration waits, travelling with Android capture. - **`denpa#37` — re-enrol / reset path.** Consequence accepted: a wrong enrolment is recoverable only by editing state by hand. - **The web build.** A debugging harness, not a product surface. It loses audio by construction under ADR-0002 and no degraded-mode treatment is owed to it. - **Packaging, install docs, release artifacts, distribution, licence and third-party audit.** v1 ships to one operator on hardware they already own.
Author
Owner

The frontier is empty. ollvt-hermes-bridge#24 — the map's last open ticket — was decided on 2026-07-30: yes, an approval is answerable on any enrolled device.

Recorded as ADR-0012 in the go-between (949a559). Option 1 taken whole: ADR-0011's per-device token is the secret #24's blocking decision was waiting on, so an ask binds to the operator rather than to a socket — offered to every authenticated connection, first valid answer wins, dismissed on the rest. ADR-0001's "answering anywhere dismisses everywhere" stands unchanged; the wire changes to keep it. The reconnect orphan closes as a side effect, so the half-measure of re-offering on reconnect while keeping connection binding is dropped rather than shipped first.

#24 is now ready-for-agent and blocked on ollvt-hermes-bridge#26 — building it before enrolment lands would widen the LAN exposure to every screen instead of one.

Nothing on the map is waiting on a decision. What remains is build.

**The frontier is empty.** `ollvt-hermes-bridge#24` — the map's last open ticket — was decided on 2026-07-30: **yes, an approval is answerable on any enrolled device.** Recorded as **ADR-0012** in the go-between (`949a559`). Option 1 taken whole: ADR-0011's per-device token is the secret #24's blocking decision was waiting on, so an ask binds to the operator rather than to a socket — offered to every authenticated connection, first valid answer wins, dismissed on the rest. **ADR-0001's "answering anywhere dismisses everywhere" stands unchanged**; the wire changes to keep it. The reconnect orphan closes as a side effect, so the half-measure of re-offering on reconnect while keeping connection binding is dropped rather than shipped first. #24 is now `ready-for-agent` and blocked on `ollvt-hermes-bridge#26` — building it before enrolment lands would widen the LAN exposure to every screen instead of one. Nothing on the map is waiting on a decision. What remains is build.
Author
Owner

This was generated by AI during triage.

Three fog patches graduated and resolved, 2026-08-01. The frontier was empty and had been since 2026-07-30, so this session charted rather than worked: everything below came out of Not yet specified, not from an open ticket.

Recording it as a comment because the tracker wrapper can post and close but cannot edit an issue body. The map's Decisions so far and Not yet specified sections still read as they did; the lines to fold into them when someone next edits it are marked below.

For Decisions so far

  • What does the microphone need from Android 17 to keep capturing? — a microphone foreground service is needed only to survive the screen going off; without one, AudioRecord keeps returning buffers of zeros rather than failing. The on-screen key is already a legal start point because the activity is visible; a backgrounded global hotkey is not reachable as designed. Android 17's audio hardening covers playback, not capture. Build work filed as #82.
  • What does the go-between still drop, in the merged tree? — nine mismatches, none previously filed. The three that touch v1: denpa.turn-complete (ADR-0006's drain signal) is sent up and dropped in the adapter's unknown-frame branch; typing fires every turn and the client logs it as unknown; clarify is offered to nobody, so an ambiguous request suspends a turn that never returns. The 思考 row is fully built with no frame behind it in either repo.
  • Is her voice good enough? — yes, and the ear test confirms it. camila on the local Qwen3-TTS server; the composite is unchanged, with edge_tts still the backstop and _announce_fallback still the disclosure. The templates said mai for a week while the machine said camila; corrected in 36ff9e6. Surfaced #34 — the voice cannot be switched without editing a file and restarting, which is why the question sat so long.

To clear from Not yet specified

  • "What foreground service the microphone actually needs, on Android 17" — answered by #81.
  • "What the go-between still drops" — answered by denpatou#32.
  • "Whether her voice is good enough" — answered by denpatou#33.

Still fog

  • "What failure behaviour v1 actually needs, beyond typing" — unchanged. Still waits on a proof run that gets further than the first mic press. denpatou#32 sharpens it slightly: typing is the frame the client is currently inferring rather than reading, so whatever this becomes should start there.

New, and not fog

denpatou#32 produced nine findings that are defects rather than decisions. They have not been filed — nine tickets is a triage session of its own and the operator was mid-decision. The list lives on that issue.

> *This was generated by AI during triage.* **Three fog patches graduated and resolved, 2026-08-01.** The frontier was empty and had been since 2026-07-30, so this session charted rather than worked: everything below came out of **Not yet specified**, not from an open ticket. Recording it as a comment because the tracker wrapper can post and close but cannot edit an issue body. The map's **Decisions so far** and **Not yet specified** sections still read as they did; the lines to fold into them when someone next edits it are marked below. ## For Decisions so far - [What does the microphone need from Android 17 to keep capturing?](https://git.aiko.works/aiko/denpa/issues/81) — a `microphone` foreground service is needed **only** to survive the screen going off; without one, `AudioRecord` keeps returning buffers of zeros rather than failing. The on-screen key is already a legal start point because the activity is visible; a backgrounded global hotkey is not reachable as designed. Android 17's audio hardening covers playback, not capture. Build work filed as [#82](https://git.aiko.works/aiko/denpa/issues/82). - [What does the go-between still drop, in the merged tree?](https://git.aiko.works/aiko/denpatou/issues/32) — nine mismatches, none previously filed. The three that touch v1: `denpa.turn-complete` (ADR-0006's drain signal) is sent up and dropped in the adapter's unknown-frame branch; `typing` fires every turn and the client logs it as unknown; `clarify` is offered to nobody, so an ambiguous request suspends a turn that never returns. The 思考 row is fully built with no frame behind it in either repo. - [Is her voice good enough?](https://git.aiko.works/aiko/denpatou/issues/33) — yes, and the ear test confirms it. `camila` on the local Qwen3-TTS server; the composite is unchanged, with `edge_tts` still the backstop and `_announce_fallback` still the disclosure. The templates said `mai` for a week while the machine said `camila`; corrected in `36ff9e6`. Surfaced [#34](https://git.aiko.works/aiko/denpatou/issues/34) — the voice cannot be switched without editing a file and restarting, which is why the question sat so long. ## To clear from Not yet specified - *"What foreground service the microphone actually needs, on Android 17"* — answered by `#81`. - *"What the go-between still drops"* — answered by `denpatou#32`. - *"Whether her voice is good enough"* — answered by `denpatou#33`. ## Still fog - *"What failure behaviour v1 actually needs, beyond typing"* — unchanged. Still waits on a proof run that gets further than the first mic press. `denpatou#32` sharpens it slightly: `typing` is the frame the client is currently inferring rather than reading, so whatever this becomes should start there. ## New, and not fog `denpatou#32` produced nine findings that are defects rather than decisions. They have not been filed — nine tickets is a triage session of its own and the operator was mid-decision. The list lives on that issue.
Author
Owner

This was generated by AI during triage.

The last fog patch is cleared, 2026-08-01. "What failure behaviour v1 actually needs, beyond typing" waited on a proof run that got further than the first mic press. That run happened on 2026-07-31, and the operator's verdict on what was legible in the moment was:

"at that point, I could only see tool calls in the logs. that's it."

Which is not a treatment gap. It is that tool calls are the only thing in 受信記録 with a producer behind them — the 思考 row has no frame in either repo, and typing arrives on every turn and is logged as an unknown message. denpatou#32 found both by reading; the conversation is what made them matter.

Not yet specified is now empty.

Decisions taken

  • WAITING holds until she starts. The 2s auto-return exists to un-stick a typing debounce; a sent turn does not need un-sticking, and applying it there meant 割り込み came back live for a turn still in flight. denpa#58 asked for this call and did not get it; taken now. Filed as denpa#83 together with reading the typing frame, since they are the same state seen from two ends.
  • The dock's send keys stand down under a fault screen. A key that looks pressable while it cannot work is the defect #58 fixed for 割り込み; #59 left the same thing reachable on the dock. The toast stays for the pal at 0.7×, which has no fault screen. Filed as denpa#84. Deliberately not taken: making the press run the fault screen's own action — one key meaning two things by state is worse than a key plainly stood down.
  • 5a keeps reporting only what is proven. When both hops report reached and the turn still failed, the chain says both hops are up next to a headline saying it did not work. Considered marking the failure as past the last proven hop; rejected — the pair is honest, the headline is what she could not do and the hops are what is provable, and no ticket comes out of this.

Graduated into tickets

  • denpa#83 — she thinks for seconds and the dock says nothing true about it
  • denpa#84 — the dock's keys stay live under a fault screen
  • denpatou#35 — her reasoning has a row, a design and an ADR, and no frame

For Decisions so far

  • What failure behaviour v1 needs, beyond typing — answered by holding the conversation: the failure screens #53, #57, #58 and #59 covered the faults, and what was left was legibility during a turn that is working. Only tool calls have a producer; her reasoning and her thinking state do not. Three tickets, no new fog.

Where the map stands

Not yet specified is empty and the frontier is denpa#60 and denpa#51, both build rather than decision. Nothing on this map is waiting on a decision — again, and this time with the fog gone rather than merely unticketed.

> *This was generated by AI during triage.* **The last fog patch is cleared, 2026-08-01.** *"What failure behaviour v1 actually needs, beyond typing"* waited on a proof run that got further than the first mic press. That run happened on 2026-07-31, and the operator's verdict on what was legible in the moment was: > *"at that point, I could only see tool calls in the logs. that's it."* Which is not a treatment gap. It is that tool calls are the only thing in 受信記録 with a producer behind them — the 思考 row has no frame in either repo, and `typing` arrives on every turn and is logged as an unknown message. `denpatou#32` found both by reading; the conversation is what made them matter. **Not yet specified is now empty.** ## Decisions taken - **WAITING holds until she starts.** The 2s auto-return exists to un-stick a typing debounce; a sent turn does not need un-sticking, and applying it there meant 割り込み came back live for a turn still in flight. `denpa#58` asked for this call and did not get it; taken now. Filed as [denpa#83](https://git.aiko.works/aiko/denpa/issues/83) together with reading the `typing` frame, since they are the same state seen from two ends. - **The dock's send keys stand down under a fault screen.** A key that looks pressable while it cannot work is the defect `#58` fixed for 割り込み; `#59` left the same thing reachable on the dock. The toast stays for the pal at 0.7×, which has no fault screen. Filed as [denpa#84](https://git.aiko.works/aiko/denpa/issues/84). Deliberately not taken: making the press run the fault screen's own action — one key meaning two things by state is worse than a key plainly stood down. - **5a keeps reporting only what is proven.** When both hops report reached and the turn still failed, the chain says both hops are up next to a headline saying it did not work. Considered marking the failure as past the last proven hop; **rejected** — the pair is honest, the headline is what she could not do and the hops are what is provable, and no ticket comes out of this. ## Graduated into tickets - [denpa#83](https://git.aiko.works/aiko/denpa/issues/83) — she thinks for seconds and the dock says nothing true about it - [denpa#84](https://git.aiko.works/aiko/denpa/issues/84) — the dock's keys stay live under a fault screen - [denpatou#35](https://git.aiko.works/aiko/denpatou/issues/35) — her reasoning has a row, a design and an ADR, and no frame ## For Decisions so far - [What failure behaviour v1 needs, beyond typing](https://git.aiko.works/aiko/denpa/issues/41) — answered by holding the conversation: the failure screens `#53`, `#57`, `#58` and `#59` covered the faults, and what was left was legibility during a turn that is *working*. Only tool calls have a producer; her reasoning and her thinking state do not. Three tickets, no new fog. ## Where the map stands `Not yet specified` is empty and the frontier is `denpa#60` and `denpa#51`, both build rather than decision. Nothing on this map is waiting on a decision — again, and this time with the fog gone rather than merely unticketed.
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#41
No description provided.