Skip to content

feat(transport-interop): add Haskell (libp2p-hs) implementation#857

Open
adust09 wants to merge 4 commits into
libp2p:masterfrom
adust09:feat/add-haskell-impl
Open

feat(transport-interop): add Haskell (libp2p-hs) implementation#857
adust09 wants to merge 4 commits into
libp2p:masterfrom
adust09:feat/add-haskell-impl

Conversation

@adust09

@adust09 adust09 commented May 30, 2026

Copy link
Copy Markdown

Register libp2p-hs as a transport-interop implementation (haskell-v0.1), supporting TCP + Noise + Yamux.

  • impl/haskell/v0.1/Makefile: fetches libp2p-hs at a pinned commit and builds its root Dockerfile (which produces the libp2p-interop daemon) via dockerBuildWrapper.sh, writing image.json.
  • versionsInput.json: add haskell-v0.1 (transports: tcp, secureChannels: noise, muxers: yamux). containerImageID is omitted so the canonical image.json lookup is used.

adust09 and others added 4 commits May 28, 2026 00:06
Register libp2p-hs as a transport-interop implementation (haskell-v0.1),
supporting TCP + Noise + Yamux.

- impl/haskell/v0.1/Makefile: fetches libp2p-hs at a pinned commit and builds
  its root Dockerfile (which produces the libp2p-interop daemon) via
  dockerBuildWrapper.sh, writing image.json.
- versionsInput.json: add haskell-v0.1 (transports: tcp, secureChannels: noise,
  muxers: yamux). containerImageID is omitted so the canonical image.json lookup
  is used.
The haskell-v0.1 entry lacked a containerImageID, so versions.ts fell back
to canonicalImageIDLookup and the run-transport-interop job tried to read a
local ./impl/haskell/v0.1/image.json that does not exist in CI, failing with
ENOENT. Reference the GHCR image like every other implementation so the test
pulls it from the registry instead.
@adust09

adust09 commented Jul 21, 2026

Copy link
Copy Markdown
Author

CI diagnosis: failures are caused by the image not being published, not a protocol/interop issue

I dug into the two red checks (build (haskell) / build (v0.1) and combine-results) and they trace back to a single root cause: a fork PR cannot push the image to the org GHCR.

1. build (haskell) — the image builds fine, only the push is denied:

denied: installation not allowed to Create organization package
##[error]Process completed with exit code 1.

The Haskell Docker image compiles successfully; the job only fails at the final "push to ghcr.io/libp2p/..." step because a PR from an external fork lacks permission to create an org-level package.

2. combine-results — red because the Haskell image can't be pulled:

I pulled the shard artifacts and inspected results.csv. Every pair involving haskell-v0.1 fails (31/31), including:

"haskell-v0.1 x haskell-v0.1 (tcp, noise, yamux)",failure

Since even the haskell-vs-haskell self-pair fails, this is not a byte-level spec mismatch with any specific implementation — the interop runners simply can't pull the haskell image that step 1 never published. Meanwhile the non-haskell pairs are green (1240 success), confirming the harness itself is healthy.

Causal chain:

fork PR has no org GHCR push permission
  -> build (haskell) fails to publish the image
  -> every haskell-* pair fails to pull the image
  -> dashboard shows :red_circle:
  -> combine-results exits 1

The implementation's interop is verified locally (tcp+noise+yamux against go-libp2p and rust-libp2p pass). Could a maintainer re-run the workflow with package-write permissions, or advise the preferred way to publish the image for fork PRs? Happy to adjust the Makefile / Dockerfile if there's a recommended pattern. Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants