Chronicle · Ink (Rolo de Tinta)
Você (o Agente que está lendo isto) é toda a equipe de produção. A Skill fornece uma CLI em etapas, um motor de fatos, um tema de série sintetizado por código com um mapa de batidas exato, um kit de SFX procedural, um kit de desenho a tinta e um renderizador HyperFrames. Você escreve as afirmações, a lista de cenas com legendas de uma linha, o código da cena e as revisões. Nada chama um modelo de imagem, voz, música, visão ou LLM; o único custo são seus próprios tokens.
Regra rígida: apenas LLM de texto e ferramentas. Toda a escrita, pesquisa, verificação de fatos, código de cena e revisão são feitos pelo LLM de texto que executa esta Skill (por exemplo, MiniMax M3.1 flash via SandBase, ou qualquer outro modelo de Agente). Você pode chamar ferramentas: pesquisa e busca na web, APIs de dados do SandBase, os comandos abaixo, FFmpeg. Você nunca deve chamar um modelo de geração multimodal: nenhum modelo de imagem, vídeo, TTS/voz, música ou visão, e nenhum arquivo de imagem ou áudio gerado por IA. Cada quadro é desenhado pelo código de cena que você escreve, cada som é sintetizado pelo motor. As folhas de contato são revisadas como números e quadros que você mesmo renderiza, não por um modelo de visão. Um filme que usou um modelo multimodal não é um filme chronicle-ink.
Exceções opcionais: música e narração. Somente quando o usuário solicitar explicitamente, o tema pode ser substituído por um arquivo de áudio em
music/descrito pormusic/track.json: uma gravação com licença aberta (domínio público, CC0, CC BY 3.0/4.0; nunca NC, ND ou SA) ou um instrumental gerado por um modelo de música do SandBase (por exemplo,minimax/music/2.6comis_instrumental: true, apenas via CLI ou APIsandbase). As imagens, legendas, SFX e todas as outras regras permanecem como acima; o cartão final então credita a faixa e não diz mais que a música foi feita por código. Consultereferences/music-track.md. Da mesma forma, uma narração pode ser adicionada: um clipe por legenda de um modelo de fala do SandBase, dizendo exatamente a legenda (voice/voice.json, vejareferences/voice.md).
Pacotes de estilo
brief.style (ou new-project.mjs --style) escolhe o visual; o motor, os fatos e as verificações são os mesmos.
| Estilo | Aparência | Pacote | Usar para |
|---|---|---|---|
ink (padrão) | Rolo de tinta chinês, LXGW WenKai, "Tema Tinta" | assets/style-pack.json | pessoas, pontos turísticos, animais |
roman | Atlas de pergaminho, Cinzel, tema D-dórico suave | assets/styles/roman/ | cidades, temas clássicos |
model | Modelo de cidade branca em um estúdio escuro, história projetada como luz, voo do globo, cartões de foto, "Tema Atlas" | assets/styles/model/ | histórias de vida da cidade: leia style-model.md |
O método é a receita pública "Vibe knowledge showcase": definir a especificação → cortar na batida → colocar um som em cada ação-chave → renderizar segmento por segmento e corrigir cada um antes de prosseguir.
Especificação (padrões)
| Duração | seconds 120, 150 (padrão) ou 180; reconectar a cada 25–35 s; 4–6 / 5–7 / 6–8 pontos de conhecimento |
| Formato | 16:9 1920×1080 a 30 fps (padrão), 9:16 1080×1920 opcional |
| Idioma | brief.lang = qualquer tag BCP-47 (padrão en; zh-CN primeira classe). Um roteiro atende a muitos idiomas |
| Narração | sem voz: uma legenda curta por cena mostrando o que a imagem mostra, vinculada a afirmações verificadas, palavras-chave destacadas |
| Música | tema da série do estilo (tinta: "Tema Tinta", D gong pentatônico, vozes tipo guqin/xiao), sempre 88 BPM com seções intro · verso · construção · drop · ponte · construção2 · drop2 · outro; opcional music/track.json (music-track.md) |
| Loudness | −14 LUFS integrado, ≤ −1.5 dBTP (normalização de dois passos) |
| Rótulos | Badge "Gerado por IA" 0–3 s, cartão final com a linha AIGC, metadados AIGC no MP4 |
Requer Node 22+, FFmpeg/ffprobe e Chrome (HyperFrames 0.8.30 roda via npx; a renderização sempre usa o caminho da CPU para que a saída do canvas seja idêntica em todos os lugares). Execute node scripts/chronicle.mjs doctor.
Filmes de cidade (assunto city, estrutura life)
Para o caso de uso "toda cidade tem uma história de vida": uma cidade no Wikidata (coordenadas + população) é fixada como city e usa a estrutura de vida: nascimento (rio, fundação, nome) → crescimento (a área construída se espalha no mapa) → primeira altura → cicatrizes (saque, incêndio, peste, guerra) → renascimento → hoje (mesmo mapa, então e agora) → eco (opcionalmente a linha do próprio autor "eu e esta cidade"). Leia narrative-city.md.
O mapa é geografia real, não uma imagem de modelo:
- Escreva
geo/places.jsonno projeto (centro e lugares por QID do Wikidata, áreas históricas como raios aproximados) e executenode <skill>/scripts/geo.mjs --project <p>. Ele lê coordenadas do Wikidata e rios, água, costa, ferrovias e estradas principais atuais do OpenStreetMap (leituras públicas sem chave) emgeo/basemap.json. - Estilo tinta: copie
assets/style/exemplars/city-map.jsparascenes/e controle cada cena de mapa através de seus parâmetros (visão, áreas, lugares, estradas, carimbo do ano, cicatriz). As cenas leem os dados comos.geoe os desenham coms.kit.cityMap(); cada quadro então carrega "© Contribuidores do OpenStreetMap (ODbL)". - As extensões históricas são aproximações:
cityMapsempre as marca como "AI 示意 / AI illustration". Os carimbos de ano e rótulos do mapa podem mostrar apenas datas e nomes que estão em afirmações ou em uma fonte de nível 1. - Estilo modelo: adicione um bloco
chronology(câmera, eras, extensões, muralhas, eventos, pontos turísticos) ageo/places.json, busque fotografias de pontos turísticos comnode <skill>/scripts/photos.mjs --project <p>e use a cena únicacity-3d(prédios reais e alturas em WebGL, um caminho de câmera contínuo). Veja style-model.md e o passo a passo city-film-recipe.md (como as amostras de Roma, Nova York e Barcelona foram feitas).
Páginas que esta máquina não pode alcançar (a Wikipedia é frequentemente bloqueada): busque-as com sua própria ferramenta e salve o texto como sources/<n>-<name>.txt no projeto (source: <url> na primeira linha). Todo all posterior lê essa pasta; os nomes dos arquivos mantêm os ids da fonte estáveis.
Início rápido
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 executa pesquisa → fatos → roteiro → linha do tempo → música → cenas → renderizar → verificar → relatório e para sempre que você precisar escrever algo (status: awaiting_…). Leia AGENT_TASK.md no projeto, escreva o arquivo que ele pedir, execute all novamente. Os projetos devem ficar fora da pasta da Skill.
Funções da equipe
| Função | O que você faz | Comando | Lê | Escreve |
|---|---|---|---|---|
| Diretor | É dono do briefing, executa o loop de segmentos, decide quando um segmento está pronto | all, render --segment | brief.json, folhas de contato | work/review.json |
| Pesquisador | Pesquisa sem limites (suas próprias ferramentas de busca); passa as páginas úteis | research --add-source <url> / --source-file <file> | Wikidata (bloqueio QID), Wikipedia, sites nível 1 | work/research/ |
| Verificador de fatos | Extrai afirmações atômicas com trechos literais; responde à implicação para cada legenda | facts, script | chunks de fonte, entail.request.json | work/facts/claims.agent.json, work/script/entail.agent.json |
| Roteirista | Escreve a lista de cenas nas seções do tema | script | script.request.json (plano, afirmações, regras) | script.json |
| Arte | Escreve o código da cena com o kit de tinta; auto-revisa quadros | scenes | linha do tempo, references/style-pack.md, exemplares | scenes/<name>.js |
| Compositor | Nada a compor: o tema é fixo; você escolhe níveis de SFX por ação | music | brief.seconds | work/music/theme.wav, beatmap.json |
| Editor | Renderiza segmentos e o filme final | render | cenas, tema, dicas de SFX | out/segments/, out/film.mp4 |
| QA | Executa as verificações, lê a folha de junções, corrige ou executa novamente | check, report | filme, linha do tempo, mapa de batidas, revisão | work/check.json, out/report.* |
| Animador de mapa | Escreve geo/places.json, executa o comando geo, controla as cenas city-map | node scripts/geo.mjs | Wikidata P625, OpenStreetMap | geo/basemap.json |
Campos da lista de cenas (script.json, esquema chronicle-script/2)
bars (1–4 compassos inteiros de uma seção, para que cada corte seja em tempo forte) · size (aberto / médio / close / detalhe) · camera (segurar, aproximar, afastar, panorâmica esquerda, panorâmica direita, subir, paralaxe) · transition (corte, sangramento de tinta, rolagem de rolo, carimbo de selo) · scene + params · description · motion · sfx ({ beat, kind, tier, dur_beats }) · kind + claims (+ hedge) · caption.<lang>.text + em (palavras-chave) · kp · rehook. Forma completa e regras: work/script/script.request.json e pipeline.md.
Fatos primeiro
researchfixa o tópico a um QID do Wikidata, lê Wikipedia e sites de nível 1 (CBDB, Britannica, UNESCO, GBIF, museus) diretamente com leituras públicas sem chave. Pesquise onde quiser, mas um fato só entra no filme depois quefactso verifica de forma cruzada: pelo menos 2 editoras independentes concordando, pelo menos uma de nível 1 →verified; uma fonte →single-source(apenas legendas moderadas, ≤ 2, nunca na introdução ou drops); conflitos →disputed("um relato"). Sites de fofoca são pistas, nunca evidência.- Se esta máquina não puder alcançar um site, leia-o com sua própria ferramenta de busca e salve o texto literalmente em um arquivo cuja primeira linha seja
source: <url>; passe-o com--source-file. - Cada legenda, cartão, título e linha do cartão final vincula ids de afirmação; números, datas e nomes em uma linha devem estar em suas afirmações; citações precisam de uma afirmação de citação verificada. Em seguida, você responde à implicação honestamente apenas a partir dos textos das afirmações. Veja factcheck.md.
História no tema
O plano (work/script/plan.json) dá as seções do tema em compassos (150 s: intro 4 · verso 12 · construção 4 · drop 8 · ponte 8 · construção2 4 · drop2 8 · outro 7; 120/180 s repetem ou cortam seções nos limites dos compassos), os compassos de reconexão e a faixa de pontos de conhecimento. Organize a história nas seções: gancho na introdução, origens no verso, a virada na construção, o primeiro ponto alto no drop, o custo na ponte, suspense na construção2, o momento definidor no drop2, um eco no outro. Assuntos diferentes têm ritmos diferentes: narrative-person.md, narrative-landmark.md, narrative-animal.md.
Legendas: CJK ≤ 16 caracteres por linha, outros scripts ≤ 9 palavras / 42 caracteres por linha, ≤ 2 linhas, nunca quebradas dentro de um número ou data, RTL dispostas da direita para a esquerda. Uma legenda deve ser legível em sua cena (CJK 7 caracteres/s, outros 3,3 palavras/s). A verificação de glifos falha com glyph_missing em vez de renderizar tofu.
Cenas (o risco #1 de qualidade)
Escreva scenes/<name>.js por nome da cena: scene('<name>', function (g, s) { … }), desenhando um quadro completo para o tempo s.t com Canvas 2D e s.kit (papel, pinceladas, aguadas, sangramento de tinta, montanhas, água, barco, pavilhão, rolo, bambu, lua, tinteiro, pincel, selo, ameixeira, gansos, silhueta com manto, revelação de texto, rota de mapa, linha do tempo, contagem, paralaxe 2.5D layer(), composição frame()). Comece a partir de assets/style/exemplars/. Regras, aplicadas por uma verificação estática e em tempo de execução: determinístico em s.t (s.kit.rng(seed), nunca Math.random/Date/timers), sem rede, sem DOM ou armazenamento. Cronometre cada ação-chave em sua dica (s.cue('seal', 0)), para que o SFX caia no quadro onde ela acontece. Nunca desenhe um rosto realista. Lista de fazer/não fazer: style-pack.md.
Loop do diretor (segmento por segmento)
node <skill>/scripts/chronicle.mjs scenes --project <p> # escaneamento + projeto
node <skill>/scripts/chronicle.mjs render --project <p> --segment s1 # abertura ~11 s primeiro
# veja out/segments/s1/sheet.jpg e keyframes/*.jpg em relação à lista de fazer/não fazer, corrija, repita
node <skill>/scripts/chronicle.mjs render --project <p> --segment s2 # depois s3, s4, s5
node <skill>/scripts/chronicle.mjs all --project <p> # renderização final completa + verificação + relatório
Segmentos: s1 intro · s2 verso · s3 construção + drop · s4 ponte + construção2 · s5 drop2 + outro (ou --segment <início>-<fim>). No máximo 3 rodadas de revisão por segmento; registre cada rodada em work/review.json:
{ "schema": "chronicle-review/1", "segments": [{ "id": "s1", "rounds": [{ "sheet": "out/segments/s1/sheet.jpg",
"findings": ["título sobrepõe a lua"], "fixes": ["lua movida para a direita"], "open_blocking": [] }] }] }
check falha em visual_review quando um segmento não tem rodada ou ainda tem descobertas bloqueadoras. Para execuções não supervisionadas, all renderiza o filme inteiro diretamente; o requisito de revisão ainda aparece no relatório.
Saída
out/film.mp4, out/captions.vtt, out/sheet.jpg, out/joins.jpg, out/report.json, out/report.en.html, out/report.zh-CN.html (bilíngue, independentemente do idioma do filme). check mede LUFS e pico verdadeiro, cortes e seções em tempos fortes, e cada início de SFX dentro de um quadro de sua ação; ele não pode julgar se a mixagem soa bem — diga que uma pessoa ainda precisa ouvir.
Limites
- Sem retratos de pessoas vivas; mapas nunca mostram fronteiras nacionais ou provinciais; o campo AIGC do GB 45438 permanece
verified: falseaté ser verificado em relação ao texto padrão (compliance.md). - Três pacotes de estilo, um tema cada (ou uma faixa opcional). Cartões de ano: omita
count(um ano que conta a partir de 0 parece uma data errada). - Mapas de cidade não mostram fronteiras nacionais ou provinciais; as camadas do OpenStreetMap são recortadas na cidade.
- Léxicos de fatos (números, datas, moderadores) existem para inglês e chinês; outros idiomas de legenda usam as regras do inglês.
- Referência: pipeline.md, music.md, sources-allowlist.md, third-party-notices.md.