Skip to main content

docs-turing Coverage Matrix

Purpose. Every shipped block / feature cluster in the Turing CHANGELOG.md maps here to either a documentation page (with anchor) or an explicit "deliberately internal, no public page" row. A shipped user-facing subsystem with no page is an orphan (🔴) and a bug in the docs. This file is the gate authored by Block AE T538; keep it in sync when a new block ships.

Legend: ✅ documented · 🧩 folded into a broader page · 🔒 deliberately internal (engineering / repo / marketing, no end-user page by design) · 🔴 orphan (missing, fix it).

Not rendered in the sidebar; this is a maintenance artifact.


Search it

Block / featurePageStatus
Search engine (Solr / ES / Lucene), coressearch-engine
Semantic Navigation sites, facets, spotlights, targetingsemantic-navigation
Block R: field manifest, schema-as-code, derivation, hybrid ranking, field coveragemanifest
DSL Query API + compatibility matrixdsl-query · dsl-compatibility
SPA / search-template pagesspa-pages
Connectors (AEM, web crawler)integration · integration-aem
Import / exportimport-export
Migrating from Algolia / Elasticsearch (guide)migration
Block AO: migration tooling: ES/Algolia importers + turing migrate CLI + field-mapping overrides + shadow-comparison (parity check)migration § fast path · cli🧩
Block AP: native synonyms (5 types, query-time on Solr/ES/Lucene, no reindex) + admin UI + Import from Algolia + AI-assisted miningsynonyms
Block AV: POST-native search & link-free response contract: anonymous POST /sn/{site}/search/query JSON body, opt-in STRUCTURED (link-free) response via responseFormat, /ac/query + /search/list/query POST variants, both JS SDKs POST-native by defaultrest-api § POST-native search · javascript-sdk § Search controller · react-sdk § useTuringSearch
Block BR: Block AV follow-through — responseFormat honoured on the GET search endpoint too (case-insensitive; unknown value 400s), opt-in includeSortOptions inlining the sort options in the structured response, EnrichedFacetItem.link optional (absent POST-native), and each result's facet chips carrying a filterQuery instead of an hrefrest-api § responseFormat on GET · rest-api § Sort options in one round-trip · react-sdk § useTuringFacets🧩
Block BT: the POST-native default's consumers caught up — a result's facet chip in the STRUCTURED response now carries selected + action (inherited from the matching facet item, so a single-select field yields REPLACE on the chip too), and both SDKs' toggleFacet accepts a chip as well as a rail item, so a result's tag can be toggled off rather than only added. The rest of the block is admin-console bug fixes (/sn/{siteName} rendered its error state on every POST-native search, lost its applied-filters row and drew single-select facets) plus the test-shape change that makes that class catchablerest-api § POST-native search · javascript-sdk § Search controller · react-sdk § useTuringSearch🧩
Block BW (T879–T885): what the link-free response and its consumers still lacked — the STRUCTURED body now carries the site's icon (a configured icon stopped falling back to the Turing logo) and declares similar + typed spotlights; the two-shape projection became a public SDK export (toSearchView / useSearchView), a result's facet chips became actionable outside the admin app (TuringDocumentChips), and the co-browse agent's toggle_facet reaches a secondary facet in both transports. The rest is repo-internal: the react-sdk README was rewritten off the shape that broke, and a convention test now fails an app that reads store.datarest-api § The STRUCTURED response · javascript-sdk § toSearchView · react-sdk § useSearchView · react-sdk § TuringDocumentChips🧩
Block BU (T870–T872): the search cache stopped serving stale answers — indexing, deindexing and commit each evict the cache of the site they wrote (the 24h sweep is now only the backstop), and the sweep's interval moved to turing.search.cache.ttl, a unit-bearing Duration, because the old …ttl.seconds key was read as milliseconds. The docs said so too, and now do notconfiguration-reference § Search Cache🧩
Block AQ: Thesaurus: hierarchical controlled-vocabulary microthesauri + index-time expansion (microthesaurus_terms) + concept/hierarchical facets + per-site opt-in + seed library + XML import + AI generation + related-term suggestionsthesaurus

Ask it

Block / featurePageStatus
RAG pipelinerag
Block M: verifiable answers, native citations, citation-driftrag § Provenance & citations🧩
Block AD RAG bridges: managed backends, lanes, fallback, guardrail, second-opinionrag § Advanced RAG🧩
Block N + T521: pluggable & managed rerankersreranking
Block AD embeddings: Voyage/Cohere/Mistral, multimodal, contextual, Matryoshka, OCRembedding-models · embedding-stores
Chat interfacechat
E.6 / F.8: chat memory, compaction, context editingchat-memory
Intents / conversation startersintent
Block AA: speaker + audience personas, content-fit, persona-from-audio, persona-suggestpersonas § Audience Personas & Content-Fit, § Suggest the best-fit persona
Block AS: pluggable/chunk-capable transcription: config-selectable backends (OpenAI / self-hosted OpenAI-compatible / none), ffmpeg chunking, async jobs, AUDIO-slot transcription, per-backend metrics, confidence fallbacktranscription
Block BP (T846–T851, closed): next-generation transcription models — per-backend default (gpt-transcribe cloud / whisper-1 self-hosted) with a model-aware request shape, prompt + keywords context hints sourced from the Thesaurus, server-resolved gpt-live-transcribe for realtime voice, a streamed file transcript (partialTranscript) rendered live in persona-from-audio, and opt-in speaker diarization (segments) that degrades to a flat transcript rather than guess across chunk boundariestranscription § Choosing a model, § Context hints, § Watching the transcript arrive, § Identifying speakers
Block AI / AG: persona as an actionable surface (persona chat, bento dashboard + launchpad, content-fit launch action, persona dialogue, suggest persona; T619 re-added from-audio + suggest to bento)personas § Act on a Persona
Block AT (T696–T704): Persona Match: N×N persona↔content fit projects (project-scoped contents × personas → live fit heatmap + by-content/by-persona reports + PDF, scheduled re-analysis, validate-route folded into a single-persona project) + the tuning loop (per-cell fit history/trend, drift since the last run, LLM-or-deterministic content/persona adjustment suggestions)personas § Persona Match, § The tuning loop🧩
Block AU (T705–T706): Persona Dialogue projects: saved multi-project dialogues (topic + ordered speaker roster + live-streamed & persisted transcript), reusing the round-robin enginepersonas § Personas in conversation🧩
Block AW (T717–T734): Synthetic User Research: OCEAN persona facet + knowledge grounding, study aggregate (dynamic/scripted/concept-test protocols) + N-persona SSE interview runner, insights report (themes + verbatim quotes + saturation + theme graph + drift), interview-your-own-agent, per-stage model lanes, concept-fit + eval-dataset bridges, continuous-insight scheduling, audience cohort synthesis, Research Assistant, multi-study program rollup (PRISMA), turing research CLIpersonas § Synthetic User Research · cli § turing research🧩
Block AY (T739): Content ingestion: pluggable URL fetch mode (Simple / Auto / Headless) with a browserless headless-browser fallback so JS-rendered SPA pages extract text; Global Settings section + browserless compose servicepersonas § Content ingestion🧩
Block AZ (T740–T748): Governed LLM Gateway: OpenAI-compatible /v1/* inbound API; virtual keys (sk-turing-…) with per-key allowed-models scope, monthly budget + auto-downgrade, hard cap, rate limit; x-turing-cache / x-turing-guardrails / x-turing-rag-site / x-turing-tools headers; turing-agent: / turing-sn: / turing-local: / turing-router: model-name routing; per-key spend dashboard + /bento/gateway admin; opt-in traffic → eval/distillation bridgeGoverned LLM Gateway
Block BA (T749): Multi-model LLM instance: select one or more models on an instance and mark one as the default (used everywhere the single-model platform points at the instance); dedicated Models card + LlmModelMultiSelect picker on the instance formllm-instances § Models🧩
Block BE (T776–T789): Catalog-driven model intelligence: rich ModelEntry metadata through the catalog boundary; auto-seed/refresh TurLLMPrice from catalog pricing + provenance/staleness/verify links; enriched model picker (price/context/capability/benchmark/tier badges + sort); auto-fill instance limits; capability/modality feature gating; deprecation warnings + suggested replacement; pre-flight batch cost estimate; cost/quality/latency gateway routing; Model Advisor wizard + one-click create; right-sizing savings; knowledge-cutoff disclosure toggle; catalog change-feed notifications; consumer-plan & provider-pricing referencellm-instances § Catalog-driven intelligence · cost-governance § price table · ai-agents § Settings · llm-gateway § Model-name routing🧩
Block BF (T790–T801): Vectorless (Structured-Data) RAG: name & surface the catalog copilot as a first-class Knowledge Base Mode (Vector / Vectorless-Structured / Hybrid); NL→filter over the declared field schema → cited answer with no embeddings; scheduled JSON-feed pull ingester + startup auto-provisioning; React useTuringCopilot hook/widget; stuff-all mode for small catalogs; turing-copilot:<site> gateway route; T801 makes Vectorless mode fully suppress embedding indexing + ANN + hybrid ranking (decoupled from the default-agent RAG flag) with an explicit admin calloutvectorless-structured-rag
Block BG (T803–T807): Batch / bulk structured-feed indexing: catalog-scale imports indexed in one bulk pass (batched queue consumer + one commit/group, schema convergence once per batch, true bulk Lucene write); scheduled feed chunked into bounded per-chunk imports (turing.genai.structured-feed.batch-size); opt-in direct bulk-index fast path (POST /api/sn/import/bulk, turing.sn.import.bulk-direct.*) bypassing the queue for very large vectorless reindexes. Mostly internal performance; the two ops config knobs + endpoint fold into the structured-feed pagevectorless-structured-rag § Indexing large catalogs🧩
Block BN (T825–T831, closed): Content-fit tuning loop hardening. T825: the Persona Match project's LLM Instance now drives the fit scores too, not just the adjustment suggestions (previously the matrix was always scored by the global default LLM, so changing the project's model changed the advice but not the numbers it reasons about); the model is part of the score cache key, so switching it re-scores instead of reusing the previous model's verdicts. T831 closes the loop with an Apply to this persona action on a persona suggestion: a field-level diff over the audience profile (reading level / domain expertise / vocabulary ceiling / comprehension notes), confirmed field by field — nothing pre-ticked, no accept-all, unticked fields untouched — carrying the persona-edit permission, and recording every applied field with the value it replaced and the suggestion that caused it, so a later run's drift is explainable. Content suggestions stay advisory: Turing does not own the CMS. Folds into the tuning-loop section beside the suggestions it acts onpersonas § Persona Match · personas § Applying a persona adjustment🧩
Block BH (T808–T810): SN result & facet rendering robustness for feed/crawl-indexed sites: a feed carries its own field names (label, not title), so an indexed, searchable site could render blank titles/descriptions and label-less facet headers. Safe defaults now apply everywhere (blank default-field columns resolve to the conventional title/abstract/text/url/image/publication_date; an unlabelled facet header falls back to a humanized field name), and the structured-feed source can declare the real mapping (default-title-field, … + facet-labels) or carry per-field facetName labels in the field manifest, applied at provision time and never overwriting an admin edit. The two fallbacks are invisible robustness; the declarable mapping is the user-facing halfvectorless-structured-rag § Rendering titles, descriptions and facet labels🧩
Block BI (T811–T813): Deterministic (LLM-independent) ranking for the copilot: superlative / comparative / "sorted by" questions ("cheapest", "highest intelligence index", "biggest context window") now resolve to a numeric sort on the field whose name/description matches the quality, while keeping the facet filter; prompts genericized to any catalog; regression sample. User-facing behaviour folds into the copilot page's "Ranking & superlative questions" sectionvectorless-structured-rag § Ranking & superlative questions🧩
Block BJ (T814–T817): Configurable, per-language ranking vocabulary for the deterministic copilot path: the Block BI word lists became per-language resource bundles tokenised by a Lucene analyzer (inflections collapse by stemming rather than by enumeration), resolved by the request locale with en/pt/es shipped and English as the fallback, extensible deployment-wide via turing.genai.copilot.ranking.lexicon-dir and per site from the SN GenAI form's Ranking vocabulary field — both merged over the shipped bundle. T940–T943 followed: the analysis is memoised per field, the override cache evicts rather than refusing entries, POST /api/system/cache/ranking-lexicons/reload re-reads the directory without a restart, and a Check vocabulary button reports what a bundle added and the sort a sample question resolves to. Folds into the copilot page beside the ranking behaviour it configuresvectorless-structured-rag § Ranking languages · § Teaching Turing your catalog's own ranking words🧩
Block BK (T818–T821): Configurable copilot query-planning strategy, chosen per site (or deployment-wide via turing.genai.copilot.planning.*): DETERMINISTIC (default, today's cheap English-only path) / LLM_ASSISTED (multi-pass parse → audit → refine, understands any language) / HYBRID (deterministic fast-path, escalating to the LLM only on an empty or filter-less result), with a parametrizable analysis depth. Surfaced as the "Copilot Query Planning" card in the SN GenAI admin form, plus a comparative eval (Eval Studio → NL→Facet → Compare planners, POST /api/sn/nl-facet-eval/planning-comparison) that scores every strategy on quality / LLM cost / latency over your own pack, plan-only, so the caveat that Hybrid cannot be distinguished from Deterministic there is documented with it. Folds into the copilot page as a strategy-picking section next to the ranking behaviour it configuresvectorless-structured-rag § Query-planning strategy · § Comparing the strategies🧩
Block BL (T822–T823): Stuff-all at catalog scale: whole-catalog grounding now degrades gracefully as a catalog grows (full description-labelled rows → a ~10× smaller compact projection over sortable/facet fields → filtered retrieval) instead of silently dropping to filtered retrieval, so advisory questions keep working past a few hundred rows; every request logs which retrieval mode it chose and why. Folds into the copilot page's stuff-all sectionvectorless-structured-rag § Stuff-all mode🧩

Automate it

Block / featurePageStatus
AI Agentsai-agents
Block AK: Live Preview prompt diagnostics (flow-aware persona, token/cost metrics, inert-this-turn, cross-segment lint, node picker, replay a real conversation, verbatim capture of any past turn)ai-agents § Live Preview & prompt diagnostics🧩
Tool calling (native + provider-native)tool-calling
Block F.15: capability registry + two-level gatecapabilities
Block W (AG-UI): live tool activity, client tools, generative UIclient-tools
Block X: answer-as-app, co-browse, glass-box, proactive, handoff, skill UIs, action widgetshowcase (opt-in features, demoed)🧩
Custom (Groovy) toolscustom-tools
Block I: MCP client + servermcp-servers
E.3: skills (Anthropic folders, sandbox)skills
E.2: agent workspaceagent-workspace
D.3: slots, chat-flowchat-flow
E.4: human-in-the-loophuman-in-the-loop
Webhookswebhooks
Routines (scheduled agents)routines
D.4: A/B experimentsexperiments
Block K: agent eval / golden setsagent-eval
Block AJ: eval platform: pluggable graders (code/model/human) + datasets + grader stacks + versioning + Eval Studio + calibration/inter-annotator agreement + public eval API/CLI/SDK CI gate (POST /api/eval/run, turing eval --dataset, runEval)agent-eval, cli🧩

Run it

Block / featurePageStatus
Installationinstallation-guide
Configuration (application.yaml)configuration-reference
Block F / F.16: GenAI overview + Gemini native primitivesgenai-llm
Block AD: 11 vendor types, per-vendor authllm-instances
T620: startup LLM auto-provisioning from OPENAI_API_KEYllm-instances🧩
T622: local ONNX embeddings + zero-config local RAG at startup; global Default AI Agent fallback for agentless SN sitesembedding-models § Zero-config local RAG · ai-agents § Default AI Agent🧩
Block AM (T623–T629): HuggingFace embedding provider + provider-aware model picker (LLM-embedding / HuggingFace / manual local) + on-select dimension/reindex warning + ONNX variant/quantization picker + HF-repo-id startup seedingembedding-models § HuggingFace.co · embedding-models § Provider · embedding-models § Zero-config local RAG🧩
Knowledge Base / Assets, pluggable storageassets
Block J: multi-tenancymulti-tenancy
Administration (users, roles, tokens, settings)administration-guide
Block BM (T824): headless admin bootstrap — TURING_ADMIN_PASSWORD really seeds the admin password at startup (minimum 6 characters, applied only while it is unset, never overwriting an existing one), so a docker run / CI deploy opens on the login page instead of the first-access setup screen. Folds into the Login section (both options documented) + the property referenceadministration-guide § Login · configuration-reference § Turing ES Core🧩
Block J (T373, T949): Cloud default config as a GLOBAL seed ZIP — the image ships /app/export/defaults.zip with an embedded Lucene search engine + vector store, imported once on the first startup against an empty database (EXPORT_AUTO_IMPORT marker) and shared by every tenant; a bundle may carry instance configuration with no site at all, and an export never carries an owning tenant id. T949 then made the marker honest: it is written only when every ZIP succeeded, a failed archive is retried on the next startup, and the ones that already imported are recorded so the retry does not replace them. Folds into the Import & Export page beside the archive format it reusesimport-export § Seeding a fresh installation · import-export § When a seed ZIP fails · import-export § Export Contents🧩
Observability, loggingobservability · logging
D.6: chat analytics (sentiment, tool latency, SSE)chat-analytics
Block L: token usage + cost governancetoken-usage · cost-governance

Developers

Block / featurePageStatus
Dev environment, contributingdeveloper-guide
Block S: React SDK (hooks + headless UI)react-sdk
Block S: vanilla @viglet/turing-sdk (zero-dep, EDS)javascript-sdk✅ (T539)
E.7: @viglet/turing-cli (turing command)cli✅ (T539, was 🧩 folded into developer-guide)
@viglet/turing-flow-dsl: flows-as-typed-TSflow-dsl✅ (T539)
Block Y: Atlas Store reference showcaseshowcase
Block Z: client-side conversion analytics / GA4 bridgeconversion-analytics
REST API + GraphQLrest-api · graphql

Security

Block / featurePageStatus
API key + session authsecurity-authentication
Social loginsecurity-social-login
Keycloak OAuth2 / OIDC SSOsecurity-keycloak
Block AN: post-audit security hardening: prod-required crypto key, permissions=true default (authn ≠ admin), chat-analytics auth, dev-token header-only + expiry/revocation, anonymous-chat abuse controls (turing.abuse.*), RAG untrusted-content framing + tool trust boundary, SSRF egress guard, storage traversal/Zip-Slip caps, actuator restriction, MCP client guards (turing.mcp-client.*), MinIO-creds/H2 hardening, frontend XSS sanitisers, dependency-audit CI gatesecurity-hardening · configuration-reference § Abuse Controls

Deliberately internal: no public page (not orphans)

These shipped blocks are engineering, repository, or marketing concerns with no end-user documentation surface. Listed so they're accounted for, not silently missing.

BlockWhy no page
A, B, C: test scaffolding, harness inversion, post-refactor capabilitiesInternal engineering (chat-flow engine internals)
D.1/D.2/D.5/D.7/D.8/D.11, E.1/E.5/E.8/E.9, H.1/H.2Internal engine/DX/SDK-migration work; user-facing slices surface on the pages above
Block P: open-core source split (turingturing-ce)Repository/licensing change; not a product feature
Block Q: viglet-core shared backend platformCross-product internal library (separate repo); no Turing-user surface
Multi-tenancy parity (viglet-core-tenancy)Internal shared-library lift; the Turing-facing feature is multi-tenancy
Block AC: JPA caching strategyInternal architecture (documented in agents.md)
Block O: GEO / LLM discoverabilityMarketing-site + llms.txt concern (turing.viglet.org), not the product docs
Block AB: public site & top-of-funnelMarketing site (turing.viglet.org), separate app
Block AE: this documentation roundMeta: produced the pages in this very matrix
Block AG: Bento admin UI redesign + console retirementUI/design change (frosted-glass admin reskin); no new capability, config, or API, the admin surfaces work the same, only re-skinned. Admin URLs moved /admin/*/bento/* with transparent redirects, so bookmarks/deep-links still resolve. Doc screenshots refreshed opportunistically, not gated here
Block AX (T735–T738): bento header consistency (BentoFormHero hero→sticky-save-bar morph + back-arrow breadcrumb across every own-hero admin form)UI-consistency refactor within the Block AG reskin: the same admin forms, fields, validation and save behavior — only the header/save-bar chrome is now produced by one shared component instead of being hand-wired per page. No new capability, config, API or SDK surface
Block AL: prompt-assembly pipeline (TurPromptContributor SPI, single-pass assembler, STABLE-first cache ordering)Internal architecture: the assembled prompt is byte-identical to before; the observable change is a more faithful admin Live Preview (a fix) plus opt-in turing.prompt.assembly.* cache knobs not yet wired to provider caching
T656: resilient ONNX embedding-model acquisition (TurOnnxModelDownloader: retry/backoff, persistent cache dir, integrity check, actionable diagnostics)Internal reliability: hardens the existing local/HuggingFace ONNX embedding warm-up download (persistent cache survives an ephemeral-env reset + retry + clear error); no new capability or admin/API/SDK surface. The only knobs are ops-level (turing.genai.embedding.local.cache-dir, …download.*), covered by the embedding-models provider docs where relevant
Block AR: live-demo search & chat quality (Lucene parity: similar-documents/MoreLikeThis, spell-check/"did you mean", RAG source dedup, autocomplete hyphen, demo typing indicator)Engine-parity bug fixes: "Similar documents" and "did you mean" already work on Solr/Elasticsearch and are covered by the search docs; Block AR makes the embedded Lucene engine behave the same (/similar + /spell-check endpoints, request/response shape and admin config all unchanged), so there's no new user-facing surface to document
Block BS (T861–T863): the JS SDK release gate (@viglet/turing-sdk declares vitest + its own vitest.config.ts; the 7 red analytics tests were a missing jsdom, fixed per-file so the SSR path stays covered; check-size.mjs guards a committed baseline's delta instead of an absolute ceiling, and validate-js.yml runs build + size + test on PRs)Repository quality gate: nothing in the published package's runtime, API or types changes — the bundle is byte-identical. The only new surface is a maintainer script (pnpm run size:update) and a CI trigger, neither of which a consumer of the SDK ever calls. SDK usage itself is documented in javascript-sdk
T893 + T894 (Block AN): the public faceted search page (/sn/**) is anonymous under Keycloak too, and the anonymous surface is now declared once instead of once per auth branchBug fix + refactor, both invisible to a reader. The search page and its APIs were always meant to be public, and rest-api § Authentication already lists those APIs as needing none — T893 adds the one matcher the SSO branch was missing, so affected deployments stop redirecting a visitor to SSO for a page the docs already describe as public. T894 then replaces the two hand-maintained copies of that ~50-entry list with one shared declaration plus two explicitly-declared branch-only lists (the admin console stays behind SSO on purpose); the effective permitted set is provably unchanged, so nothing observable moved. No new capability, no config key, no API or UI change
Block BD (T764–T770): multi-source model-catalog regeneration pipelineMaintainer tooling: a local, zero-dep Node pipeline (scripts/catalog/, pnpm catalog:regen) that regenerates the bundled models-catalog.json from live vendor APIs + the LiteLLM registry, propose-and-review (--apply only). No product surface: nothing in the admin UI, chat, search, or the API/SDK changes; the additive schema fields (maxOutputTokens/modalities/status/provenance) are optional and only enrich the public catalog reference (contract in docs/references/model-catalog-api.md). Maintainer workflow lives in docs/references/model-catalog-pipeline.md

Orphans

None. Every shipped user-facing subsystem resolves to a page above. If a new block ships without a row here, add it, and if it's user-facing without a page, that's a 🔴 to fix before the block is considered done.