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.
Appeals are being carefully reviewed by our judges.
The contest is complete and the rewards are being distributed.