Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,40 @@
- Utiliser `supermemory_add_memory` avec `action: "save"`.

Ne PAS garder le résumé uniquement dans le contexte de session — il doit être persistant dans supermemory pour les sessions suivantes.

<!-- bmad:context -->
<!-- Verified 2026-08-13 against 553b40c. Managed by bmad-project-context; edits inside this block are replaced on refresh. Keep anything you want preserved outside the markers. -->

## Gw2Analytics

Plateforme d'analyse de combats WvW. Les contrats et conventions détaillés vivent dans `README.md`, `CONTRIBUTING.md` et `docs/`; la planification BMAD vit dans `_bmad-output/`.

## Policy

- Ne jamais pousser directement sur `main`; passer par une PR, conserver un historique linéaire et squash-merger.
- Signer chaque commit avec le trailer DCO `Signed-off-by:`.
- Ne jamais créer de commit sans demande explicite du mainteneur.
- Ne jamais committer les logs EVTC ou exports Elite Insights privés; ne versionner que leur manifeste et leurs empreintes.

## Where things are

- Comparaison EI canonique: `libs/gw2_analytics/src/gw2_analytics/ei_compare.py`; pilotes et corpus local: `scripts/ei-parity/`.
- Décisions d'architecture acceptées: `docs/adr/`; contrat BMAD actif: `_bmad-output/specs/`.

## Running and verifying

- Exécuter les outils Python via `uv run`; une invocation Python nue contourne l'environnement du workspace.
- Itérer avec les tests ciblés; la suite Python complète impose une couverture globale de 90 % et peut nécessiter les services Docker pour les tests d'intégration.

## Conventions that differ from defaults

- `libs/gw2_core` est l'unique contrat partagé et reste sans I/O; le frontend consomme OpenAPI, jamais les structures EVTC ou ORM.
- Dans l'API, respecter `routes -> services -> repositories -> ORM`; les repositories ne commitent jamais, les services possèdent les transactions.

## Known pitfalls

- Comparer chaque entrée joueur EI à sa fenêtre `firstAware`/`lastAware`, pas aux totaux du combat entier; un même compte peut avoir plusieurs slices contiguës.
- Résoudre propriétaires, changements de personnage et identifiants d'agent avec le temps; une table globale `instance_id -> owner` produit de fausses attributions.
- Distinguer canal arcdps et classification EI pour les dégâts d'altération; les effets de vol de vie ne sont pas des altérations EI.

<!-- /bmad:context -->
31 changes: 31 additions & 0 deletions docs/ei-parity-workbench.md
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,37 @@ intentional parser result change:
uv run python scripts/ei-parity/ei_diff.py --json scripts/ei-parity/corpus-baseline.json
```

### Detailed local report and known-delta registry

`compare_elite_insights` also emits one atomic result per comparison — key,
status (`PASS`/`FAIL`), expected, actual, numeric `delta = actual - expected`
(otherwise `null`), rule and dimensions — alongside the unchanged
`matches`/`compared`/`differences` contract. `--report-json` requires the full
corpus and writes a **local, private** report that never lands in Git:

```bash
uv run python scripts/ei-parity/ei_diff.py \
--report-json /tmp/ei-certification-report.json
```

The report root carries `schema_version` (1), the EI reference, the manifest
SHA-256, a summary by status and by status/bucket, and a deterministically
sorted result list. Player/slice identifiers appear only when available and
are never copied into `corpus-baseline.json`, which stays aggregate.

`scripts/ei-parity/known-deltas.json` is the versioned, initially-empty
registry of exact, bounded exemptions (schema v1). A rule flips a `FAIL` to
`KNOWN_DELTA` only when every selector field (stem, account, slice, bucket,
skill id, buff id, full key) matches exactly and the delta is within the rule's
`max_abs_delta` bound. Rules never touch a `PASS` row, and when several rules
match one row the first listed rule wins. Fields are fixed rules: `id`,
`selector`, `constraint`, `reason`, `remove_when`; the registry rejects unknown
keys, empty selectors or constraints, wrong schema versions, and malformed
rules (empty or duplicate ids, null selector values, non-positive or
non-finite bounds). No regex ever masks a result, and the current 133
differences stay `FAIL` with the empty registry. Use the registry to track a
confirmed parity gap with a removal condition — never to silence a row.

Supporting probes in `scripts/ei-parity/`:

| Script | Answers |
Expand Down
Loading
Loading