← CastReaderCONTENT HISTORYWHAT CHANGED · RULE-BASED ANALYSIS
Update to CastReader
Snapshot Sep 30, 2026 · 23:16 UTC · version 0.1.4
Collection source: not recorded for this historical snapshot.
First saved snapshot
No earlier snapshot is available to establish a change.
Compare saved observations
Download comparison JSONFull technical diff · 0 changed fields
Full snapshot data
{
"name": "generate-audio",
"description": "Generate playable MP3 or WAV files from text with CastReader, report estimated and actual API charges, and resume interrupted audio jobs without duplicate generation. Use when the user wants audio output or recovery of a CastReader job.",
"included_files": [
{
"relative_path": "agents/openai.yaml",
"size_in_bytes": 207
}
],
"skill_md_contents": "---\nname: generate-audio\ndescription: Generate playable MP3 or WAV files from text with CastReader, report estimated and actual API charges, and resume interrupted audio jobs without duplicate generation. Use when the user wants audio output or recovery of a CastReader job.\n---\n\n# Generate and recover audio\n\nUse Node.js 22+ and `<plugin-root>/scripts/voice.mjs`, two directories above this skill. The output folder contains private input and job state; keep it outside source control. `CASTREADER_API_KEY` belongs in the environment, never in chat, URLs or CLI flags.\n\n## Generate\n\n1. Write UTF-8 `input.json` with the user's `text`, explicit spoken `language`, optional `voice_id` and `output_format` (`mp3` default, or `wav`). Default voice selection uses the account's ready narrator. Do not invent voice IDs. Inspect ready voices with `node <plugin-root>/scripts/voice.mjs voices`.\n2. Read current capabilities using `node <plugin-root>/scripts/voice.mjs capabilities`. Current per-job limit: 500 normalized Unicode code points. For longer text, create serial chunk plans with stable folders and a total budget; do not silently omit or summarize. Do not offer realtime or streaming when disabled.\n3. Use the user's budget. For a short audio request without a budget, disclose the live estimate and use a conservative $0.01 per-clip ceiling; a request to generate already authorizes ordinary generation within that ceiling. Ask only when a stated limit is exceeded or a materially larger task needs a larger budget.\n\n```sh\nnode <plugin-root>/scripts/voice.mjs plan --input /absolute/input.json --output /absolute/audio-run --max-usd 0.01\nnode <plugin-root>/scripts/voice.mjs run --output /absolute/audio-run --wait-ms 45000\n```\n\n`plan` routes, checks voices and estimates without synthesis. Its maximum is a current price/balance estimate, not a reserved quote. `run` rechecks before submission. Report the estimate before generating. API trial/wallet are separate from App Pro. Never top up, buy or change subscriptions.\n\n4. Verify successful files with an available audio inspector such as `ffprobe`, and render the absolute local path: ``. Include actual `chargedUSD` and trial characters. `receipt.json` records bytes and SHA-256; private `state.json` preserves recovery identity. File validation does not prove pronunciation quality.\n\n## Resume\n\n```sh\nnode <plugin-root>/scripts/voice.mjs resume --output /absolute/audio-run --wait-ms 45000\n```\n\nFor `pending`, retain the folder and resume after the suggested delay. Uncertain submissions reuse the original body and idempotency key. Known jobs are only polled. Verified local files are reused without API calls; missing or damaged bytes are redownloaded from the same job. Respect Retry-After. Do not switch regions, keys, voices or input to force a retry.\n\nFor `failed`, `cancelled` or `expired`, report status and charge. Deliberate new generation needs a new plan within the user's authorization. For `output_locked`, inspect the PID in `.lock`; remove the lock only after verifying the earlier process is gone. Keep `state.json` intact; never reset it to resolve an error.\n\nEnglish alignment is optional (`return_timestamps: true`) and can be unavailable even when audio succeeds. Keep segment-relative times and processed text; never invent timestamps or claim other-language alignment. Successful audio remains billable without alignment.\n\nWithout a configured key, preserve the requested input and link to `https://voice.castreader.com/console` for setup. Never borrow another account's credentials or claim a prerecorded demo was freshly generated.\n"
}SHA-256: 763fd2529d9db74d64bc8444c4e09cbbb0b4f38fd01e8b3454c973438ecadefe