Curated Formatv0.2.1-proof

Squilliam News

Turn one real event, launch, or promotion into a thirty-second character-led breaking-news bulletin people want to watch.

By Shaz · Updated August 2026

Character options

Choose your anchor.

Squilliam and three more verified 3D presenters are ready to make your story sound completely different.

Drag a model to inspect it, or tap play to audition its voice. Models return to attention after three seconds.

Drag to rotate

Verified 3D anchor

Squilliam Fancyson

Polished, theatrical, and completely certain this is the biggest story of the century.

Tap to hear the voice

See you there, Squiddy. Do leave the clarinet at home.

Drag to rotate

Verified 3D anchor

Squidward Tentacles

Dry, skeptical, and reluctantly professional.

Tap to hear the voice

Finally, a news desk with standards. Send me your story before SpongeBob calls it breaking news.

Drag to rotate

Verified 3D anchor

SpongeBob SquarePants

Bright, breathless, and thrilled by absolutely everything.

Tap to hear the voice

Breaking news! Your big idea just got promoted to the front page!

Drag to rotate

Verified 3D anchor

Mr. Krabs

Booming, shameless, and always watching the bottom line.

Tap to hear the voice

Breaking news! Your promotion is about to make a splash and maybe a few dollars!

Before you start

Services & costs

Fish Audio

s2.1-pro-free

production narration when a run has no approved audio.wav

FISH_STUDIO_APIKEYSQUILLIAM_VOICE_ID

Social Publisher (Buffer MCP or API)

Simultaneous multi-platform publishing to YouTube Shorts, Instagram Reels, TikTok, and X.

BUFFER_API_KEY

Local runtime

Setup, validation & inspection

node · npm · python3 · ffmpeg · ffprobe · Google Chrome

Typical run estimate

$0 provider cost in the current Fish fair-use window, usually 10-25 min

Estimates describe the saved recipe, not a price guarantee. Confirm current provider pricing and approve any spend before generation. Your coding agent may have its own fees or usage limits. Never paste API keys into chat.

Examples

Examples & references.

1 saved examples for this recipe—not 1 separate Repos. Each example keeps its original version and provenance.

Example 01 · We The Artists

Squilliam declares an artistic emergency

Open finished ad

From input to output

How the run works.

From the published SKILL.md. The agent follows the packaged runtime and its approval gates.

  1. Step 01

    Step 1

    Read README.md, requirements.json, input-contract.json, output-contract.json, composition-contract.json, quality.json, assets.json, assets/character-packs.json, assets/voice-presets.json, and prompts/script.md.

  2. Step 02

    Step 2

    Run npm install, then npm run smoke, then npm run check.

  3. Step 03

    Step 3

    Run node runner.mjs init --run=<run-id> --from=we-the-artists or --from=smoke.

  4. Step 04

    Step 4

    Change only the new run's content.json, assets/story/*, asset-sources.json, and optional approved audio/source.wav.

  5. Step 05

    Step 5

    Read the script aloud and inspect every story image at phone size.

  6. Step 06

    Step 6

    Run node runner.mjs validate --run=<run-id> before any provider call.

  7. Step 07

    Step 7

    If narration is missing, report the Fish model and current cost, then ask once when the call may charge or consume a limited quota.

  8. Step 08

    Step 8

    Run node runner.mjs render --run=<run-id> --approve-provider only after approval. Omit the flag when approved narration already exists.

  9. Step 09

    Step 9

    Run node runner.mjs inspect --run=<run-id>, then use the host environment's media viewer to show the emitted contact-sheet and playable-video paths. If the GUI viewer is unavailable, use packaged Playwright with installed Chrome to play the actual MP4; do not create a preview renderer.

  10. Step 10

    Step 10

    Ask the user to confirm factual accuracy, voice identity, pronunciation, body language, lip sync, joke, and CTA.

  11. Step 11

    Step 11

    Run node runner.mjs finalize --run=<run-id> --human-review=pass only after approval.

  12. Step 12

    Step 12

    Return the final playable MP4.

  13. Step 13

    Step 13

    Multi-Platform Social Distribution (Optional):

Proof & quality

What a good result looks like.

The examples above are saved reference outputs. They are not evidence that a new input has passed the quality checks.

Quality gates

These are the acceptance criteria in quality.json—not a claim that every pictured example passed the current version. Inspect each new output before finalizing.

Automatic · 9 checks
  • Width: 1280
  • Height: 720
  • Fps: 30
  • Duration Seconds: 30
  • Frame Count: 900
  • Audio Streams: 1
  • Max Interior Silence Seconds: 0.6
  • Final Hold Seconds: {"min":0.75,"max":1.1}
  • Black Segment Seconds: 0.1
Human · 9 checks
  • The opening earns attention immediately and clearly frames a real promotion.
  • Every factual claim matches the supplied event or campaign source.
  • The monitor sequence sells the story instead of behaving like decorative filler.
  • The single Squidward jab is funny without burying the promotion.
  • The presenter-derived gestures look intentional and remain desk-safe.
  • The original model mouth remains intact and opens naturally with the narration.
  • Voice identity, pronunciation overrides, and the final sign-off are approved by a human.
  • All monitor, ticker, and lower-third text is readable at 1280 by 720.
  • The final CTA tells a viewer what to do next.

Open the package

Readable Repo files.

Actual files from the published v0.2.1-proof package. Expand any file to inspect the instructions, requirements, or evidence before sending the Repo to your agent.

README.md
Open raw file ↗
# Squilliam News Wiggly Format Repo

This Repo turns a real promotion into a thirty-second breaking-news segment in the Squilliam News format. One official renderer drives a verified character pack, presenter-derived gestures, desk collision behavior, real-bone lip sync, the studio camera, screen layouts, and export. Promotion facts, story images, copy, timing labels, pronunciation overrides, voice inputs, and the verified `characterId` are replaceable.

The verified presenter roster is `squilliam` (default), `squidward`, `spongebob`, and `mr-krabs`. Put one of those IDs in `content.json`. All four have immutable render evidence under `evidence/character-packs/`.

