- generic [active] [ref=e1]:
  - checkbox "Toggle sidebar ⌘B" [checked=mixed] [ref=e2]
  - navigation [ref=e3]:
    - list [ref=e4]:
      - generic "Toggle sidebar ⌘B" [ref=e5]
      - listitem [ref=e6]:
        - link "Roomfit v2 — Spec Map" [ref=e7] [cursor=pointer]:
          - /url: ./
    - generic [ref=e8]:
      - searchbox "Search" [ref=e9]
      - text: ⌘K
    - list [ref=e11]:
      - listitem [ref=e12]:
        - link "개요" [ref=e13] [cursor=pointer]:
          - /url: ./
      - listitem [ref=e14]:
        - link "화면" [ref=e15] [cursor=pointer]:
          - /url: ./screens
      - listitem [ref=e16]:
        - link "Use case" [ref=e17] [cursor=pointer]:
          - /url: ./use-cases
      - listitem [ref=e18]:
        - link "시나리오" [ref=e19] [cursor=pointer]:
          - /url: ./scenarios
      - listitem [ref=e20]:
        - link "데이터 흐름" [ref=e21] [cursor=pointer]:
          - /url: ./data-flow
  - generic [ref=e22]:
    - banner [ref=e23]: Roomfit v2 Spec — 자동 추출 + 수동 보강
    - complementary [ref=e24]:
      - navigation [ref=e25]:
        - generic [ref=e26]: Contents
        - list [ref=e27]:
          - listitem [ref=e28]:
            - link "Use case 카탈로그" [ref=e29] [cursor=pointer]:
              - /url: "#use-case-1"
          - listitem [ref=e30]:
            - link "한 use case 깊게 보기" [ref=e31] [cursor=pointer]:
              - /url: "#use-case-2"
          - listitem [ref=e32]:
            - link "b2c/b2b 공유 매트릭스" [ref=e33] [cursor=pointer]:
              - /url: "#b2c-b2b"
    - main [ref=e35]:
      - heading "Use case" [level=1] [ref=e36]:
        - link "Use case" [ref=e37] [cursor=pointer]:
          - /url: "#use-case"
      - paragraph [ref=e38]: 도메인 layer (packages/) 의 use case 가 어디에서 쓰이는지 역추적. 한 use case 가 b2c/b2b 어디 다 쓰이는지, 어떤 command/response 와 묶이는지.
      - heading "Use case 카탈로그" [level=2] [ref=e39]:
        - link "Use case 카탈로그" [ref=e40] [cursor=pointer]:
          - /url: "#use-case-1"
      - table [ref=e70]:
        - rowgroup [ref=e71]:
          - row "Use case package intent (수동) 쓰는 provider 쓰는 app 발사 cmd 수신 resp path" [ref=e72]:
            - columnheader [ref=e73]:
              - checkbox [ref=e74]
            - columnheader "Use case" [ref=e75]: Use case
            - columnheader "package": package
            - columnheader "intent (수동)" [ref=e76]: intent (수동)
            - columnheader "쓰는 provider": 쓰는 provider
            - columnheader "쓰는 app": 쓰는 app
            - columnheader "발사 cmd": 발사 cmd
            - columnheader "수신 resp": 수신 resp
            - columnheader "path" [ref=e77]: path
        - rowgroup [ref=e78]:
          - row "MockDeviceGateway roomfit_device 0 0 9 8 packages/roomfit_device/lib/src/testing/mock_device_gateway.dart" [ref=e79]:
            - cell [ref=e80]:
              - checkbox [ref=e81]
            - cell "MockDeviceGateway" [ref=e82]
            - cell "roomfit_device"
            - cell [ref=e83]
            - cell "0"
            - cell "0"
            - cell "9"
            - cell "8"
            - cell "packages/roomfit_device/lib/src/testing/mock_device_gateway.dart" [ref=e84]
          - row "AcwrCalculator roomfit_exercise 0 0 0 0 packages/roomfit_exercise/lib/src/load/acwr_calculator.dart" [ref=e85]:
            - cell [ref=e86]:
              - checkbox [ref=e87]
            - cell "AcwrCalculator" [ref=e88]
            - cell "roomfit_exercise"
            - cell [ref=e89]
            - cell "0"
            - cell "0"
            - cell "0"
            - cell "0"
            - cell "packages/roomfit_exercise/lib/src/load/acwr_calculator.dart" [ref=e90]
          - row "RecordedSession roomfit_exercise 3 1 0 0 packages/roomfit_exercise/lib/src/recording/recorded_session.dart" [ref=e91]:
            - cell [ref=e92]:
              - checkbox [ref=e93]
            - cell "RecordedSession" [ref=e94]
            - cell "roomfit_exercise"
            - cell [ref=e95]
            - cell "3"
            - cell "1"
            - cell "0"
            - cell "0"
            - cell "packages/roomfit_exercise/lib/src/recording/recorded_session.dart" [ref=e96]
          - row "RoomfitExtendedMetricsCalculator roomfit_exercise 0 0 0 0 packages/roomfit_exercise/lib/src/metrics/calculators/roomfit_extended_calculator.dart" [ref=e97]:
            - cell [ref=e98]:
              - checkbox [ref=e99]
            - cell "RoomfitExtendedMetricsCalculator" [ref=e100]
            - cell "roomfit_exercise"
            - cell [ref=e101]
            - cell "0"
            - cell "0"
            - cell "0"
            - cell "0"
            - cell "packages/roomfit_exercise/lib/src/metrics/calculators/roomfit_extended_calculator.dart" [ref=e102]
          - row "SessionRecorder roomfit_exercise 3 1 0 0 packages/roomfit_exercise/lib/src/recording/session_recorder.dart" [ref=e103]:
            - cell [ref=e104]:
              - checkbox [ref=e105]
            - cell "SessionRecorder" [ref=e106]
            - cell "roomfit_exercise"
            - cell [ref=e107]
            - cell "3"
            - cell "1"
            - cell "0"
            - cell "0"
            - cell "packages/roomfit_exercise/lib/src/recording/session_recorder.dart" [ref=e108]
          - row "SixStateFsmRepDetector roomfit_exercise 8 2 0 0 packages/roomfit_exercise/lib/src/segmentation/detectors/six_state_fsm/six_state_fsm_detector.dart" [ref=e109]:
            - cell [ref=e110]:
              - checkbox [ref=e111]
            - cell "SixStateFsmRepDetector" [ref=e112]
            - cell "roomfit_exercise"
            - cell [ref=e113]
            - cell "8"
            - cell "2"
            - cell "0"
            - cell "0"
            - cell "packages/roomfit_exercise/lib/src/segmentation/detectors/six_state_fsm/six_state_fsm_detector.dart" [ref=e114]
          - row "StandardVbtMetricsCalculator roomfit_exercise rep displacement/속도/파워/MCV 계산. velocityMeaningful 모드 분기 8 2 0 0 packages/roomfit_exercise/lib/src/metrics/calculators/standard_vbt_calculator.dart" [ref=e115]:
            - cell [ref=e116]:
              - checkbox [ref=e117]
            - cell "StandardVbtMetricsCalculator" [ref=e118]
            - cell "roomfit_exercise"
            - cell "rep displacement/속도/파워/MCV 계산. velocityMeaningful 모드 분기" [ref=e119]
            - cell "8"
            - cell "2"
            - cell "0"
            - cell "0"
            - cell "packages/roomfit_exercise/lib/src/metrics/calculators/standard_vbt_calculator.dart" [ref=e120]
          - row "VelocitySignFlipRepDetector roomfit_exercise 0 0 0 0 packages/roomfit_exercise/lib/src/segmentation/detectors/velocity_sign_flip/velocity_sign_flip_detector.dart" [ref=e121]:
            - cell [ref=e122]:
              - checkbox [ref=e123]
            - cell "VelocitySignFlipRepDetector" [ref=e124]
            - cell "roomfit_exercise"
            - cell [ref=e125]
            - cell "0"
            - cell "0"
            - cell "0"
            - cell "0"
            - cell "packages/roomfit_exercise/lib/src/segmentation/detectors/velocity_sign_flip/velocity_sign_flip_detector.dart" [ref=e126]
          - row "FirmwareUpdateSession roomfit_firmware OTA — YModem + IAP 시퀀스 0 0 0 0 packages/roomfit_firmware/lib/src/session/firmware_update_session.dart" [ref=e127]:
            - cell [ref=e128]:
              - checkbox [ref=e129]
            - cell "FirmwareUpdateSession" [ref=e130]
            - cell "roomfit_firmware"
            - cell "OTA — YModem + IAP 시퀀스" [ref=e131]
            - cell "0"
            - cell "0"
            - cell "0"
            - cell "0"
            - cell "packages/roomfit_firmware/lib/src/session/firmware_update_session.dart" [ref=e132]
          - row "PacketBuilder roomfit_protocol RoomfitFrame 인코더 — Command → bytes 0 0 0 0 packages/roomfit_protocol/lib/src/codec/packet_builder.dart" [ref=e133]:
            - cell [ref=e134]:
              - checkbox [ref=e135]
            - cell "PacketBuilder" [ref=e136]
            - cell "roomfit_protocol"
            - cell "RoomfitFrame 인코더 — Command → bytes" [ref=e137]
            - cell "0"
            - cell "0"
            - cell "0"
            - cell "0"
            - cell "packages/roomfit_protocol/lib/src/codec/packet_builder.dart" [ref=e138]
          - row "InMemoryShopRepository roomfit_shop 6 1 0 0 packages/roomfit_shop/lib/src/repository/in_memory_shop_repository.dart" [ref=e139]:
            - cell [ref=e140]:
              - checkbox [ref=e141]
            - cell "InMemoryShopRepository" [ref=e142]
            - cell "roomfit_shop"
            - cell [ref=e143]
            - cell "6"
            - cell "1"
            - cell "0"
            - cell "0"
            - cell "packages/roomfit_shop/lib/src/repository/in_memory_shop_repository.dart" [ref=e144]
          - row "InMemoryWorkoutRepository roomfit_workout 7 2 0 0 packages/roomfit_workout/lib/src/data/workout_repository.dart" [ref=e145]:
            - cell [ref=e146]:
              - checkbox [ref=e147]
            - cell "InMemoryWorkoutRepository" [ref=e148]
            - cell "roomfit_workout"
            - cell [ref=e149]
            - cell "7"
            - cell "2"
            - cell "0"
            - cell "0"
            - cell "packages/roomfit_workout/lib/src/data/workout_repository.dart" [ref=e150]
          - row "RestDetector roomfit_workout 세트 사이 휴식 진입 감지 — WeightOff 이벤트 + 체결시간 5 1 0 0 packages/roomfit_workout/lib/src/domain/use_cases/rest_detector.dart" [ref=e151]:
            - cell [ref=e152]:
              - checkbox [ref=e153]
            - cell "RestDetector" [ref=e154]
            - cell "roomfit_workout"
            - cell "세트 사이 휴식 진입 감지 — WeightOff 이벤트 + 체결시간" [ref=e155]
            - cell "5"
            - cell "1"
            - cell "0"
            - cell "0"
            - cell "packages/roomfit_workout/lib/src/domain/use_cases/rest_detector.dart" [ref=e156]
          - row "SessionManager roomfit_workout 세션 단위 — 여러 세트, 운동 종목 entries, 종료 처리 7 2 0 0 packages/roomfit_workout/lib/src/domain/use_cases/session_manager.dart" [ref=e157]:
            - cell [ref=e158]:
              - checkbox [ref=e159]
            - cell "SessionManager" [ref=e160]
            - cell "roomfit_workout"
            - cell "세션 단위 — 여러 세트, 운동 종목 entries, 종료 처리" [ref=e161]
            - cell "7"
            - cell "2"
            - cell "0"
            - cell "0"
            - cell "packages/roomfit_workout/lib/src/domain/use_cases/session_manager.dart" [ref=e162]
          - row "SetExecutor roomfit_workout 한 세트의 시작-진행-종료 라이프사이클을 관장. rep 누적, 종료 트리거 7 2 6 0 packages/roomfit_workout/lib/src/domain/use_cases/set_executor.dart" [ref=e163]:
            - cell [ref=e164]:
              - checkbox [ref=e165]
            - cell "SetExecutor" [ref=e166]
            - cell "roomfit_workout"
            - cell "한 세트의 시작-진행-종료 라이프사이클을 관장. rep 누적, 종료 트리거" [ref=e167]
            - cell "7"
            - cell "2"
            - cell "6"
            - cell "0"
            - cell "packages/roomfit_workout/lib/src/domain/use_cases/set_executor.dart" [ref=e168]
          - row "SupabaseWorkoutRepository roomfit_workout 5 1 0 0 packages/roomfit_workout/lib/src/data/supabase_workout_repository.dart" [ref=e169]:
            - cell [ref=e170]:
              - checkbox [ref=e171]
            - cell "SupabaseWorkoutRepository" [ref=e172]
            - cell "roomfit_workout"
            - cell [ref=e173]
            - cell "5"
            - cell "1"
            - cell "0"
            - cell "0"
            - cell "packages/roomfit_workout/lib/src/data/supabase_workout_repository.dart" [ref=e174]
          - row "WorkoutRepository roomfit_workout 7 2 0 0 packages/roomfit_workout/lib/src/data/workout_repository.dart" [ref=e175]:
            - cell [ref=e176]:
              - checkbox [ref=e177]
            - cell "WorkoutRepository" [ref=e178]
            - cell "roomfit_workout"
            - cell [ref=e179]
            - cell "7"
            - cell "2"
            - cell "0"
            - cell "0"
            - cell "packages/roomfit_workout/lib/src/data/workout_repository.dart" [ref=e180]
      - heading "한 use case 깊게 보기" [level=2] [ref=e41]:
        - link "한 use case 깊게 보기" [ref=e42] [cursor=pointer]:
          - /url: "#use-case-2"
      - generic [ref=e182]:
        - generic [ref=e183]: Use case 선택
        - combobox "Use case 선택" [ref=e184]:
          - option "roomfit_protocol.PacketBuilder" [selected]
          - option "roomfit_device.MockDeviceGateway"
          - option "roomfit_firmware.FirmwareUpdateSession"
          - option "roomfit_shop.InMemoryShopRepository"
          - option "roomfit_exercise.StandardVbtMetricsCalculator"
          - option "roomfit_exercise.RoomfitExtendedMetricsCalculator"
          - option "roomfit_exercise.VelocitySignFlipRepDetector"
          - option "roomfit_exercise.SixStateFsmRepDetector"
          - option "roomfit_exercise.SessionRecorder"
          - option "roomfit_exercise.RecordedSession"
          - option "roomfit_exercise.AcwrCalculator"
          - option "roomfit_workout.WorkoutRepository"
          - option "roomfit_workout.InMemoryWorkoutRepository"
          - option "roomfit_workout.SupabaseWorkoutRepository"
          - option "roomfit_workout.RestDetector"
          - option "roomfit_workout.SessionManager"
          - option "roomfit_workout.SetExecutor"
      - generic [ref=e43]:
        - generic [ref=e44]:
          - heading "이 use case 를 쓰는 provider" [level=3] [ref=e45]
          - table [ref=e186]:
            - rowgroup [ref=e187]:
              - row "app_id name file_path" [ref=e188]:
                - columnheader [ref=e189]:
                  - checkbox [ref=e190]
                - columnheader "app_id" [ref=e191]: app_id
                - columnheader "name" [ref=e192]: name
                - columnheader "file_path" [ref=e193]: file_path
            - rowgroup [ref=e194]:
              - row "No results." [ref=e195]:
                - cell [ref=e196]
                - cell "No results." [ref=e197]
        - generic [ref=e47]:
          - heading "도달하는 화면 (transitive)" [level=3] [ref=e48]
          - table [ref=e199]:
            - rowgroup [ref=e200]:
              - row "app_id class_name file_path" [ref=e201]:
                - columnheader [ref=e202]:
                  - checkbox [ref=e203]
                - columnheader "app_id" [ref=e204]: app_id
                - columnheader "class_name" [ref=e205]: class_name
                - columnheader "file_path" [ref=e206]: file_path
            - rowgroup [ref=e207]:
              - row "No results." [ref=e208]:
                - cell [ref=e209]
                - cell "No results." [ref=e210]
      - generic [ref=e50]:
        - generic [ref=e51]:
          - heading "발사하는 Command" [level=3] [ref=e52]
          - table [ref=e212]:
            - rowgroup [ref=e213]:
              - row "class_name code_hex" [ref=e214]:
                - columnheader [ref=e215]:
                  - checkbox [ref=e216]
                - columnheader "class_name" [ref=e217]: class_name
                - columnheader "code_hex" [ref=e218]: code_hex
            - rowgroup [ref=e219]:
              - row "No results." [ref=e220]:
                - cell [ref=e221]
                - cell "No results." [ref=e222]
        - generic [ref=e54]:
          - heading "수신하는 Response" [level=3] [ref=e55]
          - table [ref=e224]:
            - rowgroup [ref=e225]:
              - row "class_name code_hex" [ref=e226]:
                - columnheader [ref=e227]:
                  - checkbox [ref=e228]
                - columnheader "class_name" [ref=e229]: class_name
                - columnheader "code_hex" [ref=e230]: code_hex
            - rowgroup [ref=e231]:
              - row "No results." [ref=e232]:
                - cell [ref=e233]
                - cell "No results." [ref=e234]
      - heading "b2c/b2b 공유 매트릭스" [level=2] [ref=e57]:
        - link "b2c/b2b 공유 매트릭스" [ref=e58] [cursor=pointer]:
          - /url: "#b2c-b2b"
      - paragraph [ref=e59]: 같은 use case 가 b2c · b2b 둘 다에서 쓰이는지 = packages/ 공유 도메인이 실제로 동작 중인지 확인.
      - table [ref=e237]:
        - rowgroup [ref=e238]:
          - row "use_case package b2c_uses b2b_uses" [ref=e239]:
            - columnheader [ref=e240]:
              - checkbox [ref=e241]
            - columnheader "use_case" [ref=e242]: use_case
            - columnheader "package" [ref=e243]: package
            - columnheader "b2c_uses" [ref=e244]: b2c_uses
            - columnheader "b2b_uses" [ref=e245]: b2b_uses
        - rowgroup [ref=e246]:
          - row "SixStateFsmRepDetector roomfit_exercise 6 2" [ref=e247]:
            - cell [ref=e248]:
              - checkbox [ref=e249]
            - cell "SixStateFsmRepDetector" [ref=e250]
            - cell "roomfit_exercise" [ref=e251]
            - cell "6" [ref=e252]
            - cell "2" [ref=e253]
          - row "StandardVbtMetricsCalculator roomfit_exercise 6 2" [ref=e254]:
            - cell [ref=e255]:
              - checkbox [ref=e256]
            - cell "StandardVbtMetricsCalculator" [ref=e257]
            - cell "roomfit_exercise" [ref=e258]
            - cell "6" [ref=e259]
            - cell "2" [ref=e260]
          - row "InMemoryWorkoutRepository roomfit_workout 2 5" [ref=e261]:
            - cell [ref=e262]:
              - checkbox [ref=e263]
            - cell "InMemoryWorkoutRepository" [ref=e264]
            - cell "roomfit_workout" [ref=e265]
            - cell "2" [ref=e266]
            - cell "5" [ref=e267]
          - row "SessionManager roomfit_workout 2 5" [ref=e268]:
            - cell [ref=e269]:
              - checkbox [ref=e270]
            - cell "SessionManager" [ref=e271]
            - cell "roomfit_workout" [ref=e272]
            - cell "2" [ref=e273]
            - cell "5" [ref=e274]
          - row "SetExecutor roomfit_workout 2 5" [ref=e275]:
            - cell [ref=e276]:
              - checkbox [ref=e277]
            - cell "SetExecutor" [ref=e278]
            - cell "roomfit_workout" [ref=e279]
            - cell "2" [ref=e280]
            - cell "5" [ref=e281]
          - row "WorkoutRepository roomfit_workout 2 5" [ref=e282]:
            - cell [ref=e283]:
              - checkbox [ref=e284]
            - cell "WorkoutRepository" [ref=e285]
            - cell "roomfit_workout" [ref=e286]
            - cell "2" [ref=e287]
            - cell "5" [ref=e288]
          - row "RecordedSession roomfit_exercise 3 0" [ref=e289]:
            - cell [ref=e290]:
              - checkbox [ref=e291]
            - cell "RecordedSession" [ref=e292]
            - cell "roomfit_exercise" [ref=e293]
            - cell "3" [ref=e294]
            - cell "0" [ref=e295]
          - row "SessionRecorder roomfit_exercise 3 0" [ref=e296]:
            - cell [ref=e297]:
              - checkbox [ref=e298]
            - cell "SessionRecorder" [ref=e299]
            - cell "roomfit_exercise" [ref=e300]
            - cell "3" [ref=e301]
            - cell "0" [ref=e302]
          - row "InMemoryShopRepository roomfit_shop 0 6" [ref=e303]:
            - cell [ref=e304]:
              - checkbox [ref=e305]
            - cell "InMemoryShopRepository" [ref=e306]
            - cell "roomfit_shop" [ref=e307]
            - cell "0" [ref=e308]
            - cell "6" [ref=e309]
          - row "RestDetector roomfit_workout 0 5" [ref=e310]:
            - cell [ref=e311]:
              - checkbox [ref=e312]
            - cell "RestDetector" [ref=e313]
            - cell "roomfit_workout" [ref=e314]
            - cell "0" [ref=e315]
            - cell "5" [ref=e316]
          - row "SupabaseWorkoutRepository roomfit_workout 0 5" [ref=e317]:
            - cell [ref=e318]:
              - checkbox [ref=e319]
            - cell "SupabaseWorkoutRepository" [ref=e320]
            - cell "roomfit_workout" [ref=e321]
            - cell "0" [ref=e322]
            - cell "5" [ref=e323]
          - row "MockDeviceGateway roomfit_device 0 0" [ref=e324]:
            - cell [ref=e325]:
              - checkbox [ref=e326]
            - cell "MockDeviceGateway" [ref=e327]
            - cell "roomfit_device" [ref=e328]
            - cell "0" [ref=e329]
            - cell "0" [ref=e330]
          - row "AcwrCalculator roomfit_exercise 0 0" [ref=e331]:
            - cell [ref=e332]:
              - checkbox [ref=e333]
            - cell "AcwrCalculator" [ref=e334]
            - cell "roomfit_exercise" [ref=e335]
            - cell "0" [ref=e336]
            - cell "0" [ref=e337]
          - row "RoomfitExtendedMetricsCalculator roomfit_exercise 0 0" [ref=e338]:
            - cell [ref=e339]:
              - checkbox [ref=e340]
            - cell "RoomfitExtendedMetricsCalculator" [ref=e341]
            - cell "roomfit_exercise" [ref=e342]
            - cell "0" [ref=e343]
            - cell "0" [ref=e344]
          - row "VelocitySignFlipRepDetector roomfit_exercise 0 0" [ref=e345]:
            - cell [ref=e346]:
              - checkbox [ref=e347]
            - cell "VelocitySignFlipRepDetector" [ref=e348]
            - cell "roomfit_exercise" [ref=e349]
            - cell "0" [ref=e350]
            - cell "0" [ref=e351]
          - row "FirmwareUpdateSession roomfit_firmware 0 0" [ref=e352]:
            - cell [ref=e353]:
              - checkbox [ref=e354]
            - cell "FirmwareUpdateSession" [ref=e355]
            - cell "roomfit_firmware" [ref=e356]
            - cell "0" [ref=e357]
            - cell "0" [ref=e358]
          - row "PacketBuilder roomfit_protocol 0 0" [ref=e359]:
            - cell [ref=e360]:
              - checkbox [ref=e361]
            - cell "PacketBuilder" [ref=e362]
            - cell "roomfit_protocol" [ref=e363]
            - cell "0" [ref=e364]
            - cell "0" [ref=e365]
    - contentinfo [ref=e60]:
      - navigation [ref=e61]:
        - link "Previous page 화면" [ref=e62] [cursor=pointer]:
          - /url: ./screens
          - text: Previous page
          - generic [ref=e63]: 화면
        - link "Next page 시나리오" [ref=e64] [cursor=pointer]:
          - /url: ./scenarios
          - text: Next page
          - generic [ref=e65]: 시나리오
      - generic [ref=e66]:
        - text: "Source: /Volumes/WorkSSD/Projects/RoomfitV2 · build via"
        - code [ref=e67]: make extract && npm run build