feat(schema): перейти на автономный EDT-derived model corpus - #290
feat(schema): перейти на автономный EDT-derived model corpus#290Untru wants to merge 239 commits into
Conversation
|
Important Review skippedDraft detected. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
|
Крупный schema-first пакет опубликован в Итог пакета:
Локальные 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. |
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>
Что изменено
ibcmd-schema;ibcmd-xmlподключён к schema registry;Почему
Последний этап 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 --lockedcargo test -p ibcmd-xml --lockedcargo check --workspace --lockedcargo fmt -p ibcmd-schema -p ibcmd-xml -- --checkgit diff --checkСвязано с #276, #277 и #278.
Новый roadmap: ibcmd-rs — EDT-derived Native Parity
Первый Xcore vertical slice (#278)
OpenSpec: openspec/changes/extract-edt-feature-semantics/