Skip to content

Add support for Spain, France, Italy, and Netherlands + audit config defaults - #23

Merged
likeBloodMoon merged 5 commits into
masterfrom
claude/upgrade-plan-0-5-0-pl7eqo
Sep 1, 2026
Merged

Add support for Spain, France, Italy, and Netherlands + audit config defaults#23
likeBloodMoon merged 5 commits into
masterfrom
claude/upgrade-plan-0-5-0-pl7eqo

Conversation

@likeBloodMoon

Copy link
Copy Markdown
Owner

Summary

This release expands eaa-kit's geographic and linguistic coverage while introducing a new feature for managing audit defaults through the config file.

Key Changes

New Country Support

  • Added statements for Spain (ES), France (FR), Italy (IT), and Netherlands (NL) in addition to the existing Austria, Germany, and Switzerland support
  • Each country has statements in both its native language and English, based on the respective national accessibility laws:
    • Spain: Ley 11/2023
    • France: Ordonnance n° 2023-859 and Loi n° 2005-102
    • Italy: Decreto Legislativo 82/2022 (d.lgs. 82/2022)
    • Netherlands: Implementatiewet toegankelijkheidsvoorschriften producten en diensten
  • Language matrix is intentionally sparse: each country only supports its native language and English (no cross-country fallbacks)

Audit Configuration Defaults

  • New audit block in eaa.config allows projects to specify default audit flags once instead of repeating them in build scripts
  • Supports all audit command options: failOn, browser, concurrency, fast, include, exclude, baseline, etc.
  • Implements proper precedence: config file provides defaults, CLI flags override them
  • Config file is optional; projects without one continue to work as before

Configuration Schema Updates

  • Extended COUNTRIES from ['AT', 'DE', 'CH'] to ['AT', 'DE', 'CH', 'ES', 'FR', 'IT', 'NL']
  • Extended STATEMENT_LOCALES from ['de', 'en'] to ['de', 'en', 'es', 'fr', 'it', 'nl']
  • Added AUDIT_FORMATS constant to src/config/define.ts for validation
  • Added AuditConfig type for the new audit block schema

Implementation Details

  • New auditDefaults() function in src/cli/command.ts loads audit defaults from config
  • New loadAuditConfig() function in src/config/load.ts for parsing the audit block
  • Updated renderStatement() to validate that requested language is available for the selected country
  • Added comprehensive test coverage for config defaults and new statement templates
  • Updated documentation and examples to reflect new capabilities

Version Bump

  • Version updated to 0.5.0 across package.json, examples, and documentation

https://claude.ai/code/session_013WKUrBVgwFFGLbsfN46MBF

The flag landed on the CLI and nowhere else. A build plugin and the
GitHub Action are how most people run this in CI, and neither could
reach the feature the changelog sells them — a plugin option that does
not exist and an action input that is not there are not something a
reader discovers before trying.

IntegrationOptions gains `fast`, which is all five plugins: auditBuild
spreads everything but its own two keys into the audit command, so
naming the flag once is naming it everywhere. That pass-through was
untested, and is the whole mechanism, so it is asserted now rather than
rediscovered the next time a flag is added.

The action gets a `fast` input threaded through EAA_FAST, built into
the argument list the way allow-remote already is.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013WKUrBVgwFFGLbsfN46MBF
The config file has served the statement alone since 0.2, so a project
that audits with the same six flags on every run has had nowhere to
write them down but the build script that repeats them. An `audit` block
is that list, said once.

Everything in it is a default and every typed flag beats it: the file is
what a project usually wants, and a flag is what somebody wants on this
run. A config nobody could override would make a one-off --browser check
impossible without editing a committed file.

Two things this needed. --fail-on and --format lose their commander
defaults, because commander writes a default into the parsed options
whether or not the flag was typed, and that would have silently
overruled the file on the two flags most worth putting in it; both still
default in the command, to the values the help text names. And the block
is read by a schema of its own rather than through parseConfig, so a
project wanting audit defaults does not have to write a whole statement
config to get them — s.object drops what it does not know, so one file
still serves both readers.

