woods 2.0.0.beta3 → 2.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.
Files changed (120) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +500 -420
  3. data/CONTRIBUTING.md +29 -17
  4. data/README.md +78 -178
  5. data/docs/AGENT_GUIDE.md +52 -11
  6. data/docs/AGENT_SETUP.md +34 -17
  7. data/docs/AUTOMATIC_MAINTENANCE.md +222 -0
  8. data/docs/BACKEND_MATRIX.md +18 -7
  9. data/docs/CLIENT_HOOKS.md +1 -1
  10. data/docs/CONFIGURATION_REFERENCE.md +105 -29
  11. data/docs/CONSOLE_MCP_SETUP.md +54 -9
  12. data/docs/DOCKER_SETUP.md +16 -1
  13. data/docs/EVALUATION.md +10 -4
  14. data/docs/EXTRACTOR_REFERENCE.md +23 -3
  15. data/docs/FAQ.md +14 -3
  16. data/docs/GETTING_STARTED.md +18 -17
  17. data/docs/INCREMENTAL_EXTRACTION.md +37 -8
  18. data/docs/INDEX_LAYOUT.md +2 -2
  19. data/docs/MCP_SERVERS.md +79 -7
  20. data/docs/MCP_TOOL_COOKBOOK.md +5 -5
  21. data/docs/MCP_WORKTREE_SETUP.md +55 -83
  22. data/docs/PUBLISHED_INDEX.md +17 -0
  23. data/docs/README.md +2 -1
  24. data/docs/RETRIEVAL_GUIDE.md +81 -13
  25. data/docs/SOURCE_FRESHNESS.md +1 -1
  26. data/docs/TOKEN_BENCHMARK.md +16 -10
  27. data/docs/TROUBLESHOOTING.md +142 -47
  28. data/docs/UPGRADING_TO_2.md +12 -6
  29. data/docs/WATCH_DAEMON.md +189 -24
  30. data/docs/WHY_WOODS.md +9 -5
  31. data/exe/woods-console +13 -11
  32. data/exe/woods-mcp-start +14 -9
  33. data/exe/woods-watch +5 -0
  34. data/lib/generators/woods/pgvector_generator.rb +8 -2
  35. data/lib/generators/woods/watch_generator.rb +53 -0
  36. data/lib/puma/plugin/woods.rb +10 -0
  37. data/lib/tasks/woods.rake +14 -0
  38. data/lib/woods/agent_configuration/applier.rb +5 -3
  39. data/lib/woods/agent_configuration/cli.rb +2 -2
  40. data/lib/woods/agent_configuration/layout.rb +13 -0
  41. data/lib/woods/cache/cache_middleware.rb +6 -0
  42. data/lib/woods/console/credential_scanner.rb +4 -3
  43. data/lib/woods/console/dispatch_pipeline.rb +7 -0
  44. data/lib/woods/console/embedded_executor.rb +31 -9
  45. data/lib/woods/console/sql_noise_stripper.rb +9 -7
  46. data/lib/woods/console/sql_table_scanner.rb +47 -7
  47. data/lib/woods/console/sql_validator.rb +49 -9
  48. data/lib/woods/console/sqlite_read_guard.rb +46 -0
  49. data/lib/woods/console/stdio_transport.rb +27 -0
  50. data/lib/woods/coordination/pipeline_lock.rb +3 -2
  51. data/lib/woods/embedding/indexer.rb +24 -14
  52. data/lib/woods/extractor.rb +70 -19
  53. data/lib/woods/extractors/declared_parent.rb +55 -0
  54. data/lib/woods/extractors/graphql_extractor.rb +2 -11
  55. data/lib/woods/extractors/lib_extractor.rb +10 -8
  56. data/lib/woods/extractors/mailer_extractor.rb +6 -10
  57. data/lib/woods/extractors/model_extractor.rb +1 -15
  58. data/lib/woods/extractors/poro_extractor.rb +10 -8
  59. data/lib/woods/extractors/shared_utility_methods.rb +22 -5
  60. data/lib/woods/git_command.rb +6 -7
  61. data/lib/woods/git_provenance.rb +4 -6
  62. data/lib/woods/mcp/bearer_auth.rb +2 -1
  63. data/lib/woods/mcp/bootstrapper.rb +20 -5
  64. data/lib/woods/mcp/config_resolver.rb +2 -1
  65. data/lib/woods/mcp/index_reader.rb +11 -2
  66. data/lib/woods/mcp/initialization_guidance.rb +1 -1
  67. data/lib/woods/mcp/renderers/markdown_renderer.rb +14 -8
  68. data/lib/woods/mcp/renderers/plain_renderer.rb +11 -7
  69. data/lib/woods/mcp/server.rb +63 -37
  70. data/lib/woods/mcp/tool_contract.rb +1 -1
  71. data/lib/woods/mcp/tool_response_renderer.rb +16 -0
  72. data/lib/woods/mcp/traversal_evidence_text.rb +1 -1
  73. data/lib/woods/mcp/traversal_response.rb +22 -0
  74. data/lib/woods/path_dispatcher.rb +6 -5
  75. data/lib/woods/published_index/typed_unit_reader.rb +40 -3
  76. data/lib/woods/published_index.rb +2 -2
  77. data/lib/woods/rake_helpers.rb +2 -12
  78. data/lib/woods/retrieval/corpus_status.rb +46 -0
  79. data/lib/woods/retrieval/lexical_assembler.rb +14 -3
  80. data/lib/woods/retrieval/lexical_index.rb +2 -1
  81. data/lib/woods/retriever.rb +19 -7
  82. data/lib/woods/session_tracer/file_store.rb +6 -1
  83. data/lib/woods/source_inputs/consumer_errors.rb +4 -0
  84. data/lib/woods/storage/local_corpus_stats.rb +32 -0
  85. data/lib/woods/storage/metadata_store.rb +20 -0
  86. data/lib/woods/storage/pgvector.rb +6 -2
  87. data/lib/woods/storage/vector_store.rb +10 -0
  88. data/lib/woods/temporal/json_snapshot_store.rb +35 -7
  89. data/lib/woods/version.rb +1 -1
  90. data/lib/woods/watch/child_environment.rb +30 -0
  91. data/lib/woods/watch/cli.rb +91 -0
  92. data/lib/woods/watch/daemon.rb +73 -11
  93. data/lib/woods/watch/event_stream.rb +70 -0
  94. data/lib/woods/watch/guardian.rb +142 -0
  95. data/lib/woods/watch/installation/layout.rb +70 -0
  96. data/lib/woods/watch/installation/options.rb +128 -0
  97. data/lib/woods/watch/installation/planner.rb +128 -0
  98. data/lib/woods/watch/installation/probe.rb +101 -0
  99. data/lib/woods/watch/installation/receipt.rb +77 -0
  100. data/lib/woods/watch/installation/recovery.rb +64 -0
  101. data/lib/woods/watch/installation/templates.rb +58 -0
  102. data/lib/woods/watch/installation.rb +56 -0
  103. data/lib/woods/watch/lifecycle.rb +182 -0
  104. data/lib/woods/watch/managed_child.rb +113 -0
  105. data/lib/woods/watch/managed_cleanup.rb +48 -0
  106. data/lib/woods/watch/managed_process.rb +144 -0
  107. data/lib/woods/watch/puma_adapter.rb +87 -0
  108. data/lib/woods/watch/puma_child.rb +66 -0
  109. data/lib/woods/watch/supervision_records.rb +95 -0
  110. data/lib/woods/watch/supervision_status.rb +104 -0
  111. data/lib/woods/watch/supervisor.rb +161 -0
  112. data/lib/woods/watch/supervisor_reporting.rb +46 -0
  113. data/plugin/.claude-plugin/plugin.json +1 -1
  114. data/plugin/hooks/woods-input-rules.sh +4 -4
  115. data/plugin/skills/woods-agent-enable/SKILL.md +7 -1
  116. data/plugin/skills/woods-diagnose/SKILL.md +134 -34
  117. data/plugin/skills/woods-investigate/SKILL.md +54 -15
  118. data/plugin/skills/woods-mcp-config/SKILL.md +38 -11
  119. data/plugin/skills/woods-setup/SKILL.md +72 -15
  120. metadata +38 -5
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Woods
4
+ module Watch
5
+ # Publication and retirement of one launcher's diagnostic records.
6
+ module SupervisorReporting
7
+ private
8
+
9
+ def publish(state, reason, **details)
10
+ return unless state
11
+
12
+ reason ||= 'pending'
13
+ changed = @state != state || @reason != reason
14
+ @state = state
15
+ @reason = reason
16
+ @details = details
17
+ @logger.puts("[woods-watch] #{state}: #{reason || 'pending'} (attempt #{@attempts})") if changed
18
+ heartbeat(force: true)
19
+ end
20
+
21
+ def heartbeat(force: false)
22
+ return unless @status && heartbeat_due?(force)
23
+
24
+ @status.write(state: @state, reason: @reason, attempt: @attempt,
25
+ child_pid: @process&.alive? ? @protocol.child_pid : nil, **(@details || {}))
26
+ @heartbeat_at = monotonic
27
+ rescue SystemCallError, ArgumentError => e
28
+ @logger.puts("[woods-watch] cannot write supervision status (#{e.class})")
29
+ @heartbeat_at = monotonic
30
+ end
31
+
32
+ def heartbeat_due?(force)
33
+ force || !@heartbeat_at || monotonic - @heartbeat_at >= 5
34
+ end
35
+
36
+ def retire_status
37
+ @status&.write(state: 'stopped', reason: 'attempt_finished', attempt: @attempt, child_pid: nil)
38
+ rescue SystemCallError, ArgumentError => e
39
+ @logger.puts("[woods-watch] cannot retire supervision status (#{e.class})")
40
+ ensure
41
+ @status = nil
42
+ @heartbeat_at = nil
43
+ end
44
+ end
45
+ end
46
+ end
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "woods-plugin",
3
3
  "description": "Woods user guides for Claude Code: set up, upgrade, configure MCP servers for, investigate codebases with, enable a repository's agents on, and diagnose the Woods Rails code-intelligence gem.",
