wikifier 4.6.7__tar.gz → 4.6.8__tar.gz

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 (63) hide show
  1. {wikifier-4.6.7/wikifier.egg-info → wikifier-4.6.8}/PKG-INFO +31 -17
  2. {wikifier-4.6.7 → wikifier-4.6.8}/README.md +30 -16
  3. {wikifier-4.6.7 → wikifier-4.6.8}/skills/run.md +61 -3
  4. wikifier-4.6.8/tests/test_init_seed.py +114 -0
  5. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier/__init__.py +1 -1
  6. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier/scripts/wikifier.sh +47 -6
  7. {wikifier-4.6.7 → wikifier-4.6.8/wikifier.egg-info}/PKG-INFO +31 -17
  8. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier.egg-info/SOURCES.txt +1 -0
  9. {wikifier-4.6.7 → wikifier-4.6.8}/CONTRIBUTING.md +0 -0
  10. {wikifier-4.6.7 → wikifier-4.6.8}/LICENSE +0 -0
  11. {wikifier-4.6.7 → wikifier-4.6.8}/MANIFEST.in +0 -0
  12. {wikifier-4.6.7 → wikifier-4.6.8}/diagnostics.html +0 -0
  13. {wikifier-4.6.7 → wikifier-4.6.8}/docs/spec.md +0 -0
  14. {wikifier-4.6.7 → wikifier-4.6.8}/index.html +0 -0
  15. {wikifier-4.6.7 → wikifier-4.6.8}/pyproject.toml +0 -0
  16. {wikifier-4.6.7 → wikifier-4.6.8}/setup.cfg +0 -0
  17. {wikifier-4.6.7 → wikifier-4.6.8}/tests/test_agent_loop.py +0 -0
  18. {wikifier-4.6.7 → wikifier-4.6.8}/tests/test_agent_scale.py +0 -0
  19. {wikifier-4.6.7 → wikifier-4.6.8}/tests/test_barrel_invalidation.py +0 -0
  20. {wikifier-4.6.7 → wikifier-4.6.8}/tests/test_cache_store.py +0 -0
  21. {wikifier-4.6.7 → wikifier-4.6.8}/tests/test_gap_closure.py +0 -0
  22. {wikifier-4.6.7 → wikifier-4.6.8}/tests/test_health.py +0 -0
  23. {wikifier-4.6.7 → wikifier-4.6.8}/tests/test_import_cache.py +0 -0
  24. {wikifier-4.6.7 → wikifier-4.6.8}/tests/test_index_map_paths.py +0 -0
  25. {wikifier-4.6.7 → wikifier-4.6.8}/tests/test_multi_lang_parsers.py +0 -0
  26. {wikifier-4.6.7 → wikifier-4.6.8}/tests/test_parsers.py +0 -0
  27. {wikifier-4.6.7 → wikifier-4.6.8}/tests/test_selftest_wrappers.py +0 -0
  28. {wikifier-4.6.7 → wikifier-4.6.8}/tests/test_walk_coverage_resolvers.py +0 -0
  29. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier/__main__.py +0 -0
  30. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier/agent_loop.py +0 -0
  31. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier/cache_store.py +0 -0
  32. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier/candidates.py +0 -0
  33. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier/cli.py +0 -0
  34. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier/contracts.py +0 -0
  35. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier/daemon.py +0 -0
  36. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier/diagnostics.py +0 -0
  37. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier/health.py +0 -0
  38. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier/import_cache.py +0 -0
  39. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier/index.html +0 -0
  40. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier/library.py +0 -0
  41. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier/locking.py +0 -0
  42. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier/mcp/__init__.py +0 -0
  43. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier/mcp/server.py +0 -0
  44. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier/parsers/__init__.py +0 -0
  45. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier/parsers/_edge.py +0 -0
  46. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier/parsers/bree.py +0 -0
  47. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier/parsers/c_cpp.py +0 -0
  48. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier/parsers/cdia.py +0 -0
  49. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier/parsers/csharp.py +0 -0
  50. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier/parsers/go_lang.py +0 -0
  51. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier/parsers/java.py +0 -0
  52. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier/parsers/javascript.py +0 -0
  53. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier/parsers/python.py +0 -0
  54. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier/parsers/rust.py +0 -0
  55. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier/project_root.py +0 -0
  56. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier/resolution.py +0 -0
  57. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier/scripts/wikifier.bat +0 -0
  58. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier/scripts/wikifier.ps1 +0 -0
  59. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier/serve.py +0 -0
  60. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier.egg-info/dependency_links.txt +0 -0
  61. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier.egg-info/entry_points.txt +0 -0
  62. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier.egg-info/requires.txt +0 -0
  63. {wikifier-4.6.7 → wikifier-4.6.8}/wikifier.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wikifier
3
- Version: 4.6.7
3
+ Version: 4.6.8
4
4
  Summary: Zero-dependency agent-to-agent codebase wiki for LLMs and AI agents. Autonomously maintained via record-change and mark-green for token-efficient lookup of files, dependencies, health, and summaries — across tiny scripts to 50k+ monorepos. Optional MCP server with rich tools for agents.
5
5
  Author-email: Aron Amos <aron@example.com>
6
6
  Maintainer: Aron Amos
@@ -52,7 +52,14 @@ Works from small scripts to large monorepos. **Deep import/include maps** (zero-
52
52
  | C# | `.cs` | `using` namespaces |
53
53
  | Java | `.java` | `import` / `import static` |
54
54
 
55
- Health/journal still work for any monitored path. Parsers are **pragmatic regex** (not full cargo/`go.mod`/classpath/`-I` resolution). Prefer **lean `monitored_paths.txt`** on huge monorepos; raise dirty cap with `WIKIFIER_CHECK_CHANGES_MAX` (default 2000) only when needed.
55
+ Health/journal still work for any monitored path. Parsers are **pragmatic regex** (not full cargo/`go.mod`/classpath/`-I` resolution). On huge monorepos, split scope deliberately:
56
+
57
+ | File | Surface |
58
+ |------|---------|
59
+ | **`map_paths.txt`** | Package roots for **import maps** (`update-maps` walk). Prefer package dirs (`src/`, `packages/foo/`) — not a wiki-only file list. |
60
+ | **`monitored_paths.txt`** | **Wiki / health** watch list (can be individual `.md` files). Does **not** define the map. |
61
+
62
+ Or pass `--directory=pkg/` / `--max-files=N` per run. Raise dirty cap with `WIKIFIER_CHECK_CHANGES_MAX` (default 2000) only when needed. Never set `project_root` to a multi-repo parent of clones.
56
63
 
57
64
  ## Why
58
65
 
@@ -74,7 +81,8 @@ pip install wikifier # pure Python stdlib core — no runtime deps
74
81
  pip install wikifier[mcp] # optional Model Context Protocol (MCP) server
75
82
 
76
83
  cd /path/to/your/project
77
- wikifier init # seeds + human index.html
84
+ wikifier init # seeds index.html + lean path-list templates
85
+ # Edit monitored_paths.txt + map_paths.txt to package roots (not bare ".") on real trees
78
86
  wikifier update-maps # full structural map → library.md + import cache
79
87
  wikifier health --summary # matrix counts
80
88
  wikifier suggest-next # or MCP suggest_next_actions — 🔴/🟡 only
@@ -82,6 +90,8 @@ wikifier suggest-next # or MCP suggest_next_actions — 🔴/🟡 only
82
90
 
83
91
  Always set an explicit root for external trees: `WIKIFIER_PROJECT_ROOT=/abs/path wikifier …`
84
92
 
93
+ **MCP `session_bootstrap` → `readiness: blocked`?** That means lean scope and/or the map are missing (often bare `.` monitor + never ran `update-maps`) — not a broken install. Fix: write lean `monitored_paths.txt` / `map_paths.txt`, then `update-maps`. Agent contract: **`skills/run.md`** § *Readiness blocked*; dogfood: `Findings/readiness-blocked-bare-monitor-2026-07.md`.
94
+
85
95
  ## Steady state (only touch what needs it)
86
96
 
87
97
  Full protocol: [`skills/run.md`](skills/run.md) (Agent Protocol v0.6 — package **4.6.x**).
@@ -109,11 +119,11 @@ Advanced intel as needed: `get_dependencies`, `get_dependents`, `get_cycles`, ba
109
119
 
110
120
  - **Import analysis** — Python, JS/TS (ESM/CJS, barrels), Rust (`use`/`mod` + best-effort `crate::` paths), Go, C/C++ includes, C# usings; per-edge confidence; barrel expansion for TS/JS
111
121
  - **Incremental pipeline** — pure-Python `update-maps`: dirty parse → import cache → reverse deps → cycles → `library.md`
112
- - **Warm agent maps (4.6.3–4.6.6)** — zero-dirty + **index-first** candidates (re-list only on fingerprint/index disagreement); **stdlib SQLite**; content-hash dirty
113
- - **Two path lists** — `map_paths.txt` = map package roots; `monitored_paths.txt` = wiki/health watch (independent)
122
+ - **Warm agent maps (4.6.3–4.6.7)** — zero-dirty + **index-first** candidates (re-list only when fingerprint / map-scoped index / live count disagree); **MapScope** keeps collect, live count, index filter, and prune aligned; **stdlib SQLite**; content-hash dirty
123
+ - **Two path lists** — `map_paths.txt` = map package roots; `monitored_paths.txt` = wiki/health watch (**independent** — wiki file lists never collapse the map)
114
124
  - **Partial-map honesty** — `map_coverage` on `update_maps` / bootstrap / **`suggest_next`**; `update_maps_until_complete` when incomplete
115
- - **Cache ops** — `wikifier cache-status`; JSON dual-write **opt-in only** (`WIKIFIER_CACHE_JSON=1`); dual-read for migrate
116
- - **Selective agent work** — health + suggest bias to 🔴/actionable 🟡 only; **ACS v1.3** `reason_code` / `agent_signal`; prefer `actionable_low_conf_edges` + reason codes — **never** raw `low_conf_edges` alone
125
+ - **Cache ops** — `wikifier cache-status`; JSON dual-write **deprecated default-off** (`WIKIFIER_CACHE_JSON=1` opt-in); dual-read for migrate
126
+ - **Selective agent work** — health + suggest bias to 🔴/actionable 🟡 only; **ACS v1.3** `reason_code` / `agent_signal`; prefer `actionable_low_conf_edges` + reason codes — **never** raw `low_conf_edges` averages alone
117
127
  - **Scale** — reverse index + barrel invalidation so one edit doesn’t re-scan the monorepo
118
128
  - **MCP tools** — optional server for Claude, Cursor, Cline, and other MCP clients
119
129
  - **Zero core dependencies** — stdlib only; forks can add their own stack on top
@@ -127,18 +137,21 @@ Full / heavy runs (historical order-of-magnitude):
127
137
  |---------|-------|----------------------------|
128
138
  | llama_index | ~3.8k Python files | ~8.5s class full |
129
139
  | Babylon.js | ~3.9k TS files, barrel-heavy | minutes full; scoped re-runs tens of seconds |
130
- | Large trees (e.g. LLVM-scale) | tens of thousands of files | use lean monitor + `--directory` / `--max-files` |
140
+ | Large trees (e.g. LLVM-scale) | tens of thousands of files | `map_paths` / `--directory` / `--max-files` — never unscoped one-shot |
141
+
142
+ Warm **0-dirty** re-runs after **4.6.7** (same machine class; scoped; candidates **reused** — agent session path):
131
143
 
132
- Warm **0-dirty** re-runs after 4.6.3 (same machine; scoped where noted) — agent session path:
144
+ | Project | Scope | Warm `update-maps` | n |
145
+ |---------|-------|--------------------|---|
146
+ | Wikifier (self) | `map_paths`: `wikifier/` + `tests/` | **~30 ms** | 50 |
147
+ | llama_index | `llama-index-core` | **~76 ms** | 724 |
148
+ | rust | `library/std` | **~79 ms** | 719 |
149
+ | airflow | `airflow-core` | **~180 ms** | 1920 |
150
+ | Babylon.js | `packages` | **~400 ms** | 3895 |
133
151
 
134
- | Project | Scope | Warm2 `update-maps` |
135
- |---------|-------|---------------------|
136
- | Wikifier (self) | incremental full | ~43 ms |
137
- | redox | `src` | ~17 ms |
138
- | llama_index | `llama-index-core` | ~0.6 s |
139
- | rust | `library/std/src` (budgeted) | ~0.7 s (vs multi-second full-tree walk before scoped collect) |
152
+ Residual floor on large scopes is mtime/stat + live count under MapScope (not full JSON re-walk). Sub-100ms is not a hard SLA on every 1k+ tree.
140
153
 
141
- Tests: `python -m unittest discover tests` (stdlib only; 86+ cases including agent-scale edges).
154
+ Tests: `python -m unittest discover tests` (stdlib only; **125** cases including MapScope / index-first / dual-write).
142
155
 
143
156
  ## Commands
144
157
 
@@ -152,7 +165,8 @@ Tests: `python -m unittest discover tests` (stdlib only; 86+ cases including age
152
165
  | `wikifier mark-green <file>` | Mark wiki current + source content-hash baseline |
153
166
  | `wikifier record-deletion <file> "reason"` | Mark removed paths 🔴 + prune barrel refs |
154
167
  | `wikifier suggest-next` | Next actions (🔴/actionable 🟡 only; `--json` for `actions[]`) |
155
- | `wikifier update-maps [--directory=src/] [--max-files=N]` | Rebuild graph + `library.md` (warm 0-dirty is fast) |
168
+ | `wikifier update-maps [--directory=src/] [--max-files=N]` | Rebuild graph + `library.md` (warm 0-dirty is fast; honors `map_paths.txt`) |
169
+ | `wikifier cache-status` | SQLite/JSON backend, dual-write policy, coverage snapshot (no full pair load) |
156
170
  | `wikifier health [--summary\|--json]` | Health matrix (machine-friendly flags) |
157
171
  | `wikifier validate` | Missing wiki rows + ghost paths |
158
172
  | `wikifier cycles` | Circular deps + break hints |
@@ -20,7 +20,14 @@ Works from small scripts to large monorepos. **Deep import/include maps** (zero-
20
20
  | C# | `.cs` | `using` namespaces |
21
21
  | Java | `.java` | `import` / `import static` |
22
22
 
23
- Health/journal still work for any monitored path. Parsers are **pragmatic regex** (not full cargo/`go.mod`/classpath/`-I` resolution). Prefer **lean `monitored_paths.txt`** on huge monorepos; raise dirty cap with `WIKIFIER_CHECK_CHANGES_MAX` (default 2000) only when needed.
23
+ Health/journal still work for any monitored path. Parsers are **pragmatic regex** (not full cargo/`go.mod`/classpath/`-I` resolution). On huge monorepos, split scope deliberately:
24
+
25
+ | File | Surface |
26
+ |------|---------|
27
+ | **`map_paths.txt`** | Package roots for **import maps** (`update-maps` walk). Prefer package dirs (`src/`, `packages/foo/`) — not a wiki-only file list. |
28
+ | **`monitored_paths.txt`** | **Wiki / health** watch list (can be individual `.md` files). Does **not** define the map. |
29
+
30
+ Or pass `--directory=pkg/` / `--max-files=N` per run. Raise dirty cap with `WIKIFIER_CHECK_CHANGES_MAX` (default 2000) only when needed. Never set `project_root` to a multi-repo parent of clones.
24
31
 
25
32
  ## Why
26
33
 
@@ -42,7 +49,8 @@ pip install wikifier # pure Python stdlib core — no runtime deps
42
49
  pip install wikifier[mcp] # optional Model Context Protocol (MCP) server
43
50
 
44
51
  cd /path/to/your/project
45
- wikifier init # seeds + human index.html
52
+ wikifier init # seeds index.html + lean path-list templates
53
+ # Edit monitored_paths.txt + map_paths.txt to package roots (not bare ".") on real trees
46
54
  wikifier update-maps # full structural map → library.md + import cache
47
55
  wikifier health --summary # matrix counts
48
56
  wikifier suggest-next # or MCP suggest_next_actions — 🔴/🟡 only
@@ -50,6 +58,8 @@ wikifier suggest-next # or MCP suggest_next_actions — 🔴/🟡 only
50
58
 
51
59
  Always set an explicit root for external trees: `WIKIFIER_PROJECT_ROOT=/abs/path wikifier …`
52
60
 
61
+ **MCP `session_bootstrap` → `readiness: blocked`?** That means lean scope and/or the map are missing (often bare `.` monitor + never ran `update-maps`) — not a broken install. Fix: write lean `monitored_paths.txt` / `map_paths.txt`, then `update-maps`. Agent contract: **`skills/run.md`** § *Readiness blocked*; dogfood: `Findings/readiness-blocked-bare-monitor-2026-07.md`.
62
+
53
63
  ## Steady state (only touch what needs it)
54
64
 
55
65
  Full protocol: [`skills/run.md`](skills/run.md) (Agent Protocol v0.6 — package **4.6.x**).
@@ -77,11 +87,11 @@ Advanced intel as needed: `get_dependencies`, `get_dependents`, `get_cycles`, ba
77
87
 
78
88
  - **Import analysis** — Python, JS/TS (ESM/CJS, barrels), Rust (`use`/`mod` + best-effort `crate::` paths), Go, C/C++ includes, C# usings; per-edge confidence; barrel expansion for TS/JS
79
89
  - **Incremental pipeline** — pure-Python `update-maps`: dirty parse → import cache → reverse deps → cycles → `library.md`
80
- - **Warm agent maps (4.6.3–4.6.6)** — zero-dirty + **index-first** candidates (re-list only on fingerprint/index disagreement); **stdlib SQLite**; content-hash dirty
81
- - **Two path lists** — `map_paths.txt` = map package roots; `monitored_paths.txt` = wiki/health watch (independent)
90
+ - **Warm agent maps (4.6.3–4.6.7)** — zero-dirty + **index-first** candidates (re-list only when fingerprint / map-scoped index / live count disagree); **MapScope** keeps collect, live count, index filter, and prune aligned; **stdlib SQLite**; content-hash dirty
91
+ - **Two path lists** — `map_paths.txt` = map package roots; `monitored_paths.txt` = wiki/health watch (**independent** — wiki file lists never collapse the map)
82
92
  - **Partial-map honesty** — `map_coverage` on `update_maps` / bootstrap / **`suggest_next`**; `update_maps_until_complete` when incomplete
83
- - **Cache ops** — `wikifier cache-status`; JSON dual-write **opt-in only** (`WIKIFIER_CACHE_JSON=1`); dual-read for migrate
84
- - **Selective agent work** — health + suggest bias to 🔴/actionable 🟡 only; **ACS v1.3** `reason_code` / `agent_signal`; prefer `actionable_low_conf_edges` + reason codes — **never** raw `low_conf_edges` alone
93
+ - **Cache ops** — `wikifier cache-status`; JSON dual-write **deprecated default-off** (`WIKIFIER_CACHE_JSON=1` opt-in); dual-read for migrate
94
+ - **Selective agent work** — health + suggest bias to 🔴/actionable 🟡 only; **ACS v1.3** `reason_code` / `agent_signal`; prefer `actionable_low_conf_edges` + reason codes — **never** raw `low_conf_edges` averages alone
85
95
  - **Scale** — reverse index + barrel invalidation so one edit doesn’t re-scan the monorepo
86
96
  - **MCP tools** — optional server for Claude, Cursor, Cline, and other MCP clients
87
97
  - **Zero core dependencies** — stdlib only; forks can add their own stack on top
@@ -95,18 +105,21 @@ Full / heavy runs (historical order-of-magnitude):
95
105
  |---------|-------|----------------------------|
96
106
  | llama_index | ~3.8k Python files | ~8.5s class full |
97
107
  | Babylon.js | ~3.9k TS files, barrel-heavy | minutes full; scoped re-runs tens of seconds |
98
- | Large trees (e.g. LLVM-scale) | tens of thousands of files | use lean monitor + `--directory` / `--max-files` |
108
+ | Large trees (e.g. LLVM-scale) | tens of thousands of files | `map_paths` / `--directory` / `--max-files` — never unscoped one-shot |
109
+
110
+ Warm **0-dirty** re-runs after **4.6.7** (same machine class; scoped; candidates **reused** — agent session path):
99
111
 
100
- Warm **0-dirty** re-runs after 4.6.3 (same machine; scoped where noted) — agent session path:
112
+ | Project | Scope | Warm `update-maps` | n |
113
+ |---------|-------|--------------------|---|
114
+ | Wikifier (self) | `map_paths`: `wikifier/` + `tests/` | **~30 ms** | 50 |
115
+ | llama_index | `llama-index-core` | **~76 ms** | 724 |
116
+ | rust | `library/std` | **~79 ms** | 719 |
117
+ | airflow | `airflow-core` | **~180 ms** | 1920 |
118
+ | Babylon.js | `packages` | **~400 ms** | 3895 |
101
119
 
102
- | Project | Scope | Warm2 `update-maps` |
103
- |---------|-------|---------------------|
104
- | Wikifier (self) | incremental full | ~43 ms |
105
- | redox | `src` | ~17 ms |
106
- | llama_index | `llama-index-core` | ~0.6 s |
107
- | rust | `library/std/src` (budgeted) | ~0.7 s (vs multi-second full-tree walk before scoped collect) |
120
+ Residual floor on large scopes is mtime/stat + live count under MapScope (not full JSON re-walk). Sub-100ms is not a hard SLA on every 1k+ tree.
108
121
 
109
- Tests: `python -m unittest discover tests` (stdlib only; 86+ cases including agent-scale edges).
122
+ Tests: `python -m unittest discover tests` (stdlib only; **125** cases including MapScope / index-first / dual-write).
110
123
 
111
124
  ## Commands
112
125
 
@@ -120,7 +133,8 @@ Tests: `python -m unittest discover tests` (stdlib only; 86+ cases including age
120
133
  | `wikifier mark-green <file>` | Mark wiki current + source content-hash baseline |
121
134
  | `wikifier record-deletion <file> "reason"` | Mark removed paths 🔴 + prune barrel refs |
122
135
  | `wikifier suggest-next` | Next actions (🔴/actionable 🟡 only; `--json` for `actions[]`) |
123
- | `wikifier update-maps [--directory=src/] [--max-files=N]` | Rebuild graph + `library.md` (warm 0-dirty is fast) |
136
+ | `wikifier update-maps [--directory=src/] [--max-files=N]` | Rebuild graph + `library.md` (warm 0-dirty is fast; honors `map_paths.txt`) |
137
+ | `wikifier cache-status` | SQLite/JSON backend, dual-write policy, coverage snapshot (no full pair load) |
124
138
  | `wikifier health [--summary\|--json]` | Health matrix (machine-friendly flags) |
125
139
  | `wikifier validate` | Missing wiki rows + ghost paths |
126
140
  | `wikifier cycles` | Circular deps + break hints |
@@ -9,7 +9,8 @@
9
9
 
10
10
  **Package 4.5.x + gap-closure notes (additive; protocol still v0.6):**
11
11
  - File Tree + `wikifier serve`; MCP status/attention use library + emoji (not `[GREEN]` tags).
12
- - **First-run:** `init` → `update-maps` → `health --summary` → `suggest_next_actions`. Map is automatic; wiki *prose* is agent-filled over time.
12
+ - **First-run:** `init` → lean `monitored_paths.txt` + `map_paths.txt` (not bare `.`) → `update-maps` → `health --summary` → `suggest_next_actions`. Map is automatic; wiki *prose* is agent-filled over time.
13
+ - **`session_bootstrap` readiness `blocked`:** not a crash — see **§ Readiness blocked** below. Typical causes: bare `.` monitor and/or no map/health yet. Fix scope → `update-maps` before treating the project as map-ready.
13
14
  - **Map-first ≠ wiki-done:** `health_score` **Map Ready** + many 🟡 *Initial stubs* means structural coverage only. Do **not** bulk-wiki stubs. Wiki a file when you edit it, then `mark-green`. Prefer `actionable_yellow` / 🔴 over raw yellow counts.
14
15
  - **Steady-state selective work:** only 🔴 and *actionable* 🟡 (never re-wiki 🟢; never re-wiki the whole stub set). **ACS v1.3:** use `actionable_low_conf_edges` + `reason_code_counts` / `agent_signal` (`skip`|`investigate`). Do **not** thrash on raw `low_conf_edges` (includes external/bare scores ~0.48). Prefer `map_coverage.complete` / `files_remaining_dirty` after budgeted `update-maps` — `success: true` ≠ map complete.
15
16
  - **Warm maps:** SQLite primary; zero-dirty uses mtime index + meta. **Index-first:** re-list candidates only when fingerprint / map-scoped index / live count disagree (`index_first_dirty` / `candidates_reused` on `update_maps`). Prefer `--directory=` or `map_paths.txt` package roots (not bare `.`). Collect, live count, index filter, and prune share **MapScope** so full-tree→`map_paths` narrow does not thrash.
@@ -45,8 +46,9 @@ Do **not** open megamodules (`javascript.py`, `import_cache.py`, `bree.py`) to d
45
46
 
46
47
  | Need | Use |
47
48
  |------|-----|
48
- | First-run map | `init` → `update-maps` → `health --summary` → `suggest-next` |
49
- | **Session start (4.6+)** | `session_bootstrap` (or CLI `session-bootstrap`) — one shot: root, health, attention, `actions[]` |
49
+ | First-run map | `init` → lean paths (not bare `.`) → `update-maps` → `health --summary` → `suggest-next` |
50
+ | **Session start (4.6+)** | `session_bootstrap` (or CLI `session-bootstrap`) — one shot: root, health, attention, `actions[]`. If `readiness` is `blocked`, fix `actions[]` / `blockers[]` first (usually scope + maps). |
51
+ | **Unblock readiness** | Write lean `monitored_paths.txt` + `map_paths.txt` → `update_maps` (full once) → re-`session_bootstrap` until `ready_for_daemon` / Map Ready |
50
52
  | **Core tool list** | `list_core_tools` / bootstrap `core_surface` — prefer Core 6; advanced is non-core |
51
53
  | Steady-state | `check-changes` (content-honest) → edit 🔴/actionable 🟡 only → `record-change` → wiki → `mark-green` |
52
54
  | **Hash migration** | `seed_source_content_hashes` / CLI `seed-source-hashes` — baseline Greens without mass Yellow |
@@ -65,6 +67,62 @@ Do **not** open megamodules (`javascript.py`, `import_cache.py`, `bree.py`) to d
65
67
  **Scope:** `monitored_paths` = change detection; `exclude_patterns` + optional `--directory` = map walk.
66
68
  **Human HTML** is secondary observation only.
67
69
 
70
+ ## Readiness blocked (`session_bootstrap` / external projects)
71
+
72
+ When MCP `session_bootstrap` (or CLI `session-bootstrap`) returns:
73
+
74
+ ```text
75
+ readiness: "blocked"
76
+ scope.ok: false
77
+ blockers: [ ... ]
78
+ actions: [ { "action": "fix_scope", ... }, ... ]
79
+ ```
80
+
81
+ **this is expected on a project that has never been scoped/mapped**, not a Wikifier install failure.
82
+
83
+ ### Why it happens (Grok-Bevy 2026-07 dogfood)
84
+
85
+ On **Grok-Bevy** (Rust workspace), first bootstrap reported:
86
+
87
+ | Blocker | Meaning |
88
+ |---------|---------|
89
+ | `monitored_paths is bare '.'` | Default/missing lean list → `check-changes` would walk the whole tree (`target/`, caches, etc.) and thrash. Action: **`fix_scope`**. |
90
+ | `No import map (run update-maps first)` | No dependency/import map yet → map-first tools have nothing to trust. |
91
+ | `No file_health` | Health matrix not seeded (comes with map/health pipeline). |
92
+
93
+ Also: `bare_dot_monitor: true` and `scope.ok: false` until `monitored_paths.txt` lists **lean package roots**, not bare `.`.
94
+
95
+ ### Fix once per project (agents must do this, not ignore blockers)
96
+
97
+ 1. **Scope (wiki/health thrash bound)** — create/edit **`monitored_paths.txt`** at project root with *specific* dirs/files, e.g.:
98
+ ```text
99
+ crates/foo/src/
100
+ crates/bar/src/
101
+ README.md
102
+ docs/
103
+ ```
104
+ Never leave only `.` on non-tiny trees.
105
+ 2. **Map roots** — create/edit **`map_paths.txt`** (import-map package roots; independent of monitored):
106
+ ```text
107
+ crates/foo/src/
108
+ crates/bar/src/
109
+ ```
110
+ 3. **Build map + health** — from the target project (or with `project_root=` / `WIKIFIER_PROJECT_ROOT=`):
111
+ ```bash
112
+ wikifier update-maps --full # or MCP update_maps full=true
113
+ # re-run session_bootstrap until readiness is ready_for_daemon / Map Ready
114
+ ```
115
+ 4. **Do not** bulk-re-wiki 🟡 *Initial stubs* after maps land — stubs = map coverage only.
116
+
117
+ After a successful fix, bootstrap looks like: `scope.ok: true`, `blockers: []`, `health_score: Map Ready` (stubs OK), `readiness: ready_for_daemon`.
118
+
119
+ ### Product note for Wikifier maintainers
120
+
121
+ - Default bare `.` is convenient for tiny toys and a footgun for real repos; agents must treat **`fix_scope` as P0** when `session_bootstrap` says blocked.
122
+ - **`wikifier init` (4.6.8+)** seeds comment-guided lean templates for `monitored_paths.txt` and `map_paths.txt` (examples for `src/`, `crates/*/src/`, etc.) instead of a silent single-dot file. Tiny toys may keep `.`; multi-crate / monorepo agents must replace with package roots before map-ready work.
123
+
124
+ See also: Findings note `Findings/readiness-blocked-bare-monitor-2026-07.md`.
125
+
68
126
  ## Mandatory New-Session Rule
69
127
 
70
128
  **Copy this exact block into the system prompt or the very first instruction of every new LLM session that uses Wikifier:**
@@ -0,0 +1,114 @@
1
+ """Real-path tests for `wikifier init` lean path-list templates (4.6.8+).
2
+
3
+ Drives the shipped shell launcher (`./wikifier.sh init --target …`) so a
4
+ silent bare-`.` seed cannot regress without failing the suite.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import os
10
+ import subprocess
11
+ import unittest
12
+ from pathlib import Path
13
+
14
+ from tests._base import REPO_ROOT, TempProjectTestCase
15
+
16
+
17
+ class TestInitSeedTemplates(TempProjectTestCase):
18
+ """Acceptance: init must not leave only silent bare '.' without guidance."""
19
+
20
+ def _run_init(self, target: Path) -> subprocess.CompletedProcess:
21
+ script = REPO_ROOT / "wikifier.sh"
22
+ self.assertTrue(script.is_file(), f"missing shipped launcher: {script}")
23
+ # Isolated env: do not inherit WIKIFIER_PROJECT_ROOT from the test harness
24
+ # (init --target should write into the given directory, not the harness root).
25
+ env = os.environ.copy()
26
+ env.pop("WIKIFIER_PROJECT_ROOT", None)
27
+ return subprocess.run(
28
+ ["bash", str(script), "init", "--target", str(target), "--no-copy"],
29
+ cwd=str(REPO_ROOT),
30
+ env=env,
31
+ capture_output=True,
32
+ text=True,
33
+ timeout=60,
34
+ )
35
+
36
+ def test_init_seeds_guided_monitored_and_map_paths(self):
37
+ target = self.root / "fresh_project"
38
+ target.mkdir()
39
+ proc = self._run_init(target)
40
+ self.assertEqual(
41
+ proc.returncode,
42
+ 0,
43
+ f"init failed:\nstdout:\n{proc.stdout}\nstderr:\n{proc.stderr}",
44
+ )
45
+
46
+ mon = target / "monitored_paths.txt"
47
+ maps = target / "map_paths.txt"
48
+ self.assertTrue(mon.is_file(), "init must create monitored_paths.txt")
49
+ self.assertTrue(maps.is_file(), "init must create map_paths.txt")
50
+
51
+ mon_text = mon.read_text(encoding="utf-8")
52
+ map_text = maps.read_text(encoding="utf-8")
53
+
54
+ # Must not be the old silent single-character default.
55
+ stripped = mon_text.strip()
56
+ self.assertNotEqual(
57
+ stripped,
58
+ ".",
59
+ "monitored_paths.txt must not be silent bare '.' only",
60
+ )
61
+ self.assertIn("#", mon_text, "monitored_paths.txt must include guidance comments")
62
+ self.assertRegex(
63
+ mon_text,
64
+ r"(?i)(lean|package root|thrash|map_paths)",
65
+ "monitored_paths.txt should mention lean roots / thrash / map_paths",
66
+ )
67
+ # Active path may still be bare "." for tiny toys, but only with comments above.
68
+ active_mon = [
69
+ ln.strip()
70
+ for ln in mon_text.splitlines()
71
+ if ln.strip() and not ln.strip().startswith("#")
72
+ ]
73
+ self.assertTrue(active_mon, "expected at least one non-comment monitored path")
74
+
75
+ self.assertIn("#", map_text, "map_paths.txt must include guidance comments")
76
+ self.assertRegex(
77
+ map_text,
78
+ r"(?i)(import-map|package root|update-maps|monitored_paths)",
79
+ "map_paths.txt should document independent map package roots",
80
+ )
81
+ # Template should not seed bare "." as the only map root.
82
+ active_map = [
83
+ ln.strip()
84
+ for ln in map_text.splitlines()
85
+ if ln.strip() and not ln.strip().startswith("#")
86
+ ]
87
+ self.assertNotIn(
88
+ ".",
89
+ active_map,
90
+ "map_paths template must not activate bare '.' as map root",
91
+ )
92
+
93
+ excl = target / "exclude_patterns.txt"
94
+ self.assertTrue(excl.is_file())
95
+ excl_text = excl.read_text(encoding="utf-8")
96
+ self.assertIn("target", excl_text.splitlines())
97
+
98
+ def test_packaged_launcher_matches_root_init_seed(self):
99
+ """Root and packaged wikifier.sh must stay in sync for init templates."""
100
+ root_sh = (REPO_ROOT / "wikifier.sh").read_text(encoding="utf-8")
101
+ pkg_sh = (REPO_ROOT / "wikifier" / "scripts" / "wikifier.sh").read_text(
102
+ encoding="utf-8"
103
+ )
104
+ self.assertIn("map_paths.txt", root_sh)
105
+ self.assertIn("lean package roots", root_sh)
106
+ self.assertEqual(
107
+ root_sh,
108
+ pkg_sh,
109
+ "wikifier/scripts/wikifier.sh must match root wikifier.sh (init templates)",
110
+ )
111
+
112
+
113
+ if __name__ == "__main__":
114
+ unittest.main()
@@ -79,4 +79,4 @@ from .contracts import (
79
79
  compute_acs_confidence,
80
80
  )
81
81
 
82
- __version__ = "4.6.7"
82
+ __version__ = "4.6.8"
@@ -303,7 +303,8 @@ Workflow (for LLMs / new sessions):
303
303
  6. wikifier update-maps (when imports change)
304
304
 
305
305
  Configuration files (edit these):
306
- monitored_paths.txt Paths to scan (one per line). Default: "."
306
+ monitored_paths.txt Wiki/health watch list (lean roots; init seeds guided template)
307
+ map_paths.txt Import-map package roots (independent of monitored_paths)
307
308
  exclude_patterns.txt Glob patterns to ignore (node_modules, .git, dist, etc.)
308
309
 
309
310
  The system is fully usable from the shell or exposed as MCP tools via skills/run.md.
@@ -674,7 +675,45 @@ cmd_init() {
674
675
  LIBRARY_MD="$PROJECT_ROOT/library.md"
675
676
  mkdir -p "$STAGING_DIR" "$JOURNAL_ROOT/$(date +%Y/%m)" "$LOGGED_ISSUES_ROOT"
676
677
 
677
- [[ ! -f "$MONITORED_PATHS_FILE" ]] && echo "." > "$MONITORED_PATHS_FILE"
678
+ # Lean path templates (4.6.8+): not a silent bare "." agents must replace on real trees.
679
+ # Comments are ignored by get_monitored_paths / Python path readers.
680
+ if [[ ! -f "$MONITORED_PATHS_FILE" ]]; then
681
+ cat > "$MONITORED_PATHS_FILE" << 'EOT'
682
+ # monitored_paths.txt — wiki / health watch list (check-changes thrash bound)
683
+ # Prefer lean package roots so check-changes does not thrash on target/,
684
+ # node_modules, build/, dist/, caches, etc.
685
+ # This is NOT the import map — see map_paths.txt for package roots used by update-maps.
686
+ #
687
+ # Examples (uncomment or add paths that match THIS project):
688
+ # src/
689
+ # lib/
690
+ # crates/my_crate/src/
691
+ # packages/core/src/
692
+ # README.md
693
+ # docs/
694
+ #
695
+ # Tiny single-package toys only may keep bare "." below.
696
+ # Multi-crate / monorepo / anything with build output: REPLACE with lean roots first
697
+ # (session_bootstrap readiness "blocked" / fix_scope until you do).
698
+ .
699
+ EOT
700
+ fi
701
+ MAP_PATHS_FILE="$PROJECT_ROOT/map_paths.txt"
702
+ if [[ ! -f "$MAP_PATHS_FILE" ]]; then
703
+ cat > "$MAP_PATHS_FILE" << 'EOT'
704
+ # map_paths.txt — import-map package roots for update-maps (independent of monitored_paths)
705
+ # List directories that contain parseable source for the dependency map.
706
+ # Do not use bare "." on large trees; do not list only wiki/docs files here.
707
+ #
708
+ # Examples (uncomment or add paths that match THIS project):
709
+ # src/
710
+ # crates/my_crate/src/
711
+ # packages/core/src/
712
+ #
713
+ # Leave empty (comments only) to fall back to monitored directory roots / full collect.
714
+ # After editing: wikifier update-maps (then session_bootstrap until ready_for_daemon)
715
+ EOT
716
+ fi
678
717
  [[ ! -f "$EXCLUDE_PATTERNS_FILE" ]] && cat > "$EXCLUDE_PATTERNS_FILE" << 'EOT'
679
718
  node_modules
680
719
  .git
@@ -682,6 +721,7 @@ build
682
721
  dist
683
722
  __pycache__
684
723
  *.pyc
724
+ target
685
725
  EOT
686
726
 
687
727
  [[ ! -f "$FILE_HEALTH" ]] && cat > "$FILE_HEALTH" << 'EOT'
@@ -748,12 +788,13 @@ EOT
748
788
 
749
789
  PROJECT_ROOT="$old_project"
750
790
 
751
- log "✅ Wikifier initialised in $target_dir . Edit monitored_paths.txt (change detection scope; map uses excludes + optional --directory)."
791
+ log "✅ Wikifier initialised in $target_dir . Edit lean monitored_paths.txt + map_paths.txt (templates seeded; not silent bare-only)."
752
792
  log " Recommended: export WIKIFIER_PROJECT_ROOT=$target_dir (or cd there and use ./wikifier.sh)"
753
793
  log " Agent first-run (map first, wiki prose later):"
754
- log " 1) wikifier update-maps"
755
- log " 2) wikifier health --summary"
756
- log " 3) wikifier suggest-next # or MCP suggest_next_actions 🔴/🟡 only"
794
+ log " 1) edit monitored_paths.txt + map_paths.txt to package roots on real trees"
795
+ log " 2) wikifier update-maps"
796
+ log " 3) wikifier health --summary / session-bootstrap until ready_for_daemon"
797
+ log " 4) wikifier suggest-next # or MCP suggest_next_actions — 🔴/🟡 only"
757
798
  log " Steady-state: check-changes → edit red/yellow only → record-change → wiki → mark-green → update-maps if imports changed."
758
799
  log " Deep import maps: Python + JS/TS. journal/pending = audit queue (not an issue tracker)."
759
800
  log " Human layer (secondary): wikifier serve → http://localhost:8787/index.html (not file://)."
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wikifier
3
- Version: 4.6.7
3
+ Version: 4.6.8
4
4
  Summary: Zero-dependency agent-to-agent codebase wiki for LLMs and AI agents. Autonomously maintained via record-change and mark-green for token-efficient lookup of files, dependencies, health, and summaries — across tiny scripts to 50k+ monorepos. Optional MCP server with rich tools for agents.
5
5
  Author-email: Aron Amos <aron@example.com>
6
6
  Maintainer: Aron Amos
@@ -52,7 +52,14 @@ Works from small scripts to large monorepos. **Deep import/include maps** (zero-
52
52
  | C# | `.cs` | `using` namespaces |
53
53
  | Java | `.java` | `import` / `import static` |
54
54
 
55
- Health/journal still work for any monitored path. Parsers are **pragmatic regex** (not full cargo/`go.mod`/classpath/`-I` resolution). Prefer **lean `monitored_paths.txt`** on huge monorepos; raise dirty cap with `WIKIFIER_CHECK_CHANGES_MAX` (default 2000) only when needed.
55
+ Health/journal still work for any monitored path. Parsers are **pragmatic regex** (not full cargo/`go.mod`/classpath/`-I` resolution). On huge monorepos, split scope deliberately:
56
+
57
+ | File | Surface |
58
+ |------|---------|
59
+ | **`map_paths.txt`** | Package roots for **import maps** (`update-maps` walk). Prefer package dirs (`src/`, `packages/foo/`) — not a wiki-only file list. |
60
+ | **`monitored_paths.txt`** | **Wiki / health** watch list (can be individual `.md` files). Does **not** define the map. |
61
+
62
+ Or pass `--directory=pkg/` / `--max-files=N` per run. Raise dirty cap with `WIKIFIER_CHECK_CHANGES_MAX` (default 2000) only when needed. Never set `project_root` to a multi-repo parent of clones.
56
63
 
57
64
  ## Why
58
65
 
@@ -74,7 +81,8 @@ pip install wikifier # pure Python stdlib core — no runtime deps
74
81
  pip install wikifier[mcp] # optional Model Context Protocol (MCP) server
75
82
 
76
83
  cd /path/to/your/project
77
- wikifier init # seeds + human index.html
84
+ wikifier init # seeds index.html + lean path-list templates
85
+ # Edit monitored_paths.txt + map_paths.txt to package roots (not bare ".") on real trees
78
86
  wikifier update-maps # full structural map → library.md + import cache
79
87
  wikifier health --summary # matrix counts
80
88
  wikifier suggest-next # or MCP suggest_next_actions — 🔴/🟡 only
@@ -82,6 +90,8 @@ wikifier suggest-next # or MCP suggest_next_actions — 🔴/🟡 only
82
90
 
83
91
  Always set an explicit root for external trees: `WIKIFIER_PROJECT_ROOT=/abs/path wikifier …`
84
92
 
93
+ **MCP `session_bootstrap` → `readiness: blocked`?** That means lean scope and/or the map are missing (often bare `.` monitor + never ran `update-maps`) — not a broken install. Fix: write lean `monitored_paths.txt` / `map_paths.txt`, then `update-maps`. Agent contract: **`skills/run.md`** § *Readiness blocked*; dogfood: `Findings/readiness-blocked-bare-monitor-2026-07.md`.
94
+
85
95
  ## Steady state (only touch what needs it)
86
96
 
87
97
  Full protocol: [`skills/run.md`](skills/run.md) (Agent Protocol v0.6 — package **4.6.x**).
@@ -109,11 +119,11 @@ Advanced intel as needed: `get_dependencies`, `get_dependents`, `get_cycles`, ba
109
119
 
110
120
  - **Import analysis** — Python, JS/TS (ESM/CJS, barrels), Rust (`use`/`mod` + best-effort `crate::` paths), Go, C/C++ includes, C# usings; per-edge confidence; barrel expansion for TS/JS
111
121
  - **Incremental pipeline** — pure-Python `update-maps`: dirty parse → import cache → reverse deps → cycles → `library.md`
112
- - **Warm agent maps (4.6.3–4.6.6)** — zero-dirty + **index-first** candidates (re-list only on fingerprint/index disagreement); **stdlib SQLite**; content-hash dirty
113
- - **Two path lists** — `map_paths.txt` = map package roots; `monitored_paths.txt` = wiki/health watch (independent)
122
+ - **Warm agent maps (4.6.3–4.6.7)** — zero-dirty + **index-first** candidates (re-list only when fingerprint / map-scoped index / live count disagree); **MapScope** keeps collect, live count, index filter, and prune aligned; **stdlib SQLite**; content-hash dirty
123
+ - **Two path lists** — `map_paths.txt` = map package roots; `monitored_paths.txt` = wiki/health watch (**independent** — wiki file lists never collapse the map)
114
124
  - **Partial-map honesty** — `map_coverage` on `update_maps` / bootstrap / **`suggest_next`**; `update_maps_until_complete` when incomplete
115
- - **Cache ops** — `wikifier cache-status`; JSON dual-write **opt-in only** (`WIKIFIER_CACHE_JSON=1`); dual-read for migrate
116
- - **Selective agent work** — health + suggest bias to 🔴/actionable 🟡 only; **ACS v1.3** `reason_code` / `agent_signal`; prefer `actionable_low_conf_edges` + reason codes — **never** raw `low_conf_edges` alone
125
+ - **Cache ops** — `wikifier cache-status`; JSON dual-write **deprecated default-off** (`WIKIFIER_CACHE_JSON=1` opt-in); dual-read for migrate
126
+ - **Selective agent work** — health + suggest bias to 🔴/actionable 🟡 only; **ACS v1.3** `reason_code` / `agent_signal`; prefer `actionable_low_conf_edges` + reason codes — **never** raw `low_conf_edges` averages alone
117
127
  - **Scale** — reverse index + barrel invalidation so one edit doesn’t re-scan the monorepo
118
128
  - **MCP tools** — optional server for Claude, Cursor, Cline, and other MCP clients
119
129
  - **Zero core dependencies** — stdlib only; forks can add their own stack on top
@@ -127,18 +137,21 @@ Full / heavy runs (historical order-of-magnitude):
127
137
  |---------|-------|----------------------------|
128
138
  | llama_index | ~3.8k Python files | ~8.5s class full |
129
139
  | Babylon.js | ~3.9k TS files, barrel-heavy | minutes full; scoped re-runs tens of seconds |
130
- | Large trees (e.g. LLVM-scale) | tens of thousands of files | use lean monitor + `--directory` / `--max-files` |
140
+ | Large trees (e.g. LLVM-scale) | tens of thousands of files | `map_paths` / `--directory` / `--max-files` — never unscoped one-shot |
141
+
142
+ Warm **0-dirty** re-runs after **4.6.7** (same machine class; scoped; candidates **reused** — agent session path):
131
143
 
132
- Warm **0-dirty** re-runs after 4.6.3 (same machine; scoped where noted) — agent session path:
144
+ | Project | Scope | Warm `update-maps` | n |
145
+ |---------|-------|--------------------|---|
146
+ | Wikifier (self) | `map_paths`: `wikifier/` + `tests/` | **~30 ms** | 50 |
147
+ | llama_index | `llama-index-core` | **~76 ms** | 724 |
148
+ | rust | `library/std` | **~79 ms** | 719 |
149
+ | airflow | `airflow-core` | **~180 ms** | 1920 |
150
+ | Babylon.js | `packages` | **~400 ms** | 3895 |
133
151
 
134
- | Project | Scope | Warm2 `update-maps` |
135
- |---------|-------|---------------------|
136
- | Wikifier (self) | incremental full | ~43 ms |
137
- | redox | `src` | ~17 ms |
138
- | llama_index | `llama-index-core` | ~0.6 s |
139
- | rust | `library/std/src` (budgeted) | ~0.7 s (vs multi-second full-tree walk before scoped collect) |
152
+ Residual floor on large scopes is mtime/stat + live count under MapScope (not full JSON re-walk). Sub-100ms is not a hard SLA on every 1k+ tree.
140
153
 
141
- Tests: `python -m unittest discover tests` (stdlib only; 86+ cases including agent-scale edges).
154
+ Tests: `python -m unittest discover tests` (stdlib only; **125** cases including MapScope / index-first / dual-write).
142
155
 
143
156
  ## Commands
144
157
 
@@ -152,7 +165,8 @@ Tests: `python -m unittest discover tests` (stdlib only; 86+ cases including age
152
165
  | `wikifier mark-green <file>` | Mark wiki current + source content-hash baseline |
153
166
  | `wikifier record-deletion <file> "reason"` | Mark removed paths 🔴 + prune barrel refs |
154
167
  | `wikifier suggest-next` | Next actions (🔴/actionable 🟡 only; `--json` for `actions[]`) |
155
- | `wikifier update-maps [--directory=src/] [--max-files=N]` | Rebuild graph + `library.md` (warm 0-dirty is fast) |
168
+ | `wikifier update-maps [--directory=src/] [--max-files=N]` | Rebuild graph + `library.md` (warm 0-dirty is fast; honors `map_paths.txt`) |
169
+ | `wikifier cache-status` | SQLite/JSON backend, dual-write policy, coverage snapshot (no full pair load) |
156
170
  | `wikifier health [--summary\|--json]` | Health matrix (machine-friendly flags) |
157
171
  | `wikifier validate` | Missing wiki rows + ghost paths |
158
172
  | `wikifier cycles` | Circular deps + break hints |
@@ -48,6 +48,7 @@ tests/test_gap_closure.py
48
48
  tests/test_health.py
49
49
  tests/test_import_cache.py
50
50
  tests/test_index_map_paths.py
51
+ tests/test_init_seed.py
51
52
  tests/test_multi_lang_parsers.py
52
53
  tests/test_parsers.py
53
54
  tests/test_selftest_wrappers.py
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes