Skip to content

build-feed: 0.5 support, run the feed keywords in --check, and keep partOf.offers consistent (plus: ote-migrate does not exist) #97

Closed

Description

@hhkaos

From the same BiznagaFest 2026 session (18 documents, specVersion: "0.5.0"). build-feed is 0.4.0 on npm, so none of this is available to a publisher on 0.5 today.

  • 0.5 support. Inheritance of specVersion / license / organizers / textLanguage, and generation of feed.alternates.
  • --check should run the feed-level keywords, not just the schema: uniqueEventIds, sharedOffersConsistent, eventsNotNewerThanFeed, eventsRespectInheritedTextLanguage. They are the ones a hand-assembled feed actually breaks.
  • Generate or verify partOf.offers. The spec requires it to be equal by value across every part sharing a partOf.id (D032). Keeping that in sync by hand across 17 files guarantees they diverge eventually; --check can catch it for free, and build-feed could propagate it.

Separately: ote-migrate does not exist

The 0.4 → 0.5 bump of 18 files was a sed. There is no @opentechevents/migrate on npm at all — so this is a new package, not a missing flag, and it should be scoped as one. What it would need to earn its existence: rewrite specVersion, and warn about the breaking change in multi-part pricing (D032), which a sed cannot possibly do.

Related: #69 (same "judged against the latest version" bug, exporters side) and #95 (the validate half).

Activity

  1. hhkaos commented on Nov 4, 2026

    @hhkaos
    ContributorAuthor

    0.5/0.6 support landed in 263214f. Leaving this open for ote-migrate, which is the only part left.

    Done:

    • contributing, covers and alternates are read from ote.config.json and carried into the feed. Shape only is checked here; the feed schema owns the rest once the feed is assembled.
    • contributing is inherited feed→event like license. This was a real gap rather than bookkeeping: the exporters read each event's fields directly and know nothing about feed-level inheritance, so an inheritable field missing from resolveEventInheritance never reaches them. covers and alternates deliberately do not inherit — both describe the collection, not an event in it.

    The --check ask turned out to already be satisfied, which seemed worth recording rather than closing silently. All five feed-root keywords already fire — uniqueEventIds, sharedOffersConsistent, eventsNotNewerThanFeed, eventsRespectInheritedTextLanguage and 0.5's orderedCoverage — because --check validates the assembled feed through validateFeed, and the keywords are compiled into those validators rather than registered at runtime. Verified one by one against crafted feeds instead of assumed, and pinned with eight new tests.

    So partOf.offers consistency (D032) is caught today, including the case this issue named: two parts of one conference whose shared offers disagree by value. --check catches it for free.

    Still open: ote-migrate. A new package, not a flag. Worth noting the scope moved — it is now 0.4→0.6, and 0.5→0.6 is only a specVersion change since 0.6 altered no schema. The D032 pricing warning is still the only thing that justifies a package over a sed.

  2. hhkaos commented on Nov 4, 2026

    @hhkaos
    ContributorAuthor

    Done in #112 (packages/migrate), which was the last open part of this issue — the 0.5 support, the feed-level keywords in --check and the partOf.offers consistency all landed earlier with build-feed.

    Two notes on how ote-migrate ended up differing from the scope here:

    It covers every published version, not just 0.4→0.6. The adopter this mattered most for — corunajug.org — is on 0.3, which left the support window when 0.5.0 and 0.6.0 published the same day. Checked empirically: a 0.3 feed and a 0.1 feed both become valid 0.6 by changing specVersion alone, so the wider range cost nothing and is the only version of the tool that helps the person who actually has to run it.

    It validates against the declared version directly rather than through validateDocument. validateDocument applies the support policy, which calls an out-of-window version an error — routing through it would have refused exactly the documents that need migrating.

    The D032 warning is the part that justifies a package over a sed, as this issue argued: an unscoped offer on a part of a multi-part set now reads as admission, so a workshop that really costs 240 + 60 keeps publishing, validly, that it costs 60. ote-migrate names those events and asks; it never rewrites pricing.

    Before the first release: npm trusted publishing cannot be configured for a package that does not exist yet, so @opentechevents/migrate has to be published by hand once, then have its trusted publisher added in its npm settings. publish.yml already documents this.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions