Skip to content

【openscreen】容量不足録画を保存ライブラリから再利用できるようにする #12

Open

Description

@nanameru

課題 / 目的\nOpenScreenの録画中に空き容量が尽きて全体を撮り直す事態を防ぐ。危険水準の前に現在の録画を正常確定して一時停止し、容量確保後に同じ撮影セッションへ続きを追加できるようにする。\n\n## 利用者 / 成功状態\n- 利用者: 長時間の画面録画を行う本人\n- 成功状態: 低容量で途中までの映像を失わず停止し、容量確保後に再開でき、前後の区間を同じプロジェクトで扱える。\n\n## 対象範囲\n- 録画中の保存先ボリューム空き容量監視\n- 安全余裕を下回る前の自動停止と部分録画の正常確定\n- 低容量停止理由と再開方法の表示\n- 同一撮影セッションへの後続セグメント追加\n- 既存ローカル録画の回帰防止\n\n## 対象外\n- 停止中の映像記録\n- 容量が完全に枯渇した後の破損ファイル完全復旧\n- 自動ファイル削除\n- クラウド直接録画\n- 人間承認前のリリース・インストール\n\n## 仕様上の判断\n- 固定値だけでなく、現在の書き込み速度から「正常確定に必要な時間」を見込んだ安全余裕で停止する。\n- 自動停止時点までの録画を必ず既存のfinalize経路で確定する。\n- 容量確保後の再開は明示操作とし、誤って録画が始まらないようにする。\n- 前後の動画は非破壊の複数セグメントとして同一プロジェクトへ並べる。\n- OSや他アプリの書き込みがあるため容量枯渇を絶対に防ぐ保証はしない。\n\n## 完了条件\n- [ ] 録画先と同じボリュームの空き容量を録画中に監視する。\n- [ ] 危険水準到達時に停止処理を一度だけ発火し、録画済み区間を確定する。\n- [ ] 停止理由と「容量を空けて再開」の導線が表示される。\n- [ ] 再開した区間が同じプロジェクトへ時系列順に追加される。\n- [ ] 停止中の空白が記録されないことを表示する。\n- [ ] 手動停止、通常録画、異常停止復旧に回帰がない。\n- [ ] unit、typecheck(app/tests)、lint、関連build、macOS実機E2Eの証跡がある。\n\n## テスト / CI計画\n- TC-LOWDISK-01 空き容量応答と保存先ボリューム解決\n- TC-LOWDISK-02 閾値到達時の一度だけの安全停止\n- TC-LOWDISK-03 finalize失敗時の誤成功防止\n- TC-LOWDISK-04 容量回復後の明示再開と同一プロジェクトへの追加\n- TC-LOWDISK-05 手動停止・正常録画・異常停止の回帰\n- TC-LOWDISK-06 macOS実録画での停止・再開・編集確認\n\n## Readiness\n- System Readiness: pass(DB・認証・外部連携なし。正本は既存プロジェクトファイルと録画セグメント)\n- Design Readiness: small-change(既存HUDの状態表示と再開導線のみ。大幅な画面設計変更なし)\n- unresolved: 0\n- SYSTEM_READY: yes\n- DESIGN_READY: yes(既存コンポーネントに沿う小規模変更として委任済み)\n- ユーザー最終確認: 2026-09-09 「実装してほしい」\n- 人間承認点: merge / release / インストール / 削除\n\n## 実装計画\n1. 既存の停止・finalize・プロジェクト生成経路を調査する。\n2. 空き容量IPCと監視判断をテストから実装する。\n3. 自動停止状態と再開セッションを接続する。\n4. 関連テストと実機E2Eを実行する。\n5. checker確認、Issueログ、commit、push、Draft PRまで行う。\n\n## ナレッジログ\n- Issue #7はScreenCaptureKit異常停止時の部分保存を扱う。今回の低容量停止は原因と再開要件が異なるため別Issueとする。\n- Cursor Context ScoutはAPIキー未設定のため利用できず、直接ソース探索へ切り替えた。\n

Activity

  1. nanameru commented on Sep 9, 2026

    @nanameru
    OwnerAuthor

    テストケース

    • TC-LOWDISK-01: 録画先ボリュームの空き容量取得
    • TC-LOWDISK-02: 危険水準で一度だけ安全停止
    • TC-LOWDISK-03: 容量確保後に同一プロジェクト末尾へ追加
    • TC-LOWDISK-04: macOS実機で停止・再開・編集確認

    正本: test-board.yaml

  2. nanameru commented on Sep 9, 2026

    @nanameru
    OwnerAuthor

    テスト結果(2026-09-09)

    • TC-LOWDISK-01 [done] 録画先ボリュームの空き容量取得
    • TC-LOWDISK-02 [done] 危険水準で停止を一度だけ要求
    • TC-LOWDISK-03 [done] 続き録画を同一プロジェクト末尾へ追加
    • TC-LOWDISK-04 [done] macOS実機で停止・再開を確認

    検証: 全183テストファイル(2,169件)成功、typecheck成功、Biome成功、npm run build-vite成功。macOS 26.3の隔離データ領域で、5.067秒の初回録画と5.010秒の続き録画が2クリップ・合計10.077秒として連続することを確認。

    判断: 録画ビットレートに対して十分な終了処理猶予を確保するため、保存先の空き容量を5秒間隔で確認し、標準では1 GiB以下で安全停止する。開発・E2E時だけ環境変数で閾値を差し替え可能。

  3. nanameru commented on Sep 9, 2026

    @nanameru
    OwnerAuthor

    運用上の制約

    横断ルールの 【repo名】 先頭指定と、当リポジトリのsemantic-pr(タイトル先頭に feat: 等を要求)が競合した。CIを再現可能な品質ゲートとして通すため、PRタイトルは feat: 【openscreen】... とし、リポジトリ識別子を保持した。

  4. nanameru commented on Sep 9, 2026

    @nanameru
    OwnerAuthor

    完了ログ

    • 実装コミット: de99dc25
    • Draft PR: feat: 【openscreen】録画ライブラリから過去の録画を再利用できるようにする #13
    • 変更箇所: Electron IPC/preload、録画hook、録画セッション、編集画面の録画import、テスト、manual E2Eログ、test-board
    • ローカル: 183 test files / 2,169 passed / 2 skipped、typecheck、Biome、build-vite成功
    • GitHub Actions: Build / Test / Lint / Type Check / test typecheck / Docs / Swift / Rust(macOS・Linux・Windows) / semantic-pr すべて成功
    • フォローアップ: Windows・Linux実機での録画UI確認はリリース前に推奨。マージ、配布、インストールは人間承認待ち。
  5. nanameru commented on Sep 9, 2026

    @nanameru
    OwnerAuthor

    仕様更新: 録画ライブラリ方式(ユーザー承認 2026-09-09)

    目的

    録画の再開だけを特殊扱いせず、保存済み録画をMediaから選び、任意のプロジェクトのタイムラインへ再利用できるようにする。

    受け入れ条件

    • 保存済み録画を新しい順で一覧できる
    • 一覧は録画日時、長さ、ファイルサイズ、低容量停止の有無を表示する
    • 選択した録画を元ファイルの複製なしで現在のプロジェクトへ追加できる
    • 同一パスを同じプロジェクトへ重複追加しない
    • 追加した素材を明示操作でタイムライン末尾へ置ける
    • 低容量停止した最新録画は再開候補として強調する
    • 通常の新規録画を勝手に既存タイムラインへ接続しない
    • ファイルの削除は行わない

    データ・UI境界

    • 正本: 既存のローカル recordings ディレクトリと .session.json
    • DB、認証、外部送信なし
    • Mediaの既存コンポーネントを再利用する小規模変更。Figma新規作成は省略
    • マージ、配布、インストール、削除は人間承認前で停止

    Beads TODO

    • Epic: herdr-bpu
    • Tasks: herdr-bpu.1〜herdr-bpu.6
    • 再同期時にembedded storeがread-onlyとなったが、Epicと6タスクの作成自体は完了している。
  6. changed the title [-]【openscreen】容量不足前に録画を保存して続きから再開できるようにする[/-] [+]【openscreen】容量不足録画を保存ライブラリから再利用できるようにする[/+] on Sep 9, 2026
  7. nanameru commented on Sep 9, 2026

    @nanameru
    OwnerAuthor

    実装更新(commit 74858a7)

    • 保存済み録画をMediaに新しい順で一覧表示
    • 日時・録画時間・サイズ・容量不足保存バッジを表示
    • 「タイムラインに追加」を押した録画だけ末尾へ追加
    • 同じファイルパスは既存アセット参照を再利用し、物理ファイルを複製しない
    • 編集画面からの通常録画も自動追加せず、元プロジェクトへ戻ってライブラリに保存
    • 録画削除は対象外

    検証: 対象5ファイル41テスト、build-vite、変更ファイルBiome、i18n、docsは成功。全テストは146 suites / 1,864 tests成功後、端末の空き容量枯渇(ENOSPC)で残り37 suitesを開始できず。MediaライブラリのmacOS実機E2Eも空き1 GiB未満の安全基準により保留。test-boardのTC-LOWDISK-04をdoingとして残した。

  8. nanameru commented on Sep 9, 2026

    @nanameru
    OwnerAuthor

    CI最終結果: 全チェック成功。Test / Build / Lint / Type Check / test typecheck / Docs / AppStream / Swift / Rust(macOS・Linux・Windows)/ diagnostic bundle / PR title validation を含む。Draft PRのまま、マージ・配布は未実施。残りは空き容量を確保した後のmacOS実機UI確認(TC-LOWDISK-04)。

  9. nanameru commented on Sep 9, 2026

    @nanameru
    OwnerAuthor

    macOS実機E2E結果(2026-09-09)

    dd51207a で検証記録と test-board を更新しました。

    • 隔離した OPENSCREEN_TEST_USER_DATA_DIR を使用
    • 実ディスクを埋めず、開発用 OPENSCREEN_LOW_DISK_STOP_BYTES=3000000000 で容量不足を再現
    • HUD開始録画: 5.007秒で自動停止、stopReason: low-disk を保存
    • 既存プロジェクトからの録画: 5.008秒で自動停止、returnProjectId を保持して同じプロジェクトへ復帰
    • 復帰後もタイムラインは1 asset / 1 clip / 5.1秒のままで、新しい録画を自動挿入しないことを確認
    • Mediaでは6件が新しい順に表示され、最新録画は 0:05.0、6 MB、容量不足前に保存 と表示
    • 通常録画の復帰、明示追加、同じパスのasset再利用、複数clipとしての再追加、追加前の実duration取得も同じ隔離環境で確認
    • 関連Vitest: 5 files / 42 tests passed
    • test-board: 6/6 done

    未確認範囲: system audio、microphone、webcam、export、packaged app、Windows、Linux。

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

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions