Skip to content

feat(schema): перейти на автономный EDT-derived model corpus - #290

Draft
Untru wants to merge 239 commits into
masterfrom
codex/edt-schema-reset
Draft

feat(schema): перейти на автономный EDT-derived model corpus#290
Untru wants to merge 239 commits into
masterfrom
codex/edt-schema-reset

Conversation

@Untru

@Untru Untru commented Jul 25, 2026

Copy link
Copy Markdown
Owner

Что изменено

  • добавлен независимый workspace crate ibcmd-schema;
  • перенесён очищенный индекс EDT 2025.2.3: 76 bundles, 3 902 model types, 229 importers, 265 exporters;
  • извлечена реальная EPackage-структура: 67 packages, 1 845 classifiers, 12 224 feature IDs и 1 447 operation IDs;
  • добавлены первые проверенные правила ChoiceList, ListSettings и SpreadsheetContent;
  • ibcmd-xml подключён к schema registry;
  • добавлены детерминированные research importers без runtime-зависимости от EDT;
  • оформлены OpenSpec и архитектурная документация;
  • README переведён на новый GitHub Project Feature/export db sources #6 и schema-first подход.

Почему

Последний этап parity почти перестал сходиться из-за цикла «XML diff → гипотеза raw slot → локальный if». Новый слой разделяет physical decoder, canonical model и XML writer, а решения порядка/default/version получают проверяемое EDT-derived evidence.

Независимость

В репозиторий не включаются JAR, bytecode или native libraries. Default build не ищет EDT, Java, OSGi или платформу. Committed corpus содержит только декларативные производные факты.

Проверки

  • cargo test -p ibcmd-schema --locked
  • cargo test -p ibcmd-xml --locked
  • cargo check --workspace --locked
  • cargo fmt -p ibcmd-schema -p ibcmd-xml -- --check
  • git diff --check
  • feature corpus regeneration: SHA-256 идентичен
  • corpus validation: отсутствие абсолютных EDT-путей

Связано с #276, #277 и #278.
Новый roadmap: ibcmd-rs — EDT-derived Native Parity

Первый Xcore vertical slice (#278)

  • добавлен fail-closed importer model/*.xcore;
  • встроена form model semantics: 257 classifiers, 919 features;
  • 671 attributes, 34 references, 214 containments, 7 explicit defaults;
  • model type, cardinality, qualifiers и default имеют verified Xcore evidence;
  • неподтверждённые QName/order/default-emission/version/delegate остаются pending;
  • повторная генерация: SHA-256 6A364C1F98452E59AF0093904F4A5C09098FF4195F794121500EBE028C7AC303;
  • schema corpus принудительно хранится с LF для одинакового SHA на Windows/Linux.

OpenSpec: openspec/changes/extract-edt-feature-semantics/

@coderabbitai

coderabbitai Bot commented Jul 25, 2026

Copy link
Copy Markdown

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: a20138d3-ab7b-444b-bd4b-df0d4e670994

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/edt-schema-reset

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@Untru

Untru commented Jul 25, 2026

Copy link
Copy Markdown
Owner Author

Крупный schema-first пакет опубликован в cb0c597.

Итог пакета:

  • полный доступный Xcore corpus: 63 packages / 1 820 classifiers / 4 966 features;
  • canonical coverage exact join: 2 typed / 4 964 unsupported / 0 missing;
  • metadata order: 60 verified rules;
  • governance CI gate без runtime-зависимости от EDT/JVM;
  • production slices для Configuration/Catalog/Document order;
  • schema-driven ChoiceList и bounded canonical DCS boundary;
  • README и архитектурная документация обновлены на русском с честными текущими процентами.

Локальные gates: schema 21/21, core 169/169, XML 141/141, ChoiceList 6/6, metadata-order 4/4, cargo check, strict clippy для новых crates, шесть OpenSpec strict changes и governance validator — зелёные. Полный root test suite не объявляю зелёным: ранее он имел 166 legacy failures вне этого пакета. Жду CI текущего commit.

Untru and others added 30 commits August 17, 2026 12:37
Two window scanners tried to recognise the header/footer block by
shape - one caught six identical short records, the other six identical
long ones - so anything in between fell through and 42 of the 87
publishing documents got no element at all. The same defect shape as the
palette table and the mask before it: a variable-length record read as a
fixed silhouette.

The block has an anchor at a fixed field range, verified as a run of six
groups in all 683 documents, and both replaced scanners return the same
verdict on the anchor in all 683 - so format ordering did not move. The
slots alternate header/footer across left, centre and right; the left
pair is pinned by 24 documents that publish only those two, and the
header/footer parity by 10 whose header records differ from their footer
records. The centre/right distinction is unobservable in this corpus -
those records are always equal - and that is recorded in a comment
rather than guessed.

A slot publishes exactly when its record is not the empty pair, matching
in all 4098 slots, and the record grammar is a total function over all
522 records of the publishing documents: the fourth field is a flag and
it alone separates the plain text child from the formatted one, with
arity following from the flag rather than being tested first.

Verified independently in review, merged three-way on top of a7ab5eb:
49 335 -> 49 342 exact (+7, 96.94%), differing 1 488 -> 1 481, missing 75
and extra 0 unchanged, zero regressions by set comparison. Reference
trees 39/39, bundled corpora 9/9, root lib 2086/33 with zero name-diff.

The number format group stays refused, and the measurement is now sharper
than the earlier refusal: the index is not a reference but the position
at which the platform materialises a format in the published table. 486
candidate arithmetic relations over the storage fields explain at best 13
of 78 documents; the current derivation explains 31. The one rule that is
total - the index names the first occurrence of that format text in the
table, 96 of 96 - is not sufficient, because deciding whether the
platform appends a fresh format or folds onto an existing one requires
the format's content, and that content is in neither the source palette
nor beside the block. Where a document uses two different header/footer
formats it appends both, 18 of 18; where it uses one, 3 append and 57
fold. Closing it needs that datum, not a better fit.

Header/footer ceiling falls 17 -> 10, and the 10 are exactly the
documents needing that projection. Also recorded: the three form-side
format properties contribute zero here - they belong to forms and DCS,
not spreadsheets.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…itten

FooterDataPath needed no decoding at all. Its slot was already being
read - it sat second in the data-path candidate list as a fallback source
for DataPath - and the bytes reached the decoder every time. Nothing ever
wrote them out. That is the fifth variant in this series of working code
that produces nothing, and the cheapest one yet.

It also needed no new grammar: the slot carries the same chain the
existing resolver walks, called with the aggregate flag set, because a
footer states the column total even when the item sits inside the table
it addresses - the one case the primary slot's placement rule cannot
reach. 213 chains against 58 936 empty slots, no counter-example in
either direction across 59 149 field items.

Four more properties in the same family were never read at all, each a
total function on its own slot with a parser already in the tree: the
table's footer flag (39 against 4 490), the footer colour and footer
font (reusing the existing tuple parsers verbatim), and the
multiple-value bindings, which are a lone chain segment resolved against
the attribute the field itself is bound to. The discriminating case for
that last pair is an item whose attribute declares one column before
another, yet the bag still spells the second - position, not declaration
order.

Emission positions come from pairwise counts over all 5201 native forms
with no pair counted twice, and every element is exact where we produce
the file: the footer path 183/183, the flag 39/39, the font 39/39, the
colour 6/6, both multiple-value paths 3/3 - nothing wrong, nothing
native-only, nothing ours-only. The remaining occurrences sit in the
eight forms we do not produce at all.

Verified independently in review, merged three-way on top of 276634a:
49 342 -> 49 365 exact (+23, 96.99%), differing 1 481 -> 1 458, missing
75 and extra 0 unchanged, zero regressions by set comparison. Reference
trees 39/39, bundled corpora 9/9, root lib 2090/33 with zero name-diff.

The package went past its brief and said so: the footer path alone was
worth 5 files, and measuring the rest exposed the four siblings above as
the residual blockers, so it closed them as separate hunks. It also
flagged a hazard it deliberately left alone - the footer slot is still a
fallback source for DataPath, so an item whose primary slot failed to
resolve would emit its footer binding as the data path. No such item
exists in this corpus and nothing regressed, but the exposure is real and
now recorded rather than discovered later.

One file remains whose entire difference is inside this family, blocked
by a footer height whose presence gate is not pinned: the zero value is
written, so it is not a non-zero rule, and five occurrences across two
owner kinds are not enough to say when it appears.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… family

Sixteen forms were not exported at all, and the diagnostic that named
them carried no information: the two slot numbers it reported are
compile-time constants, identical in every case. The real cause was route
priority inverted.

A link terminal spelled with the value-table column marker is the same
reference written a second way - the marker is a fixed type tag, not an
identity. The route table is keyed by both spellings, but only the
layout-derived key carries the route from the layout itself; the other is
filled from a supplemental representation whose priority is documented in
that same file as lower. The code required the supplemental key to exist
and treated disagreement as a refusal. Over 72 observations the two agree
on 38 and disagree on 34, and on all 34 the platform writes the
layout-derived path. Preferring it is a total function on all 72.

The same pass found a live defect in files we already emit: a standard
terminal marker was resolved family-blind to a fixed member name, but the
marker is a position in the standard attributes of the declared type. Of
84 such terminals the same marker means one member under a document
object and another under a catalog object - six references were being
written with the wrong name. It now goes through the same family table
the chain walk uses, and where the type is not single or the row is
absent the previous spelling stands.

Two more properties closed on the way. A selection-visibility slot was
read as a flag with a hole; it is one code, and the value nobody handled
is held by exactly the 16 items where the platform writes the third
spelling - no misses, no extras. An open-button mode slot was not read at
all: 49 936 of 49 951 items hold the empty code and carry no element, and
the two non-empty codes match their elements item for item.

Verified independently in review, merged three-way on top of 83bc988:
49 365 -> 49 379 exact (+14, 97.02%), and missing 75 -> 59. Sixteen files
left missing; every one of the 16 new differing files came from missing,
none from exact, and zero previously-exact files regressed - all by set
comparison. Writer refusals fall 33 -> 17. Reference trees 39/39, bundled
corpora 9/9, root lib 2094/33 with zero name-diff. Read and write stay
consistent - only the read side changed - and cf_native_roundtrip is
green.

One file remains refused, and the boundary is named: it carries two
standard terminals the schema grammar does not admit, because that
grammar hardcodes three member names instead of accepting any negative
marker for the caller to resolve by family. That generalisation lives in
the schema crate and needs its own package.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… scanning

The strongest coupling left in the corpus - the group's joint ceiling was
57 where its members summed to 22 - and the reason was a bag read the
wrong way.

The table property bag is scanned with a sliding window looking for a
field equal to the key, but the keys are bare decimals and the layout
declares a pair count with the pairs following it. Measured over all 4529
table items, the counted walk answers for one key on 71 items while the
scan answers on 77: six false positives where a literal decimal precedes
a title collection. Those six are files that match today, so reading new
keys by scan would have broken them. New keys therefore go through a
bounded counted walk. The dynamic-list bag is a different bag and its
keyed scan is safe - verified, not assumed: all 86 074 records satisfy
the count relation and all 202 050 pairs have a quoted key, so no value
can be mistaken for one.

Three properties then fall out as total functions, and one composition:

- The view mode and the detailed-representation flag come from counted
  keys, 71 and 56 observations against 4458 and 4473 absences.
- The list-settings view mode reads the record that carries the mode, not
  the one that carries the id - which is what the old inference confused.
  It holds whether the id is empty or not, 34 and 19 on the forms whose
  single record pairs one-to-one with a single native block.
- The grouping property is a storage document keeping a flat item list,
  while the inline position spells a right-nested chain. Rendered by
  giving the existing transliteration writer a fourth kind and composing
  only the nesting - no new typed model. Of 254 stored documents 220 are
  empty and none of those forms carries an item; the 17 with items are
  exactly the 17 native blocks that carry one.

Verified independently in review, merged three-way on top of 02a5f5c:
49 379 -> 49 430 exact (+51, 97.12%), differing 1 460 -> 1 409, missing
59 and extra 0 unchanged, zero regressions by set comparison. Reference
trees 39/39, bundled corpora 9/9, root lib 2099/33 with zero name-diff.
Neither of the first two properties yields anything alone on the 25
coupled files - only the combination moves them.

The zone ceiling falls 58 -> 11, and the reason it stopped there is
recorded so the next package does not re-derive it: the remaining ten
need the rule for when a group-family record still writes its three
default children, and that rule is not a function of the group's
presence - the same input maps to four different native outcomes across
15, 6, 3 and 3 forms. A finer discriminator is needed and was not
guessed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The largest single divergence class was never one defect. A multiset diff
of whole item blocks against native, keyed by output path, split it into
six missing command shapes; the oracle joined all 4662 command records
across 840 files at their exact output position with nothing unjoinable.
Of those, 4520 resolved correctly, 133 were dropped and 9 were wrong.

Four shapes close here, all total on their observed sets:

- A catalog names its create-based-on command from a different slot than
  a document or business process does - 87 observations for the catalog
  form, against 1310 and 485 confirming the other slot for the other two
  families. The record itself is only a kind and a uuid, so the top-level
  family is what decides.
- An information register's second kind is open-by-recorder, not
  create-based-on.
- A filter criterion's zeroth kind is open-by-value.
- Two standard-command uuids were simply absent from the table.

The structural guards were innocent, and instrumenting all five proved
it: every one of the 133 drops happened at the command resolver, none at
the schema, visibility or attribute checks. Worth stating because the
series has found the opposite four times.

The element rename lands with its namespace rewrite, both halves in one
change since neither closes anything alone. It lives beside an existing
precedent for the same shape, and both halves were checked against the
corpus before being written: all 35 occurrences of the one and all 6 of
the other sit in differing files with native writing the canonical form
every time, and neither appears anywhere in the byte-identical set. The
prefix mapping is fail-closed - only the observed namespace is mapped,
anything else is left visibly unchanged.

Verified independently in review, merged three-way on top of fe4eb99:
49 430 -> 49 491 exact (+61, 97.24%), differing 1 409 -> 1 348, missing
59 and extra 0 unchanged, zero regressions by set comparison. Reference
trees 39/39, bundled corpora 9/9, root lib 2106/33 with zero name-diff.
The class ceiling falls 58 -> 6.

Two measured negatives, both recorded so they are not re-derived:

The remaining register command names a master dimension by index in
declaration order - 143 of 143 agree, including a held-out half, after
two other hypotheses each failed on the same four cases. It is not
implemented because the existing field index is alphabetical, carries no
master flag and includes resources; building the ordered one belongs to
the reference-index module. Worth 5 files.

The dominant Field defect is localised but unsolved: native marks certain
entries with a prefix that also changes their sort position, and the
structure around it is exact - the prefix occurs only in that one
property, the layout is two sorted groups in all 83 containers, and a
marked field is never also present unmarked. Three hypotheses were tested
and rejected; a fourth is inconclusive rather than disproven, because the
field-name universe used excludes platform standard attributes. The bit
is in an undecoded part of the settings blob.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…lots

A picture field's size was read from the slot next to it - the one that
actually holds the hyperlink flag - so the size was wrong wherever the
two disagreed, and two neighbouring properties were not read at all. The
oracle attributed all 213 853 slot observations across 5184 forms by
output path with nothing unattributed, and every one of the six rules
below is a total function on its full observation set.

There is no composition mask here. The size code is a flat ordinal and
one table serves both owners - 4859 observations across six shared
codes, no disagreement between owners. One code is observed on neither
owner and is deliberately left unmapped: it refuses rather than guessing,
and it cannot be derived as a combination of the others without breaking
two codes that are pinned.

Record lengths are uniform across the corpus, so no length filter was
needed and none was added - the series lesson about a length gate
blocking a working resolver was checked here and did not apply.

One regression was caught mid-work and is worth recording because a
file-level counter could not see it: reusing the hyperlink flag made the
picture field emit both the correct element and the misspelled legacy
one, 51 surplus instances inside files that were already differing. The
fix for that added 11 files on top of the first 22, and the package
verified afterwards at instance level, not just file level - no class
grew its affected-file count.

The seventh hand-written test in this series to encode a layout the
platform does not write: it mutated the hyperlink slot and expected a
size value, and it was the only thing hiding the defect. Rewritten
against the real layout and widened to all seven codes plus the unmapped
one.

Verified independently in review, merged three-way on top of e712d9a:
49 491 -> 49 525 exact (+34, 97.30%), differing 1 348 -> 1 314, missing
59 and extra 0 unchanged, zero regressions by set comparison. Reference
trees 39/39, bundled corpora 9/9, root lib 2109/33 with zero name-diff.
The group's joint ceiling falls 70 -> 37, and three of its classes
disappear from the report entirely.

Named for the owner of the metadata module: the picture remainder needs
three platform identities the oracle observed directly - one negative
code and two uuids, covering 18 occurrences - and adding them closes the
whole choice-button-picture remainder. The spreadsheet size table is
deliberately left as its own authority; it cannot take the two extra
codes without evidence from that corpus.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
All three traps this series has been finding turned up in the same group,
and together they explain the whole gain.

A group schema whitelisted fourteen exact field counts where the real
shape is an arithmetic progression - which the sibling schemas for two
other owners already state correctly. It rejected 48 native groups
outright and discarded their entire property bag, which is why twelve of
the closed files carry signatures naming none of this package's classes.
A command-bar schema had the same defect in its guard, admitting only the
alignment values that happen to be written and rejecting 15 of 1840
command bars.

Six transcribed copies of one enumeration each lacked a different end:
one missing the one-and-a-half step, another missing single and double,
a third carrying two of five values, three more missing top or bottom.
One schema pinned a progress bar to an ordinal the corpus never carries
in that position, while the single real case carries another. All of it
is now one grammar per property and one table per enumeration, each a
total function over its full observation set including the absences:
spacing across 38 249 observations, alignment across 109 262.

Two properties also live where no forward slot explains them - a
children-width on a plain field and a refresh request at a reverse offset
in the variable tail - and both are pinned by observation rather than by
assuming the layout is fixed-position throughout.

Verified independently in review, merged three-way on top of f3590e1:
49 525 -> 49 594 exact (+69, 97.44%), differing 1 314 -> 1 245, missing
59 and extra 0 unchanged, zero regressions by set comparison. Reference
trees 39/39, bundled corpora 9/9, root lib 2112/33 with zero name-diff.
Five of the seven classes are now fully closed.

The package re-measured its own ceilings first and found them all moved
from the figures it was given, which is why it also re-anchored the
calibration constants: the numbers pinned two packages ago describe a
tree that no longer exists. Worth carrying forward - a stale calibration
silently validates the wrong baseline.

It stopped on the remaining alignment owners deliberately and said why:
four owners have no reader at all, and the slots and positions are already
measured, but wiring three of them means three new insertion points in
code shared with every passing file, for a ceiling of five.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…used templates

The refusal in 557a7a6 was sound about its evidence and wrong about the
world, and the reason is worth recording: it measured only inside the DCS
corpus - six records, about 29 mixed observations - and concluded the
platform's order was not derivable from storage. Two facts were outside
that corpus.

First, it read "storage sorts its type-id list by uuid" as a loss and
never tested the native side. Native is uuid-ascending too: 1869 of 1869
reference-only runs across the whole corpus ascend by the referenced
type's own uuid, no exception. So storage's sorted list is not a
normalization artefact - it is the platform's order, and nothing about
the references was ever lost.

Second, the evidence that pins the builtins is not in DCS templates at
all. The same type lists appear 2545 more times in metadata objects and
forms, and there each builtin's key narrows to an open uuid interval -
960 observations for one, 245 for another, and so on for seven more.
Inside DCS alone those intervals stay underdetermined.

So the order is one global sort over a single uuid key: a configuration
reference keys on its generated type's uuid, a builtin on a fixed uuid
pinned to an interval, and a type family sorts behind everything, 326
pairs with no counterexample. A comparison landing inside an interval
refuses rather than guessing. Independent confirmation that the key is a
uuid and not a rank: for the three builtins whose platform uuid is
already carried elsewhere, that value falls inside the measured interval.

Held out properly - derived on metadata and forms only, then applied to
the 15 storage documents it had never seen: 699 of 699 value types
reproduced, none mismatched, none ambiguous.

One regression was caught before shipping, by export measurement rather
than by a test: the first version sorted every list containing a builtin
and so refused a template that was already exact, three builtins and no
reference, where storage loses nothing. The rule now fires only where the
two spellings actually mix, so it cannot touch output the writer already
spells correctly - the same inadmissible-instead-of-not-my-case shape
this series keeps finding.

The one remaining file was not the new type index: a type id was carried
by one table in a module and absent from another in the same file, the
fourth instance of two inconsistent tables. A hand-written test pinned
the absence, the seventh time an expectation encoded what the platform
does not write.

Verified independently in review: 49 594 -> 49 609 exact (+15, 97.47%),
missing 59 -> 44, and the differing set is byte-identical - all 15 moved
straight from missing to exact, none to differing. Zero regressions by
set comparison. Reference trees 39/39, bundled corpora 9/9, root lib
2113/33 with zero name-diff. No DCS failure remains in the export.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…bsent

The bytes reached the decoder on all 49 951 option tuples; one line
hardcoded the result to absent. Second time in this series that a slot
was already being read and simply had nothing to write it - the cheapest
kind of gap left.

The slot is a gap between two properties already read. Scanning every
slot of every tuple settles it: that slot parses as a type pattern on all
49 951 and no other slot parses as one anywhere. It is empty on 49 937
and non-empty on 14, and those 14 items in 13 forms are exactly, item for
item, the ones where the platform writes the element - nothing native-only,
nothing ours-only. The type sequence matches the platform on all 14,
including one element carrying five types across three qualifier groups.

The global uuid order landed in 793da73 turns out not to be needed here,
and that was measured rather than assumed: the raw pattern order after the
existing normalizer already gives the platform's order on all 14,
including a mixed set.

Seven column type identities were unmapped, and the metadata module's
table was not needed - they belong beside an existing entry in the form
schema, because these references occur only inside a form column and none
of them appears in our output in any role, so adding them can only add.
All their prefixes are already declared at each form root, so they emit
without inline declarations exactly as the platform does.

The fifth structural filter of the series: the column fallback admitted
exactly one pattern element, so a two-element pattern was rejected whole,
taking with it the neighbour that parsed fine. Replaced by an index
overlay over the same grammar, with no shape filter.

The eighth hand-written test encoding a layout that never existed - the
opaque variant it exercised was constructed only in tests, and the slot
number it used was never a slot. Rewritten against observed bytes.

Verified independently in review: 49 609 -> 49 623 exact (+14, 97.49%),
differing 1 245 -> 1 231, missing 44 and extra 0 unchanged, zero
regressions by set comparison. Reference trees 39/39, bundled corpora
9/9, root lib 2115/33 with zero name-diff. Also checked at instance
level: 19 files moved closer to native, none moved away, and the total
count of surplus lines across all differing files is unchanged - so no
new wrong instance was introduced inside files that already differed.

AvailableTypes leaves the class table entirely and the form-side type
remainder falls to one file, whose owner is the asset writer.

Noted for the schema crate, which was out of bounds here: a doc comment
there still says this mapping is unproven. It is proven now, 14 of 14.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…redefined prefixes

Three rules that earlier packages proved and left unimplemented because
this module was outside their bounds. Each was re-derived here before
being written, and two turned out wider than handed over.

The register's open-by-value command names a master dimension by index in
declaration order. The rule handed over covered three slot kinds across
143 observations; the real range is five kinds across 156, so six
occurrences were unreachable rather than merely wrong. Verified from both
directions: the traced slot kinds and the native names' positions among
the master dimensions give coinciding histograms, every one of the 156
names the platform writes is a master dimension and none is not, and the
predicted pairs are set-equal to the platform's with no surplus and no
deficit. The recorder slot is correctly declined. The index takes the
master flag from the same call the metadata emitter makes to decide what
the register's dimension elements say, so it cannot name a dimension the
export does not write nor order them differently; wired into both the
bulk and the streamed path. 16 files closed, not the predicted 5.

Two inconsistent tables for the fifth time in this series, and inside one
module: one negative picture code was already mapped by the sibling table
over the same namespace in the asset writer, while the picture-value table
in the metadata module had every neighbouring code and not that one. The
tables were checked against each other before the row was added. After the
change all 23 occurrences agree with the platform per file and per owning
element, and the uuid table is shared with the help writer, so that side
was checked too - all 144 help topics agree as multisets.

The predefined-data file was two defects, both total over every such file
in the tree. The namespace prefix is not a constant but is numbered by the
element's absolute depth - 367 occurrences at one depth, 68, 29 and 2 at
the deeper ones, no exception - and we hardcoded the shallowest, so the
one file in the tree that nests deeper paid for it. And the empty type
element is family-owned: one family writes none at all across 2567 items,
the other writes one for every item across 166. They shared a layout, so
the second could not be expressed.

The eighth hand-written test encoding what the platform never writes:
three tests asserted that three different slots all name the same
dimension, when naming a different one is the slot's whole purpose.
Rewritten against the real layout, plus a refusal past the last master
dimension and one proving a non-master dimension is never named however
well it matches the form's owner.

Verified independently in review: 49 623 -> 49 649 exact (+26, 97.55%),
differing 1 231 -> 1 205, missing 44 and extra 0 unchanged, zero
regressions by set comparison. Reference trees 39/39, bundled corpora
9/9, root lib 2116/33 with zero name-diff.

The offline provenance harness moved in step, as a7ab5eb established, so
it builds the same index production does rather than diverging silently.

One measured negative recorded rather than guessed at: 46 further standard
picture names the platform writes are absent from every table of ours, and
six names in our tables appear nowhere in the native tree. The largest of
the missing are conditional-appearance owners, not form pictures, so they
belong to a different class than the three closed here.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Three files named .xml were being published as the raw serialized 1C
value, because the asset kind inflates the row and writes it verbatim and
the row body is not XML at all. Grammar read off the bytes: a record list
of typed values holding an id, an indexed-field list, an additional-field
list, a name, a table reference and two trailing fields, where each field
is itself a typed value naming either a declared attribute resolved
through the reference index or a standard field by code.

The standard-field codes are one table with exactly four entries and all
four are evidenced. Anything else - an unknown code, an unexpected type
uuid, a wrong record arity - is a typed refusal rather than a guess. The
data-table name drops the tabular-section segment, which is what the
platform writes.

The eighth hand-written test in this series encoding something the
platform never stores: it fed an XML fragment in as the stored row body
and asserted it came back verbatim. No platform configuration stores
that; all three real bodies are serialized values, and that test was the
only thing hiding the defect. Rewritten to the real grammar with one
assertion byte-exact against the platform's own output and two pinning the
refusals.

Verified independently in review: 49 649 -> 49 652 exact (+3, 97.55%),
differing 1 205 -> 1 202, missing 44 and extra 0 unchanged, zero
regressions by set comparison. Reference trees 39/39, bundled corpora
9/9, root lib 2119/33 with zero name-diff; cf_overlay and cf_roundtrip
also run and green.

An asymmetry this introduces is recorded rather than left to be found: the
load direction still deflates the file's bytes into the row verbatim, so
overlaying a configuration that carries such a row would now write XML
where the platform stores a serialized value. It was symmetric with a
wrong export before and is not covered by any gate - no reference tree or
bundled corpus contains such a row. The inverse packer is the follow-up.

The package also mapped what the class-based measurement cannot see, and
two of its findings correct the earlier recon. The hard residue is 252
files, not 113, and it is not attributes or ordering: 245 of 252 differ in
several classes at once, which is why no single class closes them, and
exactly zero differ by attributes alone. Separately, the container-only
bucket is the class method's signature for an ordering defect - 86 of the
93 ordering files sit there and nowhere else, because cutting the wrapper
removes both orderings at once so the container scores while no child
does.

Two concrete leads for later, both measured: the 38 remaining order
inversions are per-item-tag and not a general rule - the same property
leads under one parent and trails under another - and the tilde marker on
the use-always list is worth 40 files on its own, with both native lists
proven sorted on the full string including the marker, 1766 and 1622
blocks with no exception. The seven flowcharts differ first by framing -
no byte-order mark and one trailing newline, on all seven - which no
element cut can ever see, but behind that roughly twenty of their
properties are emitted as constants.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…order runs

The oracle joined all 27 773 button command records across 3868 forms to
the native button at the same output path and item id: 27 683 agreed, 90
dropped, none wrong, none unjoinable. Because it covered the whole corpus
rather than only the differing files, the byte-identical majority served
as the hold-out. It also established that no record exists where native
omits the name, so filling a drop can never over-emit.

Nine uuids were absent from two tables, and one of them needed no new
evidence at all: the excluded-command reader in the same file was already
reading it under the right name. Two unsynchronised tables again - the
second-commonest failure in this series and the third instance today.

The two readers of the same record disagreed about which slot families
they understood: one knew a single slot, the other five. Unified into one
grammar, with one row kept keyed by reader rather than generalised, since
overturning a documented negative on the strength of one observation would
be exactly the invention this project refuses.

Emission order: 463 ordered pairs counted over all 4004 native forms
carrying a button, not one observed in both directions, and diffing our
table against the platform's found 18 inversions with every count matching
exactly. All 18 reduced to four misplaced runs. Two properties that cap
each other had been split across the shared visual tail; the title height
led what it should follow; a picture led a font. Button inversions fall
18 to 0 and no other owner's count moved, so nothing was shifted sideways.

One placement the topological sort proposed was rejected: the pair it
relied on is never co-observed, so the sort had guessed. The capped
property stays beside the cap that bounds it.

A button group's representation was read as a two-valued code; tabulating
the raw tuple of all 7333 native groups gives a total function with three
outcomes and no ambiguity - the middle member is constant across all 7333
and decides nothing.

The package also caught a hazard in its own change before shipping: its
first unification silently narrowed one slot to top-level references,
which the previous code never required.

Verified independently in review, merged three-way on top of 5dac2b7 with
one semantic conflict resolved by hand - this change and bb9948e had both
rewritten the same match arms, one adding the register's ordered-dimension
rule and the other routing through the shared grammar, so the merged arms
carry both: 49 652 -> 49 692 exact (+40, 97.63%), differing 1 202 -> 1 162,
missing 44 and extra 0 unchanged, zero regressions by set comparison.
Reference trees 39/39, bundled corpora 9/9, root lib 2125/33 with zero
name-diff.

Checked at instance level too, which a file counter cannot see: surplus
instances across the still-differing files are unchanged at 466, every one
of the 24 touched classes has surplus exactly zero, and deficits fell.

Measured negatives, recorded rather than guessed: eight drops belong to an
item kind that does not exist anywhere in the codebase - an unimplemented
control, not a command defect - and the last file in the class needs a
table shortcut whose slot tabulates ambiguously against native on the only
three tables in the corpus that carry one. Left refused. The remaining
order inversions were counted for their owners, the largest being 131 on
one owner where four stretch and maximum properties are emitted too late.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…five tables

The discriminator the reconnaissance could not find was never in the
output: it is in the storage envelope around the child payload, and the
code held that envelope in five independent hand-written tables pinned to
constants. One envelope grammar replaces all five, and it reproduces every
one of the five variants - including revealing that what the code called a
predecessor shape is the same code minus one without the length slot.

Two slots were pinned that the platform stores. The trailing slot is not
the constant 5 but the stored line-number length: across all 1203 tabular
sections it equals the native element, 1195 times one value and 8 times
another, with nothing unrecognised. And a usage slot was pinned to one
value by the extended branch while its own predecessor in the same file
already admitted two - the platform writes the second 11 times. An owner
with a single tabular section storing either of those refused whole, which
is why the failure looked like whole families.

Business processes then needed three more facts, and each was already
half-known in the same file. Their attribute wrapper uses one code and
arity that the reader demanded differently - a shape that existed only in
a hand-written test fixture - while a neighbouring function in that same
file was already reading the real code. A candidate filter then discarded
that wrapper along with the header record it was meant to avoid; the
discriminator is that the header's field equals the marker where the
wrapper's contains it. And the family was simply absent from a presence
table, though the platform writes the same marker for it.

That is the sixth instance of two unsynchronised tables in this series and
the fourth of a fixture encoding a shape the platform does not write.

The diagnosis needed no new machinery either: the typed diagnostic already
existed and was simply never surfaced for the export path. Printing it was
enough to get the breakdown.

Verified independently in review: 49 692 -> 49 716 exact (+24, 97.68%),
missing 44 -> 20, and the differing set is byte-identical - all 24 moved
straight from missing to exact, none to differing. Zero regressions by set
comparison. Reference trees 39/39, bundled corpora 9/9, root lib 2126/33
with zero name-diff.

The remaining 18 are bounded precisely. Eleven catalogs parse to the end
and fail in one function that pins about twelve standard-attribute
properties to their defaults in a single conjunction - the seventh
inadmissible-instead-of-not-my-case in this series. The exact causes are
named per file. It was deliberately not closed: the model carries no field
for two of the values involved and the formatter hardcodes one of them
empty in five places, so emitting those files would mean inventing bytes,
which is worse than a missing file. Five characteristic-type plans, one
task and one filter criterion are diagnosed but untouched.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Three elements appeared 324, 189 and 189 times in the native tree and
zero times in ours - not because anything was undecoded, but because all
six picture-bearing owners funnel into one resolver whose tail returns
nothing when no table row matches. Every one of the 314 missing instances
reached it with bytes in hand. Sixth time in this series that correct
code produced nothing for want of its input, and the cheapest kind to fix.

Forty-three identities were missing - 41 uuids and two negative codes -
each a total function with no ambiguous key. The tables were checked
against each other first, because unsynchronised tables have been the
cause six times: this time they are clean, none of the 41 uuids, neither
code in a picture context and none of the 43 names occurs anywhere else
in the crate.

Ten of the 43 carry a prefix an earlier package had flagged as belonging
to conditional appearance rather than form pictures. That caveat does not
survive contact with the bytes: all ten were observed directly as the
reference of a picture element inside commands, decorations and buttons
in the form files themselves. Checked rather than inherited.

One genuine decoding gap remained: a column group's header picture sits
one level down in a container the field-kind reader never opens. Its
sub-slot is the platform's answer by set equality - the empty record on
exactly the 2989 groups without the element and a reference on exactly
the 19 with one, across all 3008 native column groups.

Embedded pictures name their extracted file through the same helper that
writes it, so reference and file cannot drift. The payload alone does not
decide the name: identical content is spelled one way under a button and
another under a picture field.

Emission position for the new element comes from pairwise counts over all
3008 native groups with no pair counted both ways. Two properties it never
co-occurs with are recorded as unobserved in a comment rather than
claimed, and placed by the 185 observations that pin them on the field
kinds.

Verified independently in review, merged three-way on top of 41deff3:
49 716 -> 49 757 exact (+41, 97.76%), differing 1 162 -> 1 121, missing 20
and extra 0 unchanged, zero regressions by set comparison. Reference trees
39/39, bundled corpora 9/9, root lib 2130/33 with zero name-diff.

At instance level the deficit falls 314 -> 5 while surplus stays at zero
on both sides - we never write a picture the platform does not.

The five remaining instances close no file and were not guessed at: each
is a layout its owner's current gate declines, and they are named. One
predicted closure stayed differing on an unrelated ordering defect, which
belongs to another package.

The package survived a server-side interruption mid-run and correctly
re-measured from scratch afterwards rather than reporting the numbers it
had before the change to its own code paths.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…rmat members

The drawing slot was always reached and the writer was complete; the
parser demanded one arity and one head shape and threw away 129 of 695
drawings. The real grammar is per kind: three kinds use a shorter record,
two use the longer one, and the head is the same masked member record the
cell reader already parses - so the fix removes a special case rather than
adding one. The geometry guard was also wrong: nine records end left of
where they begin, two end above, and one stores a negative offset.

Totality both ways: the rule pairs all 695 published drawings with exactly
one record and leaves no record unpaired in either direction, and
re-rendering reproduces 680 of 680 non-chart blocks byte for byte.

Two format members were conflated into one slot. One is the pattern colour
for every format, not only for drawing-referenced ones, and the other is
the text orientation. Proven as multisets over the whole corpus: the
colours now reproduce the platform's sixteen published values exactly, and
the orientations reproduce its two values exactly, where the old reading
invented fifteen orientations the platform never writes.

Row-range collapse was gated on two extra conditions that refused 24 real
runs. The condition is necessary and sufficient on its own: 361 collapsed
items, and all 9573 equal-payload pairs the platform left separate carry
cells.

Fixing the packer mirror uncovered a live corruption, and it is worth
stating plainly: the packer wrote four values into the four slots the
decoder reads as four different fields, so a packed drawing came back with
a different id, a different picture index and an inverted flag. It was
proven by round trip before anything was changed. Nothing caught it
because no test ever re-extracted a packed drawing - and one test asserted
the corrupted bytes as the expected output. Both now assert the round trip,
and a second kind was added.

Three hand-written tests encoded layouts the platform never writes,
including the one that fed an orientation through the colour member. The
ninth time in this series that a fixture was the only thing hiding a
defect.

Verified independently in review, merged three-way on top of 92f6e95 with
five test conflicts resolved by domain ownership: 49 757 -> 49 778 exact
(+21, 97.80%), differing 1 121 -> 1 100, missing 20 and extra 0 unchanged,
zero regressions by set comparison. Reference trees 39/39, bundled corpora
9/9, root lib 2132/33 with zero name-diff, cf_roundtrip and
cf_native_roundtrip green.

At instance level, identical drawings go 510 -> 673, missing 185 -> 22 and
surplus 56 -> 13.

Two refusals, both measured rather than assumed. The header/footer
projection decodes but is not emitted, and first-occurrence cannot rescue
it: the published reference is always the first table entry with that
content, 372 of 372, yet in 78 slots our index names different content, so
the content selection itself is what is wrong. And the default format
index stays refused for the third time - where the two indices name
identical content first-occurrence explains all 11 cases, but the
platform's own value is not the first occurrence in 4 of 618 documents and
names content we do not produce in 7 more. Not total, so not applied.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…se table

One sweep over all owners instead of per-class patches. Pairwise order of
child properties was counted per owner tag across all 5201 native forms;
no pair is observed in both directions for any owner - the only two-way
pair in the corpus is the order of child items inside a container, which
is not a property order at all. Our tables were then diffed against the
platform's and every inversion fixed by moving the run, never by
inventing a slot: 178 inversions across 17 owners go to zero, and no
owner's count moved in the wrong direction.

The largest were the table (131) - four stretch and maximum properties
emitted too late, each now in its own run beside the property that caps
it - and the page (15), whose geometry sits behind its tooltip and whose
scroll-on-compress is last. Three addition owners put their enabled flag
first; several owners had a title font that belongs directly behind the
title.

Pairs never co-observed were not reordered. Each was placed at the
position nearest its previous one that satisfies every observed pair, and
the list of them is recorded so nobody mistakes a placement for a
measurement - the same discipline that saved the button package from a
topological sort's guess.

Verified independently in review: 49 778 -> 49 849 exact (+71, 97.94%),
differing 1 100 -> 1 029, missing 20 and extra 0 unchanged, zero
regressions by set comparison. Reference trees 39/39, bundled corpora 9/9,
root lib 2137/33 with zero name-diff.

Order as a class is consumed: of the 802 remaining differing forms exactly
one is pure order, and it is a DCS schema embedded in a form - the DCS
writer's territory. The rest differ by content, chiefly properties not yet
emitted at all, and those are named with counts.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… rules

Fourth attempt at this class, and the first to succeed. The three refusals
before it were right about their evidence and wrong about one thing: they
built the list's field universe by regex over the query text, which admits
every dotted name and so produced 104 false positives that made the rule
look non-total. The universe is not text - it is the query language's
column naming rules applied to the final select.

With that model the rule is total: the tilde marks exactly the required
fields whose name is not in the universe, 4356 of 4357 observations, and
the single exception turned out not to be a tilde question at all but a
separate missing pseudo-field, which is closed here too.

What the universe actually is, per list mode: for an auto list, the family's
standard attributes in both spellings plus the declared children from the
reference index; for a manual query, the column names of the final batch -
an explicit alias, a bare alias, the concatenation of path segments after
the source, or a parameter's name - plus the standard attributes and
dimensions the platform appends itself, each unless the query already
selected that field under another alias, plus the English twin of every
standard attribute selected under its Russian name; and when automatic
field filling is off, only the names from the composition extension. That
last flag is read from the raw settings bag, because our exporter does not
emit the element itself.

The four findings that turned the previous false positives into agreement
were the path-segment concatenation, the parameter alias, the meaning of
the auto-fill flag, and one pseudo-field id read out of the raw form blob.
A wildcard selection and any unparseable input refuse rather than guess, as
before.

Verified independently in review: 49 849 -> 49 895 exact (+46, 98.03%),
differing 1 029 -> 983, missing 20 and extra 0 unchanged, zero regressions
by set comparison. Reference trees 39/39, bundled corpora 9/9, root lib
2143/33 with zero name-diff.

The class is consumed: across all remaining differing files not one
required-field block still disagrees about a tilde. The sort was not
touched - the platform sorts on the full string with the marker in the key,
1766 of 1766, and that was already correct.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ir real fields

Two classes that had been diagnosed and deliberately left, closed here by
reading bytes rather than relaxing anything.

The flowchart writer was largely a table of literals. It now has a grammar
read off all seven blobs and their 197 elements: the schema header is a
record carrying colour, grid, steps, mode and six keyed print parameters
followed by a trailing id counter, and each element carries a style record
whose three colours go through the same decoder the forms use. Manually
moved segments, arrow ends, tooltips, alignment, transparency and z-order
all come from the bytes; fields that never vary are pinned and refuse on
deviation. The two framing defects are fixed too - the missing byte-order
mark and one trailing newline, both on all seven, and both invisible to any
element-level measurement. All seven are now byte-exact.

The eleven refused catalogs are closed by extending the model, which is
what the previous package said was required and correctly declined to fake:
the standard-attribute type gained the two fields it lacked, the choice
parameters parse through the existing typed reader when a resolution scope
is present, and without a scope only an empty list is admitted while a
non-empty mask still refuses. The writer prints both elements at the two
sites that need them and the other three are untouched.

One catalog carries a design-time reference whose owner no index resolves.
The platform prints the raw uuid pair, and so do we now - forms already did
this. A known but incompletely resolved owner still refuses, so this admits
exactly the unresolvable case and nothing more.

Verified independently in review: 49 895 -> 49 913 exact (+18, 98.06%),
missing 20 -> 9, differing 983 -> 976, extra 0 unchanged, zero regressions
by set comparison. Reference trees 39/39, bundled corpora 9/9, root lib
2145/33 with zero name-diff. The new bundled fixture's claimed native hash
was cross-checked against the configuration manifest and matches the file
it names.

Three more hand-written fixtures encoded flowchart layouts the platform
does not write - a header without print parameters and a geometry without
its tail. Tenth instance in this series.

Not attempted, and diagnosed on a fresh run so the codes are current: five
characteristic-type plans, one task and one filter criterion.

The package disclosed that it ran a forbidden stashed-checkout in one
compound command and recovered immediately. Verified here before merging:
the shared stash stack is empty and both concurrent worktrees still carry
their full diffs.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…a wrong index

Four classes leave the divergence table entirely, and each failed for a
different one of this series' recurring causes.

A choice form was resolved through the plain reference index the form
parser receives, which resolves form identifiers under the wrong owner -
so all 19 identifiers came out named after the wrong object. The correct
overlay already existed and was already built for another caller; passing
it is one line, and it alone is worth 22 files. A wrong index, not a wrong
rule.

Two structural whitelists, reader and writer, restricted an enabled flag to
four element kinds where the slot is a total function on all eleven
admitted kinds - the fifth and sixth instance of an arity or tag whitelist
in this series.

An incomplete-marking property was already in the order table and already
emitted, but only for one of its two values, and nothing ever set it for a
table: the writer was ready and the reader was empty. It lives at a reverse
offset, which is why an earlier forward-slot sweep found nothing - the
columns and the counted bag make that layout variable-length.

An edit format on check boxes was simply unread: the empty tuple on 6222
items and a localized tuple on exactly the 64 carriers.

Every rule was checked as a total function over the full corpus including
absences, then confirmed as equality of sets across all 50 898 files, and
at instance level each property matches the platform one for one.

Verified independently in review, merged three-way on top of c08386d:
49 913 -> 49 989 exact (+76, 98.21%), differing 976 -> 900, missing 9 and
extra 0 unchanged, zero regressions by set comparison. Reference trees
39/39, bundled corpora 9/9, root lib 2152/33 with zero name-diff, order
inversions still zero.

The package re-measured its own ceilings first and found one had halved
since the brief, and the family's joint ceiling was 102 rather than the 56
it was given - stale numbers again, from a base that had moved by 71 files.

One class it could not move is bounded precisely: the remaining choice
parameters need four value shapes the schema crate refuses and six
metadata files in another module. It also implemented one generalization
that looked in bounds, exported, measured it fixed nothing and broke
nothing, and reverted it rather than ship a widening with no evidence
behind it - the cause is one level deeper, in an index the form parse
context never receives.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ists

The largest single gain of this series, and it came from the two cheapest
causes: slots nobody read, and filters that discarded valid layouts.

Thirteen properties across seven owners had no reader at all - a table's
height variant, row-count pair, title and footer heights and output mode; a
popup's shape representation; a button's shape and picture location; a
pages group's read-only switch; a search addition's whole geometry run and
its tooltip mode; a radio field's item width and title height; a
spreadsheet field's scaling mode. Each is a total function over the full
observation set of its owner including absences, and no code maps to two
different platform answers.

Four more were read wrongly rather than not at all. A page's
scroll-on-compress was pinned to a top-level slot under a shape condition
that missed 103 of its 104 occurrences and invented 15; its real home is a
member of the options tuple. A page's horizontal alignment decoded one of
its four codes. A group's children alignment lacked two. A radio field's
edit mode and enabled flag sat at correct slots behind a tag whitelist.

Three structural filters were discarding valid data, and one of them
explains four classes at once: a conditional-group schema admitted three
discriminators but not the fourth, so 23 pages with a conditional prefix
were thrown away whole, subtree included - which is why their titles,
tooltips and child items all appeared missing. A tooltip-mode schema
spelled the rule field_count - 7 as a whitelist of four exact lengths, so
every longer group lost the property; it now shares the progression branch
its five sibling owners already used. And a suppression rule hid a false
auto-max-width on hierarchical tables, where the slot is a total function
on all 105 tables the platform writes it for.

Verified independently in review, merged three-way on top of 75bddbf:
49 989 -> 50 211 exact (+222, 98.65%), differing 900 -> 678, missing 9 and
extra 0 unchanged, zero regressions by set comparison. Reference trees
39/39, bundled corpora 9/9, root lib 2160/33 with zero name-diff, order
inversions still zero, and every one of the 28 touched owner/property pairs
matches the platform instance for instance.

Two tests encoded the old, wrong scroll rule and were rewritten against
observed bytes - the eleventh instance in this series.

This change and 75bddbf independently closed the same incomplete-marking
property and reached the same slot and code map; the merge keeps one
implementation and the wider of the two enabled-flag rules, which drops the
whitelist for all eleven admitted kinds rather than adding a fifth tag.

Named and measured but not done: a picture field's border colour needs the
colour tuple decoder rather than a scalar, and a footer alignment is
calibrated on one field kind only - the decoder is shared, so widening it
without evidence on the others was declined.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Seven of the nine files the export could not produce are now emitted and
every one is byte-exact. Each was closed by giving the model the field it
lacked, never by relaxing a check.

A filter criterion's pattern element is a primitive the parser did not
admit; it now goes through the shared element reader and its qualifiers
through the existing type writer. Characteristic-type attributes had three
slots pinned to empty, two of which the platform fills - both now read
through readers that already existed, and where no resolution scope is
available only an empty record is admitted, the rule established in
c08386d.

Two more were one table doing duty for two families. A data-path resolver
was hardcoded to the catalog prefix and is now parameterised by family,
with the negative-code table left catalog-only because that is the only
family it is evidenced for - another family's bare code refuses. And a
tabular section's reference marker was hardcoded to the catalog's value
while a characteristic-type plan uses a different one; both were already
declared in their family tables, so the rule now reads the marker from the
family rather than from a constant. That tightened as well as widened: the
catalog's value is no longer accepted as a reference marker where it
actually means something else.

The standalone content file was building its reference index from a map
that has no defined-type roots. Rebuilt from the configuration root index,
and the evidence is strong: of 3636 references 3626 resolve and all 3626
match the platform's names positionally with no disagreement, while the
ten that do not are exactly the defined types, cross-checked against the
dump info.

Verified independently in review: 50 211 -> 50 218 exact (+7, 98.66%),
missing 9 -> 2, and the differing set is byte-identical - all seven moved
straight from missing to exact. Zero regressions by set comparison.
Reference trees 39/39, bundled corpora 9/9, root lib 2165/33 with zero
name-diff.

The twelfth hand-written fixture encoding a shape the platform does not
write: a task's attribute wrapper was specified with a code and arity the
platform never uses for that family. Fixed - but the task itself stays
refused, and the reason is the right one. It is the only task in the
corpus, so each of its property slots has exactly one observation, and
seven of them contradict tables calibrated on a synthetic export. The
neighbouring slots agree exactly, so the indexes are not shifted - the
encodings differ. Separating them needs a second independent capture of a
task with different values; with one sample any table would be a fit to
one file.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…any marker

The choice-parameter grammar admitted three of the shapes the platform
writes, and because one unhandled element discarded the whole collection,
a single unread value cost the form its entire block - the
inadmissible-instead-of-not-my-case failure again, in the place with the
widest blast radius.

The refusal set was enumerated rather than sampled: every raw value the
grammar rejected across the corpus, 51 occurrences in 18 distinct
spellings. Forty-six are now read. A scalar string, a fixed-array decimal,
and a non-nil type with a nil value - which is not a missing identifier but
the type's empty reference, so the whole name comes from the type and no
index is needed.

The fourth shape had to be reinterpreted rather than widened: a bare marker
that earlier readings treated as a payload missing its wrapper is the
entire value - the ordinary undefined marker, which the platform writes as
a nil element with no presentation at all.

The link terminal is now a newtype over any canonically spelled negative
marker instead of three hardcoded names, and it resolves through the
existing family table rather than a new one. That closes the last refused
form, byte-exact. The same marker means one thing under a catalog object
and another under a characteristic-type plan, so a family-blind fallback
would have written the wrong name - the blast radius was measured, not
assumed, and the last-resort mapping is kept only for the two terminals
that already depend on it while any other unnamed marker now refuses.

Verified independently in review, merged three-way on top of 93dca56:
50 218 -> 50 233 exact (+15, 98.69%), differing 678 -> 664, missing 2 -> 1,
extra 0 unchanged, zero regressions by set comparison. Reference trees
39/39, bundled corpora 9/9, root lib 2167/33 with zero name-diff.

Five occurrences stay refused and the boundary is named: predefined
catalog items, whose index exists but is built in a module this package
was not allowed to touch. It did not retry the generalization a previous
package had already measured at zero effect and reverted.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ties by their own slots

Two packages, disjoint by file, merged together.

The spreadsheet cell's leading value is a member mask, not a shape name.
Across all 2 025 751 cell records of the corpus fifteen masks occur, and
each record's arity is exactly two plus the widths of the members its mask
names - the same defect the drawings had, one level down. The reader keyed
off six whole mask values, so every one of the 39 documents carrying a
member outside that set was differing, and the note member was read at the
wrong offset for two of the masks. The walk is strict about arity and
unknown bits, while the contents of the text list and the note stay as
tolerant as before, so a member we cannot spell costs the member and not
the cell.

The default format index is no longer a wall, and the new fact is that the
value was never the stored thing - the format is. A top-level field holds
the document's leading default-format record, and the published index is
the position of the first pool entry carrying that record's own published
bytes: 614 of 618. Presence follows the record's mask, 612 of 612 for a
non-zero mask, and of the 71 with a zero mask exactly the six whose pool
already holds an empty entry publish it. Where our pool lacks the entry it
is now materialized as the last one. Agreement goes 583 to 648 of 683 and
the class ceiling to zero; the four documents that name a later duplicate
stay a typed residue. Three earlier refusals were right about their
evidence - they measured the value, and the value is downstream.

Two colour rules were fitted rather than derived: stored RGB values were
being rewritten as named style references the platform does not write.
Removed, with the two tests that asserted the fitted names. And a web
colour whitelist knew 38 ordinals where the corpus stores six more - a
refused slot made the whole palette unrecognisable, so 13 documents lost
every colour they had.

On the forms side six properties across nine owners: a border colour that
five owners never read, a button parameter, a page title binding whose
resolver refused the whole slot over a conditional prefix that moves
nothing, a row picture path now going through the one chain walker instead
of a private table, a pages event container gated on one slot repeating
another where 51 containers disagree, and a footer alignment widened from
one code to three after the rule was confirmed on all eleven admitted
kinds rather than the one it was calibrated on.

Verified independently in review: 50 233 -> 50 342 exact (+109, 98.91%),
differing 664 -> 555, missing 1 and extra 0 unchanged, zero regressions by
set comparison; forms also checked at instance level over 1.2 million
triples with none lost. Reference trees 39/39, bundled corpora 9/9, root
lib 2183/33 with zero name-diff, order inversions still zero.

Declined with measurement rather than guessed: three tilde-prefixed
declared columns, where two candidate predicates disagree with the
platform on 24 and 83 observations; two singleton picture markers, one
observation each; and a group title binding whose two correct resolutions
are cancelled by two wrong ones in the same files, buying nothing.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…story

The README still carried 92.7200% from a run on 3fa316b in July. Current
measurement is 98.9076% (50 342 of 50 898) on 69d7056.

The two figures are not a delta and the README now says so. The July
capture was taken with platform build 8.3.27.1989 and its native tree has
49 623 files; the current manifest is build 8.3.27.2214 with 50 898. Only
runs against the same native manifest are comparable, so the old table is
kept under its own heading with its build named rather than overwritten.

The current row also records what the number is measured against - the
round2 manifest whose determinism was confirmed by two independent
captures - and that every step is gated on the three clean-room reference
trees and the nine bundled corpora alongside the full comparison.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…g them

The chain the map called three coupled classes is one rule read on the
wrong axis. Measured at instance level over all 1947 native dynamic-list
settings blocks and their 5841 property instances, the platform's rule is
about presence, not content: a property absent from the stored bag means
the standard setting is materialised and written - 5070 instances across
1850 blocks, written in every one - while a property present and empty is
written for none. The two states never mix inside one bag, so the empty
container stays empty exactly where it did before.

Two gates were wrong and both are removed. One keyed materialisation on a
user-settings flag, which the measurement rejects outright: 13 of the 16
blocks storing that flag false still carry materialised standard settings.
The other required the bag to hold something.

That also answers the ten grouping files the previous package left with a
measured dead end. It had looked for a finer discriminator on the group
record and reported that none exists - correct, and the reason is that the
premise was wrong. The four outcomes it saw are the physical states of the
three properties crossed with whether one identifier is empty, and once
absence is materialised unconditionally all ten fall out with no
group-specific rule at all.

Two smaller rules land with it: the user-settings flag is written false
exactly when the bag stores it so, 16 against 1931 with no counter-example;
and one settings child whose storage and source names differ by more than
their initial letter, 3 against 1944, placed by observation.

Verified independently in review, merged three-way on top of 69d7056:
50 342 -> 50 368 exact (+26, 98.96%), differing 555 -> 529, missing 1 and
extra 0 unchanged, zero regressions by set comparison. Reference trees
39/39, bundled corpora 9/9, root lib 2184/33 with zero name-diff, order
inversions still zero across all 413 owners.

At instance level the class is consumed: 38 disagreeing blocks of 1947 go
to zero, and no differing file's diff touches these elements any more.

The repeated identifier the map flagged is a build-wide constant, but it
arrives in the stored bytes rather than being synthesised - and the map
undercounted it, at 19 files rather than 9, on a different element than it
named.

Named for whoever owns the rest of that block: four dynamic-list
properties we never emit, worth 9, 7, 7 and 4 files, are not user-settings
properties and were left alone.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ndent and QName

Five properties, all stored in every one of the 1947 native dynamic-list
bags and none of them emitted. Each rule was checked as equality of sets
over all 1947 blocks with no disagreement, and the oracle paired every
block with its own bag by output path so nothing was attributed by guess.

One of the five was already being read and thrown away: the auto-fill flag
is re-scanned out of the raw bag by the tilde package's field universe, and
there was simply no field to carry it and no writer to print it. The tenth
instance of that shape in this series.

The main-table suffix was the two-inconsistent-tables pattern again, and
measurably wrong rather than merely incomplete: one family was filed under
a category the corpus does not store for it, another category was absent
entirely, and a third arm had no evidence behind it at all. Replaced by a
measured category-and-kind table, with unobserved pairs writing the bare
name. The hand-written fixture that asserted the two wrong rows is
corrected - the thirteenth fixture in this series encoding something the
platform does not write.

One relative order is genuinely unobserved: none of the eleven blocks
writing the key properties also carries a main table. It is documented as
unobserved rather than presented as measured, and every observed pair is
satisfied.

On the embedded spreadsheet, two defects are fixed here. The block was
indented one tab short of native on all 22 occurrences. And a qualified
name inside an attribute value was never rewritten, because the prefixing
pass looked at element names only - the value of a type attribute is a
qualified name resolving against the same default namespace, so it has to
move with them.

Verified independently in review: 50 368 -> 50 386 exact (+18, 98.99%),
differing 529 -> 511, missing 1 and extra 0 unchanged, zero regressions by
set comparison. Reference trees 39/39, bundled corpora 9/9, root lib
2190/33 with zero name-diff, order inversions still zero across 417 owners.
At instance level all five element classes fall to zero files and zero
lines.

The package also refuted the model it was given for the rest of the
embedded spreadsheet, and that correction is the useful part: the extra
skeleton is not a standalone-versus-embedded profile question. It is
content-driven - eleven of the 22 native blocks do carry the language
settings and six do carry the template-mode flag. Two top-level fields of
the stored body decide both, and the spreadsheet model reads neither,
synthesising them as constants. A blanket truncation would have been wrong
for half the corpus, so none of the 17 files closes from this side; the
three field-level facts are handed to the spreadsheet owner.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ral prefixes

The parameter, presentation and type-body residues were one defect. The
stored blob is a standalone document that declares each namespace at the
element first using it, under a depth-numbered prefix, and the code matched
two literal prefix strings. Anything declared at another depth, or a second
declaration of the same namespace, fell straight through - and the
qualified name in character data was never resolved at all. Seventh
whitelist of the series.

The replacement is measured rather than enumerated. All 5201 native forms
declare the same seventeen namespaces on the root, one distinct set with no
variation, so that set is the table; the data-composition helper is now a
restriction of it rather than a second copy, which is how the two can no
longer disagree. Across 32 332 prefixed declarations in the blobs exactly
one namespace is outside the root's set, and it keeps a generated prefix
renumbered by its depth in the form, with the index counting declarations
actually written so a dropped sibling does not consume one. Character data
is treated as a qualified name only where the element or its type attribute
says it is: 510 bodies, 508 already root-prefixed and returned byte-
identical, two resolved through their own default declaration.

Verified independently in review: 50 386 -> 50 391 exact (+5, 99.00%),
differing 511 -> 506, missing 1 and extra 0 unchanged, zero regressions by
set comparison, and the five closed files are exactly the five predicted
before the change. Reference trees 39/39, bundled corpora 9/9, root lib
2196/33 with zero name-diff.

The type-order question is answered and deliberately not fixed. There is
exactly one mixed type run in the whole corpus, and the key landed in
793da73 decides it correctly - the reference's uuid falls below the
builtin's evidenced interval, so the reference sorts first, which is what
the platform writes. It is not applied because that key is private to the
schema crate and runs only on template storage, while a form's schema
arrives as a packed blob whose type ids are substituted in place. Restating
the bounds table here would be the two-inconsistent-tables defect this
series has hit six times, for one file and one observation, against a table
that narrows as evidence grows. The right change is one line of visibility
in the crate that owns it.

The DCS residue is now a single file - that one ordering case. What the
settings family left behind went to form properties and spreadsheet
payloads, not to namespace spelling.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Root metadata XMLs go from sixteen differing to two. Six separate causes,
each traced to a reader that was narrower than the platform:

Exchange plans were outside the family list that reads owned-command
properties, so their whole block was absent; one register's command
carried a picture descriptor neither picture table admitted, and the same
shape used to abort the entire descriptor by reading past a one-element
reference. Choice parameters were dropped whole by a reader that
recognises an atom only through the identifiers inside it, so an undefined
marker and a fixed array of numbers both looked like nothing at all. A
boolean fill value had a branch for the bare flag but not the wrapped one.
A choice form resolved through the object index, which names a form row by
whatever family its row shape happened to read as. And one standard
picture identifier was simply missing from its table.

The choice-parameter fix is ordered deliberately: the complete typed
reader is consulted only where the older identifier-based one finds
nothing. The reverse order was tried and measured - it regressed 17 files -
so the old reader keeps every answer it does produce.

Configuration.xml is not 33 defects but one unwritten tail: 33 consecutive
properties gated behind an all-default reference check that this
configuration genuinely fails, plus one element emitted in its legacy
early position. It fails closed, correctly, and decoding those properties
needs tables in the schema crate.

The bot's framing is fixed - it was the only file left on a legacy
two-namespace writer, which is now deleted, so it shares the full writer
and gets the byte-order mark, the self-closed empty comment and no
trailing newline. Its other two properties stay unwritten: the assignment
is forced by the tuple's shape, but forcing is an argument and the brief
asked for an observation. There is no second bot in the native tree, the
three clean-room trees, the nine bundled corpora or the fixtures.

The task refusal is confirmed with the reason sharpened, and it is not a
missing table entry but a collision: the same byte at the same slot means
one thing in the synthetic calibration and another here, on three separate
slots. A table asserting one value cannot be widened to also mean its
opposite, and with one sample on each side the bytes cannot say which
calibration mis-attributes. What is needed is a capture with two tasks
differing in these properties - the same single-field probe series the
bundled configuration corpora already use.

Verified independently in review: 50 391 -> 50 405 exact (+14, 99.03%),
differing 506 -> 492, missing 1 and extra 0 unchanged, zero regressions by
set comparison. Reference trees 39/39, bundled corpora 9/9, root lib
2196/33 with zero name-diff.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…differently

The format pool's defects were member-level, not order-level. Comparing
our published sequence against the platform's across all 683 documents,
592 pools were already exact and 91 differed, from five causes each pinned
as a total function.

One member number was simply a hole in the supported list. Two more are
the interesting ones: a drawing-referenced record spends two slots on
different members than an ordinary record does - one on a print flag
stored inverted, one on four packed border flags - and no
drawing-referenced record anywhere in the corpus publishes any of the four
ordinary border members, which is what makes that reinterpretation total
rather than fitted. A fill pattern was being synthesised whenever three
unrelated members lined up, inventing values across seven documents that
the platform never writes.

Two defects outside the pool cost whole blocks. Page geometry is a decimal
and the whole-record read demanded integers, so one unparseable token
refused every print-settings member of every document carrying it; members
are now individually strict, and a token this reader cannot spell refuses
its record rather than silently dropping. And the extended keys were gated
on an exact count, so the one document that omits the optional printer
name lost its entire block.

The embedded-spreadsheet fields handed over by the forms package are now
read rather than synthesised, and the safety check is the useful part: all
674 standalone bodies carry the same language record and the same
template-mode value, so reading them is a byte-level no-op there and
changes only the embedded skeletons.

Worth recording: the lib suite first showed 36 failures rather than 33,
and the three extra were the packer round-trip tests being right. Emitting
the template-mode element unconditionally had been hiding that this
project's packer writes a looser layout than the platform's. The read is
now gated on the fixed prefix that all 674 native bodies and all five
embedded ones have and a repacked body does not - fixed rather than
suppressed.

Verified independently in review, merged three-way on top of da33e02:
50 405 -> 50 427 exact (+22, 99.07%), differing 492 -> 470, missing 1 and
extra 0 unchanged, zero regressions by set comparison. Reference trees
39/39, bundled corpora 9/9, root lib 2202/33 with zero name-diff,
cf_roundtrip and cf_native_roundtrip green. Every member this change
touches is exact at instance level across all 683 documents.

Two measured negatives kept for the next package: the pool order is not
replaceable wholesale - identity order fails 116 documents against the
current 91 with no current-only failures - and the font-table order is
downstream of it rather than independent, since the two candidate rules
fail on disjoint sets while the pool order is still wrong.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Three form properties the exporter never wrote, each one a slot nobody read
rather than a value anybody got wrong.

`FooterText` lives in slot 19 of the wrapper-37 field record, ten past the
title's own slot.  The slot holds a populated localised-string container on
every one of the 9 native items that carry the element -- one `LabelField`,
seven `InputField`, one `PictureField` -- and an empty one everywhere else.
Its XML position is pinned against the pairs the platform actually spells:
it trails `DataPath` (9), `EditMode` (5), `Title` (4), `ToolTip` (2) and
`FooterDataPath` (1), and leads `ContextMenu` and `ExtendedTooltip` (9 each),
`Width` (2), `Events`, `ValuesPicture`, `FileDragMode`, `Wrap` and
`ChooseType`.  It never co-occurs with `FooterTextColor`, `FooterFont` or
`FooterHorizontalAlign`, so its place among those three stays unobserved and
the comment says so.

`Zoomable` is option member 4 of the `PictureDecoration` tuple and member 7
of the `PictureField` tuple.  Checked as a set against the platform's own
answer over the whole configuration, not against a sample: of the 3 725
decoration tuples the export walks, member 4 holds `1` on exactly the 7 the
platform writes the element on; of the 2 220 field tuples, member 7 holds `1`
on exactly the 6 it writes it on.  No false positive on either owner.

`ImageScale` is member 12 of the decoration tuple, and `100` there is the
unwritten default rather than an absence: the member holds `100` on the 3 718
decorations that carry no element and, on the other 7, exactly the number the
platform writes -- `200` six times and `108` once.

Measured on the full "1С:Управление торговлей 11.5.27.75" export against the
native manifest: 50 427 -> 50 444 byte-identical (99,0746% -> 99,1080%),
differing 470 -> 453, missing 1, extra 0.  Proven by set difference on the
exact-set, not by counter arithmetic: 17 files gained, 0 previously-exact
files broken.  Reference trees 39/39, bundled corpora 9/9, `cargo test --lib`
2202 passed / 33 failed with the failing names identical to the base commit.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: In Progress

Development

Successfully merging this pull request may close these issues.

1 participant