POSA_Copyrighter/web/operator-gui
changukyu 0c60369da0 feat: 점수 구성 패널 — "증거 51개인데 왜 35점"에 답한다
이건 내가 만든 부채를 갚는 커밋이다. 스코어러에 풀 상한(v2/v3)과 신뢰 출처
제외(v4)를 넣으면서 증거 개수와 점수의 간극이 그 어느 때보다 벌어졌는데,
그 이유가 화면 어디에도 없었다. 운영자가 숫자를 믿지 못하면 그 우선순위는
우선순위가 아니고, 그러면 앞의 두 기능이 오히려 불신을 만든다.

ScoreResult.breakdown 을 신설했다. reasons 가 "어떤 증거가 말했는가"라면
breakdown 은 "그래서 몇 점인가"다.

  지식DB 지문 매칭        80
  웹 게시 (google)        60   원래 125 · 상한 60
  웹 엔티티 라벨          20   원래 114 · 상한 20
  신뢰 출처 posar.info         3행 제외
  합계 115점이 상한 100에 걸렸습니다 — 이 구간의 케이스는 서로 구별되지 않습니다

마지막 줄이 특히 중요하다. 100 에 걸린 케이스들은 서로 구별되지 않으므로
우선순위 판단에 쓸 수 없는데, 지금까지는 그 사실이 숨어 있었다.

자리는 증거 요약과 증거 목록 사이다 - "51개 증거"를 읽은 직후, 목록을 훑기
직전이 바로 그 질문이 생기는 지점이다.

점수는 하나도 바뀌지 않는다. 계산 흐름에 기록만 붙였고 기존 스코어러 테스트
31건이 그대로 통과한다. 가중치·버킷·밴드가 불변이므로 SCORER_VERSION 은 v4 를
유지한다(설명을 추가하는 것은 스탬프 규칙의 대상이 아니다).

분해 합계가 항상 점수와 일치하는지를 테스트로 고정했다. 분해가 점수와 다른
이야기를 하면 그건 분해가 아니라 또 하나의 주장이 된다.

실렌더(Playwright 1440x900): 패널이 의도한 자리에 서고 콘솔 에러 0.

검증: ruff clean, pytest 642 passed (스코어러 5건 + 정적 1건 추가).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BStHFrjQj2VypecSG9ex1V
2026-09-21 18:07:08 +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 feat: 증거 일괄 표시 — 51번 클릭하던 되먹임을 1번으로 2026-09-21 14:34:05 +09:00
app-api.js refactor: app.js 5,428줄을 관심사별 app-*.js 15개로 분할 2026-08-08 09:48:52 +09:00
app-bootstrap.js feat: 증거 일괄 표시 — 51번 클릭하던 되먹임을 1번으로 2026-09-21 14:34:05 +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 fix: 증거 행 레이아웃·호스트 노출·보존 케이스 설명, 프롬프트 스탬프 갱신 2026-09-18 23:54:00 +09:00
app-keyboard-batch.js feat: 선례 승계 — 재제출을 다시 심사하지 않는다 2026-09-21 12:05:38 +09:00
app-navigation.js feat: 선례 승계 — 재제출을 다시 심사하지 않는다 2026-09-21 12:05:38 +09:00
app-render-evidence.js feat: 점수 구성 패널 — "증거 51개인데 왜 35점"에 답한다 2026-09-21 18:07:08 +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 feat: 점수 구성 패널 — "증거 51개인데 왜 35점"에 답한다 2026-09-21 18:07:08 +09:00
app-selectors.js feat: 선례 승계 — 재제출을 다시 심사하지 않는다 2026-09-21 12:05:38 +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 feat: 점수 구성 패널 — "증거 51개인데 왜 35점"에 답한다 2026-09-21 18:07:08 +09:00
operator-labels.js feat: 신뢰 출처 — 자사·계약처 도메인은 위험 신호가 아니다 (SCORER_VERSION v4) 2026-09-21 12:18:31 +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: 점수 구성 패널 — "증거 51개인데 왜 35점"에 답한다 2026-09-21 18:07:08 +09:00
submission-import.js chore: initial commit of copyrighter (rights_filter) 2026-06-09 09:50:31 +09:00