toufiqfarhan0/chronicle-ink

Transforme um tópico em um filme de conhecimento verificado de 2 a 3 minutos, cujas imagens são desenhadas pelo código que você escreve. Para a história de vida de qualquer cidade, o estilo `model` voa do globo para a cidade real em 3D (cada prédio do OpenStreetMap em sua altura) e reproduz sua história como luz, era por era, com efeitos sincronizados com a narração (rios, muralhas, incêndios, conexões, reconstrução). Os pacotes de estilo tinta e atlas romano servem pessoas, pontos turísticos e animais. Apenas um LLM de texto (você, o Agente) e ferramentas são usados; os fatos são verificados de forma cruzada entre editores; narração e trilha sonora via SandBase são opcionais.

O que é chronicle-ink?

Chronicle·Ink (Ink Scroll) é uma habilidade para agentes de IA que transforma tópicos em filmes curtos de conhecimento visual, onde cada quadro é gerado por código, sem depender de modelos de geração multimodal. O agente assume múltiplos papéis (diretor, pesquisador, verificador de fatos, roteirista, artista, editor) e segue um pipeline rigoroso: pesquisa, verificação cruzada de fatos (exigindo ao menos duas fontes independentes), roteiro baseado em batidas musicais, desenho de cenas com kits de desenho à tinta, síntese de efeitos sonoros e renderização final. A habilidade suporta três estilos visuais (`ink`, `roman`, `model`) e é ideal para criar documentários curtos sobre cidades, pessoas, marcos e animais. Ferramentas como Node.js, FFmpeg e HyperFrames são usadas, e narração e música opcionais podem ser adicionadas via SandBase. O foco está em filmes factuais, verificados e gerados exclusivamente por LLM de texto e código.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/toufiqfarhan0/ai-city-remix-workflows/tree/main/chronicle-ink/chronicle-ink

Installed? Explore more Programação e Desenvolvimento skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

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 por music/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.6 com is_instrumental: true, apenas via CLI ou API sandbase). 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. Consulte references/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, veja references/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.

EstiloAparênciaPacoteUsar para
ink (padrão)Rolo de tinta chinês, LXGW WenKai, "Tema Tinta"assets/style-pack.jsonpessoas, pontos turísticos, animais
romanAtlas de pergaminho, Cinzel, tema D-dórico suaveassets/styles/roman/cidades, temas clássicos
modelModelo 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çãoseconds 120, 150 (padrão) ou 180; reconectar a cada 25–35 s; 4–6 / 5–7 / 6–8 pontos de conhecimento
Formato16:9 1920×1080 a 30 fps (padrão), 9:16 1080×1920 opcional
Idiomabrief.lang = qualquer tag BCP-47 (padrão en; zh-CN primeira classe). Um roteiro atende a muitos idiomas
Narraçãosem voz: uma legenda curta por cena mostrando o que a imagem mostra, vinculada a afirmações verificadas, palavras-chave destacadas
Músicatema 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ótulosBadge "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:

  1. Escreva geo/places.json no projeto (centro e lugares por QID do Wikidata, áreas históricas como raios aproximados) e execute node <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) em geo/basemap.json.
  2. Estilo tinta: copie assets/style/exemplars/city-map.js para scenes/ 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 como s.geo e os desenham com s.kit.cityMap(); cada quadro então carrega "© Contribuidores do OpenStreetMap (ODbL)".
  3. As extensões históricas são aproximações: cityMap sempre 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.
  4. Estilo modelo: adicione um bloco chronology (câmera, eras, extensões, muralhas, eventos, pontos turísticos) a geo/places.json, busque fotografias de pontos turísticos com node <skill>/scripts/photos.mjs --project <p> e use a cena única city-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çãoO que você fazComandoLêEscreve
DiretorÉ dono do briefing, executa o loop de segmentos, decide quando um segmento está prontoall, render --segmentbrief.json, folhas de contatowork/review.json
PesquisadorPesquisa sem limites (suas próprias ferramentas de busca); passa as páginas úteisresearch --add-source <url> / --source-file <file>Wikidata (bloqueio QID), Wikipedia, sites nível 1work/research/
Verificador de fatosExtrai afirmações atômicas com trechos literais; responde à implicação para cada legendafacts, scriptchunks de fonte, entail.request.jsonwork/facts/claims.agent.json, work/script/entail.agent.json
RoteiristaEscreve a lista de cenas nas seções do temascriptscript.request.json (plano, afirmações, regras)script.json
ArteEscreve o código da cena com o kit de tinta; auto-revisa quadrossceneslinha do tempo, references/style-pack.md, exemplaresscenes/<name>.js
CompositorNada a compor: o tema é fixo; você escolhe níveis de SFX por açãomusicbrief.secondswork/music/theme.wav, beatmap.json
EditorRenderiza segmentos e o filme finalrendercenas, tema, dicas de SFXout/segments/, out/film.mp4
QAExecuta as verificações, lê a folha de junções, corrige ou executa novamentecheck, reportfilme, linha do tempo, mapa de batidas, revisãowork/check.json, out/report.*
Animador de mapaEscreve geo/places.json, executa o comando geo, controla as cenas city-mapnode scripts/geo.mjsWikidata P625, OpenStreetMapgeo/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

  1. research fixa 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 que facts o 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.
  2. 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.
  3. 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: false até 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.

Habilidades Relacionadas