spec(adagents): tighten revoked_publisher_domains[] semantics (closes #4507)#4536
Merged
Conversation
Closes #4507 — the four semantic gaps identified in the PR #4504 expert review for the revocation block. 1. Validator-side durability (rollback resilience). A (publisher_domain, revoked_at) tuple a validator has previously observed MUST be held as still-revoked for 7 days from first observation, even if the entry vanishes from a subsequent fetch. Closes the gap where an attacker re-serves a stale file with the revocation removed — the existing non-monotonic-last_updated check only catches backward last_updated, not "removed-then-restored" shapes. 2. Un-revoke flow. Documented: re-authorize by removing the entry after the 7-day window has elapsed since revoked_at; removing sooner is a no-op against validators that observed the original. No re-authorize-before-7-days back door — that surface would be indistinguishable from a rollback attack. 3. compliance_violation framing. Tightened the reason enum description to make clear it's operator-internal self-classification for review routing, not a public accusation. Recommended `other` for un-adjudicated third-party allegations. Compares to sellers.json which deliberately carries no reason field for the same exposure. 4. Extension-field disclaimer. additionalProperties:true stays per project policy, but validators MUST ignore unknown fields on revocation entries. Description-only changes to the schema; existing files validate unchanged. Schema audit and composed validation pass. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ne, persistence-across-restart SHOULD Expert review (ad-tech-protocol-expert) on PR #4536 should-fixes. 1. Durability now keys on `publisher_domain` alone, not on the `(publisher_domain, revoked_at)` tuple. Tuple-keying lets an attacker re-emit the same domain with a slightly mutated revoked_at (one second earlier, say) and present a "fresh" tuple the validator has never observed, bypassing the hold. Use revoked_at only to set the clock origin (earliest observed value), not to identify the durability key. 2. New normative SHOULD bullet: validators SHOULD persist observed revocation entries to durable storage. An in-memory validator that restarts inside the 7-day window MAY accept a rolled-back file because it has no record of the prior observation. The 7-day window is measured from the validator's first observation, not from process start. Tests + audit unchanged (description-only edits). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Contributor
Author
Expert review passRan the PR through the ad-tech-protocol expert. Two should-fixes addressed in commit 188669a:
The protocol expert cleared both 7-day window interaction (orthogonal to the file-level cap) and |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Closes #4507. Four semantic gaps in the revocation block identified by the PR #4504 expert review:
revoked_publisher_domains[]removed andlast_updatedadvanced — the existing non-monotonic-last_updatedcheck only catches backwardlast_updated, not removed-then-restored shapes. Durability now lives on the validator, not the network.revoked_at. No re-authorize-before-7-days back door — that surface would be indistinguishable from a rollback attack.compliance_violationframing. Tightened thereasonenum description: operator-internal self-classification for review routing, not a public accusation. Recommendedotherfor un-adjudicated third-party allegations.additionalProperties: truestays per project policy; validators MUST ignore unknown fields on revocation entries.Description-only changes to the schema; existing files validate unchanged.
Test plan
node tests/composed-schema-validation.test.cjs— 34/34 passnode scripts/audit-oneof.mjs --check— ok, baseline unchanged🤖 Generated with Claude Code