woods 2.0.0.beta3 → 2.0.0.beta4

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.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +77 -0
  3. data/CONTRIBUTING.md +29 -17
  4. data/README.md +92 -177
  5. data/docs/AGENT_GUIDE.md +26 -4
  6. data/docs/AGENT_SETUP.md +18 -8
  7. data/docs/BACKEND_MATRIX.md +5 -0
  8. data/docs/CONFIGURATION_REFERENCE.md +74 -8
  9. data/docs/CONSOLE_MCP_SETUP.md +45 -2
  10. data/docs/DOCKER_SETUP.md +1 -1
  11. data/docs/EXTRACTOR_REFERENCE.md +9 -1
  12. data/docs/INCREMENTAL_EXTRACTION.md +30 -6
  13. data/docs/MCP_SERVERS.md +57 -2
  14. data/docs/MCP_TOOL_COOKBOOK.md +4 -4
  15. data/docs/MCP_WORKTREE_SETUP.md +43 -83
  16. data/docs/PUBLISHED_INDEX.md +17 -0
  17. data/docs/RETRIEVAL_GUIDE.md +24 -5
  18. data/docs/TROUBLESHOOTING.md +12 -13
  19. data/docs/UPGRADING_TO_2.md +6 -2
  20. data/docs/WATCH_DAEMON.md +18 -8
  21. data/exe/woods-mcp-start +14 -9
  22. data/lib/generators/woods/pgvector_generator.rb +8 -2
  23. data/lib/woods/agent_configuration/applier.rb +5 -3
  24. data/lib/woods/agent_configuration/cli.rb +2 -2
  25. data/lib/woods/agent_configuration/layout.rb +13 -0
  26. data/lib/woods/console/credential_scanner.rb +4 -3
  27. data/lib/woods/console/dispatch_pipeline.rb +7 -0
  28. data/lib/woods/console/embedded_executor.rb +31 -9
  29. data/lib/woods/console/sql_noise_stripper.rb +9 -7
  30. data/lib/woods/console/sql_table_scanner.rb +47 -7
  31. data/lib/woods/console/sql_validator.rb +49 -9
  32. data/lib/woods/console/sqlite_read_guard.rb +46 -0
  33. data/lib/woods/coordination/pipeline_lock.rb +3 -2
  34. data/lib/woods/embedding/indexer.rb +24 -14
  35. data/lib/woods/extractor.rb +45 -12
  36. data/lib/woods/extractors/declared_parent.rb +55 -0
  37. data/lib/woods/extractors/graphql_extractor.rb +2 -11
  38. data/lib/woods/extractors/lib_extractor.rb +10 -8
  39. data/lib/woods/extractors/mailer_extractor.rb +6 -10
  40. data/lib/woods/extractors/model_extractor.rb +1 -15
  41. data/lib/woods/extractors/poro_extractor.rb +10 -8
  42. data/lib/woods/extractors/shared_utility_methods.rb +22 -5
  43. data/lib/woods/mcp/bearer_auth.rb +2 -1
  44. data/lib/woods/mcp/bootstrapper.rb +17 -4
  45. data/lib/woods/mcp/config_resolver.rb +2 -1
  46. data/lib/woods/mcp/index_reader.rb +11 -2
  47. data/lib/woods/mcp/renderers/markdown_renderer.rb +14 -8
  48. data/lib/woods/mcp/renderers/plain_renderer.rb +11 -7
  49. data/lib/woods/mcp/server.rb +22 -28
  50. data/lib/woods/mcp/tool_contract.rb +1 -1
  51. data/lib/woods/mcp/tool_response_renderer.rb +16 -0
  52. data/lib/woods/mcp/traversal_evidence_text.rb +1 -1
  53. data/lib/woods/mcp/traversal_response.rb +22 -0
  54. data/lib/woods/path_dispatcher.rb +6 -5
  55. data/lib/woods/published_index/typed_unit_reader.rb +40 -3
  56. data/lib/woods/published_index.rb +2 -2
  57. data/lib/woods/rake_helpers.rb +2 -12
  58. data/lib/woods/retrieval/lexical_assembler.rb +14 -3
  59. data/lib/woods/retrieval/lexical_index.rb +2 -1
  60. data/lib/woods/session_tracer/file_store.rb +6 -1
  61. data/lib/woods/source_inputs/consumer_errors.rb +4 -0
  62. data/lib/woods/storage/pgvector.rb +6 -2
  63. data/lib/woods/temporal/json_snapshot_store.rb +35 -7
  64. data/lib/woods/version.rb +1 -1
  65. data/lib/woods/watch/daemon.rb +18 -4
  66. data/plugin/.claude-plugin/plugin.json +1 -1
  67. data/plugin/hooks/woods-input-rules.sh +4 -4
  68. data/plugin/skills/woods-agent-enable/SKILL.md +7 -1
  69. data/plugin/skills/woods-diagnose/SKILL.md +64 -33
  70. data/plugin/skills/woods-investigate/SKILL.md +51 -12
  71. data/plugin/skills/woods-mcp-config/SKILL.md +11 -11
  72. data/plugin/skills/woods-setup/SKILL.md +14 -11
  73. metadata +8 -5
@@ -16,7 +16,7 @@ This skill describes the Woods 2.x line; the authoritative minimum version lives
16
16
 
17
17
  ## Managed configuration availability
18
18
 
