Miaw QA Lab v0.1 · in development · open source

We build games and the bots that break them.

Miaw Works is an independent game studio and tools lab from Pune, India. We make games in Unity, and we build Miaw QA Lab: a seeded bot plays your build, detectors watch for trouble, and an AI that has to cite its evidence turns thousands of log lines into a short, ranked bug list.

  • 01 records playtests
  • 02 plays the build
  • 03 catches glitches
  • 04 writes the bug report
Sandbox_Level01· navmesh_explorer rec
// simulated in your browser: the cat bot picks random reachable cells and prefers the ones it has visited least, the same rule QA Lab's navmesh_explorer follows. Magenta tile, hole, broken door, slow zone: four seeded bugs to find.
studio
Miaw Works
based
Pune, India
engine
Unity · C#
tooling
Python 3.12
license
MIT (QA Lab)
contact
miaw@miaw-works.dev
// 01 · triage, live

38 events in.
8 bugs out.

This is a real QA Lab run folder: a 55-second sandbox playtest at seed 42. Run the triage. Lines that share a root cause become one report, ranked by a formula you can read, not by a model's mood.

events.jsonl38 lines · samples/sample_run
  1. 000 0.00markerrun_start
  2. 001 0.05markerscene_loaded
  3. 002 0.10markerbot_started
  4. 003 1.00metricfps 60.1 · 16.6 ms · 412.5 MB
  5. 004 2.10actionmove_to → (4, 0, 2)
  6. 005 5.00shotshots/000001.png (periodic)
  7. 006 5.40actionmove_to → (8, 0, 5)
  8. 007 8.20actioninteract object=Door_02
  9. 008 8.21exceptionNullReferenceException: Object reference not set to an instance of an object
  10. 00910.00shotshots/000002.png (periodic)
  11. 01011.30actionopen_inventory
  12. 01111.32errorInventory slot 7 out of range (size 5)
  13. 01212.00metricfps 59.8 · 16.7 ms · 420.1 MB
  14. 01313.50warningFootstep audio clip missing for surface 'Gravel'
  15. 01414.10actionmove_to → (14, 0, 6.5)
  16. 01516.70errorInventory slot 9 out of range (size 5)
  17. 01617.20warningFootstep audio clip missing for surface 'Gravel'
  18. 01718.40actionmove_to → (20, 0, 9)
  19. 01819.05exceptionNullReferenceException: Object reference not set to an instance of an object
  20. 01920.30exceptionKeyNotFoundException: The given key 'enemy_4f2a9c1e' was not present in the dictionary.
  21. 02021.00metricfps 41.0 · 24.4 ms · 466.0 MB
  22. 02121.02detectorperf_spike [minor]
  23. 02223.10actionmove_to → (35, 0, 1)
  24. 02326.90detectorfell_out_of_world [critical]
  25. 02426.91shotshots/000003.png (detector)
  26. 02527.40actionrespawn → (2, 1.1, 2)
  27. 02629.80exceptionKeyNotFoundException: The given key 'enemy_9b03d27f' was not present in the dictionary.
  28. 02730.00shotshots/000004.png (periodic)
  29. 02831.50warningFootstep audio clip missing for surface 'Metal'
  30. 02933.00metricfps 60.0 · 16.7 ms · 431.9 MB
  31. 03034.20errorDamage: division by zero in SafeDivide
  32. 03138.60errorMovement speed: division by zero in SafeDivide
  33. 03241.00actionmove_to → (12, 0, 18)
  34. 03345.00shotshots/000005.png (periodic)
  35. 03446.00infoCheckpoint reached: CP_2
  36. 03550.00metricfps 60.2 · 16.6 ms · 433.0 MB
  37. 03655.00markerbot_stopped
  38. 03755.10markerrun_end
bugs.json8 clusters · ranked
  1. P2KeyNotFoundException in SeededEnemyRegistry.GetQAL-0001 · score 10.0 · seq 019, 026×2
  2. P3Division by zero in MathUtil.SafeDivideQAL-0002 · score 6.0 · seq 030, 031×2
  3. P3Slot out of range in SeededInventory.GetSlotQAL-0003 · score 6.0 · seq 011, 015×2
  4. P3NullReferenceException in SeededDoor.OpenQAL-0004 · score 5.0 · seq 008×1
  5. P3fell_out_of_world in Sandbox_Level01QAL-0005 · score 5.0 · seq 023 · screenshot×1
  6. P3NullReferenceException in SeededSpawner.SpawnWaveQAL-0006 · score 5.0 · seq 018×1
  7. P4Missing footstep clip in FootstepAudio.PlayQAL-0007 · score 2.58 · seq 013, 016, 028×3
  8. P4perf_spike in Sandbox_Level01QAL-0008 · score 2.0 · seq 021×1
008 · 018same message, different stack: kept as two bugs
030 · 031different message, same root frame: merged into one
8 / 8reports cite the exact events they came from

qalab triage run samples/sample_run --provider nonereal output, no model needed. The sample is hand-made test data; benchmark numbers get published once they're measured.

// 02 · ai under the hood

Real AI.
On a leash.

QA Lab calls AI APIs at four points: writing reports, finding the right design doc, reading screenshots, and embedding logs for grouping. Every answer passes through code that checks it before anyone sees it. Click a stage.

modelgemini-2.5-flashorlocal via Ollamatemp0outputJSON schemaretries2
→ request (context)
// cluster QAL-0001, built by code, not the model
signature:  KeyNotFoundException @ SeededEnemyRegistry.Get
evidence:   seq 019, 026
actions:    seq 004 move_to · 007 interact Door_02 · 017 move_to
docs:       sandbox_design.md#enemy-registry
priority:   P2   ← computed, read-only
← response (simplified; validated by pydantic)
{
  "summary": "Enemy lookup throws for ids that were never registered",
  "suspected_cause": "Spawner skips registration when a spawn point is missing",
  "evidence": [19, 26],
  "steps": [{"action_ref": 17, "text": "Walk to the spawner"}],
  "severity": "S2"
}

The model writes the words. It never picks the priority, and if its severity drifts far from the computed priority the report is flagged for review. Answers are cached in SQLite, so a re-run costs nothing.

// 03 · what we do

Three worlds.
One studio.

world 01games

We make games.

Small, systemic games built in Unity and C#. Our own titles are in development; announcements land here first.

  • Unity & C#, start to finish
  • In-house cinematic camera tools
  • Played by our own bots before people
  • Built for clean launches
the studio
world 02tools

We build QA tools.

Miaw QA Lab: open-source, AI-assisted test automation for Unity. Records playtests, plays the build, and writes the bug reports.

  • Seeded autoplay bot
  • 5 runtime bug detectors
  • AI reports via Gemini or local Ollama
  • Screenshot glitch detection
miaw qa lab
world 03partners

We pilot with studios.

We're looking for Unity teams to pilot QA Lab on a real project. We write the game adapter with you; your data can stay on your machines.

  • Adapter for your game's controls
  • Local model option (Ollama)
  • JUnit output for Jenkins & TeamCity
start a pilot
// 04 · cinematics

Lights. Camera.
Unity.

We also build in-house Unity tools for shooting cinematic shots: trailers, cutscenes and screenshots without hand-keying every camera. Try the shot types below, sketched in your browser.

Browser sketch of the shot types, not the Unity tool itself. Want to see the real thing? Ask for a reel.


// 05 · the pipeline

One command.
Six stages.

Build the player if needed, run a bot playtest and a menu crawl, check the screenshots, triage both runs, open the report.

scripts\run_pipeline.ps1 -Seed 42 -Duration 120 -Open

  1. Record

    A C# package writes every log, action, metric and screenshot to a run folder, thread-safe.

    run.json · events.jsonl
  2. Play

    A seeded bot walks the NavMesh toward places it hasn't been, or clicks through your menus.

    -qalabAdapter
  3. Watch

    Detectors flag falls out of the world, getting stuck, tunnelling, frame spikes and exception bursts, each with a screenshot.

    DetectorHub
  4. See

    Pixel checks catch magenta textures and black screens. A vision model looks only where they're blind.

    qalab vision analyze
  5. Triage

    Logs are normalised, grouped by signature and ranked P1–P4. An LLM drafts each report; every id it cites is checked.

    qalab triage run
  6. Measure

    A sandbox with 16 seeded bugs of known cause lets us score grouping and detection against ground truth.

    qalab eval
// 06 · house rules

AI that shows
its work.

A model that invents repro steps or priorities makes QA worse. These rules are enforced in code and tests, not in a slide deck.

  1. rule.01

    Priority is computed, never chosen by a model.

    weight × (1 + log2 count) × runs × crash decides P1–P4. The model may suggest severity; if it disagrees, the report is flagged.

  2. rule.02

    Every claim points at evidence.

    Evidence, action and doc ids are checked against the run. Unknown ids are dropped; a repro step with no matching bot action is marked inferred.

  3. rule.03

    Works without AI.

    --provider none writes template reports and retrieval falls back to TF-IDF. The model is an upgrade, not a dependency.

  4. rule.04

    A broken tool never breaks the game.

    A detector that throws is switched off for the run. The game keeps playing and the run keeps recording.

  5. rule.05

    Your build stays yours.

    Run a local model through Ollama and nothing leaves the machine. API keys live in .env, never in logs, caches or reports.

  6. rule.06

    No number we didn't measure.

    Every figure we publish comes from a script in the repo, with the command that reproduces it.

// 08 · build status

Honest
progress bar.

What's built, what's waiting on its first real Unity run, and what's next. Straight from the project plan.

versionstatusships
v0.1.0built · testedUnity run recording, log triage with AI reports and RAG over design docs and code
v0.2.0first Unity run pendingSeeded bot (NavMesh explorer, UI crawler), detectors, screenshots, JUnit results, one-command pipeline
v0.3.0built · not yet measuredTriage evaluation on a 20-seed benchmark: clustering precision, recall, F1
v0.4.0built · not yet measuredVision: pixel heuristics, a vision-language model and a hybrid policy, scored per label
v1.0.0nextRunning in a real game through a game adapter, triaged runs, scanner report, demo video

player 1miaw-works.dev
name
Sora
class
Founder · game developer
base
Pune, India
stack
Unity · C# · Python
mail
miaw@miaw-works.dev
// 09 · who's behind it

Founder

I make games, and I got tired of reading the same exception four hundred times. So I'm building the tool I wanted: one that plays the build, groups the noise, and never pretends it found more than it did.

Miaw Works is founder-led and built in the open. Every design decision behind QA Lab, with the alternatives we turned down, is written up in the repo, and so is every limitation.

// 10 · say miaw

Got a Unity build
that needs breaking?

miaw@miaw-works.dev

studios

Pilot QA Lab on your project. We'll write the game adapter together.

collaborators

Game dev, tools, QA automation, applied ML. Say hello.

press

Fact sheet, logos and colours on the press page.