Genshin Parity

SkillMonitoring & ops

Apply when building or changing a Genshin screen or scene (loading, login, menus, prompts, HUD, the world) to match the game, tracing a glyph, measuring a reference, extracting or fitting to the game's assets, matching an animation, recreating a piece of its music, or touching packages/genshin-world's or packages/genshin-interface's components, parity page or visual suites, or scripts/src/genshinParity. Esposter's image-driven loop, references outside the repo, a screen per component with a fixture, one command to shoot, score and diff it, a 3D scene re-derived by inventory, calibration and priced losses rather than tuned on its frame, and a visual suite holding every approved screen.

Instructions available. Your AI can read the instructions. Execution depends on the setup they require.

Add ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.

Then ask your AI: use the Genshin Parity skill

What this skill tells your AI

The instructions your AI receives, as published by esposter/esposter in .agents/skills/genshin-parity/SKILL.md and read by ahel’s review.

The loop and why it is shaped this way are apps/web/content/docs/genshin/parity.md. This skill is the rules each step follows.

Settled — do not re-propose

  • Committing a reference. Screenshots, recordings and wiki images of the game live in ~/Esposter/genshin-parity (PARITY_DIRECTORY) and never enter the repository. Only ParityReferenceMap names them, by wiki title or by a recording in captures and the second to take (capture, seconds).
  • Asking the user to record what is published. Text, wording, marks and screens come from a search first: the wiki (its API, list=search&srnamespace=6 for files), the community data dumps for in-game text, and public videos, fetched with yt-dlp from a throwaway virtual environment in the scratchpad (--download-sections for the minutes needed) into captures. Record the game only for what nothing published shows, or ask the user for a picture when a search engine refuses a script (image search does).
  • Sending input to the game. The tool launches and records the game; the user plays. Injected input is botting under its terms, with an anti-cheat driver watching.
  • Rendering a screen through Nuxt to check it. A screen renders on the world package's parity page on plain Vite, up in about a second; a Nuxt build per check was the cost that sank the old screenshot suite.
  • A hand-kept list of screens. A screen is on the page and in the suite by having an Index.fixture.ts beside its Index.vue, and is named by the package's own barrel.
  • Shipping or committing anything taken from the game's files, converted or not. Extracted assets are references like any screenshot; what ships is our re-derivation, our shaders, generators and fitted data, so the one render path is our own. Short of that line a re-derivation has no fidelity ceiling: the goal is the browser showing what the game shows. The witness render, which draws the exports through our engine on the parity page in development, is how that path is measured and never ships (apps/web/content/docs/proposals/genshin/scene-derivation.md).
  • Decrypting the game's code metadata, or injecting anything into the running game, to read a script's fields or capture its frames. What the exporter dumps is read as a reference: a shader asset, and a MonoBehaviour's raw serialized bytes, scanned without type data for the pointers and values whose shape names them.
  • A genshin-assets package. Nothing extracted is committed, so it would be empty; the extraction and the fitting transforms are tooling in scripts, and what they emit is data beside the component reading it. The packages stay three: genshin-engine (game-agnostic rendering), genshin-interface (the game's 2D interface, no three.js, so an interface-only page never loads it) and genshin-world (the game's content: its regions, scenes and screens).
  • Tracing below full resolution. A trace starts from the source's full resolution, never reduced, and enlarges a small mark before tracing it.
  • Gating the music's noise on how much of a band lies on our partials. No share tells the lowest band from 125 Hz, both above nine tenths on partials, so the gate that clears the lowest band's overfill takes 125 Hz's noise too and lowers pitch agreement; through the noise solve's own masks, which carry each note's ring, it shuts nearly every band. The overfill is the player's noise playing in step across notes (apps/web/content/docs/genshin/music.md, "Not yet").
  • Masking a note's partials in the noise solve through its voice's whole release rather than MUSIC_RELEASE_SECONDS. Too few readings are left and they decide the solve: the bass's 125 Hz noise rose several times over and pitch agreement fell.
  • Subtracting a synthesis of our own tones before reading the noise. A note's envelope spreads next to nothing past the partials' clearance, so the noise barely moves.
  • Starting a note's noise between two sample frames, at its exact time with an offset in the loop. Its loop is then read between samples, which loses about half the top band; a whole-sample offset alone changes nothing while the start lies between frames, so the start is rounded to a frame as well (apps/web/content/docs/genshin/music.md, "Not yet").
  • Choosing a recorded instrument by its fitted profile. Ranking candidates through fitInstrument by harmonics and envelope picked a cello that overfilled the band at 125 Hz: that ranking charges a faint high overtone as much as a loud low one (apps/web/content/docs/proposals/genshin/sampled-instruments.md, "What the passes found").
  • Carrying a tuning from a recorded instrument's own fit. Each library's mappings already tune its recordings to within about ten cents, so a voice keeps the game's fitted tuning; the cello's own fit read half a semitone sharp (apps/web/content/docs/proposals/genshin/sampled-instruments.md, "What the passes found").
  • Choosing recorded instruments by the bands alone. The bands are blind to pitch, and their choice, timpani on the top voice among them, cost both pieces pitch agreement; a candidate keeps its voice's pitch as well as pure tones do, and a mix is ranked by its whole listening score (apps/web/content/docs/proposals/genshin/sampled-instruments.md, "What the passes found").
  • Looking in the sampled render for a pitch loss every recording shares. genshin:parity solos reads pianos, harps and plucked strings at or past pure tones' agreement in every voice of both pieces; the loss was the instruments chosen (apps/web/content/docs/proposals/genshin/sampled-instruments.md, "What the passes found").
  • Carrying the game's swells in each note's velocity. A velocity is fixed when its note starts, and a section swells under notes already sounding; each segment's expression carries it, as an orchestral mockup's expression controller does (apps/web/content/docs/genshin/music.md).
  • A fixed equaliser over the shipped music. Its band gains, fitted on one half of a piece, leave the other half about as far off as before, so what it gains in place is that stretch's frames rather than the music's balance (apps/web/content/docs/genshin/music.md).
  • A reverb to close what the recorded instruments leave. The best mixes' largest band gaps do not move with a note's age, so they are short of spectrum rather than ring, and a reverb only lengthens what a note already holds (apps/web/content/docs/proposals/genshin/sampled-instruments.md, "What the passes found").
  • Joining a transcribed note to the one before it at its pitch where the game's fundamental does not rise at its start. attacks reads no fewer jumps and both pieces lose pitch agreement, since a joined note then sits on its decay where the game's holds (apps/web/content/docs/genshin/music.md, "Not yet").
  • Taking a note's level and decay at the frame the voice's median attack predicts, not at the note's loudest frame. The first piece then barely decays, jumps far less often than the game's and loses pitch agreement (apps/web/content/docs/genshin/music.md, "Not yet").
  • A decay per octave of overtones on the synthesizer. The fit reads the second piece's overtones dying faster than their fundamentals, yet playing it moves neither score, for an oscillator an octave on every note (apps/web/content/docs/genshin/music.md, "Not yet").
  • Holding the first piece's pitch with the catalogue's recordings by their levels, by two layered on a voice or by an octave equaliser on each voice. Solved for pitch alone, none reaches the synthesizer's agreement, and the equaliser held out across time stays further under it (apps/web/content/docs/proposals/genshin/sampled-instruments.md, "What the passes found").
  • Keeping noise levels past MUSIC_DECIMALS. It moves the listening score by hundredths of a decibel.

Rules

  • Numbers before looking. Run pnpm -C scripts genshin:parity compare <reference> and read the mean and the grid; zoom only on a cell that stands out. Target a mean of hundredths of a percent, with any remainder explained (antialiasing along an edge). The run rewrites its row of the committed ParityReferenceMap.snapshot.md (--all every row), which is committed with the change that moved it and is the only score a session quotes.
  • A component is a PascalCase folder under a PascalCase section, named by its path as Nuxt names the app's: packages/genshin-world/src/components/<Section>/<Name>/Index.vue exports as <Section><Name> (Login/Screen is LoginScreen), and its fixture, browser tests, approved images and game reference sit beside it as Index.fixture.ts, Index.browser.test.ts, Index.<platform>.png and Index.reference.ts. Props in, events out, no store. A section is a part of the game (Game, Splash, Loading, Login, World, then Menu, Hud, Map as they come), and Game/Opening owns every handoff between the screens it shows, so a host mounts it once. A piece more than one screen uses is a genshin-interface component, never a shared folder here. Services and models mirror the section in lowercase (services/login/, with a part's own constants beside its code: services/login/tower/constants.ts), and an exported map is a file of its own. The app wires a screen to its stores; AgentConsole/Panel/Opening.vue is the pattern.
  • No reference, no approval. A screen's size, colour and place are measured from a reference in its own language and build, never carried over from another client's or guessed; a value with no reference is not shipped. ParityReferenceMap.test.ts fails for any fixture (not isMotionOnly) no reference names, so a screen that was never compared cannot reach the suite. A public video that letterboxes the game (a phone, a window) is cropped to the game's screen with the reference's crop, and scored over a region clear of watermarks; its edges are the video's softness, so a clean score there is an outline of about a percent.
  • Approve with the visual suite once compare is clean. pnpm -C packages/genshin-world test:visual --run -u, then commit the image, Index.<platform>.png beside the component, with it. A fixture's variants are further states, each approved as Index-<variant>.<platform>.png (FIXTURE_VARIANT_SEPARATOR, a dash, since the repository's ID_SEPARATOR is a character Windows rejects in a file name). A new image fails its first run, the one that writes it. genshin-interface's components have the same fixtures and images, shot to their own box at 1080 high, and its suite fails for a component without a fixture.
  • Derive a screen in the page's order (apps/web/content/docs/genshin/parity.md, "Deriving a screen"): published sources first, then the screen's blocks through an indexed asset, its DerivedAssetComponentMap entry (names, roots, interface root and anchor, clipPattern), then genshin:assets extract, shaders, inventory, interface, clips and witness. An interface piece is placed from its rect in the interface tree and moved by its decoded clip; a 3D piece goes through the scene derivation. Exact data outranks measurement: a recording measures only what is fieldless (a layout group's spacing, a script's settings).
  • Read a component's Index.reference.ts before searching, and write every result into it. It holds every piece of the game's data the component derives from (kind, block, path ID, name, role) by a key a derived value cites, each search run with what it found (dead ends too), and what is open; how each kind of data reads and the shortcuts to reach for first are apps/web/content/docs/genshin/game-data-formats.md. Metadata only, never a value or a pixel of the game's.
  • Reach for the unknown's tool before a pass. references/toolbox.md names the tool that answers each unknown; a loop that has not converged in two passes is missing one, and the recreation-tooling skill is how it is found and built.
  • A tool earns its place by the benchmark. The only reward line is faithfulness to the game, which compare's committed report and a scene's ranking (rank) score. A tool stays while it produces or reads those scores, or supplies exact data that moves them; one that has done neither through a derivation, a scratch solver or a superseded cost, is deleted rather than kept for later. A committed score taken where nothing fits (a loss table at an unsolved pose) is noise and is not committed.
  • The parity page is pnpm -C packages/genshin-world parity, on port 3002, and the tool pnpm -C scripts genshin:parity, run through tsx for its enums, started in the background before compare or shoot.

Reference pages

  • references/toolbox.md — before any pass on a screen or scene, and whenever a loop stalls: which tool answers each unknown.
  • references/interface.md — when laying out, styling, setting text on or comparing a 2D screen.
  • references/glyphs.md — when a mark, a logo or an element glyph is traced, found as a vector or filled.
  • references/motion.md — when recording the game, reading a timing off a recording, holding a screen's motion or testing what only a browser plays.
  • references/scene.md — when deriving, arranging, fitting, lighting or posing a 3D scene, or running a witness solve.
  • references/music.md — when recreating a piece of the game's music, or changing its fit, its player or listen.

Signals

GitHub stars
23
Forks
3
Last commit
Oct 2026
Advanced
Item type
skill
Key
genshin-parity
Source
github.com/esposter/esposter