Spec: public federation export v1 (license decided — ready to merge) - #92
Conversation
Extends federation-v1.md's publisher side into a concrete, buildable artifact - publish-first federation, no peer required, consumable by both the mpc-autofill fork family and the MIT-lineage proxy-tool ecosystem (acoreyj/proxies-at-home, alex-taxiera/proxy-print). Covers: draft verdict record shape (never images, human-confirmed-only in v1), the exact content_phash recipe transcribed from local_phash.py (crop box, imagehash.phash hash_size=8, distance threshold 20/margin 5, tuned against real production data not textbook defaults) plus a spec (not code) for a standalone reference hashing tool, signing (ed25519 via minisign, reasoned over ssh-keygen -Y), publish channel (R2 recommended, reasoned over Pages), regeneration following this fork's existing run_id/ledger/dry-run automation conventions, the CC0-vs-ODbL license decision flagged for the owner (not made here), two concrete consumer stories, and an explicit list of what v1 isn't (no subscriber, no per-peer trust, no ingestion - unchanged from federation-v1.md's existing gate). Verified rather than assumed: fetched both named MIT-lineage repos directly - proxies-at-home is confirmed MIT; proxy-print is actually AGPL-3.0, not MIT as the task's own framing assumed, corrected in-doc (SS6b) rather than silently absorbed. Also folded forward the federation-v1.md Participation-modes/Known-gate-issue content this new spec depends on (previously only on a sibling unmerged branch) so this PR is self-consistent on its own, and fixed every cross-reference to a doc that doesn't exist on master yet so docs-lint stays clean (verified by actually running .github/scripts/docs_lint.py, not assumed) - added index entries to both docs/README.md and CLAUDE.md per the new documentation-process.md parity requirement. Nothing built. No code changed. HOLD for owner review.
…xport-v1-spec # Conflicts: # docs/README.md
Owner decision, 2026-07-18: ODbL 1.0 over CC0, for reciprocity - consumers use verdicts freely, but publicly redistributed derivative databases must share back under the same terms. Section rewritten from open-decision to decided, with the three consumer-calming clarifications that are true under ODbL and meaningfully shrink the real friction (produced-works exception, share-alike scoped to public derivative databases only, exact attribution string), plus a non-legal reciprocity invitation distinct from the license terms themselves. Removed a stale "flag, don't choose" sentence left over from the prior open-decision framing that would have contradicted the new decided status. Top-of-doc status updated: spec-doc hold lifted (ready to merge), build hold remains pending a separate owner green-light. Merged master into this branch first (a same-table conflict with a concurrently-merged proposal-h row in docs/README.md's Plans & proposals table - resolved by combining both new rows rather than force-pushing a rebase, per the standing no-routine-force-push rule).
|
Spec-doc hold lifted — ready for the merge queue. License decided by the owner: ODbL 1.0 (reciprocity over CC0's maximal-adoption posture). §5 rewritten from open-decision to decided, with the three consumer-calming clarifications (produced-works exception, share-alike scoped to publicly-redistributed derivative databases only, exact attribution string) plus a non-legal reciprocity invitation. Also merged current This session isn't merging PRs directly (per this repo's standing convention — see Generated by Claude Code |
Found while starting the reference-tool build: compute_content_phash_for_card (the actual function that produces the value this export would publish) calls classify_bleed_edge() and normalize_crop_box() before cropping - the original §2 draft described only a fixed crop box, which would silently mismatch our own hashes for the ~2.5% of images that are trimmed rather than bleed-inclusive. Caught by reading the real call chain before implementing against the doc's incomplete description, not assumed correct because it was already reviewed. Also updated the "Reference implementation" subsection's framing now that the build is starting in a separate PR, rather than leaving the stale "not built here" HOLD-era wording in place.
…97) federation-hash-tool/ exists now, verified byte-for-byte identical against the real backend before that PR was opened, with a permanent CI parity test guarding it going forward - update the spec doc from "build tracked separately, not built here" to reflect that.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016i9S7LQsCL3FGaih3ZTRBJ
Description
HOLD for owner review before building — this is a draft to critique,
not a build already in motion. Adds
docs/federation/public-export-v1.md,extending
docs/federation-v1.md's publisher side into a concrete,buildable artifact: publish-first federation (no peer required,
anyone can subscribe) making ProxyPrints' verdict data consumable by
both the mpc-autofill fork family and the MIT-lineage proxy-tool
ecosystem (
acoreyj/proxies-at-home,alex-taxiera/proxy-print).Covers, per the requested spec sections:
image URLs. Draft record shape included, with open questions flagged
inline rather than silently resolved. Human-confirmed-only in v1 —
machine suggestions stay home; the gate is the export.
content_phashrecipe transcribedfrom
MPCAutofill/cardpicker/local_phash.py(art-only crop box,imagehash.phashhash_size=8, distance threshold 20 / margin 5 —empirically tuned against real production data, stated honestly as
such, not textbook defaults), plus a precise specification (not code
— HOLD status means nothing ships pre-approval) for a standalone
reference hashing tool.
minisign, recommended overssh-keygen -Ywith reasoning (UX/discoverability for external consumers, not a
cryptographic difference).
increments), R2 recommended over Pages with reasoning (reuses this
fork's existing image-cdn infra, zero-egress-fee model fits an
unknown-cadence external consumer pattern). Regeneration follows this
fork's existing
run_id/ledger/dry-run-default automationconventions rather than inventing new ones.
both named consumer ecosystems. Flagged as an explicit owner
decision, not made in this doc.
importing verdicts as suggestions into their own review gate, (b) an
MIT-lineage client-side tool auto-suggesting printing + bleed
handling by joining on
scryfall_id/content_phash.trust config, no verdict ingestion in either direction. Unchanged
from
federation-v1.md's existing publisher-only posture.Verified, not assumed
"MIT lineage" framing at face value:
acoreyj/proxies-at-homeisconfirmed MIT and uses the Scryfall API for card identification.
alex-taxiera/proxy-printis actually AGPL-3.0, not MIT —corrected in §6b rather than silently absorbed, since it materially
affects the §5 license discussion.
content_phashrecipe (crop box, hash size, distance/marginthresholds) is transcribed from the actual current
local_phash.pysource with its own tuning-methodology commentspreserved, not reconstructed from memory.
docs/federation-v1.md's Participation-modes/Known-gate-issue contentthis new spec directly depends on was previously only on a sibling
unmerged branch — folded forward into this PR so it's self-consistent
reviewed on its own, without assuming another PR lands first.
masteryet(the upstream-readiness audit, still on a separate unmerged branch)
was rewritten to avoid a broken link, then checked by actually running
.github/scripts/docs_lint.pylocally (clean) rather than assumedcorrect by construction.
docs/README.md's "Plans &proposals" table and
CLAUDE.md's flat docs index, perdocs/documentation-process.md's parity requirement between the two.Checklist
.github/scripts/docs_lint.pydirectly against the changed docs —clean, no broken links or dangling path references.
branch's actual tree (not master's eventual post-merge state) via
direct
git show/grep, not assumption.methods via direct fetch rather than trusting the task's framing.
documentation; also updated
docs/README.mdandCLAUDE.md'sindexes for discoverability.
Nothing built. No code changed anywhere in this PR. Build (management
command, signing, cron, tooling) begins only after the owner approves
this HOLD, routed between sessions per the program's own split.
Generated by Claude Code