chore: delete src/vectorsets/, a PyO3 module that has not compiled since Feb 2026 - #297
Conversation
…nce Feb 2026
`src/vectorsets/{mod,configure,search,upload}.rs` is unreachable from every
target in this crate. `src/lib.rs` declares only `config`, `metrics`,
`parsers`, `query_filter`, `readers`, `redis_client`, `start_gate`,
`synthetic`. The single `mod vectorsets;` in the tree
(`src/bin/vector_db_benchmark/engine/mod.rs:26`) sits in `engine/mod.rs`, so
Rust resolves it against `src/bin/vector_db_benchmark/engine/` and it binds to
the live `engine/vectorsets.rs`. There is no `#[path]` attribute anywhere in
the repo, and no `include!`/`include_str!` outside `v0/`, so nothing can
re-route a declaration at it.
It also cannot compile. Temporarily appending `pub mod vectorsets;` to
`src/lib.rs` and running `cargo check --lib` produces 190 errors, the first
being `error[E0433]: cannot find module or crate 'pyo3'` at
`src/vectorsets/configure.rs:1`. `pyo3` is not in `Cargo.toml` and not in
`Cargo.lock`. These files were the PyO3 native extension added in 0725e3c
(2026-02-23) under `rust/src/`, whose crate root `rust/src/lib.rs` did declare
`mod vectorsets;`. ebd4a5c (2026-02-27) moved `rust/src/vectorsets/*` to
`src/vectorsets/*` and in the same commit added the real
`src/bin/vector_db_benchmark/engine/vectorsets.rs` (532 lines); the new
`src/lib.rs` did not carry the declaration over. Nothing was lost by that move
that is not already implemented in the live engine.
Nothing references its three public types (`RustVsetConfigurator`,
`RustVsetSearcher`, `RustVsetUploader`) anywhere in the repo, including
`tests/`, `v0/` and the workflows.
The cost of leaving it is that it reads like the implementation while
disagreeing with it: it still writes the pre-#236 hardcoded key
(`.arg("idx")` at search.rs:100,348 and upload.rs:109,899), whereas the live
engine derives `idx:<config>` via `derive_index_name` (vectorsets.rs:141).
Two repo-wide refactors have already spent edits on it (530ec70 and 1282eda /
PR #249).
Deletion only. No other file is touched.
Closes #291.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`UNCOMPILED` was the one inventory in this module with a skip filter and no assertion. `KNOWN_UNRECORDED` and `EXEMPT_CALLS` are both bidirectional — the latter was upgraded precisely "so a removed one cannot leave a stale excuse" — and the same reasoning applies here with more force: a stale skip row silently WIDENS what the scanner ignores, which is the direction that hides violations rather than surfacing them. `src/vectorsets/` is being deleted (#297) and `src/redisearch/` next (#296), so the row would have rotted unnoticed. Two legs, each proven to bite: * the directory must still EXIST. Simulating #297 by moving `src/vectorsets/` away fails with "UNCOMPILED lists `src/vectorsets/`, which no longer exists — delete the row … Tracked in #275 / #296 / #297". * no crate root may DECLARE it, or the code is compiled, can read the environment at runtime, and is being skipped anyway. Adding a row for `src/readers/` (which lib.rs does declare) fails with "IS declared as a module and therefore compiled". Leg 2 could not be demonstrated by declaring `vectorsets` itself: adding `pub mod vectorsets;` to lib.rs does not COMPILE, which is independent evidence for #297's premise that the directory is dead. The four `src/config.rs` exemption reasons justified themselves by naming `src/redisearch/` and `src/vectorsets/` as `RedisConfig::from_env`'s only callers — half-true once #297 lands, false once #296 does. They now state the durable property instead ("no caller compiled into any binary") and `the_exempted_dead_constructor_has_no_live_caller` asserts it; planting a real call in `engine/redis.rs` fails it. After both deletions the constructor has zero callers and the right move is deleting it, which the reason now says. Citations cross-linked: #275 covers both directories and the constructor, and is superseded piecemeal by #291/#296/#297. Refs #212
|
Heads-up from #264 (provenance recording, #212), which is in flight: after this merges, #264's guard will fail until one line is deleted. Flagging now so it is not discovered mid-merge.
const UNCOMPILED: &[&str] = &["src/redisearch/", "src/vectorsets/"];That list is now asserted in both directions ( The fix is deleting This is deliberate, and the same contract Incidentally, #264's verification supports this PR's premise from another angle: adding One bookkeeping note: #275 already covers both |
…s tree map `memory-bank/standards/coding-standards.md` lines 58-62 enumerated exactly the four files the previous commit deleted, so after that commit the diagram described a directory that no longer exists. Removed the block; nothing else in the file is touched. Scoped deliberately: - `src/redisearch/` keeps its block (lines 52-57). That directory still exists on disk, so the diagram is still accurate about it. It goes with #296. - The diagram remains stale in ways that predate this PR, are unaffected by it, and are NOT fixed here: `src/` also holds `metrics.rs`, `parsers.rs`, `query_filter.rs`, `start_gate.rs` and `synthetic.rs`; `readers/` also holds `sparse_reader.rs`; `bin/` also holds `generate_dataset.rs`; and under `engine/` the diagram names 3 entries (`mod.rs`, `redis.rs`, `vectorsets.rs`) where the directory holds 22 `.rs` files — `engine/mod.rs` declares 21 modules plus its own `mod.rs`. This commit does not claim to make the diagram correct, only to stop it naming files this PR removes. No test or workflow reads `memory-bank/`, so this changes no gate: $ git grep -n "memory-bank" 7ed81eb -- src/ tests/ .github/ (no output) Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Docker Build ValidationPlatforms tested:
Tests performed:
|
Docker Build ValidationPlatforms tested:
Tests performed:
|
1 similar comment
Docker Build ValidationPlatforms tested:
Tests performed:
|
Merged, not rebased: the branch is published and the standing rule here is to add a commit rather than force-push.
…ps printing the leak #297 landed, so `UNCOMPILED` lost its `src/vectorsets/` row — the bidirectional assertion added when #297 was opened failed on the merge and named the string to delete. Contract working as designed. SF1 — a third identity path published operator input verbatim. `prose` was derived by matching the JSON key name against `PROSE_KEYS = ["reason","covers"]` at ANY depth, and `set_declared` forwards a raw un-allow-listed config subtree into `note_override`. A config placing a `{"reason": …}` object at one of three CI-pinned paths therefore published it in the clear — the same value `<dropped>` on the allow-listed path and cleartext two keys away, which is exactly the "artifact asserts a redaction it did not perform" class this series exists to kill. `assert_no_cleartext_secrets` could not see it: `reason` is not credential-named. `PROSE_KEYS` and the prose arm are deleted. `reason` is now `&'static str` on `Override`, held OUTSIDE the scrubbed tree and spliced in by position after the scrub; `covers` is a hoisted literal spliced the same way. Only a string literal can reach either, which a key name cannot forge. Regression test plants four canaries through both routes. SF2 — `assert_no_cleartext_secrets` printed the credential it caught, under no `cfg`, so in release too. It fires only when the redactor has a bug, i.e. the moment the value must not be written anywhere, and benchmark stderr gets pasted into issues. The offending value is now digested in the message. Generator and corpus: * the `canary_before_at >= 5` floor had slack 9 against an actual 14, so nine `@`-rows could be defanged unnoticed — including `userinfo-slash-pw`, the row that memorialises round 5's regression, whose defanging survived 850/850. Now asserted per-row for every `userinfo*` label; verified the exact mutation fails. * the plain-token alphabet is pinned by `plain_token_alphabet_is_pinned`. Adding `@`, `;`, `&`, `#`, `?`, `%`, `,`, `*` or `!` each survived the whole suite; only `:` and `=` were covered. * `assert!(checked > 5000)` was tautological (incremented once per iteration); it now counts cases that actually reached the digest path. * the doc states where the generator's coverage STOPS — it drives `redact_connection_like` and `invocation.host` only, so no seed of it could have produced SF1. Documented rather than changed: `is_plain_token` protects nothing punctuation-free (a bare `hunter2`, a UUID, `ghp_…` are published; `is_secret` on the key is the sole defence for those), and the digest is an UNSALTED hash and therefore a commitment — a guessed endpoint can be confirmed offline. Both are the intended trade; neither was written down. Also: Cargo.toml's comment still advertised the deleted URL parser; `shared_corpus_key_prefix`'s digest buys no secrecy while `env.REDIS_KEY_PREFIX` shows the same text; paths outside `$HOME` stay absolute. Refs #212
SF1 — `<dropped>` and `<redacted:default>` never reached an artifact, and eight
comments plus a commit message said they did. `snapshot` scrubs the whole
assembled document, so both were re-processed: `<dropped>` is not a plain token
and digested to the hash of the literal `<dropped>`, and `<redacted:default>`
under a credential-named key fell through to `<redacted:set>`.
The second is the damaging one and is the prose bug inverted. An ES/OS/pgvector
run with NO password set published
effective.ELASTIC_PASSWORD = "<redacted:set>"
— the artifact asserting a credential was supplied when the built-in default was
used, which misleads exactly the operator auditing which credentials a run
actually had. `record_effective_raw` existed to prevent this and was defeated,
so `env_or`'s `is_secret(name) && !was_set` branch was dead as far as the
artifact was concerned.
`scrub_value` now passes an already-emitted sentinel through unchanged. Verified
live: with no password set the artifact reads `<redacted:default>`, an unknown
declared key reads `<dropped>`, and `m`/`ef_construction` still read normally.
Two tests pin it — the write path and `env_or`'s set-vs-default branch end to
end — and removing the arm fails them.
SF2 — the splice's positional coupling between `assemble` and `snapshot` was a
convention shared by two functions and asserted nowhere: reversing the iteration
in `assemble` mis-attributes every reason and left all 852 tests green, because
no test had two overrides with distinct reasons. Now three, checked pairwise;
the `.rev()` mutation fails it.
NITs:
* round 5's exact shape was still defangable on the row that memorialises it.
"Some canary before the `@`" passed for
`redis://admin:pw/CANARY@10.0.0.5:6379/0` — the canary sitting in the half
the buggy code dropped. The rule is now "in the userinfo, before its first
internal delimiter", and that mutation dies.
* the docstring claimed "a canary on BOTH sides" while the code three lines
down required some side; it now describes what is actually asserted.
* `MINIMUM_SHAPES` was 55 against an actual 56 — one row deletable silently.
* `mongodb-srv` had userinfo but its label skipped the per-row loop; renamed
and given a two-part canary.
* the #297 remediation was half-followed: the row went, the prose did not.
Three passages still described `src/vectorsets/` as live or its deletion as
pending.
Refs #212
Deletes
src/vectorsets/{mod,configure,search,upload}.rs— 1,421 lines that no target in this crate has compiled since 2026-02-27 — plus the 5-line block inmemory-bank/standards/coding-standards.mdthat enumerated exactly those four files. 5 files, 1,426 deleted lines, zero added lines. No source file outside the deleted directory is touched. The whole review surface is "is it really dead", so the evidence is below, with the commands and their verbatim output. Everything was run in dedicated worktrees with their ownCARGO_TARGET_DIR.Closes #291.1. Nothing declares it
src/lib.rsdeclares eight modules, andvectorsetsis not one of them:There is exactly one
mod vectorsets;in the tree:Rust resolves
mod foo;against the declaring module's own directory. That declaration is inengine/mod.rs, amod.rs, so its directory issrc/bin/vector_db_benchmark/engine/— the candidates areengine/vectorsets.rsandengine/vectorsets/mod.rs.engine/vectorsets.rsexists and is the live engine (pub use vectorsets::VectorSetsEngine;atengine/mod.rs:48).src/vectorsets/is in a different directory entirely and is not a candidate for that declaration.src/vectorsets/mod.rsdoes exist, so the directory would be picked up by amod vectorsets;written insrc/lib.rs— which is why item 3 below matters. Nothing else could reach it: there is no#[path]attribute anywhere, and noinclude!/include_str!/include_bytes!outsidev0/:2. Nothing references its symbols
The module defines exactly three public items across the three non-
mod.rsfiles:Searched repo-wide across all file types, including
tests/,v0/,.github/and the manifests:Definitions and their own
implblocks only. Zero use sites.3. It genuinely does not compile
Demonstrated rather than asserted. I appended
pub mod vectorsets;tosrc/lib.rs(verified withgit diffthat the edit landed), rancargo check --lib, then restoredsrc/lib.rsfrom a copy taken beforehand —git status --porcelainwas empty afterwards.190 errors. And this is not a missing-feature-flag situation —
pyo3is absent from both the manifest and the lockfile:So there is no configuration of this crate under which these files compile.
4. Why it survived: it is an orphaned PyO3 extension
0725e3c (2026-02-23) added these files at
rust/src/vectorsets/, as a PyO3 extension consumed from Python. That crate root did declare them, so they compiled at the time:ebd4a5c (2026-02-27), "First version with Redisearch and VectorSets working in rust", is the supersession. In one commit it moved
rust/src/vectorsets/{mod,configure,search}.rstosrc/vectorsets/and added the real enginesrc/bin/vector_db_benchmark/engine/vectorsets.rs(532 lines):The new
src/lib.rswritten by that commit declared onlyconfig,readers,redis_client— themod vectorsets;was not carried over. That is the moment it went dead. Its Python caller (engine/clients/vectorsets_rs/__init__.py) was deleted in the same commit.Was anything left unported? No. The dead module is a PyO3 shim: three
#[pyclass]structs whose methods take/returnPyObjectand enterPython::with_gil. Its VectorSets protocol work —VADD/VSIM,FP32/Q8/BINquantization, pipelined batch upload,VSIM ... WITHSCORESparsing — is all present inengine/vectorsets.rs, which has since grown well past it (per-config keys, filter expressions, geo, the start gate). The one thing the dead copy has that the live one does not is a stale behaviour, not a missing one — see below. I did not find anything worth porting, so no follow-up issue is filed for lost functionality.5. Nothing in packaging or CI globs it
Cargo.tomlhas noinclude/excludekeys, and its four[[bin]]targets aresrc/bin/bench_jsonl.rs,src/bin/bench_npy.rs,src/bin/vector_db_benchmark/main.rs,src/bin/generate_dataset.rs. There is no[[bench]]. Cargo's target auto-discovery looks atsrc/bin/,benches/,examples/,tests/—src/vectorsets/is none of those. (Auto-discovery does add a fifth, undeclared bin,src/bin/bench_hdf5.rs, which has no[[bin]]stanza. That is why thecargo test --lib --binssum in the Gates table has six terms rather than five — lib + 5 bins. It is not a typo.)No
build.rsexists.The nested
fuzz/crate cannot reach it either.fuzz/Cargo.tomldeclares its own[workspace]and depends on the root crate by path ([dependencies.vector_db_benchmark] path = ".."), so it can only see whatsrc/lib.rsexports — which never includedvectorsets. And it does not ask for it:Zero occurrences of the substring
vectorsetanywhere underfuzz/— targets, corpora, dictionaries, README, lockfile.Workflows: the only
srcreferences in.github/are path filters (- 'src/**'inci.yml,docker-build-pr.yml,validate-datasets.yml). Those decide whether a workflow runs; they do not compile or package individual files, and this PR touchessrc/**so CI triggers normally.Dockerfileis the one literal hit for the stringsrc/vectorsetsin the whole repo:That grep is literal, and one surviving reference escapes it by writing
vectorsets/without thesrc/prefix:memory-bank/standards/coding-standards.md:58-62, whose source-tree diagram enumerated exactly the four deleted files. Unlike the Dockerfile line, that one is documentation that would describe a tree which no longer exists, so this PR deletes it (commit52ce283) rather than deferring it — see Scope. The Dockerfile line is different, and is not a reference to the repo tree at all. At that point in the build onlyCargo.tomlandCargo.lockhave been copied (line 23), so nosrc/exists in the image at all; line 26 fabricates an empty stub tree so the dependency-only build can be cached. Line 39 then runsrm -rf src, and line 43COPY src ./srcbrings in the real tree.mkdir -pon a directory that no longer exists upstream is a no-op either way. I deliberately left the Dockerfile untouched — stated as a known-stale reference in Scope.6. The repo's own source-scanning guards
tests/overhead_invariants.rs::all_sources()(line 214) walks every.rsundersrc/, so deleting files does change its input. Two tests consume it:inv4_no_fixed_count_start_barrier(line 460) andstripper_preserves_line_count_of_every_source_file(line 681).Measured inputs before → after:
.rsfiles undersrc/(the test'schecked)\-continuations undersrc/(the test'scontinuations)Barrierundersrc/vectorsets/Both columns are measured on the merged tree (
407a196→7e6ba51). #295 added no files undersrc/, so the file count is unchanged from the old base; it did add\-continuations, which is why that row reads 307 rather than the 281 this body quoted before the merge.stripper_preserves_line_count_of_every_source_fileassertschecked > 20andcontinuations > 100; 58 and 307 clear both with room to spare.inv4had nothing to find in the deleted files (grep -rn "Barrier" src/vectorsets/→ no matches), so its verdict is unchanged.On the inventories: the only one that exists at
7ed81ebisEXCUSEDingated_engine_files()(line 249), and it is keyed on module names parsed out ofengine/mod.rs, not on paths undersrc/— the deleted directory never appeared in it.KNOWN_UNRECORDED,EXEMPT_CALLSandNON_LITERAL_ENV_VAR_SITESdo not exist on master — nor doessrc/bin/vector_db_benchmark/effective_config.rs. They arrive with open PR #264.Restricted to master, where the inventories listed above are the only ones that exist, no path under
src/vectorsets/is named in any of them:Why delete rather than leave
It reads as the implementation while disagreeing with the shipping engine on its most load-bearing detail. It still writes the pre-#236 hardcoded key:
whereas
engine/vectorsets.rs:141derives a per-config key:One correction to the issue's framing. #291 says two open PRs are editing
src/vectorsets/search.rs. As of today that is not what the diffs show: #286 merged as7ed81eband its file list containsengine/vectorsets.rs, notsrc/vectorsets/search.rs; #264's current file list is 22 files, none undersrc/vectorsets/. The underlying cost is nonetheless real and is visible in history rather than in open PRs — two repo-wide refactors did edit this never-compiled file: 530ec70 (recall/precision/MRR/NDCG) and 1282eda (#249, 2026-08-08 — 162 days, i.e. 5 months and 12 days, after it went dead).Related issues — and the overlap with #275
#275 ("dead code: uncompiled
src/redisearch+src/vectorsets, recorder-bypassingRedisConfig::from_env, andWEAVIATE_USE_GRAPHQL=falseselects GraphQL") already tracked both directories before #291 was filed, and #264'sEXEMPT_CALLSprose cites #275 by number as the tracker. Flagging the overlap rather than letting it sit silent:##-numbered items, not three — I previously wrote three, which was wrong. This PR ticks off half of its item 1, thesrc/vectorsets/half; thesrc/redisearch/half is src/redisearch/ is the second dead PyO3 module — same state as src/vectorsets/ (#291) #296. Items 2, 3 and 4 (RedisConfig::from_env;WEAVIATE_USE_GRAPHQL=falseselecting GraphQL; a stale#217comment inv0/tools/upload_results_postgres.sh) are untouched by either PR.93bb97bnow reads "superseded piecemeal by src/vectorsets/ is dead code that never compiles — and two open PRs are editing it #291/src/redisearch/ is the second dead PyO3 module — same state as src/vectorsets/ (#291) #296/chore: delete src/vectorsets/, a PyO3 module that has not compiled since Feb 2026 #297". I have no stake in which way that goes. My only factual claim is the one above — items 2-4 are untouched by src/vectorsets/ is dead code that never compiles — and two open PRs are editing it #291/src/redisearch/ is the second dead PyO3 module — same state as src/vectorsets/ (#291) #296/chore: delete src/vectorsets/, a PyO3 module that has not compiled since Feb 2026 #297, so something has to carry them. Where that lives is the maintainer's call.RedisConfig::from_env()'s only non-test call sites are inside the two dead directories. After this PR the remaining 10 are all insrc/redisearch/(configure.rs:28,75;search.rs:141,565,592;upload.rs:58,345,477,626,764), so item 2 becomes actionable only once src/redisearch/ is the second dead PyO3 module — same state as src/vectorsets/ (#291) #296 lands — not with this PR. This PR does not removefrom_envor changesrc/config.rsin any way.Gates
Run in a worktree at
7ed81ebwith a privateCARGO_TARGET_DIR,touch src/lib.rs src/bin/vector_db_benchmark/main.rsbefore each test invocation to defeat stale fingerprints, and therunning N testsline asserted for every run. A pure deletion of never-compiled files should move nothing, and nothing moved.407a1967e6ba51cargo fmt --checkcargo clippy --all-targets -- -D warningscargo test --lib --binscargo test --test overhead_invariantscargo test --test integration_redis -- --test-threads=1Verbatim, on the merged head
7e6ba51:and on master
407a196, same worktree, sameCARGO_TARGET_DIR,git switch --detachbetween them:Delta: 0 on every gate. Both columns are my own runs, not quoted baselines — including
integration_redis, which on the old base I had only run after the deletion. It used a privateredis:8.8.0container (vdb291c-redis, host port 6492,REDIS_TEST_PORT=6492,flushallbetween the two runs, removed afterwards) — never the sharedtests-redis-1on 6399.touch src/lib.rs src/bin/vector_db_benchmark/main.rsbefore every invocation,running Nasserted on all of them,find src -name '*.rs' | wc -l= 62 on master and 58 on the merged head.One number I was handed that did not survive checking, flagged because the total hides it. The 919 master baseline is right, but the split I was given — "126 lib + 2 generate_dataset + 791 main" — is not what the run prints. It is 129 lib + 2 + 788 main: #295 added 3 library tests (
readers/sparse_reader.rs,synthetic.rs) and 11 to the main binary, not 0 and 14. Same total, different provenance, so a future delta traced to the wrong target would come out wrong.integration_redisnote, stated plainly rather than glossed: I ran it only after the deletion, against a privateredis:8.8.0container (vdb291-redis, host port 6491,REDIS_TEST_PORT=6491, torn down afterwards) — not the sharedtests-redis-1on 6399. The 39 is compared against the count recorded for master rather than a before-run I performed myself. Since the deleted files are not compiled into any target, an integration run cannot link them, so a before/after pair could not have differed.Merge with
407a1967e6ba51is a merge commit with parents52ce283+407a196. Git reported no conflict — which on its own proves nothing, so the merge is checked from both sides instead.The merged tree differs from master by exactly this PR, and by nothing else:
And it differs from my pre-merge tip by exactly #295, byte for byte — nothing of theirs was dropped in the merge:
src/vectorsets/is gone from the merged tree (ls -d src/vectorsets→ No such file or directory) andengine/vectorsets.rsis present and untouched at 99,629 bytes. A grep for conflict markers acrosssrc/,tests/andmemory-bank/returns nothing. #295 touched 13 files —README.md,datasets/datasets.json,generate_dataset.rs,cli.rs,config.rs,dataset.rs,engine/{qdrant,redis}.rs,experiment.rs,readers/{mod,sparse_reader}.rs,synthetic.rs,tests/integration_redis.rs— and added or deleted no files; the intersection with my 5 is empty.Scope — what I deliberately did not do
src/bin/vector_db_benchmark/engine/vectorsets.rs, the live engine, at all.Dockerfile. After this PR,Dockerfile:26namessrc/vectorsets, a directory that no longer exists in the repo (andsrc/redisearchwill join it once src/redisearch/ is the second dead PyO3 module — same state as src/vectorsets/ (#291) #296 lands). I am stating that plainly rather than only saying "did not touch it". It is cosmetic, not functional: as shown in §5 the line fabricates a stub tree inside an image that has nosrc/at that point, andrm -rf src13 lines later deletes it before the realCOPY src ./src.mkdir -pneither reads nor requires the repo tree, so the build behaves identically with or without the name. Editing it would be a behaviourless change to a caching layer and is out of scope here; the one-line tidy belongs in the src/redisearch/ is the second dead PyO3 module — same state as src/vectorsets/ (#291) #296 PR, where it can drop both names at once.src/redisearch/, which is in the same state — 5 files, nomod redisearch;anywhere in the tree, the same orphaned PyO3 origin in 0725e3c,pyo3on 57 lines across its four non-mod.rsfiles, and zero references toRustRedisConfigurator/RustRedisSearcher/RustRedisUploaderoutside itself. The live RediSearch engine isengine/redis.rs(mod redis;,engine/mod.rs:22). Filed as src/redisearch/ is the second dead PyO3 module — same state as src/vectorsets/ (#291) #296 so this PR stays one reviewable deletion. Those are the only two such directories: the other entries undersrc/arebin/andreaders/, andreadersis declared (src/lib.rs:14).memory-bank/standards/coding-standards.md:58-62listed the four deleted files by name in its source-tree diagram; commit52ce283removes those 5 lines. A module's own tree-map entry is part of the module rather than adjacent tidying — but the limits are worth stating.src/redisearch/'s block (lines 52-57) stays: that directory still exists on disk, so the diagram is still accurate about it, and it goes with src/redisearch/ is the second dead PyO3 module — same state as src/vectorsets/ (#291) #296. And the diagram remains stale in ways that predate this PR and are not fixed here —src/also holdsmetrics.rs,parsers.rs,query_filter.rs,start_gate.rs,synthetic.rs;readers/also holdssparse_reader.rs;bin/also holdsgenerate_dataset.rs; and underengine/it names 3 entries where the directory holds 22.rsfiles. This PR does not claim to make that diagram correct, only to stop it naming files this PR removes. Nothing readsmemory-bank/(git grep -n "memory-bank" 7ed81eb -- src/ tests/ .github/→ no output), so no gate is affected.🤖 Generated with Claude Code