Summary
finalizeT1Aggregation/finalizeT2Aggregation (DINTaskCoordinator.sol) iterate every batch in the GI in a single transaction and revert the entire call if any one batch has too few reveals:
if (winningCID == bytes32(0)) revert TC_NoSubmissions();
if (submissionCount < T1_AGGREGATORS_PER_BATCH / 2 + 1)
revert TC_InsufficientSubmissions();
(finalizeT1Aggregation L979-980, finalizeT2Aggregation L1127-1128, verified against develop @ 740a613)
There is no per-batch retry, no owner override to skip a stuck batch, and no abort path for the GI as a whole: endGI requires GIstate == AggregatorsSlashed and startGI requires GIended/GenesisModelCreated — both unconditional, no bypass. I checked the full contract for any abort/skip/force/emergency function; none exists.
Reachability
This isn't an edge case — with the demo default of 3 aggregators per T1 batch and majority = 2, any 2 of 3 assigned aggregators simply not revealing (going offline, missing the window, or deliberately withholding — no collusion needed, no cost beyond the existing S1/S2 slash, which doesn't stop the GI) permanently bricks that batch, and therefore the whole GI, forever. DINTaskCoordinator/DINTaskAuditor are not upgradeable, so there is no patch-around once deployed. The model's reward pool and its validators' registration slots (see #223) stay locked with it.
Impact
This gap is already blocking other work, not just a standalone concern: BL-26's residual notes explicitly deferred a contract-side re-anchor cap on the batch-assignment seed "because a capped GI would be stuck forever" with no way to recover.
Suggested approach
Needs a GI-abort design (flagging the decision points, not prescribing an answer):
- Who may trigger it — model owner only? DIN-Representative as an emergency backstop?
- When — only after some minimum time/deadline past the batch's reveal window opening, so an impatient owner can't abort a GI that would've resolved fine?
- Where the reward pool and in-flight slashing state go on abort — forfeited? refunded pro-rata? rolled to the next GI?
- Whether it's a full abort (
GIended early) or a narrower "skip this batch, exclude it from T2" path
References
Summary
finalizeT1Aggregation/finalizeT2Aggregation(DINTaskCoordinator.sol) iterate every batch in the GI in a single transaction and revert the entire call if any one batch has too few reveals:(
finalizeT1AggregationL979-980,finalizeT2AggregationL1127-1128, verified againstdevelop@740a613)There is no per-batch retry, no owner override to skip a stuck batch, and no abort path for the GI as a whole:
endGIrequiresGIstate == AggregatorsSlashedandstartGIrequiresGIended/GenesisModelCreated— both unconditional, no bypass. I checked the full contract for any abort/skip/force/emergency function; none exists.Reachability
This isn't an edge case — with the demo default of 3 aggregators per T1 batch and majority = 2, any 2 of 3 assigned aggregators simply not revealing (going offline, missing the window, or deliberately withholding — no collusion needed, no cost beyond the existing S1/S2 slash, which doesn't stop the GI) permanently bricks that batch, and therefore the whole GI, forever.
DINTaskCoordinator/DINTaskAuditorare not upgradeable, so there is no patch-around once deployed. The model's reward pool and its validators' registration slots (see #223) stay locked with it.Impact
This gap is already blocking other work, not just a standalone concern: BL-26's residual notes explicitly deferred a contract-side re-anchor cap on the batch-assignment seed "because a capped GI would be stuck forever" with no way to recover.
Suggested approach
Needs a GI-abort design (flagging the decision points, not prescribing an answer):
GIendedearly) or a narrower "skip this batch, exclude it from T2" pathReferences
Developer/BACK_LOG.mdBL-30dinrep deploy, fix add-slasher crash; refresh contract docs (#203) #204 review (DINTaskCoordinator.md§10 No. 6)