docs-shio Coverage Matrix
Purpose. Every shipped block / feature cluster in the Shio
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 R SH479; keep it in sync when a new block ships.Legend: β documented Β· π§© folded into a broader page Β· β οΈ a page exists but describes a shape the product left (worse than missing: a reader is actively misled) Β· π 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.
Why these sections and not Turing's. Shio's primary operator is a coding agent, the curator approves, and the CDA delivers, so the matrix is grouped by who does the job, which since SH482 is also the sidebar: four hubs, each with its own landing page, and every page below files into one of them. β οΈ is a verdict
docs-turing/COVERAGE.mddoes not need: every published Shio page predates the 2026.3 renderer, so "has a page" and "has a correct page" are different questions here.
The agent builds itβ
| Block / feature | Page | Status |
|---|---|---|
Block H: the agent gateway, GET /api/v2/agent/manifest (+ ?section=, the elsewhere map), the context pack /agent/context, /find, /read (fields= projection, id-free reads), the mutation vocabulary, POST /agent/batch, desired-state /agent/plan + /apply, teaching errors (RFC 9457 + fix/allowed/didYouMean/example), SH79 addresses incl. the home form post:<site>/ | agent-surface | β (SH484) |
Block X: what a curator could change β GET /agent/editable reads the fields a curator can edit off the rendered page (the same annotations the Universal Editor uses in the browser), so an agent can tell whether the page it just built is authorable or only correct. source separates "nothing is annotated" from "does not render yet". The rows name an address address like every other endpoint (SH810), and shio_digest's include=editable makes the same answer reachable from an MCP-only client β measured at 24 tokens as a parameter against 146 as a thirteenth tool (SH811) | agent-surface Β§ What a curator could change | β (SH809, SH810, SH811) |
Block Z: the P1 inventory as a worklist β shio_context takes format=agents-md, so the one rendering meant to be written to a file is reachable by the client most likely to have a file to write it to; the inventory had named that gap down to the parameter and its staleness check could not read a target that fine, so shipping the argument left the entry standing and green (SH812). And which of the nine exceptions are gaps and which are decisions is a field rather than a paragraph: the run prints 8 decided and 1 open β contentAsFiles β instead of a total that does not move when the work lands (SH813) | mcp Β§ The tools Β· agent-surface Β§ One call instead of a session | β (SH812) Β· SH813 is a build instrument, the same verdict as the lint rows below: it changes what a contributor may leave unargued, not what a user can do |
Block H: the discovery surface's second half β startHere routing an intent to one call, the context pack's omitted report and per-post published, and teaching refusals on the two surfaces P6 had not reached (a rejected credential, an unknown post-type name) | agent-surface Β§ One call instead of a session Β· Β§ Errors are instructions | β (SH601, SH608, SH553, SH621, SH622) |
Block H: the model's own proposal β PUT /post-type/{name}?dryRun=true costing a model change, and shio propose --from deriving a type from content that already exists | content-modeling Β§ Asking what a model change would cost Β· Β§ Modelling from content you already have | β (SH523, SH525) |
Block H: indexing content published before search was switched on (site.upsert data.reindex), and section fields the Universal Editor can reach on a headless front end | search-caching Β§ Indexing what was already published Β· universal-editor Β§ On your own front end | β (SH413, SH638) |
Block H: MCP server host, POST /mcp (JSON-RPC 2.0, streamable HTTP), the shio_* tools, resources and prompts, the measured tools/list budget | mcp | β (SH481) |
Block J: the Claude Code plugin (claude-plugin/) | mcp Β§ Connecting | π§© (SH481) |
Block I: content as files: the shio/content/** Β· shio/folders/** Β· shio/assets/** projection, sidecars, asset bytes + fingerprints, the per-field three-way merge, movedFrom, the commit-ordered change feed /agent/changes | content-as-files | β (SH486) |
Block I / C / Q: the shio CLI, pull, push (--content, --check, --prune, --accept), apply, verify, report, remember, context, changes, dev --content, build, init --blueprint, snapshot, audit, digest, clone, propose, convert | cli | β (SH487) |
Block J: blueprints: the package format, GET /agent/blueprints, POST /agent/blueprints/{name}/apply, the first-party blog / docs / nextjs-starter set, @viglet/shio-sections | blueprints | β (SH488) |
Block J: the package marketplace: the catalogue and its builtin-only / remote / unreachable source, shio.marketplace.*, install and uninstall over REST, shio marketplace, the shio_marketplace tool, the console page, and the administrator gate on the writes | blueprints Β§ Where more packages come from Β· cli Β· mcp | β (SH646, SH675, SH677, SH678, SH682) |
Block K: the perception loop, content lint /agent/verify (+ scoped runs, accepted findings), route/link proof, render digest /agent/render, /agent/diagnostics, the durable incident feed, visual snapshot + diff, the handoff report | agent-surface Β§ Closing the loop covers verify, render and diagnostics; the incident feed, snapshot diff and handoff report are the CLI half | π§© (SH487 for the CLI half) |
Block K, closing: state= on /agent/read so a draft can be compared with what is live, and shio diff --against published as that pair in one command | agent-surface Β§ Reading Β· cli | β (SH619, SH640) |
Block L: agent safety: the AGENT token scope + session identity, draft-by-default + the publish gate, destructive-op confirm tokens, the review queue, the folder trace/undo, attribution | agent-safety | β (SH485) |
Block M: token economy, measured , response budgets, terse mode, the build-a-site benchmark, the instance memory / conventions store /agent/memory (SH114, SH160, SH161, SH231), the AGENTS.md generator (SH115), conditional agent reads (ETag β SH116, SH159, SH232), the manifest asked for in pieces (SH174) and format=terse cutting each endpoint's purpose to its lead sentence (SH230), leaner delivery JSON (SH127), the proof a write returns (SH157, SH227, SH228), teaching refusals that stay readable (SH513), a derived furl on create (SH651) and a token ceiling on the change feed (SH723) | token-economy | β (SH497) |
Block N: the realignment: one name-keyed post-type surface (the id-keyed /api/v2/post/type twin is gone, SH117), console reads on the CDA shapes, post-type rename as a move (SH163) and shio push performing it as a rename rather than a create-and-delete (SH235), a teaching 409 for a post-type content points at (SH236) | content-modeling Β§ One name-keyed surface Β· rest-api Β§ Post types Β· cli | β (SH495, SH496) |
Block N: the Next.js starter is a blueprint rather than a second mechanism β shio init --blueprint nextjs-starter and create-shio-app emit from one source (SH119), and a package's carried files declare that they are templates (SH166) | blueprints Β· nextjs-starter Β· cli | π§© (SH487, SH488) |
The curator approves itβ
| Block / feature | Page | Status |
|---|---|---|
| Block O: the content console , the browser and its paged listing, the post form built from the post-type, copy/move with both ends authorized and free names, "select everything" across every page and not just the one on screen (SH237), the trash | content-console | β (SH625) |
Block O, closing: duplicating a section stops being console-only β folder.copy names its own copy and may cross sites, and a copy carries its files' bytes rather than pointing at the original's, driven against a running instance rather than asserted from a reading (SH748) | agent-surface Β§ Writing Β· content-console Β§ Copying a folder copies its files | β (SH244, SH749) |
Block E: the React console's own surfaces, dashboard, Media Library, static-file manager, webhooks UI, and the config/ pages (auth providers, exchange providers, email/SMTP, search) | administration-guide, rewritten against the React console Β· the Media Library is one screen with the static-file manager and is documented where a curator meets it, content-console Β§ The Media Library | β (SH623) |
| Users, groups, roles, site properties, and SH54 content-level ACL (folder/post grants, inherited, default-allow) | administration-guide Β§ Permissions | π§© |
| Block C: the curator's lifecycle tools, SH13 short-lived preview tokens + console preview, SH14 draftβpublished diff + restore, SH15 scheduled publish/unpublish, SH51 audit history + Activity viewer, SH55 trash / restore (and the two refusals a restore can meet: a URL a live post took, SH243, and a title it took, SH691) | content-lifecycle Β· the audit trail at administration-guide Β§ Activity and the trash at content-console Β§ The trash, both linked from it | β (SH624) |
Block P / 0: the Universal Editor: the annotated render, the sh:* bridge, the iframe states, the save-back (and the auth it always claimed, SH233) | universal-editor | β (SH489) |
The visible siteβ
| Block / feature | Page | Status |
|---|---|---|
Block P: the renderer, Page β PageLayout β Region, Theme, Handlebars templates and helpers, the section vocabulary, data-shio-*, /preview/** and the /sites/** delivery grammar | website-development | β (SH483) |
Block P / Q: the rest of the visible site, DTCG theme tokens, Site Scripts, the {{#image}} helper's intrinsic size + signed srcset, Redirect posts, Menu/MenuItem, post.locale + {{#translations}}, the paged/sorted {{#query}} | design-tokens Β· website-development Β§ Themes and design tokens Β· Β§ Third-party scripts Β· Β§ Redirects Β· Β§ Menus and translations Β· Β§ Paging a listing | β (SH483, SH420) |
Block P: form submissions β {{#form}} rendering a post type's fields, the per-site destination (POST /api/v2/site-form: folder, invited types, enabled), the FORM token scope, POST /api/v2/cda/form/{site} writing one DRAFT post, the honeypot, and the system-type refusal | website-development Β§ Forms | β (SH633) |
Block P: {{#query}}'s pager β @page/@pages/@total/@hasPrev/@hasNext/@index/@last, drawing a pager once with {{#if @last}}, and a listing nested in a listing keeping its own position | website-development Β§ Paging a listing | β (SH420) |
Block P: verify's dangling-relation, and the PageLayout opt-out from site-scripts-dropped | website-development Β§ Proving it renders Β· Β§ Third-party scripts | β (SH421, SH572) |
shio audit's rules: the eleven checks (overflow, contrast, zero-size, collapsed, font-fallback, request-failed, console-error, no-landmark, no-heading, the shape line, region-script) and what each means | cli Β§ What shio audit reports β a row per rule with what fires it and what to do, plus the two always-printed lines. docs-vocabulary reads AUDIT_RULES and fails when a rule this page does not name is added | β (SH652) |
Block Q: replication, shio clone (--assets, --render, --scripts, --refresh), shio propose, shio convert, fidelity vs authorable mode, snapshot --against, the replication check group β and the block's closing round on what a replica looks like: SH831 (the theme an authorable replica is presented with takes its six colours from the captured palette, matched by the role the source uses each one in, with every unfilled one named in the run) and SH832 (an empty row in a collection draws an empty card instead of its section's own words) | replication, incl. Β§ The theme an authorable replica is presented with Β· Β§ Re-capturing without paying for it again | β (SH492, SH611, SH831) |
Block F (SH25 epic): static files and image transforms: the file_source upload/serve subsystem, ?w=&h=&format=&crop= on the delivery path, the resize/crop pipeline, webp/avif negotiation, the result cache + ETag, limits and signed URLs | the author's half at website-development Β§ Static files and images; the operator's half β the result cache and why its key is its own invalidation, the dimension/format/decode-bomb ceilings, and signed transform URLs β at search-caching Β§ Image transforms | β (SH629) |
The CDA delivers itβ
| Block / feature | Page | Status |
|---|---|---|
Block 0 + A: the CDA read contract /api/v2/cda/**, token scopes + per-site keys, per-environment (prod/preview) keys, rate limiting + cache headers, the real GraphQL delivery schema | content-delivery-api Β· graphql | β |
Block A/B: @viglet/shio-client (framework-agnostic TS core) | javascript-client | β |
Block B: @viglet/shio-react-sdk (hooks + render components) | react-sdk | β |
Block B: create-shio-app: the Next.js starter, SSG/ISR/SSR recipes, Draft Mode preview, on-demand revalidation | nextjs-starter | β |
Block B (SH11): TypeScript type generation from post-types , GET /api/v2/cda/post-type, generateShioTypes, the shio-types CLI | content-modeling Β§ Generated TypeScript for a front end Β· cli | π§© (SH496) |
Block B (SH62 epic): post-types as code , @viglet/shio-model DSL, the CLI compile step, push --check drift guard, the console "managed by code" lock | content-modeling Β§ Authoring in TypeScript Β· Β§ Managed by code | β (SH496) |
| Block C (SH12): outbound webhooks on publish/unpublish/delete, per-site subscriptions, the signed payload | webhooks β subscription, payload, HMAC verification, and the delivery guarantees (no ordering, no exactly-once, no DLQ) written down as answers rather than omissions | β (SH626) |
| Block C (SH52 / SH240): content full-text search: the in-DB index, the CDA search endpoint, the console search box | search-caching Β§ Full-text search | β (SH494) |
Block C (SH53): content i18n , the locale axis, linked translations, CDA ?locale, the checked locale segment | content-i18n, with the URL half pointed at from website-development Β§ Public delivery and the modelling half from content-modeling | β (SH627) |
| Block G: content portability: the exchange package format (SH68), site export β zip, site import / clone, the default bootstrap-site template | import-export (predates SH68's format and SH71's template) | π§© |
Run itβ
| Block / feature | Page | Status |
|---|---|---|
| Installation, Docker, JAR, source, databases, Linux service | installation-guide | β |
Block N: first start without a person at the console β SHIO_ADMIN_PASSWORD / shio.admin.password setting the admin password at startup (SH706), the seeded admin actually carrying ROLE_ADMIN so the console stops answering 403 to its own administrator (SH681), and --server.port=8099 being honoured on the command line instead of silently coming up on 2710 (SH680) | installation-guide Β§ Setting the admin password without the console Β· Β§ Accessing the Shio Console Β· configuration-reference Β§ The instance | β (SH706, SH680) |
Configuration (application.properties) | configuration-reference | β (SH495) |
Block F (SH22): multi-tenancy / SaaS, @TenantId isolation, provisioning, membership, quota, suspension, per-tenant file_source storage so two tenants never share bytes for one file id (SH47), a single-tenant install not advertising the tenant admin (SH46), and the per-tenant storage meter behind the plan's byte limit (SH746), moved by the storage layer itself so an upload actually changes it (SH751), with the ceiling itself now enforced on the DELTA rather than the total β one upload larger than the whole plan used to pass whenever the tenant was at zero, and a section copy creating N posts was charged for one (SH110, SH750), plus the API-call meter beside it β a flow rather than a level, so one row per tenant per UTC day per surface, with a ShBillingExporter hook for a closed day (SH45) and the same figures readable by the agent the meter counts, as shio://usage and ?include=usage (SH754) | multi-tenancy | β (SH493) |
| Turing ES indexing, opt-in, reached only on publish | search-caching Β§ Viglet Turing ES indexing | β (SH494) |
| Architecture, components, request flow, deployment topologies | architecture-overview | β (SH491) |
| The introduction a newcomer meets first | intro Β· core-concepts | β (SH490) |
| The landing page | index | β (SH480) |
| Developer environment, tech stack, contributing | developer-guide, rewritten: the six surfaces, the real stack, the build and test commands, and the ten design laws a contribution is judged by | β
(SH628 β and the stack table is now checked against this repo's build files by cli/conformance/docs-stack.conformance.mjs, so a version that drifts fails a build instead of misleading a reader) |
Developers (reference)β
| Block / feature | Page | Status |
|---|---|---|
Console REST API, including the refusal a site create meets when it declares a furl a live site already answers at β kept as given rather than numbered, so the link the caller is about to send still resolves (SH744) | rest-api | β (SH495) |
| Content modelling + the delivery SDK story | content-modeling Β· the headless/ pages | β (SH496) |
Securityβ
| Block / feature | Page | Status |
|---|---|---|
| Authentication, authorization, CSRF, CORS, HTTP firewall, password encoding | security | β (SH495) |
The AGENT token scope, session identity and the Universal Editor's save-back
auth (SH106, SH233) are the Block L row in The agent builds it, counted
there, not twice.
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 |
|---|---|
Infra: the pnpm workspace (root package.json, pnpm-workspace.yaml, frontend-maven-plugin on pnpm) | Repository build wiring; nothing a consumer of Shio calls |
Block E: SH20 (Thymeleaf rendering removed), SH21 (the AngularJS resources/ui/ tree deleted), SH60 (legacy commerce/recaptcha widgets deprecated, not ported) | Removals of surfaces that were never documented; the replacement console is the row above |
The lints and invariant guards: SH245 (one writer per content verb), SH26 (cross-DB schema drift), SH122 (@TenantId JOINED-join), SH128 (ShFolderSite), SH136 (byte stability), SH158, SH197, SH403, SH408βSH412, SH435 (help/flags), SH458, plus ShIdeCompiledClassLintTest, ShAgentP1ConformanceTest, ShStatelessReachabilityLintTest | Build-time instruments. They change what a contributor may write, not what a user can do; agents.md and docs/agents/** are their home |
| The benchmarks and suite health: SH112 (task benchmark), SH113 (response budgets, as a test), SH164, SH198, SH239, SH246, SH440/SH445 (CLI exit paths), SH444 (root devDependencies), and Block M's measurement half β SH229 (a lint over every conditional endpoint's params), SH394 (the CLI help's three ceilings), SH396 (the build-a-site benchmark ends at a rendered page), SH597/SH683 (discovery cost scored per intent, then re-measured), SH647 (the vocabulary's cost split into keys and prose), SH673 (one constant, followed rather than copied), SH736/SH743 (a gate at its ceiling refuses instead of measuring, so both now assert headroom) | Internal measurement and CI hygiene. The user-facing half of the token work is the Block M row above, which is an orphan |
Block V, the vocabulary proved against a running instance: SH707 (the count first β which of the agent's verbs any live suite had ever called, and it was two of twelve), SH708 and SH709 (the read and write tools driven over the wire), SH711 (ten CLI verbs spawned as processes, which is the only shape that exercises argv parsing and the exit code CI reads), SH712 (the vocabulary out of order, plus a seeded permutation), SH713/SH719/SH720 (two agents and a curator writing at once, and the unique index that makes one address mean one post), SH714/SH722/SH723 (what every tool costs live, and whether it answers twice the same), SH724/SH725/SH726/SH717/SH718 (the fixtures and refusals those runs corrected), SH748 (folder.copy driven live rather than asserted from a reading), SH755 (the declared red compared against what the gates actually reported), SH756, SH757, SH759, SH760 (the coverage matrix could not ask about MCP resources at all, so it reported full coverage of three populations while a fourth sat at zero) and SH761 (the API-call meter counted nothing on every default install, which only a live run could say) and SH762 (a race test that looped for a duplicate SH719 had made unreachable, so it discarded the contention it found on the first attempt and asserted against the last) | A test tier. Every row above documents what a reader can do; this block documents whether the product really does it when a real instance is asked, which changes nothing a reader types. It earns a row rather than a silence because an absent row is indistinguishable from a forgotten one β the defect this matrix exists to make visible β and it is the largest block ever closed here with no public surface at all |
cli/conformance/ (SH448) and the shio-replication-test judging skill | A maintainer harness for judging a replication run against a live instance; the user-facing verbs it drives are the CLI + replication rows above |
Block N's internal halves: SH120 (console reads adopt CDA shapes), SH162 (SDK type mirror), SH165 (paged listing), SH167/SH234 (CSRF narrowing), SH177 (schemaJson retired) | Behaviour-preserving realignments; where one is observable it is folded into the rows above |
Block N's second half, the instruments and repo hygiene it closed on: SH541 (one licence across 195 files), SH645 (pnpm test keeps its log), SH649 (reserved_ids), SH655 (docs instruments in CI), SH656/SH657/SH660/SH666 (a lint landing before its fixes, four times), SH662/SH668 (ledger and rationale readers), SH664/SH667 (the editor drive, and --strict so a skip is a failure), SH665 (the console lint loads again) | Build-time instruments and repository hygiene, the same verdict as the lints row above: they change what a contributor may write. Two had a user-visible edge and it is recorded rather than assumed β SH541's licence is the Apache 2.0 pill on index and is now derived from package.json + LICENSE by docs-stack (SH669), and SH660's widget fix restores what content-console already describes |
Block N's third wave, where the thing that was wrong was an instrument rather than a feature: SH238 (the Universal Editor's one load-bearing fact checked in a real browser), SH659 (the docs drive publishes), SH663 (the property extractor reads Markdown tables), SH672 (a floor is classified by what it counts, so an absolute one over a corpus meant to empty is refused), SH735 (a red pnpm test log survives the green re-run), SH729 (a constraint declared only in Liquibase is invisible to a suite that runs with Liquibase off), SH731 (citing a task id in an assertion message no longer pays that task's debt β a reference is spelled see SHnnn), SH737 (a vacuity floor pinned near the count it watches, asserted as the yes/no it is), SH738 (the floor classifier could not see the Java half of the repository, which is where the floor it exists to refuse actually lived), SH739 (the block-completion checklist called the README's counts underived when a suite has derived them since SH499, and sent a sweep off to rebuild it), SH740 (SH613's code-vs-prose rule stopped at the language boundary β the JS scans now declare what they read, against one shared stripper), SH741 (the tolerated-floor list was the sixth ledger of knowingly-accepted wrongness and had never joined the registry that asserts their count, so it carried none of the staleness checks the other five get), SH742 (that declaration lint found its own population by naming convention and so could not see the three readers that scan these very pages), SH745 (the ledger and the suite can disagree in two directions and only one was read β the unread one had hidden a shipped, tested task on the backlog for blocks), SH753 (a resolver that threw on a duplicate row is deleted rather than documented, so the compiler enforces the one that tolerates β and the duplication it used to crash on is reported at boot instead of resolved in silence), SH755 (the red-suite ledger is a CLAIM and nothing compared it to what the gates answered: each gate now leaves a stamp, and both directions of disagreement fail β a red with no entry, and an entry whose gate went green), SH756 (an I/O failure carries its exception class and the platform's reason, because a FileSystemException's message is its two paths and the class was the last remaining fact), SH757 (two conformance tests were still pinning defects that had shipped, so the gate was red for the repairs rather than for the damage), SH764 (the staleness gate is about the JVM, so a documentation commit stops cancelling a conformance run over two minutes of wall clock), SH765 (the region table names the sheet that paints each region, so a replica presenting two visual languages reads in one glance), SH768 (a post-type can be declared disposable at creation and swept afterwards, so a suite stops leaving a model behind), SH769 (every standing claim that a capability is absent is signed with one sentence naming what would falsify it β the broad rule was measured at 38 mostly-true hits and rejected), SH770 (a gate stamp taken against another commit is reported as what it is rather than read as this tree's colour, in both directions), SH771 (the coverage ratchet's refusal names both repositories, because the commit it used to prescribe cannot exist), SH773 (a shipped vocabulary type whose live copy lost its references: post key is a finding rather than three readers going quiet) and SH774 (the composition banner reads the rendered page, so a replica whose kept markup is all in sections stops reporting itself as fully authorable), SH775 (the reader-facing pages say a page is usually mixed, and a gate fails when a shipped section type is named nowhere a reader looks), SH779 (the report line bounding a per-run stylesheet is asserted on the only page shape that takes two copies), SH781 (a partial ship keeps the red-suite exception its still-open task needs, because the roadmap decides and the changelog only confirms), SH782 (a regex built from a template literal cannot spell an escape the string eats β it opened at two, one of them a negative assertion passing for the wrong reason) and SH783 (the build doc says a locked jar is a running instance, and that a failed clean ran nothing at all) | Build-time instruments and their own correctness, the same verdict as the lints row above. Worth naming rather than folding in: every one of these was a case where a check was quietly wrong instead of loudly broken, which is the failure shape that leaves a green build meaning nothing. None changes what a user can do. SH739 is the one with a reader-facing edge and it points inward too β the document it corrects is .claude/skills/, read by an agent maintaining Shio rather than by anyone using it |
Block W's instrument round, twelve consecutive cases of a check being wrong in a way that reads as diligence: SH785 (a ledger reader searched for a closing bracket, found a later one, and reported 144 entries for a list of 120 β the instrument computing that same list printed 120 forty lines earlier in the same log), SH786 (so the replacement matches the bracket instead, on a mask where comment lines and quoted spans are blanked: AT_THE_WALL's reasons carry eleven pairs of parentheses inside Java strings and the count had been right because all eleven balanced), SH787 (a fixture id that is a real task id is a payment to the debt walk β six ids in four files sat 112 tasks from arriving pre-paid, so SH9000+ is reserved and asserted from both ends), SH788 (a pipeline exits with its last command's status, so the documented `β¦ | tee |
The fixture-traits flake, provoked rather than waited for: SH778 (a file-level red with every assertion in it green, and nothing kept enough to say why β it had gone some hundred and twenty runs without recurring, and the honest cure was to stop waiting: forty full runs at --test-concurrency=16 reproduced it on the first, and the kept run names Assertion failed: !(handle->flags & UV_HANDLE_CLOSING) β libuv aborting the process, which is also why the exit instrument never fired, since an abort skips process.on("exit")) and SH780 (the diagnosis and an idempotent teardown; the cure is a measured trade left open, because dropping --test-force-exit removes the abort and costs 12.6 s on every run of the gate that runs most often) | A test fixture's teardown and the JS gate's own flags. Nothing a reader of Shio can do differs β but the method is the part worth having written down, and it lives in docs/agents/build.md: a flake that will not appear on demand is not only diagnosed by what a failing run keeps, it is summoned by repeating the suite at a concurrency the ordinary gate does not use |
Block Q's capture internals: scanPage block detection, token collision, CSS lifting, asset classification (SH424βSH432, SH449, SH452, SH455βSH456, SH461, SH465βSH477), and the round that made a mixed page composable rather than merely captured β SH763 (verbatim markup is a section type, so kept markup lands in the page's own sections list wherever it stood and no conversion writes a field the model does not declare), SH766 (a mixed page declares its own title, so a curator can edit the one field the captured <h1> was rendering for it) and SH767 (a post: address in a relation field resolves to the URL the field stores, instead of being kept verbatim and resolving to nothing) and SH772 (a page whose kept markup is all in sections still receives the source's own stylesheet, which content alone had stopped answering for), and SH777 (a relation's rows carry @index, @first and @last, so a template can put a separator between sections and not after the last, size the first one differently, or emit a page-wide fact once), and the three the block closed on β SH829 (SH765's region table names the Theme post painting each region instead of style[1]/style[2], so the column added to end a lookup stops ending in one; a sheet no post owns keeps its index, which is the difference between one somebody can edit and one nobody can), SH830 (the generated layout carries the branches the conversion's own types declare, so a replication onto an empty instance stops ending with verify warnings against the file convert wrote seconds earlier β a warning nobody can act on is what teaches a reader to stop reading warnings) and SH833 (the source corpus produces all seven section types: each of the three it was missing was a fixture that plainly meant to exercise the type and did not clear a deliberate classify bar, and a check now names any type that loses its last producer) | Fidelity mechanics of clone/convert. The user-facing surface is the three verbs and the two modes, documented as one row β and the three SH76x entries change what a curator can do with a replica, which the replication page states as the mixedβauthorable path rather than as mechanics. The three closing ids are the same verdict one level along: SH829 is the agent's digest, SH830 and SH833 are the conversion's own instruments, and the thing a reader can now do differently is SH831's, recorded on the visible-site row |
| Block P's engine internals: the template graph, the render cache, the section registry | Renderer architecture (docs/agents/renderer.md); the authorable vocabulary is the user-facing half |
| Block R: this documentation round: the coverage gate (SH479), the four sidebar hubs (SH482), the pages the rest of the block files into them, and the two instruments that execute their examples (SH499) | Meta: it produced the pages in this very matrix. The hubs are navigation, so they change no verdict below; they are where a π΄ becomes a page. SH499 closed the block by making these pages checkable: cli/conformance/docs-vocabulary.conformance.mjs holds every shio verb, REST path, shio_* tool and shio.* key written here against what the product declares, and docs-examples.conformance.mjs issues the read-only requests against a running instance β so a renamed verb or a moved endpoint fails a Shio build instead of misleading a reader here |
| Blocks T and U, the documentation's own instruments and upkeep: SH674 (the extractor's fence regex had stopped matching, so the pages published unchecked), SH697 (the tool table read on SH663's narrow rule, with the stated count derived), SH698 (a conformance teardown that names the server, the deadline and the open sockets instead of hanging), SH700 (the gate reads the docs repo at origin, not a local working copy), SH715 (the redirect plugin, so a moved hub does not break a published link), SH747 (a ratchet: the count of shipped ids this matrix does not name may fall and may not rise), SH752 (a block heading standing over no open task fails the run, so a block that empties is closed rather than left as a heading nobody removes), SH758 (this matrix lives in another repository from the ships it tracks, so a mirror of the ids it names is generated into the Shio tree and the gate there reports, minutes after a ship, what has not been named yet β the ratchet stays the enforcement and only the moment of discovery moves), SH759 (a window closing is a fact about time, so the session guard takes a Clock and its test moves an hour rather than setting the window to a nanosecond and hoping the machine's clock ticked between two adjacent reads) | Instruments over this very matrix and the pages around it. They change what a contributor may publish, not what a reader can do β the pages themselves are the rows above |
Block S: the public site at shio.viglet.org (SH530 and the Block S backlog), its shio-site/ app, prerender and Pages deploy | Marketing, and it is the entrance to this documentation rather than part of it. Every claim it makes is a page here or in docs/agents/**, so a row of its own would duplicate a verdict already recorded above; what it owes those pages is a correct link, not coverage |
Orphansβ
Of 54 clusters, none is undocumented: no π΄ orphan and no β οΈ page. 54 are covered (48 β , 6 π§©).
This sentence is derived, and a check fails when it drifts (SH653). Every figure in it used to be typed, and it drifted in the direction that hides work: the
shio auditrow was π΄ in the tables from the day this file shipped and absent from this count for just as long, so the one number anybody scans said the product was better documented than it was. A cluster is one table row β the unit that already carries its own verdict. The alternative, one row per block label, comes to 33 and would need an aggregation rule nobody has written, sinceBlock Hspans five rows andBlock Ktwo with different verdicts. Neither reproduced the 42 this summary used to claim.cli/conformance/docs-coverage.conformance.mjsrecomputes it from the tables above and prints the sentence to write when the two disagree.
Block T is the block that closes these. It exists because the list below is what Block R's own audit found and no Block R task named β the curator's half. Each task in it flips exactly one row, and this count moves with it.
Block R took this from 33 wrong of 40 to 7. What is left is what the block's own tasks never named, which is the finding the matrix existed to produce:
- 0 π΄, none now live:
the content console itself (Block O)β closed by SH625, content-console Β·the console's own curator surfaces (Block E: dashboard, Media Library, static-file manager, webhooks UI, theβ closed by SH623, which rewrote administration-guide against the React console Β·config/pages)the curator's lifecycle tools (SH13βSH15, SH51, SH55: preview tokens, version diff and restore, scheduled publish, the activity view)β closed by SH624, content-lifecycle Β·outbound webhooks (SH12)β closed by SH626, webhooks Β·content i18n (SH53)β closed by SH627, content-i18n Β·β closed by SH652, cli Β§ Whatshio audit's eleven rules, which the table listed as an orphan since this file shipped and this summary did not countshio auditreports, which landed the instrument with the prose:docs-vocabularyreadsAUDIT_RULESand fails on a rule this page does not name, which is the direction none of the other checks ask. - 0 β οΈ:
the developer guide still lists Elasticsearch 9.3.3 in its stack and names no agent surface or CLIβ closed by SH628, which rewrote it and landed the instrument first:cli/conformance/docs-stack.conformance.mjsderives every stated Java / Spring Boot / Node / pnpm version from this repo's build files and refuses a retired dependency presented as part of the stack. Also unclosed: the transform cache, the dimension and format limits and the signed-URL configuration are the operational half of the SH25 image epic, folded into the render page but not documented as operations.β closed by SH629. This entry is why the block exists in the shape it does: the row scored π§© rather than π΄, and a partially-covered row does not read as an orphan in a scan.
Every item above is worth a task. Four of them are curator-facing, which is the half this block reached last: the agent's surface is now the best-documented part of the product and the console is the least.
This file lands red on purpose: it is the audit that scopes Block R, and the count above is the number the block is measured by. When a new block ships, add its row here, and if it is user-facing without a page, that π΄ is a defect to fix before the block is considered done.
Block R is complete, and what it leftβ
Block R's last task shipped on 2026-08-09 and the block is withdrawn from Shio's roadmap. It ends at 6 wrong of 40, from 33 β and the six are the finding, not the remainder of the work: every one is a cluster no Block R task ever named, which is why they survived a block that fixed twenty-seven others. They are now filed as Shio tasks of their own rather than left in this file's prose, because a gap recorded only in an audit is one nobody is assigned.
One thing changed about how these pages are maintained, and it is the reason the block could be called done. Until SH499 nothing here was ever executed, which is precisely how the pre-2026.3 pages came to describe a product that had moved: written once, never compared. Two instruments now compare them on every Shio conformance run β the names (verbs, routes, tool names, configuration keys, read from the product's own declarations) and the requests (the read-only invocations, issued against a live instance). A count comes with them: 57 executable blocks over 18 pages, 65 assertable subjects.
So the rule for the next round is stronger than "add a row". A page that publishes a command, an endpoint or a configuration key is now making a claim a build can falsify. Write the example so it can be run.