Chronicle · Ink(水墨卷軸)
你(正在閱讀此文件的 Agent)是整支影片攝製組。此 Skill 提供了一個階段性的 CLI、一個事實引擎、一個帶有精確節拍映射的代碼合成系列主題、一個程序化 SFX 工具包、一個水墨繪圖工具包和一個 HyperFrames 渲染器。你需要撰寫主張、包含一行說明的鏡頭列表、場景程式碼以及審查意見。不會調用任何圖像、語音、音樂、視覺或 LLM 模型;唯一的成本是你自己的 token。
硬性規則:僅限文字 LLM 與工具。 所有寫作、研究、事實查核、場景程式碼和審查工作,均由執行此 Skill 的文字 LLM 完成(例如透過 SandBase 執行的 MiniMax M3.1 flash,或任何其他 Agent 模型)。你可以調用工具:網路搜尋與抓取、SandBase 數據 API、下列命令、FFmpeg。你絕不能調用多模態生成模型:不得使用任何圖像、影片、TTS/語音、音樂或視覺模型,以及任何 AI 生成的圖畫或音頻檔案。每一幀畫面均由你撰寫的場景程式碼繪製,每一種聲音均由引擎合成。聯繫表(Contact sheets)需以數字和你自己渲染的幀來審查,而非透過視覺模型。使用了多模態模型的影片,就不是 chronicle-ink 影片。
選擇性例外:音樂與旁白。 僅當使用者明確要求時,主題可以由
music/目錄中由music/track.json描述的音樂檔案取代:可以是開放授權的錄音(公有領域、CC0、CC BY 3.0/4.0;絕不使用 NC、ND 或 SA),或是透過 SandBase 音樂模型生成的器樂曲(例如minimax/music/2.6,需設定is_instrumental: true,且僅能透過sandbaseCLI 或 API 操作)。圖片、說明文字、SFX 及其他所有規則維持不變;片尾卡則需標註該曲目來源,且不再說明音樂由程式碼生成。詳見references/music-track.md。同樣地,可以加入畫外音:每個說明對應一個來自 SandBase 語音模型的片段,準確朗讀該說明文字(voice/voice.json,詳見references/voice.md)。
風格套件
brief.style(或 new-project.mjs --style)選擇外觀;引擎、事實和檢查則保持一致。
| 風格 | 外觀 | 套件 | 用途 |
|---|---|---|---|
ink(預設) | 中式水墨卷軸,LXGW WenKai 字體,「Ink Theme」 | assets/style-pack.json | 人物、地標、動物 |
roman | 羊皮紙地圖集,Cinzel 字體,柔和的 D-dorian 主題 | assets/styles/roman/ | 城市、古典主題 |
model | 在黑暗工作室中的白色城市模型,歷史以光影投射,全球飛入鏡頭,照片卡片,「Atlas Theme」 | assets/styles/model/ | 城市生活故事:閱讀 style-model.md |
該方法遵循公開的「氛圍知識展示」配方:設定規格 → 在節拍上剪輯 → 為每個關鍵動作加上音效 → 逐段渲染並在繼續前修正每段。
規格(預設值)
| 長度 | seconds 120、150(預設)或 180;每 25–35 秒重新設置鉤子;4–6 / 5–7 / 6–8 個知識點 |
| 格式 | 16:9 1920×1080 每秒 30 幀(預設),可選 9:16 1080×1920 |
| 語言 | brief.lang = 任何 BCP-47 標籤(預設 en;zh-CN 為一級語言)。一個腳本服務多種語言 |
| 旁白 | 無語音:每個鏡頭一條簡短說明文字,說明圖片內容,綁定至已驗證的主張,關鍵字標記 |
| 音樂 | 風格的系列主題(ink:「Ink Theme」,D 宮五聲音階,古琴/簫類音色),始終為 88 BPM,包含段落:前奏 · 主歌 · 鋪墊 · 高潮 · 過渡 · 鋪墊2 · 高潮2 · 尾聲;可選 music/track.json(music-track.md) |
| 音量 | −14 LUFS 綜合響度,≤ −1.5 dBTP(兩遍 loudnorm) |
| 標籤 | 0–3 秒「AI-generated」徽章,片尾卡包含 AIGC 行,MP4 內含 AIGC 元數據 |
需要 Node 22+、FFmpeg/ffprobe 和 Chrome(HyperFrames 0.8.30 透過 npx 運行;渲染始終使用 CPU 路徑,以確保 canvas 輸出在任何地方都相同)。執行 node scripts/chronicle.mjs doctor。
城市影片(主題 city,結構 life)
針對「每個城市都有其生命故事」的使用案例:維基數據上的一個城市(座標 + 人口)鎖定為 city 並使用生命結構:誕生(河流、建城、名稱)→ 成長(建成區在地圖上擴展)→ 首次高度 → 傷痕(掠奪、火災、瘟疫、戰爭)→ 重生 → 今日(同一張地圖,過去與現在)→ 迴響(可選作者自己的句子「我與這座城市」)。閱讀 narrative-city.md。
地圖是真實地理,而非模型圖片:
- 在專案中撰寫
geo/places.json(中心點和以 Wikidata QID 標識的地點,歷史區域以近似半徑表示),然後執行node <skill>/scripts/geo.mjs --project <p>。它會從 Wikidata 讀取座標,並從 OpenStreetMap(無金鑰的公開讀取)讀取河流、水域、海岸線、鐵路和今日主要道路,輸出到geo/basemap.json。 - Ink 風格:將
assets/style/exemplars/city-map.js複製到scenes/目錄,並透過其參數(視角、區域、地點、道路、年份標記、傷痕)驅動每個地圖鏡頭。場景讀取數據為s.geo,並使用s.kit.cityMap()繪製;每一幀畫面都帶有「© OpenStreetMap contributors (ODbL)」。 - 歷史範圍為近似值:
cityMap始終將其標記為「AI 示意 / AI illustration」。年份標記和地圖標籤只能顯示存在於主張或一級來源中的日期和名稱。 - Model 風格:在
geo/places.json中加入一個chronology區塊(相機、時代、範圍、城牆、事件、地標),使用node <skill>/scripts/photos.mjs --project <p>獲取地標照片,並使用單一的city-3d場景(WebGL 中的真實建築和高度,單一連續相機路徑)。詳見 style-model.md 和逐步指南 city-film-recipe.md(說明羅馬、紐約和巴塞隆納範例的製作方法)。
此機器無法訪問的頁面(維基百科常被封鎖):使用你自己的工具獲取並將文字儲存為專案中的 sources/<n>-<name>.txt 檔案(第一行標註 source: <url>)。之後每次執行 all 時都會讀取該資料夾;檔案名稱保持來源 ID 穩定。
快速開始
node <skill>/scripts/new-project.mjs --out /abs/films/su-shi --topic "蘇軾" --film-lang en
node <skill>/scripts/chronicle.mjs all --project /abs/films/su-shi
all 會依序執行 研究 → 事實 → 腳本 → 時間線 → 音樂 → 場景 → 渲染 → 檢查 → 報告,並且在你需要撰寫任何內容時停止(狀態顯示為 status: awaiting_…)。閱讀專案中的 AGENT_TASK.md,撰寫它要求的檔案,然後再次執行 all。專案必須位於 Skill 資料夾之外。
劇組角色
| 角色 | 你的工作 | 命令 | 讀取 | 寫入 |
|---|---|---|---|---|
| 導演 | 負責簡報,運行片段循環,決定何時完成一個片段 | all, render --segment | brief.json,聯繫表(contact sheets) | work/review.json |
| 研究員 | 無限制地搜尋(你自己的搜尋工具);傳遞有用的頁面 | research --add-source <url> / --source-file <file> | Wikidata(QID 鎖定)、維基百科、一級網站 | work/research/ |
| 事實查核員 | 提取帶有逐字摘錄的原子化主張;為每個說明回答蘊含關係 | facts, script | 來源片段,entail.request.json | work/facts/claims.agent.json,work/script/entail.agent.json |
| 編劇 | 根據主題的段落撰寫鏡頭列表 | script | script.request.json(計劃、主張、規則) | script.json |
| 美術 | 使用水墨工具包編寫場景程式碼;自行審查幀畫面 | scenes | 時間線,references/style-pack.md,範例 | scenes/<name>.js |
| 作曲家 | 無需創作:主題已固定;你為每個動作選擇 SFX 層級 | music | brief.seconds | work/music/theme.wav,beatmap.json |
| 剪輯師 | 渲染片段和最終影片 | render | 場景、主題、SFX 提示 | out/segments/,out/film.mp4 |
| QA | 執行檢查,閱讀銜接表,修正或重新運行 | check, report | 影片、時間線、節拍映射、審查 | work/check.json,out/report.* |
| 地圖動畫師 | 撰寫 geo/places.json,執行地理命令,驅動 city-map 鏡頭 | node scripts/geo.mjs | Wikidata P625,OpenStreetMap | geo/basemap.json |
鏡頭列表欄位(script.json,schema chronicle-script/2)
bars(1–4 個完整小節,屬於一個段落,因此每次剪輯都在強拍上)· size(wide / medium / close / detail)· camera(hold, push-in, pull-out, pan-left, pan-right, rise, parallax)· transition(cut, ink-bleed, scroll-pan, seal-stamp)· scene + params· description· motion· sfx({ beat, kind, tier, dur_beats })· kind + claims (+ hedge)· caption.<lang>.text + em(關鍵字)· kp· rehook。完整形狀和規則:work/script/script.request.json 和 pipeline.md。
事實優先
research將主題鎖定到一個 Wikidata QID,直接從維基百科和一級網站(CBDB、Britannica、UNESCO、GBIF、博物館)進行無金鑰的公開讀取。你可以在任何地方搜尋,但一個事實只有在經過facts交叉比對後才能進入影片:至少 2 個獨立出版者同意,至少一個為一級來源 →verified;一個來源 →single-source(僅限有修飾語的說明,≤ 2 個,絕不能在開頭或高潮中使用);衝突 →disputed(「一種說法」)。八卦網站是線索,而非證據。- 如果此機器無法訪問某個網站,請使用你自己的抓取工具讀取,並將文字原樣儲存到一個檔案中,該檔案的第一行是
source: <url>;然後透過--source-file傳遞它。 - 每一條說明、卡片、標題和片尾卡行都綁定主張 ID;一行中的數字、日期和名稱必須在其主張中出現;引語需要一個已驗證的引語主張。然後,你必須僅從主張文字中誠實地回答蘊含關係。詳見 factcheck.md。
主題上的故事
計劃(work/script/plan.json)給出了主題的段落及其小節數(150 秒:前奏 4 · 主歌 12 · 鋪墊 4 · 高潮 8 · 過渡 8 · 鋪墊2 4 · 高潮2 8 · 尾聲 7;120/180 秒則重複或在小節邊界處修剪段落)、重新設置鉤子的小節以及知識點範圍。將故事安排到各個段落:在前奏中設置鉤子,在主歌中介紹起源,在鋪墊中轉折,在第一個高潮達到第一個高點,在過渡中展現代價,在鋪墊2中製造懸念,在高潮2中展現決定性時刻,在尾聲中留下迴響。不同的主題有不同的節奏:narrative-person.md、narrative-landmark.md、narrative-animal.md。
說明文字:CJK 每行 ≤ 16 個字元,其他文字每行 ≤ 9 個詞 / 42 個字元,≤ 2 行,不得在數字或日期中間斷開,從右到左(RTL)佈局。說明文字必須在其鏡頭中可讀(CJK 7 字元/秒,其他文字 3.3 詞/秒)。字符檢查失敗時會顯示 glyph_missing,而非渲染出豆腐塊(tofu)。
場景(#1 品質風險)
按場景名稱撰寫 scenes/<name>.js:scene('<name>', function (g, s) { … }),在時間 s.t 繪製完整幀,使用 Canvas 2D 和 s.kit(紙張、筆觸、水墨暈染、墨跡滲出、山脈、水、船、亭、卷軸、竹子、月亮、硯台、毛筆、印章、梅花、雁、長袍剪影、文字揭示、地圖路線、時間線、計數器、2.5D layer() 視差、構圖 frame())。從 assets/style/exemplars/ 開始。規則(由靜態掃描和執行時強制執行):對 s.t 具有確定性(s.kit.rng(seed),絕不使用 Math.random/Date/計時器),無網路請求,無 DOM 或儲存。將每個關鍵動作與其提示對齊時間(s.cue('seal', 0)),以便 SFX 準確落在動作發生的那一幀。絕不繪製寫實的臉孔。執行/禁止列表:style-pack.md。
導演的循環(逐段進行)
node <skill>/scripts/chronicle.mjs scenes --project <p> # 掃描 + 專案建立
node <skill>/scripts/chronicle.mjs render --project <p> --segment s1 # 先渲染開頭約 11 秒
# 檢視 out/segments/s1/sheet.jpg 和 keyframes/*.jpg,對照執行/禁止列表,修正,重複
node <skill>/scripts/chronicle.mjs render --project <p> --segment s2 # 然後 s3, s4, s5
node <skill>/scripts/chronicle.mjs all --project <p> # 最終確定性完整渲染 + 檢查 + 報告
片段:s1 前奏 · s2 主歌 · s3 鋪墊 + 高潮 · s4 過渡 + 鋪墊2 · s5 高潮2 + 尾聲(或 --segment <start>-<end>)。每個片段最多 3 輪審查;將每輪記錄在 work/review.json 中:
{ "schema": "chronicle-review/1", "segments": [{ "id": "s1", "rounds": [{ "sheet": "out/segments/s1/sheet.jpg",
"findings": ["標題與月亮重疊"], "fixes": ["將月亮向右移動"], "open_blocking": [] }] }] }
如果某個片段沒有審查輪次或仍存在阻塞性發現,check 會報告 visual_review 失敗。對於無人值守運行,all 會直接渲染整部影片;審查要求仍會顯示在報告中。
輸出
out/film.mp4、out/captions.vtt、out/sheet.jpg、out/joins.jpg、out/report.json、out/report.en.html、out/report.zh-CN.html(無論影片語言為何,均為雙語)。check 會測量 LUFS 和真實峰值,確保剪輯和段落落在強拍上,並確保每個 SFX 的起始點與其動作相差不超過一幀;它無法判斷混音聽起來是否良好——這表示仍需由人來聆聽。
限制
- 沒有在世人物的肖像;地圖不得顯示國家或省級邊界;GB 45438 標準的 AIGC 欄位在根據標準文字檢查之前,保持
verified: false(compliance.md)。 - 三個風格套件,每個一個主題(或一個可選的音樂曲目)。年份卡片:省略
count(從 0 開始遞增的年份看起來像錯誤的日期)。 - 城市地圖不顯示國家或省級邊界;OpenStreetMap 圖層被裁剪到城市範圍。
- 事實詞彙表(數字、日期、修飾語)存在於英文和中文;其他語言的說明文字使用英文規則。
- 參考資料:pipeline.md、music.md、sources-allowlist.md、third-party-notices.md。