Skip to content

TXT1a-1a (v2): Ahem through HarfBuzz, and the zoomInput platform rule, restacked onto INL1a C2 - #101

Merged
thejackshelton merged 76 commits into
masterfrom
txt1a-1a-v2
Oct 9, 2026
Merged

thejackshelton merged 76 commits into
masterfrom
txt1a-1a-v2

Conversation

@thejackshelton

@thejackshelton thejackshelton commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor

Stacked, lands as the text-stack train after train 3. This branch is a restack onto INL1a (#88 B1, #89 B2, #90 C1, #91 C2), made by intent: C2 plus this branch's own change. Its base is review/inl1a-lowering, pushed at inl1a-lowering's head afec4d6, so the diff is this branch's alone. The text stack lands as one train after train 3; master is merged in during the train's catch-up. Host-only: no device run yet (pending-device).

What changed

  • TXT1a-1 phase A (T083J), restacked from txt1a-1a (4834ada88): Ahem is shaped through HarfBuzz on the host (text-shaper-host.ts, shaping.ts), and a planted platform rule resolves the environment through zoomInput, which keeps zoomInput reached in the translated engine.
  • Applied without conflicts.
  • docs/ports.json: block.ts (the noReshapeAtBreak plant cites shaping_line_breaker.cc) and text-shaper-host.ts hanKerningOf (han_kerning.cc) are added as references. PORT-0 landed on master after the branch was written. THIRD_PARTY_NOTICES.md does not change.
  • Regenerated outputs: only the translated engines, the corpus digests and the lanes.json host lanes change. Every capture, vector, break, pixel and profile is byte-identical.

Tests and pins changed, with reasons

  • None beyond the branch's own new test (text-latin.test.ts phase A).

What passed earlier (host-side, superseded head c0d4cd2, before the cloud migration)

  • /tmp/heavy-lease.sh pnpm regen reaches a fixed point; its outputs are in their own commit, whose message names the command.
  • pnpm typecheck passes.
  • pnpm test: everything passes except the 12 device-record tests that need a fresh device run (lanes, lanes-records, lanes-concurrent, device-failures, p6a-promotion): device step pending. The first full run failed chrome-ports.test.ts on the two citations above. They are fixed in this branch, and chrome-ports.test.ts passes (13/13).

Catch-up with master (2026-10-08, land-prep)

Tests changed at the catch-up

  • None. No test, check, tolerance, floor or fixture changed or was removed.

Review round 1 (independent review at 0c6b3ee, two Medium findings), commit 76150ba

  1. latinCheckSkipped was inert, and the harness ran shaping plants inert.
    • R4 is now implemented on the engine's shaped measurer: shapedMeasurerFor wraps the measurer in latinScopedMeasurer (shaping.ts), which refuses text with any code point outside Latin, Common and Inherited (isLatinText, script-data.ts) with a new typed code, text-script (unsupported.ts, section notes/T056-txt1a-spec.md R4). latinCheckSkipped skips exactly that check. The shaping core (shapedText) stays script-agnostic, because the TXT1-S gate shapes every script. This is observable on Ahem: the bundled Ahem.ttf has glyphs for 45 non-Latin code points (for example U+03A9 and U+6C34), which shaped Ahem measured before this change.
    • So the engine can raise the typed code, MeasureResult failures now carry code: 'text-glyph' | 'text-script', and inline.ts raises each code as a literal (unsupported.test.ts requires every code to be raised literally).
    • The translate harness (runEngineCase) now reports a harness error for any shaping plant (advanceNot16_16 through latinCheckSkipped). It lays out with measurerFor's Ahem measurer, so before this change those plants did nothing there. No corpus line sets one (the corpus fault lists are fixed and exclude them), so the corpus outputs are unchanged.
  2. Only metricRoundingSwapped was planted in text-latin.test.ts. The header now states exactly what is proven, and each shaping plant has evidence:
    • wholePixelPositions changes the committed text-fractional-font-size vector.
    • advanceNot16_16 and doubleAccumulation change no committed vector (measured: 0 of the committed vectors). They do change widths in T082's committed Chrome runs (7.77px, 93 or more glyphs), and they are asserted to miss Chrome there.
    • kerningDropped, noReshapeAtBreak and softHyphenWidthMissing cannot act on Ahem through the engine's measurer, and are pinned inert on every committed vector with the evidence asserted:
      • Ahem.ttf has no GSUB, GPOS, kern, morx or kerx table, so kerning and reshaping change nothing.
      • noReshapeAtBreak and softHyphenWidthMissing act only in ShapedText.line, which TextMeasurer does not expose.
      • No committed vector has a U+00AD.
      • shaping-gate.test.ts still catches all three on the real-font gate.

Tests changed, with reasons (review round 1)

  • packages/parity/test/text-latin.test.ts: four tests added (wholePixelPositions; advanceNot16_16 and doubleAccumulation against Chrome; the three inert plants with evidence; R4 text-script and the latinCheckSkipped plant, which changes the outcome to the line breaker's later refusal and makes the measurer return ok) and one inert guard for latinCheckSkipped on the committed vectors. The header claim is narrowed to what is proven. The R4 test fails without the fix.
  • packages/layout/test/inline.test.ts: added a test that a measurer's text-script refusal reaches the layout result with its own code and section. It also asserts the section of the existing text-glyph refusal.
  • packages/layout/test/font-data.test.ts: the old-measurer stub's refusal carries code: 'text-glyph', because MeasureResult gained the field. The assertions are unchanged.
  • packages/translate/test/translate.test.ts: added a test that the harness reports a harness error naming each of the 8 shaping plants, and lays out the same input without one.
  • No tolerance, floor, pin or existing check was loosened or removed.

What passed on head 09fff4c

  • pnpm ci:regen txt1a-1a-v2 --head 76150ba95a1d138afa520caee0cb899b4a5b2df4 --once: regen commit 09fff4c, https://github.com/compiled-run/dragoncss/actions/runs/37858585385. The earlier catch-up regen (6c5575f -> 0c6b3ee) was https://github.com/compiled-run/dragoncss/actions/runs/37849014715.
  • pnpm typecheck (local): passes.
  • Platform-free, local: packages/layout/test/{font-data,inline,vectors,dpr-vectors}.test.ts and packages/dragon/test/{registry-claims,profile-index}.test.ts: 6 files, 762 tests passed.
  • pnpm ci:test-files 09fff4cafd... --once, https://github.com/compiled-run/dragoncss/actions/runs/37862735384 (tested 09fff4cafdaff3a6912c0d2318622d9e8e0ccfb5), all passed:
    • Chrome group: translate 16, android-profile 5, chrome-ports 13, dist 6, env-engine 8, fixture-reader 7, fonts-fixtures 26, parity inline 13, interaction-forced 3, media-runtime 8, media-sweep 19, p6a-dash-oracle 310, parity 518, phrasing-blockified 3, platform 12, parity registry-claims 8, replaced-identity 3, text-latin 10, tree-faults 3, values 72.
    • Native group: native-swift, native-kotlin, native-dpr-swift and native-dpr-kotlin.
  • pnpm -s pr:review 101 --once: exit 0 (CI checks success; 0 unanswered findings; UNREVIEWED, because Macroscope is at its monthly spending limit).
  • Device lanes: device step pending (the landing driver runs them).

🤖 Generated with Claude Code


Generated by Claude Code

…fec4d6): txt1a-1a's own change (inl1a-compiler..txt1a-1a 4834ada88, without its regenerated outputs), applied cleanly: Ahem through HarfBuzz, and a planted platform rule that resolves the environment through zoomInput
…ixed point after 2 passes). Only the translated engines (the fault keys, platform rule and layout.ts environment call), the corpus digests and lanes.json host lanes (pass on ios and android) change; every capture, vector, break, pixel and profile output is byte-identical
…ine_breaker.cc) and text-shaper-host.ts hanKerningOf (han_kerning.cc) as references (PORT-0, on master since the branch was written); THIRD_PARTY_NOTICES.md unchanged (pnpm notices:gen)
…line boxes; review of #91) into txt1a-1a-v2. Conflicts: block.ts and harness.ts take TXT1a-1's shaping faults and master's order faults
# Conflicts:
#	packages/translate/harness/harness.ts
…-lanes-v2 merged forward): /tmp/heavy-lease.sh pnpm regen (fixed point after 3 passes). The translated engines and harnesses (shaping and order faults), corpus digests and lanes.json host lanes
… Conflicts: layout index.ts exports both TXT1a-1's shaping API and master's ANIM-b1 rt roots and transform helpers; pipeline.ts takes master's fixtureCompileInput and keeps TXT1a-1's removal of the Ahem-only referenceMeasurer (the engine lane measures through referenceShapedMeasurer)
…d fonts (TXT1a-1: the engine shapes Ahem through HarfBuzz over vendor/fonts/Ahem.ttf); pnpm regen's read trace refused dpr-vectors for reading Ahem.ttf outside its cache key, and hit-vectors and break-vectors lay text out the same way
thejackshelton and others added 8 commits October 5, 2026 17:23
…der-radius on iOS and Android, rebuilt from #80/#81 on master

