DESIGN.md §8 says the sponsor can update scope freely while the registry is in NOT_DEPLOYED / NEW_DEPLOYMENT (pre-attack staging), and scope locks once past it.
_observePoolState sets the one-way scopeLocked on the first observation of any state other than NOT_DEPLOYED / NEW_DEPLOYMENT, which includes ATTACK_REQUESTED. The registry's rejectAttackRequest legitimately rewinds ATTACK_REQUESTED back to NOT_DEPLOYED (the agreement can then be re-registered, possibly with a different scope), but the pool's scopeLocked latch never resets, so the pool refuses any scope change while the agreement is back in staging.
Likelihood:
Occurs when a pool interaction observes the agreement in ATTACK_REQUESTED (locking scope), and the DAO then calls rejectAttackRequest, rewinding the agreement to NOT_DEPLOYED.
After the rewind the sponsor's setPoolScope reverts ScopePostLockImmutable even though the agreement is back in pre-attack staging and may be re-registered with a different scope.
Impact:
The pool's committed scope can permanently diverge from the underlying agreement earlier and more sharply than §8 contemplates.
No direct fund loss, since scope is not consulted on-chain at resolution (the moderator judges off-chain); hence Low.
Run:
Result:
Lock scope only on an observation that cannot benignly rewind (first active-risk or terminal state), not on ATTACK_REQUESTED:
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
View preliminary resultsAppeals are being carefully reviewed by our judges.
The contest is complete and the rewards are being distributed.