Skip to content

Bump aiohttp from 3.13.5 to 3.14.1#5

Open
dependabot[bot] wants to merge 62 commits into
mainfrom
dependabot/uv/aiohttp-3.14.1
Open

Bump aiohttp from 3.13.5 to 3.14.1#5
dependabot[bot] wants to merge 62 commits into
mainfrom
dependabot/uv/aiohttp-3.14.1

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Jul 20, 2026

Copy link
Copy Markdown

Bumps aiohttp from 3.13.5 to 3.14.1.

Changelog

Sourced from aiohttp's changelog.

3.14.1 (2026-06-07)

Bug fixes

  • Fixed a race condition in :py:class:~aiohttp.TCPConnector where closing the connector while a DNS resolution was in-flight could raise :py:exc:AttributeError instead of :py:exc:~aiohttp.ClientConnectionError -- by :user:goingforstudying-ctrl.

    Related issues and pull requests on GitHub: :issue:12497.

  • Fixed CancelledError not closing a connection -- by :user:aiolibsbot.

    Related issues and pull requests on GitHub: :issue:12795.

  • Tightened up some websocket parser checks -- by :user:Dreamsorcerer.

    Related issues and pull requests on GitHub: :issue:12817.

  • Fixed :class:~aiohttp.CookieJar dropping the host-only flag of cookies when persisted with :meth:~aiohttp.CookieJar.save and reloaded with :meth:~aiohttp.CookieJar.load, so a cookie set without a Domain attribute is again scoped to the exact host that set it after a reload; the absolute expiration deadline is now persisted as well, so a reloaded cookie keeps its original lifetime instead of being rescheduled from the load time. :meth:~aiohttp.CookieJar.load now replaces the jar contents rather than merging onto prior state, and loaded cookies pass through the same acceptance rules as :meth:~aiohttp.CookieJar.update_cookies, so a cookie for an IP-address host is dropped when loaded into a jar created without unsafe=True -- by :user:bdraco.

    Related issues and pull requests on GitHub: :issue:12824.

  • Scoped :class:~aiohttp.DigestAuthMiddleware credentials to the origin of the first request it handles, so a redirect to a different origin no longer triggers a digest response computed from the configured credentials; a challenge from another origin is only answered when that origin falls within a protection space advertised by the anchor origin through the RFC 7616 domain directive -- by :user:bdraco.

    Related issues and pull requests on GitHub: :issue:12825.

  • Fixed the C HTTP parser not enforcing max_line_size on a request target or response reason phrase that is split across multiple reads; each fragment was checked on its own, so an accumulated line could exceed the limit without raising LineTooLong. The accumulated length is now checked, matching the pure-Python parser -- by :user:bdraco.

    Related issues and pull requests on GitHub:

... (truncated)

Commits
  • 9c35d03 Release v3.14.1 (#12864)
  • 38b956c [PR #12861/59684b5c backport][3.14] Revert "Drop list compression (#12857)" (...
  • 8f31009 [PR #12857/69dff14d backport][3.14] Drop list compression (#12858)
  • dfdfa9d [PR #12830/93a2b1c3 backport][3.14] Bound pipelined request queue per connect...
  • 0e9cedd [PR #12827/ccf218ab backport][3.14] Numeric ipv4 resolver bypass (#12849)
  • a762eda [PR #12831/1ac92dae backport][3.14] Payload close on disconnect (#12843)
  • a329a7a [PR #12824/60b85e98 backport][3.14] Preserve host-only cookie scope across Co...
  • 4f7480e [PR #12828/13b635d7 backport][3.14] Bounded unread compressed drain (#12845)
  • 5ab61bb [PR #12826/36df6c13 backport][3.14] Enforce max_line_size on fragmented reque...
  • 3912667 [3.14] Add test that env proxy auth is scoped to the redirect-selected proxy ...
  • Additional commits viewable in compare view

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    You can disable automated security fix PRs for this repo from the Security Alerts page.

ananay and others added 30 commits June 4, 2026 13:21
Updated README to include links and improved description.
Updated project name and license information in README.
A target repo's .env containing keys openhack doesn't define (e.g.
gemini_sandbox_proxy_command) crashed the CLI at startup, because
pydantic-settings defaults to extra=forbid and validates every key in a
CWD .env file. Set extra=ignore so unrelated keys are skipped, matching
how unknown os.environ vars were already handled.
Full visual redesign of the terminal UI — Signal Green accent, Deep Ink
palette, half-block ground/earth mark logo, clean "OpenHack" wordmark
lockup, right sidebar (session/context/findings/activity), knight-rider
spinner, truecolor rendering. Removes all third-party UI references.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
Pivot foundation from one-shot SAST scanner toward the interactive
"Swiss-army knife for hackers". Adds the engine the TUI will drive:

- tools/shell.py: run_command/which — foundational pentest primitive
  (drive nmap/curl/nuclei/osv-scanner/etc.) with timeout + output caps
- tools/security_tools.py: sca_scan (osv-scanner / OSV database) and
  secret_scan (high-signal credential candidates, redacted); graceful
  degradation when engines are absent
- tools/mailbox.py: mailbox_new/wait/list wrapping the `inbox` CLI for
  email-gated flows (signup/OTP/reset) during pentests
- tools/registry.py: opt-in include_agent_tools flag (scan pipeline
  untouched by default)
- agents/interactive.py: InteractiveAgent — plan-first, static-tools-
  first, asks-questions, no-moralizing operator over the full toolkit
- interactive_runner.py + `openhack hack`/`openhack agent`: SSH-friendly
  non-TUI mode; streams thinking/tool activity, prints cost
- tests/test_agent_tools.py: 29 tests (shell, SCA/secret, mailbox
  degradation, registry wiring, agent prompt/toolkit)

Verified live: `openhack hack` triaged a planted target — secret_scan
then sca_scan (found lodash 4.17.11 CVEs via OSV), confirmed via
read_file, reported with file:line + impact. 110/110 tests pass.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
Plan mode scopes a target with passive intel only (read code, sca_scan,
secret_scan, which) and proposes a prioritized attack plan — executing
nothing until the operator approves. PlanAgent subclasses InteractiveAgent
but restricts get_tools() to a read-only allowlist (no run_command, no
mailbox). Adds build_plan_agent, run_plan, and the `openhack plan` CLI.
Tests assert the toolset is read-only and the prompt is planning-shaped.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
Live validation of `openhack plan` exposed two issues: the agent repeated
the same passive-recon batch several times and then ended on a tool-only
turn, leaving an empty final plan. Fixes:

- interactive_runner: stash the last substantive 'thinking' text and fall
  back to it when the agent's final response is empty, so the operator
  never gets a blank screen; show an explicit note if truly nothing.
- plan prompt: instruct a single focused intel sweep (run each scanner
  once, don't repeat tools already run), then stop calling tools and write
  the plan as the final message.

Read-only restriction confirmed live (only passive tools were used).

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
The agent's final answer streams live as it's generated and was then
printed a second time by the result renderer. Suppress the reprint when
the final response matches what was already streamed; still recover the
last message when the final response is empty.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
tools/recon.py: subdomains (subfinder), http_probe (httpx/curl fallback),
port_scan (nmap), dns_lookup (dig), nuclei_scan (templated) — structured
wrappers with graceful "tool not installed" handling.
tools/oob.py: oob_register/oob_poll wrapping openhack-oob for blind-vuln
verification (SSRF/RCE/XXE callbacks) via a unique marker.
Registered as agent tools; passive recon (subdomains/dns_lookup) added to
plan mode's read-only allowlist, active scans kept out.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
tools/browser.py: browser_fetch drives headless Chromium (Playwright) to
dynamically verify web vulns — rendered DOM, final URL, JS dialogs (e.g.
alert() from an XSS payload), console, optional in-page JS eval and
screenshot evidence. Degrades gracefully when Playwright is absent.

Registry now supports genuinely async tool sources (is_async flag →
_async_handlers): is_async_tool/execute_tool_async route browser calls on
the agent's event loop; sync callers get a clear error. The scan pipeline's
BaseAgent already branches on is_async_tool, so this composes cleanly.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
OpenHack stays the default hosted provider (free credits, no setup), but
any OpenAI-compatible endpoint now drops in via providers.py: OpenAI,
Anthropic (compat), OpenRouter, Groq, DeepSeek, Together, local Ollama.
Selected with llm_provider; base URL/key/model resolved from the registry
+ env (KEY, <PROVIDER>_BASE_URL, <PROVIDER>_MODEL overrides).

LLMClient is now provider-aware: resolves the client from the registry,
raises a clear "export <KEY>" error when the key is missing, prices BYOK
usage from known tables (0 when unknown — the user is billed by their
provider), and only sends prompt_cache_key to providers that accept it.
`openhack providers` lists them with key status. 138 tests pass.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
The beautiful landing now drives the interactive hacking agent: type a
task (or /agent <task>, /plan <objective>) and it runs InteractiveAgent/
PlanAgent, streaming thinking + tool activity into the Trace pane and
Context/Activity/cost into the sidebar — reusing the scan view's rendering.
Follow-up input while it runs is injected mid-loop via the existing
add_user_instruction path, so it's a real conversation. Final answer is
de-duplicated against BaseAgent's own trace.

Also: BaseAgent now runs sync tools via asyncio.to_thread so a long tool
(nmap/nuclei/shell) can't freeze the event loop / TUI spinner.

Verified live in a PTY: `secret_scan` streamed into the transcript, the
agent asked a clarifying question, footer showed tokens + cost. 138 tests
pass; landing + agent flows snapshot-checked.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
Bug: after the agent's first turn finished, mode stayed "scanning", so a
follow-up hit the "queue instruction for a running scan" path — but the
agent loop had already returned, so the message went nowhere ("instruction
queued for scan agents" with no effect).

Fix:
- Route non-slash input by actual run state, not mode: if a run is in
  flight -> queue as a mid-loop instruction; if an agent conversation is
  open but idle -> continue it; if a finished scan is on screen -> chat
  about findings; else (landing) -> start a fresh agent.
- BaseAgent gains continue_run(): appends a user turn and re-enters the
  loop keeping prior history + system prompt (run() refactored to share
  _agent_loop()). So the agent remembers what it just did.
- TUI tracks the live agent + is_agent_session; _continue_agent re-arms
  the spinner and streams into the same transcript. Reset on /clear and
  when a real scan starts.

Verified live in a PTY: turn 1 ran secret_scan, the follow-up continued
the same conversation and ran sca_scan. 138 tests pass.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
Only the agent's side of the conversation was visible. Now each user turn
(initial task and follow-ups) is echoed into the trace as a "user" event,
rendered with a green ▌ bar, so both sides of the exchange show in order.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
Interactive agent messages now render like a normal chat line — a colored
speaker bar + the message, no "openhack" name label and no extra indent.
User = grey bar + grey text; agent = green bar + normal text. The scan
pipeline keeps its named-agent layout (many agents there).

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
In an interactive agent conversation the left "agents" list is just the
operator + agent (it's a scan-pipeline filter for many named agents), so
hide that whole column during agent sessions. Add a blank line between
messages so the transcript reads like a chat with room to breathe. Scans
keep the agents filter unchanged.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
The tab row was crowded with a long hint string. Shortcuts now live on a
dim keybar at the bottom, and are context-aware: a conversation shows
send/scroll/clear/help; a scan shows tab/finding/resize/sidebar/sessions.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
- The Session/Context/Findings/Activity sidebar is scan-pipeline furniture;
  in an interactive conversation it just shows "Scan complete / none yet".
  Hide it during agent sessions (findings + cost are in the bottom bar) so
  the chat uses the full width.
- Add a blank line between the input line and the model/provider line in
  the prompt box (landing + main app) — they were stuck together.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
- Tool calls in a conversation render as a quiet indented tool tag (no
  "openhack" name, no arrow) instead of scan-style attribution.
- Hide the Trace/Findings tab bar in agent sessions — the transcript is
  the only view (findings will open on demand).
- Up/Down now scroll the transcript; removed the per-agent "picker"
  cycling (there's no agent list in a conversation).

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
Commands:
- /provider now uses the real providers.py registry (openhack/openai/
  anthropic/openrouter/groq/deepseek/together/ollama), not the dead
  {openhack: kimi} table. Lists providers and reports missing keys.
- Removed /agent (plain text starts the agent), /test (dev-only sim),
  /sidebar (dead in chat) from the menu + dispatch. Fixed the dangling
  /full-scan reference in the chat prompt. Refreshed all descriptions.

Findings:
- New tools/findings.py: report_finding + list_findings, wired when the
  registry gets a session. The agent records confirmed vulns (they show
  via /findings and in the transcript) and can recall/summarise them.
- /findings now actually shows the findings view (esc/typing returns to
  chat); agent-reported findings bubble into ScanState.
- list_findings allowed in read-only plan mode; report_finding is not.

143 tests pass; live-checked the record→/findings flow.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
/model with no arg now lists the models the OpenHack provider serves
(kimi-k2.5, gemma-4-31b, mistral-large-2512), marks the active one, and
tells you how to switch. Switching to an unknown model warns that
requests may fail. On a BYOK provider it accepts any model id.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
Flip the default model from kimi-k2.5 to glm-5.2: config default,
PROVIDER_DEFAULTS, OPENHACK_MODELS, input-box placeholder, /provider
fallback, setup wizard, context-limit map, and a placeholder pricing
entry (set real rates once known). kimi-k2.5 remains selectable via
/model. Requires the inference backend to serve glm-5.2.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
Agent conversations now write to ~/.openhack/scans/<id>.json like scans do,
reusing _write_report: model/provider, status, duration, full cost
breakdown (tokens + $), findings, and the complete trace (thinking, tool
calls, inputs, outputs). Tagged kind="agent" with the first user message
as title so /sessions can list them. Written at turn start ("running") so
a crashed turn still leaves a record, and at end (completed/cancelled/
failed); continuation turns update the same file.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
ananay and others added 25 commits July 7, 2026 14:12
docs/PENTEST_TASKS.md — a copy-pasteable catalog across recon, SAST,
secrets, SCA, web/DAST, API, authn/z, cloud/IaC, exploitation, OOB,
email-gated flows, and reporting. Includes an authorization note and
@path usage. Meant as the "first thing to try" list for operators.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
docs/EVAL_RESULTS.md — ran OpenHack (glm-5.2) against a 13-class vuln-lab
via `openhack hack` on 4 tasks (full triage, injection hunt, secret
triage, SCA). Covered 12.5/13 classes with correct file:line + working
PoCs for ~$0.23 total. Documents strengths (coverage, real PoCs,
reachability reasoning, precision) and gaps (LLM-estimated CVE counts,
framing-dependent triage, missed EOL base image, per-turn tool-schema
overhead). DAST/recon left for a live-target eval.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
Agent behaviour: added a top-priority "do exactly what's asked — nothing
more, nothing less" rule and gated the broad recon sweep on a broad
request. Narrow asks now skip full recon and answer only the question;
the final message no longer appends bonus findings / inventory dumps.
Verified live: "which line has the SQLi?" → one read_file + a one-line
answer ($0.011) instead of a 27-finding full triage.

docs/PENTEST_TASKS_ADVANCED.md: 100 staff-level bug-bounty tasks (auth/
session, BOLA/BFLA chains, SSRF→cloud→IAM, 2nd-order/blind/template-RCE
injection, deser gadget chains, request smuggling/cache, OAuth/SAML/JWT,
advanced client-side, business-logic/races, GraphQL depth, supply chain/
CI-CD, cloud/container/IaC, full chains).

166 tests pass.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
Ran OpenHack end-to-end against XBOW validation-benchmarks (dockerized CTF
web apps). Level-1 sample: 4/5 solved (IDOR, SQLi, SSTI, LFI captured
their flags; command injection hit the iteration cap). Real exploitation,
no human help. Headline finding: capability is there but blind
exploitation by hand is 10-20x too expensive ($0.5-0.7, 450-550k tokens
each) because sqlmap/tplmap aren't installed — the agent reinvents them
over curl. Actionable: ship a curated tool set + teach the agent to use
it, and relax the exploitation iteration cap. Only pass/fail + public vuln
class + cost recorded (no benchmark internals).

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
Adds recon.sqlmap_test (automated sqlmap: --batch, detects injection
point/DBMS/technique, can --dump) so the agent stops brute-forcing SQLi
over curl. System prompt principle 3 rewritten: reach for the specialist
(sqlmap_test for SQLi, nuclei_scan for templated scans, ffuf for content
discovery) before hand-rolling requests. Installed sqlmap + nuclei.
169 tests pass.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
The soft 'prefer sqlmap' guidance was ignored — a SQLi benchmark re-run
still made 23 curl calls and 0 sqlmap calls. Rewrote principle 3 as a hard
rule: SQLi MUST go through sqlmap_test; manual SQLi payloads over
curl are forbidden.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
Lower ShellTools output cap 60k→20k chars: verbose tool output (sqlmap/
nmap/curl) re-sends every agent turn, so oversized results inflate cost
super-linearly. EVAL_RESULTS: the "install sqlmap" fix didn't cut cost —
soft prompt guidance was ignored (0 sqlmap calls), a hard mandate got
sqlmap used but via raw shell not the tool, and cost stayed ~$0.5-0.7.
Real lessons: prompt-based tool-routing is weak with glm-5.2, and the
dominant cost is context accumulation across the ~20 iterations
exploitation needs — needs truncation/compaction/caching, not more tools.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
interactive_runner now writes ~/.openhack/scans/<id>.json after each
`openhack hack` run: task, status, cost/tokens, findings, and the complete
trace (every tool input/output, capped). Makes headless runs (e.g. the
XBOW benchmark harness) fully reviewable after the fact, matching the TUI's
persistence. Wrapped so it never fails the run.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
Ran OpenHack (glm-5.2, autonomous) end-to-end against all 104 XBOW
validation-benchmarks. Solved 54/104 raw (61% of the 88 that built+ran);
by level: L1 27/39, L2 23/41, L3 4/8 of runnable. $31.10 total. 14
build_fail are EOL-Debian benchmark bit-rot, not OpenHack. Solves span
priv-esc, SSTI/RCE, deserialization, XXE, GraphQL, race, JWT — not just
easy classes. docs/XBOW_RESULTS.md + xbow_scoreboard.csv (ids/results/
cost/tags only; no benchmark internals). Traces saved locally.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
Ran the full 104 XBOW suite on deepseek/deepseek-v4-pro via OpenRouter
(white-box + persistence + baseline prompts tried). Scored 1/104 vs
glm-5.2's 54/104. Traces show V4 Pro is a strong ANALYST (nails the
white-box vuln id) but not an EXPLOITER — it describes/templates the
exploit and stops instead of running it and extracting the live flag, and
struggles with stateful multi-step exploits. No prompt variant fixed it.
Conclusion: glm-5.2 far better for autonomous flag-capture; V4 Pro suits
an analysis stage, not a single-agent grab.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
Fixes the #1 XBOW failure mode (26/34 glm-5.2 fails thrashed into a
context death-spiral, 400k-1.8M tokens, hit the 50-turn cap without
converging). Root cause: compaction truncates old reasoning to 200 chars
and summarizes old tool results, so past turn ~3 the agent has amnesia and
re-tries dead ends.

Three changes in BaseAgent._agent_loop:
1. Durable action ledger (never compacted): every genuine tool call +
   one-line result is recorded and re-injected into the system prompt each
   turn, so the agent always sees what it already tried.
2. Anti-repetition: an exact duplicate tool call is short-circuited with
   the cached result + a nudge, instead of re-executing and re-bloating
   context.
3. Progress-aware stop replaces the fixed 50-cap: bail after N consecutive
   turns with no new action (thrash), extend otherwise. Cap raised to 120,
   both configurable (agent_max_iterations, agent_stale_turn_limit).

169 tests pass.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
The 120-turn cap + exact-call-repeat stop was a net loss on the 26 XBOW
thrash benchmarks: near-dup thrash (same endpoint, tweaked payload, same
response) never trips exact dedup, so runs ballooned to 2-5M tokens (vs
~850k-990k before) instead of the intended savings. Progress stop now keys
on result *novelty* (a turn only counts as progress if a genuinely new call
yields a not-seen-before result), and the iteration cap is back to a modest
60 (all XBOW solves landed under 50 turns). 169 tests pass.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
…S x86

Full black-box re-run on an AWS x86 box with six Docker-29 compatibility fixes
(buildx, mysql:5.7.15->5.7.44, expose N:M, EOL-Debian apt archive, build guards).
Single-run 72/104 (69%); best-of-3 86/104 (83% raw, 87% of runnable) on glm-5.2.
Adds black-box leaderboard comparison (Shannon corrected: white-box only, no
black-box score), reproducible harness scripts, scoreboards, and transcripts.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
Source-aware run (app source given, flag artifacts stripped, proof-by-exploitation
against live app, same sha256 grader). +12 over black-box single-run (72->84);
median tokens/solve halved (107k->46k); run cost $12.46. Apples-to-apples with
Shannon's white-box 96% (Claude): ~12-15pt gap = model + specialist pipelines +
our infra ceiling. Adds white-box scoreboard, harness, and leaderboard section.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
Grok 4.5 (OpenHack backend) solved 10 of the 13 benchmarks glm-5.2 missed even at
best-of-3 (glm: 0/13) — SSTI 4/4, blind SQLi, CVE, cmd-inj, 2x LFI, path-traversal.
Projects to ~96/104 black-box (glm best-of-3 86 + 10 converted), level with Shannon's
96 WHITE-BOX. Conclusion: the Shannon gap is dominantly a MODEL gap, not architecture.
Adds Grok scoreboard, harness, full cost accounting (~$87), and ranked next steps.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
grok-4.5 was missing from PRICING, so cost display fell back to kimi rates
($0.50/$2.80) and undercounted Grok spend ~5x. Adds real $2/$6 pricing and a
full-104 black-box Grok harness for the confirmation run.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
Grok 4.5 is now first in the picker, the default in PROVIDER_DEFAULTS and the
setup wizard, and its 500K context window is registered in the context manager
(vs 128K for the others) so it uses the full window before compacting. glm-5.2
stays available and labeled cost-efficient. 169 tests pass.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
…t as glm

Full black-box single-run on Grok 4.5 = 88/104, beating glm-5.2's best-of-3 (86)
in one pass, at $34.73 (~= glm's $32.86 — efficiency offsets higher token price).
Confirms the Shannon gap was dominantly a model gap. Grok now the default model.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
… browser)

Additive, nothing wired into default paths. New: agents/specialists/ (SpecialistAgent
subclassing InteractiveAgent + XSS/Injection/SSRF/SSTI/Auth/Blind classes, build_specialist
factory, classify_vuln_class), prompts/specialists/ playbooks, tools/stateful_browser.py
(persistent-session browser reusing BrowserRunner + existing specs). registry.py gains an
opt-in include_stateful_browser flag (default off → generalist toolset unchanged). 21 new
tests, 190 total green.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
Adds tools/specialist_dispatch.py (dispatch_specialist tool: generalist hands a
localized vuln to the matching specialist, shared session, returns flag/summary).
Wired into the interactive agent ONLY via _build_agent (PlanAgent + specialists
excluded → no recursion, plan stays read-only). registry gains attach_source().
One optional prompt rule added. All 6 specialist classes are dispatchable. 193 tests.

Claude-Session: https://claude.ai/code/session_016PMahuFwyaHhR5aUeeC1TM
…cture

Live tests show the stateful browser goes unused (Grok solves these XSS challenges
with plain HTTP); the specialist layer is kept as product capability, not a benchmark
play. Notes the incidental sqlmap-was-missing finding (now installed 1.8.4).
95 full-run + 13 hardfails transcripts archived off the box so the Grok evidence
(payload->flag per benchmark) survives box termination.
…n accents

OH_BG #0A1311 (green-tinted near-black) -> #000000 solid black; panel/element/
border surfaces neutralized to grey (no green tint). Green text accents
(OH_PRIMARY/ACCENT/GREEN #00B97E/#1CC584) unchanged. 192 tests green.
Bumps [aiohttp](https://github.com/aio-libs/aiohttp) from 3.13.5 to 3.14.1.
- [Changelog](https://github.com/aio-libs/aiohttp/blob/master/CHANGES.rst)
- [Commits](aio-libs/aiohttp@v3.13.5...v3.14.1)

---
updated-dependencies:
- dependency-name: aiohttp
  dependency-version: 3.14.1
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file python:uv Pull requests that update python:uv code labels Jul 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file python:uv Pull requests that update python:uv code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant