1仕組みと動作原理
成果物の定義が最優先:納品するものは MP4 ではなく「動作するデック」であり、デックを hyperframes render に渡すことは明確に禁止されています。デックは複数のトップレベル scene から合成されており master root が存在しないため、render は最初の合成のみを解析し、無音のまま極めて短い動画に切り捨ててしまいます。
**Do not `hyperframes render` a slideshow into a single MP4.**
実装メカニズムは「通常の合成 + 宣言的 JSON アイランド」:合成自体は引き続き HF の scenes/clips/GSAP であり、追加される要素は application/hyperframes-slideshow+json です。プレイヤーの SlideshowController がこれを読み込み、連続したタイムラインを離散的にナビゲーション可能なデックへと変換します。
A HyperFrames slideshow is a normal HyperFrames composition — scenes, clips, GSAP timelines — with one extra ingredient: a **JSON island**
アイランドは実在するブロックである必要があり、配置は自由ですが body の前方にある必要があります:present は合成 HTML を静的に解析するため、マニフェストを他の script タグの後ろに隠してランタイムコードで生成した場合、present は読み取ることができません。
The `present` command reads the composition HTML statically and expects the real `application/hyperframes-slideshow+json` island to already be present.
フラグメント(fragments)は**絶対合成時間**における公開の一時停止ポイントであり、ナビゲーションは再生ではなく確定的なシークによって行われます:フラグメントを含むページに入ると即座に fragments[0] までシークして停止し、Next で順次次の停止ポイントまでシークします。
Navigation is seek-driven, not play-driven.
分岐は実在するシーンですが、メインラインには記載されません:ホットスポットをクリックすると {sequenceId, slideIndex:0} がスタックにプッシュされて分岐のトップページに入り、back でスタックからポップして親ページに戻り、backToMain でスタックをクリアします。パンくずリストとカウンターはシーケンスのスコープに従ってレンダリングされます。
Clicking a hotspot pushes `{sequenceId, slideIndex: 0}` onto the nav stack and enters the branch's first slide.
執筆規律は提案ではなく厳格な制約です(完全な文のタイトル、1ページ1アイデア、最も強烈なポイントを最初に提示、市場規模の算出はボトムアップ必須、フォントサイズの下限、作業前にライブカタログを検索して既存の構成要素を探す)。これには理由も示されており、違反したページはレビュー時に直接差し替えられます。
**Headline is a complete-sentence claim, not a label.**
既存ページを移植する際は、メカニズム層に至るまでの忠実性が求められます:ネイティブの media 要素を唯一の真実のソースとし、メディアイベントと media.currentTime から視覚状態を導出し、フォントトークンは具体的なフォントスタックへと解決し、スクリーンショット系コンテンツは cover ではなく元の比率で contain する必要があります。
Treat native `<video>` / `<audio>` elements as the source of truth for any custom media chrome, canvas visualizer, waveform, beat grid, or playhead.
プレゼンターモードは共有コンポーネントが管理します:Present ボタン/P キー、新しい audience タブのオープン、2つのタブ間を BroadcastChannel で同期。ノートは発表者ビュー内で編集され、localStorage に保存されます(合成ファイルを変更することなくマニフェストを上書きします)。
**Presenter mode:** use the built-in Present icon button in the slideshow nav capsule, or press P.
メディアのクリーンアップとミュートはコントローラーの責務であり、クロスレルムの考慮点があります:ページやシーケンスの切り替え時にはコントローラーが stopMedia を呼び出します。同一ページ内のフラグメントナビゲーションではメディアをクリアしません。iframe 内のメディアの判定には親ページの instanceof を使用できません(実際のブラウザでは false を返します)。
The slideshow controller owns slide-exit media cleanup.
スタンドアロンハーネス(standalone harness)は暫定対応であり正規の手段ではありません:エンジン管理パス(preview --slideshow / studio present mode)が実装されるまでは、素のプレイヤーで開くデモには3つの回避策が必要です(シーク可能な root タイムラインの公開、アイランドの wrapper へのコピー、wrapper による音声の自己保持)。
These patterns are a **temporary workaround** for standalone demos.
2コア機能
3外部依存関係
| Kind | Dependency / Endpoint |
|---|---|
| cli | 官方 hyperframes CLI:present(起 deck 服务与讲者/观众同步)、lint、check、preview、snapshot(逐页静帧) |
| package | 播放器构建产物(本仓 packages/player/dist 的 hyperframes-player / hyperframes-slideshow 全局包;改播放器行为后需在 packages/player 跑 bun run build) |
| network | CDN 资源(harness 示例):Three.js 模块从 jsdelivr 导入,供独立 demo 的 3D 背景层使用(产物期由浏览器拉取,按范式不判级) |
| package | 浏览器平台 API(非外部服务):BroadcastChannel 讲者/观众同步、localStorage 备注持久化、postMessage 与 iframe 播放器通信、WebAudio/Audio 自持音效 |
| package | 兄弟 skill 关联:deck 内容来自 Figma 时必须先跑 /figma(资产导出/品牌令牌/分镜重建),基础合成契约在 /hyperframes-core,词级字幕规则在 /embedded-captions |
| cli | 官方 registry 搜索/安装(写页面前先 catalog 查现成视觉积木,需要时 add 进 deck) |
4推奨統制措置と判定根拠
- scripts/: ローカルスクリプトまたはコマンドの実行: 本スキルディレクトリ内には**独自のスクリプトは含まれていません**(SKILL.md + references/standalone-harness.md の2ファイルのみ);ha
- 网络端点: 外部ネットワークアクセスの宣言: 成果物の実行時(規約上は評価対象外、記録のみ):ハーネスの Three.js サンプルが cdn.jsdelivr.net から [email protected] をインポートし、ブラウザによって取得
- 本地工作目录: ファイルの読み書きと成果物の出力: プロジェクトファイル(エージェントが作成):合成 HTML(アイランドとシーン div を含む)、wrapper/index.html、composition/
5二重目の独立検証
- [ok] 网络面是否真如声明(蓝档判定的关键反例检查) — 全目录仅 1 处 http(s) 命中:standalone-harness.md 第 895 行的 [email protected] jsdelivr 导入(示例代码块内);无 fetch(、无 process.env、无 child_process、无凭证关键词。SKILL.md 侧只有本地命令(present/lint/check/preview/snapshot)与浏览器 API(BroadcastChannel/localStorage/postMessage),均为本地或浏览器内行为。
- [ok] 「禁止 render」的声明是否与机理自洽(不是随口警告) — SKILL.md 给出原因:deck 由多个顶层 scene 合成(每页一个 data-composition-id)且**没有 master-root 合成**,所以 render 只解析第一个合成,产出静默截断的 MP4(举例 6s/40s);并说明线性导出(仅主线、排除分支)目前是 deferred,故支持输出为 present 活 deck 与逐页 snapshot。声明与结构描述一致。
- [ok] island 的「静态可读」要求与 present 行为是否一致 — 文档明确 present 静态解析合成 HTML、期望真实的 application/hyperframes-slideshow+json 已存在,并禁止用另一个 application/json 块 + 运行时代码生成 island。这与「JSON 岛是唯一真源、sceneId 必须匹配 data-composition-id」的 lint 契约自洽。
- [ok] harness 内容是否被当成正统做法(避免误判为「本 skill 主张两套实现」) — harness 开头即写 interim framing(临时绕行)与「When that path ships, most of what follows collapses」,SKILL.md 亦写「Do not treat the patterns there as the blessed model」。两处口径一致,属过渡文档而非第二套正统。
- [ok] 是否存在夸大(把引擎/播放器能力算作本 skill 能力) — 文档反复把导航、presenter mode、媒体清理、静音归给共享播放器组件(<hyperframes-slideshow> / SlideshowController / hyperframes-player.stopMedia),本 skill 只声明 island 数据契约与写作/移植纪律,未见据他人之功。
6結論
034ea590dd179243…