Sources: pitfalls
Wrong forms, silent outcomes, LDC-E diagnostics, typical mistakes of
formalizers and AI agents, how to detect them. Items marked “confirmed by run”
were reproduced during this research on the installed law (semantics
law.core/0.2).
1. Fragment text retyped
Section titled “1. Fragment text retyped”One missing diacritic in a source fragment (plain “e” where the document has
“dotted yo”) — and check stops:
LDC-E5201 (text hash), with a pinned publication LDC-E5202 (no
occurrence). No check normalizes anything: neither NFC nor whitespace
collapsing. Detection: copy bytes from the document, recalculate the hash after
every edit.
2. Edition declared PINNED_*, but a fragment without a hash
Section titled “2. Edition declared PINNED_*, but a fragment without a hash”LDC-E5205. The duty follows from the edition’s claim, not from a
publication’s presence: either content_hash on every fragment or the honest
materialization_status ABSTRACT_ONLY. AI agents often add PINNED_*
“for solidity” — that is a refusal.
3. Wrong bytes
Section titled “3. Wrong bytes”Re-pinned the document and did not recalculate the publication hash —
LDC-E5204; the same code when local_path is absolute, contains .. or is
unreadable. A publication with no content_hash at all — LDC-E1305. Order
matters: LDC-E5204 goes first — mismatched bytes void conclusions drawn from
them.
4. Removed local_path line switches pinning off (silently)
Section titled “4. Removed local_path line switches pinning off (silently)”LDC-E5206, a warning: LDC-E5202 and LDC-E5204 compute
only where bytes resolve locally. Without the path check is clean, while the
edition keeps claiming PINNED_*. As of 21.09.2026 the corpus records 219 of
3 090 hashed publications this way. Detection: keep local_path in every
pinned publication; no warning on PINNED_* without a path is a reason to
check, not to rejoice.
5. materialization_status undeclared
Section titled “5. materialization_status undeclared”LDC-E5207, a warning. The status must be declared, not
derived from a publication’s presence: without it the hash duty (item 2)
does not hold, and the coverage report reads the edition as unpinned. An
edition claiming no pinning gets no warning — silence is the norm here.
6. Anchor to a nonexistent fragment
Section titled “6. Anchor to a nonexistent fragment”LDC-E5103, a warning: the node’s anchors keep the bare name
instead of the StableId, tracing loses the address. The anchor name must be
declared in the package as a fragment, edition, publication or source;
a reference to another package is package::Fragment or a string. The level is
a warning because 102 conformance scenarios and 24 corpus packages use the form:
a refusal would drop the conformance corpus. The neighbouring form fragment … in NO_SUCH_EDITION is rejected under its own code — LDC-E5102 (already an
error, not a warning).
7. @source relation attributes outside anchors
Section titled “7. @source relation attributes outside anchors”relation = …, coverage = …, quote = "…" do not land in the anchors
field: it holds only fragment references. An annotation with at least one attribute materializes as an anchor
node (<rule>/anchor/<k>, document schemaVersion: law.core.ir/0.4). Values
outside the closed lists — LDC-E1373 (nine
relations, four coverages). A quote must be a continuous substring of the
fragment text byte for byte, otherwise LDC-E5208; an empty or non-string
quote — the same code. AI agents love inventing “in-spirit” quotes — caught only
by this check.
8. Label or text without a status
Section titled “8. Label or text without a status”LDC-E0201 at the status position. The status is mandatory for both label
and fragment text. A label on a package header is allowed by the grammar
but does not lower — LDC-E1321.
9. Explicit @id on source / edition / fragment (confirmed by run)
Section titled “9. Explicit @id on source / edition / fragment (confirmed by run)”The annotation does not execute: the StableId stays package-derived
namespace#Name. The mismatch gives
warning LDC-E1372 naming both identifiers. Reproduction during this
research: a research.sources.anchored_rule package variant with the line
@id("urn:research:sources:park-rules-2026") over source PARK_RULES —
warning LDC-E1372: явный `@id("urn:research:sources:park-rules-2026")` на декларации`source PARK_RULES` НЕ ИСПОЛНЯЕТСЯ ... уберите аннотацию либо дождитесь решенияо смене StableId корпусаcheck OK: docs/research/constructs/22-sources/examples/anchored-ruleOn rule, priority, norm templates, assert and calendar the same
annotation executes. The StableId-change cascade (contentHash, anchors,
144 corpus places) awaits a separate owner decision — do not fix by hand.
10. Form slot outside the dictionary
Section titled “10. Form slot outside the dictionary”vocative on ru-KZ or a repeated slot — LDC-E8203, a warning: the form
is kept, the consumer degrades to text. The slot dictionary is closed per
language family.
11. id "…"; in source bodies is outside the supported form
Section titled “11. id "…"; in source bodies is outside the supported form”source, edition, publication, and fragment do not accept an id
field: unsupported fields are errors and no partial CLIR is emitted.
E-0027 legalized the field for assertions, not the source model.
@id on derived-ID kinds has a separate boundary: E1372 warns only on
divergence; the actual ID remains package-derived (see item 9).
Documentation for Arxo. Writings — blog.arxo.io.
Anonymous visit counts on stats.arxo.io, no cookies.