Fish Audio presets are registered in `assets/voice-presets.json`: all four verified presenters have isolated vertical posters and browser-ready interactive GLBs under `assets/character-previews/`, plus short public voice auditions under `assets/voice-previews/`. Squilliam's audition is an excerpt from the approved proof narration, so the private clone ID remains outside the Repo and no additional provider call was made. These clips are marketing previews, not reusable production narration. Patrick and Sandy also have supplied voice presets, but their models remain unavailable until the failures recorded in `CHARACTER-AUDIT.md` are fixed and render-tested. Production Squilliam narration still uses the operator's approved private clone through the `SQUILLIAM_VOICE_ID` environment slot.

The two supplied proofs intentionally differ: We The Artists promotes an Indianapolis event with photographs, while Wiggly Format Lab promotes a software workflow with synthetic diagrams. Their results and the portability bug found by the second proof are recorded in `PROOF-REPORT.md` and `lessons.json`.

## Quick start

```bash
npm install
npm run smoke
npm run check
node runner.mjs init --run=my-promotion --from=we-the-artists
node runner.mjs validate --run=my-promotion
node runner.mjs render --run=my-promotion
node runner.mjs inspect --run=my-promotion
node runner.mjs finalize --run=my-promotion --human-review=pass
npm run package
```

If the run has no approved narration, copy `.env.example` to `.env.local`, set the Fish API key, and copy the selected presenter's `referenceId` from `assets/voice-presets.json` into `SQUILLIAM_VOICE_ID`. For Squilliam, use the operator's approved private clone instead. Validate first, obtain provider approval when required, and add `--approve-provider` to `render`. Fish variables may appear as unconfigured during `check`; they are optional when the selected example already includes `audio.wav`.

## Fixed and replaceable boundaries

| Fixed Format mechanics | Replaceable promotion content |
| --- | --- |
| Three.js renderer and 1280×720 studio | Headline, location bug, ticker |
| Character-pack contract and rig retargeting | Verified `characterId` |
| Calibrated real mouth/jaw bones | 65–112 word narration |
| Presenter-derived pose source | Pronunciation overrides and selected voice preset |
| Desk-safe arm retargeting | Poster and three story images |
| Ten monitor layouts and 30-second output | Slide copy, facts, CTA, sign-off |
| Render, inspect, and finalize gates | Run-local provenance and evidence |

## Run outputs

Each production lives under `agent-runs/<run-id>/`. Rendering never overwrites another run. Disposable PNG frames stay inside the run and are ignored by Git. A finalized run contains `final.mp4`, `contact-sheet.png`, `quality-report.json`, `finalization.json`, its exact `content.json`, and its asset provenance.

The runner prints absolute paths for playable video and contact-sheet output. An operating agent should open those with the host environment's normal media/image viewer; the Repo deliberately does not ship a second preview renderer.

`npm run package` creates `downloads/wiggly-squilliam-news-format-kit.zip` plus a SHA-256 sidecar. The archive includes the runtime, contracts, fixed assets, smoke fixture, and tracked proof evidence. It excludes API secrets, dependencies, temporary frames, run state, and older downloads.

## Provider and rights boundary

API keys and the operator's private Squilliam clone are environment values, never package data. The public reference presets explicitly supplied for this Repo live in `assets/voice-presets.json`; the runner fingerprints the selected ID in provider receipts without printing it. The included character files were supplied by the user for this private proof. Review distribution rights before publishing a downloadable public kit. Adding another character requires an entire registered pack plus render QA; a voice preset alone is not model admission and must not create another renderer.
SKILL.md
Open raw file ↗
---
name: squilliam-news-format
description: Turn a real event, launch, or promotion into a reusable thirty-second Squilliam News bulletin with a verified selectable presenter using the packaged renderer and runner.
---

# Squilliam News agent loop

Operate this runnable Format Kit. Do not rebuild, imitate, or replace the renderer.

## First question

Ask: `What event, launch, or promotion should the Squilliam News desk declare an emergency over, and which verified presenter should anchor it?`

Use only `squilliam`, `squidward`, `spongebob`, or `mr-krabs` as `content.characterId`. Squilliam remains the default. Do not add a model to this list until the same official renderer passes character-pack smoke QA.

Read `assets/voice-presets.json` after the user chooses the presenter. For Squidward, SpongeBob, or Mr. Krabs, copy the matching packaged `referenceId` into the local `SQUILLIAM_VOICE_ID` environment variable when new Fish narration is needed. The MP3s under `assets/voice-previews/` are short public auditions only; never splice them into a production bulletin. Squilliam still requires the operator's approved private clone. Patrick and Sandy are voice-ready only; never select their character IDs until their model status becomes `presenter-ready`.

Ask one question at a time. If the user requests the packaged We The Artists proof, initialize from that example without additional creative questions.

## Required loop

1. Read `README.md`, `requirements.json`, `input-contract.json`, `output-contract.json`, `composition-contract.json`, `quality.json`, `assets.json`, `assets/character-packs.json`, `assets/voice-presets.json`, and `prompts/script.md`.
2. Run `npm install`, then `npm run smoke`, then `npm run check`.
3. Run `node runner.mjs init --run=<run-id> --from=we-the-artists` or `--from=smoke`.
4. Change only the new run's `content.json`, `assets/story/*`, `asset-sources.json`, and optional approved `audio/source.wav`.
5. Read the script aloud and inspect every story image at phone size.
6. Run `node runner.mjs validate --run=<run-id>` before any provider call.
7. If narration is missing, report the Fish model and current cost, then ask once when the call may charge or consume a limited quota.
8. Run `node runner.mjs render --run=<run-id> --approve-provider` only after approval. Omit the flag when approved narration already exists.
9. Run `node runner.mjs inspect --run=<run-id>`, then use the host environment's media viewer to show the emitted contact-sheet and playable-video paths. If the GUI viewer is unavailable, use packaged Playwright with installed Chrome to play the actual MP4; do not create a preview renderer.
10. Ask the user to confirm factual accuracy, voice identity, pronunciation, body language, lip sync, joke, and CTA.
11. Run `node runner.mjs finalize --run=<run-id> --human-review=pass` only after approval.
12. Return the final playable MP4.
13. Multi-Platform Social Distribution (Optional):
    When the bulletin is finalized and approved, distribute it across YouTube Shorts, X/Twitter, Instagram, and TikTok via the packaged `runtime/publish.mjs` CLI or connected Buffer MCP tools:
    - Author platform copy in `inputs/distribution.json` (YouTube Shorts title ≤100 chars, categoryId "23" or "25", duration ≤60s; Twitter/X ≤280 chars; TikTok ≤2200 chars; Instagram non-empty caption).
    - Dry-run validation: `node runtime/publish.mjs --dry-run inputs/distribution.json examples/we-the-artists/evidence/final.mp4`.
    - Live dispatch requires explicit human sign-off (`approvalRequired: true`). Never leak or log `BUFFER_API_KEY`.
    - Generates a verified distribution receipt (`<video>.distribution.json`).

