Skip to content

fix(sdk): run initial attachment replay off the reconcile tail (#4527) - #4542

Merged
Yeachan-Heo merged 1 commit into
devfrom
fix/issue-4527-telegram-rehost-reconcile
Aug 14, 2026
Merged

fix(sdk): run initial attachment replay off the reconcile tail (#4527)#4542
Yeachan-Heo merged 1 commit into
devfrom
fix/issue-4527-telegram-rehost-reconcile

Conversation

@Yeachan-Heo

@Yeachan-Heo Yeachan-Heo commented Aug 14, 2026

Copy link
Copy Markdown
Owner

Summary

After session-host rehost, the periodic reconcile re-attaches every session in one pass. Each attachment's initial event_replay was awaited inside the serialized #reconcileTail, so one slow replay (up to its full retry budget ≈40s) wedged every later tick and the sends funneling through them. Leases and inbound polling stayed green while outbound publications froze fleet-wide until daemon restart and backlog replay.

Root cause

#publishAttachment L1166 awaited #replayAttachment synchronously inside the reconcile path:

reconcile → attachWorker → #attach → #publishAttachment → #replayAttachment → client.request (10s × 4 retries)

With ATTACH_CONCURRENCY=4 and a 13-session fleet, one reconcile cycle blocked for ~170s. The 2s periodic timer chained behind the wedged tail. Publications froze because barrier.held captured live frames during replay, and a failed replay set barrier.failed which silently dropped all subsequent frames.

Fix

The periodic reconcile timer now passes deferReplay=true through #serialReconcile → #reconcile → attachWorker → #attach → #publishAttachment, which publishes immediately and runs initial replay on the attachment's readyTail — the same surface #reinitializeAttachment already uses for the reconnect path. start() and the public reconcile() keep synchronous replay so bootstrap callers and deterministic tests are unchanged.

What's preserved

  • Replay ordering: barrier-held live frames drain after ordered replay events (#drainHeldFrames runs at end of #replayAttachment)
  • Generation fences: barrier.held set before published=true and publication.resolve()
  • Cross-session isolation: each attachment owns its readyTail
  • Provider behavior: onAttachmentReady still awaited synchronously before replay

Test evidence

  • Deterministic reproducer: generation bump + never-settling replay. Fails on pre-fix router (first tick never settles). Passes with fix (both ticks converge while replay stays wedged).
  • 106 tests pass: router-authority (39), chat-daemon-worker (10), telegram-fault-containment (6), chat-daemon-control-frames (11), chat-daemon-session-reconnect (24+), session-index, notifications-telegram-daemon.
  • bun run check passes. bun run lint passes.

Closes #4527

gajae.pr-review-verdict.v1 merge-approved sha256:a6cf95bb6d2c3b1fdfd134d3b97a7a7b423f893d25237eec041bb686320c3100 reviewer:human reviewer-id:probepark evidence:base 39pass-1fail (#4527 wedge) -> head 40pass-0fail; check exit0

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 705be10399

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

if (!(await this.#deliverRecoveredFrames(attached))) return;
await this.#replayAttachment(attached, attached.cursor.seq);
});
return true;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Await deferred replay during explicit reconciles

When a periodic tick has already published a rehosted attachment, this return leaves its readyTail replay pending. If a caller subsequently invokes the public reconcile(), the non-deferred pass sees the attachment as resumable and returns immediately without joining that tail, so deterministic callers can proceed before recovered and replayed frames have been delivered—unlike the previous synchronous behavior. A non-deferred reconcile should await any outstanding attachment readyTail.

Useful? React with 👍 / 👎.

@Yeachan-Heo
Yeachan-Heo force-pushed the fix/issue-4527-telegram-rehost-reconcile branch from 705be10 to c311779 Compare August 14, 2026 05:16

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c311779b5a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

fs.mkdirSync(endpointDir, { recursive: true });
const sessionId = "wedge";
const endpointFile = path.join(endpointDir, `${sessionId}.json`);
fs.writeFileSync(endpointFile, JSON.stringify({ sessionId, url: "ws://wedge.test", token: "v1", pid: 42 }));

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Use Bun APIs for the new fixture writes

The new regression test introduces fs.writeFileSync here and again during the generation bump, although the repository contract explicitly requires Bun.file()/Bun.write() and forbids writeFileSync; convert these writes to await Bun.write(...) so the added test follows the workspace's Bun filesystem convention.

AGENTS.md reference: AGENTS.md:L124-L126

Useful? React with 👍 / 👎.

@Yeachan-Heo
Yeachan-Heo force-pushed the fix/issue-4527-telegram-rehost-reconcile branch 3 times, most recently from 47a3514 to 550b937 Compare August 14, 2026 11:50

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 550b937050

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

// was awaited inside the serialized reconcile tail, so every later tick
// froze until the replay budget expired; publications died while leases
// and inbound stayed green (#4527).
const repo = fs.mkdtempSync(path.join(os.tmpdir(), "gjc-router-4527-"));

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Use async filesystem APIs for fixture setup

Although the fixture writes now use Bun.write, the newly added setup still uses fs.mkdtempSync here and fs.mkdirSync below. The repository contract requires node:fs/promises for directory operations, so make this setup asynchronous with await fs.mkdtemp(...) and await fs.mkdir(...).

AGENTS.md reference: AGENTS.md:L132-L132

Useful? React with 👍 / 👎.

@Yeachan-Heo
Yeachan-Heo requested a review from probepark August 14, 2026 11:54
@Yeachan-Heo

Copy link
Copy Markdown
Owner Author

@probepark Exact-head review requested for 550b937050c4c279e45e9c36caa191371533d82d after semantic rebase onto current dev 10144d55f50ad03615994f4cff2bd5583686ff9e.

The original patch was preserved, then fix-forwarded for both automated findings: explicit reconcile() now joins outstanding per-attachment readyTail work outside the fleet-wide reconcile tail, and the fixture uses Bun.write(). The deterministic test proves periodic ticks still converge while replay is wedged and explicit reconciliation remains synchronously blocked until that replay settles. Local exact-head evidence: router authority 40/40, 154 assertions; package Biome/typecheck clean. Exact diff digest: sha256:cef9cf2f9a4fac2a78151f3ef55e992aeb56711f0910b9a63334e2c781763a50.

Required disposition is an authenticated exact-head approval or a concrete blocker.


[repo owner's gaebal-gajae (clawdbot) 🦞]

@Yeachan-Heo
Yeachan-Heo force-pushed the fix/issue-4527-telegram-rehost-reconcile branch from 550b937 to fde1bfb Compare August 14, 2026 11:56
@Yeachan-Heo

Copy link
Copy Markdown
Owner Author

@probepark Review request refreshed to exact head fde1bfb426e7c53d828c951af1e54adb71f9ebec (digest sha256:dee39d3e79ba848f17723a90af47f0f6cd6335354daba7ad53a3792e781192f1). The only delta from the previously requested head is replacing the new fixture's synchronous directory operations with fs/promises; router semantics and the 40/40 deterministic evidence are unchanged.


[repo owner's gaebal-gajae (clawdbot) 🦞]

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: fde1bfb426

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +803 to +804
if (await this.#attach(session, runEpoch, undefined, false, false, deferReplay))
attachedIds.add(session.sessionId);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Defer replay for publication-driven reconciles

When a rehost is first observed by SessionRouter.request() or an attachment's send() before the next 2-second timer tick, those paths call #serialReconcile(runEpoch) with the default deferReplay=false (lines 555 and 1036). This propagation therefore still makes #publishAttachment await every replacement's slow replay inside the shared reconcile tail, so subsequent periodic ticks and sends across the fleet queue behind it and reproduce the outbound freeze this change is intended to eliminate. Operational reconciles triggered by request/send need the deferred mode too, while only bootstrap and the explicitly synchronous public reconcile() should drain the ready tails.

Useful? React with 👍 / 👎.

@Yeachan-Heo
Yeachan-Heo force-pushed the fix/issue-4527-telegram-rehost-reconcile branch from fde1bfb to 1b46578 Compare August 14, 2026 12:01
@Yeachan-Heo

Copy link
Copy Markdown
Owner Author

@probepark Exact-head review refreshed to 1b4657824e9322fa4e0be100c0790169a2f0b769 (sha256:23441c8457a779657be2caa245222d3c34562382322f9c26152024547f9f553c). The additional fix closes the latest automated blocker: request/send/adopt operational reconciliation also defers replay, while bootstrap and explicit reconcile() retain synchronous completion by joining per-attachment tails outside the shared reconcile tail. The regression now exercises publication-driven request dispatch before the periodic tick, a later tick, and explicit reconcile blocking. Local exact-head result: 40/40, 155 assertions; Biome/typecheck clean.


[repo owner's gaebal-gajae (clawdbot) 🦞]

@Yeachan-Heo
Yeachan-Heo requested a review from HaD0Yun August 14, 2026 12:20
@Yeachan-Heo

Copy link
Copy Markdown
Owner Author

@HaD0Yun Could you provide an authenticated exact-head review for 1b4657824e9322fa4e0be100c0790169a2f0b769? The patch isolates rehost replay from all operational reconcile callers while keeping bootstrap/explicit reconciliation synchronous. Exact digest sha256:23441c8457a779657be2caa245222d3c34562382322f9c26152024547f9f553c; local 40/40 tests, 155 assertions, package check clean. Please approve exact head or name a concrete blocker.


[repo owner's gaebal-gajae (clawdbot) 🦞]

@Yeachan-Heo
Yeachan-Heo requested a review from IYENTeam August 14, 2026 12:23
@Yeachan-Heo

Copy link
Copy Markdown
Owner Author

@IYENTeam Authenticated exact-head review requested for 1b4657824e9322fa4e0be100c0790169a2f0b769. Scope is three files: isolate initial attachment replay from periodic/request/send/adopt reconcile tails, retain synchronous bootstrap/explicit reconcile semantics, and deterministic rehost regression. Digest sha256:23441c8457a779657be2caa245222d3c34562382322f9c26152024547f9f553c; local 40/40, 155 assertions, package check clean. Please approve exact head or identify a blocker.


[repo owner's gaebal-gajae (clawdbot) 🦞]

@Yeachan-Heo
Yeachan-Heo force-pushed the fix/issue-4527-telegram-rehost-reconcile branch from 1b46578 to 81de09c Compare August 14, 2026 12:32
@Yeachan-Heo

Copy link
Copy Markdown
Owner Author

@probepark @HaD0Yun @IYENTeam Final exact-head review target is 81de09cc7dd9f5c3c184336aa11ba9dfd035a5b9, rebased onto current dev e6f8c926dd6f388be8d87868eaeee1afff651b40. Patch digest is unchanged: sha256:23441c8457a779657be2caa245222d3c34562382322f9c26152024547f9f553c. Prior full affected CI was green apart from the intentionally fail-closed missing authenticated review contract; local 40/40, 155 assertions, package check clean. An exact-head authenticated approval is the remaining merge gate.


[repo owner's gaebal-gajae (clawdbot) 🦞]

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 81de09cc7d

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

reconcile(): Promise<void> {
return this.#serialReconcile(this.#runEpoch);
async reconcile(): Promise<void> {
await this.#serialReconcile(this.#runEpoch);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Defer replay before explicitly awaiting it

When reconcile() is the first operation to observe a rehost—such as the production coordinator call in packages/coding-agent/src/coordinator-mcp/server.ts:2873—this non-deferred call still makes #publishAttachment await the replacement's slow event_replay inside #reconcileTail. Periodic ticks and request/send reconciles then queue behind it, recreating the fleet-wide freeze this change is intended to prevent; pass deferReplay=true here and retain synchronous behavior by awaiting the attachment ready tails afterward.

Useful? React with 👍 / 👎.

A session-host rehost re-attaches every session in one periodic reconcile
pass, and each attachment's initial event_replay was awaited inside the
serialized reconcileTail. One slow replay therefore held every later tick
and the sends funneling through them for up to its full retry budget, so
leases and inbound polling stayed green while outbound publications froze
fleet-wide until daemon restart and backlog replay.

The periodic reconcile timer now passes deferReplay=true through
on the attachment's ready tail — the same surface the reconnect path
already uses. start() and the public reconcile() keep synchronous replay
so bootstrap callers and deterministic tests are unchanged. Replay
ordering (barrier-held live frames drain after ordered replay events),
generation fences, cross-session isolation, and provider hooks are
unchanged.

Verified the wedge reproducer (generation bump + never-settling replay)
times out on the pre-fix router and passes after the change.

Lore-id: b3053f34
Constraint: no arbitrary sleeps, retry, or timeout inflation; no restart workaround
Constraint: preserve replay ordering, generation fences, cross-session isolation, provider behavior
Rejected: awaiting replay only outside reconcile | start() drains tails for bootstrap callers instead, keeping the production path non-blocking
Confidence: high
Scope-risk: narrow
Reversibility: trivial
Tested: 106 tests across router/daemon/telegram/control-frames/reconnect suites
Not-tested: live multi-host Telegram fleet under real rehost
@Yeachan-Heo
Yeachan-Heo force-pushed the fix/issue-4527-telegram-rehost-reconcile branch from 81de09c to 185897c Compare August 14, 2026 12:36
@Yeachan-Heo

Copy link
Copy Markdown
Owner Author

@probepark @HaD0Yun @IYENTeam Exact-head target updated to 185897cf5282bf553a5ccfef216451d9f3e03acb, digest sha256:a6cf95bb6d2c3b1fdfd134d3b97a7a7b423f893d25237eec041bb686320c3100. Latest automated finding is fixed: public reconcile() itself now starts the attachment with deferred replay and then joins ready tails outside #reconcileTail, so even the coordinator path cannot wedge fleet-wide reconciliation. Local 40/40, 155 assertions, package check clean. Authenticated exact-head approval remains required.


[repo owner's gaebal-gajae (clawdbot) 🦞]

@Yeachan-Heo

Copy link
Copy Markdown
Owner Author

Exact head 185897cf5282bf553a5ccfef216451d9f3e03acb has completed the full affected matrix and virtual integration canary successfully. The sole failing required check is the intentional fail-closed PR contract bootstrap because no authenticated exact-head approval exists yet. The PR body retains exactly one honest needs-human verdict for digest sha256:a6cf95bb6d2c3b1fdfd134d3b97a7a7b423f893d25237eec041bb686320c3100.

All automated correctness blockers found on prior heads have been fix-forwarded. Merge remains held only for an authenticated approval from a write-authorized independent reviewer on this exact head; after that approval the verdict can be changed to merge-approved and the contract check rerun.


[repo owner's gaebal-gajae (clawdbot) 🦞]

@Yeachan-Heo

Copy link
Copy Markdown
Owner Author

Independent issue-disposition verification for #4527 against exact head 185897cf5282bf553a5ccfef216451d9f3e03acb (base dev e6f8c926dd6f388be8d87868eaeee1afff651b40). Read-only; no overlapping source was touched.

Issue acceptance contract vs this PR:

  1. Freeze root cause (serialized #reconcileTail wedged by awaited initial event_replay after rehost; publications must resume without daemon restart) — covered. All reconcile-driven paths now pass deferReplay=true (periodic timer at start(), adoptLifecycleResult, request, send, in-send stale reattach, and the public reconcile() which starts deferred then joins per-attachment readyTails off the shared tail). Initial replay runs on the attachment's own readyTail, matching the reconnect surface. Falsified live: with only this PR's regression test overlaid onto pre-fix dev base e6f8c926, the suite fails exactly at the wedge assertion (requestSettled false, 39 pass / 1 fail); at exact head 185897cf the full authority suite passes 40/40, 155 assertions. Local evidence matches CI's green test:packages/coding-agent/test/sdk-session-router-authority.test.ts at this head.

  2. Self-healing beyond the test (not required by the issue but decisive for "no restart"): on permanent replay failure #failBarrier sets barrier.failed, and the next #attach at L953 refuses to resume a failed-barrier attachment and rebuilds it from the preserved cursor.seq (L957) — the incident's terminal frozen state cannot persist across ticks even in the worst case.

  3. Ordering/generation/provider invariants preserved: barrier.held is still armed before published=true/publication.resolve() (L1166-1168), held live frames drain after ordered replay (#drainHeldFrames at end of #replayAttachment), each attachment owns its readyTail, and onAttachmentReady is still awaited before replay.

  4. Issue's three "Suggested direction" diagnostics (unattached-session warn, reconcile watchdog, ack-based attachedEndpoints) — intentionally not in this PR, and correctly so: the issue owner's lane constraint states "Warning-only mitigation … are prohibited," making root-cause repair the required disposition. If any of the three observability asks is still wanted post-merge, it is a separate follow-up issue, not a coverage gap in fix(sdk): run initial attachment replay off the reconcile tail (#4527) #4542.

Check state at exact head: all matrix jobs SUCCESS/SKIPPED except the sole PR contract bootstrap failure, which is the intentional fail-closed gate pending an authenticated exact-head approval (honest needs-human verdict retained for digest sha256:a6cf95bb6d2c3b1fdfd134d3b97a7a7b423f893d25237eec041bb686320c3100). Earlier CANCELLED/FAILURE rows are superseded runs from prior heads; the current full matrix including virtual integration validation is green.

Disposition: issue #4527 remains open and held to this exact head. On authenticated approval, merge, and merged-history proof, the issue will be closed with signed evidence. No gaps found that require a second PR.


[repo owner's gaebal-gajae (clawdbot) 🦞]

@probepark probepark left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approve - the replay no longer wedges the reconcile tail

Reviewed 185897cf5. session-router.ts +39, test +121.

The initial attachment replay ran on the reconcile tail, so a wedged replay blocked periodic
reconcile from ever converging - the #4527 symptom. Moving it off the tail decouples the two.

Differential

# base e6f8c926d, with this head's test file applied
(fail) SessionRouter dispatch authority > periodic reconcile converges while rehosted attachment's replay is wedged (#4527) [508.19ms]
 39 pass  1 fail

# head 185897cf5
 40 pass  0 fail
$ bun --cwd=packages/coding-agent run check   -> exit 0

The test name states the invariant and it fails without the fix - a wedged replay must not stop
reconcile from converging. That is the right shape for a liveness bug.

merge-approved.

Reviewed by @probepark - method: fresh-worktree run and package typecheck at the exact head, base run with the head's test file to prove the differential.

@Yeachan-Heo
Yeachan-Heo merged commit 21d0a44 into dev Aug 14, 2026
46 of 64 checks passed
@Yeachan-Heo

Copy link
Copy Markdown
Owner Author

Post-merge architecture review follow-ups (non-blocking, from issue #4527 disposition boundary review at merged dev tip 21d0a44209):

  1. P2 session-router.ts #publishAttachment deferred branch (~L1203): the stored attached.readyTail chain has no rejection observer. If #replayAttachment can throw (e.g. #enqueueFrame rethrows a provider-hook error for a correlated non-seq/foreign-generation frame — the old inline path surfaced this at the attach-worker catch), the deferred tail now rejects unobserved. Recommend void tail.then(() => undefined, e => logger.warn(...)) when storing the tail, mirroring the #frameTails pattern. Hardening follow-up, not a regression of telegram daemon: outbound publications freeze after session-host handoff; health stays green #4527's contract.
  2. P3 #attach now carries six positional params with three interacting booleans (skipReplay silently wins over deferReplay). Consider an options object next time this file is touched.
  3. P3 CHANGELOG wording: 'start() still drains those tails so bootstrap callers observe replay completion' is outcome-true but mechanism-false (start() passes deferReplay=false; replay runs inline). Optional wording fix.

These are recorded for the fix owner; none block the #4527 disposition (merged contract verified green: authority suite 40/40, 155 assertions at the merge commit).


[repo owner's gaebal-gajae (clawdbot) 🦞]

Yeachan-Heo pushed a commit that referenced this pull request Aug 14, 2026
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
@Yeachan-Heo

Copy link
Copy Markdown
Owner Author

Post-merge reconciliation at merged dev tip 21d0a44209805e061e8476551d2d317ed26ffe73 (squash of exact head 185897cf5282bf553a5ccfef216451d9f3e03acb):

Continuing active ownership until #4563/#4564 land and dev CI is green.


[repo owner's gaebal-gajae (clawdbot) 🦞]

Yeachan-Heo added a commit that referenced this pull request Aug 15, 2026
…gests

chore(guard): refresh discord/slack session-router digests after #4542
Yeachan-Heo pushed a commit to grantjayy/gajae-code that referenced this pull request Aug 15, 2026
…han-Heo#4542

PR Yeachan-Heo#4542 changed SessionRouter.#attach and #publishAttachment without
refreshing the discord/slack semantic manifest digests, so the current-tree
manifest check fails on dev after Yeachan-Heo#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
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.

2 participants