{"slug": "audition-the-voice-before-you-commission-the-work", "title": "Audition the voice before you commission the work", "summary": "A developer at olund.dev built a preview agent that lets users audition a configured editorial voice before commissioning full-length content generation. The tool solves the write-only problem of prose-based tone configs by providing near-instant sample lines, enabling rapid iteration without costly full generation runs. The design emphasizes subtraction: a minimal prompt, synchronous API with a two-minute timeout, and no state mutations.", "body_md": "*Originally published at olund.dev.*\n\nPart of my tooling generates long-form written content in a configured\n\nvoice: an editorial identity that describes the audience, the register, the\n\nvocabulary, what the writer sounds like. The identity is prose in a config.\n\nAnd prose configs for tone have a nasty property: they are write-only. You\n\ndescribe the voice you want (\"unhurried, curious, explains from first\n\nprinciples, never hypey\"), the generator consumes it, and you learn whether\n\nyour description *worked* only after paying for a full generation run and\n\nreading the result. If the register is off, you edit adjectives and pay\n\nagain.\n\nThe feedback loop is the problem. Tuning a persona through full generations\n\nis like adjusting a recipe by catering a wedding each time. What I wanted\n\nwas a taste: given this identity, say two lines in this voice, right now,\n\nfor approximately nothing.\n\nThe fix is a preview agent, and the design goal was to make it as close to\n\nfree as an LLM call gets - because a preview you hesitate to run is a\n\npreview that does not get run. Everything about it is subtraction:\n\nThe prompt side is one rule repeated three ways: match the identity's tone,\n\nregister, and vocabulary precisely; each line must be a speakable line of prose\n\non its own; do not perform meta-commentary. Sample lines that *describe*\n\nthe voice instead of *being* the voice are the failure mode, and the\n\ninstructions attack it directly.\n\nIn the settings UI, next to the identity editor, there is a sample button.\n\nType an optional topic, click, and a moment later: a handful of lines in\n\nthe configured voice. Edit the identity, sample again. The tuning loop\n\ndrops from \"generate a full piece, read it, wince\" to seconds per\n\niteration.\n\nTwo UI decisions carry more weight than they look like they should:\n\n**The preview invalidates nothing.** It is a plain fire-and-return call\n\nwith no cache updates, because it changes no state. Wiring a preview into\n\nthe app's data layer as if it were a mutation is a category error that\n\nmakes every preview cost a refetch.\n\n**The empty state teaches.** With no identity configured, the button does\n\nnot disable silently; the endpoint refuses with \"identity is unset\" and the\n\nUI says so. A preview feature whose precondition is invisible reads as\n\nbroken.\n\nThere is also a seam decision underneath: the route awaits the worker\n\nsynchronously, bounded at two minutes, instead of returning a job id the\n\nclient polls. Previews are interactive - the human is sitting there. The\n\nmoment a preview needs a progress bar, it has failed at being a preview,\n\nso the API shape encodes the latency budget: if this cannot answer while\n\nthe user watches, it should error, not stream status updates.\n\nThe general shape: **when a system consumes a human-authored description\nand produces something expensive, insert the cheapest possible sampler\nbetween the two.** The description-to-output gap is where confidence\n\nSamplers earn their place when they are:\n\nI now reach for this shape whenever a prose config drives generation:\n\nsample the persona before the piece, the summary style before the batch,\n\nthe reviewer's severity before the review run. Each sampler is an\n\nafternoon of work, because subtraction is fast to build - the entire agent\n\ndefinition fits on one screen, and the worker runtime it rides on already\n\nexisted.\n\nThe quiet lesson underneath is about model routing. The instinct is to\n\nsend every task to the strongest model available. But a preview's job is\n\nto be *representative and immediate*, not maximal - and a small local\n\nmodel with a tight schema and inline context is more representative of\n\n\"what will the configured voice sound like\" than a frontier model\n\nimprovising with more freedom. Match the worker to the narrowness of the\n\ntask, and some tasks turn out to be nearly free.", "url": "https://wpnews.pro/news/audition-the-voice-before-you-commission-the-work", "canonical_source": "https://dev.to/olund/audition-the-voice-before-you-commission-the-work-39ic", "published_at": "2026-07-29 10:15:11+00:00", "updated_at": "2026-07-29 10:37:24.124414+00:00", "lang": "en", "topics": ["developer-tools", "generative-ai", "large-language-models", "ai-tools"], "entities": ["olund.dev"], "alternates": {"html": "https://wpnews.pro/news/audition-the-voice-before-you-commission-the-work", "markdown": "https://wpnews.pro/news/audition-the-voice-before-you-commission-the-work.md", "text": "https://wpnews.pro/news/audition-the-voice-before-you-commission-the-work.txt", "jsonld": "https://wpnews.pro/news/audition-the-voice-before-you-commission-the-work.jsonld"}}