woods 2.0.0.beta2 → 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 (233) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +339 -1
  3. data/CONTRIBUTING.md +188 -12
  4. data/README.md +93 -174
  5. data/SECURITY.md +9 -6
  6. data/docs/AGENT_GUIDE.md +109 -8
  7. data/docs/AGENT_SETUP.md +98 -7
  8. data/docs/BACKEND_MATRIX.md +25 -0
  9. data/docs/CLIENT_HOOKS.md +111 -0
  10. data/docs/CONFIGURATION_REFERENCE.md +267 -16
  11. data/docs/CONSOLE_MCP_SETUP.md +80 -7
  12. data/docs/DOCKER_SETUP.md +22 -3
  13. data/docs/EVALUATION.md +464 -1
  14. data/docs/EXTRACTOR_REFERENCE.md +45 -6
  15. data/docs/FAQ.md +11 -12
  16. data/docs/GETTING_STARTED.md +17 -5
  17. data/docs/INCREMENTAL_EXTRACTION.md +147 -7
  18. data/docs/INDEX_LAYOUT.md +382 -0
  19. data/docs/INTERNALS.md +7 -2
  20. data/docs/MCP_SERVERS.md +276 -5
  21. data/docs/MCP_TOOL_COOKBOOK.md +37 -22
  22. data/docs/MCP_WORKTREE_SETUP.md +43 -83
  23. data/docs/NOTION_INTEGRATION.md +13 -0
  24. data/docs/OBSIDIAN_INTEGRATION.md +57 -9
  25. data/docs/PUBLISHED_INDEX.md +72 -0
  26. data/docs/README.md +7 -0
  27. data/docs/RETRIEVAL_GUIDE.md +273 -12
  28. data/docs/RUNTIME_TRACING.md +71 -0
  29. data/docs/SOURCE_FRESHNESS.md +143 -0
  30. data/docs/TROUBLESHOOTING.md +129 -18
  31. data/docs/UNBLOCKED_INTEGRATION.md +25 -0
  32. data/docs/UPGRADING_TO_2.md +48 -22
  33. data/docs/WATCH_DAEMON.md +277 -67
  34. data/exe/woods-agent-config +6 -0
  35. data/exe/woods-extract +5 -0
  36. data/exe/woods-hook-context +6 -0
  37. data/exe/woods-mcp-start +14 -9
  38. data/lib/generators/woods/pgvector_generator.rb +8 -2
  39. data/lib/generators/woods/templates/woods.rb.tt +1 -3
  40. data/lib/tasks/woods.rake +47 -397
  41. data/lib/woods/agent_configuration/applier.rb +135 -0
  42. data/lib/woods/agent_configuration/cli.rb +101 -0
  43. data/lib/woods/agent_configuration/cli_options.rb +29 -0
  44. data/lib/woods/agent_configuration/document.rb +105 -0
  45. data/lib/woods/agent_configuration/error.rb +7 -0
  46. data/lib/woods/agent_configuration/launcher.rb +75 -0
  47. data/lib/woods/agent_configuration/layout.rb +72 -0
  48. data/lib/woods/agent_configuration/managed_section.rb +62 -0
  49. data/lib/woods/agent_configuration/plan.rb +98 -0
  50. data/lib/woods/agent_configuration/plan_diff.rb +38 -0
  51. data/lib/woods/agent_configuration/planned_files.rb +61 -0
  52. data/lib/woods/agent_configuration/planner.rb +63 -0
  53. data/lib/woods/agent_configuration/planner_validation.rb +77 -0
  54. data/lib/woods/agent_configuration/preflight.rb +100 -0
  55. data/lib/woods/agent_configuration/recovery.rb +49 -0
  56. data/lib/woods/ast/node.rb +2 -0
  57. data/lib/woods/ast/parser.rb +38 -5
  58. data/lib/woods/builder.rb +21 -5
  59. data/lib/woods/cache/cache_middleware.rb +28 -7
  60. data/lib/woods/cache/cache_store.rb +4 -5
  61. data/lib/woods/change_set.rb +5 -4
  62. data/lib/woods/console/credential_index.rb +20 -2
  63. data/lib/woods/console/credential_scanner.rb +18 -17
  64. data/lib/woods/console/credential_scanner_registry.rb +36 -0
  65. data/lib/woods/console/dispatch_pipeline.rb +7 -0
  66. data/lib/woods/console/embedded_executor.rb +32 -10
  67. data/lib/woods/console/encrypted_credential_snapshot.rb +16 -0
  68. data/lib/woods/console/rack_middleware.rb +22 -13
  69. data/lib/woods/console/server.rb +18 -16
  70. data/lib/woods/console/sql_noise_stripper.rb +9 -7
  71. data/lib/woods/console/sql_table_scanner.rb +47 -7
  72. data/lib/woods/console/sql_validator.rb +49 -9
  73. data/lib/woods/console/sqlite_read_guard.rb +46 -0
  74. data/lib/woods/coordination/pipeline_lock.rb +3 -2
  75. data/lib/woods/dependency_graph.rb +65 -13
  76. data/lib/woods/embedding/corpus.rb +94 -0
  77. data/lib/woods/embedding/indexer.rb +114 -60
  78. data/lib/woods/embedding/openai.rb +17 -6
  79. data/lib/woods/evaluation/ablation_executor.rb +6 -1
  80. data/lib/woods/evaluation/ablation_timed_executor.rb +22 -4
  81. data/lib/woods/export/typed_reader.rb +56 -0
  82. data/lib/woods/extractor.rb +277 -149
  83. data/lib/woods/extractors/action_cable_extractor.rb +3 -1
  84. data/lib/woods/extractors/behavioral_profile.rb +9 -7
  85. data/lib/woods/extractors/caching_extractor.rb +3 -1
  86. data/lib/woods/extractors/concern_extractor.rb +64 -6
  87. data/lib/woods/extractors/configuration_extractor.rb +7 -3
  88. data/lib/woods/extractors/controller_extractor.rb +13 -4
  89. data/lib/woods/extractors/database_view_extractor.rb +3 -1
  90. data/lib/woods/extractors/declared_parent.rb +55 -0
  91. data/lib/woods/extractors/decorator_extractor.rb +3 -1
  92. data/lib/woods/extractors/engine_extractor.rb +3 -1
  93. data/lib/woods/extractors/event_extractor.rb +4 -2
  94. data/lib/woods/extractors/factory_extractor.rb +3 -1
  95. data/lib/woods/extractors/graphql_extractor.rb +10 -13
  96. data/lib/woods/extractors/i18n_extractor.rb +3 -1
  97. data/lib/woods/extractors/job_extractor.rb +6 -19
  98. data/lib/woods/extractors/lib_extractor.rb +13 -9
  99. data/lib/woods/extractors/mailer_extractor.rb +26 -15
  100. data/lib/woods/extractors/manager_extractor.rb +3 -1
  101. data/lib/woods/extractors/method_parameters.rb +53 -0
  102. data/lib/woods/extractors/middleware_argument.rb +65 -0
  103. data/lib/woods/extractors/middleware_extractor.rb +9 -3
  104. data/lib/woods/extractors/migration_extractor.rb +3 -1
  105. data/lib/woods/extractors/model_extractor.rb +26 -34
  106. data/lib/woods/extractors/package_extractor.rb +24 -4
  107. data/lib/woods/extractors/phlex_extractor.rb +3 -1
  108. data/lib/woods/extractors/policy_extractor.rb +3 -1
  109. data/lib/woods/extractors/poro_extractor.rb +13 -9
  110. data/lib/woods/extractors/pundit_extractor.rb +3 -1
  111. data/lib/woods/extractors/rails_source_extractor.rb +4 -2
  112. data/lib/woods/extractors/rake_task_extractor.rb +4 -2
  113. data/lib/woods/extractors/route_extractor.rb +3 -1
  114. data/lib/woods/extractors/route_helper_resolver.rb +10 -33
  115. data/lib/woods/extractors/scheduled_job_extractor.rb +41 -15
  116. data/lib/woods/extractors/serializer_extractor.rb +4 -2
  117. data/lib/woods/extractors/service_extractor.rb +3 -1
  118. data/lib/woods/extractors/shared_dependency_scanner.rb +2 -2
  119. data/lib/woods/extractors/shared_utility_methods.rb +48 -19
  120. data/lib/woods/extractors/source_nesting.rb +1 -1
  121. data/lib/woods/extractors/state_machine_extractor.rb +3 -1
  122. data/lib/woods/extractors/test_mapping_extractor.rb +3 -1
  123. data/lib/woods/extractors/validator_extractor.rb +3 -1
  124. data/lib/woods/extractors/view_component_extractor.rb +3 -1
  125. data/lib/woods/extractors/view_template_extractor.rb +3 -1
  126. data/lib/woods/gem_mapper.rb +2 -0
  127. data/lib/woods/git_history.rb +116 -0
  128. data/lib/woods/graph_analyzer.rb +35 -6
  129. data/lib/woods/hooks/context_cli.rb +54 -0
  130. data/lib/woods/hooks/context_event.rb +88 -0
  131. data/lib/woods/hooks/context_hint.rb +73 -0
  132. data/lib/woods/hooks/context_impact.rb +77 -0
  133. data/lib/woods/hooks/context_output.rb +47 -0
  134. data/lib/woods/hooks/context_state.rb +102 -0
  135. data/lib/woods/hooks/refresh.rb +79 -0
  136. data/lib/woods/hooks/rule_projection.rb +78 -0
  137. data/lib/woods/input_rules.rb +19 -0
  138. data/lib/woods/mcp/bearer_auth.rb +22 -13
  139. data/lib/woods/mcp/bootstrapper.rb +79 -4
  140. data/lib/woods/mcp/config_resolver.rb +2 -1
  141. data/lib/woods/mcp/index_reader.rb +334 -162
  142. data/lib/woods/mcp/initialization_guidance.rb +27 -0
  143. data/lib/woods/mcp/origin_guard.rb +17 -9
  144. data/lib/woods/mcp/published_lexical_retriever.rb +115 -0
  145. data/lib/woods/mcp/renderers/markdown_renderer.rb +22 -9
  146. data/lib/woods/mcp/renderers/plain_renderer.rb +18 -8
  147. data/lib/woods/mcp/search_results.rb +74 -0
  148. data/lib/woods/mcp/server.rb +178 -63
  149. data/lib/woods/mcp/tool_contract.rb +3 -1
  150. data/lib/woods/mcp/tool_response_renderer.rb +41 -0
  151. data/lib/woods/mcp/traversal_evidence.rb +113 -0
  152. data/lib/woods/mcp/traversal_evidence_index.rb +100 -0
  153. data/lib/woods/mcp/traversal_evidence_page.rb +41 -0
  154. data/lib/woods/mcp/traversal_evidence_text.rb +52 -0
  155. data/lib/woods/mcp/traversal_response.rb +22 -0
  156. data/lib/woods/notion/exporter.rb +56 -17
  157. data/lib/woods/obsidian/destination_plan.rb +98 -0
  158. data/lib/woods/obsidian/name_mapper.rb +19 -3
  159. data/lib/woods/obsidian/note_builder.rb +19 -10
  160. data/lib/woods/obsidian/vault_exporter.rb +88 -32
  161. data/lib/woods/operator/pipeline_guard.rb +18 -13
  162. data/lib/woods/path_dispatcher.rb +13 -6
  163. data/lib/woods/payload_store.rb +27 -26
  164. data/lib/woods/published_index/typed_unit_reader.rb +40 -3
  165. data/lib/woods/published_index.rb +2 -2
  166. data/lib/woods/railtie.rb +3 -3
  167. data/lib/woods/railtie_support.rb +12 -12
  168. data/lib/woods/rake_helpers.rb +382 -0
  169. data/lib/woods/resilience/graph_invariant_validator/membership_checks.rb +71 -0
  170. data/lib/woods/resilience/graph_invariant_validator/node_checks.rb +61 -0
  171. data/lib/woods/resilience/graph_invariant_validator/reverse_relationship_checks.rb +46 -0
  172. data/lib/woods/resilience/graph_invariant_validator.rb +119 -0
  173. data/lib/woods/resilience/index_validator/graph_checks.rb +80 -0
  174. data/lib/woods/resilience/index_validator.rb +112 -23
  175. data/lib/woods/retrieval/context_assembler.rb +50 -15
  176. data/lib/woods/retrieval/lexical_assembler.rb +84 -0
  177. data/lib/woods/retrieval/lexical_index.rb +120 -0
  178. data/lib/woods/retrieval/ranker.rb +4 -2
  179. data/lib/woods/retrieval/scope.rb +108 -0
  180. data/lib/woods/retrieval/scoped_graph_store.rb +32 -0
  181. data/lib/woods/retrieval/scoped_vector_store.rb +55 -0
  182. data/lib/woods/retrieval/search_executor.rb +86 -27
  183. data/lib/woods/retrieval/source_evidence.rb +200 -0
  184. data/lib/woods/retriever.rb +98 -22
  185. data/lib/woods/ruby_analyzer/trace_enricher.rb +77 -38
  186. data/lib/woods/session_tracer/file_store.rb +6 -1
  187. data/lib/woods/session_tracer/middleware.rb +10 -12
  188. data/lib/woods/session_tracer/redis_store.rb +22 -6
  189. data/lib/woods/session_tracer/session_flow_assembler.rb +23 -17
  190. data/lib/woods/session_tracer/solid_cache_coordination.rb +6 -4
  191. data/lib/woods/session_tracer/unit_resolver.rb +63 -0
  192. data/lib/woods/source_inputs/consumer_errors.rb +31 -0
  193. data/lib/woods/source_inputs/handoff.rb +102 -0
  194. data/lib/woods/source_inputs/launcher.rb +157 -0
  195. data/lib/woods/source_inputs/manifest.rb +124 -0
  196. data/lib/woods/source_inputs/private_key.rb +55 -0
  197. data/lib/woods/source_inputs/scanner.rb +171 -0
  198. data/lib/woods/source_inputs/scopes.rb +71 -0
  199. data/lib/woods/source_inputs/session.rb +214 -0
  200. data/lib/woods/source_inputs/status.rb +84 -0
  201. data/lib/woods/source_inputs/verifier.rb +107 -0
  202. data/lib/woods/storage/metadata_store.rb +25 -25
  203. data/lib/woods/storage/pgvector.rb +35 -10
  204. data/lib/woods/storage/qdrant.rb +17 -7
  205. data/lib/woods/storage/vector_store.rb +18 -6
  206. data/lib/woods/tasks.rb +3 -2
  207. data/lib/woods/temporal/json_snapshot_store.rb +58 -9
  208. data/lib/woods/unblocked/exporter.rb +59 -70
  209. data/lib/woods/version.rb +1 -1
  210. data/lib/woods/watch/boot_snapshot.rb +52 -0
  211. data/lib/woods/watch/daemon.rb +154 -32
  212. data/lib/woods/watch/listen_watcher.rb +4 -0
  213. data/lib/woods/watch/polling_watcher.rb +5 -1
  214. data/lib/woods/watch/status.rb +20 -15
  215. data/lib/woods/watch/tree_scan.rb +21 -13
  216. data/lib/woods/watch/watcher.rb +4 -1
  217. data/lib/woods.rb +50 -11
  218. data/plugin/.claude-plugin/plugin.json +1 -1
  219. data/plugin/hooks/adapters/normalize.jq +15 -0
  220. data/plugin/hooks/adapters/normalize.rb +63 -0
  221. data/plugin/hooks/hooks.json +20 -0
  222. data/plugin/hooks/woods-context.sh +50 -0
  223. data/plugin/hooks/woods-input-rules.sh +159 -0
  224. data/plugin/hooks/woods-opencode.mjs +65 -0
  225. data/plugin/hooks/woods-post-edit.sh +2 -225
  226. data/plugin/hooks/woods-refresh.sh +260 -0
  227. data/plugin/hooks/woods-session-start.sh +47 -55
  228. data/plugin/skills/woods-agent-enable/SKILL.md +19 -0
  229. data/plugin/skills/woods-diagnose/SKILL.md +319 -1
  230. data/plugin/skills/woods-investigate/SKILL.md +145 -0
  231. data/plugin/skills/woods-mcp-config/SKILL.md +90 -2
  232. data/plugin/skills/woods-setup/SKILL.md +110 -6
  233. metadata +87 -5
@@ -14,6 +14,19 @@ git status --short --branch
14
14
 
15
15
  This skill describes the Woods 2.x line; the authoritative minimum version lives in the marketplace entry. Diagnose against capabilities the recorded installed version actually provides.
16
16
 
17
+ ## Managed configuration availability
18
+
19
+ `woods-agent-config` (#407) is available in Woods `2.0.0.beta3`. First record the
20
+ installed version and test `bundle exec woods-agent-config --help` in the
21
+ selected application bundle. When supported, use its saved setup/update/remove
22
+ plan and explicit client/scope/root selection; apply the reviewed plan within
23
+ the user's existing authorization. Do not infer ownership from a server name
24
+ or repair edited managed sections by overwriting them. Plans and recovery
25
+ journals contain private configuration bytes. See the canonical
26
+ [managed configuration runbook](https://github.com/lost-in-the/woods/blob/main/docs/AGENT_SETUP.md#managed-claude-code-configuration)
27
+ for host/Compose preflight, actual Claude file locations, conflict recovery,
28
+ and removal. Preserve manual setup for older installed versions.
29
+
17
30
  ## 1. Check Rails
18
31
 
19
32
  ```bash
@@ -23,8 +36,58 @@ bundle exec rails runner 'Rails.application.eager_load!; puts "eager load ok"'
23
36
 
24
37
  Use the application's normal Docker command and environment variables when applicable. Fix boot/eager-load failures before Woods.
25
38
 
39
+ ### Watch repeatedly exits 75
40
+
41
+ Check the installed version's watch guide. Older releases, including
42
+ `2.0.0.beta2`, can rediscover the same restart-trigger paths on every boot. Stop
43
+ the supervisor, run one successful full extraction, then restart the standalone
44
+ watch task. Do not assume automatic startup reconciliation exists in that release.
45
+ For versions documenting environment-boot snapshots, confirm that the command is
46
+ `bundle exec rake woods:watch`, with no preceding `environment` task, and check
47
+ whether boot inputs keep changing during initialization or catch-up.
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
+
62
+ ### Watch misses edits under a shared directory alias
63
+
64
+ Check the installed version: logical alias preservation (#445) is available in Woods `2.0.0.beta3`.
65
+ Older polling/catch-up walkers could visit an irrelevant alias first and suppress
66
+ `app/models` when both point to the same physical directory. Compare the logical
67
+ path with the extraction input path; a running daemon alone does not prove coverage.
68
+ Use a manual extraction for recovery until upgrading. The corrected walker keeps
69
+ independent aliases and prunes ancestor cycles; do not remove cycle or ignore guards.
70
+ See the installed version's watch guide before assuming this behavior.
71
+
72
+ ### Session trace reports ambiguous identity
73
+
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
76
+ with multiple published extraction types, so no partial session context is
77
+ returned. Use `depth: 0` for the timeline or inspect the named candidates with
78
+ explicit `lookup` types. Do not choose one by index order or suggest that a full
79
+ extraction will remove a legitimate cross-type collision. See the canonical
80
+ [session identity contract](https://github.com/lost-in-the/woods/blob/main/docs/MCP_SERVERS.md#index-server).
81
+
26
82
  ## 2. Check the published index
27
83
 
84
+ For a `same-type identifier collision`, inspect both named source files and the
85
+ Rails loader before suggesting source edits. Wrapper-nested class naming needs
86
+ Zeitwerk mode and Zeitwerk >= 2.6.9; an older loader or classic mode can produce
87
+ the collision even when the namespace wrappers are valid. The expanded error
88
+ guidance (B-149) is available in Woods `2.0.0.beta3`; check the installed version
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).
90
+
28
91
  ```bash
29
92
  bin/rails woods:validate
30
93
  bin/rails woods:stats
@@ -32,12 +95,108 @@ bin/rails woods:stats
32
95
 
33
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.
34
97
 
98
+ Semantic graph validation (#413) is available in Woods `2.0.0.beta3`; verify the
99
+ installed gem before expecting these errors. Supporting versions check typed
100
+ unit identity, graph/index agreement and forward/reverse/file/type memberships
101
+ within one pinned generation. Preserve the failing generation and exact error,
102
+ then run a fresh full extraction with the intended bundle and validate again.
103
+ Do not hand-edit derived graph indexes to silence failures. A repeated error on
104
+ a fresh full run is evidence to report as an extraction defect. Unresolved
105
+ targets can be valid; validation cannot prove runtime execution or distinguish
106
+ an external name from an internal unit omitted everywhere. Follow the
107
+ [semantic recovery guide](https://github.com/lost-in-the/woods/blob/main/docs/TROUBLESHOOTING.md#semantic-graph-validation-errors).
108
+
109
+ If external targets such as `http_api` lose dependents after incremental
110
+ extraction, check whether the installed Woods version includes B-193.
111
+ The fix is available in Woods `2.0.0.beta3`; installing this plugin does not upgrade the gem.
112
+ Affected indexes need one full extraction after upgrading to a fixed version.
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).
114
+
115
+ For a custom shell/Python reader or upload gate, check its installed-version
116
+ assumptions against the [filesystem layout contract](https://github.com/lost-in-the/woods/blob/main/docs/INDEX_LAYOUT.md).
117
+ Resolve the pointer once and pin the manifest during a complete read/copy; never
118
+ select the highest payload directory or treat a missing root graph as no index.
119
+ Confirm the installed release and filesystem support retention locks before
120
+ using the pinning examples; flat layouts need writers stopped for a consistent copy.
121
+
122
+ A host reader can report a container daemon dead because foreign-host records
123
+ are rejected by default. Foreign heartbeat trust (#321) is available in Woods `2.0.0.beta3`: first
124
+ check the installed Woods version and that version's release notes. Only for a
125
+ supporting version, offer `WOODS_WATCH_TRUST_FOREIGN_HOST=1` in every relevant
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).
127
+ Fresh `degraded` still means incremental work is needed; a fresh `running`
128
+ record can outlive a crashed foreign daemon by up to 15 minutes. Older versions
129
+ need their status check run in the daemon's own container.
130
+
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
133
+ with `server.version`; missing/null is unknown, not a failure. A validator
134
+ major-version warning calls for full extraction and upgrade review, while a match
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).
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
+
35
143
  If a one-shot extraction raises `Could not publish generation`, the candidate
36
144
  payload was written but never made visible; readers still serve the previous
37
145
  complete generation. Fix the named filesystem, permission, space, or mount
38
146
  failure and rerun the same task. Never edit `generation.json` or point a reader
39
147
  at the unreachable payload by hand.
40
148
 
149
+ For slow extraction, use `WOODS_PROFILE=1` when supported by the installed
150
+ version. Keep process boot and resident-cycle measurements separate. Older
151
+ profiles nest payload sync and retention inside `publish`; current source
152
+ reports disjoint phases and a separate `[profile total]` line. Do not add
153
+ whole-run totals to phase durations or promise the new lines on an older gem.
154
+ Use the installed version's tagged guide; the
155
+ [canonical profiling guide](https://github.com/lost-in-the/woods/blob/main/docs/INCREMENTAL_EXTRACTION.md#profiling-fixed-costs)
156
+ tracks current source.
157
+
158
+ For volatile-dependency reports dominated by one target, compare the full
159
+ `stats.volatile_dependency_count` with the persisted array and use the
160
+ [ratio tuning guidance](https://github.com/lost-in-the/woods/blob/main/docs/CONFIGURATION_REFERENCE.md#pipeline-options).
161
+ The optional per-target cap (B-188) is available in Woods `2.0.0.beta3`; check the
162
+ installed gem before suggesting `volatile_dependency_limit_per_target`.
163
+ Re-extract to publish configuration changes; the report remains informational.
164
+
165
+ For a shallow-checkout git-enrichment warning, the shallow guard (B-189) is
166
+ available in Woods `2.0.0.beta3`; check the installed version first. Fetch complete
167
+ history with `git fetch --unshallow` or `actions/checkout` `fetch-depth: 0`, then
168
+ run full extraction. Depth two only enables a two-commit diff; it does not
169
+ restore complete churn history. See the
170
+ [git metadata recovery guide](https://github.com/lost-in-the/woods/blob/main/docs/TROUBLESHOOTING.md#git-metadata-is-missing-or-shows-zeros).
171
+
172
+ For `Git enrichment omitted: history could not be read completely`, first check
173
+ whether the installed Woods release documents the new streamed-history policy;
174
+ it is available in Woods `2.0.0.beta3`. Supporting versions require Git 2.31 or newer.
175
+ Check `git --version` in the extraction container and repository/object-store
176
+ access with its `WOODS_GIT_DIR` setting. A failed history stream is discarded;
177
+ repair git access and run full extraction to refresh retained metadata. See the
178
+ [history contract](https://github.com/lost-in-the/woods/blob/main/docs/CONFIGURATION_REFERENCE.md#git-enrichment-history).
179
+
180
+ After a bundle change or removal of a dynamically defined job, incremental
181
+ extraction can retain stale runtime units. Use a fresh process with the updated
182
+ bundle for full extraction, then validate. For missing external gem paths,
183
+ first distinguish an upgraded bundle from a reader on a different host/mount.
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.
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).
187
+
188
+ ### Export identity checks
189
+
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
192
+ mismatched export identity calls for index validation and a fresh extraction,
193
+ not a force flag. An `ambiguous export URI` means two types share an identifier
194
+ and source file: preserve existing documents and report the collision; do not
195
+ rename public identifiers or force deletion. Follow the canonical
196
+ [Notion](https://github.com/lost-in-the/woods/blob/main/docs/NOTION_INTEGRATION.md#sync-manifest-incremental-sync)
197
+ and [Unblocked](https://github.com/lost-in-the/woods/blob/main/docs/UNBLOCKED_INTEGRATION.md#uri-scheme)
198
+ guides for recovery and current limitations.
199
+
41
200
  ## 3. Check the MCP process and path
42
201
 
43
202
  Compare the client config with the exact command, absolute `cwd`, bundle, and index path visible to that process. Run the configured executable manually to read stderr. For a host bundle:
@@ -46,13 +205,71 @@ Compare the client config with the exact command, absolute `cwd`, bundle, and in
46
205
  bundle exec woods-mcp-start ./tmp/woods
47
206
  ```
48
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
+
49
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.
50
218
 
51
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.
52
220
 
221
+ For corrupt pipeline cooldown state, first confirm this is a custom server
222
+ with `pipeline_repair` registered; packaged `woods-mcp` does not wire it.
223
+ Recovery through `reset_cooldowns` (B-159) is available in Woods `2.0.0.beta3`.
224
+ Check the installed version before attempting it and follow the
225
+ [corrupt cooldown recovery guide](https://github.com/lost-in-the/woods/blob/main/docs/TROUBLESHOOTING.md#corrupt-pipeline-cooldown-state).
226
+
227
+ ## Deferred refresh hooks
228
+
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
231
+ command before diagnosing this plugin's queue. Read `<output>/hook.log` and
232
+ `hook-pending/`; status 75 means an active daemon deferred work, not that it was
233
+ consumed. Fix task availability, boot/publication failures or a stalled command,
234
+ then retry with the same output and command prefix. Preserve pending events.
235
+ For mkdir fallback locks, inspect the recorded owner PID before manual removal.
236
+ The concurrent dead-owner recovery fix is included in plugin `2.3.36`.
237
+ If competing hooks leave an empty lock without a drain, preserve the queued
238
+ events and follow the canonical recovery guide below.
239
+ A Docker timeout does not prove the application process stopped. Prefer a
240
+ resident watcher for sustained edits and follow the
241
+ [canonical retry guide](https://github.com/lost-in-the/woods/blob/main/docs/WATCH_DAEMON.md#hooks-for-agent-sessions).
242
+
243
+ ## Partial dependency answers
244
+
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
247
+ using them; installing this plugin does not upgrade the gem. On a supporting
248
+ server, `partial`/`partial_reason` means the walk stopped early, independently
249
+ of page truncation. Do not claim an exhaustive blast radius or treat empty
250
+ deps as proof of a leaf. Narrow depth/types/via or increase a supported budget;
251
+ paging alone only visits the discovered prefix. See the
252
+ [budget contract](https://github.com/lost-in-the/woods/blob/main/docs/MCP_SERVERS.md#dependency-traversal-budgets).
253
+
53
254
  ## 4. Check semantic retrieval
54
255
 
55
- Only diagnose this layer when structural tools work and `codebase_retrieve` fails. Check `woods_status`, configured provider/model/vector store, provider reachability, and whether `woods:embed` completed.
256
+ Configured retrieval defaults (#446) are available in Woods `2.0.0.beta3`. For an installed
257
+ version that supports them, an omitted tool budget uses the serving retriever's
258
+ configured default; an explicit budget overrides it. Standalone MCP does not
259
+ inherit the host initializer's token setting from the embedding snapshot.
260
+ Do not tune relevance with similarity_threshold: it is inert and deprecated.
261
+ Use query/type/scope selection and inspect ranking evidence instead. See
262
+ [retrieval tuning](https://github.com/lost-in-the/woods/blob/main/docs/RETRIEVAL_GUIDE.md#tuning).
263
+
264
+ Native embedding completeness checks (#442/#444) are available in Woods `2.0.0.beta3`;
265
+ confirm the installed version first. If embedding reports `Embedding input
266
+ incomplete`, repair the named published extraction artifact or rebuild extraction
267
+ before retrying. Do not use `WOODS_ALLOW_PURGE=1` to bypass an integrity failure;
268
+ it only permits intentional mass deletion. Source-empty units deliberately retain
269
+ metadata without vectors. See the canonical
270
+ [input-integrity guide](https://github.com/lost-in-the/woods/blob/main/docs/RETRIEVAL_GUIDE.md#input-integrity-and-source-empty-units).
271
+
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.
56
273
 
57
274
  - OpenAI: verify the key exists without printing it.
58
275
  - Ollama: verify the service and configured model locally.
@@ -60,12 +277,29 @@ Only diagnose this layer when structural tools work and `codebase_retrieve` fail
60
277
  - Dimension mismatch: rebuild into a store matching the configured model; do not suppress the preflight.
61
278
  - Purge guard: back up and inspect the proposed deletion; never set `WOODS_ALLOW_PURGE` without explicit approval.
62
279
 
280
+ For metadata appearing in another index or worktree, compare `WOODS_OUTPUT`,
281
+ `config.output_dir`, and any explicit `metadata_store_options[:database]`.
282
+ The default SQLite path following `WOODS_OUTPUT` during embedding (B-156) is
283
+ available in Woods `2.0.0.beta3`; check the installed version before relying on it.
284
+ An explicit database path still wins. See the
285
+ [SQLite path contract](https://github.com/lost-in-the/woods/blob/main/docs/CONFIGURATION_REFERENCE.md#sqlite-metadata)
286
+ for isolation and upgrade steps.
287
+
63
288
  ## 5. Check Console separately
64
289
 
290
+ For repeated missing-token boot warnings on a stdio-only host, check whether
291
+ its installed version supports `console_mcp_http_enabled = false` before
292
+ suggesting it; this option is available in Woods `2.0.0.beta3`. The default
293
+ preserves HTTP enablement, so selecting stdio as a client alone does not
294
+ suppress HTTP token validation. Never disable authentication on an HTTP
295
+ endpoint to silence this warning.
296
+
65
297
  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.
66
298
 
67
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.
68
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
+
69
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.
70
304
 
71
305
  ## Report
@@ -73,3 +307,87 @@ Nine tools are normal. Eleven appear only with `console_embedded_read_tools`. Do
73
307
  Return the first failing layer, commands/evidence, root-cause hypothesis, whether any file changed, and the smallest next action. If a fix is requested, change one thing and rerun the failing check before proceeding.
74
308
 
75
309
  Canonical guide: [TROUBLESHOOTING.md](https://github.com/lost-in-the/woods/blob/main/docs/TROUBLESHOOTING.md).
310
+
311
+ ## Lexical retrieval capability check
312
+
313
+ Lexical retrieval is available from `2.0.0.beta3`. Before proposing it, verify the installed gem
314
+ exposes `Woods::Configuration#retrieval_mode` and its matching guide documents
315
+ `WOODS_RETRIEVAL_MODE`. Keep the installed-version preflight; do not infer support
316
+ from the plugin version or an unreleased checkout.
317
+
318
+ For lexical errors, inspect the published generation and validate or re-extract
319
+ the index; adding provider credentials cannot repair a corrupt lexical index.
320
+ Semantic provider failure never switches to lexical automatically.
321
+ See the [retrieval guide](https://github.com/lost-in-the/woods/blob/main/docs/RETRIEVAL_GUIDE.md#embedding-free-lexical-retrieval)
322
+ for the supported contract, checked against the installed gem version.
323
+
324
+ ## Explicit package or path scope
325
+
326
+ Check the connected tool's advertised input schema before sending `packages` or
327
+ `source_paths`; older installed gems may not support them. When present, both
328
+ `search` and `codebase_retrieve` apply explicit scope before candidate limits.
329
+ Use published nearest package names or application-relative directory prefixes,
330
+ then inspect `applied_scope` and search completeness. Unknown packages are argument
331
+ errors; unsupported custom vector adapters degrade instead of running a global
332
+ query. Scoping can hide relevant cross-boundary relationships, so broaden the
333
+ request deliberately when the task needs them. See the
334
+ [scope contract](https://github.com/lost-in-the/woods/blob/main/docs/RETRIEVAL_GUIDE.md#explicit-package-and-source-path-scopes).
335
+
336
+ ## Source-content freshness (Woods 2.0.0.beta3; #405)
337
+
338
+ Check installed-version support before using `woods-extract` or the optional
339
+ `woods_status.source_check` argument. With support, inspect
340
+ `index.source_freshness`: `current`, `drifted` or `unknown`. Repeated edits to an
341
+ already-dirty file can leave the porcelain fingerprint unchanged. A quick scan
342
+ limit may justify one `source_check: "deep"`; unavailable source/private keys or
343
+ unproved boot/consumer coverage remain unknown. A fresh `bundle exec woods-extract full`
344
+ inside the application environment establishes preboot evidence. Never publish
345
+ `.source-inputs.key`, silently change its permissions, or delete queued edits to
346
+ hide diagnostics. Follow [source freshness](https://github.com/lost-in-the/woods/blob/main/docs/SOURCE_FRESHNESS.md).
347
+
348
+ ## Compact evidence capability check
349
+
350
+ Inspect the connected server's installed tool schemas before using `evidence` on
351
+ `lookup` or `codebase_retrieve`; older releases do not provide these controls.
352
+ When available, explicit `compact` selects complete published source spans and
353
+ `outline` lists declared APIs. Read omission/provenance fields and follow the
354
+ returned typed, SHA-guarded `full_evidence` lookup for verification. Published-unit
355
+ coordinates are not physical file offsets; unknown generation remains unknown.
356
+ Keep full-source access available. See the canonical
357
+ [evidence contract](https://github.com/lost-in-the/woods/blob/main/docs/RETRIEVAL_GUIDE.md#compact-published-evidence-and-api-outlines).
358
+
359
+ ## Explicit edit adapters (Woods 2.0.0.beta3; #409)
360
+
361
+ Check the installed gem exposes `woods:hook_refresh` before enabling hooks.
362
+ Claude's registered wrapper covers one documented edit path; OpenCode 1.18.27
363
+ has a separate native `.js` registration wrapper importing Woods' shipped
364
+ adapter. Its verified patch metadata carries all added/updated/deleted/moved
365
+ paths. Keep the complete plugin directory available, preserve opt-in/disable
366
+ settings and pending events, and inspect the generation and hook log before
367
+ claiming refresh. Unsupported tool shapes and symlink paths need watch or an
368
+ explicit extraction. Do not install native client registration without the
369
+ user's setup request. Follow [client hooks](https://github.com/lost-in-the/woods/blob/main/docs/CLIENT_HOOKS.md).
370
+
371
+ ## Optional context hints
372
+
373
+ Check installed `bundle exec woods-hook-context --help` before enabling
374
+ `WOODS_HOOK_CONTEXT_ENABLED=1`; this capability is available in Woods `2.0.0.beta3` and the
375
+ plugin does not upgrade the gem. Context and refresh opt-ins are independent;
376
+ `WOODS_HOOKS_DISABLED=1` disables both. Native Claude context is synchronous and
377
+ bounded, with served-generation and pre-refresh/unknown labels. Verify candidate
378
+ dependents and suggested tests manually; silence is not no impact. Do not clear
379
+ refresh queues when optional hints time out. See the canonical
380
+ [context guide](https://github.com/lost-in-the/woods/blob/main/docs/WATCH_DAEMON.md#optional-bounded-context-hints)
381
+ for output/time limits, container root mapping and emitted-hint suppression.
382
+
383
+ ### Obsidian destination conflicts
384
+
385
+ Destination ownership preflight (#441) is available in Woods `2.0.0.beta3`; first check
386
+ the installed Woods version and
387
+ its matching guide. On versions with this check, `refusing <path>: unmanaged or modified destination`
388
+ means the export preserved a conflicting note, setting, or sidecar and skipped the stale-note sweep.
389
+ A `.woods-vault` sentinel or force-purge flag does not authorize overwriting it. Inspect and back up
390
+ the named file before moving it aside, or choose a new export directory. Older vaults can adopt
391
+ byte-identical generated assets into `_woods/ownership.json`; changed legacy sidecars may need this
392
+ manual recovery. Never fabricate ownership receipts or remove personal files to silence the error.
393
+ See the installed version's `docs/OBSIDIAN_INTEGRATION.md` for the exact safety contract.
@@ -9,6 +9,13 @@ Woods is runtime evidence: resolved routes, schema, associations, callbacks, inl
9
9
 
10
10
  ## Preflight
11
11
 
12
+ Supporting servers include concise MCP initialization/discovery guidance without
13
+ this plugin. That feature (#402) is available in Woods `2.0.0.beta3`; check the
14
+ installed server version, and do not require it from protocol `2024-11-05`.
15
+ Follow the [agent guide](https://github.com/lost-in-the/woods/blob/main/docs/AGENT_GUIDE.md)
16
+ when instructions are absent. A registered tool does not establish retrieval
17
+ readiness or authorize maintenance or live Console access.
18
+
12
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.
13
20
 
14
21
  ## The default loop
@@ -32,8 +39,146 @@ Identifiers are namespaced and typed; never invent one from a filename when `sea
32
39
 
33
40
  The normal packaged Index Server registers 14 tools; conditional schemas register only when their wiring is configured — use the connected server's own tool list, never the source inventory. Console MCP is authorized live-data access, not another code-search mode; use Index tools for structure. Never work around a block, validation error, or redaction.
34
41
 
42
+ ## Partial search answers
43
+
44
+ Search completeness (#410) is available in Woods `2.0.0.beta3`. Verify the installed
45
+ server version and response before relying on it; this plugin does not upgrade
46
+ the gem. On supporting versions, `result_count` counts returned rows, while
47
+ `completeness.reason: exhausted` establishes an exact total for the requested
48
+ index/query domain. `result_limit` proves at least one additional match;
49
+ `scan_budget` and `regex_timeout` leave more matches and totals unknown. Narrow
50
+ types, literal prefix/suffix filters, or deep fields when `partial` is true.
51
+ Artifact errors have unknown completeness. Missing metadata on older servers,
52
+ a full page, and an empty partial result never establish exhaustive absence.
53
+ See the [search contract](https://github.com/lost-in-the/woods/blob/main/docs/MCP_SERVERS.md#search-completeness).
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
+
78
+ ## Partial dependency answers
79
+
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
82
+ using them; installing this plugin does not upgrade the gem. On a supporting
83
+ server, `partial`/`partial_reason` means the walk stopped early, independently
84
+ of page truncation. Do not claim an exhaustive blast radius or treat empty
85
+ deps as proof of a leaf. Narrow depth/types/via or increase a supported budget;
86
+ paging alone only visits the discovered prefix. See the
87
+ [budget contract](https://github.com/lost-in-the/woods/blob/main/docs/MCP_SERVERS.md#dependency-traversal-budgets).
88
+
89
+ ## Explain recorded relationships
90
+
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;
93
+ installing this plugin does not add server capabilities. Supporting servers
94
+ preserve original source-to-target direction and labels in both traversal
95
+ modes. Follow shared `parent`/`edge_id` witnesses, distinguish direct records
96
+ from transitive inferred impact, and treat `context: true` ancestors as page
97
+ context. Null attributes and candidate type ambiguities remain unknown;
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
101
+ cutoffs still apply. Verify important conclusions in source and tests, since
102
+ recorded reachability does not establish observed execution. See the
103
+ [explanation contract](https://github.com/lost-in-the/woods/blob/main/docs/MCP_SERVERS.md#traversal-explanations).
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
+
116
+ ## Volatile dependency reports
117
+
118
+ Read `stats.volatile_dependency_count` before judging the top-20 array: it
119
+ counts all qualifying edges. A frequently changed dependency can occupy most
120
+ rows. Use the installed version's ratio tuning guidance; the optional
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
123
+ can cap each typed target before selecting the global top 20 and expose the
124
+ cap plus `volatile_dependency_reported_count` in stats. Re-extract after
125
+ configuration changes. Treat the report as candidates for source review, never
126
+ an automatic gate. See the
127
+ [configuration reference](https://github.com/lost-in-the/woods/blob/main/docs/CONFIGURATION_REFERENCE.md#pipeline-options).
128
+
35
129
  ## Report evidence
36
130
 
37
131
  Name the tools and exact identifiers used, cite the source paths Woods returned, separate direct Woods evidence from inference, and state generation/staleness caveats. Say when a claim still needs source or test verification.
38
132
 
39
133
  Canonical guides: [AGENT_GUIDE.md](https://github.com/lost-in-the/woods/blob/main/docs/AGENT_GUIDE.md), [MCP_TOOL_COOKBOOK.md](https://github.com/lost-in-the/woods/blob/main/docs/MCP_TOOL_COOKBOOK.md).
134
+
135
+ ## Lexical retrieval capability check
136
+
137
+ This is a development capability. Before proposing it, verify the installed gem
138
+ exposes `Woods::Configuration#retrieval_mode` and its matching guide documents
139
+ `WOODS_RETRIEVAL_MODE`. Keep the installed-version preflight; do not infer support
140
+ from the plugin version or an unreleased checkout.
141
+
142
+ When status reports lexical mode, use the matching fields/terms as discovery
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`.
148
+ See the [retrieval guide](https://github.com/lost-in-the/woods/blob/main/docs/RETRIEVAL_GUIDE.md#embedding-free-lexical-retrieval)
149
+ for the supported contract, checked against the installed gem version.
150
+
151
+ ## Explicit package or path scope
152
+
153
+ Check the connected tool's advertised input schema before sending `packages` or
154
+ `source_paths`; older installed gems may not support them. When present, both
155
+ `search` and `codebase_retrieve` apply explicit scope before candidate limits.
156
+ Use published nearest package names or application-relative directory prefixes,
157
+ then inspect `applied_scope` and search completeness. Unknown packages are argument
158
+ errors; unsupported custom vector adapters degrade instead of running a global
159
+ query. Scoping can hide relevant cross-boundary relationships, so broaden the
160
+ request deliberately when the task needs them. See the
161
+ [scope contract](https://github.com/lost-in-the/woods/blob/main/docs/RETRIEVAL_GUIDE.md#explicit-package-and-source-path-scopes).
162
+
163
+ ## Compact evidence capability check
164
+
165
+ Inspect the connected server's installed tool schemas before using `evidence` on
166
+ `lookup` or `codebase_retrieve`; older releases do not provide these controls.
167
+ When available, explicit `compact` selects complete published source spans and
168
+ `outline` lists declared APIs. Read omission/provenance fields and follow the
169
+ returned typed, SHA-guarded `full_evidence` lookup for verification. Published-unit
170
+ coordinates are not physical file offsets; unknown generation remains unknown.
171
+ Keep full-source access available. See the canonical
172
+ [evidence contract](https://github.com/lost-in-the/woods/blob/main/docs/RETRIEVAL_GUIDE.md#compact-published-evidence-and-api-outlines).
173
+
174
+ ## Optional context hints
175
+
176
+ Check installed `bundle exec woods-hook-context --help` before enabling
177
+ `WOODS_HOOK_CONTEXT_ENABLED=1`; this capability is available in Woods `2.0.0.beta3` and the
178
+ plugin does not upgrade the gem. Context and refresh opt-ins are independent;
179
+ `WOODS_HOOKS_DISABLED=1` disables both. Native Claude context is synchronous and
180
+ bounded, with served-generation and pre-refresh/unknown labels. Verify candidate
181
+ dependents and suggested tests manually; silence is not no impact. Do not clear
182
+ refresh queues when optional hints time out. See the canonical
183
+ [context guide](https://github.com/lost-in-the/woods/blob/main/docs/WATCH_DAEMON.md#optional-bounded-context-hints)
184
+ for output/time limits, container root mapping and emitted-hint suppression.