Tranche T — THE OWNER'S BAR (impl drive)#5
Draft
mkbabb wants to merge 340 commits into
Draft
Conversation
a11y-first splitText(el, {by, a11y}) — shreds a text element into a per-word/
grapheme/line fragment cohort + a ready stagger, consolidating the accessible
name onto the container (aria-label over a naming role + aria-hidden fragments)
so AT reads the whole pre-split string, not the per-glyph stream. Composes
stagger + Intl.Segmenter; zero static value.js edge (proof:boundary enrolls it
off the barrel automatically). by:"line" is measure-or-refuse (getClientRects
line grouping + ResizeObserver re-measure; typed SplitTextRefusalError under
unmeasurable/unstable/empty). GSAP 2025 SplitText is the reference bar.
- proof:split-a11y (T8): browser-actuated COMPUTED-accessible-name equality — the split container's Chromium-computed accessible name (CDP Accessibility.getPartialAXTree) == the pre-split string, fragments pruned (consolidated, not shattered); + the cohort ANIMATES under the ready stagger (staggered opacity scrub). Oracle isolates a value.js-free splitText bundle via rolldown (the raw barrel shares a bare value.js chunk), serves it, runs the REAL splitText in-browser. Born-RED witnessed: disabling the a11y consolidation reds the name-equality clause; wiring greens it. - test/split-text.test.ts: the jsdom half — cohort/stagger, a11y attribute wiring, revert, and the by:"line" measure-or-refuse (jsdom has no layout → unmeasurable refusal) + empty refusal. - wiring: package.json + demo-correctness CORRECTNESS_ROSTER (browser-actuating library-value gate, per the compile-browser-parse precedent) + published-surface manifest rows for splitText/SplitTextRefusalError + root CLAUDE.md test-file count reconciled (96→98 files).
…nPath/DrawSVG/MorphSVG extend it, closing MotionPath.finished asymmetry by construction (a20 F1+F2); DRY transport.ts prefersReducedMotion through internal/reduced-motion (a16 F3)
…editor + keyframe-timeline peers; author proof:shared-has-n-consumers (born-RED) The R "do not touch" 10k-line monolith is carved into three sibling @/ peers (a24 F1) in ONE atomic commit with all gate repoints (P2-1 same-commit rule — no intermediate green): - git mv keyframes/ → keyframes-editor/, timeline/ → keyframe-timeline/, animation-controls/ → animation-transport/ (shells + controls/ + composables/) - 3 cross-peer relative imports + ~13 external alias/relative importers rewritten (incl. the ChromeDock ../animation-controls/injectionKeys + 3 test relative-file forms that gh-pages/vitest — NOT tsc — caught, P2-1 F7) - ~14 shell-path gates repointed as curated scope-SETS (the dominant D2 cost tier invisible to the census — P2-1 F3): demo-shell-grid, cartoon-is-panel-depth, control-surface-single-writer, drawer-spring, idioms, mobile-single-page, no-single-option-select, scene-control-dfa, bezier-grown, adopt-compiled, modern-web, demo-elevate, no-dead-dependency (+ the AC-relative keyframes/timeline sub-path fix in cartoon-is-panel-depth) - T7 walker-root arming-audit: proof:decomposition re-rooted from the single animation-controls/ tree to the THREE carved peers so peer-moved files are not silently dropped from the walk (P2-1 F5) - proof:shared-has-n-consumers AUTHORED born-RED (C-23 per-scene areas; flat-single ≥2-area vs directory ≥1-peer thresholds) — 8 reds today on the S3-relocated single-area modules (dock, matrix-editor, CSSPasteDialog, AnimatedText, TypingDots, KeyboardShortcutsModal, EasingCurveCanvas, useTypedTrigger); greens after S3 - demo/CLAUDE.md hot-fixed (claude-paths-live root/demo green) Verify: check(0) · check:lib(0) · gh-pages(0, caught the relative .vue breaks) · vitest 940 passed · decomposition/cartoon-is-panel-depth + the 14 repointed gates green · proof:shared-has-n-consumers born-RED (8 findings recorded) · modern-web red is the pre-existing environmental mwg-corpus (P2-1 F9, green w/ KF_MWG_OPTIONAL=1).
…g after of()/DRY additions (proof:decomposition GREEN); refresh root CLAUDE.md frozen test count 95→96/942 (proof:published-surface (e))
… GREEN Evict the single-area-private modules OUT of demo/@ into their sole consumer (a24 F3/F4/F5), greening the born-RED partition gate: - CSSPasteDialog → keyframe-timeline/ (sole consumer KeyframeTimeline) - AnimatedText·TypingDots·KeyboardShortcutsModal → editor-shell/ (S.A0 X-5 margin mechanism in AnimatedText preserved — only specifiers changed) - easing-editor/ cluster: EasingEditor·EasingSelect·EasingCurveCanvas·DemoControlPoint (+ the EasingSelect ../../../scenes/easing depth-bump the move deepened) - orbital-drag/ + matrix-editor/ → scenes/cube/ (relative imports; no ../../ climb — scene-colocated ASSERTION 2 holds; matrix-editor→orbital-drag now ../orbital-drag) - useTypedTrigger → scenes/sequence/ - dock/ → demo/app/chrome/ (app-private, a24 F3) + app-is-shell ALLOWED_ROOT_DIRS += chrome + decomposition clause-9 dock paths repointed (T7 same-commit) Gate co-edits (the census-invisible tier — P2-1 F3): ~16 more scripts repointed for the colocated modules (demo-elevate, typing-dots, demo-control-point, dogfood, dogfood-hero, orbital-rotate3d, idioms, scene-control-dfa, darkmode-row-toggle, single-toggle, pp-logo-svg, design-refinement, control-surface-single-writer, no-single-option-select, modern-web) + 2 test refs (orbital-rotate3d/inertia-parity). proof:scene-colocated ref-count clause ADDED (edit #2 of A4→D2→D3): the D2 scene-private colocations have zero external importer. proof:shared-has-n-consumers plant-test fixed (module-id key). demo/CLAUDE.md hot-fixed. Verify: check(0) · check:lib(0) · gh-pages(0) · vitest 940 passed · shared-has-n- consumers PASS (born-RED→green) + plant-test bites · scene-colocated (d2-ref-count) · app-is-shell (chrome) · decomposition · claude-paths-live root/demo green.
Cube was the lone scene carrying its transport superKey inline in useCubeAnimations.ts rather than a <name>Keys.ts peer. Add cubeKeys.ts (CUBE_SUPER_KEY = 'Cube', the R.W5-C.4 single source); useCubeAnimations re-exports SUPER_KEY from it (all 8 internal + CubeScene consumers unchanged); app/scene/scenes.ts imports CUBE_SUPER_KEY from cubeKeys, mirroring the other seven <name>Keys imports. tsc(0). Also S.D2 S4 (KfPillTabs promotion): KfPillTabs remains the shared standard panel primitive — consumed by AnimationControls (the tab panel) + SpringSidebar, green in proof:shared-has-n-consumers (2 areas). The a12 F1/F2 keyboard fixes + KfPillTabs.test.ts are S.B7's, not authored here (SPEC S.D2 S4 · se-B6).
… F6, import-neutral) ControlsPaneWrapper.vue was 497L — 298L of that scoped CSS (a CSS-volume artifact, not a logic seam; P2-1 F6). Carve the <style scoped> tier into a colocated sourced stylesheet (ControlsPaneWrapper.css, referenced via <style scoped src=...>), the G1/AnimationControlsGroup precedent the gate comments already anticipate: - SFC 497 → 200L (3 lines under the 500L ceiling → real headroom); import-neutral (public SFC keeps name/interface; zero external importer change) - the G1 --stage-strip/--stage-reserve mobile stage-visibility token block travels to the .css VERBATIM (build-invariant — proof:stage-visible reads the BUILT tokens) - proof:drawer-spring co-edited to read the SFC+.css pair (else its <style>-block scan would vacuously pass on the now-empty inline block — masking, FORBIDDEN); proof:idioms already reads the .css sibling (fileSrc); brittleness sweeps .css natively Verify: check(0) · gh-pages(0) · demo-no-oversize/drawer-spring/idioms/brittleness/ cartoon-is-panel-depth green · proof:stage-visible re-run GREEN (26, C-24).
…e app-is-shell precedent) The born-RED @/ partition gate is GREEN on the merged tree (after the S3 colocations), so it rides CI as an ordinary blocking member beside its sibling structural demo gates proof:app-is-shell / proof:scene-colocated — NOT the EXCLUDED born-RED-stays-red set (claude-paths-live/chronic-closure): - ci.yml gates job step (next to proof:app-is-shell) - proof:hygiene-chain member (so proof:all == the CI roster, both directions) proof:ci-coverage GREEN (was RED: 'authored-but-unrun gate is a coverage lie').
…s-impl # Conflicts: # CLAUDE.md
…s-impl # Conflicts: # CLAUDE.md # src/animation/orchestration/index.ts
…on) + F2 (SplitText) CLOSED; merged-tree union green incl. the C-24 post-carve stage-visible re-run
…ligned to engines floor (^22.20.0); glass-ui ~4.0.x tilde pin verified held (no bump) S1 — deliberate tested bumps (fold row 62): - dependency-cruiser ^17.4.3 -> ^18.0.0. Sandbox-verified (npx-isolated install, not the shared symlinked node_modules): depcruise src --ignore-known against the real .dependency-cruiser.cjs config exits 0, 0 violations, known-violations baseline stays []. v18's only breaking change (drops Node 20/25 support) is compatible with the >=22 engines floor. - fast-check ^3.23.2 -> ^4.8.0. Sandbox-verified (isolated npx install): every fc API grammar-fuzz.test.ts uses (assert/property/asyncProperty/ float/integer/tuple/oneof/constantFrom/array/uniqueArray) resolves and behaves identically; upstream changelog confirms no signature/behavior break for these APIs in v4.0.0. test/grammar-fuzz.test.ts (5 tests) green against the current tree; proof:grammar-fuzz's fast-check-present clause picks up the new ^4.8.0 string. - @types/node ^25.9.1 -> ^22.20.0 (aligned to the engines floor, Node >=22 -- was drifted 3 majors ahead of the floor). Verified via a --typeRoots override sandboxing the floor-aligned types package alongside the real tree's other @types/*: both and compile 0-error against the floor-aligned surface. S3 — glass-ui pin posture (C-12): verified ~4.0.0 (tilde, never caret) in optionalDependencies, installed 4.0.1; no bump (the 5.0.0 consume is the owner-domain HANDOFF since the 2026-07-03 S.E shelf). No edit. Lockfile: npm install --package-lock-only (node_modules is the shared worktree symlink -- left untouched; only package-lock.json's resolved tree for these 3 packages + their own transitive deps changed: acorn, commander, enhanced-resolve, semver, watskeburt under dependency-cruiser; pure-rand under fast-check; undici-types under @types/node). npm ls --package-lock-only resolves clean, 0 conflicts. The orchestrator's main-tree npm install at merge lands these for real; this worktree's node_modules stays on the pre-bump versions by construction. Gates green: proof:pin-ledger-current, proof:deps-current, npm run lint ([] baseline), proof:lint-clean, proof:no-flat-siblings, proof:grammar-fuzz, proof:packrat-sound, proof:peer-satisfied (born-RED-by-design, unaffected). check/check:lib/build/gh-pages 0; vitest 98 files / 957 tests green. Explicitly NOT touched: S2 (the value.js 2.0.0 consume-edge -- LATE slice gated on the external spine, owner ruling 6).
…the LIBRARY_CEILING_OVERRIDE map (R.W0 keystone completed) - classic.ts 728L → 305L (34 factory functions) + classic-data.ts 459L (34 raw @Keyframes CSS-string constants). Both clear the hard base ceiling with NO override — the honest data-volume disposition (fold row 32; not a taxonomy 3-way string split). - proof:decomposition: the per-file cap-raising LIBRARY_CEILING_OVERRIDE mechanism is RETIRED (last entry deleted, Map emptied). It survives only as an empty-by-construction tripwire: the ceiling loop measures every library file against the hard base ceiling; the guard REDs on ANY re-added entry (T2). This completes R.W0's keystone (a20 F5; fold rows 32/33). - Born-RED: plant an override entry → guard REDs; empty map → GREEN.
…ee functions (a19 F1) group.ts 498L → 419L. The transport verbs (play/pause/resume/stop/settle/reset/ playing + the reduced-motion snap + resolvePlay) move to the colocated group/lifecycle.ts as free functions taking the group; the class keeps thin this-delegates so the public transport surface reads unchanged. Mirrors the engine's engine/play-lifecycle.ts carve (B2). The per-frame composite/draw half (advanceTo/_frame/_renderFrame/render/transformFramesGrouped) + the layer-spring API + the _compositeBuf/_soaPlans SoA state STAY on group.ts. _playingPromise and _boundFrame widen private→internal (the DI-not-cast posture; no PlaybackHost protocol). Type-only back-edge (import type AnimationGroup) — no runtime cycle. Gates: proof:engine (pause-honest triad + managed-pause cross-link), proof:finished (held _playingPromise getter), proof:spring-blend-weight (phys-c-api/guard), proof:soa-composite (_compositeBuf/_soaPlans state) all green; 76 group tests pass.
…verbs as free functions sequence.ts 499L → 402L. The transport verbs (play/stop/pause/resume) + the rate/repeat modifiers (timeScale/reverse/repeat/yoyo) move to the colocated sequence/lifecycle.ts as free functions taking the Sequence; the class keeps thin this-delegates so the public transport surface reads unchanged. They call the pure ./transport drivers (reanchorSequence/settleSequence) directly, so the dead _reanchor/_settle private helpers are removed. seek/add/label/on/setTargets, the getters, _frame (test-driven), and get finished() STAY. _playingPromise/ _boundFrame/respectReducedMotion widen private→internal (LIGHT preserved; type-only back-edge — no cycle). Gates: proof:transport-events (behavioral over dist), proof:finished, proof:orchestration green; 35 sequence tests pass.
frame-compiler.ts 496L → 429L. The keyframe-selector validate+parse logic (the J.W1 SEAM-1 fail-explicit guard + the L.W1 S4 opaque named-selector ingest) moves out of FrameCompiler.addFrame into parseKeyframeSelector() in compile/selector.ts — beside the grammar it validates against (the regexes, NAMED_SELECTOR_SUPERTYPE, namedSelectorToFraction already live there from R.W2b). addFrame now calls parseKeyframeSelector(start). frame-compiler drops the parseCSSValueUnit/AnimationOptionError/SELECTOR_* imports; selector.ts gains the value.js edge (already HEAVY-zone). Gates: proof:replay-equality reads the combined [frame-compiler + selector] surface so the named-selector anchors stay locked; proof:engine engine-seam (FrameCompiler run-state-free) + proof:nan-frame + proof:compile-backward-leg + proof:no-flat-siblings green; 42 compile tests pass.
…n-place toolbar + census gate discharge
KeyframesEditor's action bar was a shadcn reka `Menubar` that never held a
single `MenubarContent` — a 4-affordance authoring TOOLBAR (add · copy · apply,
plus a decorative wand), not a set of menus. A `dropdown-menu` remap would bury
frequently-used authoring actions behind a trigger AND break the persistent
brush affordance (its ref lives in a portalled content unmounted until first
open), so per C-19 this takes the a24-F6 relocate-in-place path: a plain
`role="toolbar"` bar keeping every action visible + working, with
`useToolbarKeyboard` restoring the roving-tabindex keyboard reka gave it
(Arrow/Home/End over the real button descendants, aria-hidden lead excluded).
No external dependency (T12-clean). The S.B4 `AnimationGroup.of()` migration in
removeKeyframe is preserved untouched.
Excises the last shadcn island: delete `ui/menubar/` (16 files) + the
menubar-private `cn()` helper (`@/utils/utils.ts`) + the now-empty `ui/` tree.
Discharges the S.C3a shadcn census clause (proof:no-dead-dependency clause 3):
the census is now empty, and the clause is FLIPPED from non-gating to GATING —
the tier flip the discharge requires (same detection C3a authored; not a
re-author), and what makes S.C3a's own falsifiability ("re-adding a cn(/@radix-*
footprint REDs") true. Recorded: island present + gating -> exit 1 (RED);
island deleted -> exit 0 (GREEN); a fresh cn( regrowth -> exit 1.
T6 co-edits: proof-shared-has-n-consumers drops the now-stale utils/utils.ts
allowlist entry; demo/CLAUDE.md drops the ui/menubar tree node, the utils.ts(cn)
mention, and re-scopes reka-ui to glass-ui's peer basis. reka-ui + clsx stay
(both glass-ui peers).
The census clause proves the shadcn island is gone (source-shape); this is the T8 half it cannot cover — a REAL vitest interaction test that the migrated bar's keyboard/focus behavior survives the remap (the KfPillTabs precedent: verify by DRIVING it, not inspecting markup). Mounts a real Vue toolbar host on document.body, dispatches bubbling KeyboardEvents, and asserts the roving single tab stop, Arrow/Home/End navigation with wrap (keyboard + focus), held-arrow determinism + repeat activation (repeat), and aria-hidden decorative exclusion. Exercises useToolbarKeyboard — the actual keyboard code path KeyframesEditor wires (vitest has no Vue-SFC plugin, so the composable is driven through a representative host exactly as the demo mounts it). 4 tests, green.
…AF loop as free functions progress.ts 499L → 492L. The managed-playback loop (.play()/.stop() rAF ownership + the reduced-motion routing + the auto-resume _startLoop) moves to the colocated spring/managed-play.ts as free functions, completing the tranche-wide pattern (every playback-owning class now homes its loop in a colocated module — engine/play-lifecycle, group/lifecycle, sequence/lifecycle). The closed-form SOLVER (evaluateAt/checkSettled/set-target re-seat/snap/reset/tickDt/the SoA vector overload) STAYS — it is the spring's math. To keep the progress→managed-play edge one-directional (no cycle under tsPreCompilationDeps:true), managed-play drives the spring through a SpringPlayback structural contract declared in types.ts (the spring family's ring-break home) — it never imports the SpringProgress class. _playback/_onFrame/disposed widen private→internal; a respectReducedMotion getter + implements SpringPlayback satisfy the contract. Gates: proof:engine snap-symmetry, proof:spring-blend-weight, proof:processframe-soa (setTargets overload), proof:lint-clean (no-cycle), proof:spring-vector, proof:boundary green; 126 spring/physics tests pass.
…de Map RETIRED) + C3b island excised (C-19 documented choice) + C4 S1/S3 posture CLOSED; union green on depcruise-18/fast-check-4 tree
Bring test/ + bench/ into the type-check roster and drive it to 0 — the debt R left when test/ sat outside every tsc invocation (fold row 39). - S2: tsconfig.test.json (include test/ + bench/) joins `npm run check` (`tsc --noEmit && tsc --noEmit -p tsconfig.test.json`). vitest.config.ts gains the `@mkbabb/keyframes.js` self-alias (mirrors vite.config.ts) — without it the 8 demo tests transitively self-importing kfEngine RED at resolve. - S3: bench/ under typecheck — waapi-densify.bench 8 stale `Animation<…>` → `KeyframesAnimation<…>` (5.0.0 rename), interp-buffer Vars double-cast, interpolation.bench composite via the seam, playwright.bench ci-env.d.mts. - S5: the documented composite seam (test/support/group-probe.ts) — every `transformFramesGrouped` private reach (~20 call sites + the useAnimationGroup `vi.spyOn(private)`) routes through `compositeFramesAt`/`spyOnComposite`, typed against the real private signature so a drift REDs the seam. zero-alloc's illegal `LeakyGroup` override reshaped to a fresh-spread bite. - hygiene: AnimationEvent polyfill init → AnimationEventInit (×5), StaggerFn total args made optional to match the defaulting impl (was type-vs-impl drift; RED'd stagger/split-text), undefined guards, generic args, unused ts-expect-error ×3, getAllState(undefined), StoredAnimationGroupControlOptions factory. Witness: a raw `group.transformFramesGrouped(t)` planted in a test REDs tsc -p tsconfig.test.json (TS2341, exit 2); removed → 0.
R.W5 fused cube/morph/motion-path/sequence/square into demo/scenes/<name>/ and left their composables with ZERO direct test coverage (a25 F1, fold row 40). Add one composable test per scene, each referencing demo/scenes/<scene>/ so the gate's "5 scenes each referenced from test/" holds and a construction/logic regression reds — mirroring scene-raf-leak/scene-contract-identity: - motion-path: buildPathD single-source + clientToUserUnits square projection (strong pure assertions) + useMotionPathDemo/Gesture construction. - cube: useCubeRelit relight (FACE_NORMALS unit normals, front>back at rest, euler rounding + reactivity) + useCubeAnimations name registry. - morph: MORPH_SHAPES catalog invariants + useMorphDemo construction. - sequence: useSequenceInstrument scrub/power-on state + useSequenceDemo grid. - square: useSquareKeyboard arrow/Home/tour → reseat/onTarget contract over real SpringProgress + useSquareAnimations spring ownership. tsconfig.test.json gains src/env.d.ts (the *.vue ambient) so the cube test's orbital-drag barrel (re-exports OrbitalDrag.vue) type-resolves. Root CLAUDE.md test-file count co-edited 99→104 (published-surface clause (e)).
…generics + FrameUnderConstruction; gate proof:no-any-default The 11 <V extends Vars = any> sites (KeyframesAnimation, Sequence, FrameCompiler, AdoptResult, CompileInput, IngestedAnimation/IngestResult, adoptRunning, fromStyleSheets/fromLiveAnimations/resolveLiveKeyframes) and the 7 SVG <V extends Record<string, any> = any> sites (the SVGAnimationHandle base + the DrawSVG/MotionPath/MorphSVG classes + their from* factories) now default to = Vars — every unparameterised use keeps the number|string value union instead of collapsing to any (a29 F1/F2). The one sanctioned = any survivor is the free-form Vars<T = any> value slot. S7 (a29 F7): createFrame returns a FrameUnderConstruction<V> = Omit<AnimationFrame <V>, 'vars'|'flatVars'> — the two derived fields are honestly OMITTED, not forged with 'undefined as unknown as V' (an exactOptional per-field lie). finalizeFrameVars fills them at the tail of parse() and narrows to a complete AnimationFrame<V>. proof:no-any-default scans BOTH built roll-ups for a constrained generic defaulting to any (exempts the unconstrained Vars<T = any> slot). Born-RED: 36 findings on the pre-flip roll-ups; GREEN after the flips + rebuild. Version-ruling input (i): the d.ts narrowing is source-breaking for a consumer that passed arbitrary property bags — default additive-minor, ruled at S.Z3.
…(p07/sb-#6) The old runtime-vs-runtime Object.keys() diff was VACUOUS — both the ./engine subpath (dist/engine/index.js) and loadAnimationEngine() are hand-composed over the same zones, so 'delete a public.ts re-export' drops the key from BOTH sides symmetrically and stays GREEN (a08 F1: FINAL.md asserted the mirror as fact with no gate behind it). Redefined: the subpath's RUNTIME keys must be a SUBSET of the AnimationEngine d.ts TYPE key list (parsed from the built dist/keyframes.d.ts) — the same authoritative roster proof:published-surface clause (d) gates loadAnimationEngine() to. clause 1 content-checks dist/engine/index.d.ts is a real roll-up declaring the core heavy types (a08 F2). The relation is ⊆ (not ≡) so a future wave that adds a runtime key AND its interface field together (S.F1/S.F3's compileToViewTransition/ compileToEntry) stays green; the gate bites ONLY an UNPAIRED runtime addition. Born-RED witness: an unpaired 'export const __plantMirrorProbe' in public.ts → runtime 40 ⊄ interface 39 → RED (exit 1); removed → GREEN. The old form would have stayed green. Decoupled from the owner-optional loader collapse (S5/§6.3) — the TYPE-diff is drift-proof whether or not the collapse ships.
… + dts-plugin hard-fail; gate proof:dts-rollups-agree S3 (a29 F5): proof:dts-rollups-agree freezes the byte-identity of every symbol declared by BOTH d.ts roll-ups (vite-plugin-dts's barrel + engineDtsRollupPlugin's subpath), normalising alias suffixes / reflow / comments. Before this the two pipelines had NO consistency gate — a compilerOptions or trimming change in one could silently diverge a shared symbol. S2 (a29 F4): the engine plugin now emits the PUBLIC-trimmed roll-up (publicTrimmedFilePath), MATCHING vite-plugin-dts's barrel pass which already trims @internal. Before this the engine roll-up was UNtrimmed, so S.B5's @internal tags on Sequence diverged the two surfaces — the exact drift proof:dts-rollups-agree now gates. @internal is now honored uniformly across both shipped surfaces. S6 (a08 F2): the engineDtsRollupPlugin's two 'this.warn(...); return;' soft-fails (no-emit / no-rollup) are now this.error() HARD build failures — a silent warn+return left a STALE dist/engine/index.d.ts in place, shipping rotted subpath types green. Verified: a simulated non-emit now exits the build 1 (was a green warn). Born-RED witness (rollups-agree): the engine plugin reverted to untrimmed → Sequence diverges → RED (exit 1); publicTrimmedFilePath restored → GREEN. Version-ruling input (ii): whether the @internal/private strip counts as a published-surface removal for the C-18 changelog gate — default additive-minor, ruled at S.Z3. The 113 private-keyword members are a distinct category (no clean API-Extractor strip without per-member @internal) behind that ruling.
…, not a kf-local fix value.js's exported PropertyDescriptor collides with the ambient DOM lib global, so API-Extractor collision-renames it to PropertyDescriptor_2 in the published roll-up (propertyRegistry / ResolvedKeyframes.properties). A kf-LOCAL import alias does NOT change that — API-Extractor renames by value.js's SOURCE symbol, not the importer's alias (verified: the built d.ts kept PropertyDescriptor_2 under an alias) — and both leak sites are consumer-observable (a platform-adopt test asserts on propertyRegistry; properties is a public ResolvedKeyframes field), so they cannot be @internal-trimmed away. The durable fix is the value.js dispatch (rename its export, e.g. CSSPropertyDescriptor, on the 2.0.0 grammar-rename cadence). Recorded as KF-7 in docs/tranches/S/KF-VALUEJS-2.0.0.md; kf re-points at the ^2.0.0 re-pin (KF-2 cadence). Same defect class kf already fixed locally for globalThis.Animation and OscillatorOptions — this one originates upstream (sibling repo NOT touched here).
# Conflicts: # scripts/proof-no-dead-export.mjs
…t facility, styles split, THE KEYSTONE); useKfPillTabs colocated per the keystone's first bite; ratchets 102/28; ci wired; the ratification recorded
…ui <Drawer mode="live-behind"> The ~550L bespoke peek/half/full sheet is DELETED: SheetGrabHandle.vue + useSheetGesture/useSheetSpring/useSheetState + the sheet CSS. The mobile sheet is now glass-ui 4.0.1's <Drawer> — the exact article, whose --glass-drawer-t is spring-driven by kf's OWN SpringProgress transitively (drawer.js:6/:134; the dogfood is preserved through the facade). The .controls-pane body is shared between the mobile Drawer (portaled) and the desktop naked rail via createReusableTemplate. The occlusion contract is approximated via snapPoints (subject 0.48 ≈ 52dvh reserve, editor/storyboard 0.62 ≈ 26dvh strip); the bottom-menubar overlap the ladder cannot cure is the BG-11 structural gap. glass-ui-gaps.ts drawerDetentInset flipped to the ADOPT posture.
…M7/M8 convergence - T.G2: proof:single-raf-clock RECORDED-not-authored — the 5 surviving rAF owners are 2 justified one-shot bursts (useTransformState coalesce, CopyButton aria-live re-arm) + 3 settle-and-stop loops on the house useRafFn recipe (useOrbitalInertia, useAnimationSync D.W3.S4, useTimelineBuild one-shot-per-call). The defect (fan-out) was cured by T.G3 true-rest (0.00/frame idle, proof:perf-counters BLOCKING) + T.G4, not a master clock; the gate's allowlist=1 shape doesn't fit — subsumed by the rest oracles. Landing note appended to T.G.md. - lighthouse AFTER probe (T.G9 methodology): committed lighthouse-mobile-after.json. Floors do NOT clear (gate stays born-RED, rides glass-ui BG-5 + calibrated runner); robust LCP signal: the Monaco defer put home/cube/amiga/easing LCP ~10s (was ~16s), spring LCP 16.6s the last hard-LCP miss. Sandbox-contention caveat recorded honestly. - M7: removed the proof:easing-sidebar-minimal double-listing (was in BOTH RETIREMENT_LEDGER and T_BORNRED_BACKLOG → model violation) — retirement-ledger GREEN. - M8: roster-ceiling honest count note 228→236 (⑩ edict fold re-authored gates up); the stale '203 today' script literal corrected. - hygiene: proof:owner-golden dischargedBy repointed to the delegated blessing post-⑪ per OWNER-ASKS row 4 ratification. Gates: proof:retirement-ledger PASS, proof:ci-coverage PASS, proof:board-live PASS, proof:wave-charter PASS; proof:roster-ceiling reds only on the declared count-ceiling backlog.
…ansferred) - FINAL.md: the verdict-item→cure map (all 28 items × landed wave × gate/witness; 22 LANDED / 3 ⑪-INFLIGHT / EXTERNAL-BLOCKED residue named), the OD register final state (7 RULED), the backlog + external-blocked residue with live discharge owners (10 rows reconciled post-⑪), the version RECOMMENDATION (5.2.0 MINOR — additive plainVars, nothing breaking removed; the bundled value.js-^3.1.0-major caveat weighed), the deploy-of-record path (T.S6 workflow_run on green demo-correctness, owner-gated), and the T.Z close checklist. Marked DRAFT — close NOT fired. - PROMPT-RECAP §4: the S.Z3 (FINAL+version) row cross-linked to the landed FINAL.md draft. Gates: proof:prompt-recap-t PASS, proof:board-live PASS, proof:wave-charter PASS.
…ringProgress); gap capture (§FORWARDING 6a-6e); verdict adoption record; drawerDetentInset ADOPT posture
…LERY graft, production-grade on the ⑩ tree): the specimen drawer (33 tiles, ONE shared registerDotPainter clock, IO-gated transforms-only, PRM rest-at-terminus) replaces the singular hero (EasingHeroStage/ghost/smear DELETED, S5 surface dead); instrument/easing/ (1,082L) DELETED — glass-ui EasingPicker is the Curve facet body + the TimingFunctionPanel detail body (the OD-5 R2 surface), the Controls easing row on the standard grouped Select (the tiny hand-plotted trigger curve dies); seed-echo guards keep vendor emit-only modelValue honest
…item-7a): easing opens on its Curve facet, spring on Physics — SCENE_DEFAULT_CONTROL/defaultControlSurfaceFor in the DFA seam, consumed at store bucket creation (a stored user pick still wins); SURFACE_META facet labels name the FACET (Curve/Physics — the #17 cross-axis dedup by construction); the cardinality fixture re-armed (label-equality clause proven synthetically + the renamed-facet non-redundancy pinned)
…rawer; ratchet dead-export 28→26 (useSheetState retired) proof:stage-visible re-derives the peek-rest (--glass-drawer-t≈0.12, stage ≥65% visible) + the expanded-detent reserve (snap-cap: subject 0.48 → sheet.top ≈ 52dvh, editor 0.62 → 26dvh strip) via a real grab-handle drag; the menubar overlap the snap ladder cannot cure is the forwarded BG-11 gap, not a clause. openControlsPanel is now layout-agnostic (mobile Drawer via the store open-fact + .glass-drawer marker). no-dead-export drops the two useSheetState DEFERRED rows.
… geometry; subject expanded detent 0.48→0.40 (≈49dvh unoccluded stage floor) The gate re-derives to the on-screen sheet rect (the 100vh Drawer box is translated off-screen); clause (d) asserts the VISIBLE height ≤ 70dvh (subject 0.40 / editor 0.62 snap-caps); clause (b) no-shift drags the glass handle; the host stays fixed (portaled Drawer never shifts the grid). Subject detent lowered to 0.40 so the unoccluded stage clears the 0.45 floor above the top-dock band.
…andle drag + --glass-drawer-t rest); M2 latch now rides paneScrollable directly
…ED (the OD-7 OWNER oracle — token cited; ≥30 tiles, analytic fn(φ)·maxX, transform-only 2s trace, header promotion, coherent freeze; roster+authority OWNER row); proof:easing-editor-live REWRITTEN v2 over EasingPicker (the square-honest precedent); NINE keys retired with witnesses — 7 FROZEN surface-locks DISCHARGED by migration, easing-curve-editor KILLed w/ re-run witness, demo-control-point ledgered (successor v2 clause b); the 2 T_BORNRED_BACKLOG rows discharged same commit + ci-coverage EXCLUDED trimmed; live-session B4 + scene-parity c7 + drag-gesture + fsm/dfa/mobile/suffusion/census/cartoon/glass/card + irrefragable + stage-within-docks + perf-frame-budget re-armed to the picker + the item-7a Curve/Physics triggers; roster 236→228
…Drawer's z-modal 140 > dock 40 + bottom:0 covers/steals the menubar — structural inversion) The glass-ui <Drawer> is z-index:var(--z-modal)=140, STRICTLY above the dock z-40, and position:fixed;bottom:0 — so the peek/expanded sheet covers the bottom menubar band and steals its pointer events, inverting dock-zorder's stage<sheet<dock contract (clauses 1/2/3). Registered in gate-bands.mjs T_BORNRED_BACKLOG (dischargedBy the glass-ui BG-11 --drawer-inset-block-end publish + re-pin), removed from the blocking proof:hygiene-chain, added to proof:ci-coverage EXCLUDED. Markers re-pointed to .glass-drawer so it reds HONESTLY on the real inversion. Also re-pointed proof:live-session S2(b) PRM mobile clause to the Drawer. ci-coverage GREEN (12 backlog gates validated).
…roof:drawer-spring (c); the hard control-dots PRM assertion stays
…e Drawer; delegate CH-3 + M4 menubar-occlusion/play-reachability to the proof:dock-zorder BG-11 backlog The M1 touch battery (open/scroll/close/reopen/latch) rides the glass handle drag + --glass-drawer-t; CH-3 (sheet.bottom ≤ menubar.top) and M4 (play button behind the bottom menubar) are the SAME BG-11 menubar-coverage break the backlogged proof:dock-zorder owns — delegated as notes (the hard assertion lives in the backlog gate; play liveness covered by proof:live-session B1). Green.
…browser: suffusion (d) re-cut to the specimen portraits (33 non-empty, per-curve distinct — the drag actuation now lives in easing-editor-live v2(b); stale hero-era summary strings scrubbed here + live-session B4's), control-surface-single-writer + dfa-derived asserting the item-7a scene-aware labels (easing→Curve, spring→Physics), font-census monoCeiling re-derived 70→90 (the 33 tile identifiers are data-register=code, 43 live mobile / 81 desktop + slack) + the EasingPicker vendor mono-caption voice admitted to the T.D4 contract
…RE-DERIVED from the landed OD-7 gallery (7 sanctioned specimen-drawer elements; hero/ghost-smear/readout/view-select join #13/#15 as forbidden; FILLED + owner-sanctioned, T.M2 satisfied) + INDEX repointed; the T_BORNRED_BACKLOG stage-inventory reason notes the easing redesign LANDED; demo/CLAUDE.md easing rows re-cut (gallery+EasingPicker in, instrument/easing/ tree row -> deletion note, scene-table row honest) — claude-paths-live GREEN (the EasingSidebar @-section phantom avoided); verdicts/T.B-panel.md R2 section captured (before: the truncating hand-plotted top-left cluster; after: the vendor EasingPicker with complete literals; witnesses cited) — R2 DISCHARGED
…3 files / 1052 vitest-list tests at the easing terminal: trace-smear suite died with the hero, the DFA fixture grew item-7a)
…g: live-session-mobile's dark-accent probe re-pointed off the dead .readout-accent (died with the hero) to the SELECTED specimen tile's accent name + the tile ball (both wear --ball-tone; contrast 8.19 ≥ 3, re-run green); BG-12 (ToggleGroup strip posture — the centered-overflow strands the first family filter past the scroll origin; the owned max-content .family-row is the recorded kf band-aid) APPENDED to the BG letter §0 + the dedup table (EasingTarget's citation was dangling — the §FORWARDING directive honored); tripwire/aria-ask/workaround-deletion/wave-charter re-run green/pending-by-design
# Conflicts: # scripts/gate-bands.mjs
# Conflicts: # package.json # scripts/proof-ci-coverage.mjs
…ocks stay out; dock-zorder rides its BG-11 backlog)
…e (OD-7 executed), the cluster dead into EasingPicker (R2 discharged), the Drawer ADOPTED per the owner override (z-inversion found + forwarded), close-prep in; ratchets 99/clean
…Value), EasingTarget template/CSS split (the house idiom — 311+193), the SheetGrabHandle phantom doc row cleaned, transition-perf's round-trip re-armed to the ratified scene-aware default set
…ive Hamming 0) + visual-lock RETIRED via migration→owner-golden (script/baselines/mask deleted, every anchor re-cut, taxonomy row retired); the final-roster statics adjudicated; backlog=8 all external/convergence
…ng regression fixed), fromMorphSVG renders at rest, value.js ^3.1.0; FINAL.md reconciled to 25 LANDED + the blessing
…le+computed-real-dom = contention/timing, isolated PASS; modern-web CSS4 anchor re-pointed to the split sibling .css — the clause-4 one-unit rule). Failing ⊆ backlog EXACTLY — the tranche certifies
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.
The verdict tranche: born-OWNER gate mechanism, stage restoration, SceneFacility, dock/look recut, the prune, THE GRAND COLOCATION EDICT, ground-up perf, glass-ui constellation, S-residue close.
Charter: docs/tranches/T/T.md · Board: docs/tranches/T/PROGRESS.md · Register: docs/tranches/T/OWNER-DECISIONS.md (OD-1..6 ruled; OD-7 pending-owner).
Draft = the CI carrier for the drive (the S pattern). Merges to master at close (T.Z).