Skip to content

accelerate-v0.6.258

@kanat kanat tagged this 04 Nov 07:18
* [AI-2632] App chat opens episodes and writes their cards (WIP)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* [AI-2632] Test the app chat's episode cards

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* [AI-2632] Webhook-path test, card write count, docs for the app chat's cards

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* [AI-2632] A worker's session on an app chat's agent channel reads the person's episode cards

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* [AI-2632] Tests and docs for the app chat's sessions reading episode cards

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* AI-2632: Read an app chat's cards for the author of the message handed out

The person was counted from the channel's text and photo lines, but the router
hands out messages that are no line: a voice recording alone, or a reply in a
Stream thread, which is not in the channel's messages. Manager.HandOut now
records who wrote the message (event.Message.User.ID), carried to other nodes
through the Directory, and the worker's session reads that user's cards only
while every person's line and every source-less message in the window is
theirs. A hand-out naming nobody reads none. Fixes R1.2 and R1.4.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* AI-2632: A session holding a person's cards answers that person alone

Cards are read once, when the worker's session opens, so a later message by
another Stream user in the same agent channel went to a session whose context
held the first person's cards. The session now names whose cards it read
(Session.CardsFor), and routeArrivingMessage closes it for a message by
anybody else and hands that message out anew; the session opened for it reads
none of the first person's cards. A session that read none, as every session
of a config with episode_cards off, answers whoever writes, as on base
c9a61fc90 (control TestAnotherPersonsMessageIsAnsweredByTheWorkersSessionWithTheCardsOff,
passing on base). Fixes R1.1.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* AI-2632: Resume the device session once its first turn is in the channel

TestOnlyTheHandedOutSessionReadsAChatPersonsCards resumed Anya's conversation
before her persisted turn could be in its channel, so a session that wrongly
read chat cards found no author and the test passed by timing. It now waits,
with a deadline, for her turn in the channel first. Fixes R1.3.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* AI-2632: omni-channel guard, Stream user per app, counted chat cards, no second config read

R1.1: a message in an omni-channel opens no chat episode (omnichannel.IsOmniChannel).
R1.2: StreamUser(appPK, userID) keys a Stream user by <app pk>:<user id>, called with
origin.app; the AGENTS.md Open line becomes a Rule.
R1.3: a chat card written off a hook's request is counted (Server.ChatCardsRunning) and
summed in cmd/router's running, so a drain waits for it.
R1.4: ownerOf returns the config it read; chatEpisodeUnopened reads no config of its own.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* AI-2632: changelog: the app chat writes episode cards

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* AI-2632: a router drains a chat card in flight

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* AI-2632: Read a chat person's cards keyed by the session's Stream app

#1701 keys a Stream user by <app pk>:<user id>. chatContact keys by the session's app, the deployment's own id for a session pinned as zero, as the deployment's hook writes it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* AI-2632: Drop a dead error check in chatContact

R2.2: the err after the loop is c.window's, already handled.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* AI-2632: Link the chat person's row by its app-keyed address in the SMS-link test

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* AI-2632: Let a carded session finish its person's replies before it closes

R2.1: another person's message no longer closes the session holding Anya's cards at once. It retires: it takes no new message, closes once its running reply and the follow-ups handed to it are written (bounded by session.RetireWithin), and the session a worker opens on the channel for Bob waits for it to end instead of taking the conversation over. With episode_cards off no session is carded, so routing is as on base.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* AI-2632: Wait for a retiring session's close, not just its leaving the map

R2.1: Close takes a session off the map before its conversation is let go, so a session opened then was refused the conversation as open. The manager keeps the retired sessions until they are found ended.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* AI-2632: Document a carded session retiring for another person's message

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* AI-2632: forget a retired session once it is closed (R3.2)

api.retire closes it with Manager.CloseRetired, which drops it from m.retiring
after the synchronous Close, so an ended session is no longer held until the
next Create on a persistent conversation.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* AI-2632: read a chat person's cards only in a channel of the person and the agent (R1.7)

chatContact now also requires the channel's members, from the channel state it
already reads (no new Stream request), to be the person handed out and the
agent the session writes as (its agent id) alone. A team channel, a third
member, two members without the agent, the person alone, or members not listed
read no cards, as with episode_cards off. episode_cards doc tags say so;
openapi and the clients regenerated; omnichannel/AGENTS.md Rules and Open.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* AI-2632: R4.1 read a person's cards in a channel that lists her alone

The channel the customer's app makes holds the person alone; the agent the
session writes as is no member of it. Members may now be the person alone or
the person and the agent; any other member, none listed, or the agent alone
reads none. A channel named after the person (agent = person) with a second
member reads none either.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* AI-2632: R4.1 drop the member count checks the member loop already makes

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* AI-2632: R4.1 regenerate the spec and clients for the episode_cards doc

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Assets 2
Loading