24605 Commits

Author SHA1 Message Date
alonso.torres
6754c883ab 🐛 Restore merged imports and multipart test setup
Keep the string helper required by the variant rename predicate after
removing the old swap-slot helpers. Sort the merged test imports.

Send import-audit fixtures through the existing multipart RPC helper so
they exercise auditing through the required upload path. Start the edit
watcher in the isolated component test so it forwards recorded transitions.

AI-assisted-by: GPT-6
2026-10-28 16:09:55 +01:00
alonso.torres
09fb1abf09 ✨ Exercise layout container edits in component histories
Generate flex direction, wrapping, justification, content alignment, gap
mode and padding mode edits against settled multi-child layouts. Track
their authored groups and replay histories through real layout events.

Settle raw layout property changes after copy sync in the pure runner and
keep derived writes in the user's undo group. Normalize absent and nil
typography references in the independent text model.

Make frontend undo checks account for capped history and grouped layout
entries. Verify segments before eviction and keep missing-undo controls.

AI-assisted-by: GPT-6
2026-10-28 15:53:11 +01:00
alonso.torres
4a40c10962 🐛 Keep single-child flex spacing finite
Compute a space-between gap only when a line has at least two children.
A one-child line keeps its configured gap instead of dividing by zero.

Cover both row and column directions, including reversed layouts, finite
spacing fields and unchanged two-child distribution.

AI-assisted-by: GPT-6
2026-10-28 15:53:11 +01:00
alonso.torres
ceb24fbf6d 🐛 Keep flex deletion and reflow in one undo group
Use the deletion's undo group for its delayed layout update, reusing an
enclosing transaction when present. Store that group on the primary
changes so deleting a child and moving its siblings undo together.

Add real-event regressions for standalone deletion, an explicit group and
an outer transaction. Verify exact snapshots after one undo and redo.

AI-assisted-by: GPT-6
2026-10-28 15:53:11 +01:00
alonso.torres
9483d9f737 ✨ Generate shadow, blur and corner edits
Add drop/inner shadows, layer and background blur, and the three remaining
corner radii to generated style edits. Preserve the existing input order
and describe their authored groups independently of production metadata.

Check distinct inputs, main propagation, preserved overrides, corrupt
values and lost touched groups. Run component update, reset, detach and
exact undo/redo histories in common and the async frontend.

The input test fails six assertions before the addition. Focused common
checks pass 4 tests / 90 assertions; the six frontend histories pass
204 assertions. Full common JVM/JS, frontend, backend and exporter suites
and lint/format checks pass, including six 40-program properties at seed
712. F227's parity correction is covered separately. Golden data and
production behavior are unchanged.

Wider attribute/layout and source-copy generation, pending-work coverage
and the five fresh 5,000-program gates remain open.

AI-assisted-by: GPT-6
2026-10-28 15:53:11 +01:00
alonso.torres
c79b09af24 🐛 Compare layout source placement in backend test parity
A hidden copy follows its visible main child's layout-derived position.
Only the frontend runs real reflow, so comparing that copy's raw position
with the pure runner reported a false mismatch (F227).

Compare untouched images against expected source placement for backend
parity. Keep strict same-run comparisons and the numeric tolerances.
Independent controls still reject image drift and authored geometry edits.
The source/image translation control fails before the correction.

Reduce the generated history from 41 operations to five and replay it in
common and the async frontend, including exact undo and redo.

Validation: 30 focused tests / 177 assertions; full common JVM/JS,
frontend, backend and exporter suites; lint and formatting. All six
generated properties pass 40 programs at seed 712. Golden data and
production behavior are unchanged.

AI-assisted-by: GPT-6
2026-10-28 15:53:11 +01:00
alonso.torres
5fb7f55c95 ✨ Test text updates across dependent libraries
Nest the source text component in the dependent main before making
consumer copies. Capture fixture identities before edits, and cover
letters plus all twelve style units at both acceptance boundaries.

Check early acceptance of a stale dependent, direct copies that stay
stale, and each editor's own undo history. Corrupt-result controls reject
premature reference advancement and missing or premature propagation.
Require meaningful text changes in direct and transitive source loops.

The async frontend matrix drives both acceptance events and forwards
the dependent editor's actual changes to the separate consumer editor.
Its 13 histories pass 429 assertions, including exact undo and redo.

Validation: full common JVM/JS, frontend, backend and exporter suites;
all six generated properties at 40 programs, seed 712; lint/format and
a browser ShapeProxy replay. Golden data is unchanged. Wider generation
and pending-work coverage, plus fresh 5,000-program gates, remain open.

AI-assisted-by: GPT-6
2026-10-28 15:53:11 +01:00
alonso.torres
e4fb356cb5 🐛 Replace stale font identities in text test edits
Clear raw font identity fields owned by a requested family, weight or
italic edit. Preserve the other font unit and retain opaque identities
when changing an unrelated style such as size (F226).

Four assertions fail before the correction. Focused notation, source,
text sync/switch and golden checks pass 51 tests and 1,887 assertions.
Full common JVM/JS, frontend, backend and exporter suites and applicable
lint/format checks pass. All six generated properties pass 40 programs
at seed 712. Golden data and production behavior are unchanged.

AI-assisted-by: GPT-6
2026-10-28 15:53:11 +01:00
alonso.torres
e4239e02b7 🐛 Replace conflicting fill inputs in text test edits
Make named colors and explicit fills replace each other in the text
notation. Raw nil, empty or nonstandard fills previously masked a new
named color, making generated source color edits no-ops (F225).

The notation regressions fail seven of eight assertions before the fix.
Validation: notation/text suites, transitive source and frontend controls,
full common JVM/JS, frontend and consumers, plus lint and formatting.
Golden data and production behavior are unchanged.

AI-assisted-by: GPT-6
2026-10-28 15:53:11 +01:00
alonso.torres
ca97bae421 🐛 Take nested swap constraints from their position source
Settle a nested swap's untouched constraint group from the replaced
position, including fixed-scroll. Carry compatible switch overrides first
so an inherited position cannot discard an authored constraint override.

Cover F224's reduced history in common and the async frontend, both
constraint axes, absent position fields, compatible carry and exact undo.
The complete original history and browser ShapeProxy replay also pass.

Validation: focused swap/variant/golden tests (123 tests, 1,764 assertions),
full common JVM/JS, frontend, backend and exporter suites; lint and format.
Golden data is unchanged.

Benchmark ratios against the unchanged baseline, with no regression flags:
mains 10/100/1,000: 0.53/0.58/0.63; three levels: 0.56; chain: 0.55;
library: 0.56; many shapes: 0.48; variant switch: 0.65.
The baseline uses another machine/JVM, so ratios are rough comparisons.

AI-assisted-by: GPT-6
2026-10-28 15:53:11 +01:00
alonso.torres
11d7a630dc 🐛 Restore migration and test compatibility after rebase
Keep the container root helper used by the main-instance name migration.
Adapt imported-file ids and component swap tests to the current APIs, and
check copied swaps through their position refs and swap groups.

AI-assisted-by: gpt-6
2026-10-28 15:53:11 +01:00
alonso.torres
2e542dc8cf 🐛 Keep pending library edits out of transform settlement
Use the component sync result only as a geometry proposal when settling
reflections and swapped placement. Correct existing shapes without pulling
pending library content, styles or structure into a transformed copy.
Keep path geometry and the primary action's exact undo/redo group.

Generate source transforms, letters and all twelve text style units with
separate source histories and explicit consumer acceptance. Add dropped
source-edit controls and portable/frontend regressions for the accidental
pull. Register the new portable namespace in the JavaScript runner.
The complete original program and both reductions pass unchanged.

Common JVM passes 1,919 tests/31,313 assertions. Full JS passes
1,845/29,770; the newly registered source namespace adds 5/135 passing
checks. Frontend passes 1,566/11,119, backend 1,610/8,104 and exporter
14/32. Lint and formatting pass; browser ShapeProxy replay passes.
No golden data changes.

Benchmark ratios against the unchanged baseline: mains 10/100/1000
0.57/0.65/0.61, levels 0.52, chain 0.51, library 0.52, many shapes 0.47,
variant switch 0.60. No regression flag.

AI-assisted-by: gpt-6
2026-10-28 15:53:11 +01:00
alonso.torres
188dac5ad3 🐛 Skip numerically equal component sync writes
Compare integer and floating forms exactly for scalar values, points and
selection rectangles. A library update that only changes their numeric
representation must not create changes or an undo entry. Preserve every
nonzero difference, including real subpixel moves.

Add the reduced resize/library-sync regression and a subpixel control,
plus async frontend undo/redo replay. Review and update eight golden
states in case N: only equal integer/float representations changed.
The recreated seed-712 audit leaves all 61 syncs and undo depths unchanged.

Common JVM 1,914 tests/31,146 assertions and JS 1,845/29,810 pass.
Frontend 1,563/10,880, its added replay, backend 1,610/8,104 and exporter
14/32 pass. Lint and formatting pass. Exporter needs its test-only secret.

Benchmark ratios against the unchanged baseline: mains 10/100/1000
0.54/0.61/0.61, levels 0.53, chain 0.55, library 0.55, many shapes 0.62,
variant switch 0.65. No regression flag.

AI-assisted-by: gpt-6
2026-10-28 15:53:10 +01:00
alonso.torres
a62a15206d 🐛 Keep delayed copy measurements with their undo group
Route non-stacked derived commits to their applied group when a later
edit or transaction intervenes. Copy remeasurement must undo with the
font action rather than becoming a separate step after an unrelated edit.
Keep adjacent non-stacked entries and exclude the redo tail from routing.

Extend the font-boundary regression to component mains and copies, and
cover both stacking modes during a later transaction. The regression
fails before the fix; all 1,563 frontend tests and 10,880 assertions pass.
Live WASM history passes exact undo/redo and full-sync consistency.

The sync core is unchanged by this undo fix. Its preceding benchmark
ratios remain 0.48-0.76 of the unchanged baseline, with no regression flag.

