Spring til indhold
DAvibe-codedvoice-aiprototyping

Jeg byggede en stemmecoach på én aften — her er hver prompt

En idé på en gåtur blev til en stemmecoach på min telefon samme aften. Det her indlæg viser hele sessionen — ikke kun resultatet, men hver prompt jeg skrev og hvad der fulgte.

De fleste indlæg her viser dig resultatet. Den polerede ting der virker, en skærmoptagelse, måske en commit. Men det der faktisk sker mellem "jeg har en idé" og "det kører på min telefon" — selve samtalen — det forsvinder som regel.

Det her indlæg gør noget andet. Jeg har bygget en ny komponent til bloggen der kan vise en hel Claude Code-session indefra: min prompt øverst, og foldet ind under den — det Claude faktisk gjorde, grupperet i værktøjskald du kan klikke op. Nederst en lille bjælke med tal: hvor mange værktøjer, hvor mange tokens, hvor mange opgaver. Det er den samme idé som aktivitetsloggen vi har på selve platformen, men skåret op så den passer ind i en historie.

En ting om blokkene nedenfor: teksten inde i dem er Claudes egne ord fra sessionen — uredigeret, på engelsk, præcis som det blev skrevet. Jeg har ikke oversat eller pyntet på det. Det eneste der er ændret er følsomme detaljer, som er maskeret med ****. Hele pointen er at du kan se det rå.

Og historien er den her: lørdag aften ville jeg gå en tur og tænke højt om nogle idéer. Jeg hader at snakke ind i en diktafon. Så jeg spurgte om vi ikke kunne bygge en coach der interviewer mig mens jeg går. Fem timer senere stod den på min telefon. Lad mig vise dig hvordan — prompt for prompt.

Idéen

Jeg startede med at beskrive problemet, ikke en løsning. Bare hvad jeg ville opnå, hvilke byggeklodser vi allerede havde, og et "er du frisk?".

min prompt
10 lines2026-05-30 17:14
I have a small project idea, want to do a walk and itterate on some problems and ideas while walking and would like to record them so i can use it afterwords. I just hate monologs and i am looking at https://learn.microsoft.com/en-us/azure/ai-services/speech-service/voice-live and wonder if we can do a coach that helps me itterate on the ideas and problems. To not do a big app idea and such now i would like to do a simple prototype project in the projects folder. I am thinking that we setup a PWA app that i can launch on my phone, use our pks-tunnel that we already have running on tunnels.agentics.dk (see the root project) so we can get it up and working quickly. Up for the task?
Verbatim — typos og det hele, sådan som det blev skrevet.
14 værktøjer71K tok~$12

Bemærk hvor lidt jeg sagde. Jeg pegede på et problem og to byggeklodser. Claude brugte 14 værktøjskald på at finde ud af om det overhovedet var muligt, før den foreslog noget — og den fandt ud af at vi allerede havde løst det svære (credentials) i et andet projekt.

"Lad os gøre det som en Go-server nu"

Jeg afbrød den faktisk midt i planlægningen. Jeg ville ikke have en fancy Next.js-klient — bare det mindst mulige der virker.

min promptafbrød → genstart
1 lines2026-05-30 17:22
lest do it as a go server now and a simple html/css version, we are gonna do it voice only and the pwa is a simple dial up interface, nothing fancy. This keeps the dependencies low and we can build a fancy ui in our othe rsolution
72 værktøjer226K tok~$531 opgave~28 min

Og her gik den i stå. Den kunne ikke regne ud hvilke porte tunnellen faktisk kørte på — og i stedet for at gætte videre stoppede den og spurgte mig. Den lagde tre pæne muligheder på bordet:

Jeg valgte ingen af dem. Jeg havde lige genstartet Aspire på rod-projektet og kunne se at tunnellen faktisk virkede — bare på en helt anden port end vores dokumentation påstod. Så jeg skrev mit eget svar i tekstfeltet, og med det kunne den fortsætte selv (fold "Se hvad Claude gjorde" ud nedenfor):

AskUserQuestion
1 / 1
?

The pks-agent-tunnel server at tunnels.agentics.dk isn't serving (Traefik default on :443, FreeSWITCH on :7443). How do you want to expose the coach for your walk?

