@oomkapwn/enquire-mcp 3.7.12 → 3.7.14

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 (169) hide show
  1. package/CHANGELOG.md +81 -0
  2. package/README.md +5 -5
  3. package/dist/http-transport.d.ts +11 -0
  4. package/dist/http-transport.d.ts.map +1 -1
  5. package/dist/http-transport.js +34 -0
  6. package/dist/http-transport.js.map +1 -1
  7. package/dist/index.d.ts +1 -1
  8. package/dist/index.js +1 -1
  9. package/dist/pdf.d.ts +22 -1
  10. package/dist/pdf.d.ts.map +1 -1
  11. package/dist/pdf.js +9 -2
  12. package/dist/pdf.js.map +1 -1
  13. package/dist/tool-registry.d.ts.map +1 -1
  14. package/dist/tool-registry.js +26 -1
  15. package/dist/tool-registry.js.map +1 -1
  16. package/dist/tools/media.d.ts.map +1 -1
  17. package/dist/tools/media.js +15 -6
  18. package/dist/tools/media.js.map +1 -1
  19. package/dist/tools/write.d.ts +10 -4
  20. package/dist/tools/write.d.ts.map +1 -1
  21. package/dist/tools/write.js +56 -14
  22. package/dist/tools/write.js.map +1 -1
  23. package/dist/vault.d.ts.map +1 -1
  24. package/dist/vault.js +108 -29
  25. package/dist/vault.js.map +1 -1
  26. package/docs/COMPARISON.md +1 -1
  27. package/docs/QUICKSTART.md +2 -2
  28. package/docs/api.md +1 -1
  29. package/docs/benchmarks.md +16 -9
  30. package/package.json +9 -4
  31. package/dist/tools.d.ts +0 -980
  32. package/dist/tools.d.ts.map +0 -1
  33. package/dist/tools.js +0 -3132
  34. package/dist/tools.js.map +0 -1
  35. package/docs/api-reference/.nojekyll +0 -1
  36. package/docs/api-reference/assets/hierarchy.js +0 -1
  37. package/docs/api-reference/assets/highlight.css +0 -71
  38. package/docs/api-reference/assets/icons.js +0 -18
  39. package/docs/api-reference/assets/icons.svg +0 -1
  40. package/docs/api-reference/assets/main.js +0 -60
  41. package/docs/api-reference/assets/navigation.js +0 -1
  42. package/docs/api-reference/assets/search.js +0 -1
  43. package/docs/api-reference/assets/style.css +0 -1633
  44. package/docs/api-reference/functions/index.buildEmbedText.html +0 -15
  45. package/docs/api-reference/functions/index.buildMcpServer.html +0 -4
  46. package/docs/api-reference/functions/index.formatReadyBanner.html +0 -4
  47. package/docs/api-reference/functions/index.main.html +0 -1
  48. package/docs/api-reference/functions/index.parsePositiveInt.html +0 -1
  49. package/docs/api-reference/functions/index.parseQuantizationMode.html +0 -5
  50. package/docs/api-reference/functions/index.prepareServerDeps.html +0 -5
  51. package/docs/api-reference/functions/index.startServer.html +0 -1
  52. package/docs/api-reference/functions/tools.appendToNote.html +0 -17
  53. package/docs/api-reference/functions/tools.archiveNote.html +0 -15
  54. package/docs/api-reference/functions/tools.assertHnswModelMatchesEmbedder.html +0 -13
  55. package/docs/api-reference/functions/tools.chatThreadAppend.html +0 -22
  56. package/docs/api-reference/functions/tools.chatThreadRead.html +0 -16
  57. package/docs/api-reference/functions/tools.contextPack.html +0 -21
  58. package/docs/api-reference/functions/tools.createNote.html +0 -19
  59. package/docs/api-reference/functions/tools.dataviewQuery.html +0 -16
  60. package/docs/api-reference/functions/tools.embeddingsSearch.html +0 -40
  61. package/docs/api-reference/functions/tools.findPath.html +0 -23
  62. package/docs/api-reference/functions/tools.findSimilar.html +0 -21
  63. package/docs/api-reference/functions/tools.frontmatterGet.html +0 -15
  64. package/docs/api-reference/functions/tools.frontmatterSearch.html +0 -16
  65. package/docs/api-reference/functions/tools.frontmatterSet.html +0 -19
  66. package/docs/api-reference/functions/tools.getBacklinks.html +0 -15
  67. package/docs/api-reference/functions/tools.getNoteNeighbors.html +0 -16
  68. package/docs/api-reference/functions/tools.getOpenQuestions.html +0 -19
  69. package/docs/api-reference/functions/tools.getOutboundLinks.html +0 -16
  70. package/docs/api-reference/functions/tools.getRecentEdits.html +0 -14
  71. package/docs/api-reference/functions/tools.getUnresolvedWikilinks.html +0 -14
  72. package/docs/api-reference/functions/tools.getVaultStats.html +0 -13
  73. package/docs/api-reference/functions/tools.lintWiki.html +0 -20
  74. package/docs/api-reference/functions/tools.listCanvases.html +0 -16
  75. package/docs/api-reference/functions/tools.listNotes.html +0 -19
  76. package/docs/api-reference/functions/tools.listPdfs.html +0 -15
  77. package/docs/api-reference/functions/tools.listTags.html +0 -14
  78. package/docs/api-reference/functions/tools.ocrPdf.html +0 -18
  79. package/docs/api-reference/functions/tools.openInUi.html +0 -17
  80. package/docs/api-reference/functions/tools.paperAudit.html +0 -16
  81. package/docs/api-reference/functions/tools.pickEmbedTextForHyde.html +0 -8
  82. package/docs/api-reference/functions/tools.readCanvas.html +0 -19
  83. package/docs/api-reference/functions/tools.readNote.html +0 -20
  84. package/docs/api-reference/functions/tools.readPdf.html +0 -18
  85. package/docs/api-reference/functions/tools.renameNote.html +0 -24
  86. package/docs/api-reference/functions/tools.replaceInNotes.html +0 -20
  87. package/docs/api-reference/functions/tools.resolveTarget.html +0 -24
  88. package/docs/api-reference/functions/tools.resolveWikilink.html +0 -20
  89. package/docs/api-reference/functions/tools.searchHybrid.html +0 -62
  90. package/docs/api-reference/functions/tools.searchText.html +0 -19
  91. package/docs/api-reference/functions/tools.semanticSearch.html +0 -19
  92. package/docs/api-reference/functions/tools.validateNoteProposal.html +0 -19
  93. package/docs/api-reference/hierarchy.html +0 -1
  94. package/docs/api-reference/index.html +0 -1
  95. package/docs/api-reference/interfaces/index.ServeOptions.html +0 -74
  96. package/docs/api-reference/interfaces/index.ServerDeps.html +0 -27
  97. package/docs/api-reference/interfaces/tool-manifest.ToolManifestEntry.html +0 -33
  98. package/docs/api-reference/interfaces/tools.ArchiveNoteArgs.html +0 -12
  99. package/docs/api-reference/interfaces/tools.BacklinkHit.html +0 -15
  100. package/docs/api-reference/interfaces/tools.CanvasEdge.html +0 -19
  101. package/docs/api-reference/interfaces/tools.CanvasSummary.html +0 -16
  102. package/docs/api-reference/interfaces/tools.ChatThreadAppendArgs.html +0 -10
  103. package/docs/api-reference/interfaces/tools.ChatThreadMessage.html +0 -14
  104. package/docs/api-reference/interfaces/tools.ChatThreadReadResult.html +0 -10
  105. package/docs/api-reference/interfaces/tools.ContextPackArgs.html +0 -12
  106. package/docs/api-reference/interfaces/tools.ContextPackResult.html +0 -20
  107. package/docs/api-reference/interfaces/tools.EmbedHit.html +0 -21
  108. package/docs/api-reference/interfaces/tools.EmbedSearchResponse.html +0 -14
  109. package/docs/api-reference/interfaces/tools.FindPathResult.html +0 -17
  110. package/docs/api-reference/interfaces/tools.FrontmatterSearchArgs.html +0 -20
  111. package/docs/api-reference/interfaces/tools.FrontmatterSetArgs.html +0 -13
  112. package/docs/api-reference/interfaces/tools.HnswSearchContext.html +0 -21
  113. package/docs/api-reference/interfaces/tools.LintWikiArgs.html +0 -14
  114. package/docs/api-reference/interfaces/tools.LintWikiFinding.html +0 -14
  115. package/docs/api-reference/interfaces/tools.LintWikiResult.html +0 -9
  116. package/docs/api-reference/interfaces/tools.NoteNeighbors.html +0 -17
  117. package/docs/api-reference/interfaces/tools.NoteReadFull.html +0 -20
  118. package/docs/api-reference/interfaces/tools.NoteReadMap.html +0 -25
  119. package/docs/api-reference/interfaces/tools.NoteSummary.html +0 -14
  120. package/docs/api-reference/interfaces/tools.OcrPdfArgs.html +0 -16
  121. package/docs/api-reference/interfaces/tools.OcrPdfPage.html +0 -15
  122. package/docs/api-reference/interfaces/tools.OcrPdfResult.html +0 -18
  123. package/docs/api-reference/interfaces/tools.OpenInUiResult.html +0 -11
  124. package/docs/api-reference/interfaces/tools.OpenQuestion.html +0 -20
  125. package/docs/api-reference/interfaces/tools.OutboundLink.html +0 -20
  126. package/docs/api-reference/interfaces/tools.PaperAuditFinding.html +0 -17
  127. package/docs/api-reference/interfaces/tools.PathStep.html +0 -9
  128. package/docs/api-reference/interfaces/tools.PdfSummary.html +0 -9
  129. package/docs/api-reference/interfaces/tools.ReadCanvasResult.html +0 -15
  130. package/docs/api-reference/interfaces/tools.ReadPdfArgs.html +0 -8
  131. package/docs/api-reference/interfaces/tools.ReadPdfPage.html +0 -13
  132. package/docs/api-reference/interfaces/tools.ReadPdfResult.html +0 -18
  133. package/docs/api-reference/interfaces/tools.RenameNoteResult.html +0 -14
  134. package/docs/api-reference/interfaces/tools.RenameProposal.html +0 -13
  135. package/docs/api-reference/interfaces/tools.ReplaceInNotesArgs.html +0 -15
  136. package/docs/api-reference/interfaces/tools.ReplaceInNotesFileResult.html +0 -6
  137. package/docs/api-reference/interfaces/tools.ReplaceInNotesResult.html +0 -21
  138. package/docs/api-reference/interfaces/tools.SearchHit.html +0 -16
  139. package/docs/api-reference/interfaces/tools.SearchHybridHit.html +0 -30
  140. package/docs/api-reference/interfaces/tools.SearchHybridResponse.html +0 -23
  141. package/docs/api-reference/interfaces/tools.SearchResponse.html +0 -13
  142. package/docs/api-reference/interfaces/tools.SemanticHit.html +0 -15
  143. package/docs/api-reference/interfaces/tools.SimilarNote.html +0 -15
  144. package/docs/api-reference/interfaces/tools.TagSummary.html +0 -13
  145. package/docs/api-reference/interfaces/tools.UnresolvedWikilink.html +0 -22
  146. package/docs/api-reference/interfaces/tools.ValidateProposalArgs.html +0 -10
  147. package/docs/api-reference/interfaces/tools.ValidateProposalResult.html +0 -14
  148. package/docs/api-reference/interfaces/tools.VaultStats.html +0 -26
  149. package/docs/api-reference/modules/index.html +0 -1
  150. package/docs/api-reference/modules/tool-manifest.html +0 -1
  151. package/docs/api-reference/modules/tools.html +0 -1
  152. package/docs/api-reference/types/tools.CanvasNode.html +0 -7
  153. package/docs/api-reference/types/tools.SearchMode.html +0 -7
  154. package/docs/api-reference/variables/index.VERSION.html +0 -9
  155. package/docs/api-reference/variables/tool-manifest.TOOL_MANIFEST.html +0 -1
  156. package/docs/audits/findings/L1-code-quality.md +0 -213
  157. package/docs/audits/findings/L2-architecture.md +0 -245
  158. package/docs/audits/findings/L3-tests.md +0 -339
  159. package/docs/audits/findings/L4-cicd.md +0 -290
  160. package/docs/audits/findings/L5-security.md +0 -350
  161. package/docs/audits/findings/L6-documentation.md +0 -347
  162. package/docs/audits/findings/L7-operational.md +0 -50
  163. package/docs/audits/findings/L8-reproducibility.md +0 -64
  164. package/docs/audits/findings/L9-process.md +0 -84
  165. package/docs/audits/findings/baseline.json +0 -19
  166. package/docs/audits/v3.6.0-external-anonymous-audit.md +0 -163
  167. package/docs/audits/v3.6.0-final-audit.md +0 -171
  168. package/docs/audits/v3.6.0-rc.4-rootcause.md +0 -134
  169. package/docs/audits/v3.6.0-system-audit-plan.md +0 -199
@@ -1,347 +0,0 @@
1
- # L6 — Documentation Audit (v3.6.0)
2
-
3
- **Audit date**: 2026-05-15
4
- **Branch**: `v3.6.0/post-stable-audit`
5
- **Package version**: `3.6.0` (latest)
6
- **Reference**: `docs/audits/v3.6.0-system-audit-plan.md` §L6
7
-
8
- ## Scope audited
9
-
10
- Root-level: `README.md`, `CHANGELOG.md`, `STABILITY.md`, `CLAUDE.md`, `CONTRIBUTING.md`, `SECURITY.md`, `CODE_OF_CONDUCT.md`.
11
- `docs/`: `api.md`, `QUICKSTART.md`, `COMPARISON.md`, `benchmarks.md`, `http-transport.md`, `api-reference/` (TypeDoc).
12
- `examples/README.md` + JSON drop-ins.
13
-
14
- ## Summary
15
-
16
- - **Internal link integrity**: 1 broken anchor (`docs/api.md` → `README.md#cache--privacy`). All other internal paths resolve.
17
- - **External links**: 1 broken — `https://oomkapwn.github.io/enquire-mcp/` returns 404 (the auto-generated TypeDoc site that README + CHANGELOG advertise has not been deployed yet).
18
- - **Headline counts (44 tools / 19 prompts / 714 tests / branches ≥74%)**: all four verified against source. CHANGELOG coverage numbers match `coverage/coverage-summary.json` exactly.
19
- - **CHANGELOG TL;DR convention**: every entry from v3.5.9 onward carries a `>` TL;DR blockquote — class invariant holds.
20
- - **STABILITY.md export claims**: every named symbol exists in src/.
21
- - **Stale docs**: `CLAUDE.md` still describes rc.3 as "in flight" + rc.4 as "next"; `docs/COMPARISON.md` dated 2026-05-13 / v3.5.8 with **670** test count (now 714) and an erroneous "no public benchmark" claim contradicted by `docs/benchmarks.md`; `docs/api.md` headline blockquote still markets "v2.0 beta" channel that was retired at v3.0; `docs/QUICKSTART.md` cites Node 20 + an obsolete CI-runs-all-three claim + a `3.5.8` example version; README badge + tagline reference `v3.5.x` instead of `v3.6.x`.
22
- - **TypeDoc warnings**: 3 broken `@link` annotations (`findBestMatch`, `suggestSimilar`, `FileEntry`) — TypeDoc emits warnings but exits 0.
23
- - **Command snippets spot-checked**: `enquire-mcp doctor`, `npm run check:changelog-coverage`, `npm run docs:api`, `node scripts/smoke.mjs` all pass against a fresh build on the synthetic vault.
24
-
25
- No Critical findings. 1 High (broken GH Pages URL on a flagship "we ship docs" claim). The rest are Medium / Low staleness items that cluster into one class: **per-version docs that weren't refreshed when v3.6.0 stable promoted**.
26
-
27
- ---
28
-
29
- ## Finding L6-01 — README + CHANGELOG advertise GitHub Pages URL that returns 404
30
-
31
- - **Severity**: HIGH
32
- - **Class**: documentation claims a deployed asset that isn't actually published. Same class as L4-class "CI workflow exists but never ran" findings — drift between "ships X" copy and reality.
33
- - **Description**: `README.md:70` says **"Auto-generated API reference at oomkapwn.github.io/enquire-mcp"** and links the URL. `CHANGELOG.md:20,52,123` repeats the URL across the v3.6.0, v3.6.0-rc.4 entries. `docs/audits/v3.6.0-system-audit-plan.md` baseline expects `oomkapwn.github.io/enquire-mcp/` to host the 111-page TypeDoc site. Reality: `curl -sI https://oomkapwn.github.io/enquire-mcp/` returns **HTTP/2 404** with GitHub Pages's "Site not found" body. The workflow file (`/.github/workflows/publish-docs.yml`) is present and well-formed, but either it has never run successfully on `main`, or GitHub Pages has not been enabled in repo Settings, or the deployment is targeting the wrong branch.
34
- - **Evidence**:
35
- ```bash
36
- $ curl -sI https://oomkapwn.github.io/enquire-mcp/ --max-time 10 | head -3
37
- HTTP/2 404
38
- server: GitHub.com
39
- content-type: text/html; charset=utf-8
40
-
41
- $ curl -sI https://oomkapwn.github.io --max-time 10 | head -3
42
- HTTP/2 404 # the user landing page also 404s
43
- ```
44
- The locally-generated `docs/api-reference/` (111 HTML files, 1.9 MB) is present — `find docs/api-reference -name "*.html" | wc -l` returns `111`, matching the CHANGELOG claim. The local files are correct; only the deployed copy is missing.
45
- - **Cited file:line**:
46
- - `/Users/alex/Documents/Projects/obsidian-mcp/README.md:70` — "Auto-generated API reference at oomkapwn.github.io/enquire-mcp"
47
- - `/Users/alex/Documents/Projects/obsidian-mcp/CHANGELOG.md:20` — `| Auto-generated API reference | none | 111 HTML pages at oomkapwn.github.io/enquire-mcp | new`
48
- - `/Users/alex/Documents/Projects/obsidian-mcp/CHANGELOG.md:52` — "Live: `https://oomkapwn.github.io/enquire-mcp/`"
49
- - `/Users/alex/Documents/Projects/obsidian-mcp/CHANGELOG.md:123` — README new `## 📖 API reference` section
50
- - `/Users/alex/Documents/Projects/obsidian-mcp/.github/workflows/publish-docs.yml:1-30` — workflow present + targets `main`
51
- - **Class fix**: Add a CI invariant (could live in `scripts/check-version-consistency.mjs` or new `scripts/check-docs-deployed.mjs`) that hits the README's GH-Pages URL on every release tag and fails the release if the response isn't 200. Pair this with the L4 CI-status audit. Either:
52
- 1. Verify the `publish-docs.yml` workflow ran on the v3.6.0 SHA and surfaced any errors, OR
53
- 2. Enable GitHub Pages in repo settings (Pages → Source → GitHub Actions) if it isn't already, OR
54
- 3. Trigger a manual `workflow_dispatch` run, OR
55
- 4. Remove the URL claims from README/CHANGELOG until Pages is actually live.
56
- - **Per-instance backfill**: After fixing the deployment, re-verify the 3 README + CHANGELOG references resolve. Update any future v3.x release CHANGELOG entries to actually confirm the URL is live before merging.
57
- - **Recommended next action**: v3.6.1 patch — most-visible drift in the project right now (README badge + flagship feature).
58
-
59
- ---
60
-
61
- ## Finding L6-02 — `docs/COMPARISON.md` is stale; signed v3.5.8 with 670 tests; contradicts new public benchmarks
62
-
63
- - **Severity**: MEDIUM
64
- - **Class**: per-version doc snapshots that fall out of sync with reality between releases. Same class as the L7 / L9 versioning-discipline findings (post-release CHANGELOG drift). Comparison docs are particularly drift-prone because the alternatives evolve too.
65
- - **Description**: `docs/COMPARISON.md:3,46,59,236,242,250` carries multiple v3.5.8-era facts that v3.6.0 invalidates:
66
- 1. **Line 3**: "Numbers and feature claims for enquire-mcp are accurate as of v3.5.8 (2026-05-13)" — should be v3.6.0 / 2026-05-15.
67
- 2. **Line 46**: Test count column reads `**670**` — actual is **714** (+44).
68
- 3. **Line 59**: "enquire-mcp's 44-tool count is exact for v3.5.8 and is verified by the test suite" — still 44 but version annotation stale.
69
- 4. **Line 236**: "None of these servers (including enquire-mcp) ships a public, reproducible end-to-end retrieval benchmark against a shared Obsidian vault" — DIRECTLY contradicted by `docs/benchmarks.md` (shipped in v3.6.0-rc.4), which is the project's flagship differentiator. This sentence as written undermines a major v3.6.0 marketing claim.
70
- 5. **Line 242**: "This is a snapshot as of **2026-05-13**".
71
- 6. **Line 250**: Signature line `— enquire-mcp maintainer, v3.5.8`.
72
- - **Evidence**: `grep -nE "v3.5.8|v3.6.0|v3.5.x" docs/COMPARISON.md` (12 hits, all v3.5.8 or 2026-05-13). Coverage-summary actual test count: `714` (see `coverage/coverage-summary.json`). `docs/benchmarks.md:1-25` is a public benchmark; `bench/benchmarks.json` is reproducible via `npm run bench:retrieval` (verified — `meta.queries_count = 60`).
73
- - **Cited file:line**:
74
- - `/Users/alex/Documents/Projects/obsidian-mcp/docs/COMPARISON.md:3` — version + date
75
- - `/Users/alex/Documents/Projects/obsidian-mcp/docs/COMPARISON.md:46` — `Test count (public) | **670**`
76
- - `/Users/alex/Documents/Projects/obsidian-mcp/docs/COMPARISON.md:59` — "exact for v3.5.8"
77
- - `/Users/alex/Documents/Projects/obsidian-mcp/docs/COMPARISON.md:236` — "None of these servers...ships a public, reproducible end-to-end retrieval benchmark"
78
- - `/Users/alex/Documents/Projects/obsidian-mcp/docs/COMPARISON.md:242` — "snapshot as of **2026-05-13**"
79
- - `/Users/alex/Documents/Projects/obsidian-mcp/docs/COMPARISON.md:250` — signed v3.5.8
80
- - **Class fix**: Add a docs-consistency invariant in `tests/docs-consistency.test.ts` that asserts:
81
- - The "as of v X.Y.Z" footer / header in `docs/COMPARISON.md` and `docs/QUICKSTART.md` matches `package.json#version`.
82
- - The Test count column in `docs/COMPARISON.md` (and the count in README) match the actual `vitest run` count from `tests/`.
83
- - Section 236's "no public benchmark" claim is removed once `docs/benchmarks.md` exists, OR keyed to a per-version condition.
84
- - **Per-instance backfill**: Bulk edit `docs/COMPARISON.md` to v3.6.0 / 2026-05-15 / 714 / drop the "no public benchmark" line, OR rewrite section 236 to reference `docs/benchmarks.md` ("enquire-mcp now ships a public benchmark — see `docs/benchmarks.md`; the alternatives still don't").
85
- - **Auditor verification of alternatives**: not performed in this audit pass — the audit plan asked for spot-checks if cyanheads etc. shipped new features. Not done because L6 scope was time-boxed at ~45 min and external repos require WebFetch. **Recommended deferred follow-up**: 30-min sweep of cyanheads / MarkusPfundstein / StevenStavrakis READMEs to confirm matrix rows are still accurate as of 2026-05-15.
86
- - **Recommended next action**: v3.6.1 doc patch.
87
-
88
- ---
89
-
90
- ## Finding L6-03 — `CLAUDE.md` "Current phase status" claims v3.6.0 is mid-RC, not stable
91
-
92
- - **Severity**: MEDIUM
93
- - **Class**: per-sprint planning docs not closed out when the sprint completed. Affects anyone (human or agent) who reads `CLAUDE.md` for the project's North Star.
94
- - **Description**: `CLAUDE.md:81-84` (the "Current phase status" section) reads:
95
- - "rc.1 shipped..."
96
- - "rc.2 shipped..."
97
- - "rc.3 **in flight** (PR #67)..."
98
- - "rc.4 **next**: TypeDoc + GH Pages + Public benchmarks."
99
- All four are inaccurate: v3.6.0 stable has shipped (npm `latest = 3.6.0`, GH release marked Latest, all four RCs merged, all listed deliverables landed). The "Goal" header at `CLAUDE.md:1` still reads `# Project goal — v3.6.0 sprint`, framing the sprint as ongoing.
100
- Also notable: `CLAUDE.md:26` says "712+ tests pass" — actual is 714 (no contradiction with `712+` but a stale baseline).
101
- - **Evidence**:
102
- ```bash
103
- $ npm view @oomkapwn/enquire-mcp dist-tags
104
- # latest = 3.6.0
105
- $ node -e "console.log(require('./package.json').version)"
106
- 3.6.0
107
- $ git tag --list 'v3.6.0*'
108
- # v3.6.0, v3.6.0-rc.1, v3.6.0-rc.2, v3.6.0-rc.3, v3.6.0-rc.4 (all present)
109
- ```
110
- - **Cited file:line**:
111
- - `/Users/alex/Documents/Projects/obsidian-mcp/CLAUDE.md:1` — "# Project goal — v3.6.0 sprint" (sprint framing)
112
- - `/Users/alex/Documents/Projects/obsidian-mcp/CLAUDE.md:9` — "Release **enquire-mcp v3.6.0**..." (already done)
113
- - `/Users/alex/Documents/Projects/obsidian-mcp/CLAUDE.md:26` — "712+ tests pass"
114
- - `/Users/alex/Documents/Projects/obsidian-mcp/CLAUDE.md:79-84` — "Current phase status" section (entirely stale)
115
- - **Class fix**: Pivot `CLAUDE.md` from per-sprint snapshot to evergreen project guide. Replace the "Current phase status" section with a "Last shipped" pointer that auto-derives from `package.json#version` + git tags. Better: add a phase header that auditors / new agents can recognize — `# Current sprint: post-v3.6.0 system audit` instead of `# Project goal — v3.6.0 sprint`.
116
- - **Per-instance backfill**: Rewrite `CLAUDE.md` section "Current phase status" (lines 79-84) to reflect post-stable state. Update line 1 / line 9 framing.
117
- - **Recommended next action**: v3.6.1 doc patch; or, even simpler, fold it into the v3.6.0 system audit's own retrospective doc.
118
-
119
- ---
120
-
121
- ## Finding L6-04 — `docs/api.md` headline blockquote still markets retired "v2.0 beta" channel
122
-
123
- - **Severity**: MEDIUM
124
- - **Class**: same as L6-02 — per-version copy that wasn't refreshed across the v3.0 stable promotion. Particularly visible because `docs/api.md` is the authoritative tool reference linked from README + STABILITY.
125
- - **Description**: `docs/api.md:5` reads:
126
- > **Channels:** stable v1.x (`@latest` on npm) ships 28 tools — no ML embeddings, no hybrid search. **v2.0 beta** (`@beta` on npm) adds `obsidian_search` (hybrid RRF) + `obsidian_embeddings_search` + the `install-model` / `build-embeddings` / `clear-embeddings` subcommands. **This document covers the v2.0 beta surface.**
127
-
128
- At v3.6.0 stable: `npm view @oomkapwn/enquire-mcp dist-tags` shows `latest = 3.6.0`. There is no `@beta` dist-tag in current use; v2.0 features have been in `@latest` since v3.0.0 (2026-05-09). The blockquote is the first thing a reader sees in `docs/api.md`.
129
-
130
- Additionally, six section headers (`docs/api.md:115,495,518,...`) still carry `_(v2.0 beta)_` annotations even though those tools are core to v3.x stable. Examples:
131
- - Line 115: `install-model` (v2.0 beta)
132
- - Line 116: `build-embeddings` (v2.0 beta)
133
- - Line 495: `## obsidian_embeddings_search _(v2.0 beta — requires ...)_`
134
- - Line 518: `## obsidian_search _(v2.0 beta — the new default search tool)_`
135
-
136
- And line 493 says "For ML embeddings see `obsidian_embeddings_search` and `obsidian_search` (v2.0 beta)" — same issue.
137
- - **Evidence**:
138
- ```bash
139
- $ grep -nE "v2.0 beta|stable v1.x|@beta" docs/api.md | wc -l
140
- 10
141
- $ npm view @oomkapwn/enquire-mcp dist-tags 2>&1 | head -3
142
- # latest = 3.6.0
143
- # rc = 3.6.0-rc.4
144
- ```
145
- - **Cited file:line**:
146
- - `/Users/alex/Documents/Projects/obsidian-mcp/docs/api.md:5` — channel blockquote (retired channels)
147
- - `/Users/alex/Documents/Projects/obsidian-mcp/docs/api.md:115` — `install-model (v2.0 beta)`
148
- - `/Users/alex/Documents/Projects/obsidian-mcp/docs/api.md:116` — `build-embeddings (v2.0 beta)`
149
- - `/Users/alex/Documents/Projects/obsidian-mcp/docs/api.md:493` — "(v2.0 beta)" in body text
150
- - `/Users/alex/Documents/Projects/obsidian-mcp/docs/api.md:495` — `## obsidian_embeddings_search _(v2.0 beta — ...)_`
151
- - `/Users/alex/Documents/Projects/obsidian-mcp/docs/api.md:518` — `## obsidian_search _(v2.0 beta — the new default search tool)_`
152
- - **Class fix**: Single replacement of "v2.0 beta" → "v2.0+" everywhere it appears in `docs/api.md`. Rewrite line 5 blockquote to describe the current channel ("@latest = stable v3.x"; `@rc` for prereleases). Add an invariant to `tests/docs-consistency.test.ts` that the api.md header doesn't reference a retired dist-tag — fail if `@beta` appears in the document while `npm view <pkg> dist-tags` doesn't return a `beta` row.
153
- - **Per-instance backfill**: 6 line edits in `docs/api.md`.
154
- - **Recommended next action**: v3.6.1 doc patch.
155
-
156
- ---
157
-
158
- ## Finding L6-05 — `docs/api.md` line 80 broken anchor: `README.md#cache--privacy`
159
-
160
- - **Severity**: MEDIUM
161
- - **Class**: drift between cross-file anchor + the target heading the anchor refers to. Same class as L1 / L4 "drift between two surfaces" findings.
162
- - **Description**: `docs/api.md:80` has a markdown link `[Cache & privacy](../README.md#cache--privacy)`. README has no heading whose slug is `cache--privacy`; in fact README has no `## Cache & privacy` heading at all. The closest content is `SECURITY.md` ## "Persistent cache: privacy posture" (line 39). Link resolves to top-of-README on click — silent miss.
163
- - **Evidence**:
164
- ```bash
165
- $ grep -n "#cache--privacy" docs/api.md
166
- 80:| `--persistent-cache` | off | Persist parsed-note cache to disk... see [Cache & privacy](../README.md#cache--privacy).
167
- $ grep -E "^##+" README.md | head -20
168
- # No "Cache & privacy" heading anywhere in README.md
169
- $ grep -iE "^##+ .*cache" SECURITY.md
170
- ## Persistent cache: privacy posture
171
- ```
172
- - **Cited file:line**:
173
- - `/Users/alex/Documents/Projects/obsidian-mcp/docs/api.md:80` — `[Cache & privacy](../README.md#cache--privacy)`
174
- - `/Users/alex/Documents/Projects/obsidian-mcp/README.md` — no `## Cache & privacy` section
175
- - `/Users/alex/Documents/Projects/obsidian-mcp/SECURITY.md:39` — actual content
176
- - **Class fix**: Add a `tests/docs-consistency.test.ts` invariant that walks every markdown link in `docs/*.md` (and README) of the form `path#anchor` and verifies the anchor slug exists in the target file. Existing test only checks link _paths_, not anchors.
177
- - **Per-instance backfill**: Change `docs/api.md:80` link target to `../SECURITY.md#persistent-cache-privacy-posture` (which exists and is the actual content). Same line: the existing `[SECURITY.md "Persistent FTS5 index"](../SECURITY.md#persistent-fts5-index-privacy-posture)` 4 lines down is the correct pattern.
178
- - **Recommended next action**: v3.6.1 doc patch.
179
-
180
- ---
181
-
182
- ## Finding L6-06 — `docs/QUICKSTART.md` cites stale version `3.5.8` example + obsolete CI matrix claim
183
-
184
- - **Severity**: LOW
185
- - **Class**: per-version examples in docs that weren't refreshed at v3.6.0. Same root as L6-02 / L6-03 / L6-04.
186
- - **Description**: `docs/QUICKSTART.md` has two drift items:
187
- 1. **Line 30**: `Expected output: the current version string (e.g. `3.5.8`).` — should be `3.6.0`. The user runs `enquire-mcp --version` and sees `3.6.0` but the doc says they should see `3.5.8`. Minor confusion, but the example is precisely the kind of thing readers latch onto.
188
- 2. **Line 142**: "enquire-mcp targets Node 20 / 22 / 24 — the CI matrix runs all three." — **NOT TRUE since v3.5.11** (2026-05-13), which dropped Node 20 from CI. Current `.github/workflows/ci.yml` matrix is `[22, 24]`. The `package.json engines` field still says `">=20"` for prebuilt-dist users, but the CI matrix is 22/24 only.
189
- 3. **Line 14**: "Node 20+" — strictly compatible with `engines >=20`, no false claim, but combined with line 142's "CI runs all three" makes the doc misleading.
190
- - **Evidence**:
191
- ```bash
192
- $ grep -E "node-version|matrix:" .github/workflows/ci.yml | head -5
193
- node-version: 22
194
- matrix:
195
- node-version: [22, 24]
196
- $ grep -A1 '"engines"' package.json
197
- "engines": {
198
- "node": ">=20"
199
- ```
200
- And `CHANGELOG.md:495-497` documents the Node 20 drop:
201
- > **Dropped Node 20 from CI test matrix** (`[20, 22, 24]` → `[22, 24]`).
202
- - **Cited file:line**:
203
- - `/Users/alex/Documents/Projects/obsidian-mcp/docs/QUICKSTART.md:14` — "Node 20+"
204
- - `/Users/alex/Documents/Projects/obsidian-mcp/docs/QUICKSTART.md:30` — `3.5.8` example
205
- - `/Users/alex/Documents/Projects/obsidian-mcp/docs/QUICKSTART.md:142` — "CI matrix runs all three"
206
- - **Class fix**: Add a docs-consistency invariant: the "current version string" examples in `docs/QUICKSTART.md` must match `package.json#version`. CI Node matrix claims must match `.github/workflows/ci.yml`. (The latter would have caught the v3.5.13 README drift the audit #4 found, too — see CHANGELOG line 405.)
207
- - **Per-instance backfill**: 2 line edits in `docs/QUICKSTART.md`. Suggested wording for line 142: "enquire-mcp targets Node 20+ for prebuilt installs and Node 22+ for source builds — the CI matrix runs Node 22 and 24 (Node 20 was EOL'd 2026-04 and dropped from CI in v3.5.11; the package still installs on Node 20 from npm because the prebuilt `dist/` is shipped)."
208
- - **Recommended next action**: v3.6.1 doc patch.
209
-
210
- ---
211
-
212
- ## Finding L6-07 — README badge + tagline still reference `v3.5.x-stable` at v3.6.0
213
-
214
- - **Severity**: LOW
215
- - **Class**: per-version copy not bumped on minor-version promotion. Same as L6-02..L6-06.
216
- - **Description**: README has two visible stale items:
217
- 1. **Line 15**: `[![stable](https://img.shields.io/badge/v3.5.x-stable-brightgreen.svg)](./STABILITY.md)` — badge URL hard-codes `v3.5.x`. At v3.6.0 stable, the badge displays "v3.5.x stable" while npm shows latest=3.6.0.
218
- 2. **Line 32**: `**44 tools · 19 MCP prompts · 714 unit tests · 50+ languages · v3.5.x · semver-bound · MIT · SLSA-3.**` — same `v3.5.x` mention.
219
- - **Evidence**:
220
- ```bash
221
- $ grep -n "v3.5.x" README.md
222
- 15:[![stable](https://img.shields.io/badge/v3.5.x-stable-brightgreen.svg)](./STABILITY.md)
223
- 32:**44 tools · 19 MCP prompts · 714 unit tests · 50+ languages · v3.5.x · semver-bound · MIT · SLSA-3.**
224
- ```
225
- (Note: `README.md:171` says "v3.0+ semver-bound" — that's CORRECT, since semver-bound is from v3.0.0 onward.)
226
- - **Cited file:line**:
227
- - `/Users/alex/Documents/Projects/obsidian-mcp/README.md:15` — `v3.5.x-stable` badge
228
- - `/Users/alex/Documents/Projects/obsidian-mcp/README.md:32` — `v3.5.x` in tagline
229
- - **Class fix**: Add a docs-consistency invariant that asserts any `vX.Y.x` channel reference in README matches the current major.minor from `package.json#version`. Combined with the version-consistency script that already exists for code surfaces, this would close the README badge-drift class — same one v3.5.13 already had to patch for the `#trust` table (see CHANGELOG line 405).
230
- - **Per-instance backfill**: Two line edits — `v3.5.x` → `v3.6.x` in both spots.
231
- - **Recommended next action**: v3.6.1 doc patch.
232
-
233
- ---
234
-
235
- ## Finding L6-08 — 3 TypeDoc `@link` warnings to undocumented symbols
236
-
237
- - **Severity**: LOW
238
- - **Class**: TSDoc `@link` annotations referencing helpers that are tagged `@internal` (so TypeDoc filters them out, but the `@link` references still emit warnings). Cosmetic — TypeDoc exits 0 with these warnings, but the generated docs have plain-text "findBestMatch" instead of hyperlinks.
239
- - **Description**: Running `npm run docs:api` emits:
240
- ```
241
- [warning] The comment for tools.readCanvas links to "findBestMatch" which was resolved but is not included in the documentation.
242
- [warning] The comment for tools.resolveTarget links to "suggestSimilar" which was resolved but is not included in the documentation.
243
- [warning] The comment for tools.resolveTarget links to "FileEntry" which was resolved but is not included in the documentation.
244
- Found 0 errors and 3 warnings
245
- ```
246
- The three referenced symbols are `findBestMatch` (`src/tools/meta.ts`), `suggestSimilar` (referenced in `src/tools/write.ts:984`), and `FileEntry` (`src/vault.ts`, imported in many places). All three are either `@internal`-tagged or not exported from the entry points. The `@link` works at the TSDoc parser level but breaks at the TypeDoc public-doc-only filter.
247
- - **Evidence**:
248
- ```bash
249
- $ npm run docs:api 2>&1 | tail -5
250
- [warning] The comment for tools.readCanvas links to "findBestMatch"...
251
- [warning] The comment for tools.resolveTarget links to "suggestSimilar"...
252
- [warning] The comment for tools.resolveTarget links to "FileEntry"...
253
- [info] html generated at ./docs/api-reference
254
- [warning] Found 0 errors and 3 warnings
255
-
256
- $ grep -nE "@link\s+(findBestMatch|suggestSimilar|FileEntry)" src/tools/*.ts | head -10
257
- src/tools/search.ts:477: * `entriesRef` is the {@link FileEntry} snapshot used for cache validation.
258
- src/tools/media.ts:199: * the live vault — `file_resolved` carries the post-{@link findBestMatch}
259
- src/tools/meta.ts:1294: * lookup indices that {@link findBestMatch} needs.
260
- src/tools/meta.ts:1344: * @returns The resolved {@link FileEntry}, or null if no match.
261
- src/tools/write.ts:984: * 4. On miss → throw with did-you-mean suggestions via {@link suggestSimilar}.
262
- src/tools/write.ts:989: * @returns A {@link FileEntry} pointing at the resolved file on disk.
263
- ```
264
- - **Cited file:line**:
265
- - `/Users/alex/Documents/Projects/obsidian-mcp/src/tools/search.ts:477`
266
- - `/Users/alex/Documents/Projects/obsidian-mcp/src/tools/media.ts:199`
267
- - `/Users/alex/Documents/Projects/obsidian-mcp/src/tools/meta.ts:1294`
268
- - `/Users/alex/Documents/Projects/obsidian-mcp/src/tools/meta.ts:1344`
269
- - `/Users/alex/Documents/Projects/obsidian-mcp/src/tools/write.ts:984`
270
- - `/Users/alex/Documents/Projects/obsidian-mcp/src/tools/write.ts:989`
271
- - **Class fix**: Either (a) add `findBestMatch` / `suggestSimilar` / `FileEntry` to TypeDoc's `externalSymbolLinkMappings` as `"#"` (suppresses the warning while keeping the inline text), or (b) replace the `@link` with plain backticks in the offending TSDoc comments. Option (b) is cleaner for internal helpers — `{@link findBestMatch}` → `\`findBestMatch\``. Add `treatWarningsAsErrors: true` to `typedoc.json` once the 3 are fixed so future warnings fail CI.
272
- - **Per-instance backfill**: 6 inline edits.
273
- - **Recommended next action**: v3.6.1 or v3.6.2 doc patch — low impact (generated site looks fine; just lacks the hyperlinks).
274
-
275
- ---
276
-
277
- ## Finding L6-09 — README "v3.0 release (2026-05-09)" footnote dated incorrectly for current claim window
278
-
279
- - **Severity**: INFO
280
- - **Class**: footnote drift; the claim itself is still true ("comparison based on public capabilities at v3.0 release") but the timeframe is now ~7 days behind current.
281
- - **Description**: `README.md:104` reads "<sub>Comparison based on each project's public capabilities as documented at v3.0 release (2026-05-09)</sub>". Not actively wrong — it's the "as of v3.0" snapshot. Combined with COMPARISON.md's signed-v3.5.8 (L6-02 above), the project effectively has THREE different "as of" dates referenced (v3.0 / v3.5.8 / v3.6.0) for the same comparison data. Should consolidate to one current date.
282
- - **Cited file:line**:
283
- - `/Users/alex/Documents/Projects/obsidian-mcp/README.md:104` — `at v3.0 release (2026-05-09)`
284
- - **Class fix**: Fold into L6-02's class fix — single "comparison data current as of" string in both README and COMPARISON.md, with the docs-consistency invariant asserting they match.
285
- - **Per-instance backfill**: 1 line edit, will be batched with L6-02.
286
-
287
- ---
288
-
289
- ## Class summary
290
-
291
- Almost every Medium/Low finding in this layer is **the same drift class**: post-stable-promotion doc refresh wasn't comprehensive. v3.6.0 changed the version, test count, capabilities, and benchmarks, but the following docs still describe the pre-promotion state in some way:
292
-
293
- - `README.md` — badge + tagline carry `v3.5.x`
294
- - `CLAUDE.md` — entire "Current phase status" stale
295
- - `docs/COMPARISON.md` — date + test count + a now-false benchmark claim
296
- - `docs/api.md` — first blockquote markets retired beta channel + 6 inline "(v2.0 beta)" annotations
297
- - `docs/QUICKSTART.md` — version example + CI matrix claim
298
-
299
- **Class fix** (one PR, one invariant, broad coverage): extend `tests/docs-consistency.test.ts` with three new asserts:
300
-
301
- 1. Every `vX.Y` / `vX.Y.x` channel string in README + docs/*.md matches `package.json#version`'s major.minor.
302
- 2. Every `Test count` / `\d+ unit tests` / `\d+ tests` claim in docs matches the actual count (read from a freshly-run vitest reporter or from `tests/`).
303
- 3. Every "as of YYYY-MM-DD" string in README + docs/COMPARISON.md falls within the past 30 days of `git log -1 --format=%cs HEAD`.
304
-
305
- This single class fix would have caught 6 of the 9 findings above at lint-time and prevent the next minor release from carrying the same drift.
306
-
307
- ## Out-of-scope spot checks performed
308
-
309
- These confirmed no findings:
310
-
311
- - **README internal links** (9 paths) — all resolve.
312
- - **External URLs** (slsa.dev / modelcontextprotocol.io / huggingface.co / wikipedia / karpathy gist) — all 200.
313
- - **STABILITY.md exports** (23 symbols) — every one present in src/.
314
- - **`grep -n "registerTool\|registerPrompt"` counts** — 44 tools + 19 prompts.
315
- - **Coverage stats in CHANGELOG.md** — `npm run check:changelog-coverage` confirms within 0.5pp (actual 89.20% lines / 75.02% branches matches v3.6.0 entry exactly).
316
- - **All 4 example JSON configs in `examples/`** (`claude-desktop.json`, `claude-desktop-hybrid.json`, `cursor-mcp.json`, `queries.jsonl`) — valid JSON, parseable.
317
- - **`enquire-mcp doctor --vault <synthetic>` from QUICKSTART step 2** — exits 0, prints expected colour-coded health checks.
318
- - **`node scripts/smoke.mjs <synthetic>`** — all probes PASS.
319
- - **TypeDoc output** — 111 HTML files generated (matches CHANGELOG claim).
320
- - **`bench/benchmarks.json` numbers** — MRR/NDCG@10/Recall match `docs/benchmarks.md` headline table to 4 decimals.
321
- - **CHANGELOG v3.5.9+ TL;DR convention** — every entry has a `>` TL;DR blockquote (11/11 checked).
322
-
323
- ## Did NOT check (deferred / out of scope)
324
-
325
- - **Alternatives' current state** for `docs/COMPARISON.md` (cyanheads / Markus / Stevens / mcpvault). The audit plan asked for spot-checks; ~30 min of WebFetch would be needed. Defer to a v3.6.1 doc patch.
326
- - **`docs/api-reference/` per-page rendering**. Spot-checked the index page exists; didn't open all 111 pages. TypeDoc itself exited successfully so likely all OK.
327
- - **`enquire-mcp serve --vault <path>` stdio I/O test** from QUICKSTART. Smoke script (`node scripts/smoke.mjs`) is a fuller replacement and passed.
328
- - **`docs/http-transport.md` end-to-end deployment recipes**. Spot-checked the TL;DR block (auth flow correct, gen-token + serve-http commands correct). Did not actually deploy with Tailscale/Cloudflare Tunnel.
329
- - **`docs/benchmarks.md` reproducibility via `npm run bench:retrieval`**. Would take 5-10 min to run; existing `bench/benchmarks.json` was inspected and is consistent with the doc.
330
-
331
- ## Recommended Phase D triage
332
-
333
- | ID | Severity | Effort | Bundle |
334
- |---|---|---|---|
335
- | L6-01 | HIGH | 1h | v3.6.1 — investigate `publish-docs.yml` last run; either fix Pages config or remove the URL claims |
336
- | L6-02 | MEDIUM | 30min | v3.6.1 — bulk-rewrite `docs/COMPARISON.md` to v3.6.0 + drop the no-benchmark claim |
337
- | L6-03 | MEDIUM | 15min | v3.6.1 — close out `CLAUDE.md` "Current phase status" |
338
- | L6-04 | MEDIUM | 15min | v3.6.1 — `docs/api.md` "v2.0 beta" → "v2.0+" sweep |
339
- | L6-05 | MEDIUM | 5min | v3.6.1 — fix one anchor link |
340
- | L6-06 | LOW | 10min | v3.6.1 — `docs/QUICKSTART.md` Node + version refresh |
341
- | L6-07 | LOW | 5min | v3.6.1 — README badge + tagline |
342
- | L6-08 | LOW | 15min | v3.6.2 — TypeDoc `@link` warnings → suppress or rewrite |
343
- | L6-09 | INFO | 1min | Bundle with L6-02 |
344
-
345
- **Class fix** (proposed): single new invariant test in `tests/docs-consistency.test.ts` (~50 lines) that covers L6-02 / L6-03 / L6-04 / L6-06 / L6-07 / L6-09 prospectively. Add as part of the v3.6.1 bundle.
346
-
347
- **Total remediation effort**: ~3 hours. None block v3.6.0 stable's promotion (already shipped); all are post-release polish.
@@ -1,50 +0,0 @@
1
- # L7 — Operational audit (foreground, self)
2
-
3
- **Date**: 2026-05-15
4
- **Auditor**: maintainer (foreground)
5
- **Scope**: daily-check infrastructure, log retention, tag reachability, npm registry hygiene, GH release alignment
6
-
7
- ## TL;DR — All checks pass, 1 known limitation
8
-
9
- | Check | Status |
10
- |---|---|
11
- | Daily-check launchd loaded | ✅ |
12
- | Daily-check history (3-day window) | ✅ — 3 files, all parseable |
13
- | Daily-check stderr log | ✅ — empty (no errors) |
14
- | Git tags reachable from main | ✅ — 90/90 (no orphans) |
15
- | npm registry: all versions installable | ✅ — 74 versions (0.7.4 ... 3.6.0) |
16
- | Tag → GH release alignment (last 10) | ✅ — 10/10 have releases |
17
- | Daily-check "fails counted in 24h" heuristic | ⚠️ known limitation |
18
-
19
- ## Detailed findings
20
-
21
- ### L7-01 (Info) — Daily-check launchd job operational
22
-
23
- `launchctl list | grep enquire` → `com.oomkapwn.enquire-mcp-daily` loaded (exit code 0). History at `~/.local/share/enquire-mcp-monitor/history/` contains 3 files (2026-05-13, -14, -15) — exactly one per day, no gaps. Stderr log empty.
24
-
25
- ### L7-02 (Info) — Tag reachability
26
-
27
- All 90 tags reachable from `main`. No orphan tags pointing to commits not on main.
28
-
29
- ### L7-03 (Info) — npm registry hygiene
30
-
31
- 74 versions on npm from `0.7.4` through `3.6.0`. Latest 10 tags (v3.5.10..v3.6.0 + 4 RCs) each have a corresponding GH release. Tag–release alignment 100% in the recently-active range.
32
-
33
- ### L7-04 (Low — known limitation, defer to v3.7)
34
-
35
- **Class**: daily-check 24h-window heuristic counts HISTORICAL CI failures, not regressions on main.
36
-
37
- **Evidence**: daily-check on 2026-05-13/-14/-15 each reported "1-2 CI fail за 24ч — проверь" but those fails were:
38
- - `v3.6.0-rc.1 stuck-queued` (infrastructure, retriggered same day)
39
- - `v3.6.0-rc.2 coverage exclude` (fixed in next push)
40
- - `pdfjs v5 CI` (the pre-fix-bug fail; obsoleted by rc.4)
41
-
42
- All resolved within minutes of detection by subsequent pushes. The script's 24h-window heuristic doesn't know about "overtaken by subsequent green run", so it flags as if active issue.
43
-
44
- **Suggested class fix** (v3.7 backlog): filter failed runs whose `headSha != current main HEAD` OR whose `headSha` has a subsequent successful run on the same workflow.
45
-
46
- **Per-instance backfill**: not needed (heuristic is informational, not blocking).
47
-
48
- ## Sign-off
49
-
50
- L7 verdict: **GREEN**. One Low finding deferred to v3.7. Operational infrastructure ready for v3.6.0 stable lifetime.
@@ -1,64 +0,0 @@
1
- # L8 — Reproducibility audit (light, foreground)
2
-
3
- **Date**: 2026-05-15
4
- **Auditor**: maintainer (foreground; L8 sub-agent was killed before completing)
5
- **Scope**: every public `npm` script runs to green in the dev tree
6
-
7
- ## Note on light-vs-isolated execution
8
-
9
- The original L8 plan called for a fresh `git worktree` clone to catch install bugs masked by dev-tree caches. The sub-agent was killed mid-execution. This light L8 runs the same script set in the dev tree — sufficient to verify the public commands work, but does NOT catch "rebuild relies on stale cache" or "missing package-lock entry" issues.
10
-
11
- Recommend: re-run L8 in isolated worktree before v3.6.1 ships as a sanity check.
12
-
13
- ## TL;DR — 7/8 scripts clean, 1 TypeDoc warning
14
-
15
- | Script | Status | Notes |
16
- |---|---|---|
17
- | `npm test` | ✅ PASS | 713 passed + 1 skip, 12.05s |
18
- | `npm run lint` | ✅ PASS | biome — 1 pre-existing info note (schema version) |
19
- | `npx tsc` | ✅ PASS | strict + noUncheckedIndexedAccess clean |
20
- | `npm run build` | ✅ PASS | tsc → dist/ |
21
- | `check-changelog-coverage` | ✅ PASS | within 0.5pp |
22
- | `check-version-consistency` | ✅ PASS | 3.6.0 across 5 surfaces |
23
- | `smoke.mjs` (scan path) | ✅ PASS | bearer auth + initialize work |
24
- | `smoke.mjs --with-fts` | ✅ PASS | FTS5 path also clean |
25
- | `npm run docs:api` (TypeDoc) | ⚠️ 3 warnings | 0 errors, 111 HTML pages generated. `@link` to `findBestMatch`, `suggestSimilar`, `FileEntry` — these helpers are `@internal` so TypeDoc filters them out, but the `@link` references in tools/* TSDoc still point at them. |
26
-
27
- ## Findings
28
-
29
- ### L8-01 (Low) — 3 TypeDoc `@link` warnings to @internal helpers
30
-
31
- **Class**: TSDoc `@link` referring to `@internal`-annotated targets.
32
-
33
- **Evidence**:
34
- - `tools.readCanvas` TSDoc has `{@link findBestMatch}` — findBestMatch is `@internal` in `src/tools/meta.ts`
35
- - `tools.resolveTarget` TSDoc has `{@link suggestSimilar}` — same
36
- - `tools.resolveTarget` TSDoc has `{@link FileEntry}` — FileEntry comes from `src/vault.ts`, not exported as a public type
37
-
38
- Same finding as **L6-08** — L6 doc audit caught it independently. Cross-confirmed.
39
-
40
- **Suggested fix**: either (a) un-`@internal` those helpers so they appear in TypeDoc (changes the public surface), or (b) replace `{@link X}` with backtick code `` `X` `` (loses navigation but kills the warning), or (c) add `externalSymbolLinkMappings` config to typedoc.json mapping these symbols to `#`.
41
-
42
- **Per-instance backfill**: 3 places in tool TSDoc.
43
-
44
- ### L8-02 (Info) — `npm bench:retrieval` was NOT run in this light L8
45
-
46
- The benchmark script (`scripts/run-benchmarks.mjs`) needs ~3-5 minutes wall-clock + downloads the BGE reranker model on first run. Skipped to keep the audit fast.
47
-
48
- **Recommend**: full L8 in worktree must include this step. The benchmark is the most important script we ship.
49
-
50
- ## Verified clean
51
-
52
- - All 7 quick commands pass (test/lint/tsc/build/changelog-coverage/version-consistency/smoke)
53
- - TypeDoc generates 111 HTML pages, 0 errors
54
- - No stale-cache surprises observed (no missing files, no failed imports)
55
-
56
- ## Recommendation
57
-
58
- **v3.6.1 should include**:
59
- 1. Real L8 in fresh worktree as part of pre-release validation
60
- 2. The 3 TypeDoc `@link` warnings fixed (Low, but they're visible to anyone running `docs:api`)
61
-
62
- ## Sign-off
63
-
64
- L8 verdict: **GREEN** with 1 Low finding (TypeDoc `@link` warnings — cross-confirmed with L6). All public scripts run clean. Light-vs-isolated note documented as a follow-up task.
@@ -1,84 +0,0 @@
1
- # L9 — Process audit (foreground, self)
2
-
3
- **Date**: 2026-05-15
4
- **Auditor**: maintainer (foreground)
5
- **Scope**: CLAUDE.md goal compliance, anti-pattern compliance, method-note discipline, audit-response trail
6
-
7
- ## TL;DR — 2 LOW findings, 0 process violations
8
-
9
- | Check | Status |
10
- |---|---|
11
- | CLAUDE.md exit criteria all met (v3.6.0 shipped) | ✅ |
12
- | TL;DR blockquote on every entry from v3.5.9+ | ✅ — 11/11 |
13
- | Method note section on every entry from v3.5.9+ | ⚠️ — 9/11 (2 missing) |
14
- | Audit rejection reasoning documented (L-2 case) | ✅ |
15
- | Anti-pattern: big-bang refactor avoided | ✅ — 16 commits across 5 RCs (phased) |
16
- | Anti-pattern: copy-paste coverage stats | ✅ — `check-changelog-coverage` gate passes with corrected regex |
17
- | Anti-pattern: hardcoded counts without invariant | ✅ — Class A invariants in place |
18
- | Anti-pattern: dismiss auditor without reasoning | ✅ — L-2 rejection documented in v3.5.14 |
19
- | Anti-pattern: compress CHANGELOG for aesthetics | ✅ — explicitly rejected (M-1 from MiniMax audit) |
20
- | Anti-pattern: merge without green daily-check | ✅ — daily reports show no real regressions (only the 24h-window false-positives from L7-04) |
21
-
22
- ## Detailed findings
23
-
24
- ### L9-01 (Low) — Method-note discipline gap on 2 historical entries
25
-
26
- **Class**: occasional skipped section in CHANGELOG (the "Method note" section is part of the post-v3.5.9 convention but not enforced by a gate).
27
-
28
- **Evidence**:
29
- - `v3.5.11` (pdfjs v4→v5 migration) — no `Method note` section
30
- - `v3.6.0-rc.1` (tools.ts split) — no `Method note` section
31
-
32
- Other 9 entries from v3.5.9 through v3.6.0 stable have it.
33
-
34
- **Suggested class fix**: add an invariant test that every entry from v3.5.9 onward must contain `Method note` OR `### Method` (similar to the existing TL;DR check that's implicit in the convention). Would prevent the discipline gap going forward.
35
-
36
- **Per-instance backfill** (optional, low-priority): retroactively add method notes to v3.5.11 + v3.6.0-rc.1 entries. They're shipped patches so the audit trail value is informational, not blocking.
37
-
38
- ### L9-02 (Info) — Daily-check anti-pattern technically violated for rc.X
39
-
40
- **Class**: "merge without green daily-check on main" anti-pattern (CLAUDE.md).
41
-
42
- **Evidence**: daily-check fires at 11:00 MSK once per day. v3.6.0 RCs were merged in rapid succession on 2026-05-15 (rc.1 at 08:49, rc.2 at 09:26, rc.3 at 09:53, rc.4 at 12:33, stable at ~12:47). Only one daily-check ran during this window (at 11:00) — between rc.2 and rc.3. So rc.3, rc.4, and stable each merged BEFORE the next daily-check.
43
-
44
- **Mitigation**: 7 required CI gates per PR + manual smoke run before each tag push reduce risk. The daily-check is a fallback safety net, not the primary verification.
45
-
46
- **Suggested class fix** (low priority): manual invocation of `~/bin/enquire-mcp-daily.sh` after every merge to main as part of the merge ritual. Or: cron the daily-check to run hourly instead of daily during active sprints. Or: trust the 7 required gates.
47
-
48
- **Per-instance backfill**: not applicable — the merges already happened.
49
-
50
- ### L9-03 (Info) — Sprint stats
51
-
52
- - 5 RCs (rc.1..rc.4 + stable) shipped in one calendar day
53
- - 16 commits total across the sprint
54
- - 0 reverts
55
- - 5 audit responses (3 external Mavis ×2 + MiniMax, 2 internal self-audits)
56
- - 7 root-causes traced to 6 classes
57
- - 5 classes closed in-sprint, 2 deferred to v3.7 backlog
58
- - 0 silent gate-passes after the `check-changelog-coverage` regex fix
59
-
60
- ## Anti-pattern compliance details
61
-
62
- ### Big-bang refactor — NOT VIOLATED
63
-
64
- Sprint shipped phased: rc.1 (tools.ts split) → rc.2 (index.ts split + manifest) → rc.3 (TSDoc) → rc.4 (TypeDoc + benchmarks + P0 + Class A) → stable. Each merge with full 7-gate CI green. Total 16 commits across 5 phases — average 3 commits per phase, no monolithic single-PR.
65
-
66
- ### Copy-paste coverage stats — NOT VIOLATED
67
-
68
- `check-changelog-coverage.mjs` gate passes on current v3.6.0 entry. The script itself had a regex bug discovered + fixed in rc.4 (now matches `[X.Y.Z-rc.N]`). v3.5.10's historical inflated stats were retroactively corrected in v3.5.12.
69
-
70
- ### Hardcoded counts without invariant — NOT VIOLATED
71
-
72
- `tests/docs-consistency.test.ts` + `tests/no-internal-imports.test.ts` enforce. README/package.json/SVG test counts auto-validated. Tool counts auto-validated against `TOOL_MANIFEST`. Path-references in tests auto-validated against the registration-boilerplate exclusion list.
73
-
74
- ### Audit dismissal without reasoning — NOT VIOLATED
75
-
76
- The L-2 dismissal (deps dual-listing) in v3.5.14 has full empirical reasoning in the CHANGELOG (13 tests fail if removed). No silent dismissals in this sprint or prior.
77
-
78
- ### CHANGELOG aesthetic compression — NOT VIOLATED
79
-
80
- M-1 from MiniMax audit (suggesting CHANGELOG cleanup) was explicitly rejected with reasoning in v3.5.14. Audit trail preserved. TL;DR blockquotes added as the compromise.
81
-
82
- ## Sign-off
83
-
84
- L9 verdict: **GREEN** with 2 LOW findings (method-note discipline gap on 2 historical entries + daily-check timing during active sprints). 0 anti-pattern violations.
@@ -1,19 +0,0 @@
1
- {
2
- "version": "3.6.0",
3
- "shipped_at": "2026-05-15T12:48:25Z",
4
- "npm_latest": "3.6.0",
5
- "tests": 714,
6
- "test_files": 33,
7
- "coverage": { "lines": 89.20, "statements": 85.79, "functions": 82.15, "branches": 75.02 },
8
- "thresholds": { "lines": 86, "statements": 82, "functions": 75, "branches": 74 },
9
- "tools": 44,
10
- "prompts": 19,
11
- "src_modules": 28,
12
- "tool_manifest_entries": 44,
13
- "tsdoc_blocks": 369,
14
- "typedoc_html_pages": 111,
15
- "benchmark_queries": 60,
16
- "external_audits_passed": 5,
17
- "sprint_errors_traced": 7,
18
- "drift_classes_closed_or_deferred": 6
19
- }