Skip to content

fix(memory): retry transient FileProvider-backed reads#85351

Merged
RomneyDa merged 1 commit into
openclaw:mainfrom
NianJiuZst:codex/fix-85252-memory-read-retry
Jun 1, 2026
Merged

fix(memory): retry transient FileProvider-backed reads#85351
RomneyDa merged 1 commit into
openclaw:mainfrom
NianJiuZst:codex/fix-85252-memory-read-retry

Conversation

@NianJiuZst
Copy link
Copy Markdown
Contributor

Summary

  • Problem: memory sync and wiki compile paths still surfaced raw transient Unknown system error -11 / FileProvider-style read failures from memory-host reads, session transcript reads, and wiki page reads.
  • Solution: add one shared bounded retry helper in memory-host-sdk, route the affected memory-core and memory-wiki read paths through it, and preserve existing missing-file behavior.
  • What changed: retried workspace memory reads, memory indexing reads, session transcript reads, session delta newline reads, and wiki compile page reads; added focused regression coverage and updated the Plugin SDK API baseline for the exported helper.
  • What did NOT change (scope boundary): no new config knob, no broad filesystem detection, no retry for unrelated non-memory reads, and no behavior change for permanent read errors or missing files.

Motivation

  • iCloud / FileProvider-backed memory stores can return transient read errnos during gateway warm-up or wiki compile windows. The issue report and ClawSweeper comment both showed that current main and the latest shipped release still propagate those failures directly, which can abort memory sync or break librarian wiki compile.
  • The right fix is narrow and shared: reuse one bounded retry policy across the memory-host reads that back memory-core and memory-wiki instead of sprinkling ad hoc loops at each call site.

Change Type (select all)

  • Bug fix
  • Feature
  • Refactor required for the fix
  • Docs
  • Security hardening
  • Chore/infra

Scope (select all touched areas)

  • Gateway / orchestration
  • Skills / tool execution
  • Auth / tokens
  • Memory / storage
  • Integrations
  • API / contracts
  • UI / DX
  • CI/CD / infra

Linked Issue/PR

Real behavior proof (required for external PRs)

  • Behavior addressed: transient FileProvider-style errno -11 read failures no longer abort workspace memory reads, session transcript indexing, or wiki compile page reads.
  • Real environment tested: local macOS source checkout on May 22, 2026 using direct OpenClaw runtime modules via node --import tsx --input-type=module.
  • Exact steps or command run after this patch:
node --import tsx --input-type=module <<'EOF'
import fs from 'node:fs/promises';
import os from 'node:os';
import path from 'node:path';
import { readMemoryFile } from './packages/memory-host-sdk/src/engine-storage.ts';
import { buildSessionEntry } from './packages/memory-host-sdk/src/host/session-files.ts';
import { compileMemoryWikiVault } from './extensions/memory-wiki/src/compile.ts';
import { resolveMemoryWikiConfig } from './extensions/memory-wiki/src/config.ts';
import { renderWikiMarkdown } from './extensions/memory-wiki/src/markdown.ts';

const root = await fs.mkdtemp(path.join(os.tmpdir(), 'issue-85252-proof-'));
const workspaceDir = path.join(root, 'workspace');
const memoryPath = path.join(workspaceDir, 'memory', 'retry.md');
const sessionPath = path.join(workspaceDir, '.openclaw', 'sessions', 'session.jsonl');
const vaultDir = path.join(root, 'wiki');
const wikiPagePath = path.join(vaultDir, 'sources', 'alpha.md');
await fs.mkdir(path.dirname(memoryPath), { recursive: true });
await fs.mkdir(path.dirname(sessionPath), { recursive: true });
await fs.mkdir(path.dirname(wikiPagePath), { recursive: true });
await fs.writeFile(memoryPath, 'alpha\nbeta', 'utf8');
await fs.writeFile(
  sessionPath,
  `${JSON.stringify({ type: 'message', message: { role: 'user', content: [{ type: 'text', text: 'hello' }] } })}\n`,
  'utf8',
);
await fs.writeFile(
  wikiPagePath,
  renderWikiMarkdown({
    frontmatter: {
      pageType: 'source',
      id: 'source.alpha',
      title: 'Alpha',
      claims: [
        {
          id: 'claim.alpha.doc',
          text: 'Alpha is the canonical source page.',
          status: 'supported',
          evidence: [{ sourceId: 'source.alpha', lines: '1-3' }],
        },
      ],
    },
    body: '# Alpha\n',
  }),
  'utf8',
);
const wikiConfig = resolveMemoryWikiConfig({ vault: { path: vaultDir } }, { homedir: os.homedir() });

const realOpen = fs.open.bind(fs);
const realReadFile = fs.readFile.bind(fs);
let memoryOpen = 0;
let sessionOpen = 0;
let wikiReadFile = 0;
fs.open = async (...args) => {
  const [target] = args;
  if (typeof target === 'string') {
    const resolved = path.resolve(target);
    if (resolved === memoryPath) {
      memoryOpen += 1;
      if (memoryOpen === 1) {
        const err = new Error('Unknown system error -11: Unknown system error -11, open');
        err.code = 'UNKNOWN';
        err.errno = -11;
        throw err;
      }
    }
    if (resolved === sessionPath) {
      sessionOpen += 1;
      if (sessionOpen === 1) {
        const err = new Error('Unknown system error -11: Unknown system error -11, open');
        err.code = 'UNKNOWN';
        err.errno = -11;
        throw err;
      }
    }
  }
  return await realOpen(...args);
};
fs.readFile = async (...args) => {
  const [target] = args;
  if (typeof target === 'string' && path.resolve(target) === wikiPagePath) {
    wikiReadFile += 1;
    if (wikiReadFile <= 3) {
      const err = new Error('Unknown system error -11: Unknown system error -11, read');
      err.code = 'UNKNOWN';
      err.errno = -11;
      throw err;
    }
  }
  return await realReadFile(...args);
};

try {
  const memoryResult = await readMemoryFile({ workspaceDir, extraPaths: [], relPath: 'memory/retry.md' });
  const sessionEntry = await buildSessionEntry(sessionPath);
  const compiled = await compileMemoryWikiVault(wikiConfig);
  console.log(JSON.stringify({
    attempts: { memoryOpen, sessionOpen, wikiReadFile },
    memoryResult,
    sessionLineMapLength: sessionEntry?.lineMap.length ?? null,
    sessionContent: sessionEntry?.content ?? null,
    compiledSourceCount: compiled.pageCounts.source,
    updatedFiles: compiled.updatedFiles.map((filePath) => path.relative(vaultDir, filePath)).sort(),
  }, null, 2));
} finally {
  fs.open = realOpen;
  fs.readFile = realReadFile;
  await fs.rm(root, { recursive: true, force: true });
}
EOF
  • Evidence after fix (screenshot, recording, terminal capture, console output, redacted runtime log, linked artifact, or copied live output):
{
  "attempts": {
    "memoryOpen": 2,
    "sessionOpen": 2,
    "wikiReadFile": 6
  },
  "memoryResult": {
    "text": "alpha\nbeta",
    "path": "memory/retry.md",
    "from": 1,
    "lines": 2
  },
  "sessionLineMapLength": 1,
  "sessionContent": "User: hello",
  "compiledSourceCount": 1,
  "updatedFiles": [
    ".openclaw-wiki/cache/agent-digest.json",
    ".openclaw-wiki/cache/claims.jsonl",
    "concepts/index.md",
    "entities/index.md",
    "index.md",
    "reports/claim-health.md",
    "reports/contradictions.md",
    "reports/index.md",
    "reports/low-confidence.md",
    "reports/open-questions.md",
    "reports/person-agent-directory.md",
    "reports/privacy-review.md",
    "reports/provenance-coverage.md",
    "reports/relationship-graph.md",
    "reports/stale-pages.md",
    "sources/alpha.md",
    "sources/index.md",
    "syntheses/index.md"
  ]
}
  • Observed result after fix: the first transient workspace open and session open both retried and succeeded on the second attempt, the wiki page read recovered after three injected -11 failures, and the real runtime modules returned the expected memory content, session transcript content, and compiled wiki output instead of surfacing a raw read error.
  • What was not tested: live iCloud / FileProvider reproduction on a real synced vault in this run; the proof uses injected transient errnos against the real runtime modules rather than a live macOS FileProvider race.
  • Before evidence (optional but encouraged): on main, injecting the same transient NodeJS.ErrnoException into these read paths propagates the raw failure through memory sync / compile instead of recovering.

Root Cause (if applicable)

  • Root cause: the affected memory-host, memory-core, and memory-wiki paths treated transient FileProvider-style read errnos as terminal failures instead of the short-lived filesystem contention they are on macOS / iCloud-backed storage.
  • Missing detection / guardrail: there was no shared memory read retry helper and no regression coverage for transient errno -11 / EAGAIN / EWOULDBLOCK / EDEADLK behavior across the affected read surfaces.
  • Contributing context (if known): the issue comment and ClawSweeper review both pointed out that current main and the shipped release still exposed these raw failures from session sync and wiki compile paths, with related FileProvider behavior already noted in readPageSummaries: no concurrency limit on fs.readFile, triggers EDEADLK on iCloud/FileProvider-backed vaults #68738.

Regression Test Plan (if applicable)

  • Coverage level that should have caught this:
    • Unit test
    • Seam / integration test
    • End-to-end test
    • Existing coverage already sufficient
  • Target test or file: packages/memory-host-sdk/src/host/read-file.test.ts, packages/memory-host-sdk/src/host/internal.test.ts, extensions/memory-core/src/memory/manager.read-file.test.ts, extensions/memory-core/src/memory/manager-sync-ops.startup-catchup.test.ts, extensions/memory-wiki/src/compile.test.ts
  • Scenario the test should lock in: one-shot transient -11 / EAGAIN-family failures on memory file reads, session transcript reads, session delta newline reads, and wiki page reads recover inside the shared helper without changing missing-file behavior.
  • Why this is the smallest reliable guardrail: the bug sits at the filesystem-read seam, so injected transient read failures on the real call paths give precise coverage without requiring a flaky live iCloud harness.
  • Existing test that already covers this (if any): none; existing coverage handled missing files and unrelated retry surfaces.
  • If no new test is added, why not: N/A.

User-visible / Behavior Changes

Memory sync and wiki compile now retry transient FileProvider-style read failures instead of surfacing raw Unknown system error -11 failures immediately. Missing files still behave exactly as before, and permanent read errors still propagate.

Diagram (if applicable)

Before:
[iCloud/FileProvider transient read errno -11] -> [memory read path] -> [raw error surfaces] -> [sync or compile aborts]

After:
[iCloud/FileProvider transient read errno -11] -> [shared bounded retry helper] -> [read succeeds] -> [sync or compile continues]

Security Impact (required)

  • New permissions/capabilities? (Yes/No) No
  • Secrets/tokens handling changed? (Yes/No) No
  • New/changed network calls? (Yes/No) No
  • Command/tool execution surface changed? (Yes/No) No
  • Data access scope changed? (Yes/No) No
  • If any Yes, explain risk + mitigation: N/A

Repro + Verification

Environment

  • OS: macOS
  • Runtime/container: local source checkout, Node 22+/repo toolchain
  • Model/provider: N/A
  • Integration/channel (if any): memory-core, memory-wiki, memory-host-sdk
  • Relevant config (redacted): default local repo config; synthetic temporary workspace/session/wiki dirs for injected proof

Steps

  1. Run node scripts/run-vitest.mjs packages/memory-host-sdk/src/host/read-file.test.ts packages/memory-host-sdk/src/host/internal.test.ts extensions/memory-core/src/memory/manager.read-file.test.ts extensions/memory-core/src/memory/manager-sync-ops.startup-catchup.test.ts extensions/memory-wiki/src/compile.test.ts
  2. Run pnpm check:changed
  3. Run pnpm plugin-sdk:api:gen
  4. Run node --max-old-space-size=8192 --import tsx scripts/generate-plugin-sdk-api-baseline.ts --check
  5. Run the real behavior proof command above

Expected

  • Transient FileProvider-style read failures recover inside the affected memory read paths.
  • Focused regression tests and changed checks pass.
  • The Plugin SDK baseline matches the intentional export change.

Actual

  • All focused tests passed.
  • pnpm check:changed passed.
  • node --max-old-space-size=8192 --import tsx scripts/generate-plugin-sdk-api-baseline.ts --check passed after regenerating the baseline hash.
  • The real behavior proof command showed successful retries and successful runtime results.

Evidence

Attach at least one:

  • Failing test/log before + passing after
  • Trace/log snippets
  • Screenshot/recording
  • Perf numbers (if relevant)

Human Verification (required)

What you personally verified (not just CI), and how:

  • Verified scenarios: direct runtime proof for readMemoryFile, buildSessionEntry, and compileMemoryWikiVault; focused regression suite; changed checks; Plugin SDK API baseline check.
  • Edge cases checked: missing-file behavior remained on the existing code paths, session delta newline reads retry separately from session transcript full reads, and wiki compile retries the page-summary read path that re-reads pages after updates.
  • What you did not verify: a live iCloud-backed vault reproducer during an actual FileProvider sync race.

Review Conversations

  • I replied to or resolved every bot review conversation I addressed in this PR.
  • I left unresolved only the conversations that still need reviewer or maintainer judgment.

If a bot review conversation is addressed by this PR, resolve that conversation yourself. Do not leave bot review conversation cleanup for maintainers.

Compatibility / Migration

  • Backward compatible? (Yes/No) Yes
  • Config/env changes? (Yes/No) No
  • Migration needed? (Yes/No) No
  • If yes, exact upgrade steps: N/A

Risks and Mitigations

  • Risk: retrying too broadly could mask permanent filesystem errors.
    • Mitigation: the helper retries only known transient -11 / EAGAIN-family signatures with a short bounded backoff and still rethrows permanent errors.
  • Risk: SDK export drift could break boundary checks if left untracked.
    • Mitigation: the PR updates src/plugin-sdk/memory-core-host-engine-storage.ts intentionally and regenerates docs/.generated/plugin-sdk-api-baseline.sha256.

@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation extensions: memory-core Extension: memory-core extensions: memory-wiki size: M proof: supplied External PR includes structured after-fix real behavior proof. labels May 22, 2026
@clawsweeper
Copy link
Copy Markdown
Contributor

clawsweeper Bot commented May 22, 2026

Codex review: needs maintainer review before merge. Reviewed June 1, 2026, 3:16 PM ET / 19:16 UTC.

Summary
The PR adds a bounded transient memory-read retry helper, routes memory-core/session/wiki read paths through it, and updates focused regression tests plus the Plugin SDK API baseline hash.

PR surface: Source +96, Tests +230, Generated 0. Total +326 across 14 files.

Reproducibility: yes. source-level reproduction is high confidence: current main has non-retried memory/session/wiki reads, and the PR proof injects the reported transient errno failures through real runtime modules. I did not run a live iCloud/FileProvider repro in this read-only review.

Review metrics: 1 noteworthy metric.

  • Plugin SDK export surface: 2 added. The retry helper and predicate are new public exports, so maintainers should notice the API contract expansion before merge.

Merge readiness
Overall: 🐚 platinum hermit
Proof: 🦞 diamond lobster
Patch quality: 🐚 platinum hermit
Result: ready for maintainer review.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • Get maintainer confirmation that the new public Plugin SDK retry exports are acceptable.

Risk before merge

  • [P1] The PR adds two public Plugin SDK exports; third-party plugin compatibility and permanent API shape need maintainer acceptance before merge.
  • [P1] The proof uses injected transient errno failures through real runtime modules, not a live iCloud/FileProvider race, so OS-level behavior remains partly inferred.

