@karmaniverous/jeeves-meta-openclaw 0.13.3 → 0.15.0-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -13
- package/dist/index.js +140 -218
- package/dist/rollup.config.d.ts +3 -4
- package/dist/skills/jeeves-meta/SKILL.md +164 -330
- package/dist/src/configRoot.d.ts +43 -0
- package/dist/src/configRoot.test.d.ts +6 -0
- package/dist/src/helpers.d.ts +13 -2
- package/dist/src/index.d.ts +9 -2
- package/dist/src/index.test.d.ts +6 -0
- package/dist/src/manifest.test.d.ts +6 -0
- package/dist/src/pluginConfigSchema.d.ts +17 -0
- package/dist/src/serviceClient.d.ts +2 -2
- package/dist/src/tools.d.ts +2 -1
- package/openclaw.plugin.json +7 -6
- package/package.json +12 -15
- package/content/agents-section.md +0 -105
- package/content/skill.md +0 -122
- package/content/skills/coding.md +0 -149
- package/content/skills/jeeves.md +0 -122
- package/content/skills/operations.md +0 -125
- package/content/skills/playbooks.md +0 -75
- package/content/skills/slack-bot-provisioner.md +0 -57
- package/content/soul-section.md +0 -90
- package/content/templates/spec-to-code-guide.md +0 -250
- package/content/templates/spec.md +0 -177
- package/content/tools-platform.md +0 -102
- package/dist/cli.js +0 -26376
- package/dist/src/cli.d.ts +0 -12
- package/dist/src/cli.test.d.ts +0 -1
- package/dist/src/promptInjection.d.ts +0 -26
- package/dist/src/promptInjection.test.d.ts +0 -6
|
@@ -1,128 +1,102 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: jeeves-meta
|
|
3
|
+
description: >
|
|
4
|
+
Knowledge synthesis with jeeves-meta. Use when checking synthesis status, listing or inspecting .meta/ entities, triggering or seeding synthesis, managing the meta service, or troubleshooting stale, failed, or locked metas.
|
|
5
|
+
---
|
|
6
|
+
|
|
1
7
|
# jeeves-meta — OpenClaw Skill
|
|
2
8
|
|
|
3
9
|
## Overview
|
|
4
10
|
|
|
5
|
-
jeeves-meta is the Jeeves platform's knowledge synthesis engine. It discovers
|
|
6
|
-
`.meta/` directories via the watcher's filesystem walk endpoint (`POST /walk`),
|
|
7
|
-
gathers context from co-located source files, and uses a three-step LLM process
|
|
8
|
-
(architect, builder, critic) to produce structured synthesis artifacts.
|
|
11
|
+
jeeves-meta is the Jeeves platform's knowledge synthesis engine. It discovers `.meta/` directories via the watcher's filesystem walk endpoint (`POST /walk`), gathers context from co-located source files, and uses a three-step LLM process (architect, builder, critic) to produce structured synthesis artifacts.
|
|
9
12
|
|
|
10
|
-
Each meta entity carries a **phase-state machine** (`_phaseState`) tracking
|
|
11
|
-
the state of each phase independently: `fresh`, `stale`, `pending`, `running`,
|
|
12
|
-
or `failed`. The scheduler picks **one phase per tick** across the entire
|
|
13
|
-
corpus (critic > builder > architect priority), enabling surgical retries of
|
|
14
|
-
failed phases without re-running the full pipeline.
|
|
13
|
+
Each meta entity carries a **phase-state machine** (`_phaseState`) tracking the state of each phase independently: `fresh`, `stale`, `pending`, `running`, or `failed`. The scheduler picks **one phase per tick** across the entire corpus (critic > builder > architect priority), enabling surgical retries of failed phases without re-running the full pipeline.
|
|
15
14
|
|
|
16
|
-
**Requires:** jeeves-watcher ≥ 0.10.0 (provides `POST /walk` and auto
|
|
17
|
-
rules-reindex on registration).
|
|
15
|
+
**Requires:** jeeves-watcher ≥ 0.10.0 (provides `POST /walk` and auto rules-reindex on registration).
|
|
18
16
|
|
|
19
|
-
Discovery is filesystem-based (no Qdrant dependency). The service registers
|
|
20
|
-
virtual inference rules with the watcher for rendering and metadata tagging;
|
|
21
|
-
the watcher's `/status` response includes `rulesRegistered` to surface
|
|
22
|
-
registration health.
|
|
17
|
+
Discovery is filesystem-based (no Qdrant dependency). The service registers virtual inference rules with the watcher for rendering and metadata tagging; the watcher's `/status` response includes `rulesRegistered` to surface registration health.
|
|
23
18
|
|
|
24
19
|
## Available Tools
|
|
25
20
|
|
|
26
21
|
### meta_list
|
|
27
|
-
|
|
28
|
-
Supports filtering by path prefix, error status, staleness, lock state, and
|
|
29
|
-
disabled status. Use for engine health checks and finding stale knowledge.
|
|
30
|
-
Each meta entry includes `phaseState` (`{ architect, builder, critic }`)
|
|
31
|
-
showing the per-phase state.
|
|
22
|
+
|
|
23
|
+
List all `.meta/` directories with summary stats and per-meta projection. Supports filtering by path prefix, error status, staleness, lock state, and disabled status. Use for engine health checks and finding stale knowledge. Each meta entry includes `phaseState` (`{ architect, builder, critic }`) showing the per-phase state.
|
|
32
24
|
|
|
33
25
|
**Parameters:**
|
|
26
|
+
|
|
34
27
|
- `pathPrefix` (optional): Filter by path prefix (e.g. "github/")
|
|
35
28
|
- `filter` (optional): Structured filter (`{ hasError: true }`, `{ staleHours: 24 }`, `{ disabled: true }`)
|
|
36
29
|
- `fields` (optional): Property projection array
|
|
37
30
|
|
|
38
31
|
### meta_detail
|
|
39
|
-
|
|
40
|
-
`_phaseState` showing the per-phase state machine status.
|
|
32
|
+
|
|
33
|
+
Full detail for a single meta, with optional archive history. Includes `_phaseState` showing the per-phase state machine status.
|
|
41
34
|
|
|
42
35
|
**Parameters:**
|
|
36
|
+
|
|
43
37
|
- `path` (required): `.meta/` or owner directory path
|
|
44
38
|
- `fields` (optional): Property projection
|
|
45
39
|
- `includeArchive` (optional): false, true, or number (N most recent)
|
|
46
40
|
|
|
47
41
|
### meta_preview
|
|
48
|
-
|
|
49
|
-
architect trigger reasons, steer status, structure changes, and the
|
|
50
|
-
phase that would execute next — without running any LLM calls. Includes
|
|
51
|
-
`phaseState`, `owedPhase` (the phase that would run), `inputStatus`
|
|
52
|
-
(informational flags: structureHash, steerChanged, architectChanged,
|
|
53
|
-
criticChanged, crossRefsDeclChanged, crossRefContentChanged), and
|
|
54
|
-
`architectInvalidators` (list of reasons architect was triggered, e.g.
|
|
55
|
-
`structureHash`, `steer`, `_crossRefs`, `firstRun`, `architectEvery`).
|
|
56
|
-
Use before `meta_trigger` to understand what will happen.
|
|
42
|
+
|
|
43
|
+
Dry-run for the next synthesis candidate. Shows scope files, delta files, architect trigger reasons, steer status, structure changes, and the phase that would execute next — without running any LLM calls. Includes `phaseState`, `owedPhase` (the phase that would run), `inputStatus` (informational flags: structureHash, steerChanged, architectChanged, criticChanged, crossRefsDeclChanged, crossRefContentChanged), and `architectInvalidators` (list of reasons architect was triggered, e.g. `structureHash`, `steer`, `_crossRefs`, `firstRun`, `architectEvery`). Use before `meta_trigger` to understand what will happen.
|
|
57
44
|
|
|
58
45
|
**Parameters:**
|
|
59
|
-
|
|
60
|
-
|
|
46
|
+
|
|
47
|
+
- `path` (optional): Specific `.meta/` or owner directory path. If omitted, previews the stalest candidate.
|
|
61
48
|
|
|
62
49
|
### meta_trigger
|
|
63
|
-
|
|
64
|
-
The synthesis runs asynchronously in the service queue; the tool returns
|
|
65
|
-
immediately with the queue position. Only one phase runs per tick (the
|
|
66
|
-
owed phase). Includes `owedPhase` in the response showing which phase
|
|
67
|
-
will execute.
|
|
50
|
+
|
|
51
|
+
Enqueue a synthesis for a specific meta or the next-stalest candidate. The synthesis runs asynchronously in the service queue; the tool returns immediately with the queue position. Only one phase runs per tick (the owed phase). Includes `owedPhase` in the response showing which phase will execute.
|
|
68
52
|
|
|
69
53
|
**Parameters:**
|
|
70
|
-
|
|
71
|
-
|
|
54
|
+
|
|
55
|
+
- `path` (optional): Specific `.meta/` or owner directory path. If omitted, synthesizes the stalest candidate.
|
|
72
56
|
|
|
73
57
|
### meta_seed
|
|
74
|
-
|
|
75
|
-
UUID `_id`). Use this to bootstrap synthesis for a new path before the
|
|
76
|
-
first cycle runs. Supports optional cross-references for metas that
|
|
77
|
-
aggregate context from other metas.
|
|
58
|
+
|
|
59
|
+
Create a new `.meta/` directory with a skeleton `meta.json` (containing a UUID `_id`). Use this to bootstrap synthesis for a new path before the first cycle runs. Supports optional cross-references for metas that aggregate context from other metas.
|
|
78
60
|
|
|
79
61
|
**Parameters:**
|
|
62
|
+
|
|
80
63
|
- `path` (required): Owner directory path where `.meta/` will be created.
|
|
81
|
-
- `crossRefs` (optional): JSON array of cross-ref owner paths
|
|
82
|
-
|
|
83
|
-
initial `meta.json`.
|
|
84
|
-
- `steer` (optional): Steering prompt string. Written as `_steer` in the
|
|
85
|
-
initial `meta.json`.
|
|
64
|
+
- `crossRefs` (optional): JSON array of cross-ref owner paths (e.g. `'["j:/path/a","j:/path/b"]'`). Written as `_crossRefs` in the initial `meta.json`.
|
|
65
|
+
- `steer` (optional): Steering prompt string. Written as `_steer` in the initial `meta.json`.
|
|
86
66
|
|
|
87
67
|
### meta_unlock
|
|
88
|
-
|
|
89
|
-
synthesis and normally cleaned up automatically; use this when a synthesis
|
|
90
|
-
crashed and left a lock behind.
|
|
68
|
+
|
|
69
|
+
Remove a stale `.lock` file from a meta entity. Locks are created during synthesis and normally cleaned up automatically; use this when a synthesis crashed and left a lock behind.
|
|
91
70
|
|
|
92
71
|
**Parameters:**
|
|
72
|
+
|
|
93
73
|
- `path` (required): `.meta/` or owner directory path with a stuck lock.
|
|
94
74
|
|
|
95
75
|
### meta_config
|
|
96
|
-
|
|
97
|
-
filtering to extract specific settings. Sensitive fields (e.g.
|
|
98
|
-
`gatewayApiKey`) are redacted.
|
|
76
|
+
|
|
77
|
+
Query the running service configuration. Supports optional JSONPath filtering to extract specific settings. Sensitive fields (e.g. `gatewayApiKey`) are redacted.
|
|
99
78
|
|
|
100
79
|
**Parameters:**
|
|
101
|
-
|
|
102
|
-
|
|
80
|
+
|
|
81
|
+
- `path` (optional): JSONPath expression (e.g. `$.schedule`). If omitted, returns the full sanitized config.
|
|
103
82
|
|
|
104
83
|
### meta_update
|
|
105
|
-
|
|
106
|
-
toggle `_disabled`, change `_steer`, adjust `_emphasis` or `_depth`, or
|
|
107
|
-
modify `_crossRefs` — without editing `meta.json` directly on the filesystem.
|
|
84
|
+
|
|
85
|
+
Update user-settable reserved properties on a meta entity. Use this to toggle `_disabled`, change `_steer`, adjust `_emphasis` or `_depth`, or modify `_crossRefs` — without editing `meta.json` directly on the filesystem.
|
|
108
86
|
|
|
109
87
|
**Parameters:**
|
|
88
|
+
|
|
110
89
|
- `path` (required): `.meta/` or owner directory path.
|
|
111
|
-
- `updates` (required): Object with properties to set. Supported:
|
|
112
|
-
`_steer`, `_emphasis`, `_depth`, `_crossRefs`, `_disabled`.
|
|
113
|
-
Set a value to `null` to remove the property.
|
|
90
|
+
- `updates` (required): Object with properties to set. Supported: `_steer`, `_emphasis`, `_depth`, `_crossRefs`, `_disabled`. Set a value to `null` to remove the property.
|
|
114
91
|
|
|
115
92
|
### meta_queue
|
|
116
|
-
|
|
117
|
-
synthesis. The queue has three layers: `current` (the running phase),
|
|
118
|
-
`overrides` (explicitly triggered entries), and `automatic` (scheduler-
|
|
119
|
-
computed candidates). The `pending` and `state` fields provide legacy
|
|
120
|
-
compatibility.
|
|
93
|
+
|
|
94
|
+
Queue management: list pending items, clear the queue, or abort current synthesis. The queue has three layers: `current` (the running phase), `overrides` (explicitly triggered entries), and `automatic` (scheduler- computed candidates). The `pending` and `state` fields provide legacy compatibility.
|
|
121
95
|
|
|
122
96
|
**Parameters:**
|
|
97
|
+
|
|
123
98
|
- `action` (required): One of `list`, `clear`, `abort`.
|
|
124
|
-
- `list`: Show current queue state (current with phase, overrides,
|
|
125
|
-
automatic candidates, pending items).
|
|
99
|
+
- `list`: Show current queue state (current with phase, overrides, automatic candidates, pending items).
|
|
126
100
|
- `clear`: Remove all override queue entries.
|
|
127
101
|
- `abort`: Stop the currently running phase and release its lock.
|
|
128
102
|
|
|
@@ -145,60 +119,29 @@ compatibility.
|
|
|
145
119
|
- **Disabling a meta:** `meta_update` with path and `updates: { _disabled: true }`
|
|
146
120
|
- **Re-enabling a meta:** `meta_update` with path and `updates: { _disabled: null }`
|
|
147
121
|
- **Changing steer via API:** `meta_update` with path and `updates: { _steer: "new focus" }`
|
|
148
|
-
- **Reading synthesis output:** Use `watcher_search` filtered by the properties
|
|
149
|
-
configured in `metaProperty` (e.g. `{ "domains": ["meta"] }` in production).
|
|
150
|
-
The default properties are `{ _meta: "current" }` for live metas and
|
|
151
|
-
`{ _meta: "archive" }` for archive snapshots.
|
|
122
|
+
- **Reading synthesis output:** Use `watcher_search` filtered by the properties configured in `metaProperty` (e.g. `{ "domains": ["meta"] }` in production). The default properties are `{ _meta: "current" }` for live metas and `{ _meta: "archive" }` for archive snapshots.
|
|
152
123
|
|
|
153
124
|
## Key Concepts
|
|
154
125
|
|
|
155
|
-
- **Steering (`_steer`):** Human-written prompt in `meta.json` that guides
|
|
156
|
-
|
|
157
|
-
- **
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
views that aggregate across source domains without requiring data
|
|
161
|
-
co-location. Cycles are permitted (A refs B, B refs A). No transitive
|
|
162
|
-
closure — if A needs C's content, declare the ref explicitly.
|
|
163
|
-
- **Staleness:** Time since last synthesis. Deeper metas (leaves) update more
|
|
164
|
-
often than rollup metas (parents). Cross-ref freshness does NOT affect
|
|
165
|
-
the referencing meta's staleness — each meta synthesizes independently.
|
|
166
|
-
- **Disabled (`_disabled`):** Set `_disabled: true` on a meta to exclude it
|
|
167
|
-
from automatic staleness scheduling. The scheduler and auto-select both
|
|
168
|
-
skip disabled metas. Manual triggers (`meta_trigger` with explicit path)
|
|
169
|
-
still work. Use `meta_update` to toggle the flag.
|
|
170
|
-
- **Three steps:** Architect crafts the task brief, Builder produces content,
|
|
171
|
-
Critic evaluates quality. The feedback loop self-improves over cycles.
|
|
126
|
+
- **Steering (`_steer`):** Human-written prompt in `meta.json` that guides synthesis focus. The only field humans typically write.
|
|
127
|
+
- **Cross-references (`_crossRefs`):** Optional array of owner paths pointing to other metas. Referenced metas' `_content` is included as context for the architect and builder steps (not the critic). Enables organizational views that aggregate across source domains without requiring data co-location. Cycles are permitted (A refs B, B refs A). No transitive closure — if A needs C's content, declare the ref explicitly.
|
|
128
|
+
- **Staleness:** Time since last synthesis. Deeper metas (leaves) update more often than rollup metas (parents). Cross-ref freshness does NOT affect the referencing meta's staleness — each meta synthesizes independently.
|
|
129
|
+
- **Disabled (`_disabled`):** Set `_disabled: true` on a meta to exclude it from automatic staleness scheduling. The scheduler and auto-select both skip disabled metas. Manual triggers (`meta_trigger` with explicit path) still work. Use `meta_update` to toggle the flag.
|
|
130
|
+
- **Three steps:** Architect crafts the task brief, Builder produces content, Critic evaluates quality. The feedback loop self-improves over cycles.
|
|
172
131
|
- **Archives:** Each cycle creates a timestamped snapshot in `.meta/archive/`.
|
|
173
|
-
- **Progressive synthesis (`_state`):** The builder can set an opaque `_state`
|
|
174
|
-
|
|
175
|
-
back as context on the next cycle, enabling multi-cycle progressive work
|
|
176
|
-
(e.g. phased analysis, incremental refinement). On builder timeout, the
|
|
177
|
-
engine attempts to recover partial output — if `_state` advanced, it saves
|
|
178
|
-
the new state without overwriting existing content.
|
|
179
|
-
- **Phase-state machine (`_phaseState`):** Each meta tracks its three phases
|
|
180
|
-
independently: `{ architect: <state>, builder: <state>, critic: <state> }`.
|
|
181
|
-
States are `fresh`, `stale`, `pending`, `running`, or `failed`. The
|
|
182
|
-
scheduler picks the single highest-priority owed phase across all metas
|
|
183
|
-
each tick (critic > builder > architect, with staleness tiebreaking).
|
|
184
|
-
Failed phases are automatically retried on the next tick (promoted from
|
|
185
|
-
`failed` → `pending`). Only the failed phase reruns — upstream/downstream
|
|
186
|
-
phases are untouched (surgical retries). A full cycle completes only when
|
|
187
|
-
all three phases are `fresh`, at which point the archive snapshot is taken
|
|
188
|
-
and `_synthesisCount` increments. Legacy metas without `_phaseState` have
|
|
189
|
-
their state derived automatically from existing fields on first load.
|
|
132
|
+
- **Progressive synthesis (`_state`):** The builder can set an opaque `_state` value in its output JSON. This state is persisted in `meta.json` and passed back as context on the next cycle, enabling multi-cycle progressive work (e.g. phased analysis, incremental refinement). On builder timeout, the engine attempts to recover partial output — if `_state` advanced, it saves the new state without overwriting existing content.
|
|
133
|
+
- **Phase-state machine (`_phaseState`):** Each meta tracks its three phases independently: `{ architect: <state>, builder: <state>, critic: <state> }`. States are `fresh`, `stale`, `pending`, `running`, or `failed`. The scheduler picks the single highest-priority owed phase across all metas each tick (critic > builder > architect, with staleness tiebreaking). Failed phases are automatically retried on the next tick (promoted from `failed` → `pending`). Only the failed phase reruns — upstream/downstream phases are untouched (surgical retries). A full cycle completes only when all three phases are `fresh`, at which point the archive snapshot is taken and `_synthesisCount` increments. Legacy metas without `_phaseState` have their state derived automatically from existing fields on first load.
|
|
190
134
|
|
|
191
135
|
## Configuration
|
|
192
136
|
|
|
193
137
|
### Config File
|
|
194
138
|
|
|
195
|
-
Location determined by `JEEVES_META_CONFIG` env var or `--config` CLI flag.
|
|
196
|
-
Canonical deployment: `J:\config\jeeves-meta\config.json`.
|
|
139
|
+
Location determined by `JEEVES_META_CONFIG` env var or `--config` CLI flag. Canonical deployment: `J:\config\jeeves-meta\config.json`.
|
|
197
140
|
|
|
198
141
|
Key settings:
|
|
199
142
|
|
|
200
143
|
| Setting | Default | Description |
|
|
201
|
-
|
|
144
|
+
| --- | --- | --- |
|
|
202
145
|
| `watcherUrl` | (required) | Watcher service URL (e.g. `http://localhost:1936`) |
|
|
203
146
|
| `gatewayUrl` | `http://127.0.0.1:18789` | OpenClaw gateway URL for subprocess spawning |
|
|
204
147
|
| `gatewayApiKey` | (optional) | API key for gateway authentication |
|
|
@@ -212,49 +155,26 @@ Key settings:
|
|
|
212
155
|
| `thinking` | `low` | Thinking level for spawned LLM sessions |
|
|
213
156
|
| `port` | 1938 | HTTP API listen port |
|
|
214
157
|
|
|
215
|
-
| `schedule` | `*/30 * * * *` | Cron expression for automatic synthesis scheduling |
|
|
216
|
-
| `serverBaseUrl` | (optional) | Public base URL of the service (e.g. `http://myhost:1938`). When set, progress reports include clickable entity links. |
|
|
217
|
-
| `serverDriveRoots` | (optional) | Drive label to absolute path mapping for Linux path resolution in progress links (e.g. `{ "content": "/opt/jeeves/content" }`). |
|
|
218
|
-
| `reportChannel` | (optional) | Gateway channel name (e.g. `slack`). Legacy: also used as target if `reportTarget` is unset. |
|
|
219
|
-
| `reportTarget` | (optional) | Channel/user ID to send progress messages to |
|
|
220
|
-
| `tier2ScanLimit` | 50 | Max all-fresh candidates to scan per tick in Tier 2 invalidation |
|
|
221
|
-
| `workspaceDir` | OS tmpdir + `/jeeves-meta` | Directory for sub-agent output staging files |
|
|
222
|
-
| `stagingRetries` | 10 | Max retries when staging file not yet visible after session completion (min 0) |
|
|
223
|
-
| `stagingRetryDelayMs` | 250 | Delay between staging file retry attempts in ms (min 0) |
|
|
224
|
-
| `previewDeltaFilesCap` | 50 | Max delta files included in `/preview` response; excess sets `deltaFilesTruncated: true` (min 1) |
|
|
225
|
-
| `logging.level` | `info` | Log level (trace/debug/info/warn/error) |
|
|
226
|
-
| `logging.file` | (optional) | Log file path |
|
|
158
|
+
| `schedule` | `*/30 * * * *` | Cron expression for automatic synthesis scheduling | | `serverUrl` | `http://127.0.0.1:1934` | jeeves-server base URL for progress report links | | `templates` | (see docs) | Templates for phase start, end, and error progress reports | | `reportChannel` | (optional) | Gateway channel name (e.g. `slack`). Legacy: also used as target if `reportTarget` is unset. | | `reportTarget` | (optional) | Channel/user ID to send progress messages to | | `tier2ScanLimit` | 50 | Max all-fresh candidates to scan per tick in Tier 2 invalidation | | `workspaceDir` | OS tmpdir + `/jeeves-meta` | Directory for sub-agent output staging files | | `stagingRetries` | 10 | Max retries when staging file not yet visible after session completion (min 0) | | `stagingRetryDelayMs` | 250 | Delay between staging file retry attempts in ms (min 0) | | `previewDeltaFilesCap` | 50 | Max delta files included in `/preview` response; excess sets `deltaFilesTruncated: true` (min 1) | | `logging.level` | `info` | Log level (trace/debug/info/warn/error) | | `logging.file` | (optional) | Log file path |
|
|
227
159
|
|
|
228
160
|
### Meta Discovery
|
|
229
161
|
|
|
230
162
|
Discovery is entirely filesystem-based (no Qdrant dependency). The engine:
|
|
231
163
|
|
|
232
|
-
1. **Registers virtual inference rules** at service startup. These rules match
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
metadata on those indexed points.
|
|
164
|
+
1. **Registers virtual inference rules** at service startup. These rules match file paths (`**/.meta/meta.json` and `**/.meta/archive/*.json`) and apply the configured `metaProperty`/`metaArchiveProperty` values as watcher metadata on those indexed points.
|
|
165
|
+
|
|
166
|
+
2. **Discovers metas** via `watcher.walk(["**/.meta/meta.json"])` — a filesystem walk provided by the watcher's `POST /walk` endpoint. This enumerates all `.meta/meta.json` files under watched paths without using Qdrant or any vector database queries.
|
|
236
167
|
|
|
237
|
-
|
|
238
|
-
walk provided by the watcher's `POST /walk` endpoint. This enumerates all
|
|
239
|
-
`.meta/meta.json` files under watched paths without using Qdrant or any
|
|
240
|
-
vector database queries.
|
|
168
|
+
3. **Deduplicates** results by `.meta/` directory path and builds the ownership tree.
|
|
241
169
|
|
|
242
|
-
|
|
243
|
-
ownership tree.
|
|
170
|
+
**Important:** If you change `metaProperty` or `metaArchiveProperty` in config, you must:
|
|
244
171
|
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
- Restart the jeeves-meta service (so it re-registers virtual rules with the
|
|
248
|
-
new property values)
|
|
249
|
-
- Trigger a watcher rules reindex (`watcher_reindex` with scope `rules`) so
|
|
250
|
-
existing indexed points get retagged with the new properties
|
|
172
|
+
- Restart the jeeves-meta service (so it re-registers virtual rules with the new property values)
|
|
173
|
+
- Trigger a watcher rules reindex (`watcher_reindex` with scope `rules`) so existing indexed points get retagged with the new properties
|
|
251
174
|
|
|
252
175
|
### Configuring Meta Properties
|
|
253
176
|
|
|
254
|
-
`metaProperty` and `metaArchiveProperty` are `Record<string, unknown>` — any
|
|
255
|
-
JSON-serializable key-value structure. The virtual rules spread these properties
|
|
256
|
-
onto every matching indexed point. The discovery filter is derived from the same
|
|
257
|
-
properties.
|
|
177
|
+
`metaProperty` and `metaArchiveProperty` are `Record<string, unknown>` — any JSON-serializable key-value structure. The virtual rules spread these properties onto every matching indexed point. The discovery filter is derived from the same properties.
|
|
258
178
|
|
|
259
179
|
**Example configurations:**
|
|
260
180
|
|
|
@@ -276,23 +196,17 @@ properties.
|
|
|
276
196
|
|
|
277
197
|
### Prompt System
|
|
278
198
|
|
|
279
|
-
The service ships with built-in default architect and critic prompts. Prompts
|
|
280
|
-
ship with the package and cannot be overridden via config.
|
|
199
|
+
The service ships with built-in default architect and critic prompts. Prompts ship with the package and cannot be overridden via config.
|
|
281
200
|
|
|
282
|
-
**Per-meta overrides:** Set `_architect` or `_critic` directly in a `meta.json`
|
|
283
|
-
to override the defaults for that specific entity.
|
|
201
|
+
**Per-meta overrides:** Set `_architect` or `_critic` directly in a `meta.json` to override the defaults for that specific entity.
|
|
284
202
|
|
|
285
|
-
**Template variables:** All prompts (built-in and per-meta)
|
|
286
|
-
are compiled as Handlebars templates at synthesis time with access to:
|
|
203
|
+
**Template variables:** All prompts (built-in and per-meta) are compiled as Handlebars templates at synthesis time with access to:
|
|
287
204
|
|
|
288
205
|
- `{{config.maxLines}}`, `{{config.architectEvery}}`, etc.
|
|
289
206
|
- `{{scope.fileCount}}`, `{{scope.deltaCount}}`, `{{scope.childCount}}`, `{{scope.crossRefCount}}`
|
|
290
207
|
- `{{meta._depth}}`, `{{meta._emphasis}}`
|
|
291
208
|
|
|
292
|
-
The architect prompt can write template expressions into its `_builder` output
|
|
293
|
-
using escaped syntax (`\{{config.maxLines}}`). These pass through the
|
|
294
|
-
architect compilation as literal `{{...}}` text and resolve when the builder
|
|
295
|
-
prompt is compiled.
|
|
209
|
+
The architect prompt can write template expressions into its `_builder` output using escaped syntax (`\{{config.maxLines}}`). These pass through the architect compilation as literal `{{...}}` text and resolve when the builder prompt is compiled.
|
|
296
210
|
|
|
297
211
|
### Minimal Config Example
|
|
298
212
|
|
|
@@ -308,55 +222,41 @@ A minimum viable config file requires `watcherUrl`, `metaProperty`, and `metaArc
|
|
|
308
222
|
}
|
|
309
223
|
```
|
|
310
224
|
|
|
311
|
-
All other fields use sensible defaults (port 1938, schedule every 30 min,
|
|
312
|
-
depth weight 0.5, built-in prompts, etc). Add `reportChannel`, `logging`, etc. as needed.
|
|
225
|
+
All other fields use sensible defaults (port 1938, schedule every 30 min, depth weight 0.5, built-in prompts, etc). Add `reportChannel`, `logging`, etc. as needed.
|
|
313
226
|
|
|
314
227
|
### Adding New Metas
|
|
315
228
|
|
|
316
229
|
1. Create the `.meta/` directory under the domain path
|
|
317
|
-
2. Seed it: `jeeves-meta seed <path>` — creates `meta.json`
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
and `_crossRefs`
|
|
321
|
-
4. Wait for the watcher to index the new `meta.json` (typically seconds via
|
|
322
|
-
chokidar file watching)
|
|
230
|
+
2. Seed it: `jeeves-meta seed <path>` — creates `meta.json` with a UUID (`_id`). All other fields are populated on first synthesis
|
|
231
|
+
3. Optionally edit `meta.json` to set `_steer`, `_depth`, `_emphasis`, and `_crossRefs`
|
|
232
|
+
4. Wait for the watcher to index the new `meta.json` (typically seconds via chokidar file watching)
|
|
323
233
|
5. The entity appears in `meta_list` on the next query
|
|
324
234
|
|
|
325
|
-
**Note:** `_id` is optional in `meta.json`. A minimal stub of just `{}` or
|
|
326
|
-
`{ "_steer": "..." }` is valid — a UUID will be auto-generated on first
|
|
327
|
-
synthesis. The `meta_seed` tool and auto-seed always generate `_id` at
|
|
328
|
-
creation time.
|
|
235
|
+
**Note:** `_id` is optional in `meta.json`. A minimal stub of just `{}` or `{ "_steer": "..." }` is valid — a UUID will be auto-generated on first synthesis. The `meta_seed` tool and auto-seed always generate `_id` at creation time.
|
|
329
236
|
|
|
330
237
|
### Auto-Seed Policy
|
|
331
238
|
|
|
332
|
-
The `autoSeed` config field enables declarative, config-driven `.meta/`
|
|
333
|
-
creation. It is an array of policy rules, each with the shape:
|
|
239
|
+
The `autoSeed` config field enables declarative, config-driven `.meta/` creation. It is an array of policy rules, each with the shape:
|
|
334
240
|
|
|
335
241
|
```json
|
|
336
|
-
{
|
|
242
|
+
{
|
|
243
|
+
"match": "<glob>",
|
|
244
|
+
"steer": "<optional>",
|
|
245
|
+
"crossRefs": ["<optional>"],
|
|
246
|
+
"parentDepth": 0
|
|
247
|
+
}
|
|
337
248
|
```
|
|
338
249
|
|
|
339
|
-
- **`match`** (required) — a glob pattern compatible with `watcher.walk()`.
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
- **`
|
|
343
|
-
seeded `meta.json`.
|
|
344
|
-
- **`crossRefs`** (optional) — array of cross-ref owner paths written as
|
|
345
|
-
`_crossRefs` in the seeded `meta.json`.
|
|
346
|
-
- **`parentDepth`** (optional, default 0) — walk up this many extra parent
|
|
347
|
-
levels from the matched file's directory.
|
|
348
|
-
**Evaluation order: Rules are processed in array order. If multiple rules
|
|
349
|
-
match the same directory, the last match wins for `steer` and `crossRefs`.
|
|
250
|
+
- **`match`** (required) — a glob pattern compatible with `watcher.walk()`. The watcher walks all watched paths matching this glob and returns file paths. Parent directories of matched files become seed candidates.
|
|
251
|
+
- **`steer`** (optional) — steering prompt written as `_steer` in the seeded `meta.json`.
|
|
252
|
+
- **`crossRefs`** (optional) — array of cross-ref owner paths written as `_crossRefs` in the seeded `meta.json`.
|
|
253
|
+
- **`parentDepth`** (optional, default 0) — walk up this many extra parent levels from the matched file's directory. **Evaluation order: Rules are processed in array order. If multiple rules match the same directory, the last match wins for `steer` and `crossRefs`.
|
|
350
254
|
|
|
351
255
|
**Behavior:**
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
-
|
|
356
|
-
watcher walk only returns actual file paths, and parent directories are
|
|
357
|
-
derived from those.
|
|
358
|
-
- The `autoSeed` field hot-reloads with all other non-restart-required
|
|
359
|
-
config fields.
|
|
256
|
+
|
|
257
|
+
- Auto-seed runs at the start of each scheduler tick, before candidate discovery. Directories that already have a `.meta/` subdirectory are skipped.
|
|
258
|
+
- Empty directories (no files matching any glob) will not be seeded — the watcher walk only returns actual file paths, and parent directories are derived from those.
|
|
259
|
+
- The `autoSeed` field hot-reloads with all other non-restart-required config fields.
|
|
360
260
|
|
|
361
261
|
**Example:**
|
|
362
262
|
|
|
@@ -371,66 +271,43 @@ match the same directory, the last match wins for `steer` and `crossRefs`.
|
|
|
371
271
|
|
|
372
272
|
### Adding Cross-Reference Metas
|
|
373
273
|
|
|
374
|
-
For metas that aggregate context from other metas (e.g. an organizational
|
|
375
|
-
rollup that pulls from GitHub, Slack, and email metas):
|
|
274
|
+
For metas that aggregate context from other metas (e.g. an organizational rollup that pulls from GitHub, Slack, and email metas):
|
|
376
275
|
|
|
377
|
-
1. Seed with cross-refs: use `meta_seed` with both `path` and `crossRefs`
|
|
378
|
-
parameters. Example: seed `j:/veterancrowd/projects/ops` with refs to
|
|
379
|
-
`["j:/veterancrowd/github","j:/veterancrowd/slack"]`
|
|
276
|
+
1. Seed with cross-refs: use `meta_seed` with both `path` and `crossRefs` parameters. Example: seed `j:/veterancrowd/projects/ops` with refs to `["j:/veterancrowd/github","j:/veterancrowd/slack"]`
|
|
380
277
|
2. Set `_steer` to guide synthesis focus across the referenced sources
|
|
381
278
|
3. Verify refs: `meta_detail <path>` shows `crossRefs` status (resolved/missing)
|
|
382
|
-
4. Cross-ref metas can have zero sibling files — all context comes from refs
|
|
383
|
-
and child metas. The engine handles empty scopes gracefully.
|
|
279
|
+
4. Cross-ref metas can have zero sibling files — all context comes from refs and child metas. The engine handles empty scopes gracefully.
|
|
384
280
|
|
|
385
|
-
**Pure meta trees:** Directories containing only `.meta/` subdirectories and
|
|
386
|
-
no source data are valid. Use `_crossRefs` and `_steer` to define what context
|
|
387
|
-
flows in. Useful for organizational views (people, projects) that aggregate
|
|
388
|
-
across physically distributed data.
|
|
281
|
+
**Pure meta trees:** Directories containing only `.meta/` subdirectories and no source data are valid. Use `_crossRefs` and `_steer` to define what context flows in. Useful for organizational views (people, projects) that aggregate across physically distributed data.
|
|
389
282
|
|
|
390
283
|
### Tuning Scheduling
|
|
391
284
|
|
|
392
285
|
- **`_depth`:** Higher = updates more often. Defaults from tree nesting depth.
|
|
393
|
-
- **`_emphasis`:** Per-meta multiplier (default 1). Set 2 to double priority,
|
|
394
|
-
0.5 to halve it.
|
|
286
|
+
- **`_emphasis`:** Per-meta multiplier (default 1). Set 2 to double priority, 0.5 to halve it.
|
|
395
287
|
- **`depthWeight`:** Global exponent. Set 0 for pure staleness rotation.
|
|
396
|
-
- **`architectEvery`:** Higher = fewer architect runs (cheaper but slower to
|
|
397
|
-
adapt to structural changes).
|
|
288
|
+
- **`architectEvery`:** Higher = fewer architect runs (cheaper but slower to adapt to structural changes).
|
|
398
289
|
|
|
399
290
|
### Config Hot-Reload
|
|
400
291
|
|
|
401
|
-
All config fields hot-reload without restarting the service **except** these
|
|
402
|
-
restart-required fields:
|
|
292
|
+
All config fields hot-reload without restarting the service **except** these restart-required fields:
|
|
403
293
|
|
|
404
294
|
- `port` — HTTP listen port
|
|
405
295
|
- `watcherUrl` — watcher service URL
|
|
406
296
|
- `gatewayUrl` — OpenClaw gateway URL
|
|
407
297
|
- `gatewayApiKey` — gateway authentication key
|
|
408
298
|
|
|
409
|
-
Edit the config file and save; the service detects changes via `fs.watchFile`.
|
|
410
|
-
When a restart-required field changes, the service logs a warning but the
|
|
411
|
-
change does not take effect until restart. All other fields (including
|
|
412
|
-
`schedule`, `reportChannel`, `metaProperty`, timeouts, `autoSeed`,
|
|
413
|
-
`logging.level`, etc.) are applied immediately.
|
|
299
|
+
Edit the config file and save; the service detects changes via `fs.watchFile`. When a restart-required field changes, the service logs a warning but the change does not take effect until restart. All other fields (including `schedule`, `reportChannel`, `metaProperty`, timeouts, `autoSeed`, `logging.level`, etc.) are applied immediately.
|
|
414
300
|
|
|
415
301
|
### Progress Reporting
|
|
416
302
|
|
|
417
|
-
When `reportChannel` is set, the service sends real-time progress messages
|
|
418
|
-
to that channel via the OpenClaw gateway. Events include: synthesis started,
|
|
419
|
-
phase started/completed (architect, builder, critic), synthesis completed,
|
|
420
|
-
and errors. This uses
|
|
421
|
-
`/tools/invoke` → `message` tool — zero LLM token cost.
|
|
303
|
+
When `reportChannel` is set, the service sends real-time progress messages to that channel via the OpenClaw gateway. Events include: synthesis started, phase started/completed (architect, builder, critic), synthesis completed, and errors. This uses `/tools/invoke` → `message` tool — zero LLM token cost.
|
|
422
304
|
|
|
423
|
-
###
|
|
305
|
+
### Bootstrapping Signals
|
|
424
306
|
|
|
425
|
-
The plugin
|
|
426
|
-
- **Service unreachable:** Shows "ACTION REQUIRED: jeeves-meta service is
|
|
427
|
-
unreachable" with troubleshooting steps and directs to this skill's
|
|
428
|
-
Bootstrapping section
|
|
429
|
-
- **No entities found:** Shows "ACTION REQUIRED: No synthesis entities found"
|
|
430
|
-
and directs to this skill's Bootstrapping section
|
|
307
|
+
The plugin writes nothing into workspace files or the system prompt. Check live state with the tools:
|
|
431
308
|
|
|
432
|
-
|
|
433
|
-
|
|
309
|
+
- **Service unreachable:** any `meta_*` tool returns a connection error with troubleshooting guidance; see this skill's Bootstrapping section
|
|
310
|
+
- **No entities found:** `meta_list` returns an empty list; see this skill's Bootstrapping section
|
|
434
311
|
|
|
435
312
|
## Bootstrapping
|
|
436
313
|
|
|
@@ -438,8 +315,7 @@ discovery of configuration issues.
|
|
|
438
315
|
|
|
439
316
|
Before the synthesis engine can operate:
|
|
440
317
|
|
|
441
|
-
1. **OpenClaw gateway** must be running (the service spawns LLM sessions
|
|
442
|
-
through it via `gatewayUrl`)
|
|
318
|
+
1. **OpenClaw gateway** must be running (the service spawns LLM sessions through it via `gatewayUrl`)
|
|
443
319
|
- Verify: `openclaw gateway status` or check the URL in config
|
|
444
320
|
|
|
445
321
|
2. **jeeves-watcher** must be running and indexing data
|
|
@@ -451,8 +327,7 @@ Before the synthesis engine can operate:
|
|
|
451
327
|
|
|
452
328
|
4. **Config file** must exist at the path specified by `JEEVES_META_CONFIG`
|
|
453
329
|
- Must contain valid `watcherUrl`, `metaProperty`, and `metaArchiveProperty`
|
|
454
|
-
- Built-in architect and critic prompts ship with the package; no prompt
|
|
455
|
-
configuration is required
|
|
330
|
+
- Built-in architect and critic prompts ship with the package; no prompt configuration is required
|
|
456
331
|
|
|
457
332
|
5. **`.meta/` directories** must exist and be within paths the watcher indexes
|
|
458
333
|
- Seed new metas: `jeeves-meta seed <path>`
|
|
@@ -466,19 +341,21 @@ npm install -g @karmaniverous/jeeves-meta
|
|
|
466
341
|
jeeves-meta start --config J:\config\jeeves-meta\config.json
|
|
467
342
|
```
|
|
468
343
|
|
|
469
|
-
2. Install the OpenClaw plugin:
|
|
344
|
+
2. Install the OpenClaw plugin with the Jeeves CLI, which also writes the plugin config (`configRoot`, `apiUrl`):
|
|
470
345
|
|
|
471
346
|
```bash
|
|
472
|
-
|
|
347
|
+
jeeves install meta --config-root J:\config
|
|
473
348
|
```
|
|
474
349
|
|
|
475
|
-
|
|
476
|
-
|
|
350
|
+
Or install it directly with OpenClaw and configure it yourself:
|
|
351
|
+
|
|
352
|
+
```bash
|
|
353
|
+
openclaw plugins install npm:@karmaniverous/jeeves-meta-openclaw@<version> --pin --accept-capabilities
|
|
354
|
+
```
|
|
477
355
|
|
|
478
|
-
To uninstall: `
|
|
356
|
+
To uninstall: `jeeves uninstall` or `openclaw plugins uninstall jeeves-meta-openclaw`.
|
|
479
357
|
|
|
480
|
-
3. (
|
|
481
|
-
service runs on a non-default port or host:
|
|
358
|
+
3. Configure the plugin. `configRoot` (the platform config root) is needed by `meta_service` `install`; set it in plugin config or via the `JEEVES_CONFIG_ROOT` env var. The plugin loads without it and logs one warning. `apiUrl` is only needed if the service runs on a non-default port or host:
|
|
482
359
|
|
|
483
360
|
```json
|
|
484
361
|
{
|
|
@@ -487,7 +364,8 @@ To uninstall: `npx @karmaniverous/jeeves-meta-openclaw uninstall`
|
|
|
487
364
|
"jeeves-meta-openclaw": {
|
|
488
365
|
"enabled": true,
|
|
489
366
|
"config": {
|
|
490
|
-
"apiUrl": "http://127.0.0.1:1938"
|
|
367
|
+
"apiUrl": "http://127.0.0.1:1938",
|
|
368
|
+
"configRoot": "J:/config"
|
|
491
369
|
}
|
|
492
370
|
}
|
|
493
371
|
}
|
|
@@ -497,8 +375,7 @@ To uninstall: `npx @karmaniverous/jeeves-meta-openclaw uninstall`
|
|
|
497
375
|
|
|
498
376
|
4. Restart the OpenClaw gateway to load the plugin.
|
|
499
377
|
|
|
500
|
-
5. Verify:
|
|
501
|
-
`jeeves-meta` appears in available skills.
|
|
378
|
+
5. Verify: `meta_status` reports the service healthy and `jeeves-meta` appears in available skills.
|
|
502
379
|
|
|
503
380
|
### First Synthesis
|
|
504
381
|
|
|
@@ -517,11 +394,13 @@ jeeves-meta service install --config J:\config\jeeves-meta\config.json
|
|
|
517
394
|
```
|
|
518
395
|
|
|
519
396
|
This prints OS-specific instructions:
|
|
397
|
+
|
|
520
398
|
- **Windows:** NSSM service commands
|
|
521
399
|
- **macOS:** launchd plist
|
|
522
400
|
- **Linux:** systemd unit
|
|
523
401
|
|
|
524
402
|
Management commands (print OS-specific equivalents):
|
|
403
|
+
|
|
525
404
|
```bash
|
|
526
405
|
jeeves-meta service start # print start instructions
|
|
527
406
|
jeeves-meta service stop # print stop instructions
|
|
@@ -534,7 +413,7 @@ jeeves-meta service remove # print removal instructions
|
|
|
534
413
|
The service exposes these endpoints (default port 1938):
|
|
535
414
|
|
|
536
415
|
| Method | Path | Description |
|
|
537
|
-
|
|
416
|
+
| --- | --- | --- |
|
|
538
417
|
| GET | `/status` | Service health, queue state, dependency checks, phase-state summary |
|
|
539
418
|
| GET | `/metas` | List metas with filtering and field projection |
|
|
540
419
|
| GET | `/metas/:path` | Single meta detail with optional archive |
|
|
@@ -549,8 +428,7 @@ The service exposes these endpoints (default port 1938):
|
|
|
549
428
|
| GET | `/queue` | Queue state: current (with phase), overrides, automatic, pending |
|
|
550
429
|
| POST | `/queue/clear` | Remove all override queue entries |
|
|
551
430
|
|
|
552
|
-
All endpoints return JSON. The OpenClaw plugin tools are thin wrappers
|
|
553
|
-
around these endpoints.
|
|
431
|
+
All endpoints return JSON. The OpenClaw plugin tools are thin wrappers around these endpoints.
|
|
554
432
|
|
|
555
433
|
## Service CLI
|
|
556
434
|
|
|
@@ -560,143 +438,99 @@ The service package ships a CLI:
|
|
|
560
438
|
jeeves-meta <command> [options]
|
|
561
439
|
```
|
|
562
440
|
|
|
563
|
-
Commands: `start`, `status`, `list`, `detail`, `preview`, `synthesize`,
|
|
564
|
-
`seed`, `unlock`, `abort`, `prune`, `config`, `queue list|clear`,
|
|
565
|
-
`service install|start|stop|status|remove`.
|
|
441
|
+
Commands: `start`, `status`, `list`, `detail`, `preview`, `synthesize`, `seed`, `unlock`, `abort`, `prune`, `config`, `queue list|clear`, `service install|start|stop|status|remove`.
|
|
566
442
|
|
|
567
|
-
Config resolution: `--config` flag → `JEEVES_META_CONFIG` env var → error.
|
|
568
|
-
All client commands support `-p, --port` to specify the service port (default: 1938).
|
|
569
|
-
The `start` command uses `--config`/`-c` instead (port is read from the config file).
|
|
443
|
+
Config resolution: `--config` flag → `JEEVES_META_CONFIG` env var → error. All client commands support `-p, --port` to specify the service port (default: 1938). The `start` command uses `--config`/`-c` instead (port is read from the config file).
|
|
570
444
|
|
|
571
445
|
## Operational Monitoring
|
|
572
446
|
|
|
573
447
|
Recommended periodic checks:
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
- **Failed phases:**
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
- **
|
|
580
|
-
|
|
581
|
-
- **
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
counts per phase (`fresh`, `stale`, `pending`, `running`, `failed`) and
|
|
585
|
-
`nextPhase` showing the next candidate.
|
|
586
|
-
- **Service health:** `/status` endpoint (via `meta_list` summary or direct
|
|
587
|
-
HTTP) includes dependency status for watcher and gateway
|
|
588
|
-
|
|
589
|
-
The TOOLS.md injection surfaces the most critical stats (entity count, errors,
|
|
590
|
-
stalest entity, phase summary, failed-phase alerts, next-phase indicator) in
|
|
591
|
-
the agent's system prompt automatically.
|
|
448
|
+
|
|
449
|
+
- **Errors:** `meta_list` with `filter: { hasError: true }` — investigate and retry with `meta_trigger`
|
|
450
|
+
- **Failed phases:** `/status` (`meta_status`) reports failed phases in `phaseStateSummary`. Failed phases auto-retry on the next scheduler tick. Use `meta_detail` to inspect the `_phaseState` and `_error` fields.
|
|
451
|
+
- **Stuck locks:** `meta_list` with `filter: { locked: true }` — locks older than 30 minutes indicate a crashed synthesis; use `jeeves-meta unlock`
|
|
452
|
+
- **Stale knowledge:** `meta_list` with `filter: { staleHours: 48 }` — check if the scheduler is running and the watcher is up
|
|
453
|
+
- **Phase health:** `/status` includes `phaseStateSummary` with aggregate counts per phase (`fresh`, `stale`, `pending`, `running`, `failed`) and `nextPhase` showing the next candidate.
|
|
454
|
+
- **Meta counts:** `/status` includes `health.metaCounts` with totals: `total`, `enabled`, `disabled`, `neverSynthesized`, `stale`, `errors`, and `locked`.
|
|
455
|
+
- **Service health:** `/status` endpoint (via `meta_list` summary or direct HTTP) includes dependency status for watcher and gateway
|
|
456
|
+
|
|
457
|
+
The plugin no longer injects these stats into the system prompt; call `meta_status` and `meta_list` when you need them.
|
|
592
458
|
|
|
593
459
|
## Troubleshooting
|
|
594
460
|
|
|
595
461
|
### Service unreachable
|
|
596
462
|
|
|
597
|
-
**Symptom:**
|
|
598
|
-
|
|
599
|
-
**Fix:**
|
|
463
|
+
**Symptom:** `meta_*` tools return a connection error for the meta service **Cause:** Meta service not running or wrong `apiUrl` in plugin config **Fix:**
|
|
464
|
+
|
|
600
465
|
1. Check if the service is running: `jeeves-meta service status` or `curl http://localhost:1938/status`
|
|
601
466
|
2. If down, start it: `jeeves-meta service start` or `jeeves-meta start --config <path>`
|
|
602
467
|
3. If running on a different port, update `apiUrl` in plugin config
|
|
603
468
|
|
|
469
|
+
### configRoot not configured
|
|
470
|
+
|
|
471
|
+
**Symptom:** `meta_service` `install` returns "configRoot not configured", or the gateway log shows "[jeeves-meta] configRoot not configured yet" **Cause:** The plugin was loaded before its config was written (normal right after `openclaw plugins install`), or no config root is set **Fix:** Set `plugins.entries.jeeves-meta-openclaw.config.configRoot` (e.g. via `jeeves install --config-root <path>`) or the `JEEVES_CONFIG_ROOT` env var. The other `meta_service` actions and all other `meta_*` tools do not read `configRoot` and keep working.
|
|
472
|
+
|
|
604
473
|
### Watcher unreachable
|
|
605
474
|
|
|
606
|
-
**Symptom:**
|
|
607
|
-
|
|
608
|
-
**Fix:**
|
|
475
|
+
**Symptom:** `meta_status` reports the watcher dependency as unreachable **Cause:** Watcher service not running or wrong URL in meta service config **Fix:**
|
|
476
|
+
|
|
609
477
|
1. Check watcher status: `watcher_status` tool or `curl http://localhost:1936/status`
|
|
610
478
|
2. If down, start the watcher service
|
|
611
479
|
3. If running on a different port, update `watcherUrl` in meta service config and restart the service
|
|
612
480
|
|
|
613
481
|
### No entities discovered
|
|
614
482
|
|
|
615
|
-
**Symptom:** `meta_list` returns empty
|
|
616
|
-
|
|
617
|
-
**Fix:**
|
|
483
|
+
**Symptom:** `meta_list` returns empty **Cause:** No `.meta/meta.json` files indexed, or `metaProperty` mismatch **Fix:**
|
|
484
|
+
|
|
618
485
|
1. Verify `.meta/meta.json` files exist on disk
|
|
619
|
-
2. Check that the watcher indexes those paths (paths must be in watcher's
|
|
620
|
-
|
|
621
|
-
3. Check that `metaProperty` in config matches the properties actually set
|
|
622
|
-
on indexed points. If you changed `metaProperty`, run `watcher_reindex`
|
|
623
|
-
with scope `rules` and restart the meta service.
|
|
486
|
+
2. Check that the watcher indexes those paths (paths must be in watcher's configured `watch` globs)
|
|
487
|
+
3. Check that `metaProperty` in config matches the properties actually set on indexed points. If you changed `metaProperty`, run `watcher_reindex` with scope `rules` and restart the meta service.
|
|
624
488
|
4. Seed new metas if needed: `jeeves-meta seed <path>`
|
|
625
489
|
|
|
626
490
|
### Synthesis stuck (locked entities)
|
|
627
491
|
|
|
628
|
-
**Symptom:** `meta_list` shows locked entities that never unlock
|
|
629
|
-
|
|
630
|
-
**Fix:**
|
|
492
|
+
**Symptom:** `meta_list` shows locked entities that never unlock **Cause:** Previous synthesis crashed, leaving stale `.lock` file **Fix:**
|
|
493
|
+
|
|
631
494
|
1. Check lock: `meta_detail <path>` — look for `locked: true`
|
|
632
495
|
2. Locks auto-expire after 30 minutes
|
|
633
|
-
3. For immediate unlock: `jeeves-meta unlock <path>`
|
|
634
|
-
or delete `.meta/.lock` file manually
|
|
496
|
+
3. For immediate unlock: `jeeves-meta unlock <path>` or delete `.meta/.lock` file manually
|
|
635
497
|
|
|
636
498
|
### Executor timeouts
|
|
637
499
|
|
|
638
|
-
**Symptom:** `meta_detail` shows `_error` with code `TIMEOUT`
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
builder wrote partial output with an advanced `_state`, the state is saved
|
|
642
|
-
(preserving existing content) and the error is recorded. This means
|
|
643
|
-
progressive work is not lost on timeout — only the content update is skipped.
|
|
644
|
-
**Fix:**
|
|
645
|
-
1. Check if `_state` advanced (partial recovery succeeded) — subsequent
|
|
646
|
-
cycles can continue from where the builder left off
|
|
500
|
+
**Symptom:** `meta_detail` shows `_error` with code `TIMEOUT` **Cause:** Subprocess took longer than configured timeout **Note:** The engine attempts partial recovery on builder timeouts. If the builder wrote partial output with an advanced `_state`, the state is saved (preserving existing content) and the error is recorded. This means progressive work is not lost on timeout — only the content update is skipped. **Fix:**
|
|
501
|
+
|
|
502
|
+
1. Check if `_state` advanced (partial recovery succeeded) — subsequent cycles can continue from where the builder left off
|
|
647
503
|
2. Check the gateway's `agents.defaults.subagents.runTimeoutSeconds` setting and increase it if needed
|
|
648
504
|
3. Check if the LLM provider is slow or rate-limited
|
|
649
505
|
4. Check scope size: large scopes with many files take longer
|
|
650
506
|
|
|
651
507
|
### LLM errors in synthesis phases
|
|
652
508
|
|
|
653
|
-
**Symptom:** `meta_detail` shows `_error` field with step/code/message, and
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
**
|
|
657
|
-
|
|
658
|
-
which phase failed; `_phaseState` shows the exact state of each phase
|
|
659
|
-
2. Failed phases are **automatically retried** on the next scheduler tick
|
|
660
|
-
(promoted from `failed` → `pending`). Only the failed phase reruns —
|
|
661
|
-
other phases are untouched (surgical retry).
|
|
662
|
-
3. Architect failure with existing `_builder`: engine reuses cached brief
|
|
663
|
-
(self-healing)
|
|
509
|
+
**Symptom:** `meta_detail` shows `_error` field with step/code/message, and `_phaseState` shows `failed` for one or more phases. **Cause:** Subprocess failed (API error, malformed output, rate limit) **Fix:**
|
|
510
|
+
|
|
511
|
+
1. Check error details: `meta_detail <path>` — `_error.step` tells you which phase failed; `_phaseState` shows the exact state of each phase
|
|
512
|
+
2. Failed phases are **automatically retried** on the next scheduler tick (promoted from `failed` → `pending`). Only the failed phase reruns — other phases are untouched (surgical retry).
|
|
513
|
+
3. Architect failure with existing `_builder`: engine reuses cached brief (self-healing)
|
|
664
514
|
4. Architect failure without `_builder` (first run): retry with `meta_trigger`
|
|
665
515
|
5. Builder failure: meta stays stale, retried next tick automatically
|
|
666
516
|
6. Critic failure: content saved without feedback, not critical
|
|
667
517
|
|
|
668
518
|
### Discovery returns wrong/stale results
|
|
669
519
|
|
|
670
|
-
**Symptom:** `meta_list` shows old metas or misses new ones
|
|
671
|
-
|
|
672
|
-
not yet indexed new files
|
|
673
|
-
**Fix:**
|
|
520
|
+
**Symptom:** `meta_list` shows old metas or misses new ones **Cause:** Virtual rules not re-registered after config change, or watcher not yet indexed new files **Fix:**
|
|
521
|
+
|
|
674
522
|
1. If `metaProperty` changed: restart meta service + `watcher_reindex` (scope: rules)
|
|
675
|
-
2. If new `.meta/` directory: wait for chokidar detection (seconds) or
|
|
676
|
-
|
|
677
|
-
3. Verify with `watcher_scan`: query for the expected properties to confirm
|
|
678
|
-
the watcher has the right metadata on the points
|
|
523
|
+
2. If new `.meta/` directory: wait for chokidar detection (seconds) or trigger `watcher_reindex` (scope: full)
|
|
524
|
+
3. Verify with `watcher_scan`: query for the expected properties to confirm the watcher has the right metadata on the points
|
|
679
525
|
|
|
680
526
|
## Gotchas
|
|
681
527
|
|
|
682
|
-
- `meta_trigger` enqueues a single phase (not all three). A full cycle
|
|
683
|
-
requires three separate ticks (one per phase). Use `meta_detail` to
|
|
684
|
-
check `_phaseState` for progress.
|
|
528
|
+
- `meta_trigger` enqueues a single phase (not all three). A full cycle requires three separate ticks (one per phase). Use `meta_detail` to check `_phaseState` for progress.
|
|
685
529
|
- A locked meta (another synthesis in progress) will be skipped silently.
|
|
686
530
|
- First-run quality is lower — the feedback loop needs 2-3 cycles to calibrate.
|
|
687
|
-
- Changing `metaProperty` requires both a meta service restart AND a watcher reindex.
|
|
688
|
-
|
|
689
|
-
-
|
|
690
|
-
|
|
691
|
-
-
|
|
692
|
-
|
|
693
|
-
template variable resolution. Escape with `\{{` for literal double-braces.
|
|
694
|
-
- The synthesis queue is single-threaded with three layers: `current` (the
|
|
695
|
-
running phase), `overrides` (explicitly triggered entries, highest priority),
|
|
696
|
-
and `automatic` (scheduler-computed candidates). Override entries are
|
|
697
|
-
processed before automatic candidates.
|
|
698
|
-
- The scheduler uses adaptive backoff: if no stale candidates are found, it
|
|
699
|
-
doubles the skip interval (max 4×). Backoff resets after any successful
|
|
700
|
-
phase execution (not just full-cycle completion).
|
|
701
|
-
- All CLI commands except `start` require the service to be running (they call
|
|
702
|
-
the HTTP API).
|
|
531
|
+
- Changing `metaProperty` requires both a meta service restart AND a watcher reindex. The service restart re-registers virtual rules; the reindex retags existing points.
|
|
532
|
+
- Built-in architect and critic prompts ship with the package and cannot be overridden via config.
|
|
533
|
+
- All prompts (built-in and per-meta `_architect`/`_critic`) are compiled as Handlebars templates. Avoid using `{{` in prompt text unless you intend template variable resolution. Escape with `\{{` for literal double-braces.
|
|
534
|
+
- The synthesis queue is single-threaded with three layers: `current` (the running phase), `overrides` (explicitly triggered entries, highest priority), and `automatic` (scheduler-computed candidates). Override entries are processed before automatic candidates.
|
|
535
|
+
- The scheduler uses adaptive backoff: if no stale candidates are found, it doubles the skip interval (max 4×). Backoff resets after any successful phase execution (not just full-cycle completion).
|
|
536
|
+
- All CLI commands except `start` require the service to be running (they call the HTTP API).
|