wiki: naturalize hardcoded counts (Source of Truth lives in README Hero)
Following the same Single-Source-of-Truth cleanup applied to the main
repo: wiki pages no longer hardcode '67 typed functions / 42 native +
25 SIFT adapters / 10 of 12 MITRE / 55 tests / 1182 lines'. Phrasing
shifts to 'the typed MCP surface', 'native + SIFT adapters', 'broad
MITRE enterprise tactic coverage'.
Phase-1.md historical version table preserves period-specific numbers
(v0.3 = 31 functions, v0.4 = 35 native, v0.5 = 60 functions) because
those are historical facts about what shipped on those dates, not
claims about current state.
The canonical exact name set continues to live in
tests/test_mcp_surface.py — the only place that needs editing when a
function is added or removed.
wiki: sweep stale 35-native / 60-total counts to current 42 / 67
16 wiki pages had pre-v0.6.0 numeric references that survived earlier
QA rounds. Surface count was bumped 60 -> 67 in v0.6.0 (six new
supply-chain IOC functions in dart_mcp._v05_supply_chain), and native
count went 35 -> 42, but a number of wiki pages still showed the old
numbers.
Pages corrected:
About-the-name, Architecture-deep-dive,
Architecture-first-vs-prompt-first, Case-PtH-Timestomp, FAQ,
Glossary, Home, Live-mode, MCP-function-catalog, Phase-1,
Roadmap, SIFT-adapter-layer, The-Memex-Bet, _Sidebar, dart-mcp
Phase-1.md version history table preserves the historical numbers
(v0.4 = 35 native, v0.5 = 60 functions) as those are historical
facts, not current state.
MITRE coverage also corrected from 11/12 -> 10/12 (TA0009 Collection
and TA0011 C2 are Phase 2).
wiki(qa-r14): kill 'pytest.raises(ToolNotFound)' hallucination in 2 architecture pages
Round 14 of QA — every Python code block in the wiki dry-run-tested
against actual imports.
== Defects fixed ==
### Architecture-deep-dive.md and Architecture-first-vs-prompt-first.md
Both pages had a Python sketch using:
with pytest.raises(ToolNotFound):
call_tool('execute_shell', ...)
ToolNotFound is NOT an exception class in this codebase. The
actual implementation in dart_mcp/__init__.py line 109 is:
raise KeyError(f"ToolNotFound: '{name}' is not exposed by dart-mcp")
i.e., the string 'ToolNotFound' is a marker inside a KeyError
message, not a class name. The real test pattern in
tests/test_mcp_bypass.py is:
try: call_tool(forbidden, {})
except KeyError as e: assert 'ToolNotFound' in str(e)
A judge copying the wiki sketch would get NameError: name
'ToolNotFound' is not defined. Fixed both pages to use the actual
KeyError-with-marker-string pattern from the real test. Verified
by running both rewrites against a real call_tool import — both
pass.
### Other Python blocks reviewed and verified
- dart-audit.md AuditLogger usage: ✅ executes (round-10 fix
holds)
- Operator-guide.md DuckDB query and dart-corr.md DuckDB Why
block: 🟢 illustrative placeholders ('<case>.duckdb',
'auth.csv') — wrapped in operator-context narrative; not
runnable as-is, but the placeholder syntax (<...>) and
surrounding prose make the intent clear. Left as-is.
- SIFT-adapter-layer.md and dart-corr.md '# Illustrative' block:
🟢 schema sketches in a python code fence (no exec semantics).
Left as-is.
== Verification ==
Both fixed sketches manually executed in a Python REPL with
'from dart_mcp import call_tool' first. Both pass. The fixed
pattern is identical (modulo formatting) to what
tests/test_mcp_bypass.py::test_unregistered_destructive_function_raises_ToolNotFound
actually does — so the wiki teaches the real pattern, not a
fictional one.
== Pattern internalised (continuing the round-9/10 thread) ==
Round 9 caught output-key hallucinations (function returns 'flags',
not 'findings').
Round 10 caught argument-name and file-path hallucinations
(host=, target=, --hunt, run_loop, loop.py).
Round 14 caught exception-class hallucinations (ToolNotFound class
that doesn't exist; the real implementation uses KeyError + a
marker string).
The unifying pattern: any wiki/docs Python sketch that names a
specific symbol (function, kwarg, class, file path) needs to be
diff-verified against the actual code. Sketches that just use
'placeholder.csv' or '<case>.duckdb' are fine because they
declare themselves as illustrative.
wiki QA pass: synchronize 13 pages to v0.5 reality (60 tools, 22 tests)
Companion to main repo commit 52f975d (v0.5.1 QA pass).
Updated to reflect the v0.5 SIFT adapter layer (35 native + 25 SIFT
= 60 typed read-only MCP tools) and the v0.5 test suite expansion
(20 → 22 cases):
About-the-name.md
'The 35 typed dart-mcp functions cover...' →
'The typed dart-mcp surface (35 native + 25 SIFT Workstation
adapters = 60 functions) covers...'
Test count 20/20 → 22/22 across all references.
Architecture-deep-dive.md
ASCII architecture box: 'dart-mcp 35 typed forensic functions'
→ 'dart-mcp 60 typed forensic functions (35 native + 25 SIFT)'
Architecture-first-vs-prompt-first.md
'The MCP surface is exactly 35 functions, by name' →
'The MCP surface is exactly 60 typed functions, by name (35
native + 25 SIFT Workstation adapters)'
Case-PtH-Timestomp.md (2 references) updated parallel to docs/.
FAQ.md
Question heading: 'Is the MCP surface really exactly 35
functions?' → 'Is the MCP surface really fixed in size?'
Answer body: counts updated to 60 / 22-22.
Glossary.md
dart-mcp definition: 35 → 60.
'For Agentic-DART v0.4: exactly 35' →
'For Agentic-DART v0.5: 60 (35 native + 25 SIFT Workstation
adapters)'
Home.md (TOC)
'the 35 forensic functions, schema, bypass tests' →
'the 60 forensic functions (35 native + 25 SIFT adapters),
schema, bypass tests'
'why the MCP surface is exactly 35 functions, not 28, not 35'
rephrased to avoid count-anchoring.
Live-mode.md (2 references) parallel to docs/.
MCP-function-catalog.md
Page title: '· 35 typed forensic functions'
→ '· 60 typed forensic functions (35 native + 25 SIFT
Workstation adapters)'
Operator-guide.md
'All 20 tests should print OK' → 'All 22 tests should print OK'
Phase-1.md
Body: '35 typed forensic functions' / '20 of 20 tests passing'
counts updated.
Timeline table: ADDED row for 2026-05-02 v0.5 (SIFT Workstation
tool adapter layer → 60 functions, 22 tests passing). v0.4
historic row preserved verbatim.
Roadmap.md
Three references to 35 / 20-20 updated to v0.5 numbers.
Running-on-macOS.md
'Step 3 — Run all 20 tests' → '... 22 tests'
'All 20 tests pass on M1/M2/M3' → 'All 22 tests pass on M1/M2/M3'
The-Memex-Bet.md
'MCP surface (35 typed functions)' →
'MCP surface (60 typed functions: 35 native + 25 SIFT adapters)'
'The 35 functions are not a guideline...' →
'The 60 functions (35 native + 25 SIFT Workstation adapters)
are not a guideline...'
_Sidebar.md
Two TOC labels: '(35 functions)' → '(60 functions: 35 native +
25 SIFT)'
dart-mcp.md
'exposes exactly 35 typed forensic functions' →
'exposes 60 typed forensic functions (35 native + 25 SIFT
Workstation adapters)'
Section heading 'The 35 functions' → 'The 60 functions (35
native + 25 SIFT adapters)'
SIFT-adapter-layer.md
Preserved verbatim — line 18 'its own 35 forensic functions'
is historic context describing the pre-v0.5 state.
wiki: comprehensive sync 31 → 35 across all pages
v0.4 raised the function count from 31 to 35. Wiki was tracking
old number on multiple pages:
About-the-name.md 'existing 31 functions stay' → 35
Architecture-deep-dive.md 'the 31 typed' → 35
Architecture-first-vs-prompt-first.md '31 functions, by name' → 35
FAQ.md 'is the surface really exactly 31?' → 35
Home.md 'the 31 forensic functions' → 35
Operator-guide.md '31' → '35'
Roadmap.md '31 typed forensic functions' → 35
Threat-model.md (no 31 references — already clean)
dart-mcp.md 'exactly 31 typed' → '35'
MCP-function-catalog.md (header was already 35)
Roadmap also gets a 'v0.4 (2026-04-30)' entry in the Done list to
record the Linux+macOS expansion.
feat: initial wiki — Home, About, Architecture-first, dart-mcp, FAQ, sidebar/footer
Long-form documentation that doesn't fit in the README:
- Home: overview + table of contents
- About the name: DART acronym + four-phase plan
- Architecture-first vs prompt-first: the central design claim
- dart-mcp: the typed surface, all 31 functions, bypass tests
- FAQ: judges, contributors, skeptics
- _Sidebar / _Footer: auto-shown navigation on every page
Other pages (Threat model, dart-agent / dart-corr / dart-audit / dart-playbook,
Running on SIFT/macOS, Live mode, Accuracy, case studies, roadmap, glossary,
comparison) are stubs in the sidebar — to be filled in as the project matures.