fix(labdb): 정렬 업로드에 같은 폴더의 앞 세션 파일이 섞이지 않게 한다 — 요약 attempts 기준
정렬 폴더가 환자·날짜·자세로만 갈려서 같은 날 같은 환자를 다시 정렬하면 앞 세션의
align_{n}cm.csv 가 그대로 남고, 페이로드는 폴더의 파일을 전부 담았다. 2026-10-15 팬텀
세션에서 0cm 만 쟀는데 1~4cm 80 record 가 같은 testId 로 올라갔다 — 요약(positions·
swept_to_cm)은 0cm 하나인데 records 는 5위치였다.
- AlignLabdbPayload.isFromThisRun: 요약의 attempts(위치 → 이 세션에서 잰 횟수)로 가른다.
탐색·확인은 cm ∈ attempts 이고 _rK 의 K ≤ attempts[cm]. 좌우·재부착은 잰 자리 또는
anchor_cm/proceed_anchor_cm. standing 확인은 폴더 기준으로 번호를 매겨 덮어쓰지 않으므로
거르지 않는다. attempts 가 없는 요약(옛 앱)은 종전대로 전부 담는다.
- params.stale_files_skipped: 걸러낸 파일 수. 0 이 정상.
- 문서: 그 전 앱으로 올린 601 세션은 positions_measured 와 params.positions 길이가 다르면
혼입 의심 — align_cm ∉ positions[].align_cm 인 record 를 빼고 본다.
폰 폴더 자체가 세션을 섞는 것(새 0cm 이 옛 0cm 을 덮어씀)은 이 커밋이 다루지 않는다.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
@@ -172,7 +172,7 @@ IMU 는 2026-09-21 이후 업로드분부터 `sensor.imu` 로 들어옵니다(
|
||||
| `protocol` | string | `"hospital_align_2026"` 고정 |
|
||||
| `subject` | string | 환자 식별자 |
|
||||
| `save_name` | string | 저장 폴더명 |
|
||||
| `positions_measured` | int | 측정한 위치 수 (탐색 `sweep` 만) |
|
||||
| `positions_measured` | int | 측정한 위치 수 (탐색 `sweep` 만). 2026-10-15 부터 **이 세션이 잰 위치만** — 그 전 세션은 같은 날 앞서 한 정렬의 위치가 섞여 `params.positions` 보다 클 수 있습니다 |
|
||||
| `confirm_positions` | int | 확인 측정한 위치 수 |
|
||||
| `lateral_frames` | int | 좌우 확인 완료 순간에 남긴 프레임 수 (2026-09-30~). 0 = 좌우 미확인 또는 옛 앱 |
|
||||
| `lateral_stream_frames` | int | 좌우 정렬 동안 흘린 프레임 전부 (2026-09-30~) |
|
||||
@@ -182,6 +182,7 @@ IMU 는 2026-09-21 이후 업로드분부터 `sensor.imu` 로 들어옵니다(
|
||||
| `confirm_tilt_deg_mean` | number | 확인 측정(N cm, 20 cycle)의 IMU 평균 기울기(도, 0~180). Supine 의 값이 Sitting 요구 범위의 기준각 m 입니다 — Sitting 범위 = `35+m ~ 55+m` (2026-10-01~) |
|
||||
| `reattach` | object | 재부착 확인 판정 `{ok, missing[], detached[], channels[4], ref_channels[4]\|null, bv_ml, at}` — 정렬 뒤 뗐다 붙인 자리에서 정렬 때 잡힌 채널이 빠졌는지 |
|
||||
| `cycles_total` | int | = `recordCount` |
|
||||
| `stale_files_skipped` | int | 폴더에 있었지만 앞 세션 것이라 뺀 파일 수 (2026-10-15~). 0 이 정상. 정렬 폴더는 환자·날짜·자세로만 갈려 같은 날 다시 정렬하면 앞 세션 파일이 남는데, 요약의 `attempts` 에 없는 위치·횟수의 파일은 담지 않습니다 |
|
||||
| `upload_reason` | string | `"nurse_review"` — 사람이 올린 세션 표시 |
|
||||
| `device`, `firmware_version`, `hw_preset` | string | |
|
||||
| `freq_mhz`, `freq_option`, `probe_cycles` | number | 정렬 전용 고정 조건 (2.3MHz · cycle 3) |
|
||||
@@ -279,6 +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 를 빼고 봐야 합니다 |
|
||||
|
||||
> 이전 판에 "279건(2026-09-05)"이라고 적혀 있었습니다. **오기입니다** — 279 는 일반 앱의
|
||||
> 미업로드 세션 수였고 병원 적재량과 무관합니다. 실제는 72세션 · 1,440레코드입니다.
|
||||
|
||||
Reference in New Issue
Block a user