CHANG HYUN WOO // AI ENGINEER // SEOUL

What I built. How I tested it. What I had to fix.

I design each system and decide what it has to do before it is built. Then I test it, find where it is weak, fix that, and test again until it meets the standard I set. Scroll to see the systems, how each one works, and the parts you can try yourself.

  • BASESEOUL
  • FOCUSLLM AGENTS
  • METHODMEASURE FIRST
  • STATUSBUILDING
01 // PROFILE

Set the bar.
Build. Measure.

Every number on this page has a note behind it.
The ones that went against me are here too.
STEP 01

Set the bar

Before any code exists I write down what the system must do and how we will know it does: the cases, the pass mark, and what would count as failing.

STEP 02

Code the implementation

After planning, I write the code. I read it, correct it and send hostile reviewers after it. The corrections are the record of what I actually did.

STEP 03

Measure, then believe

Held-out cases, blind labels, paired tests. When one of my own numbers turns out wrong, I retract it where I published it. Two of those are further down this page.

RECEIPTS
  • VOICE GATE // 108 HELD-OUT CASES 92.9% vs 80.9%
  • VOICE REPLY DELAY 2.09 s → 1.74 s
  • MY OWN BENCHMARK, PUBLISHED 2 of 4 rows lost
02 // LUMINA

An AI VTuber that talks back.

Discord, Telegram and spx6900.com.
Voice, text, vision, memory, games.

Lumina is a character people talk to in a voice call. She hears you, decides whether you were talking to her, answers in her own voice with a moving avatar, remembers you, and plays games on stream. Her personality is a language model I fine-tuned and run on my own GPU; small, fast classifiers around it make the yes-or-no decisions. What matters to the person talking to her is how quickly she answers.

  • 1.74 sfrom the end of your sentence to her first audio (median of 20, was 2.09 s)
  • 0.27 sto decide whether you were talking to her; the step it replaced took 0.74 s
  • 46 / 50memory-router calls correct through the live path, 0 false recalls
  • VoDshe completed Minecraft on hardcore with no human intervention; the recording is public
HOW ONE VOICE TURN WORKS
  1. 00
    Listen

    Discord voice arrives encrypted per speaker. She waits half a second to be sure you have stopped, then turns your speech into text in about a fifth of a second.

  2. 01
    Remember

    Her three nearest memories about the speaker come from a local vector store in about a tenth of a second. I removed a one-second cloud call that only decided whether to look.

  3. 02
    Gate ‖ persona

    Two things start at once: a quarter-second check decides whether she was being spoken to, and her reply starts being written. She speaks only when both are done, so the slower one sets the pace.

  4. 03
    Speak

    Her voice starts a quarter of a second later, streaming the first sentence while the rest is still being written.

  5. 04
    Lips & face

    The same audio plays on my machine, and that local playback drives her mouth, so lips match what you hear. A last quick check picks her expression.

TRY IT // 01

Run a voice turn

This replays one turn at real speed using the medians I measured on 21 Sep 2026. Switch between the old gate and the new one and run it again: with the old gate, the gate was the slower branch in 18 of 20 turns.

HEARD DELAY 0.00 s Press run.
TRY IT // 02

Set her voice gate yourself

For every line said in the call, the gate returns a probability that she should speak. Drag the cut-off and watch what happens across 108 real voice moments she had never been tested on. These are the recorded results, not a simulation. Missing someone who spoke to her is the error that matters; butting in is cheap.

0.50 // talks more0.85 // talks less
MISSED // of 61 she should answer
4
BUTTED IN // of 47 not for her
3
THE GATE IT REPLACED missed 11, butted in 10
she should answernot for herwrong at this cut-off
TRY SOME LINES

    Example lines were written by hand for testing. The 108 test moments came from real calls; only their scores are on this page, never what anyone said.

    WHAT WAS ACTUALLY HARD
    95.0% → 86.4%

    My best number was tuned on its own test

    One gate design scored 95% after I adjusted it against its mistakes. So I froze every design, fingerprinted it, had 208 fresh cases picked and labelled blind, and ran again. It fell to 86.4%. A simpler design held up at 92.9%, and that is the one that shipped.

    90 S → 12.5 S

    Ninety-second replies, blamed on the wrong feature

    The fine-tuned model wrote its stop marker as plain text instead of the special token, so generation never stopped early and every reply spent its whole 2,000-token budget. It had been blamed on a search feature shipped the same week.

    RANK 1, NEVER SEEN

    A memory bug that looked like the database

    Recall returned the right memory first, at cosine distance 0.195. It arrived as a tool message that the local server's formatter silently dropped, so the model never saw it. Retrieval was never the problem.

    HARDCORE // VOD

    She finished Minecraft on hardcore

    A planner built on a specialized algorithm drives progression, with the combat, aiming and path-cost logic written by me. The language model runs her persona and live commentary, and chooses the recovery when the planner gets stuck. No human intervention, with her persona served from my own machine. The recording is 1 h 46 min, unedited, 31 Aug 2026.

    03 // OPENVAULT

    Shared memory for coding agents.

    48 MCP tools · 193 tests · MIT.
    Live since July 2026.

    One agent writes down a status or raises a blocker. The next agent, cold, on another machine in another repo, reads it and picks up the work. Nobody relays the message. It is a Next.js app and an MCP server with a knowledge graph, a mirror of the code, and a review queue a member agent cannot approve its way around.

    • 48tools an agent can call, across notes, code, work and review
    • 155tokens for a whole project briefing, when I measured it
    • 2 of 4rows my own retrieval benchmark loses to plain grep. Both are in the README.
    • RETRACTEDmy published "33x cheaper" claim, after I found it compared two different questions
    HOW A CHANGE GETS IN WHEN THE AGENT CANNOT PUSH
    1. 00
      Get briefed

      An agent that has never seen the project asks the vault where things stand. It gets a short summary built from real notes, about 155 tokens when measured, with any proposals waiting for review.

    2. 01
      Read the mirror

      The vault keeps a copy of the code, synced from git. The agent reads the real file from that copy. It needs no clone and no access to the repository.

    3. 02
      Suggest a change

      The agent cannot push, so it files the change as exact before and after text, with a written reason. The reason is saved as a note that outlives the review.

    4. 03
      Review & apply

      Only an account with the owner or executive role can approve, and approving changes no code. The owner's agent takes the approved result, writes it into the owner's own checkout, and pushes.

    5. 04
      CI mirrors

      The push starts a workflow that copies the new commit into the vault. The suggestion then shows as applied. The vault never writes to git.

    TRY IT // 03

    Send a change through the vault

    This replays one change from an agent that cannot push, across three lanes: the agent, the vault and the owner. Click any step, or walk through with Next, to see the real tool call and what comes back. Run plays them all and can be paused. Nobody timed these steps, so the replay shows no durations.

    THE CHANGE IS AT NOT SENT YET Press run, or pick a step.

      NO TIMER // IT STAYS UNTIL YOU MOVE ON

      WHAT WAS ACTUALLY HARD
      2 OF 4 LOST

      I benchmarked it against grep and published the rows I lost

      Four questions, three mechanically checked must-mention terms each, scoring token cost and answer coverage together. Coverage exists because cost alone scores a cheap wrong answer as a win.

      RETRACTED

      Then I retracted my own headline

      I had published "33x cheaper". The code map it measured is a manifest with no source text, so the ratio compared "which files changed" with "what does the code say". Re-measured, the reading saving is near zero. The saving is on the search.

      ROLE-GATED REVIEW

      A member agent cannot approve its own work

      There are two review gates and a member is refused at both. A member agent that can push still cannot mark its own work done. An owner or executive has to approve it first, and that check is one shared implementation behind both the MCP tool and the web route, so the rule cannot drift between them. An agent that cannot push files a suggestion instead, as in the replay above. Either way the vault stores no git credential. Whoever pushes does it from their own machine.

      6 WEEKS BLIND

      The briefing hook had not fired in six weeks

      Found with a two-arm experiment, not by reading docs: a session-start matcher of "startup" never fires on resumed sessions, exactly the ones that most need a briefing. Every resumed session had silently received nothing.

      04 // SPX6900.COM

      The official site, with an arcade in it.

      The official SPX6900 site. React on Vercel.
      8 sections, 2 games, a meme maker.
      TRY IT // 04 · LUMINA RAID

      A multiplayer flight-combat game in the browser

      Three.js on the client, one Cloudflare Durable Object as the shared sector. Your browser owns your movement so it stays responsive at distance; the room owns hits and score, and caps what any single hit can claim at 160. If someone else is online you will see them.

      Lumina Raid
      LIVE DEMO // IT HAS MUSIC
      LUMINA RAID // LIVE DEMO
      Press start to play here

      Mouse steers, left click fires. The game has music: STOP ends it, and so does scrolling away.

      TRY IT // 05 · RHYTHM BLASTER

      Play one song, right here

      An aim game with no button to press: squares blast out on the beat and you score by having your cursor where each one lands. The chart is not hand-made. Your browser listens to the song, finds the beats and builds the same chart every time. This is one track from the full game, sung by Lumina.

      ALL GREEN, BROKEN

      Every test passed and no two players could see each other

      The room's id counter reset whenever Cloudflare evicted it, so every pilot was issued id 1. Every scripted test passed. It only showed up with two real browser tabs. Multi-client behaviour is tested with real clients now.

      RHYTHM BLASTER

      Charts made from the song itself

      Onset detection runs in your browser and produces the same chart every time. 14 songs, 3 difficulties, 42 public leaderboards. A flawless run scores exactly 1,000,000.

      PLAY ↗
      MEME MAKER

      Background removal on your own device

      A layered editor where preview and export share one render function, so what you see is what you save. The cut-out model (U-2-Net, about 42 MB) runs in the browser; your photo never leaves your machine.

      OPEN ↗
      05 // MORE SYSTEMS

      Smaller, still measured.

      An art bot, a game master, an audio tool
      and the site this page borrows its look from.
      AEONIFY // TELEGRAM · SINCE MAR 2024

      An art style I trained, handed to a whole community

      Artists send a photo or an idea to a Telegram bot and get it back in the Project Aeon style, the official SPX6900 NFT collection. I taught that style to an open image model from 26 examples: FLUX.1 first, moved to FLUX.2 in December 2025. It runs on my own GPU, so nobody pays per image. Inspired by Milady Station.

      • 12,838images generated since March 2024
      • 26examples were enough to teach the style

      The one call that ever broke was the captioner: an upstream model swap started returning refusals as a normal HTTP 200, and they were being drawn as art. Three failure signatures now each get their own handling.

      • Aeonify result: a silver-haired character among retro gadgets
      • Aeonify result: a character in a white and pink mecha suit
      • Aeonify result: a character holding a pink flip phone in a city street
      • Aeonify result: a dark-haired character in a blue racing suit
      • Aeonify result: a character in a blue wizard outfit on a pink sky
      • Aeonify result: a teal-haired character on a farm
      MAFIA NARRATOR // DISCORD

      A game master for voice Mafia

      Hosts Mafia in a voice call for 5 to 12 people: mutes players outside their turn, hands out roles privately, runs night actions, trials and votes. Lumina can join as a player from her own bot; her "was that said to me or about me" gate scored 23 of 24.

      PUBLIC REPO ↗
      VOCAL-EXTRACT // PYTHON

      Pulling a vocal out when you own the instrumental

      Not blind separation: it works out how the instrumental was shifted, drifted, EQ'd and limited inside the mix, applies that, and subtracts. On a mix with an offset, a gain change, inverted polarity and EQ, plain subtraction scores −3.9 dB; this scores 32 dB. About 10 seconds for a 2.5 minute song.

      06 // RECORD

      Before the agents.

      1. JAN 2025 – NOW

        AI engineer, LLM agents — SPX6900

        A community internet-culture project. I own the agent and ML stack end to end: Lumina, her fine-tuned persona model, the image bot, the game-playing agents and the site. Not the token, trading, or any financial product.

      2. JUN 2026 – NOW

        Creator — OpenVault (MIT)

        The shared-memory server for coding agents described above.

      3. SEP 2022 – NOV 2023

        VC consultant — LeePollux, Seoul

        Private investment firm of SM Entertainment founder Soo Man Lee. Led diligence on a $750K graphene manufacturing investment that returned 52.6% within four months.

      4. AUG 2021 – APR 2022

        Sergeant, interpreter — UN mission, South Sudan

        ROK engineering contingent. Worked across Arabic, English and Korean for an 8-nation engineering mission: 114 UN Engineering Task Orders and 108 km cleared of mines. Four decorations including the UN Medal.

      5. 2019

        Internships — Tullett Prebon, Seoul · MEDIANCE MEA, Cairo

        Intern broker on the interest-rate swap desk; intern copywriter, localising a site into English.

      6. 2016 – 2019

        BSc Physics — University College London

      CONTACT

      Want to see something run? Ask.