Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions .ultrafuzz/prompts/setup/discover-base-test.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,10 @@ If the setup handoffs identify Vyper-only or mixed Solidity/Vyper production
contracts, make the reusable Foundry fixture Vyper-aware while keeping the tests
Solidity-based. Define Solidity interfaces for the Vyper contracts' ABI-visible
public/external functions and events, or reuse ABI-derived interfaces generated
by the target repository. Do not require Foundry to compile `.vy` files as
Solidity sources.
by the target repository. Declare any new interface in the test tree: the
workspace handoff rejects every change under the production source roots (by
default `src/` and `contracts/`). Do not require Foundry to compile `.vy` files
as Solidity sources.

For Vyper deployment helpers, prefer one reusable path that compiles creation
bytecode with the target project's pinned compiler/tooling from the project
Expand Down
4 changes: 3 additions & 1 deletion .ultrafuzz/prompts/setup/prepare-foundry-harness.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@ production contracts, keep Foundry as the test harness and do not ask Foundry to
compile `.vy` files as Solidity sources. Configure the harness so generated
`.t.sol` tests interact with Vyper contracts through Solidity interfaces that
match the contracts' public/external ABI, or through ABI-derived Solidity
interfaces when the target repository already generates them.
interfaces when the target repository already generates them. Declare any new
interface in the test tree: the workspace handoff rejects every change under the
production source roots (by default `src/` and `contracts/`).

Create only the minimal harness layout needed by later fuzzing agents.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,8 +124,10 @@ an unselected expected check is not implemented or fulfilled.
guard, or other precondition that prevents the backend from observing the
violating post-state. Preconditions may admit valid actions; they may not
assume the property under test.
- Do not edit production contracts except interfaces that are genuinely
required by the test harness.
- Do not edit production contracts, not even to add an interface: the
workspace handoff rejects every change under the production source roots
(by default `src/` and `contracts/`). Declare any interface the harness
needs in the test tree instead.
- Keep generated or changed invariant files in the test tree and include
every changed `*.t.sol` test/reproducer in `generated-tests.json`.
- Preserve Recon constructor deployment if property work changes `Setup`,
Expand Down
2 changes: 1 addition & 1 deletion .ultrafuzz/prompts/strategies/invariants/setup.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ project's pinned revision.
Use these Recon/Chimera rules while making decisions:

- Read `AGENTS.md` and obey all repository-specific rules before editing.
- Do not edit production `src/` or `contracts/` except for interfaces if they are genuinely required by the harness.
- Do not edit production `src/` or `contracts/`, not even to add an interface: the workspace handoff rejects every change under the production source roots. Declare any interface the harness needs in the test tree instead.
- [Chimera](https://github.com/Recon-Fuzz/create-chimera-app) is the write-once, run-everywhere scaffold for Foundry, Echidna, Medusa, Halmos, and Kontrol style runs.
- The create-chimera-app layout under the repository's test root is:
`<test-root>/recon/Setup.sol`, `BeforeAfter.sol`, `Properties.sol`,
Expand Down
11 changes: 2 additions & 9 deletions .ultrafuzz/topology.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ groups:
review:
label: Review
color: "#0f766e"
defaults:
timeout_seconds: 7200
Comment on lines 43 to +45

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Existing projects keep shorter timeouts

Default and low-cost runs use each project's editable .ultrafuzz/topology.yml, and ultrafuzz init preserves that file unless run with --force. Projects created before this change therefore do not get the new review pin. Their review stages still use the existing 3,600-second default, so the one-hour timeout this PR aims to fix persists for those runs.

Prompt To Fix With AI
This is a comment left during a code review.
Path: .ultrafuzz/topology.yml
Line: 43-45

Comment:
**Existing projects keep shorter timeouts**

Default and low-cost runs use each project's editable `.ultrafuzz/topology.yml`, and `ultrafuzz init` preserves that file unless run with `--force`. Projects created before this change therefore do not get the new review pin. Their review stages still use the existing 3,600-second default, so the one-hour timeout this PR aims to fix persists for those runs.

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Fix in Claude Code

nodes:
- id: __start__
kind: meta
Expand Down Expand Up @@ -198,7 +200,6 @@ nodes:
group: references
depends_on:
- __start__
timeout_seconds: 300
outputs:
- path: references/0kn0t.md
contract: ultrafuzz/nonempty-markdown@1
Expand All @@ -211,7 +212,6 @@ nodes:
group: references
depends_on:
- __start__
timeout_seconds: 300
outputs:
- path: references/certora-thinking.md
contract: ultrafuzz/nonempty-markdown@1
Expand All @@ -224,7 +224,6 @@ nodes:
group: references
depends_on:
- __start__
timeout_seconds: 300
outputs:
- path: references/certora-sanity.md
contract: ultrafuzz/nonempty-markdown@1
Expand All @@ -237,7 +236,6 @@ nodes:
group: references
depends_on:
- __start__
timeout_seconds: 300
outputs:
- path: references/aviggiano.md
contract: ultrafuzz/nonempty-markdown@1
Expand All @@ -250,7 +248,6 @@ nodes:
group: references
depends_on:
- __start__
timeout_seconds: 300
outputs:
- path: references/rounding.md
contract: ultrafuzz/nonempty-markdown@1
Expand All @@ -263,7 +260,6 @@ nodes:
group: references
depends_on:
- __start__
timeout_seconds: 300
outputs:
- path: references/crytic.md
contract: ultrafuzz/nonempty-markdown@1
Expand All @@ -276,7 +272,6 @@ nodes:
group: references
depends_on:
- __start__
timeout_seconds: 300
outputs:
- path: references/runtime-verification.md
contract: ultrafuzz/nonempty-markdown@1
Expand All @@ -289,7 +284,6 @@ nodes:
group: references
depends_on:
- __start__
timeout_seconds: 300
outputs:
- path: references/a16z-erc4626.md
contract: ultrafuzz/nonempty-markdown@1
Expand All @@ -302,7 +296,6 @@ nodes:
group: references
depends_on:
- __start__
timeout_seconds: 300
outputs:
- path: references/recon.md
contract: ultrafuzz/nonempty-markdown@1
Expand Down
14 changes: 14 additions & 0 deletions docs/how-to/edit-prompts-topology.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,13 @@ After `ultrafuzz init`, editable prompts live under:
Use the [prompt catalog](../reference/prompt-catalog.md) to find every shipped
workflow prompt and its role before choosing what to customize.

Runs use these project copies, and `ultrafuzz init` keeps them unless you pass
`--force`, which also overwrites `ultrafuzz.toml` and the topology. After an
upgrade a copy therefore keeps the text of the release that scaffolded it.
`ultrafuzz validate` warns about every project prompt that differs from the
built-in prompt at the same path. To take the built-in version of a prompt,
delete your copy and rerun `ultrafuzz init`.

Prompt frontmatter may include only identity and display metadata:

```md
Expand Down Expand Up @@ -84,6 +91,13 @@ nodes:
Agentic nodes run through the configured workflow adapter. Topology does not
define arbitrary shell runners.

`ultrafuzz init` also keeps an existing `.ultrafuzz/topology.yml`, so after an
upgrade it still has the topology of the release that scaffolded it. If you
have not customized it,
`ultrafuzz topology copy default .ultrafuzz/topology.yml --force` replaces it
with the current packaged default and leaves `ultrafuzz.toml` and the prompts
alone; otherwise, merge the release's topology changes by hand.

## Declare Durable Handoffs

Use `outputs` for files a node must write under its artifact directory. Every
Expand Down
5 changes: 4 additions & 1 deletion docs/reference/cli.md
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,10 @@ ultrafuzz validate [--project <path>] [--audit-profile <name>] \

Validation covers typed TOML config, `.ultrafuzz/topology.yml`, project prompt
copies, safe paths, reference nodes, agent references, and trusted local
execution posture. It does not launch agents.
execution posture. It does not launch agents. A project prompt that differs
from the built-in prompt at the same path sets the prompts posture to `warn`
with one `PROMPT_DIFFERS_FROM_BUILT_IN` warning per file; warnings do not fail
validation.

## JSON Validate

Expand Down
3 changes: 3 additions & 0 deletions docs/reference/topology-yaml.md
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,9 @@ Reference nodes must:
- Mark exactly one non-manifest output as primary.
- Avoid `prompt`, `role`, and `model_profiles`.

Reference nodes are materialized when the run is planned and never run as
agent tasks, so `timeout_seconds` has no effect on their execution.

Downstream prompts can consume the normalized Markdown primary artifact with:

```md
Expand Down
11 changes: 2 additions & 9 deletions packages/config/topologies/default.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ groups:
review:
label: Review
color: "#0f766e"
defaults:
timeout_seconds: 7200
Comment on lines +44 to +45

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Review pin exceeds cloud caps

If a cloud project has an explicit resource timeout below 7,200 seconds and per-node caps for the already-pinned strategy tasks, its review tasks now exceed that resource timeout. Task compilation throws CLOUD_TASK_TIMEOUT_BUDGET_EXCEEDED, so a previously valid run cannot launch. The same review pin is added to the exhaustive and invariant-only topologies.

Prompt To Fix With AI
This is a comment left during a code review.
Path: packages/config/topologies/default.yml
Line: 44-45

Comment:
**Review pin exceeds cloud caps**

If a cloud project has an explicit resource timeout below 7,200 seconds and per-node caps for the already-pinned strategy tasks, its review tasks now exceed that resource timeout. Task compilation throws `CLOUD_TASK_TIMEOUT_BUDGET_EXCEEDED`, so a previously valid run cannot launch. The same review pin is added to the exhaustive and invariant-only topologies.

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Fix in Claude Code

nodes:
- id: __start__
kind: meta
Expand Down Expand Up @@ -198,7 +200,6 @@ nodes:
group: references
depends_on:
- __start__
timeout_seconds: 300
outputs:
- path: references/0kn0t.md
contract: ultrafuzz/nonempty-markdown@1
Expand All @@ -211,7 +212,6 @@ nodes:
group: references
depends_on:
- __start__
timeout_seconds: 300
outputs:
- path: references/certora-thinking.md
contract: ultrafuzz/nonempty-markdown@1
Expand All @@ -224,7 +224,6 @@ nodes:
group: references
depends_on:
- __start__
timeout_seconds: 300
outputs:
- path: references/certora-sanity.md
contract: ultrafuzz/nonempty-markdown@1
Expand All @@ -237,7 +236,6 @@ nodes:
group: references
depends_on:
- __start__
timeout_seconds: 300
outputs:
- path: references/aviggiano.md
contract: ultrafuzz/nonempty-markdown@1
Expand All @@ -250,7 +248,6 @@ nodes:
group: references
depends_on:
- __start__
timeout_seconds: 300
outputs:
- path: references/rounding.md
contract: ultrafuzz/nonempty-markdown@1
Expand All @@ -263,7 +260,6 @@ nodes:
group: references
depends_on:
- __start__
timeout_seconds: 300
outputs:
- path: references/crytic.md
contract: ultrafuzz/nonempty-markdown@1
Expand All @@ -276,7 +272,6 @@ nodes:
group: references
depends_on:
- __start__
timeout_seconds: 300
outputs:
- path: references/runtime-verification.md
contract: ultrafuzz/nonempty-markdown@1
Expand All @@ -289,7 +284,6 @@ nodes:
group: references
depends_on:
- __start__
timeout_seconds: 300
outputs:
- path: references/a16z-erc4626.md
contract: ultrafuzz/nonempty-markdown@1
Expand All @@ -302,7 +296,6 @@ nodes:
group: references
depends_on:
- __start__
timeout_seconds: 300
outputs:
- path: references/recon.md
contract: ultrafuzz/nonempty-markdown@1
Expand Down
11 changes: 2 additions & 9 deletions packages/config/topologies/exhaustive.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ groups:
review:
label: Review
color: "#0f766e"
defaults:
timeout_seconds: 7200
nodes:
- id: __start__
kind: meta
Expand Down Expand Up @@ -198,7 +200,6 @@ nodes:
group: references
depends_on:
- __start__
timeout_seconds: 300
outputs:
- path: references/0kn0t.md
contract: ultrafuzz/nonempty-markdown@1
Expand All @@ -211,7 +212,6 @@ nodes:
group: references
depends_on:
- __start__
timeout_seconds: 300
outputs:
- path: references/certora-thinking.md
contract: ultrafuzz/nonempty-markdown@1
Expand All @@ -224,7 +224,6 @@ nodes:
group: references
depends_on:
- __start__
timeout_seconds: 300
outputs:
- path: references/certora-sanity.md
contract: ultrafuzz/nonempty-markdown@1
Expand All @@ -237,7 +236,6 @@ nodes:
group: references
depends_on:
- __start__
timeout_seconds: 300
outputs:
- path: references/aviggiano.md
contract: ultrafuzz/nonempty-markdown@1
Expand All @@ -250,7 +248,6 @@ nodes:
group: references
depends_on:
- __start__
timeout_seconds: 300
outputs:
- path: references/rounding.md
contract: ultrafuzz/nonempty-markdown@1
Expand All @@ -263,7 +260,6 @@ nodes:
group: references
depends_on:
- __start__
timeout_seconds: 300
outputs:
- path: references/crytic.md
contract: ultrafuzz/nonempty-markdown@1
Expand All @@ -276,7 +272,6 @@ nodes:
group: references
depends_on:
- __start__
timeout_seconds: 300
outputs:
- path: references/runtime-verification.md
contract: ultrafuzz/nonempty-markdown@1
Expand All @@ -289,7 +284,6 @@ nodes:
group: references
depends_on:
- __start__
timeout_seconds: 300
outputs:
- path: references/a16z-erc4626.md
contract: ultrafuzz/nonempty-markdown@1
Expand All @@ -302,7 +296,6 @@ nodes:
group: references
depends_on:
- __start__
timeout_seconds: 300
outputs:
- path: references/recon.md
contract: ultrafuzz/nonempty-markdown@1
Expand Down
Loading
Loading