Source
Discussion #3023 (mikegrogan, stock 4.0.3 on ACF 2025). Verified and reproduced on Adobe 2023 — this is an all-Adobe crash, not an ACF 2025 quirk.
Bug
vendor/wheels/Dispatch.cfc:400 ends the enablePublicComponent=false anti-fingerprinting block (issue #2233) with bare cfabort;. That statement form is Lucee-only; Adobe parses it as a reference to an undefined variable named cfabort and throws Variable CFABORT is undefined at runtime.
Blast radius: in testing/production the public component is disabled, and the stock app's homepage is served by it — so GET / on a stock Adobe install in testing/production hits this branch on every request:
- testing (
showErrorInformation=true): raw Variable CFABORT is undefined error page (discussion symptom 2).
- production: the block emits
Not Found, then the crash bubbles into the friendly error template — composite Not Found + "Something went wrong", HTTP 500 (discussion symptom 3, byte-for-byte).
Repro (docker harness, environment=testing): Adobe 2023 → GET /wheels/info = HTTP 500, body Not Found + CFABORT-undefined error. Lucee 7 control → clean 404 Not Found, 10 bytes.
Why CI never caught it
vendor/wheels/tests/specs/security/PublicComponentProductionSpec.cfc:188-208 validates this branch by source inspection (regex for statuscode=404) — the branch has zero execution coverage on any engine.
Fix
- One token:
cfabort; → abort; (only bare-script occurrence in vendor/wheels; public/views/cli.cfm:1085 and wheelstest/.../XMLConverter.cfc:255 are tag-context <cfabort>, fine).
- Add a structural guard spec forbidding bare
cfabort; statements in script context across vendor/wheels/**/*.cfc (an abort cannot execute inside a spec without killing the runner, so the structural scan + a documented manual cross-engine repro is the practical gate).
- Acceptance: on BOTH Lucee 7 and Adobe 2023 (docker harness,
environment=testing), GET /wheels/info and GET / return clean 404 Not Found with no error template.
Candidate for a new Cross-Engine Invariant in CLAUDE.md: bare tag-in-script statements without parentheses (cfabort;) are Lucee-only — use the script keyword (abort;) or parenthesized form.
Source
Discussion #3023 (mikegrogan, stock 4.0.3 on ACF 2025). Verified and reproduced on Adobe 2023 — this is an all-Adobe crash, not an ACF 2025 quirk.
Bug
vendor/wheels/Dispatch.cfc:400ends theenablePublicComponent=falseanti-fingerprinting block (issue #2233) with barecfabort;. That statement form is Lucee-only; Adobe parses it as a reference to an undefined variable namedcfabortand throwsVariable CFABORT is undefinedat runtime.Blast radius: in
testing/productionthe public component is disabled, and the stock app's homepage is served by it — soGET /on a stock Adobe install in testing/production hits this branch on every request:showErrorInformation=true): rawVariable CFABORT is undefinederror page (discussion symptom 2).Not Found, then the crash bubbles into the friendly error template — compositeNot Found+ "Something went wrong", HTTP 500 (discussion symptom 3, byte-for-byte).Repro (docker harness,
environment=testing): Adobe 2023 →GET /wheels/info= HTTP 500, bodyNot Found+ CFABORT-undefined error. Lucee 7 control → clean404 Not Found, 10 bytes.Why CI never caught it
vendor/wheels/tests/specs/security/PublicComponentProductionSpec.cfc:188-208validates this branch by source inspection (regex forstatuscode=404) — the branch has zero execution coverage on any engine.Fix
cfabort;→abort;(only bare-script occurrence in vendor/wheels;public/views/cli.cfm:1085andwheelstest/.../XMLConverter.cfc:255are tag-context<cfabort>, fine).cfabort;statements in script context acrossvendor/wheels/**/*.cfc(anabortcannot execute inside a spec without killing the runner, so the structural scan + a documented manual cross-engine repro is the practical gate).environment=testing),GET /wheels/infoandGET /return clean404 Not Foundwith no error template.Candidate for a new Cross-Engine Invariant in CLAUDE.md: bare tag-in-script statements without parentheses (
cfabort;) are Lucee-only — use the script keyword (abort;) or parenthesized form.