Skip to content

[AI] fix(memory): prevent empty-string expectedModel in resolveMemory…#91691

Merged
vincentkoc merged 2 commits into
openclaw:mainfrom
xydt-tanshanshan:fix/memory-identity-empty-model-90787
Jun 15, 2026
Merged

[AI] fix(memory): prevent empty-string expectedModel in resolveMemory…#91691
vincentkoc merged 2 commits into
openclaw:mainfrom
xydt-tanshanshan:fix/memory-identity-empty-model-90787

Conversation

@xydt-tanshanshan

@xydt-tanshanshan xydt-tanshanshan commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Summary

resolveMemoryIndexIdentityState computes expectedModel from provider.model, but when provider.model is an empty string (as happens when resolveEmbeddingProviderFallbackModel returns "" for an unregistered adapter, or when createWithAdapter returned empty model before PR #90042), the expected model becomes "" — causing a permanent identity mismatch that blocks vector search indefinitely.

This PR fixes two code paths that could produce empty-string expectedModel:

  1. Identity consumer layer (manager-reindex-state.ts:123): Replace params.provider ? params.provider.model : "fts-only" with params.provider?.model?.trim() || "fts-only". Empty or whitespace-only provider.model now falls back to "fts-only" — the same safe default used when no provider is configured.

  2. Identity computation layer (manager-sync-ops.ts:420): Change resolveEmbeddingProviderFallbackModel(provider, "", cfg) to resolveEmbeddingProviderFallbackModel(provider, "fts-only", cfg). When the adapter IS registered (e.g., "openai" → defaultModel "text-embedding-3-small"), the resolved default model is used. When the adapter is NOT registered (e.g., "google" before the Google plugin loads), fallbackSourceModel = "fts-only" is returned instead of "".

This two-layer approach addresses the ClawSweeper P1 finding: when a configured provider has an empty model, the resolved adapter default model (e.g., "text-embedding-3-small") is used for identity comparison. "fts-only" only appears when both the adapter and the configured model are unavailable — matching the no-provider path semantics.

Change Type

  • Bug fix

Scope

  • Memory / storage

Linked Issue

Motivation

Users upgrading from 2026.5.26 to 2026.6.1 who previously used Google/Gemini as their memorySearch provider see Dirty: yes permanently with reason: "index was built for model gemini-embedding-001, expected " — the empty expected field makes the index unrecoverable. PR #90042 fixed the root cause at createWithAdapter (provider initialization), but the identity check can still produce empty-string expectedModel before provider init completes, or when the adapter registry hasn't loaded yet.

Changes

File: extensions/memory-core/src/memory/manager-reindex-state.ts

  1. Replace params.provider ? params.provider.model : "fts-only" with params.provider?.model?.trim() || "fts-only" — guard against empty/whitespace provider.model at the identity comparison consumer

File: extensions/memory-core/src/memory/manager-sync-ops.ts

  1. Change resolveEmbeddingProviderFallbackModel(this.settings.provider, "", this.cfg) to resolveEmbeddingProviderFallbackModel(this.settings.provider, "fts-only", this.cfg) — use "fts-only" as fallbackSourceModel instead of "" so unregistered adapters produce a readable fallback instead of empty string

File: extensions/memory-core/src/memory/manager-reindex-state.test.ts

  1. Add 3 tests covering empty-string, whitespace-only, and non-fts mismatch scenarios

No new imports, no config changes, no default surface changes.

Verification

Real Behavior Proof

Behavior addressed: expectedModel in resolveMemoryIndexIdentityState can become an empty string "" when provider.model is empty, causing permanent identity mismatch ("index was built for model X, expected ") and blocking vector search recovery.

Real environment tested: Linux (Ubuntu), Node.js 22.19+, local checkout on branch fix/memory-identity-empty-model-90787.

Exact steps or command run after this patch:

node scripts/run-vitest.mjs extensions/memory-core/src/memory/manager-reindex-state.test.ts --run
node /tmp/identity-proof.mjs
node /tmp/fallback-proof.mjs
http_proxy=http://proxyhk.zte.com.cn:80 https_proxy=http://proxyhk.zte.com.cn:80 pnpm openclaw memory status --deep

Evidence after fix: Direct runtime proof demonstrating the empty-string provider.model path changed after the fix. Two focused scripts exercise the exact code paths that this PR changes:

  1. resolveMemoryIndexIdentityState expectedModel comparison (node /tmp/identity-proof.mjs): proves the identity consumer layer now produces "fts-only" instead of empty string for empty provider.model, while preserving behavior for normal values:
=== resolveMemoryIndexIdentityState: expectedModel BEFORE vs AFTER fix ===

Case: provider.model = "" (issue #90787 exact scenario)
  BEFORE: expectedModel = ""
  AFTER:  expectedModel = "fts-only"
  Changed: YES >>> empty string eliminated

Case: provider.model = "  " (whitespace)
  BEFORE: expectedModel = "  "
  AFTER:  expectedModel = "fts-only"
  Changed: YES >>> empty string eliminated

Case: provider.model = "text-embedding-3-small" (normal)
  BEFORE: expectedModel = "text-embedding-3-small"
  AFTER:  expectedModel = "text-embedding-3-small"
  Changed: NO >>> behavior preserved

Case: provider = null (no-provider path)
  BEFORE: expectedModel = "fts-only"
  AFTER:  expectedModel = "fts-only"
  Changed: NO >>> behavior preserved

Case: provider.model = "gemini-embedding-001" (google)
  BEFORE: expectedModel = "gemini-embedding-001"
  AFTER:  expectedModel = "gemini-embedding-001"
  Changed: NO >>> behavior preserved
  1. resolveEmbeddingProviderFallbackModel fallbackSourceModel comparison (node /tmp/fallback-proof.mjs): proves the pre-init configured-provider fallback now uses "fts-only" for unregistered adapters instead of empty string, while preserving resolved defaultModel for registered adapters:
=== resolveEmbeddingProviderFallbackModel: fallbackSourceModel BEFORE vs AFTER ===

Case: openai adapter registered, empty fallbackSourceModel (BEFORE)
  Result: "text-embedding-3-small"

Case: openai adapter registered, fts-only fallbackSourceModel (AFTER)
  Result: "text-embedding-3-small"

Case: google adapter NOT registered, empty fallbackSourceModel (BEFORE)
  Result: ""

Case: google adapter NOT registered, fts-only fallbackSourceModel (AFTER)
  Result: "fts-only"
  1. Unit test (terminal output from node scripts/run-vitest.mjs): directly tests resolveMemoryIndexIdentityState with provider.model = ""expectedModel = "fts-only" (not empty string):
 ✓ falls back to fts-only when provider.model is an empty string
 ✓ reports mismatch when empty-string expected model is compared to a non-fts index
 ✓ falls back to fts-only when provider.model is whitespace-only

Before-fix comparison (from issue #90787 reporter, Rocky Linux, v2026.6.1):

Field Before (issue #90787) After (this patch)
expectedModel "" (empty string) adapter defaultModel or "fts-only" (safe fallback)
Identity reason "index was built for model gemini-embedding-001, expected " (trailing empty string) "index was built for model gemini-embedding-001, expected text-embedding-3-small" (adapter default) or "expected fts-only" (unregistered adapter)
Recovery path None (permanent Dirty, no rebuild clears it) Reindex with correct provider → Dirty: no

Observed result after fix: Two-layer protection ensures expectedModel is never an empty string. When the adapter IS registered (e.g., "openai""text-embedding-3-small"), the resolved default model is used for identity comparison. When the adapter is NOT registered, "fts-only" is used — matching the no-provider path semantics and producing a readable mismatch reason that points the user toward a reindex instead of a broken permanent-stuck state.

What was not tested: The provider auto→openai migration decision (separate product issue with needs-product-decision label). This PR only fixes the identity-check and fallback-source layers; the migration logic that unconditionally rewrites provider: "auto" to "openai" is not changed and requires maintainer product decision per #90787's clawsweeper:needs-product-decision label.

Verification test output (12 tests, including 3 new):

 RUN  v4.1.7

 ✓ |extension-memory| extensions/memory-core/src/memory/manager-reindex-state.test.ts (12 tests) 31ms

 Test Files  1 passed (1)
      Tests  12 passed (12)

Key new test assertions:
- "falls back to fts-only when provider.model is an empty string":
    provider.model = "" → expectedModel = "fts-only" → matches fts-only index → status: "valid"
- "reports mismatch when empty-string expected model is compared to a non-fts index":
    provider.model = "" → expectedModel = "fts-only" → mismatched with "text-embedding-3-small" → reason contains "expected fts-only"
- "falls back to fts-only when provider.model is whitespace-only":
    provider.model = "  " → trimmed to "" → expectedModel = "fts-only" → matches fts-only index → status: "valid"

Risks

  • Low risk: Two-point guard — one at the identity comparison consumer, one at the fallback-source parameter — preserving existing behavior for all non-empty provider.model values.
  • Additive: The guards only activate when provider.model is empty or whitespace, or when fallbackSourceModel would otherwise be "". Previously these produced broken empty-string mismatches. No change for correctly-populated provider.model.
  • Complementary with Gateway memory_search index stuck dirty: provider.model empty during boot overwrites correct index identity #90042: PR Gateway memory_search index stuck dirty: provider.model empty during boot overwrites correct index identity #90042 fixes provider.model at the creation source (createWithAdapter); this PR protects the identity check at the consumption layer and the fallback-source computation. Either fix alone reduces the bug surface; together they eliminate it.
  • No config/default surface changes: No new config keys, env vars, or defaults introduced.
  • Adapter-default resolution preserved: resolveEmbeddingProviderFallbackModel("openai", "fts-only", cfg) still returns "text-embedding-3-small" (adapter defaultModel) when the adapter is registered. "fts-only" only appears when the adapter is unregistered — which is the correct semantic for the no-provider path.

@openclaw-barnacle openclaw-barnacle Bot added extensions: memory-core Extension: memory-core size: XS proof: supplied External PR includes structured after-fix real behavior proof. labels Jun 9, 2026
@clawsweeper

clawsweeper Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed June 15, 2026, 5:10 AM ET / 09:10 UTC.

Summary
This PR changes memory-core index identity resolution so empty or whitespace provider models and unresolved configured-provider fallback models no longer produce an empty expected model, and adds focused regression tests.

PR surface: Source 0, Tests +35. Total +35 across 3 files.

Reproducibility: yes. at source level: current main still reads raw provider.model in the identity comparator and uses an empty fallback source in the configured-provider path. I did not run a full packaged upgrade reproduction in this read-only review.

Review metrics: 1 noteworthy metric.

  • Identity Fallback Points: 2 changed. Both the direct identity comparator and the pre-init configured-provider fallback influence upgrade dirty-state and vector-search availability.

Stored data model
Persistent data-model change detected: vector/embedding metadata: extensions/memory-core/src/memory/manager-reindex-state.test.ts. Confirm migration or upgrade compatibility proof 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:

  • [P2] Get memory-owner confirmation for the fts-only unresolved-provider fallback before merge.

Risk before merge

  • [P1] The PR intentionally changes how empty or unresolved memory provider models compare against persisted index metadata; that can alter dirty, reindex, and vector-search availability for upgraded users.
  • [P1] If maintainers expect an initialized provider with an empty model to resolve the adapter default or configured model instead of comparing as fts-only, the fix should move to the provider model source-of-truth or caller normalization before merge.

Maintainer options:

  1. Confirm Memory Fallback Semantics (recommended)
    Have a memory owner confirm that unresolved configured providers should compare as fts-only before this lands.
  2. Normalize At Provider Source
    If initialized empty provider models should use adapter defaults, repair the provider creation or caller normalization layer instead of treating them as fts-only.
  3. Pause For Broader Migration Policy
    If this is inseparable from the legacy auto/Gemini upgrade behavior, pause this PR and keep that policy decision on [Bug]: memorySearch provider silently resets to "openai" after upgrade to 2026.6.1, causing permanent Dirty index and vector search outage #90787.

Next step before merge

  • [P2] Maintainer review should decide the fallback semantics; the previous mechanical branch blocker appears removed and there is no narrow automated repair to apply now.

Security
Cleared: The diff touches memory identity fallback logic and tests only; it does not change dependencies, workflows, secrets, install scripts, package metadata, or other supply-chain surfaces.

Review details

Best possible solution:

Land the narrow empty-expected guard only after memory owners confirm the fts-only fallback semantics, or adjust the branch to resolve/backfill the canonical provider model before identity comparison.

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

Yes at source level: current main still reads raw provider.model in the identity comparator and uses an empty fallback source in the configured-provider path. I did not run a full packaged upgrade reproduction in this read-only review.

Is this the best way to solve the issue?

Not fully settled. The PR is a plausible narrow mitigation, but the best merge state needs owner confirmation that unresolved configured providers should compare as fts-only rather than resolving or backfilling the canonical provider model.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 501f63443f54.

Label changes

Label changes:

  • add proof: sufficient: Contributor real behavior proof is sufficient. The PR body supplies after-fix terminal output from focused runtime scripts and targeted test output exercising the empty-model identity and fallback paths.
  • add rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • add status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (terminal): The PR body supplies after-fix terminal output from focused runtime scripts and targeted test output exercising the empty-model identity and fallback paths.
  • remove rating: 🦐 gold shrimp: Current PR rating is rating: 🐚 platinum hermit, so this older rating label is no longer current.
  • remove status: ⏳ waiting on author: Current PR status label is status: 👀 ready for maintainer look.

Label justifications:

  • P2: The PR targets a normal-priority memory identity regression with limited scope but real vector-search impact for affected configurations.
  • merge-risk: 🚨 compatibility: The fallback changes how existing empty or unresolved provider model state is interpreted across upgrades and status checks.
  • merge-risk: 🚨 session-state: Memory index identity controls dirty, reindex, and vector-search availability state for persisted memory/session recall.
  • 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 (terminal): The PR body supplies after-fix terminal output from focused runtime scripts and targeted test output exercising the empty-model identity and fallback paths.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body supplies after-fix terminal output from focused runtime scripts and targeted test output exercising the empty-model identity and fallback paths.
Evidence reviewed

PR surface:

Source 0, Tests +35. Total +35 across 3 files.

View PR surface stats
Area Files Added Removed Net
Source 2 2 2 0
Tests 1 35 0 +35
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 3 37 2 +35

What I checked:

Likely related people:

  • mushuiyu886: Authored the recent merged memory identity compatibility work in the same reindex-state and sync-ops paths. (role: recent area contributor; confidence: high; commits: 44e6caff5401; files: extensions/memory-core/src/memory/manager-reindex-state.ts, extensions/memory-core/src/memory/manager-sync-ops.ts)
  • jalehman: Current blame for the extracted identity comparator and configured-provider fallback scaffold points to the bundled plugin session seam refactor. (role: recent current-file contributor; confidence: medium; commits: f1b8827d20c8; files: extensions/memory-core/src/memory/manager-reindex-state.ts, extensions/memory-core/src/memory/manager-sync-ops.ts)
  • vincentkoc: Recent related memory identity and recovery reviews/merges connect this person to the same memory-core identity and reindex safety surface. (role: adjacent memory contributor; confidence: medium; commits: 44e6caff5401, d46dc39b18ec; files: extensions/memory-core/src/memory/manager-reindex-state.ts, extensions/memory-core/src/memory/manager-sync-ops.ts, extensions/memory-core/src/memory/manager.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 rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 session-state 🚨 May lose, corrupt, stale, or mis-associate session, agent, or context state. labels Jun 9, 2026
@xydt-tanshanshan

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
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 merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. label Jun 9, 2026
@xydt-tanshanshan

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper picked this up.

Command router queued. I will update this comment with the next step.

@xydt-tanshanshan

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper picked this up.

Command router queued. I will update this comment with the next step.

Re-review progress:

@clawsweeper clawsweeper Bot added rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. labels Jun 11, 2026
@xydt-tanshanshan

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@xydt-tanshanshan
xydt-tanshanshan force-pushed the fix/memory-identity-empty-model-90787 branch from 64feeb5 to e83e1e5 Compare June 15, 2026 08:31
@xydt-tanshanshan

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
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:

@xydt-tanshanshan
xydt-tanshanshan force-pushed the fix/memory-identity-empty-model-90787 branch from e83e1e5 to 878bcd8 Compare June 15, 2026 08:40
@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. and removed rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. labels Jun 15, 2026
@xydt-tanshanshan
xydt-tanshanshan force-pushed the fix/memory-identity-empty-model-90787 branch from 878bcd8 to f30016d Compare June 15, 2026 08:51
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 15, 2026
…ead of empty string

Change resolveEmbeddingProviderFallbackModel fallbackSourceModel from
empty string to fts-only so unregistered adapters produce a readable
expectedModel instead of an empty string that causes permanent
identity mismatch.

Refs openclaw#90787
@xydt-tanshanshan
xydt-tanshanshan force-pushed the fix/memory-identity-empty-model-90787 branch from f30016d to 1dd9bcc Compare June 15, 2026 08:54
@xydt-tanshanshan

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
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 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. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Jun 15, 2026
@vincentkoc vincentkoc self-assigned this Jun 15, 2026
@vincentkoc
vincentkoc merged commit 85a6353 into openclaw:main Jun 15, 2026
178 of 183 checks passed
xydt-tanshanshan pushed a commit to xydt-tanshanshan/openclaw that referenced this pull request Jul 7, 2026
Prove that existing indexes with empty adapter model metadata
transition safely after the backfill: stored meta (written by
the identity path) already carries the correct model; after
upgrade, provider.model matches the stored meta, preventing
spurious identity mismatches on first boot.

Ref: openclaw#90042, openclaw#91691
xydt-tanshanshan pushed a commit to xydt-tanshanshan/openclaw that referenced this pull request Jul 7, 2026
Prove that existing indexes with empty adapter model metadata
transition safely after the backfill: stored meta (written by
the identity path) already carries the correct model; after
upgrade, provider.model matches the stored meta, preventing
spurious identity mismatches on first boot.

Ref: openclaw#90042, openclaw#91691
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

extensions: memory-core Extension: memory-core merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 session-state 🚨 May lose, corrupt, stale, or mis-associate session, agent, or context state. P2 Normal backlog priority with limited blast radius. proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: supplied External PR includes structured after-fix real behavior proof. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. size: XS 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.

2 participants