π Enhancements
- compiler: Replace @tsrx/core with vendored yuku-tsrx parser (08786335)
- compiler: Thread yuku semantic tables into the semantic-graph walk (ffb05b6e)
- compiler: Member-expression component tags compile, resolve, and render (15fd3bec)
- ui: Scaffold @markless/ui + base namespace; compiler: optional callback props (19367345)
- identity: Composed children get instance-qualified graph ids (approach B) (08e0af1e)
- core: PropsOf and Children authoring types; sweep children: unknown (6a1dc4ab)
- identity: Projected children get p: instance segments; symbol routes are full prefixes, longest first (1e01263d)
- identity: Same-module composed children get their own cells, qualified ids, and self symbol routes (b59669c6)
- compiler,web: Shared() renders and resumes (130f503f)
- compiler,web: Widget scope on shared() (CSR) (d0c47991)
- compiler,bundler,web: Per-component SSR entries; widget scope resumes on SSR (ac50933d)
- compiler: Shared() factory computeds and root config seeding (dde363f9)
- compiler,web: Projected children render after the projecting component seeds (eb7f4470)
- ui: Checkbox family skeleton β root and trigger behaviour, all parts scaffolded (2d05f1fb)
- ui: Every checkbox part spreads {...rest} first on its host (cb4086d4)
- compiler: Emission foundation - yuku-codegen printer, builders, gates (4b29d8d1)
- compiler: AST emission path for state initializer modules (unswapped) (17f2e265)
- compiler,web: Shared-factory lowering β composite reads, method locals, as-casts, seeds, scope guard (301e7346)
- compiler: AST emission path for DOM binding modules (unswapped) (a1433601)
- compiler: AST emission path for behavior modules (unswapped) (2baa9303)
- compiler: AST emission path for async computed runner modules (unswapped) (14367f39)
- compiler,web: Element() IDREF minting β labels reference minted per-instance ids (8eca79dc)
- compiler: AST emission paths for the arm emitters (unswapped) (14ce2da2)
- compiler: AST emission path for general symbol modules (unswapped) (7769877b)
- ui: The checkbox family β 7 parts, widget-scoped shared state, converted QDS suite (e946e9e6)
- compiler: Swap production emission to the AST printer paths (U47 batch, owner-approved) (37f50817)
- compiler: Assignments always assign; destructuring defaults at part signatures (f2aed463)
- compiler: AST emission band for event-handler and callback-prop modules (unswapped) (3973d4a1)
- compiler: Swap event-handler emission to the AST printer; delete the string path (e08d2904)
- compiler: Composite expressions over shared reads refresh; component-body computed() over shared instances resolves (dfee36f6)
- ui: Toggle, textbox, and progress families; recipe fixes from the pilot review (e4567c03)
- typescript-plugin: Markless-tsc β volar-driven CLI typecheck; sidecars and shim deleted; 14 exposed type errors fixed (f99c7c3a)
- compiler,core,ui: Single-handler event contract β array form fails closed; Handler deleted; part types are bare PropsOf aliases (5bb8ee84)
- sr: Apps/sr-gallery consumer app + sr-real NVDA/VoiceOver specs; workflow gates real lanes on the boot check (ea5db671)
- compiler: Handler symbol modules carry same-file module-scope declarations (transitive, authored order, with their imports) (f18b6c23)
- bundler: Compiled .tsrx modules publish real ES named exports per served component; sr-gallery builds clean (fc0033e1)
- compiler: Three fail-closed class-state diagnostics (shared-factory instance, state-property instance, divergent multi-handler module instance) (7df9f103)
- ui: Collapsible family (root/trigger/content; content hides attached, never unmounts) (01313c09)
- ui: Otp family (root/field/item/itemindicator; zero-arg commit shape); 8 rows red on the write-then-read dispatch defect (12104522)
- ui: Pagination family (six QDS parts, declared value, exported pageRange); 11 rows pinned on four measured framework defects (050485dc)
- ui: Qr-code family (verified ISO 18004 byte-mode encoder, SSR SVG, neutral accessible name); 2 rows pinned on the destructured-prop spread leak (a5903dcd)
- ui: Barrel and export subpaths carry collapsible, otp, pagination, qr-code (2d597e58)
- ui: Pagination range entries carry stable keys; rows re-pinned on the row-scoping arm-walk gap (f8a0f319)
- compiler: Fail-closed read-back audit over emitted symbol modules (MARKLESS_SYMBOL_MODULE_UNRESOLVED_GRAPH_REFERENCE) (68737c01)
- ui: Otp caret-to-end on focus (QDS policy); SSR row pinned on async handler dispatch (85e73b2c)
- compiler: Row-scoping walks branch arms; interactive parts under @if in value-keyed rows get per-row identity (cafa4fe5)
- ui: Pagination reshaped to QDS anatomy (item carries value, parts derive state); getEntries on family state; pageRange internal (90cc2a03)
- ui: Scroll-area family tiers 1-2 (zero JS; CSS scroll-timeline thumb; drag gated on owner questions) (e6e78be8)
- ui: Barrel and subpath carry scroll-area (7ec0e16b)
- compiler: Modules publish shared definitions on the graph interface; consumers adopt through named imports and barrel chains (MARKLESS_SHARED_CALL_UNRESOLVED fail-closed) (cdbaeb5c)
- bundler: Compiled modules keep authored shared exports (throwing uncompiled-call guard); transform passes published names (5d2b483c)
- compiler,bundler: Barrel interfaces carry shared re-export chains; .ts-only importers reach the barrel walk (778c892f)
- ui: Every family exports state beside its parts (owner directive; surface now compiles end to end) (f4d85edf)
- ui: Radio-group family lands (39 green, 2 pinned; workarounds reverted to natural shapes) (57c04d5b)
- ui: Barrel and subpath carry radio-group (c5b662be)
- compiler: Branch conditions mint computeds end to end (SSR seeds, authored diagnostics text, re-anchored pins) (69f042de)
- compiler,web: Element() handles in IDREF attributes on parts mint and cross the edge (element-handle-id prop kind) (fb9e9d01)
- ui: Tabs family (QDS anatomy, panels stay mounted, roving tabindex); one row pinned on post-resume content refresh (502758ab)
- ui: Barrel and subpath carry tabs (98a02924)
- ui: One import surface β per-family export subpaths removed per the owner ruling (root barrel only) (0cbfe30a)
- ui: Select family (eight parts, two-cell typeahead, no closure state; keyed-@for widget roots proven) (51e747fe)
- ui: Barrel carries select; sr lane serial like the browser lane (same measured contention class) (c4370f30)
- ui: Navbar family (five parts incl. the specced itemlink for priority-1 aria-current; hover delay without new API) (6c2684f5)
- ui: Barrel carries navbar (b8009918)
- ui: Tree family (recursive same-family roots, hidden-not-arm, DOM-walk keyboard model); four walls pinned (4bde812e)
- ui: Barrel carries tree; unhandled-throwing defect-51 rows skip with the cause (1d889d76)
- ui:
β οΈ Remove the scroll-area family (owner directive) (c4edc6d9) - ui: Otp field stretched over items per QDS (shiftPWManagers); radiogroup.field restored to QDS source shape (b3ddd8e1)
- compiler: Element() handles resolve as values in handlers (defect 54) β shared members, call arguments, cross-element reads; trigger-groups ship handle records for reads (1d8777e9)
- web: Overlay primitive green 12/12 - focus restores to invoker; nested page fixture split (ff03dfda)
- ui: Sr vocabulary gains the dialog role slot (virtual word observed, real readers cited) (effc0d8b)
- typescript-plugin: Part-tag inlay hints from PropsOf props types (Design 1) (c4110ee7)
- compiler: AnchorName/positionAnchor lower to per-instance --mx- inline declarations; shared slug with id minting; six fail-closed refusals (10710fc8)
- web+compiler: Overlay ships pay-per-use via demand map; modality derives from enlisted subtree; bare-attribute overlay architecture lands (e21d8203)
- ui: Navbar dropdowns ride the overlay attribute - onDismiss closes on both reasons; hand-rolled Escape branches removed (b9265d23)
- typescript-plugin: Dismiss event typed via MarklessEventMap/ElementEventMap; navbar stopgap deleted (098c81dc)
- web: Dismiss detail carries pressTarget for outside-press (absent for escape); identity-proven row (dc50d331)
- typescript-plugin: Dismiss detail type gains optional pressTarget, mirroring the runtime (b00dcdea)
- ui: Navbar dismiss guard arms by press-target identity; unrelated press-then-click row falsification-proven (f4bf250f)
- ui: Modal rebuilt on the overlay attribute - backdrop part, alert boolean, full trigger aria, Base UI test map (5 rows red = defect 72 reproduction) (de314120)
- compiler+web: Array-typed element() handles - plural cardinality from the type argument, live-walked ordered reads; keyed-row removal implemented (C-prime capability) (9f8c39c8)
- ui: Carousel family - QDS slide-math engine, plural-handle slides, nine parts (5 rows pinned pending defects 78/79) (47758cc5)
- web: Focus origin captured at enlist; window Escape primer in the inline resumer (overlay-marked pages only) (b8abab14)
- ui: Combobox family - 11 parts, own state, consumer filtering, inline/multiple booleans, plural-handle walk (8 rows pinned on framework gaps) (6343670c)
- web: Spread events merge at child-view composition; multi-binding 12/18 (remaining rows seated) (312e5a88)
- ui: Accordion family - root-owned value, plural-handle walk, hidden-until-found built from QDS source (19th family) (7d3e7e9d)
- ui: Collapsible gains hidden-until-found (three-valued hidden, beforematch, disableUntilFound) backported from accordion; scenarios on named barrel imports (d1dd30ad)
- ui: Collapsible gains hidden-until-found backported from accordion; scenarios on named barrel imports (bf101480)
- compiler,web: @empty arm transport for resumable keyed repeats, and the client mint that raises it (391a92df)
- compiler: Async-runner and shared-seed emitters carry module-scope declarations; guard pinned by construction (e03125f6)
- ui: Toaster family - page-scoped queue, mint-safe default rows, measured walls (ae3c6ad2)
- compiler: Projection-placement facts on the module graph interface (U324) (6236dcf2)
- compiler: A plain else after an @if arm refuses instead of rendering escaped source (9af6c788)
- ui: Every imperative DOM query purged - plural handles + el lists replace the walks (owner order) (ec5db313)
π₯ Performance
- web,bundler: Pay-per-use shared-seed pass (961d3b08)
π©Ή Fixes
- compiler: Re-vendor yuku-tsrx with literal '<' tokenizer rule - 547/547 (786a51dc)
- compiler: Re-vendor yuku-tsrx with 4-aligned semantic-transfer scratch (7ea85b96)
- typescript-plugin: Fragment-wrap recovery keeps authored coordinates at the mapping boundary (6fd6fae9)
- compiler: Compare claim rows by field, not serialized text (1e9e7c23)
- compiler: Key the claim signature on every claim per source (ee9d04bb)
- compiler: Never wait on claims from an edgeless child (e1e0b245)
- bundler: Keep the transform error when the provisional compile fails (af6b745e)
- bundler: Fold per-source registries before an edited-source write (3b6348be)
- bundler: Fail open when a delegate module cannot be imported (5fcc7982)
- bundler: Fold every cached entry for an edited source, not one environment (191bb420)
- bundler: Keep the import error when a delegate cannot be loaded (77cb7e01)
- bundler: Report a delegate this build cannot import as a build warning (b196a525)
- web,compiler: Omitted optional props are static, dom-update dedupe keys include the target, rest props in parts (14390c38)
- compiler,web: Falsy attribute values render no attribute; omitted optional props are static in branch reads (5b836c13)
- compiler: Carry componentEdgeInstancePaths through compile-module so projected children route on CSR (1d874c7b)
- web,bundler: Composed async-arm records qualify graph node ids, pay-per-use (cd8c16c0)
- web: Composed graph ids take only the grammar-matched instance path (b1230307)
- bundler: Network boxes classify click-caused requests by start time (ffd3fb9c)
- compiler,web: Address CodeRabbit review on PR #27 (#27)
- compiler,typescript-plugin: CodeRabbit findings - explicit capture-analysis failure, live self-closing filter (74d3518b)
- compiler: Partition per-component initial values for same-module state names (5d93bc78)
- compiler,typescript-plugin: Second-pass review findings (1a6f13cd)
- compiler: Spread primarySpan only when the binding carries a span (f06d00e7)
- compiler: Element static resolution follows the reference row, not the first name match (c692761e)
- compiler: Framework-api and own-binding checks use symbol identity (3617f483)
- compiler: Exclusive scope-end boundary; accurate shadowing test title (5b94b077)
- ui: Remove the fake instanceId; id wiring waits on element()-through-instance (90d23a73)
- compiler: Async dependency identity + shared symbol resolution (d4f48b9e)
- compiler: Shared-instance seeds and reads fail closed on undeclared fields (4949bfa2)
- compiler: A component in an @if arm no longer kills the owning component's dispatch (3005f00d)
- compiler: Widget seeds reach the served payload, so SSR resume restores them (7c87ecf5)
- bundler: Serialize legacy imported-capture callback dispatches (cf16ce57)
- deps: Yuku-tsrx 0.1.3 - portable-CPU linux binding (5abb43b5)
- ui: Restore *.tsrx ambient module as editor fallback (35284e08)
- compiler: SSR seed-phase composes the children-root; checklist rows re-pinned on the first-gesture cause (ebcb91d7)
- compiler: Namespace member tags compose their named part, and single-component modules publish their surface (fail-closed MARKLESS_COMPONENT_TAG_UNRESOLVED) (cf5e7689)
- compiler: Unlinked .tsrx member tags compose through the module surface, never a named export (374fd761)
- web: Compose dedupe merges sharedDefinitions, unioning projectionIds order-independently (abb864df)
- compiler: Capture-analysis parses handler and initializer sources as TypeScript; false MARKLESS_CAPTURE_OPAQUE_PROP gone (c8bae4d2)
- compiler: Template-literal interpolations stay visible to the symbol import scan (frame-stack scanner) (e4cf27c6)
- compiler: Bare undefined in an expression is a value, not a read source; handler-call scan parses as TypeScript (78469927)
- web: Branch arms and dynamic hosts forward the loop row (item/index/key named through renderChunk) (3598700b)
- compiler: Rest-binding spreads exclude destructured props; secrets no longer serialize into DOM attributes (6d8f6818)
- compiler: Method calls on read values keep their receiver (gated widening preserves the shared-member fail-closed gate) (f587be65)
- web: Disposed containers ignore late dispatches (flag was debug-gated); live-container unmatched still throws (c7988b3a)
- web: Bound symbols carry the row segment; per-row writes land on the right row (layer 4) (9733c5eb)
- web: Widget-root resolution follows the dispatched row (layer 5); rowBoundary pairs carry leading row segments (7b210034)
- compiler: SSR row-reader prelude declares each repeat binding once; item/index name clashes refused with a span (e9aa3b49)
- compiler: SSR shared-instance prelude unions render-decision sources, matching the client reader (defect 16) (b3135fde)
- web: Bound-symbol widget ids resolve through the root registry (layer 6); row-tolerant root walk (b26b7bc7)
- compiler: Callback claims bind only to their claimed root; unbindable claims refuse the build (defect 18) (3382ce1b)
- compiler: Unary expressions over shared reads lift to computeds on component edges (opt-in gate flag) (31f2d91c)
- web: Unresolved widget ids keep their reading path so the row translator resolves both spellings to one root (layer 7) (9d02bdb0)
- compiler: Template positions lift unary expressions (text, attribute, conditional-class); zero byte delta (7ff74c5e)
- compiler: Claims carry their owning component; edges receive only their own claims (defect 20 linker half) (2f574344)
- compiler: Adopted shared definitions keep the owner's widget root; consumers join, never spawn (family.state() end to end) (90d3d3bd)
- compiler: Dispatching shared-method calls are awaited in place; authored intra-handler order is a guarantee (lane 4 red -> 1) (5a589129)
- web,compiler: The widget-root edge receives its parts' seeds (defect 31, both modes; enclosing-token and wrapper-exclusion corrections) (8f7e5f00)
- web: Branch records wire from the painted takenArm, not an undemanded computed cell (f0c80c08)
- compiler: Branch-condition computeds are owned by the component whose branch decides on them (defect 39) (e2e92ee9)
- compiler: Bare branch reads over shared instances resolve through the instance resolver (name coincidence dead; byte-identical for same-name shapes) (333f8ff2)
- compiler: Loop-row names shadow shared-instance locals at every resolution site (defect 28; row-guard shared across markup and edges) (03ff97fb)
- compiler: Shared-instance resolution is component-scoped (sharedInstanceVisibleFrom at nine sites; red-first) (c7277a0a)
- compiler: Component scoping at the markup-residue, state-lowering, element, and async sites (headline leak dead) (10632b43)
- compiler: Branch sites and template reads carry their component; defect 46 fully closed (13bb0b2c)
- web: Widget-root registries are per-render (renderToString concurrency-safe); checklist SSR rows un-skipped on the repro (ee60883b)
- ui: Progress named by its label, indeterminate silent, toggle/textbox described-by wired; tabs panel naming pinned on the value-keyed gap (fc66d3f9)
- compiler: Shared-method parameter lists are parser-resolved (first-paren scan halved parenthesized params, silently emptying handlers) (96814598)
- bundler: Self routes recurse into the route table (defect 51); prerender path carries self routes; three tree rows flipped (d89f921f)
- compiler: Unfilled callback slots fold to undefined (consistent with the no-prop fold; defect 52) (ce14f821)
- ui: Toggle onChange wired per QDS timing (defect 60) - fires with new state, silent while disabled (0b39b911)
- compiler: @for row locals shadow same-named graph bindings in handler expressions (defect 59) (0a7f3564)
- compiler: Handle value-reads lower in assignment RHS and nested arrows; unclaimed write targets refuse loudly (defect 61) (aa2f78dd)
- compiler: Handler callbacks route shared-instance writes (defect 66) - claimed-write fallback, TS reparse fail-closed, per-site tail inlining (7d009f8f)
- web: Widget-scoped element() handle reads resolve per instance (defect 63); registry lists per host, ambiguity throws (a8eaf144)
- compiler: Widget-instance token registers only for widget-rooting children (defect 65 SSR half) (1d6d5065)
- web: CSR widget-instance token gated on widget-rooting children (defect 65 CSR half) (be19faca)
- web: Bound-symbol dispatch scopes getElementHandle per widget instance (defect 63 closed); select handle-read conversion landed (0de21164)
- compiler: Row-local reads lower via context.locals in all handler positions (defect 64); inexpressible positions refuse loudly (5e1b8163)
- web: Projection seed gate asks composition-aware widget-root question (defect 68); CSR twin of the compiler marker (8b62f9c1)
- compiler: Row-scoped child edges forward sharedSeeds (defect 56 compiler half); witness pins seat B (d8291d5c)
- web: Repeat rows carry sharedSeeds (defect 56 seat B); witness unpinned; radio-group looped-name row un-skipped (c895d97b)
- web: DOM-faithful bubble walk - every record on the target-to-root chain runs on its declaring element; stopPropagation honored (defect 67) (2512c0ec)
- compiler: JSX comment containers lower to nothing (defect 70); bare shared calls refuse at build with CSR/SSR agreement (defect 69) (2139604c)
- typescript-plugin: PressTarget types as globalThis.Element; navbar stopgap cast removed (119dffa2)
- compiler: Sync policies ride forwarded spread callbacks and keyed-repeat row events (defect 73) (decb41fa)
- web: Widget registries are per-RuntimeGraph (defect 72); modal 41/41; realm-global pageRegistry removed (ebe6d8c1)
- compiler: Emitted bound-symbol resolver passes its dispatching graph's registry (defect 72 async residual closed) (1b88cb8c)
- web: Served-open overlays enlist at behavior start via hidden-bound host records (defect 74); row-borne sync policies pick the resumer flavor (7942701e)
- typescript-plugin: El= accepts plural handles; plural typing pinned incl. core-defect anchor (817e107e)
- core: Element() accepts array type arguments; ElementHandle's array case is non-optional (collection is empty, never absent); M18 pins inverted (a41fb64d)
- ui: Carousel types follow the house pattern; defect 78/79 rows pinned (91d6dc48)
- compiler: Interpolation-only style bodies mint no embedded CSS document (editor false positive) (6184e818)
- compiler: Reads lower inside non-binding-root receivers (defect 77); fail-closed guard repointed at a still-unnameable shape (4886fa0c)
- compiler: Member chains through handle reads rebuild their tail (defect 80); indexed tails refuse loudly (bc33e62a)
- web: Keyed-loop widget reads resolve via row-rooted lookup (defect 75); select/radio-group/tree un-pinned; defect 78 seated (9c28c287)
- compiler: Writes inside timer callbacks lower through the write-aware band (defect 79); awaited nested callbacks marked async (89d80eeb)
- compiler+web: Handle reads resolve through the bound edge's instance path (defect 78); host-derived fallback deleted (91535cb0)
- ui: Carousel vertical steps (defect 82) - slidesPerView answers 1 unless move=view; suite installs its CSS (markup style dropped = new defect) (d6e6725b)
- bundler+compiler: Widget-instance token install gated on token NEED, not shared-seed symbols (seam 1); three multi-binding rows un-pinned (7d182cac)
- bundler+compiler: Widget-token install follows token need (multi-binding seam 1); walls re-anchored for the multi-binding chain (63282e1c)
- bundler+compiler: Widget-token install follows token need (multi-binding seam 1); walls re-anchored for the multi-binding chain" (b70ce6e2)
- web,compiler: A keyed row dropped off the end leaves, and a widget-rooting list is wired at all (8b263ca2)
- web: A computed-backed repeat collection is readable before its rows are keyed (9a43fd1a)
- web+compiler: Keyed repeats - end-row removal, widget-rooting repeat records emitted, computed collections derived at wire (defect 84 part 1) (84f82255)
- compiler: Row start is absent at zero and 'unknown' when unresolvable, so emitted render data stays byte-equal (18b2f72e)
- bundler: Widget-root modules install the shared-seed pass, so seedless element() families mint ids (42633ad6)
- compiler: @for over a shared-instance collection resolves to its graph cell (1295d6f8)
- compiler: Render-data keeps one interaction per host+event, so a handler array runs each entry once (d6c0b7ca)
- compiler: A module-scope const a computed derive reads travels with the derive module (184f7a90)
- compiler: A free module-scope declaration name in an emitted module is now reported, not dropped (4e3b0141)
- web: A row's handler array runs every entry under direct CSR, stopImmediatePropagation ends the list (d8d4ed6d)
- compiler: The async-computed runner carries module-scope declarations; shared-seed documented as unreachable (d7fd3a74)
- compiler: A seed's string content is text, not a name - shared-seed scan blanks strings before scanning identifiers (30b62abd)
- web: One import promise per root, so resumed gestures reach the dispatch queue in fire order (defect 94) (55bf560e)
- web: A behavior inside a component no longer reads through a graph-less CSR context (ad0e6832)
- web: A behavior inside a component runs when CSR hands it no graph - zero byte-wall movement (a04a52a1)
- web: A component runs only its own derive symbols at prerender (defect 100) (1faa04b1)
- web: A projection's tokens splice into the child's stream where its {children} landed (defect 97) (acfb9c2f)
- compiler: Projection counts are subtree counts, so a DOM census meets the same number (u329) (13ba5d7b)
- web: A composed child reads the graph nodes its parent routed in (b43450a0)
- ui: Base label resolves (defect 104); tabs from-data scenario is a receipt; describedby proven framework-side (9bd1b010)
- Escape the raw NUL in the chunk-walk dedupe key so the file stays text (31ccca40)
π Refactors
- bundler: Extract virtual-ids from rolldown (ee424516)
- bundler: Extract plugin-state from rolldown (ad63bf63)
- bundler: Extract build/bundle-finalize from rolldown (f88b7d34)
- compiler: Move execution-attribution out of the bundler (a27fa625)
- compiler: Move interface-link out of the bundler (e7c52fe9)
- compiler: Capture analysis reads semantics from yuku-analyzer (5f1c5885)
- bundler: Move imported-child linking into the module-link compiler pass (165e0e94)
- bundler: Split claim ownership out into the claim-manifest pass (e2794011)
- compiler: Give render-data modules a linkable artifact (40a9af59)
- bundler: Move delegate child materialization into the delegate-children compiler pass (03392f37)
- bundler: Move the transform hook's per-request decisions into the transform-plan pass (cb7e6260)
- bundler: Split the rolldown plugin into per-hook modules (44e49240)
- compiler: Expression reads resolve shadowing through the semantic view (653b5384)
- compiler: Adapter consumes yuku-tsrx 0.1.1 upstream exports (637625a5)
- compiler: Component-local references resolve through the semantic view (4421e2a9)
- compiler: Expression locals resolve through the semantic view (105e5b09)
- compiler: Symbol-resolver handler bindings via the capture reader (5d69e154)
- compiler: Render validation resolves references via the analyzer (ab7f2f5b)
- ui: Base is a folder in @markless/ui, not a package (d6b1232d)
- compiler: Collect-elements uses the shared resolvedSymbolAt (e508b342)
- compiler: Delete the string-scanner band (U48) (f34baeb3)
- compiler: Dissolve the yuku-tsrx adapter (89c2c1d4)
- typescript-plugin: Markless-jsx.d.ts renamed to markless-tsrx.d.ts (af182da0)
- ui: Self-explanatory type helpers β Seeded<Props, Keys> and CallableHandler (bc48ce8f)
- ui: Base part props Pick from the tag β children comes with PropsOf (7e8f5f84)
- serializer: PROTOCOL_EVENT_ACTION_KIND moves to protocol-constants; protocol.ts leaves the payload closure (wall 29,943 -> 20,996, T075g repayment) (f7faa5e7)
- ui: Screen-reader tests colocate with their components; sr/ and sr-real/ dissolve into src// + test-support/ (ab1731bf)
- ui: Tabs comment purge + guard-clause keydown; walk stays pending handle-array capability (measured blocked) (108f5ac8)
- ui: Select DOM reach isolated in element-reach.ts (7 query sites -> 2); handlers straight-line; walls measured in note.md (55cc70d1)
- ui: Tree+navbar clean-code pass, comment purge, vitest locators; free-win reversions measured in notes (800042f9)
- ui: IsX boolean naming across select, tabs, tree, navbar, radio-group, otp scenarios (067cb375)
- ui: Quality orders across nine free families β comment purge, guard clauses, vitest locators, isX booleans (49ebc3b3)
- ui: Tabs trigger self-identifies via per-part element handle; note re-anchored (bccbf82f)
- ui: Select walk rides the plural handle; element-reach.ts deleted (zero DOM queries in the family) (9e8b487d)
- ui: Scenarios import the named barrel form (import { family } from '../../index.ts') - the consumer surface, per owner (ad8dc872)
- web: Row mint lives at fns/row-mint so the emitted specifier resolves (a823ab4d)
- web: The prerender derive-ownership check reads stateGraphNodeIds directly (b9ecbcb1)
π Documentation
- Use the markless mascot as the README logo (59fe3a4f)
- agents: PR feedback must be adjudicated before a PR is done (9f19ff5b)
- specs: Emission codegen migration campaign spec (de165450)
- skills: Markless-component-research β QDS research workflow adapted to markless conventions (64789321)
- goal: Tranche-4 overlay-cluster research (collapsible, popover, tooltip, toast) (1c76351d)
- goal: Recover tranche-3 research notes (radio-group, tabs, checklist) from sibling worker branch 054b17d2 (0463afa3)
- goal: Tranche-5 research (otp, pagination, scroll-area, qr-code) (71f2bd93)
- goal: Recover class-state research note from 46bfb6f9 (36864a4f)
- sr-gallery: Follow the sr machinery to test-support/ (99185339)
- goal: Tranche-6 research (select, carousel, tree, navbar, modal) (9dad9719)
- goal: Parity table rebuilt across all twelve families (F1-F19 gap register; counts measured at fc66d3f) (2589daa7)
- ui: Family notes and test-support README reflect the landed fixes (parity-table findings) (6ef7476d)
- ui: Tree/navbar notes re-anchored β rooting-element limit lifted; registration gap measured on three routes (325e7630)
- ui: Selection-key comment restored after rename merge (ec1a2e1a)
- vitest-browser: Matcher shim's anchor role recorded β jest-dom matcher set already typechecks (2ff71ffb)
- ui: Select note re-anchored - handle reads compile but are not instance-resolved (defect 63); conversion shape recorded (e6449d86)
- ui: Navbar overlay adoption measured blocked - four walls recorded (9c70b06c)
- ui: Select conversion re-measured - instance keying never resolves for select's shape (loud ambiguity throw); three eliminations recorded (1d76d979)
- ui: Select+tree notes re-anchored against board evidence (57/58 closed, 67 handoff) (ff9dfd9c)
- ui: Navbar note - dismiss typing stopgap resolved entries re-anchored (96d99ac9)
- ui: Radio-group walk conversion measured blocked - one element needs singular IDREF + set membership (d99cab40)
- ui: Navbar conversion measured 52/52-possible; corrected handle doctrine (one widget instance per element); two unblocks named (c5b1defd)
- ui: Toast + select notes re-anchored; keyed-repeat growing-source caveat kept honest (defect 84 still blocks toaster) (06f69538)
- witness: Pin reasons record the settle-kernel verdict and the census-splice requirement (2ad8ae6c)
- compiler: Projection-count comments say document-order subtree semantics (u329 fan-in) (ed776cc2)
- toaster: Note records the repeat-header call must route through computed() (eed2e4fb)
π¦ Build
- compiler: Vendor x86_64-linux-gnu yuku-tsrx binding for CI (b932c06f)
- compiler,router: Depend on published yuku-tsrx 0.1.0, drop vendor/ (22a0a167)
π Types
- core: Public Component alias; scenario names drop React vocabulary; typed sidecars as interim; locator-idiom base suite (971af72e)
π‘ Chore
- compiler: Escape the render-data reach key separator (raw NUL made module-link.ts binary to git) (471c744a)
- Trim fix-forward comments to one line each (b1da5ea9)
- One-line comments on the round-2 fixes (25c49a3c)
- claude: Allowlist read-only goal-prep/fable-opus checkers and tsc --noEmit (aa6b970f)
- ledger: Stage-1 emission migration complete (957cb073)
- ledger: Yuku migration merged to main - goal done (fdc532ea)
- ui: Delete the four family sidecars β tsserver resolution serves real types now (42feea98)
- Sr/ suites join the root typecheck include (1e57076e)
- ui: Checklist export subpath + screen-reader matrix entry (7347d8d0)
- Editor uses the workspace TypeScript so the tsconfig-registered markless plugin actually loads (ffc26aa4)
- ui: Comment sweep - process references gone, corruption repaired, 12 families narration-swept (9d869e80)
- ui: Tighter comment bar - navbar 153->28, combobox 86->31; toaster banners resolved (319633bf)
- ui: All banners gone; tighter bar on seven browser suites (ac448436)
- ui: Tighter bar across all family sources - tree 18, pagination 9, accordion 13, toaster 12 (8335199c)
- ui: Comment bar across the screen-reader suites - 678 -> 149 lines (581fe70c)
β Tests
- compiler: Pin expression-read shadowing contract (b87b93bc)
- bundler: Assert the unimportable delegate stays a runtime import (5b30acda)
- web: Pin sibling capture slots by route shape, not count (8b6fad18)
- typescript-plugin: 20s budget for the first-program language test (833b54a7)
- compiler: Pin style-object scope resolution with 15 parity cases (eb215072)
- compiler: Convert remaining parity suites to post-swap byte-equality gates (c3a32864)
- typescript-plugin: Give the cold type-check test a 15s timeout (2f1d9690)
- bundler: Re-anchor music-player wall to 64,645 for U-G production error containment (4c22ec90)
- bundler: De-minimis interim wall 64,645 -> 64,681 for the CSR decision-path fix (77bef540)
- ui: Colocated QDS-convention browser tests β checkbox exemplar, machinery relocated (a7f9c764)
- ui: QDS conventions β consumer scenario examples, part-role ids, textbox input/textarea rename, mode-loop dedupe (8da3fd6f)
- ui: Scenario examples move into per-family examples/ folders (edef22d6)
- ui: Examples/ folders renamed to scenarios/ (6a7d2e29)
- ui: Scenario files and components drop the family prefix (14a3b1c7)
- ui: Harness owns cleanup; dead rejection guards deleted; core gains Seeded + CallableHandler (5e49c5cf)
- ui: Checklist suites pinned at suite level β family blocked on the projection-identity question (e0ae0feb)
- ui: The one-element row follows the presence-only ui-* convention (78bd5760)
- bundler: Interim wall 65,162 -> 65,210 β T075d escape emission not fully gated; recovery chartered (1af6417b)
- bundler: Re-anchor music-player wall 65,441 -> 65,444 (+3 from the main merge, revert-measured on 8f9db73) (4855b355)
- web: Re-anchor event-only closure wall 29,097 -> 29,943 (T075g sharedSeeds type member, revert-measured; -30 payload.ts trim) (3030d11c)
- vitest-browser: Poll for committed writes instead of fixed sleeps; kills the parallel-iframe lazy-import flake (30c5f92f)
- compiler: Pin the SSR widget-root/projectionIds emission contract (U115 probe: chain complete at emission) (1939a3a4)
- bundler: Re-anchor music-player wall 65,444 -> 65,452 (+8, named exports + symbol-module declarations) (76d4a492)
- ui: Three SSR checklist rows skip on the order-dependent dispatch defect; un-skip with its fix (97dd4d72)
- ui: Pin otp's eight rows on the write-then-read dispatch defect (a86ebd34)
- compiler: Red-first witness for the undefined attribute branch (authored-expression fallback) (46be8328)
- ui: Destructured-prop rows assert the shipped exclusion (flipped by 6d8f681) (2db22f48)
- ui: Collapsible and progress assert destructured props stay off the element (projections still present) (ef7e13d4)
- web: Re-anchor closure wall 20,996 -> 20,983 (teardown fix net -13) (d107ede2)
- Pin the sync-policy preventDefault contract at compiler, payload, and browser levels (U132 drop report invalid) (5d8de6d9)
- bundler: Re-anchor all three walls with per-change-set attribution (row-capability stack +421/+1087/+1082; NODE_ENV=test measurement landmine recorded) (43ff0efc)
- bundler: Bridge wall anchors to tip actuals (+85/+28/+28 from the four post-attribution merges) (6c5af528)
- ui: Pagination's consumer-callback rows assert the shipped behavior (flipped by the claimed-root fix) (ab18fbdd)
- Nested-callback SSR row asserts both dispatch halves as one record; pin carries the measured warm/cold inversion (d6ac6f6f)
- compiler: Pin the handle-IDREF gates (host control green; part-position and target behavior pinned) (2d6d5e30)
- ui: Serial browser lane (contention past the poll ceiling, measured by U173) (1622662d)
- bundler: Bridge walls to tip actuals (+423 mp: scoping stack + per-render registries; fixtures +22/+36 concurrency-safety payload) (6516da9f)
- ui: Otp at 37 passing / 1 skipped (arm-row fixed by the layers; stale pin corrected; parameterised methods measured unblocked) (2e11a8fe)
- sr: Virtual reader covers eight families (captured transcripts; four family a11y gaps pinned; matrix grown) (b079295d)
- sr: All twelve families under the virtual reader (captured expectations; two family gaps pinned) (74d6cd03)
- bundler: Severity gating pinned β errors from every producer block by construction (defect 53 invalid) (29336353)
- browser: Overlay suite polls handlers' last observable writes; afterEach drains the overlay stack (refcount leak found) (493a797b)
- bundler: Walls re-anchored for the handle/dispatch capability chain (+470 emitted runtime, +217 largest chunk, music-player 67,330); repayment owed to bundler-diet (0941c327)
- bundler: Vite-plus walls re-anchored +10/+20 for the non-bubbling dispatch fix + overlay demand seam (76870285)
- bundler: Music-player wall 67,360 (measured 67,343 on checkout) (8494898d)
- browser: Nav-transitions fast-swap controls its premise (warm-up + gated read); held-state assertions added (59f1f540)
- ui: Modal defect-72 rows pinned test.fails; duplicate dismiss event-map augmentation removed (plugin owns the typing) (6b7f0ad7)
- browser: Defect-72 seated - realm-global pageRegistry leaks root paths across containers; reduced repro pinned (23bb5f6f)
- bundler: Walls re-anchored for the registry + plural-handle chain (+149/+143 chunk, +566 music-player); bundler-diet repayment (7b3686a2)
- bundler: Emitted-runtime walls re-anchored for the same chain (20,440/20,370) (6127a1be)
- typescript-plugin: Singular hover pin tracks the eagerly-resolved ElementHandle (7ea068b3)
- ui: Select keyed-loop instance row pinned as defect-75 reproduction (8e99c441)
- ui: Radio-group keyed-loop row pinned as defect-75 reproduction (d70e011c)
- ui: Carousel screen-reader suite (12 rows, carousel+slide vocabulary); defect-79 mechanism measured (a37a1629)
- ui: Sr driver gains settleOnFocus - rows read the reader's own focus announcement (select arrow-row fixpoint flake fixed) (b393d303)
- ui: Carousel autoplay row un-pinned - defect 79 landed (36873f51)
- bundler: Severity fixture repointed at the sole-producer row-local write (old shape now lowers); chunk walls re-anchored +91/+90 for the 79/78 chain (c45d7c2c)
- bundler: Emitted-runtime walls re-anchored (+~100) for the 79/78 chain (a4017010)
- browser: Multi-binding remaining rows pinned with seats (bundler seed gate, defect 88, spread-el read-back) (9c9f760c)
- bundler: Walls re-anchored for the multi-binding chain (+~160 chunk, +216 music-player) (6f10cbfe)
- bundler: Emitted-runtime walls re-anchored for the multi-binding chain (20,750/20,680) (256d533f)
- bundler: Chunk + music-player walls re-anchored for the multi-binding chain (measured on checkout) (fbf837b2)
- bundler: Self-route expectations track the swept scenario import path (not a regression) (3b84a3c6)
- ui: Closed-panel reachability asserted on the plain-hidden scenario (until-found default is a reader limitation, per accordion) (d387f755)
- bundler: Music-player wall 68,380 - widget-repeat records priced; clawback named for bundler-diet (0622d852)
- compiler: RowStartOffset emission and its fail-closed cases (1e9cd2b1)
- bundler: Music-player wall re-anchored 68,380 -> 68,440 for rowStartOffset resume consumption (defect 84 half 1) (cdb94bb4)
- bundler: The shared-seed gate pays nothing for a module that roots no widget (6df7e17d)
- vitest-browser: Krg witnesses for the client-minted @empty arm (0d0c733f)
- witness: Array-handler probe repointed - arrays are a feature; defect 89 pinned (plain-state writes double-commit AABB) (90d5a631)
- compiler,serializer,web: Pin the @empty arm transport, its fail-closed refusals, and the census splice (8dd77555)
- bundler: Wall re-anchored 68,440 -> 69,100 for the @empty arm mint; combobox backspace row polls like its neighbours (97d2e403)
- vitest-browser: Defect 89 un-pinned - three-entry handler array traces ABC (01d20c64)
- compiler: Pin shared-instance repeat resolution and its fail-closed refusal (b76e3a70)
- browser: Witness a computed re-deriving over a module-scope const, CSR and SSR resume (558c8251)
- vitest-browser: Witness a keyed repeat over a shared instance, SSR and CSR (17c86e87)
- compiler: Emit-behavior harness passes the carry fields production supplies (u299 fan-in) (de0b6e49)
- compiler: Empty-arm key-shape assertion gains rowTemplate (u302 fan-in) (e172f70b)
- witness: Nested-callback rest-spread pin flips - the blocker was the flush lost wakeup, not prop:props (u306 fan-in) (f705bd64)
- Rolldown assertions track the queued wrapper; wall re-anchored 69,100 -> 69,360; defect 94 (resumer arrival scramble) pinned (u307 fan-in) (28b3d725)
- witness: Defect-94 row skips with reason - probabilistic scramble cannot be test.fails (d24c75dd)
- bundler: Wall re-anchored DOWN 69,360 -> 69,140 - the demand gate repaid the mint bytes (5f1a85ca)
- toaster: The ruled surface quarantined to its own scenario; the pin is now the build refusal (defect 95 fail-closed) (56b74f74)
- compiler: Order-invariance pins for shared-method inlining (defect 98 non-repro, dissolved into F1b) (5f208d68)
- bundler: Ssr-preview executed-gzip wall re-anchored 3,350 -> 3,430 with priced history (u320 fan-in) (15e0eb96)
- browser: The same-module composed-symbol row now renders (defect 99 coverage) (8b349a86)
- u323: Browser + compiler pins for the projection splice; toaster comment says which wall moved (638a2298)
- bundler: Wall re-anchored 69,140 -> 69,800 for the projection splice; clawback named (u323 fan-in) (7e00bd16)
- bundler: Fixture runtime-chunk walls re-anchored 3,730/3,725 -> 3,750/3,745 with priced history (u325 fan-in) (48851c2b)
- bundler: Adopt the census oracle sweep (2,001 hosts / 171 scenarios, 0 diverging); fixture emitted-total walls re-anchored (u327 fan-in) (2f7b9112)
- ui: Shared conformance battery + axe lane - 20 families, 11 checks, CSR+SSR (three new defects surfaced) (c47f2111)
- sr: Select/modal/radio-group/tabs join the real-reader matrices; gallery gains their scenarios (d9b51eb0)
- sr: Reader vocabulary gains combobox/listbox/option; transcripts extracted per family (e47a4978)
- ui: Unnamed popover pins omitted naming IDREFs, matching the omittable-IDREF behavior (f1f9c4e3)
π¨ Styles
- ui: Readable instance names β the checkbox family resolves const checkbox = checkboxState() (d575739b)
- ui: Family sources drop the framework-explainer comments; toggle() reads clean (9ac3af61)
π€ CI
- Shard the test job into parallel lanes (7ddc5a5d)
- Skip lanes whose content hash already went green (80d4137f)
- Answer the PR #31 review, fix the lane keys and harden the checker (#31)
- Answer the second CodeRabbit round - validate effective permissions, parse the checker invocation, correct branch-protection claims (8c24498c)
- Retrigger full run (rerun-only jobs crash in a partially restored environment) (7b91cd78)
- sr: Navbar, select, and tree join the virtual matrix (suites existed, registration missing) (d2dce2d5)
- Popover and slider join the virtual screen-reader matrix (7c593477)
β οΈ Breaking Changes
- ui:
β οΈ Remove the scroll-area family (owner directive) (c4edc6d9)
π Other changes
369 further commits, mostly prose-messaged internal work - see the full compare.