Skip to content

Consolidate dispatch, merge findings handoff, and swap role names - #69

Open
jrh-mann wants to merge 35 commits into
mainfrom
claude/integrate
Open

jrh-mann wants to merge 35 commits into
mainfrom
claude/integrate

Conversation

@jrh-mann

Copy link
Copy Markdown
Contributor

Replaces #66, #67 and #68 with one integrated branch.

What's in it

  • Restore benchmark task-argument authorization and remove gpt-5-mini #67: the authoriser checks declared benchmark arguments again; gpt-5-mini removed.
  • Split safe dev-tool bumps from #64; retain Hawk runtime pins #68: dev-tool bumps only; semver<3.1 and inspect-ai pinned to Hawk's runner.
  • Freeze portable findings before exposing pluggable publishing #66: findings.json, frozen findings bundle, separate publish step, LaTeX publisher on Laurence's pinned template.
  • dispatch/: job running (local, Hawk), policy and authoriser, package specs, key balances and the capped-key launcher, with all Hawk-only code in dispatch/hawk.py.
  • _log_sources.py: one place that resolves every way of naming logs.
  • _prices.py absorbs _openrouter.py.
  • A layering test: lower layers never import the agents; no new import cycles.
  • Role rename: the auditor is the top-level agent, the investigator the per-sample one. Task names swap: inspect_audit/audit is the top-level run, inspect_audit/investigation the per-sample run. findings.json keys and policy fields follow.

Kept as they were: package and product names, the GL template's macros and terms, CI environment and secret names, published image names, and the /audit path inside the per-sample image until it is republished.

Breaking for callers: task names, policy YAML sections and findings.json keys changed. Hawk configs outside the repo that name inspect_audit/investigate or inspect_audit/audit need updating.

Tests: 255 unit and all 13 Docker tests pass locally. No paid runs.

… per-sample one

Task names swap with them: inspect_audit/audit is the top-level run,
inspect_audit/investigation the per-sample one. Modules, policy fields,
findings.json keys, prompts, skills and docs follow. Kept as they were: package
and product names, the GL template's macros and terms, CI environment and secret
names, published image names, and the /audit path inside the per-sample image
until it is republished.
…re auditor skill frontmatter

- HawkRuns.logs and hawk: log fetching both use hawk.cli.download.download_eval,
  one folder per eval set.
- The launcher's token exchange parses Hawk's TokenResponse and submits with the
  rotated refresh token when the identity provider rotates it, warning that the
  stored one is retired.
- The rename moved the auditor's skills out of mdformat's exclude, which rewrote
  their YAML frontmatter; restored them and moved the exclude to the new path.
…commit

Installing a benchmark from git ignores its lockfile and resolves its ranges afresh,
so dependencies released since a run change the grader (swebench 5 broke SWE-bench's
scorer for a run locked to 4.1). locked_extra_pins exports the commit's uv.lock and
returns exact pins for what the extra adds, leaving the core to the job. Declared by
the user: python -m inspect_audit.dispatch.packages REPO COMMIT EXTRA.
…ished image, priced models, generated configs

- dispatch.jobs.INSPECT_VERSION is the Inspect every job pins; a test keeps the
  package's own requirement equal to it.
- An investigation warns when its logs were made with a different Inspect.
- The investigation task defaults to the published investigator image ("build"
  builds it locally), looks up prices itself when given a cost limit, and treats
  an empty logs list as no logs.
- Image digests live once, in containers/.
- python -m inspect_audit.dispatch.investigate writes a complete Hawk config from
  what you declare (benchmark repo@commit and extra, task, samples, checks, logs,
  judges, model), through the same builder as the auditor's child jobs: this
  package at its commit, the Inspect pin, the extra pinned to the benchmark's
  uv.lock, Hawk's client and address when logs come from Hawk.
@jrh-mann

Copy link
Copy Markdown
Contributor Author

Coordination for PR #69 — Codex bug sweep (James authorised fixes)

Codex worktree: /private/tmp/ia-sweep
Branch: codex/sweep-findings, based on 43b1db4.

Codex owns in this sweep:

  • Findings duplicate sample references and report counting/placeholder fidelity.
  • Publication state committed only after validation and persistence succeed.
  • Remove required_coverage and coverage.json completion gate (James explicitly asked not to track coverage). Retain missing/unresolved cells.
  • Collection success recorded only after verdict import/draft sync succeeds (_audit.py small patch; coordinate with your split).
  • Remove tracked docs and ignore docs/ on integration, retaining local copies (James's explicit instruction).

Claude: please own the LocalRuns package fidelity fix in dispatch/local.py, which still ignores Job.package/extra_packages. Honour declared specs or refuse a mismatch rather than silently running another installed version. Existing test has package="unused locally". No heavy local tests/paid runs.

Not starting new infrastructure for LaTeX graph support or isolated benchmark enumeration in this bug-fix pass; these need follow-up design.

Use PR #69 comments for notifications/commit handoffs; this local note is the working ownership record. Codex will post exact commits and small patch instructions once ready. Please do not cherry-pick until then.

@jrh-mann

Copy link
Copy Markdown
Contributor Author

Codex fixes ready on codex/sweep-findings, rebased onto 7dadabe: b167f04 (docs local-only) and 6407402 (collection/publication integrity, report fidelity, remove coverage tracking, finite prices). 58 focused tests passed; no local heavy tests or paid runs. Please merge the stacked fix PR into this integration branch rather than repeat the fixes.

Still yours: LocalRuns ignores package/extra_packages; please honour specs or refuse mismatch. Additional review finding: tests/test_layering.py::_graph breaks after the first matching target of each ImportFrom node, losing later aliases, and ignores ast.Import. Please add synthetic import-graph regressions.

Boundary clarification for James: child launches use Audit.launch -> authorizer -> Runs. Initial source log downloads, artifact publication and balance checks use provider helpers; the launcher separately submits the top-level audit. start_register still loads benchmark code on the auditor host. Bash executes arbitrary code in the sandbox, so not every computation is a recorded job.

Persistent ownership note: /Users/james/Documents/generality/inspect-audit-coordination.md. No need to restore tracked docs; James explicitly wants them local-only. LaTeX graphs and isolated dataset enumeration remain follow-up design decisions.

…m a private repo

audit_reports is private, so fetching needed a GitHub token wherever a report was
built (CI, Hawk, anyone outside the org). The pinned files now live under
publishers/template/ with the revision recorded in template.json; git keeps them
exact, so the per-file checksums and the template cache image are gone, and the CI
LaTeX job needs no secret. --update-from copies a newer revision in.
@jrh-mann

Copy link
Copy Markdown
Contributor Author

James requested trimming dated incident narratives and lengthy justifications. Added comments/docstrings-only commit 87e21d3 to PR #70: 11 files, net -94 lines. Retained technical constraints; no tool-facing/API parameter docs changed. Executable ASTs verified identical; hooks pass, no test runs. This includes a small comments-only edit to _audit.py and _audit_workspace.py, so please carry it through your split/moves. History stays in git; no new docs added.

@jrh-mann

Copy link
Copy Markdown
Contributor Author

James authorised fixing the six follow-up findings. Codex is adding a commit to PR #70: require explicit AuditAuthorizer and always check saved policy (remove post_init and configuration_json="{}" bypass); remove unused Audit.where/menu, ModelMenu.all and Runner alias; explicit --benchmark-name in generated configs; fix model-facing rename grammar and item.json path; reject non-object stacked-bar segments; bounded local done-record tail; shorten container module intro. I see your uncommitted launcher change already removes Runner; my identical removal is safe to drop when integrating. tests fixtures now construct/bind explicit policies using the real Store. Small local mockllm detached test hit an unavailable control endpoint; 85 other focused tests passed. No heavy local tests or paid calls.

@jrh-mann

Copy link
Copy Markdown
Contributor Author

Follow-up ready on PR #70: ff06ad1 fixes the six review items James authorised. Audit now requires an explicit authorizer, has no implicit policy constructor or configuration_json="{}" verification bypass, and no where/menu fields or ModelMenu.all. Test fixtures explicitly construct policies; launch tests bind a real PolicyStore. Generated configs require benchmark_name / --benchmark-name (distribution name is no longer inferred from task prefix). Agent text uses Investigate and /audit/item.json. Stacked-bar validation rejects non-object segments. Local status reads the last 64 KiB for Inspect's small done record. Removed Runner alias (also already removed in your uncommitted launcher edit). Shortened container intro.

87 focused tests passed plus 6 new regression cases; 9 excluded. An earlier run included the id-less dataset local launch test, which failed because Inspect's control endpoint could not bind; excluded from rerun, no claim that local integration passed. No Docker/TeX/browser/paid runs. Production Python -30 lines. Please include this commit with the rest of #70; do not recreate a compatibility policy fallback during your task split.

… not custom tools

The host slices each declared log down to this sample's epochs and writes it into
the box as an Inspect JSON log (/audit/logs/*.json): readable with Inspect's log API
and with plain json, so the box needs nothing installed. attempts, read_attempt and
export_attempts are gone; the investigator gets the reading-logs and analyzing-logs
skills. The investigator image recipe adds inspect-ai for the next publish.
…refuse only a local sandbox

Benchmark task arguments come from the launch policy and a job must match them
exactly, so the agent cannot add any. The name-pattern screen therefore only
second-guessed the operator, and refused SWE-bench's own sandbox_type,
image_name_template and sandbox_config, blocking every investigation in the first
end-to-end audit. The real hazard is running the benchmark outside a sandbox,
beside the runner's credentials: that alone is refused, with judge models still
held to the policy.
An eval set of 100 per-sample investigation items built 100 tasks in one runner, each
downloading the same 500-sample Hawk log again; the runner died. Fetched addresses
are now reused within the process.
The audit skill tool records its installed skills in a per-sample store keyed
by instance; the publishing tool shared the default instance, so after any audit
skill call it answered 'Unknown skill' for the publishing skill. The auditor on
Hawk (ia-demo-audit-swe-20261023-r2) submitted findings then looped on this until
its token limit. The handoff test now calls an audit skill first.
The logs record where their run called its judge. Replayed on another host it
sends that host's credentials to the wrong place: SQAV round 2 on Hawk replayed
grader base_url https://openrouter.ai/api/v1, bypassed the gateway with the
gateway token, and every grade call returned 401. The recorded generation
settings still apply; an endpoint is used only when declared.
The scorecard breakdown is a table in a box that cannot break across pages, and
the template asks for a one-line description per contribution: give it the first
sentence; the full explanation stays in the dimension's part. Paths, log names
and hashes have no hyphenation points: allow a break after / and _, and anywhere
in a run over 30 characters. The SWE-bench auditor report went from 34 overfull
boxes and a table over its footer to none.
Middleman's public names for OpenRouter keep their prefix, so on Hawk an
OpenRouter model runs as openrouter/openrouter/{org}/{slug}; the plain form
reaches the proxy as {org}/{slug} and 404s unless a direct route of that name
exists (opus-5.5 has none). The catalog id is the trailing {org}/{slug}.
Hawk routes a Middleman aggregator public name openrouter/{org}/{slug} as
openai-api/openrouter/openrouter/{org}/{slug} (providers.aggregator_public_name_uri):
the submit-time check and the runtime call then name the same model. Price it
from the same OpenRouter catalog entry.

This branch had an error being deployed

1 failed (outdated) deployment
audit-template — 7dadabe7 Deployed Oct 23, 2026 by jrh-mann via LaTeX fixture #138
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants