Repository navigation
Description
Machine-Checked Devcon Week: the task tree
One issue per unit of docs/PLAN.md, all labelled HACKATHON. The rules of the week live in RULES.md: comment claim to take an issue, one at a time; a pull request within 8 hours of the assignment, drafts count; every issue is claimable from day one, and you build ahead of open dependencies against mocks of their frozen interfaces; organisers review within 12 hours. Work targets hackathon26. The score multiplies code quality by proof coverage, so prove what the unit owns. Questions go to the event channel.
The tree (the plan's tracks, with issue numbers)
W1 foundations (parallel)
├─ track A (codecs): #2 W1.2 → #3 W2.1 → {#7 W2.2 · #8 W2.3}
├─ track B (crypto): #2 W1.2 → {#4 W3.1 · #5 W3.2} → #9 W3.3
└─ track C (net): #1 W1.1 (+#2 W1.2) → #10 W4.1 → {#13 W4.2 · #14 W4.3}
W5 joins all three tracks
└─ #11 W5.1 → #15 W5.2 → {#16 W5.3 · #17 W5.4} → #18 W5.5
→ #19 W5.6 → #20 W5.7 → #22 W5.8 → #24 W5.9
W6 consensus extension
└─ {#12 W6.1 · #6 W6.2} → #21 W6.3 → #23 W6.4
The issues, in tree order
Every issue is claimable from day one. The needs lines give the merge order, and the dependencies you mock until they merge.
- [W1.1] base/conc: the concurrency primitives #1 — W1.1 base/conc: the concurrency primitives
- [W1.2] base/bytes: the byte model #2 — W1.2 base/bytes: the byte model
- [W2.1] codec/varint: the unsigned varint #3 — W2.1 codec/varint · needs [W1.2] base/bytes: the byte model #2
- [W3.1] crypto/pure: the pure digests, HMAC, and HKDF #4 — W3.1 crypto/pure · needs [W1.2] base/bytes: the byte model #2
- [W3.2] crypto/backend: the OpenSSL 3 shim and the etheorem pins #5 — W3.2 crypto/backend · needs [W1.2] base/bytes: the byte model #2
- [W6.2] codec/snappy: the snappy binding #6 — W6.2 codec/snappy · needs [W1.2] base/bytes: the byte model #2
- [W2.2] codec/proto: the protobuf wire codec #7 — W2.2 codec/proto · needs [W1.2] base/bytes: the byte model #2, [W2.1] codec/varint: the unsigned varint #3
- [W2.3] codec/multiformats: the multiformat family #8 — W2.3 codec/multiformats · needs [W1.2] base/bytes: the byte model #2, [W2.1] codec/varint: the unsigned varint #3
- [W3.3] the Crypto facade and the cross-check #9 — W3.3 the Crypto facade and the cross-check · needs [W3.1] crypto/pure: the pure digests, HMAC, and HKDF #4, [W3.2] crypto/backend: the OpenSSL 3 shim and the etheorem pins #5
- [W4.1] net/streams: connections, framing, and the transports #10 — W4.1 net/streams core · needs [W1.1] base/conc: the concurrency primitives #1, [W1.2] base/bytes: the byte model #2
- [W5.1] libp2p/identity: keys and peer ids #11 — W5.1 libp2p/identity · needs [W2.2] codec/proto: the protobuf wire codec #7, [W2.3] codec/multiformats: the multiformat family #8, [W3.3] the Crypto facade and the cross-check #9
- [W6.1] libp2p/identity: the ENR codec #12 — W6.1 the ENR codec · needs [W5.1] libp2p/identity: keys and peer ids #11, [W3.2] crypto/backend: the OpenSSL 3 shim and the etheorem pins #5
- [W4.2] net/streams: the TCP transport #13 — W4.2 net/streams tcp · needs [W4.1] net/streams: connections, framing, and the transports #10, [W1.1] base/conc: the concurrency primitives #1
- [W4.3] net/yamux: the stream muxer #14 — W4.3 net/yamux · needs [W4.1] net/streams: connections, framing, and the transports #10
- [W5.2] libp2p/core: the types and the seams #15 — W5.2 libp2p/core · needs [W4.1] net/streams: connections, framing, and the transports #10, [W5.1] libp2p/identity: keys and peer ids #11
- [W5.3] libp2p/security: Noise XX #16 — W5.3 libp2p/security Noise XX · needs [W4.2] net/streams: the TCP transport #13, [W3.3] the Crypto facade and the cross-check #9, [W5.2] libp2p/core: the types and the seams #15
- [W5.4] libp2p/mux: the Muxer values #17 — W5.4 libp2p/mux · needs [W4.3] net/yamux: the stream muxer #14, [W5.2] libp2p/core: the types and the seams #15
- [W5.5] libp2p/negotiate: multistream-select and the upgrader #18 — W5.5 libp2p/negotiate · needs [W5.2] libp2p/core: the types and the seams #15, [W5.3] libp2p/security: Noise XX #16, [W5.4] libp2p/mux: the Muxer values #17
- [W5.6] libp2p/host: host, swarm, peerstore, dedup #19 — W5.6 libp2p/host · needs [W5.5] libp2p/negotiate: multistream-select and the upgrader #18, [W5.1] libp2p/identity: keys and peer ids #11, [W1.1] base/conc: the concurrency primitives #1
- [W5.7] libp2p/protocols: identify and ping #20 — W5.7 libp2p/protocols identify and ping · needs [W5.6] libp2p/host: host, swarm, peerstore, dedup #19
- [W6.3] req/resp: the ssz_sn framework #21 — W6.3 req/resp ssz_sn · needs [W5.6] libp2p/host: host, swarm, peerstore, dedup #19, [W6.2] codec/snappy: the snappy binding #6
- [W5.8] cli: the demo and ping binaries #22 — W5.8 cli: the demo and ping binaries · needs [W5.7] libp2p/protocols: identify and ping #20
- [W6.4] gossipsub v1.1 (gate) #23 — W6.4 gossipsub v1.1 (gate) · needs [W5.6] libp2p/host: host, swarm, peerstore, dedup #19, [W5.7] libp2p/protocols: identify and ping #20, [W1.1] base/conc: the concurrency primitives #1
- [W5.9] cli: the transport-interop harness (gate) #24 — W5.9 cli: the transport-interop harness (gate) · needs [W5.8] cli: the demo and ping binaries #22
Cross-edges the arrows hide
The tree draws the tracks. These edges cross them, and each issue body names them:
| Issue | Depends on | Why |
|---|---|---|
| #10 W4.1 | #1 W1.1 | the sim and the Stream loop need the conc primitives |
| #13 W4.2 | #1 W1.1 | the close-wakes discipline sits on Chan and TaskSet |
| #16 W5.3 | #9 W3.3 | AEAD and HKDF through the Crypto facade |
| #19 W5.6 | #11 W5.1, #1 W1.1 | PeerId, and the registries over OnceRef |
| #21 W6.3 | #6 W6.2 | the snappy framing of the length prefix |
| #23 W6.4 | #19 W5.6, #20 W5.7, #1 W1.1 | the host, identify, and the bounded queues |
| #24 W5.9 | #22 W5.8 | the harness drives the built binaries |
Mock substitution ledger
A merged pull request may carry mocks of unmerged dependencies (RULES.md, Working ahead of the tree). Each row names one mock, the dependency it stands in for, and the connections that replace it. The author of the mocked pull request drops the mocks within 12 hours of the last dependency merge, and CI goes green without mocks.
| Carried by | Mock | Real dependency | The connections to make |
|---|---|---|---|
| #7 W2.2 (PR #28) | Pb.Mock.Bytes |
#2 W1.2 base/bytes | DecodeError, the Codec and LawfulCodec classes, ofNatList, toNatList, toString?, and the productionAgrees and checkCodec harness take W1.2's concrete API |
| #7 W2.2 (PR #28) | Pb.Mock.Varint |
#3 W2.1 codec/varint | UVarint, maxBytes, limit, encode, decode?, and decodeB? move to the real module, and the four assumed facts (decodeEncodeSuffix, encodeDecode, encodeNonempty, encodeBytes) are re-proved from its theorems |
| #9 W3.3 (PR #41) | Crypto.Mock.CryptoPure |
#4 W3.1 crypto/pure | import the real CryptoPure and delete the mock; the surface match is verified name by name (the PR #29 review); tracked as issue #52 |
| #10 W4.1 (PR #32) | Streams.Mock.Bytes |
#2 W1.2 base/bytes | drop the module; each open Streams.Mock.Bytes becomes open Bytes; the harness calls checkRoundTrips and checkModelPins and the LawfulCodec fields already follow #30's API |
| #10 W4.1 (PR #32) | Streams.Mock.Varint |
#3 W2.1 codec/varint | drop the module; each open moves to the real Varint; the two axioms (decodeEncodeSuffix, encodeDecode) are theorems there under the same names |
| #10 W4.1 (PR #32) | Streams.Mock.Multiaddr |
#8 W2.3 codec/multiformats | drop the module and open Multiformats; the four-protocol parser (ip4, ip6, tcp, memory) gives way to the full protocol table and its strict text parser |
| ~~ #16 W5.3 (PR #69) ~~ | Security.Mock.Core |
~~ #15 W5.2 libp2p/core ~~ | drop the module; the imports move to Libp2p.Core, the mocked SecureConn and SecurityProtocol give way to the real seam values, and the prose that says core is unmerged goes. Window: 19:22 UTC 2026-11-07 (#64 merged 07:22 UTC) |
| ~~ #17 W5.4 (PR #49) ~~ | Libp2p/Mux/Mock/Core.lean |
~~ #15 W5.2 libp2p/core ~~ | delete the mock modules, move the imports to Libp2p.Core, and re-point Muxer and MuxSession to the real seams; land Mux.yamux over the W4.3 session (unit 1b, issue #17). Window: 19:22 UTC 2026-11-07 |
| ~~ #18 W5.5 (PR #40) ~~ | Negotiate.Mock.Core |
~~ #15 W5.2 libp2p/core ~~ | delete the mock, import Libp2p.Core, and re-type the upgrader over the real SecurityProtocol and Muxer seams; Mock/Core.lean stale prose goes with it. Window: 19:22 UTC 2026-11-07 |
| ~~ #19 W5.6 (PR #61) ~~ | Host.Mock.Core |
~~ #15 W5.2 libp2p/core ~~ | delete the mock, import Libp2p.Core; the StreamContext retype stays mechanical. Window: 19:22 UTC 2026-11-07 |
| #19 W5.6 (PR #61) | Host.Mock.Negotiate |
#18 W5.5 negotiate | a retype, not a delete: the merged negotiate takes no admit and answers the plain pair, and it exports no negotiateStream; the host gates before Negotiate.upgrade, and the stream-serving path needs real multistream over the muxed stream. Window: 12 hours from this merge |
| #20 W5.7 (PR #45) | Protocols/Mock/Core.lean |
#15 W5.2 libp2p/core | delete the mock, import Libp2p.Core, re-type the handlers over the real StreamHandler and StreamContext. Window: 19:22 UTC 2026-11-07 |
| #20 W5.7 (PR #45) | Protocols/Mock/Host.lean |
#19 W5.6 host | delete the mock, import the real host seam, and serve identify and ping through the swarm registry. Window: 12 hours from the #61 merge |
| ~~ #21 W6.3 (PR #46) ~~ | Protocols/Mock/Core.lean |
~~ #15 W5.2 libp2p/core ~~ | delete the mock, import Libp2p.Core, re-type the req/resp handler over the real StreamHandler. Window: 19:22 UTC 2026-11-07 |
| #22 W6.4 (PR #59) | Negotiate/Legacy/ (not a Mock, a parallel pre-retype upgrader) |
#18 W5.5 negotiate, retyped host (seam issue #70) | the subtree dies when the host gates before Negotiate.upgrade per #70's retype; the host's Swarm.lean drops its Negotiate.Legacy imports. Window: 12 hours from the #70 retype landing |
| #24 W5.9 (PR #60) | Interop/Mock/Stack.lean |
the merged W5 stack (#11 identity, #15 core, #16 security, #17 mux, #18 negotiate, #19 host, #20 identify/ping) | delete the mock, wire the harness over the real upgrader chain, and record the green matrix run on #24 with the binary SHA. Window: 20:45 UTC 2026-11-09 (12 hours from the #60 merge at 08:45 UTC) |
| #21 W6.3 (PR #46) | Protocols/Mock/HostStream.lean |
#19 W5.6 host | delete the mock, take the stream and its StreamContext from the real swarm registry. Window: 12 hours from the #61 merge |
| ~~ #21 W6.3 (PR #46) ~~ | Protocols/Mock/Muxer.lean |
~~ #17 W5.4 mux ~~ | delete the mock, dial and accept over the real Muxer seam. Window: 12 hours from the #49 merge |
The Pb.Mock.* rows are done: PR #48 merged on 2026-11-05 and carries the real dependencies. The Crypto.Mock.CryptoPure row is done: PR #57 merged on 2026-11-06 (issue #52). The Streams.Mock.* rows are done: PR #58 merged on 2026-11-06 (issue #51).
A pull request that lands with mocks adds its rows here at merge time.
The critical path
#1 → #2 → #3 → #7 → #11 → #15 → #16 → #18 → #19 → #20 → #22 → #24 → #21 → #23
(W0 has landed; its commit is the scaffold every unit starts from.)
Activity
leolara commentedon Nov 1, 2026
Rule change: every issue is claimable from day one.
The tree's critical path is fourteen issues deep, and a serialized cycle of the 8 hour window and the 12 hour review cannot cross it inside the week. Claims now open on the frozen interfaces of ARCHITECTURE §4 instead of on merges:
opaquedeclarations in aMocknamespace, spec theorems as mock axioms listed with#print axioms, nosorry, CI green.Full text: #26, live in
RULES.mdonce it merges. Theneedslines below are the merge order, and the dependencies you mock until they merge.feat(yamux): stand on a mock of the byte floor until W1.2 merges
test(negotiate): run the two-party upgrade over the splitting sim
test(negotiate): run the two-party upgrade over the splitting sim
test(negotiate): run the two-party upgrade over the splitting sim
test(negotiate): run the two-party upgrade over the splitting sim