docs-turing Coverage Matrix
Purpose. Every shipped block / feature cluster in the Turing
CHANGELOG.mdmaps 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 / feature | Page | Status |
|---|---|---|
| Search engine (Solr / ES / Lucene), cores | search-engine | ✅ |
| Semantic Navigation sites, facets, spotlights, targeting | semantic-navigation | ✅ |
| Block R: field manifest, schema-as-code, derivation, hybrid ranking, field coverage | manifest | ✅ |
| DSL Query API + compatibility matrix | dsl-query · dsl-compatibility | ✅ |
| SPA / search-template pages | spa-pages | ✅ |
| Connectors (AEM, web crawler) | integration · integration-aem | ✅ |
| Import / export | import-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 mining | synonyms | ✅ |
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 default | rest-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 href | rest-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 catchable | rest-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.data | rest-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 not | configuration-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 suggestions | thesaurus | ✅ |
Ask it
| Block / feature | Page | Status |
|---|---|---|
| RAG pipeline | rag | ✅ |
| Block M: verifiable answers, native citations, citation-drift | rag § Provenance & citations | 🧩 |
| Block AD RAG bridges: managed backends, lanes, fallback, guardrail, second-opinion | rag § Advanced RAG | 🧩 |
| Block N + T521: pluggable & managed rerankers | reranking | ✅ |
| Block AD embeddings: Voyage/Cohere/Mistral, multimodal, contextual, Matryoshka, OCR | embedding-models · embedding-stores | ✅ |
| Chat interface | chat | ✅ |
| E.6 / F.8: chat memory, compaction, context editing | chat-memory | ✅ |
| Intents / conversation starters | intent | ✅ |
| Block AA: speaker + audience personas, content-fit, persona-from-audio, persona-suggest | personas § 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 fallback | transcription | ✅ |
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 boundaries | transcription § 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 engine | personas § 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 CLI | personas § 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 service | personas § 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 bridge | Governed 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 form | llm-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 reference | llm-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 callout | vectorless-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 page | vectorless-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 on | personas § 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 half | vectorless-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" section | vectorless-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 configures | vectorless-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 configures | vectorless-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 section | vectorless-structured-rag § Stuff-all mode | 🧩 |
Automate it
| Block / feature | Page | Status |
|---|---|---|
| AI Agents | ai-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 gate | capabilities | ✅ |
| Block W (AG-UI): live tool activity, client tools, generative UI | client-tools | ✅ |
| Block X: answer-as-app, co-browse, glass-box, proactive, handoff, skill UIs, action widget | showcase (opt-in features, demoed) | 🧩 |
| Custom (Groovy) tools | custom-tools | ✅ |
| Block I: MCP client + server | mcp-servers | ✅ |
| E.3: skills (Anthropic folders, sandbox) | skills | ✅ |
| E.2: agent workspace | agent-workspace | ✅ |
| D.3: slots, chat-flow | chat-flow | ✅ |
| E.4: human-in-the-loop | human-in-the-loop | ✅ |
| Webhooks | webhooks | ✅ |
| Routines (scheduled agents) | routines | ✅ |
| D.4: A/B experiments | experiments | ✅ |
| Block K: agent eval / golden sets | agent-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 / feature | Page | Status |
|---|---|---|
| Installation | installation-guide | ✅ |
Configuration (application.yaml) | configuration-reference | ✅ |
| Block F / F.16: GenAI overview + Gemini native primitives | genai-llm | ✅ |
| Block AD: 11 vendor types, per-vendor auth | llm-instances | ✅ |
T620: startup LLM auto-provisioning from OPENAI_API_KEY | llm-instances | 🧩 |
| T622: local ONNX embeddings + zero-config local RAG at startup; global Default AI Agent fallback for agentless SN sites | embedding-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 seeding | embedding-models § HuggingFace.co · embedding-models § Provider · embedding-models § Zero-config local RAG | 🧩 |
| Knowledge Base / Assets, pluggable storage | assets | ✅ |
| Block J: multi-tenancy | multi-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 reference | administration-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 reuses | import-export § Seeding a fresh installation · import-export § When a seed ZIP fails · import-export § Export Contents | 🧩 |
| Observability, logging | observability · logging | ✅ |
| D.6: chat analytics (sentiment, tool latency, SSE) | chat-analytics | ✅ |
| Block L: token usage + cost governance | token-usage · cost-governance | ✅ |
Developers
| Block / feature | Page | Status |
|---|---|---|
| Dev environment, contributing | developer-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-TS | flow-dsl | ✅ (T539) |
| Block Y: Atlas Store reference showcase | showcase | ✅ |
| Block Z: client-side conversion analytics / GA4 bridge | conversion-analytics | ✅ |
| REST API + GraphQL | rest-api · graphql | ✅ |
Security
| Block / feature | Page | Status |
|---|---|---|
| API key + session auth | security-authentication | ✅ |
| Social login | security-social-login | ✅ |
| Keycloak OAuth2 / OIDC SSO | security-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 gate | security-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.
| Block | Why no page |
|---|---|
| A, B, C: test scaffolding, harness inversion, post-refactor capabilities | Internal 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.2 | Internal engine/DX/SDK-migration work; user-facing slices surface on the pages above |
Block P: open-core source split (turing → turing-ce) | Repository/licensing change; not a product feature |
Block Q: viglet-core shared backend platform | Cross-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 strategy | Internal architecture (documented in agents.md) |
| Block O: GEO / LLM discoverability | Marketing-site + llms.txt concern (turing.viglet.org), not the product docs |
| Block AB: public site & top-of-funnel | Marketing site (turing.viglet.org), separate app |
| Block AE: this documentation round | Meta: produced the pages in this very matrix |
| Block AG: Bento admin UI redesign + console retirement | UI/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 branch | Bug 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 pipeline | Maintainer 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.