Skip to content

chore(release): merge v0.19.0 to main - #672

Merged
ajianaz merged 19 commits into
mainfrom
release/v0.19.0
Oct 16, 2026
Merged

ajianaz merged 19 commits into
mainfrom
release/v0.19.0

Conversation

@ajianaz

@ajianaz ajianaz commented Oct 16, 2026

Copy link
Copy Markdown
Collaborator

What

Merge the v0.19.0 release into main: everything on develop since v0.18.0 (agent-as-reviewer MCP tools and the /cora-review skill, review and scan without an API key, --no-llm, the prepare / judge / finalize seam, validation of judge output, max_findings 50 with critical and major never hidden, false-positive fixes for the secret and SQL rules, test-code awareness, audit hardening, help text and env-secret fix) plus the final changelog fold (#671). Version in Cargo.toml / Cargo.lock is already 0.19.0 (#668).

Why

GitFlow: develop to main through a PR, then the tag v0.19.0 on main (the release workflow checks that the tag is on main, signs the checksums and publishes).

Testing

  • develop CI is green on every merged PR; this PR re-runs the full CI on the release head.
  • Local on the same code: cargo test --features tree-sitter (1258 unit + 20 CLI tests), clippy -D warnings, fmt, cora --version prints 0.19.0, and a real agent run (cora MCP, no API key) reviewed a staged diff end to end.
  • Not done here: the tag. It is created after this PR is merged.

ajianaz and others added 19 commits October 15, 2026 12:06
…es (#656)

Lockfile-only patch bumps: rustls 0.23.46 and quinn-proto 0.11.19 fix
nine advisories; chacha20 0.10.2 replaces a yanked release.

Signed-off-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
Replace six hand-copied versions of severity filtering, should_block,
quality gate, exit code, debt snapshot and review history (review single
and chunked, commit, scan, MCP, engine fallback) with engine::finalize.

MCP review_diff now honors min_severity and gates on the reported
findings; commit records its review in the history.

Signed-off-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
…#649) (#651)

review::prepare builds a judge::Packet, a Judge returns findings
(HttpJudge = today's LLM call, NoJudge = deterministic only), and
review::review_with merges, guards paths, post-processes and decides
should_block. The pipeline now has end-to-end tests with a fake judge.
Spinners move out of the llm module into progress::Spinner.

Signed-off-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
…by the exact prompts (#644) (#652)

judge::admit clears rule_id, bounds text and count, drops files and
lines the diff does not contain; applied to review and scan. The Packet
now carries the finished hardened prompts, and the review cache moves
behind HttpJudge keyed by those prompts, storing the raw model answer so
ignore.rules, min_severity and rules are applied on cache hits too.
Scan batches get an untrusted-data fence.

Signed-off-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
…am (#645) (#653)

deterministic::run_files serves whole files (scan, MCP snippet check) the
way run serves diffs, so built-in and custom rules now fire in scan.
ScanJudge (HttpScanJudge, NoJudge) makes the batch loop testable without
a network. DEFAULT_BATCH_TOKEN_BUDGET is renamed to CHAR_BUDGET and the
docs state which review flags scan lacks.

Signed-off-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
#646) (#654)

A missing API key now selects the deterministic judge instead of failing:
checks run, a stderr notice is printed, and the summary (and SARIF
invocation) says no LLM judged. --no-llm forces it. The judge is chosen
once at the entry point.

Signed-off-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
…w_diff runtime panic (#647) (#655)

cora.review_prepare/review_finalize and cora.scan_prepare/scan_finalize
let the calling agent be the judge with no LLM configured in cora.
Finalize is stateless and validates the agent's findings through
judge::admit. cora install also installs a /cora-review skill for
Claude Code.

Also fixes cora.review_diff panicking with 'Cannot start a runtime from
within a runtime': handlers now block via block_in_place.

Signed-off-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
…inks, agent tools (#657)

A hostile diff could hide findings: --- / +++ lines inside a hunk were
parsed as file headers. A judge issue on the same line could replace a
critical scanner finding. Scans followed symlinks out of the project and
enclosing-scope reads trusted diff paths. Also: dropped_by_validation,
files_fingerprint, should_block/gate on all findings, admit for
deleted/renamed files, install --remove keeps edited skills, no clippy
for --no-llm, docs/skill/tool-count corrections.

Signed-off-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
* fix(security): SARIF no-judge marker cannot be forged or missed

A model-written summary containing the marker sentence is stripped, and
the judge-failure fallback now carries the marker. Documents the
block_in_place multi-thread requirement of the MCP block_on helper.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Signed-off-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(security): strip the no-judge marker until none is left

A single replace pass let a nested marker reassemble after removal.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Signed-off-by: ajianaz <ajianaz@users.noreply.github.com>

---------

Signed-off-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
…n) (#659)

review_prepare listed all deterministic findings but review_finalize
showed only rules_engine.max_findings of them with no explanation, found
by running a real agent on a real project. prepare now reports the total
and the cap; finalize, scan_finalize and review_diff report not_shown.

Signed-off-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
…r findings (#660)

* fix(rules): max_findings defaults to 50 and never hides critical/major findings

The default cap of 5 hid serious findings (a module with 7 critical
findings showed 5). The cap now limits only Minor/Info noise: it keeps
every Critical and Major finding and fills the remaining slots with the
most severe noise, still reporting how many were not shown.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Signed-off-by: ajianaz <ajianaz@users.noreply.github.com>

* test(mcp): adapt the capped-findings test to the new default cap of 50

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Signed-off-by: ajianaz <ajianaz@users.noreply.github.com>

---------

Signed-off-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
…values (#661) (#664)

* fix(rules): secret rules ignore name: value entries with non-literal values (#661)

In source files a bare expression after name: (env reads, member access,
type annotations, dict values) is a reference or a type, never a secret,
and format placeholders are not values. Quoted literals are unchanged.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Signed-off-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(rules): harden the non-literal secret filter (fail-open cases)

Every name: value entry on a line must be a non-literal (a harmless first
entry no longer hides a later real secret), an env read with a literal
fallback stays flagged, and braced values containing digits are not
format placeholders.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Signed-off-by: ajianaz <ajianaz@users.noreply.github.com>

---------

Signed-off-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
#662) (#665)

A SQL keyword in a message is not SQL, and identifiers/SET fragments
cannot be bound as parameters. Only a value spliced into real SQL
(or string concatenation) stays a finding.

Signed-off-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
* feat(rules): test-code awareness for the built-in rules (#663)

Whole test files and Rust #[cfg(test)] modules / #[test] functions (also a
diff hunk inside mod tests) are exempt from the noisy rules; secret
scanners keep only their high-confidence patterns there. bug-println is
skipped in program entry points. rules_engine.include_tests turns it off.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Signed-off-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(security): test awareness cannot hide code (unclosed regions, injection in test blocks)

An unclosed #[cfg(test)] region in a whole file is dropped instead of
exempting the rest of the file, single-line raw strings no longer confuse
brace matching, and inline test blocks keep every security pattern except
the generic hardcoded-secret one.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Signed-off-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(security): test-region detection cannot be steered by comments or strings

Block comments are skipped when counting braces, and a test region is
dropped when an item starts at or left of its own indentation or its
closing brace does not balance the count, so a parser differential cannot
exempt production code. Column-0 text that is not a Rust item (TOML
fixtures in raw strings) does not abandon a region.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Signed-off-by: ajianaz <ajianaz@users.noreply.github.com>

* fix(security): same-line attribute items and block-comment attributes cannot exempt code

#[cfg(test)] fn helper() {} decorated the next line instead of its own
item, and an attribute inside a block comment counted as one. Comment
state is now tracked on every line so it cannot go stale.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Signed-off-by: ajianaz <ajianaz@users.noreply.github.com>

---------

Signed-off-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
* chore(release): v0.19.0

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Signed-off-by: ajianaz <ajianaz@users.noreply.github.com>

* chore(release): update the changelog compare links for v0.19.0

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Signed-off-by: ajianaz <ajianaz@users.noreply.github.com>

---------

Signed-off-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
…-help (#669)

Signed-off-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
## What
Rewrite `AGENTS.md` to the fleet baseline structure (public variant):
repo-specific notes first (build and test commands, the conventions CI
enforces, gotchas), then the session-start ritual and the workflow
summary. The "Commits & PRs" section from #667 is removed: it spelled
out message-policy text that belongs in the team standard, not in a
repo-visible file.

## Why
The baseline keeps `AGENTS.md` generic and policy-free (ritual,
workflow, continuity) and enforces message hygiene with tooling instead.
#667 predates that clarification.

## Testing
- Docs-only. Rendered and read through; no internal room names or paths
(public repo wording), no credentials.
- Branch name, PR body sections and sign-off follow what CI checks; CI
results are on this PR.


Signed-off-by: ajianaz <ajianaz@users.noreply.github.com>

Signed-off-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
Signed-off-by: ajianaz <ajianaz@users.noreply.github.com>
@ajianaz
ajianaz merged commit f7b9418 into main Oct 16, 2026
29 checks passed
@ajianaz
ajianaz deleted the release/v0.19.0 branch October 16, 2026 02:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant