{
  "title": "雨城最后一束光",
  "synopsis": "送灯少女小禾与旧机器人圆点，带着雨城最后一盏灯登上山顶。灯熄灭后，圆点愿意献出心核；小禾选择把光分给伙伴和灯塔。微弱信号得到城中居民回应，雨城终于重新迎来清晨。",
  "status": "complete",
  "started_at": "2026-10-20T00:29:31-05:00",
  "updated_at": "2026-10-25T02:15:35.344-05:00",
  "current": "10 部影片与 10 张海报均已验收",
  "films_complete": 10,
  "shots_complete": 300,
  "shots_total": 300,
  "local_only": true,
  "narrative_seconds_per_film": 300,
  "output_width": 1280,
  "output_height": 720,
  "source_width": 768,
  "source_height": 448,
  "shared_audio_timing": {
    "shared_for_visual_editions": 10,
    "count_once_not_ten_times": true,
    "tts_download_and_extract_seconds": 116.96086459999788,
    "narration_synthesis_seconds": 181.41989490001288,
    "narration_generation_and_assembly_seconds": 195.0906321000075,
    "music_generation_wall_seconds": 301.831,
    "music_generation_execution_seconds": 299.341,
    "music_generation_queue_seconds": 0.806,
    "music_timing_source": "PROJECT_ROOT\\work\\rainlight_production\\jobs\\shared_music\\timing.json",
    "mix_and_validation_seconds": 1.0995,
    "known_shared_audio_processing_seconds": 558.4906,
    "music_generation_included_in_known_total": true,
    "setup_download_excluded_from_processing_total": true,
    "master_path": "PROJECT_ROOT\\work\\rainlight_production\\audio\\master.wav",
    "master_duration_seconds": 300,
    "raw_music_duration_seconds": 116.63383333333333,
    "theme_repetition_used": true,
    "previous_audio_revision": {
      "shared_for_visual_editions": 10,
      "count_once_not_ten_times": true,
      "tts_download_and_extract_seconds": 5.92,
      "narration_synthesis_seconds": 11.9707,
      "narration_generation_and_assembly_seconds": 12.5631,
      "music_generation_wall_seconds": 301.831,
      "music_generation_execution_seconds": 299.341,
      "music_timing_source": "PROJECT_ROOT\\work\\rainlight_production\\jobs\\shared_music\\timing.json",
      "mix_and_validation_seconds": 1.5794,
      "known_shared_audio_processing_seconds": 315.9735,
      "music_generation_included_in_known_total": true,
      "setup_download_excluded_from_processing_total": true,
      "master_path": "PROJECT_ROOT\\work\\rainlight_production\\audio\\master.wav",
      "master_duration_seconds": 300,
      "raw_music_duration_seconds": 116.63383333333333,
      "theme_repetition_used": true,
      "music_generation_queue_seconds": 0.806
    },
    "latest_master_preparation_seconds": 498.0211,
    "voice_upgrade": {
      "model": "Qwen3-TTS-12Hz-1.7B-CustomVoice",
      "speaker": "Serena",
      "selected_by_user": true,
      "local_only": true,
      "model_download_seconds": 116.96086459999788,
      "audition_all_six_wall_seconds": 46.06359629999497,
      "audition_all_six_generation_seconds": 38.6921461999882,
      "new_batch_wall_seconds": 195.35405180000816,
      "new_batch_generation_seconds": 181.41989490001288,
      "reused_sample_generation_seconds": 17.914560599980177,
      "reused_sample_count": 3,
      "new_mix_seconds": 1.0995,
      "upgrade_processing_seconds": 242.5171,
      "accounting": "All six auditions are counted once. The new batch excludes synthesis of three reused auditions. Previous music is reused and counted once in the preserved first audio revision. Model downloads and environment setup are excluded from processing totals and are included in recorded project activity.",
      "batch_manifest": "PROJECT_ROOT\\work\\tts_upgrade\\new_audio\\batch_manifest.json"
    }
  },
  "new_model_downloads": {
    "started_at": "2026-10-20T00:34:50-05:00",
    "completed_at": "2026-10-20T00:39:41-05:00",
    "wall_seconds": 291.46,
    "files": [
      {
        "file": "checkpoints/ltxv-2b-0.9.8-distilled.safetensors",
        "url": "https://huggingface.co/Lightricks/LTX-Video/resolve/main/ltxv-2b-0.9.8-distilled.safetensors",
        "started_at": "2026-10-20T00:34:50-05:00",
        "expected_bytes": 6340744492,
        "expected_sha256": "76aa8c4786af752fa6f951947129d5290c3c6c0b2fadcadea6b5e114ae2cad8f",
        "status": "complete",
        "bytes": 6340744492,
        "attempt": 1,
        "updated_at": "2026-10-20T00:39:00-05:00",
        "seconds": 291.44,
        "sha256": "76aa8c4786af752fa6f951947129d5290c3c6c0b2fadcadea6b5e114ae2cad8f",
        "completed_at": "2026-10-20T00:39:41-05:00"
      },
      {
        "file": "text_encoders/t5xxl_fp8_e4m3fn.safetensors",
        "url": "https://huggingface.co/comfyanonymous/flux_text_encoders/resolve/main/t5xxl_fp8_e4m3fn.safetensors",
        "started_at": "2026-10-20T00:34:50-05:00",
        "expected_bytes": 4893934904,
        "expected_sha256": "7d330da4816157540d6bb7838bf63a0f02f573fc48ca4d8de34bb0cbfd514f09",
        "status": "complete",
        "bytes": 4893934904,
        "attempt": 1,
        "updated_at": "2026-10-20T00:37:13-05:00",
        "seconds": 167.97,
        "sha256": "7d330da4816157540d6bb7838bf63a0f02f573fc48ca4d8de34bb0cbfd514f09",
        "completed_at": "2026-10-20T00:37:38-05:00"
      }
    ]
  },
  "video_benchmarks": [
    {
      "key": "benchmark_video_10s",
      "status": "success",
      "submitted_at": "2026-10-20T00:29:33-05:00",
      "completed_at": "2026-10-20T00:32:42-05:00",
      "prompt_id": "f39af32f-38e9-4a08-bfb3-1415f02c46bd",
      "files": [
        "PROJECT_ROOT\\work\\rainlight_production\\jobs\\benchmark_video_10s\\benchmark_video_10s_00001_.mp4"
      ],
      "wall_seconds": 189.0,
      "execution_seconds": 187.779,
      "queue_seconds": 0.359
    },
    {
      "key": "benchmark_ltx_10s",
      "status": "success",
      "submitted_at": "2026-10-20T00:39:44.408-05:00",
      "completed_at": "2026-10-20T00:42:55.531-05:00",
      "prompt_id": "20ea1b90-d5b6-4792-9a5a-9258ef7c15e7",
      "files": [
        "PROJECT_ROOT\\work\\rainlight_production\\jobs\\benchmark_ltx_10s\\benchmark_ltx_10s_00001_.mp4"
      ],
      "wall_seconds": 191.123,
      "execution_seconds": 26.484,
      "queue_seconds": 163.091
    }
  ],
  "accounting_note": "elapsed_seconds is the original-start-to-latest-end span, including inactive gaps. active_elapsed_seconds is the union of recorded production sessions and includes review and queue waits, not CPU/GPU utilization. inactive_seconds is the difference. Legacy spans and previous delivery revisions are preserved. Shared preparation is counted once; parallel stage durations are not summed as project wall time.",
  "motion_tests": [
    {
      "key": "motion_test_ltx_S01_v2",
      "status": "success",
      "submitted_at": "2026-10-20T00:55:33.365-05:00",
      "completed_at": "2026-10-20T00:55:55.663-05:00",
      "prompt_id": "f8ee42bb-3520-44c9-a1e9-d166ed2fa0a2",
      "prompt_sha256": "cd0d2cbfc6915815eaec44df29ab9da76efc3734da111568138b58a9d10a2eae",
      "files": [
        "PROJECT_ROOT\\work\\rainlight_production\\jobs\\motion_test_ltx_S01_v2\\motion_test_ltx_S01_v2_00001_.mp4"
      ],
      "stage": "complete",
      "wall_seconds": 22.298,
      "queue_seconds": 0.023,
      "execution_seconds": 20.443,
      "queue_seconds_known": true,
      "execution_seconds_known": true,
      "server_completed_at": "2026-10-20T05:55:53.831+00:00",
      "timing_incomplete": false,
      "unattributed_wall_seconds": 1.832
    },
    {
      "key": "motion_test_ltx_S02_v2",
      "status": "success",
      "submitted_at": "2026-10-20T00:55:55.668-05:00",
      "completed_at": "2026-10-20T00:56:17.926-05:00",
      "prompt_id": "a3e35172-20db-4285-9d16-78049ffc9e30",
      "prompt_sha256": "ab52c2f4416c086d8a249b425500c316100d9d4fe60664becd6530c8f0741a66",
      "files": [
        "PROJECT_ROOT\\work\\rainlight_production\\jobs\\motion_test_ltx_S02_v2\\motion_test_ltx_S02_v2_00001_.mp4"
      ],
      "stage": "complete",
      "wall_seconds": 22.258,
      "queue_seconds": 0.011,
      "execution_seconds": 20.58,
      "queue_seconds_known": true,
      "execution_seconds_known": true,
      "server_completed_at": "2026-10-20T05:56:16.259+00:00",
      "timing_incomplete": false,
      "unattributed_wall_seconds": 1.667
    },
    {
      "key": "motion_test_ltx_S03_v2",
      "status": "success",
      "submitted_at": "2026-10-20T00:57:35.186-05:00",
      "completed_at": "2026-10-20T00:57:59.503-05:00",
      "prompt_id": "4a03ed48-1b15-4bf6-a0d4-911926eac024",
      "prompt_sha256": "3a1d1792137508b954e3670e651209ce2dbeb112e7be0a596c103c2230923ddb",
      "files": [
        "PROJECT_ROOT\\work\\rainlight_production\\jobs\\motion_test_ltx_S03_v2\\motion_test_ltx_S03_v2_00001_.mp4"
      ],
      "stage": "complete",
      "wall_seconds": 24.317,
      "queue_seconds": 0.022,
      "execution_seconds": 22.879,
      "queue_seconds_known": true,
      "execution_seconds_known": true,
      "server_completed_at": "2026-10-20T05:57:58.087+00:00",
      "timing_incomplete": false,
      "unattributed_wall_seconds": 1.416
    },
    {
      "key": "motion_test_ltx_S04_v2",
      "status": "success",
      "submitted_at": "2026-10-20T00:57:59.507-05:00",
      "completed_at": "2026-10-20T00:58:21.753-05:00",
      "prompt_id": "9da61ef7-a454-4a19-b0bb-d4f6cdd8771a",
      "prompt_sha256": "b9937798b76f1ac88a3386482eb6b5f7ba6bc6e8caf460f2f1c7852d7babe5ac",
      "files": [
        "PROJECT_ROOT\\work\\rainlight_production\\jobs\\motion_test_ltx_S04_v2\\motion_test_ltx_S04_v2_00001_.mp4"
      ],
      "stage": "complete",
      "wall_seconds": 22.246,
      "queue_seconds": 0.035,
      "execution_seconds": 20.407,
      "queue_seconds_known": true,
      "execution_seconds_known": true,
      "server_completed_at": "2026-10-20T05:58:19.949+00:00",
      "timing_incomplete": false,
      "unattributed_wall_seconds": 1.804
    }
  ],
  "motion_test_accounting": "An accepted test may be reused as a final source clip. Its execution is then included in the film timing, so the motion test list is provenance and must not be added again.",
  "requested_films": 10,
  "delivered_films": 10,
  "existing_watercolor_frames": 30,
  "delivered_source_clips": 300,
  "original_timing_snapshot": "PROJECT_ROOT\\work\\rainlight_production\\timing_history\\project_before_sessions.e772815f0d6ac1a5.json",
  "timing_before_sessions": {
    "status": "stopped",
    "started_at": "2026-10-20T00:29:31-05:00",
    "stopped_at": "2026-10-20T01:14:27.480-05:00",
    "completed_at": "2026-10-20T01:18:31.123-05:00",
    "delivery_completed_at": "2026-10-20T01:18:31.123-05:00",
    "elapsed_seconds": 2940.123,
    "updated_at": "2026-10-20T01:18:31.106-05:00"
  },
  "activity_sessions": [
    {
      "id": "legacy-initial",
      "started_at": "2026-10-20T00:29:31-05:00",
      "source": "existing_recorded_production_span",
      "note": "Historical span includes review and waiting; no utilization claim.",
      "ended_at": "2026-10-20T01:18:30.811-05:00",
      "end_reason": "stopped",
      "stop_requested_at": "2026-10-20T01:14:27.480-05:00"
    },
    {
      "id": "7f43abff376c44ce890e6a0af37414ed",
      "started_at": "2026-10-20T08:20:02-05:00",
      "reason": "本地配音升级",
      "event": "resumed",
      "source": "observed_activity_start",
      "ended_at": "2026-10-20T11:23:03.5265169-05:00",
      "end_reason": "stopped"
    },
    {
      "id": "6e4488b88d644a5593c2217341681f70",
      "started_at": "2026-10-22T10:25:31.277-05:00",
      "reason": "2026-10-22 用户明确恢复：继续开干，火力全开",
      "event": "resumed",
      "source": "observed_activity_start",
      "ended_at": "2026-10-22T10:56:59.057-05:00",
      "end_reason": "needs_attention"
    },
    {
      "id": "becae861793e4d2ba67ef868893f529b",
      "started_at": "2026-10-22T10:59:37.107-05:00",
      "reason": "恢复本地影片制作",
      "event": "resumed",
      "source": "observed_activity_start",
      "ended_at": "2026-10-22T12:01:18.945-05:00",
      "end_reason": "stopped"
    },
    {
      "id": "e292a4337dbc46d6bf099d0a8cc7ddde",
      "started_at": "2026-10-22T12:26:30.591-05:00",
      "reason": "用户恢复：完成第10部并打包10海报10影片",
      "event": "resumed",
      "source": "observed_activity_start",
      "ended_at": "2026-10-22T12:31:48.914-05:00",
      "end_reason": "unverified_activity_gap_after_failed_repair"
    },
    {
      "id": "0538927092ed4f3e9ec1f3721771c4e6",
      "started_at": "2026-10-25T01:55:43.685-05:00",
      "reason": "2026-10-25 用户明确继续：完成第10部与总包",
      "event": "resumed",
      "source": "observed_activity_start",
      "ended_at": "2026-10-25T02:15:35.344-05:00",
      "end_reason": "complete"
    },
    {
      "id": "observed-20261022-atomic-write-recovery",
      "started_at": "2026-10-22T10:56:59.057-05:00",
      "ended_at": "2026-10-22T10:59:37.107-05:00",
      "end_reason": "recovered",
      "source": "observed_operator_repair_interval",
      "note": "Root remained active diagnosing and repairing the atomic JSON write failure, testing it and restarting production. This was not a user pause."
    }
  ],
  "resumed_at": "2026-10-25T01:55:43.685-05:00",
  "previous_delivery_snapshot": {
    "delivered_films": 1,
    "existing_watercolor_frames": 14,
    "delivered_source_clips": 30,
    "source_timing": "PROJECT_ROOT\\work\\rainlight_production\\timing_history\\project_before_sessions.e772815f0d6ac1a5.json"
  },
  "activity_gap_notes": [
    {
      "from": "2026-10-22T12:31:48.914-05:00",
      "to": "2026-10-25T01:55:43.685-05:00",
      "prior_timing_snapshot": "PROJECT_ROOT\\work\\rainlight_production\\timing_history\\rainlight_films_before_gap_recovery_20261025.c5aa87f70a37ba21.json",
      "last_recorded_job": "PROJECT_ROOT\\work\\rainlight_production\\jobs\\10_3d_S21_h3_qc4_io_retry\\timing.json",
      "accounting": "The prior process session was left open after the failed repair. No current production process or subsequent project media was present at resume. The gap after the last recorded job is excluded from activity elapsed time; this is a reconstruction from logs, not a measured user pause or GPU-utilization claim."
    }
  ],
  "elapsed_seconds": 438364.344,
  "active_elapsed_seconds": 21178.988,
  "inactive_seconds": 417185.356,
  "completed_at": "2026-10-25T02:15:35.344-05:00",
  "recovery_accounting_snapshot": "PROJECT_ROOT\\work\\rainlight_production\\timing_history\\rainlight_films_before_recovery_accounting.c5478805f0280ec3.json",
  "recovery_accounting_portable_snapshot": "provenance/timing_snapshots/rainlight_films_before_recovery_accounting.c5478805f0280ec3.json"
}