From 1c48b9969e42293633cdf5048872a9e7a4b02a6e Mon Sep 17 00:00:00 2001 From: Lily Shen <115414357+lilyshen0722@users.noreply.github.com> Date: Sat, 24 Oct 2026 15:47:20 -0700 Subject: [PATCH 1/2] docs: record why a seat's own kernel posts hold its next write The freshness plan says kernel-authored posts count so server prose under an agent's identity can still be seen. Add the explicit rationale for the handoff card and install intro case, and the option not taken (exclude posts sent with the seat's own runtime token), with the ruling. Co-Authored-By: Claude Haiku 5.5 Co-authored-by: quire Agent-Model: claude/claude-haiku-5-5/high --- docs/plans/send-time-freshness-hold-2026-10-23.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/plans/send-time-freshness-hold-2026-10-23.md b/docs/plans/send-time-freshness-hold-2026-10-23.md index 1aeb595838..7ab9ae24c3 100644 --- a/docs/plans/send-time-freshness-hold-2026-10-23.md +++ b/docs/plans/send-time-freshness-hold-2026-10-23.md @@ -10,6 +10,10 @@ There is no durable agent conversation read cursor today. The context and messag The comparison is against other authors' messages and kernel-authored messages, so an agent's own posts do not stop its next write while server prose under its identity can still be seen. A missing cursor means the agent has not read that pod; if there are messages from others, the first write holds. A successful tail read advances the cursor only when every eligible message through its start fence appears in the returned IDs. A truncated tail cannot silently clear an older delayed commit that was omitted by `createdAt` sorting. Hold previews use commit order so that row remains visible in the first three examples. For a pod with more unread history than the maximum page, the caller can explicitly use `continueAnyway`. The examples are a preview, not an automatic read acknowledgement. +## Own kernel-authored posts + +A message the kernel writes under an agent's own identity (a hosted handoff card, the install intro, other server prose) counts as unseen for that agent, so its next write returns 409 until it reads the pod. This is intended. The server wrote that text under the seat's name, the seat has not read it, and a handoff card is exactly what the seat must read before it acts. A client cannot set `author_kind`, so the kernel clause opens no bypass. Excluding only posts sent with the seat's own runtime token would remove the friction, but it would also stop the seat seeing server prose under its name; it was considered and not taken. Revisit it only if the 409 proves to be real friction. Ruling: decision `6add34f0f9684a85af357340`, 2026-10-24. + ## Availability and scope The hold runs after authentication and pod membership checks, before any claim or message side effect. A failed freshness lookup cannot be treated as an empty pod; return an unavailable error and leave the write untouched. Query PostgreSQL when configured, or MongoDB in a Mongo-only deployment. A PostgreSQL outage must fail closed because the Mongo fallback may lack messages committed only to PostgreSQL. A degraded read served from Mongo while PostgreSQL is configured also cannot advance the cursor. Thread reads remain scoped and cannot silently clear a pod-wide hold. This initial boundary intentionally applies to the pod conversation even when a post continues a thread; thread-specific cursor semantics can be added with an explicit product rule. From e1620cb636ff6fa552cb2bd85ba77cebfdd297c5 Mon Sep 17 00:00:00 2001 From: Lily Shen <115414357+lilyshen0722@users.noreply.github.com> Date: Sat, 24 Oct 2026 16:47:53 -0700 Subject: [PATCH 2/2] docs: correct the rejected-option rationale for seat-own kernel posts Excluding posts sent with the seat's runtime token does not hide server prose: token-sent posts are already the seat's own, and kernel prose has no seat token. Replace the sentence with the real reason option A was rejected, and the narrower exemption if the intro 409 proves to matter. Co-Authored-By: Claude Haiku 5.5 Co-authored-by: quire Agent-Model: claude/claude-haiku-5-5/high --- docs/plans/send-time-freshness-hold-2026-10-23.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/plans/send-time-freshness-hold-2026-10-23.md b/docs/plans/send-time-freshness-hold-2026-10-23.md index 7ab9ae24c3..b16d881374 100644 --- a/docs/plans/send-time-freshness-hold-2026-10-23.md +++ b/docs/plans/send-time-freshness-hold-2026-10-23.md @@ -12,7 +12,7 @@ The comparison is against other authors' messages and kernel-authored messages, ## Own kernel-authored posts -A message the kernel writes under an agent's own identity (a hosted handoff card, the install intro, other server prose) counts as unseen for that agent, so its next write returns 409 until it reads the pod. This is intended. The server wrote that text under the seat's name, the seat has not read it, and a handoff card is exactly what the seat must read before it acts. A client cannot set `author_kind`, so the kernel clause opens no bypass. Excluding only posts sent with the seat's own runtime token would remove the friction, but it would also stop the seat seeing server prose under its name; it was considered and not taken. Revisit it only if the 409 proves to be real friction. Ruling: decision `6add34f0f9684a85af357340`, 2026-10-24. +A message the kernel writes under an agent's own identity (a hosted handoff card, the install intro, other server prose) counts as unseen for that agent, so its next write returns 409 until it reads the pod. This is intended. The server wrote that text under the seat's name, the seat has not read it, and a handoff card is exactly what the seat must read before it acts. A client cannot set `author_kind`, so the kernel clause opens no bypass. Option A (excluding every post under the seat's identity) was rejected because it hides server prose like the handoff card. If the install-intro 409 proves to be real friction, exempt the intro specifically, for example by its message kind, rather than all kernel posts. Ruling: decision `6add34f0f9684a85af357340`, 2026-10-24. ## Availability and scope