diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 432dcb5c..2261d730 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "agentic-qe", - "version": "3.13.1", + "version": "3.13.3", "description": "Agentic Quality Engineering — AI-powered QE platform with 60 specialized agents, 75+ skills, sublinear coverage analysis, ReasoningBank pattern learning, and deep MCP integration for Claude Code and 11 coding agent platforms", "author": { "name": "Agentic QE Team", diff --git a/.claude/skills/skills-manifest.json b/.claude/skills/skills-manifest.json index 989b65b1..350be8a8 100644 --- a/.claude/skills/skills-manifest.json +++ b/.claude/skills/skills-manifest.json @@ -940,7 +940,7 @@ }, "metadata": { "generatedBy": "Agentic QE Fleet", - "fleetVersion": "3.13.2", + "fleetVersion": "3.13.3", "manifestVersion": "1.4.0", "lastUpdated": "2026-04-13T00:00:00.000Z", "contributors": [ diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a373458..7bf9efb8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,49 @@ All notable changes to the Agentic QE project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [3.13.3] - 2026-07-29 + +Two independent quality-of-evidence fixes: learning capture could stop silently +for days on a filesystem where WAL is disabled, and QE-Court shipped a default +review panel that violated its own anti-collusion rule. + +### Fixed + +- **Learning capture no longer stops silently when `AQE_DISABLE_WAL` is set.** + With that flag on, AQE tried to switch the database journal mode on *every* + writable connection. That switch needs exclusive access, so any other process + holding the database open — a stray MCP server, for example — made the attempt + fail and take the whole persistence layer down with it. Hooks kept reporting + success while nothing was being recorded, which hid the outage for days. + + AQE now only changes the journal mode when it is actually wrong (so normal + operation never needs the exclusive lock), refuses to write in a mode you have + declared unsafe rather than risking corruption, and — when something really is + holding the database — tells you the exact command that finds it instead of + guessing which process to blame. + +- **QE-Court's shipped default panel violated `writerIsNeverJuror`** ([#576]). + The bundled `config.json` seated the defense and the jury on two tiers of the + same vendor, which is exactly what the court's core anti-collusion rule + forbids — so a brand-new project got an invalid panel with no user action. + Worse, the rule could never have caught it: nothing turned the configured + routing into a panel, so validation never ran outside its own unit test, and + the config's `options` block was not wired to anything. + + The default panel is now genuinely cross-vendor (and keeps the deeper-review + round on a different vendor from the jury, so escalation stays independent), + validation is a required step before a court convenes, the `options` block + actually takes effect, and the shipped config files are checked in CI so this + cannot regress unnoticed. Reported by @pacphi. + +### Changed + +- The bundled statusline refreshes every 60 seconds instead of every 5. It + reopened the learning database on every tick, adding constant pressure to the + same lock the fix above depends on. + +[#576]: https://github.com/proffesor-for-testing/agentic-qe/issues/576 + ## [3.13.2] - 2026-07-24 Stops short-lived learning hooks from repeatedly producing diff --git a/assets/skills/skills-manifest.json b/assets/skills/skills-manifest.json index 989b65b1..350be8a8 100644 --- a/assets/skills/skills-manifest.json +++ b/assets/skills/skills-manifest.json @@ -940,7 +940,7 @@ }, "metadata": { "generatedBy": "Agentic QE Fleet", - "fleetVersion": "3.13.2", + "fleetVersion": "3.13.3", "manifestVersion": "1.4.0", "lastUpdated": "2026-04-13T00:00:00.000Z", "contributors": [ diff --git a/docs/releases/README.md b/docs/releases/README.md index 6c894451..abf0916f 100644 --- a/docs/releases/README.md +++ b/docs/releases/README.md @@ -4,6 +4,7 @@ All Agentic QE release notes organized by version. | Version | Date | Highlights | |---------|------|------------| +| [v3.13.3](v3.13.3.md) | 2026-07-29 | Learning capture no longer stops silently under `AQE_DISABLE_WAL` (it now refuses to write in an unsafe journal mode and names what is holding the DB), and QE-Court's shipped panel no longer violates its own `writerIsNeverJuror` rule (#576). | | [v3.13.2](v3.13.2.md) | 2026-07-24 | Stops hook-driven `brain.rvf`/`patterns.rvf` corruption loops by closing native stores after every hook and protecting same-process live locks (#574). | | [v3.13.1](v3.13.1.md) | 2026-07-23 | Honesty release: coverage analysis no longer reports numbers it never measured (real `cargo llvm-cov` for Rust; uncollected metrics are `null`, not 0 or 100), `test_generate_enhanced` actually calls your LLM (#567), and a HIGH advisory no longer ships via an optional peer (#565). Adds on-disk per-agent LLM routing (#568) and Codex CLI QE skills. BREAKING: coverage metrics are now `number \| null`. | | [v3.13.0](v3.13.0.md) | 2026-07-18 | QE-Court: adversarial review where a change is prosecuted by independent cross-vendor AI reviewers and a SHIP verdict must survive an escalating deeper review — it reviewed this release and blocked it, catching 3 data-loss/crash bugs. Adds a Codex (GPT) provider, a significance gate for the flywheel, automatic memory.db recovery, per-agent cost tracking, and clears 4 HIGH CVEs from consumer installs (#565). | diff --git a/docs/releases/v3.13.3.md b/docs/releases/v3.13.3.md new file mode 100644 index 00000000..7a6409c1 --- /dev/null +++ b/docs/releases/v3.13.3.md @@ -0,0 +1,90 @@ +# v3.13.3 Release Notes + +**Release Date:** 2026-07-29 + +## Highlights + +Two fixes about evidence you can trust. Learning capture could stop recording +for days without saying so on any project that sets `AQE_DISABLE_WAL`, and +QE-Court shipped a default review panel that broke the court's own +anti-collusion rule the moment it was created. + +## Fixed + +### Learning capture no longer stops silently under `AQE_DISABLE_WAL` + +`AQE_DISABLE_WAL=1` exists for filesystems where SQLite's WAL journal is unsafe +— notably macOS Docker bind mounts, where it has corrupted the learning database +before. With the flag set, AQE attempted to switch the journal mode on **every** +writable connection. + +Changing a database's journal mode requires exclusive access. Any other process +holding the database open makes that attempt fail, and the failure took the +whole persistence layer down with it: the memory manager could not initialize, +so nothing was recorded. The hooks kept returning success, so from the outside +everything looked healthy while no learning was being captured at all. The +condition could not clear on its own, because the switch can never succeed while +any reader exists. + +What changed: + +- AQE reads the current journal mode first and only attempts a change when it is + actually wrong. Normal operation no longer needs the exclusive lock at all, so + the one-time migration is out of the everyday path. +- Only genuine lock contention is treated as such. Other faults — I/O errors, + corruption, permissions — now surface as themselves instead of being + misreported as "something else is using the database". +- If the journal mode cannot be changed, AQE **refuses to write** rather than + continuing in a mode you have declared unsafe. Availability is not worth + risking the database you enabled the flag to protect. +- The change is verified after it is applied, so a silently ignored switch + cannot leave AQE writing in the unsafe mode believing it is safe. +- The diagnostic now prints the exact command that lists whatever is holding the + database, instead of naming processes it guessed at. The previous guidance + pointed at the wrong ones, which is most of why this went unnoticed for days. + +The bundled statusline also now refreshes every 60 seconds rather than every 5. +It reopened the learning database on every tick, adding constant pressure to the +same lock. + +### QE-Court's shipped panel violated its own `writerIsNeverJuror` rule ([#576]) + +The bundled `config.json` — the template copied into every project on first run +— seated the defense on `cognitum-low` and the jury on `cognitum-high`. Those +are different tiers of the **same vendor**, and QE-Court measures collusion by +vendor, not tier. A brand-new project therefore got a panel that failed the +court's central rule before anyone had touched it. + +The deeper problem was that the rule could not have caught it. Nothing converted +the configured routing into a seated panel, so `validatePanel` was never reached +outside its own unit test, and the `options` block in the config was not wired to +the validator at all — a rule with no caller is not enforced. + +What changed: + +- The default panel is genuinely cross-vendor. We moved the **defense** rather + than the jury: the deeper reviewer already runs on `codex`, so re-seating the + jury there would have put the jury and the escalation round on one vendor and + weakened the overturn mechanic the court depends on. +- `panelFromRouting()` and `validateCourtConfig()` connect the config to the + validator, and running the validation is now a required step before a court + convenes — an invalid panel stops the run instead of quietly seating. +- The `options` block takes effect: `minDistinctVendors` and `writerIsNeverJuror` + are read rather than decorative. +- A routing map with no jury is now reported as invalid instead of passing. +- CI validates the **shipped config files themselves**, so a future routing edit + fails the build rather than a user's court. + +Reported by @pacphi. + +## Upgrade notes + +No action required. If you set `AQE_DISABLE_WAL=1` and another process is +holding your learning database open, AQE will now refuse that connection with a +message naming the command that finds the holder — previously it failed silently. + +If you have already customized `.claude/skills/qe-court/config.json`, your file +is untouched; check that your `defense` and `jury` providers are on different +vendors, as the court now enforces. + +[#576]: https://github.com/proffesor-for-testing/agentic-qe/issues/576 diff --git a/package-lock.json b/package-lock.json index c164b875..929c2523 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "agentic-qe", - "version": "3.13.2", + "version": "3.13.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "agentic-qe", - "version": "3.13.2", + "version": "3.13.3", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index a7f86458..4f5695f9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "agentic-qe", - "version": "3.13.2", + "version": "3.13.3", "description": "Agentic Quality Engineering V3 - Domain-Driven Design Architecture with 13 Bounded Contexts, O(log n) coverage analysis, ReasoningBank learning, 60 specialized QE agents, mathematical Coherence verification, deep Claude Flow integration", "type": "module", "main": "./dist/index.js",