Skip to content

feat(spec,schemas): declare a publisher's event types in the manifest - #106

Open
ucekmez wants to merge 1 commit into
feat/ietf-ratelimit-headersfrom
feat/manifest-event-catalog
Open

feat(spec,schemas): declare a publisher's event types in the manifest#106
ucekmez wants to merge 1 commit into
feat/ietf-ratelimit-headersfrom
feat/manifest-event-catalog

Conversation

@ucekmez

@ucekmez ucekmez commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Summary

PR 14 of a stacked series. Base is #105. Not for merge without review.

eep-manifest.json has 24 properties and none of them says what the publisher emits.

An agent could discover that a publisher speaks EEP and where its endpoints are, but not what it will send — so it had to read human documentation, or subscribe to a wildcard and find out empirically. For a protocol whose premise is autonomous agents following entities over time, that is the wrong shape.

Nothing existing filled the gap:

  • §9's "standard event catalog" is a table in this document — not fetchable, not versioned per publisher, not machine-readable.
  • capabilities_query_url (§12.4) covers gated capabilities, not event types.
  • The envelope's eep_known_event_types puts a discovery concern on the per-event hot path — wrong layer.

What changed

{
  "event_types": [
    {
      "type": "com.example.entity.updated",
      "description": "A field on the entity profile changed.",
      "dataschema": "https://example.com/schemas/entity.updated/v2.json",
      "since": "0.1"
    },
    { "type": "com.example.trust.changed", "deprecated": true }
  ]
}
  • event_typestype required (§8 reverse-DNS pattern), plus optional description, dataschema, since, deprecated.
  • event_catalog_url for publishers whose catalog is too large or volatile to inline, paginated like §12.4.
  • New §12.3.2 with a rule worth stating explicitly: declaring a type is not a promise to emit it, omitting one is not a promise never to, and subscribers MUST tolerate an undeclared type rather than rejecting the delivery. A catalog is discovery metadata, not a wire constraint — without that sentence, a strict implementer would reasonably start dropping valid events.
  • dataschema here SHOULD match the dataschema attribute set on the events themselves (feat(spec,schemas): adopt the CloudEvents attributes EEP had skipped #100, §7.1), so the payload contract is both discoverable and carried with each event.
  • @eep-dev/middleware publishes its configured eventTypes in the manifest.

Scope

  • Spec / schema only
  • TypeScript package(s)
  • Python package(s)
  • Tests / CI
  • Docs / examples

Checklist

  • I read CONTRIBUTING.md and CODE_OF_CONDUCT.md.
  • Tests added or updated where appropriate.
  • Breaking change? No. Both fields are optional; existing manifests stay valid.
  • Documentation updated for user-visible behavior.

Verification

Suite Result
@eep-dev/middleware 189 passed (was 186)
tests/ 189 passed
compliance-cli --fixtures 24 vectors, 0 failed
tests/cross-impl/test_conformance_fixtures.py 26 passed
codegen-schema-types --check no drift

Notes for reviewers

One test exists because the feature can backfire. The middleware maps its configured eventTypes straight into the manifest — so a publisher configured with an event type that violates §8's reverse-DNS pattern would emit a manifest that fails whole-document schema validation (added in #95). That is a worse outcome than having no catalog at all. There's a test pinning that emitted types match the pattern, and a negative conformance vector (Com.Example.Entity.Updated) pinning that the schema rejects a bad one.

eep_known_event_types is left in place. It is arguably now redundant with the manifest catalog, but removing an envelope attribute is a breaking change and belongs in its own discussion.

No Python middleware parity for the manifest change — flagging rather than skipping silently.

Copilot AI lite review requested due to automatic review settings August 26, 2026 19:33

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

The manifest has 24 properties and none of them says what the publisher
emits. An agent could discover THAT a publisher speaks EEP and WHERE its
endpoints are, but not WHAT it will send — so it had to read human
documentation or subscribe to a wildcard and find out empirically. For a
protocol whose premise is autonomous agents following entities, that is
the wrong shape.

Nothing existing filled the gap. §9's "standard event catalog" is a table
in the specification: not fetchable, not versioned per publisher, not
machine-readable. `capabilities_query_url` covers gated *capabilities*,
not event types. The envelope's `eep_known_event_types` puts a discovery
concern on the per-event hot path, which is the wrong layer.

Changes:
- `event_types` on the manifest: `type` (required, §8 reverse-DNS
  pattern), plus optional `description`, `dataschema`, `since` and
  `deprecated`.
- `event_catalog_url` for publishers whose catalog is too large or too
  volatile to inline, paginated like §12.4.
- New §12.3.2 with a rule worth stating explicitly: declaring a type is
  not a promise to emit it, omitting one is not a promise never to, and
  subscribers MUST tolerate an undeclared type rather than rejecting the
  delivery. A catalog is discovery metadata, not a wire constraint.
- `dataschema` here SHOULD match the `dataschema` attribute set on the
  events themselves (§7.1), so the payload contract is both discoverable
  and carried with each event.
- `@eep-dev/middleware` publishes its configured `eventTypes` in the
  manifest, with a test asserting the emitted types match the §8 pattern
  — an invalid type would make the whole manifest fail schema
  validation, which is worse than having no catalog.
- Conformance vectors: the positive discovery manifest gains a catalog,
  and a negative vector pins that a non-conformant event type is
  rejected.

Optional throughout, so existing manifests stay valid.

Refs: EEP audit 2026-08 finding B4
Signed-off-by: Ugur Cekmez <ucekmez@gmail.com>
@ucekmez
ucekmez force-pushed the feat/ietf-ratelimit-headers branch from 6d6fb69 to 51e2c2b Compare August 26, 2026 19:39
@ucekmez
ucekmez force-pushed the feat/manifest-event-catalog branch from ca5719c to a741bb4 Compare August 26, 2026 19:39
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