Acci — rgaa-audit run bilans
Accessibility auditor (read-only) on the pinned ultra11y engine since v3 (2026-10-13, PR #2387): the engine finds, gates and reports; read-only agents adjudicate the criteria a static pass cannot decide; a second reader puts the draft report on trial; the run writes the dated French report, a coverage annex and the issue plan. See bots/rgaa-audit/. The bilans below v3 are the v1/v2 single-agent auditor, kept as the record of why v3 exists. Earlier runs (pre-dedicated-file) are recorded in the 2026-06 campaign bilans.
2026-10-20 — the demo path proven: task demo:rgaa-audit, one real run, one resume (#2593)
The colleague-facing one-command path landed (#2598): build, pinned engine, chromium, the run — and with it the first REAL run of the bot end to end outside a hand-held session. What it took, in order:
- Run 1 (inside a session sandbox): every adjudication batch died at 0 tokens on a proxy-tunnel refusal (the same egress trap as #2500) — the report still came out from the replayed ledger alone, integrity gate on. Cost: 0 $.
- Run 2 (sandbox off): the agents lived; the run then died at 91% of the bot's 3M token ceiling (2 729 032) in
merge_refutations— a full run's wall is the TOKEN budget, not dollars. - The documented resume line (with
--max-tokensraised) finished it: FINISHED, 42% provisional (32 C / 39 NC / 30 NA / 5 open), decided 101/106, adjudication ok (32 verdicts, zero lost batches), counter- reading applied, report integrity ok — report, page grid, coverage annex and ledger under.rgaa-demo/<ts>/.
RGAA_DEMO_TOKENS (default 5M) now ships the ceiling with the task. Found on the way and ticketed: the axe net cannot see unnamed controls (#2591), and the mdcode corpus walk reads local gitignored dirs, so a demo run makes task test red (#2606). Merged alongside: the RGAA 11.1 label sweep (#2590, 17 fixes).
2026-10-15 — 3.0.3: a retyped citation is folded with its anchor's text, and the studio ledger's one ungroundable citation is restored (#2453)
- Status: engine-proven, no run. The node test drives a retyped citation through the real merge, fold, draft and trial on the pinned engine and requires a whole trial. A known-upstream-defect test pins the asymmetry the fix works around (SocialGouv/ultra11y#50).
- The defect, found by r4: the fold grounds a snippet the adjudicator retyped through its fallback to the evidence anchor, while the trial grounds the stored text as written. One of the 515 citations of r2–r4 was retyped (1.3, a closing backtick), and it degraded r4's trial.
- The fix: fold_final gives each citation of a conformity (the only ones the trial grounds) that neither copies nor excerpts its anchor the snippet and selector of the anchor it stands on. When several anchors share the line (an element and its child; a capture line holds up to 33), that is the one its transcription is nearest to: fewest edits to an excerpt, then the selector it names, then the anchor it starts. The engine then judges both versions on copies of the audit — the restored text also posed as a recommendation, which the fold grounds literally as the trial does — and a criterion keeps its restored citations only where it accepts both. So the fold's verdict is always the one on the text as the agent wrote it, and only its storage changes.
- A recommendation takes the same anchor choice in the merge. Since 3.0.1 it took the anchor it copied, else the first at its line; a retyped one now takes the nearest anchor, and a copy or an excerpt of an anchor stays as written, with the agent's selector. A restored recommendation is not probed: one whose anchor text does not ground still costs its verdict, as it did before (the 30 anchored recommendations of r3–r4 were all copies of their anchor).
- The bot reads an agent's verdict as the engine does, trimmed and case-blind: a conformity spelled
cis folded and tried as C, so it is restored as one, and an uncitednais sent back likeNA. - A finding stays as written. The trial reads a non-conformity from its report row (file, line and selector, no snippet), and no agent finding of r2–r4 carried a selector (0 of 90). A finding may also quote an element the harvest did not anchor: in r3, two findings of 3.2 anchored on a capture line quote one 88 edits from the nearest anchor.
- How the adversarial review (six rounds) shaped it, each draft refuted by execution:
- rewriting every citation gave an exact copy another anchor's selector where anchors share one snippet (
css:.stickybecamecss:.fixedon r2's data). It also matched an excerpt to every container its element sits in, and on a page in decomposed Unicode 5 of the engine's own 36 anchors do not ground (a snippet cut between a letter and its accent). Hence copies and excerpts stay as written; - rewriting every other citation in the merge laundered fabrications: a snippet naming an element that exists nowhere, cited at an anchor's line, became the anchor's text, and the fold accepted what it refuses as written;
- gating that rewrite on a copy of the engine's recognition test still changed verdicts both ways, because the fold applies the test to its own anchor (best overlap within ten lines), not to the citation's line. Rather than mirror that too, the engine now judges both versions. On the reviewer's four scenarios, the fold's verdict through the bot equals the engine's on the text as written, and the trial grounds every restored citation. A node test runs eight citations through the real fold, as written and through the bot, and requires the same verdict on each;
- a fourth round found that both probes can accept a restored text that does not ground: on a page in decomposed Unicode the anchor's own snippet is cut inside an accent, and the fold still forgives it through another anchor. The trial then refused citations that grounded as written. The restored probe now poses each restored text as a recommendation too.
- rewriting every citation gave an exact copy another anchor's selector where anchors share one snippet (
- The annex counts the citations restored and names their criteria (the fold row).
- The committed ledger:
- grounded with the engine's own code against today's tree, all 306 source-anchored citations and findings ground except 1.3's at
BackendsTab.tsx:104. That snippet is now its anchor's (the stray backtick removed); - its 128 citations anchored on page captures are byte-exact copies of anchors r2–r4 harvested; grounding them needs a rendered run;
- a ledger can still hold a retyped citation, one written before 3.0.3 or one whose restore the engine refused: the replay accepts it through the fold's fallback and every trial refuses it, so such an entry is healed by hand.
- grounded with the engine's own code against today's tree, all 306 source-anchored citations and findings ground except 1.3's at
2026-10-14 — r3 and r4: the first complete studio audit, its ledger replayed, its trial run (runs 01a13b95-2e46, 01a13bf2-0e79)
- Status: validated end to end, board publication not exercised — r3 decided all 106 criteria; r4 replayed r3's ledger and ran the second reader, which found the defect fixed here (3.0.2).
- Versions: bot rgaa-audit 3.0.1 (#2439) · iterion
3f786feac(r3), main13cb0edcfplus r3's ledger (r4) · ultra11y 5.42.1 · the engine's Chromium 1248 · adjudicator and second reader onclaude_code/claude-opus-5-5. - Method: the studio recipe of #2439;
--loop-budget-guard off; r3 capped at 60 $ on the 34-verdict ledger of r2; r4 capped at 30 $ on r3's ledger, committed on a local branch first (a run audits the worktree ofHEAD). - Result, r3: 41.90 $ for 21 adjudication calls (0.14 to 5.62 $ a batch, 2.8 min on average) and 22 min.
- Ledger: 32 verdicts replayed, 2 stale.
- Adjudication: 17 batches and 4 re-asks, none lost. The fold accepted all 74 verdicts and refused none.
- Recommendations: all 22 kept and folded, none refused. r2 lost 18 verdicts of 54 to them (#2398, closed).
- Report: 106/106 decided — 41 C, 32 NC, 33 NA, 56 %, not provisional; integrity ok.
- The second reader was skipped by
refuter_budget_share: 0.6 × 60 $ = 36 $, already spent when the trial would start. - Issue plan: 47 issues, 15 of them advisory, none blocking.
- Result, r4: 20.39 $ — adjudication 8 calls for 11.91 $, second reader 13 calls for 8.48 $ — and 15 min.
- Ledger: 93 verdicts replayed, 22 stored recommendations not replayed, 10 stale. All 10 stale ones are anchored on page captures: the rendered DOM differs from one boot of the studio to the next on the same source.
- Adjudication: the 10 stale criteria were re-adjudicated, 1 needing the re-ask, and none was left open.
- Trial: 123 claims (87 NC, 36 C). 1 refuted and 2 unsupported, all three NC; every conformity was supported or partly supported. The engine removed 2 agent findings and left 1 of its own untouched.
- Report: 106/106 — 38 C, 35 NC, 33 NA, 52 %; integrity ok.
- Issue plan: 39 issues, 4 of them advisory.
- Ledger: 102 verdicts, committed here as the studio's baseline.
- Value: the first complete audit of the studio. Replaying the ledger halves the cost of a run (r4 20 $, r3 42 $) and leaves the budget for the trial.
- Findings / misses:
- the trial drew its conformities from the ledger copy, while the engine re-derives them from the audit when it applies the trial. On a replaying run the two write a capture anchor differently (relative in the ledger, the run's absolute worktree path in the audit), so 16 conformities read « absent from the trial ». The second reader had supported or partly supported all 16, so r4's ledger is checked on substance; only the bookkeeping missed. Fixed in 3.0.2:
draft_reporttakes the conformities from the audit. The node test fails on the old source with 77 claims absent; on r4's own data, an audit-drawn trial leaves none absent. - r4's trial was degraded by a second cause, which 3.0.2 does not remove: the conformity of 1.3 cites
BackendsTab.tsx:104with the adjudicator's retyping of the harvester's snippet — a closing backtick aftershrink-0, where the source readsshrink-0 ${(the element spans lines 104–110). The fold accepts it through its evidence-anchor fallback; the trial grounds retained claims without one and refuses it. The committed ledger carries that citation, so every trial that re-judges 1.3 comes back degraded the same way, until the engine aligns the two (SocialGouv/ultra11y#50) or the bot gives a citation its anchor's own snippet (#2453). - the second reader's budget share was spent before the trial: at a 60 $ cap, r3 had already spent 42 $ adjudicating 74 criteria (32 came replayed from r2's ledger).
- captures churn between boots: 10 of 103 replayed verdicts went stale on unchanged source. A weekly run re-adjudicates about 10 % unless the served studio pins what its pages show (#2347).
- after the trial pruned two findings of 10.7, the page grid leaves 10.7 « à évaluer » on 18 pages. The document decides it NC, and the annex does not name the page gap (#2449).
- the trial drew its conformities from the ledger copy, while the engine re-derives them from the audit when it applies the trial. On a replaying run the two write a capture anchor differently (relative in the ledger, the run's absolute worktree path in the audit), so 16 conformities read « absent from the trial ». The second reader had supported or partly supported all 16, so r4's ledger is checked on substance; only the bookkeeping missed. Fixed in 3.0.2:
- Lessons for next run: adjudication costs about 0.57 $ a criterion here, so a studio run with no ledger (103 criteria, about 58 $) needs a cap near 100 $ for the second reader to start at the 0.6 share; a run replaying this ledger costs about 20 $ with the trial.
2026-10-13 — first dogfood on iterion's studio (#2346): the rendered layer proven, 30 $ short of 19 batches, four bot defects found and fixed (run 01a13705-d54a)
- Status: partial, degraded and saying so — the whole graph ran on the real studio (static, rendered, adjudication, trial, report, per-page grid, annex, issue plan), but the cost cap cut 7 of the 19 adjudication batches: 69 of the 106 criteria stay « à évaluer » and the rate is provisional. Board publication not exercised (
post_to_board=false). - Versions: bot rgaa-audit 3.0.0 plus this branch's
renderfix (run base0d506c744); the trial ran on the oldrefute_apply, and its fix, like the recommendation and ledger fixes below, landed after the run and is proven by the node tests, not by this run · iterion116120b35(local build) · ultra11y 5.42.1, pinned and fingerprinted · the engine's Playwright Chromium 1248, installed under the project (PLAYWRIGHT_BROWSERS_PATH) · adjudicator and second reader onclaude_code/claude-opus-5-5. - Method: the studio recipe this bilan ships —
.ultra11yrc.json(21 pages with the view files assources, 3 transverse components) andstudio/e2e/serve.mjswithITERION_E2E_FIXED_RUN_IDS=1, so the seeded run ids survive a reboot and/runs/<id>can be sampled — theniterion run bots/rgaa-audit --sandbox none --merge-into none --var scope_globs='studio/src/**' --var rendered=required --var serve_command='… node studio/e2e/serve.mjs' --var serve_ready_url=http://127.0.0.1:4899/api/server/info --max-cost-usd 30; resumed once at 60 $ (iterion resume --run-id … --max-cost-usd 60). The resumed run diedAUDIT_INTEGRITYatfinal_report(the oldrefute_applyhad not recorded the engine's rewrite of the audit); the hash record was realigned on the engine's write by hand and the run rewound tofinal_report(iterion rewind --node final_report+resume --force). - Result: 35.36 $ over 24 model calls — adjudication 14 calls, 27.71 $ (0.29 to 3.78 $ for a batch of at most 8 criteria, 5 min on average), second reader 10 calls, 7.65 $ — and 26 min of run time over three segments (40 min from launch to finish, pauses included).
- Static: 553 files, 15 engine findings, 100 criteria left to judgement.
- Rendered: 21 pages captured, none refused; the page-kind lint names the 6 kinds the studio does not have (contact, legal notice, accessibility statement, site map, help, authentication — the last one cloud-only).
- Adjudication: 12 batches answered (54 verdicts); 7 lost — 4 cancelled when the cap was hit, 1 adjudicated but stopped at the cap before its fragment was written, 1 on a claude-code
error_during_execution, 1 never started. Fold: 33 verdicts accepted, 67 criteria still open — 49 from the lost batches, 18 refused for a single recommendation without a file (#2398). - Trial: 95 claims, 20 refuted, 2 unsupported; the engine cleared 2 conformities (3.1, 11.12) and refused the grounding of 9 retained claims anchored on page URLs. The delivered annex still says « the engine did not apply the trial »: that is the misreport fixed below.
- Report: its own line reads 10 C, 11 NC, 16 NA, 69 to assess — 11 % provisional (10 ÷ 90). The bot's recount of
criteria[]gives 12 C and 13 %: two subject-less criteria left open (13.3, 13.4) are counted both « sans sujet » and « à évaluer » by the engine (SocialGouv/ultra11y#42), and the annex reports the integrity layer as degraded. - Issue plan: 12 issues, severity-sorted — 11.1 blocking (18 occurrences), 7.1 and 10.7 (28 occurrences each) among the major ones.
- Ledger: 34 verdicts, committed as
.ultra11y/verdicts/rgaa.jsonfor the next run to replay through the engine — the run's own ledger with its 56 capture anchors rewritten relative to the workspace after the run, the formfinal_reportnow delivers.
- Value: the rendered layer works end to end on a real SPA (served by the e2e harness, sampled, scanned, merged before adjudication); the annex names every degraded layer with its cause; the issue plan is the engine's own, capped and severity-sorted.
- Findings / misses — four bot defects, fixed in 3.0.1 with a test seen red on each:
- a recommendation cost its verdict:
write_fragmentkept only string recommendations, while the engine requires an object anchored on a file and refuses the whole verdict over a single free-text one. Every recommendation was either lost (an object) or fatal (a string). They are now objects kept only on an anchor of the criterion's own evidence, with that anchor's snippet so they ground; the rest are dropped and counted in the annex, and the prompt and the adjudication skill state the shape. A stored recommendation is not replayed from the ledger either: the engine re-grounds it with no fallback, so an advised element since edited would refuse the replayed verdict; and a replayed verdict the engine's gate refuses is now named instead of being counted as replayed. The adversarial review of these fixes hardened the replay further: a ledger the engine cannot read isLEDGER_INVALIDwith the engine's own message, a failure of the environment stays a resumable error, and the replayed audit is written beside the real one and moved into place once whole. - the trial report contradicted the audit: with
--prunethe engine rewrites the audit and repairs the ledger whatever its verdict on coverage and grounding. The node chained the hash only onok(→AUDIT_INTEGRITYatfinal_report) and reported « not applied » while 3.1 and 11.12 had been cleared. It now chains the engine's write, reports what was pruned and names the part the engine refused — in the annex and at the human gate. - a refused page-sample lint read as « no kind missing »:
rendernow fails the layer on it, before any scan, with the lint's own issues as the reason. - the delivered ledger carried this run's absolute workspace paths (56 capture anchors under the run's worktree):
final_reportnow writes every anchor relative to the workspace, and a capture from any run's worktree from its.ultra11y/pages/, the rule the engine's replay applies.
- a recommendation cost its verdict:
- Engine (upstream): the trial grounds a page URL as a file, so every trial of a rendered audit comes back refused in part (SocialGouv/ultra11y#49); the « Décidés » double count stays (SocialGouv/ultra11y#42).
- Engine facts paid on this run:
- a local run executes in the worktree iterion creates from
HEAD(worktree: autois the default): the first attempt diedRENDER_UNAVAILABLEon a recipe not yet committed; - on a resume,
loop_budget_guardprices the re-ask at the previous iteration — the whole 19-batch fan-out, 27.7 $ — and declined it, although the re-ask replans only the refused criteria; - a local
claude_coderun inherits the shell's provider keys: aZAI_API_KEYin the environment routes it to the z.ai facade.
- a local run executes in the worktree iterion creates from
- Lessons for next run: about 2 $ a batch, so a cold studio run is 19 batches + one re-ask + the trial, about 50–60 $; the committed ledger replays 34 verdicts for free and leaves about 9–12 batches. Pass
--loop-budget-guard offon a resume. Commit the recipe and the ledger before launching.
2026-10-13 — v3 on the ultra11y engine lands (PR #2387); Ally (ultra11y) retired into it
- Status: structural + engine-proven, dogfood pending — the real node scripts run on the real pinned engine against the planted fixture site in CI (
task test:contract:rgaa: the engine contract and the bot's node scripts, 45 subtests — hostile first round, tamper table, re-entry), the dry run walks the graph on recorded fixtures,task checkgreen; no live run yet (that is #2346, the studio dogfood, after the live test). - What the three Ally bilans taught (2026-08-12 → 2026-09-17), now built into v3:
- the empty-scope façade (
audit_argsjoined into one token → 0 files → "100 %"):audit_argsisstring[]and an empty scope is the typed refusalEMPTY_SCOPE, never a clean audit; - the fold refuses W3C technique codes as
normativeRef: the briefs the engine writes per criterion carry the test ids, and the adjudication protocol says "the criterion id or one of itstestIds, never a technique code"; - a report written inside the tree gets wip-banked by finalize: every intermediate lives in the run directory — except the captures the engine's
scanwrites under.ultra11y/pages/of the workspace (upstream SocialGouv/ultra11y#47) —,report_diris an explicit copy,workspace_checkpoint: off; - one adjudicator on a whole SPA does not converge in 20 minutes: criteria are adjudicated in parallel theme batches, each with its own agent;
- the "plausible C" hole (a C with a justification but no verified anchor): a C must cite the item's own evidence (checked by the bot before the engine's gate), and a second reader puts every landed conformity on trial;
- undecided criteria are never silently conforming: the fold is partial, the residue is named in the annex, and the report's « Décidés » line is cross-checked against the document (the engine double-counts "no subject" criteria left open — known upstream defect, pinned by a test that goes red when fixed).
- the empty-scope façade (
- Not carried over from Ally: the pull-request diff mode (
--since) andproduces: review(the hand-off would mask Revi on the same PR, #2355) — back when #2355 lands.
2026-09-17 — profile 2: the 106 criteria ruled on a 13-line page, three attempts of wall to get there (run 01a0af95-64fa)
- Status: validated end to end —
inventory→campaign(cut twice by the wall, then complete) → the deterministic tail (scan_health,cap_findings, …) →report_card→ done. - Versions: bot rgaa-audit 2.0.1 (
dsl: 2, wave 3b of #1344) · iterion5fa790d82for the bots; the engine the branch binaryv3.157.0+c31559517(built on the wave-3a branch from main at v3.157.0; main is at v3.159.0 as this is written, one PR of engine work ahead), served through the host's Anthropic-compatible facade (z.ai) as the runs' provenance records. - Method: launched FROM a scratch greeter repository whose
web/index.htmlcarries planted defects,--var scope_globs="web/**" --var post_to_board=falseplus a one-linescope_notes,--store-dirthe operator's workspace store,--sandbox none,--merge-into none, caps--max-cost-usd 1.5 --max-duration 10m, every LLM node onclaude_code/claude-opus-5(the GPT forfait is closed until 2026-09-20). The single audit agent died at the 10-minute wall (context deadline); resumed with--max-duration 25m --max-cost-usd 2.5, the campaign then finished but the 90 % duration guard fired on the deterministic tail; resumed once more with--max-duration 45m --max-cost-usd 3. - Result: $2.33 recorded (the two cut attempts' spend is not), 29 min 45 s from launch to done. The campaign audited the page theme by theme against the 106 RGAA 4.1.2 criteria without the DSFR skill (no framework on the page, said explicitly): 16 C / 15 NC / 75 NA, 31 applicable, 52 % — the planted defects all caught, with the sibling-criterion rule the agent chose written down (a criterion whose object does not exist because a sibling failed on absence is NA with a reason).
report_cardwroteaudits/rgaa-2026-09-17-2.md; the-2suffix because a cut attempt had already leftrgaa-2026-09-17.mdin the tree.report_dirdefaults to${PROJECT_DIR}/audits, so finalize wip-banked both as7fd2c33oniterion/run/01a0af95-64fa-7ab3-8aa9-07925fad26c4(never merged, by design). - Value: the four prompts' paragraph breaks reach the models (proven in the run's
events.jsonlforcampaign_system, twice, andreport_card_system), and the report is the operator-facing French document the bot promises. - Findings / misses: none bot-side. The one-agent audit of a full referential needs about twenty minutes of wall even for a one-page scope; a cut attempt leaves its half-written report in the tree and the next one numbers around it — harmless, but worth knowing.
- Engine hardening: none needed.
- Lessons for next run:
--max-duration 30mfrom the start;--var report_dir=<outside the tree>when the report is the deliverable.
2026-07-07 — re-run post status-fix: the 5 NC now flow through the gates into the report — VALIDATED (run 019f3de8)
- Status: VALIDATED — closes the morning run's partial: with the d6b966f03 fix live (mandatory per-candidate status + fail-safe NC counting), the same scope now yields scan_health nc_count=5 and a report with full detailed NC blocks.
- Versions: bot v2.0.0 (+status fix) · iterion
dev+239203525cc8· no sandbox. - Method: identical scope to 019f3d3b-7aea (studio/src/**, post_to_board=false, report out-of-tree), 6m13s wall.
- Result:
finished; 22 files examined; nc_count=5 through scan_health AND cap_findings; reportrgaa-2026-07-07-2.md(incremental suffix worked) carries the detailed non-conformities with file anchors + corrections — [NC] 11.10 aria-invalid on validated fields, [NC] 5.7 table header scope, [NC] 5.4/5.5 captions, etc. — and an honest 72% conformity over 18 applicable criteria (vs the broken run's 93%/0-NC façade-adjacent output). - Value: a genuinely actionable a11y worklist for the studio SPA; the run also demonstrates the fail-safe gate philosophy (surfacing beats dropping) end to end.
- Lessons: with post_to_board=true these 5 NC would land as labelled board issues — enable it on the next scheduled run.
2026-07-07 — v2 dogfood on the iterion studio SPA: coherent report, status-field gate hole found + fixed (run 019f3d3b-7aea)
- Status: partial — the run finished clean and produced a genuinely useful report, but a bot bug dropped its 4 concrete findings between the campaign and the report. Bug fixed same-day (see Engine/bot hardening); needs one re-run to be validated.
- Versions: bot v2.0.0 · iterion
dev+239203525cc8· no sandbox (read-only host run). - Method: CLI run,
--store-dir <workspace>/.iterion,post_to_board=false,scope_globs=studio/src/**,report_dirout-of-tree,--max-cost-usd 12 --max-duration 45m(mono claude, forfait). Single pass, ~8 min wall. - Result:
finished; scan_health green (5 skills present, 29 files examined — the anti-façade floor held); report written (rgaa-2026-07-07.md, 4.1K): 51 statically-verifiable criteria all C, 15 NA with reasons, 93% global with an HONEST method note (render-only-verifiable residual left "à vérifier visuellement" instead of inflated to C), 11/13 themes covered, iframe/media themes NA with reasons. - Value: real — the report's synthesis table + the campaign's praise of the a11y-mature primitives (IconButton aria-label enforcement, InlineBanner role=alert, skip-link + landmarks) match the codebase; the method note shows the honesty clause working.
- Findings / misses: the run's 4 concrete findings (5.7 table header scope, 5.4/5.5 missing captions, 11.10 aria-invalid, +1) were emitted WITHOUT a
statusfield → scan_health/cap_findings (which countstatus=='NC') saw 0 NC → the report says "0 non conformes" while finding-shaped candidates existed. Signal lost between campaign and report — the exact façade-adjacent hole the dogfood ritual exists to catch. - Engine/bot hardening: same-day fix in
bots/rgaa-audit/main.bot— (1) contract now REQUIRES an explicitstatus: C|NC|NAper candidates[] entry; (2) scan_health + cap_findings became fail-safe: a finding-shaped entry (severity/problem present) with a missing/unknown status COUNTS AS NC (surfacing beats dropping).iterion validateclean. - Lessons for next run: re-run on the same scope to confirm the 4 findings surface as NC blocks + (with post_to_board=true) as board issues; consider adding
statuspresence to scan_health's hard-fail conditions if the fail-safe proves noisy.
2026-07-07 — converted to v2 light shape (ADR-058 fleet rollout) — structural-validated, dogfood pending
- Status: converted, dogfood pending — structural validation only (
iterion validateclean, catalog tests green). - Versions: bot v2.0.0 · iterion worktree branch (rollout of 2026-07-07).
- Shape: the v1 detect_ui (claw) → rgaa_review (claude_code) split collapsed into ONE campaign auditor (surface classification = its phase-0 opening move; one session, DSFR MCP from turn one). 6 nodes → 5 exec; the deterministic anti-façade machinery (inventory, scan_health hard-fail, cap_findings, report_card) is unchanged.
- Next: a live dogfood on a DSFR UI repo + bilan here.