Stop on missing tools, invalid content, absent assets, unapproved provider use, failed inspection, or attempt three. Never print or store secret values. A content change that requires editing `runtime/renderer/app.js` is a portability failure, not permission to patch the renderer.
requirements.json
Open raw file ↗
{
  "localTools": ["node", "npm", "python3", "ffmpeg", "ffprobe", "Google Chrome"],
  "authoringTools": ["zip (only required to build the downloadable archive)"],
  "nodeVersion": ">=20.12",
  "providers": [
    {
      "name": "Fish Audio",
      "purpose": "production narration when a run has no approved audio.wav",
      "environmentVariables": ["FISH_STUDIO_APIKEY", "SQUILLIAM_VOICE_ID"],
      "voicePresetRegistry": "assets/voice-presets.json",
      "model": "s2.1-pro-free",
      "estimatedCost": "$0 through August 31, 2026 under Fish Audio's published fair-use window; recheck before later use",
      "pricingCheckedAt": "2026-08-04",
      "pricingSource": "https://fish.audio/blog/s2-1-pro-free-api/",
      "approval": "Validate first. Ask once before any provider call that may charge or consume a limited quota. Pass --approve-provider to record approval."
    },
    {
      "name": "Social Publisher (Buffer MCP or API)",
      "purpose": "Simultaneous multi-platform publishing to YouTube Shorts, Instagram Reels, TikTok, and X.",
      "optional": true,
      "environmentVariables": ["BUFFER_API_KEY"],
      "pricingSource": "https://buffer.com/pricing"
    }
  ],
  "paidImageOrVideoProviders": [],
  "secretsPolicy": "API keys and operator-private voice clones must never be stored, printed, or added to run evidence. User-approved public Fish reference presets may be committed in assets/voice-presets.json; the provider receipt fingerprints the selected reference ID without printing it."
}
assets.json
Open raw file ↗
{
  "fixed": [
    {
      "path": "assets/character-packs.json",
      "role": "verified presenter registry, rig maps, and model calibration",
      "source": "created for this private Wiggly Repo from render-tested user-supplied assets"
    },
    {
      "path": "assets/voice-presets.json",
      "role": "Fish Audio reference presets and character readiness boundaries",
      "source": "reference IDs supplied by the user; the Fish API key and private Squilliam clone remain local-only"
    },
    {
      "path": "assets/character-previews/squilliam.png",
      "role": "isolated vertical Squilliam character-option poster",
      "source": "static marketing capture from the verified user-supplied model using the official runtime's model loader and material rules"
    },
    {
      "path": "assets/character-previews/squilliam.glb",
      "role": "browser-ready interactive Squilliam character-option model",
      "source": "GLB export of the verified user-supplied model posed through the official runtime; see character-preview provenance"
    },
    {
      "path": "assets/character-previews/squidward.png",
      "role": "isolated vertical Squidward character-option poster",
      "source": "static marketing capture from the verified user-supplied model using the official runtime's model loader and material rules"
    },
    {
      "path": "assets/character-previews/squidward.glb",
      "role": "browser-ready interactive Squidward character-option model",
      "source": "GLB export of the verified user-supplied model posed through the official runtime; see character-preview provenance"
    },
    {
      "path": "assets/character-previews/spongebob.png",
      "role": "isolated vertical SpongeBob character-option poster",
      "source": "static marketing capture from the verified user-supplied model using the official runtime's model loader and material rules"
    },
    {
      "path": "assets/character-previews/spongebob.glb",
      "role": "browser-ready interactive SpongeBob character-option model",
      "source": "GLB export of the verified user-supplied model posed through the official runtime; see character-preview provenance"
    },
    {
      "path": "assets/character-previews/mr-krabs.png",
      "role": "isolated vertical Mr. Krabs character-option poster",
      "source": "static marketing capture from the verified user-supplied model using the official runtime's model loader and material rules"
    },
    {
      "path": "assets/character-previews/mr-krabs.glb",
      "role": "browser-ready interactive Mr. Krabs character-option model",
      "source": "GLB export of the verified user-supplied model posed through the official runtime; see character-preview provenance"
    },
    {
      "path": "assets/character-previews/provenance.json",
      "role": "generation method, dimensions, runtime fingerprint, and immutable hashes for character-option posters and interactive models",
      "source": "created during the public character-options update"
    },
    {
      "path": "assets/voice-previews/squilliam.mp3",
      "role": "short public Squilliam character-option voice audition",
      "source": "lossless excerpt from the already-approved We The Artists narration; no new provider call and no private clone ID packaged"
    },
    {
      "path": "assets/voice-previews/squidward.mp3",
      "role": "short public Squidward character-option voice audition",
      "source": "Fish Audio s2.1-pro-free using the user-supplied public reference preset; see assets/voice-previews/provenance.json"
    },
    {
      "path": "assets/voice-previews/spongebob.mp3",
      "role": "short public SpongeBob character-option voice audition",
      "source": "Fish Audio s2.1-pro-free using the user-supplied public reference preset; see assets/voice-previews/provenance.json"
    },
    {
      "path": "assets/voice-previews/mr-krabs.mp3",
      "role": "short public Mr. Krabs character-option voice audition",
      "source": "Fish Audio s2.1-pro-free using the user-supplied public reference preset; see assets/voice-previews/provenance.json"
    },
    {
      "path": "assets/voice-previews/provenance.json",
      "role": "provider-call, script, duration, and immutable hash provenance for public voice auditions",
      "source": "generated during the public character-options update; contains no API secret"
    },
    {
      "path": "assets/character/chr_squilliam_bindpose.dae",
      "role": "rigged anchor character",
      "source": "user-supplied game asset",
      "distribution": "Review rights before distributing outside the user's private Repo."
    },
    {
      "path": "assets/character/tex_0000_squilliam_128.PNG",
      "role": "character texture",
      "source": "user-supplied game asset"
    },
    {
      "path": "assets/character/tex_0000_squilliam_256.PNG",
      "role": "character texture",
      "source": "user-supplied game asset"
    },
    {
      "path": "assets/character/tx8_0000_squideyes_128.PNG",
      "role": "eye texture",
      "source": "user-supplied game asset"
    },
    {
      "path": "assets/characters/squidward/chr_squid_bindpose.dae",
      "role": "verified rigged Squidward presenter",
      "source": "user-supplied game asset",
      "distribution": "Review rights before distributing outside the user's private Repo."
    },
    {
      "path": "assets/characters/squidward/tex_0000_squidward_128.PNG",
      "role": "Squidward body texture",
      "source": "user-supplied game asset"
    },
    {
      "path": "assets/characters/squidward/tx8_0000_squideyes_128.PNG",
      "role": "Squidward eye texture",
      "source": "user-supplied game asset"
    },
    {
      "path": "assets/characters/spongebob/chr_bob_bindpose.dae",
      "role": "verified rigged SpongeBob presenter",
      "source": "user-supplied game asset",
      "distribution": "Review rights before distributing outside the user's private Repo."
    },
    {
      "path": "assets/characters/spongebob/tex_0000_spongebob_128.PNG",
      "role": "SpongeBob body texture",
      "source": "user-supplied game asset"
    },
    {
      "path": "assets/characters/spongebob/tx1_0000_lashes.PNG",
      "role": "SpongeBob lash texture",
      "source": "user-supplied game asset"
    },
    {
      "path": "assets/characters/spongebob/tx8_0000_spongecheeks_32.PNG",
      "role": "SpongeBob cheek texture",
      "source": "user-supplied game asset"
    },
    {
      "path": "assets/characters/spongebob/tx8_0000_spongeeyes_128.PNG",
      "role": "SpongeBob eye texture",
      "source": "user-supplied game asset"
    },
    {
      "path": "assets/characters/mr-krabs/chr_krabs_bindpose.dae",
      "role": "verified rigged Mr. Krabs presenter",
      "source": "user-supplied game asset",
      "distribution": "Review rights before distributing outside the user's private Repo."
    },
    {
      "path": "assets/characters/mr-krabs/tex_0000_mrkrabs_128.PNG",
      "role": "Mr. Krabs body texture",
      "source": "user-supplied game asset"
    },
    {
      "path": "assets/characters/mr-krabs/tx1_0000_krabslids_128.PNG",
      "role": "Mr. Krabs eyelid texture",
      "source": "user-supplied game asset"
    },
    {
      "path": "assets/motion/presenter-motion-reference.json",
      "role": "normalized presenter pose track",
      "source": "derived from the user-selected Mixkit green-screen presenter reference"
    }
  ],
  "replaceable": [
    "promotion content.json",
    "verified presenter characterId",
    "story images",
    "asset provenance",
    "narration script",
    "pronunciation overrides",
    "selected packaged voice preset or approved local voice reference",
    "generated narration and run evidence"
  ]
}
quality.json
Open raw file ↗
{
  "automatic": {
    "width": 1280,
    "height": 720,
    "fps": 30,
    "durationSeconds": 30,
    "frameCount": 900,
    "audioStreams": 1,
    "maxInteriorSilenceSeconds": 0.6,
    "finalHoldSeconds": {"min": 0.75, "max": 1.1},
    "blackSegmentSeconds": 0.1
  },
  "human": [
    "The opening earns attention immediately and clearly frames a real promotion.",
    "Every factual claim matches the supplied event or campaign source.",
    "The monitor sequence sells the story instead of behaving like decorative filler.",
    "The single Squidward jab is funny without burying the promotion.",
    "The presenter-derived gestures look intentional and remain desk-safe.",
    "The original model mouth remains intact and opens naturally with the narration.",
    "Voice identity, pronunciation overrides, and the final sign-off are approved by a human.",
    "All monitor, ticker, and lower-third text is readable at 1280 by 720.",
    "The final CTA tells a viewer what to do next."
  ]
}