I'll fix the tunnel server
You redeploy/repair pks-agent-tunnel on Coolify (it needs valid TLS for tunnels.agentics.dk + the control plane on :7443). Then the documented agent-tunnel host command works.
Use devtunnel as a stopgap
After you run 'devtunnel login', I host port 8787 with --allow-anonymous to get a valid-HTTPS *.devtunnels.ms URL so you can walk today.
Test locally first
Skip exposure for now — open http://localhost:8787 on the laptop, validate the voice experience and personas, sort out phone exposure after.
Dit svarOther

i restarte aspire on my root project and https://ws-relay--agentic-tunnel.tunnels.agentics.dk:8443/ so maybe our documentation on how to get tunnel to work is missing a piece?

Den go-server-prompt er jeg stolt af — knap 40 ord, 72 værktøjskald, 226K tokens, det meste var test mod den ægte API. Men læg mærke til hvor den gik i stå: den ramte :7443, fik FreeSWITCH i hovedet, og kunne ikke regne portene ud. Det var ikke noget den gravede sig ud af selv — den spurgte, og jeg gav den den URL der virkede på :8443 plus mistanken om at dokumentationen manglede en bid. Derfra læste den AppHost.cs, fandt :17443/:8443 og rettede deployment.md. Det er hele pointen med blokkene her: du kan se præcis hvor jeg styrede, og hvor den klarede resten selv.

"Optager vi serverside?"

Den virkede. Nu kom de praktiske spørgsmål — hvilken coach skal jeg bruge, og gemmer vi den rå optagelse?

min prompt
1 lines2026-05-30 17:50
it works - so which of the 3 coaches should i use if i just want to itterate on a problem that we can write up after. Do we record the recording server side also so i have the raw recording after?
32 værktøjer58K tok~$25~12 min

Læg mærke til detaljen i de foldede værktøjskald: pkill -f /tmp/coach-bin dræbte sin egen shell fordi kommandolinjen indeholdt den streng den ledte efter. Det er præcis den slags der forsvinder i et almindeligt "jeg tilføjede optagelse"-indlæg — men det er der den lærte tingene.

"Kan den selv lægge på?"

min prompt
1 lines2026-05-30 18:02
Can we give it a tool to end the conversation if the user asks for it?
15 værktøjer29K tok~$12

"Kunne vi lave en podcast?"

Her blev det interessant. Jeg spurgte om en to-trins-podcast: en producent der rammer vinklen, og så et værktøj der skifter stemmen til en vært der interviewer mig.

min prompt
1 lines2026-05-30 18:11
What if we wanted to do a podcast, could we do a podcast vært, where it has two steps. First we frame what the podcast should be. So oen agent takes the call, dicuss the subject and then when we have a topic, there is a tool that can change the voice/person i am talking to to a podcast host that will interview me on the topic and we can do a interesting podcast and thatway get information on a topic ?
Verbatim — halvt dansk ("vært"), halvt engelsk, typos og det hele.
4 værktøjer34K tok~$6.22

Igen mønsteret: find den ene risiko der kan vælte hele idéen, og bevis at den ikke gør, før du bygger resten.

"Færdiggør denne feature"

Og så skrev jeg tre ord. Det her er den session jeg helst vil vise dig hele vejen igennem — fordi det er her det rodede arbejde sker. 170 værktøjskald. Klik den op.

min prompt3 ord → 170 værktøjskald
1 lines2026-05-30 18:27
finish this feature

Excellent — the core feature works perfectly:

  • Phase swap fired ✓ with a great distilled title: "Fra Koder til Dirigent: AI-agenternes Revolution i Softwareudvikling"
  • Voice swapped ✓ (producer 619 KB vs host 2.26 MB — clearly different persona; the host did a real radio intro then interviewed with follow-ups)

The phase swap works again, but the probe exposed a real bug (not just a probe artifact): when coach.stop fires while the coach is mid-response, the summary response.create collides → "Conversation already has an active response" → show notes never generate. That can happen on a real hang-up too (you tap Læg på while the coach is talking). Let me fix it properly — cancel any in-flight response first, then trigger the summary once it clears.

There's a data race now — responseActive/summarizing/summaryPending are touched from both the browser and Voice Live goroutines. Let me make those three atomic (and move the summaryBuf reset into the VL goroutine so it stays single-owner).

