# Base Sepolia Bonds-Only Rehearsal Packet

Candidate-Commit: `BLOCKED_NO_FINAL_SOURCE_COMMIT`

This packet prepares a **Base Sepolia**, bonds-only pilot rehearsal. It is not
a deployment package, deployment approval, activation approval, or signing
tool. It is intentionally unable to sign, broadcast, deploy, or accept a
secret. The only permitted inputs are public EVM addresses, public contact
routes, public transaction hashes, public event logs, public block numbers, and
public evidence references.

## Artifact-evidence readiness boundary

This package remains blocked. A future `READY_FOR_REHEARSAL` status is
impossible without a clean, reachable source commit; a byte-exact canonical
source archive; exact `solc 0.8.24` standard-json input/output; Foundry
build-info tied to each artifact; ABI-encoded constructor bytes; and a
chain/transaction/init-code/runtime deployment record for every asserted
address. The validator will produce the SDK-verifiable v2 evidence receipt only
after a separately audited production trust anchor and signing path are
deliberately pinned. That anchor is absent in this candidate, so no receipt is
emitted. None of those artifacts, addresses, or an approval are supplied here.

## Scope and non-negotiable boundaries

| Included | Excluded / blocked |
|---|---|
| Base Sepolia (`chainId` 84532) | Base mainnet or any other chain |
| `PartnershipBondV3Safe` and `AccountabilityBondV3Safe` lifecycle rehearsal | Reward-linked settlement, x402 settlement claims, Solana, bridge, or cross-chain value flow |
| Public read-only RPC checks and human-performed testnet transactions | Private keys, seed phrases, signatures, keystores, credentials, deployment, or automatic broadcast |
| Evidence recording and balance/liability reconciliation | Treating a plan, template, or passed unit test as a launch authorization |

The tool reports a failed gate (exit code `2`) whenever a public role address,
public signing-authorization attestation, or a reachable Base Sepolia RPC is
missing. `plan` still renders an unsigned plan when gates are incomplete, so
review can proceed without weakening the block.

`schemas/rehearsal-record.schema.json` is the exact JSON Schema for the
evidence record. The executable validator is stricter: it additionally rejects
duplicate/missing scenario IDs, secret-bearing data, a record that is merely
planned, missing observed transaction receipts/event coordinates, incomplete
observed contract addresses, and assets below liabilities.

## Quick start

```bash
cd pr11/base-sepolia-rehearsal

# Copy and complete with public information only.
cp templates/public-address-intake.template.json /tmp/base-sepolia-intake.json

# Always available: renders an unsigned plan; never signs or broadcasts.
python3 scripts/base_sepolia_rehearsal.py plan \
  --intake /tmp/base-sepolia-intake.json \
  --out /tmp/base-sepolia-unsigned-plan.json

# Fail-closed public preflight. It returns 2 until all public gates are met.
BASE_SEPOLIA_RPC_URL=https://your-read-only-base-sepolia-endpoint \
python3 scripts/base_sepolia_rehearsal.py gate \
  --intake /tmp/base-sepolia-intake.json \
  --out /tmp/base-sepolia-preflight.json

# Generate the complete, 19-scenario evidence register after humans perform
# separately authorized testnet actions in their own wallets.
python3 scripts/base_sepolia_rehearsal.py record-template \
  --out /tmp/base-sepolia-rehearsal-record.json

# Validate addresses, public transaction hashes, required events, expected vs
# actual state fields, and assets >= recorded liabilities. This remains
# fail-closed until every scenario is marked `observed`.
python3 scripts/base_sepolia_rehearsal.py validate-record \
  --record /tmp/base-sepolia-rehearsal-record.json \
  --out /tmp/base-sepolia-record-validation.json
```

No command accepts a `--private-key`, mnemonic, seed, keystore, password,
signature, or API key. Such fields are rejected if found in JSON. A
64-hex-character value is also rejected unless it is in a dedicated public
transaction-hash field in the rehearsal record.

## Completing the record

For every scenario, retain:

1. public deployed contract addresses and verified runtime bytecode/hash;
2. the exact testnet transaction hash or an explicit expected-revert record;
3. decoded event name, emitting address, log index, block number, and explorer
   URL;
4. exact deadline (`uint256` Unix seconds) and the block timestamp on each side
   of the boundary; never record only a human-relative duration;
5. expected and actual state (including bond ID, state enum, nonce, actor,
   allowlist state, pause state, caps, and outcome);
6. balances and liabilities in atomic units at the same block tag; and
7. a public evidence link or immutable evidence digest.

Use the contracts' pull-payment accounting when reconciling: liability includes
unwithdrawn principal credit and any other mature credit owed by the contract.
For each asset and contract at one exact block, require:

\[
\text{observed token/native balance} \geq
\text{principal liability} + \text{pending credit liability}.
\]

The validator rejects a record where the right side exceeds the observed
balance. A nonnegative surplus is not permission to transfer it; ownership and
`skimSurplus` authorization must be separately verified.

## Required human approval sequence

1. Intake owner validates all public addresses and role separation.
2. Counsel and auditor complete their disposition templates.
3. Three-of-five governance signers each attest public authorization through
   the approved external process; the tool only records a public reference and
   never receives a signature.
4. Human operators use separate authorized testnet wallets to rehearse. Do not
   reuse a mainnet key or make this packet a key-handling channel.
5. An independent recorder fills expected-versus-actual evidence and runs
   `validate-record`.
6. Auditor independently reruns reconciliation from public RPC/explorer data.
7. All stop conditions are resolved and recorded before any request for a
   separate deployment decision.

See [Human gates and scenario register](docs/HUMAN_GATES_AND_SCENARIOS.md) and
[the risk and audit packet](docs/RISK_AUDIT_AND_OPERATIONS_PACKET.md).

## Local and fork coverage

`scripts/run_local_rehearsal_tests.sh` runs the packet's Python tests and, if
Foundry is installed, the existing local Solidity lifecycle, dispute,
governance, controller, and factory integration tests. It intentionally has no
fork URL or broadcast flag. A Base Sepolia public preflight must pass before
humans run any separately authorized live/fork rehearsal; this runner cannot
be used to bypass the public-address, authorization, and signing gates.
