The machine surface is bound to its sources, and petrova.codes is where artefacts live
Date: 2026-08-10
Status: open
Supersedes: none
Extends: docs/decisions/2026-08-06-landing-band-bound-to-canonical-sources.md — same ruling, applied to /llms.txt and /llms-full.txt
Superseded-by: none — current
Context
Section titled “Context”An external audit of petrova.blog/llms.txt and /llms-full.txt returned seven
gaps. Verified against the live surfaces on 2026-08-10, all seven hold, and
three further defects were found that the audit did not report. What matters
more than the individual defects is that every one of them is the same defect
the 2026-08-06 landing-band decision already ruled on, in a file that never
received the ruling.
That decision said it plainly: the band drifted “because it was three string
literals in the template below”, and each cell is now “read from the thing it
describes, at prebuild”, with a missing source throwing rather than falling back.
site/src/pages/llms.txt.ts is built the other way round — a 55-line
hand-maintained SKILLS array and a SECTIONS array whose descriptions carry
hand-typed counts. It drifted exactly as predicted.
Verified defects
Section titled “Verified defects”| # | Defect | Evidence (live, 2026-08-10) |
|---|---|---|
| 1 | All 11 skill links are dead. SKILLS[].gist holds a bare repo path, not a URL, and is emitted as the href. Markdown resolves it relative to the page. | https://petrova.blog/v01t-io/meta-protocols/artefacts/petrova-act-skill.md → 404 |
| 2 | The verb count is stated three ways in one file. | llms.txt L74 “16”, L78 “the 9-verb action surface”, L98 “The 18 control-plane verbs” |
| 3 | The MR range is stale. | Preamble says “MR-1 through MR-12”; core/playbook/META-RULES.md defines 17 |
| 4 | petrova-mr-audit advertises that it skips five rules. | skills/petrova-mr-audit/SKILL.md description: “audit any repo against MR-1 through MR-12” — served verbatim by petrova.codes/llms.txt |
| 5 | llms-full.txt misstates its own size by 2.7×. | Claims “~50k words”; actual 134,778 words / 1.07 MB |
| 6 | Neither file states its freshness. | Zero generation timestamps or source SHAs in 53,857 bytes |
Defects 1, 5 and 6 were not in the audit. Defect 1 is the most consequential on the list and the audit ranked its symptom P3, having assumed the links resolved to a private host; there is no host in the string at all. It sits in the first section of the file, captioned “drop-in, agent-actionable” — the section an agent is most likely to act on.
Defect 3 needs no ruling, contrary to the audit’s §11.4. The 2026-08-06 decision
already counted 17 ## MR-N headings in the canonical source and bound the
landing band to that count. llms.txt is not an open question; it is out of
compliance with a closed decision.
Decision
Section titled “Decision”1. Every fact on the machine surface is read from its source at build time
Section titled “1. Every fact on the machine surface is read from its source at build time”The same rule, the same failure mode, the same remedy as 2026-08-06. No literal
on /llms.txt or /llms-full.txt may state a count, a range, a size, or a URL
that some file in this repo already knows.
Bound this way:
| Fact | Source |
|---|---|
| MR range | ## MR-N headings in core/playbook/META-RULES.md — the same regex bandCells() uses |
| Verb counts | spec/verbs/*.schema.json (excluding _common), classified by each schema’s own side_effects field |
| Skill catalogue | skills/petrova-*/SKILL.md frontmatter |
| Governed repos | registry.yaml |
llms-full.txt size | counted from the corpus actually emitted |
| Freshness | git log -1 commit date and SHA |
A missing or unparseable source throws. Carried over verbatim from 2026-08-06, for the reason given there: quietly substituting a stale constant is the defect being removed, and a red build is the honest signal.
The verb-count binding is the one that repays most. side_effects is already
written in each schema by its author, so “how many verbs, and how many mutate”
stops being a number anyone maintains. It becomes an observation.
2. petrova.codes is the artefact host; petrova.blog links to it
Section titled “2. petrova.codes is the artefact host; petrova.blog links to it”The audit’s §11.7 asks for this and the surface already exists —
petrova.codes/llms.txt returns 200 and serves canonical
https://petrova.codes/skills/<name> URLs for all 11 skills, plus prompts and
schemas. Defect 1 is therefore fixed by pointing at something already published,
not by publishing something new.
The split is by kind, not by convenience:
petrova.blog— the methodology corpus: prose, decisions, meta-rules, and thellms.txtindex over them. What an agent reads to understand the law.petrova.codes— the artefact registry: skills, prompts, verb schemas, and the Wave 1 machine artefacts below. What an agent fetches to act.
An agent needing both needs two base URLs. That is accepted, and it is why each
surface’s llms.txt must link to the other explicitly rather than leaving the
second to be guessed.
3. Wave 1 artefacts are placed now, built later
Section titled “3. Wave 1 artefacts are placed now, built later”Placement is decided here so the Wave 0 pointers are written once:
petrova.codes/verbs/index.json— generated fromspec/verbs/. Artefact, not prose; it belongs with the schemas it indexes.petrova.codes/errors.json— refusal codes. Blocked on a per-code retry-safety ruling, which is a decision doc of its own; the audit is right that this must not be reasoned about at runtime.petrova.blog/llms-preamble.txt— the governance law an agent operates under. Prose, and load-bearing prose; it belongs with the corpus. Unblocked by §1 above, since the MR range it must state is now derived rather than ruled.
This decision ships Wave 0 only — the six verified defects, all of which are
false statements the surface makes today. Wave 1 (verbs/index.json,
errors.json, llms-preamble.txt) and the audit’s §11.5 worked phase cycle are
placed here and built separately.
Deliberately not done:
- The audit’s §11.5 — a worked phase cycle from open to close. Curation, no dependencies, no ruling needed.
errors.json’s retry-safety column. Needs its own doc.- Skill frontmatter beyond what exists. Wave 0 reads what
SKILL.mdfiles already carry; enriching them is separate work.
Consequences
Section titled “Consequences”- The
SKILLSarray, the hand-typed counts, and the size claim are deleted, not corrected. A corrected literal drifts again on the next change; that is the entire lesson of 2026-08-06. - A site build now requires
core/playbook/META-RULES.md,spec/verbs/,skills/, andregistry.yamlto be readable. All are in-tree. The build fails loudly if any is not, by design. petrova.codesbecomes load-bearing forpetrova.blog’s usefulness: if the skills surface moves,llms.txt’s first section 404s again. Mitigated by deriving the URLs from one constant rather than eleven strings, so a move is a one-line change with a visible diff.- Defect 4 is fixed in
skills/petrova-mr-audit/SKILL.md, which propagates topetrova.codes/llms.txton its next build. That file is the skill’s own description; the fix is a content edit, not a binding. - Agents that previously followed the skill links got a 404 and, per the preamble’s own instructions, no capability. No silent wrong behaviour resulted — the links failed closed. That is luck, not design.
Alternatives considered
Section titled “Alternatives considered”- Correct the literals and leave the structure. Cheapest, and it restores the surface to correct-as-of-today. Rejected on precedent: this is exactly what the band had before 2026-08-06, and it drifted within three months.
- Publish everything under
petrova.blogand droppetrova.codes. One base URL for an agent. Rejected —petrova.codesalready serves a working machine registry with schemas and prompts, and the two surfaces have different audiences and different dialects (seeDESIGN.md). - Generate
llms.txtfrom the Astro content collection alone. Would remove the filesystem reads. Rejected: only 2 of 11 skills are projected intosite/src/content/docs/skills/, so the collection cannot see the catalogue it needs to index. - Do nothing until Wave 1 lands. Rejected — the surface is telling an agent six false things today, and Wave 1’s artefacts would inherit the same strings.
References
Section titled “References”docs/decisions/2026-08-06-landing-band-bound-to-canonical-sources.md— the ruling this extendsdocs/specs/2026-08-05-petrova-apex-domain-topology.md§4–§5site/scripts/pull-content.tsbandCells()— the binding pattern reusedsite/src/pages/llms.txt.ts,site/src/pages/llms-full.txt.ts- External audit §11.1–§11.7 (2026-08-10)
Sign-off
Section titled “Sign-off”- Subagent: Claude Opus 5 (this session, 2026-08-10)
- Human: pending
- Human countersign — that the machine surface is bound to its sources on the
2026-08-06 pattern, that
petrova.codesis the artefact host andpetrova.blogthe corpus, and that the three Wave 1 artefacts are placed as set out above.