Regex patterns matching script-generated fallback text that must never
appear in a published article.
Source of each pattern (grep-anchored to the code that could emit it):
AI_MARKER — the canonical unfilled-slot sentinel
(src/constants/analysis-constants.ts). If this leaks through, the AI
agent failed to author the slot.
"This parliamentary activity on ...", "Civil society organisations
monitoring ...", "Industry and business stakeholders observe ...",
"National governments assess ...", "EU citizens experience ...",
"EU institutional dynamics show ..." — legacy deriveStakeholderReasoning
template sentences. New code emits AI_MARKER instead, so any match is
an article that regenerated against the old logic or copied the text
verbatim from a template.
"Voting outcomes 2026-MM-DD–2026-MM-DD" and "voting period
2026-MM-DD–2026-MM-DD" — buildVotingAnalysis date-range topic fallback
(src/generators/builders/voting-builders.ts). Indicates the AI did not
supply a substantive topic label for the stakeholder outcome matrix.
"Stakeholder impact assessment for ... indicates ... relevance." —
the legacy default branch of deriveStakeholderReasoning.
The sentinel patterns [AI_ANALYSIS_REQUIRED], [REQUIRED], and
AI_ANALYSIS_PENDING are matched with their exact casing — the generators
emit these literal strings and we do NOT want to match user-authored prose
that happens to mention them in a different case. The prose and date-range
patterns are case-insensitive (i flag). All patterns are evaluated against
a whitespace-normalised copy of the HTML (see normalizeHtmlForScan), so
they are tolerant of HTML reflow, newlines, and inter-tag whitespace
without needing dotAll.
Update this list whenever a new fallback-sentinel is introduced in the
generators; the test suite asserts that every new sentinel is added here
so that the validator can detect it.
Regex patterns matching script-generated fallback text that must never appear in a published article.
Source of each pattern (grep-anchored to the code that could emit it):
AI_MARKER— the canonical unfilled-slot sentinel (src/constants/analysis-constants.ts). If this leaks through, the AI agent failed to author the slot.deriveStakeholderReasoningtemplate sentences. New code emitsAI_MARKERinstead, so any match is an article that regenerated against the old logic or copied the text verbatim from a template.buildVotingAnalysisdate-range topic fallback (src/generators/builders/voting-builders.ts). Indicates the AI did not supply a substantive topic label for the stakeholder outcome matrix.buildBreakingAnalysisdate-only topic fallback (src/generators/builders/breaking-builders.ts).defaultbranch ofderiveStakeholderReasoning.The sentinel patterns
[AI_ANALYSIS_REQUIRED],[REQUIRED], andAI_ANALYSIS_PENDINGare matched with their exact casing — the generators emit these literal strings and we do NOT want to match user-authored prose that happens to mention them in a different case. The prose and date-range patterns are case-insensitive (iflag). All patterns are evaluated against a whitespace-normalised copy of the HTML (seenormalizeHtmlForScan), so they are tolerant of HTML reflow, newlines, and inter-tag whitespace without needing dotAll.Update this list whenever a new fallback-sentinel is introduced in the generators; the test suite asserts that every new sentinel is added here so that the validator can detect it.