Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
d3363d7
Add AutoProver OIDC role (#147)
H00N24 Aug 10, 2026
139a88a
Monitoring for budget pressure, prover abuse (#90)
jtoman Aug 10, 2026
b089d6c
Code gen changes, Pt 4 (#10)
jtoman Aug 11, 2026
77d9e5a
Tell the harness agent not to extend a non-deployable contract (#130)
shellygr Aug 12, 2026
1915d7d
Fixes integration tests (#149)
jtoman Aug 12, 2026
a819e2a
Typed pydantic models of the Solidity compact AST (--dump_asts) + aut…
shellygr Aug 12, 2026
5970749
Fix the stuck-rule nag detector crashing every stuck prover run (#153)
naftali-g Aug 12, 2026
7602cc6
Compile-check generated harnesses before accepting them (#129)
shellygr Aug 12, 2026
f378a9c
Key families (#157)
jtoman Aug 13, 2026
db27296
fix codegen (#161)
jtoman Aug 13, 2026
8ed12de
Isolate a failing CEX analysis from the run that produced it (#162)
shellygr Aug 14, 2026
fd715fc
Hot fixes (#163)
jtoman Aug 14, 2026
88dd591
autosetup: express remapping contexts against the run root (#164)
shellygr Aug 14, 2026
ffc89e4
Tool family templates (#156)
jtoman Aug 14, 2026
df02aa4
First version of soroban ecosystem (#127)
chandrakananandi Aug 15, 2026
8f0f434
add `--extra-context` (#154)
naftali-g Aug 16, 2026
0a550d7
PR 2/3: Rust application framework (PyO3) (#97)
ericeil Aug 18, 2026
36f049f
Plugin tool contribution (#158)
jtoman Aug 18, 2026
6722105
automatic graph retries (#167)
jtoman Aug 18, 2026
4af1ad0
Make the Rust toolchain a documented prerequisite, and stop uv racing…
ericeil Aug 18, 2026
56ce590
tests: drop the solana_vault leftovers PR 97 leaked onto master (#174)
ericeil Aug 18, 2026
9ad420a
Treat an unimplemented contract as a terminal compilation failure (#131)
shellygr Aug 18, 2026
e03cb74
tool family display update, GC bump (#170)
jtoman Aug 18, 2026
4cd3cb4
Better harnessing prompt (#175)
jtoman Aug 18, 2026
2198f81
Move code-explorer prompts onto the ecosystem as shared templates (#171)
ericeil Aug 18, 2026
4459408
autosetup: detect the via-ir-required family by its remediation hint …
shellygr Aug 19, 2026
b9a531b
autosetup: resolve hoisted node_modules packages, and say which kind …
shellygr Aug 19, 2026
677e918
autosetup: pick the build system and the artifact directory from arti…
shellygr Aug 19, 2026
30ed3c1
ci: split the wire round trips out of the `fuzz` marker (#181)
ericeil Aug 19, 2026
ae8c5f2
CI: run pyright and pytest on pull requests targeting dev (#141)
shellygr Aug 20, 2026
2ce16a6
autosetup: keep the named main contract in the scene (#165)
shellygr Aug 20, 2026
115a2e0
autosetup: converge the compilation-workaround loop instead of timing…
shellygr Aug 20, 2026
a52a37a
autosetup: try the optimizer under legacy codegen before reaching for…
shellygr Aug 20, 2026
ec667e4
rules striping (#177)
jtoman Aug 20, 2026
acf913c
chore: advance graphcore submodule and pyproject.toml pin to latest m…
Copilot Aug 24, 2026
bc39039
summarization_detector: standalone summarization-target detector
jar-ben Aug 25, 2026
9c5e000
summarization_detector: merge surviving signal into detect + refine o…
jar-ben Aug 26, 2026
67dad4b
autosetup: run the summarization-target detector on the test run
jar-ben Aug 26, 2026
c6dfef4
composer: inject prover-hostile summarization targets into CVL genera…
jar-ben Aug 26, 2026
e6de4d3
autosetup: add a Collect Difficulties run; make the Test Run skippable
jar-ben Aug 26, 2026
119ead0
composer: pass --skip-test-run to autosetup
jar-ben Aug 26, 2026
3a84744
summarization_detector: populate file/line on nonlinear candidates
jar-ben Aug 26, 2026
6ac2594
summarization_detector: sharpen signal-1, unify taxonom
jar-ben Aug 28, 2026
be63f30
composer: render summarization candidates on the new detector schema
jar-ben Aug 28, 2026
225c386
Bump certora-prover-cli 0.1.0 -> 0.2.1 in the lock (#194)
jar-ben Aug 28, 2026
8bbef69
Merge remote-tracking branch 'origin/master' into jaroslav/summarizat…
jar-ben Aug 28, 2026
481d268
composer: type hostile_candidates so the template fuzzer draws valid …
jar-ben Aug 28, 2026
d18d807
Bump certora-cli 8.18.0 -> 8.19.1
jar-ben Aug 28, 2026
3a9a1ad
Merge branch 'jaroslav/bump-certora-cli-8.19.1': certora-cli 8.19.1
jar-ben Aug 28, 2026
5ca172d
Bump certora-cli 8.18.0 -> 8.19.1 (#195)
jar-ben Aug 28, 2026
a971096
Merge origin/master (certora-cli 8.19.1 #195)
jar-ben Aug 28, 2026
db70f07
summarization_detector: own the candidates schema; composer imports it
jar-ben Aug 28, 2026
4548553
summarization_detector: docs describe behavior not the consumer; prof…
jar-ben Aug 28, 2026
35815d2
autosetup: dump the SurvivingCallGraph on the difficulty run (callTra…
jar-ben Aug 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
7 changes: 5 additions & 2 deletions .github/scripts/sandbox_vm_provision.sh
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@
# regardless (§11 item 2).
#
# Kept dependency-light on purpose: the escape suite imports only stdlib +
# composer.sandbox.* (all stdlib) + pytest, so we install just pytest via uv and
# composer.sandbox.*, whose sole third-party import is annotated_types (three
# files, no dependencies of its own). So we install just pytest + that via uv and
# put the repo on PYTHONPATH — no project build, no numpy/psycopg/langchain. We
# pass --noconftest so tests/conftest.py (which imports those heavy deps) is not
# collected; the suite's fixtures are all in-module.
Expand Down Expand Up @@ -75,8 +76,10 @@ section "Escape suite against kernel ${KREL}"
export PYTHONPATH="${REPO}"
# --no-project: don't build AutoProver; --with: ephemeral pytest env.
# --noconftest: skip tests/conftest.py's heavy imports (fixtures here are in-module).
# annotated-types is composer.sandbox.config's only non-stdlib import (it carries the
# Ge(0) bound on the Rust-mirrored timeout_s), so importing the package needs it here.
uv run --no-project --python 3.12 \
--with 'pytest>=9.0' --with 'pytest-asyncio>=1.3' \
--with 'pytest>=9.0' --with 'pytest-asyncio>=1.3' --with 'annotated-types>=0.7' \
pytest --noconftest -v \
--junitxml="${JUNIT}" \
"${REPO}/tests/test_sandbox_escape.py"
44 changes: 34 additions & 10 deletions .github/workflows/integration-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,26 @@ name: Integration Tests

on:
schedule:
- cron: '7 5 * * *'
workflow_dispatch: {} # adds a "Run workflow" button in the Actions tab
- cron: "7 5 * * *"
workflow_dispatch: {} # adds a "Run workflow" button in the Actions tab

# If a manual run and a scheduled run overlap, cancel the older one
# so you don't pay for the expensive job twice.
concurrency:
group: scheduled-tests
cancel-in-progress: true

permissions:
id-token: write
contents: read

jobs:
test:
runs-on: ubuntu-latest
timeout-minutes: 20

environment: prod # Both dev/stg are available as well
env:
CERTORA_LAMBDA_URL: ${{ secrets.LAMBDA_FUNCTION_URL }}
steps:
- name: Check out code
uses: actions/checkout@v4
Expand All @@ -31,18 +37,22 @@ jobs:
- name: Set up JDK
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '21'
distribution: "temurin"
java-version: "21"

- name: sync-deps
# --no-dev skips the `dev` group (and the `apps` group it includes), so this
# job doesn't compile the Rust crates — nothing under `expensive` or `fuzz`
# touches them. Every `uv run` below needs the flag too: a bare `uv run`
# re-syncs with the default groups and would pull `apps` back in.
run: |
uv sync --group test --extra prover
uv sync --group test --extra prover --no-dev

- name: sync solc
run: |
uv pip install solc-select
uv run solc-select install 0.8.29
uv run solc-select use 0.8.29
uv run --no-dev solc-select install 0.8.29
uv run --no-dev solc-select use 0.8.29
# certoraRun resolves Certora-convention names like `solc8.29` as
# literal executables; solc-select only ships the `solc` shim, so
# fetch the static binary under that exact name.
Expand All @@ -51,14 +61,28 @@ jobs:
sudo chmod +x /usr/local/bin/solc8.29
solc8.29 --version

- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@e6de054238d6b7531b4efff3b6587d9aade6a06c # v6.2.3
with:
role-to-assume: ${{ secrets.AWS_OIDC_ROLE_ARN }}
aws-region: us-west-2

- name: Basic who-am-i check
run: |
# The stored URL ends in a slash and //who-am-i would not route.
curl -sS --fail-with-body "${CERTORA_LAMBDA_URL%/}/who-am-i" \
--user "$AWS_ACCESS_KEY_ID":"$AWS_SECRET_ACCESS_KEY" \
-H "x-amz-security-token: $AWS_SESSION_TOKEN" \
--aws-sigv4 "aws:amz:us-west-2:lambda"

- name: run autoprover integration tests
run: |
uv run pytest -n 3 -m 'expensive' tests
uv run --no-dev pytest -n 3 -m 'expensive' tests
env:
CERTORAKEY: ${{ secrets.CERTORAKEY }}
- name: run template fuzz tests
run: |
uv run pytest -n 2 -m 'fuzz' tests
uv run --no-dev pytest -n 2 -m 'fuzz' tests
env:
HYPOTHESIS_PROFILE: extended

Expand Down
11 changes: 7 additions & 4 deletions .github/workflows/pyright.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ name: pyright-check

on:
push:
branches: [ main, master ]
branches: [ main, master, dev ]
pull_request:
branches: [ main, master ]
branches: [ main, master, dev ]

jobs:
pyright:
Expand All @@ -22,10 +22,13 @@ jobs:
cache-suffix: pyright

- name: sync-deps
# --no-dev skips the `dev` group (and the `apps` group it includes), so this
# job doesn't compile the Rust crates — pyright can't see into a compiled
# extension module anyway.
run: |
uv sync --group ci
uv sync --group ci --no-dev
uv pip install sentence_transformers --no-deps

- name: Run pyright
run: |
uv run pyright composer/ analyzer sanity_analyzer certora_autosetup
uv run --no-dev pyright composer/ analyzer sanity_analyzer certora_autosetup
28 changes: 25 additions & 3 deletions .github/workflows/pytest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ name: pytest-check

on:
push:
branches: [ main, master ]
branches: [ main, master, dev ]
pull_request:
branches: [ main, master ]
branches: [ main, master, dev ]

jobs:
pytest:
Expand All @@ -20,7 +20,29 @@ jobs:
enable-cache: true
cache-dependency-glob: "uv.lock"
cache-suffix: pytest


# `dev` is one of uv's default groups and includes `apps`, so the sync below
# builds the `rust/` wheels — tests/test_rustapp.py and the launcher suites
# skip themselves without them. uv builds those crates concurrently, and
# rustup's install path is not safe against concurrent invocations: whichever
# maturin -> cargo call wins clears $RUSTUP_HOME/downloads and the other one
# dies renaming its half-downloaded component. So install the toolchain
# serially, first. No argument — rustup takes the channel, profile and
# components from rust-toolchain.toml.
- name: Install the pinned Rust toolchain
run: rustup toolchain install --no-self-update

- name: Cache the Rust build
uses: actions/cache@v4
with:
path: |
~/.cargo/registry/index
~/.cargo/registry/cache
~/.cargo/git/db
rust/target
key: cargo-pytest-${{ hashFiles('rust/Cargo.lock') }}
restore-keys: cargo-pytest-

- name: sync-deps
run: |
uv sync --group test --extra prover
Expand Down
2 changes: 1 addition & 1 deletion ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ five steps and never inspects anything backend-specific:
`run_pipeline` also takes an `ecosystem: Ecosystem[App, Main, Unit]`
([composer/pipeline/ecosystem.py](composer/pipeline/ecosystem.py)) — the *front-half* plug point,
orthogonal to the backend. It pairs a **language** (how the target's source is read — fs-exclusion
pattern, code-explorer prompt) with a **chain** and supplies the domain-specific pieces the shared
pattern) with a **chain** (including the code-explorer prompt) and supplies the domain-specific pieces the shared
steps need: the analyzed-model type (`App`), the analysis/property prompts, model validation, how
to locate the target `Main`, and `units(main) -> list[Unit]` (the per-unit split the extraction and
formalization phases iterate). `EVM` binds `(SourceApplication, ContractInstance,
Expand Down
6 changes: 6 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,12 @@ loose). Both flags matter:
every non-default group the two commands above need, `ci` (pyright) included, or the sync
that fixes one of them breaks the other:
`uv sync --group test --group ci --group ragbuild --extra cpu --extra certora-cli`.
- **The Rust toolchain.** That sync's default `dev` group builds the maturin crates under
`rust/`, so it needs cargo. If the toolchain `rust-toolchain.toml` pins is not installed
yet, install it first and on its own — `rustup toolchain install --no-self-update`, no
argument, so rustup reads the channel, profile and components from that file. uv builds
those crates concurrently and rustup's on-demand install is not concurrency-safe, so
letting the build trigger it races.

## Python

Expand Down
17 changes: 17 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,28 @@ The rest of this document covers the **host `uv` flow** for development.
You need everything from the [AIComposer infrastructure setup](AICOMPOSER_INFRA.md):

- Python 3.12+, `uv`, Docker with compose
- `rustup` — a default `uv sync` builds the `rust/` crates (see below)
- `ANTHROPIC_API_KEY` in your environment
- PostgreSQL databases running (see below)
- RAG database populated
- Solidity compiler(s) on `$PATH` (naming convention `solcX.Y`, e.g. `solc8.29`)

### Rust toolchain

A `uv sync`, or any `uv run`, which revalidates path dependencies, builds the maturin crates under `rust/`. Without a
toolchain the sync fails outright rather than skipping. Install [rustup](https://rustup.rs) (a distro `cargo` package is
not enough: `rust-toolchain.toml` pins the toolchain and rustup is what reads it), then once, from the repo root:

```bash
rustup toolchain install --no-self-update
```

Re-run that after any bump to `rust-toolchain.toml`'s `channel` — rustup would otherwise install the new toolchain from
inside the build, where the concurrent cargo calls a sync makes race each other and one dies mid-download.

Not working on the Rust side? `uv sync --no-dev` skips the crates entirely — the Rust tests then skip themselves instead
of failing, and the CI pyright job runs this way.

### Certora Prover

**Cloud mode (the default):** Two credentials are needed. `CERTORAKEY` (set in your environment) authenticates `certoraRun` when it submits prover jobs. The job *results* are fetched with the Certora cloud credentials produced by `certora-cloud login` — install the public CLI (`uv tool install certora-cloud`) and run it once (`certora-cloud login`); it writes `~/.certora/credentials.json`, which is read automatically. Exporting `CERTORA_USER`/`CERTORA_TOKEN`/`CERTORA_REFRESH_TOKEN` instead is an optional override.
Expand Down
Loading
Loading