vps-health-api : endpoint GET /defenseurs/state #27
Labels
No labels
autopilot:pending-human
source:analyste
source:defenseur
source:human
source:medic
status:approved
status:blocked
status:in-progress
status:needs-clarification
status:needs-fix
status:ready
status:review
status:triage
type:bug
type:feature
type:infra
type:refactor
type:schema
type:security
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: maximus/vps-health-api#27
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Refs: maximus/agent-defenseurs —
spec-decisions-signal-honnete.md+spec-plan-signal-honnete.md(Issue 5 du plan). Origine :docs/revue-2026-09-21.md§8.1.Contexte
Le Sergent (maximus/agent-defenseurs#127, fermee) persiste desormais un etat par identifiant de finding (
firstSeen,unverified, historique 30 jours) dansfindings-state.json, a cote destatus.json. Le dashboard admin (Issue 6 du plan) le recupere en parallele de/defenseurspour le drill-down : seul cet etat porte l'age et le statut « non verifie »./defenseurs/findingsreste en place pourfindings-cliet les skills.Chemin : le Sergent ecrit par defaut dans
dirname(realpath(statusPath))/findings-state.json, soit/data/defenseurs/findings-state.jsonsur le VPS. Le bind-mount/data/defenseurs(lecture seule) le couvre deja : aucun nouveau Persistent Storage.Depend de maximus/agent-defenseurs#127 (format du fichier) — deja fermee, rien ne bloque.
Decisions (analyse du 2026-09-24)
/defenseurs: lecture du fichier et renvoi tel quel, sansJSON.parse. Le Sergent ecrit en atomique (tmp + rename) et isole lui-meme un etat illisible en.corrupt-*. Un fichier illisible cote lecteur fait echouer le.json()du dashboard, qui bascule alors en mode degrade (deja prevu).serveJsonFile(res, path)utilise parhandleDefenseurset le nouveau handler : un seul comportementno_datapour les deux routes.Taches
index.js: extraireserveJsonFile(res, path)(200 + contenu brut, ou 200{"status":"no_data"}sur toute erreur de lecture) ;handleDefenseursl'utilise.index.js:handleDefenseursStatequi litprocess.env.DEFENSEURS_FINDINGS_STATE_PATH || "/data/defenseurs/findings-state.json"(lu a la requete, commeDEFENSEURS_STATUS_PATH, pour que les tests puissent le surcharger).ROUTES:{ method: "GET", path: "/defenseurs/state", tokenKind: "read", handle: handleDefenseursState }a cote de/defenseurset/defenseurs/findings. Aucun changement aresolveRoutenicheckAuth.__tests__/state.test.js, ou section dansfindings.test.js) : fichier present -> 200 et corps identique octet pour octet ; fichier absent -> 200{status:"no_data"}; sans token -> 401 ; mauvais token -> 401 ;POST /defenseurs/state-> 404 (pas 401).__tests__/auth.test.js: ajouter/defenseurs/statea la listeROUTESde la matrice 401./defenseursapres extraction du helper (present / absent).README.md(table des endpoints + section, variableDEFENSEURS_FINDINGS_STATE_PATHdans la table de config, montage) etCLAUDE.md(endpoint, config, mention que le montage/data/defenseurscouvrefindings-state.json, compteur de tests).Fichiers concernes
index.js— helper, handler, entreeROUTES__tests__/state.test.js(nouveau) ou__tests__/findings.test.js— tests de la route__tests__/auth.test.js— matrice 401README.md,CLAUDE.md— doctest-curl.sh— optionnel : un cas 200/no_data et un 401 au niveau socketDockerfile— pas de changement (aucun nouveau module)Criteres d'acceptation
GET /defenseurs/stateavecHEALTH_TOKEN-> 200 et contenu brut defindings-state.json{"status":"no_data"}HOSTS_INGEST_TOKENrefuse sur cette route (401)/defenseursinchange (tests existants verts)npm testetbash test-curl.shvertscurl -H "Authorization: Bearer $TOKEN" https://health.lacompagniemaximus.com/defenseurs/state-> 200 (ouno_datasi le Sergent v2 n'a pas encore tourne)Complexite estimee
Simple.