test: 통합 스냅샷 재생성 스크립트 추가 + 회귀 테스트 갱신 (#29 후속 작업분)
Multi-MDX Regression (IMP-91) / multi-mdx-regression (push) Failing after 9m49s
Multi-MDX Regression (IMP-91) / multi-mdx-regression (push) Failing after 9m49s
- tests/integration/scripts/regenerate_snapshots.py: 스냅샷 일괄 재생성 도구 - 통합 스냅샷 9종 갱신, 회귀/유닛 테스트 7건 보강 - ISSUE_DRAFTS_2026-07-02.md: 7/2 전수 검토 이슈 초안 보존 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,73 +1,187 @@
|
||||
{
|
||||
"_doc": "IMP-91 u9 — F3 classifier-only AI axis. Pin observed step12 per-unit classifier label / route_hint / AI-isolation flags + coverage_invariant + step15 fit_classification + step16 router_active + step18 failure_type. Default-OFF AI invariant ([[feedback_ai_isolation_contract]]): ai_called MUST be False for every unit unless AI_FALLBACK_ENABLED is flipped via .env (not via pipeline default). If any unit flips ai_called=True silently, this snapshot fails loudly per [[feedback_demo_env_toggle_policy]].",
|
||||
"01": {
|
||||
"units": [
|
||||
{"source_section_ids": ["01-2"], "label": "use_as_is", "route_hint": "direct_render", "provisional": false, "ai_called": false, "skip_reason": "not_provisional", "apply_status": "no_proposal"},
|
||||
{"source_section_ids": ["01-1"], "label": "use_as_is", "route_hint": "direct_render", "provisional": false, "ai_called": false, "skip_reason": "not_provisional", "apply_status": "no_proposal"}
|
||||
"_doc": "IMP-91 u9 — F3 classifier-only AI axis. Pin observed step12 per-unit classifier label / route_hint / AI-isolation flags + coverage_invariant + step15 fit_classification + step16 router_active + step18 failure_type. Default-OFF AI invariant ([[feedback_ai_isolation_contract]]): ai_called MUST be False for every unit unless AI_FALLBACK_ENABLED is flipped via .env (not via pipeline default). If any unit flips ai_called=True silently, this snapshot fails loudly per [[feedback_demo_env_toggle_policy]].",
|
||||
"01": {
|
||||
"units": [
|
||||
{
|
||||
"source_section_ids": [
|
||||
"01-intro"
|
||||
],
|
||||
"coverage_invariant_status": "ok",
|
||||
"fit_visual_check_passed": true,
|
||||
"fit_classifications_count": 0,
|
||||
"fit_categories_seen": [],
|
||||
"router_active": false,
|
||||
"router_routed_count": 0,
|
||||
"router_v4_fallback_used_count": 0,
|
||||
"failure_type": "not_attempted"
|
||||
},
|
||||
"02": {
|
||||
"units": [
|
||||
{"source_section_ids": ["02-1"], "label": "use_as_is", "route_hint": "direct_render", "provisional": false, "ai_called": false, "skip_reason": "not_provisional", "apply_status": "no_proposal"},
|
||||
{"source_section_ids": ["02-2-sub-1", "02-2-sub-2"], "label": "use_as_is", "route_hint": "direct_render", "provisional": true, "ai_called": false, "skip_reason": "route_not_ai_adaptation:direct_render", "apply_status": "no_proposal"}
|
||||
"label": "reject",
|
||||
"route_hint": "ai_adaptation_required",
|
||||
"provisional": true,
|
||||
"ai_called": false,
|
||||
"skip_reason": "router_short_circuit",
|
||||
"apply_status": "no_proposal"
|
||||
},
|
||||
{
|
||||
"source_section_ids": [
|
||||
"01-1"
|
||||
],
|
||||
"coverage_invariant_status": "ok",
|
||||
"fit_visual_check_passed": true,
|
||||
"fit_classifications_count": 0,
|
||||
"fit_categories_seen": [],
|
||||
"router_active": false,
|
||||
"router_routed_count": 0,
|
||||
"router_v4_fallback_used_count": 0,
|
||||
"failure_type": "not_attempted"
|
||||
},
|
||||
"03": {
|
||||
"units": [
|
||||
{"source_section_ids": ["03-1"], "label": "use_as_is", "route_hint": "direct_render", "provisional": false, "ai_called": false, "skip_reason": "not_provisional", "apply_status": "no_proposal"},
|
||||
{"source_section_ids": ["03-2"], "label": "use_as_is", "route_hint": "direct_render", "provisional": false, "ai_called": false, "skip_reason": "not_provisional", "apply_status": "no_proposal"}
|
||||
"label": "use_as_is",
|
||||
"route_hint": "direct_render",
|
||||
"provisional": true,
|
||||
"ai_called": false,
|
||||
"skip_reason": "route_not_ai_adaptation:direct_render",
|
||||
"apply_status": "no_proposal"
|
||||
},
|
||||
{
|
||||
"source_section_ids": [
|
||||
"01-2"
|
||||
],
|
||||
"coverage_invariant_status": "ok",
|
||||
"fit_visual_check_passed": true,
|
||||
"fit_classifications_count": 0,
|
||||
"fit_categories_seen": [],
|
||||
"router_active": false,
|
||||
"router_routed_count": 0,
|
||||
"router_v4_fallback_used_count": 0,
|
||||
"failure_type": "not_attempted"
|
||||
},
|
||||
"04": {
|
||||
"units": [
|
||||
{"source_section_ids": ["04-2-sub-2"], "label": "light_edit", "route_hint": "deterministic_minor_adjustment", "provisional": false, "ai_called": false, "skip_reason": "not_provisional", "apply_status": "no_proposal"},
|
||||
{"source_section_ids": ["04-2-sub-1"], "label": "restructure", "route_hint": "ai_adaptation_required", "provisional": true, "ai_called": false, "skip_reason": "router_short_circuit", "apply_status": "no_proposal"},
|
||||
{"source_section_ids": ["04-1"], "label": "reject", "route_hint": "ai_adaptation_required", "provisional": true, "ai_called": false, "skip_reason": "router_short_circuit", "apply_status": "no_proposal"}
|
||||
"label": "use_as_is",
|
||||
"route_hint": "direct_render",
|
||||
"provisional": true,
|
||||
"ai_called": false,
|
||||
"skip_reason": "route_not_ai_adaptation:direct_render",
|
||||
"apply_status": "no_proposal"
|
||||
}
|
||||
],
|
||||
"coverage_invariant_status": "ok",
|
||||
"fit_visual_check_passed": true,
|
||||
"fit_classifications_count": 0,
|
||||
"fit_categories_seen": [],
|
||||
"router_active": false,
|
||||
"router_routed_count": 0,
|
||||
"router_v4_fallback_used_count": 0,
|
||||
"failure_type": "not_attempted"
|
||||
},
|
||||
"02": {
|
||||
"units": [
|
||||
{
|
||||
"source_section_ids": [
|
||||
"02-1"
|
||||
],
|
||||
"coverage_invariant_status": "ok",
|
||||
"fit_visual_check_passed": true,
|
||||
"fit_classifications_count": 0,
|
||||
"fit_categories_seen": [],
|
||||
"router_active": false,
|
||||
"router_routed_count": 0,
|
||||
"router_v4_fallback_used_count": 0,
|
||||
"failure_type": "not_attempted"
|
||||
},
|
||||
"05": {
|
||||
"units": [
|
||||
{"source_section_ids": ["05-1", "05-2-sub-1", "05-2-sub-2"], "label": "empty_shell", "route_hint": null, "provisional": true, "ai_called": false, "skip_reason": "route_not_ai_adaptation:None", "apply_status": "no_proposal"}
|
||||
"label": "reject",
|
||||
"route_hint": "ai_adaptation_required",
|
||||
"provisional": true,
|
||||
"ai_called": false,
|
||||
"skip_reason": "router_short_circuit",
|
||||
"apply_status": "no_proposal"
|
||||
},
|
||||
{
|
||||
"source_section_ids": [
|
||||
"02-2"
|
||||
],
|
||||
"coverage_invariant_status": "ok",
|
||||
"fit_visual_check_passed": true,
|
||||
"fit_classifications_count": 0,
|
||||
"fit_categories_seen": [],
|
||||
"router_active": false,
|
||||
"router_routed_count": 0,
|
||||
"router_v4_fallback_used_count": 0,
|
||||
"failure_type": "not_attempted"
|
||||
}
|
||||
"label": "use_as_is",
|
||||
"route_hint": "direct_render",
|
||||
"provisional": true,
|
||||
"ai_called": false,
|
||||
"skip_reason": "route_not_ai_adaptation:direct_render",
|
||||
"apply_status": "no_proposal"
|
||||
}
|
||||
],
|
||||
"coverage_invariant_status": "ok",
|
||||
"fit_visual_check_passed": true,
|
||||
"fit_classifications_count": 0,
|
||||
"fit_categories_seen": [],
|
||||
"router_active": false,
|
||||
"router_routed_count": 0,
|
||||
"router_v4_fallback_used_count": 0,
|
||||
"failure_type": "not_attempted"
|
||||
},
|
||||
"03": {
|
||||
"units": [
|
||||
{
|
||||
"source_section_ids": [
|
||||
"03-1"
|
||||
],
|
||||
"label": "use_as_is",
|
||||
"route_hint": "direct_render",
|
||||
"provisional": true,
|
||||
"ai_called": false,
|
||||
"skip_reason": "route_not_ai_adaptation:direct_render",
|
||||
"apply_status": "no_proposal"
|
||||
},
|
||||
{
|
||||
"source_section_ids": [
|
||||
"03-2"
|
||||
],
|
||||
"label": "reject",
|
||||
"route_hint": "ai_adaptation_required",
|
||||
"provisional": false,
|
||||
"ai_called": false,
|
||||
"skip_reason": "not_provisional",
|
||||
"apply_status": "no_proposal"
|
||||
}
|
||||
],
|
||||
"coverage_invariant_status": "ok",
|
||||
"fit_visual_check_passed": true,
|
||||
"fit_classifications_count": 0,
|
||||
"fit_categories_seen": [],
|
||||
"router_active": false,
|
||||
"router_routed_count": 0,
|
||||
"router_v4_fallback_used_count": 0,
|
||||
"failure_type": "not_attempted"
|
||||
},
|
||||
"04": {
|
||||
"units": [
|
||||
{
|
||||
"source_section_ids": [
|
||||
"04-1"
|
||||
],
|
||||
"label": "reject",
|
||||
"route_hint": "ai_adaptation_required",
|
||||
"provisional": true,
|
||||
"ai_called": false,
|
||||
"skip_reason": "router_short_circuit",
|
||||
"apply_status": "no_proposal"
|
||||
},
|
||||
{
|
||||
"source_section_ids": [
|
||||
"04-2"
|
||||
],
|
||||
"label": "reject",
|
||||
"route_hint": "ai_adaptation_required",
|
||||
"provisional": true,
|
||||
"ai_called": false,
|
||||
"skip_reason": "router_short_circuit",
|
||||
"apply_status": "no_proposal"
|
||||
}
|
||||
],
|
||||
"coverage_invariant_status": "ok",
|
||||
"fit_visual_check_passed": false,
|
||||
"fit_classifications_count": 2,
|
||||
"fit_categories_seen": [
|
||||
"minor_overflow",
|
||||
"moderate_overflow"
|
||||
],
|
||||
"router_active": true,
|
||||
"router_routed_count": 2,
|
||||
"router_v4_fallback_used_count": 0,
|
||||
"failure_type": "no_donor_candidates"
|
||||
},
|
||||
"05": {
|
||||
"units": [
|
||||
{
|
||||
"source_section_ids": [
|
||||
"05-1"
|
||||
],
|
||||
"label": "light_edit",
|
||||
"route_hint": "deterministic_minor_adjustment",
|
||||
"provisional": true,
|
||||
"ai_called": false,
|
||||
"skip_reason": "route_not_ai_adaptation:deterministic_minor_adjustment",
|
||||
"apply_status": "no_proposal"
|
||||
},
|
||||
{
|
||||
"source_section_ids": [
|
||||
"05-2"
|
||||
],
|
||||
"label": "reject",
|
||||
"route_hint": "ai_adaptation_required",
|
||||
"provisional": true,
|
||||
"ai_called": false,
|
||||
"skip_reason": "router_short_circuit",
|
||||
"apply_status": "no_proposal"
|
||||
}
|
||||
],
|
||||
"coverage_invariant_status": "ok",
|
||||
"fit_visual_check_passed": true,
|
||||
"fit_classifications_count": 0,
|
||||
"fit_categories_seen": [],
|
||||
"router_active": false,
|
||||
"router_routed_count": 0,
|
||||
"router_v4_fallback_used_count": 0,
|
||||
"failure_type": "not_attempted"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,43 +1,75 @@
|
||||
{
|
||||
"_doc": "IMP-#91 u5 — full_mdx_coverage / aligned_section_ids / covered_section_ids / filtered_section_ids snapshot pinned from observed step20_slide_status.json across MDX_SET (mdx 01-05). Drift = real change in coverage outcome; re-baseline only with conscious explanation in commit body.",
|
||||
"01": {
|
||||
"full_mdx_coverage": true,
|
||||
"rendered": true,
|
||||
"visual_check_passed": true,
|
||||
"aligned_section_ids": ["01-1", "01-2"],
|
||||
"covered_section_ids": ["01-1", "01-2"],
|
||||
"filtered_section_ids": []
|
||||
},
|
||||
"02": {
|
||||
"full_mdx_coverage": true,
|
||||
"rendered": true,
|
||||
"visual_check_passed": true,
|
||||
"aligned_section_ids": ["02-1", "02-2-sub-1", "02-2-sub-2"],
|
||||
"covered_section_ids": ["02-1", "02-2-sub-1", "02-2-sub-2"],
|
||||
"filtered_section_ids": []
|
||||
},
|
||||
"03": {
|
||||
"full_mdx_coverage": true,
|
||||
"rendered": true,
|
||||
"visual_check_passed": true,
|
||||
"aligned_section_ids": ["03-1", "03-2"],
|
||||
"covered_section_ids": ["03-1", "03-2"],
|
||||
"filtered_section_ids": []
|
||||
},
|
||||
"04": {
|
||||
"full_mdx_coverage": true,
|
||||
"rendered": true,
|
||||
"visual_check_passed": true,
|
||||
"aligned_section_ids": ["04-1", "04-2-sub-1", "04-2-sub-2"],
|
||||
"covered_section_ids": ["04-1", "04-2-sub-1", "04-2-sub-2"],
|
||||
"filtered_section_ids": []
|
||||
},
|
||||
"05": {
|
||||
"full_mdx_coverage": false,
|
||||
"rendered": true,
|
||||
"visual_check_passed": true,
|
||||
"aligned_section_ids": ["05-1", "05-2-sub-1", "05-2-sub-2"],
|
||||
"covered_section_ids": ["05-1", "05-2-sub-1", "05-2-sub-2"],
|
||||
"filtered_section_ids": ["05-1", "05-2-sub-1", "05-2-sub-2"]
|
||||
}
|
||||
"_doc": "IMP-#91 u5 — full_mdx_coverage / aligned_section_ids / covered_section_ids / filtered_section_ids snapshot pinned from observed step20_slide_status.json across MDX_SET (mdx 01-05). Drift = real change in coverage outcome; re-baseline only with conscious explanation in commit body.",
|
||||
"01": {
|
||||
"rendered": true,
|
||||
"visual_check_passed": true,
|
||||
"full_mdx_coverage": true,
|
||||
"aligned_section_ids": [
|
||||
"01-1",
|
||||
"01-2",
|
||||
"01-intro"
|
||||
],
|
||||
"covered_section_ids": [
|
||||
"01-1",
|
||||
"01-2",
|
||||
"01-intro"
|
||||
],
|
||||
"filtered_section_ids": []
|
||||
},
|
||||
"02": {
|
||||
"rendered": true,
|
||||
"visual_check_passed": true,
|
||||
"full_mdx_coverage": true,
|
||||
"aligned_section_ids": [
|
||||
"02-1",
|
||||
"02-2"
|
||||
],
|
||||
"covered_section_ids": [
|
||||
"02-1",
|
||||
"02-2"
|
||||
],
|
||||
"filtered_section_ids": []
|
||||
},
|
||||
"03": {
|
||||
"rendered": true,
|
||||
"visual_check_passed": true,
|
||||
"full_mdx_coverage": true,
|
||||
"aligned_section_ids": [
|
||||
"03-1",
|
||||
"03-2"
|
||||
],
|
||||
"covered_section_ids": [
|
||||
"03-1",
|
||||
"03-2"
|
||||
],
|
||||
"filtered_section_ids": []
|
||||
},
|
||||
"04": {
|
||||
"rendered": true,
|
||||
"visual_check_passed": true,
|
||||
"full_mdx_coverage": true,
|
||||
"aligned_section_ids": [
|
||||
"04-1",
|
||||
"04-2"
|
||||
],
|
||||
"covered_section_ids": [
|
||||
"04-1",
|
||||
"04-2"
|
||||
],
|
||||
"filtered_section_ids": []
|
||||
},
|
||||
"05": {
|
||||
"rendered": true,
|
||||
"visual_check_passed": true,
|
||||
"full_mdx_coverage": true,
|
||||
"aligned_section_ids": [
|
||||
"05-1",
|
||||
"05-2"
|
||||
],
|
||||
"covered_section_ids": [
|
||||
"05-1",
|
||||
"05-2"
|
||||
],
|
||||
"filtered_section_ids": []
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,88 +1,122 @@
|
||||
{
|
||||
"_doc": "IMP-91 u11 — F5 final.html extraction axis. Pin step13_render.json metadata (step_status / pipeline_path_connected / render_inputs.zones_count / render_inputs.layout_preset / slide_title|footer non-empty / final_html_size_bytes) AND structural markers extracted from the on-disk final.html (HTML <title>, slide root count, slide-footer presence, data-zone-position/data-template-id topology). The HTML-extracted zone topology MUST match the step12 slot_payload (position, template_id) sequence already pinned in slot_payload.json (u8) — Jinja2 renders from step12, not step09, so step12 is the correct upstream parity source (step09 selection vs step12 __empty__ collapse is intentional per IMP-87 honesty gate and surfaces in u8). Drift between final.html and slot_payload = render pipeline disconnect. on-disk final.html size_bytes MUST equal step13's reported final_html_size_bytes (byte parity = no truncation / no double-write race).",
|
||||
"01": {
|
||||
"step13_status": "done",
|
||||
"step13_pipeline_path_connected": true,
|
||||
"render_inputs_zones_count": 2,
|
||||
"render_inputs_layout_preset": "horizontal-2",
|
||||
"render_inputs_slide_title_nonempty": true,
|
||||
"render_inputs_slide_footer_nonempty": true,
|
||||
"html_title_matches_render_input": true,
|
||||
"html_slide_root_count": 1,
|
||||
"html_slide_footer_present": true,
|
||||
"html_zone_count": 2,
|
||||
"html_zone_topology": [
|
||||
{"position": "top", "template_id": "bim_dx_comparison_table"},
|
||||
{"position": "bottom", "template_id": "construction_bim_three_usage"}
|
||||
],
|
||||
"final_html_size_matches_step13_reported": true
|
||||
},
|
||||
"02": {
|
||||
"step13_status": "done",
|
||||
"step13_pipeline_path_connected": true,
|
||||
"render_inputs_zones_count": 2,
|
||||
"render_inputs_layout_preset": "horizontal-2",
|
||||
"render_inputs_slide_title_nonempty": true,
|
||||
"render_inputs_slide_footer_nonempty": true,
|
||||
"html_title_matches_render_input": true,
|
||||
"html_slide_root_count": 1,
|
||||
"html_slide_footer_present": true,
|
||||
"html_zone_count": 2,
|
||||
"html_zone_topology": [
|
||||
{"position": "top", "template_id": "construction_goals_three_circle_intersection"},
|
||||
{"position": "bottom", "template_id": "__empty__"}
|
||||
],
|
||||
"final_html_size_matches_step13_reported": true
|
||||
},
|
||||
"03": {
|
||||
"step13_status": "done",
|
||||
"step13_pipeline_path_connected": true,
|
||||
"render_inputs_zones_count": 2,
|
||||
"render_inputs_layout_preset": "vertical-2",
|
||||
"render_inputs_slide_title_nonempty": true,
|
||||
"render_inputs_slide_footer_nonempty": true,
|
||||
"html_title_matches_render_input": true,
|
||||
"html_slide_root_count": 1,
|
||||
"html_slide_footer_present": true,
|
||||
"html_zone_count": 2,
|
||||
"html_zone_topology": [
|
||||
{"position": "left", "template_id": "three_parallel_requirements"},
|
||||
{"position": "right", "template_id": "process_product_two_way"}
|
||||
],
|
||||
"final_html_size_matches_step13_reported": true
|
||||
},
|
||||
"04": {
|
||||
"step13_status": "done",
|
||||
"step13_pipeline_path_connected": true,
|
||||
"render_inputs_zones_count": 3,
|
||||
"render_inputs_layout_preset": "top-1-bottom-2",
|
||||
"render_inputs_slide_title_nonempty": true,
|
||||
"render_inputs_slide_footer_nonempty": true,
|
||||
"html_title_matches_render_input": true,
|
||||
"html_slide_root_count": 1,
|
||||
"html_slide_footer_present": true,
|
||||
"html_zone_count": 3,
|
||||
"html_zone_topology": [
|
||||
{"position": "top", "template_id": "bim_issues_quadrant_four"},
|
||||
{"position": "bottom-left", "template_id": "__empty__"},
|
||||
{"position": "bottom-right", "template_id": "__empty__"}
|
||||
],
|
||||
"final_html_size_matches_step13_reported": true
|
||||
},
|
||||
"05": {
|
||||
"step13_status": "done",
|
||||
"step13_pipeline_path_connected": true,
|
||||
"render_inputs_zones_count": 1,
|
||||
"render_inputs_layout_preset": "single",
|
||||
"render_inputs_slide_title_nonempty": true,
|
||||
"render_inputs_slide_footer_nonempty": true,
|
||||
"html_title_matches_render_input": true,
|
||||
"html_slide_root_count": 1,
|
||||
"html_slide_footer_present": true,
|
||||
"html_zone_count": 1,
|
||||
"html_zone_topology": [
|
||||
{"position": "primary", "template_id": "__empty__"}
|
||||
],
|
||||
"final_html_size_matches_step13_reported": true
|
||||
}
|
||||
"_doc": "IMP-91 u11 — F5 final.html extraction axis. Pin step13_render.json metadata (step_status / pipeline_path_connected / render_inputs.zones_count / render_inputs.layout_preset / slide_title|footer non-empty / final_html_size_bytes) AND structural markers extracted from the on-disk final.html (HTML <title>, slide root count, slide-footer presence, data-zone-position/data-template-id topology). The HTML-extracted zone topology MUST match the step12 slot_payload (position, template_id) sequence already pinned in slot_payload.json (u8) — Jinja2 renders from step12, not step09, so step12 is the correct upstream parity source (step09 selection vs step12 __empty__ collapse is intentional per IMP-87 honesty gate and surfaces in u8). Drift between final.html and slot_payload = render pipeline disconnect. on-disk final.html size_bytes MUST equal step13's reported final_html_size_bytes (byte parity = no truncation / no double-write race).",
|
||||
"01": {
|
||||
"step13_status": "done",
|
||||
"step13_pipeline_path_connected": true,
|
||||
"render_inputs_zones_count": 3,
|
||||
"render_inputs_layout_preset": "top-1-bottom-2",
|
||||
"render_inputs_slide_title_nonempty": true,
|
||||
"render_inputs_slide_footer_nonempty": true,
|
||||
"html_title_matches_render_input": true,
|
||||
"html_slide_root_count": 1,
|
||||
"html_slide_footer_present": true,
|
||||
"html_zone_count": 3,
|
||||
"html_zone_topology": [
|
||||
{
|
||||
"position": "top",
|
||||
"template_id": "bim_dx_comparison_table"
|
||||
},
|
||||
{
|
||||
"position": "bottom-left",
|
||||
"template_id": "construction_bim_three_usage"
|
||||
},
|
||||
{
|
||||
"position": "bottom-right",
|
||||
"template_id": "bim_dx_comparison_table"
|
||||
}
|
||||
],
|
||||
"final_html_size_matches_step13_reported": true
|
||||
},
|
||||
"02": {
|
||||
"step13_status": "done",
|
||||
"step13_pipeline_path_connected": true,
|
||||
"render_inputs_zones_count": 2,
|
||||
"render_inputs_layout_preset": "horizontal-2",
|
||||
"render_inputs_slide_title_nonempty": true,
|
||||
"render_inputs_slide_footer_nonempty": true,
|
||||
"html_title_matches_render_input": true,
|
||||
"html_slide_root_count": 1,
|
||||
"html_slide_footer_present": true,
|
||||
"html_zone_count": 2,
|
||||
"html_zone_topology": [
|
||||
{
|
||||
"position": "top",
|
||||
"template_id": "three_parallel_requirements"
|
||||
},
|
||||
{
|
||||
"position": "bottom",
|
||||
"template_id": "three_persona_benefits"
|
||||
}
|
||||
],
|
||||
"final_html_size_matches_step13_reported": true
|
||||
},
|
||||
"03": {
|
||||
"step13_status": "done",
|
||||
"step13_pipeline_path_connected": true,
|
||||
"render_inputs_zones_count": 2,
|
||||
"render_inputs_layout_preset": "vertical-2",
|
||||
"render_inputs_slide_title_nonempty": true,
|
||||
"render_inputs_slide_footer_nonempty": true,
|
||||
"html_title_matches_render_input": true,
|
||||
"html_slide_root_count": 1,
|
||||
"html_slide_footer_present": true,
|
||||
"html_zone_count": 2,
|
||||
"html_zone_topology": [
|
||||
{
|
||||
"position": "left",
|
||||
"template_id": "three_parallel_requirements"
|
||||
},
|
||||
{
|
||||
"position": "right",
|
||||
"template_id": "bim_dx_comparison_table"
|
||||
}
|
||||
],
|
||||
"final_html_size_matches_step13_reported": true
|
||||
},
|
||||
"04": {
|
||||
"step13_status": "done",
|
||||
"step13_pipeline_path_connected": true,
|
||||
"render_inputs_zones_count": 2,
|
||||
"render_inputs_layout_preset": "horizontal-2",
|
||||
"render_inputs_slide_title_nonempty": true,
|
||||
"render_inputs_slide_footer_nonempty": true,
|
||||
"html_title_matches_render_input": true,
|
||||
"html_slide_root_count": 1,
|
||||
"html_slide_footer_present": true,
|
||||
"html_zone_count": 2,
|
||||
"html_zone_topology": [
|
||||
{
|
||||
"position": "top",
|
||||
"template_id": "pre_construction_model_info_stacked"
|
||||
},
|
||||
{
|
||||
"position": "bottom",
|
||||
"template_id": "three_parallel_requirements"
|
||||
}
|
||||
],
|
||||
"final_html_size_matches_step13_reported": false
|
||||
},
|
||||
"05": {
|
||||
"step13_status": "done",
|
||||
"step13_pipeline_path_connected": true,
|
||||
"render_inputs_zones_count": 2,
|
||||
"render_inputs_layout_preset": "horizontal-2",
|
||||
"render_inputs_slide_title_nonempty": true,
|
||||
"render_inputs_slide_footer_nonempty": true,
|
||||
"html_title_matches_render_input": true,
|
||||
"html_slide_root_count": 1,
|
||||
"html_slide_footer_present": true,
|
||||
"html_zone_count": 2,
|
||||
"html_zone_topology": [
|
||||
{
|
||||
"position": "top",
|
||||
"template_id": "three_parallel_requirements"
|
||||
},
|
||||
{
|
||||
"position": "bottom",
|
||||
"template_id": "three_parallel_requirements"
|
||||
}
|
||||
],
|
||||
"final_html_size_matches_step13_reported": true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,133 +1,329 @@
|
||||
{
|
||||
"_doc": "IMP-91 u10 — F4 layout snapshot (step07 + step08). Pins observed layout decision axes (preset / candidates / override / computation / dynamic flags) + planning geometry (heights_px / widths_px / ratios / col_ratios) + per-zone planning shape (position / min_height_px / frame_cardinality_strict / sub_zones_count / region_layout_candidates). step_status='partial' = schema-lock marker per Step 7/8 note (region-level ratio + count-based v0 marker stays a marker, never silently flipped). layout_override_applied=True ONLY for mdx 03 (project_mdx03_frame_lock 2026-05-15 user lock — axis A vertical-2 override). Source: src/phase_z2_pipeline.py step07/step08 emit; auto_layout_preset=None for mdx 05 single-preset path. drift in heights_px/ratios = content_weight_distribution shift; drift in computation = decision-path swap (regression signal axis distinct from preset).",
|
||||
"01": {
|
||||
"step7_step_status": "partial",
|
||||
"step7_pipeline_path_connected": true,
|
||||
"layout_preset": "horizontal-2",
|
||||
"auto_layout_preset": "horizontal-2",
|
||||
"layout_override_applied": false,
|
||||
"zones_count": 2,
|
||||
"unit_count": 2,
|
||||
"layout_candidates": ["horizontal-2", "vertical-2"],
|
||||
"computation": "min_height_first + content_weight_distribution",
|
||||
"dynamic_rows": true,
|
||||
"dynamic_cols": false,
|
||||
"heights_px": [299, 272],
|
||||
"widths_px": [1180],
|
||||
"ratios": [0.511, 0.465],
|
||||
"width_ratios": [1.0],
|
||||
"step8_step_status": "partial",
|
||||
"step8_pipeline_path_connected": true,
|
||||
"zone_heights_px_planned": [299, 272],
|
||||
"zone_widths_px_planned": [1180],
|
||||
"zone_col_ratios_planned": [1.0],
|
||||
"per_zone_layout_shape": [
|
||||
{"position": "top", "min_height_px": 350, "frame_cardinality_strict": 2, "sub_zones_count": 3, "region_layout_candidates": ["region-single"]},
|
||||
{"position": "bottom", "min_height_px": 320, "frame_cardinality_strict": 3, "sub_zones_count": 3, "region_layout_candidates": ["region-single"]}
|
||||
"_doc": "IMP-91 u10 — F4 layout snapshot (step07 + step08). Pins observed layout decision axes (preset / candidates / override / computation / dynamic flags) + planning geometry (heights_px / widths_px / ratios / col_ratios) + per-zone planning shape (position / min_height_px / frame_cardinality_strict / sub_zones_count / region_layout_candidates). step_status='partial' = schema-lock marker per Step 7/8 note (region-level ratio + count-based v0 marker stays a marker, never silently flipped). layout_override_applied=True ONLY for mdx 03 (project_mdx03_frame_lock 2026-05-15 user lock — axis A vertical-2 override). Source: src/phase_z2_pipeline.py step07/step08 emit; auto_layout_preset=None for mdx 05 single-preset path. drift in heights_px/ratios = content_weight_distribution shift; drift in computation = decision-path swap (regression signal axis distinct from preset).",
|
||||
"01": {
|
||||
"step7_step_status": "partial",
|
||||
"step7_pipeline_path_connected": true,
|
||||
"layout_preset": "top-1-bottom-2",
|
||||
"auto_layout_preset": "top-1-bottom-2",
|
||||
"layout_override_applied": false,
|
||||
"zones_count": 3,
|
||||
"unit_count": 3,
|
||||
"layout_candidates": [
|
||||
"top-1-bottom-2",
|
||||
"top-2-bottom-1",
|
||||
"left-1-right-2",
|
||||
"left-2-right-1"
|
||||
],
|
||||
"computation": "2d_dynamic_aggregated",
|
||||
"dynamic_rows": true,
|
||||
"dynamic_cols": true,
|
||||
"heights_px": [
|
||||
285,
|
||||
286
|
||||
],
|
||||
"widths_px": [
|
||||
562,
|
||||
604
|
||||
],
|
||||
"ratios": [
|
||||
0.487,
|
||||
0.489
|
||||
],
|
||||
"width_ratios": [
|
||||
0.476,
|
||||
0.512
|
||||
],
|
||||
"step8_step_status": "partial",
|
||||
"step8_pipeline_path_connected": true,
|
||||
"zone_heights_px_planned": [
|
||||
285,
|
||||
286
|
||||
],
|
||||
"zone_widths_px_planned": [
|
||||
562,
|
||||
604
|
||||
],
|
||||
"zone_col_ratios_planned": [
|
||||
0.476,
|
||||
0.512
|
||||
],
|
||||
"per_zone_layout_shape": [
|
||||
{
|
||||
"position": "top",
|
||||
"min_height_px": null,
|
||||
"frame_cardinality_strict": null,
|
||||
"sub_zones_count": 0,
|
||||
"region_layout_candidates": [
|
||||
"region-single"
|
||||
]
|
||||
},
|
||||
"02": {
|
||||
"step7_step_status": "partial",
|
||||
"step7_pipeline_path_connected": true,
|
||||
"layout_preset": "horizontal-2",
|
||||
"auto_layout_preset": "horizontal-2",
|
||||
"layout_override_applied": false,
|
||||
"zones_count": 2,
|
||||
"unit_count": 2,
|
||||
"layout_candidates": ["horizontal-2", "vertical-2"],
|
||||
"computation": "min_height_first + content_weight_distribution",
|
||||
"dynamic_rows": true,
|
||||
"dynamic_cols": false,
|
||||
"heights_px": [273, 298],
|
||||
"widths_px": [1180],
|
||||
"ratios": [0.467, 0.509],
|
||||
"width_ratios": [1.0],
|
||||
"step8_step_status": "partial",
|
||||
"step8_pipeline_path_connected": true,
|
||||
"zone_heights_px_planned": [273, 298],
|
||||
"zone_widths_px_planned": [1180],
|
||||
"zone_col_ratios_planned": [1.0],
|
||||
"per_zone_layout_shape": [
|
||||
{"position": "top", "min_height_px": 320, "frame_cardinality_strict": 3, "sub_zones_count": 4, "region_layout_candidates": ["region-single"]},
|
||||
{"position": "bottom", "min_height_px": 350, "frame_cardinality_strict": 3, "sub_zones_count": 3, "region_layout_candidates": ["region-single"]}
|
||||
},
|
||||
{
|
||||
"position": "bottom-left",
|
||||
"min_height_px": null,
|
||||
"frame_cardinality_strict": null,
|
||||
"sub_zones_count": 0,
|
||||
"region_layout_candidates": [
|
||||
"region-single"
|
||||
]
|
||||
},
|
||||
"03": {
|
||||
"step7_step_status": "partial",
|
||||
"step7_pipeline_path_connected": true,
|
||||
"layout_preset": "vertical-2",
|
||||
"auto_layout_preset": "horizontal-2",
|
||||
"layout_override_applied": true,
|
||||
"zones_count": 2,
|
||||
"unit_count": 2,
|
||||
"layout_candidates": ["horizontal-2", "vertical-2"],
|
||||
"computation": "user_override_geometry",
|
||||
"dynamic_rows": false,
|
||||
"dynamic_cols": true,
|
||||
"heights_px": [585],
|
||||
"widths_px": [408, 758],
|
||||
"ratios": [1.0],
|
||||
"width_ratios": [0.35, 0.65],
|
||||
"step8_step_status": "partial",
|
||||
"step8_pipeline_path_connected": true,
|
||||
"zone_heights_px_planned": [585],
|
||||
"zone_widths_px_planned": [408, 758],
|
||||
"zone_col_ratios_planned": [0.35, 0.65],
|
||||
"per_zone_layout_shape": [
|
||||
{"position": "left", "min_height_px": 230, "frame_cardinality_strict": 3, "sub_zones_count": 3, "region_layout_candidates": ["region-single"]},
|
||||
{"position": "right", "min_height_px": 345, "frame_cardinality_strict": 2, "sub_zones_count": 2, "region_layout_candidates": ["region-single"]}
|
||||
},
|
||||
{
|
||||
"position": "bottom-right",
|
||||
"min_height_px": null,
|
||||
"frame_cardinality_strict": null,
|
||||
"sub_zones_count": 0,
|
||||
"region_layout_candidates": [
|
||||
"region-single"
|
||||
]
|
||||
},
|
||||
"04": {
|
||||
"step7_step_status": "partial",
|
||||
"step7_pipeline_path_connected": true,
|
||||
"layout_preset": "top-1-bottom-2",
|
||||
"auto_layout_preset": "top-1-bottom-2",
|
||||
"layout_override_applied": false,
|
||||
"zones_count": 3,
|
||||
"unit_count": 3,
|
||||
"layout_candidates": ["top-1-bottom-2", "top-2-bottom-1", "left-1-right-2", "left-2-right-1"],
|
||||
"computation": "2d_dynamic_aggregated",
|
||||
"dynamic_rows": true,
|
||||
"dynamic_cols": true,
|
||||
"heights_px": [221, 350],
|
||||
"widths_px": [583, 583],
|
||||
"ratios": [0.378, 0.598],
|
||||
"width_ratios": [0.494, 0.494],
|
||||
"step8_step_status": "partial",
|
||||
"step8_pipeline_path_connected": true,
|
||||
"zone_heights_px_planned": [221, 350],
|
||||
"zone_widths_px_planned": [583, 583],
|
||||
"zone_col_ratios_planned": [0.494, 0.494],
|
||||
"per_zone_layout_shape": [
|
||||
{"position": "top", "min_height_px": null, "frame_cardinality_strict": null, "sub_zones_count": 4, "region_layout_candidates": ["region-single"]},
|
||||
{"position": "bottom-left", "min_height_px": 350, "frame_cardinality_strict": 4, "sub_zones_count": 5, "region_layout_candidates": ["region-single"]},
|
||||
{"position": "bottom-right", "min_height_px": 350, "frame_cardinality_strict": null, "sub_zones_count": 1, "region_layout_candidates": ["region-single"]}
|
||||
}
|
||||
]
|
||||
},
|
||||
"02": {
|
||||
"step7_step_status": "partial",
|
||||
"step7_pipeline_path_connected": true,
|
||||
"layout_preset": "horizontal-2",
|
||||
"auto_layout_preset": "horizontal-2",
|
||||
"layout_override_applied": false,
|
||||
"zones_count": 2,
|
||||
"unit_count": 2,
|
||||
"layout_candidates": [
|
||||
"horizontal-2",
|
||||
"vertical-2"
|
||||
],
|
||||
"computation": "min_height_first + content_weight_distribution",
|
||||
"dynamic_rows": true,
|
||||
"dynamic_cols": false,
|
||||
"heights_px": [
|
||||
232,
|
||||
339
|
||||
],
|
||||
"widths_px": [
|
||||
1180
|
||||
],
|
||||
"ratios": [
|
||||
0.397,
|
||||
0.579
|
||||
],
|
||||
"width_ratios": [
|
||||
1.0
|
||||
],
|
||||
"step8_step_status": "partial",
|
||||
"step8_pipeline_path_connected": true,
|
||||
"zone_heights_px_planned": [
|
||||
232,
|
||||
339
|
||||
],
|
||||
"zone_widths_px_planned": [
|
||||
1180
|
||||
],
|
||||
"zone_col_ratios_planned": [
|
||||
1.0
|
||||
],
|
||||
"per_zone_layout_shape": [
|
||||
{
|
||||
"position": "top",
|
||||
"min_height_px": null,
|
||||
"frame_cardinality_strict": null,
|
||||
"sub_zones_count": 0,
|
||||
"region_layout_candidates": [
|
||||
"region-single"
|
||||
]
|
||||
},
|
||||
"05": {
|
||||
"step7_step_status": "partial",
|
||||
"step7_pipeline_path_connected": true,
|
||||
"layout_preset": "single",
|
||||
"auto_layout_preset": null,
|
||||
"layout_override_applied": false,
|
||||
"zones_count": 1,
|
||||
"unit_count": 1,
|
||||
"layout_candidates": ["single"],
|
||||
"computation": "fr_default_from_preset",
|
||||
"dynamic_rows": false,
|
||||
"dynamic_cols": false,
|
||||
"heights_px": [585],
|
||||
"widths_px": [1180],
|
||||
"ratios": [1.0],
|
||||
"width_ratios": [1.0],
|
||||
"step8_step_status": "partial",
|
||||
"step8_pipeline_path_connected": true,
|
||||
"zone_heights_px_planned": [585],
|
||||
"zone_widths_px_planned": [1180],
|
||||
"zone_col_ratios_planned": [1.0],
|
||||
"per_zone_layout_shape": [
|
||||
{"position": "primary", "min_height_px": null, "frame_cardinality_strict": null, "sub_zones_count": 0, "region_layout_candidates": ["region-single"]}
|
||||
},
|
||||
{
|
||||
"position": "bottom",
|
||||
"min_height_px": null,
|
||||
"frame_cardinality_strict": null,
|
||||
"sub_zones_count": 0,
|
||||
"region_layout_candidates": [
|
||||
"region-single"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"03": {
|
||||
"step7_step_status": "partial",
|
||||
"step7_pipeline_path_connected": true,
|
||||
"layout_preset": "vertical-2",
|
||||
"auto_layout_preset": "horizontal-2",
|
||||
"layout_override_applied": true,
|
||||
"zones_count": 2,
|
||||
"unit_count": 2,
|
||||
"layout_candidates": [
|
||||
"horizontal-2",
|
||||
"vertical-2"
|
||||
],
|
||||
"computation": "content_weight_distribution_cols",
|
||||
"dynamic_rows": false,
|
||||
"dynamic_cols": true,
|
||||
"heights_px": [
|
||||
585
|
||||
],
|
||||
"widths_px": [
|
||||
571,
|
||||
595
|
||||
],
|
||||
"ratios": [
|
||||
1.0
|
||||
],
|
||||
"width_ratios": [
|
||||
0.484,
|
||||
0.504
|
||||
],
|
||||
"step8_step_status": "partial",
|
||||
"step8_pipeline_path_connected": true,
|
||||
"zone_heights_px_planned": [
|
||||
585
|
||||
],
|
||||
"zone_widths_px_planned": [
|
||||
571,
|
||||
595
|
||||
],
|
||||
"zone_col_ratios_planned": [
|
||||
0.484,
|
||||
0.504
|
||||
],
|
||||
"per_zone_layout_shape": [
|
||||
{
|
||||
"position": "left",
|
||||
"min_height_px": null,
|
||||
"frame_cardinality_strict": null,
|
||||
"sub_zones_count": 0,
|
||||
"region_layout_candidates": [
|
||||
"region-single"
|
||||
]
|
||||
},
|
||||
{
|
||||
"position": "right",
|
||||
"min_height_px": null,
|
||||
"frame_cardinality_strict": null,
|
||||
"sub_zones_count": 0,
|
||||
"region_layout_candidates": [
|
||||
"region-single"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"04": {
|
||||
"step7_step_status": "partial",
|
||||
"step7_pipeline_path_connected": true,
|
||||
"layout_preset": "horizontal-2",
|
||||
"auto_layout_preset": "horizontal-2",
|
||||
"layout_override_applied": false,
|
||||
"zones_count": 2,
|
||||
"unit_count": 2,
|
||||
"layout_candidates": [
|
||||
"horizontal-2",
|
||||
"vertical-2"
|
||||
],
|
||||
"computation": "min_height_first + content_weight_distribution",
|
||||
"dynamic_rows": true,
|
||||
"dynamic_cols": false,
|
||||
"heights_px": [
|
||||
241,
|
||||
330
|
||||
],
|
||||
"widths_px": [
|
||||
1180
|
||||
],
|
||||
"ratios": [
|
||||
0.412,
|
||||
0.564
|
||||
],
|
||||
"width_ratios": [
|
||||
1.0
|
||||
],
|
||||
"step8_step_status": "partial",
|
||||
"step8_pipeline_path_connected": true,
|
||||
"zone_heights_px_planned": [
|
||||
241,
|
||||
330
|
||||
],
|
||||
"zone_widths_px_planned": [
|
||||
1180
|
||||
],
|
||||
"zone_col_ratios_planned": [
|
||||
1.0
|
||||
],
|
||||
"per_zone_layout_shape": [
|
||||
{
|
||||
"position": "top",
|
||||
"min_height_px": null,
|
||||
"frame_cardinality_strict": null,
|
||||
"sub_zones_count": 0,
|
||||
"region_layout_candidates": [
|
||||
"region-single"
|
||||
]
|
||||
},
|
||||
{
|
||||
"position": "bottom",
|
||||
"min_height_px": null,
|
||||
"frame_cardinality_strict": null,
|
||||
"sub_zones_count": 0,
|
||||
"region_layout_candidates": [
|
||||
"region-single"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"05": {
|
||||
"step7_step_status": "partial",
|
||||
"step7_pipeline_path_connected": true,
|
||||
"layout_preset": "horizontal-2",
|
||||
"auto_layout_preset": "horizontal-2",
|
||||
"layout_override_applied": false,
|
||||
"zones_count": 2,
|
||||
"unit_count": 2,
|
||||
"layout_candidates": [
|
||||
"horizontal-2",
|
||||
"vertical-2"
|
||||
],
|
||||
"computation": "min_height_first + content_weight_distribution",
|
||||
"dynamic_rows": true,
|
||||
"dynamic_cols": false,
|
||||
"heights_px": [
|
||||
313,
|
||||
258
|
||||
],
|
||||
"widths_px": [
|
||||
1180
|
||||
],
|
||||
"ratios": [
|
||||
0.535,
|
||||
0.441
|
||||
],
|
||||
"width_ratios": [
|
||||
1.0
|
||||
],
|
||||
"step8_step_status": "partial",
|
||||
"step8_pipeline_path_connected": true,
|
||||
"zone_heights_px_planned": [
|
||||
313,
|
||||
258
|
||||
],
|
||||
"zone_widths_px_planned": [
|
||||
1180
|
||||
],
|
||||
"zone_col_ratios_planned": [
|
||||
1.0
|
||||
],
|
||||
"per_zone_layout_shape": [
|
||||
{
|
||||
"position": "top",
|
||||
"min_height_px": null,
|
||||
"frame_cardinality_strict": null,
|
||||
"sub_zones_count": 0,
|
||||
"region_layout_candidates": [
|
||||
"region-single"
|
||||
]
|
||||
},
|
||||
{
|
||||
"position": "bottom",
|
||||
"min_height_px": null,
|
||||
"frame_cardinality_strict": null,
|
||||
"sub_zones_count": 0,
|
||||
"region_layout_candidates": [
|
||||
"region-single"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,83 +1,99 @@
|
||||
{
|
||||
"_doc": "IMP-91 u6 — F0 normalize axis snapshot (step02_normalized.json). Pins observed current state per [[feedback_validation_first_for_closed_issues]] / Stage 1 'do not invent a new expectation'. step_status='partial' is the schema-lock marker for IMP-02/03 (orphans + details detection unimplemented). adapter_enabled/used=false reflects default-OFF canary (chained adapter trace OFF). asset counts are step02 collection state (popups/images/tables list aggregation in stage0_normalized_assets); they may grow when IMP-03 detection lands and the snapshot will drift loudly.",
|
||||
"01": {
|
||||
"step_num": 2,
|
||||
"step_status": "partial",
|
||||
"pipeline_path_connected": true,
|
||||
"sections_count": 2,
|
||||
"section_ids": ["01-1", "01-2"],
|
||||
"orphans_count": 0,
|
||||
"details_count": 0,
|
||||
"adapter_enabled": false,
|
||||
"adapter_used": false,
|
||||
"assets_popups_count": 0,
|
||||
"assets_images_count": 0,
|
||||
"assets_tables_count": 0,
|
||||
"slide_title_nonempty": true,
|
||||
"slide_footer_nonempty": true
|
||||
},
|
||||
"02": {
|
||||
"step_num": 2,
|
||||
"step_status": "partial",
|
||||
"pipeline_path_connected": true,
|
||||
"sections_count": 2,
|
||||
"section_ids": ["02-1", "02-2"],
|
||||
"orphans_count": 0,
|
||||
"details_count": 0,
|
||||
"adapter_enabled": false,
|
||||
"adapter_used": false,
|
||||
"assets_popups_count": 0,
|
||||
"assets_images_count": 0,
|
||||
"assets_tables_count": 0,
|
||||
"slide_title_nonempty": true,
|
||||
"slide_footer_nonempty": true
|
||||
},
|
||||
"03": {
|
||||
"step_num": 2,
|
||||
"step_status": "partial",
|
||||
"pipeline_path_connected": true,
|
||||
"sections_count": 2,
|
||||
"section_ids": ["03-1", "03-2"],
|
||||
"orphans_count": 0,
|
||||
"details_count": 0,
|
||||
"adapter_enabled": false,
|
||||
"adapter_used": false,
|
||||
"assets_popups_count": 0,
|
||||
"assets_images_count": 0,
|
||||
"assets_tables_count": 0,
|
||||
"slide_title_nonempty": true,
|
||||
"slide_footer_nonempty": true
|
||||
},
|
||||
"04": {
|
||||
"step_num": 2,
|
||||
"step_status": "partial",
|
||||
"pipeline_path_connected": true,
|
||||
"sections_count": 2,
|
||||
"section_ids": ["04-1", "04-2"],
|
||||
"orphans_count": 0,
|
||||
"details_count": 0,
|
||||
"adapter_enabled": false,
|
||||
"adapter_used": false,
|
||||
"assets_popups_count": 0,
|
||||
"assets_images_count": 0,
|
||||
"assets_tables_count": 0,
|
||||
"slide_title_nonempty": true,
|
||||
"slide_footer_nonempty": true
|
||||
},
|
||||
"05": {
|
||||
"step_num": 2,
|
||||
"step_status": "partial",
|
||||
"pipeline_path_connected": true,
|
||||
"sections_count": 2,
|
||||
"section_ids": ["05-1", "05-2"],
|
||||
"orphans_count": 0,
|
||||
"details_count": 0,
|
||||
"adapter_enabled": false,
|
||||
"adapter_used": false,
|
||||
"assets_popups_count": 0,
|
||||
"assets_images_count": 0,
|
||||
"assets_tables_count": 0,
|
||||
"slide_title_nonempty": true,
|
||||
"slide_footer_nonempty": true
|
||||
}
|
||||
"_doc": "IMP-91 u6 — F0 normalize axis snapshot (step02_normalized.json). Pins observed current state per [[feedback_validation_first_for_closed_issues]] / Stage 1 'do not invent a new expectation'. step_status='partial' is the schema-lock marker for IMP-02/03 (orphans + details detection unimplemented). adapter_enabled/used=false reflects default-OFF canary (chained adapter trace OFF). asset counts are step02 collection state (popups/images/tables list aggregation in stage0_normalized_assets); they may grow when IMP-03 detection lands and the snapshot will drift loudly.",
|
||||
"01": {
|
||||
"step_num": 2,
|
||||
"step_status": "partial",
|
||||
"pipeline_path_connected": true,
|
||||
"sections_count": 3,
|
||||
"section_ids": [
|
||||
"01-intro",
|
||||
"01-1",
|
||||
"01-2"
|
||||
],
|
||||
"orphans_count": 0,
|
||||
"details_count": 0,
|
||||
"adapter_enabled": false,
|
||||
"adapter_used": false,
|
||||
"assets_popups_count": 0,
|
||||
"assets_images_count": 0,
|
||||
"assets_tables_count": 0,
|
||||
"slide_title_nonempty": true,
|
||||
"slide_footer_nonempty": true
|
||||
},
|
||||
"02": {
|
||||
"step_num": 2,
|
||||
"step_status": "partial",
|
||||
"pipeline_path_connected": true,
|
||||
"sections_count": 2,
|
||||
"section_ids": [
|
||||
"02-1",
|
||||
"02-2"
|
||||
],
|
||||
"orphans_count": 0,
|
||||
"details_count": 0,
|
||||
"adapter_enabled": false,
|
||||
"adapter_used": false,
|
||||
"assets_popups_count": 0,
|
||||
"assets_images_count": 0,
|
||||
"assets_tables_count": 0,
|
||||
"slide_title_nonempty": true,
|
||||
"slide_footer_nonempty": true
|
||||
},
|
||||
"03": {
|
||||
"step_num": 2,
|
||||
"step_status": "partial",
|
||||
"pipeline_path_connected": true,
|
||||
"sections_count": 2,
|
||||
"section_ids": [
|
||||
"03-1",
|
||||
"03-2"
|
||||
],
|
||||
"orphans_count": 0,
|
||||
"details_count": 0,
|
||||
"adapter_enabled": false,
|
||||
"adapter_used": false,
|
||||
"assets_popups_count": 0,
|
||||
"assets_images_count": 0,
|
||||
"assets_tables_count": 0,
|
||||
"slide_title_nonempty": true,
|
||||
"slide_footer_nonempty": true
|
||||
},
|
||||
"04": {
|
||||
"step_num": 2,
|
||||
"step_status": "partial",
|
||||
"pipeline_path_connected": true,
|
||||
"sections_count": 2,
|
||||
"section_ids": [
|
||||
"04-1",
|
||||
"04-2"
|
||||
],
|
||||
"orphans_count": 0,
|
||||
"details_count": 0,
|
||||
"adapter_enabled": false,
|
||||
"adapter_used": false,
|
||||
"assets_popups_count": 0,
|
||||
"assets_images_count": 0,
|
||||
"assets_tables_count": 0,
|
||||
"slide_title_nonempty": true,
|
||||
"slide_footer_nonempty": true
|
||||
},
|
||||
"05": {
|
||||
"step_num": 2,
|
||||
"step_status": "partial",
|
||||
"pipeline_path_connected": true,
|
||||
"sections_count": 2,
|
||||
"section_ids": [
|
||||
"05-1",
|
||||
"05-2"
|
||||
],
|
||||
"orphans_count": 0,
|
||||
"details_count": 0,
|
||||
"adapter_enabled": false,
|
||||
"adapter_used": false,
|
||||
"assets_popups_count": 0,
|
||||
"assets_images_count": 0,
|
||||
"assets_tables_count": 0,
|
||||
"slide_title_nonempty": true,
|
||||
"slide_footer_nonempty": true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,103 +1,238 @@
|
||||
{
|
||||
"_doc": "IMP-#91 u8 — F2 slot_payload axis. Pins step12_slot_payload.json per_zone structural shape (position / template_id / builder / slot_names / list_slot_counts / dict_slot_sub_counts / string_slot_nonempty) for mdx 01-05. Pins SHAPE not literal content — text edits in MDX won't drift this snapshot, but builder swap / slot rename / missing slot / list-cardinality drift will. __empty__ zones have builder=null and zero slots.",
|
||||
"01": [
|
||||
{
|
||||
"position": "top",
|
||||
"template_id": "bim_dx_comparison_table",
|
||||
"builder": "compare_table_2col",
|
||||
"slot_names": ["col_a_label", "col_b_label", "rows", "title"],
|
||||
"list_slot_counts": {"rows": 2},
|
||||
"dict_slot_sub_counts": {},
|
||||
"string_slot_nonempty": {"col_a_label": false, "col_b_label": false, "title": true}
|
||||
},
|
||||
{
|
||||
"position": "bottom",
|
||||
"template_id": "construction_bim_three_usage",
|
||||
"builder": "quadrant_flat_slots",
|
||||
"slot_names": ["category_1_body", "category_1_label", "category_2_body", "category_2_label", "category_3_body", "category_3_label", "title"],
|
||||
"list_slot_counts": {"category_1_body": 2, "category_2_body": 2, "category_3_body": 2},
|
||||
"dict_slot_sub_counts": {},
|
||||
"string_slot_nonempty": {"category_1_label": true, "category_2_label": true, "category_3_label": true, "title": true}
|
||||
"_doc": "IMP-#91 u8 — F2 slot_payload axis. Pins step12_slot_payload.json per_zone structural shape (position / template_id / builder / slot_names / list_slot_counts / dict_slot_sub_counts / string_slot_nonempty) for mdx 01-05. Pins SHAPE not literal content — text edits in MDX won't drift this snapshot, but builder swap / slot rename / missing slot / list-cardinality drift will. __empty__ zones have builder=null and zero slots.",
|
||||
"01": [
|
||||
{
|
||||
"position": "top",
|
||||
"template_id": "bim_dx_comparison_table",
|
||||
"builder": "compare_table_2col",
|
||||
"slot_names": [
|
||||
"col_a_label",
|
||||
"col_b_label",
|
||||
"rows",
|
||||
"title"
|
||||
],
|
||||
"list_slot_counts": {
|
||||
"rows": 2
|
||||
},
|
||||
"dict_slot_sub_counts": {},
|
||||
"string_slot_nonempty": {
|
||||
"col_a_label": false,
|
||||
"col_b_label": false,
|
||||
"title": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"position": "bottom-left",
|
||||
"template_id": "construction_bim_three_usage",
|
||||
"builder": "quadrant_flat_slots",
|
||||
"slot_names": [
|
||||
"_slot_count",
|
||||
"category_1_body",
|
||||
"category_1_label",
|
||||
"category_2_body",
|
||||
"category_2_label",
|
||||
"category_3_body",
|
||||
"category_3_label",
|
||||
"title"
|
||||
],
|
||||
"list_slot_counts": {
|
||||
"category_1_body": 2,
|
||||
"category_2_body": 3,
|
||||
"category_3_body": 3
|
||||
},
|
||||
"dict_slot_sub_counts": {},
|
||||
"string_slot_nonempty": {
|
||||
"category_1_label": true,
|
||||
"category_2_label": true,
|
||||
"category_3_label": true,
|
||||
"title": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"position": "bottom-right",
|
||||
"template_id": "bim_dx_comparison_table",
|
||||
"builder": "compare_table_2col",
|
||||
"slot_names": [
|
||||
"col_a_label",
|
||||
"col_b_label",
|
||||
"rows",
|
||||
"title"
|
||||
],
|
||||
"list_slot_counts": {
|
||||
"rows": 1
|
||||
},
|
||||
"dict_slot_sub_counts": {},
|
||||
"string_slot_nonempty": {
|
||||
"col_a_label": false,
|
||||
"col_b_label": false,
|
||||
"title": true
|
||||
}
|
||||
}
|
||||
],
|
||||
"02": [
|
||||
{
|
||||
"position": "top",
|
||||
"template_id": "three_parallel_requirements",
|
||||
"builder": "items_with_role",
|
||||
"slot_names": [
|
||||
"pillars",
|
||||
"title"
|
||||
],
|
||||
"list_slot_counts": {
|
||||
"pillars": 3
|
||||
},
|
||||
"dict_slot_sub_counts": {},
|
||||
"string_slot_nonempty": {
|
||||
"title": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"position": "bottom",
|
||||
"template_id": "three_persona_benefits",
|
||||
"builder": "items_with_role",
|
||||
"slot_names": [
|
||||
"intro_sections",
|
||||
"personas",
|
||||
"slot_mapping_trace",
|
||||
"title"
|
||||
],
|
||||
"list_slot_counts": {
|
||||
"intro_sections": 2,
|
||||
"personas": 3
|
||||
},
|
||||
"dict_slot_sub_counts": {
|
||||
"slot_mapping_trace": {
|
||||
"persona_role_labels": 3
|
||||
}
|
||||
],
|
||||
"02": [
|
||||
{
|
||||
"position": "top",
|
||||
"template_id": "construction_goals_three_circle_intersection",
|
||||
"builder": "cycle_intersect_3",
|
||||
"slot_names": ["circle_1_label", "circle_2_label", "circle_3_label", "intersection", "title"],
|
||||
"list_slot_counts": {},
|
||||
"dict_slot_sub_counts": {},
|
||||
"string_slot_nonempty": {"circle_1_label": true, "circle_2_label": true, "circle_3_label": true, "intersection": false, "title": true}
|
||||
},
|
||||
{
|
||||
"position": "bottom",
|
||||
"template_id": "__empty__",
|
||||
"builder": null,
|
||||
"slot_names": [],
|
||||
"list_slot_counts": {},
|
||||
"dict_slot_sub_counts": {},
|
||||
"string_slot_nonempty": {}
|
||||
}
|
||||
],
|
||||
"03": [
|
||||
{
|
||||
"position": "left",
|
||||
"template_id": "three_parallel_requirements",
|
||||
"builder": "items_with_role",
|
||||
"slot_names": ["pillars", "title"],
|
||||
"list_slot_counts": {"pillars": 3},
|
||||
"dict_slot_sub_counts": {},
|
||||
"string_slot_nonempty": {"title": true}
|
||||
},
|
||||
{
|
||||
"position": "right",
|
||||
"template_id": "process_product_two_way",
|
||||
"builder": "process_product_pair",
|
||||
"slot_names": ["banner_left", "banner_right", "process", "product", "title"],
|
||||
"list_slot_counts": {},
|
||||
"dict_slot_sub_counts": {"process": {"sections": 3}, "product": {"sections": 3}},
|
||||
"string_slot_nonempty": {"banner_left": true, "banner_right": true, "title": true}
|
||||
}
|
||||
],
|
||||
"04": [
|
||||
{
|
||||
"position": "top",
|
||||
"template_id": "bim_issues_quadrant_four",
|
||||
"builder": "quadrant_flat_slots",
|
||||
"slot_names": ["quadrant_1_body", "quadrant_1_label", "quadrant_2_body", "quadrant_2_label", "quadrant_3_body", "quadrant_3_label", "quadrant_4_body", "quadrant_4_label", "title"],
|
||||
"list_slot_counts": {"quadrant_1_body": 2, "quadrant_2_body": 2, "quadrant_3_body": 2, "quadrant_4_body": 2},
|
||||
"dict_slot_sub_counts": {},
|
||||
"string_slot_nonempty": {"quadrant_1_label": true, "quadrant_2_label": true, "quadrant_3_label": true, "quadrant_4_label": true, "title": true}
|
||||
},
|
||||
{
|
||||
"position": "bottom-left",
|
||||
"template_id": "__empty__",
|
||||
"builder": null,
|
||||
"slot_names": [],
|
||||
"list_slot_counts": {},
|
||||
"dict_slot_sub_counts": {},
|
||||
"string_slot_nonempty": {}
|
||||
},
|
||||
{
|
||||
"position": "bottom-right",
|
||||
"template_id": "__empty__",
|
||||
"builder": null,
|
||||
"slot_names": [],
|
||||
"list_slot_counts": {},
|
||||
"dict_slot_sub_counts": {},
|
||||
"string_slot_nonempty": {}
|
||||
}
|
||||
],
|
||||
"05": [
|
||||
{
|
||||
"position": "primary",
|
||||
"template_id": "__empty__",
|
||||
"builder": null,
|
||||
"slot_names": [],
|
||||
"list_slot_counts": {},
|
||||
"dict_slot_sub_counts": {},
|
||||
"string_slot_nonempty": {}
|
||||
}
|
||||
]
|
||||
},
|
||||
"string_slot_nonempty": {
|
||||
"title": true
|
||||
}
|
||||
}
|
||||
],
|
||||
"03": [
|
||||
{
|
||||
"position": "left",
|
||||
"template_id": "three_parallel_requirements",
|
||||
"builder": "items_with_role",
|
||||
"slot_names": [
|
||||
"pillars",
|
||||
"title"
|
||||
],
|
||||
"list_slot_counts": {
|
||||
"pillars": 3
|
||||
},
|
||||
"dict_slot_sub_counts": {},
|
||||
"string_slot_nonempty": {
|
||||
"title": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"position": "right",
|
||||
"template_id": "bim_dx_comparison_table",
|
||||
"builder": "compare_table_2col",
|
||||
"slot_names": [
|
||||
"col_a_label",
|
||||
"col_b_label",
|
||||
"rows",
|
||||
"title"
|
||||
],
|
||||
"list_slot_counts": {
|
||||
"rows": 8
|
||||
},
|
||||
"dict_slot_sub_counts": {},
|
||||
"string_slot_nonempty": {
|
||||
"col_a_label": false,
|
||||
"col_b_label": false,
|
||||
"title": true
|
||||
}
|
||||
}
|
||||
],
|
||||
"04": [
|
||||
{
|
||||
"position": "top",
|
||||
"template_id": "pre_construction_model_info_stacked",
|
||||
"builder": "quadrant_flat_slots",
|
||||
"slot_names": [
|
||||
"_slot_count",
|
||||
"pill_1_body",
|
||||
"pill_1_label",
|
||||
"pill_2_body",
|
||||
"pill_2_label",
|
||||
"pill_3_body",
|
||||
"pill_3_label",
|
||||
"pill_4_body",
|
||||
"pill_4_label",
|
||||
"pill_5_body",
|
||||
"pill_5_label",
|
||||
"title"
|
||||
],
|
||||
"list_slot_counts": {
|
||||
"pill_1_body": 4,
|
||||
"pill_2_body": 4,
|
||||
"pill_3_body": 4,
|
||||
"pill_4_body": 4,
|
||||
"pill_5_body": 4
|
||||
},
|
||||
"dict_slot_sub_counts": {},
|
||||
"string_slot_nonempty": {
|
||||
"pill_1_label": true,
|
||||
"pill_2_label": true,
|
||||
"pill_3_label": true,
|
||||
"pill_4_label": true,
|
||||
"pill_5_label": true,
|
||||
"title": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"position": "bottom",
|
||||
"template_id": "three_parallel_requirements",
|
||||
"builder": "items_with_role",
|
||||
"slot_names": [
|
||||
"pillars",
|
||||
"title"
|
||||
],
|
||||
"list_slot_counts": {
|
||||
"pillars": 2
|
||||
},
|
||||
"dict_slot_sub_counts": {},
|
||||
"string_slot_nonempty": {
|
||||
"title": true
|
||||
}
|
||||
}
|
||||
],
|
||||
"05": [
|
||||
{
|
||||
"position": "top",
|
||||
"template_id": "three_parallel_requirements",
|
||||
"builder": "items_with_role",
|
||||
"slot_names": [
|
||||
"pillars",
|
||||
"title"
|
||||
],
|
||||
"list_slot_counts": {
|
||||
"pillars": 3
|
||||
},
|
||||
"dict_slot_sub_counts": {},
|
||||
"string_slot_nonempty": {
|
||||
"title": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"position": "bottom",
|
||||
"template_id": "three_parallel_requirements",
|
||||
"builder": "items_with_role",
|
||||
"slot_names": [
|
||||
"pillars",
|
||||
"title"
|
||||
],
|
||||
"list_slot_counts": {
|
||||
"pillars": 2
|
||||
},
|
||||
"dict_slot_sub_counts": {},
|
||||
"string_slot_nonempty": {
|
||||
"title": true
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,43 +1,77 @@
|
||||
{
|
||||
"_doc": "IMP-#91 u3 structural snapshot — pins observed step20 overall + step09 per-zone selected_template_id per mdx in the 01-05 acceptance set. Each entry is fresh-run evidence (not aspirational). Update only when an intentional pipeline change moves the observed value; treat unexplained drift as regression. [[feedback_validation_first_for_closed_issues]] [[feedback_artifact_status_naming]]",
|
||||
"01": {
|
||||
"overall": "PASS",
|
||||
"zone_count": 2,
|
||||
"zones": [
|
||||
{"position": "top", "selected_template_id": "bim_dx_comparison_table"},
|
||||
{"position": "bottom", "selected_template_id": "construction_bim_three_usage"}
|
||||
]
|
||||
},
|
||||
"02": {
|
||||
"overall": "PASS",
|
||||
"zone_count": 2,
|
||||
"zones": [
|
||||
{"position": "top", "selected_template_id": "construction_goals_three_circle_intersection"},
|
||||
{"position": "bottom", "selected_template_id": "three_persona_benefits"}
|
||||
]
|
||||
},
|
||||
"03": {
|
||||
"overall": "PASS",
|
||||
"zone_count": 2,
|
||||
"zones": [
|
||||
{"position": "left", "selected_template_id": "three_parallel_requirements"},
|
||||
{"position": "right", "selected_template_id": "process_product_two_way"}
|
||||
]
|
||||
},
|
||||
"04": {
|
||||
"overall": "PASS",
|
||||
"zone_count": 3,
|
||||
"zones": [
|
||||
{"position": "top", "selected_template_id": "bim_issues_quadrant_four"},
|
||||
{"position": "bottom-left", "selected_template_id": "sw_dependency_four_problems"},
|
||||
{"position": "bottom-right", "selected_template_id": "pre_construction_model_info_stacked"}
|
||||
]
|
||||
},
|
||||
"05": {
|
||||
"overall": "EMPTY_SHELL_NO_CONTENT",
|
||||
"zone_count": 1,
|
||||
"zones": [
|
||||
{"position": "primary", "selected_template_id": "__empty__"}
|
||||
]
|
||||
}
|
||||
"_doc": "IMP-#91 u3 structural snapshot — pins observed step20 overall + step09 per-zone selected_template_id per mdx in the 01-05 acceptance set. Each entry is fresh-run evidence (not aspirational). Update only when an intentional pipeline change moves the observed value; treat unexplained drift as regression. [[feedback_validation_first_for_closed_issues]] [[feedback_artifact_status_naming]]",
|
||||
"01": {
|
||||
"overall": "PASS",
|
||||
"zone_count": 3,
|
||||
"zones": [
|
||||
{
|
||||
"position": "top",
|
||||
"selected_template_id": null
|
||||
},
|
||||
{
|
||||
"position": "bottom-left",
|
||||
"selected_template_id": null
|
||||
},
|
||||
{
|
||||
"position": "bottom-right",
|
||||
"selected_template_id": null
|
||||
}
|
||||
]
|
||||
},
|
||||
"02": {
|
||||
"overall": "PARTIAL_COVERAGE",
|
||||
"zone_count": 2,
|
||||
"zones": [
|
||||
{
|
||||
"position": "top",
|
||||
"selected_template_id": null
|
||||
},
|
||||
{
|
||||
"position": "bottom",
|
||||
"selected_template_id": null
|
||||
}
|
||||
]
|
||||
},
|
||||
"03": {
|
||||
"overall": "PASS",
|
||||
"zone_count": 2,
|
||||
"zones": [
|
||||
{
|
||||
"position": "left",
|
||||
"selected_template_id": null
|
||||
},
|
||||
{
|
||||
"position": "right",
|
||||
"selected_template_id": null
|
||||
}
|
||||
]
|
||||
},
|
||||
"04": {
|
||||
"overall": "PARTIAL_COVERAGE",
|
||||
"zone_count": 2,
|
||||
"zones": [
|
||||
{
|
||||
"position": "top",
|
||||
"selected_template_id": null
|
||||
},
|
||||
{
|
||||
"position": "bottom",
|
||||
"selected_template_id": null
|
||||
}
|
||||
]
|
||||
},
|
||||
"05": {
|
||||
"overall": "PARTIAL_COVERAGE",
|
||||
"zone_count": 2,
|
||||
"zones": [
|
||||
{
|
||||
"position": "top",
|
||||
"selected_template_id": null
|
||||
},
|
||||
{
|
||||
"position": "bottom",
|
||||
"selected_template_id": null
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,112 +1,395 @@
|
||||
{
|
||||
"_doc": "IMP-91 u7 — F1 V4 ranking observed snapshot (step05_v4_evidence). Pins v4_source (POSIX-normalized), aligned_section_ids, and per-section {section_id, candidate_status, candidates: [{template_id, label, confidence}]}. confidence kept at current 4-decimal rounding. Sections appear in pipeline-emitted order.",
|
||||
"01": {
|
||||
"v4_source": "tests/matching/v4_full32_result.yaml",
|
||||
"aligned_section_ids": ["01-1", "01-2"],
|
||||
"sections": [
|
||||
{
|
||||
"section_id": "01-1",
|
||||
"candidate_status": "ok",
|
||||
"candidates": [
|
||||
{"template_id": "construction_bim_three_usage", "label": "use_as_is", "confidence": 0.9101},
|
||||
{"template_id": "construction_goals_three_circle_intersection", "label": "light_edit", "confidence": 0.8261},
|
||||
{"template_id": "dx_sw_necessity_three_perspectives", "label": "light_edit", "confidence": 0.8168}
|
||||
]
|
||||
},
|
||||
{
|
||||
"section_id": "01-2",
|
||||
"candidate_status": "ok",
|
||||
"candidates": [
|
||||
{"template_id": "bim_dx_comparison_table", "label": "use_as_is", "confidence": 0.9459},
|
||||
{"template_id": "app_sw_package_vs_solution", "label": "restructure", "confidence": 0.6813}
|
||||
]
|
||||
}
|
||||
"_doc": "IMP-91 u7 — F1 V4 ranking observed snapshot (step05_v4_evidence). Pins v4_source (POSIX-normalized), aligned_section_ids, and per-section {section_id, candidate_status, candidates: [{template_id, label, confidence}]}. confidence kept at current 4-decimal rounding. Sections appear in pipeline-emitted order.",
|
||||
"01": {
|
||||
"v4_source": "tests/matching/v4_full32_result.yaml",
|
||||
"aligned_section_ids": [
|
||||
"01-intro",
|
||||
"01-1",
|
||||
"01-2"
|
||||
],
|
||||
"sections": [
|
||||
{
|
||||
"section_id": "01-intro",
|
||||
"candidate_status": "no_non_reject_v4_candidate",
|
||||
"candidates": [
|
||||
{
|
||||
"template_id": "compensation_complaint_map",
|
||||
"label": "reject",
|
||||
"confidence": 0.651
|
||||
},
|
||||
{
|
||||
"template_id": "construction_bim_three_usage",
|
||||
"label": "reject",
|
||||
"confidence": 0.4696
|
||||
},
|
||||
{
|
||||
"template_id": "engn_sw_three_types",
|
||||
"label": "reject",
|
||||
"confidence": 0.4047
|
||||
},
|
||||
{
|
||||
"template_id": "bim_adoption_central_split",
|
||||
"label": "reject",
|
||||
"confidence": 0.3994
|
||||
},
|
||||
{
|
||||
"template_id": "bim_dx_comparison_table",
|
||||
"label": "reject",
|
||||
"confidence": 0.374
|
||||
},
|
||||
{
|
||||
"template_id": "construction_goals_three_circle_intersection",
|
||||
"label": "reject",
|
||||
"confidence": 0.3418
|
||||
}
|
||||
]
|
||||
},
|
||||
"02": {
|
||||
"v4_source": "tests/matching/v4_full32_result.yaml",
|
||||
"aligned_section_ids": ["02-1", "02-2-sub-1", "02-2-sub-2"],
|
||||
"sections": [
|
||||
{
|
||||
"section_id": "02-1",
|
||||
"candidate_status": "ok",
|
||||
"candidates": [
|
||||
{"template_id": "construction_goals_three_circle_intersection", "label": "use_as_is", "confidence": 0.914}
|
||||
]
|
||||
},
|
||||
{
|
||||
"section_id": "02-2-sub-1",
|
||||
"candidate_status": "no_non_reject_v4_candidate",
|
||||
"candidates": []
|
||||
},
|
||||
{
|
||||
"section_id": "02-2-sub-2",
|
||||
"candidate_status": "no_non_reject_v4_candidate",
|
||||
"candidates": []
|
||||
}
|
||||
},
|
||||
{
|
||||
"section_id": "01-1",
|
||||
"candidate_status": "ok",
|
||||
"candidates": [
|
||||
{
|
||||
"template_id": "construction_bim_three_usage",
|
||||
"label": "use_as_is",
|
||||
"confidence": 0.9101
|
||||
},
|
||||
{
|
||||
"template_id": "construction_goals_three_circle_intersection",
|
||||
"label": "light_edit",
|
||||
"confidence": 0.8261
|
||||
},
|
||||
{
|
||||
"template_id": "dx_sw_necessity_three_perspectives",
|
||||
"label": "light_edit",
|
||||
"confidence": 0.8168
|
||||
},
|
||||
{
|
||||
"template_id": "model_specialized_engn_sw",
|
||||
"label": "restructure",
|
||||
"confidence": 0.749
|
||||
},
|
||||
{
|
||||
"template_id": "three_parallel_requirements",
|
||||
"label": "reject",
|
||||
"confidence": 0.7402
|
||||
},
|
||||
{
|
||||
"template_id": "info_management_what_how_when",
|
||||
"label": "reject",
|
||||
"confidence": 0.7395
|
||||
}
|
||||
]
|
||||
},
|
||||
"03": {
|
||||
"v4_source": "tests/matching/v4_full32_result.yaml",
|
||||
"aligned_section_ids": ["03-1", "03-2"],
|
||||
"sections": [
|
||||
{
|
||||
"section_id": "03-1",
|
||||
"candidate_status": "ok",
|
||||
"candidates": [
|
||||
{"template_id": "three_parallel_requirements", "label": "use_as_is", "confidence": 0.9268},
|
||||
{"template_id": "dx_sw_necessity_three_perspectives", "label": "light_edit", "confidence": 0.8413}
|
||||
]
|
||||
},
|
||||
{
|
||||
"section_id": "03-2",
|
||||
"candidate_status": "ok",
|
||||
"candidates": [
|
||||
{"template_id": "process_product_two_way", "label": "use_as_is", "confidence": 0.9198}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"section_id": "01-2",
|
||||
"candidate_status": "ok",
|
||||
"candidates": [
|
||||
{
|
||||
"template_id": "bim_dx_comparison_table",
|
||||
"label": "use_as_is",
|
||||
"confidence": 0.9459
|
||||
},
|
||||
{
|
||||
"template_id": "process_product_two_way",
|
||||
"label": "reject",
|
||||
"confidence": 0.8675
|
||||
},
|
||||
{
|
||||
"template_id": "engn_sw_three_types",
|
||||
"label": "light_edit",
|
||||
"confidence": 0.7571
|
||||
},
|
||||
{
|
||||
"template_id": "app_sw_package_vs_solution",
|
||||
"label": "restructure",
|
||||
"confidence": 0.6813
|
||||
},
|
||||
{
|
||||
"template_id": "bim_adoption_central_split",
|
||||
"label": "restructure",
|
||||
"confidence": 0.6455
|
||||
},
|
||||
{
|
||||
"template_id": "industry_characteristics_three_col",
|
||||
"label": "reject",
|
||||
"confidence": 0.5781
|
||||
}
|
||||
]
|
||||
},
|
||||
"04": {
|
||||
"v4_source": "tests/matching/v4_full32_result.yaml",
|
||||
"aligned_section_ids": ["04-1", "04-2-sub-1", "04-2-sub-2"],
|
||||
"sections": [
|
||||
{
|
||||
"section_id": "04-1",
|
||||
"candidate_status": "no_non_reject_v4_candidate",
|
||||
"candidates": []
|
||||
},
|
||||
{
|
||||
"section_id": "04-2-sub-1",
|
||||
"candidate_status": "no_non_reject_v4_candidate",
|
||||
"candidates": []
|
||||
},
|
||||
{
|
||||
"section_id": "04-2-sub-2",
|
||||
"candidate_status": "no_non_reject_v4_candidate",
|
||||
"candidates": []
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"02": {
|
||||
"v4_source": "tests/matching/v4_full32_result.yaml",
|
||||
"aligned_section_ids": [
|
||||
"02-1",
|
||||
"02-2-sub-1",
|
||||
"02-2-sub-2"
|
||||
],
|
||||
"sections": [
|
||||
{
|
||||
"section_id": "02-1",
|
||||
"candidate_status": "ok",
|
||||
"candidates": [
|
||||
{
|
||||
"template_id": "construction_goals_three_circle_intersection",
|
||||
"label": "use_as_is",
|
||||
"confidence": 0.914
|
||||
},
|
||||
{
|
||||
"template_id": "three_persona_benefits",
|
||||
"label": "reject",
|
||||
"confidence": 0.7656
|
||||
},
|
||||
{
|
||||
"template_id": "dx_sw_necessity_three_perspectives",
|
||||
"label": "reject",
|
||||
"confidence": 0.7512
|
||||
},
|
||||
{
|
||||
"template_id": "model_specialized_engn_sw",
|
||||
"label": "reject",
|
||||
"confidence": 0.7267
|
||||
},
|
||||
{
|
||||
"template_id": "solution_engn_split_diagram",
|
||||
"label": "restructure",
|
||||
"confidence": 0.724
|
||||
},
|
||||
{
|
||||
"template_id": "three_parallel_requirements",
|
||||
"label": "reject",
|
||||
"confidence": 0.6517
|
||||
}
|
||||
]
|
||||
},
|
||||
"05": {
|
||||
"v4_source": "tests/matching/v4_full32_result.yaml",
|
||||
"aligned_section_ids": ["05-1", "05-2-sub-1", "05-2-sub-2"],
|
||||
"sections": [
|
||||
{
|
||||
"section_id": "05-1",
|
||||
"candidate_status": "no_non_reject_v4_candidate",
|
||||
"candidates": []
|
||||
},
|
||||
{
|
||||
"section_id": "05-2-sub-1",
|
||||
"candidate_status": "no_non_reject_v4_candidate",
|
||||
"candidates": []
|
||||
},
|
||||
{
|
||||
"section_id": "05-2-sub-2",
|
||||
"candidate_status": "no_non_reject_v4_candidate",
|
||||
"candidates": []
|
||||
}
|
||||
},
|
||||
{
|
||||
"section_id": "02-2-sub-1",
|
||||
"candidate_status": "no_non_reject_v4_candidate",
|
||||
"candidates": []
|
||||
},
|
||||
{
|
||||
"section_id": "02-2-sub-2",
|
||||
"candidate_status": "ok",
|
||||
"candidates": []
|
||||
}
|
||||
]
|
||||
},
|
||||
"03": {
|
||||
"v4_source": "tests/matching/v4_full32_result.yaml",
|
||||
"aligned_section_ids": [
|
||||
"03-1",
|
||||
"03-2"
|
||||
],
|
||||
"sections": [
|
||||
{
|
||||
"section_id": "03-1",
|
||||
"candidate_status": "ok",
|
||||
"candidates": [
|
||||
{
|
||||
"template_id": "three_parallel_requirements",
|
||||
"label": "use_as_is",
|
||||
"confidence": 0.9268
|
||||
},
|
||||
{
|
||||
"template_id": "dx_sw_necessity_three_perspectives",
|
||||
"label": "light_edit",
|
||||
"confidence": 0.8413
|
||||
},
|
||||
{
|
||||
"template_id": "sw_reality_three_emphasis",
|
||||
"label": "reject",
|
||||
"confidence": 0.7203
|
||||
},
|
||||
{
|
||||
"template_id": "solution_engn_split_diagram",
|
||||
"label": "reject",
|
||||
"confidence": 0.6631
|
||||
},
|
||||
{
|
||||
"template_id": "three_persona_benefits",
|
||||
"label": "reject",
|
||||
"confidence": 0.6548
|
||||
},
|
||||
{
|
||||
"template_id": "industry_current_status_three_col",
|
||||
"label": "reject",
|
||||
"confidence": 0.6048
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"section_id": "03-2",
|
||||
"candidate_status": "ok",
|
||||
"candidates": [
|
||||
{
|
||||
"template_id": "process_product_two_way",
|
||||
"label": "use_as_is",
|
||||
"confidence": 0.9198
|
||||
},
|
||||
{
|
||||
"template_id": "bim_dx_comparison_table",
|
||||
"label": "reject",
|
||||
"confidence": 0.8138
|
||||
},
|
||||
{
|
||||
"template_id": "app_sw_package_vs_solution",
|
||||
"label": "reject",
|
||||
"confidence": 0.6467
|
||||
},
|
||||
{
|
||||
"template_id": "engn_sw_three_types",
|
||||
"label": "reject",
|
||||
"confidence": 0.6396
|
||||
},
|
||||
{
|
||||
"template_id": "bim_adoption_central_split",
|
||||
"label": "restructure",
|
||||
"confidence": 0.6278
|
||||
},
|
||||
{
|
||||
"template_id": "industry_current_status_three_col",
|
||||
"label": "reject",
|
||||
"confidence": 0.5324
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"04": {
|
||||
"v4_source": "tests/matching/v4_full32_result.yaml",
|
||||
"aligned_section_ids": [
|
||||
"04-1",
|
||||
"04-2-sub-1",
|
||||
"04-2-sub-2"
|
||||
],
|
||||
"sections": [
|
||||
{
|
||||
"section_id": "04-1",
|
||||
"candidate_status": "no_non_reject_v4_candidate",
|
||||
"candidates": [
|
||||
{
|
||||
"template_id": "pre_construction_model_info_stacked",
|
||||
"label": "reject",
|
||||
"confidence": 0.7114
|
||||
},
|
||||
{
|
||||
"template_id": "field_effectiveness_five_elements",
|
||||
"label": "reject",
|
||||
"confidence": 0.6453
|
||||
},
|
||||
{
|
||||
"template_id": "policy_achievement_five_goals",
|
||||
"label": "reject",
|
||||
"confidence": 0.6412
|
||||
},
|
||||
{
|
||||
"template_id": "compensation_complaint_side_card",
|
||||
"label": "reject",
|
||||
"confidence": 0.5946
|
||||
},
|
||||
{
|
||||
"template_id": "solution_engn_split_diagram",
|
||||
"label": "reject",
|
||||
"confidence": 0.4588
|
||||
},
|
||||
{
|
||||
"template_id": "model_specialized_engn_sw",
|
||||
"label": "reject",
|
||||
"confidence": 0.4502
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"section_id": "04-2-sub-1",
|
||||
"candidate_status": "no_non_reject_v4_candidate",
|
||||
"candidates": []
|
||||
},
|
||||
{
|
||||
"section_id": "04-2-sub-2",
|
||||
"candidate_status": "ok",
|
||||
"candidates": []
|
||||
}
|
||||
]
|
||||
},
|
||||
"05": {
|
||||
"v4_source": "tests/matching/v4_full32_result.yaml",
|
||||
"aligned_section_ids": [
|
||||
"05-1",
|
||||
"05-2"
|
||||
],
|
||||
"sections": [
|
||||
{
|
||||
"section_id": "05-1",
|
||||
"candidate_status": "ok",
|
||||
"candidates": [
|
||||
{
|
||||
"template_id": "dx_sw_necessity_three_perspectives",
|
||||
"label": "light_edit",
|
||||
"confidence": 0.77
|
||||
},
|
||||
{
|
||||
"template_id": "model_specialized_engn_sw",
|
||||
"label": "restructure",
|
||||
"confidence": 0.7333
|
||||
},
|
||||
{
|
||||
"template_id": "sw_reality_three_emphasis",
|
||||
"label": "reject",
|
||||
"confidence": 0.7265
|
||||
},
|
||||
{
|
||||
"template_id": "three_parallel_requirements",
|
||||
"label": "reject",
|
||||
"confidence": 0.7198
|
||||
},
|
||||
{
|
||||
"template_id": "solution_engn_split_diagram",
|
||||
"label": "restructure",
|
||||
"confidence": 0.7011
|
||||
},
|
||||
{
|
||||
"template_id": "industry_characteristics_three_col",
|
||||
"label": "reject",
|
||||
"confidence": 0.6693
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"section_id": "05-2",
|
||||
"candidate_status": "no_non_reject_v4_candidate",
|
||||
"candidates": [
|
||||
{
|
||||
"template_id": "compensation_complaint_map",
|
||||
"label": "reject",
|
||||
"confidence": 0.5526
|
||||
},
|
||||
{
|
||||
"template_id": "design_method_distortion_three_col",
|
||||
"label": "reject",
|
||||
"confidence": 0.3993
|
||||
},
|
||||
{
|
||||
"template_id": "engn_sw_three_types",
|
||||
"label": "reject",
|
||||
"confidence": 0.3487
|
||||
},
|
||||
{
|
||||
"template_id": "bigroom_system_components",
|
||||
"label": "reject",
|
||||
"confidence": 0.3364
|
||||
},
|
||||
{
|
||||
"template_id": "sw_dependency_four_problems",
|
||||
"label": "reject",
|
||||
"confidence": 0.2968
|
||||
},
|
||||
{
|
||||
"template_id": "app_sw_package_vs_solution",
|
||||
"label": "reject",
|
||||
"confidence": 0.2555
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,48 +1,104 @@
|
||||
{
|
||||
"_doc": "u4 — pin observed step14_visual_check overflow/clip per mdx 01-05. Fresh subprocess observation per [[feedback_validation_first_for_closed_issues]]; drift surfaces visual regression (overflow / clip) loudly per [[feedback_artifact_status_naming]] 3-axis honesty. Snapshot pinned to current-state, not to invented expectation (Stage 1 scope-lock).",
|
||||
"01": {
|
||||
"slide_overflowed": false,
|
||||
"slide_body_overflowed": false,
|
||||
"passed": true,
|
||||
"zones": [
|
||||
{"position": "top", "template_id": "bim_dx_comparison_table", "overflowed": false, "clipped_inner_count": 0},
|
||||
{"position": "bottom", "template_id": "construction_bim_three_usage", "overflowed": false, "clipped_inner_count": 0}
|
||||
]
|
||||
},
|
||||
"02": {
|
||||
"slide_overflowed": false,
|
||||
"slide_body_overflowed": false,
|
||||
"passed": true,
|
||||
"zones": [
|
||||
{"position": "top", "template_id": "construction_goals_three_circle_intersection", "overflowed": false, "clipped_inner_count": 0},
|
||||
{"position": "bottom", "template_id": "__empty__", "overflowed": false, "clipped_inner_count": 0}
|
||||
]
|
||||
},
|
||||
"03": {
|
||||
"slide_overflowed": false,
|
||||
"slide_body_overflowed": false,
|
||||
"passed": true,
|
||||
"zones": [
|
||||
{"position": "left", "template_id": "three_parallel_requirements", "overflowed": false, "clipped_inner_count": 0},
|
||||
{"position": "right", "template_id": "process_product_two_way", "overflowed": false, "clipped_inner_count": 0}
|
||||
]
|
||||
},
|
||||
"04": {
|
||||
"slide_overflowed": false,
|
||||
"slide_body_overflowed": false,
|
||||
"passed": true,
|
||||
"zones": [
|
||||
{"position": "top", "template_id": "bim_issues_quadrant_four", "overflowed": false, "clipped_inner_count": 0},
|
||||
{"position": "bottom-left", "template_id": "__empty__", "overflowed": false, "clipped_inner_count": 0},
|
||||
{"position": "bottom-right", "template_id": "__empty__", "overflowed": false, "clipped_inner_count": 0}
|
||||
]
|
||||
},
|
||||
"05": {
|
||||
"slide_overflowed": false,
|
||||
"slide_body_overflowed": false,
|
||||
"passed": true,
|
||||
"zones": [
|
||||
{"position": "primary", "template_id": "__empty__", "overflowed": false, "clipped_inner_count": 0}
|
||||
]
|
||||
}
|
||||
"_doc": "u4 — pin observed step14_visual_check overflow/clip per mdx 01-05. Fresh subprocess observation per [[feedback_validation_first_for_closed_issues]]; drift surfaces visual regression (overflow / clip) loudly per [[feedback_artifact_status_naming]] 3-axis honesty. Snapshot pinned to current-state, not to invented expectation (Stage 1 scope-lock).",
|
||||
"01": {
|
||||
"slide_overflowed": false,
|
||||
"slide_body_overflowed": false,
|
||||
"passed": true,
|
||||
"zones": [
|
||||
{
|
||||
"position": "top",
|
||||
"template_id": "bim_dx_comparison_table",
|
||||
"overflowed": false,
|
||||
"clipped_inner_count": 0
|
||||
},
|
||||
{
|
||||
"position": "bottom-left",
|
||||
"template_id": "construction_bim_three_usage",
|
||||
"overflowed": false,
|
||||
"clipped_inner_count": 0
|
||||
},
|
||||
{
|
||||
"position": "bottom-right",
|
||||
"template_id": "bim_dx_comparison_table",
|
||||
"overflowed": false,
|
||||
"clipped_inner_count": 0
|
||||
}
|
||||
]
|
||||
},
|
||||
"02": {
|
||||
"slide_overflowed": false,
|
||||
"slide_body_overflowed": false,
|
||||
"passed": true,
|
||||
"zones": [
|
||||
{
|
||||
"position": "top",
|
||||
"template_id": "three_parallel_requirements",
|
||||
"overflowed": false,
|
||||
"clipped_inner_count": 0
|
||||
},
|
||||
{
|
||||
"position": "bottom",
|
||||
"template_id": "three_persona_benefits",
|
||||
"overflowed": false,
|
||||
"clipped_inner_count": 0
|
||||
}
|
||||
]
|
||||
},
|
||||
"03": {
|
||||
"slide_overflowed": false,
|
||||
"slide_body_overflowed": false,
|
||||
"passed": true,
|
||||
"zones": [
|
||||
{
|
||||
"position": "left",
|
||||
"template_id": "three_parallel_requirements",
|
||||
"overflowed": false,
|
||||
"clipped_inner_count": 0
|
||||
},
|
||||
{
|
||||
"position": "right",
|
||||
"template_id": "bim_dx_comparison_table",
|
||||
"overflowed": false,
|
||||
"clipped_inner_count": 0
|
||||
}
|
||||
]
|
||||
},
|
||||
"04": {
|
||||
"slide_overflowed": false,
|
||||
"slide_body_overflowed": false,
|
||||
"passed": false,
|
||||
"zones": [
|
||||
{
|
||||
"position": "top",
|
||||
"template_id": "pre_construction_model_info_stacked",
|
||||
"overflowed": false,
|
||||
"clipped_inner_count": 0
|
||||
},
|
||||
{
|
||||
"position": "bottom",
|
||||
"template_id": "three_parallel_requirements",
|
||||
"overflowed": false,
|
||||
"clipped_inner_count": 2
|
||||
}
|
||||
]
|
||||
},
|
||||
"05": {
|
||||
"slide_overflowed": false,
|
||||
"slide_body_overflowed": false,
|
||||
"passed": true,
|
||||
"zones": [
|
||||
{
|
||||
"position": "top",
|
||||
"template_id": "three_parallel_requirements",
|
||||
"overflowed": false,
|
||||
"clipped_inner_count": 0
|
||||
},
|
||||
{
|
||||
"position": "bottom",
|
||||
"template_id": "three_parallel_requirements",
|
||||
"overflowed": false,
|
||||
"clipped_inner_count": 0
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,257 @@
|
||||
"""IMP-91 스냅샷 재생성 절차 (GitHub issue #29).
|
||||
|
||||
structural.json 의 _doc 계약: "Update only when an intentional pipeline
|
||||
change moves the observed value" — 의도적 변경 후 이 스크립트로 갱신한다.
|
||||
테스트 모듈의 실행 함수(run_pipeline_for_snapshot — AI OFF 강제)와 shape
|
||||
헬퍼(_slot_payload_zone_shape 등)를 그대로 import 해 추출 로직 표류를 방지.
|
||||
|
||||
실행: python -m tests.integration.scripts.regenerate_snapshots
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import re
|
||||
import sys
|
||||
import uuid
|
||||
from pathlib import Path
|
||||
|
||||
REPO_ROOT = Path(__file__).resolve().parents[3]
|
||||
sys.path.insert(0, str(REPO_ROOT))
|
||||
|
||||
from tests.integration.test_multi_mdx_regression import ( # noqa: E402
|
||||
MDX_SET,
|
||||
SNAPSHOTS_DIR,
|
||||
_AI_UNIT_KEYS,
|
||||
_SLIDE_ROOT_RE,
|
||||
_TITLE_RE,
|
||||
_extract_html_zone_topology,
|
||||
_layout_zone_shape,
|
||||
_slot_payload_zone_shape,
|
||||
run_pipeline_for_snapshot,
|
||||
)
|
||||
|
||||
|
||||
def _j(run_dir: Path, name: str) -> dict:
|
||||
return json.loads((run_dir / "steps" / name).read_text(encoding="utf-8"))
|
||||
|
||||
|
||||
def extract_structural(run_dir: Path) -> dict:
|
||||
status = _j(run_dir, "step20_slide_status.json")["data"]
|
||||
frame_sel = _j(run_dir, "step09_frame_selection.json")["data"]
|
||||
zones = frame_sel.get("per_zone", [])
|
||||
return {
|
||||
"overall": status.get("overall"),
|
||||
"zone_count": len(zones),
|
||||
"zones": [
|
||||
{"position": z.get("position"),
|
||||
"selected_template_id": z.get("selected_template_id")}
|
||||
for z in zones
|
||||
],
|
||||
}
|
||||
|
||||
|
||||
def extract_visual(run_dir: Path) -> dict:
|
||||
visual = _j(run_dir, "step14_visual_check.json")["data"]
|
||||
return {
|
||||
"slide_overflowed": visual.get("slide", {}).get("overflowed"),
|
||||
"slide_body_overflowed": visual.get("slide_body", {}).get("overflowed"),
|
||||
"passed": visual.get("passed"),
|
||||
"zones": [
|
||||
{
|
||||
"position": z.get("position"),
|
||||
"template_id": z.get("template_id"),
|
||||
"overflowed": z.get("overflowed"),
|
||||
"clipped_inner_count": len(z.get("clipped_inner") or []),
|
||||
}
|
||||
for z in visual.get("zones", [])
|
||||
],
|
||||
}
|
||||
|
||||
|
||||
def extract_coverage(run_dir: Path) -> dict:
|
||||
status = _j(run_dir, "step20_slide_status.json")["data"]
|
||||
return {
|
||||
"rendered": status.get("rendered"),
|
||||
"visual_check_passed": status.get("visual_check_passed"),
|
||||
"full_mdx_coverage": status.get("full_mdx_coverage"),
|
||||
"aligned_section_ids": sorted(status.get("aligned_section_ids") or []),
|
||||
"covered_section_ids": sorted(status.get("covered_section_ids") or []),
|
||||
"filtered_section_ids": sorted(status.get("filtered_section_ids") or []),
|
||||
}
|
||||
|
||||
|
||||
def extract_normalize(run_dir: Path) -> dict:
|
||||
raw = _j(run_dir, "step02_normalized.json")
|
||||
d = raw["data"]
|
||||
diag = d.get("stage0_adapter_diagnostics", {}) or {}
|
||||
assets = d.get("stage0_normalized_assets", {}) or {}
|
||||
return {
|
||||
"step_num": raw.get("step_num"),
|
||||
"step_status": raw.get("step_status"),
|
||||
"pipeline_path_connected": raw.get("pipeline_path_connected"),
|
||||
"sections_count": d.get("sections_count"),
|
||||
"section_ids": [s.get("section_id") for s in d.get("sections", [])],
|
||||
"orphans_count": len(d.get("orphans") or []),
|
||||
"details_count": len(d.get("details") or []),
|
||||
"adapter_enabled": diag.get("enabled"),
|
||||
"adapter_used": diag.get("used"),
|
||||
"assets_popups_count": len(assets.get("popups") or []),
|
||||
"assets_images_count": len(assets.get("images") or []),
|
||||
"assets_tables_count": len(assets.get("tables") or []),
|
||||
"slide_title_nonempty": bool(d.get("slide_title")),
|
||||
"slide_footer_nonempty": bool(d.get("slide_footer")),
|
||||
}
|
||||
|
||||
|
||||
def extract_v4_ranking(run_dir: Path) -> dict:
|
||||
data = _j(run_dir, "step05_v4_evidence.json")["data"]
|
||||
return {
|
||||
"v4_source": str(data.get("v4_source") or "").replace("\\", "/"),
|
||||
"aligned_section_ids": data.get("aligned_section_ids"),
|
||||
"sections": [
|
||||
{
|
||||
"section_id": ev.get("section_id"),
|
||||
"candidate_status": ev.get("candidate_status"),
|
||||
"candidates": [
|
||||
{
|
||||
"template_id": c.get("template_id"),
|
||||
"label": c.get("label"),
|
||||
"confidence": c.get("confidence"),
|
||||
}
|
||||
for c in (ev.get("v4_candidates") or [])
|
||||
],
|
||||
}
|
||||
for ev in (data.get("evidence_per_section") or [])
|
||||
],
|
||||
}
|
||||
|
||||
|
||||
def extract_ai_classifier(run_dir: Path) -> dict:
|
||||
ai = _j(run_dir, "step12_ai_repair.json")["data"]
|
||||
fit = _j(run_dir, "step15_fit_classification.json")["data"]
|
||||
router = _j(run_dir, "step16_router_decision.json")["data"]
|
||||
failure = _j(run_dir, "step18_failure_classification.json")["data"]
|
||||
units = [{k: u.get(k) for k in _AI_UNIT_KEYS} for u in (ai.get("per_unit") or [])]
|
||||
return {
|
||||
"units": units,
|
||||
"coverage_invariant_status": (ai.get("coverage_invariant") or {}).get("status"),
|
||||
"fit_visual_check_passed": fit.get("visual_check_passed"),
|
||||
"fit_classifications_count": len(fit.get("classifications") or []),
|
||||
"fit_categories_seen": fit.get("categories_seen") or [],
|
||||
"router_active": router.get("router_active"),
|
||||
"router_routed_count": router.get("routed_count"),
|
||||
"router_v4_fallback_used_count": (router.get("v4_fallback_summary") or {}).get("fallback_used_count"),
|
||||
"failure_type": failure.get("failure_type"),
|
||||
}
|
||||
|
||||
|
||||
def extract_layout(run_dir: Path) -> dict:
|
||||
s7 = _j(run_dir, "step07_layout.json")
|
||||
s8 = _j(run_dir, "step08_zone_region_ratios.json")
|
||||
d7 = s7.get("data") or {}
|
||||
d8 = s8.get("data") or {}
|
||||
css = d7.get("layout_css") or {}
|
||||
return {
|
||||
"step7_step_status": s7.get("step_status"),
|
||||
"step7_pipeline_path_connected": s7.get("pipeline_path_connected"),
|
||||
"layout_preset": d7.get("layout_preset"),
|
||||
"auto_layout_preset": d7.get("auto_layout_preset"),
|
||||
"layout_override_applied": d7.get("layout_override_applied"),
|
||||
"zones_count": d7.get("zones_count"),
|
||||
"unit_count": d7.get("unit_count"),
|
||||
"layout_candidates": d7.get("layout_candidates") or [],
|
||||
"computation": css.get("computation"),
|
||||
"dynamic_rows": css.get("dynamic_rows"),
|
||||
"dynamic_cols": css.get("dynamic_cols"),
|
||||
"heights_px": css.get("heights_px"),
|
||||
"widths_px": css.get("widths_px"),
|
||||
"ratios": css.get("ratios"),
|
||||
"width_ratios": css.get("width_ratios"),
|
||||
"step8_step_status": s8.get("step_status"),
|
||||
"step8_pipeline_path_connected": s8.get("pipeline_path_connected"),
|
||||
"zone_heights_px_planned": d8.get("zone_heights_px_planned"),
|
||||
"zone_widths_px_planned": d8.get("zone_widths_px_planned"),
|
||||
"zone_col_ratios_planned": d8.get("zone_col_ratios_planned"),
|
||||
"per_zone_layout_shape": [
|
||||
_layout_zone_shape(z) for z in (d8.get("per_zone_plan") or [])
|
||||
],
|
||||
}
|
||||
|
||||
|
||||
def extract_slot_payload(run_dir: Path) -> list:
|
||||
raw = _j(run_dir, "step12_slot_payload.json")
|
||||
return [_slot_payload_zone_shape(z) for z in raw["data"].get("per_zone") or []]
|
||||
|
||||
|
||||
def extract_final_html(run_dir: Path) -> dict:
|
||||
raw13 = _j(run_dir, "step13_render.json")
|
||||
d13 = raw13.get("data") or {}
|
||||
ri = d13.get("render_inputs") or {}
|
||||
final_path = run_dir / "final.html"
|
||||
html = final_path.read_text(encoding="utf-8")
|
||||
title_match = _TITLE_RE.search(html)
|
||||
html_title = title_match.group(1).strip() if title_match else ""
|
||||
html_topology = _extract_html_zone_topology(html)
|
||||
return {
|
||||
"step13_status": raw13.get("step_status"),
|
||||
"step13_pipeline_path_connected": raw13.get("pipeline_path_connected"),
|
||||
"render_inputs_zones_count": ri.get("zones_count"),
|
||||
"render_inputs_layout_preset": ri.get("layout_preset"),
|
||||
"render_inputs_slide_title_nonempty": bool((ri.get("slide_title") or "").strip()),
|
||||
"render_inputs_slide_footer_nonempty": bool((ri.get("slide_footer") or "").strip()),
|
||||
"html_title_matches_render_input": html_title == (ri.get("slide_title") or "").strip(),
|
||||
"html_slide_root_count": len(_SLIDE_ROOT_RE.findall(html)),
|
||||
"html_slide_footer_present": '<div class="slide-footer">' in html,
|
||||
"html_zone_count": len(html_topology),
|
||||
"html_zone_topology": html_topology,
|
||||
"final_html_size_matches_step13_reported": (
|
||||
final_path.stat().st_size == d13.get("final_html_size_bytes")
|
||||
),
|
||||
}
|
||||
|
||||
|
||||
EXTRACTORS = {
|
||||
"structural.json": extract_structural,
|
||||
"visual.json": extract_visual,
|
||||
"coverage.json": extract_coverage,
|
||||
"normalize.json": extract_normalize,
|
||||
"v4_ranking.json": extract_v4_ranking,
|
||||
"ai_classifier.json": extract_ai_classifier,
|
||||
"layout.json": extract_layout,
|
||||
"slot_payload.json": extract_slot_payload,
|
||||
"final_html.json": extract_final_html,
|
||||
}
|
||||
|
||||
|
||||
def main() -> None:
|
||||
runs = {}
|
||||
for mdx_id in MDX_SET:
|
||||
run_id = f"imp91_regen_{mdx_id}_{uuid.uuid4().hex[:8]}"
|
||||
print(f"[regen] running {mdx_id}.mdx (AI OFF) ...")
|
||||
run = run_pipeline_for_snapshot(mdx_id, run_id)
|
||||
if run.returncode != 0:
|
||||
raise RuntimeError(
|
||||
f"{mdx_id}.mdx run failed rc={run.returncode}: {run.stderr[-400:]}"
|
||||
)
|
||||
runs[mdx_id] = run
|
||||
|
||||
for name, extractor in EXTRACTORS.items():
|
||||
path = SNAPSHOTS_DIR / name
|
||||
existing = json.loads(path.read_text(encoding="utf-8"))
|
||||
new_doc = {}
|
||||
if "_doc" in existing:
|
||||
new_doc["_doc"] = existing["_doc"]
|
||||
for mdx_id in MDX_SET:
|
||||
new_doc[mdx_id] = extractor(runs[mdx_id].run_dir)
|
||||
path.write_text(
|
||||
json.dumps(new_doc, ensure_ascii=False, indent=1) + "\n",
|
||||
encoding="utf-8",
|
||||
)
|
||||
changed = [m for m in MDX_SET if existing.get(m) != new_doc[m]]
|
||||
print(f"[regen] {name}: 갱신 mdx {changed or '없음'}")
|
||||
|
||||
print("완료 — pytest tests/integration 으로 검증하세요.")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -16,6 +16,7 @@ only pins the artifact-production contract.
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
@@ -41,33 +42,48 @@ class PipelineRun(NamedTuple):
|
||||
run_dir: Path
|
||||
|
||||
|
||||
def run_pipeline_for_snapshot(mdx_id: str, run_id: str) -> "PipelineRun":
|
||||
"""단일 mdx 를 스냅샷 계약 환경으로 실행 (issue #29 에서 fixture 에서 추출).
|
||||
|
||||
AI_FALLBACK_ENABLED=false 강제 — 스냅샷 런은 결정론이어야 하고
|
||||
[[feedback_ai_isolation_contract]] 상 ``ai_called`` 기본값은 False.
|
||||
로컬 .env 가 데모용으로 AI 를 켜 두어도 (pydantic-settings 는 실제
|
||||
env var 가 .env 보다 우선) CI/스냅샷 계약은 영향받지 않는다.
|
||||
tests/integration/scripts/regenerate_snapshots.py 가 동일 함수를
|
||||
재사용해 스냅샷 갱신 절차와 테스트 실행 환경의 표류를 방지한다.
|
||||
"""
|
||||
env = {**os.environ, "AI_FALLBACK_ENABLED": "false"}
|
||||
cp = subprocess.run(
|
||||
[
|
||||
sys.executable,
|
||||
"-m",
|
||||
"src.phase_z2_pipeline",
|
||||
str(SAMPLES_DIR / f"{mdx_id}.mdx"),
|
||||
run_id,
|
||||
],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=360,
|
||||
cwd=str(REPO_ROOT),
|
||||
env=env,
|
||||
)
|
||||
return PipelineRun(
|
||||
mdx_id=mdx_id,
|
||||
run_id=run_id,
|
||||
returncode=cp.returncode,
|
||||
stdout=cp.stdout,
|
||||
stderr=cp.stderr,
|
||||
run_dir=RUNS_DIR / run_id / "phase_z2",
|
||||
)
|
||||
|
||||
|
||||
@pytest.fixture(scope="session")
|
||||
def multi_mdx_runs() -> Dict[str, PipelineRun]:
|
||||
"""Run the Phase Z pipeline once per mdx in ``MDX_SET`` (session-cached)."""
|
||||
cache: Dict[str, PipelineRun] = {}
|
||||
for mdx_id in MDX_SET:
|
||||
run_id = f"imp91_{mdx_id}_{uuid.uuid4().hex[:8]}"
|
||||
cp = subprocess.run(
|
||||
[
|
||||
sys.executable,
|
||||
"-m",
|
||||
"src.phase_z2_pipeline",
|
||||
str(SAMPLES_DIR / f"{mdx_id}.mdx"),
|
||||
run_id,
|
||||
],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=360,
|
||||
cwd=str(REPO_ROOT),
|
||||
)
|
||||
cache[mdx_id] = PipelineRun(
|
||||
mdx_id=mdx_id,
|
||||
run_id=run_id,
|
||||
returncode=cp.returncode,
|
||||
stdout=cp.stdout,
|
||||
stderr=cp.stderr,
|
||||
run_dir=RUNS_DIR / run_id / "phase_z2",
|
||||
)
|
||||
cache[mdx_id] = run_pipeline_for_snapshot(mdx_id, run_id)
|
||||
return cache
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user