Repository navigation
HOTSPOT-SPLIT 2/2: per-feature fixture groups and regen steps; sorted .gitattributes - #138
Merged
Merged
Conversation
…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.
…ion, sorted .gitattributes fixtures.ts registers each group on one line of GROUPS, sorted by id, and runs the legacy groups in their frozen order, then every later group by id. scripts/regen.ts keeps the legacy steps and MANUAL entries and gathers each feature's steps (placed after the step they name), extra outputs and MANUAL entries from scripts/regen-steps/<feature>.ts, one sorted line per feature. .gitattributes is sorted (same patterns, same attribute). STEPS, MANUAL, FIXTURE_GROUPS and FIXTURES are unchanged; registry-claims.test fails when two features claim one group, fixture id, step name, output or command.
…o features fails at load
…own files (entry.ts, diagnostics/codes/<feature>.ts)
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.
…itattributes keeps master's animator line in sorted order
…lap, and registry-claims checks no tracked file has two writers; fixtures.ts documents the run order of later groups
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
Contributor
Author
|
Landing stopped at step Fix the cause, then hand #138 back to the landing queue with the new clean head. |
… 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
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 2/2 (parity corpus and regen chain). Feature PRs no longer edit the same lines when they register fixture groups or regen steps: each feature owns its own file, and the central list has one line per feature, sorted by id. This lands on master alone, independent of 1/2. The migration note is at the end.
What changed
packages/parity/src/fixtures.ts):GROUPShas one line per group, sorted by id, and the imports are sorted.LEGACY_RUN_ORDERfreezes the run order of today's 21 groups. Groups added later run after them, in id order.FIXTURE_GROUPSandFIXTURESare unchanged.scripts/regen.ts):STEPSandMANUALentries stay inregen.ts. A feature puts its steps, extra outputs for existing steps, andMANUALentries inscripts/regen-steps/<feature>.ts.REGEN_FEATUREShas one line per feature, sorted.placeStepsputs each feature step after the step it names, in feature id order, and throws on an unknown step.bg2,ovfl,pnt1,pnt2,tdec,txt1aandtxt2.Step,pnpm(),FIXTURES,FONTSandENGINE_SOURCESmoved toscripts/regen-steps/step.ts.STEPSandMANUALare unchanged..gitattributes: sorted. The patterns and the attribute are the same, andgit ls-files ':(attr:merge=dragon-generated)'lists the same files.packages/parity/test/registry-claims.test.tsfails when two groups claim a fixture id, or when a step name, output glob orMANUALcommand is claimed twice. It also fails when a central list or its imports are unsorted or a feature file is unregistered, and it coversplaceStepsordering and its errors.Values unchanged
Before regen, I dumped
STEPS(with each verdict function's type),MANUAL,MERGE_BY_HAND,FIXTURE_GROUPSandFIXTURESfrom origin/master and from this branch. The two dumps are byte-identical.Tests changed (intent kept)
regen.test.ts, ".gitattributes lists exactly the regen steps' outputs": it now compares sorted lists and requires the file to be sorted, so features add lines in different places. Exactness is unchanged.values.test.ts, "is the last legacy group before states": it now checksvaluesandstatesat the end ofLEGACY_RUN_ORDERinstead of the end of the whole list, because groups added after the split run after them. The intent (values is the last group before states) is kept.Verification
pnpm regen --force: exit 0, andgit statusis clean afterwards, so every generated output is byte-identical.pnpm typecheck: pass.pnpm test(full suite): 183 of 184 files passed.planted-swift.testtimed out under load (900 s) and passes 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