Dinoer

Cheat sheet

Every command, action and exit code on one page — the repository's own cheat sheet, copied as is.

Version 1.0.1 — September 2026

Everything on one page. Full reference: docs/MANUEL.md.


Three commands

# See a page: accessibility tree
/opt/dinoer/venv/bin/python /opt/dinoer/shot.py --url URL --a11y

# Run a scenario
/opt/dinoer/venv/bin/python /opt/dinoer/rpa.py --scenario FILE.json

# Read a scenario reference and compare (structural monitoring)
/opt/dinoer/venv/bin/python /opt/dinoer/rpa.py \
  --scenario FILE.json --replay-verifier REF.json

First call on a machine needs --guide-version X.Y, read with grep notice-version /opt/dinoer/docs/GUIDE_LLM.md.


The loop

        you decide what to do next
                  │
                  ▼
   ┌──────────────────────────────┐
   │  shot.py / rpa.py            │   one process, one JSON on stdout
   │    ├─ Chromium (headless)    │
   │    ├─ A11y: page structure   │
   │    └─ secrets: fills credentials│   never in the shell, never in a log
   └──────────────┬───────────────┘
                  │  boussole + JSON
                  ▼
        you read the same state
        the operator can see too

Session state lives in a file, not in the process: a second call with --reprendre-session reuses cookies — never DOM state.


Read the output in this order

ReadTells you
succesdid the run complete
boussole.url_courantewhere you actually ended up
boussole.dernier_code_httplast navigation status
etat.pret_a_agir + etat.raisonsfrictions perceived — a report, never a gate
a11y_treepage structure — headings, fields, buttons
respectyour own footprint: pages, actions, duration

If boussole does not match your expectation, stop before any mutating action.


Every action

type is always required. Keys below are the additional ones.

ActionRequiredOptional
naviguerurl—
cliquerselecteurforce, repli_js
cliquer_iframeiframe_selecteur | iframe_chemin, selecteurforce
remplirselecteur, valeursecret_cle
remplir_iframeiframe_selecteur | iframe_chemin, selecteur, valeursecret_cle
evaluerscriptattendu | contient | motif
extraire_texte——
defilerpx | selecteur—
pausems—
attendreselecteur—
attendre_selecteur_presentselecteur—
attendre_absenceselecteurdelai_initial_ms
attendre_navigation——
attendre_urlmotifattendre_changement
attendre_reseau_calme—timeout_ms
attendre_mfa_ntfyselecteurtimeout
nettoyer_overlayselecteur—
declencher_scenarioscenario—

Credentials — the only correct form

{"type": "remplir", "selecteur": "input[name=\"password\"]", "valeur": "depuis_secrets", "secret_cle": "password"}

Never extract a secret into the shell. lib/repertoire_chiffre.py resolves it inside the Playwright process; the value never reaches your command line, your history, or any log.


When something resists

SymptomTry
Click times out, element visually hidden"force": true, then "repli_js": true
Element below the folddefiler first
Page never finishes loading--wait-until load
Submit does nothing, no errornative HTML validation — submit the form via evaluer
exit 42encrypted directory not mounted (bash ~/git/Dinoer/Dinoer/scripts/monter-repertoire-chiffre.sh), or credentials checksum invalid (inspect the credentials file) — both are SecretsFermesError
guide_non_lupass --guide-version once
403 / 429read respect.waf_bloquants — a signal, not an exception

Exit codes

0 success · 1 run failure or failed assertion · 2 invalid arguments (rejected before any browser started) · 3 wrong interpreter — use the venv (/opt/dinoer/venv/bin/python) · 42 encrypted credentials directory closed, or credentials checksum invalid (SecretsFermesError family) · 43 no secrets_dir configured (SecretsNonConfigureError).