CHARACTER-AUDIT.md
Open raw file ↗
# Character import audit

The downloaded archives were inspected without modifying the originals. Four characters passed the news-anchor render check and ship in this private Format Repo: Squilliam Fancyson, Squidward Tentacles, SpongeBob SquarePants, and Mr. Krabs. Separately supplied Fish voice presets are registered in `assets/voice-presets.json`; voice readiness does not bypass model QA.

| Character | Model result | Fish voice | Reason |
| --- | --- | --- | --- |
| Squilliam Fancyson | Included | Operator-supplied clone | Existing calibrated 48-joint presenter rig. |
| Squidward Tentacles | Included | Preset ready | 48-joint skeleton is structurally equivalent to Squilliam's rig. |
| SpongeBob SquarePants | Included | Preset ready | Named arm, face, jaw, and eyelid bones passed the nine-pose smoke render. |
| Mr. Krabs | Included | Preset ready | Named arm, claw, jaw, and eyelid bones passed the nine-pose smoke render. |
| Patrick Star | Left out | Preset ready | The rig responds, but framing and desk placement did not meet the presenter bar. |
| Sandy Cheeks | Left out | Preset ready | The rig responds, but the helmet/glass material obscures her face in the official renderer. |
| Larry the Lobster | Left out | Not registered | The 41-joint skeleton uses generic `Dummy` names and needs a manual semantic adapter. |
| Man Ray | Left out | Not registered | The 57-joint skeleton uses generic `Dummy` names and needs a manual semantic adapter. |
| Announcer Fish | Left out | Not registered | The archive contains only OBJ/MTL geometry with no skeleton. |
| Gary | Left out | Not registered | The archive contains only OBJ/MTL geometry with no skeleton. |

