Skip to content

Tranche T — THE OWNER'S BAR (impl drive)#5

Draft
mkbabb wants to merge 340 commits into
masterfrom
tranche-t-impl
Draft

Tranche T — THE OWNER'S BAR (impl drive)#5
mkbabb wants to merge 340 commits into
masterfrom
tranche-t-impl

Conversation

@mkbabb

@mkbabb mkbabb commented Jul 5, 2026

Copy link
Copy Markdown
Owner

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).

mkbabb added 30 commits July 3, 2026 22:28
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
#	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).
mkbabb added 30 commits July 6, 2026 20:06
# 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:
#	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
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.

1 participant