From 06cbd1a1501e7fbcb6d1ca9c7fc17477a9c4a51f Mon Sep 17 00:00:00 2001 From: Yeachan Heo Date: Fri, 14 Aug 2026 16:59:25 +0000 Subject: [PATCH 1/2] chore(guard): refresh discord/slack session-router digests after #4542 PR #4542 changed SessionRouter.#attach and #publishAttachment without refreshing the discord/slack semantic manifest digests, so the current-tree manifest check fails on dev after #4558's merge surfaced it (dev CI 31820749528 Telegram daemon generation guard). The telegram digests all match. Refreshed through the canonical --write-manifest generator; --fix-generations confirms no generation bump is required (digest attestations are exempt from the policy bump). Lore-id: 6e3a1c04 Constraint: digest-only refresh, no generation bump, no source change Confidence: high Scope-risk: narrow Reversibility: trivial Tested: bun test scripts/telegram-daemon-generation-guard.test.ts (75 pass); --validate-current-tree pass at merged dev head Not-tested: none --- scripts/telegram-daemon-generation-manifest.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/telegram-daemon-generation-manifest.json b/scripts/telegram-daemon-generation-manifest.json index 3a86fdf8c2..0debc997eb 100644 --- a/scripts/telegram-daemon-generation-manifest.json +++ b/scripts/telegram-daemon-generation-manifest.json @@ -432,9 +432,9 @@ "discord:packages/coding-agent/src/sdk/bus/discord-daemon.ts:start": "bf8bbd91ad9e0abf3cd9d222ca64c58d424580c9d47b132b874f06d9e8fc19d1", "discord:packages/coding-agent/src/sdk/bus/discord-daemon.ts:stop": "c8bcd881cc0331fb0565a82d997805f939701b12a80e03177192dbd5935824ff", "discord:packages/coding-agent/src/sdk/client/discovery.ts:readSdkSessionEndpoint": "c0f42dcf4843e6c79516b11927150e0fe827f6f4cfff400f04ab113ae0574022", - "discord:packages/coding-agent/src/sdk/router/session-router.ts:SessionRouter.#attach": "f01b84c3ab97d1123b4d7b85760ceb113fbb079f665e188cc7cabcda873e88fe", + "discord:packages/coding-agent/src/sdk/router/session-router.ts:SessionRouter.#attach": "d9e810776f1bd821e0c62730ae89fe71dc83d6f93b12d9ccebd2cb237dae08cf", "discord:packages/coding-agent/src/sdk/router/session-router.ts:SessionRouter.#createAttachedClient": "dc2c780c9decb94e23481bc57d5d0fbfd3a45320197e03f33079a91a3334e43e", - "discord:packages/coding-agent/src/sdk/router/session-router.ts:SessionRouter.#publishAttachment": "ecbcfe6d6447556d69d424fb14ee5b0815d421db642cf7907171b94d203a7450", + "discord:packages/coding-agent/src/sdk/router/session-router.ts:SessionRouter.#publishAttachment": "df2509604cbd0ff2f821a6fde48131df18a5b73142fbbb9e8855075af01a2618", "slack:packages/coding-agent/src/sdk/bus/chat-daemon-cli.ts:defaultPidAlive": "437658a2f14ac5daa2a3e84dcd637078566e71a88841cd750efab6d48fc94c3f", "slack:packages/coding-agent/src/sdk/bus/chat-daemon-cli.ts:loadConfig": "aff409ff6d08bfe19f5c39aac900ec6c8e898d988971bac029edb50459a84f5e", "slack:packages/coding-agent/src/sdk/bus/chat-daemon-cli.ts:ownerPid": "31110dcdd6e0f5dbc8b4dce27383646b9c339739758623ab67dc40ddc36661e0", @@ -517,9 +517,9 @@ "slack:packages/coding-agent/src/sdk/bus/slack-daemon.ts:start": "d3a5392ddff0d522aea7b4fd349758a56d56189f4b66d4403487e11e3dcacb21", "slack:packages/coding-agent/src/sdk/bus/slack-daemon.ts:stop": "193b4d16482533da0d6ae137e0b9e74e5449cfa7f1633bb87b4e10572ad7c43e", "slack:packages/coding-agent/src/sdk/client/discovery.ts:readSdkSessionEndpoint": "c0f42dcf4843e6c79516b11927150e0fe827f6f4cfff400f04ab113ae0574022", - "slack:packages/coding-agent/src/sdk/router/session-router.ts:SessionRouter.#attach": "f01b84c3ab97d1123b4d7b85760ceb113fbb079f665e188cc7cabcda873e88fe", + "slack:packages/coding-agent/src/sdk/router/session-router.ts:SessionRouter.#attach": "d9e810776f1bd821e0c62730ae89fe71dc83d6f93b12d9ccebd2cb237dae08cf", "slack:packages/coding-agent/src/sdk/router/session-router.ts:SessionRouter.#createAttachedClient": "dc2c780c9decb94e23481bc57d5d0fbfd3a45320197e03f33079a91a3334e43e", - "slack:packages/coding-agent/src/sdk/router/session-router.ts:SessionRouter.#publishAttachment": "ecbcfe6d6447556d69d424fb14ee5b0815d421db642cf7907171b94d203a7450", + "slack:packages/coding-agent/src/sdk/router/session-router.ts:SessionRouter.#publishAttachment": "df2509604cbd0ff2f821a6fde48131df18a5b73142fbbb9e8855075af01a2618", "telegram:packages/coding-agent/src/sdk/bus/config.ts:isTelegramSessionEligible": "6e2bf01ec7f58e07658172a2911741891f4eb05e2050e536bc170d6770746c37", "telegram:packages/coding-agent/src/sdk/bus/config.ts:parseNotificationSettingsSnapshot": "a694158726a9a4f4df58d1b1a4cee54884ef2e4bab506b3c6cac981b3f41072e", "telegram:packages/coding-agent/src/sdk/bus/daemon-paths.ts:DaemonPaths": "2a22d60aed8c778a8f4b7e2b2017b192977e3767b04572ca13d534980fa2f560", From cae16160a4fa350c2f84ecdc1ea6cef67a0b1d88 Mon Sep 17 00:00:00 2001 From: Yeachan Heo Date: Fri, 14 Aug 2026 18:58:35 +0000 Subject: [PATCH 2/2] fix(guard): fence post-4542 chat daemon owners Refreshing only the protected declaration digests would let Discord and Slack daemons started before #4542 retain the older attachment contract. Bump both provider generations and regenerate their semantic attestations so stale owners are replaced. Lore-id: 4f2ca8d1 Constraint: preserve the existing #4563 manifest repair and update the same PR branch Rejected: digest-only refresh | does not invalidate pre-#4542 daemon owners Confidence: high Scope-risk: narrow Reversibility: revert-safe Tested: telegram daemon generation guard, daemon-control replacement tests, coding-agent check --- packages/coding-agent/CHANGELOG.md | 1 + packages/coding-agent/src/sdk/bus/chat-daemon-control.ts | 7 +++++-- scripts/telegram-daemon-generation-manifest.json | 4 ++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index 18ce3954a6..703488899f 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -22,6 +22,7 @@ - Updated every bundled GLM model profile (`glm-eco`, `glm-medium`, and `glm-pro`) from ZAI GLM-5.2 to GLM-5.3. - Defense-in-depth: when an Anthropic-origin assistant transcript message carrying directly adjacent `thinking`/`redacted_thinking` blocks is persisted, a single bounded warn is emitted per session manager instance — but only in development/test builds, never in production. The diagnostic names only the envelope shape (block count, adjacency presence, provider), never raw thinking text, signatures, redacted payloads, or transcript-path metadata. Storage is never mutated — the send-boundary collapse remains the wire source of truth; this is a read-only observation that helps surface upstream producers of the rejected shape (#4443). ### Fixed +- Post-merge repair for #4542: `CHAT_DAEMON_GENERATIONS.discord` 64→65 and `.slack` 67→68 so the `SessionRouter` initial attachment replay change is generation-fenced for already-running Discord and Slack daemons. The semantic guard manifest is regenerated with the corrected generation and declaration digests. - Cursor split responses now preserve canonical provider order across pre-admission artifact spilling, so a server-side tool result cannot be persisted after the assistant continuation that follows it. The canonical admission reservation is owned by each emission's own handler, so a host bridge or replay emitting the same `message_end` event object twice can no longer overwrite the reservation and deadlock every later canonical admission (#4536). - Default-model selection now reserves a causal fence before credential probing, so an already accepted prompt preflight cannot be overtaken and a selection accepted first blocks later prompt preflight through durable publication. The fence does not hold session admission across `waitForIdle`, allowing inherited auto-compaction continuations to obtain prompt admission; same-session reentrancy still fails fast, successor sessions remain protected, and disposal deterministically drains accepted selections while rejecting queued prompts without unhandled rejections (#4519). - Ordinary sessions no longer import or execute Claude Code and Codex directory hooks as competing runtime authorities. Runtime hook discovery is fail-closed to canonical native `.gjc/hooks/` providers while explicit configured paths, constrained plugin hooks, and foreign-provider import/diagnostic discovery remain available (#4516). diff --git a/packages/coding-agent/src/sdk/bus/chat-daemon-control.ts b/packages/coding-agent/src/sdk/bus/chat-daemon-control.ts index f51fa9f9c4..4615f9d375 100644 --- a/packages/coding-agent/src/sdk/bus/chat-daemon-control.ts +++ b/packages/coding-agent/src/sdk/bus/chat-daemon-control.ts @@ -121,10 +121,13 @@ export type ChatDaemonAction = "stop" | "reload"; * Discord generation 64 / Slack generation 67 contain synchronous provider- * subscription admission and ready-hook failures without revoking shared Router * attachment authority. + * Discord generation 65 / Slack generation 68 fence the off-reconcile-tail + * initial attachment replay introduced by #4542 so pre-upgrade daemon owners + * cannot retain the earlier SessionRouter attachment contract. */ export const CHAT_DAEMON_GENERATIONS: Readonly> = { - discord: 64, - slack: 67, + discord: 65, + slack: 68, }; export function chatDaemonGeneration(kind: ChatDaemonKind): number { diff --git a/scripts/telegram-daemon-generation-manifest.json b/scripts/telegram-daemon-generation-manifest.json index 0debc997eb..c8b0052145 100644 --- a/scripts/telegram-daemon-generation-manifest.json +++ b/scripts/telegram-daemon-generation-manifest.json @@ -355,7 +355,7 @@ "discord:packages/coding-agent/src/sdk/bus/chat-daemon-cli.ts:loadConfig": "aff409ff6d08bfe19f5c39aac900ec6c8e898d988971bac029edb50459a84f5e", "discord:packages/coding-agent/src/sdk/bus/chat-daemon-cli.ts:ownerPid": "31110dcdd6e0f5dbc8b4dce27383646b9c339739758623ab67dc40ddc36661e0", "discord:packages/coding-agent/src/sdk/bus/chat-daemon-cli.ts:runChatDaemonInternal": "3865dd37ea7a6b92ef0e692a63fb9c084f06fa88b823d293b1e1e55d082dac86", - "discord:packages/coding-agent/src/sdk/bus/chat-daemon-control.ts:CHAT_DAEMON_GENERATIONS.discord": "7fa9a4aa17f19a6f9e6a2ddc29dca3b67a04938ef603ffccda9e3ee31f977d3d", + "discord:packages/coding-agent/src/sdk/bus/chat-daemon-control.ts:CHAT_DAEMON_GENERATIONS.discord": "95bd65c6a74757de7a5063f5b252801709418c27e361979788d98955eb2387c2", "discord:packages/coding-agent/src/sdk/bus/chat-daemon-control.ts:ChatDaemonAction": "d8acaf90439e410595b5cd56fd187001393ea943517a5563a4a2ea3c88d155ef", "discord:packages/coding-agent/src/sdk/bus/chat-daemon-control.ts:ChatDaemonController": "bb722a6a83eb383fce45e756cba356592b33ff0f505b4263409ce9138ea651f1", "discord:packages/coding-agent/src/sdk/bus/chat-daemon-control.ts:ChatDaemonKind": "b1c2906c4eb04e120c9ce42f8b549a68cfc834d29d4d745335712a7f61bf09f2", @@ -439,7 +439,7 @@ "slack:packages/coding-agent/src/sdk/bus/chat-daemon-cli.ts:loadConfig": "aff409ff6d08bfe19f5c39aac900ec6c8e898d988971bac029edb50459a84f5e", "slack:packages/coding-agent/src/sdk/bus/chat-daemon-cli.ts:ownerPid": "31110dcdd6e0f5dbc8b4dce27383646b9c339739758623ab67dc40ddc36661e0", "slack:packages/coding-agent/src/sdk/bus/chat-daemon-cli.ts:runChatDaemonInternal": "3865dd37ea7a6b92ef0e692a63fb9c084f06fa88b823d293b1e1e55d082dac86", - "slack:packages/coding-agent/src/sdk/bus/chat-daemon-control.ts:CHAT_DAEMON_GENERATIONS.slack": "34e260f7d68ceb8702467a93e41eeab8230920a950a9983d03c2e7409a7f4ee6", + "slack:packages/coding-agent/src/sdk/bus/chat-daemon-control.ts:CHAT_DAEMON_GENERATIONS.slack": "365d76b838f67e52933d2c05b31507634e93ad5eac6d84dd8e8538d71f9e7855", "slack:packages/coding-agent/src/sdk/bus/chat-daemon-control.ts:ChatDaemonAction": "d8acaf90439e410595b5cd56fd187001393ea943517a5563a4a2ea3c88d155ef", "slack:packages/coding-agent/src/sdk/bus/chat-daemon-control.ts:ChatDaemonController": "bb722a6a83eb383fce45e756cba356592b33ff0f505b4263409ce9138ea651f1", "slack:packages/coding-agent/src/sdk/bus/chat-daemon-control.ts:ChatDaemonKind": "b1c2906c4eb04e120c9ce42f8b549a68cfc834d29d4d745335712a7f61bf09f2",