The left-out archives remain in the user's Downloads folder and can be revisited later without bloating or destabilizing this kit.
COMPLETION-AUDIT.md
Open raw file ↗
# Squilliam News completion audit

This audit maps the active Wiggly Repo objective to current, reviewable evidence. A row is complete only when the named artifact or executable check directly proves it.

| Objective requirement | Status | Authoritative evidence |
| --- | --- | --- |
| Work on a fresh, isolated branch | Pass | Branch `codex/feat/squilliam-news-repo`; all branch changes are under this Format root. |
| Do not integrate into `/create`, `/builder`, or `/share` | Pass | `git diff --name-only origin/main...HEAD` contains only `v3/public/format-repositories/squilliam-news-v1/**`. |
| Preserve one official renderer | Pass | `format.json` names `runtime/renderer/app.js`; `composition-contract.json` records the invariant; the test suite asserts that `runtime/renderer/` contains only `app.js` and `index.html`. |
| Separate replaceable promotion content from fixed character-pack/studio mechanics | Pass | The boundary table in `README.md`, `input-contract.json`, `composition-contract.json`, `assets.json`, and the renderer fact-leak test. |
| Admit only render-tested character packs | Pass for corrected v0.2.1 runtime | `assets/character-packs.json` now binds transparent face cutouts by stable Collada material name; contract tests prove every mapping exists; corrected hashed media under `evidence/character-packs/` visibly retains each character's eyes. The rejected v0.2.0 evidence is archived. |
| Package Format-specific agent instructions | Pass | `SKILL.md` gives a complete ordered loop and explicitly forbids rebuilding the renderer. |
| Package input, output, and composition contracts | Pass | `input-contract.json`, `output-contract.json`, and `composition-contract.json`. |
| Declare tools, providers, key names, cost, and approval policy without secret values | Pass | `requirements.json`, `.env.example`, `runner.mjs check`, and the secret scan recorded in `evidence/package-smoke.json`. |
| Preserve assets and provenance | Pass | Fixed assets are listed in `assets.json`; each example and fixture has `asset-sources.json`; generated-provider evidence is sanitized. |
| Support voice and pronunciation configuration | Pass | `SQUILLIAM_VOICE_ID` remains environment-only; each `content.json` carries explicit pronunciation overrides; Fish input is phoneme encoded by the runner. |
| Provide semantic `smoke/check/init/validate/render/inspect/finalize` commands | Pass | `package.json`, `runner.mjs`, and the command-contract test; `package` is included as the archive command. |
| Provide a free local smoke test through the official renderer | Pass | The corrected synthetic fixture passes `npm run smoke` in source, in the blind archive-only handoff, and in an independent clean extraction. |
| Prevent provider calls before validation and approval | Pass | Tests prove `--approve-provider` cannot bypass validation, missing approval cannot create a receipt, and either rejection consumes zero attempts. |
| Limit and preserve attempts | Pass | `input-contract.json` caps attempts at three; run `state.json` records attempt history; the blind proof finished on attempt one. |
| Create two meaningfully different promotional proofs through the current runtime | Pass | Fresh We The Artists and Wiggly Format Lab v0.2.1 quality reports share runtime hash `6da1f48982614b10baeb4a11ca63ad4aa4594c9945d32f2b15275bb8e3e27538` while recording different content and video hashes. Both exact 30-second corrected videos are under current example evidence. |
| Inspect real rendered media | Pass | Both corrected full v0.2.1 promotions pass automatic inspection; close samples around both former blink moments retain both yellow eyes and both red pupils. Corrected contact sheets for both promotions and all four presenters were visually inspected, and the user approved the corrected We The Artists review. |
| Reject failed, stale, or unapproved finalization | Pass | Tests prove human approval cannot override failed inspection, stale runtime evidence is rejected, and the explicit human-review flag is mandatory. |
| Finalize human-approved real media | Pass | `examples/we-the-artists/evidence/finalization.json` binds automatic pass, explicit human pass, and the current runtime/content/audio/video hashes to `final.mp4`. |
| Preserve a second creative proof without inventing approval | Pass | The current Wiggly Format Lab v0.2.1 review passes automatic checks on attempt one. It remains a review proof because the user approved the We The Artists video, not this separate creative. |
| Run a blind-agent handoff | Pass | A fresh agent received only candidate ZIP `d652654…`, passed 14/14 tests and the full semantic loop, reproduced the current video/contact hashes on attempt one with zero provider calls and unchanged renderer hashes, inspected six eye-critical timestamps plus thirty one-second samples, and stopped before finalization. Receipts are under `evidence/blind-handoff/v0.2.1/`. |
| Record failures, fixes, and scope of lessons | Pass | `lessons.json` now records the eye-material regression, false automatic/agent pass, user rejection, root cause, shared fix, and corrected evidence alongside earlier lessons. |
| Remove needless machinery | Pass | Ponytail review removed unused renderer debug/rest-pose state and replaced the custom env parser with Node's native `process.loadEnvFile`; no database, marketplace, workflow engine, MCP server, or app integration was added. |
| Produce a downloadable, reviewable runnable kit | Pass | The builder creates a ZIP, SHA-256 sidecar, and in-archive manifest with the required exclusions. The evidence-bearing archive passed clean install, 15/15 tests, check, smoke, dependency audit, ZIP integrity, manifest-size verification, secret scan, and exclusion scan. `evidence/package-smoke.json` records the audit; the final sidecar is authoritative after embedding that receipt. |

