cc-chat: a conversation with an agent, from a page #71
No reviewers
Labels
No labels
bug
documentation
duplicate
enhancement
good first issue
help wanted
invalid
question
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
iterative-works/claude-code-query!71
Loading…
Reference in a new issue
No description provided.
Delete branch "cc-chat"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes the
cc-chateffort's SDK half: the last local slice, 06-gladys-global-chat, plus thework slices 02–05 left on this branch.
The card (frozen)
Goal — I hold a working day's conversation with Gladys from the dashboard: ask her about work
in progress, act on what she answers, leave, and come back after a break knowing what she still
remembers — on
<cc-chat>, with both hand-rolled chat generations deleted.Fit test — "I ran a real working day's conversation with Gladys off the new page, including
coming back to it after a break." It closes only on Michal's read: nothing he knows about is
missing, nothing foreign is present, and does she still remember what we were talking about is
answered correctly.
Fit: passed. Michal, 2026-09-05, against the live system running this build.
What this branch ships
SessionApias Tapir descriptions a host mounts anywhere, withthe addresses written down once in
SessionEndpointso the host and the browser cannot drift.Reading, rendering, following, artifacts, sending, interrupting, starting.
cc-*vocabulary — semantic elements in light DOM, no styles of our own, andcc-chat.cssbeside the bundle as one example of dressing them. One producer, on the JVM.from what the tool injected, tool calls kept as the fields they were called with, subagent
sidechains dropped, a session's beginning marked where the page reached it.
about which rows may move, so the rule holds however the rendering changes.
LiveEntriesputs the running session's own stream into the shape thetranscript will hold, so one reader renders both accounts and a row has no second way of being
drawn. Measured on the running page: his own words 1192 ms → 3 ms, and a tool's output reaching
the page 140 ms before the file holds it.
TurnTroubleis the few endings a reader would act ondifferently; each is its own row and its own reason, said where the answer would have been.
channel that delivered it, as blocks on stdin rather than concatenated prose.
querymirrors the transcript it leaves behind, on the id the runreported. Gladys' chat is query-driven, so before this nothing she said was archived anywhere
but the vendor's tree, which prunes at thirty days.
Review
Eight reviewers over the 44-commit diff — style, testing, security, scala3, composition, zio,
architecture, api. 3 critical, 6 warnings, 12 suggestions. Every critical and every cheap
warning is fixed on the branch (
9d04365); the rest are parked with reasons.Report:
project-management/efforts/cc-chat/slices/06-gladys-global-chat/review-slice-2026-09-05.mdThe two that would have shipped:
QueryOptions.withInputsilently discarded what it carried, indirectandeffectful.It sets
prompttoo, so the query ran and dropped every context item and the channel with nosignal. Both runners now refuse it.
keepingNewestwas pinned by nothing — the fix for the scrolling fault Michal reported,documented at both call sites and asserted nowhere. Five jsdom tests now, proven fallible.
Also fixed: docs that no longer compiled against the reshaped
UserMessage;TurnTroubleand thestructured-input types reaching none of the three module facades; a background task's result
naming the wrong session for the archive; and the whole prompt going to the log at INFO.
Follow-ups (parked, not blocking)
LogEntryPayloadas anenum, and explicit cases at the five dispatch sites — one decisionfor it and
sealed trait Messagetogether, not a case-by-case drift.SessionEndpoint.artifactUrlFor— nothing reachable, but the file iscross-built so it needs an encoder that is not
java.net.URLEncoder.querycall, so two concurrent queries resumingone session can interleave writes into one mirror file.
SessionApi.historyandartifactwere reported unroutable; diagnosed at close and bothroute — the probe asked for an address the contract does not define. Said at source in
SessionEndpoint.path.needs to, but that is a guess and the first step is to measure which rows move.
Lessons
18 entries triaged with Michal before this PR. Promoted: one
proceduresskill(
server-readiness— a readiness check is sound only if it cannot pass against the previousbuild), two
CLAUDE.mdlines, seven fixed-at-source. Filed:procedures#697,procedures#698.Next
Michal's sequence: this PR, then release
0.6.0and moveproceduresoff the local snapshot ontoit, then the
proceduresPR.🤖 Generated with Claude Code
https://claude.ai/code/session_01XTrxcxBQiNjXh79dN8Sh5x
The mock CLI script `effectful` runs against still emitted `{"type":"user","content":"…"}` — content at the top level, no `message` wrapper, a shape nothing sends. `direct`'s mocks were replaced with the measured shape this week; this resource was missed, and it is what CI was failing on. Behind it, a second leftover from reshaping `UserMessage`: the test asserted `content.contains("Hello Claude")` on what is now a list of blocks. `contains` takes `Any`, so it compiled and could never be true. It reads the words out of the blocks now. `__.itest` passes locally, against the real CLI. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XTrxcxBQiNjXh79dN8Sh5x