`baseline` reads the keys that mean the same thing to it. `output` is
the report's path for one command and the baseline's for the other, so
it is never carried across; format, failOn and baseline describe a
verdict baseline does not reach.

The merge is a function rather than four lines in the action, because
the precedence is the whole feature and commander's actions are the one
part of this CLI a test cannot call.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013WKUrBVgwFFGLbsfN46MBF
Three countries was the DACH region and the tool is named after an EU
directive. These four are the largest markets it applies in, and each
one gets a document under its own law rather than a translation of the
Austrian one — the rule Switzerland already set here.

That means four more languages. site.locale now picks any of the six
rather than testing for a German prefix, and each has a region for its
dates, because a bare language tag leaves the format to whatever ICU
picks and these documents have always been dated the European way.

The matrix is sparse on purpose: a country has the language its law is
administered in, and English. Asking for a combination nobody wrote is
an error naming what that country does have, not a fall back to another
language — publishing somebody's legal document in a language their
readers may not have, quietly, is worse than stopping.

Where a national regime prescribes a declaration of its own, the
template says so rather than letting a generated file look like it
discharges the obligation: France's RGAA declaration and multi-year plan
under art. 47 of loi 2005-102, Italy's dichiarazione filed on AgID's
model by 23 September each year, and Spain's RD 1112/2018 statement for
the public sector. Where supervision is genuinely split — Spain between
the state and the autonomous communities, the Netherlands between six
authorities — the template says that too rather than naming one body and
sounding certain.

Statutes and authorities, verified against:
  ES  Ley 11/2023, de 8 de mayo (BOE-A-2023-11022)
  FR  ordonnance n° 2023-859; art. 47 loi n° 2005-102; Arcom
  IT  d.lgs. 82/2022 art. 21, amending l. 4/2004; AgID
  NL  Implementatiewet toegankelijkheidsvoorschriften producten en
      diensten, in force 28 June 2025; ACM for services, RDI for products

Every template ships with a whole-document snapshot, and a test now
asserts the snapshot matrix covers the template directory, so a country
added without one cannot ship prose no reader has seen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013WKUrBVgwFFGLbsfN46MBF
v0.4.0 was tagged before PRs #21 and #22 merged, so master has carried
three Unreleased sections since: the fingerprint fix that moves both
file contracts to schemaVersion 2, --fast, the browser and start-up
work, and six bugs found by using 0.4.0 on real builds. Folded into one
section with this release's own three additions.

The JSON report and baseline schemaVersions are the entry to read.
docs/reports.md gets a "Coming from 0.4.0" note saying what refuses what
and why, since a consumer that never touches fingerprint needs no change
at all and should not have to work that out from the changelog.

The Action example and the integrations doc pinned @v0.4.0; examples/
is regenerated so the version it stamps is the one being published.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013WKUrBVgwFFGLbsfN46MBF
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

The reference docs were updated as each feature landed, and the front
door was not: README opened by describing a DACH-only tool, its
documentation table said "the three countries", and it mentioned neither
the audit config block nor --fast anywhere. package.json — which is the
first line anybody reads on npm — named the same three statutes. Someone
arriving at the repo could not tell that Spain, France, Italy and the
Netherlands are supported.

README keeps the DACH origin, because that is who this was built for and
those are the words people search, and names the reach beside it. The
statement bullet leads with what the document is called in three of the
seven countries, and says the thing worth knowing before somebody
publishes one: a national regime may ask for more than this file.

"Says it once" is the audit block's first mention outside docs/audit.md.
npm keywords gain the terms somebody in the new markets would type.

examples/ gains one French statement. One rather than four: the other
three differ in their statute and their enforcement section, and four
near-identical documents would be paid for in the diff of every release.
It is generated from the same Austrian config as the rest, so it lists
barriers written in German — the examples README now says why, because
it reads as a bug and is the template refusing to translate somebody
else's prose.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013WKUrBVgwFFGLbsfN46MBF
@likeBloodMoon
likeBloodMoon merged commit 6a12b8b into master Sep 1, 2026
4 checks passed
@likeBloodMoon
likeBloodMoon deleted the claude/upgrade-plan-0-5-0-pl7eqo branch September 2, 2026 07:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants