{"version":"v0","service":"nocksperimental","subject":"nocksperimental.com","canonicalUrl":"https://nocksperimental.com/api/nockchain/sync-gossip","generatedAt":"2026-06-05T18:25:00.000Z","upstream":{"repository":"nockchain/nockchain","commit":{"shortSha":"33ba97b1e206","sha":"33ba97b1e206dd89b15c61b72b7802caf2136c18","committedAt":"2026-06-05T23:46:59Z","message":"bridge: add end-to-end withdrawal execution (#127)","url":"https://github.com/nockchain/nockchain/commit/33ba97b1e206dd89b15c61b72b7802caf2136c18","nocksperimentalRelevance":"Bridge withdrawal execution is now represented by the latest public build release, so bridge, settlement, x402, and VESL-adjacent receipts can cite a matching commit/build pair while preserving sequencer and journal provenance."},"sourceCommit":{"shortSha":"5d022ced5504","sha":"33ba97b1e206dd89b15c61b72b7802caf2136c18","committedAt":"2026-06-02T20:51:14Z","message":"libp2p: suppress all outgoing gossip while catching up (behind tip)","url":"https://github.com/nockchain/nockchain/commit/33ba97b1e206dd89b15c61b72b7802caf2136c18"},"release":{"tag":"build-33ba97b1e206dd89b15c61b72b7802caf2136c18","name":"Build 33ba97b1e206dd89b15c61b72b7802caf2136c18","publishedAt":"2026-06-06T00:17:53Z","url":"https://github.com/nockchain/nockchain/releases/tag/build-33ba97b1e206dd89b15c61b72b7802caf2136c18"},"crate":"nockchain-libp2p-io","sourceCommitUrl":"https://github.com/nockchain/nockchain/commit/33ba97b1e206dd89b15c61b72b7802caf2136c18","currentCommitUrl":"https://github.com/nockchain/nockchain/commit/33ba97b1e206dd89b15c61b72b7802caf2136c18"},"sourceAnchors":[{"id":"catch-up-signal","file":"crates/nockchain-libp2p-io/src/catch_up.rs","symbol":"CatchUpSignal::is_catching_up","lineHint":148,"role":"Reports whether the node is in SyncMode::CatchingUp.","evidence":"Cold and Tip both return false; CatchingUp returns true and is the predicate for outgoing gossip suppression."},{"id":"catch-up-refresh","file":"crates/nockchain-libp2p-io/src/catch_up.rs","symbol":"CatchUpSignal::refresh_mode","lineHint":224,"role":"Lets read-side traffic gates expire CatchingUp -> Tip hysteresis without waiting for a new block event.","evidence":"The upstream test refresh_exits_catching_up_after_hysteresis_without_new_input proves refresh_mode exits CatchingUp after the drained window."},{"id":"p2p-state-gate","file":"crates/nockchain-libp2p-io/src/p2p_state.rs","symbol":"P2PState::should_suppress_outgoing_gossip","lineHint":2518,"role":"Refreshes catch-up mode and returns whether outbound gossip should be suppressed.","evidence":"The gate deliberately covers historic block rebroadcasts, tx submission gossip, and mining output while behind tip."},{"id":"driver-gossip-effect","file":"crates/nockchain-libp2p-io/src/driver.rs","symbol":"EffectType::Gossip","lineHint":1180,"role":"Classifies kernel %gossip effects, clears heard-block serve caches, and either suppresses or fans out gossip.","evidence":"When suppression is true, the driver skips every per-peer SendRequest and increments gossip_suppressed_behind_tip_total."},{"id":"suppression-metric","file":"crates/nockchain-libp2p-io/src/metrics.rs","symbol":"gossip_suppressed_behind_tip_total","lineHint":389,"role":"Counts kernel-emitted %gossip effects dropped while the node is catching up.","evidence":"The metric should fall to roughly zero after a node reaches Tip; nonzero values explain quiet local gossip."},{"id":"driver-suppression-test","file":"crates/nockchain-libp2p-io/src/driver/tests.rs","symbol":"test_gossip_effect_suppresses_all_outbound_gossip_while_catching_up","lineHint":8178,"role":"Proves a catching-up node fans out zero heard-block/heard-tx gossip and increments the suppression metric.","evidence":"The test builds a deferred backlog, emits heard-block and heard-tx gossip effects, observes no swarm messages, and expects metric count 2."}],"sourceDriftCheck":{"command":"npm run check:nockchain-sync-gossip-source-drift -- --json","script":"scripts/check-nockchain-sync-gossip-source-drift.mjs","testCommand":"npm run test:nockchain-sync-gossip-source-drift-check","sourceAnchorIds":["catch-up-signal","catch-up-refresh","p2p-state-gate","driver-gossip-effect","suppression-metric","driver-suppression-test"],"compareFields":["upstreamCommit","sourceAnchorId","sourceSha256","sourceBytes","requiredSymbols"],"targetSurfaces":["nockchainSyncGossipTrace","nockchainMiningSourceTrace","localFakenetEvidence","registryCheckpoint"],"interpretation":"Compares commit-pinned libp2p sync/gossip source anchors (catch-up signal, gossip suppression gate, suppression metric) against current upstream master before behind-tip / no-peers / wrong-commitment receipts rely on them."},"behaviorInvariants":[{"id":"cold-does-not-suppress","rule":"Cold at boot does not suppress because the node has not yet proven it is behind tip.","sourceAnchorIds":["catch-up-signal","p2p-state-gate"]},{"id":"catching-up-suppresses-all-gossip","rule":"CatchingUp suppresses every outbound gossip kind: historic block rebroadcasts, tx submission gossip, and mining output.","sourceAnchorIds":["catch-up-signal","driver-gossip-effect","driver-suppression-test"]},{"id":"tip-does-not-suppress","rule":"Tip does not suppress; once catch-up hysteresis expires, normal per-peer gossip fan-out resumes.","sourceAnchorIds":["catch-up-refresh","p2p-state-gate"]},{"id":"hysteresis-refresh-exits-catching-up","rule":"refresh_mode lets the driver-side read gate move from CatchingUp to Tip after the drained hysteresis window.","sourceAnchorIds":["catch-up-refresh","p2p-state-gate"]}],"triageScenarios":[{"id":"wrong-block-commitment-while-catching-up","symptom":"wrong block commitment while a node is still catching up or consuming stale state","likelyMeaning":"A local miner or receipt may be comparing against a non-tip state, mismatched state-jam source, or suppressed gossip window.","firstChecks":["syncMode","behindTipEstimate","stateJamFingerprint","nockchainCommit","routeTableSize"],"nextAction":"Do not classify the commitment as an app failure until the node is at Tip and state-jam provenance matches the intended network."},{"id":"empty-routing-table-with-quiet-node","symptom":"routing table is empty and the node is quiet","likelyMeaning":"Peer discovery or local bind/peer configuration may be wrong, but a catching-up node can also intentionally avoid originating gossip.","firstChecks":["connectedPeerCount","routeTableSize","syncMode","fakenetBindAddr","peerMultiaddr"],"nextAction":"Separate no-peer connectivity from behind-tip quietness before restarting miners or changing state."},{"id":"miner-output-not-gossiped","symptom":"mining output is produced locally but not gossiped","likelyMeaning":"The driver suppresses mining-output gossip while CatchingUp so stale or out-of-order work does not pollute peers.","firstChecks":["syncMode","gossipSuppressedBehindTipTotal","tipStatus","minerCommitment"],"nextAction":"Wait for Tip or prove the fakenet is intentionally isolated before treating miner silence as a bug."},{"id":"stale-tx-gossip-suppressed","symptom":"tx submission gossip does not fan out while syncing","likelyMeaning":"The same suppression gate covers heard-tx and future gossip kinds, not just heard-block rebroadcasts.","firstChecks":["syncMode","walletEndpointMode","txAcceptedPublicApiOnly","gossipSuppressedBehindTipTotal"],"nextAction":"Use wallet/API evidence and endpoint mode to distinguish transaction status from p2p gossip suppression."}],"receiptFields":["syncMode","behindTipEstimate","gossipSuppressedBehindTipTotal","routeTableSize","connectedPeerCount","tipStatus","stateJamFingerprint","nockchainCommit","nockchainRelease","fakenetBindAddr","peerMultiaddr","walletEndpointMode"],"localVerification":{"status":"source-inspected-cargo-timeout","attemptedCommands":["cargo test -p nockchain-libp2p-io suppress_outgoing_gossip --lib"],"result":"The narrow upstream cargo test compile exceeded the local five-minute turn budget, so Nocksperimental records source and upstream test inspection rather than claiming a local Rust test pass.","inspectedUpstreamTests":["refresh_exits_catching_up_after_hysteresis_without_new_input","is_catching_up_only_in_catching_up_mode","suppress_outgoing_gossip_only_while_catching_up","suppress_outgoing_gossip_refreshes_hysteresis_before_reading","test_gossip_effect_suppresses_all_outbound_gossip_while_catching_up"]},"operatorChecklist":["Do not treat quiet mining output as failure until syncMode is Tip.","Record gossip_suppressed_behind_tip_total with fakenet diagnostics when available.","Capture behindTipEstimate, connectedPeerCount, and routeTableSize before interpreting wrong block commitments.","Keep state-jam/checkpoint provenance attached to any commitment or balance receipt.","Distinguish no-peer networking faults from intentional behind-tip gossip suppression."],"nocksperimentalImplications":["Fakenet readiness should expose sync mode and behind-tip estimate beside peer counts.","Miner receipts should preserve whether mining output was eligible to gossip.","Wallet/transaction receipts should not use tx gossip silence as acceptance evidence.","Support bundles should include the upstream commit and libp2p source-trace id when diagnosing no-peers or wrong commitments."],"links":{"upstream":"https://nocksperimental.com/api/nockchain/upstream","zorpMap":"https://nocksperimental.com/api/nockchain/zorp","stateJams":"https://nocksperimental.com/api/nockchain/state-jams","watch":"https://nocksperimental.com/api/nockchain/watch","operations":"https://nocksperimental.com/api/nockchain/operations","wallet":"https://nocksperimental.com/api/nockchain/wallet","rustAtlas":"https://nocksperimental.com/api/nockchain/rust-atlas","diagnostics":"https://nocksperimental.com/api/fakenet/diagnostics","syncGossipPage":"https://nocksperimental.com/nockchain/sync-gossip","commit":"https://github.com/nockchain/nockchain/commit/33ba97b1e206dd89b15c61b72b7802caf2136c18","currentCommit":"https://github.com/nockchain/nockchain/commit/33ba97b1e206dd89b15c61b72b7802caf2136c18","release":"https://github.com/nockchain/nockchain/releases/tag/build-33ba97b1e206dd89b15c61b72b7802caf2136c18"}}