The v0.2.0 eye regression and the separate pupil-only fake blink are reproduced, diagnosed, fixed, and covered by corrected v0.2.1 smoke, full-promotion, human-finalization, blind-handoff, and clean-package evidence. All objective requirements are now backed by current artifacts or executable checks.
composition-contract.json
Open raw file ↗
{
  "schemaVersion": 1,
  "durationSeconds": 30,
  "fps": 30,
  "frameCount": 900,
  "intentionalEndHoldSeconds": {"min": 0.75, "max": 1.1},
  "slideOrder": [
    "alert",
    "poster",
    "photo",
    "photo",
    "photo",
    "jab",
    "details",
    "notice",
    "cta",
    "signoff"
  ],
  "timelineRules": [
    "The first slide starts at 0.",
    "The final slide ends at 30.",
    "Adjacent slides have no gaps or overlaps.",
    "Every slide lasts at least 1.5 seconds.",
    "Only content fields and story assets vary between promotions.",
    "The studio, verified character-pack contract, presenter motion source, mouth deformation modes, desk occlusion, camera, and renderer remain fixed."
  ],
  "rendererInvariant": "Preview, smoke frames, final video, and inspection evidence all originate from runtime/renderer/app.js through runtime/render.mjs."
}
format.json
Open raw file ↗
{
  "id": "squilliam-news",
  "version": "0.2.1-proof",
  "title": "Squilliam News",
  "description": "Turn a real promotion into a thirty-second, character-led breaking-news bulletin with presenter-derived body language, a retro story monitor, and a sharp final sign-off.",
  "status": "proof",
  "output": {
    "type": "video/mp4",
    "width": 1280,
    "height": 720,
    "fps": 30,
    "durationSeconds": 30
  },
  "runtime": "runner.mjs",
  "renderer": "runtime/renderer/app.js",
  "inputContract": "input-contract.json",
  "outputContract": "output-contract.json",
  "compositionContract": "composition-contract.json",
  "components": [
    "instructions",
    "user-inputs",
    "verified-character-packs",
    "fish-voice-presets",
    "replaceable-promotion-pack",
    "voice-and-pronunciations",
    "timeline-slots",
    "official-renderer",
    "quality-checks",
    "final-output"
  ]
}
input-contract.json
Open raw file ↗
{
  "schemaVersion": 1,
  "required": [
    "id",
    "characterId",
    "headline",
    "locationBug",
    "tickerItems",
    "script",
    "pronunciations",
    "slides"
  ],
  "limits": {
    "headlineCharacters": 58,
    "locationBugCharacters": 24,
    "tickerItems": {"min": 3, "max": 8, "charactersPerItem": 54},
    "scriptWords": {"min": 65, "max": 112},
    "slides": 10,
    "attempts": 3
  },
  "assetPolicy": {
    "storyImages": "Every referenced image must exist inside the run or source example and have a recorded source or user-supplied note.",
    "character": "characterId must name a presenter-ready entry in assets/character-packs.json. Candidate, adapter-needed, and static-cutaway packs cannot be selected by a validated production run.",
    "voice": "A run may supply approved narration audio, or Fish Audio may generate it after validation and explicit provider approval. For a packaged voice, copy the matching referenceId from assets/voice-presets.json into SQUILLIAM_VOICE_ID. A voice-ready preset does not make an unverified character model selectable."
  }
}
lessons.json
Open raw file ↗
{
  "format": "squilliam-news",
  "lessons": [
    {
      "status": "proven",
      "scope": "format-specific",
      "friction": "The prototype occupied more than a gigabyte because full-resolution PNG frame caches sat beside the reusable source.",
      "rootCause": "Disposable renders and reusable Format files had no explicit boundary.",
      "smallestFix": "Keep content-hashed resumable frames inside ignored run directories and exclude all run state from the downloadable kit.",
      "evidence": "The source can resume interrupted captures, while KIT-MANIFEST.json contains no agent-runs or frame cache paths."
    },
    {
      "status": "proven",
      "scope": "covered by existing Wiggly rules 7 and 9",
      "friction": "The original renderer contained event-specific slide art and facts.",
      "rootCause": "The first polished proof blurred Format mechanics with story content.",
      "smallestFix": "Move all facts, display copy, timing slots, story images, and pronunciation overrides into a validated content pack.",
      "evidence": "We The Artists and Wiggly Format Lab render through the same runtime without event facts in runtime/renderer/app.js."
    },
    {
      "status": "proven",
      "scope": "format-specific",
      "friction": "The second proof clipped a longer monitor eyebrow even though it passed the original character-count validation.",
      "rootCause": "Character limits did not account for font metrics and per-layout width.",
      "smallestFix": "Measure every variable monitor string in the renderer and reduce font size to the layout's declared minimum when needed.",
      "evidence": "The first Wiggly Format Lab contact sheet exposed the clipping; attempt two and the smoke contact sheet show the same copy fitted inside the monitor."
    },
    {
      "status": "proven",
      "scope": "covered by existing Wiggly rule 6",
      "friction": "The second narration provider output was 39.72 seconds for a fixed 30-second composition.",
      "rootCause": "Narration duration varies even when the prompt requests a particular delivery speed.",
      "smallestFix": "Probe the actual audio, tempo-fit speech to 29.1 seconds, and preserve an explicit final hold.",
      "evidence": "Inspection reports a 30.000-second output and a final silence hold of 0.885 seconds."
    },
    {
      "status": "proven",
      "scope": "package usability",
      "friction": "The historical blind agent had to infer dependency installation and host-viewer use; the v0.2 blind agent then found the Mac GUI locked while inspecting the actual video.",
      "rootCause": "The ordered loop initially omitted facts that appeared only in README, and host GUI availability cannot be assumed in an agent environment.",
      "smallestFix": "Put npm install before smoke, name the host viewer at the point of use, allow packaged Playwright plus installed Chrome as an actual-MP4 playback fallback, and clarify that Fish variables are optional when approved audio ships with an example.",
      "evidence": "The v0.2.0 archive-only run completed the operational loop with zero provider calls but later failed human creative review; receipts are preserved under evidence/blind-handoff/history/v0.2.0-broken-eyes."
    },
    {
      "status": "proven",
      "scope": "covered by existing Wiggly rules 7 and 8; implementation fix is format-specific",
      "friction": "The user found Squilliam's eyes missing after v0.2.0 automatic inspection, agent visual review, and blind playback had all been reported as passing.",
      "rootCause": "The character-pack renderer classified alpha-cutout facial textures by browser-resolved image URL, which was not a stable model contract. The resulting opaque cutout background hid eye art, while the quality gates checked media integrity and body framing but not character identity details.",
      "smallestFix": "Declare stable transparent material names per Collada character, alpha-test those materials with normal depth writes, assert every mapping exists in the model, archive all affected proof evidence, and require renewed human review after rerendering.",
      "evidence": "Broken v0.2.0 contact sheets are archived under evidence/character-packs/history/v0.2.0-broken-eyes. Corrected v0.2.1 smoke sheets show eye art on all four presenters."
    },
    {
      "status": "proven",
      "scope": "format-specific",
      "friction": "After the facial cutouts were restored, close playback review showed Squilliam's supposed blink removed only the red pupils while the yellow eye fields stayed open.",
      "rootCause": "The source Collada eye-scale joints influence the pupil overlay, not an eyelid or the entire eye, so treating those joints as blink controls created a disappearing-pupil gesture.",
      "smallestFix": "Mark pupil-only scale rigs as non-blinking and animate blinks only for characters with verified lid controls. Preserve the full eye art continuously instead of inventing a broken blink.",
      "evidence": "The pupil-blink proof is archived under examples/we-the-artists/evidence/history/v0.2.1-pupil-blink. Current Squilliam and Squidward smoke sheets retain yellow eyes and red pupils in every sample; both full proofs share runtime hash 6da1f48982614b10baeb4a11ca63ad4aa4594c9945d32f2b15275bb8e3e27538."
    },
    {
      "status": "proven",
      "scope": "format-specific",
      "friction": "Downloaded character models varied from equivalent semantic rigs to generic skeletons and completely static geometry.",
      "rootCause": "A model file alone does not guarantee compatible arm chains, face controls, framing, transparency, or presenter-quality output.",
      "smallestFix": "Register only characters with an explicit rig map and admit them after the same nine-pose visual smoke test; record and exclude failures.",
      "evidence": "Squilliam, Squidward, SpongeBob, and Mr. Krabs pass hashed smoke evidence under evidence/character-packs; CHARACTER-AUDIT.md records six exclusions."
    }
  ],
  "sharedStandardChange": "None. Human rejection of an automatically valid file directly reinforces existing rules 7 and 8; stable Collada material mapping is specific to this video Format."
}
output-contract.json
Open raw file ↗
{
  "schemaVersion": 1,
  "media": {
    "path": "final.mp4",
    "mimeType": "video/mp4",
    "videoCodec": "h264",
    "audioCodec": "aac",
    "width": 1280,
    "height": 720,
    "fps": 30,
    "durationSeconds": 30,
    "audioStreams": 1
  },
  "evidence": [
    "content.json",
    "asset-sources.json",
    ".validation.json",
    "state.json",
    "contact-sheet.png",
    "quality-report.json",
    "finalization.json"
  ],
  "finalizationRules": [
    "The automatic inspection must pass.",
    "The inspected content hash must still match the run.",
    "The inspected runtime hash must still match the official runtime.",
    "The inspected audio and video hashes must still match the rendered attempt.",
    "A human must approve facts, voice, pronunciation, body language, lip sync, joke, and CTA."
  ]
}
package-lock.json
Open raw file ↗
{
  "name": "wiggly-squilliam-news-format-kit",
  "version": "0.2.1-proof",
  "lockfileVersion": 3,
  "requires": true,
  "packages": {
    "": {
      "name": "wiggly-squilliam-news-format-kit",
      "version": "0.2.1-proof",
      "dependencies": {
        "playwright": "1.62.1",
        "three": "0.185.1"
      }
    },
    "node_modules/fsevents": {
      "version": "2.3.2",
      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
      "hasInstallScript": true,
      "license": "MIT",
      "optional": true,
      "os": [
        "darwin"
      ],
      "engines": {
        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
      }
    },
    "node_modules/playwright": {
      "version": "1.62.1",
      "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.62.1.tgz",
      "integrity": "sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg==",
      "license": "Apache-2.0",
      "dependencies": {
        "playwright-core": "1.62.1"
      },
      "bin": {
        "playwright": "cli.js"
      },
      "engines": {
        "node": ">=20"
      },
      "optionalDependencies": {
        "fsevents": "2.3.2"
      }
    },
    "node_modules/playwright-core": {
      "version": "1.62.1",
      "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.62.1.tgz",
      "integrity": "sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==",
      "license": "Apache-2.0",
      "bin": {
        "playwright-core": "cli.js"
      },
      "engines": {
        "node": ">=20"
      }
    },
    "node_modules/three": {
      "version": "0.185.1",
      "resolved": "https://registry.npmjs.org/three/-/three-0.185.1.tgz",
      "integrity": "sha512-5aojFCXKwnjBRZvUnt3WFfEcvUJgkN5LlijRFN95hMy8WVkG4I0QNcJE+OuWvuJ0bOdStrbfXn0pkd6/QyiAlg==",
      "license": "MIT"
    }
  }
}
package.json
Open raw file ↗
{
  "name": "wiggly-squilliam-news-format-kit",
  "private": true,
  "version": "0.2.1-proof",
  "type": "module",
  "scripts": {
    "test": "node --test tests/*.test.mjs",
    "smoke": "node runner.mjs smoke",
    "check": "node runner.mjs check",
    "init": "node runner.mjs init",
    "validate": "node runner.mjs validate",
    "render": "node runner.mjs render",
    "inspect": "node runner.mjs inspect",
    "finalize": "node runner.mjs finalize",
    "package": "node build-kit.mjs"
  },
  "dependencies": {
    "playwright": "1.62.1",
    "three": "0.185.1"
  }
}
PROOF-REPORT.md
Open raw file ↗
# Squilliam News proof report

## Format boundary

The fixed Format is the verified character-pack contract, studio, camera, presenter-derived gesture system, desk-safe arm retargeting, mouth/jaw-bone lip sync, ten monitor layouts, 30-second timeline, renderer, and quality gates. Replaceable content includes the verified `characterId`, promotion script, facts, ticker, slide copy, story images, pronunciation overrides, provenance, and approved narration.

The two full promotional proofs below were freshly rendered and automatically inspected under corrected version `0.2.1-proof`. They share current runtime fingerprint `6da1f48982614b10baeb4a11ca63ad4aa4594c9945d32f2b15275bb8e3e27538` while carrying different content and video hashes. Historical v0.1 evidence, the human-rejected v0.2.0 eye-regression evidence, and the superseded pupil-only blink render remain available under each example's `evidence/history/` directory.

## Proof 1 — We The Artists

- Input: a live-art, music, visual-art, and spoken-word event in Indianapolis.
- Final output: `examples/we-the-artists/evidence/final.mp4`.
- Result: current automatic checks pass on attempt one; Squilliam's yellow eyes and red pupils remain visible through close samples around both former blink moments. The user approved the corrected review and it was finalized with video hash `4225ac87c1d6db293579502c2ffe5b660a6351aa8b74e16b471060f7e80657db`.
- Automatic evidence: exact 30.000 seconds, 1280×720, 30 fps, one AAC stream, no detected black segment, no interior silence over 0.6 seconds, and a 0.899-second intentional final hold.
- Runtime, content, audio, and video fingerprints are recorded in `examples/we-the-artists/evidence/quality-report.json`.
- Human and automatic approval are bound to the same runtime/content/video hashes in `examples/we-the-artists/evidence/finalization.json`.