Maintainer options:

  1. Approve the memory retry SDK helper
    Maintainers can explicitly accept the helper and predicate as part of the public memory-host storage facade, then land with the API baseline update.
  2. Keep retry policy internal
    If this should not become public Plugin SDK API, revise the branch to share or duplicate the bounded retry policy without widening the public facade.

Next step before merge

  • [P2] Maintainer review should decide whether the new retry helper belongs in the public Plugin SDK facade before merge.

Security
Cleared: No concrete security or supply-chain concern was found; the diff adds memory read retry logic, tests, and generated API baseline hashes with no new dependencies, secrets, network calls, or execution hooks.

Review details

Best possible solution:

Land this shape after maintainers accept the public SDK helper contract, or revise the branch so the shared retry policy stays internal while preserving the same memory-core/session/wiki coverage.

Do we have a high-confidence way to reproduce the issue?

Yes, source-level reproduction is high confidence: current main has non-retried memory/session/wiki reads, and the PR proof injects the reported transient errno failures through real runtime modules. I did not run a live iCloud/FileProvider repro in this read-only review.

Is this the best way to solve the issue?

Yes for the runtime bug: one shared bounded retry helper at the memory-read seam is cleaner than ad hoc loops. The unresolved part is whether exposing that helper through the public Plugin SDK facade is the best API shape.

AGENTS.md: found and applied where relevant.

Codex review notes: model gpt-5.5, reasoning high; reviewed against 66f797b22c10.

Label changes

Label changes:

  • add proof: sufficient: Contributor real behavior proof is sufficient. The PR body includes copied macOS live output from real OpenClaw runtime modules showing injected transient memory, session, and wiki reads retrying and returning expected results.

Label justifications:

  • P2: This is a normal-priority memory reliability fix for iCloud/FileProvider-backed read failures with a limited memory/wiki blast radius.
  • merge-risk: 🚨 compatibility: The branch changes the public Plugin SDK memory-host storage facade by adding new exported helpers.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (live_output): The PR body includes copied macOS live output from real OpenClaw runtime modules showing injected transient memory, session, and wiki reads retrying and returning expected results.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body includes copied macOS live output from real OpenClaw runtime modules showing injected transient memory, session, and wiki reads retrying and returning expected results.
Evidence reviewed

PR surface:

Source +96, Tests +230, Generated 0. Total +326 across 14 files.

View PR surface stats
Area Files Added Removed Net
Source 9 109 13 +96
Tests 4 231 1 +230
Docs 0 0 0 0
Config 0 0 0 0
Generated 1 2 2 0
Other 0 0 0 0
Total 14 342 16 +326

What I checked:

Likely related people:

  • Vincent Koc: History for memory-wiki compile and current blame for the affected memory read paths point to Vincent Koc's recent and original memory-wiki work. (role: feature owner and recent area contributor; confidence: high; commits: a9866a405c78, 5716d83336fd, 08492dfeee92; files: extensions/memory-wiki/src/compile.ts, extensions/memory-core/src/memory/manager-sync-ops.ts, packages/memory-host-sdk/src/host/read-file.ts)
  • Peter Steinberger: History shows Peter Steinberger extracted/moved the memory host SDK and authored the separate page-summary concurrency fix referenced by this PR's related issue. (role: memory host SDK and adjacent fix owner; confidence: high; commits: eebce9e9c7cb, bd6c7969ea9c, acbdb8c373d8; files: packages/memory-host-sdk/src/engine-storage.ts, src/plugin-sdk/memory-core-host-engine-storage.ts, extensions/memory-wiki/src/compile.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. labels May 22, 2026
@clawsweeper
Copy link
Copy Markdown
Contributor

clawsweeper Bot commented May 22, 2026

ClawSweeper PR egg

✨ Hatched: 🥚 common Gilded Test Hopper

Hatch command

Comment @clawsweeper hatch when this PR is hatchable.

