@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.
@@ -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
- List all `.meta/` directories with summary stats and per-meta projection.
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
- Full detail for a single meta, with optional archive history. Includes
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
- Dry-run for the next synthesis candidate. Shows scope files, delta files,
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
- - `path` (optional): Specific `.meta/` or owner directory path. If omitted,
60
- previews the stalest candidate.
46
+
47
+ - `path` (optional): Specific `.meta/` or owner directory path. If omitted, previews the stalest candidate.
61
48
 
62
49
  ### meta_trigger
63
- Enqueue a synthesis for a specific meta or the next-stalest candidate.
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
- - `path` (optional): Specific `.meta/` or owner directory path. If omitted,
71
- synthesizes the stalest candidate.
54
+
55
+ - `path` (optional): Specific `.meta/` or owner directory path. If omitted, synthesizes the stalest candidate.
72
56
 
73
57
  ### meta_seed
74
- Create a new `.meta/` directory with a skeleton `meta.json` (containing a
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
- (e.g. `'["j:/path/a","j:/path/b"]'`). Written as `_crossRefs` in the
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
- Remove a stale `.lock` file from a meta entity. Locks are created during
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
- Query the running service configuration. Supports optional JSONPath
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
- - `path` (optional): JSONPath expression (e.g. `$.schedule`). If omitted,
102
- returns the full sanitized config.
80
+
81
+ - `path` (optional): JSONPath expression (e.g. `$.schedule`). If omitted, returns the full sanitized config.
103
82
 
104
83
  ### meta_update
105
- Update user-settable reserved properties on a meta entity. Use this to
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
- Queue management: list pending items, clear the queue, or abort current
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
- synthesis focus. The only field humans typically write.
157
- - **Cross-references (`_crossRefs`):** Optional array of owner paths pointing
158
- to other metas. Referenced metas' `_content` is included as context for
159
- the architect and builder steps (not the critic). Enables organizational
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
- value in its output JSON. This state is persisted in `meta.json` and passed
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
- file paths (`**/.meta/meta.json` and `**/.meta/archive/*.json`) and apply
234
- the configured `metaProperty`/`metaArchiveProperty` values as watcher
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
- 2. **Discovers metas** via `watcher.walk(["**/.meta/meta.json"])` — a filesystem
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
- 3. **Deduplicates** results by `.meta/` directory path and builds the
243
- ownership tree.
170
+ **Important:** If you change `metaProperty` or `metaArchiveProperty` in config, you must:
244
171
 
245
- **Important:** If you change `metaProperty` or `metaArchiveProperty` in config,
246
- you must:
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
- with a UUID (`_id`). All other fields are populated on first synthesis
319
- 3. Optionally edit `meta.json` to set `_steer`, `_depth`, `_emphasis`,
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
- { "match": "<glob>", "steer": "<optional>", "crossRefs": ["<optional>"], "parentDepth": 0 }
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
- The watcher walks all watched paths matching this glob and returns file
341
- paths. Parent directories of matched files become seed candidates.
342
- - **`steer`** (optional) — steering prompt written as `_steer` in the
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
- - Auto-seed runs at the start of each scheduler tick, before candidate
353
- discovery. Directories that already have a `.meta/` subdirectory are
354
- skipped.
355
- - Empty directories (no files matching any glob) will not be seeded — the
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
- ### TOOLS.md Bootstrapping Prompts
305
+ ### Bootstrapping Signals
424
306
 
425
- The plugin's TOOLS.md injection automatically prompts bootstrapping:
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
- These messages appear in the agent's system prompt, ensuring proactive
433
- discovery of configuration issues.
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
- npx @karmaniverous/jeeves-meta-openclaw install
347
+ jeeves install meta --config-root J:\config
473
348
  ```
474
349
 
475
- For non-default OpenClaw installations, set `OPENCLAW_CONFIG` (path to
476
- `openclaw.json`) or `OPENCLAW_HOME` (path to `.openclaw` directory).
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: `npx @karmaniverous/jeeves-meta-openclaw uninstall`
356
+ To uninstall: `jeeves uninstall` or `openclaw plugins uninstall jeeves-meta-openclaw`.
479
357
 
480
- 3. (Optional) Configure the plugin with the service URL — only needed if the
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: check that `## Meta` appears in TOOLS.md injection and
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
- - **Errors:** `meta_list` with `filter: { hasError: true }` — investigate
575
- and retry with `meta_trigger`
576
- - **Failed phases:** The TOOLS.md injection shows a "Failed:" alert listing
577
- metas with failed phases. Failed phases auto-retry on the next scheduler
578
- tick. Use `meta_detail` to inspect the `_phaseState` and `_error` fields.
579
- - **Stuck locks:** `meta_list` with `filter: { locked: true }` — locks
580
- older than 30 minutes indicate a crashed synthesis; use `jeeves-meta unlock`
581
- - **Stale knowledge:** `meta_list` with `filter: { staleHours: 48 }` — check
582
- if the scheduler is running and the watcher is up
583
- - **Phase health:** `/status` includes `phaseStateSummary` with aggregate
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:** TOOLS.md shows "ACTION REQUIRED: jeeves-meta service is unreachable"
598
- **Cause:** Meta service not running or wrong `apiUrl` in plugin config
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:** TOOLS.md shows a ⚠️ **Watcher** dependency warning in the entity summary
607
- **Cause:** Watcher service not running or wrong URL in meta service config
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, TOOLS.md shows "No synthesis entities found"
616
- **Cause:** No `.meta/meta.json` files indexed, or `metaProperty` mismatch
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
- configured `watch` globs)
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
- **Cause:** Previous synthesis crashed, leaving stale `.lock` file
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
- **Cause:** Subprocess took longer than configured timeout
640
- **Note:** The engine attempts partial recovery on builder timeouts. If the
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
- `_phaseState` shows `failed` for one or more phases.
655
- **Cause:** Subprocess failed (API error, malformed output, rate limit)
656
- **Fix:**
657
- 1. Check error details: `meta_detail <path>` — `_error.step` tells you
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
- **Cause:** Virtual rules not re-registered after config change, or watcher
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
- trigger `watcher_reindex` (scope: full)
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
- The service restart re-registers virtual rules; the reindex retags existing points.
689
- - Built-in architect and critic prompts ship with the package and cannot be
690
- overridden via config.
691
- - All prompts (built-in and per-meta `_architect`/`_critic`) are compiled as
692
- Handlebars templates. Avoid using `{{` in prompt text unless you intend
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).