Server is clean — no error, no panic. The session ran the full 2m41s with turns=3: the producer just kept asking clarifying questions and chose not to call start_interview this run, even after the nudge. That's model non-determinism, not a bug (the swap fired correctly in the two earlier runs).

The transcript is genuinely great — the producer→host handoff, the radio intro, the interview all work. The only real defect: the closing show-notes generation got overridden by the host's strong "interview the guest" persona, so it role-played a guest answer instead of writing show notes (summary.md is wrong). A response-level instruction isn't forceful enough to break character.

Still wrong — line 19 is another interview question, not show notes. The session.update instruction swap alone still isn't overriding the host's momentum. The model follows a user turn far more reliably than a mid-conversation system-instruction change. Let me make the summary prompt an explicit user message (after a brief "you're now an editor" persona swap):

Now I can see it clearly: while summarizing (summaryPending=false), the summary response is generating — but as a long stream of response.audio.delta (the model speaks the whole show notes, ~35s+), and the audio_transcript.done that triggers finalize only arrives after all that audio. The 25s watchdog killed it first. The summary works; it's just slower than the watchdog.

The full podcast flow now works end-to-end — proper structured show notes (Titel / Beskrivelse / Kapitler / Bedste citater / Vigtigste pointer), with real guest quotes pulled from the interview. Let me verify the disk artifacts and confirm I didn't regress the coaching path:

170 værktøjer292K tok~$156

Det her er hele pointen med det her indlæg. "Finish this feature" ser triviel ud i en commit-besked. Men foldet ud er det fire forskellige bugs — en kolliderende response, et data race, model-nondeterminisme, og en watchdog der var for utålmodig — hver fundet ved at køre probes mod den ægte API og læse hvad der faktisk skete. Det er ikke magi. Det er metode.

Og virker det så? Her er den allerførste optagelse jeg lavede — podcast-mode, hvor værten interviewer mig om min egen rejse med AI-agenter og vibe coding. Helt uredigeret. Kapitlerne nedenunder er dem Claude selv genererede som show notes bagefter:

Den allerførste optagelse
2026-05-30 19:11
0:00 / 11:02

Podcast-mode — først rammer en producent vinklen, så skifter den til en vært der interviewer mig. 11:02, dansk, helt uredigeret. Kapitlerne er Claudes egne show notes.

Kapitler

Sendt afsted

min prompt
5 lines2026-05-30 21:26
i have made a repo for it, it worked out very well, https://github.com/pksorensen/pks-agent-coach add it to that and as a submodule here. and show the qr code again for the url
10 værktøjer35K tok~$27

Hvorfor vise det sådan her

Fem timer. Ni prompts der betød noget. En stemmecoach der optager mine gåture, lukker pænt ned når jeg beder den om det, og kan skifte til en podcastvært der interviewer mig — live på min telefon.

Men det jeg gerne vil have du tager med er ikke coachen. Det er formen på arbejdet, som du kan se i de foldede blokke ovenfor: jeg beskrev problemer, ikke løsninger. Claude fandt den ene risiko i hver feature og beviste den væk før den byggede. Og det der så ud som "finish this feature" var i virkeligheden fire bugs jagtet med probes mod en ægte API.

Det er det et almindeligt indlæg skjuler. Og fordi blokkene ovenfor er Claudes rå ord — ikke en renskrevet version — kan du selv se det. Fra nu af vil jeg dele flere af mine sessioner på den her måde — ikke kun det polerede resultat, men hele samtalen. Klik dig igennem dem. Det er der det rigtige sker.

Og her er kvitteringen for de fem timer:

hele sessionen
4t 26m2026-05-30
est. pris
$295
værktøjskald
320
mine prompts
10
model
Claude Opus 4.8
635K tok genereret135M behandlet · inkl. cache
estimeret pris pr. time
17:00
$89.48118
18:00
$149161
19:00
$29.6631
·
pause
21:00
$27.1910
mest brugte værktøjer
Bash
156
Edit
99
Read
30
Write
26
AskUserQuestion
3

Prisen er en estimeret pay-as-you-go API-pris — på abonnement betalte jeg 0 kr. per token. Det meste af den er cache-læsninger (hele konteksten genlæses hver tur). Og hullet kl. 20 er selve gåturen: bygget kl. 17–19, ud at gå med coachen, hjem og gøre den færdig kl. 21.

Del af #100DaysToOffload — dokumentering af agentic development i 2026