Appendix A of the paper, in full · exported from ruleset.py, hardening.py and gpai.py

Rule set

A first, reviewable encoding: regular expressions over normalised free text, each rule bound to the provision it cites. Strong rules finalise a candidate outcome; the single weak rule, Hw, is a protective net that only ever routes to review. Coverage limits are disclosed in place: Art. 50(3) is not represented, T3 covers only the deep-fake limb of Art. 50(4), and Annex I is out of scope entirely.

Cycle 2 hardening

Synonym normalisation

Applied to the raw text before matching, case-insensitive. Domain paraphrases mapped to the canonical terms the strong rules recognise; not test-specific.

Persons-net

If the base outcome is minimal or limited and the text matches both a consequential-decision expression and a person expression, the outcome becomes INDETERMINATE — you can paraphrase away the sector keyword, but not the fact that you decide about people.

GPAI status (orthogonal, Chapter V)

Two alternatives in the GPAI pattern, \bGPAI\b and \bLLM\b, are upper-case literals tested against text the engine has already lower-cased, so neither can fire in the artifact or here. The remaining alternatives (foundation model, general-purpose ai, large language model, frontier model) carry the detection, and every GPAI figure the paper reports was produced with the pattern exactly as shown. Correcting it would change the rule set, so it is recorded here rather than silently fixed in the port.