AI-assisted-by: gpt-6
2026-10-28 15:53:10 +01:00
alonso.torres
92228bd55c 🐛 Keep delayed font resizes in their undo group
Stack a delayed derived change into its applied undo group when that
group exists, instead of an unrelated later entry or transaction.
Preserve an older entry's selection and exclude the redo tail.

The delayed-font regression fails before the fix and passes afterward.
Async transaction controls pass 18 assertions; the completion suite
passes 17 tests / 646 assertions. Full frontend passes 1,563 tests /
10,860 assertions, including unchanged goldens. Lint and formatting pass.
A standalone-text WASM history passes 9 checks, with exact undo/redo,
full-sync consistency, the original page restored and no pending work.

Benchmark ratios against the unchanged Phase 1e baseline:
main 10/100/1,000 copies 0.62/0.59/0.62; three levels 0.68;
dependency chain 0.54; library update 0.54; many shapes 0.48;
variant switch 0.76. All worlds pass without regression flags.

The separate late copy-measurement path remains tracked as F222.

AI-assisted-by: gpt-6
2026-10-28 15:53:10 +01:00
alonso.torres
00b743da0b 🐛 Compare measured text at its oriented corner
Keep auto-width and auto-height text positions in design comparison by
using the first oriented corner. Measurement can change unrotated x/y
while retaining that corner. Requested geometry also checks this anchor.

The new matrix failed 29 of 88 assertions before the correction. Controls
cover four rotations, reflection, one-pixel drift, fixed width and raw
undo state without changing the geometry tolerance. The older matrix
fixture now anchors both measured versions at the oriented corner;
its assertions remain unchanged.

Combined generator/oracle checks pass 139 tests / 899 assertions with
40 programs per property at seed 712. Original auto-height WASM replay
passes 51 checks with exact undo/redo and full-sync consistency. The
original page and normal focus are restored; no pending work remains.

No production geometry, golden data or benchmark baseline changes.

AI-assisted-by: gpt-6
2026-10-28 15:53:10 +01:00
alonso.torres
7e2f8b8781 🐛 Predict typography ownership across variant switches
Correct the independent switch model when only some typography styles
carry into the new variant. Mixed ownership drops the reference, while
fully carried styles retain it. Predict this from the two mains and
prior authored groups, including when the result is corrupt.

F221's regression and ownership controls failed before the correction;
they pass 2 tests / 6 assertions afterward. The original program and
shrink pass. Async frontend replay passes 19 assertions with undo/redo.
Common/frontend lint passes; changed files were formatted.

No production behavior, golden data or benchmark baseline changes.
Fresh 5,000-program gates remain required.

AI-assisted-by: gpt-6
2026-10-28 15:53:10 +01:00
alonso.torres
b4271059df 🚧 Save component stabilization follow-up
Expand generated component coverage with independent library histories,
meaningful mutation counts, varied geometry and variants, all text style
units, oracle corruption controls and pending-sync frontend replays.

Fix reflected descendants, partial size carry, WASM shape defaults,
deferred swap and sidebar text undo, grid visibility, explicit typography
ownership, metadata filtering and swapped placement through sync/detach.

Recorded validation after F219:
- Common JVM: 1,909 tests / 31,088 assertions; JS: 1,840 / 29,688.
- Frontend: 1,560 tests / 10,821 assertions.
- Backend: 1,610 tests / 8,104 assertions; exporter: 14 / 32.
- Applicable lint and formatting pass; golden data stays unchanged.

Benchmark ratios against the unchanged Phase 1e baseline:
- Main edits into 10/100/1,000 copies: 0.52/0.57/0.58.
- Three levels: 0.51; dependency chain: 0.52; library update: 0.58.
- Many shapes: 0.42; variant switch: 0.62. No regression flags.

This is a checkpoint. The fresh legacy-library gate at seed 712 fails
at program 351 (F221); its cause remains unclassified. The other four
large gates did not run. F220, F187, F214 and wider coverage remain open.

AI-assisted-by: gpt-6
2026-10-28 15:53:10 +01:00
alonso.torres
80b3cbfa7a ✨ Generate component programs across library files
Build a shared library world and route edits, updates and settlement across
working and library files. Check the independent override model, geometry,
propagation and exact undo for both files. Replay shrunk library failures
through the async frontend with the same target choices and barriers.

Keep common generation/shrinking and CLJS replay as the main regression
suite. Use the plugin for public API, WASM and measured-text smoke checks;
retain its existing fixed cases until equivalent coverage replaces them.

All four properties pass 5000 programs each with seed712, each in a full
run. Fresh swaps: 5009 assertions; library: 5008. Isolated Stage3: 55/379.
Live WASM, fonts, undo/redo and later propagation checks pass.
Full frontend: 1539 tests, 9312 assertions, including 39 generated replays.
Common JVM: 1851 tests, 30684 assertions; JS: 1782 tests, 29308 assertions.
Backend: 1610 tests, 8104 assertions; exporter: 14 tests, 32 assertions.
Plugin: 68 cases. Lint, formatting and unchanged goldens pass.

