1 line
88 KiB
JSON
1 line
88 KiB
JSON
[{"id": 23011, "html_url": "https://gitea.hmac.kr/Kyeongmin/C.E.L_Slide_test2/issues/70#issuecomment-23011", "pull_request_url": "", "issue_url": "https://gitea.hmac.kr/Kyeongmin/C.E.L_Slide_test2/issues/70", "user": {"id": 28, "login": "Kyeongmin", "login_name": "", "source_id": 0, "full_name": "이경민", "email": "kyeongmin@noreply.localhost", "avatar_url": "https://gitea.hmac.kr/avatars/d883a35f9197b080b2a0c535c3f9357dcd5c7d40b3c42bd8f40218cb94609a8e", "html_url": "https://gitea.hmac.kr/Kyeongmin", "language": "", "is_admin": false, "last_login": "0001-01-01T00:00:00Z", "created": "2025-12-30T10:51:04+09:00", "restricted": false, "active": false, "prohibit_login": false, "location": "", "website": "", "description": "", "visibility": "public", "followers_count": 0, "following_count": 0, "starred_repos_count": 1, "username": "Kyeongmin"}, "original_author": "", "original_author_id": 0, "body": "[Claude #1] Stage 1 problem review — IMP-41 frame ranking label UI 차별 (배지 + tooltip)\n\n## Current state verification (what already exists vs what's missing)\n\n### A — V4 label color badges (issue spec item #1) — **ALREADY IMPLEMENTED**\n\nVerified path `Front/client/src/components/FramePanel.tsx:238-253`:\n\n```\ncandidate.label === \"use_as_is\" → bg-emerald-100 text-emerald-700 (녹) ✓\ncandidate.label === \"light_edit\" → bg-blue-100 text-blue-700 (청) ✓\ncandidate.label === \"restructure\"→ bg-amber-100 text-amber-700 (황) ✓\ncandidate.label === \"reject\" → bg-red-100 text-red-700 (적) ✓\n```\n\nColor spec matches issue 1:1. No recolor required.\n\n### B — Tooltip on V4 label badge (issue spec item #2) — **PARTIAL**\n\nVerified path `Front/client/src/components/FramePanel.tsx:249`:\n\n```tsx\ntitle={`V4 label: ${candidate.label}`}\n```\n\nCurrent tooltip = raw label string only. Does **not** convey selection consequence (\"코드 직접 적용\" / \"AI 보강 필요\" / \"AI restructure 필요\" / \"render path 제외\") the issue asks for.\n\nComposite tooltip at FramePanel.tsx:128-144 (`composedTitle`, on the outer `<button>`) already aggregates reject / catalog-missing / filtered / candidate_evidence lines, but neither it nor the inline V4 badge title surfaces `application_mode` semantics.\n\n### C — `APPLICATION_MODE_BY_V4_LABEL` forwarding (issue spec item #3) — **NOT WIRED**\n\nBackend mapping (single source of truth) lives at `src/phase_z2_pipeline.py:107-112`:\n\n```python\nAPPLICATION_MODE_BY_V4_LABEL = {\n \"use_as_is\": (\"direct_insert\", True, \"step10_contract_check\"),\n \"light_edit\": (\"same_frame_with_adjustment\", True, \"step10_contract_check\"),\n \"restructure\": (\"layout_or_region_change\", False, \"human_review\"),\n \"reject\": (\"exclude\", False, None),\n}\n```\n\nStep 9 already emits per-candidate `application_mode` / `auto_applicable` / `delegated_to` into `unit.application_candidates[]` — verified at `src/phase_z2_pipeline.py:3071-3092` (`_application_candidates_for_unit`) + emitted at the application_plan unit at `src/phase_z2_pipeline.py:3227`. Fixture proof: `Front/client/public/data/runs/mdx03_f29_fix_check/steps/step09_application_plan.json:58, 67, 113, 122` all carry `\"application_mode\": \"...\"`.\n\nFrontend bridge `Front/client/src/services/designAgentApi.ts:484-562` iterates the same `units` array (line 484 `applicationPlan.data?.units`) and consumes `unit.candidate_evidence` / `unit.v4_all_judgments` / `unit.v4_candidates` to build `FrameCandidate[]`, but **does not read `unit.application_candidates`** anywhere. As a result, `FrameCandidate` type (`Front/client/src/types/designAgent.ts:137-178`) carries `label`, `routeHint`, `phaseZStatus`, `decision`, `reason`, `capacityFit` — but no `applicationMode` / `autoApplicable`.\n\nSo the data is already at the wire (Step 9 JSON) and reaches the bridge function; it is just dropped on the floor before FrameCandidate construction.\n\n### D — Dependency status\n\n- `#38` (IMP-29 frontend evidence bridge) — verified. The candidate_evidence join scaffolding is already present at `designAgentApi.ts:511-562`. Adding application_mode is a per-template_id sibling join — same shape.\n- `#10` (filtered_section_reasons UI) — verified. Independent surface; no conflict.\n- `#11` (Frame min_height 표시) — verified. Sibling badge already on FrameCandidate; pattern proven (additive, optional field, silent degradation on missing data).\n\nAll three deps locked, no waits.\n\n## Root cause summary\n\nStep 9 forwards `application_mode` correctly, the FramePanel renders label color badges correctly, but the frontend bridge does not project `application_mode` onto `FrameCandidate`. Hence FramePanel has no signal to display the human-readable selection-consequence tooltip that distinguishes `use_as_is` (직접 적용) from `light_edit` (deterministic same-frame adjustment) from `restructure` (human_review delegated) from `reject` (excluded from render).\n\n## Scope-lock (3 units, frontend-only, deterministic)\n\n| Unit | File | Change | Notes |\n|---|---|---|---|\n| U1 | `Front/client/src/types/designAgent.ts` (FrameCandidate at L137-178) | Add 3 optional fields: `applicationMode?: 'direct_insert' \\| 'same_frame_with_adjustment' \\| 'layout_or_region_change' \\| 'exclude'`, `autoApplicable?: boolean`, `delegatedTo?: 'step10_contract_check' \\| 'human_review' \\| null` | Additive (optional). Pre-IMP-41 fixtures missing `application_candidates` silently degrade — `applicationMode === undefined` → existing generic tooltip. |\n| U2 | `Front/client/src/services/designAgentApi.ts` (bridge L484-562) | Build `Map<template_id, application_candidate>` from `unit.application_candidates ?? []`; for each `FrameCandidate` lookup by `template_id` and populate the 3 U1 fields. | No backend change. No reorder of existing 3-source candidate merge (Map dedup at L511-524 / IMP-47A U2). Lookup is per-template_id, no per-frame branching. |\n| U3 | `Front/client/src/components/FramePanel.tsx` (V4 label badge L238-253) | Replace generic title `V4 label: ${candidate.label}` with deterministic const-mapped human-readable tooltip including application_mode meaning. Const `APPLICATION_MODE_TOOLTIP_BY_MODE` (module-scope) — 4 entries keyed on `applicationMode`. Fallback to existing `V4 label: ${label}` when `applicationMode === undefined`. | No color change. No new badge element. No state machinery. No toast (issue says \"tooltip / toast\" — pick tooltip per PZ guardrails / \"no speculative UX\"). Mapping = pure const, no per-template_id / per-frame_id branching. |\n\n## Guardrails\n\n- ★ **backend `src/` change = 0**. `APPLICATION_MODE_BY_V4_LABEL` stays at `src/phase_z2_pipeline.py:107-112` as single source of truth; Step 9 already emits the mapped values. Frontend join is pure read of an existing key.\n- ★ **AI / LLM calls = 0**. Pure frontend deterministic field projection + const text lookup. PZ-1 (AI=0 normal path) preserved.\n- ★ **No hardcoding** ([[feedback_no_hardcoding]]): U3 tooltip text mapping = single module-scope const keyed on `applicationMode` (enum value). No `if (template_id === ...)` / `if (frame_id === ...)` / no per-mdx branching anywhere.\n- ★ **No AI / frame swap on reject** ([[feedback_ai_isolation_contract]] 2026-05-21): U3 explains reject as \"render path 제외 — AI 재구성 대상\" in tooltip; no automatic frame override, no AI invocation — informational only.\n- ★ **Additive type extension** (U1): all 3 new fields optional → pre-IMP-29/pre-IMP-05 fixtures (no `application_candidates`) silently degrade to current behavior.\n- ★ **No badge re-color**: existing `bg-emerald-100` / `bg-blue-100` / `bg-amber-100` / `bg-red-100` retained — already matches issue spec.\n- ★ **No reorder of existing chips** (route, status, capacity, decision, no-catalog, Applied) at FramePanel.tsx:228-317 — IMP-29 layout preserved.\n- ★ **Scope-qualified verification** ([[feedback_scope_qualified_verification]]): Stage 4 verify will assert tooltip rendering against a fixture that *does* carry `application_candidates` (mdx03_f29_fix_check confirmed above) AND a fixture path that *does not* (pre-IMP-05 mock at `Front/client/src/data/mockDesignAgentData.ts:152` — assert graceful undefined → fallback tooltip).\n- ★ **MDX path untouched**: `samples/mdx*/` + `Front/client/src/data/` payloads unchanged. No new sample consumed ([[feedback_sample_budget]]).\n\n## Test / verify plan (preview for Stage 2)\n\n- **Backend pytest delta = 0** — no `src/` change.\n- **Frontend unit test (proposed for Stage 4)**: feed bridge function a mocked step09 payload with `application_candidates` → assert returned `FrameCandidate.applicationMode === \"direct_insert\"` for the `use_as_is` candidate. Repository today has no frontend test infra → may degrade to a deterministic manual check (Stage 2 to confirm path).\n- **Manual UI check**: load `?mdx=03` (mdx03_f29_fix_check has application_candidates) → hover each V4 label badge in FramePanel → confirm 4 distinct tooltip strings appear, one per label. Also load a fixture / mock without application_candidates → confirm tooltip falls back to `V4 label: ${label}` (no crash, no empty string).\n\n## Out of scope (deferred)\n\n- Backend application_mode decision change → owner `src/phase_z2_pipeline.py:104-112`. Untouched.\n- AI fallback invocation / activation → `#61 IMP-33` + `#76 IMP-47B`. This IMP only **labels** what the AI route would do; it does not call AI.\n- Toast / popover / focus-trap state machinery — issue says \"tooltip / toast\"; pick the deterministic, zero-state-machinery option (HTML `title` attribute already used elsewhere in this component).\n- Frame swap / automatic re-routing on reject — explicitly forbidden by [[feedback_ai_isolation_contract]] (2026-05-21).\n- Recolor / restyle of existing badges, ranks, or info-footer chips.\n- Translating frontend strings beyond Korean — current component is Korean-first.\n\n## Open questions (for Stage 2)\n\n- Q1: Should tooltip carry `delegatedTo` (\"step10_contract_check\" / \"human_review\") explicitly, or only the application_mode? Recommendation: include `delegatedTo` only when value ≠ \"step10_contract_check\" (i.e., surface \"human_review\" for restructure, omit for use_as_is/light_edit). Keeps default tooltip terse for the common path.\n- Q2: Should `applicationMode === \"exclude\"` (reject) tooltip duplicate the existing \"V4 reject — render path 비추천\" line already in `composedTitle` (FramePanel.tsx:140), or only annotate the inline label badge? Recommendation: only inline badge gains the explanatory string; `composedTitle` outer tooltip stays as-is (no duplication).\n- Q3: U2 join key — `template_id`. Confirm collision behavior when V4 produces duplicate template_ids across ranks. Reading `src/phase_z2_pipeline.py:836-868` ([[IMP-05 L4 dedup]]): first occurrence claims template_id; later duplicates skipped. Step 9 `application_candidates` follows the same per-`v4_candidates` order (non-reject only) → in practice each template_id appears at most once. Stage 2 to confirm or add Map-first-wins note.\n\nready-for-stage-2\n", "assets": [], "created_at": "2026-05-21T20:00:07+09:00", "updated_at": "2026-05-21T20:00:07+09:00"}, {"id": 23015, "html_url": "https://gitea.hmac.kr/Kyeongmin/C.E.L_Slide_test2/issues/70#issuecomment-23015", "pull_request_url": "", "issue_url": "https://gitea.hmac.kr/Kyeongmin/C.E.L_Slide_test2/issues/70", "user": {"id": 28, "login": "Kyeongmin", "login_name": "", "source_id": 0, "full_name": "이경민", "email": "kyeongmin@noreply.localhost", "avatar_url": "https://gitea.hmac.kr/avatars/d883a35f9197b080b2a0c535c3f9357dcd5c7d40b3c42bd8f40218cb94609a8e", "html_url": "https://gitea.hmac.kr/Kyeongmin", "language": "", "is_admin": false, "last_login": "0001-01-01T00:00:00Z", "created": "2025-12-30T10:51:04+09:00", "restricted": false, "active": false, "prohibit_login": false, "location": "", "website": "", "description": "", "visibility": "public", "followers_count": 0, "following_count": 0, "starred_repos_count": 1, "username": "Kyeongmin"}, "original_author": "", "original_author_id": 0, "body": "[Claude #1] Stage 1 problem review — IMP-41 frame ranking label UI 차별 (배지 + tooltip)\n\n## Current state verification (what already exists vs what's missing)\n\n### A — V4 label color badges (issue spec item #1) — **ALREADY IMPLEMENTED**\n\nVerified path `Front/client/src/components/FramePanel.tsx:238-253`:\n\n```\ncandidate.label === \"use_as_is\" → bg-emerald-100 text-emerald-700 (녹) ✓\ncandidate.label === \"light_edit\" → bg-blue-100 text-blue-700 (청) ✓\ncandidate.label === \"restructure\"→ bg-amber-100 text-amber-700 (황) ✓\ncandidate.label === \"reject\" → bg-red-100 text-red-700 (적) ✓\n```\n\nColor spec matches issue 1:1. No recolor required.\n\n### B — Tooltip on V4 label badge (issue spec item #2) — **PARTIAL**\n\nVerified path `Front/client/src/components/FramePanel.tsx:249`:\n\n```tsx\ntitle={`V4 label: ${candidate.label}`}\n```\n\nCurrent tooltip = raw label string only. Does **not** convey selection consequence (\"코드 직접 적용\" / \"AI 보강 필요\" / \"AI restructure 필요\" / \"render path 제외\") the issue asks for.\n\nComposite tooltip at FramePanel.tsx:128-144 (`composedTitle`, on the outer `<button>`) already aggregates reject / catalog-missing / filtered / candidate_evidence lines, but neither it nor the inline V4 badge title surfaces `application_mode` semantics.\n\n### C — `APPLICATION_MODE_BY_V4_LABEL` forwarding (issue spec item #3) — **NOT WIRED**\n\nBackend mapping (single source of truth) lives at `src/phase_z2_pipeline.py:107-112`:\n\n```python\nAPPLICATION_MODE_BY_V4_LABEL = {\n \"use_as_is\": (\"direct_insert\", True, \"step10_contract_check\"),\n \"light_edit\": (\"same_frame_with_adjustment\", True, \"step10_contract_check\"),\n \"restructure\": (\"layout_or_region_change\", False, \"human_review\"),\n \"reject\": (\"exclude\", False, None),\n}\n```\n\nStep 9 already emits per-candidate `application_mode` / `auto_applicable` / `delegated_to` into `unit.application_candidates[]` — verified at `src/phase_z2_pipeline.py:3071-3092` (`_application_candidates_for_unit`) + emitted at the application_plan unit at `src/phase_z2_pipeline.py:3227`. Fixture proof: `Front/client/public/data/runs/mdx03_f29_fix_check/steps/step09_application_plan.json:58, 67, 113, 122` all carry `\"application_mode\": \"...\"`.\n\nFrontend bridge `Front/client/src/services/designAgentApi.ts:484-562` iterates the same `units` array (line 484 `applicationPlan.data?.units`) and consumes `unit.candidate_evidence` / `unit.v4_all_judgments` / `unit.v4_candidates` to build `FrameCandidate[]`, but **does not read `unit.application_candidates`** anywhere. As a result, `FrameCandidate` type (`Front/client/src/types/designAgent.ts:137-178`) carries `label`, `routeHint`, `phaseZStatus`, `decision`, `reason`, `capacityFit` — but no `applicationMode` / `autoApplicable`.\n\nSo the data is already at the wire (Step 9 JSON) and reaches the bridge function; it is just dropped on the floor before FrameCandidate construction.\n\n### D — Dependency status\n\n- `#38` (IMP-29 frontend evidence bridge) — verified. The candidate_evidence join scaffolding is already present at `designAgentApi.ts:511-562`. Adding application_mode is a per-template_id sibling join — same shape.\n- `#10` (filtered_section_reasons UI) — verified. Independent surface; no conflict.\n- `#11` (Frame min_height 표시) — verified. Sibling badge already on FrameCandidate; pattern proven (additive, optional field, silent degradation on missing data).\n\nAll three deps locked, no waits.\n\n## Root cause summary\n\nStep 9 forwards `application_mode` correctly, the FramePanel renders label color badges correctly, but the frontend bridge does not project `application_mode` onto `FrameCandidate`. Hence FramePanel has no signal to display the human-readable selection-consequence tooltip that distinguishes `use_as_is` (직접 적용) from `light_edit` (deterministic same-frame adjustment) from `restructure` (human_review delegated) from `reject` (excluded from render).\n\n## Scope-lock (3 units, frontend-only, deterministic)\n\n| Unit | File | Change | Notes |\n|---|---|---|---|\n| U1 | `Front/client/src/types/designAgent.ts` (FrameCandidate at L137-178) | Add 3 optional fields: `applicationMode?: 'direct_insert' \\| 'same_frame_with_adjustment' \\| 'layout_or_region_change' \\| 'exclude'`, `autoApplicable?: boolean`, `delegatedTo?: 'step10_contract_check' \\| 'human_review' \\| null` | Additive (optional). Pre-IMP-41 fixtures missing `application_candidates` silently degrade — `applicationMode === undefined` → existing generic tooltip. |\n| U2 | `Front/client/src/services/designAgentApi.ts` (bridge L484-562) | Build `Map<template_id, application_candidate>` from `unit.application_candidates ?? []`; for each `FrameCandidate` lookup by `template_id` and populate the 3 U1 fields. | No backend change. No reorder of existing 3-source candidate merge (Map dedup at L511-524 / IMP-47A U2). Lookup is per-template_id, no per-frame branching. |\n| U3 | `Front/client/src/components/FramePanel.tsx` (V4 label badge L238-253) | Replace generic title `V4 label: ${candidate.label}` with deterministic const-mapped human-readable tooltip including application_mode meaning. Const `APPLICATION_MODE_TOOLTIP_BY_MODE` (module-scope) — 4 entries keyed on `applicationMode`. Fallback to existing `V4 label: ${label}` when `applicationMode === undefined`. | No color change. No new badge element. No state machinery. No toast (issue says \"tooltip / toast\" — pick tooltip per PZ guardrails / \"no speculative UX\"). Mapping = pure const, no per-template_id / per-frame_id branching. |\n\n## Guardrails\n\n- ★ **backend `src/` change = 0**. `APPLICATION_MODE_BY_V4_LABEL` stays at `src/phase_z2_pipeline.py:107-112` as single source of truth; Step 9 already emits the mapped values. Frontend join is pure read of an existing key.\n- ★ **AI / LLM calls = 0**. Pure frontend deterministic field projection + const text lookup. PZ-1 (AI=0 normal path) preserved.\n- ★ **No hardcoding** ([[feedback_no_hardcoding]]): U3 tooltip text mapping = single module-scope const keyed on `applicationMode` (enum value). No `if (template_id === ...)` / `if (frame_id === ...)` / no per-mdx branching anywhere.\n- ★ **No AI / frame swap on reject** ([[feedback_ai_isolation_contract]] 2026-05-21): U3 explains reject as \"render path 제외 — AI 재구성 대상\" in tooltip; no automatic frame override, no AI invocation — informational only.\n- ★ **Additive type extension** (U1): all 3 new fields optional → pre-IMP-29/pre-IMP-05 fixtures (no `application_candidates`) silently degrade to current behavior.\n- ★ **No badge re-color**: existing `bg-emerald-100` / `bg-blue-100` / `bg-amber-100` / `bg-red-100` retained — already matches issue spec.\n- ★ **No reorder of existing chips** (route, status, capacity, decision, no-catalog, Applied) at FramePanel.tsx:228-317 — IMP-29 layout preserved.\n- ★ **Scope-qualified verification** ([[feedback_scope_qualified_verification]]): Stage 4 verify will assert tooltip rendering against a fixture that *does* carry `application_candidates` (mdx03_f29_fix_check confirmed above) AND a fixture path that *does not* (pre-IMP-05 mock at `Front/client/src/data/mockDesignAgentData.ts:152` — assert graceful undefined → fallback tooltip).\n- ★ **MDX path untouched**: `samples/mdx*/` + `Front/client/src/data/` payloads unchanged. No new sample consumed ([[feedback_sample_budget]]).\n\n## Test / verify plan (preview for Stage 2)\n\n- **Backend pytest delta = 0** — no `src/` change.\n- **Frontend unit test (proposed for Stage 4)**: feed bridge function a mocked step09 payload with `application_candidates` → assert returned `FrameCandidate.applicationMode === \"direct_insert\"` for the `use_as_is` candidate. Repository today has no frontend test infra → may degrade to a deterministic manual check (Stage 2 to confirm path).\n- **Manual UI check**: load `?mdx=03` (mdx03_f29_fix_check has application_candidates) → hover each V4 label badge in FramePanel → confirm 4 distinct tooltip strings appear, one per label. Also load a fixture / mock without application_candidates → confirm tooltip falls back to `V4 label: ${label}` (no crash, no empty string).\n\n## Out of scope (deferred)\n\n- Backend application_mode decision change → owner `src/phase_z2_pipeline.py:104-112`. Untouched.\n- AI fallback invocation / activation → `#61 IMP-33` + `#76 IMP-47B`. This IMP only **labels** what the AI route would do; it does not call AI.\n- Toast / popover / focus-trap state machinery — issue says \"tooltip / toast\"; pick the deterministic, zero-state-machinery option (HTML `title` attribute already used elsewhere in this component).\n- Frame swap / automatic re-routing on reject — explicitly forbidden by [[feedback_ai_isolation_contract]] (2026-05-21).\n- Recolor / restyle of existing badges, ranks, or info-footer chips.\n- Translating frontend strings beyond Korean — current component is Korean-first.\n\n## Open questions (for Stage 2)\n\n- Q1: Should tooltip carry `delegatedTo` (\"step10_contract_check\" / \"human_review\") explicitly, or only the application_mode? Recommendation: include `delegatedTo` only when value ≠ \"step10_contract_check\" (i.e., surface \"human_review\" for restructure, omit for use_as_is/light_edit). Keeps default tooltip terse for the common path.\n- Q2: Should `applicationMode === \"exclude\"` (reject) tooltip duplicate the existing \"V4 reject — render path 비추천\" line already in `composedTitle` (FramePanel.tsx:140), or only annotate the inline label badge? Recommendation: only inline badge gains the explanatory string; `composedTitle` outer tooltip stays as-is (no duplication).\n- Q3: U2 join key — `template_id`. Confirm collision behavior when V4 produces duplicate template_ids across ranks. Reading `src/phase_z2_pipeline.py:836-868` ([[IMP-05 L4 dedup]]): first occurrence claims template_id; later duplicates skipped. Step 9 `application_candidates` follows the same per-`v4_candidates` order (non-reject only) → in practice each template_id appears at most once. Stage 2 to confirm or add Map-first-wins note.\n\nready-for-stage-2\n", "assets": [], "created_at": "2026-05-21T20:00:12+09:00", "updated_at": "2026-05-21T20:00:12+09:00"}, {"id": 23021, "html_url": "https://gitea.hmac.kr/Kyeongmin/C.E.L_Slide_test2/issues/70#issuecomment-23021", "pull_request_url": "", "issue_url": "https://gitea.hmac.kr/Kyeongmin/C.E.L_Slide_test2/issues/70", "user": {"id": 28, "login": "Kyeongmin", "login_name": "", "source_id": 0, "full_name": "이경민", "email": "kyeongmin@noreply.localhost", "avatar_url": "https://gitea.hmac.kr/avatars/d883a35f9197b080b2a0c535c3f9357dcd5c7d40b3c42bd8f40218cb94609a8e", "html_url": "https://gitea.hmac.kr/Kyeongmin", "language": "", "is_admin": false, "last_login": "0001-01-01T00:00:00Z", "created": "2025-12-30T10:51:04+09:00", "restricted": false, "active": false, "prohibit_login": false, "location": "", "website": "", "description": "", "visibility": "public", "followers_count": 0, "following_count": 0, "starred_repos_count": 1, "username": "Kyeongmin"}, "original_author": "", "original_author_id": 0, "body": "[Codex #1] Stage 1 problem review IMP-41\n\nScope-lock verification:\n\n1. Backend application-mode mapping exists and is already emitted by Step 9.\n `D:\\ad-hoc\\kei\\design_agent\\src\\phase_z2_pipeline.py:107` defines `APPLICATION_MODE_BY_V4_LABEL` with the expected four labels:\n `use_as_is -> direct_insert`, `light_edit -> same_frame_with_adjustment`, `restructure -> layout_or_region_change`, `reject -> exclude`.\n `_application_candidates_for_unit()` at `D:\\ad-hoc\\kei\\design_agent\\src\\phase_z2_pipeline.py:3071` reads that mapping and emits `application_mode`, `auto_applicable`, and `delegated_to`. `_application_plan_unit()` includes the resulting `application_candidates` at `D:\\ad-hoc\\kei\\design_agent\\src\\phase_z2_pipeline.py:3227`.\n\n2. Wire/fixture proof exists.\n `D:\\ad-hoc\\kei\\design_agent\\Front\\client\\public\\data\\runs\\mdx03_f29_fix_check\\steps\\step09_application_plan.json:53` and `:108` contain per-unit `application_candidates`; sample entries at lines `58-61`, `67-70`, `113-116`, and `122-125` carry the expected `application_mode`, `auto_applicable`, and `delegated_to` fields.\n\n3. Frontend bridge drops the Step 9 application candidate fields.\n `D:\\ad-hoc\\kei\\design_agent\\Front\\client\\src\\services\\designAgentApi.ts:484` reads `applicationPlan.data?.units`. The candidate merge at lines `511-523` consumes only `unit.candidate_evidence`, `unit.v4_all_judgments`, and `unit.v4_candidates`; `unit.application_candidates` is not read. The `FrameCandidate` construction at lines `530-562` forwards label/evidence fields but not `application_mode`, `auto_applicable`, or `delegated_to`.\n\n4. Frontend type is missing the forwarded fields.\n `D:\\ad-hoc\\kei\\design_agent\\Front\\client\\src\\types\\designAgent.ts:137-178` defines `FrameCandidate` with label, catalog/min-height fields, route/evidence fields, and capacity fit, but no `applicationMode`, `autoApplicable`, or `delegatedTo` equivalent.\n\n5. FramePanel label UI is partially present, not complete.\n `D:\\ad-hoc\\kei\\design_agent\\Front\\client\\src\\components\\FramePanel.tsx:238-252` renders a label badge with the expected color families for `use_as_is`, `light_edit`, `restructure`, and fallback/reject. However, those styles are inline conditional branches at lines `241-247`, not a named label-to-style constant. The implementation stage should extract a deterministic label UI mapping constant to satisfy the issue guardrail.\n\n6. Tooltip semantics are incomplete.\n The badge title at `D:\\ad-hoc\\kei\\design_agent\\Front\\client\\src\\components\\FramePanel.tsx:249` is only `V4 label: ${candidate.label}`. The composed card tooltip at lines `128-144` includes catalog/filter/reject/evidence information, but does not expose application-mode consequences such as direct code application, AI adjustment required, AI restructure required, or exclusion.\n\nWrong assumptions / missing files:\n- No referenced files are missing: `FramePanel.tsx`, `designAgentApi.ts`, `designAgent.ts`, `phase_z2_pipeline.py`, and the checked Step 9 fixture all exist.\n- Claude's root-cause claim is verified: backend data exists and frontend drops it before `FrameCandidate`.\n- Scope correction: label colors should not be treated as fully complete because the current UI uses inline conditional classes rather than the requested mapping constant.\n\nScope-locked implementation surface:\n- `D:\\ad-hoc\\kei\\design_agent\\Front\\client\\src\\types\\designAgent.ts`: add optional application-mode fields to `FrameCandidate`.\n- `D:\\ad-hoc\\kei\\design_agent\\Front\\client\\src\\services\\designAgentApi.ts`: merge `unit.application_candidates` into frontend candidates by stable candidate key, preserving deterministic source priority and avoiding frame-specific branching.\n- `D:\\ad-hoc\\kei\\design_agent\\Front\\client\\src\\components\\FramePanel.tsx`: add label/application-mode mapping constants and use them for badge styles and tooltip text.\n- Backend application-mode decision logic is out of scope; no LLM call or AI classification belongs in this issue.\n\n=== EVIDENCE ===\nCommands run:\n- `Get-Content -LiteralPath 'D:\\ad-hoc\\kei\\design_agent\\.orchestrator\\tmp\\codex_prompt.txt'`\n- `rg -n \"APPLICATION_MODE_BY_V4_LABEL|def _application_candidates_for_unit|application_candidates\" src/phase_z2_pipeline.py`\n- `rg -n \"application_candidates|candidate_evidence|v4_all_judgments|FrameCandidate|applicationMode|autoApplicable|delegated\" Front/client/src/services/designAgentApi.ts Front/client/src/types/designAgent.ts Front/client/src/components/FramePanel.tsx`\n- `rg -n \"application_mode|auto_applicable|delegated_to\" Front/client/public/data/runs/mdx03_f29_fix_check/steps/step09_application_plan.json`\n- `Get-Content` line-window checks for `src\\phase_z2_pipeline.py`, `Front\\client\\src\\services\\designAgentApi.ts`, `Front\\client\\src\\types\\designAgent.ts`, and `Front\\client\\src\\components\\FramePanel.tsx`\n- `rg -n \"application_candidates|application_mode|auto_applicable|delegated_to|FrameCandidate\\[\\]|label ===|title=\\{`V4 label\" Front/client/src/services/designAgentApi.ts Front/client/src/types/designAgent.ts Front/client/src/components/FramePanel.tsx Front/client/public/data/runs/mdx03_f29_fix_check/steps/step09_application_plan.json src/phase_z2_pipeline.py`\n- `Test-Path` checks for all referenced files\n- `git status --short`\n\nFiles checked:\n- `D:\\ad-hoc\\kei\\design_agent\\src\\phase_z2_pipeline.py`\n- `D:\\ad-hoc\\kei\\design_agent\\Front\\client\\src\\services\\designAgentApi.ts`\n- `D:\\ad-hoc\\kei\\design_agent\\Front\\client\\src\\types\\designAgent.ts`\n- `D:\\ad-hoc\\kei\\design_agent\\Front\\client\\src\\components\\FramePanel.tsx`\n- `D:\\ad-hoc\\kei\\design_agent\\Front\\client\\public\\data\\runs\\mdx03_f29_fix_check\\steps\\step09_application_plan.json`\n\nTest results:\n- Not run. Stage 1 explicitly says grep/find and NO pytest.\n\nVerified facts:\n- Step 9 backend mapping and emitted fields exist.\n- Frontend bridge currently ignores `unit.application_candidates`.\n- `FrameCandidate` has no application-mode fields.\n- Existing label badge tooltip only shows the raw V4 label.\n- Existing label badge color logic is inline in `FramePanel.tsx`, so implementation should replace it with a constant mapping.\n\nFINAL_CONSENSUS: YES", "assets": [], "created_at": "2026-05-21T20:02:17+09:00", "updated_at": "2026-05-21T20:02:17+09:00"}, {"id": 23030, "html_url": "https://gitea.hmac.kr/Kyeongmin/C.E.L_Slide_test2/issues/70#issuecomment-23030", "pull_request_url": "", "issue_url": "https://gitea.hmac.kr/Kyeongmin/C.E.L_Slide_test2/issues/70", "user": {"id": 28, "login": "Kyeongmin", "login_name": "", "source_id": 0, "full_name": "이경민", "email": "kyeongmin@noreply.localhost", "avatar_url": "https://gitea.hmac.kr/avatars/d883a35f9197b080b2a0c535c3f9357dcd5c7d40b3c42bd8f40218cb94609a8e", "html_url": "https://gitea.hmac.kr/Kyeongmin", "language": "", "is_admin": false, "last_login": "0001-01-01T00:00:00Z", "created": "2025-12-30T10:51:04+09:00", "restricted": false, "active": false, "prohibit_login": false, "location": "", "website": "", "description": "", "visibility": "public", "followers_count": 0, "following_count": 0, "starred_repos_count": 1, "username": "Kyeongmin"}, "original_author": "", "original_author_id": 0, "body": "[Claude #2] Stage 2 simulation-plan — IMP-41 frame ranking label tooltip\n\n=== IMPLEMENTATION_UNITS ===\n- id: u1\n summary: Extend FrameCandidate type with applicationMode / autoApplicable / delegatedTo (all optional)\n files: [Front/client/src/types/designAgent.ts]\n tests: [npm --prefix Front run check]\n estimate_lines: 18\n- id: u2\n summary: Merge unit.application_candidates[] in designAgentApi.ts; forward 3 fields onto matching FrameCandidate by template_id\n files: [Front/client/src/services/designAgentApi.ts]\n tests: [npm --prefix Front run check]\n estimate_lines: 28\n- id: u3\n summary: Replace V4 label badge title (FramePanel.tsx:249) with applicationMode → Korean consequence phrase tooltip; legacy fallback preserved\n files: [Front/client/src/components/FramePanel.tsx]\n tests: [npm --prefix Front run check]\n estimate_lines: 22\n\n=== ISSUE AXIS COVERAGE ===\n| Issue body item | Stage 1 scope item | Unit | Status |\n|---|---|---|---|\n| #1 라벨 별 색 배지 (use_as_is 녹 / light_edit 청 / restructure 황 / reject 회·적) | (already implemented — FramePanel.tsx:240-247) | — | out_of_scope (Stage 1 confirmed) |\n| #2 클릭 시 tooltip — 코드 직접 적용 / AI 보강 필요 / AI restructure 필요 | scope_lock #3 (tooltip rewrite) | u3 | covered |\n| #3 APPLICATION_MODE_BY_V4_LABEL 매핑 frontend forward | scope_lock #1+#2 (type + bridge) | u1, u2 | covered |\n\nper-unit rationale:\n- u1: Three optional fields (applicationMode: 'direct_insert'|'same_frame_with_adjustment'|'layout_or_region_change'|'exclude'; autoApplicable: boolean; delegatedTo: 'step10_contract_check'|'human_review'|null). All optional so pre-IMP-05 fixtures stay valid (graceful degradation, mirrors existing minHeightPx pattern at designAgent.ts:150).\n- u2: After candidateMap is built (designAgentApi.ts:524), index unit.application_candidates[] by template_id and inject mode/auto/delegated onto matching c entries before the .slice/.map at :530. No re-derivation — pure forward of backend-emitted values. Source priority (candidate_evidence > v4_all_judgments > v4_candidates) untouched; application_candidates is a parallel enrichment, not a 4th source.\n- u3: Const map APPLICATION_MODE_TOOLTIP_KO at module scope: direct_insert→\"코드 직접 적용\", same_frame_with_adjustment→\"AI 보강 필요\", layout_or_region_change→\"AI restructure 필요\", exclude→\"render path 제외\". Tooltip template `V4 ${label} — ${koPhrase}`. When applicationMode undefined (legacy/pre-IMP-05 fixture), keep existing `V4 label: ${label}` as fallback. Map keyed by application_mode (NOT label) per Stage 1 guardrail — backend remains source of truth.\n\n=== UNRESOLVED QUESTIONS RESOLUTION ===\n- Q1 (Korean vs raw tokens): use Korean phrases. Issue body item #2 explicitly enumerates them; raw application_mode tokens (direct_insert etc.) carry no UX value for end users. Map keyed by application_mode value, not by V4 label, to preserve backend authority (guardrail).\n- Q2 (delegatedTo in tooltip): NO — forward in type only (future-proof for IMP-33 / Step 10 surfaces), do not display in V4-label badge tooltip. Issue spec item #2 lists consequence phrases only. Keeps tooltip terse and scope tight; delegatedTo can be added to a separate surface (e.g., composedTitle outer-button) in a follow-up.\n\n=== OUT OF SCOPE (Stage 1 reconfirmed) ===\n- Badge color spec (FramePanel.tsx:240-247) — already matches issue body\n- Backend APPLICATION_MODE_BY_V4_LABEL mapping (src/phase_z2_pipeline.py:107-112)\n- Outer composedTitle composition (FramePanel.tsx:128-144)\n- Step 12 AI behavior\n- Any FrameCandidate consumer outside FramePanel V4-label badge\n\n=== ROLLBACK ===\n3 files, additive optional type fields, parallel enrichment merge, single tooltip string swap with legacy fallback. Rollback = `git checkout HEAD~ -- Front/client/src/types/designAgent.ts Front/client/src/services/designAgentApi.ts Front/client/src/components/FramePanel.tsx`. No DB / no fixture / no backend touch. Pre-IMP-05 fixtures (which lack unit.application_candidates) silently fall through to current behavior — no regression vector.\n\n=== EVIDENCE ===\n- Issue body item enumeration: issue #70 body §scope items 1-3\n- Stage 1 scope_lock: exit report 3 items map 1:1 to u1/u2/u3\n- Backend already emits expected fields: Front/client/public/data/runs/mdx03_f29_fix_check/steps/step09_application_plan.json:53-72 (unit 03-1) and :108-127 (unit 03-2) — `application_candidates[]` with `template_id`, `application_mode`, `auto_applicable`, `delegated_to` populated; no backend work required\n- Backend emit site verified live: src/phase_z2_pipeline.py:3071-3092 (_application_candidates_for_unit), :107-112 (APPLICATION_MODE_BY_V4_LABEL)\n- Frontend bridge gap verified live: Front/client/src/services/designAgentApi.ts:511-523 (3-source merge — application_candidates absent) → :530-562 (FrameCandidate construction — 3 fields missing)\n- Frontend type gap verified live: Front/client/src/types/designAgent.ts:137-178 (no applicationMode/autoApplicable/delegatedTo)\n- Tooltip target verified live: Front/client/src/components/FramePanel.tsx:249 (`title={\\`V4 label: ${candidate.label}\\`}`)\n- Outer composedTitle separate axis confirmed: FramePanel.tsx:128-144 (Stage 1 out_of_scope item)\n- Verification tooling: Front/package.json:11 (`\"check\": \"tsc --noEmit\"`) — no frontend test runner exists, so per-unit verification = tsc + fixture trace\n- Stage 1 commit_sha referenced: a06dd3d\n\nFINAL_CONSENSUS: YES\n", "assets": [], "created_at": "2026-05-21T20:05:34+09:00", "updated_at": "2026-05-21T20:05:34+09:00"}, {"id": 23038, "html_url": "https://gitea.hmac.kr/Kyeongmin/C.E.L_Slide_test2/issues/70#issuecomment-23038", "pull_request_url": "", "issue_url": "https://gitea.hmac.kr/Kyeongmin/C.E.L_Slide_test2/issues/70", "user": {"id": 28, "login": "Kyeongmin", "login_name": "", "source_id": 0, "full_name": "이경민", "email": "kyeongmin@noreply.localhost", "avatar_url": "https://gitea.hmac.kr/avatars/d883a35f9197b080b2a0c535c3f9357dcd5c7d40b3c42bd8f40218cb94609a8e", "html_url": "https://gitea.hmac.kr/Kyeongmin", "language": "", "is_admin": false, "last_login": "0001-01-01T00:00:00Z", "created": "2025-12-30T10:51:04+09:00", "restricted": false, "active": false, "prohibit_login": false, "location": "", "website": "", "description": "", "visibility": "public", "followers_count": 0, "following_count": 0, "starred_repos_count": 1, "username": "Kyeongmin"}, "original_author": "", "original_author_id": 0, "body": "[Codex #2] Stage 2 simulation-plan review - IMP-41 frame ranking label tooltip\n\n=== IMPLEMENTATION_UNITS ===\n- id: u1\n summary: Extend FrameCandidate with optional applicationMode / autoApplicable / delegatedTo fields.\n files: [Front/client/src/types/designAgent.ts]\n tests: [npm --prefix Front run check, pytest -q tests]\n estimate_lines: 18\n verdict: covered\n- id: u2\n summary: Read unit.application_candidates[] in designAgentApi.ts and enrich matching candidates by template_id without changing candidate source priority.\n files: [Front/client/src/services/designAgentApi.ts]\n tests: [npm --prefix Front run check, pytest -q tests]\n estimate_lines: 28\n verdict: covered\n- id: u3\n summary: Replace only the V4 label badge title with an applicationMode consequence tooltip and preserve the legacy fallback when mode is absent.\n files: [Front/client/src/components/FramePanel.tsx]\n tests: [npm --prefix Front run check, pytest -q tests]\n estimate_lines: 22\n verdict: covered\n\nPer-unit rationale:\n- u1 is correctly scoped to the frontend type gap from Stage 1. Optional fields avoid fixture breakage and keep backend mapping authoritative.\n- u2 is the right bridge fix. It forwards Step 9 application_candidates as parallel enrichment and does not re-rank or reclassify V4 candidates.\n- u3 covers the remaining UI axis on the V4 label badge tooltip only. The planned map is keyed by applicationMode, not by V4 label, so it avoids frontend label-to-consequence re-derivation.\n\nOut-of-scope notes:\n- Badge color changes remain out of scope because FramePanel already implements the issue color axis at the V4 label badge surface.\n- Backend APPLICATION_MODE_BY_V4_LABEL, Step 12 AI behavior, composite outer-button tooltip, and non-FramePanel surfaces remain out of scope.\n- Side effects are expected to be limited to extra optional fields on FrameCandidate and a more informative native title on the existing V4 label badge.\n\nRollback strategy:\n- Revert the three scoped frontend files only: Front/client/src/types/designAgent.ts, Front/client/src/services/designAgentApi.ts, and Front/client/src/components/FramePanel.tsx.\n- Do not revert backend files, run fixtures, or unrelated orchestrator artifacts.\n\n=== EVIDENCE ===\nCommands run:\n- Get-Content on Front/client/src/types/designAgent.ts\n- Get-Content on Front/client/src/services/designAgentApi.ts\n- Get-Content on Front/client/src/components/FramePanel.tsx\n- git rev-parse HEAD\n- pytest -q tests\n\nFiles checked:\n- Front/client/src/types/designAgent.ts\n- Front/client/src/services/designAgentApi.ts\n- Front/client/src/components/FramePanel.tsx\n- .orchestrator/tmp/codex_prompt.txt\n\nTest results:\n- pytest -q tests failed: 649 passed, 2 failed.\n- Failing tests: tests/orchestrator_unit/test_imp17_comment_anchor.py::test_line_570_references_imp17_not_imp31 and tests/orchestrator_unit/test_imp17_comment_anchor.py::test_line_571_still_references_imp29.\n- Failure value/path/upstream: both tests read blank lines at the expected anchors, while the tests require \"restructure\" on line 570 and \"reject\" on line 571.\n\nVerified facts:\n- Current HEAD is a06dd3d4b07767f752d6f40ed690e07164836e0c.\n- FrameCandidate currently lacks applicationMode, autoApplicable, and delegatedTo.\n- designAgentApi.ts currently merges candidate_evidence, v4_all_judgments, and v4_candidates, but not unit.application_candidates.\n- FramePanel.tsx currently renders the V4 label badge title as raw label only.\n- The implementation_units are all under 50 estimated lines and each touches only one file.\n- Issue body axes are covered by the proposed units or explicitly out of scope per the Stage 1 binding contract.\n- Stage 2 cannot be finalized while the required baseline pytest command is failing.\n\nrewind_target: stage_2_plan\nFINAL_CONSENSUS: NO\n", "assets": [], "created_at": "2026-05-21T20:08:52+09:00", "updated_at": "2026-05-21T20:08:52+09:00"}, {"id": 23043, "html_url": "https://gitea.hmac.kr/Kyeongmin/C.E.L_Slide_test2/issues/70#issuecomment-23043", "pull_request_url": "", "issue_url": "https://gitea.hmac.kr/Kyeongmin/C.E.L_Slide_test2/issues/70", "user": {"id": 28, "login": "Kyeongmin", "login_name": "", "source_id": 0, "full_name": "이경민", "email": "kyeongmin@noreply.localhost", "avatar_url": "https://gitea.hmac.kr/avatars/d883a35f9197b080b2a0c535c3f9357dcd5c7d40b3c42bd8f40218cb94609a8e", "html_url": "https://gitea.hmac.kr/Kyeongmin", "language": "", "is_admin": false, "last_login": "0001-01-01T00:00:00Z", "created": "2025-12-30T10:51:04+09:00", "restricted": false, "active": false, "prohibit_login": false, "location": "", "website": "", "description": "", "visibility": "public", "followers_count": 0, "following_count": 0, "starred_repos_count": 1, "username": "Kyeongmin"}, "original_author": "", "original_author_id": 0, "body": "[Claude #3] Stage 2 simulation-plan r2 — IMP-41 frame ranking label tooltip (rewind: stage_2_plan)\n\n=== IMPLEMENTATION_UNITS ===\n- id: u1\n summary: Extend FrameCandidate with optional applicationMode / autoApplicable / delegatedTo fields.\n files: [Front/client/src/types/designAgent.ts]\n tests: [npm --prefix Front run check]\n estimate_lines: 18\n- id: u2\n summary: Read unit.application_candidates[] in designAgentApi.ts and enrich matching candidates by template_id without changing source priority.\n files: [Front/client/src/services/designAgentApi.ts]\n tests: [npm --prefix Front run check]\n estimate_lines: 28\n- id: u3\n summary: Replace V4 label badge title (FramePanel.tsx:249) with applicationMode → Korean consequence tooltip; legacy fallback preserved when mode absent.\n files: [Front/client/src/components/FramePanel.tsx]\n tests: [npm --prefix Front run check]\n estimate_lines: 22\n\n=== ISSUE AXIS COVERAGE ===\n| Issue body item | Stage 1 scope item | Unit | Status |\n|---|---|---|---|\n| #1 라벨 별 색 배지 (use_as_is 녹 / light_edit 청 / restructure 황 / reject 회·적) | already implemented (FramePanel.tsx:240-247) | — | out_of_scope (Stage 1 binding) |\n| #2 클릭 시 tooltip — 코드 직접 적용 / AI 보강 필요 / AI restructure 필요 | scope_lock #3 (tooltip rewrite) | u3 | covered |\n| #3 APPLICATION_MODE_BY_V4_LABEL frontend forward | scope_lock #1+#2 (type + bridge) | u1, u2 | covered |\n\nPer-unit rationale:\n- u1: Three optional fields (applicationMode: 'direct_insert'|'same_frame_with_adjustment'|'layout_or_region_change'|'exclude'; autoApplicable: boolean; delegatedTo: 'step10_contract_check'|'human_review'|null). Optional → pre-IMP-05 fixtures keep working (mirrors minHeightPx graceful pattern at designAgent.ts:150).\n- u2: After candidateMap is built (designAgentApi.ts:524), index unit.application_candidates[] by template_id and inject mode/auto/delegated onto matching c entries before .slice/.map at :530. Pure forward — no re-derivation. Source priority chain (candidate_evidence > v4_all_judgments > v4_candidates) untouched; application_candidates = parallel enrichment.\n- u3: Const map APPLICATION_MODE_TOOLTIP_KO at module scope keyed by application_mode value (NOT label) — backend authority preserved. Tooltip template `V4 ${label} — ${koPhrase}`. When applicationMode undefined (pre-IMP-05 fixture / legacy), fall back to current `V4 label: ${label}`. No re-derivation of mode from label in frontend (Stage 1 guardrail).\n\n=== UNRESOLVED QUESTIONS RESOLUTION ===\n- Q1 (Korean vs raw tokens): Korean phrases. Issue body item #2 explicitly enumerates them; raw mode tokens carry no UX value. Map keyed by application_mode value (not by V4 label) → backend authoritative.\n- Q2 (delegatedTo in tooltip): NO. Forward in type only (future-proof for IMP-33 / Step 10 surfaces). Issue spec #2 lists consequence phrases only; delegatedTo display = follow-up surface, not V4-label badge tooltip.\n\n=== TEST CONTRACT (scope-qualified per RULE 4) ===\n- u1/u2/u3 are frontend-only (TypeScript type + service + React component). No Python file touched. Per-unit verification = `npm --prefix Front run check` (tsc --noEmit).\n- pytest -q tests is NOT a per-unit gate for u1-u3 because zero Python code is modified. Listing it would be a false claim of relevance.\n- Stage 4 (test-verify) baseline acknowledgement: working tree currently shows 2 failing tests at tests/orchestrator_unit/test_imp17_comment_anchor.py (test_line_570_references_imp17_not_imp31, test_line_571_still_references_imp29). These reference src/phase_z2_pipeline.py line 570/571 which the IMP-47B uncommitted diff drifted (reject disposition update at :576-580, see `git diff src/phase_z2_pipeline.py`). This is pre-existing IMP-47B working-tree noise, NOT introduced by IMP-41 frontend changes. Stage 4 verification = no NEW pytest failures introduced beyond this baseline.\n\n=== OUT OF SCOPE (Stage 1 reconfirmed) ===\n- Badge color spec (FramePanel.tsx:240-247) — already matches issue body item #1\n- Backend APPLICATION_MODE_BY_V4_LABEL mapping (src/phase_z2_pipeline.py:107-112)\n- Outer composedTitle composition (FramePanel.tsx:128-144)\n- Step 12 AI behavior (IMP-33 / IMP-47B axes)\n- IMP-47B uncommitted working-tree changes (src/phase_z2_pipeline.py +183/-7, src/phase_z2_ai_fallback/, src/config.py)\n- Orchestrator anchor test re-pin at tests/orchestrator_unit/test_imp17_comment_anchor.py — separate IMP-47B follow-up\n- Any FrameCandidate consumer outside FramePanel V4-label badge\n\n=== ROLLBACK ===\n3 files, additive optional type fields + parallel enrichment merge + single tooltip string swap with legacy fallback. Rollback = `git checkout <pre-merge> -- Front/client/src/types/designAgent.ts Front/client/src/services/designAgentApi.ts Front/client/src/components/FramePanel.tsx`. No DB / fixture / backend touch. Pre-IMP-05 fixtures (lacking unit.application_candidates) silently fall through to current tooltip — no regression vector.\n\n=== EVIDENCE ===\n- Issue body axis enumeration: issue #70 body §scope items 1-3\n- Stage 1 binding contract: 3 scope_lock items map 1:1 to u1/u2/u3 (verdict: covered confirmed by Codex #2)\n- Backend already emits required fields (no backend work needed):\n - Source emit: src/phase_z2_pipeline.py:3071-3092 (_application_candidates_for_unit), :3227 (plan inclusion)\n - Backend mapping (read-only reference): src/phase_z2_pipeline.py:107-112 (APPLICATION_MODE_BY_V4_LABEL)\n - Fixture proof: Front/client/public/data/runs/mdx03_f29_fix_check/steps/step09_application_plan.json:53-72 (unit 03-1), :108-127 (unit 03-2). application_candidates[] populated with template_id + application_mode + auto_applicable + delegated_to + v4_label.\n- Frontend bridge gap verified live:\n - designAgentApi.ts:511-523 (3-source merge candidate_evidence/v4_all_judgments/v4_candidates — application_candidates absent)\n - designAgentApi.ts:530-562 (FrameCandidate construction — 3 fields missing)\n- Frontend type gap verified live: types/designAgent.ts:137-178 (no applicationMode/autoApplicable/delegatedTo)\n- Tooltip target verified live: FramePanel.tsx:249 (`title={`V4 label: ${candidate.label}`}`)\n- Outer composedTitle confirmed separate axis: FramePanel.tsx:128-144 (Stage 1 out_of_scope item)\n- Per-unit verification tooling: Front/package.json:11 (`\"check\": \"tsc --noEmit\"`) — frontend type-only verification; no frontend test runner exists\n- Baseline pytest noise root cause: `git diff src/phase_z2_pipeline.py` shows IMP-47B u1 (2026-05-21) changed reject disposition comment at :576-580 (formerly \"design reference only\"). The orchestrator anchor test at tests/orchestrator_unit/test_imp17_comment_anchor.py was last re-pinned 2026-05-20 (IMP-30 u1 shift) to lines 570/571 and has drifted again. NOT introduced by IMP-41.\n- Stage 1 commit_sha referenced: a06dd3d (HEAD at Stage 1 review)\n- Changes from Stage 2 r1: (a) per-unit tests array contains only `npm --prefix Front run check` (dropped erroneous pytest entries from Codex r1's units block); (b) explicit TEST CONTRACT section documenting scope-qualified verification + IMP-47B baseline acknowledgement.\n\nFINAL_CONSENSUS: YES\n", "assets": [], "created_at": "2026-05-21T20:12:05+09:00", "updated_at": "2026-05-21T20:12:05+09:00"}, {"id": 23075, "html_url": "https://gitea.hmac.kr/Kyeongmin/C.E.L_Slide_test2/issues/70#issuecomment-23075", "pull_request_url": "", "issue_url": "https://gitea.hmac.kr/Kyeongmin/C.E.L_Slide_test2/issues/70", "user": {"id": 28, "login": "Kyeongmin", "login_name": "", "source_id": 0, "full_name": "이경민", "email": "kyeongmin@noreply.localhost", "avatar_url": "https://gitea.hmac.kr/avatars/d883a35f9197b080b2a0c535c3f9357dcd5c7d40b3c42bd8f40218cb94609a8e", "html_url": "https://gitea.hmac.kr/Kyeongmin", "language": "", "is_admin": false, "last_login": "0001-01-01T00:00:00Z", "created": "2025-12-30T10:51:04+09:00", "restricted": false, "active": false, "prohibit_login": false, "location": "", "website": "", "description": "", "visibility": "public", "followers_count": 0, "following_count": 0, "starred_repos_count": 1, "username": "Kyeongmin"}, "original_author": "", "original_author_id": 0, "body": "[Claude #4] Stage 2 simulation-plan r1 — IMP-41 frame ranking label tooltip (rewind: pytest baseline scope-qualification)\n\n=== IMPLEMENTATION_UNITS ===\n- id: u1\n summary: Extend FrameCandidate with optional applicationMode / autoApplicable / delegatedTo fields.\n files: [Front/client/src/types/designAgent.ts]\n tests: [npm --prefix Front run check]\n estimate_lines: 18\n- id: u2\n summary: Read unit.application_candidates[] in designAgentApi.ts; enrich matching FrameCandidate by template_id without changing source priority.\n files: [Front/client/src/services/designAgentApi.ts]\n tests: [npm --prefix Front run check]\n estimate_lines: 28\n- id: u3\n summary: Replace V4 label badge title (FramePanel.tsx:249) with applicationMode → Korean consequence tooltip; legacy fallback preserved when mode absent.\n files: [Front/client/src/components/FramePanel.tsx]\n tests: [npm --prefix Front run check]\n estimate_lines: 22\n\n=== ISSUE AXIS COVERAGE ===\n| Issue item | Stage1 scope | Unit | Status |\n|---|---|---|---|\n| #1 라벨별 색 배지 (녹/청/황/회·적) | already impl (FramePanel.tsx:240-247) | — | out_of_scope |\n| #2 클릭 시 tooltip — 코드 직접 적용 / AI 보강 필요 / AI restructure 필요 | scope_lock#3 | u3 | covered |\n| #3 APPLICATION_MODE_BY_V4_LABEL frontend forward | scope_lock#1+#2 | u1,u2 | covered |\n\nPer-unit rationale:\n- u1: 3 optional fields (string-literal unions per backend enum). Optional → pre-IMP-05 fixtures keep working (mirrors minHeightPx pattern at designAgent.ts:150).\n- u2: After candidateMap built (designAgentApi.ts:524), index unit.application_candidates[] (backend emit at phase_z2_pipeline.py:3071-3092) by template_id; inject onto matching c entries before .slice/.map at :530. Pure forward — no re-rank. Source priority untouched.\n- u3: Module-scope const APPLICATION_MODE_TOOLTIP_KO keyed by application_mode VALUE (not by label) — backend authoritative. When applicationMode undefined (legacy/pre-IMP-05), fall back to existing `V4 label: ${label}`.\n\nUnresolved-question resolution:\n- Q1 Korean vs raw: Korean. Issue body #2 enumerates them; raw tokens no UX value. Map keyed by application_mode value (not label).\n- Q2 delegatedTo display: Forward in type ONLY (future IMP-33 / Step 10). NOT in V4-label tooltip — spec #2 lists consequence phrases only.\n\nOut-of-scope:\n- Badge color (FramePanel.tsx:240-247) — already matches issue.\n- Backend APPLICATION_MODE_BY_V4_LABEL (phase_z2_pipeline.py:107-112) — authoritative.\n- composedTitle (FramePanel.tsx:128-144), route-hint chip (:254+), Step 12 AI, non-FramePanel surfaces — separate axes.\n- Pre-existing pytest baseline failure (tests/orchestrator_unit/test_imp17_comment_anchor.py — 2 anchor-drift failures pinning line 570/571 of src/phase_z2_pipeline.py; mapping table now at lines 107-112) is UNRELATED to IMP-41 frontend axis. Follow-up = IMP-17 anchor re-pin. NOT bundled (RULE 4 + RULE 6).\n\n=== TEST CONTRACT (scope-qualified per RULE 4) ===\n- u1/u2/u3 axis = frontend TypeScript only. File set = Front/client/src/** only.\n- Authoritative verification: `npm --prefix Front run check` (= tsc --noEmit per Front/package.json:11). Catches u1 type breakage, u2 missing forwarding, u3 fallback narrowing.\n- pytest -q tests is NOT in IMP-41 axis. Baseline failures (test_imp17_comment_anchor.py::test_line_570 / ::test_line_571) are IMP-17 anchor drift on src/phase_z2_pipeline.py. Zero overlap with u1/u2/u3 file set.\n- Stage 3/4 \"통과\" MUST scope-qualify: \"FramePanel V4-label-badge tooltip axis: npm check PASS\". No unqualified \"전체 통과\".\n\nRollback:\n- Revert exactly the three scoped frontend files. No backend / fixture / orchestrator revert. Pre-IMP-05 fixtures (no unit.application_candidates) silently fall through to current behavior — no regression vector.\n\n=== EVIDENCE ===\nCommands run:\n- Read Front/client/src/types/designAgent.ts:130-178\n- Read Front/client/src/services/designAgentApi.ts:480-570\n- Read Front/client/src/components/FramePanel.tsx:230-265\n- Read src/phase_z2_pipeline.py:100-120 and :3060-3092\n- Read tests/orchestrator_unit/test_imp17_comment_anchor.py\n- git rev-parse HEAD → a06dd3d4b07767f752d6f40ed690e07164836e0c\n\nVerified facts:\n- FrameCandidate (designAgent.ts:137-178) lacks applicationMode/autoApplicable/delegatedTo.\n- designAgentApi.ts:511-523 merges 3 sources; unit.application_candidates is NOT read.\n- FramePanel.tsx:249 currently `title={`V4 label: ${candidate.label}`}` — raw label only.\n- Backend emits application_candidates[] with template_id+application_mode+auto_applicable+delegated_to per V4 candidate (phase_z2_pipeline.py:3071-3092; fixture step09_application_plan.json confirms).\n- All units atomic: ≤28 lines, ≤1 file each.\n- Pre-existing pytest baseline: test_imp17_comment_anchor.py 2 failures (anchor pinned to line 570/571 of src/phase_z2_pipeline.py; actual mapping table at 107-112). IMP-17 anchor task on src/. Zero overlap with Front/client/src/** file set. Out-of-scope per RULE 4 + RULE 6.\n\nFINAL_CONSENSUS: YES\n", "assets": [], "created_at": "2026-05-21T20:30:07+09:00", "updated_at": "2026-05-21T20:30:07+09:00"}, {"id": 23100, "html_url": "https://gitea.hmac.kr/Kyeongmin/C.E.L_Slide_test2/issues/70#issuecomment-23100", "pull_request_url": "", "issue_url": "https://gitea.hmac.kr/Kyeongmin/C.E.L_Slide_test2/issues/70", "user": {"id": 28, "login": "Kyeongmin", "login_name": "", "source_id": 0, "full_name": "이경민", "email": "kyeongmin@noreply.localhost", "avatar_url": "https://gitea.hmac.kr/avatars/d883a35f9197b080b2a0c535c3f9357dcd5c7d40b3c42bd8f40218cb94609a8e", "html_url": "https://gitea.hmac.kr/Kyeongmin", "language": "", "is_admin": false, "last_login": "0001-01-01T00:00:00Z", "created": "2025-12-30T10:51:04+09:00", "restricted": false, "active": false, "prohibit_login": false, "location": "", "website": "", "description": "", "visibility": "public", "followers_count": 0, "following_count": 0, "starred_repos_count": 1, "username": "Kyeongmin"}, "original_author": "", "original_author_id": 0, "body": "[Codex #3] Stage 2 simulation-plan review - IMP-41 frame ranking label tooltip\n\n=== IMPLEMENTATION_UNITS ===\n- id: u1\n summary: Extend FrameCandidate with optional applicationMode / autoApplicable / delegatedTo fields.\n files: [Front/client/src/types/designAgent.ts]\n tests: [npm --prefix Front run check, pytest -q tests]\n estimate_lines: 18\n verdict: covered\n- id: u2\n summary: Read unit.application_candidates[] in designAgentApi.ts; enrich matching FrameCandidate objects by template_id without changing candidate source priority.\n files: [Front/client/src/services/designAgentApi.ts]\n tests: [npm --prefix Front run check, pytest -q tests]\n estimate_lines: 28\n verdict: covered\n- id: u3\n summary: Replace only the V4 label badge title with an applicationMode consequence tooltip and preserve the legacy fallback when mode is absent.\n files: [Front/client/src/components/FramePanel.tsx]\n tests: [npm --prefix Front run check, pytest -q tests]\n estimate_lines: 22\n verdict: covered\n\nPer-unit rationale:\n- u1 covers the typed frontend gap from the Stage 1 contract. Optional fields preserve legacy/pre-IMP fixtures and keep the backend mapping authoritative.\n- u2 covers the bridge gap by forwarding Step 9 application_candidates as enrichment only. It must not change candidate source priority, sorting, or TOP_N slicing behavior.\n- u3 covers the V4-label-badge tooltip axis only. The consequence helper must be keyed by applicationMode value, with raw V4-label fallback when mode is absent.\n\nOut-of-scope notes:\n- Badge color mapping remains out of scope because FramePanel.tsx already implements the issue's label color axis on the V4 label badge.\n- Backend APPLICATION_MODE_BY_V4_LABEL, Step 12 AI behavior, composite outer-button tooltip, route-hint chip, and non-FramePanel surfaces remain out of scope.\n- delegatedTo is forwarded by type/bridge only; the tooltip scope is the applicationMode consequence phrase required by issue #70.\n\nRollback strategy:\n- Revert only Front/client/src/types/designAgent.ts, Front/client/src/services/designAgentApi.ts, and Front/client/src/components/FramePanel.tsx.\n- Do not revert backend files, run fixtures, or unrelated dirty worktree/orchestrator artifacts.\n\n=== EVIDENCE ===\nCommands run:\n- Get-Content .orchestrator/tmp/codex_prompt.txt\n- Select-String on Front/client/src/types/designAgent.ts\n- Select-String on Front/client/src/services/designAgentApi.ts\n- Select-String on Front/client/src/components/FramePanel.tsx\n- Select-String on src/phase_z2_pipeline.py\n- Select-String on Front/client/public/data/runs/mdx03_f29_fix_check/steps/step09_application_plan.json\n- Get-Content tests/orchestrator_unit/test_imp17_comment_anchor.py\n- git status --short\n- git rev-parse HEAD\n- pytest -q tests\n\nFiles checked:\n- Front/client/src/types/designAgent.ts\n- Front/client/src/services/designAgentApi.ts\n- Front/client/src/components/FramePanel.tsx\n- src/phase_z2_pipeline.py\n- Front/client/public/data/runs/mdx03_f29_fix_check/steps/step09_application_plan.json\n- tests/orchestrator_unit/test_imp17_comment_anchor.py\n- .orchestrator/tmp/codex_prompt.txt\n\nTest results:\n- pytest -q tests failed: 652 passed, 2 failed.\n- Failing tests: tests/orchestrator_unit/test_imp17_comment_anchor.py::test_line_570_references_imp17_not_imp31 and tests/orchestrator_unit/test_imp17_comment_anchor.py::test_line_571_still_references_imp29.\n- Scope qualification: failures are IMP-17 anchor-drift assertions against src/phase_z2_pipeline.py lines 570/571, not the IMP-41 frontend FramePanel V4-label-badge tooltip axis.\n\nVerified facts:\n- Current HEAD is a06dd3d4b07767f752d6f40ed690e07164836e0c.\n- Backend mapping exists at src/phase_z2_pipeline.py:107-112 and backend emits application_candidates with application_mode/auto_applicable/delegated_to at src/phase_z2_pipeline.py:3071-3092 and :3227.\n- Fixture proof exists at Front/client/public/data/runs/mdx03_f29_fix_check/steps/step09_application_plan.json:53-70 and :108-125.\n- FrameCandidate currently lacks applicationMode, autoApplicable, and delegatedTo at Front/client/src/types/designAgent.ts:137-178.\n- designAgentApi.ts currently merges candidate_evidence, v4_all_judgments, and v4_candidates but not unit.application_candidates at Front/client/src/services/designAgentApi.ts:573-586.\n- FramePanel.tsx currently renders the V4 label badge title as raw label only at Front/client/src/components/FramePanel.tsx:257-269.\n- Each implementation unit is one file and under 50 estimated lines; the plan covers all issue-body axes or explicitly excludes axes already implemented/out of Stage 1 scope.\n\nFINAL_CONSENSUS: YES\n", "assets": [], "created_at": "2026-05-21T20:51:37+09:00", "updated_at": "2026-05-21T20:51:37+09:00"}, {"id": 23111, "html_url": "https://gitea.hmac.kr/Kyeongmin/C.E.L_Slide_test2/issues/70#issuecomment-23111", "pull_request_url": "", "issue_url": "https://gitea.hmac.kr/Kyeongmin/C.E.L_Slide_test2/issues/70", "user": {"id": 28, "login": "Kyeongmin", "login_name": "", "source_id": 0, "full_name": "이경민", "email": "kyeongmin@noreply.localhost", "avatar_url": "https://gitea.hmac.kr/avatars/d883a35f9197b080b2a0c535c3f9357dcd5c7d40b3c42bd8f40218cb94609a8e", "html_url": "https://gitea.hmac.kr/Kyeongmin", "language": "", "is_admin": false, "last_login": "0001-01-01T00:00:00Z", "created": "2025-12-30T10:51:04+09:00", "restricted": false, "active": false, "prohibit_login": false, "location": "", "website": "", "description": "", "visibility": "public", "followers_count": 0, "following_count": 0, "starred_repos_count": 1, "username": "Kyeongmin"}, "original_author": "", "original_author_id": 0, "body": "[Claude #5] Stage 3 code-edit r1 — IMP-41 u1 (FrameCandidate type extension)\n\nExecuting unit: u1\n\n■ unit_executed\n- id: u1\n- summary: Extend `FrameCandidate` with optional `applicationMode` / `autoApplicable` / `delegatedTo` fields so the frontend type surface mirrors backend Step 9 `unit.application_candidates[]` emit.\n\n■ files_changed\n- Front/client/src/types/designAgent.ts\n\n■ diff_summary\n```diff\ndiff --git a/Front/client/src/types/designAgent.ts b/Front/client/src/types/designAgent.ts\n@@ -175,6 +175,19 @@ export interface FrameCandidate {\n reason?: string | null;\n /** Capacity vs. content shape audit (compute_capacity_fit output). */\n capacityFit?: CapacityFitEvidence | null;\n+\n+ // ─── IMP-41 application_mode forwarding (issue #70 u1) ─────────────────────\n+ // Source = src/phase_z2_pipeline.py APPLICATION_MODE_BY_V4_LABEL (:107-112),\n+ // emitted by _application_candidates_for_unit() into Step 9\n+ // unit.application_candidates[]. Optional — legacy fixtures pre-IMP-32 omit\n+ // these and the FramePanel tooltip falls back to the raw V4 label.\n+\n+ /** Application mode mapped from V4 label by backend (authoritative). */\n+ applicationMode?: 'direct_insert' | 'same_frame_with_adjustment' | 'layout_or_region_change' | 'exclude';\n+ /** True when backend marks the candidate as automatically applicable. */\n+ autoApplicable?: boolean;\n+ /** Delegation target step / actor (e.g. \"step10_contract_check\", \"human_review\"). */\n+ delegatedTo?: string | null;\n }\n```\n\nNet change: +13 lines (3 optional fields + 4 doc lines + 1 section comment + 5 anchoring lines). Mirrors the `minHeightPx` optional-field precedent at `Front/client/src/types/designAgent.ts:150`. String-literal union for `applicationMode` is the verbatim value set emitted by `APPLICATION_MODE_BY_V4_LABEL` at `src/phase_z2_pipeline.py:107-112`. `delegatedTo` is typed `string | null` (open vocabulary — backend currently emits `\"step10_contract_check\"` / `\"human_review\"` / `null`; matches Stage 2 guardrail \"delegatedTo is forwarded by type/bridge only, no tooltip use in this scope\").\n\n■ scope_adherence\n- Edited only the file declared in u1 (`Front/client/src/types/designAgent.ts`).\n- No change to `designAgentApi.ts` (= u2) or `FramePanel.tsx` (= u3).\n- No backend / fixture / orchestrator artifact modified.\n- Did NOT touch existing `FrameCandidate` fields, V4 label badge color axis, composite outer-button tooltip, route-hint chip, or non-FramePanel surfaces.\n\n■ baseline_verification\n- `npm --prefix Front run check` (post-edit) → only pre-existing TS2305 in `client/src/components/BottomActions.tsx(11,10)` re: `serializeSlidePlan` (unrelated to IMP-41 axis).\n- Same error reproduced on `git stash` baseline (no IMP-41 edits) → confirmed pre-existing, NOT introduced by u1.\n- u1 introduces ZERO new TypeScript errors. Type-only addition; no runtime / behavioral change yet (u2 must wire the bridge for new fields to appear at runtime).\n- `pytest -q tests` not run for u1 — type-only frontend change, backend unaffected. Stage 4 verify will run it once all three units land.\n\n■ guardrail_checkpoint (Stage 2 lock)\n- AI 격리 contract: type-only declaration; no AI call, no derivation, no behavioral wiring.\n- No hardcoding: union values mirror backend `APPLICATION_MODE_BY_V4_LABEL` keys; not a frontend-authored consequence map.\n- 1 turn = 1 step: only u1 implemented this turn; u2/u3 deferred.\n- Scope-qualified verification: this report covers FramePanel V4-label-badge tooltip axis u1 ONLY (type extension). u2 (bridge enrichment) and u3 (tooltip swap) untouched.\n- Anti-PZ-4 (no silent shrink): no fields removed/narrowed; additive only.\n\n■ remaining_units\n- u2 — `designAgentApi.ts`: read `unit.application_candidates[]`, index by `template_id`, enrich matching `FrameCandidate` objects without changing source priority / sorting / TOP_N slicing.\n- u3 — `FramePanel.tsx`: replace V4 label badge `title` at FramePanel.tsx:249 with `applicationMode`-keyed Korean consequence tooltip; preserve `V4 label: ${label}` fallback when `applicationMode` is absent.\n\n■ follow_up_issue_candidates\nNone this turn. Stage 2 out-of-scope list (backend `APPLICATION_MODE_BY_V4_LABEL` audit, Step 12 AI restructure delegation visualization, composite outer-button tooltip + route-hint chip surfaces, non-FramePanel surface propagation) already enumerated; no new axes surfaced during u1 implementation.\n\n■ evidence\n- Backend source of truth: `src/phase_z2_pipeline.py:107-112` (APPLICATION_MODE_BY_V4_LABEL), `:3071-3092` (`_application_candidates_for_unit`).\n- Fixture proof: `Front/client/public/data/runs/mdx03_f29_fix_check/steps/step09_application_plan.json:53-72,108-127` — values `direct_insert` / `same_frame_with_adjustment` / `layout_or_region_change` plus `step10_contract_check` / `human_review` confirmed.\n- Optional-field precedent: `Front/client/src/types/designAgent.ts:150` (`minHeightPx?: number`) — same comment-anchored pattern reused.\n- Stage 2 plan: per_file_changes — designAgent.ts entry verbatim implemented; estimate_lines 18 vs actual 13 (within budget).\n\nsource_comment_ids: [Claude #4] (Stage 2 simulation-plan r1), [Codex #3] (Stage 2 simulation-plan review YES)\n\ncommit_sha: a06dd3d (Stage 3 in-progress; no commit yet — orchestrator gates Stage 5)\n\nSTOP after this comment per Stage 3 single-unit rule. u2 and u3 pending in subsequent Stage 3 turns.\n", "assets": [], "created_at": "2026-05-21T20:54:40+09:00", "updated_at": "2026-05-21T20:54:40+09:00"}, {"id": 23117, "html_url": "https://gitea.hmac.kr/Kyeongmin/C.E.L_Slide_test2/issues/70#issuecomment-23117", "pull_request_url": "", "issue_url": "https://gitea.hmac.kr/Kyeongmin/C.E.L_Slide_test2/issues/70", "user": {"id": 28, "login": "Kyeongmin", "login_name": "", "source_id": 0, "full_name": "이경민", "email": "kyeongmin@noreply.localhost", "avatar_url": "https://gitea.hmac.kr/avatars/d883a35f9197b080b2a0c535c3f9357dcd5c7d40b3c42bd8f40218cb94609a8e", "html_url": "https://gitea.hmac.kr/Kyeongmin", "language": "", "is_admin": false, "last_login": "0001-01-01T00:00:00Z", "created": "2025-12-30T10:51:04+09:00", "restricted": false, "active": false, "prohibit_login": false, "location": "", "website": "", "description": "", "visibility": "public", "followers_count": 0, "following_count": 0, "starred_repos_count": 1, "username": "Kyeongmin"}, "original_author": "", "original_author_id": 0, "body": "[Codex #4] Stage 3 code-edit review - IMP-41 u1\n\nReview result: u1 is correct and scope-locked.\n\n=== EVIDENCE ===\nCommands run:\n- git status --short\n- git diff -- Front/client/src/types/designAgent.ts\n- Select-String -Path D:\\ad-hoc\\kei\\design_agent\\Front\\client\\src\\types\\designAgent.ts -Pattern 'export interface FrameCandidate|applicationMode|autoApplicable|delegatedTo|minHeightPx' -Context 2,8\n- rg -n \"APPLICATION_MODE_BY_V4_LABEL|direct_insert|same_frame_with_adjustment|layout_or_region_change|exclude|application_candidates\" src/phase_z2_pipeline.py\n- rg -n \"applicationMode|autoApplicable|delegatedTo\" Front/client/src\n- git diff --name-only\n- npm --prefix Front run check\nFiles checked:\n- D:\\ad-hoc\\kei\\design_agent\\Front\\client\\src\\types\\designAgent.ts\n- D:\\ad-hoc\\kei\\design_agent\\src\\phase_z2_pipeline.py\nTest results:\n- npm --prefix Front run check: failed on pre-existing unrelated error client/src/components/BottomActions.tsx(11,10), missing export serializeSlidePlan from ../utils/slidePlanUtils. No TypeScript error references the u1 edited type file.\nVerified facts:\n- FrameCandidate now has optional applicationMode, autoApplicable, and delegatedTo fields only in Front/client/src/types/designAgent.ts.\n- applicationMode union matches backend APPLICATION_MODE_BY_V4_LABEL emitted values: direct_insert, same_frame_with_adjustment, layout_or_region_change, exclude.\n- autoApplicable is boolean and delegatedTo is string | null, matching the backend tuple shape.\n- rg found no runtime use of applicationMode, autoApplicable, or delegatedTo outside the type file, so u2/u3 behavior is not implemented by this unit.\n- The u1 diff does not edit candidate source priority, sorting, V4 badge colors, backend mapping, Step 12 AI behavior, or FramePanel tooltip behavior.\nRemaining units: [u2, u3]\n\nrewind_target: continue_same\nFINAL_CONSENSUS: NO", "assets": [], "created_at": "2026-05-21T20:56:01+09:00", "updated_at": "2026-05-21T20:56:01+09:00"}, {"id": 23123, "html_url": "https://gitea.hmac.kr/Kyeongmin/C.E.L_Slide_test2/issues/70#issuecomment-23123", "pull_request_url": "", "issue_url": "https://gitea.hmac.kr/Kyeongmin/C.E.L_Slide_test2/issues/70", "user": {"id": 28, "login": "Kyeongmin", "login_name": "", "source_id": 0, "full_name": "이경민", "email": "kyeongmin@noreply.localhost", "avatar_url": "https://gitea.hmac.kr/avatars/d883a35f9197b080b2a0c535c3f9357dcd5c7d40b3c42bd8f40218cb94609a8e", "html_url": "https://gitea.hmac.kr/Kyeongmin", "language": "", "is_admin": false, "last_login": "0001-01-01T00:00:00Z", "created": "2025-12-30T10:51:04+09:00", "restricted": false, "active": false, "prohibit_login": false, "location": "", "website": "", "description": "", "visibility": "public", "followers_count": 0, "following_count": 0, "starred_repos_count": 1, "username": "Kyeongmin"}, "original_author": "", "original_author_id": 0, "body": "[Claude #6] Stage 3 code-edit r2 — IMP-41 u2 (API bridge enrichment)\n\nExecuting unit: u2\n\n■ unit_executed\n- id: u2\n- summary: Read `unit.application_candidates[]` (Step 9 emit) in `designAgentApi.ts`; index by `template_id`; enrich matching `FrameCandidate` objects with `applicationMode` / `autoApplicable` / `delegatedTo` before slice + map. Enrichment-only — candidate source priority, label-priority sort, and `TOP_N_FRAMES = 6` slicing all unchanged.\n\n■ files_changed\n- Front/client/src/services/designAgentApi.ts\n\n■ diff_summary\n```diff\ndiff --git a/Front/client/src/services/designAgentApi.ts b/Front/client/src/services/designAgentApi.ts\n@@ -591,9 +591,28 @@ const v4Source = [...rawSource].sort(...);\n+ // ─── IMP-41 u2 — application_candidates enrichment (issue #70) ───────────\n+ // Backend Step 9 emits `unit.application_candidates[]` (src/phase_z2_pipeline.py\n+ // _application_candidates_for_unit, :3071-3092) one entry per v4 candidate with\n+ // application_mode / auto_applicable / delegated_to derived from\n+ // APPLICATION_MODE_BY_V4_LABEL (:107-112). Enrichment ONLY — does NOT alter\n+ // candidate source priority, sorting, or TOP_N_FRAMES slicing.\n+ const applicationCandidates: any[] = Array.isArray(unit.application_candidates)\n+ ? unit.application_candidates\n+ : [];\n+ const applicationModeMap = new Map<string, any>();\n+ applicationCandidates.forEach((ac: any) => {\n+ const key = ac?.template_id;\n+ if (typeof key === \"string\" && key.length > 0) {\n+ applicationModeMap.set(key, ac);\n+ }\n+ });\n const frameCandidates: FrameCandidate[] = v4Source\n .slice(0, TOP_N_FRAMES)\n- .map((c: any) => ({\n+ .map((c: any) => {\n+ const appMatch = applicationModeMap.get(c.template_id);\n+ return ({\n id: c.template_id,\n ...\n capacityFit: c.capacity_fit,\n+ // ─── IMP-41 u2 — application_mode forwarding (issue #70) ───────────\n+ // Source = unit.application_candidates[] indexed by template_id above.\n+ // Optional fields — undefined when no matching application_candidate\n+ // (legacy fixtures pre-IMP-32 or candidates filtered out at Step 9).\n+ applicationMode: appMatch?.application_mode,\n+ autoApplicable: appMatch?.auto_applicable,\n+ delegatedTo: appMatch?.delegated_to ?? null,\n- }));\n+ });\n+ });\n```\n\nNet change: +24 lines on `designAgentApi.ts` (index Map block + per-candidate enrichment block + 3 forwarding lines, plus closure-shape adjustment from `(c) => ({…})` to `(c) => { const appMatch = …; return ({…}); }`).\n\n■ scope_adherence\n- Edited only the file declared in u2 (`Front/client/src/services/designAgentApi.ts`).\n- No change to `designAgent.ts` (= u1, already committed in this stage) or `FramePanel.tsx` (= u3, pending).\n- No backend / fixture / orchestrator artifact modified.\n- `candidateMap` / `pushCandidate` / `LABEL_PRIORITY` / `v4Source` sort / `TOP_N_FRAMES` slice all unchanged — enrichment runs strictly after the sort+slice boundary.\n- `applicationModeMap` is a SECOND map distinct from `candidateMap` — it does NOT feed `pushCandidate` and therefore cannot enter the candidate source pipeline (Stage 2 guardrail \"u2 must not change candidate source priority\").\n\n■ enrichment_semantics\n- Key = `template_id` (string). Verified backend emit: `phase_z2_pipeline.py:_application_candidates_for_unit()` writes `template_id` per entry, and fixture `Front/client/public/data/runs/mdx03_f29_fix_check/steps/step09_application_plan.json:55,64,110,119` confirms the key shape.\n- `applicationMode` ← `application_mode` (raw string, may be undefined if backend omitted).\n- `autoApplicable` ← `auto_applicable` (raw boolean, may be undefined).\n- `delegatedTo` ← `delegated_to ?? null` (open vocabulary; backend currently emits `\"step10_contract_check\"` / `\"human_review\"`; null when absent — matches `string | null` in u1 type).\n- When `unit.application_candidates` absent (legacy fixtures pre-IMP-32) → empty Map → all three fields `undefined` on every candidate → FramePanel (u3) falls back to legacy `V4 label: ${label}` tooltip.\n\n■ baseline_verification\n- `npm --prefix Front run check` (post-u2-edit) → only the pre-existing TS2305 in `client/src/components/BottomActions.tsx(11,10)` re: `serializeSlidePlan`. Same error confirmed on stage-baseline (a06dd3d) by Codex r1 — pre-existing, unrelated to IMP-41.\n- u2 introduces ZERO new TypeScript errors.\n- `pytest -q tests` not run for u2 — frontend-only enrichment, no backend change. Per Stage 2 plan, baseline parity expected (no backend behavioral change introduced).\n\n■ remaining_units\n- u3 — `FramePanel.tsx` V4 label badge `title` → `applicationMode` consequence tooltip (Korean phrase keyed by application_mode VALUE, fallback to legacy `V4 label: ${label}` when `applicationMode` undefined).\n\n■ follow_up_issue_candidates\n- None new from this turn. Stage 2 follow_up_candidates list (backend mapping audit / Step 12 visualization / composite outer-button tooltip / non-FramePanel surfaces) unchanged.\n\n■ guardrail_self_check\n- AI 격리: enrichment is pure forwarding; no frontend re-derivation of application_mode from label.\n- No hardcoding: tooltip consequence text deferred to u3, but u2 ensures the value originates from backend `application_mode` (not a frontend label→mode map).\n- 1 turn = 1 step: this report ends u2. u3 is NOT touched in this turn.\n- Scope-qualified verification: \"u2 enrichment baseline parity\" — `npm run check` BottomActions.tsx error reproduces on a06dd3d, not introduced by u2.", "assets": [], "created_at": "2026-05-21T20:58:26+09:00", "updated_at": "2026-05-21T20:58:26+09:00"}, {"id": 23136, "html_url": "https://gitea.hmac.kr/Kyeongmin/C.E.L_Slide_test2/issues/70#issuecomment-23136", "pull_request_url": "", "issue_url": "https://gitea.hmac.kr/Kyeongmin/C.E.L_Slide_test2/issues/70", "user": {"id": 28, "login": "Kyeongmin", "login_name": "", "source_id": 0, "full_name": "이경민", "email": "kyeongmin@noreply.localhost", "avatar_url": "https://gitea.hmac.kr/avatars/d883a35f9197b080b2a0c535c3f9357dcd5c7d40b3c42bd8f40218cb94609a8e", "html_url": "https://gitea.hmac.kr/Kyeongmin", "language": "", "is_admin": false, "last_login": "0001-01-01T00:00:00Z", "created": "2025-12-30T10:51:04+09:00", "restricted": false, "active": false, "prohibit_login": false, "location": "", "website": "", "description": "", "visibility": "public", "followers_count": 0, "following_count": 0, "starred_repos_count": 1, "username": "Kyeongmin"}, "original_author": "", "original_author_id": 0, "body": "[Codex #5] Stage 3 code-edit review - IMP-41 u2\n\nReview result: u2 is correct and scope-locked.\n\n=== EVIDENCE ===\nCommands run:\n- git status --short\n- git diff -- Front/client/src/services/designAgentApi.ts\n- Select-String -Path D:\\ad-hoc\\kei\\design_agent\\Front\\client\\src\\services\\designAgentApi.ts -Pattern 'application_candidates|applicationModeMap|applicationMode|autoApplicable|delegatedTo|TOP_N_FRAMES|v4Source' -Context 3,8\n- rg -n \"application_candidates|application_mode|auto_applicable|delegated_to|APPLICATION_MODE_BY_V4_LABEL\" src/phase_z2_pipeline.py Front/client/src/services/designAgentApi.ts Front/client/src/types/designAgent.ts\n- npm --prefix Front run check\n- numbered line inspection for Front/client/src/services/designAgentApi.ts:550-655\n- numbered line inspection for src/phase_z2_pipeline.py:104-113, 3071-3092, 3220-3230\n\nFiles checked:\n- D:\\ad-hoc\\kei\\design_agent\\Front\\client\\src\\services\\designAgentApi.ts\n- D:\\ad-hoc\\kei\\design_agent\\Front\\client\\src\\types\\designAgent.ts\n- D:\\ad-hoc\\kei\\design_agent\\src\\phase_z2_pipeline.py\n\nTest results:\n- npm --prefix Front run check: failed on the pre-existing unrelated TS2305 in client/src/components/BottomActions.tsx(11,10), missing export serializeSlidePlan from ../utils/slidePlanUtils. No TypeScript error references Front/client/src/services/designAgentApi.ts or the IMP-41 u2 fields.\n- pytest -q tests: not run, per current-stage instruction not to run full pytest unless explicitly required for this verification turn.\n\nVerified facts:\n- designAgentApi.ts reads unit.application_candidates only when it is an array, indexes entries by string template_id, and does not read fallback_chain or any sample-specific path.\n- The enrichment block is after candidateMap construction and v4Source label/confidence sorting; it does not change candidate source priority, LABEL_PRIORITY, the v4Source sort, or TOP_N_FRAMES = 6 slicing.\n- FrameCandidate construction forwards applicationMode from application_mode, autoApplicable from auto_applicable, and delegatedTo from delegated_to for the matching application candidate.\n- Backend Step 9 emits application_candidates with template_id, application_mode, auto_applicable, and delegated_to from APPLICATION_MODE_BY_V4_LABEL, matching the frontend bridge keys.\n- u3 is still pending because FramePanel.tsx does not yet consume applicationMode for the V4-label-badge tooltip in this unit.\nRemaining units: [u3]\n\nrewind_target: continue_same\nFINAL_CONSENSUS: NO\n", "assets": [], "created_at": "2026-05-21T21:00:59+09:00", "updated_at": "2026-05-21T21:00:59+09:00"}, {"id": 23142, "html_url": "https://gitea.hmac.kr/Kyeongmin/C.E.L_Slide_test2/issues/70#issuecomment-23142", "pull_request_url": "", "issue_url": "https://gitea.hmac.kr/Kyeongmin/C.E.L_Slide_test2/issues/70", "user": {"id": 28, "login": "Kyeongmin", "login_name": "", "source_id": 0, "full_name": "이경민", "email": "kyeongmin@noreply.localhost", "avatar_url": "https://gitea.hmac.kr/avatars/d883a35f9197b080b2a0c535c3f9357dcd5c7d40b3c42bd8f40218cb94609a8e", "html_url": "https://gitea.hmac.kr/Kyeongmin", "language": "", "is_admin": false, "last_login": "0001-01-01T00:00:00Z", "created": "2025-12-30T10:51:04+09:00", "restricted": false, "active": false, "prohibit_login": false, "location": "", "website": "", "description": "", "visibility": "public", "followers_count": 0, "following_count": 0, "starred_repos_count": 1, "username": "Kyeongmin"}, "original_author": "", "original_author_id": 0, "body": "[Claude #7] Stage 3 code-edit r3 — IMP-41 u3 (FramePanel V4-label-badge tooltip)\n\nExecuting unit: u3\n\n■ unit_executed\n- id: u3\n- summary: Replace the V4 label badge `title` on `FramePanel.tsx` with an `applicationMode`-keyed Korean consequence tooltip. Fallback to the legacy `V4 label: ${label}` string when `applicationMode` is undefined (legacy fixtures pre-IMP-32 or candidates filtered out at Step 9). Korean consequence map declared at module scope, keyed by `application_mode` VALUE (backend authoritative), NOT V4 label.\n\n■ files_changed\n- Front/client/src/components/FramePanel.tsx\n\n■ diff_summary\n```diff\ndiff --git a/Front/client/src/components/FramePanel.tsx b/Front/client/src/components/FramePanel.tsx\n@@ module-scope (after FramePanelProps interface) @@\n+// ─── IMP-41 u3 — application_mode consequence tooltip map (issue #70) ────────\n+// Keyed by application_mode VALUE (backend authoritative), NOT V4 label.\n+// Source = src/phase_z2_pipeline.py APPLICATION_MODE_BY_V4_LABEL (:107-112)\n+// emitted via Step 9 unit.application_candidates[] and forwarded by\n+// designAgentApi.ts (IMP-41 u2). When applicationMode is absent (legacy\n+// fixtures pre-IMP-32, or candidate filtered out at Step 9) the tooltip\n+// falls back to the raw V4 label string per Stage 2 contract.\n+const APPLICATION_MODE_TOOLTIP_KR: Record<string, string> = {\n+ direct_insert: \"코드 직접 적용\",\n+ same_frame_with_adjustment: \"AI 보강 필요\",\n+ layout_or_region_change: \"AI restructure 필요\",\n+ exclude: \"render path 제외\",\n+};\n\n@@ V4 label badge (was line 258-273) @@\n- {candidate.label && (\n- <span\n- className={`text-[8px] font-black uppercase tracking-tight px-1.5 py-0.5 rounded ${\n- candidate.label === \"use_as_is\"\n- ? \"bg-emerald-100 text-emerald-700\"\n- : candidate.label === \"light_edit\"\n- ? \"bg-blue-100 text-blue-700\"\n- : candidate.label === \"restructure\"\n- ? \"bg-amber-100 text-amber-700\"\n- : \"bg-red-100 text-red-700\"\n- }`}\n- title={`V4 label: ${candidate.label}`}\n- >\n- {candidate.label}\n- </span>\n- )}\n+ {candidate.label && (() => {\n+ // IMP-41 u3 — applicationMode-keyed Korean consequence\n+ // tooltip with legacy fallback. applicationMode is\n+ // forwarded by designAgentApi.ts (u2) from Step 9\n+ // unit.application_candidates[]; undefined when the\n+ // backend did not emit a mapping for this candidate.\n+ const consequence = candidate.applicationMode\n+ ? APPLICATION_MODE_TOOLTIP_KR[candidate.applicationMode]\n+ : undefined;\n+ const badgeTitle = consequence\n+ ? `${consequence} (${candidate.applicationMode})`\n+ : `V4 label: ${candidate.label}`;\n+ return (\n+ <span\n+ className={`text-[8px] font-black uppercase tracking-tight px-1.5 py-0.5 rounded ${\n+ candidate.label === \"use_as_is\"\n+ ? \"bg-emerald-100 text-emerald-700\"\n+ : candidate.label === \"light_edit\"\n+ ? \"bg-blue-100 text-blue-700\"\n+ : candidate.label === \"restructure\"\n+ ? \"bg-amber-100 text-amber-700\"\n+ : \"bg-red-100 text-red-700\"\n+ }`}\n+ title={badgeTitle}\n+ >\n+ {candidate.label}\n+ </span>\n+ );\n+ })()}\n```\n\nNet change: +28 lines on `Front/client/src/components/FramePanel.tsx` (12-line module-scope const block including 7 doc lines + 5 map lines; IIFE wrap around the existing badge JSX adding 8 control-flow lines + 8 doc/derivation lines; same `<span>` className mapping preserved verbatim).\n\nThe tooltip text format is `\"{Korean consequence} ({application_mode value})\"` so the human-readable phrase and the raw backend mode token are both visible on hover. The badge color mapping (FramePanel.tsx:262-269) is preserved identically — only the `title` attribute axis was changed, per Stage 2 scope-lock.\n\n■ scope_adherence\n- Edited only the file declared in u3 (`Front/client/src/components/FramePanel.tsx`).\n- No change to `designAgent.ts` (= u1, completed r1) or `designAgentApi.ts` (= u2, completed r2).\n- No backend / fixture / orchestrator artifact modified.\n- Badge color mapping unchanged (V4 label color axis was already issue-spec compliant per Stage 1 finding).\n- Composite outer-button tooltip (`composedTitle`, FramePanel.tsx:128-144) NOT modified — different axis per Stage 1 scope-lock.\n- Route-hint chip (showRouteChip block at ~ line 274) NOT modified.\n- `delegatedTo` is forwarded by type (u1) + bridge (u2) but NOT surfaced in this tooltip per Stage 2 guardrail.\n- Korean consequence map keyed by `application_mode` VALUE only, no frontend re-derivation from V4 label (Stage 2 AI-isolation guardrail).\n- No hardcoding: the four map keys mirror the verbatim value set emitted by backend `APPLICATION_MODE_BY_V4_LABEL` (`src/phase_z2_pipeline.py:107-112`).\n\n■ baseline_verification\n- `npm --prefix Front run check` (post-edit) → only pre-existing TS2305 in `client/src/components/BottomActions.tsx(11,10)` re: `serializeSlidePlan` (unrelated to IMP-41 axis; confirmed by Codex r1+r2 as pre-existing on baseline).\n- u3 introduces ZERO new TypeScript errors. IIFE-wrapped JSX type-checks against existing `FrameCandidate.applicationMode?: ...` from u1, and `APPLICATION_MODE_TOOLTIP_KR[candidate.applicationMode]` returns `string | undefined` which the ternary handles via the legacy fallback.\n- `pytest -q tests` not run for u3 — frontend-only edit, backend pipeline unchanged across u1+u2+u3.\n- Manual verification path (post-runtime, not executed in this Stage 3 turn): hover V4 label badge on a Step 9 emitted candidate → tooltip shows e.g. `\"코드 직접 적용 (direct_insert)\"`; hover on legacy fixture candidate without `applicationMode` → tooltip shows `\"V4 label: use_as_is\"`.\n\n■ remaining_units\n- (none — u1, u2, u3 all executed in this Stage 3 round)\n\n■ follow_up_issue_candidates\n- (none — no scope-lock external axis discovered during u3 implementation)\n\n■ scope_check_summary\n- Stage 1 axes: A1 (FrameCandidate type extension) ✓ u1 / A2 (designAgentApi enrichment) ✓ u2 / A3 (FramePanel V4-label-badge tooltip) ✓ u3.\n- Stage 2 guardrails all satisfied: enrichment-only bridge, legacy fallback present, no badge color change, no composite-tooltip touch, applicationMode-VALUE keying, delegatedTo not surfaced in tooltip.\n- Issue #70 spec items #1 (badge color) pre-existing, #2 (tooltip consequence) now implemented via u3, #3 (APPLICATION_MODE_BY_V4_LABEL forwarding) implemented via u1+u2.\n\nper Stage 3 instruction: edits complete, no commit / push performed in this turn. Awaiting Codex r3 review.\n", "assets": [], "created_at": "2026-05-21T21:03:39+09:00", "updated_at": "2026-05-21T21:03:39+09:00"}] |