Skip to content

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

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.

#DefectEvidence (live, 2026-08-10)
1All 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.md404
2The 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”
3The MR range is stale.Preamble says “MR-1 through MR-12”; core/playbook/META-RULES.md defines 17
4petrova-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
5llms-full.txt misstates its own size by 2.7×.Claims “~50k words”; actual 134,778 words / 1.07 MB
6Neither 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.

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:

FactSource
MR range## MR-N headings in core/playbook/META-RULES.md — the same regex bandCells() uses
Verb countsspec/verbs/*.schema.json (excluding _common), classified by each schema’s own side_effects field
Skill catalogueskills/petrova-*/SKILL.md frontmatter
Governed reposregistry.yaml
llms-full.txt sizecounted from the corpus actually emitted
Freshnessgit 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.

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 the llms.txt index 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 from spec/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.md files already carry; enriching them is separate work.
  • The SKILLS array, 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/, and registry.yaml to be readable. All are in-tree. The build fails loudly if any is not, by design.
  • petrova.codes becomes load-bearing for petrova.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 to petrova.codes/llms.txt on 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.
  • 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.blog and drop petrova.codes. One base URL for an agent. Rejected — petrova.codes already serves a working machine registry with schemas and prompts, and the two surfaces have different audiences and different dialects (see DESIGN.md).
  • Generate llms.txt from the Astro content collection alone. Would remove the filesystem reads. Rejected: only 2 of 11 skills are projected into site/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.
  • docs/decisions/2026-08-06-landing-band-bound-to-canonical-sources.md — the ruling this extends
  • docs/specs/2026-08-05-petrova-apex-domain-topology.md §4–§5
  • site/scripts/pull-content.ts bandCells() — the binding pattern reused
  • site/src/pages/llms.txt.ts, site/src/pages/llms-full.txt.ts
  • External audit §11.1–§11.7 (2026-08-10)
  • 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.codes is the artefact host and petrova.blog the corpus, and that the three Wave 1 artefacts are placed as set out above.