@oomkapwn/enquire-mcp 3.8.0-rc.13 → 3.8.0-rc.15

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.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,164 @@
2
2
 
3
3
  All notable changes to this project will be documented here. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
4
4
 
5
+ ## [3.8.0-rc.15] — 2026-05-24
6
+
7
+ > **TL;DR:** Fifteenth v3.8.0 release candidate. **M-3 root-class fix — meta-recursion overclaim instance #10**: rc.14 added 7 new `docs-consistency.test.ts` invariants for the M-2 fix, but NONE had NEGATIVE control siblings — violating the CLAUDE.md rule since v3.6.4 ("every invariant test must have a sibling test that fails when the invariant is violated"). Same class as v3.7.14 F1+F2 (added a fix that itself shipped the same drift inside the same patch). Refactored 7 M-2 checks into pure functions, added 7 NEGATIVE control sibling tests (positive-negative pairs). Plus L-5 snapshot header on the audit-request doc. **862 tests** (+7 NEGATIVE controls vs rc.14). Ships under `@rc` dist-tag.
8
+
9
+ **Minor — fifteenth v3.8.0 release candidate.**
10
+
11
+ ### Fix M-3 (MEDIUM) — meta-recursion: rc.14 invariants lacked NEGATIVE controls
12
+
13
+ **Background.** CLAUDE.md anti-pattern since v3.6.4:
14
+ > "Invariant test without negative-control — a test that ALWAYS passes proves nothing. Every new invariant test must have a sibling test that fails when the invariant is violated."
15
+
16
+ rc.14 fixed M-2 by adding 7 invariants to `tests/docs-consistency.test.ts` covering llms.txt + AGENTS.md numeric claims. But all 7 used inline regex matching against real files — if the regex pattern had a typo (`/(\d) tests/` instead of `/(\d+) tests/`), the test would trivially pass on any input with at least one digit. No negative control = no proof the invariant actually detects drift.
17
+
18
+ This is the **10th documented overclaim instance** in the cascade, and the 2nd "meta-recursion" instance: a methodology rule violation inside the very patch that implemented that rule's class fix. Same shape as v3.7.14 F1 (renameNote ordering fix shipped with stale TSDoc) → v3.7.14 F2 (renameFile ordering fix in same patch ALSO shipped with stale TSDoc — overclaim #6 followed by #7).
19
+
20
+ **Fix** (`tests/docs-consistency.test.ts`): refactored each of the 7 M-2 checks into a pure function returning `null` on OK or an error string on drift:
21
+ - `checkLlmsTestCount(llms, actual)` — "N unit tests" matches actual count
22
+ - `checkLlmsToolBreakdown(llms, total, alwaysOn, optIn, writes)` — "N tools (A always-on + B opt-in + C writes)" matches all 4
23
+ - `checkLlmsPromptCount(llms, actual)` — "N MCP prompts" matches
24
+ - `checkLlmsCiGates(llms, required)` — "N required + M advisory CI gates" matches
25
+ - `checkAgentsTestFloor(agents, actual)` — "X+ tests" is valid lower bound (claimed ≤ actual, gap < 50)
26
+ - `checkAgentsPerFileFloors(agents, actualFloors)` — "N per-file branch floors" matches
27
+ - `checkAgentsCiGates(agents, required)` — every "N required gates" mention matches
28
+
29
+ Then 7 NEGATIVE control `it()` blocks call each function with intentionally-drifted inline fixtures:
30
+ - Wrong count → assert non-null error matching the count
31
+ - Missing claim → assert non-null error matching "must declare"
32
+ - Matching claim → assert null (sanity)
33
+ - Multi-field breakdowns: drift in each individual field → assert non-null with that field name in error
34
+
35
+ Pattern matches `tests/peek-meta.test.ts` and `tests/k1-class-invariant.test.ts` (the canonical "extract pure function + fixture-based negative" template per v3.7.3).
36
+
37
+ **Verification.** The negative tests caught one real logic bug in my own assertions during development (I had written `expect(checkAgentsTestFloor("800+ tests", 855)).toBeNull()` for a case that should actually fail because 855-800=55 exceeds the 50pp threshold). The NEGATIVE controls do their job: they pin the contract of the checker function itself, not just the file content.
38
+
39
+ ### Fix L-5 (LOW) — snapshot header on audit-request doc
40
+
41
+ **Background.** `docs/audits/AUDIT-REQUEST-v3.8.0-2026-05-24.md` (created in rc.14 ship) contains numeric claims ("855 tests, 14 release candidates, 44 tools, 19 prompts") with no explicit indication these are a point-in-time snapshot. An auditor reading the doc after rc.16 or rc.17 ships would see stale-looking numbers and potentially question the documentation's reliability.
42
+
43
+ **Fix.** Added a snapshot callout at the top of the doc:
44
+
45
+ > 📌 Snapshot notice. This document is a snapshot from commit `bad0518` / `v3.8.0-rc.14` / 2026-05-24. Numeric figures cited below reflect the project state on that date. Later release candidates will increment some of these numbers; the auditor should target the commit SHA cited here (or the closest later release-candidate tag) for the actual review.
46
+
47
+ The file's name already datestamps it (`AUDIT-REQUEST-v3.8.0-2026-05-24.md`), but the callout makes the snapshot semantics explicit in the rendered view.
48
+
49
+ ### Method note — documented overclaim instances
50
+
51
+ Updated CLAUDE.md status section: overclaim count goes 9 → 10 with this rc.15 finding. Pattern of recurrence:
52
+ - #1: v3.6.1 CRIT-1 — claimed 10 of 10 callsites fixed, was 1 of 10
53
+ - #2: v3.6.2 K-1 — claimed all 10 callsites, was 4 of 10
54
+ - #4: v3.7.11 D4 — claimed examples/ added in v3.7.10, actually v3.7.11
55
+ - #6: v3.7.14 F1 — renameNote impl fixed but TSDoc lied
56
+ - #7: v3.7.14 F2 — renameFile fix in same patch as #6 ALSO shipped TSDoc drift
57
+ - #8: v3.7.14 — orphan-tag procedural error
58
+ - #9: v3.7.14 F5 — release.yml permission-incomplete (HTTP 403)
59
+ - **#10: v3.8.0-rc.14 M-2** — 7 invariants without negative-control siblings (this fix)
60
+
61
+ The recursion-pair shape (#6+#7 in v3.7.14; #2 inside the "K-1 final" patch; #10 inside the rc.14 M-2 patch) keeps appearing. Documented in CHANGELOG so the next external auditor sees the methodology IS aware of this failure mode and treating it explicitly.
62
+
63
+ ### Stats
64
+
65
+ - **862 tests** (+7 NEGATIVE control siblings for rc.14 M-2 invariants).
66
+ - `tests/docs-consistency.test.ts`: 7 inline-regex invariants → 7 pure-function checks + 7 NEGATIVE controls.
67
+ - All 5 surfaces re-bumped: README (×3), package.json, COMPARISON.md, llms.txt, AGENTS.md (855→862).
68
+ - `npm audit`: 0 vulnerabilities.
69
+ - Dist-tag: `@rc` (v3.7.20 stays `@latest`).
70
+ - All 9 required CI gates pass locally.
71
+
72
+ ### v3.8.0 remaining backlog
73
+
74
+ - **External audit** before `@latest` promotion (CLAUDE.md rule since v3.6.1).
75
+ - **Tier C** (deferred): JSON-LD `SoftwareApplication` schema on GH Pages, GitHub Sponsors funding.yml.
76
+ - **T-2, T-3** — communities handler + hyde E2E.
77
+ - **T-4** — optional serve-http HTTP smoke.
78
+ - **Multi-subcommand CLI drift audit** (from rc.11 RCA).
79
+ - OCR'd PDF watcher embed-sync, HNSW in-memory watcher update.
80
+
81
+ ---
82
+
83
+ ## [3.8.0-rc.14] — 2026-05-24
84
+
85
+ > **TL;DR:** Fourteenth v3.8.0 release candidate. **Post-rc.13 audit closure** — 4 findings: M-2 (root-class fix: new files `llms.txt` + `AGENTS.md` introduced drift surface without invariant coverage), L-2 (`CLAUDE.md` status section stale at rc.12 — same α-class drift the methodology keeps fighting), L-3 (Tier B0 MCP Registry submission successfully completed but not documented in CHANGELOG), L-4 (PR #117 `server.json` schema validation fix had no CHANGELOG entry). 7 new docs-consistency invariants extend coverage to llms.txt + AGENTS.md numeric claims (test count, tool breakdown, MCP prompt count, CI gate count, per-file floor count). **855 tests** (+7 invariants vs rc.13). Ships under `@rc` dist-tag.
86
+
87
+ **Minor — fourteenth v3.8.0 release candidate.**
88
+
89
+ ### Fix M-2 (MEDIUM) — root-class fix for new-file drift-surface gap
90
+
91
+ **Background.** rc.12 added `llms.txt` (https://llmstxt.org/ standard for AI agents) and `AGENTS.md` (Cursor 2.0 / Claude Code / Codex coding-agent convention). Both contain numeric/structural claims — "848 unit tests", "44 tools", "19 MCP prompts", "9 required CI gates", "10 per-file branch floors" — that were NOT covered by the existing `docs-consistency.test.ts` invariants. Existing invariants checked README, STABILITY.md, COMPARISON.md, package.json description, and docs/api.md, but new files were a fresh drift surface.
92
+
93
+ Post-rc.13 audit found this as a class-level methodology gap: **whenever we add a new docs surface with numeric claims, we must extend docs-consistency at the same time**, otherwise the surface will silently drift. Same class as M-1 (CLI help text drift before rc.11 lifted to `cli-help.ts`) — but for a *new* surface we created in rc.12 rather than a pre-existing one.
94
+
95
+ **Fix** (`tests/docs-consistency.test.ts`): added a new `describe` block "llms.txt + AGENTS.md numeric claims (v3.8.0-rc.14 M-2)" with 7 invariants:
96
+ 1. `llms.txt` test count = actual `it()` count across `tests/*.test.ts`
97
+ 2. `llms.txt` tool breakdown `N tools (A always-on read + B opt-in + C gated writes)` = TOOL_MANIFEST counts per kind
98
+ 3. `llms.txt` MCP prompt count = `registerPrompt` count in `src/prompts.ts`
99
+ 4. `llms.txt` `N required + M advisory CI gates` count = `REQUIRED="..."` regex entries in `.github/workflows/release.yml`
100
+ 5. `AGENTS.md` `X+ tests` lower-bound assertion (≤ actual, with drift detection if actual >50 above floor)
101
+ 6. `AGENTS.md` per-file branch floor count = entries in `scripts/check-per-file-coverage.mjs` FLOORS object
102
+ 7. `AGENTS.md` `N required CI gates` (multiple mentions) all = `release.yml` REQUIRED count
103
+
104
+ Tested empirically: invariants caught 7 fresh drift instances (test count now 855, not 848 — the 7 new invariants themselves changed the count). All surfaces updated to 855 in same commit.
105
+
106
+ **Defense-in-depth.** This now means EVERY new docs surface in this repo must either (a) avoid numeric claims, OR (b) be added to docs-consistency invariants at the same time. CLAUDE.md anti-patterns updated with new rule.
107
+
108
+ ### Fix L-2 (LOW) — CLAUDE.md status section was stale at rc.12
109
+
110
+ **Background.** CLAUDE.md line 119 said `**v3.8.0-rc.12 shipped (current)**` after rc.13 was already shipped + MCP Registry submission successful. Classic α-class drift the methodology specifically warns against.
111
+
112
+ **Fix** (`CLAUDE.md`): updated status section to reflect rc.12 (shipped), rc.13 (shipped, includes MCP Registry submission confirmation), rc.14 (current). Same edit pattern as previous status updates.
113
+
114
+ ### Fix L-3 (LOW) — MCP Registry submission was not documented in CHANGELOG
115
+
116
+ **Background.** rc.13 CHANGELOG entry predicted "After this RC publishes to npm, `mcp-publisher publish` submits server.json to the canonical MCP Registry." — but the *actual* successful submission was never recorded in any CHANGELOG entry. Audit trail gap.
117
+
118
+ **Confirmation.** Successfully published to `https://registry.modelcontextprotocol.io` on 2026-05-24 09:18:29 UTC:
119
+ - Server name: `io.github.oomkapwn/enquire-mcp`
120
+ - Version: `3.8.0-rc.13`
121
+ - Status: `active`
122
+ - `isLatest`: `true`
123
+
124
+ Live verification: `curl "https://registry.modelcontextprotocol.io/v0.1/servers?search=enquire"` → 1 listing. Glama.ai, mcp.so, smithery.ai will auto-sync from this canonical source over 24-48 hours.
125
+
126
+ Also opened **awesome-mcp-servers PR #6838** at `https://github.com/punkpeye/awesome-mcp-servers/pull/6838` in the Knowledge & Memory category. Awaiting maintainer review.
127
+
128
+ ### Fix L-4 (LOW) — PR #117 server.json validation fix was not documented
129
+
130
+ **Background.** rc.13 shipped with `server.json` that failed MCP Registry validation (description >100 chars, runtimeArguments missing required `valueHint`/`value`/`name` fields per the v2025-12-11 schema). Fixed during the registry submission session and merged via PR #117 — but no CHANGELOG entry was added.
131
+
132
+ **Confirmation.** PR #117 merged to main at commit ea3a4cc. Changes:
133
+ 1. `server.json` description: 489 chars → 91 chars (matches MCP Registry `length ≤ 100` constraint)
134
+ 2. PositionalArgument: added `valueHint: "subcommand"`, `value: "serve"`, ordered fields per schema
135
+ 3. NamedArgument: explicit `type: "named"` + `name: "--vault"` fields
136
+
137
+ `mcp-publisher validate` now passes cleanly. The corrected `server.json` is what was published to the registry; this RC documents the gap.
138
+
139
+ ### Stats
140
+
141
+ - **855 tests** (+7 docs-consistency invariants vs rc.13).
142
+ - 2 surfaces newly covered by invariants: `llms.txt`, `AGENTS.md`.
143
+ - 5 surfaces with test-count bumps: README (×3), package.json, COMPARISON.md, llms.txt, AGENTS.md.
144
+ - `npm audit`: 0 vulnerabilities.
145
+ - Dist-tag: `@rc` (v3.7.20 stays `@latest`).
146
+ - All 9 required CI gates pass locally.
147
+
148
+ ### Method note
149
+
150
+ **New rule (CLAUDE.md anti-patterns):** whenever a PR adds a new docs surface with numeric claims, the SAME PR must extend `docs-consistency.test.ts` to cover those claims. Otherwise the new surface becomes a fresh drift surface that the next external audit will catch. This generalizes the v3.7.17 OIA rule from "state-driven walks for existing files" to "structural invariants for new files".
151
+
152
+ ### v3.8.0 remaining backlog
153
+
154
+ - **External audit** before `@latest` promotion (CLAUDE.md rule since v3.6.1 — required ≥2 independent external auditors per major).
155
+ - **Tier C** (deferred): JSON-LD `SoftwareApplication` schema on GH Pages, GitHub Sponsors funding.yml.
156
+ - **T-2, T-3** — communities handler + hyde E2E.
157
+ - **T-4** — optional serve-http HTTP smoke.
158
+ - **Multi-subcommand CLI drift audit** (from rc.11 RCA): install-model/build-embeddings/eval/bench for --include-pdfs/--embed-file/--json/etc.
159
+ - OCR'd PDF watcher embed-sync, HNSW in-memory watcher update.
160
+
161
+ ---
162
+
5
163
  ## [3.8.0-rc.13] — 2026-05-24
6
164
 
7
165
  > **TL;DR:** Thirteenth v3.8.0 release candidate. **AI/LLM discoverability Tier B** — adds `mcpName` field to `package.json` (`io.github.oomkapwn/enquire-mcp`) and ships `server.json` at repo root, both required by the official MCP Registry verification (registry.modelcontextprotocol.io). Adds `CITATION.cff` for academic discoverability (Google Scholar / Semantic Scholar) citing the underlying research papers (HyDE, RRF, BM25, Louvain, HNSW, BGE). After this RC ships to npm, mcp-publisher can submit to the canonical MCP Registry — which auto-propagates to glama.ai, mcp.so, smithery.ai, and other downstream registries. **No code changes; metadata + documentation only.** 848 tests unchanged. Ships under `@rc` dist-tag.
package/README.md CHANGED
@@ -13,7 +13,7 @@
13
13
  [![CI](https://github.com/oomkapwn/enquire-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/oomkapwn/enquire-mcp/actions/workflows/ci.yml)
14
14
  [![npm](https://img.shields.io/npm/v/@oomkapwn/enquire-mcp.svg?label=npm&color=cb3837)](https://www.npmjs.com/package/@oomkapwn/enquire-mcp)
15
15
  [![downloads](https://img.shields.io/npm/dm/@oomkapwn/enquire-mcp.svg?color=cb3837)](https://www.npmjs.com/package/@oomkapwn/enquire-mcp)
16
- [![tests](https://img.shields.io/badge/tests-848%20passing-brightgreen.svg)](#trust)
16
+ [![tests](https://img.shields.io/badge/tests-862%20passing-brightgreen.svg)](#trust)
17
17
  [![stable](https://img.shields.io/badge/v3.7.x-stable-brightgreen.svg)](./STABILITY.md)
18
18
  [![SLSA-3](https://img.shields.io/badge/SLSA-3-blue.svg)](https://slsa.dev/spec/v1.0/levels#build-l3)
19
19
  [![MCP](https://img.shields.io/badge/MCP-1.29-8A2BE2.svg)](https://modelcontextprotocol.io/)
@@ -38,7 +38,7 @@ Your Obsidian vault becomes **persistent, queryable long-term memory** for any M
38
38
  > 2. **Best-in-class retrieval.** Hybrid BM25 + multilingual embeddings + BGE cross-encoder reranker fused via RRF, scaled with HNSW + int8 quantization. The same IR stack a search startup would build — open-sourced, in one binary.
39
39
  > 3. **Zero cloud calls during serve.** Models cached locally (one-time download from HuggingFace). Your vault content never leaves your machine. Air-gap-safe by default.
40
40
 
41
- **44 tools · 19 MCP prompts · 848 unit tests · 50+ languages · v3.7.x stable · semver-bound · MIT · SLSA-3 signed.**
41
+ **44 tools · 19 MCP prompts · 862 unit tests · 50+ languages · v3.7.x stable · semver-bound · MIT · SLSA-3 signed.**
42
42
 
43
43
  ---
44
44
 
@@ -176,7 +176,7 @@ Auto-generated **[API reference at oomkapwn.github.io/enquire-mcp](https://oomka
176
176
  | **GraphRAG-light** (wikilink community detection via Louvain modularity) | ✅ **only here** | ❌ | ❌ |
177
177
  | **Standalone `.base` query execution** (works without Obsidian running) | ✅ **only here** | ❌ | ❌ delegates to Obsidian |
178
178
  | **HyDE retrieval** (Gao et al 2023) + sub-question decomposition | ✅ **only here** | ❌ | ❌ |
179
- | **848 unit tests · 9 required + 4 advisory CI gates per PR** | ✅ | n/a | rare |
179
+ | **862 unit tests · 9 required + 4 advisory CI gates per PR** | ✅ | n/a | rare |
180
180
  | **SLSA-3 build provenance** | ✅ | n/a | ❌ |
181
181
  | **Semver-bound public surface** ([STABILITY.md](./STABILITY.md)) | ✅ | n/a | ❌ |
182
182
  | Standalone (no Obsidian plugin needed) | ✅ | ❌ requires Obsidian | varies |
@@ -286,7 +286,7 @@ Channel: `npm install @oomkapwn/enquire-mcp` → latest stable. Full changelog:
286
286
  ```bash
287
287
  git clone https://github.com/oomkapwn/enquire-mcp.git
288
288
  cd enquire-mcp && npm install
289
- npm test # full suite (848 tests, ~5s)
289
+ npm test # full suite (862 tests, ~5s)
290
290
  npm run lint # zero warnings
291
291
  npm run build # tsc → dist/
292
292
  ```
package/dist/index.d.ts CHANGED
@@ -7,7 +7,7 @@
7
7
  * + `McpServer({version})`) and `src/tool-registry.ts` (used in the
8
8
  * `vault-info` resource payload).
9
9
  */
10
- export declare const VERSION = "3.8.0-rc.13";
10
+ export declare const VERSION = "3.8.0-rc.15";
11
11
  export { main } from "./cli.js";
12
12
  export { buildEmbedText, buildMcpServer, formatReadyBanner, prepareServerDeps, type ServeOptions, type ServerDeps, startServer } from "./server.js";
13
13
  export { parsePositiveInt, parseQuantizationMode } from "./tool-registry.js";
package/dist/index.js CHANGED
@@ -40,7 +40,7 @@ import { main } from "./cli.js";
40
40
  * + `McpServer({version})`) and `src/tool-registry.ts` (used in the
41
41
  * `vault-info` resource payload).
42
42
  */
43
- export const VERSION = "3.8.0-rc.13";
43
+ export const VERSION = "3.8.0-rc.15";
44
44
  // Re-exports — preserve the v3.5.x public surface so http-transport.ts and
45
45
  // tests don't need to know about the new module layout. The set below
46
46
  // exactly matches the v3.5.x `export` declarations: `main`,
@@ -43,7 +43,7 @@ The four axes the external audit (#3, 2026-05) called out as decisive — **REST
43
43
  | Read open editor state, active note, etc. | **No** | **Yes** | Limited | No | No |
44
44
  | Zero outbound network calls in serve mode | **Yes** (default) | Local-only (REST)| Local-only (REST)| Yes | Yes |
45
45
  | SLSA-3 build provenance on releases | **Yes** | No | No | No | No |
46
- | Test count (public) | **848** | (varies) | (varies) | (varies) | (varies) |
46
+ | Test count (public) | **862** | (varies) | (varies) | (varies) | (varies) |
47
47
  | Tool count | 44 | ~25 | ~8 | ~10 | 3–5 |
48
48
  | MCP prompt count | 19 | 0 | 0 | 0 | 0 |
49
49
  | License | MIT | Apache-2.0 | MIT | MIT | (varies) |
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "@oomkapwn/enquire-mcp",
4
- "version": "3.8.0-rc.13",
4
+ "version": "3.8.0-rc.15",
5
5
  "mcpName": "io.github.oomkapwn/enquire-mcp",
6
- "description": "MCP server giving AI agents (Claude Code, Claude Desktop, Cursor, ChatGPT, Codex, OpenClaw) persistent long-term memory backed by your local Obsidian markdown vault. Hybrid retrieval (BM25 + ML embeddings + BGE reranker, RRF-fused), HNSW + int8 quantization, agentic RAG (HyDE + sub-question decomposition), GraphRAG-light (Louvain), standalone Obsidian Bases, PDFs + Tesseract OCR. Vendor-neutral memory layer for any MCP-compatible agent. 44 tools, 19 MCP prompts, 848 tests, SLSA-3, semver-bound, MIT, zero cloud calls during serve.",
6
+ "description": "MCP server giving AI agents (Claude Code, Claude Desktop, Cursor, ChatGPT, Codex, OpenClaw) persistent long-term memory backed by your local Obsidian markdown vault. Hybrid retrieval (BM25 + ML embeddings + BGE reranker, RRF-fused), HNSW + int8 quantization, agentic RAG (HyDE + sub-question decomposition), GraphRAG-light (Louvain), standalone Obsidian Bases, PDFs + Tesseract OCR. Vendor-neutral memory layer for any MCP-compatible agent. 44 tools, 19 MCP prompts, 862 tests, SLSA-3, semver-bound, MIT, zero cloud calls during serve.",
7
7
  "type": "module",
8
8
  "bin": {
9
9
  "enquire-mcp": "dist/index.js"