## Proof 2 — Wiggly Format Lab

- Input: a software-format promotion with synthetic instruction, renderer, and evidence graphics; no event imagery or Indianapolis facts.
- Current output: `examples/wiggly-format-lab/evidence/review.mp4`.
- Result: current automatic checks pass on attempt one; human creative review is still required before finalization.
- Historical portability failure: a longer monitor eyebrow clipped in the first v0.1 attempt. A shared measured-text fitting rule fixed it without proof-specific renderer code; the current v0.2.1 proof passed on its first attempt.

## Attempt and provider record

- Each run is capped at three render attempts and records its state.
- The We The Artists narration was supplied as previously approved audio, so the current run made no provider call.
- Wiggly Format Lab recovered its narration locally from the historical v0.1 review. The current run made no provider call. The earlier explicitly authorized Fish Audio `s2.1-pro-free` receipt is retained under `evidence/history/v0.1/` and stores no API key or private voice model ID.
- Each example's `narration-source.json` binds the packaged audio and current render audio to hashes and records zero provider calls for the v0.2.1 run.
- Fish Audio's official published free window was checked on August 4, 2026 and is recorded in `requirements.json`; later users must recheck it.

## Shared-standard decision

No new universal Wiggly rule is proposed. The general lessons—separate content from runtime, inspect final media, and derive timing from actual audio—already exist in the shared standard. Text fitting and resumable browser-frame caches remain Format-specific evidence.

## Character-pack proof — version 0.2.1

- Verified selectors: `squilliam`, `squidward`, `spongebob`, and `mr-krabs`.
- Every selector validated and rendered the same 900-frame motion plan through `runtime/renderer/app.js`.
- Nine representative source frames per character were encoded into a smoke video and contact sheet.
- Every admitted Collada model now declares stable transparent facial-material names. Corrected smoke evidence visibly retains Squilliam and Squidward's yellow/red eyes, SpongeBob's complete blue-eye art, and Mr. Krabs' pupils and lids. Squilliam and Squidward's pupil-only scale joints are explicitly not presented as eyelids.
- Media hashes, content hashes, the current runtime hash, and admission checks are recorded in `evidence/character-packs/quality-report.json`.
- Patrick, Sandy, Larry, Man Ray, Announcer Fish, and Gary were deliberately excluded; `CHARACTER-AUDIT.md` records the reason for each.

## Historical blind-agent handoff — version 0.1

A fresh agent received only the packaged v0.1 ZIP and the desired We The Artists outcome. It installed dependencies, ran smoke and requirements checks, initialized the supplied example, validated, rendered, inspected, and finalized on attempt one of three without editing the renderer or calling a provider. Its final MP4 SHA-256 was `966b601ebc40e1fed8724fdcb7c843fb027c56d950eb8e4dabafe54d9757dcd8`, exactly matching the historical v0.1 final. Receipts are retained under `evidence/blind-handoff/history/v0.1/`.

## Rejected blind-agent handoff — version 0.2.0

A second fresh agent received only the v0.2.0 ZIP and operationally completed smoke, checks, validation, rendering, automatic inspection, and actual MP4 playback with zero provider calls. The user then rejected the output because Squilliam's eye cutout was opaque and hid the intended eye art. That handoff is invalid as creative proof even though automatic checks passed; its receipts are archived under `evidence/blind-handoff/history/v0.2.0-broken-eyes/`.

The root cause was reliance on a browser-resolved texture URL instead of stable Collada material names. Version 0.2.1 fixes that shared character-pack rule, adds contract regression coverage, and archives every stale v0.2.0 proof. A close pass on the first corrected package then found a separate pupil-only fake blink; that intermediate proof is also archived.

## Current blind-agent handoff — version 0.2.1

A fresh agent received only candidate archive `d6526546e1cbdc95f26c3268419ca643f2c3d3bba5eaec68a93551138016fdfa`. It clean-installed the kit, passed all 14 tests, smoke, check, validation, render, automatic inspection, and actual Chrome playback on attempt one of three with zero provider calls and no renderer edits. It stopped before finalization.

The returned video and contact sheet are byte-identical to the current We The Artists evidence. Six close samples around the two former pupil-disappearance moments plus thirty one-second samples retained both yellow eye fields and both red pupils, with no opaque facial cutout. Current receipts are under `evidence/blind-handoff/v0.2.1/`.
Technical proof archive ↗

Run it with a coding agent

Know the run before you start.

The agent reads this version’s instructions, checks the requirements, and walks you through the approved workflow. Review the inputs and estimate before starting.

Typical run

Research + script$0 Wiggly provider cost · about 3-8 min
Story images$0 when supplied or sourced from public evidence · about 3-10 min
Fish narration$0 in the current published fair-use window; recheck later · about 1-3 min
Local render + inspection$0 provider cost · about 2-5 min

$0 provider cost in the current Fish fair-use window, usually 10-25 min

You provide

One real event, launch, or promotion with an evidence URL · A verified presenter: Squilliam, Squidward, SpongeBob, or Mr. Krabs · Approved narration or Fish Audio access; SpongeBob, Squidward, and Mr. Krabs presets are packaged

Output

One horizontal 1280 × 720 MP4, exactly 30 seconds