# Claude Goal Prompt V2 Strict - Finish Canonical Data View Cleanup

이 파일은 1차 Goal 결과가 "분류 완료" 수준에서 멈춘 것을 교정하기 위한 strict prompt다.

1차 결과:
- `notes/gbpark/2026-05-18-canonical-data-view-cleanup-report.md`
- 문제: legacy/V2 잔여를 "분류 가능"으로 통과시켜 실제 흡수/삭제가 부족했다.

이번 V2 목표:
- "분류"는 완료 조건이 아니다.
- legacy/V2가 남으면 반드시 **실제 구현 누락 / 삭제 불가 blocker / domain explicit** 중 하나여야 한다.
- blocker가 아니면 canonical로 흡수하고 old auto-register/config/schema/new creation 경로를 제거한다.

---

## 바로 실행할 `/goal`

```text
/goal Read notes/gbpark/2026-05-18-canonical-data-view-goal.md and notes/gbpark/2026-05-18-canonical-data-view-cleanup-report.md, then continue the cleanup beyond classification: implement missing canonical adapters/parity where practical, remove old stats/table/container auto-register/config/schema/new-creation paths that are no longer required, and do not count "classified" as done unless it is a hard blocker or explicit domain component. Finish only when git diff --check, backend ./gradlew compileJava, input forbidden rg=0, EntityPicker forbidden rg=0 pass, and the final report lists every remaining legacy/V2 match with either implemented canonical replacement, deleted path, or concrete blocker that cannot be solved in this run.
```

길이: 681자 내외. `/goal` 4,000자 제한 안에 들어간다.

---

## 보조 프롬프트

```text
You are in /Users/gbpark/invyone.

This is a strict continuation of a previous Goal run. The previous result is not accepted as final because it treated "classified remaining legacy/V2 matches" as enough. It is not enough.

Read first:
1. notes/gbpark/2026-05-18-canonical-data-view-goal.md
2. notes/gbpark/2026-05-18-canonical-data-view-cleanup-report.md

Your job:
Continue from the current worktree and push the cleanup beyond classification.

Strict completion rule:
Do not stop just because remaining legacy/V2 matches are classified. For each preserved item in the previous report, either:
1. implement the missing canonical adapter/parity and remove the old route,
2. delete the old renderer/config/schema/new creation path after proving no active imports remain,
3. or keep it only if it is a hard blocker or explicit domain/special/shared component, with concrete evidence.

Priorities:

1. Stats must be stricter than the previous result.
- Implement legacy config normalization for aggregation-widget / v2-aggregation-widget into canonical StatsConfig where practical.
- Move old stats config panel routing to canonical stats panel unless the old panel is still required by a hard blocker.
- Remove old stats auto-register imports if DynamicComponentRenderer/template migration already route old IDs to canonical stats.
- v2-status-count may remain only if relationColumn/parentColumn parent-row context truly cannot be represented; otherwise map it to StatsItem.dataSource.filters.
- Palette/new creation must expose only stats.

2. Table must be stricter than the previous result.
- Do not delete FlowWidget dependency blindly.
- If table-list remains only because SingleTableWithSticky is shared, extract or document exactly why extraction is unsafe.
- Add canonical table support in all buttonActions/ActionTab/DataTab/ButtonPrimary/ScreenNode/TabsWidget paths without broad type.includes("table") false positives.
- Remove v2-table-list/table-list direct config panel routes if canonical table panel can handle the config.
- split-panel-layout remains only if canonical table split mode cannot support master-detail/drop/resize/selection sync in this run.

3. Container/tabs must be stricter than the previous result.
- Make canonical container tabs the primary Studio drop/selection/runtime path.
- Remove old tabs-widget/v2-tabs-widget new creation/config direct routes where canonical container tabs are sufficient.
- Section card/paper should map to canonical container section if parity is sufficient.
- Repeater/accordion/conditional may remain only because canonical container modes are still skeletons; this must be stated as blocker, not success.

4. Schema/migration boundaries:
- componentConfig.ts and layoutV2Converter.ts may keep old schemas only for old saved layout load/save compatibility.
- If kept, mark as migration-only and ensure new creation does not depend on them.

5. Verification:
Run and report:
- git diff --check
- rg "v2-input|v2-select|V2InputRenderer|V2SelectRenderer" frontend/lib frontend/components frontend/app frontend/types frontend/styles
- rg "EntityPicker|entity-picker|EntitySearchModal" frontend/lib/registry/components/input frontend/components/v2/config-panels/InvFieldConfigPanel.tsx
- rg -n "v2-aggregation-widget|v2-status-count|aggregation-widget" frontend/lib frontend/components frontend/app frontend/types
- rg -n "v2-table-list|table-list|v2-split-panel-layout|split-panel-layout|split-panel-layout2" frontend/lib frontend/components frontend/app frontend/types
- rg -n "v2-tabs-widget|tabs-widget|v2-section-card|v2-section-paper|section-card|section-paper|v2-repeat-container|repeat-container|v2-repeater" frontend/lib frontend/components frontend/app frontend/types
- cd backend-spring && ./gradlew compileJava

Final report:
Write notes/gbpark/2026-05-18-canonical-data-view-cleanup-v2-strict-report.md.
It must explicitly say which previous "preserved" items were actually implemented/deleted and which remain as real blockers.
```

---

## 이번에는 완료로 인정하지 않는 것

- "rg 잔여 매칭을 분류했다"만으로 완료
- old renderer/config/schema import를 그대로 두고 hidden만 건드린 상태
- `type.includes("table")`처럼 canonical table 지원을 넓은 substring match로 처리하는 방식
- old tabs/table/stats config panel direct route를 canonical route 검토 없이 방치
- `v2-input` / `v2-select` / EntityPicker 계열 재도입

---

## 인정 가능한 잔여

아래는 구현량이 커서 hard blocker로 남을 수 있다. 단, "왜 지금 못 지우는지"와 "삭제 조건"이 있어야 한다.

- `FlowWidget`이 직접 쓰는 `table-list/SingleTableWithSticky`
- `split-panel-layout`의 master-detail/drop/resize/selection sync
- `v2-status-count`의 parent row relation context
- `v2-repeater`, `repeat-container`, `v2-repeat-container`의 데이터 조회/선택/append UX
- `accordion-basic`, `conditional-container`처럼 canonical container mode가 skeleton인 영역
