What follows is heavily AI assisted; my devnet testing was AI orchestrated and this report is condensed from the findings by the AI with editing by me..
This smoke ran an accelerated local FOC stack to exercise the storage lifecycle across Synapse, Curio, FWSS, PDPVerifier, and FilecoinPay. The goal was not to benchmark devnet, but to walk the release-critical paths quickly enough to observe creation, charging, proving, termination, and cleanup behaviour end to end.
What Was Exercised
The run covered the main user and provider lifecycle:
- Client funding, service approval, price-list reads, dataset creation, and initial piece upload through Synapse.
- Batched upload with 40 pieces, including per-piece operation fee math, lifecycle reserve use, lockup updates, and
findPiece behaviour under indexing lag.
- Per-operation lockup replenish after repeated adds.
- Piece removal through Synapse to Curio to PDPVerifier, including scheduled removal, deferred cleanup at the next proving period, and the user removal fee.
- Multiple shortened proving periods, including
nextProvingPeriod, proof submission, PDP proof fees, and FilecoinPay settlement.
- SP-relayed client termination through Synapse and Curio, including client signature validation, Curio termination queue/status, FWSS termination, terminate fee, zeroed lifecycle reserve, and zeroed fixed lockup.
- Direct on-chain termination as a control path, confirming it does not charge the SP-mediated terminate fee.
- Normal cleanup after termination/finalisation.
- Abandonment cleanup: stop the owning SP, wait through inactivity, then have a third party call
deleteDataSet and cleanupPieces to claim the cleanup deposit.
- Negative/security edges: unauthorised termination, malformed relayed termination payloads, third-party deletion before inactivity, cleanup before cleanup mode, and unauthorised/malformed piece-removal scheduling.
What Went As Expected
The core economic and lifecycle paths mostly behaved as intended.
- Synapse read pricing and prepared funding/approval correctly.
- The 40-piece add path worked; the fee calculation matched
base + n * perPiece.
- Repeated adds consumed and then replenished lifecycle reserve/lockup as expected.
- Piece removal was scheduled, charged, and later flushed during proving.
- The SP-relayed termination path completed and produced the expected FWSS/FilecoinPay state changes.
- Direct on-chain termination worked as a useful control and did not apply the SP-mediated terminate fee.
- The third-party abandonment flow completed on-chain, including the cleanup deposit payout, after working around the current PDP cleanup gating behavior.
- The cleanup deposit was paid in full to the third-party cleanup caller; the observed wallet delta was lower only because the caller paid gas.
Problems Found
Several issues surfaced, but they fall into different buckets.
Code-under-test findings
- FWSS: Abandonment teardown failed after proving had activated and later periods had faulted. The flaw shape: abandonment first settled the PDP rail to the last resolvable proving boundary, then immediately terminated and tried to finalise through the current/open proving period. FWSS validation could not advance that second settlement, so FilecoinPay reverted with a no-progress settlement error. This is now covered by filecoin-services PR 512,
fix(abandonment): unblock finalize settle past open proving period, which fixes the issue without adding contract state.
- PDPVerifier: The code tested required two inactivity windows for permissionless abandonment cleanup. A third party could call
deleteDataSet only after the dataset had been inactive for INACTIVITY_WINDOW, but cleanupPieces then started a second INACTIVITY_WINDOW from cleanup-mode entry before non-SP callers could claim the cleanup deposit. With the production constant this is roughly 60 days total. This is not intended; the fix is PDP PR 279, fix(cleanup): anchor cleanupPieces gate to last proving activity.
- Curio: After successful third-party abandonment cleanup, restarting the abandoned SP did not reconcile local Curio state. Curio still had the dataset/piece rows and repeatedly tried proving work against a dataset that was no longer live on-chain.
- Curio: Normal cleanup cleared FWSS/PDP state and Curio PDP rows, but retrieval by PieceCID still returned bytes. This needs product/security clarification: either retrieval after PDP cleanup is allowed until lower-level GC, or Curio should gate retrieval on active PDP references.
foc-devnet/tooling issues likely needing PRs
- Curio runtime containers were missing the FilecoinPay address env var, so cleanup/finality logic could not run until a devnet env mapping issue was patched.
- Observability remains too manual. Diagnosing failures required stitching together Synapse logs, FWSS views, PDP state, FilecoinPay rails, Curio DB tables, and Docker logs. A compact smoke/status view would make future runs much less error-prone.
Smoke setup/process friction
- Curio rejected SP-relayed termination because its capability gate depended on FWSS
VERSION() rather than the callable ABI surface. The ABI supported the method, but the version string lagged. The FWSS version has since been bumped so this should not recur from current main.
- Curio cleanup polling was too slow for an accelerated smoke until locally shortened.
Repeatable Shape
An agent repeating this should:
- Start a fresh local stack from local Synapse, Curio, and filecoin-services sources with shortened proving, lockup, and inactivity windows.
- Run create/fund/upload first, then one 40-piece add, then enough repeated adds to force lockup replenish.
- Schedule one piece removal and wait for the next proving period to flush it.
- Wait through at least two proving periods before termination tests.
- Run SP-relayed termination, then direct on-chain termination as a control.
- Verify normal cleanup: FWSS cleared, PDP dataset gone, FilecoinPay rail finalised, Curio PDP rows gone, and retrieval behaviour explicitly checked.
- Create a separate dataset for abandonment, stop the owning SP, wait past inactivity, run third-party
deleteDataSet, then run third-party cleanupPieces. Against unfixed PDP code, a second cleanup-mode inactivity wait is required; with PDP PR 279, cleanup should be immediate after permissionless delete.
- Run negative permission checks on a fresh live dataset and contract tests for the proven-abandonment edge.
- Capture not just pass/fail, but any places where state can only be understood by correlating several systems.
Bottom Line
The smoke validated most intended 1.3.0 lifecycle behavior, but it also found several release-relevant follow-ups: the FWSS abandonment settlement flaw for active/faulted datasets, the PDP two-window abandonment cleanup bug, Curio not reconciling externally abandoned datasets after on-chain cleanup, and retrieval still serving bytes after PDP/FWSS cleanup. The FWSS settlement flaw is addressed by PR 512; the PDP cleanup timing bug is addressed by PR 279.
Code Used
This was not a pure main run. It used a deliberately combined frontier stack:
- filecoin-services / FWSS: the pre-merge client-initiated termination flow branch. That branch has since been merged without modification. For the smoke, FWSS/PDP timing constants were shortened locally.
- Synapse: a combined/janky local worktree with pricing/cost calculation and regenerated FWSS ABI/types, SP-relayed
terminateService, and the findPiece polling fix.
- Curio: latest local
main, with smoke-only patches for devnet disk pressure, relaxed FWSS termination capability detection, and shortened cleanup/finality polling.
- PDPVerifier: local smoke timing patch for a shorter inactivity window, deployed by in-place proxy upgrade. The smoke exposed the unintended two-window cleanup behavior; the fix is PDP PR 279.
- foc-devnet: on top of this PR, with local env fix so Curio received the FilecoinPay contract address at runtime.
- Additional smoke fix found during the run: FWSS abandonment settlement was patched locally after the live abandonment path exposed the FilecoinPay no-progress edge. Abandonment of an already-activated/faulted dataset must not require validated settlement progress through an unresolved proving period. The canonical fix is filecoin-services PR 512.
Acceleration Checklist
The important lesson was that shortening only one layer is not enough. The contracts, Curio task cadence, and devnet runtime env all had to line up.
Effective contract timings used:
- FWSS proving period:
120 epochs.
- FWSS challenge window:
10 epochs.
- PDPVerifier challenge finality:
5 epochs.
- FWSS
PDP_INACTIVITY_WINDOW: 300 epochs.
- PDPVerifier
INACTIVITY_WINDOW: 300 epochs.
- FWSS pricing lockups:
DEFAULT_LOCKUP_PERIOD = 30 epochs and CDN_LOCKUP_PERIOD = 30 epochs.
Notes on those values:
300 epochs was short enough to complete abandonment in a reasonable time, but long enough to observe the window and avoid missing it during Curio/SP timing jitter.
- The observed PDP abandonment path had two waits: one before
deleteDataSet, then another INACTIVITY_WINDOW after cleanup mode begins before a third party can call cleanupPieces. This is addressed by PDP PR 279. Future accelerated runs should still know about it when testing unfixed code, but fixed code should allow immediate third-party cleanup after permissionless deleteDataSet.
- The lockup periods were intentionally tiny so termination, settlement, and cleanup could finalise during one smoke run.
Curio changes needed for the accelerated run:
- Lowered the piece-store free-space guard for devnet: StorePiece min-free percent
0.
- Reduced
maxSizePiece to 4 << 30 to avoid local disk-pressure failures.
- Relaxed the FWSS terminate-service capability/version gate. The method was available, but FWSS
VERSION() still reported an older value, so a strict semver gate blocked SP-relayed termination.
- Shortened cleanup/finality task cadence: chain sync from production-scale polling to about
5s, and delete/cleanup task polling from about 10m to about 5s.
- Ensured Curio runtime containers received the FilecoinPay address. This was a foc-devnet env mapping fix, not a protocol change.
Synapse changes needed:
What follows is heavily AI assisted; my devnet testing was AI orchestrated and this report is condensed from the findings by the AI with editing by me..
This smoke ran an accelerated local FOC stack to exercise the storage lifecycle across Synapse, Curio, FWSS, PDPVerifier, and FilecoinPay. The goal was not to benchmark devnet, but to walk the release-critical paths quickly enough to observe creation, charging, proving, termination, and cleanup behaviour end to end.
What Was Exercised
The run covered the main user and provider lifecycle:
findPiecebehaviour under indexing lag.nextProvingPeriod, proof submission, PDP proof fees, and FilecoinPay settlement.deleteDataSetandcleanupPiecesto claim the cleanup deposit.What Went As Expected
The core economic and lifecycle paths mostly behaved as intended.
base + n * perPiece.Problems Found
Several issues surfaced, but they fall into different buckets.
Code-under-test findings
fix(abandonment): unblock finalize settle past open proving period, which fixes the issue without adding contract state.deleteDataSetonly after the dataset had been inactive forINACTIVITY_WINDOW, butcleanupPiecesthen started a secondINACTIVITY_WINDOWfrom cleanup-mode entry before non-SP callers could claim the cleanup deposit. With the production constant this is roughly 60 days total. This is not intended; the fix is PDP PR 279,fix(cleanup): anchor cleanupPieces gate to last proving activity.foc-devnet/tooling issues likely needing PRs
Smoke setup/process friction
VERSION()rather than the callable ABI surface. The ABI supported the method, but the version string lagged. The FWSS version has since been bumped so this should not recur from current main.Repeatable Shape
An agent repeating this should:
deleteDataSet, then run third-partycleanupPieces. Against unfixed PDP code, a second cleanup-mode inactivity wait is required; with PDP PR 279, cleanup should be immediate after permissionless delete.Bottom Line
The smoke validated most intended 1.3.0 lifecycle behavior, but it also found several release-relevant follow-ups: the FWSS abandonment settlement flaw for active/faulted datasets, the PDP two-window abandonment cleanup bug, Curio not reconciling externally abandoned datasets after on-chain cleanup, and retrieval still serving bytes after PDP/FWSS cleanup. The FWSS settlement flaw is addressed by PR 512; the PDP cleanup timing bug is addressed by PR 279.
Code Used
This was not a pure
mainrun. It used a deliberately combined frontier stack:terminateService, and thefindPiecepolling fix.main, with smoke-only patches for devnet disk pressure, relaxed FWSS termination capability detection, and shortened cleanup/finality polling.Acceleration Checklist
The important lesson was that shortening only one layer is not enough. The contracts, Curio task cadence, and devnet runtime env all had to line up.
Effective contract timings used:
120epochs.10epochs.5epochs.PDP_INACTIVITY_WINDOW:300epochs.INACTIVITY_WINDOW:300epochs.DEFAULT_LOCKUP_PERIOD = 30epochs andCDN_LOCKUP_PERIOD = 30epochs.Notes on those values:
300epochs was short enough to complete abandonment in a reasonable time, but long enough to observe the window and avoid missing it during Curio/SP timing jitter.deleteDataSet, then anotherINACTIVITY_WINDOWafter cleanup mode begins before a third party can callcleanupPieces. This is addressed by PDP PR 279. Future accelerated runs should still know about it when testing unfixed code, but fixed code should allow immediate third-party cleanup after permissionlessdeleteDataSet.Curio changes needed for the accelerated run:
0.maxSizePieceto4 << 30to avoid local disk-pressure failures.VERSION()still reported an older value, so a strict semver gate blocked SP-relayed termination.5s, and delete/cleanup task polling from about10mto about5s.Synapse changes needed:
findPiecepolling fix.