Hatchability rules:

  • Merged PRs are hatchable.
  • Open PRs are hatchable when they are status: 👀 ready for maintainer look, status: 🚀 automerge armed, or labeled clawsweeper:automerge.
  • Closed unmerged PRs are hatchable only when one of those hatchable labels is still present in the durable record.

Rarity: 🥚 common.
Trait: sleeps inside passing CI.
Image traits: location release reef; accessory miniature diff map; palette coral, mint, and warm cream; mood focused; pose peeking out from the egg shell; shell brushed metal shell; lighting clean product lighting; background small green status lights.
Share on X: post this hatch
Copy: My PR egg hatched a 🥚 common Gilded Test Hopper in ClawSweeper.

What is this egg doing here?
  • Eggs appear after the PR passes real-behavior proof. It is here for vibes, not verdicts: it does not change labels, ratings, merge decisions, or automation.
  • The shell reacts to review momentum: open follow-up work warms it up, re-review makes it wobble, and a clean final review lets it hatch.
  • Hatchability usually comes from sufficient real-behavior proof, no blocking P0/P1/P2 findings, no security attention needed, and clean correctness. A merged PR is already final, so merge makes the egg hatchable independently.
  • The hatch is seeded from this repository and PR number, so the same PR keeps the same creature; the reviewed head SHA can only change safe visual details.
  • Rarity is just collectible sparkle: 🥚 common, 🌱 uncommon, 💎 rare, ✨ glimmer, and 🌈 legendary.

@NianJiuZst NianJiuZst force-pushed the codex/fix-85252-memory-read-retry branch from 4f89fd6 to 871abcf Compare May 22, 2026 13:22
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 22, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 22, 2026
@NianJiuZst NianJiuZst force-pushed the codex/fix-85252-memory-read-retry branch from 871abcf to 7e3749f Compare May 24, 2026 05:21
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 24, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 24, 2026
@RomneyDa RomneyDa force-pushed the codex/fix-85252-memory-read-retry branch from 7e3749f to 98fe321 Compare June 1, 2026 18:46
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 1, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 1, 2026
@RomneyDa RomneyDa force-pushed the codex/fix-85252-memory-read-retry branch from 98fe321 to b2bf1cb Compare June 1, 2026 19:07
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 1, 2026
@RomneyDa
Copy link
Copy Markdown
Member

RomneyDa commented Jun 1, 2026

@clawsweeper re-review

@clawsweeper
Copy link
Copy Markdown
Contributor

clawsweeper Bot commented Jun 1, 2026

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 1, 2026
@RomneyDa RomneyDa force-pushed the codex/fix-85252-memory-read-retry branch from b2bf1cb to ebd8580 Compare June 1, 2026 19:32
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 1, 2026
@RomneyDa RomneyDa force-pushed the codex/fix-85252-memory-read-retry branch from ebd8580 to 6269cdb Compare June 1, 2026 19:33
@RomneyDa
Copy link
Copy Markdown
Member

RomneyDa commented Jun 1, 2026

Thanks for the retry coverage here. I trimmed the retry budget while rebasing this branch because these are local filesystem reads, not network/API calls.

The current policy is intentionally small: initial read + 2 retries, with 25ms then 50ms backoff. That keeps the fix targeted at short transient file-read contention without letting memory indexing/wiki compile stall for long periods across many files. It also matches the nearby memory atomic-reindex retry shape more closely than the previous longer tail.

So the intended contract is: retry brief local FS blips, then fail fast if the read is still unhealthy.

@RomneyDa RomneyDa merged commit 5a55135 into openclaw:main Jun 1, 2026
37 checks passed
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jun 2, 2026
SYU8384 pushed a commit to SYU8384/openclaw that referenced this pull request Jun 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docs Improvements or additions to documentation extensions: memory-core Extension: memory-core extensions: memory-wiki merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. P2 Normal backlog priority with limited blast radius. proof: supplied External PR includes structured after-fix real behavior proof. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. size: M status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

memory-core sync emits raw EAGAIN (errno -11) on iCloud/FileProvider-backed reads instead of retry-with-backoff

2 participants