Skip to content

【openscreen】macOS録画終了時に有効なMP4を保存失敗として取り残さない #4

Description

@nanameru

課題 / 目的

macOS版OpenScreen 1.10.0で録画停止後に保存失敗が表示され、エディターが開かない事象が発生した。
利用者の録画データを失わないため、ネイティブhelperの停止通知が失敗しても、完成済みで読み取り可能なMP4が残っている場合は録画セッションとして救済する。

観測事実

  • 発生環境: macOS arm64 / OpenScreen 1.10.0
  • 失敗した録画本体は recordings/recording-1788352573602.mp4 として残っている。
  • ffprobe でH.264動画、34.231667秒、18,933,868 bytesとして読み取れる。
  • 対応する .session.json.mp4.cursor.json は作成されず、プロジェクトも作成されていない。
  • 同じ起動セッションで行った約7秒の再現用録画は正常終了し、MP4、カーソルsidecar、session manifest、projectが作成された。
  • 直前診断はhelper出力を保持しておらず、元のhelper終了理由は確定できていない。

対象範囲

  • macOSネイティブ録画の停止・保存処理
  • 停止通知失敗時に残ったMP4の安全な妥当性判定
  • 妥当なMP4をsession manifestへ接続し、エディターへ渡す救済経路
  • 成功、救済、救済不可を区別する回帰テスト
  • 診断ログに救済結果と元の停止エラーを残す

対象外

  • Windows / Linux録画経路の変更
  • 録画・編集UIのデザイン変更
  • 不完全または書き込み中のMP4を無条件で開くこと
  • 自動マージ、リリース、公開

完了条件

  • 正常なmacOS停止経路は従来どおりsession manifestを作成してエディターを開く
  • helperが停止通知に失敗しても、helperが終了済みで完成したMP4と判定できる場合は録画を救済する
  • 小さすぎる、不完全、または書き込み中のファイルは救済しない
  • 救済時は元のエラーと救済結果を診断可能なログへ残す
  • 回帰テスト、app/test TypeScript typecheck、lint、関連テストが通る
  • 実機macOSでrecord → stop → editor表示を確認する

実装計画

  1. macOS録画停止結果とMP4妥当性判定をNode-pure moduleへ分離する
  2. 失敗する回帰テストを追加する
  3. stop-native-mac-recording に安全な救済分岐を追加する
  4. テスト・typecheck・lintを実行する
  5. macOS実機で短時間録画を行い、保存物とエディター表示を確認する
  6. Draft PRを作成し、人間レビュー前で停止する

テスト / CI計画

  • unit: MP4 atom判定(正常、moov欠落、mdat欠落、切断atom、小容量)
  • unit: helper終了済みのみ救済し、稼働中は救済しない判断
  • targeted Vitest
  • npx tsc --noEmit
  • npx tsc -p tsconfig.test.json --noEmit
  • npm run lint
  • 必要に応じて npm run test
  • macOS desktop E2Eの録画停止・エディター表示

リスク / 停止条件

  • 不完全なMP4を救済するとエディター側で二次障害になるため、構造確認なしのsize-only判定は採用しない。
  • helperが生存中のファイルは書き込み中の可能性があるため救済しない。
  • 同じ原因で品質ゲートが2回失敗した場合は原因と再開点を記録して停止する。
  • merge、release、deployは人間承認まで行わない。

ナレッジログ

  • 2026-09-02: インストール済み1.10.0を確認。失敗録画のMP4本体は正常に読めるが、sidecar / manifest / projectが欠落している。
  • 2026-09-02: 同一環境で短時間録画は成功。恒常的な画面収録権限・保存先権限の問題ではない。
  • 2026-09-02: Cursor Context ScoutはCursor APIキー未設定のため利用できず、rgで停止処理とテストを手動特定した。

Beads TODO

Issue確定後に同期する。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions