Genshin Parity
SkillMonitoring & opsApply 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.
Account requirements not reviewed. Check the skill instructions before use; ahel provides instructions and does not run this skill.
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. OnlyParityReferenceMapnames them, by wiki title or by a recording incapturesand 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=6for 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-sectionsfor the minutes needed) intocaptures. 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.tsbeside itsIndex.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-assetspackage. Nothing extracted is committed, so it would be empty; the extraction and the fitting transforms are tooling inscripts, 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) andgenshin-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
fitInstrumentby 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 solosreads 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.
attacksreads 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 committedParityReferenceMap.snapshot.md(--allevery 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.vueexports as<Section><Name>(Login/ScreenisLoginScreen), and its fixture, browser tests, approved images and game reference sit beside it asIndex.fixture.ts,Index.browser.test.ts,Index.<platform>.pngandIndex.reference.ts. Props in, events out, no store. A section is a part of the game (Game,Splash,Loading,Login,World, thenMenu,Hud,Mapas they come), andGame/Openingowns every handoff between the screens it shows, so a host mounts it once. A piece more than one screen uses is agenshin-interfacecomponent, 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.vueis 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.tsfails for any fixture (notisMotionOnly) 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'scrop, and scored over aregionclear 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
compareis clean.pnpm -C packages/genshin-world test:visual --run -u, then commit the image,Index.<platform>.pngbeside the component, with it. A fixture'svariantsare further states, each approved asIndex-<variant>.<platform>.png(FIXTURE_VARIANT_SEPARATOR, a dash, since the repository'sID_SEPARATORis 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, itsDerivedAssetComponentMapentry (names, roots,interfaceroot and anchor,clipPattern), thengenshin:assets extract,shaders,inventory,interface,clipsandwitness. 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.tsbefore 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 areapps/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.mdnames the tool that answers each unknown; a loop that has not converged in two passes is missing one, and therecreation-toolingskill 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 toolpnpm -C scripts genshin:parity, run throughtsxfor its enums, started in the background beforecompareorshoot.
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 orlisten.
Signals
- GitHub stars
- 23
- Forks
- 3
- Last commit
- Oct 2026
Advanced
- Item type
- skill
- Key
genshin-parity- Source
- github.com/esposter/esposter
Related picks
Skill · thedaviddias
The pick for JavaScriptmodern-javascript-patterns
Skill · wshobson
The pick for JavaScriptsetup-ts-deep-modules
Skill · mattpocock
The pick for TypeScripttypescript-pro
Skill · jeffallan
The pick for TypeScriptnuxt
Skill · yamcodes
The pick for Nuxterror-tracking-nuxt
Skill · posthog
The pick for Nuxt