T04 — A recorded briefing to a story, a picture, a voice and posts in three languages
A science magazine’s website gets the recording of a briefing: NASA’s Administrator and three astronauts on the Artemis programme, six minutes, in English. By the evening the editor wants a story, a picture to go with it, posts for the social channels in the magazine’s three languages and a short audio version for the newsletter — and every quotation exactly as it was said. This workflow makes the whole package in one run.
The briefing:
The reference run — 10.76 credits:
| Delivered | What is in it |
|---|---|
| The story | Markdown: headline, standfirst, six paragraphs, In their words with three quotations, the source |
| Header picture | 1376×768, an editorial illustration of the Moon |
| Audio summary | MP3, 44 s, from a 102-word script |
| Posts | LinkedIn and X, in English, Italian and Spanish |
| Quotations checked | each quotation, who said it, and how many times it was found |
| Transcript | 108 lines with their times and four speakers |

The story begins:
Artemis Sets Its Sights on a Sustainable Moon and Mars
NASA describes Artemis as a return to the Moon that could test reusable systems, use lunar resources and prepare astronauts for eventual journeys to Mars.
NASA’s Administrator says the Artemis program is intended to build on Apollo while pursuing a different kind of lunar return. …
and ends with the quotations, each found in what was said:
“So what we’re doing is we’re going to Mars, and the moon is the way to get to Mars.”
— NASA’s Administrator, on the Moon as a step to Mars
The posts on X, in three languages:
en — Artemis aims to make the Moon a proving ground: for reusable spacecraft, lunar resources, sustained operations and the technologies needed for Mars.
it — Artemis vuole trasformare la Luna in un banco di prova: per veicoli riutilizzabili, risorse lunari, operazioni durature e tecnologie dirette verso Marte.
es — Artemis quiere convertir la Luna en un campo de pruebas: para naves reutilizables, recursos lunares, operaciones sostenidas y tecnologías rumbo a Marte.
The case
Section titled “The case”The recording is NASA’s Artemis Media Resource — Interview Soundbites (2019, public domain; NASA does not endorse this example), cut as for the dubbing example: the Administrator from 0:02 to 3:00, then three astronauts, one at a time. NASA’s material does not name them, so the workflow does not either: the brief says NASA’s Administrator, then three NASA astronauts, and the story attributes by role. The magazine, Orbit Weekly, is fictional.
| Input | Who provides it | Example |
|---|---|---|
| The briefing | the recording, as a video | 6 min 13 s, 640×360 |
| The editor’s brief | the editor: the publication, its readers, who speaks, the source line | one JSON object |
What it shows
Section titled “What it shows”- Listen once. Speech to Text (ElevenLabs Scribe V2) transcribes the six minutes in one pass, with a speaker label per voice: 108 lines, four speakers. Everything else reads that transcript. See Transcription and captions.
- One step writes the whole package. Text Generation reads the brief and the transcript and returns one JSON object: headline, standfirst, the story, three quotations with who said them and what about, the posts in English, Italian and Spanish, a script for the voice, and an idea for the picture. A schema checks every part, its length, and that the story and the posts contain no quotation marks — the only words in quotation marks are the ones the workflow checks. See Structured answers.
- A quotation is printed only if it was said. For each quotation a Replace Text counts it in the transcript, a Predicate asks for at least one, and a Filter lets it into the story. A quotation that was not said word for word — a paraphrase, a tidied sentence, two remarks run together — is left out and listed in Quotations left out. The story’s last line says so: Every quotation was found word for word in the transcript.
- Check against what was said, not line by line. The transcription cuts speech into lines, and one sentence can
fall across two: And by doing that, / we create a better life here on Earth. Checked line by line, that true
quotation was not found. The check now reads all that was said — every line joined into one running text with
Concatenate Text (
aggregate/concat_text) — and finds it. - The words are the model’s; the picture and the voice follow them. The picture’s idea goes through a Text Template that adds the magazine’s direction — editorial illustration, deep blues and warm light, no people, no text, no logos — before Text to Image; the script is read by Text to Speech. See Prompts for AI steps.
Building it taught three things the workflow now does:
- A long answer needs room. The package is one long JSON answer. With Max Tokens left at the default,
the model spent the whole budget reasoning and returned nothing (
AI_RESPONSE_INCOMPLETE); the node now has Max Tokens 8000 and Reasoning Effortlow. See Writing with a model. - The schema must allow what is true. A real, short quotation was under the first minimum of 40 characters and stopped the run; the minimum is now 20.
- Say what you want, down to the case. on The Moon as Mars preparation became on the Moon as a step to Mars once the brief asked for the topic in lower case, with an example.
The workflow
Section titled “The workflow”The figure above tells the workflow as stages; the exact graph is the workflow (as a diagram), node by node in the table.
| Node | Type | Why |
|---|---|---|
| The briefing / The editor’s brief | input/video, input/json_value |
The recording; the publication, its readers, who speaks, the source |
| The speech / Transcribe, in one pass | video/extract_audio (speech), ai/speech_to_text (Scribe V2, lines, speakers) |
The transcript with its speakers |
| The transcript as text | text/format json |
The transcript for the writer, with the speaker labels |
| Each line of speech / What was said, as one text | enumerate/json on cues, aggregate/concat_text |
Every line joined, for the check |
| Publication, Audience, Who speaks, Source | utility/extract ×4 |
The brief’s fields |
| Brief for the writer / Write the package | text/template, ai/text_generation JSON mode, Max Tokens 8000, Reasoning Effort low |
The story, the quotations, the posts, the script, the picture’s idea |
| The package is complete | utility/json_schema_validate, fail |
Every part; lengths; no quotation marks in the story and the posts |
| Headline, Standfirst, Body, Social, Audio script, Image idea, Quotes | utility/extract ×7 |
The parts |
| Each quotation / Find it in the transcript / Found word for word | enumerate/json, text/replace (count), utility/predicate (≥ 1) |
Each quotation counted in what was said |
| The quotation, set / Only a quotation that was said / A quotation not in the transcript | text/template, utility/filter, utility/filter inverted |
The quotation in Markdown, kept or listed |
| The quotations that were said / Quotations checked / Quotations left out | aggregate/concat_text, aggregate/json ×2 |
The block for the story; the report |
| The story, in Markdown | text/template |
Headline, standfirst, body, In their words, the source |
| Direction for the picture / Paint the header | text/template, ai/text_to_image 16:9 |
The header picture |
| Read the summary aloud | ai/text_to_speech (ElevenLabs Turbo v2.5) |
The audio summary |
| Outputs | output/text ×2, output/image, output/audio, output/json ×4 |
The story, the script, the picture, the voice, the posts, the quotations checked and left out, the transcript |
Reading a run: Quotations checked gives, for each quotation, how many times it was found in what was said; a 0 means it was left out of the story and appears in Quotations left out.
Cost: 3.5 credits to transcribe six minutes (0.5 a started minute), 0.21 to write the package, 5 for the picture, 2.06 for 44 seconds of voice — 10.76 in all. Without the picture, under 6.
Install it
Section titled “Install it”The example installs into your workspace with an API key, through the public API only — see Installing an example. It uploads the briefing:
node madoo-install-example.mjs t04-briefing-to-story --api <your Madoo API URL> --key <key.json> --run--run makes the package (about 11 credits). To make your own, run the workflow with your recording and your brief.
Change it
Section titled “Change it”- Names: when the speakers are known, the brief can name them — Jane Doe, the mayor, speaks first — and the writer attributes by name. Keep the names in the brief, not in the model’s memory.
- Your languages: the posts’ languages are keys in the writer’s brief and its schema: add
frorde, or post only in one. - A longer recording: an hour transcribes in one pass; past that, cut it into segments and join the transcript, as in Long recordings.
- No picture: disconnect Paint the header and use a frame of the video or a photo of your own; the run costs under 6 credits.
- A newsletter instead of a story: change the writer’s brief; the check on quotations stays as it is.
manifest · workflow · the complete graph · the brief · the briefing