Carries the radius half of #80 (paint-radius.ts, its harness cases, vectors input generator and host plumbing) and #81 (parsing,
computed values, lowering, emission, rounded background, border and clip stages, the radius-square plant, the pnt1-radius proofs
and fixtures) onto master's per-feature registries, and adds -webkit-border-radius with Chrome's legacy two-value parsing, the
radius-longhands fixture, and native refusals for rounded html, body and replaced elements.
…does not model rounded corners yet), the identity check strips the corner radii added since its base, and pnt1-radius covers radius-longhands
Commands: pnpm regen --skip lanes-host --skip tw-sweep (macos-26) and pnpm regen --only lanes-host (xcode-27), alternated
to a fixed point, then pnpm regen --only tw-sweep (macos-26).
Base: 61f24f0
Run: https://github.com/compiled-run/dragoncss/actions/runs/37382572332
…mily registers between pointer-events and transform, and a rounded box leaves the hit facts unchanged (the hit lane refuses rounded cases by name)
# Conflicts:
#	packages/parity/src/hit-capture.ts
Commands: pnpm regen --skip lanes-host --skip tw-sweep (macos-26) and pnpm regen --only lanes-host (xcode-27), alternated
to a fixed point, then pnpm regen --only tw-sweep (macos-26).
Base: 4094fb1
Run: https://github.com/compiled-run/dragoncss/actions/runs/37389802133
# Conflicts:
#	packages/layout/test/paint-seams.test.ts
#	packages/translate/harness/harness.ts
…orthands/radius.ts cites css_parsing_utils.cc ConsumeRadii); no uncited replaced_painter.cc reference
…job.sh pnpm regen: fixed point after 3 passes, 27 steps)
…acy shorthand (PNT1-radius), so it leaves the still-refused list
…rget, as Chrome drops it; any other encoding, form or position is refused

- css/at-rules/charset.ts: the handler, one line in AT_RULE_HANDLERS, and a 'drop' AtRuleOutcome the driver skips; the at-rule
  context carries its source text and whether it starts the sheet.
- Fixture group charset: charset-utf8 and charset-utf8-upper must render as charset-none in Chrome (dragon/test/charset.test.ts),
  and three rejects (another encoding, not at the start, single quotes).
- seams.test.ts: charset leaves the refused list with its own handler; the byte-identical pin is the base's hash without it.
…t-regen2: pnpm regen, fixed point): the charset fixtures' captures, emitted CSS, vectors and break vectors, the profiles (proof cases added, no row or status changed), the native lanes record, the hit facts and the translate corpus
…ocal prep; lane-contract queued-parent exception). Conflicts: platform-check.ts takes master's nativeLayoutProjection and keeps TXT1a-1's referenceShapedMeasurer; regen.ts takes master's LEGACY_STEPS split (FIXTURES, FONTS and ENGINE_SOURCES now come from regen-steps/step.ts)
…, margin, padding and border-width longhands

The coverage-rank alias probes (-webkit-justify-content, -webkit-flex-direction, -webkit-box-sizing, -webkit-margin-before and the rest, about 320 reach-points) are refused only because no fixture used inherit on these longhands; the resolver handles inherit the same way for every longhand. One fixture in ltr and rtl: an inheriting flex container (direction, wrap, justify, align-items, align-content, column-gap), inheriting flex items (grow, shrink, basis, align-self, order), inherited box-sizing, margins, paddings, border widths and their logical forms, each checked in Chrome to move a frame, plus the block-flow forms the probes use (computed values). Group inherit-contexts, one GROUPS line
thejackshelton and others added 9 commits October 8, 2026 19:58
Commands: pnpm regen; pnpm run parity:devices; pnpm regen
Commands: pnpm regen; pnpm run parity:devices; pnpm regen
@charset "utf-8"; at the start of a sheet is a no-op on every target (Chrome drops it); other encodings and positions refused
PNT1-radius: border-radius, its corner longhands and -webkit-border-radius drawn natively on iOS and Android (supersedes #80, #81)
Commands: pnpm regen; pnpm run parity:devices; pnpm regen
Commands: pnpm regen; pnpm run parity:devices; pnpm regen
@thejackshelton
thejackshelton merged commit 981c068 into master Oct 9, 2026
4 checks passed
@thejackshelton
thejackshelton deleted the txt1a-1a-v2 branch October 9, 2026 02:59
@thejackshelton thejackshelton removed the land-ready Reviewed clean; the Mac landing driver takes it label Oct 9, 2026
thejackshelton pushed a commit that referenced this pull request Oct 9, 2026
…-longhands: no source conflicts; generated files keep this side until the CI regen

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WSkSiXMPXTAsNpS9BD9LDR
thejackshelton pushed a commit that referenced this pull request Oct 9, 2026
…flicts

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WSkSiXMPXTAsNpS9BD9LDR
thejackshelton pushed a commit that referenced this pull request Oct 9, 2026
…conflicts locally (GitHub's conflict is in generated outputs; regen rebuilds them)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WSkSiXMPXTAsNpS9BD9LDR
thejackshelton pushed a commit that referenced this pull request Oct 9, 2026
…er with #101, #210, #208, #198, #216, #218) into txt1a-1-v2 (prep, no PR changes until #102 merges). Conflicts: ios-layout's Lowerer carries both TXT1a-1's lowering mode and master's propagated viewport-overflow element, and lowerTree passes both; project.ts checkCases takes master's @Property registrations and checkComputed faults argument and keeps TXT1a-1's font deferrals beside master's native-scroll check; the band passes pass both the shared font deferrals and the registrations; native lowering runs master's per-band loop in native mode, then TXT1a-1's engine-mode lowering of the native band's cases. Generated outputs: this side's, regenerated after #102 merges.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WSkSiXMPXTAsNpS9BD9LDR
thejackshelton pushed a commit that referenced this pull request Oct 9, 2026
#203) into grid-g1a-engine-v2. Conflict: rt-hit.ts imports keep GRID's NO_GRID_FAULTS and OVFL's isScrollContainer beside resolveBorder. Master's grid input (input.ts, validate.ts) is unchanged here; the engine reads it as is. Generated files keep the merge result until the CI regen

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WSkSiXMPXTAsNpS9BD9LDR
thejackshelton pushed a commit that referenced this pull request Oct 9, 2026
#203) into form-a-v2

Conflicts, both sides kept:
- rt-hit.ts: master's isScrollContainer import beside FORM-a's controlAsBox.
- validate.ts: FORM-a's checkControl and master's OVFL clipsOnly, both whole.
- expected-dump.test.ts, pixel-reference.ts: the union of both sides' imports.
- p1-floor.json (structural): the union of the extended names (engine-inline, engine-overflow) and the larger count of each; nothing lowered.
Semantic: master's overflow.ts (OVFL scrollMetrics) skipped ControlBox children silently. It now refuses a form control with an
OverflowRefusal (overflow.test.ts pins it; it fails without the refusal), since its scrollable overflow has no Chrome proof.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WSkSiXMPXTAsNpS9BD9LDR
thejackshelton pushed a commit that referenced this pull request Oct 9, 2026
…, #208, #200) into mq-r1-runtime

Conflicts, both sides kept:
- emit/runtime/state.ts: the machine takes MQ-R1's viewport, band and initial band and ANIM-b1's anim tables (last,
  defaulted); input() lays out at the live viewport and patches the animator's frame lengths; startAnimator resolves
  its inputs at the current viewport; the mount sizes its media root and takes the band before starting the animator
  and the first render, renders into the media root, and keeps master's shown/stale/display driver; scripts run on the
  mount, advancing through machine.advance. A program with animation tables and a band or a resize step is refused
  at emit (the animator resolves its inputs once), with a test.
- emit/runtime/index.ts: media module registered first so the support order ends clock, state, anim as before.
- parity/src/native-host.ts: state emits are stateEmits, frameEmits, resizeEmits, envEmits.
- dragon/test/state-program.test.ts: master's ANIM-b1 setter/onChange/shown patterns with MQ-R1's media root and
  m.machine.set; anim-runtime.test.ts's advance pattern retargeted to m.machine.advance (scripts run on the mount).
Generated files keep the auto-merge until the CI regen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WSkSiXMPXTAsNpS9BD9LDR
thejackshelton pushed a commit that referenced this pull request Oct 9, 2026
…#216/#102) into ANIM-b1 part 2

Conflicts: state.ts keeps this branch's hooks-only form (the adapter in anim.ts draws the background through dragonBackground);
anim-runtime.test keeps the hooks test and carries master's check that the frame colour never goes straight to the platform
property; device-jobs.ts imports both ANIM_LANE and isBlockReason.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants