On OpenClaw host 2026.5.3 with memory-lancedb-pro at master HEAD 47b635d, two issues seen at every gateway start.
1. Manifest missing contracts.tools declaration
OpenClaw 2026.5.x added a check that requires non-bundled plugins to declare every agent tool they register inside contracts.tools in the manifest. The check lives in openclaw/dist/tool-contracts-*.js:
function normalizePluginToolContractNames(contracts) {
return normalizePluginToolNames(contracts?.tools); // expects string[]
}
Since openclaw.plugin.json has no contracts field, every gateway start logs:
[ERROR] [plugins] plugin must declare contracts.tools before registering agent tools
(plugin=memory-lancedb-pro, source=.../plugins/memory-lancedb-pro/index.ts)
(fires 5x per startup)
The plugin still loads via the skills path and memory_recall / memory_store work, but new tool-registration paths are blocked.
Suggested fix
Add to openclaw.plugin.json:
{
"id": "memory-lancedb-pro",
"kind": "memory",
"contracts": {
"tools": [
"memory_recall",
"memory_store",
"memory_update",
"memory_forget",
"memory_list",
"memory_stats",
"memory_debug",
"memory_compact",
"memory_archive",
"memory_promote",
"memory_explain_rank",
"self_improvement_log",
"self_improvement_extract_skill",
"self_improvement_review"
]
}
}
Names extracted from src/tools.ts. If enableManagementTools=false, the management-only ones could be omitted, but listing all 14 is harmless — the host only enforces that registered tools are a subset of declared ones.
2. runBackup throws TypeError → daily backup never runs
In index.ts:4011, the backup function references resolvedDbPath, which IS correctly destructured from singleton state at index.ts:2022. At plugin registration the path resolves fine — the gateway log shows:
plugin registered (db: /Users/<redacted>/.openclaw/memory/lancedb-pro, ...)
But ~24h later the backup fires and:
[WARN] memory-lancedb-pro: backup failed: TypeError [ERR_INVALID_ARG_TYPE]:
The "path" argument must be of type string or an instance of Buffer or URL.
Received undefined
The error is consistent — fires every backup interval. Something between index.ts:4008 and 4013 ends up passing undefined into a node:path call. Possibilities I considered but couldn't confirm without instrumenting:
api.resolvePath(join(resolvedDbPath, "..", "backups")) returning undefined for that input shape
_singletonState being reset/cleared between initial registration and the timer firing
- A subsequent
register() call mutating closure state
Reproduction
- Install plugin at master HEAD with default
dbPath config
- Wait for backup interval (24h)
- Observe
backup failed: TypeError in logs; no JSONL file created in <dbPath>/../backups/
Consequence
Daily JSONL backups have not been running in production. Memory data itself is safe in LanceDB, but the JSONL safety net is silently broken.
Environment
- OpenClaw:
2026.5.3 (06d46f7)
- Plugin:
memory-lancedb-pro@1.1.0-beta.10 (master HEAD 47b635d)
- Node:
25.6.0
- OS: macOS 26.3.1 (arm64)
Happy to test patches if helpful.
On OpenClaw host 2026.5.3 with
memory-lancedb-proat master HEAD47b635d, two issues seen at every gateway start.1. Manifest missing
contracts.toolsdeclarationOpenClaw 2026.5.x added a check that requires non-bundled plugins to declare every agent tool they register inside
contracts.toolsin the manifest. The check lives inopenclaw/dist/tool-contracts-*.js:Since
openclaw.plugin.jsonhas nocontractsfield, every gateway start logs:(fires 5x per startup)
The plugin still loads via the skills path and
memory_recall/memory_storework, but new tool-registration paths are blocked.Suggested fix
Add to
openclaw.plugin.json:{ "id": "memory-lancedb-pro", "kind": "memory", "contracts": { "tools": [ "memory_recall", "memory_store", "memory_update", "memory_forget", "memory_list", "memory_stats", "memory_debug", "memory_compact", "memory_archive", "memory_promote", "memory_explain_rank", "self_improvement_log", "self_improvement_extract_skill", "self_improvement_review" ] } }Names extracted from
src/tools.ts. IfenableManagementTools=false, the management-only ones could be omitted, but listing all 14 is harmless — the host only enforces that registered tools are a subset of declared ones.2.
runBackupthrows TypeError → daily backup never runsIn
index.ts:4011, the backup function referencesresolvedDbPath, which IS correctly destructured from singleton state atindex.ts:2022. At plugin registration the path resolves fine — the gateway log shows:But ~24h later the backup fires and:
The error is consistent — fires every backup interval. Something between
index.ts:4008and4013ends up passingundefinedinto anode:pathcall. Possibilities I considered but couldn't confirm without instrumenting:api.resolvePath(join(resolvedDbPath, "..", "backups"))returning undefined for that input shape_singletonStatebeing reset/cleared between initial registration and the timer firingregister()call mutating closure stateReproduction
dbPathconfigbackup failed: TypeErrorin logs; no JSONL file created in<dbPath>/../backups/Consequence
Daily JSONL backups have not been running in production. Memory data itself is safe in LanceDB, but the JSONL safety net is silently broken.
Environment
2026.5.3 (06d46f7)memory-lancedb-pro@1.1.0-beta.10(master HEAD47b635d)25.6.0Happy to test patches if helpful.