Skip to content

Commit fa2c650

Browse files
author
Akkari
committed
chore: bump to v0.5.3, update roadmap, fix PSSA path injection, harden learning memory save
- Version bump: pyproject.toml + __init__.py → 0.5.3 - CHANGELOG: mark cost tracking (#16), audit reports (#17), crash resilience as shipped - README: move cost tracking to shipped, add dynamic pricing to roadmap - prescreen.py: escape single quotes in PSScriptAnalyzer path (command injection fix) - learning.py: wrap save() in try/except for resilience - test_e2e_smoke.py: update version assertion to 0.5.3
1 parent 2a24596 commit fa2c650

7 files changed

Lines changed: 22 additions & 10 deletions

File tree

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,9 +206,12 @@ I'm working. I'm real. I'm also still growing.
206206
- Available on PyPI: `pip install quorum-validator` | ClawHub: `openclaw skills add dacervera/quorum`
207207

208208
**What's coming:**
209+
- Dynamic model pricing updates (`quorum costs update`)
209210
- More critics (Architecture, Delegation, Style, Tester)
210211
- Domain-specific rubric packs (compliance, security, infrastructure)
211212
- Confidence calibration against golden sets
213+
- Self-validation CI gate (GRAD)
214+
- **Hardware-backed result protection** — YubiKey KEK/DEK encryption for sensitive validation results, tamper-evident run manifests (SP 800-130/152 aligned)
212215
- Community rubric contributions
213216

214217
---

docs/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,16 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
4242
- [x] Learning memory (Milestone #7)
4343
- [x] Pre-screen expansion — Ruff, Bandit, PSScriptAnalyzer (Milestone #15)
4444
- [x] PyPI publish (Milestone #14) — `pip install quorum-validator`
45+
- [x] **Cost tracking and estimation** (Milestone #16) — per-call token counts via LiteLLM, cumulative run cost in manifest, pre-run estimate, `--max-cost` budget cap, cost report in CLI output
46+
- [x] **CSV audit reports** (Milestone #17) — per-file SHA-256, timing, token counts, cost breakdown; aggregate summary with median tokens/sec and cost-by-model
47+
- [x] **Crash-resilient batch validation** — progressive manifest saves, `--resume`, graceful SIGTERM/SIGINT shutdown
4548
- [ ] Architecture critic (Milestone #9)
4649
- [ ] Tester critic (Milestone #10)
4750
- [ ] Confidence calibration (Milestone #6b)
4851
- [ ] Delegation critic (Milestone #11)
4952
- [ ] Style critic (Milestone #12)
5053
- [ ] Self-validation graduation (GRAD)
54+
- [ ] **Hardware-backed result protection** (Milestone #18) — YubiKey KEK wrapping per-run DEKs, encrypted-at-rest validation results, HMAC tamper evidence over run manifests. For sensitive security assessments where findings themselves are high-value targets. CKMS-aligned (SP 800-130/152 principles applied to the validation pipeline)
5155

5256
---
5357

reference-implementation/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
44

55
[project]
66
name = "quorum-validator"
7-
version = "0.5.2"
7+
version = "0.5.3"
88
description = "Multi-critic quality validation for agents, research, and configurations"
99
authors = [
1010
{name = "Daniel Cervera", email = "daniel@sharedintellect.com"},

reference-implementation/quorum/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@
99
specialized critics, each required to provide grounded evidence.
1010
"""
1111

12-
__version__ = "0.5.2"
12+
__version__ = "0.5.3"
1313
__all__ = ["__version__"]

reference-implementation/quorum/learning.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,15 @@ def load(self) -> list[Issue]:
6464

6565
def save(self, issues: list[Issue]) -> None:
6666
"""Write issues to JSON using atomic tmp+rename to prevent corruption."""
67-
self._path.parent.mkdir(parents=True, exist_ok=True)
68-
data = [issue.to_dict() for issue in issues]
69-
tmp = self._path.with_suffix(".tmp")
70-
tmp.write_text(json.dumps(data, indent=2, default=str), encoding="utf-8")
71-
tmp.replace(self._path)
72-
logger.debug("Saved %d known issues to %s", len(issues), self._path)
67+
try:
68+
self._path.parent.mkdir(parents=True, exist_ok=True)
69+
data = [issue.to_dict() for issue in issues]
70+
tmp = self._path.with_suffix(".tmp")
71+
tmp.write_text(json.dumps(data, indent=2, default=str), encoding="utf-8")
72+
tmp.replace(self._path)
73+
logger.debug("Saved %d known issues to %s", len(issues), self._path)
74+
except Exception as e:
75+
logger.warning("Failed to save learning memory to %s: %s", self._path, e)
7376

7477
def update_from_findings(
7578
self,

reference-implementation/quorum/prescreen.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -834,8 +834,10 @@ def _run_pssa(self, artifact_path: Path, artifact_text: str) -> list[Finding]:
834834
}
835835

836836
try:
837+
# Escape single quotes in path to prevent PowerShell command injection
838+
escaped_path = str(artifact_path).replace("'", "''")
837839
ps_command = (
838-
f"Invoke-ScriptAnalyzer -Path '{artifact_path}' "
840+
f"Invoke-ScriptAnalyzer -Path '{escaped_path}' "
839841
"-Severity Warning,Error | ConvertTo-Json"
840842
)
841843
result = subprocess.run(

reference-implementation/tests/test_e2e_smoke.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def test_quorum_cli_version(self):
4444
runner = CliRunner()
4545
result = runner.invoke(cli, ["--version"])
4646
assert result.exit_code == 0
47-
assert "0.5.1" in result.output
47+
assert "0.5.3" in result.output
4848

4949
@pytest.mark.smoke
5050
def test_validate_example_research(self, tmp_path):

0 commit comments

Comments
 (0)