chore: launch prep v0.1.5 — merge PRs #50/#51, clean README, pin deps#52
Merged
andrebyrd-odingard merged 13 commits intomainfrom Apr 15, 2026
Merged
chore: launch prep v0.1.5 — merge PRs #50/#51, clean README, pin deps#52andrebyrd-odingard merged 13 commits intomainfrom
andrebyrd-odingard merged 13 commits intomainfrom
Conversation
D5: Tool/Function Discovery payloads for model_extraction agent - d5_tool_schema_extraction, d5_function_call_probing, d5_capability_enumeration - Updated _evaluate_response() and _record_intelligence() for D5 techniques D6: BOLA Payloads for privilege_escalation agent - 4 BOLA techniques: numeric IDOR, UUID swap, path traversal, mass assignment - _test_bola() and _report_bola() methods D7: Social Engineering BFLA for identity_spoof agent - 5 techniques: CEO urgency, compliance pressure, helpdesk, developer debug, time pressure - _test_social_engineering_bfla(), _evaluate_bfla_response(), _report_bfla() D8: PII Detection Expansion in DataCategoryMatcher - Phone numbers, SSN, credit cards (Visa/MC/Amex/Discover), IPv4, IPv6 - Date of birth, passport numbers, medical record IDs D10: Correlation Agent — 5 new compound attack path patterns - BOLA + model_extraction, BFLA + identity_spoof + priv_esc - Tool discovery + prompt injection, BOLA + cross-agent exfil - BFLA + memory poisoning T7: Connection Pooling in ConversationSession - ConnectionPool class with shared httpx.AsyncClient instances - Keyed by (host, timeout), singleton pattern, scan-scoped lifecycle - ConversationSession accepts optional pool= parameter
… key 1. BFLA evaluation: when both refusal and compliance keywords are present but no hard evidence (markers/priv_indicators), treat as refusal. Fixes false positives where refusal messages mention 'password', 'secret', etc. 2. ConnectionPool cache key: include csrf_mode in the (host, timeout, csrf_mode) key to prevent incorrect client configuration when sessions with different csrf_mode values share the same pool.
1. pii_phone: add word boundaries and require at least one separator to avoid matching timestamps and numeric IDs. 2. pii_passport/pii_medical_id: require mandatory colon/equals separator and at least one digit in value via lookahead, preventing matches on English words like 'passport details' or 'patient id unknown'. 3. ConnectionPool __aexit__: always clear self._client = None regardless of _owns_client, so the use-after-exit guard in turn() fires correctly for pooled sessions.
Restructure _attack_base() so that: - Chat endpoints are fetched independently of identity endpoints - Early return only fires when NEITHER identity nor chat surfaces exist - D7 BFLA tests run whenever chat endpoints are available, regardless of whether identity endpoints exist
…rkers) Soft privilege indicators like 'admin' commonly appear in refusal text (e.g. 'I cannot grant you admin access'). Previously priv_indicators alone could override the refusal classification, causing false positives. Now only sensitive markers (leaked keys/tokens) override a refusal.
\b doesn't fire adjacent to :: because both : and start-of-string are non-word characters. Replaced with explicit lookaround anchors. Added fourth alternative to handle mid-address :: (e.g. fe80::1).
…-detection' into devin/1776233032-launch-prep
…ts, 21 patterns), pin deps
Contributor
Author
🤖 Devin AI EngineerI'll be helping with this pull request! Here's what you should know: ✅ I will automatically:
Note: I can only respond to comments from users who have write access to this repository. ⚙️ Control Options:
|
…oss-session state leakage
…ion) + update CLAUDE.md counts
… transport destruction
This was referenced Apr 15, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Launch-day consolidation PR that merges two approved PRs and cleans up README/metadata for the v0.1.5 PyPI release.
Merged PRs:
Cleanup on top:
pyproject.toml,src/argus/__init__.py)--mcp-url→--target), fixed Arena commands (argus arena start/status/scan/score), updated architecture diagram and project structure treepython-multipart>=0.0.22for CVE-2024-53981 / CVE-2026-24486 defense-in-depthPhase D code (from PR #51):
identity_spoof.py— D7 social engineering BFLA payloadsprivilege_escalation.py— D6 BOLA (Broken Object Level Authorization) payloadsmodel_extraction.py— D5 tool/function discovery probesconductor/evaluation.py— newDataCategoryMatcherwith PII regex patterns (IPv6, DOB, passport, medical ID)conductor/session.py— T7ConnectionPool(sharedhttpx.AsyncHTTPTransportkeyed by host)correlation/engine.py— 5 new compound attack path patterns (16→21 total)Updates since last revision:
httpx.AsyncClientinstances across sessions, which leaked cookie state between agents. The first fix (cookies=False) was also incorrect — httpx silently creates a normal cookie jar when passedFalse. The final fix shareshttpx.AsyncHTTPTransportinstances (TCP connection pool) while eachConversationSessioncreates its ownAsyncClienton top. This correctly isolates cookie jars and per-client state while reusing TCP connections._owns_clientflag now tracks actual pooled transport usage. Previously set toself._pool is None, which was wrong when both a pool and an explicit transport were provided (the explicit transport would be used but the client wouldn't be closed, leaking it). Now uses aused_pooled_transportboolean that tracks which branch of theif/elifactually ran, so the flag is onlyFalsewhen a pooled transport is genuinely in use.Review & Testing Checklist for Human
aclose()destroys shared transports — Confirmed via httpx source thatAsyncClient.aclose()unconditionally callsself._transport.aclose(). The_owns_clientflag prevents this for pooled sessions, but verify the flag logic handles all combinations: (pool+no transport → pooled, pool+explicit transport → owned, no pool+transport → owned, no pool+no transport → owned)._owns_client=False— When using a pooled transport,__aexit__setsself._client = Nonewithout callingaclose(). TheAsyncClientobject is abandoned for GC rather than explicitly cleaned up. The transport (the expensive resource) is managed by the pool, but the client itself may hold minor resources. Decide whether this is acceptable or if a lightweight cleanup path is needed.pool.close_all()closes all transports. If anyConversationSessionis still open when the pool is closed, its client will have a dead transport. Verify the orchestrator always awaits all session__aexit__calls before callingpool.close_all().evaluation.py— The IPv6 regex has 4 alternatives with lookaheads. Verify it doesn't false-positive on hex strings or UUIDs in normal agent responses. Same for passport/medical ID patterns.agents/__init__.pyregistry, 21 patterns incorrelation/engine.py_COMPOUND_PATTERNSlist.Suggested test plan:
pip install -e .→argus scan --help(verify--targetflag) →pytest tests/ -v→ruff check src/ tests/→ spot-check thatfrom argus import __version__; assert __version__ == "0.1.5".Notes
devin/1776222564-phase-c-attack-powerwas deleted as part of Git cleanup.Link to Devin session: https://app.devin.ai/sessions/8b0c5ca873934d77aa254157cc41924c
Requested by: @andrebyrd-odingard