feat(IMP-11): D-2 — frame min_height_px hint (backend → UI)
Step 9 v4_all_judgments[] now exposes per-candidate min_height_px from catalog frame_contracts.visual_hints.min_height_px (None when contract unregistered). SlideCanvas pendingLayout zones render a red ring + 'min H Npx' badge when zone height falls below the active frame's threshold. Visual hint only; resize clamp (minSize=0.05) unchanged. 5 axes (single commit per Stage 5 plan): - u1 backend: src/phase_z2_pipeline.py — Step 9 builder adds min_height_px via single get_contract(c.template_id) lookup; reuses _contract for catalog_registered (no double-lookup). - u2 type: Front/client/src/types/designAgent.ts — FrameCandidate gains optional minHeightPx?: number. - u3 mapper: Front/client/src/services/designAgentApi.ts — maps snake-case min_height_px → camelCase minHeightPx on v4_all_judgments path; v4_candidates fallback remains undefined (graceful). - u4 active-frame lookup: Front/client/src/components/SlideCanvas.tsx — activeFrameId = overrideFrameId ?? defaultFrameId; activeCandidate via region.frame_candidates.find. - u5 hint render: Front/client/src/components/SlideCanvas.tsx — zoneHeightPx = height * SLIDE_H (logical px, no double-apply); compare against activeCandidate.minHeightPx in pendingLayout mode only; red border + badge when below. Tests: 5/5 pass in tests/test_phase_z2_step9_v4_all_judgments_min_height.py (source-string + catalog-shape guards + None propagation, registered and unregistered template_ids). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -3969,6 +3969,24 @@ def run_phase_z2_mvp1(
|
||||
"delegated_to": delegated,
|
||||
})
|
||||
|
||||
# IMP-11 D-2 (u1) — per-candidate min_height_px source = catalog
|
||||
# frame_contracts[template_id].visual_hints.min_height_px (logical 1280×720 px).
|
||||
# None when contract unregistered (frontend tolerates undefined).
|
||||
# Single get_contract lookup binds both catalog_registered and min_height_px.
|
||||
v4_all_judgments_list = []
|
||||
for c in v4_all_for_unit:
|
||||
_contract = get_contract(c.template_id)
|
||||
v4_all_judgments_list.append({
|
||||
"template_id": c.template_id,
|
||||
"frame_id": c.frame_id,
|
||||
"frame_number": c.frame_number,
|
||||
"v4_rank": c.v4_rank,
|
||||
"confidence": c.confidence,
|
||||
"label": c.label,
|
||||
"catalog_registered": _contract is not None,
|
||||
"min_height_px": (_contract or {}).get("visual_hints", {}).get("min_height_px"),
|
||||
})
|
||||
|
||||
application_plan_units.append({
|
||||
"unit_id": unit_id,
|
||||
"layout_preset": layout_preset,
|
||||
@@ -4004,18 +4022,8 @@ def run_phase_z2_mvp1(
|
||||
# v4_all_judgments 는 reject 포함.
|
||||
# catalog_registered = frame_contracts.yaml 에 contract 있는지 여부.
|
||||
# false 면 사용자가 override 시도해도 Step 7-A 가 skip (render path 미연결).
|
||||
"v4_all_judgments": [
|
||||
{
|
||||
"template_id": c.template_id,
|
||||
"frame_id": c.frame_id,
|
||||
"frame_number": c.frame_number,
|
||||
"v4_rank": c.v4_rank,
|
||||
"confidence": c.confidence,
|
||||
"label": c.label,
|
||||
"catalog_registered": get_contract(c.template_id) is not None,
|
||||
}
|
||||
for c in v4_all_for_unit
|
||||
],
|
||||
# IMP-11 D-2 (u1) : per-candidate min_height_px added (None when unregistered).
|
||||
"v4_all_judgments": v4_all_judgments_list,
|
||||
"application_candidates": app_candidates,
|
||||
# IMP-06 blocker-fix (Codex #13 Blocker 3 / #16) — plan-aware
|
||||
# additive fields. None / False / [] when no override CLI used.
|
||||
|
||||
Reference in New Issue
Block a user