Skip to content

feat(voice): add call-flow step traces to call records - #44

Merged
wavekat-eason merged 1 commit into
mainfrom
feat/voice-call-flow-steps
Jul 26, 2026
Merged

feat(voice): add call-flow step traces to call records#44
wavekat-eason merged 1 commit into
mainfrom
feat/voice-call-flow-steps

Conversation

@wavekat-eason

Copy link
Copy Markdown
Contributor

Middle of the three-repo train. wavekat-platform accepts and stores the field in wavekat/wavekat-platform#182; the daemon consumes it in wavekat/wavekat-voice#295.

Carries the step-by-step story of a flow run — which prompt played, what the caller pressed, where the call went — from the daemon up to the platform, where the call-detail page pins them on the recording waveform as clickable markers.

Two shape decisions, both about surviving version skew

  • Structural, not prose. The daemon renders an English sentence per step locally; shipping that instead of the parts would make these permanently untranslatable on a platform serving nine locales.
  • kind is a String, not an enum. Step kinds grow every time the flow engine gains a node type, and a consumer pinned to an older version of this crate must still deserialize a newer daemon's trace. Rejecting an unknown kind would fail the whole call record over one marker.

Additive per this repo's field-evolution policy: optional with a serde default, skipped on serialize when absent, so a human-answered call puts nothing on the wire.

⚠️ The release is the deliverable

Per CLAUDE.md: merging this without publishing leaves wavekat-voice#295 unable to build — its Cargo.toml already asks for 0.0.22, and CI there will report failed to select a version until the release exists. That's the guard rail, not a broken build.

Verification

cargo test 82 pass (3 new: trace round-trip pinning the per-step wire names, an unknown kind deserializing, and a human-answered call keeping flowSteps off the wire entirely). cargo clippy --all-targets -D warnings and cargo fmt --check clean.

🤖 Generated with Claude Code

https://claude.ai/code/session_01K9XwWFb2NB6pHaWzXBj3iH

Carries the step-by-step story of a flow run — which prompt played, what
the caller pressed, where the call went — from the daemon up to the
platform, where the call-detail page pins them on the recording waveform
as clickable markers.

Middle of the three-repo train: wavekat-platform already accepts and
stores the field.

Two shape decisions worth stating, both about surviving version skew:

- Structural, not prose. The daemon renders an English sentence per step
  locally; shipping that instead of the parts would make these
  permanently untranslatable on a platform serving nine locales.
- `kind` is a String, not an enum. Step kinds grow every time the flow
  engine gains a node type, and a consumer pinned to an older version of
  this crate must still deserialize a newer daemon's trace. Rejecting an
  unknown kind would fail the whole call record over one marker.

Additive per the crate's field-evolution policy: optional with a serde
default, skipped on serialize when absent, so a human-answered call puts
nothing on the wire.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K9XwWFb2NB6pHaWzXBj3iH
@wavekat-eason
wavekat-eason merged commit 90ed5ba into main Jul 26, 2026
1 check passed
@wavekat-eason
wavekat-eason deleted the feat/voice-call-flow-steps branch July 26, 2026 03:53
@github-actions github-actions Bot mentioned this pull request Jul 26, 2026
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