nishi code wiki / research / the standard

The brief standard: one document, three audiences

Published · a specification that is also an example of itself

What this solves

The trap is writing the same fact twice. The obvious way to serve humans, AI agents and machines is three renditions of one brief — readable prose, a summary for models, a JSON sidecar. That is sprawl, and worse, the three drift apart the first time a number is corrected in one of them. This standard has one authored artifact and derives everything else from it, so drift is not a discipline problem, it is structurally impossible.

Three findings decided the design, and each removed work rather than adding it [C1] [C2] [C3]. The short version: the machine channel that matters is the visible HTML, not a parallel data format; the one negotiation worth serving is text/markdown; and two widely-recommended artifacts are dead weight we should not build.

The rule: authored once, derived twice

Exactly one artifact is hand-written: the HTML below. Two views are generated from it at publish time by the tool, never by hand — the embedded JSON data island, extracted from the claims table, and a markdown rendition served on Accept: text/markdown. A publish gate proves the derived views equal the extraction; if a human has edited the derived block, the publish refuses.

The placement rule, which is the whole standard in one sentence: a number, URL, date or label appears exactly once — in its claim row. Prose never restates a value; it cites the claim ID. Prose carries narrative and reasoning; the claims table carries every fact; the gaps section carries every declared unknown; lineage lives in the header nav and the JSON-LD.
LayerServesAuthored or derived
Semantic HTML: one h1, unskipped headings, <time datetime>, <th scope>all three — this is the load-bearing machine layerauthored
Prose sectionshumans, and AI reading visible textauthored
Claims table with data-claim rowsall three — the single source of truth for factsauthored
Declared gapsall three — and it is what creates nodes on the family treeauthored
<script type="application/json"> data islandmechanistic consumersderived from the claims table
JSON-LD TechArticle in headsearch and AI crawlersderived from header + lineage
Markdown rendition on Accept: text/markdownagents, at a fraction of the tokensderived at publish

Claims

IDClaimValueLabelSourceSource date
C1llms.txt files are overwhelmingly never fetched by AI crawlers, and Google states it has no ranking effect — so we do not build it97% never fetchedDEPRECATEDorganikpi.com · corroborated by Google statements
C2Edge content negotiation converting HTML to markdown on Accept: text/markdown shipped as a production feature; the token saving on a representative page is roughly fivefold16,180 → 3,150 tokensSHIPPINGCloudflare changelog
C3Third-party LLMs frequently ignore or fail to parse JSON-LD during runtime retrieval and read the visible text instead — so semantic HTML, not structured data, is the primary machine channelqualitative, observationalRESEARCHoptimizegeo.ai
C4Google removed ClaimReview rich-result support, ending Search Console reporting and API support — do not build claim markup expecting a consumerno surviving verified consumerDEPRECATEDPoynter/IFCN
C5MCP tools declare an outputSchema and return conforming structuredContent, which is the mechanism for a machine-checkable publish receiptspec-mandatedSHIPPINGMCP specification
C6MCP tool annotations (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) are the vocabulary clients use for auto-approval; a publish tool is not destructive when it preserves a previous version4 hintsSHIPPINGMCP blog

The skeleton

Copy this shape. The data- attributes are what make the derivation mechanical — without them the extractor would have to parse prose, which is exactly the fragility this design removes.

<article data-brief-id="B-2026-041" data-schema="nishi-brief/1">
  <header>
    <h1>Title</h1>                              <!-- the ONLY h1 -->
    <p>Published <time datetime="2026-08-01">1 Aug 2026</time></p>
    <nav aria-label="Lineage">
      <a href="/code/parent" data-rel="parent">parent</a>
      <a href="/code/child"  data-rel="child">child</a>
    </nav>
  </header>

  <section id="summary">  <!-- prose cites facts by ID: ... beats the baseline [C1] -->
  <section id="analysis"> <!-- reasoning, method, caveats. NEVER restates a number -->

  <section id="claims">   <!-- SINGLE SOURCE OF TRUTH -->
    <tr id="c1" data-claim data-value="9.9" data-unit="x" data-label="SHIPPING">
      <td>C1</td><td>statement</td><td>9.9 x</td><td>SHIPPING</td>
      <td><a href="https://...">source</a></td>
      <td><time datetime="2026-08-01">2026-08-01</time></td>
    </tr>

  <section id="gaps">     <!-- <li data-gap="g1"> ... each becomes a node on the family tree -->
</article>

<!-- DERIVED at publish. Hand-editing this block is a publish-time gate failure. -->
<script type="application/json" id="brief-data">
{"schema":"nishi-brief/1","id":"B-2026-041",
 "lineage":{"parent":"/code/parent","children":["/code/child"]},
 "claims":[{"id":"c1","statement":"...","value":9.9,"unit":"x","label":"SHIPPING",
            "source_url":"https://...","source_date":"2026-08-01"}],
 "gaps":[{"id":"g1","text":"..."}]}
</script>

The publish call

One tool call does the whole thing and refuses loudly rather than half-succeeding. It is annotated destructiveHint:false because the previous version is preserved, and idempotentHint:true because republishing identical input is a verified no-op [C6]. The receipt is structuredContent, so a caller can check the publish landed without trusting a status string [C5].

StepWhat it doesHow it fails
1Validate — one h1; every data-claim row has a statement, a value with units (or an explicit qualitative marker), a label from the fixed set, a source href and a source date; lineage hrefs resolve in the registryrefuses, naming the offending row
2Derive — regenerate the data island and the JSON-LD from the claims table, render the markdown view, hash the final HTMLrefuses if an existing data island disagrees with the extraction, because that means a human edited a derived view
3Upsert registry — one row keyed by path, additive, prior row superseded and never deletedunchanged input is a no-op, not a duplicate
4Publish atomically, preserving the previous versionrolls back
5Regenerate every index from the registry — the index page and the family-tree map — so a hand edit cannot survive the next publishdrift becomes structurally impossible rather than a discipline
6Verify over the real edge — fetch the URL and compare the hash of the served bytes; fetch the negotiated JSON and markdown; confirm the index lists the documentrestores the previous version, regenerates indexes from the prior registry state, and reports rolled_back:true

The same shape extends to sites and apps: the input becomes a manifest of files, step 4 becomes stage-the-tree-then-swap-a-pointer, and step 6 becomes a smoke set that fetches every registered route and hashes each against the manifest.

Declared gaps

  1. None of this is built yet. This page is the specification and its own worked example; the derivation and the publish tool described in the previous section do not exist. Today briefs are hand-written and written straight into the docroot.
  2. The data island and JSON-LD on this page were written by hand, which is precisely what the standard forbids. They are correct as of publication and will drift the moment a claim changes. That is the argument for building step 2, stated against myself.
  3. Whether any major AI retrieval system consumes schema.org lineage fields at runtime in 2026 is UNVERIFIED in both directions. The JSON-LD block is justified only because deriving it costs nothing once step 2 exists.
  4. Our edge's Vary handling has not been tested for correctly cached negotiated variants. Step 6's negotiated fetches must be proven live before anything depends on them.
  5. The existing briefs predate this standard and do not carry claim IDs or data attributes. Retrofitting them is unscheduled work, and until it happens the library is two formats.