Crucible
Coverage & gap analysis
In a consulting engagement, the most valuable question is not "what do we know?" but "what haven't we asked about yet?" Coverage analysis renders your knowledge base as a Business-Unit × topic matrix, makes un-interviewed units visible as explicit gaps, and tells you — transparently — who to interview next.
The BU × topic matrix
Each cell is a Business-Unit / topic pair. The topic and business-unit universe is seeded from both the workspace ontology (entity types) and document frontmatter, so a unit nobody has documented still gets a row. A cell reports raw, defensible signals — never an opaque composite score:
docCount— how many documents cover this cell.entityCount— how many entities are attributed to it.medianAgeDays— staleness; cells past ~60 days are called out.evalAccuracy— an overlay from eval runs, shown only when the tag has at least 5 items (and always displayingn), with ranking hysteresis so one flaky judge call can't reorder the board.zeroCoverage— the flag that makes a true gap a first-class row instead of an invisible blank.
Zero-coverage rows are the point
Interview-next: a transparent sort
"Interview next" is deliberately not a 0–100 score no one can explain. It is a transparent sort with literal reasons attached to each recommendation:
- "Compliance / Data retention — 0 docs, never interviewed"
- "Operations / Vendor risk — 2 docs, 3 failed evals, stale 94d"
Raw numbers are more defensible in the room than a black-box composite. The list is capped (top ~20) and the reasons are drawn straight from the cell signals above.
Summary signals
Alongside the matrix, coverage reports a workspace summary: total documents and entities, orphan-entity count, median staleness, total interviews and interviews-by-BU, and the business-unit / topic counts. Retrieval refusals also feed in as gap_events — the difference between "the KB lacks it" and "retrieval failed" that keeps a 40%-unextracted corpus from being misread as a real content gap.
Snapshots for auditability
Coverage can be snapshotted to coverage_statsand stamped on exported reports, so "you told us Compliance was 78% covered" is reproducible months later. See Export & offboarding.
Where it lives
The dashboard reads from GET /api/w/:workspaceId/coverage, and snapshots are written via POST /api/w/:workspaceId/coverage/snapshot. See the Workspace API index.