Problem
In .github/workflows/rsr-antipattern.yml, the BUILTIN_GLOBS = [...] list and the per-repo exemption parser were placed after the Python heredoc terminator PYEOF, so bash tries to execute them as shell commands. Result:
✅ No TypeScript files outside allowlist (0 per-repo exemption(s) parsed).
/home/runner/work/_temp/...sh: line 114: BUILTIN_GLOBS: command not found
##[error]Process completed with exit code 127.
(The Python block runs to completion and prints the success line, then bash chokes on the stray Python-syntax lines.)
Impact
antipattern-check job is always red for every repo using this template. Confirmed in:
(Probably every other repo that has this workflow; the success path was unreachable.)
Fix
Move the BUILTIN_GLOBS array and exemption-table parser into the heredoc (above PYEOF), or rewrite as a standalone Python script invoked from the YAML.
The downstream behavior the bash side wants — passing builtins and CLAUDE.md exemptions to the Python script — already exists in the Python code, so the dead bash block can simply be deleted once we confirm Python is the source of truth.
Problem
In
.github/workflows/rsr-antipattern.yml, theBUILTIN_GLOBS = [...]list and the per-repo exemption parser were placed after the Python heredoc terminatorPYEOF, so bash tries to execute them as shell commands. Result:(The Python block runs to completion and prints the success line, then bash chokes on the stray Python-syntax lines.)
Impact
antipattern-checkjob is always red for every repo using this template. Confirmed in:(Probably every other repo that has this workflow; the success path was unreachable.)
Fix
Move the
BUILTIN_GLOBSarray and exemption-table parser into the heredoc (abovePYEOF), or rewrite as a standalone Python script invoked from the YAML.The downstream behavior the bash side wants — passing builtins and CLAUDE.md exemptions to the Python script — already exists in the Python code, so the dead bash block can simply be deleted once we confirm Python is the source of truth.