19
- `woods-agent-config` (#407) is unreleased after `2.0.0.beta2`. First record the
19
+ `woods-agent-config` (#407) is available in Woods `2.0.0.beta3`. First record the
20
20
  installed version and test `bundle exec woods-agent-config --help` in the
21
21
  selected application bundle. When supported, use its saved setup/update/remove
22
22
  plan and explicit client/scope/root selection; apply the reviewed plan within
@@ -46,9 +46,22 @@ For versions documenting environment-boot snapshots, confirm that the command is
46
46
  `bundle exec rake woods:watch`, with no preceding `environment` task, and check
47
47
  whether boot inputs keep changing during initialization or catch-up.
48
48
 
49
+ ### Watch retains facts from an initializer deleted while stopped
50
+
51
+ Record the installed revision. Unreleased after `2.0.0.beta3`, startup preserves
52
+ registered deleted boot inputs as full-extraction obligations. On earlier builds,
53
+ stop watch, run a successful full extraction in a fresh process, then restart
54
+ standalone `woods:watch`. See the installed version's watch guide.
55
+
56
+ ### A cleaned index directory still exists
57
+
58
+ Unreleased after `2.0.0.beta3`, `woods:clean` retains the output directory and
59
+ hidden extraction guard for concurrent writer coordination. Verify published
60
+ artifacts are gone; do not remove that guard while writers may be running.
61
+
49
62
  ### Watch misses edits under a shared directory alias
50
63
 
51
- Check the installed version: logical alias preservation (#445) is unreleased.
64
+ Check the installed version: logical alias preservation (#445) is available in Woods `2.0.0.beta3`.
52
65
  Older polling/catch-up walkers could visit an irrelevant alias first and suppress
53
66
  `app/models` when both point to the same physical directory. Compare the logical
54
67
  path with the extraction input path; a running daemon alone does not prove coverage.
@@ -58,8 +71,8 @@ See the installed version's watch guide before assuming this behavior.
58
71
 
59
72
  ### Session trace reports ambiguous identity
60
73
 
61
- The `session_trace` `ambiguous_identity` error (#213) is unreleased after
62
- `2.0.0.beta2`; check the installed gem before expecting it. It names a dependency
74
+ The `session_trace` `ambiguous_identity` error (#213) is available in Woods `2.0.0.beta3`;
75
+ check the installed gem before expecting it. It names a dependency
63
76
  with multiple published extraction types, so no partial session context is
64
77
  returned. Use `depth: 0` for the timeline or inspect the named candidates with
65
78
  explicit `lookup` types. Do not choose one by index order or suggest that a full
@@ -72,7 +85,7 @@ For a `same-type identifier collision`, inspect both named source files and the
72
85
  Rails loader before suggesting source edits. Wrapper-nested class naming needs
73
86
  Zeitwerk mode and Zeitwerk >= 2.6.9; an older loader or classic mode can produce
74
87
  the collision even when the namespace wrappers are valid. The expanded error
75
- guidance (B-149) is unreleased after `2.0.0.beta2`; check the installed version
88
+ guidance (B-149) is available in Woods `2.0.0.beta3`; check the installed version
76
89
  first. Follow the [loader compatibility guidance](https://github.com/lost-in-the/woods/blob/main/docs/UPGRADING_TO_2.md#check-the-loader-for-wrapper-nested-classes).
77
90
 
78
91
  ```bash
@@ -82,7 +95,7 @@ bin/rails woods:stats
82
95
 
83
96
  If missing or stale, run the narrow maintenance path justified by the evidence: `woods:incremental` for known file changes or `woods:extract` for first run, broad change, upgrade, or drift. Woods tasks understand `generation.json`; do not assume `manifest.json` is at the root.
84
97
 
85
- Semantic graph validation (#413) is unreleased after `2.0.0.beta2`; verify the
98
+ Semantic graph validation (#413) is available in Woods `2.0.0.beta3`; verify the
86
99
  installed gem before expecting these errors. Supporting versions check typed
87
100
  unit identity, graph/index agreement and forward/reverse/file/type memberships
88
101
  within one pinned generation. Preserve the failing generation and exact error,
@@ -95,7 +108,7 @@ an external name from an internal unit omitted everywhere. Follow the
95
108
 
96
109
  If external targets such as `http_api` lose dependents after incremental
97
110
  extraction, check whether the installed Woods version includes B-193.
98
- The fix is unreleased; installing this plugin does not upgrade the gem.
111
+ The fix is available in Woods `2.0.0.beta3`; installing this plugin does not upgrade the gem.
99
112
  Affected indexes need one full extraction after upgrading to a fixed version.
100
113
  Follow the [recovery guide](https://github.com/lost-in-the/woods/blob/main/docs/TROUBLESHOOTING.md#external-dependency-targets-lose-dependents-after-incremental-extraction).
101
114
 
@@ -107,7 +120,7 @@ Confirm the installed release and filesystem support retention locks before
107
120
  using the pinning examples; flat layouts need writers stopped for a consistent copy.
108
121
 
109
122
  A host reader can report a container daemon dead because foreign-host records
110
- are rejected by default. Foreign heartbeat trust (#321) is unreleased: first
123
+ are rejected by default. Foreign heartbeat trust (#321) is available in Woods `2.0.0.beta3`: first
111
124
  check the installed Woods version and that version's release notes. Only for a
112
125
  supporting version, offer `WOODS_WATCH_TRUST_FOREIGN_HOST=1` in every relevant
113
126
  task/MCP reader and follow [cross-host liveness](https://github.com/lost-in-the/woods/blob/main/docs/WATCH_DAEMON.md#cross-host-liveness).
@@ -115,12 +128,18 @@ Fresh `degraded` still means incremental work is needed; a fresh `running`
115
128
  record can outlive a crashed foreign daemon by up to 15 minutes. Older versions
116
129
  need their status check run in the daemon's own container.
117
130
 
118
- Writer-version provenance (#323) is unreleased: verify the installed gem version's
119
- release notes before expecting it. If `index.woods_version` exists, compare it
131
+ Writer-version provenance (#323) is available in Woods `2.0.0.beta3`: verify the installed
132
+ gem version's release notes before expecting it. If `index.woods_version` exists, compare it
120
133
  with `server.version`; missing/null is unknown, not a failure. A validator
121
134
  major-version warning calls for full extraction and upgrade review, while a match
122
135
  does not certify retained units were migrated. See [writer provenance](https://github.com/lost-in-the/woods/blob/main/docs/PUBLISHED_INDEX.md#manifest-writer-provenance).
123
136
 
137
+ Unreleased after `2.0.0.beta3`: incremental/refresh handled source errors keep
138
+ the previous generation active and leave watch batches pending. Repair the
139
+ logged source error and retry the complete batch; see
140
+ [handled source errors](https://github.com/lost-in-the/woods/blob/main/docs/INCREMENTAL_EXTRACTION.md#handled-source-errors-and-retry).
141
+ Check the installed revision before relying on this behavior.
142
+
124
143
  If a one-shot extraction raises `Could not publish generation`, the candidate
125
144
  payload was written but never made visible; readers still serve the previous
126
145
  complete generation. Fix the named filesystem, permission, space, or mount
@@ -139,12 +158,12 @@ tracks current source.
139
158
  For volatile-dependency reports dominated by one target, compare the full
140
159
  `stats.volatile_dependency_count` with the persisted array and use the
141
160
  [ratio tuning guidance](https://github.com/lost-in-the/woods/blob/main/docs/CONFIGURATION_REFERENCE.md#pipeline-options).
142
- The optional per-target cap (B-188) is unreleased after 2.0.0.beta2; check the
161
+ The optional per-target cap (B-188) is available in Woods `2.0.0.beta3`; check the
143
162
  installed gem before suggesting `volatile_dependency_limit_per_target`.
144
163
  Re-extract to publish configuration changes; the report remains informational.
145
164
 
146
165
  For a shallow-checkout git-enrichment warning, the shallow guard (B-189) is
147
- unreleased after `2.0.0.beta2`; check the installed version first. Fetch complete
166
+ available in Woods `2.0.0.beta3`; check the installed version first. Fetch complete
148
167
  history with `git fetch --unshallow` or `actions/checkout` `fetch-depth: 0`, then
149
168
  run full extraction. Depth two only enables a two-commit diff; it does not
150
169
  restore complete churn history. See the
@@ -152,7 +171,7 @@ restore complete churn history. See the
152
171
 
153
172
  For `Git enrichment omitted: history could not be read completely`, first check
154
173
  whether the installed Woods release documents the new streamed-history policy;
155
- it is unreleased after 2.0.0.beta2. Supporting versions require Git 2.31 or newer.
174
+ it is available in Woods `2.0.0.beta3`. Supporting versions require Git 2.31 or newer.
156
175
  Check `git --version` in the extraction container and repository/object-store
157
176
  access with its `WOODS_GIT_DIR` setting. A failed history stream is discarded;
158
177
  repair git access and run full extraction to refresh retained metadata. See the
@@ -162,14 +181,14 @@ After a bundle change or removal of a dynamically defined job, incremental
162
181
  extraction can retain stale runtime units. Use a fresh process with the updated
163
182
  bundle for full extraction, then validate. For missing external gem paths,
164
183
  first distinguish an upgraded bundle from a reader on a different host/mount.
165
- The more explicit `woods:validate` bundle-update remedy (B-166) is unreleased
166
- after `2.0.0.beta2`; the full-extraction recovery works on older versions too.
184
+ The more explicit `woods:validate` bundle-update remedy (B-166) is available in Woods
185
+ `2.0.0.beta3`; the full-extraction recovery works on older versions too.
167
186
  See [runtime removals and bundle updates](https://github.com/lost-in-the/woods/blob/main/docs/INCREMENTAL_EXTRACTION.md#runtime-removals-and-bundle-updates).
168
187
 
169
188
  ### Export identity checks
170
189
 
171
- For Notion or Unblocked exports, typed selection checks (#213) are unreleased
172
- after `2.0.0.beta2`; check the installed gem before expecting them. A missing or
190
+ For Notion or Unblocked exports, typed selection checks (#213) are available in Woods
191
+ `2.0.0.beta3`; check the installed gem before expecting them. A missing or
173
192
  mismatched export identity calls for index validation and a fresh extraction,
174
193
  not a force flag. An `ambiguous export URI` means two types share an identifier
175
194
  and source file: preserve existing documents and report the collision; do not
@@ -186,26 +205,35 @@ Compare the client config with the exact command, absolute `cwd`, bundle, and in
186
205
  bundle exec woods-mcp-start ./tmp/woods
187
206
  ```
188
207
 
208
+ If startup says `Could not resolve a published Woods index` (unreleased after
209
+ `2.0.0.beta3`) or names a missing `manifest.json` on older versions, first check
210
+ the selected index path: an atomic index uses `generation.json` to locate its
211
+ payload manifest. The new headline does not change index validation or recovery.
212
+ Point at an existing index before suggesting a new extraction. Prefer the
213
+ explicit path above; `WOODS_DIR` is also supported. An unreleased change after
214
+ `2.0.0.beta3` adds `WOODS_OUTPUT` after those two choices, so verify the installed
215
+ version's configuration guide before relying on that fallback.
216
+
189
217
  Then reconnect through the MCP client and call `woods_status`. Use client-native tool inspection after initialization. Expect 14 packaged Index tools, not all conditional schemas.
190
218
 
191
219
  For Docker-only bundles, test the configured container command instead, for example `docker compose exec -T app bundle exec woods-mcp /app/tmp/woods`. Use the container path for a container process and a host path only for a host process.
192
220
 
193
221
  For corrupt pipeline cooldown state, first confirm this is a custom server
194
222
  with `pipeline_repair` registered; packaged `woods-mcp` does not wire it.
195
- Recovery through `reset_cooldowns` (B-159) is unreleased after `2.0.0.beta2`.
223
+ Recovery through `reset_cooldowns` (B-159) is available in Woods `2.0.0.beta3`.
196
224
  Check the installed version before attempting it and follow the
197
225
  [corrupt cooldown recovery guide](https://github.com/lost-in-the/woods/blob/main/docs/TROUBLESHOOTING.md#corrupt-pipeline-cooldown-state).
198
226
 
199
227
  ## Deferred refresh hooks
200
228
 
201
- Expanded hook coverage and `woods:hook_refresh` (#408) are unreleased after
202
- Woods 2.0.0.beta2. Verify the installed task through the configured host/container
229
+ Expanded hook coverage and `woods:hook_refresh` (#408) are available in Woods
230
+ `2.0.0.beta3`. Verify the installed task through the configured host/container
203
231
  command before diagnosing this plugin's queue. Read `<output>/hook.log` and
204
232
  `hook-pending/`; status 75 means an active daemon deferred work, not that it was
205
233
  consumed. Fix task availability, boot/publication failures or a stalled command,
206
234
  then retry with the same output and command prefix. Preserve pending events.
207
235
  For mkdir fallback locks, inspect the recorded owner PID before manual removal.
208
- The concurrent dead-owner recovery fix is unreleased after plugin 2.3.35.
236
+ The concurrent dead-owner recovery fix is included in plugin `2.3.36`.
209
237
  If competing hooks leave an empty lock without a drain, preserve the queued
210
238
  events and follow the canonical recovery guide below.
211
239
  A Docker timeout does not prove the application process stopped. Prefer a
@@ -214,8 +242,8 @@ resident watcher for sustained edits and follow the
214
242
 
215
243
  ## Partial dependency answers
216
244
 
217
- Traversal budgets (`max_nodes`/`max_edges`, #311) are unreleased in Woods
218
- 2.0.0.beta2. Check the installed gem version and connected tool schema before
245
+ Traversal budgets (`max_nodes`/`max_edges`, #311) are available in Woods `2.0.0.beta3`.
246
+ Check the installed gem version and connected tool schema before
219
247
  using them; installing this plugin does not upgrade the gem. On a supporting
220
248
  server, `partial`/`partial_reason` means the walk stopped early, independently
221
249
  of page truncation. Do not claim an exhaustive blast radius or treat empty
@@ -225,7 +253,7 @@ paging alone only visits the discovered prefix. See the
225
253
 
226
254
  ## 4. Check semantic retrieval
227
255
 
228
- Configured retrieval defaults (#446) are unreleased after beta2. For an installed
256
+ Configured retrieval defaults (#446) are available in Woods `2.0.0.beta3`. For an installed
229
257
  version that supports them, an omitted tool budget uses the serving retriever's
230
258
  configured default; an explicit budget overrides it. Standalone MCP does not
231
259
  inherit the host initializer's token setting from the embedding snapshot.
@@ -233,7 +261,7 @@ Do not tune relevance with similarity_threshold: it is inert and deprecated.
233
261
  Use query/type/scope selection and inspect ranking evidence instead. See
234
262
  [retrieval tuning](https://github.com/lost-in-the/woods/blob/main/docs/RETRIEVAL_GUIDE.md#tuning).
235
263
 
236
- Native embedding completeness checks (#442/#444) are unreleased after beta2;
264
+ Native embedding completeness checks (#442/#444) are available in Woods `2.0.0.beta3`;
237
265
  confirm the installed version first. If embedding reports `Embedding input
238
266
  incomplete`, repair the named published extraction artifact or rebuild extraction
239
267
  before retrying. Do not use `WOODS_ALLOW_PURGE=1` to bypass an integrity failure;
@@ -241,7 +269,7 @@ it only permits intentional mass deletion. Source-empty units deliberately retai
241
269
  metadata without vectors. See the canonical
242
270
  [input-integrity guide](https://github.com/lost-in-the/woods/blob/main/docs/RETRIEVAL_GUIDE.md#input-integrity-and-source-empty-units).
243
271
 
244
- Only diagnose this layer when structural tools work and `codebase_retrieve` fails. First check `woods_status.retriever.mode`. For lexical mode, validate the published extraction index and follow the capability check below. For semantic mode, check the configured provider/model/vector store, provider reachability, and whether `woods:embed` completed.
272
+ Only diagnose this layer when structural tools work and `codebase_retrieve` fails. If a no-provider message recommends only embeddings or `search`, check the lexical capability below: beta3 supports explicit `WOODS_RETRIEVAL_MODE=lexical` even though that error omits it. Put the setting in the MCP process environment and restart; never silently change retrieval modes. First check `woods_status.retriever.mode`. For lexical mode, validate the published extraction index and follow the capability check below. For semantic mode, check the configured provider/model/vector store, provider reachability, and whether `woods:embed` completed.
245
273
 
246
274
  - OpenAI: verify the key exists without printing it.
247
275
  - Ollama: verify the service and configured model locally.
@@ -252,7 +280,7 @@ Only diagnose this layer when structural tools work and `codebase_retrieve` fail
252
280
  For metadata appearing in another index or worktree, compare `WOODS_OUTPUT`,
253
281
  `config.output_dir`, and any explicit `metadata_store_options[:database]`.
254
282
  The default SQLite path following `WOODS_OUTPUT` during embedding (B-156) is
255
- unreleased after `2.0.0.beta2`; check the installed version before relying on it.
283
+ available in Woods `2.0.0.beta3`; check the installed version before relying on it.
256
284
  An explicit database path still wins. See the
257
285
  [SQLite path contract](https://github.com/lost-in-the/woods/blob/main/docs/CONFIGURATION_REFERENCE.md#sqlite-metadata)
258
286
  for isolation and upgrade steps.
@@ -261,7 +289,7 @@ for isolation and upgrade steps.
261
289
 
262
290
  For repeated missing-token boot warnings on a stdio-only host, check whether
263
291
  its installed version supports `console_mcp_http_enabled = false` before
264
- suggesting it; this option is unreleased in Woods 2.0.0.beta2. The default
292
+ suggesting it; this option is available in Woods `2.0.0.beta3`. The default
265
293
  preserves HTTP enablement, so selecting stdio as a client alone does not
266
294
  suppress HTTP token validation. Never disable authentication on an HTTP
267
295
  endpoint to silence this warning.
@@ -270,6 +298,8 @@ Console failures are live Rails/config/security failures, not Index failures. Ve
270
298
 
271
299
  For MySQL SQL refusals, inspect the executing session's `sql_mode` and the installed version's Console guide. Do not change quote modes to bypass a security refusal.
272
300
 
301
+ For SQLite SQL refusals on `2.0.0.beta4` or a reviewed revision containing its Console corrections, consult the installed Console guide for supported identifier and table-reference syntax. Simplify the query to supported syntax; never relax the blocked-table or function policy. These builds also check resolved default scopes and scan normalized response values. Confirm a patched gem is published before recommending it, and check the installed version’s canonical Console guide; do not infer release availability from this plugin.
302
+
273
303
  Nine tools are normal. Eleven appear only with `console_embedded_read_tools`. Do not chase Tier 2/3 or `console_eval`; they do not register in supported packaged modes. Never work around redaction, credential scanning, SQL validation, or a block.
274
304
 
275
305
  ## Report
@@ -280,7 +310,7 @@ Canonical guide: [TROUBLESHOOTING.md](https://github.com/lost-in-the/woods/blob/
280
310
 
281
311
  ## Lexical retrieval capability check
282
312
 
283
- This is a development capability. Before proposing it, verify the installed gem
313
+ Lexical retrieval is available from `2.0.0.beta3`. Before proposing it, verify the installed gem
284
314
  exposes `Woods::Configuration#retrieval_mode` and its matching guide documents
285
315
  `WOODS_RETRIEVAL_MODE`. Keep the installed-version preflight; do not infer support
286
316
  from the plugin version or an unreleased checkout.
@@ -303,7 +333,7 @@ query. Scoping can hide relevant cross-boundary relationships, so broaden the
303
333
  request deliberately when the task needs them. See the
304
334
  [scope contract](https://github.com/lost-in-the/woods/blob/main/docs/RETRIEVAL_GUIDE.md#explicit-package-and-source-path-scopes).
305
335
 
306
- ## Source-content freshness (unreleased #405)
336
+ ## Source-content freshness (Woods 2.0.0.beta3; #405)
307
337
 
308
338
  Check installed-version support before using `woods-extract` or the optional
309
339
  `woods_status.source_check` argument. With support, inspect
@@ -326,7 +356,7 @@ coordinates are not physical file offsets; unknown generation remains unknown.
326
356
  Keep full-source access available. See the canonical
327
357
  [evidence contract](https://github.com/lost-in-the/woods/blob/main/docs/RETRIEVAL_GUIDE.md#compact-published-evidence-and-api-outlines).
328
358
 
329
- ## Explicit edit adapters (unreleased #409)
359
+ ## Explicit edit adapters (Woods 2.0.0.beta3; #409)
330
360
 
331
361
  Check the installed gem exposes `woods:hook_refresh` before enabling hooks.
332
362
  Claude's registered wrapper covers one documented edit path; OpenCode 1.18.27
@@ -341,7 +371,7 @@ user's setup request. Follow [client hooks](https://github.com/lost-in-the/woods
341
371
  ## Optional context hints
342
372
 
343
373
  Check installed `bundle exec woods-hook-context --help` before enabling
344
- `WOODS_HOOK_CONTEXT_ENABLED=1`; this capability is unreleased after beta2 and the
374
+ `WOODS_HOOK_CONTEXT_ENABLED=1`; this capability is available in Woods `2.0.0.beta3` and the
345
375
  plugin does not upgrade the gem. Context and refresh opt-ins are independent;
346
376
  `WOODS_HOOKS_DISABLED=1` disables both. Native Claude context is synchronous and
347
377
  bounded, with served-generation and pre-refresh/unknown labels. Verify candidate
@@ -352,7 +382,8 @@ for output/time limits, container root mapping and emitted-hint suppression.
352
382
 
353
383
  ### Obsidian destination conflicts
354
384
 
355
- Destination ownership preflight (#441) is unreleased; first check the installed Woods version and
385
+ Destination ownership preflight (#441) is available in Woods `2.0.0.beta3`; first check
386
+ the installed Woods version and
356
387
  its matching guide. On versions with this check, `refusing <path>: unmanaged or modified destination`
357
388
  means the export preserved a conflicting note, setting, or sidecar and skipped the stale-note sweep.
358
389
  A `.woods-vault` sentinel or force-purge flag does not authorize overwriting it. Inspect and back up
@@ -10,7 +10,7 @@ Woods is runtime evidence: resolved routes, schema, associations, callbacks, inl
10
10
  ## Preflight
11
11
 
12
12
  Supporting servers include concise MCP initialization/discovery guidance without
13
- this plugin. That feature (#402) is unreleased after `2.0.0.beta2`; check the
13
+ this plugin. That feature (#402) is available in Woods `2.0.0.beta3`; check the
14
14
  installed server version, and do not require it from protocol `2024-11-05`.
15
15
  Follow the [agent guide](https://github.com/lost-in-the/woods/blob/main/docs/AGENT_GUIDE.md)
16
16
  when instructions are absent. A registered tool does not establish retrieval
@@ -41,7 +41,7 @@ The normal packaged Index Server registers 14 tools; conditional schemas registe
41
41
 
42
42
  ## Partial search answers
43
43
 
44
- Search completeness (#410) is unreleased after `2.0.0.beta2`. Verify the installed
44
+ Search completeness (#410) is available in Woods `2.0.0.beta3`. Verify the installed
45
45
  server version and response before relying on it; this plugin does not upgrade
46
46
  the gem. On supporting versions, `result_count` counts returned rows, while
47
47
  `completeness.reason: exhausted` establishes an exact total for the requested
@@ -52,10 +52,33 @@ Artifact errors have unknown completeness. Missing metadata on older servers,
52
52
  a full page, and an empty partial result never establish exhaustive absence.
53
53
  See the [search contract](https://github.com/lost-in-the/woods/blob/main/docs/MCP_SERVERS.md#search-completeness).
54
54
 
55
+ ## Graph coverage
56
+
57
+ Dependency tools report published relationships, not exhaustive source-reference
58
+ or call coverage. Selective method-body scanning can miss references to generic
59
+ PORO and library targets. No dependents or test-only dependents do not establish
60
+ absence of production callers; check source before making that claim.
61
+
62
+ The response `graph_coverage` notice, `total_is_exact` field, and human label
63
+ `witness types unambiguous` (#470/#471) are unreleased after Woods `2.0.0.beta3`.
64
+ Verify the installed server version and actual response fields; this plugin does
65
+ not add them. Apply these limits to older servers even without the notice.
66
+ Supporting stdio and HTTP servers expose the paginated traversal payload in
67
+ `structuredContent.data` independently of the text renderer (#481, also
68
+ unreleased after `2.0.0.beta3`). Check the installed response; older default
69
+ responses may carry only text. Do not pass an unsupported `format` argument.
70
+
71
+ `total_is_exact: false` means a budget-limited prefix; a true value describes only
72
+ the requested root, depth, filters and published generation. Pagination alone
73
+ does not change exactness. On older responses inspect `partial` directly.
74
+ Treat partial `nodes_total` as a root-inclusive lower bound, including on the
75
+ last page, an empty page or an unpaged answer. See the
76
+ [coverage contract](https://github.com/lost-in-the/woods/blob/main/docs/MCP_SERVERS.md#dependency-graph-coverage).
77
+
55
78
  ## Partial dependency answers
56
79
 
57
- Traversal budgets (`max_nodes`/`max_edges`, #311) are unreleased in Woods
58
- 2.0.0.beta2. Check the installed gem version and connected tool schema before
80
+ Traversal budgets (`max_nodes`/`max_edges`, #311) are available in Woods `2.0.0.beta3`.
81
+ Check the installed gem version and connected tool schema before
59
82
  using them; installing this plugin does not upgrade the gem. On a supporting
60
83
  server, `partial`/`partial_reason` means the walk stopped early, independently
61
84
  of page truncation. Do not claim an exhaustive blast radius or treat empty
@@ -65,25 +88,38 @@ paging alone only visits the discovered prefix. See the
65
88
 
66
89
  ## Explain recorded relationships
67
90
 
68
- `explain: true` on `dependencies`/`dependents` (#414) is unreleased after
69
- 2.0.0.beta2. Verify the installed gem and connected tool schema before using it;
91
+ `explain: true` on `dependencies`/`dependents` (#414) is available in Woods `2.0.0.beta3`.
92
+ Verify the installed gem and connected tool schema before using it;
70
93
  installing this plugin does not add server capabilities. Supporting servers
71
94
  preserve original source-to-target direction and labels in both traversal
72
95
  modes. Follow shared `parent`/`edge_id` witnesses, distinguish direct records
73
96
  from transitive inferred impact, and treat `context: true` ancestors as page
74
97
  context. Null attributes and candidate type ambiguities remain unknown;
75
- `typed_path_complete: false` never establishes a uniquely typed path. Budget
98
+ `typed_path_complete: false` never establishes a uniquely typed path; true means
99
+ only that witness identities have unambiguous types, not complete source coverage.
100
+ Budget
76
101
  cutoffs still apply. Verify important conclusions in source and tests, since
77
102
  recorded reachability does not establish observed execution. See the
78
103
  [explanation contract](https://github.com/lost-in-the/woods/blob/main/docs/MCP_SERVERS.md#traversal-explanations).
79
104
 
105
+ ## Graph-analysis pages
106
+
107
+ Pass explicit `limit` and `offset` when paging `graph_analysis`. Enforcing the
108
+ advertised default of 20 rows per section and preserving total/offset on last
109
+ and empty pages (#519) are unreleased after `2.0.0.beta3`; check the installed
110
+ response rather than inferring support from the plugin version. On supporting
111
+ servers, read `<section>_total` and `<section>_offset` in JSON, or the human
112
+ pagination notice. An empty later page does not mean no findings. Totals count
113
+ the published report array, which may already be bounded during extraction.
114
+ See the [page contract](https://github.com/lost-in-the/woods/blob/main/docs/MCP_SERVERS.md#graph-analysis-pages).
115
+
80
116
  ## Volatile dependency reports
81
117
 
82
118
  Read `stats.volatile_dependency_count` before judging the top-20 array: it
83
119
  counts all qualifying edges. A frequently changed dependency can occupy most
84
120
  rows. Use the installed version's ratio tuning guidance; the optional
85
- `volatile_dependency_limit_per_target` setting (B-188) is unreleased after
86
- 2.0.0.beta2, so verify gem support before recommending it. Supporting versions
121
+ `volatile_dependency_limit_per_target` setting (B-188) is available in Woods
122
+ `2.0.0.beta3`, so verify gem support before recommending it. Supporting versions
87
123
  can cap each typed target before selecting the global top 20 and expose the
88
124
  cap plus `volatile_dependency_reported_count` in stats. Re-extract after
89
125
  configuration changes. Treat the report as candidates for source review, never
@@ -104,8 +140,11 @@ exposes `Woods::Configuration#retrieval_mode` and its matching guide documents
104
140
  from the plugin version or an unreleased checkout.
105
141
 
106
142
  When status reports lexical mode, use the matching fields/terms as discovery
107
- evidence and verify key units with `lookup`. The ranked top 20 is not exhaustive;
108
- no lexical match does not establish absence. Continue using `budget`, not `limit`.
143
+ evidence and verify key units with `lookup`. At most 20 eligible matching
144
+ candidates are considered; fewer source entries may fit the budget. This is not
145
+ exhaustive, and no lexical match does not establish absence. When the installed
146
+ server reports considered/included counts, compare them; older versions may
147
+ only describe the shortlist limit. Continue using `budget`, not `limit`.
109
148
  See the [retrieval guide](https://github.com/lost-in-the/woods/blob/main/docs/RETRIEVAL_GUIDE.md#embedding-free-lexical-retrieval)
110
149
  for the supported contract, checked against the installed gem version.
111
150
 
@@ -135,7 +174,7 @@ Keep full-source access available. See the canonical
135
174
  ## Optional context hints
136
175
 
137
176
  Check installed `bundle exec woods-hook-context --help` before enabling
138
- `WOODS_HOOK_CONTEXT_ENABLED=1`; this capability is unreleased after beta2 and the
177
+ `WOODS_HOOK_CONTEXT_ENABLED=1`; this capability is available in Woods `2.0.0.beta3` and the
139
178
  plugin does not upgrade the gem. Context and refresh opt-ins are independent;
140
179
  `WOODS_HOOKS_DISABLED=1` disables both. Native Claude context is synchronous and
141
180
  bounded, with served-generation and pre-refresh/unknown labels. Verify candidate
@@ -7,7 +7,7 @@ description: Configure Woods MCP connections with the exact client JSON shapes a
7
7
 
8
8
  ## Managed configuration availability
9
9
 
10
- `woods-agent-config` (#407) is unreleased after `2.0.0.beta2`. First record the
10
+ `woods-agent-config` (#407) is available in Woods `2.0.0.beta3`. First record the
11
11
  installed version and test `bundle exec woods-agent-config --help` in the
12
12
  selected application bundle. When supported, use its saved setup/update/remove
13
13
  plan and explicit client/scope/root selection; apply the reviewed plan within
@@ -30,7 +30,7 @@ This skill describes the Woods 2.x line; the authoritative minimum version lives
30
30
 
31
31
  Default to Index-only. It reads generated code context and exposes 14 tools. Console MCP boots Rails and reads live data; ask before enabling it.
32
32
 
33
- Initialization guidance (#402) is unreleased after `2.0.0.beta2`; check the
33
+ Initialization guidance (#402) is available in Woods `2.0.0.beta3`; check the
34
34
  installed gem before expecting MCP `instructions`. Supporting servers provide
35
35
  a short workflow through initialization or modern discovery; protocol
36
36
  `2024-11-05` omits it. Missing instructions alone are not a connection failure.
@@ -55,8 +55,8 @@ when unavailable. See the
55
55
 
56
56
  Use this shape for any stdio-capable MCP client, adapted to the client's configuration location. `woods-mcp-start` validates and launches; it does not install or auto-restart.
57
57
 
58
- Writer-version provenance (#323) is unreleased; check the installed gem version's
59
- release notes before expecting `index.woods_version` in `woods_status`. It reports
58
+ Writer-version provenance (#323) is available in Woods `2.0.0.beta3`; check the installed
59
+ gem version's release notes before expecting `index.woods_version` in `woods_status`. It reports
60
60
  the last manifest publisher, independently of `server.version`. Treat missing/null
61
61
  as unknown and see [writer provenance](https://github.com/lost-in-the/woods/blob/main/docs/PUBLISHED_INDEX.md#manifest-writer-provenance).
62
62
 
@@ -74,12 +74,12 @@ When Woods is installed only in Docker, prefer running the server through the ap
74
74
  }
75
75
  ```
76
76
 
77
- Use a host-side bundle only after verifying Ruby, the application bundle, and the index are available on the host. Always pass the path visible to the process that runs `woods-mcp`.
77
+ Use a host-side bundle only after verifying Ruby, the application bundle, and the index are available on the host. Always pass the path visible to the process that runs `woods-mcp`. Prefer an explicit index path on all versions. After `2.0.0.beta3`, an unreleased change adds `WOODS_OUTPUT` as a fallback after the positional path and `WOODS_DIR`; check the installed version's configuration guide before relying on it. `woods-mcp-start` still refuses a missing path rather than selecting its working directory.
78
78
 
79
79
  A read-only index mount is sufficient for structural tools. The `reload` tool for in-memory semantic retrieval also takes Woods' shared on-disk writer lock, so the MCP process needs write access to the index directory. Without it, reload returns a typed degraded error and keeps serving the previous aligned generation. Either grant that access or restart the MCP process after publishing a new embedded index.
80
80
 
81
81
  For host MCP reading a container daemon's shared index, foreign heartbeat trust
82
- (#321) is unreleased. Verify the installed gem version's release notes before
82
+ (#321) is available in Woods `2.0.0.beta3`. Verify the installed gem version's release notes before
83
83
  offering `WOODS_WATCH_TRUST_FOREIGN_HOST=1` in the MCP environment. It makes
84
84
  `woods_status.watch.alive` use the same bounded freshness policy as task readers;
85
85
  see [cross-host liveness](https://github.com/lost-in-the/woods/blob/main/docs/WATCH_DAEMON.md#cross-host-liveness).
@@ -97,8 +97,8 @@ end
97
97
 
98
98
  The token authenticates HTTP requests and is not sent by a stdio client.
99
99
  Before suggesting `console_mcp_http_enabled = false`, verify that the installed
100
- version supports it: the option is unreleased in Woods 2.0.0.beta2. Supported
101
- stdio-only hosts can set it to `false` and omit the HTTP token; existing
100
+ version supports it: the option is available in Woods `2.0.0.beta3`. Supported
101
+ stdio-only hosts can set it to `false` and omit the HTTP token; older
102
102
  versions require the token at production boot whenever Console is enabled.
103
103
  For HTTP, retain a strong token, allowed origins and TLS. Use installed-version
104
104
  tagged documentation; the [canonical Console guide](https://github.com/lost-in-the/woods/blob/main/docs/CONSOLE_MCP_SETUP.md)
@@ -142,14 +142,14 @@ Canonical guide: [MCP_SERVERS.md](https://github.com/lost-in-the/woods/blob/main
142
142
 
143
143
  ## Lexical retrieval capability check
144
144
 
145
- This is a development capability. Before proposing it, verify the installed gem
145
+ Lexical retrieval is available from `2.0.0.beta3`. Before proposing it, verify the installed gem
146
146
  exposes `Woods::Configuration#retrieval_mode` and its matching guide documents
147
147
  `WOODS_RETRIEVAL_MODE`. Keep the installed-version preflight; do not infer support
148
148
  from the plugin version or an unreleased checkout.
149
149
 
150
150
  When supported, put `WOODS_RETRIEVAL_MODE=lexical` in the environment of the
151
151
  process launching Index MCP (stdio or HTTP). A Rails initializer alone is not
152
- loaded by that process. Confirm `woods_status.retriever.mode` reports `lexical`.
152
+ loaded by that process. Restart the MCP server after changing its environment, then confirm `woods_status.retriever.mode` reports `lexical`. A beta3 no-provider error may omit this option; it does not mean embeddings are required for explicit lexical mode.
153
153
  See the [retrieval guide](https://github.com/lost-in-the/woods/blob/main/docs/RETRIEVAL_GUIDE.md#embedding-free-lexical-retrieval)
154
154
  for the supported contract, checked against the installed gem version.
155
155
 
@@ -165,7 +165,7 @@ query. Scoping can hide relevant cross-boundary relationships, so broaden the
165
165
  request deliberately when the task needs them. See the
166
166
  [scope contract](https://github.com/lost-in-the/woods/blob/main/docs/RETRIEVAL_GUIDE.md#explicit-package-and-source-path-scopes).
167
167
 
168
- ## Source-content freshness (unreleased #405)
168
+ ## Source-content freshness (Woods 2.0.0.beta3; #405)
169
169
 
170
170
  Check installed-version support before using `woods-extract` or the optional
171
171
  `woods_status.source_check` argument. With support, inspect
@@ -9,7 +9,7 @@ Install a structural Index Server first. Embeddings and Console MCP are separate
9
9
 
10
10
  ## Managed configuration availability
11
11
 
12
- `woods-agent-config` (#407) is unreleased after `2.0.0.beta2`. First record the
12
+ `woods-agent-config` (#407) is available in Woods `2.0.0.beta3`. First record the
13
13
  installed version and test `bundle exec woods-agent-config --help` in the
14
14
  selected application bundle. When supported, use its saved setup/update/remove
15
15
  plan and explicit client/scope/root selection; apply the reviewed plan within
@@ -74,8 +74,8 @@ bin/rails woods:stats
74
74
 
75
75
  If extraction fails, reproduce Rails boot and eager loading first. Do not inspect internal payload files when Woods tasks provide the check.
76
76
 
77
- Writer-version provenance (#323) is unreleased; check the installed gem version's
78
- release notes before expecting `woods_status.index.woods_version`. When present,
77
+ Writer-version provenance (#323) is available in Woods `2.0.0.beta3`; check the installed
78
+ gem version's release notes before expecting `woods_status.index.woods_version`. When present,
79
79
  it names the last manifest publisher; `server.version` names the MCP reader.
80
80
  Missing/null means unknown. A matching version after an incremental run never
81
81
  replaces a required full upgrade extraction. See [writer provenance](https://github.com/lost-in-the/woods/blob/main/docs/PUBLISHED_INDEX.md#manifest-writer-provenance).
@@ -112,7 +112,8 @@ Reconnect and call `woods_status`, then `search`, `lookup`, and `dependents` for
112
112
 
113
113
  Offer to add `bundle exec rake woods:watch` to the existing development process manager. When authorized, it catches up missed changes and automatically maintains the structural index; the Index Server refreshes on its next call, so ordinary edits need no manual extraction or MCP restart. Use the standalone watch command; do not prepend the `environment` task. Check the installed version's watch guide before relying on automatic startup reconciliation. State that live boot-captured changes require supervisor restart, Docker may need `WOODS_WATCH_POLL=1`, and semantic vectors still need `woods:embed_incremental`.
114
114
 
115
- Foreign-host heartbeat trust (`WOODS_WATCH_TRUST_FOREIGN_HOST=1`, #321) is unreleased.
115
+ Foreign-host heartbeat trust (`WOODS_WATCH_TRUST_FOREIGN_HOST=1`, #321) is available in
116
+ Woods `2.0.0.beta3`.
116
117
  Check the installed gem version against its release notes before offering it;
117
118
  do not assume installing this plugin upgrades the gem. For a supporting version,
118
119
  follow [cross-host liveness](https://github.com/lost-in-the/woods/blob/main/docs/WATCH_DAEMON.md#cross-host-liveness)
@@ -120,14 +121,14 @@ and set the opt-in in each task/MCP reader of a shared container index. Explain
120
121
  the 15-minute crash-detection delay and preserve one supervisor per daemon.
121
122
 
122
123
  For slow bind mounts, check whether the installed version documents
123
- `WOODS_WATCH_POLL_INTERVAL` before suggesting it; this setting is unreleased
124
- in Woods 2.0.0.beta2. Where supported, a positive value such as `2.5` reduces
124
+ `WOODS_WATCH_POLL_INTERVAL` before suggesting it; this setting is available in Woods
125
+ `2.0.0.beta3`. Where supported, a positive value such as `2.5` reduces
125
126
  polling frequency at the cost of detection latency. Use the installed preflight version to select tagged documentation; the
126
127
  [canonical watch guide](https://github.com/lost-in-the/woods/blob/main/docs/WATCH_DAEMON.md)
127
128
  tracks current source and may describe unreleased behavior.
128
129
 
129
130
  The plugin ships opt-in refresh and session-start hooks. The expanded refresh
130
- contract (#408) is unreleased after Woods 2.0.0.beta2: first verify the installed
131
+ contract (#408) is available in Woods `2.0.0.beta3`: first verify the installed
131
132
  gem exposes `woods:hook_refresh` through the actual application command. Do not
132
133
  infer support from the plugin version. With support, edits to standard services,
133
134
  controllers, jobs, views, concerns, locales, supported tests/lib files, routes,
@@ -146,7 +147,7 @@ The refresh worker's deadline starts after the complete event input has been
146
147
  collected, validated, and queued; it does not bound input collection. It includes
147
148
  subsequent batches, but cancelling Docker exec does not prove its container
148
149
  process stopped. See the [hook deadline and retry contract](https://github.com/lost-in-the/woods/blob/main/docs/WATCH_DAEMON.md#hooks-for-agent-sessions).
149
- Source freshness (#405) is unreleased after beta2: verify the installed command
150
+ Source freshness (#405) is available in Woods `2.0.0.beta3`: verify the installed command
150
151
  exposes `woods:source_status` and `woods-extract` before using it. Supporting
151
152
  SessionStart hooks check source content and report missing/failed evidence as
152
153
  unknown; silence does not acknowledge queued refresh work. Follow the [hook guide](https://github.com/lost-in-the/woods/blob/main/docs/WATCH_DAEMON.md#hooks-for-agent-sessions)
@@ -154,6 +155,8 @@ for transport, retry and custom-root limits.
154
155
 
155
156
  ## Ask before expanding scope
156
157
 
158
+ For pgvector, match the provider output and migration dimensions within 1–2,000. Default `text-embedding-3-large` output (3,072) needs an explicit smaller provider width or another backend; never silently truncate vectors. Early adapter/generator refusal is unreleased after `2.0.0.beta3`, so check the installed revision. See the [dimension contract](https://github.com/lost-in-the/woods/blob/main/docs/CONFIGURATION_REFERENCE.md#pgvector-postgresql).
159
+
157
160
  Require explicit approval before adding Ollama/OpenAI, pgvector/Qdrant, secrets, Console MCP/live-data access, HTTP transport, or purge overrides. The `:local` preset avoids cloud keys but requires the `sqlite3` gem, an installed/running Ollama service, and a pulled model (`ollama pull nomic-embed-text` by default); `:shared_filesystem` avoids sqlite3 but still uses Ollama. Recommend `gem "tokenizers", "~> 0.5"` for exact counting on dense Ruby source, while stating that it is optional.
158
161
 
159
162
  ## Handoff
@@ -164,7 +167,7 @@ Canonical runbook: [AGENT_SETUP.md](https://github.com/lost-in-the/woods/blob/ma
164
167
 
165
168
  ## Lexical retrieval capability check
166
169
 
167
- This is a development capability. Before proposing it, verify the installed gem
170
+ Lexical retrieval is available from `2.0.0.beta3`. Before proposing it, verify the installed gem
168
171
  exposes `Woods::Configuration#retrieval_mode` and its matching guide documents
169
172
  `WOODS_RETRIEVAL_MODE`. Keep the installed-version preflight; do not infer support
170
173
  from the plugin version or an unreleased checkout.
@@ -175,7 +178,7 @@ remains the default; setting up embeddings is a separate choice.
175
178
  See the [retrieval guide](https://github.com/lost-in-the/woods/blob/main/docs/RETRIEVAL_GUIDE.md#embedding-free-lexical-retrieval)
176
179
  for the supported contract, checked against the installed gem version.
177
180
 
178
- ## Explicit edit adapters (unreleased #409)
181
+ ## Explicit edit adapters (Woods 2.0.0.beta3; #409)
179
182
 
180
183
  Check the installed gem exposes `woods:hook_refresh` before enabling hooks.
181
184
  Claude's registered wrapper covers one documented edit path; OpenCode 1.18.27
@@ -190,7 +193,7 @@ user's setup request. Follow [client hooks](https://github.com/lost-in-the/woods
190
193
  ## Optional context hints
191
194
 
192
195
  Check installed `bundle exec woods-hook-context --help` before enabling
193
- `WOODS_HOOK_CONTEXT_ENABLED=1`; this capability is unreleased after beta2 and the
196
+ `WOODS_HOOK_CONTEXT_ENABLED=1`; this capability is available in Woods `2.0.0.beta3` and the
194
197
  plugin does not upgrade the gem. Context and refresh opt-ins are independent;
195
198
  `WOODS_HOOKS_DISABLED=1` disables both. Native Claude context is synchronous and
196
199
  bounded, with served-generation and pre-refresh/unknown labels. Verify candidate