v0.3.0
What's Changed
- fix(ci): pin npm major and grant pypi job repo read
- fix(ci): read the wrapper version from its real source
- feat(ops): issue-first workflow and a three-lens review
- docs(agents): retarget subagents at the verification layer
- docs(preflight): code-format the classification values
- docs(dev-docs): v0.3.0 release readiness checklist
- chore(release): v0.3.0
- docs(release): add pypi release steps and the publish ordering
- docs: install from the published 0.3.0 release, not from source
- docs(release): reposition the pip wrapper readme on verification
- fix(release): resolve the node cli in the pip wrapper, never install it
- fix(release): apache-2.0 and release metadata for the pip wrapper
- style(verify): f-string in the sidecar error path
- test(verify): pin fixture line endings and normalize on read
- fix(verify): byte-exact sidecar io and a reason for unknown
- test(verify): drop version-dependent excluded-line assertion
- docs(verify): drop em dashes from the attribution rework prose
- fix(verify): attribute coverage by AST statement containment
- fix(verify): attribute coverage per statement, not physical line
- docs: accept src and sys in vale vocabulary
- docs(verify): oracle-limit example and shadow sys.path guidance
- fix(analyze): quote-aware tokenizing, report-step failure honesty
- fix(analyze): measure script-form test cmds, no fake zero coverage
- docs: accept subprocess terms in vale, use verdict casing
- revert(verify): blanket-skip pycache in shadow tree
- fix(verify): key new-file and submodule guards off disk, not diff claims
- fix(verify): match spec/mts FAIL lines in vitest summarizer (M1)
- fix(verify): retry new failures on a fresh shadow tree (I1)
- fix(verify): floor verdict at UNPROVEN when tests flaky (C1)
- docs(verify): note subprocess coverage gap and SAFE suite limits
- fix(verify): drop changed file sibling pycache in shadow tree
- fix(verify): reject anchorless, submodule, and non-UTF-8 diff inputs
- fix(verify): make tests gate flaky-aware with retry-once delta
- fix(verify): honest reason for removal-only diffs
- fix(analyze): probe coverage by module execution, not import
- fix(verify): close quoted-path empty-deletion gap from review
- fix(verify): reject deleted/renamed/binary diffs instead of dropping
- docs: accept repo and builtins in vale vocabulary
- docs: point vale at the vocabulary via explicit config
- docs: add vale vocabulary so spellcheck accepts product terms
- fix(analyze): ignore phantom coverage files, satisfy self-gate
- fix(verify): tolerate CRLF in sidecar output on Windows
- test(verify): lock fail-closed invariant for sidecar failure
- fix(verify): make imports gate delta-aware and TYPE_CHECKING-safe
- docs: quote frontmatter descriptions containing colons
- docs: normalize remaining transforms-index links
- docs: apply first-run and navigation review fixes
- docs: correct verify-path behavior claims from review
- docs: remove em-dashes across user-facing pages
- docs(concepts): add determinism illustration to why-no-llm
- docs(readme): lead with the verification layer positioning
- docs(changelog): add unreleased verify-diff, mcp, preflight entry
- docs: reframe faq, transforms intro, and reference for verify
- docs(concepts): reframe safety model and determinism for verify
- docs: reposition overview and quickstart to verification layer
- docs(verification): add verify-diff, mcp, verdicts, preflight pages
- docs(assets): add verification-layer brand marks and illustrations
- fix(verify): normalize CRLF before changed-line diff, no false SAFE
- fix(ci): install coverage.py into the python3 the tests spawn
- fix(docs): dedent Update closers so changelog.mdx parses (#76)
- fix(verify): preserve baseline-fail marker past tail truncation
- fix(verify): no false-SAFE mixed-lang, UNPROVEN no-runner, =-form flags
- test: run subprocess-heavy files serially to fix parallel flake
- feat(mcp): verify_change MCP server
- fix(cli): clean error and exit 2 on bad or empty verify-diff input
- feat(cli): verify-diff command
- feat(verify): verifyDiff — verify an arbitrary diff end-to-end
- feat(verify): three-way verdict fusion (SAFE/UNSAFE/UNPROVEN)
- fix(verify): ignore no-newline marker in changed-line derivation
- feat(verify): diff ingestion for arbitrary changes
- docs(phase2): strategy, roadmap, verifyDiff+MCP spec and plan
- docs(g0): phase-0b app-corpus results + reusable harness
- fix(preflight): guard empty-report banner + probe pytest in integration
- test(preflight): integration over a covered/uncovered sqlalchemy fixture
- feat(cli): wire preflight command into dispatcher + help
- feat(cli): add preflight command for migration safety report
- feat(cli): render migration safety report
- test(analyze): cover fail-safe verdict + safe/site assertions
- feat(analyze): safety-verdict classifier for migration sites
- chore(dev-docs): mark Model.query class-attr re-trial condition done
- chore(dev-docs): phase 0 redo — accuracy + table parity fixes
- chore(dev-docs): phase 0 redo — class-attr fix + new G0 verdict
- test(analyze): coverage tagging works for class-attr findings
- test(analyze): drop tautological line>0 assert in class-attr dedup test
- test(analyze): assert single finding per class-attr chain (no dupes)
- test(analyze): cover class-attr form across every flag reason
- feat(analyze): handle Model.query class-attr form in sqlalchemy detector
- chore(dev-docs): phase 0 G0 results — stop at threshold
- fix(analyze): normalize covered-line keys so detector lookups hit
- feat(analyze): tag sqlalchemy findings with test coverage
- feat(analyze): python line-coverage reporter via coverage.py
- feat(analyze): sqlalchemy-query detector with safe/flag classification
Install
npm install -g refactron@
What's Changed
- fix(docs): dedent Update closers so changelog.mdx parses by @omsherikar in #76
- feat(preflight): coverage-aware SQLAlchemy migration safety report by @omsherikar in #74
- feat(v0.3): SQLAlchemy migration phase 0 — detector + coverage reporter by @omsherikar in #72
- feat(verify): verifyDiff + MCP verify_change — verify any diff before it lands by @omsherikar in #75
- docs: reposition to the verification layer for AI code change by @omsherikar in #77
- fix(verify): delta-aware imports gate, no false UNSAFE on real code by @omsherikar in #78
- fix(verify): reject deletion/rename/copy/binary diffs, no false SAFE by @omsherikar in #79
- fix(analyze): probe coverage by module execution, not import by @omsherikar in #80
- fix(verify): honest reason for removal-only diffs by @omsherikar in #81
- feat(verify): flaky-aware tests gate with fresh-tree retry, UNPROVEN floor by @omsherikar in #83
- fix(verify): reject anchorless, submodule, non-UTF-8 diffs; lock shadow immunity by @omsherikar in #82
- fix(analyze): script-form coverage, honest unknowns, shadow-bypass guard by @omsherikar in #84
- docs(verify): oracle-limit example and shadow sys.path guidance by @omsherikar in #85
- fix(verify): attribute coverage by AST statement containment by @omsherikar in #86
- feat(ops): issue-first workflow and verification-aware subagents by @omsherikar in #88
- chore(release): v0.3.0 by @omsherikar in #87
- fix(ci): read the wrapper version from its real source by @omsherikar in #90
- fix(ci): pin npm major and grant pypi job repo read by @omsherikar in #93
Full Changelog: v0.2.4...v0.3.0