Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 29 additions & 4 deletions .agents/deferred-items.json
Original file line number Diff line number Diff line change
Expand Up @@ -722,7 +722,7 @@
],
"symptom_if_broken": "A large decorative IMAGE (arrow, texture, badge) renders at content size or stacks as if it were a content photo, because nothing flags it decorative and the size heuristic only catches small icons.",
"closes_when": "Ingest captures z-order / role so a genuinely LARGE decorative IMAGE node (arrow, texture, badge) is flagged distinctly from a content photo (Phase 53.3d) and no longer renders/stacks as content. (The frame-wrap-width half — small wrapped decorations inflating to frame width — was closed by G11 item 2.)",
"notes": "Surfaced by audit-4 §RC-F7 / de-ranked findings; the heuristic is deliberately a stopgap, not the fix. F3 execution (2026-07-05) CONFIRMED the specific mammut (c10) mechanism: the MEN/WOMEN/EQUIPMENT red nav arrows are 28x28 IMAGE nodes wrapped in 268px mj-image frames, so layout_analyzer.py:1318 reports img.width=268 (== column) — F3's img.width-based rule (matcher/renderer scope) cannot shrink them because the width it reads is already wrong. User ratified deferring c10 to this entry; F3 fixed only the correctly-sized c9 icons (34/48px). The real fix is ingest-side (frame-wrap width + role capture). G11 item 2 (ad88ecf0) CLOSED the FRAME-WRAP-WIDTH half: a frame-wrapped IMAGE that is <=64px, strictly smaller than its wrapper, and whose wrapper bakes no own bg-fill/image-ref/effects now exports at CHILD width + CHILD target (export_node_id falls back to node_id). Corpus: c10 nav arrows 100%->28px, c8 64px icon un-ballooned 600->64, c7 icons 60->30, c9 icons 34->24. RED test + 4 controls (test_image_width_fidelity.py::TestFrameWrapDecorationWidth). A3 targets c7/c10 show scorer re-alignment jitter (see reference_a3_scorer_section_instability), non-targets c5/c6/c9 hold. The REMAINING open half is large-decorative-photo role/z-order capture at ingest — a genuinely large decorative image is still indistinguishable from a content photo."
"notes": "Surfaced by audit-4 §RC-F7 / de-ranked findings; the heuristic is deliberately a stopgap, not the fix. F3 execution (2026-07-05) CONFIRMED the specific mammut (c10) mechanism: the MEN/WOMEN/EQUIPMENT red nav arrows are 28x28 IMAGE nodes wrapped in 268px mj-image frames, so layout_analyzer.py:1318 reports img.width=268 (== column) — F3's img.width-based rule (matcher/renderer scope) cannot shrink them because the width it reads is already wrong. User ratified deferring c10 to this entry; F3 fixed only the correctly-sized c9 icons (34/48px). The real fix is ingest-side (frame-wrap width + role capture). G11 item 2 (ad88ecf0) CLOSED the FRAME-WRAP-WIDTH half: a frame-wrapped IMAGE that is <=64px, strictly smaller than its wrapper, and whose wrapper bakes no own bg-fill/image-ref/effects now exports at CHILD width + CHILD target (export_node_id falls back to node_id). Corpus: c10 nav arrows 100%->28px, c8 64px icon un-ballooned 600->64, c7 icons 60->30, c9 icons 34->24. RED test + 4 controls (test_image_width_fidelity.py::TestFrameWrapDecorationWidth). A3 targets c7/c10 show scorer re-alignment jitter (see reference_a3_scorer_section_instability), non-targets c5/c6/c9 hold. The REMAINING open half is large-decorative-photo role/z-order capture at ingest — a genuinely large decorative image is still indistinguishable from a content photo. PR #474 (CE-6) review F5, 2026-10-05: the live DB-cache serializer now keeps effects_summary, so on live data is_small_decoration's child-vs-frame export choice (layout_analyzer.py:1693-1701) and _icon_leaf's stop on a styled wrapper (layout_analyzer.py:1897-1901) see effects they did not see before. Corpus unaffected: effects_summary is null on every corpus node (observed by the PR #474 review)."
},
{
"id": "phase-53f-eyebrow-partial-padding-cell-theft",
Expand Down Expand Up @@ -1352,17 +1352,19 @@
"id": "ce-3-fixture-schema-lag-6-10",
"phase": "ce-3",
"title": "Cases 6-10 structure.json predate 4 dump-schema keys (effects_summary, line_height_relative, rotation, scale_mode)",
"status": "deferred",
"status": "closed",
"severity": "speculative",
"introduced": "2026-10-02",
"introduced_commit": "35d82942",
"closed_commit": "pending",
"summary": "CE-3 re-synced case 5 from its raw Figma snapshot and added a schema-freshness test over every committed structure. Cases 6-10 (extracted 2026-06-06) lack 4 keys the current dump writes (observed: round trip on every node), so they load defaults for those fields. Tolerated by name in _KNOWN_LAGGING_KEYS; re-syncing them is out of CE-3's scope and would move their baselines (image_ref and these fields).",
"code_refs": [
"app/design_sync/tests/test_converter_data_regression.py (_KNOWN_LAGGING_KEYS per case, TestFixtureFreshness)",
"scripts/resync-case-structure.py:34 (main)"
],
"symptom_if_broken": "A converter fix that reads line_height_relative, rotation, scale_mode or effects_summary cannot move cases 6-10.",
"closes_when": "Cases 6-10 are re-synced with scripts/resync-case-structure.py, their baselines audited and re-stamped, and _KNOWN_LAGGING_KEYS is emptied."
"closes_when": "Cases 6-10 are re-synced with scripts/resync-case-structure.py, their baselines audited and re-stamped, and _KNOWN_LAGGING_KEYS is emptied.",
"notes": "Closed by CE-6 (#424), 2026-10-05: cases 5-10 and reframe re-synced with scripts/resync-case-structure.py; every case now carries the 4 keys (TestFixtureFreshness green with _KNOWN_LAGGING_KEYS = {}), image_ref null -> hash restored on 11/23/10/13/17/16 nodes (6/7/8/9/10/reframe). Baseline audit: converter output byte-identical to expected.html for 5/6/7/9/10/reframe and byte-identical to the base-structure output for case 8 (known c8 whitespace churn vs expected.html), so no re-stamp was needed (observed)."
},
{
"id": "ce-9-peel-row-fixed-width-wrap",
Expand Down Expand Up @@ -1465,7 +1467,30 @@
"app/design_sync/figma/layout_analyzer.py:1955 (_walk_for_buttons 64 px cap)"
],
"symptom_if_broken": "A button icon drawn as a glyph on a filled shape larger than 64 px renders as the glyph alone.",
"closes_when": "_icon_leaf tells a styled wrapper that is an icon background (small child relative to a near-square wrapper) from a FILL-width layout wrapper, independent of the 64 px cap, with a test for the 72 px circle."
"closes_when": "_icon_leaf tells a styled wrapper that is an icon background (small child relative to a near-square wrapper) from a FILL-width layout wrapper, independent of the 64 px cap, with a test for the 72 px circle.",
"notes": "PR #474 (CE-6) review F5, 2026-10-05: the live DB-cache serializer now keeps effects_summary, so on live data is_small_decoration's child-vs-frame export choice (layout_analyzer.py:1693-1701) and _icon_leaf's stop on a styled wrapper (layout_analyzer.py:1897-1901) see effects they did not see before. Corpus unaffected: effects_summary is null on every corpus node (observed by the PR #474 review)."
},
{
"id": "ce-6-sizing-horizontal-dropped-at-document-bridge",
"phase": "ce-6",
"title": "sizing_horizontal is dropped at the EmailDesignDocument bridge, so CE-16 would read None on the production path",
"status": "deferred",
"severity": "known-bug",
"introduced": "2026-10-05",
"introduced_commit": "pending",
"summary": "PR #474 review F1. CE-6 sets sizing_horizontal on ColumnGroup and EmailSection, but production conversion goes through document.to_layout_description(), and DocumentColumn.from_column_group/to_column_group and DocumentSection.from_email_section rebuild both without it (read-confirmed). compute_column_width_fractions then reruns on the rebuilt groups. Keeping the field off DocumentSection was a CE-6 plan decision (GOTCHA :252), so this is a code-shape concession, not a CE-6 regression: nothing reads the field yet.",
"code_refs": [
"app/design_sync/email_design_document.py:936 (DocumentColumn.from_column_group)",
"app/design_sync/email_design_document.py:951 (DocumentColumn.to_column_group)",
"app/design_sync/email_design_document.py:1254 (compute_column_width_fractions on rebuilt groups)",
"app/design_sync/email_design_document.py:1279 (DocumentSection.from_email_section)",
"app/design_sync/figma/layout_analyzer.py:182 (ColumnGroup.sizing_horizontal)",
"app/design_sync/figma/layout_analyzer.py:289 (EmailSection.sizing_horizontal)",
"app/design_sync/converter_service.py:352 (document.to_layout_description)"
],
"symptom_if_broken": "A CE-16 change that feeds FIXED/FILL/HUG into compute_column_width_fractions passes a RED test written against _build_column_groups, but on the real converter path every group reads sizing_horizontal=None and column widths fall back to geometry without any error (same inert-bridge trap as RC-A/RC-B).",
"closes_when": "CE-16 or CE-26 carries sizing_horizontal across from_legacy -> to_layout_description (DocumentColumn and, if used, DocumentSection plus its cache canonical form), with a test that asserts the value on the to_layout_description output.",
"fix_sketch": "Add sizing_horizontal to DocumentColumn (from_column_group/to_column_group/to_dict/from_dict) when CE-16 starts reading it; decide the DocumentSection side together with the section-cache canonical form."
}
],
"tooling_followups": [
Expand Down
Loading
Loading