TL;DR
Retrospective systematic audit across all 9 sync batches (v2026.2.25 through v2026.3.22 — fork's full upstream sync history) identified 32 upstream fix commits whose new files exist at upstream/v2026.3.22 but never landed in fork main — the same pattern as #2362 (@tloncorp/api → tlon-api.ts), fixed in #2402.
Filing as a single umbrella to (a) document the full scope discovered, (b) enable batch-porting when convenient, (c) track the known gaps explicitly so they don't re-accumulate. The INCLUDE Reconciliation Gate committed to HQ prevents this pattern for future batches.
Background
Sync to v2026.3.22 (PR #2400) missed the upstream fix ac850e815b that replaced @tloncorp/api git-dependency — the fix was in-range but its new file (extensions/tlon/src/tlon-api.ts) was silently reverted during D.3 build stabilization. Root cause analysis (memory record) revealed the "asymmetric revert-vs-extract split" anti-pattern: stabilization logic recorded only new-upstream-file deletions, not pre-existing-file reverts. Same pattern may exist in earlier batches.
Methodology
- Enumerate sync batches in fork
main (git log --grep="^sync:") — 9 batches from v2026.2.25 to v2026.3.22.
- Extract upstream range from each sync commit's
Upstream-range: trailer.
- Filter to
fix: commits in each range (high-signal for user-impacting work).
- Find A-status files introduced by each fix commit — 551 across all batches.
- Filter candidates: file not in fork
main, not classified as EXCLUDE*/EXCLUDE-GUT/EXCLUDE-STUB, not under an EXCLUDE directory rule — 55 candidates.
- Systematic validation: for each, check presence at
upstream/v2026.3.22.
- YES → real gap (fork missing what upstream currently has)
- NO → correctly absent (upstream self-deleted within sync range)
- Semantic refinement: exclude paths under fork-gutted parent dirs that have no explicit rule (
src/agents/pi-extensions/, extensions/qwen-portal-auth/ — dirs absent from fork entirely).
Result: 32 real gaps, 23 correctly-absent (20 upstream-self-deleted + 2 semantically gutted + 1 rebranded).
Validation artifacts: .tmp/systematic-validate-*/ (TSV + markdown). Audit scripts in HQ scripts/audit-lost-files.sh and scripts/audit-fix-commit-gaps.sh.
Findings — Full list (32 gaps → 27 real, 5 false positives moved below)
Updated 2026-04-19 during the hq B1–B10 cleanup pass. The audit methodology was hardened to filter files deleted by fork gut(*) commits (hq@fbdc14b) — 5 entries below are false positives architecturally gutted from the fork pre-B10. They've been moved to the § Rejected as false positives section and given EXCLUDE-GUT disposition rules (hq@b2e4633). Additional P3 test entries may also be fork-gutted area-related — still under triage (Step 3d).
🔴 Production files (4)
| Sync batch |
Path |
Upstream fix |
Rationale |
v2026.3.12 |
.npmignore |
86a3149b2e — fix: harden windows npm runtime path |
Publish hardening (EXTRACT-classified) |
v2026.3.12 |
extensions/mattermost/src/mattermost/reply-delivery.ts |
c965049dc6 — fix(mattermost): pass mediaLocalRoots through reply delivery (openclaw#44021) |
Adapter fix |
v2026.3.22 |
extensions/msteams/src/webhook-timeouts.ts |
dbd26e49f1 — fix(test): reduce startup-heavy hotspot retention (openclaw#52381) |
Adapter perf |
v2026.3.22 |
extensions/zalouser/src/zca-constants.ts |
8d805a02fd — fix(zalouser): decouple tests from zca-js runtime |
Adapter decoupling |
🟡 Test files (24)
Expand per-batch test list
v2026.2.25 (1):
src/browser/pw-tools-core.interactions.set-input-files.test.ts — ef326f5cd0 fix(browser): revalidate upload paths at use time
v2026.2.26: (0 — the shared.test.ts entry was a false positive, moved to the § Rejected section)
v2026.3.1 (2):
v2026.3.2 (3):
v2026.3.7 (1):
v2026.3.12 (2):
v2026.3.22 (15):
Rejected as false positives (27 — documented for audit trail)
Full per-candidate verdicts: see HQ .tmp/systematic-validate-*/systematic-report.md and full-results.tsv.
Execution plan
Recommended order (can be tackled batch-cherry-pick style or one at a time):
Priority P1 — v2026.3.1 browser/output-atomic.ts + v2026.3.7 browser/session-tab-registry.ts (+test) — REJECTED as false positives (fork-gutted by 1aae7daa00 — Playwright removal, pre-B10). See § Rejected section.
- Priority P2 —
v2026.3.12 mattermost (reply-delivery.ts + test), v2026.3.22 msteams webhook-timeouts.ts, v2026.3.22 zalouser (zca-constants.ts + mocks) — channel-adapter fixes. 3 commits, ~5 files.
- Priority P3 — Remaining 23 test files +
.npmignore — coverage catch-up. 23 commits. Batch cherry-pickable when convenient.
Each gap is independently cherry-pickable with git cherry-pick -x {commit} (pattern established in #2402). Expect minor adaptations (rebrand transforms, fork-divergent import paths).
Prevention going forward
Notes
- This audit only covered
fix: commits (higher signal). Non-fix commits (feat:, chore:, refactor:) in sync ranges may have additional lost files but are lower priority.
- The
v2026.3.22 sync's deferred-extracts list (1076 files) is separately tracked in HQ (upstream/b10-deferred-extracts-list.txt). Most are expected-deferred (fork-divergent EXTRACT); this audit surfaces the subset that shouldn't have been.
Closes the "lost upstream fixes" question from #2362 triage.
TL;DR
Retrospective systematic audit across all 9 sync batches (
v2026.2.25throughv2026.3.22— fork's full upstream sync history) identified 32 upstream fix commits whose new files exist atupstream/v2026.3.22but never landed in forkmain— the same pattern as #2362 (@tloncorp/api→tlon-api.ts), fixed in #2402.Filing as a single umbrella to (a) document the full scope discovered, (b) enable batch-porting when convenient, (c) track the known gaps explicitly so they don't re-accumulate. The INCLUDE Reconciliation Gate committed to HQ prevents this pattern for future batches.
Background
Sync to
v2026.3.22(PR #2400) missed the upstream fixac850e815bthat replaced@tloncorp/apigit-dependency — the fix was in-range but its new file (extensions/tlon/src/tlon-api.ts) was silently reverted during D.3 build stabilization. Root cause analysis (memory record) revealed the "asymmetric revert-vs-extract split" anti-pattern: stabilization logic recorded only new-upstream-file deletions, not pre-existing-file reverts. Same pattern may exist in earlier batches.Methodology
main(git log --grep="^sync:") — 9 batches fromv2026.2.25tov2026.3.22.Upstream-range:trailer.fix:commits in each range (high-signal for user-impacting work).main, not classified asEXCLUDE*/EXCLUDE-GUT/EXCLUDE-STUB, not under anEXCLUDEdirectory rule — 55 candidates.upstream/v2026.3.22.src/agents/pi-extensions/,extensions/qwen-portal-auth/— dirs absent from fork entirely).Result: 32 real gaps, 23 correctly-absent (20 upstream-self-deleted + 2 semantically gutted + 1 rebranded).
Validation artifacts:
.tmp/systematic-validate-*/(TSV + markdown). Audit scripts in HQscripts/audit-lost-files.shandscripts/audit-fix-commit-gaps.sh.Findings — Full list (32 gaps → 27 real, 5 false positives moved below)
🔴 Production files (4)
v2026.3.12.npmignore86a3149b2e— fix: harden windows npm runtime pathv2026.3.12extensions/mattermost/src/mattermost/reply-delivery.tsc965049dc6— fix(mattermost): pass mediaLocalRoots through reply delivery (openclaw#44021)v2026.3.22extensions/msteams/src/webhook-timeouts.tsdbd26e49f1— fix(test): reduce startup-heavy hotspot retention (openclaw#52381)v2026.3.22extensions/zalouser/src/zca-constants.ts8d805a02fd— fix(zalouser): decouple tests from zca-js runtime🟡 Test files (24)
Expand per-batch test list
v2026.2.25(1):src/browser/pw-tools-core.interactions.set-input-files.test.ts—ef326f5cd0fix(browser): revalidate upload paths at use timev2026.2.26: (0 — theshared.test.tsentry was a false positive, moved to the § Rejected section)v2026.3.1(2):src/cron/isolated-agent/run.cron-model-override.test.ts—98e30dc2a3fix(cron): handle sessions list cron model override (fix(cron): handle sessions list cron model override openclaw/openclaw#21279)src/browser/routes/agent.snapshot.test.ts—28c80689d4fix(browser): resolve correct targetId in navigate response (fix(browser): resolve correct targetId in navigate response after renderer swap openclaw/openclaw#25326)v2026.3.2(3):src/agents/path-policy.test.ts—ef89b48785fix(agents): normalize windows workspace path boundary checks (fix: handle Windows path separators in workspace root validation openclaw/openclaw#30766)src/browser/cdp-proxy-bypass.test.ts—c96234b51dfix: bypass proxy for CDP localhost connections ([Bug]: Browser control fails when HTTP_PROXY / HTTPS_PROXY / ALL_PROXY is set (CDP probes routed through proxy) openclaw/openclaw#31219)src/browser/server-context.ensure-browser-available.waits-for-cdp-ready.test.ts—d06cc77f38fix(browser): wait for CDP readiness after start ([Bug]: browser start/open blocks snapshot/screenshot with PortInUseError on Linux (port 18800 conflict) openclaw/openclaw#21149)v2026.3.7(1):src/agents/subagent-announce.capture-completion-reply.test.ts—81b93b9ce0fix(subagents): announce delivery with descendant gating (fix(subagents): deterministic announce delivery with descendant gating openclaw/openclaw#35080)— moved to § Rejected section (fork-gutted, paired with production file fix(browser): close tracked tabs on session cleanup — B10 audit #2417 also rejected)src/browser/session-tab-registry.test.tsv2026.3.12(2):extensions/mattermost/src/mattermost/reply-delivery.test.ts—c965049dc6(paired with production file above)src/browser/proxy-files.test.ts—18f15850e6fix(browser): restore proxy attachment media size cap (fix(browser): restore proxy attachment media size cap openclaw/openclaw#43684)v2026.3.22(15):extensions/tlon/src/monitor/settings-helpers.test.ts—535263572efix(tlon): unify settings reconciliation semanticsextensions/synology-chat/src/config-schema.test.ts—7ade3553b7fix: gate synology chat reply name matchingextensions/msteams/src/attachments.helpers.test.ts—23c8af3d24fix(test): split msteams attachment helperssrc/browser/chrome.launch-args.test.ts—72d775e069fix: stop forcing an extra blank tab on browser launchsrc/infra/outbound/targets.test-helpers.ts—e15f156f85fix(test): reduce node hotspot startup costextensions/synology-chat/src/session-key.test.ts—ce19a41f52fix(synology-chat): scope DM sessions by accountsrc/plugins/install-min-host-version-guardrails.test.ts—3ce5a8366afix(plugins): enforce minimum host versions for installable plugins (fix(plugins): enforce minimum host versions for installable plugins openclaw/openclaw#52094)extensions/zalouser/src/zalo-js.test-mocks.ts—8d805a02fd(paired with production file above)src/config/redact-snapshot.schema.test.ts—5841e3b493fix(ci): split redact snapshot schema coveragesrc/config/redact-snapshot.restore.test.ts—aeb2adf240fix(ci): split redact snapshot restore coveragesrc/logging/logger.browser-import.test.ts—df3a19051dfix(logging): make logger import browser-safesrc/infra/restart.deferral-timeout.test.ts—304703f165fix: resume orphaned subagent sessions after SIGUSR1 reloadsrc/plugins/runtime.test.ts—a69f6190abfix(gateway): pin plugin webhook route registry (fix(gateway): pin plugin webhook route registry openclaw/openclaw#47902)extensions/mattermost/index.test.ts—59bcac472efix: gate setup-only plugin side effectssrc/tts/edge-tts-validation.test.ts—946c24d674fix: validate edge tts output file is non-empty before reporting success (fix: validate edge tts output file is non-empty before reporting success openclaw/openclaw#43385)Rejected as false positives (27 — documented for audit trail)
src/gateway/system-run-approval-env-binding.tsadded 2026-03-12 19:59, refactored 12 min later 20:11;src/infra/outbound/built-in-channel-adapters.tsadded then refactored 31 min later)1aae7daa00(Playwright gut gut: remove Playwright automation framework from browser subsystem (MBP audit) #2304/gut(browser): remove Playwright automation framework #2330) — files gutted by the fork pre-B10; audit's semantic refinement did not cross-reference forkgut()commits. Now EXCLUDE-GUT in disposition.tsv (hq@b2e4633):src/browser/output-atomic.ts— was fix(browser): harden writable output paths — B10 audit #2416 (P1), closed 2026-04-19src/browser/session-tab-registry.ts— was fix(browser): close tracked tabs on session cleanup — B10 audit #2417 (P1), closed 2026-04-19src/browser/session-tab-registry.test.ts— was in P3 test batchsrc/cli/browser-cli-actions-input/shared.test.ts— was in P3 test batche2cf15c94d(stubs sweep gut: sweep gutted stubs across agents, auto-reply, commands, cli (MBP audit) #2303) —src/agents/pi-extensions/context-pruning/pruner.test.ts(parent dir absent from fork; now explicit EXCLUDE-GUT)apps/macos/Tests/OpenClawIPCTests/…exists in fork asapps/macos/Tests/RemoteClawIPCTests/…Full per-candidate verdicts: see HQ
.tmp/systematic-validate-*/systematic-report.mdandfull-results.tsv.Execution plan
Recommended order (can be tackled batch-cherry-pick style or one at a time):
Priority P1 —— REJECTED as false positives (fork-gutted byv2026.3.1browser/output-atomic.ts+v2026.3.7browser/session-tab-registry.ts(+test)1aae7daa00— Playwright removal, pre-B10). See § Rejected section.v2026.3.12mattermost (reply-delivery.ts+ test),v2026.3.22msteamswebhook-timeouts.ts,v2026.3.22zalouser (zca-constants.ts+ mocks) — channel-adapter fixes. 3 commits, ~5 files..npmignore— coverage catch-up. 23 commits. Batch cherry-pickable when convenient.Each gap is independently cherry-pickable with
git cherry-pick -x {commit}(pattern established in #2402). Expect minor adaptations (rebrand transforms, fork-divergent import paths).Prevention going forward
fork-syncSKILL § Phase D.3 — makes the silent-revert pattern a pre-commit invariant check.scripts/reconciliation-gate.sh.INCLUDE != committed_INCLUDE + reclassifications.Notes
fix:commits (higher signal). Non-fix commits (feat:,chore:,refactor:) in sync ranges may have additional lost files but are lower priority.v2026.3.22sync's deferred-extracts list (1076 files) is separately tracked in HQ (upstream/b10-deferred-extracts-list.txt). Most are expected-deferred (fork-divergent EXTRACT); this audit surfaces the subset that shouldn't have been.Closes the "lost upstream fixes" question from #2362 triage.