Conversation
Projects on Mailman 3 (Python, Fedora, GNU and many others) had no mail-source backend besides Gmail. Hyperkitty, the Mailman 3 archiver, serves its archive as a JSON API, so the adapter is a README of curl recipes rather than code: list_recent_threads, read_thread and thread_url, keyed by the root Message-ID like the IMAP and mbox adapters. Like PonyMail it only reads. A private archive needs a subscribed session the adapter does not wire, so it declines those and the resolution rule falls through to a subscriber-side backend. The endpoints, paging, thread keys and permission checks follow the Hyperkitty and mailman-web sources, and the Message-ID hash recipe is the computation of Hyperkitty's own get_message_id_hash. The contract's capability matrix and the other lists of mail-source backends now include it, and CONTRIBUTING no longer offers it as open work. Closes apache#306 Signed-off-by: Andrea Cosentino <ancosen@gmail.com> Generated-by: Claude Code (Opus 5.5)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
tools/mail-source/mailman3/, a read-only mail-source backend for Mailman 3 archives served by Hyperkitty.Hyperkitty exposes a JSON API, so the adapter is a README of
curlrecipes with nothing to install:list_recent_threads,read_threadandthread_url, keyed by the root Message-ID likeimapandmbox.Same capability shape as PonyMail: no drafts, no sent-mail view.
<security-list>) only serves signed-in subscribers.The adapter declines it (HTTP 403 means backend unavailable), so the resolution rule falls through to
gmailorimap.Authenticated reads are left for a follow-up.
tools/AGENTS.md: the contract's capability matrix,tools/mail-source/README.md,docs/adapters/registry.mdanddocs/vendor-neutrality.md(Mailman 3 moves from extension point to shipping), amailman3_archive_urlkey in the setup template, the quick-start prerequisites,specs/adapters.md, and theCONTRIBUTING.mdgood-first-issue list.Type of change
.claude/skills/<name>/) — eval fixtures updated belowtools/<system>/*.md)tools/*/withpyproject.toml)docs/,README.md,CONTRIBUTING.md)projects/_template/)prek, workflows, validators)Test plan
prek run --all-filespasses: every hook passes on this branch except two that fail in my environment and that this diff does not reach:skill-token-count: the tokenizer cache was never prepared on this machine (--prepare-tokenizer); noSKILL.mdchanged.pytest (workspace):tools/container-gatewaytest_run_unlinks_pid_file_before_closing_the_lock_fdfails 3/3 here; that tool is untouched, so the result is the same onmain.uv run pytest/ruff check/mypypassesurls.py,api/thread.py,api/email.py,lib/view_helpers.py,models/email.py).The mailman-web settings define no
REST_FRAMEWORK, so the Django REST Framework defaults apply: no page size (hence "always passlimit") and session auth first (hence 403 for anonymous reads).JJIGKPKB6CVDX6B2CUG4IHAJRIQIOUTPfor<87myycy5eh.fsf@uwakimon.sk.tsukuba.ac.jp>, with or without the angle brackets, andsha1sum | xxd -r -p | base32agrees.security-issue-sync/step-security-cc, the## Abstract operationssection ofcontract.md) extracts a byte-identical section, and noSKILL.mdchanged.RFC-AI-0004 compliance
<PROJECT>,<tracker>,<upstream>,<security-list>) used in all skill / tool prose (thecheck-placeholdersprek hook is the mechanical gate)Linked issues
Closes #306
Notes for reviewers (optional)
docs.mailman3.org/.../api.html) now returns 404, and the current docs have no API page, so the README links the Hyperkitty project instead.**Capability:**,**Kind:**and**Vendor:**lines thatspecs/adapters.mdexpects of every adapter README.The validator, the labeler and the vendor-neutrality score only scan top-level
tools/*/README.md, so they do not count this nested adapter, the same asimap/andmbox/.docs/vendor-neutrality.mdand as shipping in the registry, as before this change.Generated-by: Claude Code (Opus 5.5)
🤖 Generated with Claude Code