Changed
- Python source scanning uses AST extraction for embedded prompts and the P1/P2 pipeline checks while preserving the offline, deterministic scan contract.
- An unsupported embedding experiment was removed from the candidate before release because an unavailable backend could not be distinguished from a clean result.
Added
- Provider-neutral preflight candidate: deterministic analysis of one present
instruction plus typed explicit context, with PF001-PF005 exact evidence,
ALLOW | NOTICE | HOLD | UNAVAILABLE | ERROR, redacted-by-default JSON, and
explicit source-bound correction previews. It never retrieves history or sends to a provider. - Version-of-record consistency gate (
tests/test_version_consistency.py): assertslintlang.__version__equalspyproject.toml's[project].version, reading source directly so it holds in a fresh clone. Fixes and guards against the prior drift where__version__reported0.2.1while the published artifact was0.2.2. This is the "separate gate" thattest_docs_consistency.pynames as out of its scope. - Fatal input-integrity channel: missing, unreadable, or malformed requested inputs now produce explicit
ERRORresults in the CLI,scan_file(), andscan_directory(), and the CLI exits 1 regardless of--fail-on; another valid input can no longer mask omitted coverage. compute_verdict(result)and the public terminal/Markdown formatters preserve thatERRORstate instead of treating an unread input with zero findings as clean; passing a findings list remains compatible after successful input.- JSON output includes
input_errorfor every path and usesverdict: ERRORfor input failures instead of converting parse errors to INFO/PASS lint findings. - README examples now report 0.3.1, and verdict/detector language is scoped to
structural findings rather than runtime guarantees. - Documentation consistency checks now forbid brittle suite-size claims and
scope the bundled samples as regression fixtures rather than accuracy evidence.
Notes
- Zero runtime dependency change —
pyyamlremains the only runtime dependency. 0.3.0was never published to PyPI or created as a GitHub Release. A public
v0.3.0Git tag already points to an older, pre-fix commit, so this release
advances to0.3.1rather than moving or reusing that immutable tag.