Skip to content

feat(voice): booking calls + schema negotiation - #48

Merged
wavekat-eason merged 2 commits into
mainfrom
feat/booking-calls
Aug 8, 2026
Merged

feat(voice): booking calls + schema negotiation#48
wavekat-eason merged 2 commits into
mainfrom
feat/booking-calls

Conversation

@wavekat-eason

Copy link
Copy Markdown
Contributor

Two additions the daemon needs before it can run a book step
(wavekat-platform docs/30 §4).

The booking pair. booking_slots and booking_book — "when is this
business free?" and "put the caller in at this time". Unlike everything
else in this file these are synchronous and in-call: nothing is queued,
batched or retried, because a person is on the line. The calendar
credential never reaches this crate; the platform holds the connection
and answers in times and outcomes, which is what makes booking two
platform calls rather than a Google client in every daemon.

Both routes speak snake_case, unlike the camelCase sync resources, so
these types carry no rename_all — with a test pinning it, since a
camelCased body is rejected mid-call and the flow can only render that
as "unavailable". status stays a string rather than an enum: failing
to deserialize an unknown status would drop a live call.

VoiceFlowsQuery::schema_versions. The caller states which document
versions its flow engine can run, and the platform withholds the rest
rather than serving something that fails to parse and leaves a line
unarmed. None is not "anything goes" — the platform reads a missing
value as version 1 only, because the parameter arrived alongside version
2. Explicitly renamed to the server's schema_versions: the struct is
camelCase, and a silently camelCased key is ignored by the server, which
reads exactly like an account with no flows in that version.

🤖 Generated with Claude Code

https://claude.ai/code/session_018stjkZJ4kxDViq1ENnVDmH

wavekat-eason and others added 2 commits July 30, 2026 22:42
Carries the call-delete tombstone. Calls are otherwise immutable
one-way pushes; this is the one exception, because a hard DELETE can't
sync under a push-the-row model — so a delete rides as an ordinary
upsert with deletedAt set, same as the account tombstone already does.

Two things a consumer needs to know, documented on the field: the
platform treats this tombstone as *sticky* (COALESCE, not
last-write-wins — a call has no updatedAt to resolve on), so re-syncing
with None can never undelete; and deleting also destroys the recording
bytes, the transcript, and any live share link, not just the flag.

VoiceCallsQuery gains includeDeleted so a device can pull tombstones
and reap its local copies.

Step 2 of the three-repo train — wavekat-platform accepts the field
already; wavekat-voice needs a release of this before it can build.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EEyoayhGVRqCCY9BWJTKDD
Two additions the daemon needs before it can run a `book` step
(wavekat-platform docs/30 §4).

**The booking pair.** `booking_slots` and `booking_book` — "when is this
business free?" and "put the caller in at this time". Unlike everything
else in this file these are synchronous and in-call: nothing is queued,
batched or retried, because a person is on the line. The calendar
credential never reaches this crate; the platform holds the connection
and answers in times and outcomes, which is what makes booking two
platform calls rather than a Google client in every daemon.

Both routes speak snake_case, unlike the camelCase sync resources, so
these types carry no `rename_all` — with a test pinning it, since a
camelCased body is rejected mid-call and the flow can only render that
as "unavailable". `status` stays a string rather than an enum: failing
to deserialize an unknown status would drop a live call.

**`VoiceFlowsQuery::schema_versions`.** The caller states which document
versions its flow engine can run, and the platform withholds the rest
rather than serving something that fails to parse and leaves a line
unarmed. `None` is not "anything goes" — the platform reads a missing
value as version 1 only, because the parameter arrived alongside version
2. Explicitly renamed to the server's `schema_versions`: the struct is
camelCase, and a silently camelCased key is ignored by the server, which
reads exactly like an account with no flows in that version.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018stjkZJ4kxDViq1ENnVDmH
@wavekat-eason
wavekat-eason merged commit 4acce42 into main Aug 8, 2026
1 check passed
@wavekat-eason
wavekat-eason deleted the feat/booking-calls branch August 8, 2026 08:01
@github-actions github-actions Bot mentioned this pull request Aug 8, 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