woods 2.0.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +94 -7
  3. data/CONTRIBUTING.md +134 -19
  4. data/README.md +1 -1
  5. data/docs/AGENT_GUIDE.md +19 -0
  6. data/docs/AGENT_SETUP.md +22 -2
  7. data/docs/BACKEND_MATRIX.md +7 -0
  8. data/docs/CLIENT_HOOKS.md +6 -0
  9. data/docs/CONFIGURATION_REFERENCE.md +133 -25
  10. data/docs/CONSOLE_MCP_SETUP.md +82 -30
  11. data/docs/EMBEDDING_MODELS.md +16 -19
  12. data/docs/EXTRACTOR_REFERENCE.md +219 -21
  13. data/docs/FAQ.md +11 -25
  14. data/docs/GETTING_STARTED.md +7 -1
  15. data/docs/INCREMENTAL_EXTRACTION.md +261 -19
  16. data/docs/INDEX_LAYOUT.md +5 -0
  17. data/docs/INTERNALS.md +9 -0
  18. data/docs/MCP_HTTP_TRANSPORT.md +20 -15
  19. data/docs/MCP_SERVERS.md +87 -8
  20. data/docs/MCP_TOOL_COOKBOOK.md +13 -55
  21. data/docs/NOTION_INTEGRATION.md +7 -1
  22. data/docs/PUBLISHED_INDEX.md +6 -0
  23. data/docs/README.md +6 -1
  24. data/docs/RETRIEVAL_GUIDE.md +17 -0
  25. data/docs/SOURCE_FRESHNESS.md +157 -5
  26. data/docs/TOKEN_BENCHMARK.md +10 -18
  27. data/docs/TROUBLESHOOTING.md +70 -14
  28. data/docs/UNBLOCKED_INTEGRATION.md +60 -8
  29. data/docs/UPGRADING_TO_2.md +153 -38
  30. data/docs/WATCH_DAEMON.md +97 -14
  31. data/exe/woods-console-mcp +2 -2
  32. data/lib/generators/woods/templates/woods.rb.tt +2 -1
  33. data/lib/tasks/woods.rake +23 -7
  34. data/lib/tasks/woods_checks.rake +2 -2
  35. data/lib/woods/agent_configuration/cli.rb +1 -1
  36. data/lib/woods/agent_configuration/layout.rb +16 -2
  37. data/lib/woods/agent_configuration/plan.rb +13 -3
  38. data/lib/woods/agent_configuration/planner_validation.rb +4 -2
  39. data/lib/woods/agent_configuration/preflight.rb +5 -3
  40. data/lib/woods/builder.rb +17 -57
  41. data/lib/woods/cache/cache_middleware.rb +56 -30
  42. data/lib/woods/chunking/contributor_chunks.rb +119 -0
  43. data/lib/woods/chunking/semantic_chunker.rb +44 -21
  44. data/lib/woods/console/connection_manager.rb +56 -3
  45. data/lib/woods/console/embedded_executor.rb +30 -5
  46. data/lib/woods/console/rack_middleware.rb +29 -1
  47. data/lib/woods/dependency_graph.rb +34 -10
  48. data/lib/woods/embedding/fake.rb +12 -0
  49. data/lib/woods/embedding/indexer.rb +195 -98
  50. data/lib/woods/embedding/input_budget.rb +67 -0
  51. data/lib/woods/embedding/openai.rb +70 -20
  52. data/lib/woods/embedding/provider.rb +37 -25
  53. data/lib/woods/embedding/text_preparer.rb +76 -32
  54. data/lib/woods/embedding/token_counter.rb +18 -81
  55. data/lib/woods/embedding/vector_configuration.rb +48 -0
  56. data/lib/woods/extraction_identities.rb +175 -0
  57. data/lib/woods/extractor.rb +304 -107
  58. data/lib/woods/extractors/action_cable_extractor.rb +8 -3
  59. data/lib/woods/extractors/assigned_value_discovery.rb +74 -0
  60. data/lib/woods/extractors/class_declarations.rb +121 -0
  61. data/lib/woods/extractors/configuration_extractor.rb +11 -3
  62. data/lib/woods/extractors/declaration_ancestry.rb +92 -0
  63. data/lib/woods/extractors/event_extractor.rb +8 -0
  64. data/lib/woods/extractors/graphql_extractor.rb +134 -77
  65. data/lib/woods/extractors/job_extractor.rb +5 -1
  66. data/lib/woods/extractors/lib_extractor.rb +132 -15
  67. data/lib/woods/extractors/mailer_extractor.rb +3 -5
  68. data/lib/woods/extractors/manager_extractor.rb +7 -21
  69. data/lib/woods/extractors/migration_declaration.rb +87 -0
  70. data/lib/woods/extractors/migration_extractor.rb +5 -39
  71. data/lib/woods/extractors/phlex_extractor.rb +6 -2
  72. data/lib/woods/extractors/policy_extractor.rb +9 -5
  73. data/lib/woods/extractors/poro_extractor.rb +112 -53
  74. data/lib/woods/extractors/pundit_extractor.rb +11 -6
  75. data/lib/woods/extractors/scheduled_job_extractor.rb +45 -4
  76. data/lib/woods/extractors/serializer_extractor.rb +34 -22
  77. data/lib/woods/extractors/shared_utility_methods.rb +18 -1
  78. data/lib/woods/extractors/source_nesting.rb +142 -106
  79. data/lib/woods/extractors/standalone_module_discovery.rb +123 -0
  80. data/lib/woods/extractors/state_machine_extractor.rb +46 -40
  81. data/lib/woods/extractors/view_component_extractor.rb +9 -7
  82. data/lib/woods/flow_assembler.rb +4 -1
  83. data/lib/woods/generation.rb +25 -0
  84. data/lib/woods/hooks/context_hint.rb +7 -2
  85. data/lib/woods/mcp/bootstrapper.rb +33 -7
  86. data/lib/woods/mcp/config_resolver.rb +26 -7
  87. data/lib/woods/mcp/index_reader.rb +125 -24
  88. data/lib/woods/mcp/index_reader_pinning.rb +16 -0
  89. data/lib/woods/mcp/renderers/markdown_renderer.rb +7 -1
  90. data/lib/woods/mcp/renderers/plain_renderer.rb +3 -1
  91. data/lib/woods/mcp/search_results.rb +7 -1
  92. data/lib/woods/mcp/server.rb +24 -4
  93. data/lib/woods/module_reconciliation.rb +151 -0
  94. data/lib/woods/path_dispatcher.rb +7 -2
  95. data/lib/woods/rake_helpers.rb +43 -11
  96. data/lib/woods/release.rb +1 -1
  97. data/lib/woods/resilience/index_validator.rb +8 -3
  98. data/lib/woods/resilience/retryable_provider.rb +18 -1
  99. data/lib/woods/resolved_config.rb +68 -8
  100. data/lib/woods/retrieval/context_assembler.rb +3 -3
  101. data/lib/woods/retrieval/lexical_assembler.rb +3 -2
  102. data/lib/woods/retrieval/scope.rb +18 -2
  103. data/lib/woods/retrieval/source_evidence.rb +14 -2
  104. data/lib/woods/source_contributor_validation.rb +78 -0
  105. data/lib/woods/source_contributors.rb +116 -0
  106. data/lib/woods/source_inputs/handoff.rb +37 -0
  107. data/lib/woods/source_inputs/launcher.rb +53 -13
  108. data/lib/woods/source_inputs/manifest.rb +84 -3
  109. data/lib/woods/source_inputs/private_key.rb +44 -12
  110. data/lib/woods/source_inputs/scanner.rb +98 -27
  111. data/lib/woods/source_inputs/scopes.rb +1 -1
  112. data/lib/woods/source_inputs/session.rb +147 -15
  113. data/lib/woods/source_inputs/stable_reader.rb +127 -0
  114. data/lib/woods/source_inputs/status.rb +40 -8
  115. data/lib/woods/source_inputs/verifier.rb +28 -5
  116. data/lib/woods/source_path_encoding.rb +33 -0
  117. data/lib/woods/source_references/cache.rb +284 -0
  118. data/lib/woods/source_references/collector.rb +120 -0
  119. data/lib/woods/source_references/extraction.rb +185 -0
  120. data/lib/woods/source_references/inputs.rb +134 -0
  121. data/lib/woods/source_references/parser_adapter.rb +134 -0
  122. data/lib/woods/source_references/pass.rb +152 -0
  123. data/lib/woods/source_references/prism_adapter.rb +116 -0
  124. data/lib/woods/source_references/registry.rb +178 -0
  125. data/lib/woods/source_references/runtime_lookup.rb +127 -0
  126. data/lib/woods/source_references/value_class.rb +82 -0
  127. data/lib/woods/storage/metadata_store.rb +4 -1
  128. data/lib/woods/storage/qdrant.rb +2 -2
  129. data/lib/woods/unblocked/client.rb +12 -7
  130. data/lib/woods/unblocked/document_builder.rb +4 -1
  131. data/lib/woods/unblocked/exporter.rb +127 -37
  132. data/lib/woods/unblocked/sync_manifest.rb +137 -21
  133. data/lib/woods/unblocked/uri_migration.rb +105 -0
  134. data/lib/woods/util/host_guard.rb +3 -2
  135. data/lib/woods/version.rb +1 -1
  136. data/lib/woods/watch/catch_up.rb +138 -0
  137. data/lib/woods/watch/claim_lease.rb +150 -0
  138. data/lib/woods/watch/cli.rb +26 -2
  139. data/lib/woods/watch/daemon.rb +80 -59
  140. data/lib/woods/watch/installation/options.rb +1 -1
  141. data/lib/woods/watch/installation/receipt.rb +6 -1
  142. data/lib/woods/watch/managed_child.rb +1 -1
  143. data/lib/woods/watch/supervisor.rb +1 -1
  144. data/lib/woods/watch/tree_scan.rb +14 -2
  145. data/plugin/.claude-plugin/plugin.json +1 -1
  146. data/plugin/hooks/adapters/normalize.rb +3 -2
  147. data/plugin/hooks/woods-input-rules.sh +4 -0
  148. data/plugin/hooks/woods-refresh.sh +15 -7
  149. data/plugin/hooks/woods-session-start.sh +60 -3
  150. data/plugin/skills/woods-diagnose/SKILL.md +334 -11
  151. data/plugin/skills/woods-investigate/SKILL.md +11 -0
  152. data/plugin/skills/woods-mcp-config/SKILL.md +79 -8
  153. data/plugin/skills/woods-setup/SKILL.md +53 -6
  154. metadata +32 -5
@@ -77,6 +77,28 @@ the application's actual `rails woods:watch` or `rake woods:watch` entrypoint,
77
77
  with no preceding `environment` task, and check
78
78
  whether boot inputs keep changing during initialization or catch-up.
79
79
 
80
+ ### Managed watcher parks after its owning container disappeared
81
+
82
+ The explicit lease-based recovery command (#591) is unreleased after `2.0.0`.
83
+ Check the loaded revision and `bundle exec woods-watch --help` before using it.
84
+ Supporting daemons write a claim token and hold a lifetime lease; recovery checks
85
+ the exact selected token and a free matching lease. Use the installed version's
86
+ [claim recovery procedure](https://github.com/lost-in-the/woods/blob/main/docs/WATCH_DAEMON.md#managed-development-startup).
87
+ Never remove a claim or lock sidecar manually, infer death from age alone, or use
88
+ recovery against a live supervisor. Legacy/unverifiable claims cannot use this
89
+ command. Recovery leaves status and pending work intact; remove the reader-only
90
+ foreign-host trust override from owner startup. Blank idle timeouts are also
91
+ normalized by supporting builds; older tasks may reject an empty value.
92
+
93
+ ### Verified extraction selects the wrong output or cannot use its identity key
94
+
95
+ In supporting #591 builds (unreleased after `2.0.0`), an implicit preboot output
96
+ that disagrees with finalized Rails configuration refuses before publication.
97
+ Pass matching `--output` or `WOODS_OUTPUT` explicitly and retain the same capture,
98
+ key and writer destination. Read the safe key-path/ownership/permissions diagnosis;
99
+ never rotate or print key bytes as a generic fix. Follow
100
+ [source capture setup](https://github.com/lost-in-the/woods/blob/main/docs/SOURCE_FRESHNESS.md).
101
+
80
102
  ### Watch retains facts from an initializer deleted while stopped
81
103
 
82
104
  Record the installed revision. In Woods `2.0.0`, startup preserves
@@ -84,6 +106,51 @@ registered deleted boot inputs as full-extraction obligations. On earlier builds
84
106
  stop watch, run a successful full extraction in a fresh process, then restart
85
107
  standalone `woods:watch`. See the installed version's watch guide.
86
108
 
109
+ ### Watch misses an edit made while another extraction publishes
110
+
111
+ Record the loaded revision; a matching `2.0.0` version alone does not prove the
112
+ #585 repair is present. Supporting Git builds use the generation's optional
113
+ source-capture boundary and recorded dirty paths, with content checks for
114
+ unchanged candidates. Legacy or invalid boundary metadata causes one full
115
+ startup reconciliation under the usual reload/restart rules. On older builds,
116
+ finish a full extraction against settled source before restarting watch.
117
+ Do not infer source freshness from a recent generation marker or remove a
118
+ foreign watch claim. See the installed version's
119
+ [startup catch-up guide](https://github.com/lost-in-the/woods/blob/main/docs/WATCH_DAEMON.md).
120
+
121
+ ### Watch does not recover after a failed reconciliation
122
+
123
+ The deletion-only startup retry repair (#640) and empty-touch publication error
124
+ repair (#641) are unreleased after Woods `2.0.0`; verify the loaded revision.
125
+ Supporting revisions retain pathless deletion reconciliation for heartbeat
126
+ retry and report failed flow withdrawal as degraded even when no units changed.
127
+ On older builds, fix the logged cause and restart watch to reconcile again.
128
+ An empty touched-unit list is not proof that publication succeeded. Inspect
129
+ the generation and publication errors; see the installed version's
130
+ [startup recovery guide](https://github.com/lost-in-the/woods/blob/main/docs/WATCH_DAEMON.md#startup-is-not-a-clean-slate).
131
+
132
+ ### Extraction fails while a sibling extractor succeeds
133
+
134
+ The #584 publication-reporting repair is unreleased after Woods `2.0.0`.
135
+ Supporting revisions refuse the whole publication after a consumer constructor
136
+ or extraction failure and keep the previous generation active. Fix the logged
137
+ cause and retry the complete batch; do not treat a sibling's success as a
138
+ completed extraction. For custom/embedded pipeline tools, acknowledgement only
139
+ means the background task started: inspect its final task state. Those operator
140
+ tools are not registered by the packaged default Index Server. See
141
+ [extraction failures](https://github.com/lost-in-the/woods/blob/main/docs/TROUBLESHOOTING.md).
142
+
143
+ ### Manager, policy or migration identity does not match the source
144
+
145
+ The selected-declaration repairs in #594 are unreleased after `2.0.0`.
146
+ Supporting writers use actual loaded ancestry where available and inspect
147
+ historical migration declarations without executing them. An unresolved qualified
148
+ migration namespace needs the documented source/normal-boot setup; do not load
149
+ historical migrations to force discovery. Full re-extraction repairs previously
150
+ misidentified migration units. Method chunks now distinguish `self.call`, `call`
151
+ and punctuation-bearing names, so rebuild affected embeddings after upgrading.
152
+ See the [extractor contracts](https://github.com/lost-in-the/woods/blob/main/docs/EXTRACTOR_REFERENCE.md).
153
+
87
154
  ### A cleaned index directory still exists
88
155
 
89
156
  In Woods `2.0.0`, `woods:clean` retains the output directory and
@@ -112,6 +179,15 @@ extraction will remove a legitimate cross-type collision. See the canonical
112
179
 
113
180
  ## 2. Check the published index
114
181
 
182
+ In supporting unreleased writers after 2.0.0, incremental extraction and
183
+ targeted refresh refuse a flat index with a manifest or a generation whose
184
+ manifest writer major version is below 2. Run full `woods:extract` using the
185
+ [upgrade sequence](https://github.com/lost-in-the/woods/blob/main/docs/UPGRADING_TO_2.md#3-clean-and-re-extract).
186
+ Do not relabel the manifest or delete its writer field. A generation that
187
+ already lacks this field can be an early v2 beta and is allowed; an empty
188
+ output directory still needs a full baseline. Legacy read support does not
189
+ make partial writes a valid migration.
190
+
115
191
  For a `same-type identifier collision`, inspect both named source files and the
116
192
  Rails loader before suggesting source edits. Wrapper-nested class naming needs
117
193
  Zeitwerk mode and Zeitwerk >= 2.6.9; an older loader or classic mode can produce
@@ -119,6 +195,21 @@ the collision even when the namespace wrappers are valid. The expanded error
119
195
  guidance (B-149) is available in Woods `2.0.0.beta3`; check the installed version
120
196
  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).
121
197
 
198
+ The incremental/refresh collision guard (#561) is unreleased after 2.0.0; verify
199
+ the writer revision before relying on it. A refusal preserves the prior
200
+ generation. Older writers could already have overwritten ownership: repair the
201
+ producer/source issue and perform a successful full extraction to recover.
202
+ Woods 2.0.0 can also misidentify Struct/Data classes inside namespace wrappers
203
+ (#559). The fix is unreleased after 2.0.0, planned for 2.1: verify the writer's
204
+ loaded revision before expecting assigned PORO/library child identities. A full
205
+ extraction repairs old identities and establishes reference-cache format 3;
206
+ incremental extraction refuses the older cache. Preserve the last generation
207
+ until the rebuild succeeds. Do not rename valid application constants or disable
208
+ collision checks to bypass an older writer's inference. Follow the
209
+ [assigned value-class contract](https://github.com/lost-in-the/woods/blob/main/docs/EXTRACTOR_REFERENCE.md#assigned-value-classes);
210
+ constructor blocks and unverified dynamic assignments remain outside reference
211
+ coverage. Updating this plugin does not upgrade the writer.
212
+
122
213
  ```bash
123
214
  bin/rails woods:validate
124
215
  bin/rails woods:stats
@@ -126,6 +217,14 @@ bin/rails woods:stats
126
217
 
127
218
  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.
128
219
 
220
+ For incremental CI, restore only an index for the selected diff's exact base
221
+ commit; a cold or unrelated cache requires full extraction. Fetch the actual
222
+ PR base ref and sufficient history before running the task. Nested-app Git
223
+ paths, normalization of `./` and contained absolute `CHANGED_FILES`, and blank
224
+ CI-variable handling are unreleased after `2.0.0` (#571); check the installed
225
+ revision before relying on them. Keep nonempty invalid ranges as failures.
226
+ See the [incremental CI contract](https://github.com/lost-in-the/woods/blob/main/docs/INCREMENTAL_EXTRACTION.md#github-actions-with-an-exact-baseline).
227
+
129
228
  Semantic graph validation (#413) is available in Woods `2.0.0.beta3`; verify the
130
229
  installed gem before expecting these errors. Supporting versions check typed
131
230
  unit identity, graph/index agreement and forward/reverse/file/type memberships
@@ -226,8 +325,17 @@ ranges. A commit alone may leave the source-file watcher idle; run full
226
325
  extraction after repair or when current Git history is required. See the
227
326
  [worktree mount guide](https://github.com/lost-in-the/woods/blob/main/docs/TROUBLESHOOTING.md#git-directory-mounts-for-linked-worktrees).
228
327
 
229
- After a bundle change or removal of a dynamically defined job, incremental
230
- extraction can retain stale runtime units. Use a fresh process with the updated
328
+ Builds containing #588 (unreleased after `2.0.0`) reconcile the whole jobs and
329
+ serializers families on relevant Ruby batches, including nested runtime classes.
330
+ Incomplete discovery retains unproven units and refuses ownership transfers.
331
+ Direct incremental calls reject restart-sensitive inputs; apply migrations and
332
+ run full extraction in a fresh Rails process. Fresh one-shot incremental tasks
333
+ escalate those inputs themselves. Disabling `precompute_flows` withdraws stored
334
+ flows on the next successful writer run. Check the revision and follow the
335
+ [runtime reconciliation guide](https://github.com/lost-in-the/woods/blob/main/docs/INCREMENTAL_EXTRACTION.md#runtime-removals-and-bundle-updates).
336
+
337
+ After a bundle change or on older builds after removal of a dynamically defined
338
+ job, incremental extraction can retain stale runtime units. Use a fresh process with the updated
231
339
  bundle for full extraction, then validate. For missing external gem paths,
232
340
  first distinguish an upgraded bundle from a reader on a different host/mount.
233
341
  The more explicit `woods:validate` bundle-update remedy (B-166) is available in Woods
@@ -273,8 +381,37 @@ Recovery through `reset_cooldowns` (B-159) is available in Woods `2.0.0.beta3`.
273
381
  Check the installed version before attempting it and follow the
274
382
  [corrupt cooldown recovery guide](https://github.com/lost-in-the/woods/blob/main/docs/TROUBLESHOOTING.md#corrupt-pipeline-cooldown-state).
275
383
 
384
+ ## Missing GraphQL units
385
+
386
+ In supporting unreleased readers after 2.0.0, `lookup` accepts the directory
387
+ family alias `type: "graphql"` and returns the actual subtype. Prefer the
388
+ concrete type from `search` for follow-up checks. On older readers, retry with
389
+ that concrete type before concluding that a published GraphQL unit is absent.
390
+
391
+ Woods 2.0.0 can omit schema classes, resolvers inherited through application
392
+ superclasses, and runtime types owned by additional schemas (#558, #562, #563).
393
+ The fixes are **unreleased after 2.0.0, planned for 2.1**; check the writer's loaded
394
+ revision before expecting them. A supporting writer publishes schema classes as
395
+ `graphql_type` with `metadata.graphql_kind: "schema"`, and combines the runtime
396
+ type inventories of every current application schema. Confirm that the application
397
+ boots, then run full extraction and validate to establish a complete upgrade baseline.
398
+
399
+ A schema introspection failure stops publication and leaves the prior generation
400
+ active. Fix the named schema error and retry; do not treat a partial boot or an
401
+ empty type inventory as proof that a query root was removed. Missing embeddings
402
+ cannot explain an absent structural unit. Follow the
403
+ [GraphQL extraction contract](https://github.com/lost-in-the/woods/blob/main/docs/EXTRACTOR_REFERENCE.md#graphqlextractor)
404
+ for source fallback, runtime-only removal and reference-coverage limits.
405
+
276
406
  ## Deferred refresh hooks
277
407
 
408
+ For missing Unicode edit events on a host without jq, inspect the locale and
409
+ the installed hook files. The #592 UTF-8 fallback repair is unreleased after
410
+ Woods `2.0.0`; it fixes edit queueing and SessionStart decoding under `LC_ALL=C`.
411
+ Older hooks can use jq or a UTF-8 locale. Confirm the pending queue and published
412
+ generation, since hook exit zero does not establish refresh. See
413
+ [client hook recovery](https://github.com/lost-in-the/woods/blob/main/docs/CLIENT_HOOKS.md#queue-paths-and-recovery).
414
+
278
415
  Expanded hook coverage and `woods:hook_refresh` (#408) are available in Woods
279
416
  `2.0.0.beta3`. Verify the installed task through the configured host/container
280
417
  command before diagnosing this plugin's queue. Read `<output>/hook.log` and
@@ -300,6 +437,13 @@ deps as proof of a leaf. Narrow depth/types/via or increase a supported budget;
300
437
  paging alone only visits the discovered prefix. See the
301
438
  [budget contract](https://github.com/lost-in-the/woods/blob/main/docs/MCP_SERVERS.md#dependency-traversal-budgets).
302
439
 
440
+ On a reviewed post-2.0 writer containing the unreleased reference expansion,
441
+ missing/incompatible reference-cache state requires a full extraction before
442
+ incremental maintenance resumes. Check the loaded revision, not VERSION alone.
443
+ Increasing `max_nodes` cannot recover edges the writer never recorded. Follow the
444
+ [baseline diagnostic](https://github.com/lost-in-the/woods/blob/main/docs/TROUBLESHOOTING.md#source-reference-baseline-needs-a-full-extraction)
445
+ and preserve pending work. This plugin does not add extraction capabilities.
446
+
303
447
  ## 4. Check semantic retrieval
304
448
 
305
449
  Do not treat structural `ready: true` or bootstrap `hydrated` as proof that
@@ -338,6 +482,23 @@ Only diagnose this layer when structural tools work and `codebase_retrieve` fail
338
482
  - Dimension mismatch: rebuild into a store matching the configured model; do not suppress the preflight.
339
483
  - Purge guard: back up and inspect the proposed deletion; never set `WOODS_ALLOW_PURGE` without explicit approval.
340
484
 
485
+ For an unsupported OpenAI `dimensions` option or stale vectors after changing
486
+ provider width/endpoint, check the installed revision: the embedding request and
487
+ cache consistency fix (#586) is unreleased after Woods `2.0.0`. It distinguishes
488
+ stored vector width from explicit reduction, omits unsupported width parameters
489
+ for fixed-width ada, and scopes embedding cache entries to provider configuration.
490
+ Follow the installed version's [embedding options and cache guidance](https://github.com/lost-in-the/woods/blob/main/docs/CONFIGURATION_REFERENCE.md#embedding-options);
491
+ never bypass a width refusal or infer this capability from the plugin version.
492
+
493
+ Injected-provider restoration (#599) is unreleased after Woods `2.0.0`.
494
+ Supporting writers preserve effective non-secret built-in settings through known
495
+ wrappers. If a snapshot carries `requires_host_provider`, use a supporting reader
496
+ and configure the compatible provider explicitly, or deliberately select lexical
497
+ mode. Older readers do not enforce this additive marker. Record both writer and
498
+ reader revisions when an endpoint or context size changes after restoration;
499
+ do not remove the marker or copy endpoint credentials into `woods.json`. See
500
+ [injected providers](https://github.com/lost-in-the/woods/blob/main/docs/CONFIGURATION_REFERENCE.md#injecting-a-provider-object).
501
+
341
502
  For metadata appearing in another index or worktree, compare `WOODS_OUTPUT`,
342
503
  `config.output_dir`, and any explicit `metadata_store_options[:database]`.
343
504
  The default SQLite path following `WOODS_OUTPUT` during embedding (B-156) is
@@ -346,6 +507,16 @@ An explicit database path still wins. See the
346
507
  [SQLite path contract](https://github.com/lost-in-the/woods/blob/main/docs/CONFIGURATION_REFERENCE.md#sqlite-metadata)
347
508
  for isolation and upgrade steps.
348
509
 
510
+ ### Restored snapshot files are not visible
511
+
512
+ `woods:clean` deletes history stored inside the output directory. Follow the
513
+ [upgrade backup and selective-restore sequence](https://github.com/lost-in-the/woods/blob/main/docs/UPGRADING_TO_2.md#3-clean-and-re-extract)
514
+ before cleaning; do not restore an old structural baseline over a new one.
515
+ `WOODS_SNAPSHOTS=true` enables store construction, but it still prefers SQLite
516
+ and does not import JSON history. A retained JSON history needs an explicit
517
+ `JsonSnapshotStore` reader if SQLite became available. Preserve the original
518
+ backup and verify an old snapshot before resuming writers.
519
+
349
520
  ## 5. Check Console separately
350
521
 
351
522
  For repeated missing-token boot warnings on a stdio-only host, check whether
@@ -369,6 +540,15 @@ For MySQL SQL refusals, inspect the executing session's `sql_mode` and the insta
369
540
 
370
541
  For SQLite SQL refusals on `2.0.0.beta4` or a reviewed revision containing its Console corrections, consult the installed Console guide for supported identifier and table-reference syntax. Simplify the query to supported syntax; never relax the blocked-table or function policy. These builds also check resolved default scopes and scan normalized response values. Confirm a patched gem is published before recommending it, and check the installed version’s canonical Console guide; do not infer release availability from this plugin.
371
542
 
543
+ Woods `2.0.1` includes per-mount HTTP guards, complete collection-cell redaction,
544
+ longest exact-credential matching, and stricter SQL provenance/grammar checks.
545
+ Verify the installed version, loaded gem path and any Git revision before relying
546
+ on those protections. Keep automatic mounting, configured policies, and credential
547
+ checks intact; use scalar projections or a structured query when SQL cannot
548
+ preserve field identity. On an affected version, disable Console if those controls
549
+ are required. See the
550
+ [2.0.1 correction notes](https://github.com/lost-in-the/woods/blob/v2.0.1/docs/CONSOLE_MCP_SETUP.md#maintenance-policy-corrections).
551
+
372
552
  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.
373
553
 
374
554
  ## Report
@@ -377,6 +557,17 @@ Return the first failing layer, commands/evidence, root-cause hypothesis, whethe
377
557
 
378
558
  Canonical guide: [TROUBLESHOOTING.md](https://github.com/lost-in-the/woods/blob/main/docs/TROUBLESHOOTING.md).
379
559
 
560
+ ## SQLite metadata and typed semantic results
561
+
562
+ If a SQLite-backed index retains deleted units after embedding, or a `:local`
563
+ reader returns no type-filtered semantic matches after restart, record the exact
564
+ embedding and reader revisions. The SQLite reconciliation and metadata hydration
565
+ fix (#572) is unreleased after Woods `2.0.0`. With that fix, a full embed removes
566
+ stale SQLite rows; restarting the reader restores vector type filters from the
567
+ configured SQLite metadata store. Incremental empty-input and bulk-deletion
568
+ guards still apply. See the canonical
569
+ [SQLite metadata configuration](https://github.com/lost-in-the/woods/blob/main/docs/CONFIGURATION_REFERENCE.md#sqlite-metadata).
570
+
380
571
  ## Lexical retrieval capability check
381
572
 
382
573
  Lexical retrieval is available from `2.0.0.beta3`. Before proposing it, verify the installed gem
@@ -414,6 +605,46 @@ inside the application environment establishes preboot evidence. Never publish
414
605
  `.source-inputs.key`, silently change its permissions, or delete queued edits to
415
606
  hide diagnostics. Follow [source freshness](https://github.com/lost-in-the/woods/blob/main/docs/SOURCE_FRESHNESS.md).
416
607
 
608
+ ### Source paths with invalid filename bytes (unreleased after Woods 2.0.0; #573)
609
+
610
+ Check the writer revision before relying on this handling. An
611
+ `undecodable_source_path` diagnostic means Woods could not represent a filename
612
+ as UTF-8; source freshness remains unknown and reference publication preserves
613
+ the previous generation. Inspect the escaped path, correct the filename in the
614
+ application checkout, and retry extraction. Do not fabricate current freshness
615
+ or discard the prior index. Valid Unicode filenames remain supported, including
616
+ under a C locale. See [source freshness](https://github.com/lost-in-the/woods/blob/main/docs/SOURCE_FRESHNESS.md).
617
+
618
+ ### Directory symlinks prevent the first extraction (#653)
619
+
620
+ The directory-link capture repair is unreleased after Woods `2.0.1`; check the
621
+ writer revision. Older writers can refuse `unverified_symlink_directory` even
622
+ for valid static-assets links. Supporting writers retain logical source aliases
623
+ and verify scoped files inside the app root; cycles, changing links and external
624
+ source still refuse verification. Do not replace valid application links or
625
+ disable publication safeguards. Upgrade the writer and run one fresh full
626
+ extraction. See [source scope](https://github.com/lost-in-the/woods/blob/main/docs/SOURCE_FRESHNESS.md#scope-and-partial-extraction).
627
+
628
+ ### Surviving-file ownership moves (unreleased after Woods 2.0.0; #574)
629
+
630
+ Check the writer revision before relying on this correction. A moved class can
631
+ keep its identity when a complete Rails boot proves its unique new owner. For
632
+ file-derived identities, submit both changed paths together so extraction can
633
+ prove that the surviving old file released the identity. Retry the complete
634
+ batch after resolving boot or extraction failures; do not disable collision
635
+ checks or delete the previous generation to force a move through. Simultaneous
636
+ owners still fail. See [incremental extraction](https://github.com/lost-in-the/woods/blob/main/docs/INCREMENTAL_EXTRACTION.md).
637
+
638
+ ### Once-loader naming (unreleased after Woods 2.0.0; #579)
639
+
640
+ Check the loaded writer revision when a declared library child is misnamed as
641
+ its enclosing wrapper. Writers with this fix use the owning Rails loader,
642
+ including `config.autoload_lib_once` naming rules. Run one full extraction after
643
+ upgrading an affected index before resuming incremental maintenance. This does
644
+ not combine unmanaged files that reopen one namespace or invent a class for a
645
+ VERSION-only file. Preserve collision diagnostics for those cases. See
646
+ [extractor naming](https://github.com/lost-in-the/woods/blob/main/docs/EXTRACTOR_REFERENCE.md#identifier-naming-source-derived-units).
647
+
417
648
  ## Compact evidence capability check
418
649
 
419
650
  Inspect the connected server's installed tool schemas before using `evidence` on
@@ -461,13 +692,105 @@ byte-identical generated assets into `_woods/ownership.json`; changed legacy sid
461
692
  manual recovery. Never fabricate ownership receipts or remove personal files to silence the error.
462
693
  See the installed version's `docs/OBSIDIAN_INTEGRATION.md` for the exact safety contract.
463
694
 
464
- ### Console read compatibility on security-patch candidates
465
-
466
- Verify the loaded revision for corrections after 2.0.0. Active redaction refuses
467
- SQL relation/CTE column alias lists; typed EAV matching can intentionally mask
468
- extra values where tables share a final name or differ only by case. Keep the
469
- policy enabled and use explicit scalar columns or structured tools. Check exact
695
+ ## Source freshness and query errors after 2.0.0
696
+
697
+ Check the installed revision before using these unreleased diagnostics:
698
+
699
+ - Builds containing #589 expose `recorded_root`, `checked_root`, and `root_source`.
700
+ A recorded-root check does not certify a copied checkout. Follow `deep_check`
701
+ for a quick-reader timeout, `inspect_source_scan` for mapping/permission/limit
702
+ problems, and `fresh_capture` for incomplete capture or boot evidence. Preserve
703
+ mixed recommendations. Missing evidence cannot prove all files were added or
704
+ unreadable files deleted. See
705
+ [source freshness](https://github.com/lost-in-the/woods/blob/main/docs/SOURCE_FRESHNESS.md).
706
+ - Supporting builds publish a usable code index with freshness `unavailable`
707
+ and reason `source_manifest_too_large` when evidence alone exceeds its
708
+ serialized-size limit. Follow `inspect_source_limits` and inspect
709
+ `unavailable.size_bytes` / `unavailable.limit_bytes`; repeating an identical
710
+ full capture cannot fix this. Changed-file and Git-based incremental work
711
+ remain usable with validated source-reference proof. An oversized launcher
712
+ handoff starts a fresh child without verified preboot capture. Actual invalid
713
+ evidence, failed writes and source instability retain publication safeguards.
714
+ - Supporting readers retain readable unscoped search matches when an individual
715
+ needed unit cannot be decoded or opened, with partial reason
716
+ `unreadable_or_corrupt_source`. Empty partial results do not prove absence;
717
+ identifier-only summary hits do not validate bodies. Run `woods:validate`.
718
+ Explicit package/source-path scope still validates the full unit set before
719
+ matching; corrupt index-wide artifacts also retain typed errors. See
720
+ [search completeness](https://github.com/lost-in-the/woods/blob/main/docs/MCP_SERVERS.md#search-completeness).
721
+ - With `:local`, supporting readers return degraded reload because snapshot
722
+ vectors and SQLite metadata cannot refresh atomically together. The old
723
+ aligned state remains served. Restart `woods-mcp` after `woods:embed`; granting
724
+ write access alone cannot fix this case. See the
725
+ [backend matrix](https://github.com/lost-in-the/woods/blob/main/docs/BACKEND_MATRIX.md#persistence-story).
726
+ - Builds containing #593 return actual types from family-filtered search and
727
+ reject unknown type names. An unknown flow unit or snapshot is `not_found`,
728
+ while a valid empty answer remains successful. Repeated `corrupt_artifact`
729
+ errors after a malformed generation marker require validation and restoration
730
+ or a fresh extraction; never edit the pointer to guess a payload. See
731
+ [Index MCP contracts](https://github.com/lost-in-the/woods/blob/main/docs/MCP_SERVERS.md#resource-identity-and-damaged-generation-markers).
732
+ - Builds containing #590 retain intended private bundle settings during managed
733
+ preflight. Compare named identity fields and owned bytes before changing an
734
+ installer setup. Keep receipts; use the supporting executable for removal
735
+ before downgrading and real parent directories for temporary plans. See
736
+ [managed configuration](https://github.com/lost-in-the/woods/blob/main/docs/AGENT_SETUP.md#managed-claude-code-configuration).
737
+
738
+ ### Console HTTP remains unavailable after a Rails boot error
739
+
740
+ In builds containing #597's HTTP repair (unreleased after `2.0.0`), an eager-load
741
+ `NameError` makes that worker return a stable, non-cacheable HTTP 503. Reproduce
742
+ the application's eager loading, correct its naming or boot failure, and restart
743
+ the worker; do not keep retrying against a partially loaded model registry or
744
+ relax authentication/table rules. A 401 still indicates authentication failure.
745
+ See [Console startup diagnostics](https://github.com/lost-in-the/woods/blob/main/docs/CONSOLE_MCP_SETUP.md).
746
+
747
+ ### Missing default or parenthesized state machines
748
+
749
+ The #594 literal state-machine repair is unreleased after `2.0.0`; verify the
750
+ writer's revision before relying on it. Supporting builds recognize direct
751
+ `state_machine` calls with the default `state` attribute or an explicit name,
752
+ including multiline parenthesized arguments. They do not infer dynamic or
753
+ inherited machines from missing edges. Re-extract with a supporting writer and
754
+ compare the selected model's actual registry when coverage is uncertain. See the
755
+ [extractor contract](https://github.com/lost-in-the/woods/blob/main/docs/EXTRACTOR_REFERENCE.md#statemachineextractor).
756
+
757
+ ### Unreleased functional audit repairs
758
+
759
+ Record the loaded revision as well as VERSION before using these post-2.0.0
760
+ behaviors. A supporting exporter offers `UNBLOCKED_DRY_RUN=1` and explicit
761
+ `UNBLOCKED_MIGRATE_FROM_REF`; read the installed
762
+ [Unblocked migration guide](https://github.com/lost-in-the/woods/blob/main/docs/UNBLOCKED_INTEGRATION.md#explicit-ref-migration)
763
+ before moving a scope. Preserve receipts, use one writer, and never use force
764
+ purge to bypass unresolved ownership.
765
+
766
+ Unresolved legacy owned receipts leave Unblocked sync incomplete. Select the
767
+ known old ref explicitly; refs containing slashes cannot be inferred from URI
768
+ prefixes. Obsolete documents without current replacements require review and
769
+ manual remote and receipt cleanup. Do not remove receipts merely to clear the
770
+ diagnostic. Inventory entries without a non-empty string URI are skipped and
771
+ provide no ownership evidence.
772
+
773
+ Supporting embedding builds validate complete prefixed inputs, split source
774
+ without truncation, and rebuild old checkpoints once. Ollama counts are estimates
775
+ and requests use `truncate: false`; installing a tokenizer gem no longer selects
776
+ BERT for every model. Read the installed
777
+ [input contract](https://github.com/lost-in-the/woods/blob/main/docs/EMBEDDING_MODELS.md#why-num_ctx-isnt-enough)
778
+ and bounded unit/model/limit diagnostic before changing provider settings.
779
+
780
+ For reopened `lib/` units, inspect all `source_contributors`; primary `file_path`
781
+ is not complete ownership. Full extraction is required to rebuild the upgraded
782
+ reference cache. Missing dependency-owned components/channels are intentional
783
+ in supporting builds; app-owned mailers include parallel base-class branches.
784
+
785
+ ### Console read compatibility in 2.0.1 and 1.6.4
786
+
787
+ Verify the installed version and loaded gem path, plus the locked revision for
788
+ Git-sourced builds. Woods `2.0.1` and `1.6.4` refuse SQL relation/CTE column alias
789
+ lists while redaction is active; typed EAV matching can intentionally mask extra
790
+ values where tables share a final name or differ only by case. Keep the policy
791
+ enabled and use explicit scalar columns or structured tools. Check exact
470
792
  sensitive-key spelling and configure binary secret columns for column redaction.
471
- Read the [Console compatibility guide](https://github.com/lost-in-the/woods/blob/main/docs/CONSOLE_MCP_SETUP.md#read-policy-compatibility)
472
- at the installed revision for adapter, timeout and projection limits; a plugin
473
- update does not patch Woods.
793
+ Use the installed line's guide for adapter, timeout and projection limits:
794
+ [2.0.1](https://github.com/lost-in-the/woods/blob/v2.0.1/docs/CONSOLE_MCP_SETUP.md#read-policy-compatibility)
795
+ or [1.6.4](https://github.com/lost-in-the/woods/blob/v1.6.4/docs/CONSOLE_MCP_SETUP.md#read-policy-compatibility).
796
+ A plugin update does not patch Woods or make planned 2.1 features available.
@@ -59,6 +59,17 @@ or call coverage. Selective method-body scanning can miss references to generic
59
59
  PORO and library targets. No dependents or test-only dependents do not establish
60
60
  absence of production callers; check source before making that claim.
61
61
 
62
+ The [post-2.0 reference expansion](https://github.com/lost-in-the/woods/blob/main/docs/EXTRACTOR_REFERENCE.md#constant-source-references)
63
+ is unreleased and planned for 2.1. Verify the loaded writer revision and full
64
+ baseline before expecting its additional edges. `code_reference` is source
65
+ evidence, not observed execution; the coverage warning remains applicable.
66
+
67
+ The same planned expansion discovers callable standalone `app/models` modules
68
+ as `poro` units with `metadata.ruby_kind: "module"`. Runtime model mixins retain
69
+ `concern` ownership. Verify the installed writer and run a full extraction before
70
+ expecting those units; namespace-only wrappers and uncertain source ownership
71
+ remain outside discovery.
72
+
62
73
  The response `graph_coverage` notice, `total_is_exact` field, and human label
63
74
  `witness types unambiguous` (#470/#471) are included in Woods `2.0.0`.
64
75
  Verify the installed server version and actual response fields; this plugin does
@@ -5,6 +5,21 @@ description: Configure Woods MCP connections with the exact client JSON shapes a
5
5
 
6
6
  # Woods MCP configuration
7
7
 
8
+ For builds containing #590 (unreleased after `2.0.0`), managed preflight retains
9
+ intended bundle settings, project receipts omit the unused user config directory,
10
+ and watcher ownership tolerates Git checkout umasks. Check the installed revision
11
+ before relying on this. Keep the supporting executable for update/removal before
12
+ a permanent downgrade; never delete a receipt to bypass a conflict. Use a private
13
+ real directory for plan files when the system temporary path is a symlink. Follow
14
+ the [portability guidance](https://github.com/lost-in-the/woods/blob/main/docs/AGENT_SETUP.md#managed-claude-code-configuration).
15
+
16
+ For builds containing #597's launcher repair (planned for 2.1; not included in
17
+ `2.0.1`),
18
+ `config/console.yml` must be a supported top-level mapping with string keys and
19
+ mode-appropriate options. Nested or unsupported configuration is refused before
20
+ launch rather than silently selecting local mode. Check the installed revision
21
+ and follow the [Console configuration guide](https://github.com/lost-in-the/woods/blob/main/docs/CONSOLE_MCP_SETUP.md).
22
+
8
23
  ## Managed configuration availability
9
24
 
10
25
  `woods-agent-config` (#407) is available in Woods `2.0.0.beta3`. First record the
@@ -39,6 +54,14 @@ Keep normal protocol negotiation and use the
39
54
  when unavailable. See the
40
55
  [initialization contract](https://github.com/lost-in-the/woods/blob/main/docs/MCP_SERVERS.md#initialization-guidance).
41
56
 
57
+ The packaged Index process does not load Rails initializers. Session and Notion
58
+ tool registration requires an explicitly configured custom/embedded process;
59
+ application configuration alone does not wire them into a separate executable.
60
+ Use `bin/rails woods:notion_sync` for ordinary application export and verify
61
+ `tools/list` for custom capabilities. For a custom Console path, configure it
62
+ before Railtie initialization and restart. See the
63
+ [process boundaries](https://github.com/lost-in-the/woods/blob/main/docs/MCP_SERVERS.md#conditional-index-capabilities).
64
+
42
65
  ## Shape 1: Index-only
43
66
 
44
67
  ```json
@@ -99,6 +122,11 @@ override; the shared root selects the primary checkout's HEAD. Follow the
99
122
 
100
123
  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.
101
124
 
125
+ In supporting unreleased builds after 2.0.0, the `:local` preset also returns
126
+ degraded on reload because snapshot vectors and SQLite metadata cannot refresh
127
+ atomically together. Restart `woods-mcp` after `woods:embed`; write access alone
128
+ does not resolve this case. See the [backend matrix](https://github.com/lost-in-the/woods/blob/main/docs/BACKEND_MATRIX.md#persistence-story).
129
+
102
130
  For host MCP reading a container daemon's shared index, foreign heartbeat trust
103
131
  (#321) is available in Woods `2.0.0.beta3`. Verify the installed gem version's release notes before
104
132
  offering `WOODS_WATCH_TRUST_FOREIGN_HOST=1` in the MCP environment. It makes
@@ -125,6 +153,12 @@ For HTTP, retain a strong token, allowed origins and TLS. Use installed-version
125
153
  tagged documentation; the [canonical Console guide](https://github.com/lost-in-the/woods/blob/main/docs/CONSOLE_MCP_SETUP.md)
126
154
  tracks current source.
127
155
 
156
+ Prefer the automatic Rails middleware mount. Per-instance guards for legacy
157
+ manual mounts are included in Woods `2.0.1` and `1.6.4`; verify the installed
158
+ version, loaded gem path and any Git revision before relying on them. A plugin
159
+ update does not patch the server. Follow the installed version's Console guide
160
+ and leave HTTP disabled for stdio-only use.
161
+
128
162
  Then add a direct Console process:
129
163
 
130
164
  ```json
@@ -137,6 +171,11 @@ Then add a direct Console process:
137
171
 
138
172
  For Docker/SSH, configure `~/.woods/console.yml` or `WOODS_CONSOLE_CONFIG`; the launcher owns process replacement. Direct Docker stdio uses `docker exec -i`, or `docker compose exec -T` to disable Compose's pseudo-TTY while retaining stdin.
139
173
 
174
+ Supporting unreleased builds after `2.0.0` prefer the selected app's executable
175
+ `bin/rake` in direct mode. A relative `directory` in `console.yml` is relative to
176
+ the launcher's initial `cwd`. Record the installed revision before relying on
177
+ this preference; explicit commands still win.
178
+
140
179
  Reserve stdout for MCP. Through Woods `2.0.0.beta4`, configure the Console
141
180
  process's Rails logger to use stderr or a file, including logs during queries.
142
181
  Runtime stdout isolation is included in Woods `2.0.0`; verify the installed
@@ -204,6 +243,26 @@ inside the application environment establishes preboot evidence. Never publish
204
243
  `.source-inputs.key`, silently change its permissions, or delete queued edits to
205
244
  hide diagnostics. Follow [source freshness](https://github.com/lost-in-the/woods/blob/main/docs/SOURCE_FRESHNESS.md).
206
245
 
246
+ Supporting unreleased builds after 2.0.0 report `unavailable` with
247
+ `source_manifest_too_large` when source evidence exceeds its serialized-size
248
+ limit. The code index remains usable. Follow `inspect_source_limits`, inspect
249
+ `unavailable.size_bytes` / `unavailable.limit_bytes`, and retain the limitation;
250
+ an identical full extraction or a deeper scan cannot fix oversized evidence.
251
+ An oversized launcher handoff cannot establish verified preboot capture.
252
+
253
+ ## Partial search and GraphQL lookup (unreleased after 2.0.0)
254
+
255
+ Check the installed reader revision before relying on these repairs. Unscoped
256
+ search skips an individual unit it needs but cannot read, retains readable matches,
257
+ and reports successful partial completeness with
258
+ `reason: "unreadable_or_corrupt_source"`. Empty partial results do not prove
259
+ absence. Identifier-only search can use summaries without validating unit
260
+ bodies; run `woods:validate` for damage. Explicit package/source-path scope
261
+ still requires readable bodies across its full-unit preflight. Corrupt
262
+ index-wide artifacts return a typed error. Supporting `lookup` also accepts
263
+ `type: "graphql"`, but returns the unit's concrete type; use that type for follow-up checks.
264
+ See the [search contract](https://github.com/lost-in-the/woods/blob/main/docs/MCP_SERVERS.md#search-completeness).
265
+
207
266
  ## Compact evidence capability check
208
267
 
209
268
  Inspect the connected server's installed tool schemas before using `evidence` on
@@ -215,17 +274,29 @@ coordinates are not physical file offsets; unknown generation remains unknown.
215
274
  Keep full-source access available. See the canonical
216
275
  [evidence contract](https://github.com/lost-in-the/woods/blob/main/docs/RETRIEVAL_GUIDE.md#compact-published-evidence-and-api-outlines).
217
276
 
218
- ### HTTP configuration diagnostics on security-patch candidates
277
+ ### Origin policy compatibility
278
+
279
+ In Woods `2.0.1`, HTTP preflight and the SDK share one captured policy. List the
280
+ browser's exact origin, including its port, for cross-origin requests; portless
281
+ entries additionally permit same-authority
282
+ traffic. Include a non-loopback MCP endpoint authority and restart after edits.
283
+ Do not disable SDK protection or rewrite Origin/Host to make a request pass.
284
+ Follow the [2.0.1 HTTP guide](https://github.com/lost-in-the/woods/blob/v2.0.1/docs/MCP_HTTP_TRANSPORT.md#browser-origins-dns-rebinding-defense)
285
+ and verify both preflight and authenticated dispatch.
286
+
287
+ ### HTTP configuration diagnostics in 2.0.1
219
288
 
220
- Check the installed revision before expecting this unreleased correction. Invalid
221
- origin settings, including invalidly encoded entries, refuse at boot. The HTTP
222
- executable reports one configuration diagnostic and exits 2. Correct the named
223
- entry and restart; keep authentication and origin checks enabled. Follow the
289
+ Verify the installed version, loaded gem path and any Git revision. In Woods
290
+ `2.0.1`, invalid origin settings, including invalidly encoded entries, refuse at
291
+ boot. The HTTP executable reports one configuration diagnostic and exits 2.
292
+ Correct the named entry and restart; keep authentication and origin checks enabled. Follow the
224
293
  installed revision's canonical `docs/MCP_HTTP_TRANSPORT.md` for accepted origins.
225
294
 
226
295
  Use whitespace-free literal origin entries; explicit lists replace browser
227
296
  defaults, and wildcard patterns are unsupported. Preserve the real Host behind
228
297
  proxies. Verify both preflight and bearer-authenticated dispatch against the
229
- [HTTP compatibility guide](https://github.com/lost-in-the/woods/blob/main/docs/MCP_HTTP_TRANSPORT.md#origin-configuration-compatibility)
230
- at the installed revision; configured non-loopback Hosts are passed to the SDK
231
- in supporting patches.
298
+ [2.0.1 HTTP compatibility guide](https://github.com/lost-in-the/woods/blob/v2.0.1/docs/MCP_HTTP_TRANSPORT.md#origin-configuration-compatibility).
299
+ For applications staying on 1.6, use `1.6.4` and its
300
+ [HTTP compatibility guide](https://github.com/lost-in-the/woods/blob/v1.6.4/docs/MCP_HTTP_TRANSPORT.md#origin-configuration-compatibility);
301
+ configuration normalization differs between the two lines. A plugin update does
302
+ not update either server's installed gem.