Repository navigation
HOTSPOT-SPLIT 1/2: per-feature diagnostics, faults, property families, animation kinds; derived paint unions - #137
Merged
Merged
Conversation
…ator.ts) and its animator suite The parity reference animator now wraps the translated root, so the Chrome frame lanes judge the code the generated Swift and Kotlin run; the animator suite (rt-vectors/animator, harness op rt-animator, p1 suite after hit) checks the translations bit for bit against it on the host and, through device-vectors, on device. No native runtime or row changes.
…ilies, animation kinds and derived paint unions Each feature owns its own file and one sorted line in the central list: diagnostics/codes/<feature>.ts (codes with their catalogue entries, pinned per feature in test/diagnostic-codes/<feature>.json after the frozen legacy list), faults/<feature>.ts, css/animation-kinds/<family>.ts, and one family(...) line per property family in properties.ts. The paint write and plant unions are derived from the registered modules, so a paint module edits only its own files. Values are unchanged (same codes, order, catalogue, faults, longhand tables and kinds); registry-claims.test fails when two features claim one name.
…o features fails at load
…own files (entry.ts, diagnostics/codes/<feature>.ts)
Commands: pnpm regen; pnpm run parity:devices; pnpm regen
The driver released /tmp/dragon-train-quiet as soon as the machine went quiet, so jobs queued behind the request started beside the rerun and loaded the machine again: #74's quiet rerun ran at load ~38 and failed 24 files on timeouts after its device lanes had passed. waitForQuiet takes hold: a quiet result keeps the request until the driver's rerun ends; a failed wait still releases it. land.test pins both.
ANIM-b1 3b part 1: the runtime animator as a translated root, with its animator suite
Commands: pnpm regen
…f the whole suite The quiet rerun of the full suite kept failing on timeouts (#124: 15 files, all timed out, at load still ~35 from processes outside the heavy lease). After a failed pnpm test the driver now reads the failing files from the vitest log and reruns each alone on a quiet machine, same assertions and timeouts; every one must pass. A run with no summary (crash, kill) or more than SOLO_RERUN_MAX failing files reruns the whole suite as before. land.test pins the log parsing.
…ide it The parallel scheduler took a whole-tree git add -A snapshot when one step finished, while another was deleting and rewriting its outputs, and aborted on 'unable to stat'. Snapshots now exclude (git exclude pathspecs, same glob semantics) the declared outputs of every step still running; those paths were already left out of change detection, so the stray-write guard is unchanged.
land: hold the quiet request through the quiet test rerun
Commands: pnpm regen
…with an explicit reviewed list
… maximal CSS support; COVERAGE-RANK and CI-FULLTEST lanes
…ct on failure, per-PR merges in order
…ly on its parent's position
…eal-world reach per size docs/goals/milestone-2-proof/coverage-rank.md is generated by scripts/coverage-rank.ts (PR to follow) from data/coverage-rank-input.json and the chromestatus snapshots (csspopularity and featurepopularity, fetched 2026-10-04).
…ish; non-test proof errors stop the driver; clean other trees' ignored outputs before a proof
…erated with scripts/coverage-rank.ts)
land: rerun each failing test file alone on a quiet machine
Commands: pnpm regen
… reruns failing files alone; skip the master proof for a tree this run proved
regen: a snapshot never reads the outputs of a step still running beside it
Commands: pnpm regen
land: batched landing (one proof per batch, prefix bisect, per-PR merges in order)
… SIGTERM kills the running step through a supervisor and records INTERRUPTED, failing no PR
…a master left unproved; the lock records the driver and kills an orphan; cleanup after any abnormal death, including the run's devices
…king; lock pids are matched with their start times; the merge critical section starts at gh pr merge
…early one; lock files written atomically, a missing start time holds; the unproved record clears only when master is on a proven tree
…y, waits retry until a pid parses, the early-signal case uses a 3 s window; land: a stale lock is taken over by an atomic rename
#145's clean ran `git clean -fdX` with `-e !node_modules/` negations. A negation un-ignores the kept directory, so git descended into it and deleted the ignored files nested inside: node_modules/.pnpm/*/dist/, every installed package's code. The next proof's `pnpm test` failed to start (vitest/dist/cli.js missing) and pnpm install --frozen-lockfile did not restore it. Pathspec excludes don't help: git clean removes a whole ignored directory as one unit. The driver now lists the ignored files (git ls-files --others --ignored) and removes those outside the kept trees itself. land.test adds nested dist/ files under node_modules to the kept set and a top-level dist/ to the removed set; the old clean fails it.
Commands: pnpm regen
land: keep installs when cleaning ignored outputs before a proof (hotfix for #145)
Commands: pnpm regen
Commands: pnpm regen
thejackshelton
added a commit
that referenced
this pull request
Oct 5, 2026
…137/#138): PNT2's plants on TRANSFORM_EMITTER's type, the transforms group one GROUPS line, the quads regen step in scripts/regen-steps/pnt2.ts after ua, .gitattributes in sorted position; master's side of the hot-spot files; targets.ts keeps hitCaseIds and the refused-aware p1 hit suite beside master's animator suite
thejackshelton
added a commit
that referenced
this pull request
Oct 5, 2026
#150-#152) # Conflicts: # packages/dragon/src/css/animation-kinds.ts # packages/dragon/src/diagnostics/catalogue.ts # packages/dragon/src/diagnostics/codes.ts # packages/dragon/src/emit/paint/registry.ts # packages/dragon/src/lower/paint/registry.ts # packages/parity/src/fixtures.ts # packages/parity/test/device-vectors.test.ts # packages/translate/test/p1-floor.json # packages/translate/test/translate.test.ts
thejackshelton
added a commit
that referenced
this pull request
Oct 5, 2026
…ers): the resize-capture step moves to scripts/regen-steps/mq-r1.ts (after capture, so before profile-rows), the media-runtime group to one sorted GROUPS line, .gitattributes sorted; hit suite 2092 beside master's animator suite
thejackshelton
added a commit
that referenced
this pull request
Oct 5, 2026
…138): SELD-R2's faults move to faults/seld-r2.ts (one FAULT_GROUPS line), the interaction group is one sorted GROUPS line, master's side of the central files and tests; project.ts keeps both nativeLanes and interactionLanes; p1/hit pins carried at 2060 until the regen re-derives them
thejackshelton
added a commit
that referenced
this pull request
Oct 5, 2026
… pipeline work) into inl1a-lowering. Conflicts: - faults: INL1a's brAsSpace and inlineWrapperPerElement move into faults/inl1a.ts (HOTSPOT-SPLIT's per-feature fault files). - ios-layout.ts: INL1a's Lowerer gains the image naturals; a replaced element is never inline-level (laid out as its own leaf beside the inline content, as REPL-a does); lowerBox's line strut counts only inline content, not replaced leaves (review finding 3 on #91: a block holding only an img gets no strut). - native-program.ts: REPL-a's transform-moves walk with INL1a's flat inline views. - rt-hit.ts: master's child count with INL1a's named inline-box refusal. - computed-checks.ts and elements.ts: REPL-a's replaced check beside INL1a's inline-level and inline checks; br beside the replaced tags. - expected-dump.ts, native-support.ts, native-build.ts, device-run.ts, targets.ts: both sides' imports, walks, plants (the line plant with image-offset-1) and corpus suites (INL1a's hit-vector count beside ANIM-b1's animator suite). - device-lanes.test.ts and device-run.test.ts keep both sides' tests.
thejackshelton
added a commit
that referenced
this pull request
Oct 5, 2026
…peline changes) into form-a-v2; no conflicts. Generated outputs take the merged side, rebuilt by the following regen
thejackshelton
added a commit
that referenced
this pull request
Oct 5, 2026
…OTSPOT-SPLIT #137/#138) into form-a3-v2 Per the HOTSPOT-SPLIT migration note: master's animation-kinds.ts and fixtures.ts are taken whole; appearance's kind (discrete, Chrome 145 snapshot) moves to animation-kinds/box.ts, and the controls group is one sorted GROUPS line (it now runs after the legacy groups, in id order). Generated outputs take the merged side, rebuilt by the following regen.
This was referenced Oct 5, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
HOTSPOT-SPLIT 1/2 (dragon package). Feature PRs no longer edit the same lines of the dragon registries: each feature owns its own file, and the central list has one line per feature, sorted by id, so two features only touch the same lines when their ids are neighbours. This lands before the in-flight PRs; the migration note is at the end.
What changed
diagnostics/codes/<feature>.tsholds each feature's codes and their catalogue entries.s2,s3a,s4a,s5,tree,txt1candanim-b1.repl-aandtxt1aexist empty for the in-flight lanes.codes.tslists the legacy features first, in landing order, then the rest by id.DIAGNOSTIC_CODESkeeps the same 49 codes in the same order.catalogue.tsgathers the entries. The entry type and helpers moved todiagnostics/entry.ts.test/diagnostic-codes.jsonis now the frozen legacy pin. Each later feature is pinned bytest/diagnostic-codes/<feature>.json.faults/<feature>.ts. The 25 faults are grouped by topic, andinl1a,inl2aandovflexist empty.CompilerFaultsis the intersection of the groups, andNO_FAULTSholds the same values.PaintWriteandAnyLoweringare derived from the registered lowerings.PaintPlantNameis derived from the emitters.PaintEmitter<K, P>takes the plant names asP, and the border emitter declares its two.properties.tsregisters each family on onefamily(...)line inFAMILIES, in table order.LONGHANDS,SHORTHANDS,INHERITED,PROPERTY_ASPECTSand the role tables are derived from it. Shorthand order keeps overflow after flex (SHORTHANDS_MOVED). All values are unchanged.css/animation-kinds/<family>.ts, spread one line per family in sorted order. Shared kinds and types are inanimation-kinds/kinds.ts.test/registry-claims.test.tsfails when two features claim the same code, fault, longhand, shorthand, animation key, paint write kind or plant. It also fails when a central list is unsorted or a feature file is unregistered. Codes, faults, longhands and shorthands claimed twice also throw at load.Values unchanged
Before regen, I imported both trees (origin/master and this branch) and dumped
LONGHANDS,SHORTHANDS,INHERITED,PROPERTY_ASPECTS,PROPERTY_ROLE,TEXT_LONGHANDS,COLOR_LONGHANDS,NO_FAULTS,DIAGNOSTIC_CODES,CATALOGUE,ANIMATION_KINDS, the paint plants, emitter kinds, lowerings andpaintWriteCss(). The two dumps are byte-identical. A type-level check showed thatPaintPlantName,PaintWriteKind,keyof CompilerFaultsandDiagnosticCodeare the exact same unions as before.Tests changed (intent kept)
diagnostics.test.ts, "the committed code lists only grow":diagnostic-codes.jsonare in-order prefixes of the live list.diagnostic-codes.jsonexactly, and that every later feature equals its own pin indiagnostic-codes/<feature>.json.seams.test.tsspreads(): it reads each column of theFAMILIESfamily(...)lines (moving overflow's shorthands perSHORTHANDS_MOVED) instead of six spread blocks. The checks are unchanged: each family list is used once, each registry is its families in order, and theseams-floor.jsonfloors still pin every name in order.ua.test.ts, "diagnostics are built only from the catalogue": the exemption now covers the catalogue's own files (diagnostics/entry.tsanddiagnostics/codes/<feature>.ts, where the entries now live) as well ascatalogue.ts. Every other source file is still checked. A plantedseverity: 'error'in another file still fails the test.Outside the spec
packages/dragon/src/emit/paint/border.ts: one line, the border emitter's type declares its two plants.Verification
pnpm regen --force: exit 0, andgit statusis clean afterwards, so every generated output is byte-identical.pnpm typecheck: pass.pnpm test(full suite): 180 of 184 files passed.lanes.testfailed only in "every device lane ran" (device step pending).ua.testwas a real failure caused by the split; it is fixed in 5f58eb2 and passes alone (see "Tests changed").android-profile.testandplanted-swift.testtimed out under load (120 s and 900 s) and pass when rerun alone.Hot spots, measured
I replayed every merge commit on origin/master with
git merge-tree --write-tree(376 merges) and counted the files that conflicted. I also read the open PRs' diffs against their bases.packages/parity/src/fixtures.ts(group list)packages/dragon/src/faults.ts(one-lineNO_FAULTS)scripts/regen.ts(STEPS,MANUAL) and.gitattributespackages/dragon/src/css/properties.ts(six family spreads)PaintWrite,AnyLoweringandPaintPlantNameunions)animation-kinds.tsdiagnostics/codes.ts,catalogue.tsandtest/diagnostic-codes.jsonThe other hot spots this PR does not split:
pixel-reference.test.ts(22 conflicts) is already fixed by the PIN-DERIVE: derived checks replace literal count pins that conflict on every landing #125 floors.seams.test.tsandpaint-seams.test.ts(7 and 5 conflicts; 13 and 15 open PRs) still pin global lists such aspaintPlants(),PAINT_EMITTERSkinds andSUPPORT_FILES. They should move to floors next.device-failures-*.jsonis device output.stylesheet.tsandvalues.tsare code, not lists.Migration note for in-flight lanes (do this at your next catch-up)
At the catch-up merge, take master's side of every hot-spot file below and move your additions into your own file. The
empty per-feature files named here already exist on master, so two lanes no longer edit the same lines.
All lanes
diagnostics/codes.ts,catalogue.tsortest/diagnostic-codes.json(now frozen). Put your codes and their catalogue entries inpackages/dragon/src/diagnostics/codes/<feature>.tsasdiagnosticFeature([...codes], { CODE: error(...), ... }), and pin them inpackages/dragon/test/diagnostic-codes/<feature>.json. A new feature adds its import and one line inDIAGNOSTIC_FEATURES, each in sorted order.faults.ts. Put the fault type (one documented field per fault) and its defaults (false) inpackages/dragon/src/faults/<feature>.ts. A new feature adds its import and one line inFAULT_GROUPS, each in sorted order.PaintWrite,AnyLoweringand theirimport typelines inlower/paint/registry.ts, and toPaintPlantNameinemit/paint/registry.ts. Both are now derived. Type your lowering asPaintLowering<YourWrite>(you already do), and declare your plant names as the emitter's second type parameter:PaintEmitter<'kind-a' | 'kind-b', 'plant-1' | 'plant-2'>. A new module still adds one line toPAINT_MODULE_NAMES,LOWERINGSandEMITTERS.properties.ts. A new family adds its import and one line inFAMILIES,family('<id>', X_LONGHANDS, X_SHORTHANDS, X_INHERITED, X_ASPECTS, X_CONTAINER, X_TEXT_ROLE), placed after the family it follows. Longhands added to an existing family need noproperties.tschange.packages/dragon/src/css/animation-kinds/<family>.ts. The paint seam families (radius, shadow, effects, outline, background-layers, scrollbar) already have empty files. A new family adds its file, its import and one...X_ANIMATIONline, each in sorted order.FIXTURE_GROUPSline. Add'<group-id>': YOUR_GROUP,toGROUPSand your import, each in sorted order. Groups added after the split run after the legacy groups (afterstates), in id order, so runpnpm regenafter the catch-up and retarget any pin that counts on your group's position (for example avalues.testslice(-n); the legacy slice is nowLEGACY_RUN_ORDER.length - 2 .. LEGACY_RUN_ORDER.length).STEPSorMANUALinscripts/regen.ts. Put your additions inscripts/regen-steps/<feature>.tsas{ steps: [{ after: '<step>', step: {...} }], outputs: { '<existing step>': ['extra/glob/**'] }, manual: [{ command, outputs }] }. A new feature adds its import and one line inREGEN_FEATURES, each in sorted order. Add your.gitattributesline in sorted position (the file is sorted now).Per lane
DRAGON_REMOTE_IMAGEandDRAGON_UNSUPPORTED_IMAGEintodiagnostics/codes/repl-a.tsandtest/diagnostic-codes/repl-a.json. Declare'image-offset-1'onIMAGE_EMITTER's type. AddGROUPSlinescontrolsandreplaced. Put the object-fit and object-position kinds in their family'sanimation-kinds/<family>.ts.brAsSpaceandinlineWrapperPerElementinfaults/inl1a.ts, andatomicCollapsesAsLineEndinfaults/inl2a.ts. MoveDRAGON_SYNTHETIC_FONT_STYLEintodiagnostics/codes/txt1a.tsandtest/diagnostic-codes/txt1a.json; TXT-W1's wording edit goes to the same file. TDEC addsfamily('text-decoration', ...)after thetextline, plusanimation-kinds/text-decoration.tsand its spread line; the font-weight, font-style and font-synthesis kinds go inanimation-kinds/text.ts. AddGROUPSlinesatomic-inline,font-shorthand,inline-tags,text-calibration,text-decoration,text-latinandtext-weight, then regen. Inregen-steps/txt1a.ts, addoutputs: { vectors: ['packages/layout/vectors/text-latin/dpr-1/**'], 'dpr-vectors': [the dpr-2, dpr-3 and dpr-2.625 globs] }. Inregen-steps/tdec.ts, add{ after: 'pixel-capture', step: decoration-capture }. Inregen-steps/txt2.ts, add the graphememanualentry.'radius-square', shadow'shadow-offset-1', effects'alpha-ignored', stacking'order-swap' | 'foreground-under', outline'outline-offset-1', gradient'gradient-offset-1' | 'gradient-unpremultiplied-upload', visibility'visibility-ignored' | 'visibility-subtree'. AddGROUPSlinescolor-scheme,gradients,opacity,outline,radius,shadow,stackingandvisibility. VIS addsfamily('visibility', ...)afterscrollbar, plusanimation-kinds/visibility.tsand its spread line. PNT1 fills the existinganimation-kinds/radius.ts,shadow.ts,effects.tsandoutline.ts. Inregen-steps/pnt1.ts, add{ after: 'anim-capture', step: paint-inputs }. Your narrowing of the legacy dashMANUALentry stays an edit inregen.ts. Inregen-steps/bg2.ts, add{ after: 'notices', step: libm }and the gradientmanualentry.propagationFromBodyinfaults/ovfl.ts. AddGROUPSlineoverflow. Inregen-steps/ovfl.ts, add{ after: 'dpr-capture', step: scroll-capture }.'transform-origin-ignored' | 'translate-percent-of-parent'onTRANSFORM_EMITTER's type. AddGROUPSlinetransforms. Inregen-steps/pnt2.ts, add{ after: 'ua', step: quads }.Expected leftovers, all one-line conflicts: two new fixture groups next to each other in sorted order, such as
outline/overflow(PNT1/OVFL),radius/replaced(PNT1/REPL),controls/font-shorthand(FORM/TXT) andtext-weight/transforms(TXT/PNT2); and neighbouring.gitattributeslines, such asexpected-quads/expected-scroll(PNT2/OVFL).🤖 Generated with Claude Code