Politique d'incertitude · fail-closed

JNSP — dire « je ne sais pas » est un signal valide

Dire « je ne sais pas faire » est un signal valide, pas un échec. Le SDD Mode préfère toujours une réponse JNSP honnête à une réponse confiante mais inventée — et il outille cette préférence de bout en bout : verdicts, hook pre-commit, exit codes.

Pourquoi inventer coûte plus cher que douter

Un agent IA est entraîné à produire une réponse plausible — y compris quand il n'a pas les informations pour trancher. Cette confiance par défaut a un coût caché : ce qui est inventé aujourd'hui réapparaît demain en drift, en bug de production ou en violation réglementaire. La politique JNSP (« Je Ne Sais Pas ») inverse la pente : quand l'agent ne peut pas trancher, il le dit, structure ce qui lui manque, et rend la décision à l'humain. C'est l'extension naturelle de Human Authorship : en cas de doute sur l'intention, l'agent DEMANDE — il n'invente pas.

Les situations qui imposent un verdict JNSP

L'agent DOIT émettre un verdict JNSP (UNKNOWN pour les sorties en anglais) dans les cas suivants :

Situations imposant un verdict JNSP
SituationVerdictSkill / Commande
Intention non formulée par un humain identifiableJNSPhuman-authorship-check
Critère d'acceptation non testable sans ambiguïtéJNSPears-validator, /sdd spec
Gouvernance Tier 1 non décidableUNKNOWN = VETO (fail-closed)regulatory-veto
SQS partiellement non scorable?/5 → Gate INCONNUEsqs-scoring, /sdd gate
Annotations @spec absentes lors d'un drift-checkINCONNU (≠ OK)drift-detection, traceability
Fichier de contexte non lisible intégralementJNSPcontext-budget, /sdd resume

Le motif commun : aucune absence d'information ne se score « OK ». Une Gate qui ne peut pas être calculée sort INCONNUE, pas ouverte ; un code sans annotations @spec sort INCONNU, pas « pas de drift ».

La forme dans le code : TODO-JNSP

Quand l'incertitude survient en pleine implémentation, elle se matérialise par un marqueur dans le diff :

// TODO-JNSP: <question précise à l'humain>
Bloquant au commit

Le hook pre-commit (.aiad/hooks/pre-commit.sh) bloque tout diff contenant un TODO-JNSP: non résolu. Le bypass git commit --no-verify existe mais est déconseillé : il revient à committer une question sans réponse.

Ce mécanisme garantit que les zones d'incertitude ne se sédimentent pas silencieusement dans le code : soit l'humain répond et le marqueur disparaît, soit le commit attend.

La forme dans une réponse texte

Un JNSP n'est pas un haussement d'épaules — c'est une réponse structurée en trois lignes qui rend la question actionnable :

JNSP — <intitulé court>
Ce qui est connu : <faits vérifiés, fichiers lus>
Ce qui manque : <info nécessaire pour trancher>
Question à l'humain : <reformulation actionnable, choix fini si possible>

La discipline de forme compte : « ce qui est connu » prouve que l'agent a fait le travail de recherche ; « ce qui manque » circonscrit l'incertitude ; la question finale, si possible en choix fini, minimise l'effort de décision humaine.

Exit codes CLI : 2 n'est pas une erreur

La politique remonte jusqu'au CLI npx aiad-sdd et aux pipelines CI :

Sémantique des exit codes CLI
CodeSémantique
0Succès / verdict PASS
1Échec, erreur ou verdict FAIL
2Verdict JNSP — décision humaine requise (pas une erreur)

Distinguer le code 2 du code 1 est essentiel : un FAIL a une correction connue ; un JNSP est une question ouverte qui doit remonter à l'humain. Dégrader un JNSP en FAIL « pour faire avancer » est explicitement interdit — tout comme le dégrader en PASS.

Fail-closed : la protection contre l'auto-blanchiment

La politique d'incertitude est avant tout une protection contre l'auto-blanchiment silencieux : un agent qui, face à une vérification qu'il ne peut pas mener, conclurait « rien à signaler ». En SDD Mode, le doute est fail-closed : une gouvernance Tier 1 non décidable vaut VETO ; une matrice de traçabilité incomplète vaut GAP et bloque la CI (--fail-on-gap traite UNKNOWN comme un échec). On préfère un faux positif qui réclame une clarification humaine à un faux négatif silencieux — c'est le prix, volontairement assumé, d'une chaîne de confiance vérifiable.