1仕組みと動作原理
パイプライン全体の入力となるのは、エージェント自身の履歴です。ユーザーの日常的なパターンを割り出し、1回の典型的なセッションを時系列順に沿って40〜70秒の映像に仕上げます。素材はユーザー自身の生の発言であり、画面上の部屋やデスクはエージェントが持つユーザーのコンテキストから形作られます。
The agent reads its own history with its user, finds their routine, and turns one typical session into a 40 to 70 s film, in the order it happened:
創作のための入力は story.json の1点のみです。演出(滑空、折りたたみ、投擲、木槌の殴打、蝶の羽ばたき)は scenes/*.js 配下のエンジンが担当し、エージェント側が変更すべきではありません。画面に表示されるすべての文言は引用であり、レンダリング前に1行ずつユーザーの承認を得る必要があります。
Write `story.json` and the engine does the choreography. Nothing on screen is invented: every line is a quote, and the user approves every line before a frame is rendered.
素材の抽出はローカルで行われ、ユーザーの明確な合意が前提となります。harvest.py が現在のプロジェクトの Claude Code(~/.claude/projects/<slug>/*.jsonl)および Codex(~/.codex/sessions)のログを読み込み、「最も劇的」ではなく「最も典型的」な順にソートします。各メッセージにはローカル時刻、種別の推測、機密フラグが付与されます。
It prints the routine first: messages and minutes in a median session, the usual start time, the mix of kinds, and the words that come up most.
schedule.mjs は「本編のレンダリングで動作する同一のコード」を使用して story.json をコンパイルします。VM 内で scenes/compile.js を実行し、story.js、score/timeline.json、index.html の再生時間、kit/config.js を生成します。同時にバリデータとしても機能し、サンプルの流用を拒否し、部屋の小道具名とスロットの適合性を検証し、source のない引用に警告を発し、80秒超過に警告を出し、冒頭が返答から始まっている場合や引用が長すぎる場合には exit 1 で即座に終了します。
// schedule.mjs: compile a project's story.json with the same code the film runs (scenes/compile.js) … refusing: this is the example story ( … vm.runInContext(fs.readFileSync(P('scenes/compile.js'), 'utf8'), ctx, { filename: 'compile.js' });
プライバシーゲートは厳格な関門です。デザインパスの前に、ユーザーに一覧表(フック、ネームプレート、各引用文、各返答文、小道具とその選定理由)をソース元付きで提示し、明示的な yes を得て初めて approved: true を書き込みます。承認前は全フレームに DRAFT の透かしが入ります。ユーザー本人以外の氏名、クライアント名、企業名、NDA 対象製品、パス、URL、メールアドレス、特定可能な数値、秘密情報はすべてカットする必要があります。
7. **Privacy gate:** show the user one table of every on-screen line (hook, nameplate, each quote, each reply, each prop and why), each with its source. Take their edits, get an explicit yes, then set `"approved": true`. Until then every frame carries a DRAFT stamp.
劇伴音楽は独自作曲ですが、厳格な数値基準が設けられています。score/score.py(独自の主題、キー、音色)を記述し、build.sh が compose → render → master → check の順で進行します。macOS では swift 経由でシステム標準の General MIDI を使用し、その他の環境では fluidsynth + SOUNDFONT が必要となります。ffmpeg で -16 LUFS にラウドネスノーマライズし、最後に qc.py がビート単位で音量と無音区間(デッドエア)を検証します。
# build.sh: compose → render → master → check. Run from anywhere: sh score/build.sh … python3 qc.py ../assets/audio/score.wav timeline.json
2コア機能
3外部依存関係
| Kind | Dependency / Endpoint |
|---|---|
| cli | HyperFrames CLI(钉版 npx --yes [email protected];check/preview/render/snapshot) |
| cli | ffmpeg(配乐母带 loudnorm/afade + 渲染后抽帧核对) |
| package | p5 2.3.3(LGPL-2.1)/ p5.brush 2.2.3(MIT)/ @fontsource/permanent-marker 5.3.0(Apache-2.0),经 npm ci 按锁文件安装 |
| cli | 配乐渲染器:macOS 的 swift(系统 General MIDI 音色库)或其他平台的 fluidsynth + 用户自备 SOUNDFONT |
| network | 构建期声明无网络;唯一潜在外发是 snapshot 把帧送 Gemini(仅在 GEMINI_API_KEY 存在时),skill 要求一律带 --describe false 规避 |
| network | 本地隐私数据读取(非凭证):当前项目的 Claude Code / Codex 会话记录,以及用于填房间的 memory 与指令文件 |
4推奨統制措置と判定根拠
- scripts/: ローカルスクリプトまたはコマンドの実行: sh scripts/setup.sh(固定バージョンの依存関係を読み取り専用でダウンロードする初回 npm ci)
- 网络端点: 外部ネットワークアクセスの宣言: ビルド時の外部送信なし(SKILL.md 内の記載: Network at build time: none)
- 本地工作目录: ファイルの読み書きと成果物の出力: session-story-candidates.json(ユーザーの生の発言を含む harvest の出力成果物)
5二重目の独立検証
- [ok] 『No credentials』与『Network at build time: none』是否成立 — 目录内 process.env 命中只有 SOUNDFONT(build.sh 交给 fluidsynth 的音色库路径)与 GEMINI_API_KEY 的**提示文本**;无键值读取、无 fetch。engine/index.html 引用 assets/vendor/p5.min.js(本地),渲染链路不需联网。
- [discrepancy] harvest 的敏感 flag 能否替代人工审核 — 不能,文档自己说明了:FLAGS 是正则模式匹配(secret/email/path/url/number/name?/person?),sources.md 明写 'The flags miss what they can't see: a name typed in lowercase ("like peter said") has no flag.'。故能力清单不写成『自动脱敏』,隐私门本质是人读。
- [ok] 示例故事冒充是否真会被拦 — schedule.mjs 读取随包 assets/example/story.json,用 quotes() 归一化小写比对引用;命中 ≥2 条且未加 --example 时 exit 1 并提示写自己用户的故事。防糊弄逻辑真实存在。
- [ok] 配乐链是否真有三平台分支与母带门禁 — build.sh 依序判断:Darwin + 系统 gs_instruments.dls + swift → swift 渲染;否则 fluidsynth + SOUNDFONT → 渲染;都不满足则报错退出(并明说两者都不下载东西)。母带为 ffmpeg loudnorm=I=-16:TP=-1.5:LRA=14 + 首尾淡入淡出,最后 python3 qc.py 检响度与死气。
- [ok] 引擎代码来源是否交代 — assets/engine/NOTICE.md 写明 kit/core.js、kit/clawd.js、kit/timeline.js 改编自 ClaudeAnimationBase(commit b1d7e89,MIT),并随包分发 LICENSE-ClaudeAnimationBase;非自有代码有交代。
- [unlocatable] 『40 到 70 s 抓得住注意力』的时长论断 — 该区间是设计声明(schedule.mjs 仅对 >80s 打 warning),源码内无实测依据;本次只读侦查未运行 harvest 与渲染,故不作为已核事实使用。
6結論
0e83cbb985854ae8…