Skip to content

feat(registry): registry.v1 verify, domain-only catalog, and Ruby >= 4.0 - #476

Draft
gildesmarais wants to merge 20 commits into
masterfrom
feat/registry-v1
Draft

feat(registry): registry.v1 verify, domain-only catalog, and Ruby >= 4.0#476
gildesmarais wants to merge 20 commits into
masterfrom
feat/registry-v1

Conversation

@gildesmarais

@gildesmarais gildesmarais commented Aug 22, 2026

Copy link
Copy Markdown
Member

Summary

  • Add registry.v1 core: Manifest, Verifier, Archive, Bundle.load, CatalogBuilder, and Ed25519 :signed / :integrity_only trust modes under lib/html2rss/registry/.
  • Harden archive extraction (BundleRelativePath, byte/file caps, zip-slip / symlink guards) and reject duplicate registry.id at load; ship 0.28.0 with registry.id / registry.aliases schema + validator patterns.
  • Single-YAML load: Bundle.load validates configs once and builds catalog rows from those hashes (no CatalogBuilder disk re-read on the bundle path).
  • Domain-only CatalogEntry: drop source / registry from the gem type so wire fields are owned at the html2rss-web Index edge.
  • Delete Archive.pack_io, privatize Archive / CatalogBuilder internals, raise required_ruby_version to >= 4.0.
  • Colocate registry.v1 format guide as lib/html2rss/registry/README.md (pipeline narrated from registry.rb); record ownership / boundaries in CONTEXT.
  • Reshape registry specs to a test pyramid (tmpdir Bundle/Verifier apex, hash-driven CatalogBuilder units, shared archive helpers).

Stack (registry v1)

Land in order:

  1. html2rssfeat(registry): registry.v1 verify, domain-only catalog, and Ruby >= 4.0 #476this PR
  2. html2rss-configsrefactor(registry)!: flat configs repo, signed registry.v1 bundles html2rss-configs#317 (depends on feat(registry): registry.v1 verify, domain-only catalog, and Ruby >= 4.0 #476 + RubyGems 0.28.0)
  3. html2rss-webfeat(registry): index sync with Index-edge wire map and gem pin html2rss-web#1097 (depends on feat(auto_source): expand JsonState framework globals #317 signed release)
  4. html2rss.github.iodocs: align feed-directory and AGENTS with registry sync catalog html2rss.github.io#1245 (docs; after #1097)

Test plan

  • unset BUNDLE_PATH && mise exec -- make ready
  • mise exec -- bundle exec rspec spec/lib/html2rss/registry/
  • Confirm CatalogEntry has no source/registry kwargs; wire mapping lives in html2rss-web Index
  • Confirm lib/html2rss/registry/README.md is the format guide (no docs/registry-v1.md snowflake)
  • Confirm html2rss.gemspec requires Ruby >= 4.0
  • Coordinate consumers: html2rss-configs feat(auto_source): expand JsonState framework globals #317 and html2rss-web #1097 against this tip / 0.28.0

@gildesmarais
gildesmarais marked this pull request as draft August 22, 2026 14:11
@gildesmarais gildesmarais changed the title feat(registry): add registry.v1 verify and catalog builder feat(registry): registry.v1 verify, catalog builder, and 0.28.0 hardening Aug 22, 2026
@gildesmarais gildesmarais changed the title feat(registry): registry.v1 verify, catalog builder, and 0.28.0 hardening feat(registry): registry.v1 verify, domain-only catalog, and Ruby >= 4.0 Aug 23, 2026
Introduce Html2rss::Registry for signed bundle verification, safe tar
extraction, catalog building, and validated bundle loading. Port catalog
spec expectations and document the registry.v1 contract.
Require explicit registry.id in bundled configs, build catalog entries
from manifest file lists only, and add archive pack/extract limits with
path traversal and Ed25519 verification hardening.
…terns

Reject duplicate registry.id at bundle load, regenerate JSON schema with
slug pattern, sync Botasaurus OpenAPI fixture, and expand registry specs.
Bundle.load now validates configs once and assembles CatalogEntry rows
from those hashes, removing the CatalogBuilder disk re-read on the
bundle path.
Drop source/registry from the gem CatalogEntry type so wire fields are
owned exclusively by html2rss-web Index at the catalog API edge.
Move the registry.v1 format guide beside the owning module, narrate the
Archive → Verifier → Bundle → CatalogBuilder pipeline in registry.rb, and
drop the docs/ snowflake exception.
Remove the Archive.pack_io passthrough, privatize Archive and
CatalogBuilder internals, and raise required_ruby_version to >= 4.0
without a repo-wide RuboCop TargetRubyVersion boyscout.
Use tmpdir copies for Bundle/Verifier apex tests, hash-driven
CatalogBuilder units, shared archive helpers, and drop the thin
CatalogEntry mirror spec.
Document single-load bundle path, catalog admission, domain vs wire
boundary, and public leaf APIs for the registry.v1 refactor.
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.

1 participant