
The recent history below is a copy of CHANGELOG.md — see that file for the complete record back to v0.1.0.
llama-3.1-70b-versatile, but Argus hardcoded it as the Groq model — so selecting Groq (with a perfectly valid API key) produced a misleading "provider: groq — reachable" in argus status while every actual scan call failed with an HTTP 400. Found live: a valid key returned 200 from the API, but the hardcoded model was no longer served. Three fixes: - Updated the stale defaults to currently-served models (Groq → openai/gpt-oss-20b, verified working with JSON mode; Gemini → gemini-2.0-flash, since gemini-1.5-flash is being retired). - The cloud model is now config-overridable ([cloud].<provider>_model in ~/.argus/config.toml), so the next time a provider rotates a model name it can be corrected without waiting for a release — the model was previously hardcoded with no override. - available() for OpenAI-compatible providers (Groq/OpenRouter) now verifies the model is actually in the provider's served list instead of only checking that a key is set, so argus status stops reporting a dead model as reachable. Falls back to the key check when offline.*.dist-info directory is named with the release version, and the NSIS installer upgrades by overlaying files without removing ones the new version no longer has. So an upgrade left the previous version's argus_panoptes-<old>.dist-info orphaned beside the new one, and importlib.metadata resolved whichever it saw first — observed live: a 1.2.30→1.2.32 in-place upgrade reported argus 1.2.30. Two fixes: version resolution now takes the highest version when more than one dist-info is present (self-healing, and correct for a security tool that stamps its own version into audit artifacts), and the Windows installer now wipes the argus-cli bundle before reinstalling so only one dist-info ever exists. User data in ~/.argus is untouched. Found while reinstalling and testing the app end-to-end on a repo, a website, and a local folder — all three target types verified working against real targets.--deep review, --taint tracing) now stream real per-item progress to the live feed. Regression-tested.system that was tallied as if it were one of the roster; the count is now taken over the agents actually in the run.pre-commit rev and version range, the download page's version, and the site's changelog page and RSS feed — are now generated from CHANGELOG.md and pyproject.toml by scripts/sync_release_docs.py, and CI fails when they drift. They had gone stale twice: the site once sat eighteen releases behind, then fell behind again on the very next tag.argus pr-comment; what remained needed a hosted webhook receiver, which contradicts the local-first promise. D5 (VS Code extension) — superseded by the MCP server, which puts scan/attack/fix inside every MCP-speaking editor today rather than one.out.error() (used by every intentional CLI failure — policy gates, --fail-on, caught exceptions) prints through Rich to stdout, not stderr; the desktop shell only forwarded sentinel-prefixed stdout lines to the live feed and silently dropped everything else, so a failure with nothing on stderr fell back to a hardcoded generic message. The Rust side now keeps a rolling tail of raw stdout and uses it as the real error message when stderr comes back empty.docker Python package (a pure-Python client for a locally-running Docker daemon, excluded to keep the installer lean), so every auto-sandboxed Phase 2 attack hit "The 'docker' Python package isn't installed" regardless of Docker Desktop being available. Now bundled (packaging/argus.spec, desktop-release.yml builds with the sandbox extra) — verified end to end against a real cloned repo, past the point that used to fail and into an actual Docker sandbox build.select = ["E4","E7","E9","F"]) — ruff's own "no select configured" default had silently grown across versions and broke the lint step with no code change.mcp extra below 2.0 (mcp>=1.28.1,<2) — mcp 2.0.0 dropped/relocated mcp.server.fastmcp, which argus/mcp_server.py imports directly, breaking every MCP server test.auto-fit/auto-fill; since neither count divides evenly into the columns that fit at typical widths, the leftover grid cells exposed the container's own background as flat, unlabeled boxes. Switched both to flexbox so the last row's items stretch to fill the width instead of leaving empty cells.Found via a rigorous audit (parallel deep-code review + live end-to-end Docker/LLM testing) of everything shipped in 1.2.25/1.2.26:
.git/.env — the static-site/PHP auto-sandbox cases serve any copied file verbatim. Now excluded from the build context, restored to the exact prior repo state afterward either way.${VAR}/{{var}}/%VAR% conventions, and fixed a long-line skip that was discarding the secret scanner's high-confidence regex pass (not just the entropy pass) on minified/bundled files.--url attacks that never need it; capped an unbounded directory walk and file reads in the new stack- detection code against adversarial/oversized repos..env.example-style placeholder like postgresql://USER:PASSWORD@HOST was flagged as a real secret (in the working tree and git history) because the placeholder filter was never applied to that detector at all. Now checks the actual matched username/password against common placeholder field-names — a real credential in the same shape is still caught.~/.argus (which survives an uninstall/reinstall), so a reinstalled app used to show the previous install's scans. The app now records each install's moment and shows only scans run after it; a reinstall resets the list, and new scans accumulate from there. The CLI's argus history still shows everything.argus mcp-server crashed with a raw traceback on a base install missing the optional [mcp] extra, instead of the clean install-hint message every other optional integration (semgrep, pip-audit, trivy, docker) already gives. Now prints pip install 'argus-panoptes[mcp]' and exits cleanly.argus attack <repo-path> (Phase 2's own Docker-sandbox flow) always reported 0 confirmed, with no error anywhere — the callback URL handed to a sandboxed target said 127.0.0.1, which inside that container means its own loopback, not the host running the callback listener. Now advertises host.docker.internal to targets Argus sandboxed itself, verified end-to-end..git repo URL. Pointing Argus at https://github.com/user/repo.git for "Strike the app" sent real HTTP requests straight at GitHub's own server and reported its ordinary responses (redirects, 404s) as confirmed vulnerabilities in the target repo — entirely fabricated findings. A git clone URL is now refused as an attack target from every entry point (CLI positional target, --url, and the desktop app's URL field) with a clear explanation, instead of silently attacking the wrong host.argus attack never applying suppressions (an ignored finding kept resurfacing); three more attack agents (PromptInjectionAgent, RaceCondition, IDORHunter) missing the fallback-baseline false-positive guard shipped for BusinessLogicAgent in 1.2.14; synthesized attack-chain findings always reporting flat "high" confidence regardless of a weak constituent finding; two unguarded concurrent-write races in local state files; and three config options that were silently no-ops. Full detail in the commit message.git clone the target — fatal (and instant, with a useless "the attack failed") against a live URL that isn't a repo. The desktop app now has a real Phase-2-only ("attack") mode that goes straight at the target, matching what argus attack already did from the CLI.