4
- "version": "2.3.36",
4
+ "version": "2.3.54",
5
5
  "author": {
6
6
  "name": "lost-in-the"
7
7
  },
@@ -75,10 +75,6 @@ woods_input_action() {
75
75
  case "$operation" in delete|move) printf full ;; *) printf incremental ;; esac
76
76
  return
77
77
  fi
78
- if { { { [[ "$path" == *.rake ]]; } && { [[ "$path" == lib/tasks/* ]]; }; }; }; then
79
- case "$operation" in delete|move) printf full ;; *) printf incremental ;; esac
80
- return
81
- fi
82
78
  if { { { [[ "$path" == *.html.erb ]] || [[ "$path" == *.erb ]]; } && { [[ "$path" == app/views/* ]]; }; }; }; then
83
79
  case "$operation" in delete|move) printf full ;; *) printf incremental ;; esac
84
80
  return
@@ -115,6 +111,10 @@ woods_input_action() {
115
111
  case "$operation" in delete|move) printf full ;; *) printf incremental ;; esac
116
112
  return
117
113
  fi
114
+ if { { { [[ "$path" == *.rake ]]; } && { [[ "$path" == lib/tasks/* ]]; }; }; }; then
115
+ case "$operation" in delete|move) printf full ;; *) printf incremental ;; esac
116
+ return
117
+ fi
118
118
  if { [[ "$path" == config/routes.rb ]] || { { [[ "$path" == config/routes/* ]]; }; }; }; then
119
119
  case "$operation" in delete|move) printf full ;; *) printf incremental ;; esac
120
120
  return
@@ -9,7 +9,7 @@ Installing the gem gives one operator an index; this skill gives every future ag
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
@@ -20,6 +20,12 @@ journals contain private configuration bytes. See the canonical
20
20
  for host/Compose preflight, actual Claude file locations, conflict recovery,
21
21
  and removal. Preserve manual setup for older installed versions.
22
22
 
23
+ For concurrent configuration operations, wait for the active operation to
24
+ finish and generate a fresh plan if the saved snapshots changed. Do not remove
25
+ its lock or overwrite the other application's entry. Coordination across
26
+ applications sharing user configuration is included in Woods `2.0.0`;
27
+ check the installed revision before relying on it.
28
+
23
29
  ## Preflight
24
30
 
25
31
  Confirm Woods actually works before advertising it to every future session:
@@ -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
@@ -36,19 +36,63 @@ bundle exec rails runner 'Rails.application.eager_load!; puts "eager load ok"'
36
36
 
37
37
  Use the application's normal Docker command and environment variables when applicable. Fix boot/eager-load failures before Woods.
38
38
 
39
+ ### Watcher setup cannot find already installed Rails or dependencies
40
+
41
+ Compare normal task discovery with installer preflight in the same container and
42
+ application environment. Early Git builds of the watcher installer stripped
43
+ `BUNDLE_PATH` and `BUNDLE_APP_CONFIG`; Woods `2.0.0` includes the #540 fix.
44
+ Record the loaded revision and bundle configuration source before
45
+ reinstalling dependencies or writing a local bundle-path workaround. Follow the
46
+ [watcher installation guide](https://github.com/lost-in-the/woods/blob/main/docs/WATCH_DAEMON.md#managed-development-startup).
47
+
48
+ ### Puma cannot load the Woods plugin after switching branches
49
+
50
+ Early generated guards checked only whether Woods was activated. An older gem
51
+ can satisfy that check without providing `puma/plugin/woods.rb`. The #542 fix is
52
+ included in Woods `2.0.0`: verify the loaded revision, then use a supporting
53
+ bundle to preview and apply `bin/rails generate woods:watch --operation update
54
+ --mode puma`. The updated guard checks the active gem's require paths, so older
55
+ gems boot without a watcher. Repeating setup does not upgrade the guard. Follow
56
+ the [owned setup runbook](https://github.com/lost-in-the/woods/blob/main/docs/WATCH_DAEMON.md#ownership-updates-and-removal);
57
+ do not change the owned directive or receipt manually.
58
+
39
59
  ### Watch repeatedly exits 75
40
60
 
61
+ First identify the lifecycle owner. The raw task deliberately exits 75; a bare
62
+ Foreman entry then stops all services. Managed `woods-watch`/Puma setup (#538)
63
+ is included in Woods `2.0.0`: verify installed executable/generator help and
64
+ loaded revision before proposing it. Supporting launchers retry boot failures,
65
+ reject idle TTL, and park ownership/protocol conflicts until owner restart.
66
+ Inspect separate supervision state rather than treating its parent PID as a
67
+ healthy daemon. Before the first resolved index path, use launcher logs.
68
+ Do not remove claims or kill PIDs from status to force takeover. See
69
+ [startup diagnosis](https://github.com/lost-in-the/woods/blob/main/docs/TROUBLESHOOTING.md#watcher-startup-or-planned-restart-fails).
70
+
41
71
  Check the installed version's watch guide. Older releases, including
42
72
  `2.0.0.beta2`, can rediscover the same restart-trigger paths on every boot. Stop
43
73
  the supervisor, run one successful full extraction, then restart the standalone
44
74
  watch task. Do not assume automatic startup reconciliation exists in that release.
45
75
  For versions documenting environment-boot snapshots, confirm that the command is
46
- `bundle exec rake woods:watch`, with no preceding `environment` task, and check
76
+ the application's actual `rails woods:watch` or `rake woods:watch` entrypoint,
77
+ with no preceding `environment` task, and check
47
78
  whether boot inputs keep changing during initialization or catch-up.
48
79
 
80
+ ### Watch retains facts from an initializer deleted while stopped
81
+
82
+ Record the installed revision. In Woods `2.0.0`, startup preserves
83
+ registered deleted boot inputs as full-extraction obligations. On earlier builds,
84
+ stop watch, run a successful full extraction in a fresh process, then restart
85
+ standalone `woods:watch`. See the installed version's watch guide.
86
+
87
+ ### A cleaned index directory still exists
88
+
89
+ In Woods `2.0.0`, `woods:clean` retains the output directory and
90
+ hidden extraction guard for concurrent writer coordination. Verify published
91
+ artifacts are gone; do not remove that guard while writers may be running.
92
+
49
93
  ### Watch misses edits under a shared directory alias
50
94
 
51
- Check the installed version: logical alias preservation (#445) is unreleased.
95
+ Check the installed version: logical alias preservation (#445) is available in Woods `2.0.0.beta3`.
52
96
  Older polling/catch-up walkers could visit an irrelevant alias first and suppress
53
97
  `app/models` when both point to the same physical directory. Compare the logical
54
98
  path with the extraction input path; a running daemon alone does not prove coverage.
@@ -58,8 +102,8 @@ See the installed version's watch guide before assuming this behavior.
58
102
 
59
103
  ### Session trace reports ambiguous identity
60
104
 
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
105
+ The `session_trace` `ambiguous_identity` error (#213) is available in Woods `2.0.0.beta3`;
106
+ check the installed gem before expecting it. It names a dependency
63
107
  with multiple published extraction types, so no partial session context is
64
108
  returned. Use `depth: 0` for the timeline or inspect the named candidates with
65
109
  explicit `lookup` types. Do not choose one by index order or suggest that a full
@@ -72,7 +116,7 @@ For a `same-type identifier collision`, inspect both named source files and the
72
116
  Rails loader before suggesting source edits. Wrapper-nested class naming needs
73
117
  Zeitwerk mode and Zeitwerk >= 2.6.9; an older loader or classic mode can produce
74
118
  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
119
+ guidance (B-149) is available in Woods `2.0.0.beta3`; check the installed version
76
120
  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
121
 
78
122
  ```bash
@@ -82,7 +126,7 @@ bin/rails woods:stats
82
126
 
83
127
  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
128
 
85
- Semantic graph validation (#413) is unreleased after `2.0.0.beta2`; verify the
129
+ Semantic graph validation (#413) is available in Woods `2.0.0.beta3`; verify the
86
130
  installed gem before expecting these errors. Supporting versions check typed
87
131
  unit identity, graph/index agreement and forward/reverse/file/type memberships
88
132
  within one pinned generation. Preserve the failing generation and exact error,
@@ -95,7 +139,7 @@ an external name from an internal unit omitted everywhere. Follow the
95
139
 
96
140
  If external targets such as `http_api` lose dependents after incremental
97
141
  extraction, check whether the installed Woods version includes B-193.
98
- The fix is unreleased; installing this plugin does not upgrade the gem.
142
+ The fix is available in Woods `2.0.0.beta3`; installing this plugin does not upgrade the gem.
99
143
  Affected indexes need one full extraction after upgrading to a fixed version.
100
144
  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
145
 
@@ -107,7 +151,7 @@ Confirm the installed release and filesystem support retention locks before
107
151
  using the pinning examples; flat layouts need writers stopped for a consistent copy.
108
152
 
109
153
  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
154
+ are rejected by default. Foreign heartbeat trust (#321) is available in Woods `2.0.0.beta3`: first
111
155
  check the installed Woods version and that version's release notes. Only for a
112
156
  supporting version, offer `WOODS_WATCH_TRUST_FOREIGN_HOST=1` in every relevant
113
157
  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 +159,18 @@ Fresh `degraded` still means incremental work is needed; a fresh `running`
115
159
  record can outlive a crashed foreign daemon by up to 15 minutes. Older versions
116
160
  need their status check run in the daemon's own container.
117
161
 
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
162
+ Writer-version provenance (#323) is available in Woods `2.0.0.beta3`: verify the installed
163
+ gem version's release notes before expecting it. If `index.woods_version` exists, compare it
120
164
  with `server.version`; missing/null is unknown, not a failure. A validator
121
165
  major-version warning calls for full extraction and upgrade review, while a match
122
166
  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
167
 
168
+ Included in Woods `2.0.0`: incremental/refresh handled source errors keep
169
+ the previous generation active and leave watch batches pending. Repair the
170
+ logged source error and retry the complete batch; see
171
+ [handled source errors](https://github.com/lost-in-the/woods/blob/main/docs/INCREMENTAL_EXTRACTION.md#handled-source-errors-and-retry).
172
+ Check the installed revision before relying on this behavior.
173
+
124
174
  If a one-shot extraction raises `Could not publish generation`, the candidate
125
175
  payload was written but never made visible; readers still serve the previous
126
176
  complete generation. Fix the named filesystem, permission, space, or mount
@@ -139,12 +189,12 @@ tracks current source.
139
189
  For volatile-dependency reports dominated by one target, compare the full
140
190
  `stats.volatile_dependency_count` with the persisted array and use the
141
191
  [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
192
+ The optional per-target cap (B-188) is available in Woods `2.0.0.beta3`; check the
143
193
  installed gem before suggesting `volatile_dependency_limit_per_target`.
144
194
  Re-extract to publish configuration changes; the report remains informational.
145
195
 
146
196
  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
197
+ available in Woods `2.0.0.beta3`; check the installed version first. Fetch complete
148
198
  history with `git fetch --unshallow` or `actions/checkout` `fetch-depth: 0`, then
149
199
  run full extraction. Depth two only enables a two-commit diff; it does not
150
200
  restore complete churn history. See the
@@ -152,24 +202,42 @@ restore complete churn history. See the
152
202
 
153
203
  For `Git enrichment omitted: history could not be read completely`, first check
154
204
  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.
205
+ it is available in Woods `2.0.0.beta3`. Supporting versions require Git 2.31 or newer.
156
206
  Check `git --version` in the extraction container and repository/object-store
157
207
  access with its `WOODS_GIT_DIR` setting. A failed history stream is discarded;
158
208
  repair git access and run full extraction to refresh retained metadata. See the
159
209
  [history contract](https://github.com/lost-in-the/woods/blob/main/docs/CONFIGURATION_REFERENCE.md#git-enrichment-history).
160
210
 
211
+ If per-unit Git metadata is absent, check `git --version` inside the extraction
212
+ process/container as well as repository access. Builds with #551 warn when Git
213
+ cannot execute and a repository is expected; older versions may be silent.
214
+ Source archives without a Git directory remain supported. `GIT_SHA` and
215
+ structural `ready` do not certify history availability. After repairing Git,
216
+ run full extraction; see the
217
+ [missing-executable diagnostic](https://github.com/lost-in-the/woods/blob/main/docs/TROUBLESHOOTING.md#git-executable-is-missing-from-the-extraction-environment).
218
+
219
+ For linked-worktree provenance/history mismatches, check the installed version's
220
+ `WOODS_GIT_DIR` support and compare the selected branch and exact SHA inside the
221
+ extraction environment. Mount the complete shared `.git` at its original path
222
+ with no override, or select `/mounted-common/worktrees/<id>` within a relocated
223
+ complete mount. Derive `<id>` from Git metadata, not the branch name. Selecting
224
+ the shared root uses the primary checkout's HEAD and also changes incremental
225
+ ranges. A commit alone may leave the source-file watcher idle; run full
226
+ extraction after repair or when current Git history is required. See the
227
+ [worktree mount guide](https://github.com/lost-in-the/woods/blob/main/docs/TROUBLESHOOTING.md#git-directory-mounts-for-linked-worktrees).
228
+
161
229
  After a bundle change or removal of a dynamically defined job, incremental
162
230
  extraction can retain stale runtime units. Use a fresh process with the updated
163
231
  bundle for full extraction, then validate. For missing external gem paths,
164
232
  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.
233
+ The more explicit `woods:validate` bundle-update remedy (B-166) is available in Woods
234
+ `2.0.0.beta3`; the full-extraction recovery works on older versions too.
167
235
  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
236
 
169
237
  ### Export identity checks
170
238
 
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
239
+ For Notion or Unblocked exports, typed selection checks (#213) are available in Woods
240
+ `2.0.0.beta3`; check the installed gem before expecting them. A missing or
173
241
  mismatched export identity calls for index validation and a fresh extraction,
174
242
  not a force flag. An `ambiguous export URI` means two types share an identifier
175
243
  and source file: preserve existing documents and report the collision; do not
@@ -186,26 +254,35 @@ Compare the client config with the exact command, absolute `cwd`, bundle, and in
186
254
  bundle exec woods-mcp-start ./tmp/woods
187
255
  ```
188
256
 
257
+ If startup says `Could not resolve a published Woods index` (included in Woods
258
+ `2.0.0`) or names a missing `manifest.json` on older versions, first check
259
+ the selected index path: an atomic index uses `generation.json` to locate its
260
+ payload manifest. The new headline does not change index validation or recovery.
261
+ Point at an existing index before suggesting a new extraction. Prefer the
262
+ explicit path above; `WOODS_DIR` is also supported. Woods `2.0.0` includes
263
+ `WOODS_OUTPUT` after those two choices, so verify the installed
264
+ version's configuration guide before relying on that fallback.
265
+
189
266
  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
267
 
191
268
  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
269
 
193
270
  For corrupt pipeline cooldown state, first confirm this is a custom server
194
271
  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`.
272
+ Recovery through `reset_cooldowns` (B-159) is available in Woods `2.0.0.beta3`.
196
273
  Check the installed version before attempting it and follow the
197
274
  [corrupt cooldown recovery guide](https://github.com/lost-in-the/woods/blob/main/docs/TROUBLESHOOTING.md#corrupt-pipeline-cooldown-state).
198
275
 
199
276
  ## Deferred refresh hooks
200
277
 
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
278
+ Expanded hook coverage and `woods:hook_refresh` (#408) are available in Woods
279
+ `2.0.0.beta3`. Verify the installed task through the configured host/container
203
280
  command before diagnosing this plugin's queue. Read `<output>/hook.log` and
204
281
  `hook-pending/`; status 75 means an active daemon deferred work, not that it was
205
282
  consumed. Fix task availability, boot/publication failures or a stalled command,
206
283
  then retry with the same output and command prefix. Preserve pending events.
207
284
  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.
285
+ The concurrent dead-owner recovery fix is included in plugin `2.3.36`.
209
286
  If competing hooks leave an empty lock without a drain, preserve the queued
210
287
  events and follow the canonical recovery guide below.
211
288
  A Docker timeout does not prove the application process stopped. Prefer a
@@ -214,8 +291,8 @@ resident watcher for sustained edits and follow the
214
291
 
215
292
  ## Partial dependency answers
216
293
 
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
294
+ Traversal budgets (`max_nodes`/`max_edges`, #311) are available in Woods `2.0.0.beta3`.
295
+ Check the installed gem version and connected tool schema before
219
296
  using them; installing this plugin does not upgrade the gem. On a supporting
220
297
  server, `partial`/`partial_reason` means the walk stopped early, independently
221
298
  of page truncation. Do not claim an exhaustive blast radius or treat empty
@@ -225,7 +302,19 @@ paging alone only visits the discovered prefix. See the
225
302
 
226
303
  ## 4. Check semantic retrieval
227
304
 
228
- Configured retrieval defaults (#446) are unreleased after beta2. For an installed
305
+ Do not treat structural `ready: true` or bootstrap `hydrated` as proof that
306
+ embeddings exist. Check the installed reader's capabilities: builds with #549
307
+ expose `woods_status.retriever.corpus`, including locally known vector and
308
+ metadata record counts by type. Missing fields or `null` counts mean unknown,
309
+ not zero. Counts include chunks and do not certify complete unit coverage.
310
+ When both stores are known empty, supporting readers return `empty_index` with
311
+ embed or explicit lexical-mode guidance. Follow the
312
+ [corpus diagnostic contract](https://github.com/lost-in-the/woods/blob/main/docs/RETRIEVAL_GUIDE.md#semantic-corpus-diagnostics).
313
+ Older readers need direct embedding-artifact checks; installing this plugin
314
+ does not update the serving gem. Keep reader revision and index writer version
315
+ separate when comparing results.
316
+
317
+ Configured retrieval defaults (#446) are available in Woods `2.0.0.beta3`. For an installed
229
318
  version that supports them, an omitted tool budget uses the serving retriever's
230
319
  configured default; an explicit budget overrides it. Standalone MCP does not
231
320
  inherit the host initializer's token setting from the embedding snapshot.
@@ -233,7 +322,7 @@ Do not tune relevance with similarity_threshold: it is inert and deprecated.
233
322
  Use query/type/scope selection and inspect ranking evidence instead. See
234
323
  [retrieval tuning](https://github.com/lost-in-the/woods/blob/main/docs/RETRIEVAL_GUIDE.md#tuning).
235
324
 
236
- Native embedding completeness checks (#442/#444) are unreleased after beta2;
325
+ Native embedding completeness checks (#442/#444) are available in Woods `2.0.0.beta3`;
237
326
  confirm the installed version first. If embedding reports `Embedding input
238
327
  incomplete`, repair the named published extraction artifact or rebuild extraction
239
328
  before retrying. Do not use `WOODS_ALLOW_PURGE=1` to bypass an integrity failure;
@@ -241,7 +330,7 @@ it only permits intentional mass deletion. Source-empty units deliberately retai
241
330
  metadata without vectors. See the canonical
242
331
  [input-integrity guide](https://github.com/lost-in-the/woods/blob/main/docs/RETRIEVAL_GUIDE.md#input-integrity-and-source-empty-units).
243
332
 
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.
333
+ 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
334
 
246
335
  - OpenAI: verify the key exists without printing it.
247
336
  - Ollama: verify the service and configured model locally.
@@ -252,7 +341,7 @@ Only diagnose this layer when structural tools work and `codebase_retrieve` fail
252
341
  For metadata appearing in another index or worktree, compare `WOODS_OUTPUT`,
253
342
  `config.output_dir`, and any explicit `metadata_store_options[:database]`.
254
343
  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.
344
+ available in Woods `2.0.0.beta3`; check the installed version before relying on it.
256
345
  An explicit database path still wins. See the
257
346
  [SQLite path contract](https://github.com/lost-in-the/woods/blob/main/docs/CONFIGURATION_REFERENCE.md#sqlite-metadata)
258
347
  for isolation and upgrade steps.
@@ -261,15 +350,25 @@ for isolation and upgrade steps.
261
350
 
262
351
  For repeated missing-token boot warnings on a stdio-only host, check whether
263
352
  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
353
+ suggesting it; this option is available in Woods `2.0.0.beta3`. The default
265
354
  preserves HTTP enablement, so selecting stdio as a client alone does not
266
355
  suppress HTTP token validation. Never disable authentication on an HTTP
267
356
  endpoint to silence this warning.
268
357
 
269
358
  Console failures are live Rails/config/security failures, not Index failures. Verify authorized environment, Rails boot, `WOODS_CONSOLE_CONFIG` or direct `cwd`, blocked-table policy, credentials, and stderr.
270
359
 
360
+ For stdio parse errors or response mismatches during tool calls, check for Rails
361
+ logs on stdout. Through Woods `2.0.0.beta4`, stdout is restored after boot;
362
+ configure the Console process's logger to use stderr or a file. Runtime stdout
363
+ isolation is included in Woods `2.0.0`: verify a patched installed revision
364
+ before relying on it. Prefer `bundle exec rake woods:console`; direct Rails
365
+ runner invocation cannot capture output already emitted during Rails boot.
366
+ See the [Console logging diagnosis](https://github.com/lost-in-the/woods/blob/main/docs/CONSOLE_MCP_SETUP.md#rails-logs-break-mcp-protocol).
367
+
271
368
  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
369
 
370
+ 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.
371
+
273
372
  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
373
 
275
374
  ## Report
@@ -280,7 +379,7 @@ Canonical guide: [TROUBLESHOOTING.md](https://github.com/lost-in-the/woods/blob/
280
379
 
281
380
  ## Lexical retrieval capability check
282
381
 
283
- This is a development capability. Before proposing it, verify the installed gem
382
+ Lexical retrieval is available from `2.0.0.beta3`. Before proposing it, verify the installed gem
284
383
  exposes `Woods::Configuration#retrieval_mode` and its matching guide documents
285
384
  `WOODS_RETRIEVAL_MODE`. Keep the installed-version preflight; do not infer support
286
385
  from the plugin version or an unreleased checkout.
@@ -303,7 +402,7 @@ query. Scoping can hide relevant cross-boundary relationships, so broaden the
303
402
  request deliberately when the task needs them. See the
304
403
  [scope contract](https://github.com/lost-in-the/woods/blob/main/docs/RETRIEVAL_GUIDE.md#explicit-package-and-source-path-scopes).
305
404
 
306
- ## Source-content freshness (unreleased #405)
405
+ ## Source-content freshness (Woods 2.0.0.beta3; #405)
307
406
 
308
407
  Check installed-version support before using `woods-extract` or the optional
309
408
  `woods_status.source_check` argument. With support, inspect
@@ -326,7 +425,7 @@ coordinates are not physical file offsets; unknown generation remains unknown.
326
425
  Keep full-source access available. See the canonical
327
426
  [evidence contract](https://github.com/lost-in-the/woods/blob/main/docs/RETRIEVAL_GUIDE.md#compact-published-evidence-and-api-outlines).
328
427
 
329
- ## Explicit edit adapters (unreleased #409)
428
+ ## Explicit edit adapters (Woods 2.0.0.beta3; #409)
330
429
 
331
430
  Check the installed gem exposes `woods:hook_refresh` before enabling hooks.
332
431
  Claude's registered wrapper covers one documented edit path; OpenCode 1.18.27
@@ -341,7 +440,7 @@ user's setup request. Follow [client hooks](https://github.com/lost-in-the/woods
341
440
  ## Optional context hints
342
441
 
343
442
  Check installed `bundle exec woods-hook-context --help` before enabling
344
- `WOODS_HOOK_CONTEXT_ENABLED=1`; this capability is unreleased after beta2 and the
443
+ `WOODS_HOOK_CONTEXT_ENABLED=1`; this capability is available in Woods `2.0.0.beta3` and the
345
444
  plugin does not upgrade the gem. Context and refresh opt-ins are independent;
346
445
  `WOODS_HOOKS_DISABLED=1` disables both. Native Claude context is synchronous and
347
446
  bounded, with served-generation and pre-refresh/unknown labels. Verify candidate
@@ -352,7 +451,8 @@ for output/time limits, container root mapping and emitted-hint suppression.
352
451
 
353
452
  ### Obsidian destination conflicts
354
453
 
355
- Destination ownership preflight (#441) is unreleased; first check the installed Woods version and
454
+ Destination ownership preflight (#441) is available in Woods `2.0.0.beta3`; first check
455
+ the installed Woods version and
356
456
  its matching guide. On versions with this check, `refusing <path>: unmanaged or modified destination`
357
457
  means the export preserved a conflicting note, setting, or sidecar and skipped the stale-note sweep.
358
458
  A `.woods-vault` sentinel or force-purge flag does not authorize overwriting it. Inspect and back up
@@ -10,13 +10,13 @@ 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
17
17
  readiness or authorize maintenance or live Console access.
18
18
 
19
- Call `woods_status` before relying on the index. Require a ready index with a current generation and non-zero counts for the types you need; use `codebase_retrieve` only when status reports retrieval enabled. If status is unhealthy or the generation predates the code under review, report that and ask the owner to run `woods:incremental` or `woods:extract` — do not present "not found" as proof the code does not exist.
19
+ Call `woods_status` before relying on the index. Require a ready index with a current generation and non-zero counts for the types you need; verify the retrieval mode and its data before using `codebase_retrieve` (see Conceptual questions below). If status is unhealthy or the generation predates the code under review, report that and ask the owner to run `woods:incremental` or `woods:extract` — do not present "not found" as proof the code does not exist.
20
20
 
21
21
  ## The default loop
22
22
 
@@ -31,9 +31,9 @@ Identifiers are namespaced and typed; never invent one from a filename when `sea
31
31
 
32
32
  - **Code review / change impact**: `lookup` the changed unit, then `dependents` at depth 1 before going deeper. Group results by relationship type and layer; report direct dependents separately from inferred downstream impact. A graph edge is not test coverage — select tests from mappings and repository search.
33
33
  - **Audit / architecture assessment**: `graph_analysis` for orphans, dead ends, hubs, cycles, bridges, cross-database edges, volatile dependencies, and undeclared package edges; `domain_clusters` for architectural domains; `pagerank` for high-impact units worth reading first.
34
- - **Investigating behavior / debugging**: `trace_flow` from the user-visible entry point (route, controller action, job, mailer, service), `lookup` at ambiguous steps, and verify anything conditional or dynamically dispatched in source and tests — do not infer call order from a dependency edge.
34
+ - **Investigating behavior / debugging**: find the exact indexed unit with `search` and `lookup`, then use `trace_flow` with `UnitIdentifier` or `UnitIdentifier#method` (for example, `CheckoutService#order`). Bare `order` names a unit, potentially a factory, rather than locating an application method. Receiverless local calls may remain unexpanded; inspect their source or trace the owning unit's method explicitly. Flow output is not proof of runtime execution or exhaustive call coverage. See the [flow workflow](https://github.com/lost-in-the/woods/blob/main/docs/AGENT_GUIDE.md#trace-a-feature-flow).
35
35
  - **Onboarding**: `structure` for the codebase overview, `lookup` and `dependencies`/`dependents` for a unit's neighborhood, and `domain_clusters` for the domain map, then the default loop on the units that matter.
36
- - **Conceptual questions**: `codebase_retrieve` when status says ready; govern with `budget` (never `limit`), then verify key units with `lookup`.
36
+ - **Conceptual questions**: check retrieval mode and data before `codebase_retrieve`; structural `ready` alone does not establish semantic availability. On readers supporting #549, inspect `retriever.corpus`; missing or unknown counts require checking embedding artifacts. Govern with `budget` (never `limit`), then verify key units with `lookup`.
37
37
 
38
38
  ## Boundaries
39
39
 
@@ -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 included in Woods `2.0.0`.
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
+ included in Woods `2.0.0`). 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 included in Woods `2.0.0`; 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