specific-property-impl…
**Role**: Implement specific (per-handler) properties into Properties.sol and wire ghost updates + snapshot calls + property assertions into handler files.
**Role**: Implement global properties into Properties.sol, wire ghost variables into Base.sol, and populate Snapshots.sol. These are checked by the fuzzer after every handler call.
$ npx -y skills add pashov/skills --agent claude-codeHow it fires
How this agent gets triggered: by you, by Claude, or both.
Context preview
The summary Claude sees to decide when to auto-load this agent.
**Role**: Implement global properties into Properties.sol, wire ghost variables into Base.sol, and populate Snapshots.sol. These are checked by the fuzzer after every handler call.
**Role**: Implement global properties into Properties.sol, wire ghost variables into Base.sol, and populate Snapshots.sol. These are checked by the fuzzer after every handler call.
**Spawn config**: `general-purpose` agent, `model: "{AGENT_MODEL}"` (see SKILL.md "Subagent Model" section — defaults to `sonnet`, `opus` under `--max`). Spawned in parallel with Agent 7B.
---
You implement the GLOBAL properties and the ghost/snapshot infrastructure from the property plan.
These rules expand on the general property implementation instructions in `property-generation.md` with specifics for the global properties and wiring.
Global properties are `public` functions starting with `property_` prefix. The fuzzer calls them directly after every handler.
Every property function you write MUST have its Spec ID as the first thing in its natspec, on its own line, in this exact form:
/// @notice GL-NN: <one-line description>
function property_<name>() public { ... }The `GL-NN:` token (with the colon) is how `/fizz-convert` and future runs locate the existing implementation of a Spec ID for re-generation or deletion. Without it, automation cannot reconcile the spec with the code. This is a hard requirement, not a style preference.
// ―――――――――――――――――――― Global properties ―――――――――――――――――――――
// These properties must always hold after any function call
// They MUST BE PUBLIC so that fuzzers can find and call them
function property_solvency() public {
gte(
token.balanceOf(address(vault)),
vault.totalAssets(),
"Solvency: token balance < totalAssets"
);
}
function property_totalSupplyMatchesBalances() public {
uint256 sum;
for (uint256 i; i < NUMBER_OF_ACTORS; i++) {
sum += vault.balanceOf(address(actors[i]));
}
eq(sum, vault.totalSupply(), "Sum of balances != totalSupply");
}
function property_ghostAccounting() public {
gte(
ghosts.totalDeposited,
ghosts.totalWithdrawn,
"Ghost: more withdrawn than deposited"
);
}Global properties run after EVERY handler call. Keep them O(n) where n = NUMBER_OF_ACTORS (typically 3-5). Avoid unbounded loops.
For every `GL-*` property:
Match by exact ID. Do NOT renumber, reorder, or rewrite other lines.
Return: `DONE: X global properties implemented (Y marked [x], Z marked [-] as skipped/TODO). Ghosts: G fields added to Base.sol. Snapshot: S fields added to Snapshots.sol.`
AI-powered Solidity security skills — built by Pashov Audit Group. Supported AI Platforms:
Repo: pashov/skills
**Role**: Implement specific (per-handler) properties into Properties.sol and wire ghost updates + snapshot calls + property assertions into handler files.
**Discovery approach**: Think like an attacker. What would maximize extracted value? What sequence breaks liveness? What edge conditions create exploitable…
**Discovery approach**: For every aggregate/total variable, write a "sum of individual parts = tracked whole" property. This is the #1 bug-finding pattern in…
**Discovery approach**: Auto-detect the protocol type from PROTOCOL_CONTEXT, then apply battle-tested property templates specific to that protocol category.
**Discovery approach**: For every paired operation and conversion function, verify that round-trips don't create value and rounding always favors the protocol.
**Discovery approach**: Map the state machine, verify operation postconditions, check paired-operation symmetry, and ensure entity counts stay consistent.