woods 2.0.0.beta1 → 2.0.0.beta3

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