Synthèse automatique
Ce skill audite les écarts de compatibilité entre les moteurs hérités Gamebryo 2.3 / Creation et le moteur Redux, en se concentrant sur les mathématiques de coordonnées et de placement, la vérification croisée des sous-systèmes hérités et les motifs de traduction inter-jeux.
Points forts
- Délimite explicitement son périmètre par rapport aux audits voisins (/audit-nifal, /audit-physics, /audit-exterior) pour éviter les doublons
- Fournit des chemins de fichiers, des tests de garde nommés et des commandes git log/grep concrètes comme première étape
- Distingue clairement les limitations documentées des vrais findings, avec renvoi aux inventaires de fuites des specs de couche
Limites
- Fortement couplé à l'arborescence d'un dépôt privé et à des documents de spécification internes non fournis
- Suppose un point de montage de sources Gamebryo 2.3 ou des copies de secours dans docs/legacy/
- Le texte du skill est tronqué et présuppose une connaissance approfondie du pipeline NIF/ECS de Redux
À utiliser après une modification du code de coordonnées, d'Euler ou de traduction de cellules, pour vérifier qu'aucune régression de placement ou de correspondance héritée n'a été introduite.
À ne pas utiliser pour auditer les internes d'une couche précise (NIFAL, PHYSAL, EXAL) ni pour une revue de code générale hors de ce dépôt.
Analyse de sécurité
PrudenceThe content is a read-only code-audit playbook: it greps, reads specs, inspects git history and diffs, and writes a local markdown report. There is no destructive command, no curl|sh, no obfuscated payload, no secret handling, and no attempt to alter the auditor's role or bypass safety. Risk is limited to ordinary shell/network use (`gh`) and local file writes, hence caution rather than safe.
- •No allowed-tools are declared, yet the procedure instructs the agent to run shell tooling (`git log`, `grep -rn`, `gh issue list`) and to write a report file into `docs/audits/`; this is legitimate read-only auditing but is un-declared capability use.
- •`gh issue list --search ...` invokes the GitHub CLI over the network with ambient credentials; scope should be confirmed before running.
- •The skill depends on sibling files (`_audit-common.md`, `_audit-severity.md`) that are not included in the submitted content, so the full instruction set is not visible for review.
- •Relies on shell tooling (grep, git log, `gh issue list`) and writes a report file under docs/audits/; all read-only analysis plus one Markdown write, but `gh issue list` implies network access and GitHub auth in the agent's environment.
- •Instructs the agent to trust in-repo documents (`_audit-common.md`, `_audit-severity.md`, `docs/engine/*.md`) as protocol; if those files were tampered with, behaviour would follow them — no verification step is specified.
Exemples
Run the legacy compatibility audit for coordinate and placement gaps since the last report — check whether any new duplicated (x, z, -y) swaps or 4096.0 cell literals appeared in byroredux/src or crates.Verify that the REFR Euler conversion still uses the Bethesda CW-positive Rx·Ry·Rz product and that no path bypasses coord.rs for quaternion conversion.Cross-check the Gamebryo 2.3 headers against Redux and list mapping gaps in the seams not owned by /audit-nifal, /audit-physics or /audit-exterior.description: "Audit compatibility gaps between Gamebryo 2.3 and Redux — what's mapped, what's missing"
Legacy Compatibility Audit
Read _audit-common.md and _audit-severity.md for shared protocol (layout, game-data + legacy-source locations, severity, NIFAL severity rows, dedup, report format).
Purpose and scope
Compare Gamebryo 2.3 / Creation behaviour with Redux and surface mapping gaps — content the source engines render or simulate that Redux drops, mis-maps or diverges on — in the seams no layer or per-game owner covers. Each abstraction layer has its own deep audit; findings about a layer's internals go there, not here:
| Layer / seam | Owner | Spec |
|---|---|---|
| NIFAL (NIF → canonical ECS, material boundary) | /audit-nifal | docs/engine/nifal.md |
| EXAL / SKYAL / WATAL (exterior, sky, water translation) | /audit-exterior | docs/engine/{exal,skyal,watal}.md |
| PHYSAL (Havok → Rapier; constraint CInfo decode is the only per-game seam) | /audit-physics (+ /audit-nif for the decode) | docs/engine/physal.md |
| CHARAL (rulesets) | /audit-character | docs/engine/charal.md |
| Per-record / per-block decode divergence | /audit-esm, /audit-nif | — |
This skill keeps three dimensions: the coordinate/placement math (no other owner), the legacy-subsystem cross-check (the only audit that reads the 2.3 headers) and the cross-game translation-pattern spot-check. The former NIFAL, material-boundary, PHYSAL and EXAL dimensions were re-homed to the layer owners above: PHYSAL and the material boundary yielded only duplicates of /audit-physics / /audit-nifal; EXAL/WATAL yielded real boundary-completeness finds, which is exactly /audit-exterior's charter.
Documented limitations are not findings (FO4+ packed Havok blobs, phantoms, NiFogProperty's deliberate non-dispatch — no Material landing site, cell-scope CellLighting only — and the measured ~1.0 shared emissive scale, nifal.md §4). Cross-check the layer specs' leak inventories so closed leaks are not re-filed. If the Gamebryo 2.3 drive is unmounted, /mnt/data/src/reference/gamebyro-v26 / gamebyro-v32 and docs/legacy/ carry the same class shapes.
Dimensions
1. Coordinate + placement fidelity (Z-up → Y-up)
The most catastrophic mapping-bug class: one wrong transform mis-places or mirrors all content silently. Reference: docs/engine/coordinate-system.md.
Paths: crates/core/src/math/coord.rs, crates/nif/src/import/coord.rs, crates/nif/src/rotation.rs, crates/nif/src/blocks/strip.rs, byroredux/src/cell_loader/euler.rs, crates/core/src/ecs/components/camera.rs
First step: git log --since=<last report> --format='%h %cs %s' -- crates/core/src/math crates/nif/src/import/coord.rs byroredux/src/cell_loader/euler.rs and grep -rn '(x, z, -y)\|4096.0' byroredux/src crates --include='*.rs' for new duplicated swaps / cell literals.
Guards: coord.rs tests euler_matches_gamebryo_from_euler_angles_xyz + zyx_product_disagrees_with_gamebryo_on_multi_axis + modes_zero_and_one_agree_only_on_z_only_rotations; cell_loader/euler_zup_to_quat_yup_tests.rs; strip.rs::even_odd_winding_matches_opengl_convention.
- One implementation — the
(x, z, -y)swap and quaternion conversions live incoord.rs(zup_to_yup_pos,zup_to_yup_quat_wxyz,euler_zup_to_quat_yup,normalize_quat,cell_grid_to_world_yup); the NIF-typed flavour (zup_point_to_yup,zup_matrix_to_yup_quat) wraps them inimport/coord.rs. Any new duplicated swap or matrix→quat path that bypasses them is a finding (the pre-#1044 five-site duplication kept the #333 unit-quaternion fix at only one). - REFR Euler — Bethesda CW-positive, Gamebryo
FromEulerAnglesXYZproductfrom_rotation_x(-rx) * from_rotation_z(ry) * from_rotation_y(-rz)(Rx·Ry·Rzin Z-up; mode 0 =REFR_ROTATION_MODE_SHIP). The ZYX product (mode 1) was the 2026-05-26 → 2026-10-16 ship, from reading OpenMW'sosg::Quatexpression as a Hamilton product (OSG multiplies in reverse order, so OpenMW agrees with XYZ); it matches only Z-only REFRs and misplaces every multi-axis one (2a8b8e505; kept as an A/B knob only). REFR placement goes through the--rotation-modediagnostic dispatchereuler_zup_to_quat_yup_refr(default mode 0); XCLL lighting calls the canonical helper directly. Flag any caller that hardcodes a mode or re-derives the formula.--rotation-modereaches the library unclamped (boot::cli::rotation_mode_arg, #4126/#4764), so an out-of-range value falls back to the shipping formula — a CLI-side clamp is the regression. - Winding — NIF CW → projection Y-flip (
Camera::projection_matrix, Vulkan clip space) → CCW front face. Strip de-stitch has ONE implementation (strip::destrip, #2298): odd triangles swap the last two indices; a D3D-style first-two swap re-introduces inside-out geometry, and a hand-copied destrip is the regression. - Exterior grid —
EXTERIOR_CELL_UNITS = 4096.0+cell_grid_to_world_yupare the sole source (#1112 collapsed six divergent literals, one with a Z-flip sign bug); new literal 4096 cell math is a regression (distance literals are not). The one sanctioned re-declaration iscrates/bsa/src/uvd.rs(the bsa crate cannot depend on core), re-exported asUVD_CELL_UNITSand const-asserted equal to the core constant inbyroredux/src/cell_loader/precombined.rs(27002ed99, #4939). Also check frame composition, not just the literal: FO4 exterior_oc.nifprecombine instances are already world-absolute, so bakes spawn at aVec3::ZEROroot — composingcell_grid_to_world_yupon top placed every exterior bake one cell out (#5228,f3e1bba62). - Transform model — Gamebryo's
NiTransformscale is uniform by format (docs/legacy/api-deep-dive.md), so Redux'sTransform.scale: f32is not a collapse — a "non-uniform scale is dropped" finding is a false premise. Matrix3→Quat at import (Shepperd + SVD repair for degenerate rotations) andlocal * parentpropagation are the fidelity surface. Non-finite input is neutralised at the boundary:rotation.rs::sanitize_rotation(identity) + theread_ni_transform*readers (translation 0, scale 1, #4549); animation rotation keys go through the one sanitizeranim/keys.rs::normalized_rotation_sample(#4396). Corenormalize_quatis deliberately lenient — a new caller using it as a sanitizer is a finding. - Unit scale — Starfield authors metric;
crates/plugin/src/esm/records/spatial_units.rs::normalizelifts ESM placement/light/fog/weather/water/navmesh distances to 70 units/m once per plugin walk (FO76 is BU-native; its only lift is the shared-decoder WATR per-metre absorption lane, #5169), and NIF import does the matching mesh/bone conversion. A second game-dependent distance multiplier downstream (lighting, skinning, camera) is the regression; per-field coverage is/audit-esmDim 5.
2. Legacy subsystem coverage
What the 2.3 engine drives that Redux maps incompletely or not at all: cross-check SDK/Win32/Include/, CoreLibs/Ni*/ (see _audit-common.md Legacy Source; /legacy-lookup) against the Redux side. Audit fidelity, not existence — the import-critical set exists.
Paths: docs/legacy/api-deep-dive.md (mapping table), crates/core/src/ecs/components/, crates/core/src/animation/, byroredux/src/anim_convert.rs, crates/nif/src/import/{material,walk}/
First step: read the mapping table against crates/core/src/ecs/components/; gh issue list --search 'SUBSYS' --state open for what is already tracked.
- Property → pipeline — for each
NiPropertytype: does its authored effect land in dynamic pipeline state (cull, blend, stencil two-sided) or aMaterial/per-object component? Flag any property whose authored effect is parsed and dropped. - Animation model —
NiTimeController→NiInterpolator→ keys converge at import (nifal.mdAnimation; B-spline / Euler / TBC → quaternion keys; KF + embedded throughconvert_nif_clip; text keys →AnimationTextKeyEvents). Only per-light ambient colour channels (ColorTarget::LightAmbient, no light-buffer slot, #983) are parked; morph-weight channels reachAnimatedMorphWeightsand deform on the GPU inskin_vertices.comp(#3231/#4399). The timing envelope (cycle type, frequency, phase) and theNiControllerManager/ KFM sequence state machine are the known-fragile spots (#4128 open). - Scene graph — each
NiAVObjectfield → Redux component (Parent, Children, GlobalTransform, WorldBound, Name, flags) with fidelity, not existence. - String interning —
NiFixedString+GlobalStringTable↔StringPool+FixedString: semantic equivalence; flag any gap that breaks bone-name → entity resolution (load-bearing for skinning and PHYSAL bone binding). - Typical yield is the shape "authored input parsed, no canonical sink" — weapon reach/speed,
XLOClock state, the controller timing envelope and Oblivion's parallax mode were each MEDIUM in past reports and are since fixed (#3096–#3098). Confirm against/audit-gameplayscope before filing gameplay-facing gaps.
3. Cross-game translation-pattern spot-check
Reference: docs/engine/per-game-translation-survey.md §4 (per-layer inventory), §5 (Patterns A/B/C), §7 (why Fallout is the stress case). Verify a survey claim against code before citing it — the doc last changed 2026-10-10 (stale file/line cites re-pointed, #5472) and has carried stale examples before.
Paths: crates/nif/src/version.rs, crates/plugin/src/esm/reader.rs (GameKind), crates/plugin/src/esm/records/
First step: grep -rnE 'bsver(\(\))? *[<>=]+ *[0-9]{2,3}\b' crates/nif/src --include='*.rs' | grep -v test then drop // comment lines (grep -vE '^[^:]+:[0-9]+: *//') — literal thresholds; at 2026-10-15 the only non-comment hits are three test asserts in blocks/base.rs. Then grep -rn 'game == \|GameKind::' byroredux/src/cell_loader byroredux/src/scene --include='*.rs'.
- The renderer/shader side is clean; per-game branches live upstream (parser, importer, cell loader). Look there.
- Pattern A — hardcoded BSVER threshold literals that should be a named
version::bsver::*constant. This is not a bypassedNifVarianthelper: those feature-flag predicates were removed deliberately (#938/#1511/#1840/#1897) andversion.rsrecords the raw-bsver doctrine as fully enforced (searchraw-bsver doctrine). Do not flag a rawbsver()comparison as "should call a helper". - Pattern B — feature flag on an enum where the wire format already discriminates the game (the correct shape; flag mis-dispatch, not "needs a trait").
- Pattern C — divergent decode of one wire structure across games/eras (same record, different offsets or sizes): FO4
WEAPwith noDATAand WATR simulator blocks decoded one field off were the HIGH finds. Depth belongs to/audit-esm//audit-nif; this dimension checks the cross-game shape (a new per-game size/offset split with no test per era). - Scattered new
if game == …in the cell loader / exterior assembly is a finding (oneGameKind-keyed decision or a table-shapedmatchreturning data is fine).
Process
- Read the live spec for the seam under audit; its leak inventory is the baseline — do not re-file what it records as closed or a limitation.
- Trace each claimed boundary to its callers (grep the symbol) and confirm single-producer.
- Cross-reference Redux components / translate sites against the legacy headers and the survey.
- Classify per
_audit-severity.md(a wrong/divergent canonical out of atranslate()= HIGH; a translatable input silently dropped = MEDIUM, escalate if it removes visible content). Disprove every finding before keeping it. - Finalize per
_audit-common.md"Report Finalization" (save todocs/audits/AUDIT_LEGACY_COMPAT_<TODAY>.md; do not open issues directly). Suggest/audit-publish(labellegacy-compat+ the domain label).
Du fichier au premier essai
Le téléchargement contient exactement le contenu affiché sur cette fiche. Cette copie peut différer de la dernière version du dépôt source.
Consulter la source et ses fichiers annexesCe téléchargement contient uniquement SKILL.md. Les scripts, références, modèles et dépendances éventuels ne sont pas inclus. Récupérez les fichiers nécessaires depuis la source en conservant leur arborescence avant de poursuivre.
1. Télécharger le fichier
Télécharger SKILL.mdDepuis la racine d’un projet de test, enregistrez le fichier sous .skill-downloads/gamebryo-2-3-redux-compatibility-audit-mvg6ty78/SKILL.md, ou utilisez la commande suivante. Ce dossier sert à examiner la skill avant son installation.
Commande pour macOS/Linux ou WSL : un shell POSIX et curl sont nécessaires. Sous Windows sans WSL, utilisez le bouton de téléchargement et créez le dossier manuellement.
mkdir -p '.skill-downloads/gamebryo-2-3-redux-compatibility-audit-mvg6ty78' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/gamebryo-2-3-redux-compatibility-audit-mvg6ty78/download' --output '.skill-downloads/gamebryo-2-3-redux-compatibility-audit-mvg6ty78/SKILL.md.part' && mv '.skill-downloads/gamebryo-2-3-redux-compatibility-audit-mvg6ty78/SKILL.md.part' '.skill-downloads/gamebryo-2-3-redux-compatibility-audit-mvg6ty78/SKILL.md'2. Vérifier les prérequis
Lisez SKILL.md avant de l’utiliser. Si le fichier cite des scripts ou services externes, examinez-les et préparez les accès nécessaires dans votre environnement de test.
Aucune section de prérequis reconnue dans ce fichier. Cela ne signifie pas qu’il est autonome : les bibliothèques, outils et accès peuvent être cités ailleurs dans le contenu ou dans le dépôt source.
Les plateformes de la fiche sont des indications du catalogue. Les chemins ci-dessous suivent la documentation des outils ; ils ne prouvent pas que cette skill y a été exécutée. Aucune version minimale de ces outils n’est attestée pour cette fiche.
3. Charger la skill
Le fichier ne fournit pas un en-tête name/description exploitable pour cette procédure native. Le téléchargement reste disponible pour lecture ; utilisez le mode manuel ci-dessous.
Mode manuel ou autre outil : joignez SKILL.md à une conversation, ou ouvrez-le dans un agent capable de lire les fichiers. Ajoutez les ressources annexes nécessaires. Il n’existe pas de dossier universel reconnu par tous les outils.
4. Faire un premier essai
Utilisez une entrée courte et fictive : un endpoint d’API, un petit document ou un brief d’interface. Dans une nouvelle conversation, joignez le fichier ou donnez son chemin à l’agent, puis adaptez cette demande :
Lis .skill-downloads/gamebryo-2-3-redux-compatibility-audit-mvg6ty78/SKILL.md et applique ses instructions à cet exemple : [décrire une entrée de test]. Indique les fichiers, dépendances ou accès qui manquent. Produis le résultat demandé par la skill sans inventer de données ni exécuter de script non examiné.Résultat attendu : une sortie correspondant aux instructions de la skill, ou une liste précise des prérequis manquants. Une simple confirmation de lecture ne valide pas le premier usage. Si une ressource externe est indisponible, ce parcours reste à tester.
Bonnes pratiques React Hook Form
Developpement
Maîtrisez React Hook Form : évitez les anti-patterns, gérez les abonnements, et traitez correctement reset, dirty state et entrées contrôlées.
Migration Emotion vers Mantine
Developpement
Migrer les styled-components Emotion vers des composants Mantine avec style props et modules CSS. Pour convertir .styled.tsx ou supprimer les imports @emotion.
Détecteur de dérive de périmètre
Developpement
Analyse les diffs git par rapport à une intention pour détecter la dérive de périmètre, fichiers non liés et PR trop larges, puis suggère de garder, diviser ou justifier.