POSA_Copyrighter/web/operator-gui
changukyu fc4e04f65c refactor: app.js 5,428줄을 관심사별 app-*.js 15개로 분할
단일 파일이 프로젝트 상한(800줄)의 6.8배였다. 분할은 순수 라인범위 추출이며
어떤 구문도 수정·재배치·재포맷하지 않았다 — 15개 파트의 연결 결과가 원본
app.js 와 바이트 단위로 동일함을 확인하고 나눴다(125,689B).

클래식 스크립트(모듈 아님)라 하나의 전역 스코프를 공유하므로 로드 순서가 곧
계약이다. 원본에서 로드 시점에 실행되는 최상위 구문은 파일 끝의 리스너 등록
2개뿐이었고(DOMContentLoaded/hashchange), 나머지 참조는 전부 함수 본문 안이라
순서만 지키면 의미가 보존된다. 그 순서를 index.html 에 명시하고 테스트로 고정:

- test_index_loads_every_app_part_exactly_once_in_declared_order
  각 파트가 정확히 1회, 선언 순서대로 로드되는지 + 디스크의 app-*.js 가
  전부 배선됐는지 + 구 app.js 가 남아있지 않은지
- test_app_parts_stay_within_the_file_size_budget (800줄 상한)

정적 스펙 31곳은 app.js 본문을 문자열로 검사하고 있었다. 이 스펙들의 관심사는
'어느 파일에 있는가'가 아니라 '콘솔에 그 동작이 있는가'이므로, 파트를 로드
순서대로 이어붙여 읽는 _read_app() 으로 바꿨다.

검증: Playwright E2E 6건이 실브라우저에서 통과(콘솔 에러 0 단언 포함).
운영 콘솔 실렌더 확인 — 큐/케이스 심사 정상, 스크립트 15개 전부 200,
새로고침 후 콘솔 메시지 0건.
2026-08-08 09:48:52 +09:00
..
assets fix: resolve code-review findings from the clean-review restyle 2026-06-11 11:13:46 +09:00
pitch-assets chore: initial commit of copyrighter (rights_filter) 2026-06-09 09:50:31 +09:00
app-admin.js refactor: app.js 5,428줄을 관심사별 app-*.js 15개로 분할 2026-08-08 09:48:52 +09:00
app-api.js refactor: app.js 5,428줄을 관심사별 app-*.js 15개로 분할 2026-08-08 09:48:52 +09:00
app-bootstrap.js refactor: app.js 5,428줄을 관심사별 app-*.js 15개로 분할 2026-08-08 09:48:52 +09:00
app-collections.js refactor: app.js 5,428줄을 관심사별 app-*.js 15개로 분할 2026-08-08 09:48:52 +09:00
app-decision-tools.js refactor: app.js 5,428줄을 관심사별 app-*.js 15개로 분할 2026-08-08 09:48:52 +09:00
app-format.js refactor: app.js 5,428줄을 관심사별 app-*.js 15개로 분할 2026-08-08 09:48:52 +09:00
app-keyboard-batch.js refactor: app.js 5,428줄을 관심사별 app-*.js 15개로 분할 2026-08-08 09:48:52 +09:00
app-navigation.js refactor: app.js 5,428줄을 관심사별 app-*.js 15개로 분할 2026-08-08 09:48:52 +09:00
app-render-evidence.js refactor: app.js 5,428줄을 관심사별 app-*.js 15개로 분할 2026-08-08 09:48:52 +09:00
app-render-panels.js refactor: app.js 5,428줄을 관심사별 app-*.js 15개로 분할 2026-08-08 09:48:52 +09:00
app-render-queue.js refactor: app.js 5,428줄을 관심사별 app-*.js 15개로 분할 2026-08-08 09:48:52 +09:00
app-selectors.js refactor: app.js 5,428줄을 관심사별 app-*.js 15개로 분할 2026-08-08 09:48:52 +09:00
app-state.js refactor: app.js 5,428줄을 관심사별 app-*.js 15개로 분할 2026-08-08 09:48:52 +09:00
app-stats.js refactor: app.js 5,428줄을 관심사별 app-*.js 15개로 분할 2026-08-08 09:48:52 +09:00
app-submissions.js refactor: app.js 5,428줄을 관심사별 app-*.js 15개로 분할 2026-08-08 09:48:52 +09:00
evidence-guidance.js chore: initial commit of copyrighter (rights_filter) 2026-06-09 09:50:31 +09:00
index.html refactor: app.js 5,428줄을 관심사별 app-*.js 15개로 분할 2026-08-08 09:48:52 +09:00
operator-labels.js feat: 출처 신호 2종 (EXIF/IPTC 권리 표기 + 방송캡처 포렌식), 0점 라벨 2026-07-25 23:59:00 +09:00
operator-search.js feat: expose google_search as operator manual text-query provider 2026-06-12 17:46:45 +09:00
pitch.css chore: initial commit of copyrighter (rights_filter) 2026-06-09 09:50:31 +09:00
pitch.html chore: initial commit of copyrighter (rights_filter) 2026-06-09 09:50:31 +09:00
pitch.js chore: initial commit of copyrighter (rights_filter) 2026-06-09 09:50:31 +09:00
styles.css feat: 실사용 투입 전 T0 스탬프 4종 + 임베딩 정책 개정 2026-07-25 23:08:19 +09:00
submission-import.js chore: initial commit of copyrighter (rights_filter) 2026-06-09 09:50:31 +09:00