Sprint 24 Close — Commons-Compute Spine

Date closed: 2026-03-23 Scope: Epic commons-compute — trust bootstrap, stale expiry, V1 credit enforcement


What Shipped

Issue Description PR Tasks
#947 Two-tier trust threshold for unaffiliated vs affiliated pool admission #1396 s24-t1, s24-t2
#964 Stale commons pool participant expiry (expire_stale, StaleParticipantConfig) #1396 s24-t3
#1397 V1 scheduling-time credit enforcement floor in handle_submit() #1398 s24-t6
#925 Parent: commons resource pool + credit accounting substrate closed as delivered s24-t4

All six sprint tasks (s24-t1 through s24-t6) are done.


Key Implementation Notes

#947 (s24-t1/t2): SybilPolicy.commons_admission_min_trust = 0.0 for unaffiliated nodes; is_affiliated: bool derived from cell_id.is_some() at announce time. Two-tier threshold: affiliated nodes require min_trust_score (0.1), unaffiliated admitted at 0.0.

#964 (s24-t3): expire_stale(max_age) piggybacked on each NodeCapacityAnnounce. No background timer in V1. Duration::MAX is the "disabled" sentinel.

#1397 (s24-t6): Enforcement seam is handle_submit() in lifecycle.rs, after CommonsPoolPolicy governance checks, before policy manager. Floor constant COMMONS_CREDIT_FLOOR = 1 — not a pricing model, a V1 presence check. balance_callback = None skips the gate silently (opt-in). icn-ledger stays in [dev-dependencies]; the inline balance < 1 check is semantically identical to check_sufficient_balance(balance, 1).


Intentionally Deferred (not scope-crept into Sprint 24)

Deferred Work Reason Deferred
Cost-based enforcement — derive required credits from task.resource_profile or task.fuel_limit Distinct pricing model; COMMONS_CREDIT_FLOOR = 1 is the correct V1 sentinel
icn-ledger promotion from [dev-dependencies] to [dependencies] in icn-compute Wider change; own PR scope. Enables calling check_sufficient_balance() from library code
Pre-execution reservation — reserve credits at submit, settle actuals from ExecutionReceipt Prevents concurrent-submitter races; requires reservation → settlement two-phase design

These are three distinct slices. None blocked V1 from being useful. New issues should be filed when prioritized — do not silently extend Sprint 24.


CI Lesson (worth remembering)

test_connection_flapping in icn-net failed on first CI run with a QUIC handshake error (aborted by peer: the application or application protocol caused the connection to be closed during the handshake). This is the same failure class as the ~20 sibling tests already marked #[ignore = "Flaky in CI: QUIC stream failures in containerized environment"].

Correct response: rerun once. It passed. No code churn.

Rule: For QUIC/container/network failures in icn-net integration tests — rerun once before treating as a code regression. Only investigate if it fails on the second run. Only --admin bypass if the failure is clearly queue-stalled (required checks pending / 0s for >1hr with the runner healthy).


Next Engineering Move

Open a new issue for the highest-priority deferred follow-on. Recommended: cost-based enforcement — it is the next semantic upgrade after the flat floor, and the mechanism (COMMONS_CREDIT_FLOORcompute_credits_required(&task)) is named and documented in docs/design/economics/commons-credit-enforcement-v1.md.