AI-assisted-by: GPT-6
2026-10-28 15:53:10 +01:00
alonso.torres
3f948c72db ✨ Generate component swaps and variant switches
Generate swaps and variant switches across three component levels. Track
carried groups independently by main names, ancestor kinds and ordinal;
retain authored swapped subtrees and predict orientation from old values.
Replay shrunk failures through the async frontend with target and undo
checks after every step. Follow authored swaps to their content main,
without taking overrides from the position they replaced or the result.

All four properties pass 5000 programs each, seed712. The fresh swap run
passes 5009 assertions; library passes 5008. MVP and structure runs remain
valid because later changes only affect swaps and variant content.
Isolated stage check: 55 tests, 379 assertions. Full frontend: 1539 tests,
9312 assertions; full common JVM and registered JavaScript suites pass.

AI-assisted-by: GPT-6
2026-10-28 15:53:10 +01:00
alonso.torres
2099084f0b 🐛 Settle swapped placement when updating a turned main
Updating a rotated copy also turns its main. A swapped descendant whose
content and position sizes differ needs its placement settled in that new
frame. Append the main-file placement changes to the inverse sync, keeping
source-copy changes local and restoring both files in one undo group.

Portable local/library regressions at 45 and 90 degrees fail eight
assertions before the fix and pass all 20 after it. The original seed712
case4855 and its exact shrink pass, as does the 4855..5000 tail diagnostic.
The diagnostic does not replace the full 5000-program swap gate.

Common JVM1851/30684 and JS1782/29308, frontend1539/9312,
backend1610/8104, exporter14/32 and all 68 plugin cases pass.
Focused suites and unchanged goldens pass; lint and formatting pass.
Live WASM at 45/90 degrees keeps placement stable through undo/redo and a
later main edit. Maximum anchor error is below 0.00001px.

Benchmark ratios against the recorded baseline:
main 10/100/1000: 0.49/0.56/0.54; three levels: 0.49;
chain: 0.49; library: 0.50; many shapes: 0.45; switch: 0.58.

AI-assisted-by: GPT-6
2026-10-28 15:53:09 +01:00
alonso.torres
a568b1d6cf 🐛 Place reset replacement children in the main frame
Reset clears the parent's geometry override, but replacing a swapped
child cloned its new children through the parent's old rotation. Drop
that override from the whole sync context so existing and new children
use the main's orientation in the same undo group.

F185: portable checks at 45 and 90 degrees fail six assertions before the
fix and pass all fourteen after it. Original and shrunk programs pass.
The focused suite passes 139 tests / 2590 assertions with unchanged goldens.
Live WASM checks reset placement, exact undo/redo, later sync and no
phantom overrides at both angles. Frontend passes 1538 tests / 9253
assertions; plugin 68 cases, lint/format and isolated Stage 3 checks pass.
Common JVM/JS, backend and exporter suites pass.

Phase 1e benchmark ratios: mains 10/100/1000 .50/.55/.57, levels .50,
chain .50, library .52, many shapes .42, variant switch .60.

AI-assisted-by: GPT-6
2026-10-28 15:53:09 +01:00
alonso.torres
c79b97c34f 🐛 Sync restored components after variant name changes
Restoring a variant whose container has gone converts its variant value
into its main name. Report the restored component id to the normal sync
cascade: its main is absent from the old page objects, so ordinary shape
change detection misses it. Copies receive the new name in the restore's
undo group, while authored name overrides remain intact.

F183: the portable regression fails one assertion before the fix and
passes all six after it. Original and shrunk programs pass. The focused
suite passes 138 tests / 2576 assertions with unchanged goldens. Live
WASM checks direct, nested and indirect copies, custom names and undo/redo.
Frontend passes 1536 tests / 9179 assertions; plugin 68 cases, lint and
formatting pass. The isolated Stage 3 check passes 53 tests / 373 assertions.
Common JVM/JS, backend and exporter suites pass.

Phase 1e benchmark ratios: mains 10/100/1000 .50/.56/.57, levels .51,
chain .51, library .52, many shapes .50, variant switch .62.

AI-assisted-by: GPT-6
2026-10-28 15:53:09 +01:00
alonso.torres
8b40e6059c 🐛 Settle swapped placement when a parent turns
A swapped head can inherit a position frame with a different size from
its content. Turning its parent then leaves the head and child away from
the placement that full sync computes. Settle that derived placement in
the primary transform builder for SVG, WASM and shared test operations.
Preserve authored geometry and keep the correction in the same undo group.

F182: portable regression fails four assertions before the fix and passes
all twelve after it. The original and shrunk library programs pass. The
focused suite passes 137 tests / 2570 assertions with unchanged goldens.
Frontend passes 1535 tests / 9141 assertions; lint and formatting pass.
Live WASM checks at 45 and 90 degrees pass undo, redo and later sync.
Common JVM/JS, backend, exporter and all 68 plugin cases pass.

Phase 1e benchmark ratios: mains 10/100/1000 .49/.57/.61, levels .52,
chain .55, library .58, many shapes .59, variant switch .67.

AI-assisted-by: GPT-6
2026-10-28 15:53:09 +01:00
alonso.torres
768b12d68f 🐛 Refuse duplicates that expand component nesting loops
A finite repeated component tree can cut recursion with a swapped child.
Duplicating another child in its main opens an unblocked branch that sync
keeps expanding. Check component nesting against the actual destination
before generating duplicate changes, and keep safe shapes in mixed batches.
ALT duplication at the page root remains allowed.

Use the same eligibility in workspace duplication, pure nodes and generated
candidates. The portable regression fails three assertions before the fix
and passes all five afterward. The original library seed 712 case 1601
and its reduced switch/nest/duplicate program pass. Focused regression and
golden checks pass 123 tests, 2492 assertions; goldens are unchanged.
Live WASM verifies refusal, ALT duplication, undo/redo and later stable sync.

Component benchmark ratios: mains 0.47/0.55/0.55; levels 0.51;
chain 0.53; library 0.58; many shapes 0.52; variant switch 0.74.
All worlds pass the unchanged baseline gate.

AI-assisted-by: GPT-6
2026-10-28 15:53:09 +01:00
alonso.torres
e0188af747 🐛 Carry variant overrides through deleted near mains
Copies still use stored main data after its component is deleted. Follow
that data both when collecting inherited groups and when matching variant
children, so a switch keeps inherited size, orientation and child fills.

Portable live/deleted controls fail four assertions before the fix and
pass all 16 afterward, including repeat sync and exact undo. Library
seed 712 case 1462 and its 12-step shrink both pass. Focused regression
and golden checks pass 148 tests, 2593 assertions; goldens are unchanged.
Live WASM verifies height 80, rotation 45, child fill, groups, undo/redo
and later main opacity propagation.

Component benchmark ratios: mains 0.51/0.58/0.56; levels 0.50;
chain 0.51; library 0.59; many shapes 0.48; variant switch 0.71.
All worlds pass the unchanged baseline gate.

AI-assisted-by: GPT-6
2026-10-28 15:53:09 +01:00
alonso.torres
cfb800620c 🐛 Carry child geometry through parent rotations received by sync
When sync turns a parent, turn its subtree as derived placement before
walking the children. Geometry overrides keep their size and relative
angle, including swapped children. Read current builder objects throughout
the walk so later syncs do not transform stale records again.

Normalize matrix axis directions for this turn: constraints already handle
resize, and minimum-size matrix scale must not resize children twice.

Portable regression fails for ordinary and swapped geometry overrides.
Expanded controls cover parent turns of 45/135 degrees and authored child
angles of 0/10 degrees, points, flags, retained size, repeat sync and undo.
Broad focused/golden checks: 204 tests, 2314 assertions. Latest controls
and shrunk program: 2 tests, 89 assertions. Goldens remain unchanged.
Initialize the container when direct sync receives an empty builder.
Register the geometry namespace in the JavaScript runner and read record
fields with get in the older flip control. Geometry: 9 tests, 149
assertions on both runtimes. Full common JS: 1768 tests, 29215 assertions.
Full frontend: 1532 tests, 9039 assertions. Lint and formatting pass.
Live WASM verifies both roles, retained placement and later style sync.

Component benchmark ratios: mains 0.51/0.56/0.64; levels 0.62;
chain 0.55; library 0.53; many shapes 0.45; variant switch 0.60.
All worlds pass the unchanged baseline gate.

AI-assisted-by: GPT-6
2026-10-28 15:53:09 +01:00
alonso.torres
2ea74b7ad1 🐛 Restore existing component nesting when undoing a move
Sync and swapped children can leave finite repeated component nesting.
Moving a copy out succeeds, but undo rejects its old position under the
normal component-loop guard. Record restore-component-nesting only on
inverses whose original position already repeats a component.

Normal forward moves retain that guard. The applier still rejects physical
object-tree cycles and changes to copy structure. The new optional change
field defaults to the current behavior and changes no stored shape data.

Portable regression: exact undo fails before the fix. Five assertions now
pass, including redo, normal loop refusal and object-cycle refusal using
the generated inverse. Focused JVM and golden checks: 195 tests, 2189
assertions. Both original shrunk programs pass. Live WASM undo/redo restores
complete snapshots. Common/frontend lint and formatting pass.

Component benchmark ratios: mains 0.57/0.62/0.67; levels 0.80;
chain 0.82; library 0.56; many shapes 0.55; variant switch 0.91.
All worlds pass the unchanged baseline gate.

AI-assisted-by: GPT-6
2026-10-28 15:53:09 +01:00
alonso.torres
60f063a775 🐛 Sync content from the restored position after a swap back
A swap back relinks to its near position and clears the swap marker.
Sync through the enclosing copy that owns those refs so its content
overrides reach the restored head and children. Keep carried overrides
and unrelated sibling overrides intact.

Portable regression: three failures before the fix, then all assertions
pass, including exact undo. Focused JVM and golden checks: 183 tests,
2143 assertions. The original and newly shrunk library programs pass.
Live WASM verifies plain and variant swaps, later propagation, carried
opacity and an unrelated sibling override. Common/frontend lint and fmt pass.

Component benchmark ratios: mains 0.61/0.80/0.85; levels 0.71;
chain 0.73; library 0.52; many shapes 0.53; variant switch 0.62.
All worlds pass the unchanged baseline gate.

AI-assisted-by: GPT-6
2026-10-28 15:53:09 +01:00
alonso.torres
fbc0b7fd93 ✨ Extend generated component checks to structure and geometry
Cover text, layouts, nesting, duplication and transforms with independent
geometry and override predictions. Compare raw design geometry within a
pixel tolerance and keep exact undo snapshots. Add corrupt-state controls
and replay shrunk programs through the async frontend.

Route pure-runner changes by file so later library scenarios can share
ordered sync and inverse changes. Refresh every frontend file on replay.

Final-generator MVP and structure gates each pass 5000 scenarios, seed712.
Isolated stage check: 40 tests, 156 assertions. The full working-tree
frontend run passes 1528 tests and 8877 assertions.
Existing golden changes record reviewed fixes; raw undo stays strict.

AI-assisted-by: GPT-6
2026-10-28 15:53:09 +01:00
alonso.torres
9f42e20a15 🐛 Keep orientation inherited from the old variant on switch
A switch keeps the old root orientation even when its main supplied it.
Record that retained choice as geometry when it differs from the new
expected placement. Continue inheriting placement from enclosing copies
when the switch carries no root geometry override.

Portable regression: three failures before the fix; now passes through
full sync. Focused JVM checks: 182 tests, 2137 assertions. Existing goldens
match. Full frontend: 1528 tests, 8877 assertions. Live WASM passes.

Component benchmark ratios: mains 0.58/0.57/0.60; levels 0.49;
chain 0.50; library 0.60; many shapes 0.46; variant switch 0.65.
All worlds pass with task stress JVMs paused. An earlier run during
concurrent JVM startup exceeded the timing gate; the baseline is unchanged.

AI-assisted-by: GPT-6
2026-10-28 15:53:09 +01:00
alonso.torres
337b1230b6 🐛 Author pushed content against its new nested reference
When a pushed swap takes a position with the same component, preserve
content differences as overrides on the promoted head and descendants.
The source copy clears its overrides and follows the promoted subtree.

Portable regression: three failures before the fix; now passes, including
full sync and exact undo. Focused JVM suites: 121 tests, 638 assertions.

Component benchmark ratios: mains 0.61/0.78/0.69; levels 0.53;
chain 0.50; library 0.56; many shapes 0.75; variant switch 0.61.
All worlds pass the baseline performance gate.

AI-assisted-by: GPT-6
2026-10-28 15:53:09 +01:00
alonso.torres
c36d15db20 🐛 Compare pushed swaps against the updated parent frame
Use the parent's pushed geometry when deciding whether a promoted swap
needs an orientation override. Its original container still has the old
rotation, which can create a phantom geometry group during update-main
of a rotated parent (F172).

The portable regression fails its touched assertion before the fix. All
54 swap tests pass 214 assertions, the library-308 shrink passes, and the
pure golden master matches 1149 assertions without recording. Common and
frontend lint and format pass.

Benchmark ratios against Phase 1e: main 10/100/1000 copies 0.49/0.58/0.59,
three levels 0.54, chain 0.52, library 0.56, many shapes 0.48, variant
switch 0.63. No regression flags.

AI-assisted-by: GPT-6
2026-10-28 15:53:09 +01:00
alonso.torres
3002b6b9f5 🐛 Replay rotation nodes as relative turns in the frontend
Pass delta? to increase-rotation when interpreting a Rotate node. Common
turns by the node's angle; the event default instead sets an absolute
rotation, so a 45-degree turn followed by 90 degrees ended at 90 (F171).

The standalone async regression fails before the fix. The full frontend
suite passes 1524 tests and 8683 assertions, including generated replay,
undo checks and existing goldens without recording. Lint and format pass.

AI-assisted-by: GPT-6
2026-10-28 15:53:09 +01:00
alonso.torres
1e9d19b214 🐛 Compose child flip flags through parent placement
Keep the source and parent-frame flip composition when placing component
content through a rotated parent. A fresh large matrix turn can otherwise
set both child flip flags even though the user only rotated (F170).
Preserve nil/false representation when the parent does not flip an axis.

The portable regression fails two flag assertions before the fix. Eight
geometry tests pass 61 assertions, the original library shrink passes, and
the pure golden master matches all 1149 assertions without recording.
Common and frontend lint and format pass.

Benchmark ratios against Phase 1e: main 10/100/1000 copies 0.58/0.74/0.57,
three levels 0.49, chain 0.49, library 0.52, many shapes 0.47, variant
switch 0.61. No regression flags.

AI-assisted-by: GPT-6
2026-10-28 15:53:09 +01:00
alonso.torres
3e36275f96 🐛 Handle empty flex layouts when calculating line positions
Skip per-line stretch division and baseline placement when a flex layout
has no lines. Removing a component's final child then resizing a copy
could divide by zero on the JVM (F169).

The public layout regression fails four assertions before the fix. It
covers row and column layouts with six content alignments. Fresh flex,
swap and variant suites pass 125 tests and 596 assertions, and the shrunk
structure program passes. Pure goldens match all 1149 assertions.

AI-assisted-by: GPT-6
2026-10-28 15:53:09 +01:00
alonso.torres
5ad0744d0e 🐛 Keep inherited orientation when pushing a swapped child
When update-main turns a swap into a plain nested copy, retain its
orientation as a geometry override if it differs from its own component's
expected parent placement. Otherwise a later full sync discards the
rotation inherited from the replaced position (F168).

The portable regression fails three assertions before the fix. Both
0-degree and 45-degree cases now pass, including exact undo. Fresh swap,
variant and flex suites pass 125 tests and 596 assertions. The pure golden
master matches all 1149 assertions without recording.

Benchmark ratios against Phase 1e: main 10/100/1000 copies 0.52/0.62/0.56,
three levels 0.48, chain 0.56, library 0.51, many shapes 0.43, variant
switch 0.60. No regression flags.

AI-assisted-by: GPT-6
2026-10-28 15:53:09 +01:00
alonso.torres
357e8a7ff7 🐛 Stop inherited content overrides at swapped references
Walk content refs through intermediate swapped heads when collecting
inherited touched groups. Following the replaced position instead crosses
into another component and gives copies phantom geometry overrides (F165).
Position advancement keeps its separate position-ref walk.

A portable three-level regression fails both chain and touched assertions
before the fix. Swap-group, file and variant suites pass 124 tests and
588 assertions; the shrunk library seed-712 program passes as well.
Common lint and format pass.

Benchmark lower-quantile ratios against Phase 1e: main 10/100/1000 copies
0.48/0.55/0.57, three levels 0.48, chain 0.47, library 0.49, many shapes
0.46, variant switch 0.57. No regression flags.

AI-assisted-by: GPT-6
2026-10-28 15:53:09 +01:00
alonso.torres
a37fac788c 🐛 Run all registered common JavaScript test namespaces
Include the generated and oracle component tests, remote-sync regressions,
and schema-check tests in the execution list, as well as the requires.
Previously full JS runs silently skipped them and focused runs rejected
these namespaces as unknown (F166).

The focused generated command reproduces the registration failure before
the change. The registered full JS run passes 1733 tests and 29293
assertions with 100 scenarios per property, seed 712.

AI-assisted-by: GPT-6
2026-10-28 15:53:09 +01:00
alonso.torres
955650c618 🐛 Place children after carrying variant geometry overrides
A switch can retain the copy root's resized geometry while leaving its
untouched children in the old frame. After geometry carry, sync the new
subtree from the updated builder objects so constraints place its children
without adding overrides. Reuse the direct component sync entry point.

The portable rotated-root regression fails before the fix with a 30px
child offset. Swap and variant suites pass 108 tests / 539 assertions;
the pure golden master matches 1149 assertions unchanged. Full frontend:
1517 tests / 8436 assertions. Live ws1 WASM retains the resized root and
child placement, with no exception or pending reflow.

Benchmark ratios: main 10/100/1000 copies 0.48/0.56/0.57;
three levels 0.49; chain 0.48; library 0.50; many shapes 0.45;
variant switch 0.61. No slowdown flags.

AI-assisted-by: GPT-6
2026-10-28 15:53:09 +01:00
alonso.torres
8a2c2b7246 🐛 Preserve resize overrides across rotated variant switches
A clean target can acquire tiny size drift while taking the old copy's
rotation. Exact main-size comparisons then discard a valid resize.
Compare geometry with its float tolerance, including fixed layout sizes
and composite bounds; keep nongeometry values exact.

The portable rotation/resize regression fails both height and selrect
checks before the fix. Cover ordinary and fixed layout sizing, and
check child placement from the original library shrink separately.
The full variant suite passes on JVM and JS: 56 tests / 337 assertions.

Benchmark lower-quantile ratios against the Phase 1e baseline:
main 10/100/1000 copies 0.52/0.60/0.60; three levels 0.51;
chain 0.52; library 0.54; many shapes 0.46; variant switch 0.65.
No slowdown flags.

AI-assisted-by: GPT-6
2026-10-28 15:53:09 +01:00
alonso.torres
d9c2be1994 🐛 Restore sibling order when undoing component child removals
Bulk removal inverses move siblings back in original order. Component
sync records each removal's current index; inverse sync falls back to
the original main container when the builder lacks it (F158).

A six-permutation deletion test and a main-swap sync test fail before the
fix. Focused suites pass 70 tests and 242 assertions; two inverse-sync
regressions also pass. Common lint and format pass. The controlled
benchmark has no flags: mains 0.51/0.59/0.58; levels 0.54; chain 0.58;
library 0.55; many shapes 0.51; switch 0.63. The first measurement under
concurrent stress load flagged main-100 at 1.17 and was rerun in isolation.

AI-assisted-by: GPT-6
2026-10-28 15:53:09 +01:00
alonso.torres
c48afa9f35 🐛 Restore parent sync state when undoing child structure edits
Add, remove and move inverses restore the copy parent's remote-synced
flag with its touched groups. Swapping a child clears that flag during
delete; undo must restore the original parent state (F157).

Swap and add/remove regressions fail before the change. The focused swap
suite passes 49 tests and 191 assertions; common lint and format pass.
Benchmark ratios: mains 0.49/0.57/0.62; levels 0.53; chain 0.57; library
0.69; many shapes 0.62; switch 0.62, no regression flags.

AI-assisted-by: GPT-6
2026-10-28 15:53:09 +01:00
alonso.torres
bc4edefd81 🐛 Remove the empty override field after clearing a swap
When removing the last swap group, drop touched instead of retaining an
empty set. A main clone then uses the same representation as set-touched;
a later move and undo can restore its exact prior state (F156).

The unit and move regressions fail before the change. The swap suite and
original shrunk program pass 48 tests and 184 assertions. Common lint and
format pass. Benchmark ratios: mains 0.49/0.56/0.79; levels 0.66; chain
0.82; library 0.78; many shapes 0.92; switch 1.02, no regression flags.

AI-assisted-by: GPT-6
2026-10-28 15:53:09 +01:00
alonso.torres
980c71b645 🐛 Keep inherited placement untouched during a plain swap
Compare retained orientation with the position source in copy-parent
coordinates, including cached deleted mains. A rotation inherited from
that source does not author a geometry override (F154).

The focused regression fails before the change. Swap and variant suites
pass 100 tests and 510 assertions; common lint and format pass. Benchmark
ratios: mains 0.47/0.53/0.55; levels 0.51; chain 0.64; library 0.64;
many shapes 0.96; switch 0.68, with no regression flags.

AI-assisted-by: GPT-6
2026-10-28 15:53:09 +01:00
alonso.torres
d1e0f80265 🐛 Keep update-main and deferred text sync in one undo group
Use the same explicit group for inverse sync and every copy sync. Text
reflow can finish after the update transaction closes; one undo must still
restore the main, its copies and the source overrides together (F152).

The five-operation text regression fails before this change. All 12
frontend generated replays pass: 865 assertions. Common and frontend lint
and format pass. Shared benchmark ratios: mains 0.47/0.53/0.55; levels
0.51; chain 0.64; library 0.64; many shapes 0.96; switch 0.68, no flags.

AI-assisted-by: GPT-6
2026-10-28 15:53:09 +01:00
alonso.torres
00f5d621b0 🐛 Remove invalid swaps when a main detaches a nested head
A swapped copy must follow structural changes when its position ceases
to be a component head. Walk that shape normally during sync, remove
its component metadata and swap group, and replace its former component
children with the detached main shape's children.

The regression fails three assertions before the fix. The swap suite
passes 44 tests and 177 assertions, including exact undo. The shrunk
generated detach scenario also passes with its structural model update.

Benchmark vs Phase 1e: main 10/100/1000 0.50/0.57/0.64; levels 0.52;
chain 0.52; library 0.60; many shapes 0.55; switch 0.65. No flags.

AI-assisted-by: GPT-6
2026-10-28 15:53:08 +01:00
alonso.torres
44485aee91 🐛 Clear source overrides after pushing a swapped subtree
When update-main clones a swapped subtree into the main, the new main
owns its authored groups. Clear those groups from every source shape
when relinking it to the clone, instead of clearing only swap-group.

The regression fails on retained source flags before the fix. All five
assertions now pass, including retained geometry and opacity values,
new-main groups and exact undo. The swap suite passes 43 tests and 173
assertions.

Benchmark vs Phase 1e: main 10/100/1000 0.57/0.65/0.73; levels 0.59;
chain 0.59; library 0.61; many shapes 0.65; switch 0.68. No flags.

AI-assisted-by: GPT-6
2026-10-28 15:53:08 +01:00
alonso.torres
f01b260f74 🐛 Keep inherited root orientation through a variant switch
Use the root's effective touched groups after the reference-chain merge
when preserving its orientation. A near main may author the rotation
while the selected copy remains untouched. Checking only the selected
shape drops that inherited override during the switch.

The portable regression fails before the fix and passes four assertions
afterwards. Focused swap and generated checks pass 42 tests and 165
assertions.

Benchmark vs Phase 1e: main 10/100/1000 0.56/0.58/0.67; levels 0.61;
chain 0.57; library 0.53; many shapes 0.69; switch 0.70. No flags.

AI-assisted-by: GPT-6
2026-10-28 15:53:08 +01:00
alonso.torres
9f10e5e7c3 🐛 Keep authored root orientation as a switch override
A switch places the new root in the old orientation before carrying
attributes. When rotation is already equal, the carry step emits no
write and drops its geometry group. Preserve that group for retained
authored root orientation so later sync keeps the visible result.

Extend the rotation regression to check touched and later sync: two
assertions fail before the fix. Focused checks pass 43 tests and 166
assertions, including the two previously shrunk generated regressions.

Benchmark vs Phase 1e: main 10/100/1000 0.64/0.65/0.97; levels 0.49;
chain 0.59; library 0.58; many shapes 0.89; switch 0.60. No flags.

AI-assisted-by: GPT-6
2026-10-28 15:53:08 +01:00