미결 7번의 수정안 두 개(E-1 스텐실 물리 시간 고정, E-2 공통 시간 격자 리샘플)를 구현하기 전에 offline으로 산정했다. 결과는 둘 다 불합격이고, 파라미터가 나빠서가 아니라 명세 자체가 목표를 달성할 수 없어서다. production code는 한 줄도 바꾸지 않았다.

A-1과의 대비 — 이번엔 구현 전에 막았다

8월 31일에 A-1을 되돌렸다. 오염은 실재했고 제거도 정당했는데, 구현하고 검증한 뒤에야 정당성을 판정할 정답이 없다는 걸 알았다. 그 사이 B-2~B-6 평가가 전부 되돌린 상태를 기준선으로 수행돼 있었다.

이번에는 순서를 바꿨다. 판정 기준을 먼저 못박고(PREREGISTRATION.md), features.segment_phases를 컨텍스트 매니저 안에서만 갈아 끼우는 모형으로 400클립을 돌린 다음, 그 기준으로 판정했다. 기준선은 하나도 흔들리지 않았고 되돌릴 것도 없다.

E-2는 원리적으로 작동하지 않는다

E-2는 각도 계열을 60Hz 공통 격자로 리샘플해 후보 격자를 fps와 무관하게 만들자는 것이었다. 선형 보간을 쓴다.

그런데 선형 보간은 argmax를 표본점 밖으로 옮기지 못한다.

리샘플한 계열은 표본점을 꼭짓점으로 하는 조각선형 함수다. 이걸 표본 간격의 배수 반폭으로 중심차분하면 (f(p+h) − f(p−h)) / 2h인데, p가 구간 안에서 움직일 때 p+h와 p−h가 각자의 구간 안에서 같은 비율만큼 움직인다. f가 구간마다 선형 이므로 이 값은 p에 대해 구간마다 선형이고, 선형 함수의 최댓값은 항상 끝점에 있다. 끝점은 곧 표본점이다.

400클립 실측이 이 논증과 정확히 일치했다.

E-2 단독  
모든 fps에서 무수정과 임팩트 일치 100%
스냅 손실(60Hz 결과를 격자로 되돌릴 때) 0프레임

E-2는 아무것도 하지 않는다. 분해능을 얻으려면 비선형 보간(스플라인)이 필요하고, 그건 E-2가 아니라 다른 제안이다.

E-1도 원리적으로 불가능하다

E-1은 미분 스텐실의 물리 폭을 fps와 무관하게 고정하자는 것이었다. 반폭은 프레임 단위라 max(1, round(τ × fps))가 된다. 정수다.

그래서 τ가 프레임 간격의 배수인 fps에서만 실제 폭이 τ가 된다.

τ 60fps 30fps 20fps 15fps 12fps
1/60초 1f = 0.017s 1f = 0.033s 1f = 0.050s 1f = 0.067s 1f = 0.083s
1/30초 2f = 0.033s 1f = 0.033s 1f = 0.050s 1f = 0.067s 1f = 0.083s
1/12초 5f = 0.083s 2f = 0.067s 2f = 0.100s 1f = 0.067s 1f = 0.083s

τ=1/60초는 60fps를 뺀 전부에서 반폭 1로 바닥쳐 무수정과 완전히 같아진다. τ=1/12초는 60과 12에서만 맞고 30·20·15에서 0.067·0.100·0.067초로 흩어진다.

효과가 나타나는 자리도 이 표가 그대로 설명한다. τ=1/30초는 60fps(2프레임)와 30fps(1프레임)의 폭이 같아 60↔30 임팩트 일치가 35% → 49%로 오르고 나머지 fps에서는 아무 일도 없다. τ=1/12초는 60↔12가 3% → 21%로 오르는 대신 60↔30이 35% → 29%로 나빠진다.

정수 격자 위에서 물리 스텐실은 고정되지 않는다.

두 축을 제대로 고정해도 등급은 안 따라온다

두 축을 모두 옳게 잡은 형태가 하나 있다 — 공통 60Hz 격자 + 전 fps ±1/60초 스텐실 (E-1+E-2 τ=1/60초). 이건 60fps 결과를 100% 보존한다.

  base E-1+E-2 τ=1/60초
15fps 임팩트가 60fps에서 ≤2프레임 33% 42%
20fps 임팩트가 60fps에서 ≤2프레임 46% 57%
60fps 결과 보존 100% 100%
60↔15fps 최종 등급 변화 55% 54%

임팩트는 실제로 수렴하는데 등급이 안 따라온다.

이유는 거리 분포의 모양이다. 임팩트 오차의 몸통이 여전히 30프레임대에 흩어져 있고(평균 33.1프레임 그대로), 등급은 밴드 경계를 넘느냐로만 정해진다. 1~2프레임 개선은 경계를 움직이지 못한다. 잘 맞던 클립이 조금 더 잘 맞을 뿐, 크게 빗나간 클립은 그대로 빗나간다.

일관성을 정보로 사는 함정

등급 변화를 가장 많이 줄인 것은 τ=1/12초 계열이다 — 55% → 39%. 이것만 보면 성공처럼 보인다.

그런데 이 방식은 15fps 쪽을 하나도 바꾸지 않는다(무수정 대비 등급 변화 0%). 15fps에서 반폭이 1로 바닥치기 때문이다. 개선은 전부 60fps 쪽을 저 fps 쪽으로 끌어내린 결과다 — 60fps 임팩트가 무수정에서 2프레임 넘게 벗어난 클립이 70%다.

그래서 사전 등록 기준에 정보 우위 보존 조건(그 방식의 60fps 결과가 무수정 60fps에서 ≤2프레임인 클립 ≥90%)을 넣어 뒀다. 없었다면 이 방식이 합격했을 것이다. 정보를 버려서 산 일관성은 결함을 고친 게 아니다.

판정

사전 등록한 합격 조건은 셋이다 — 60↔15fps 등급 변화 ≤5%, 5개 fps 임팩트 일치 ≥80%, 60fps 보존 ≥90%. 검토한 7개 명세가 전부 불합격이다.

60fps를 기준으로 쓴 것에 대해 한 가지는 분명히 해 둔다. 60fps는 정답이 아니다. 솎기 전 원본이라 정보 우위가 성립할 뿐이고, 그것이 실제 릴리스를 가리킨다는 보장은 없다(미결 5번, 보류). 그래서 이번 결과로 정확도에 대해서는 아무것도 주장하지 않는다. 일관성만 이야기했고, 그 일관성조차 확보되지 않았다.

그래서 남은 것

시간축 처리만으로는 안 된다는 게 이번 결론이다. 얇은 argmax 마진(1위/2위 비율 p10 1.12배)이 구조이고, 격자와 스텐실은 그 위에 얹힌 섭동일 뿐이다. 마진 자체를 없애는 처방은 탐색 범위 제한(E-6)인데 그건 정답이 필요하다 — 미결 5번의 재개 조건과 같다.

미결 7번을 “정답 없이 판정 가능”으로 분류했던 것도 그래서 부분적으로 정정했다. 진단과 원인 규명은 정답 없이 끝났고 인접 결함도 정답 없이 고칠 수 있지만, 등급 일관성의 근본 해결은 5번에 묶여 있다.

당장 할 수 있는 것은 인접 결함 쪽이다 — 정수배 아닌 소스의 격자 어긋남, max_frames=300의 fps별 커버리지, 프레임 단위 값의 물리 시간 표기(E-3), 그리고 이번에 함께 등록한 미결 9번(4K host RAM 7.5GB)·10번(서비스/평가 target_fps 이중화)이다.

판정 기준과 산정 스크립트는 agent/eval/pending7_fps/에 있다. GPU가 필요 없고 재현에 약 2분 걸린다.