Instrument : les gardes nommées, comme candidats — le plus petit lecteur qui prouve la thèse
Une exception de domaine est une règle qui a un nom, un throw, presque toujours une épreuve, et souvent aucune déclaration. Si le réglage le demande (gardes_nommees, adr), le journal rend les candidats qu'aucun parcours ne cite, avec leur strate et ce qui les cite. Rien ne devient un constat, aucun état ne change de sens, la section n'existe pas sans les clés : additif, ignorable. Ce qu'un dessin de trois lecteurs (Java annoté, SQL, réconciliation) voulait démontrer, abattu par l'objecteur mandaté, ces quarante lignes le démontrent : huit exceptions de domaine chez openathle, zéro déclarée. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5.1
parent
887d9a90c3
commit
6508f3be47
+31
-1
@@ -10,7 +10,7 @@
|
||||
*
|
||||
* Exit codes: 0 sound, 1 broken. A refusal names its cause.
|
||||
*/
|
||||
import { cpSync, mkdtempSync, readFileSync, rmSync, unlinkSync, existsSync } from 'node:fs';
|
||||
import { cpSync, mkdirSync, mkdtempSync, readFileSync, rmSync, unlinkSync, existsSync, writeFileSync } from 'node:fs';
|
||||
import { join, dirname } from 'node:path';
|
||||
import { tmpdir } from 'node:os';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
@@ -47,6 +47,36 @@ try {
|
||||
assert((byInv(first, 'INV-001')?.rangs_constates ?? []).join(',') === '4,3', 'INV-001 carries the third-party ranks its tuning declares, in stratum order');
|
||||
assert(byInv(first, 'INV-003')?.rangs_constates === undefined, 'INV-003 (no locus) carries no ranks — nothing observed maps to nothing');
|
||||
assert(JSON.stringify(journal().correspondance_rangs) === JSON.stringify({ domaine: 4, application: 3, interface: 1 }), 'journal publishes the full rank correspondence for consumers joining old findings');
|
||||
// Named guards — candidates, never findings: a domain exception nobody NAMES
|
||||
// in a journey. Fields say « named », not « declared » : a journey may hold
|
||||
// the rule in prose without naming the class — that is the instrument's limit.
|
||||
const g = journal().gardes_nommees;
|
||||
// Excluded by pattern = not observed at all: the NotFound one is neither counted nor listed.
|
||||
assert(g && g.total === 1 && g.non_nommees_par_un_parcours === 1, 'the fixture has one observed named guard (the NotFound one is excluded), and no journey names it');
|
||||
assert(JSON.stringify(g.motifs) === JSON.stringify(['src/main/java/**/Domain/**/*Exception.java']), 'the journal says which patterns it looked at — the lamppost is written down');
|
||||
assert(g.candidats.length === 1 && g.candidats[0].nom === 'RuleViolatedException', 'the NotFound one is excluded by pattern; the other is a candidate');
|
||||
const c = g.candidats[0];
|
||||
assert(c.strate === 'domaine' && c.nommee_par_parcours === false && c.nommee_par_adr === true && c.nommee_par_epreuve === false, 'the candidate says who names it — ADR yes, journey no, test no');
|
||||
assert(g.sans_epreuve === 1, 'the triad is measured, not asserted: the observed guard lacks a test');
|
||||
assert(g.ecartees === 0 && g.differees === 0, 'no decision register yet: nothing set aside');
|
||||
// Backward compatibility: a tuning without the key gets no section at all.
|
||||
// On its OWN copy of the fixture: a second run on `repo` would rewrite the
|
||||
// journal and falsify the assertions that follow (caught by the self-test
|
||||
// itself on 2026-09-21 — a guard that shares state with what it guards).
|
||||
const repo2 = mkdtempSync(join(tmpdir(), 'instrument-selftest-compat-'));
|
||||
cpSync(join(here, 'selftest/fixture'), repo2, { recursive: true });
|
||||
execFileSync(process.execPath, [join(here, 'run.mjs'), '--config', 'reglage-sans-gardes.yaml', '--repo', repo2], { encoding: 'utf8', stdio: 'pipe' });
|
||||
const journal2 = parseYaml(readFileSync(join(repo2, 'docs/parcours/_mesures/derniere-execution.yaml'), 'utf8'));
|
||||
assert(!('gardes_nommees' in journal2), 'a tuning that does not ask for named guards changes nothing');
|
||||
// The refusal register: what the jurisdiction set aside does not come back
|
||||
// every night. Read by the instrument, never written by it.
|
||||
const repo3 = mkdtempSync(join(tmpdir(), 'instrument-selftest-registre-'));
|
||||
cpSync(join(here, 'selftest/fixture'), repo3, { recursive: true });
|
||||
mkdirSync(join(repo3, 'docs/parcours/_meta'), { recursive: true });
|
||||
writeFileSync(join(repo3, 'docs/parcours/_meta/gardes-ecartees.yaml'), "- nom: RuleViolatedException\n decision: ecarte\n motif: une plomberie, pas une règle\n");
|
||||
execFileSync(process.execPath, [join(here, 'run.mjs'), '--config', 'reglage.yaml', '--repo', repo3], { encoding: 'utf8', stdio: 'pipe' });
|
||||
const j3 = parseYaml(readFileSync(join(repo3, 'docs/parcours/_mesures/derniere-execution.yaml'), 'utf8')).gardes_nommees;
|
||||
assert(j3.total === 1 && j3.ecartees === 1 && j3.candidats.length === 0, 'a guard set aside leaves the candidates and stays in the count');
|
||||
assert(byInv(first, 'INV-002')?.etat === 'mal_domicilie', 'INV-002 mal_domicilie — proven only away from home');
|
||||
assert(byInv(first, 'INV-003')?.etat === 'aucun_locus', 'INV-003 aucun_locus — named by no test');
|
||||
assert(journal().constats_nouveaux === 3 && journal().invariants === 3, 'journal counts the run');
|
||||
|
||||
Reference in New Issue
Block a user