fix(align): 새 정렬 세션이 첫 파일을 쓰기 전에 같은 폴더의 앞 세션을 prev_HHmm/ 으로 옮긴다

정렬 폴더(`align_{자세}/`)는 환자·날짜·자세로만 갈리고 시작 시각이 키에 없다. 같은 날 같은
자세를 다시 정렬하면 새 세션은 잰 위치의 파일만 덮어쓰고 나머지는 앞 세션 것이 그대로
남았다 — 2026-10-15 팬텀 세션에서 0cm 만 쟀는데 앞 세션의 1~4cm 80 record 가 같이
올라갔고, 앞 세션의 0cm 원본은 덮여 사라졌다. 84296b0 은 업로드만 걸렀다(요약 attempts).

- HospitalRunStore.archivePreviousAlignRun: 정렬 폴더에 다른 세션의 파일이 있으면
  세션 파일(탐색·확인·좌우·좌우 흐름·재부착과 IMU)·align_result.json·업로드 마커를
  `prev_HHmm/`(앞 세션 started_at)으로 옮긴다. 요약 started_at 이 이 세션과 같으면
  손대지 않는다. 요약이 없거나 시각이 없으면 가장 오래된 파일의 수정 시각. 이름이
  겹치면 `_2`. standing 확인 파일은 그날·자세의 것이라 남기고 `standing_confirm`
  판정만 남긴 요약을 다시 써서 뒤의 정렬 요약이 이어받게 한다.
- AnchorAlignView: 첫 파일을 쓰기 직전 세션당 한 번 부른다. [처음부터 다시 정렬] 이
  되돌린다.
- HospitalLabdbUploader.pendingAligns: 각 정렬 폴더 뒤에 `prev_*` 를 붙인다 — 마커가
  같이 옮겨지므로 못 올라간 세션만 남는다.
- AlignLabdbPayload.sessionBase: 보관 폴더에서 올려도 환자·날짜·자세는 정렬 폴더 기준.
- 테스트: HospitalRunStoreAlignArchiveTest(신규 7) 외 pending·sessionBase 케이스.

업로드 필터(84296b0)는 옛 앱이 만든 폴더를 위한 이중 안전장치로 그대로 둔다.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
2026-10-15 17:59:15 +09:00
parent 84296b07b4
commit 839f8d70ac
8 changed files with 289 additions and 8 deletions
+1 -1
View File
@@ -280,7 +280,7 @@ IMU 는 2026-09-21 이후 업로드분부터 `sensor.imu` 로 들어옵니다(
| 기존 적재분 | `901` 로 올렸던 **72세션 · 1,440레코드**(2026-09-04)는 서버에서 `600` 으로 마이그레이션 완료 |
| `902` 정렬 1세션 | 같은 `testId` 로 `601` 재업로드하여 갱신 |
| 앱 반영 | 상수 2개 변경 + 최상위 `subject` 추가 |
| 앞 세션 파일 혼입 | 2026-10-15 · 같은 날 같은 환자를 다시 정렬하면 폴더에 남은 앞 세션의 `align_{n}cm.csv` 가 새 세션에 같이 올라갔다(0cm 만 잰 팬텀 세션에 100 record). 이후 앱은 요약 `attempts` 기준으로 거른다 — **그 전 앱으로 올린 601 세션은 `positions_measured` 와 `params.positions` 길이가 다르면 혼입 의심**, 서버에서 `align_cm ∉ positions[].align_cm` 인 record 를 빼고 봐야 합니다 |
| 앞 세션 파일 혼입 | 2026-10-15 · 같은 날 같은 환자를 다시 정렬하면 폴더에 남은 앞 세션의 `align_{n}cm.csv` 가 새 세션에 같이 올라갔다(0cm 만 잰 팬텀 세션에 100 record). 이후 앱은 새 세션이 첫 파일을 쓰기 전에 앞 세션을 `align_{자세}/prev_HHmm/` 으로 옮기고, 업로드도 요약 `attempts` 기준으로 거른다 — **그 전 앱으로 올린 601 세션은 `positions_measured` 와 `params.positions` 길이가 다르면 혼입 의심**, 서버에서 `align_cm ∉ positions[].align_cm` 인 record 를 빼고 봐야 합니다 |
> 이전 판에 "279건(2026-09-05)"이라고 적혀 있었습니다. **오기입니다** — 279 는 일반 앱의
> 미업로드 세션 수였고 병원 적재량과 무관합니다. 실제는 72세션 · 1,440레코드입니다.