e↗entertrainment
← All project stories
Research & accessibility / PROJECT STORY

Perception–Action / Mirror Spar

A camera-based training experiment connecting tracked movement, an animated partner and musical timing.

Research module4 MIN READDEVELOPMENT ARCHIVE · OCT 2026
Real offscreen render from the native FighterRenderer with synthetic poses, 19 September 2026. Archived behaviour: the middle row predates the October targeting rewrite; this is not a live camera session.
Real offscreen render from the native FighterRenderer with synthetic poses, 19 September 2026. Archived behaviour: the middle row predates the October targeting rewrite; this is not a live camera session. Open full size ↗
PROJECT REVIEW · 18 October 2026

Inside the project

Prepared with the project’s development agent from source and retained evidence. This is a project-owner assessment, not an independent customer review. Dated checks were not rerun for this website.

A camera-based sparring trainer inside AssistantApp. A 3D animated partner throws discipline-specific techniques (boxing, Muay Thai, karate, taekwondo, wing chun, kung fu, Drunken Fist, sanda, MMA) at your tracked head and body. The fight modes judge what you actually did when each attack lands: you slipped off the line, stepped out of reach, covered the spot with your guard, or were hit. You never have to perform a named move. The partner keeps fighting whatever happens. Difficulty comes from how late he sees you (from about half a second down to a seventh of a second), how well he reads gaps in your guard, and how broken his rhythm is. His timing is written as drum phrasing: accents are power shots, ghost notes are feints. With MIDI switched on, his rhythm plays on a drum kit, and pads played into the app make him throw. The trainer is in development: the engine is extensively unit-tested, but it has not yet been accepted in a live camera round.

What stands out

  • Outcome-judged defence: any slip, step-back or cover counts, measured in units of the user's own head and shoulder size so the rule is the same at any distance
  • Continuous opponent that never pauses: presses on after landing, resets after being countered; Adaptive Opponent aims for about two in three defended
  • Never scores what it cannot see: an untracked user is not scored and is told STEP INTO VIEW
  • Latency-as-difficulty, guard-opening reads, and leading a moving target, each with a test that has a control case
  • MIDI 2.0 out (General MIDI drum map, note on the beat of impact, no hanging notes) and MIDI in (play the partner); learns phrasing from the user's own MIDI files, none bundled
  • 3D discipline-styled original fighter whose striking limb ends exactly on the scored point

Current limits

  • No accepted live round since the 2026-10-05 rebuild
  • All work is uncommitted in the AssistantApp main working tree; not released
  • Breathing rate is shown only when measurable (quiet guard); breath-phase timing not built
  • Counters are credited but not analysed for power or technique
  • On-screen aim can look a few percent off on very wide or tall windows (camera aspect-fill); scoring is unaffected
  • MIDI transport never tested against a real port or DAW

Features & evidence

Fight judge (slipped / out of reach / blocked / hit / unseen)

component-tested

Each attack judged at impact from tracked head, torso and guard

Recorded evidence

CombatFightJudgeTests 14/14, 8 planted mutants all caught (2026-10-05); in-app 194/0

Continuous fight loop and adaptation

component-tested

Next attack armed 0.1 s after each verdict; skill adapts toward 66% defended

Recorded evidence

CombatMirrorOpponentTests 15/15 incl. a 60 s round sim (2026-10-05); app BUILD SUCCEEDED 2026-10-05

Dead-UI and halt fix

source (build green)

Display-link game clock; frame-rate drawing isolated in its own hosting view

Recorded evidence

Cause measured with sample on the live debug build 2026-10-05: game tick ran 0 times in 5 s; fix built, not yet run live

Opponent mind (latency line, mirror, guard openings, lead)

component-tested

Partner perceives you 140–520 ms late, squares up, attacks uncovered surfaces, leads movement

Recorded evidence

CombatOpponentMindTests 26/26 (2026-10-05)

Tempo from bounce and breathing

component-tested

Beat locked to the user's bounce through the app's PLL clock; breathing only when measurable

Recorded evidence

CombatFightTempoTests 12/12, 7 mutants caught (2026-09-19)

Drum-phrase rhythm and MIDI file learning

component-tested

Accent / stroke / ghost phrases, cross-rhythms, Markov model learned from the user's SMF files

Recorded evidence

CombatFightRhythmTests 15/15 (2026-09-19)

MIDI 2.0 in/out

component-tested

Partner notes out on the impact beat; virtual input 'Flash-Dodge Partner In'

Recorded evidence

CombatFightMIDIPortTests 7/7 (2026-09-19); no real-port test

3D sparring partner

component-tested

Original fighter (not a likeness of any existing character), nine discipline kits, perspective IK

Recorded evidence

CombatFighterTests 16/16; mirrored stance: worst limb stretch 1.13x over 12,672 poses (2026-10-05)

Movement analyser (velocity, kinetic chain, snap)

component-tested

Strike speed, sequencing and onset-to-peak from pose; adopts SemanticCompute masked Savitzky–Golay

Recorded evidence

Analyser/Signal/Engines suites plus SC parity 9/9 against SC main (2026-09-19)

Drills (Mixed, Combinations, Dodge/Attack Target, No-Go Feints)

source

Named-response reaction drills

Recorded evidence

Pre-existing; text enlarged 2026-10-05; live-scoring weakness documented

Review updates & corrections
  • The 17 Oct bio says 'fight engine rebuilt after one live report, 194 tests, uncommitted, no live round accepted'. That is still accurate; nothing in this lane has changed since 2026-10-05.
  • Caption correction: row 2 of mirror-spar-stance.png (sweep) shows pre-10-05 behaviour; in the fight modes, drill sweeps are now thrown as hooks/crosses aimed at the user.
  • The bio's '8.5k-line module' understates it: the monolith is ~9.9k lines plus about 10 separate engine files.

Workflow walkthrough

A guide to the native workflow. These steps describe the app; only the recordings and images embedded on this page are available as website demonstrations.

  1. Open AssistantApp, then Flash-Dodge Trainer (camera permission required)
  2. Pick a discipline, choose drill Adaptive Opponent or Mirror Spar, set Reactions (Mirror Spar), press START SPAR
  3. Stand in view, guard up; the partner throws at your head or body
  4. Slip, step back or cover; one big word per exchange (SLIPPED / BLOCKED / HIT / COUNTER) and DEFENDED · HIT · COUNTERS totals
  5. Space pauses; the 'Your partner' card shows his latency, the beat source, breathing and what he aimed at
  6. Optional: turn on Partner on MIDI and route his drums to Logic, or play pads into 'Flash-Dodge Partner In'
Planned captures · not yet available
  • A live round of Adaptive Opponent

Explore the connections.

Browse all project stories ↗