{ "schemaVersion": 1, "baseline": "2026-10-18", "status": "implementation-preview", "description": "Initial public research and feature traceability; no implementation or legal-review completion is implied.", "features": [ { "id": "FEAT-SETUP", "priority": "P0", "title": "Guided configuration and private justifications", "status": "implemented", "deliverables": [ "Shared versioned practice/coverage questionnaire for npx wizard and host-authorized admin UI.", "Requirement-linked recommendations, unknowns/conflicts and private justifications; reviewable draft config exports with no automatic activation.", "Local answer/report resume and imported inventory preservation; host-owned authorization and explicit private-note handling.", "Explicit public purpose authoring in CLI/admin setup, guarded edits/removals and unresolved production-blocking facts.", "Versioned integration skill, curated llms.txt and Markdown guide alternates for agent-assisted setup, with explicit unknowns and host-owned review/authorization.", "Read-only, version-matched integration target map with actual config paths, separate host work, current setup question IDs and concrete acceptance scenarios." ], "implementationRefs": [ "packages/notabenda/src/setup.ts", "packages/notabenda/src/setup-cli.ts", "packages/notabenda/src/setup-ui.ts", "packages/notabenda-cf/src/setup.ts", "packages/notabenda/src/setup-purpose.ts", "packages/notabenda/src/setup-purpose-ui.ts", "packages/notabenda/src/setup-purpose-cli.ts", "packages/notabenda/src/setup-catalog-cli.ts", "packages/notabenda/src/cli-json.ts", "packages/notabenda/src/catalog-node.ts", "skills/notabenda/SKILL.md", "site/agent-docs.mjs", "llms.txt", "packages/notabenda/src/integration-reference.ts" ] }, { "id": "FEAT-INVENTORY", "priority": "P0", "title": "Site and processing inventory", "status": "partial", "deliverables": [ "Typed site, service, purpose, storage, retention, audience, and document configuration.", "Separate public bundle facts from private operator metadata.", "Completeness checks with requirement IDs and actionable missing-field messages." ], "implementationRefs": [ "packages/notabenda/src/types.ts", "packages/notabenda/src/config.ts", "packages/notabenda/src/embeds.ts", "packages/notabenda/src/privacy-signals.ts", "packages/notabenda/src/scope-guards.ts", "packages/notabenda/src/setup-purpose.ts", "packages/notabenda/src/setup-purpose-ui.ts", "packages/notabenda/src/setup-purpose-cli.ts" ] }, { "id": "FEAT-DOCUMENTS", "priority": "P0", "title": "Privacy and cookie documents", "status": "partial", "deliverables": [ "Static privacy and cookie pages, semantic HTML, document links, service/storage tables, and legal-center composition.", "Reviewed supplied content plus an original clause pipeline with explicit review and licensing status.", "Versioned artifacts and material-change diffs; readable pages without JavaScript." ], "implementationRefs": [ "packages/notabenda/src/documents.ts", "packages/notabenda/src/content.ts", "packages/notabenda/src/react.ts", "packages/notabenda/src/react-documents.ts", "packages/notabenda/src/astro-client.ts", "packages/notabenda/src/astro/LegalDocument.astro", "packages/notabenda/src/release-files.ts", "packages/notabenda/src/indirect-collection.ts", "packages/notabenda/src/astro/IndirectCollectionNotice.astro", "packages/notabenda/src/setup.ts", "examples/indirect-collection/build.mjs", "packages/notabenda/src/guarantee-notice.ts", "packages/notabenda/src/guarantee-notice-build.ts", "packages/notabenda/src/guarantee-notice-json.ts", "packages/notabenda/src/guarantee-notice-data.ts", "packages/notabenda/src/guarantees.css", "packages/notabenda/src/astro/LegalGuaranteeNotice.astro", "packages/notabenda/assets/guarantees/manifest.json", "examples/guarantees/build.mjs" ] }, { "id": "FEAT-TERMS", "priority": "P0", "title": "Terms documents and acceptance", "status": "partial", "deliverables": [ "Static supplied terms first; narrowly scoped reviewed packs later.", "Optional explicit terms-acceptance control linked to an exact version; independent marketing permissions.", "Consumer/business and service-type configuration, with conditional rights and contract-action links." ], "implementationRefs": [ "packages/notabenda/src/config.ts", "packages/notabenda/src/documents.ts", "packages/notabenda/src/terms.ts", "packages/notabenda/src/content.ts", "packages/notabenda-cf/src/terms.ts", "packages/notabenda-cf/src/render.ts", "packages/notabenda/src/guarantee-notice.ts", "packages/notabenda/src/guarantee-notice-build.ts", "packages/notabenda/src/guarantee-notice-json.ts", "packages/notabenda/src/guarantee-notice-data.ts", "packages/notabenda/src/guarantees.css", "packages/notabenda/src/react-documents.ts", "packages/notabenda/src/astro/LegalGuaranteeNotice.astro", "packages/notabenda/assets/guarantees/manifest.json", "examples/guarantees/build.mjs" ] }, { "id": "FEAT-SERVICE-CATALOG", "priority": "P1", "title": "Shared third-party catalog and passive recognition", "status": "partial", "deliverables": [ "Versioned provider/product schema, source-backed service facts, custom entries and operator-confirmed site use.", "Shared public third-party rendering and pinned release provenance; large data stays outside normal consent bundles.", "Explainable passive recognition using bounded exact/pattern/combined signals, compatible capture versions and reviewable configuration suggestions.", "Reproducible licensed imports, broad service seeds, source freshness and positive/negative detector fixtures.", "Initial optional reference seed: 363 provider identities, 402 product/reference entries, 2,278 imported storage hints and 39 original backend/provider references plus three browser-product references; all entries unreviewed." ], "implementationRefs": [ "packages/notabenda/src/catalog.ts", "packages/notabenda/src/catalog-project.ts", "packages/notabenda/src/catalog-cli.ts", "scripts/build-service-catalog.py", "packages/notabenda/src/service-directory.ts", "packages/notabenda/src/service-inventory.ts", "packages/notabenda/src/catalog-selection.ts", "packages/notabenda/src/catalog-ui.ts", "packages/notabenda/src/catalog-browser.ts", "packages/notabenda/src/catalog-browser-policy.ts", "packages/notabenda/src/catalog-browser-capture.ts", "packages/notabenda/src/catalog-browser-cli.ts", "packages/notabenda/src/catalog-browser-ui.ts", "packages/notabenda/src/discovery-capture.ts", "packages/notabenda/src/discovery-ui.ts", "catalog/browser-rules.json", "catalog/browser-providers.json", "packages/notabenda/src/setup-catalog-cli.ts", "packages/notabenda/src/cli-json.ts", "packages/notabenda/src/catalog-node.ts", "packages/notabenda/src/catalog-release.ts", "packages/notabenda/src/catalog-release-policy.ts", "packages/notabenda/src/catalog-reference.ts", "packages/notabenda-cf/src/catalog-release-policy.ts", "packages/notabenda-cf/src/catalog-reference.ts", "packages/notabenda-cf/src/history.ts", "packages/notabenda-cf/src/catalog-render.ts", "packages/notabenda-cf/src/worker.ts", "examples/catalog-releases/build.mjs", "catalog/product-profiles.json", "packages/notabenda/src/catalog-profile.ts" ] }, { "id": "FEAT-CONTROLS", "priority": "P1", "title": "Consent and preference widgets", "status": "partial", "deliverables": [ "Compact nonmodal bottom notice by default on mobile; clear permission request with balanced accept/reject/customize actions.", "Preferences expand on deliberate tap into a bottom drawer; desktop may use a corner notice and side drawer. No automatic fullscreen dialog or initial page-blocking backdrop.", "Accessible native markup, optional CSS, semantic theme tokens, light/dark and unstyled variants; optional drag gestures always have visible tap and keyboard equivalents.", "Safe-area spacing, thumb-friendly controls, persistent reopening, focus restoration, and readable choices across small screens, zoom, large text, RTL, and the on-screen keyboard." ], "implementationRefs": [ "packages/notabenda/src/consent.ts", "packages/notabenda/src/controls.ts", "packages/notabenda/src/config.ts", "packages/notabenda/src/react.ts", "packages/notabenda/src/react-documents.ts", "packages/notabenda/src/astro-client.ts", "packages/notabenda/src/embeds.ts", "packages/notabenda/src/privacy-signals.ts", "packages/notabenda/src/scope-guards.ts", "packages/notabenda/src/storage-exception-policy.ts", "packages/notabenda/src/storage-exceptions.ts", "packages/notabenda/src/storage-exception-controls.ts", "packages/notabenda/src/storage-exceptions.css", "packages/notabenda/src/service-runner.ts", "packages/notabenda/src/storage-cleanup.ts" ] }, { "id": "FEAT-ENFORCEMENT", "priority": "P1", "title": "Service gating and withdrawal", "status": "partial", "deliverables": [ "Declared service loaders and teardown hooks; inert scripts, images, and embeds until allowed.", "Separate device-access permission from downstream processing restrictions.", "Stop future work, remove accessible declared storage, and surface vendor/reload limitations after withdrawal.", "Explicit Irish default grant cap with calendar-month expiry, independent solicitation/refusal clocks and pinned CF receipt parity; justified extensions remain open." ], "implementationRefs": [ "packages/notabenda/src/consent.ts", "packages/notabenda/src/controls.ts", "packages/notabenda/src/config.ts", "packages/notabenda/src/react.ts", "packages/notabenda/src/react-documents.ts", "packages/notabenda/src/astro-client.ts", "packages/notabenda/src/embeds.ts", "packages/notabenda/src/privacy-signals.ts", "packages/notabenda/src/storage-cleanup.ts", "packages/notabenda/src/scope-guards.ts", "packages/notabenda/src/storage-exception-policy.ts", "packages/notabenda/src/storage-exceptions.ts", "packages/notabenda/src/storage-exception-controls.ts", "packages/notabenda/src/storage-exceptions.css", "packages/notabenda/src/service-runner.ts", "packages/notabenda/src/consent-engine.ts", "docs/verification/regional-consent.md", "packages/notabenda/src/grant-expiry-policy.ts" ] }, { "id": "FEAT-CHOICES", "priority": "P1", "title": "Preference lifetime and revisions", "status": "partial", "deliverables": [ "Purpose-level persisted choices, scope compatibility, expiry, and cross-tab updates.", "Separate prompt suppression, grant expiry, evidence retention, and document versions.", "Never convert dismissal, malformed state, missing storage, or stale scope into permission.", "Explicit Irish default grant cap with calendar-month expiry, independent solicitation/refusal clocks and pinned CF receipt parity; justified extensions remain open." ], "implementationRefs": [ "packages/notabenda/src/consent.ts", "packages/notabenda/src/controls.ts", "packages/notabenda/src/config.ts", "packages/notabenda/src/prompt-policy.ts", "packages/notabenda/src/consent-notice.ts", "packages/notabenda/src/content.ts", "packages/notabenda/src/consent-evidence.ts", "packages/notabenda-cf/src/consent.ts", "examples/repeat-prompts/build.mjs", "examples/repeat-prompts/client.mjs", "packages/notabenda/src/consent-engine.ts", "docs/verification/regional-consent.md", "packages/notabenda/src/grant-expiry-policy.ts" ] }, { "id": "FEAT-FORMS", "priority": "P2", "title": "Collection notices and form permissions", "status": "partial", "deliverables": [ "Inline collection notice, optional permission field/group, notice link, and explicit terms action.", "Purpose/channel-specific choices and versioned form text; no forced privacy-policy acceptance checkbox.", "Trusted application API for consent and withdrawal records; no email-sending platform.", "Separate reviewed indirect-collection particulars in static HTML and plain text, with explicit phase and no delivery claim." ], "implementationRefs": [ "packages/notabenda/src/terms.ts", "packages/notabenda/src/content.ts", "packages/notabenda-cf/src/terms.ts", "packages/notabenda-cf/src/render.ts", "packages/notabenda/src/collection.ts", "packages/notabenda/src/react-documents.ts", "packages/notabenda/src/astro/CollectionNotice.astro", "packages/notabenda/src/form-permission.ts", "packages/notabenda-cf/src/permissions.ts", "packages/notabenda-cf/src/lifecycle.ts", "packages/notabenda/src/react-form-permission.ts", "packages/notabenda/src/astro-form-permission.ts", "packages/notabenda/src/astro/FormPermissionField.astro", "packages/notabenda/src/indirect-collection.ts", "packages/notabenda/src/astro/IndirectCollectionNotice.astro", "packages/notabenda/src/setup.ts", "examples/indirect-collection/build.mjs" ] }, { "id": "FEAT-RECORDS", "priority": "P2", "title": "Durable evidence with notabenda-cf", "status": "partial", "deliverables": [ "Transactional Durable Object records, artifact registration, anonymous receipts, and authenticated subject events; alternative storage adapters later.", "Export, controlled erasure, retention cleanup, access controls, and evidence provenance.", "Separate browser-reported actions from trusted application events; configurable transport for existing backends." ], "implementationRefs": [ "packages/notabenda/src/content.ts", "packages/notabenda-cf/src/history.ts", "packages/notabenda/src/terms.ts", "packages/notabenda-cf/src/terms.ts", "packages/notabenda-cf/src/render.ts", "packages/notabenda/src/consent-notice.ts", "packages/notabenda-cf/src/consent.ts", "packages/notabenda/src/processing-choices.ts", "packages/notabenda-cf/src/processing.ts", "packages/notabenda-cf/src/export.ts", "packages/notabenda-cf/src/worker.ts", "packages/notabenda-cf/src/types.ts", "packages/notabenda-cf/src/lifecycle.ts", "examples/lifecycle.mjs", "packages/notabenda/src/form-permission.ts", "packages/notabenda-cf/src/permissions.ts" ] }, { "id": "FEAT-REGIONS", "priority": "P2", "title": "Regional requirement profiles", "status": "partial", "deliverables": [ "Explicit applicability facts and versioned rule packs; conservative fallback when applicability is unknown.", "Explain effective behavior using requirement IDs, sources, and active pack versions.", "Conditional exemptions and purpose-specific restrictions; no inference of applicability from IP geography alone.", "Optional declared UK statistical/appearance objection profiles, separate from consent, with atomic browser preferences and revision-bound resume; qualification remains host review.", "Explicit Irish default grant cap with calendar-month expiry, independent solicitation/refusal clocks and pinned CF receipt parity; justified extensions remain open." ], "implementationRefs": [ "packages/notabenda/src/prompt-policy.ts", "packages/notabenda/src/consent.ts", "packages/notabenda/src/config.ts", "packages/notabenda/src/consent-notice.ts", "packages/notabenda/src/content.ts", "packages/notabenda/src/consent-evidence.ts", "packages/notabenda-cf/src/consent.ts", "examples/repeat-prompts/build.mjs", "examples/repeat-prompts/client.mjs", "packages/notabenda/src/storage-exception-policy.ts", "packages/notabenda/src/storage-exceptions.ts", "packages/notabenda/src/storage-exception-controls.ts", "packages/notabenda/src/storage-exceptions.css", "packages/notabenda/src/service-runner.ts", "packages/notabenda/src/storage-cleanup.ts", "packages/notabenda/src/consent-engine.ts", "docs/verification/regional-consent.md", "packages/notabenda/src/grant-expiry-policy.ts" ] }, { "id": "FEAT-US-CHOICES", "priority": "P2", "title": "US privacy choices and signals", "status": "partial", "deliverables": [ "Sale/sharing/targeted-advertising controls, applicable GPC handling, and signal-status messaging.", "Notice-at-collection entry points and relevant sensitive-data restrictions.", "Server-readable restrictions and adapters to stop corresponding downstream processing." ], "implementationRefs": [ "packages/notabenda/src/privacy-signals.ts", "packages/notabenda/src/processing-choices.ts", "packages/notabenda-cf/src/processing.ts" ] }, { "id": "FEAT-RIGHTS", "priority": "P2", "title": "Rights entry points and application bridge", "status": "partial", "deliverables": [ "Configurable rights/contact page and links for access, correction, erasure, withdrawal, and applicable appeals.", "Authenticated hooks to an operator's workflow; receipt exports do not pretend to export all application data.", "Document verified identity and response handling as operator/application responsibilities.", "Initial static core/React/Astro entry points and public contact fallback are implemented; intake, identity, request/response workflow and fulfillment remain host work." ], "implementationRefs": [ "packages/notabenda/src/rights-policy.ts", "packages/notabenda/src/rights.ts", "packages/notabenda/src/config.ts", "packages/notabenda/src/content.ts", "packages/notabenda/src/documents.ts", "packages/notabenda/src/react-documents.ts", "packages/notabenda/src/astro/RightsCenter.astro", "packages/notabenda/src/styles.css", "packages/notabenda-authoring/src/index.ts", "examples/rights/build.mjs" ] }, { "id": "FEAT-CONTRACT-ACTIONS", "priority": "P2", "title": "Contract withdrawal and cancellation widgets", "status": "partial", "deliverables": [ "Separate contract-withdrawal and qualifying subscription-cancellation flows, with applicable labels and required fields.", "Review step, durable confirmation output, and application-backend handoff; privacy choices stay independent. Use mobile drawers/pages with readable forms, not unsolicited fullscreen prompts.", "Optional notabenda-cf record/dispatch support; no success message until handoff is durably accepted; no automatic refunds or subscription mutation.", "Native/headless forms, atomic declaration/outbox APIs, isolated examples, private inspection/search and independent bounded host callback runners are implemented and locally verified, including SQLite dispatch lease restart/deduplication with simulated providers. Actual host scheduling/providers, regional review and operational acceptance remain open." ], "implementationRefs": [ "packages/notabenda/src/contract-action-policy.ts", "packages/notabenda/src/contract-action.ts", "packages/notabenda/src/content.ts", "packages/notabenda-cf/src/contract-action-policy.ts", "packages/notabenda-cf/src/contracts.ts", "packages/notabenda-cf/src/lifecycle.ts", "packages/notabenda-cf/src/records.ts", "packages/notabenda-cf/src/render.ts", "examples/contract-actions/build.mjs", "examples/contract-actions/client.mjs", "examples/contract-actions/style.css", "site/contract-context.mjs", "site/contract-seed.mjs", "site/demo-host.mjs", "site/worker.mjs", "site/host.mjs", "packages/notabenda-cf/src/contract-dispatch.ts" ] }, { "id": "FEAT-DISCOVERY", "priority": "P3", "title": "Standalone discovery tooling", "status": "partial", "deliverables": [ "Browser-assisted inventory of observed requests, cookies/storage, embeds, and resource hints.", "Human-readable and JSON findings with route, scenario, evidence, and candidate purpose/service mappings.", "Adopters choose when to run it, whether to use CI, and which findings should block their deployments." ], "implementationRefs": [ "packages/notabenda/src/discovery.ts", "packages/notabenda/src/discovery-ui.ts", "packages/notabenda/src/discovery-cli.ts", "examples/discovery/build.mjs", "examples/discovery/client.mjs" ] }, { "id": "FEAT-GOOGLE", "priority": "P3", "title": "Google Basic Consent Mode", "status": "partial", "deliverables": [ "Optional adapter setting defaults before tags and explicitly mapping all four relevant consent signals.", "Basic mode tag gating and purpose mapping diagnostics.", "Test fixtures demonstrating no Google requests before consent or after rejection." ], "implementationRefs": [ "packages/notabenda/src/google-basic.ts", "packages/notabenda/src/google-basic-policy.ts", "packages/notabenda/src/config.ts", "packages/notabenda/src/types.ts", "examples/google-basic/build.mjs", "examples/google-basic/client.mjs" ] }, { "id": "FEAT-AD-CMP", "priority": "P4", "title": "Certified advertising CMP path", "status": "planned", "deliverables": [ "Investigate current IAB TCF registration, vendor signaling, and Google certification as a separate project.", "No invented CMP identity or claim that Consent Mode implies certification.", "Defer shipping TCF until specification, certification, and ongoing maintenance are actually satisfied." ], "implementationRefs": [] }, { "id": "FEAT-DEPLOYMENT", "priority": "P0", "title": "Installable and restylable delivery", "status": "partial", "deliverables": [ "One frontend npm package with optional subpath exports and no runtime framework dependency.", "Vanilla, React, static HTML, and Astro examples with fictional operators and data.", "Optional Cloudflare deployment commands, same-origin configuration, and install/uninstall instructions.", "Local notabenda-cf init starter and read-only doctor are implemented with host authorization boundaries and explicit generated Wrangler scripts. Remote provisioning and operational rollout verification remain separate.", "Explicit headless entry, derived consent-only CSS and opt-in reproducible bundle-size reports; compatibility JavaScript size target remains open.", "Versioned integration skill, curated llms.txt and Markdown guide alternates for agent-assisted setup, with explicit unknowns and host-owned review/authorization.", "Read-only, version-matched integration target map with actual config paths, separate host work, current setup question IDs and concrete acceptance scenarios." ], "implementationRefs": [ "packages/notabenda/package.json", "packages/notabenda/src/cli.ts", "site/host.mjs", "site/worker.mjs", "site/build.mjs", "packages/notabenda/src/react.ts", "packages/notabenda/src/react-documents.ts", "packages/notabenda/src/astro-client.ts", "packages/notabenda/src/release-files.ts", "packages/notabenda-cf/bin/notabenda-cf.mjs", "packages/notabenda-cf/package.json", "packages/notabenda-cf/templates/src/worker.mjs", "packages/notabenda-cf/templates/src/host.mjs", "packages/notabenda-cf/templates/src/workspace.mjs", "packages/notabenda-cf/templates/src/authorize.mjs", "packages/notabenda-cf/templates/src/setup.mjs", "packages/notabenda-cf/templates/scripts/build-assets.mjs", "packages/notabenda-cf/bin/doctor.mjs", "skills/notabenda/SKILL.md", "site/agent-docs.mjs", "llms.txt", "packages/notabenda/src/integration-reference.ts" ] }, { "id": "FEAT-REQUIREMENTS", "priority": "P0", "title": "Source-linked requirements catalog", "status": "partial", "deliverables": [ "Versioned primary-source records, requirement IDs, applicability conditions, dates, caveats, and discovery articles.", "Links from requirements to feature IDs, planned verification scenarios, and eventual code/test references.", "Local validation and browseable indexes; legal review and implementation status tracked separately." ], "implementationRefs": [ "scripts/regulatory.py", "regulatory/catalog.json" ] }, { "id": "FEAT-SCOPE-GUARDS", "priority": "P2", "title": "Sensitive and child-related scope guards", "status": "partial", "deliverables": [ "Explicit sensitive-data, children, profiling, and regulated-sector flags in configuration.", "Prevent unsupported scenarios from being described as covered; block optional high-risk integrations by default.", "Specialized age assurance and verifiable parental consent remain deferred until separately designed and reviewed.", "Initial explicit operator scope declarations and optional-runtime guards; specialized authorization and sector workflows remain unsupported." ], "implementationRefs": [ "packages/notabenda/src/scope-guard-policy.ts", "packages/notabenda/src/scope-guards.ts", "packages/notabenda/src/types.ts", "packages/notabenda/src/config.ts", "packages/notabenda/src/consent.ts", "packages/notabenda/src/consent-notice.ts", "packages/notabenda/src/controls.ts", "packages/notabenda/src/setup.ts", "packages/notabenda/src/starter.ts", "packages/notabenda/src/react.ts", "packages/notabenda-cf/src/scope-guard-policy.ts", "packages/notabenda-cf/src/consent.ts", "packages/notabenda-cf/src/history.ts", "packages/notabenda-cf/src/render.ts", "examples/scope-guards/build.mjs", "examples/scope-guards/client.mjs" ] }, { "id": "FEAT-BACKOFFICE", "priority": "P2", "title": "Host-authorized evidence backoffice", "status": "partial", "deliverables": [ "Pluggable read-only worker with mandatory host authorization and host-selected store scope.", "Bounded search, evidence cards, readable details, filters, and raw JSON disclosure.", "Durable Object adapter; no login, credentials, arbitrary DO selectors, or consent collection." ], "implementationRefs": [ "packages/notabenda-cf/src/worker.ts", "packages/notabenda-cf/src/store.ts", "packages/notabenda-cf/src/render.ts", "packages/notabenda-cf/src/records.ts", "packages/notabenda/src/terms.ts", "packages/notabenda/src/content.ts", "packages/notabenda-cf/src/terms.ts", "site/host.mjs", "site/worker.mjs", "site/build.mjs", "packages/notabenda/src/consent-notice.ts", "packages/notabenda-cf/src/consent.ts", "packages/notabenda-cf/src/export.ts", "packages/notabenda-cf/src/types.ts", "packages/notabenda-cf/src/lifecycle.ts", "examples/lifecycle.mjs" ] }, { "id": "FEAT-DOCUMENT-HISTORY", "priority": "P2", "title": "Immutable document history and reviewable differences", "status": "implemented", "deliverables": [ "Explicit transactional release archival with exact content, version metadata, operator change note, and idempotent retries.", "Backoffice release history and safe side-by-side structured comparisons.", "Separate content and rendered-HTML digests; no automatic publication, notification, consent invalidation, or terms acceptance." ], "implementationRefs": [ "packages/notabenda-cf/src/history.ts", "packages/notabenda-cf/src/render.ts", "packages/notabenda/src/content.ts", "packages/notabenda/src/release-files.ts" ] }, { "id": "FEAT-PAID-ORDERS", "priority": "P2", "title": "Paid order information and deliberate payment action", "status": "partial", "deliverables": [ "Reviewed item and commitment definitions bound to host-calculated quotes, exact money, total/due-now prices, recurring and conditional charges, and product-specific guarantee labels.", "Static vanilla/React/Astro information and a native/headless final action with uncertainty recovery. No implicit terms agreement, payment execution or durable contract confirmation.", "Reusable Cloudflare chunked review/original-file archives, CAS quote activation, one admission per checkout intent with atomic host mutation plans, recovery, scoped admin inspection and retirement are implemented and used by the isolated demo. External payment/stock-system acceptance, actual confirmation provision and legal/national review remain open; optional complete-file archival and host delivery mechanics are tracked separately in FEAT-ORDER-CONFIRMATION." ], "implementationRefs": [ "packages/notabenda/src/paid-order-policy.ts", "packages/notabenda/src/paid-order.ts", "packages/notabenda/src/paid-order-action.ts", "packages/notabenda/src/paid-order-ui.ts", "packages/notabenda/src/orders.css", "packages/notabenda-authoring/src/paid-order-build.ts", "packages/notabenda/src/react-documents.ts", "packages/notabenda/src/astro/PaidOrderReview.astro", "examples/orders/build.mjs", "examples/orders/client.mjs", "site/order-demo.mjs", "site/order-demo-admin.mjs", "site/order-admin.css", "packages/notabenda-cf/src/orders.ts", "packages/notabenda-cf/src/order-context.ts", "packages/notabenda-cf/src/order-blobs.ts", "packages/notabenda-cf/src/order-render.ts", "packages/notabenda-cf/src/order-admin-style.ts", "packages/notabenda-cf/src/order-review.ts", "packages/notabenda-cf/src/order-review-style.ts", "packages/notabenda-cf/src/order-policy.ts", "packages/notabenda-cf/src/lifecycle.ts", "packages/notabenda-cf/src/worker.ts", "packages/notabenda-cf/src/types.ts", "packages/notabenda-cf/scripts/sync-order-policy.mjs", "site/order-demo-legacy.mjs", "site/order-demo-admin-legacy.mjs" ] }, { "id": "FEAT-ORDER-CONFIRMATION", "priority": "P2", "title": "Customer confirmation archives and host delivery", "status": "partial", "deliverables": [ "Immutable personally addressed plain-text confirmation and optional exact attachments, linked to the admitted review, actual host contract facts and fixed destination version.", "Atomic preparation/outbox, bounded host callback attempts, recoverable uncertainty and stable provider idempotency; no built-in email provider, scheduler or contract-formation decision.", "Separately authorized admin inspection and inert downloads; pending-job retirement guards and resumable scoped purge.", "Complete content, real channel/destination behavior, actual provision, timing and national/linguistic acceptance remain host review work." ], "implementationRefs": [ "packages/notabenda-cf/src/order-confirmations.ts", "packages/notabenda-cf/src/order-confirmation-state.ts", "packages/notabenda-cf/src/order-confirmation-dispatch.ts", "packages/notabenda-cf/src/order-confirmation-render.ts", "packages/notabenda-cf/src/orders.ts", "packages/notabenda-cf/src/lifecycle.ts", "packages/notabenda-cf/src/worker.ts", "packages/notabenda-cf/src/types.ts", "site/order-confirmation-seed.mjs", "site/order-demo-admin.mjs" ] }, { "id": "FEAT-LOCALIZATION", "priority": "P1", "title": "Versioned host-supplied localization", "status": "partial", "deliverables": [ "Complete versioned host-supplied messages for legal documents, consent controls and ordinary terms acceptance, including status/accessibility text, selected language and explicit direction.", "Archived selected consent copy, independent presentation/disclosure revisions, exact material scopes and frontend/backend validation parity.", "Supplied structured or Markdown/MDX documents and optional complete generated-document templates. No automatic translation, language negotiation or inferred jurisdiction.", "Remaining interface localization, broader plural rules, reviewed locale catalogs and multi-language routing are still open." ], "implementationRefs": [ "packages/notabenda/src/localization-policy.ts", "packages/notabenda/src/document-localization.ts", "packages/notabenda/src/localized-documents.ts", "packages/notabenda/src/config.ts", "packages/notabenda/src/documents.ts", "packages/notabenda/src/controls.ts", "packages/notabenda/src/consent-notice.ts", "packages/notabenda/src/consent-runtime-config.ts", "packages/notabenda/src/consent-evidence.ts", "packages/notabenda/src/content.ts", "packages/notabenda-cf/src/consent.ts", "packages/notabenda-cf/src/localization-policy.ts", "examples/localization/config.mjs", "examples/localization/build.mjs", "packages/notabenda/src/react-consent-bindings.ts", "packages/notabenda/src/astro-client.ts", "packages/notabenda/src/astro/PreferencesButton.astro", "packages/notabenda/src/terms-localization-policy.ts", "packages/notabenda/src/terms.ts", "packages/notabenda-cf/src/terms-localization-policy.ts", "packages/notabenda-cf/src/terms.ts", "packages/notabenda-cf/src/render.ts", "examples/localization/agreement-build.mjs", "examples/localization/agreement.mjs" ] } ], "sources": [ { "id": "SRC-EU-GDPR", "title": "GDPR official text", "url": "https://eur-lex.europa.eu/eli/reg/2016/679/oj/eng", "kind": "law", "checkedOn": "2026-10-18", "access": "read", "note": "" }, { "id": "SRC-EU-EDPB", "title": "EDPB cookie banner taskforce report", "url": "https://www.edpb.europa.eu/system/files/2023-01/edpb_20230118_report_cookie_banner_taskforce_en.pdf", "kind": "regulator-guidance", "checkedOn": "2026-10-18", "access": "read", "note": "" }, { "id": "SRC-FR-CNIL", "title": "CNIL: tracker requirements", "url": "https://cnil.fr/fr/cookies-et-autres-traceurs/que-dit-la-loi", "kind": "regulator-guidance", "checkedOn": "2026-10-19", "access": "read", "note": "Read prior consent, new consent-requiring purposes, withdrawal and conditional exemptions. This page is dated 29 September 2020; checking it is not a legal review." }, { "id": "SRC-DE-TDDDG", "title": "Germany TDDDG section 25", "url": "https://www.gesetze-im-internet.de/ttdsg/__25.html", "kind": "law", "checkedOn": "2026-10-19", "access": "read", "note": "Read section 25(1)-(2): prior informed consent and the transmission-only/requested-service exceptions. Qualification remains operator review." }, { "id": "SRC-IT-GARANTE", "title": "Garante: cookie guidelines and repeated prompts", "url": "https://www.garanteprivacy.it/home/docweb/-/docweb-display/docweb/9679893", "kind": "regulator-guidance", "checkedOn": "2026-10-18", "access": "read", "note": "Read official guidance and summary; repeat-prompt mechanics are in guideline sections 6.2 and 7.1. Legal applicability/review remains open." }, { "id": "SRC-IT-GUIDE", "title": "Garante cookie guidelines", "url": "https://www.garanteprivacy.it/home/docweb/-/docweb-display/docweb/9677876", "kind": "regulator-guidance", "checkedOn": "2026-10-18", "access": "read", "note": "Read official guidance and summary; repeat-prompt mechanics are in guideline sections 6.2 and 7.1. Legal applicability/review remains open." }, { "id": "SRC-ES-AEPD", "title": "AEPD: cookie consent and choice visibility", "url": "https://www.aepd.es/preguntas-frecuentes/17-internet-y-redes-sociales/FAQ-1707-importancia-de-las-cookies-en-la-proteccion-de-datos", "kind": "regulator-guidance", "checkedOn": "2026-10-18", "access": "read", "note": "Retrieved official FAQ. Accept/reject paragraph explicitly requires simultaneous, same-level, equally visible choices." }, { "id": "SRC-IE-DPC", "title": "Irish DPC: cookies and tracking guidance", "url": "https://www.dataprotection.ie/en/dpc-guidance/guidance-cookies-and-other-tracking-technologies", "kind": "regulator-guidance", "checkedOn": "2026-10-19", "access": "read", "note": "Retrieved the guidance page and its linked April 2020 PDF. The two exemptions, analytics, per-purpose controls and remembered-consent duration need separate treatment. The linked statute could not be retrieved in this pass; these references establish regulator guidance rather than a fresh statutory-consolidation review." }, { "id": "SRC-UK-ICO", "title": "ICO: storage/access exception conditions", "url": "https://ico.org.uk/for-organisations/direct-marketing-and-privacy-and-electronic-communications/guidance-on-the-use-of-storage-and-access-technologies/what-are-the-exceptions/", "kind": "regulator-guidance", "checkedOn": "2026-10-19", "access": "read", "note": "Read statistical/appearance qualifications and the simple objection guidance; legal applicability and actual provider behavior require separate review." }, { "id": "SRC-CH-FDPIC", "title": "FDPIC: updated cookie guidance", "url": "https://www.edoeb.admin.ch/en/cookie-guidelines-updated-version", "kind": "regulator-guidance", "checkedOn": "2026-10-18", "access": "read", "note": "Read the 7 October 2025 clarification on selected advertising/location contexts and high-risk profiling. The linked full guidelines remain separate research." }, { "id": "SRC-BR-ANPD", "title": "ANPD: final cookies and personal-data guide", "url": "https://www.gov.br/anpd/pt-br/centrais-de-conteudo/materiais-educativos-e-publicacoes/guia-orientativo-cookies-e-protecao-de-dados-pessoais.pdf/@@display-file/file", "kind": "regulator-guidance", "checkedOn": "2026-10-18", "access": "read", "note": "Final October 2022 guide linked from the current ANPD landing page; do not use the separate 290-page administrative process containing drafts." }, { "id": "SRC-CA-OPC", "title": "OPC: meaningful consent", "url": "https://www.priv.gc.ca/media/4957/info_mc_eng.pdf", "kind": "regulator-guidance", "checkedOn": "2026-10-18", "access": "read", "note": "" }, { "id": "SRC-CA-OBA", "title": "OPC: online behavioural advertising", "url": "https://www.priv.gc.ca/en/privacy-topics/technology/online-privacy-tracking-cookies/tracking-and-ads/gl_ba_1112/", "kind": "regulator-guidance", "checkedOn": "2026-10-18", "access": "read", "note": "" }, { "id": "SRC-QC-CAI", "title": "Québec CAI: private-sector collection and profiling functions", "url": "https://www.cai.gouv.qc.ca/protection-renseignements-personnels/information-entreprises-privees/collecte-renseignements-personnels_entreprises", "kind": "regulator-guidance", "checkedOn": "2026-10-18", "access": "search-result", "note": "" }, { "id": "SRC-AU-OAIC", "title": "OAIC: tracking pixels and privacy obligations", "url": "https://www.oaic.gov.au/privacy/privacy-guidance-for-organisations-and-government-agencies/organisations/tracking-pixels-and-privacy-obligations", "kind": "regulator-guidance", "checkedOn": "2026-10-18", "access": "read", "note": "Full guidance inspected: ongoing tracking-technology review, collection notice and sensitive-information considerations. Discovery supplies limited observations only." }, { "id": "SRC-NZ-STATEMENT", "title": "NZ OPC: what a privacy statement must cover", "url": "https://www.privacy.org.nz/resources-and-learning/knowledge-base/view/312/", "kind": "regulator-guidance", "checkedOn": "2026-10-18", "access": "read", "note": "Full regulator page retrieved. Lists collection awareness, purpose/use, recipients, optionality/consequences and access/correction; context and applicable exceptions remain separate review." }, { "id": "SRC-NZ-IPP3A", "title": "NZ OPC: indirect-collection notification", "url": "https://www.privacy.org.nz/resources-and-learning/a-z-topics/ipp3a/", "kind": "regulator-guidance", "checkedOn": "2026-10-19", "access": "read", "note": "Full regulator guidance read. Covers notification content, reasonable steps, timing, collector/holder roles, lawful indirect collection and exceptions. Implementation remains legally unreviewed." }, { "id": "SRC-NZ-IPP3A-PRINCIPLE", "title": "NZ OPC: Principle 3A and reproduced principle text", "url": "https://www.privacy.org.nz/privacy-principles/3a/", "kind": "regulator-guidance", "checkedOn": "2026-10-19", "access": "read", "note": "Full regulator page read, including reproduced IPP3A(1)-(7). Particulars, timing and exceptions are separately assessed; not independent legal review." }, { "id": "SRC-ZA-DM", "title": "South Africa: POPIA direct-marketing guidance", "url": "https://inforegulator.org.za/wp-content/uploads/2020/07/GUIDANCE-NOTE-ON-DIRECT-MARKETING-IN-TERMS-OF-THE-PROTECTION-OF-PERSONAL-INFORMATION-ACT-4-OF-2013-POPIA.pdf", "kind": "regulator-guidance", "checkedOn": "2026-10-18", "access": "read", "note": "" }, { "id": "SRC-US-CA", "title": "California agency: consumer rights and 2026 regulation update", "url": "https://www.cppa.ca.gov/faq.html", "kind": "official-explanation", "checkedOn": "2026-10-18", "access": "read", "note": "FAQ expressly disclaims legal/regulatory interpretation. Current regulation-level GPC requirements are separately sourced from the January 2026 regulations." }, { "id": "SRC-US-CA-UI", "title": "California agency: avoiding dark patterns", "url": "https://www.cppa.ca.gov/announcements/2024/20240904.html", "kind": "regulator-guidance", "checkedOn": "2026-10-18", "access": "read", "note": "" }, { "id": "SRC-US-CO", "title": "Colorado AG: universal opt-out mechanisms", "url": "https://coag.gov/opt-out/", "kind": "regulator-guidance", "checkedOn": "2026-10-18", "access": "read", "note": "Current official page retrieved; selected GPC processing, notice and conflict provisions verified. Broader law amendments and applicability still require review." }, { "id": "SRC-US-CT", "title": "Connecticut AG: CTDPA and opt-out signals", "url": "https://portal.ct.gov/en/ag/sections/privacy/the-connecticut-data-privacy-act", "kind": "regulator-guidance", "checkedOn": "2026-10-18", "access": "read", "note": "Current official page retrieved; selected GPC processing, notice and conflict provisions verified. Broader law amendments and applicability still require review." }, { "id": "SRC-US-VA", "title": "Virginia AG: VCDPA summary", "url": "https://www.oag.state.va.us/consumer-protection/files/tips-and-info/Virginia-Consumer-Data-Protection-Act-Summary-2-2-23.pdf", "kind": "regulator-guidance", "checkedOn": "2026-10-18", "access": "search-result", "note": "" }, { "id": "SRC-US-COPPA", "title": "FTC: revised COPPA rule", "url": "https://www.ftc.gov/news-events/news/press-releases/2025/01/ftc-finalizes-changes-childrens-privacy-rule-limiting-companies-ability-monetize-kids-data", "kind": "regulator-guidance", "checkedOn": "2026-10-18", "access": "search-result", "note": "" }, { "id": "SRC-US-COPPA-RULE", "title": "2025 COPPA final rule and compliance dates", "url": "https://www.govinfo.gov/content/pkg/FR-2025-04-22/html/2025-05904.htm", "kind": "law", "checkedOn": "2026-10-18", "access": "read", "note": "Read dates and final §312.5(a)(1)–(2) text. No parental-verification implementation or full COPPA support claim." }, { "id": "SRC-TR-KVKK", "title": "KVKK: processing conditions", "url": "https://www.kvkk.gov.tr/Icerik/6607/Conditions-for-Processing-Personal-Data-", "kind": "regulator-guidance", "checkedOn": "2026-10-18", "access": "search-result", "note": "" }, { "id": "SRC-TR-COOKIES", "title": "KVKK: cookie-processing enforcement decision summary", "url": "https://www.kvkk.gov.tr/Icerik/7408/Summary-of-the-Board-Decision-on-the-processing-of-personal-data-by-the-data-controller-operating-in-e-commerce-sector-through-cookies-used-by-the-websites-mobile-applications-", "kind": "regulator-decision", "checkedOn": "2026-10-18", "access": "search-result", "note": "Case-specific; do not generalize every finding to all cookies or transfer arrangements." }, { "id": "SRC-EU-CONTRACTS", "title": "European Commission: unfair contract terms", "url": "https://commission.europa.eu/law/law-topic/consumer-protection-law/consumer-contract-law/unfair-contract-terms-directive_en", "kind": "official-explanation", "checkedOn": "2026-10-18", "access": "read", "note": "" }, { "id": "SRC-EU-WITHDRAWAL", "title": "Directive 2023/2673: online contract withdrawal function", "url": "https://eur-lex.europa.eu/legal-content/en/TXT/?uri=CELEX%3A32023L2673", "kind": "law", "checkedOn": "2026-10-18", "access": "search-result", "note": "Official indexed text provides Article 11a labels/fields, confirmation function and acknowledgement content/time; direct full text/PDF remained behind a script/robot challenge. National implementation and sector/window review remain open." }, { "id": "SRC-DE-CANCEL", "title": "Germany BGB section 312k: cancellation", "url": "https://www.gesetze-im-internet.de/bgb/BJNR001950896.html#BJNR001950896BJNE030201160", "kind": "law", "checkedOn": "2026-10-18", "access": "read", "note": "Consolidated BGB section 312k read directly. Direct confirmation-page fields/action, savable declaration, immediate electronic text confirmation and default earliest termination are distinct requirements. Current case law and contract/sector applicability still need review." }, { "id": "SRC-DE-WITHDRAW", "title": "Germany BGB: electronic withdrawal function", "url": "https://www.gesetze-im-internet.de/bgb/BJNR001950896.html#BJNR001950896BJNE028702123", "kind": "law", "checkedOn": "2026-10-18", "access": "read", "note": "Consolidated BGB section 356a read directly: accessible continuously available function during the right, identification/acknowledgement details, confirmation action and durable acknowledgement. Date/window/sector eligibility is not inferred by the module." }, { "id": "SRC-BR-CONSUMER", "title": "Brazil Consumer Defence Code", "url": "https://www.planalto.gov.br/ccivil_03/leis/l8078compilado.htm", "kind": "law", "checkedOn": "2026-10-18", "access": "read", "note": "Article 49 read directly. The initial module does not infer a universal eligibility window or implement refunds." }, { "id": "SRC-GOOGLE-CONSENT", "title": "Google Consent Mode overview", "url": "https://developers.google.com/tag-platform/security/concepts/consent-mode", "kind": "platform-policy", "checkedOn": "2026-10-18", "access": "read", "note": "" }, { "id": "SRC-GOOGLE-CMP", "title": "Google publisher CMP requirements", "url": "https://support.google.com/adsense/answer/13554116?hl=en", "kind": "platform-policy", "checkedOn": "2026-10-18", "access": "read", "note": "" }, { "id": "SRC-IAB-TCF", "title": "IAB Europe TCF", "url": "https://iabeurope.eu/transparency-consent-framework/", "kind": "industry-standard", "checkedOn": "2026-10-18", "access": "read", "note": "" }, { "id": "SRC-WCAG", "title": "WCAG 2.2", "url": "https://www.w3.org/TR/WCAG22/", "kind": "technical-standard", "checkedOn": "2026-10-18", "access": "read", "note": "" }, { "id": "SRC-IUB-OVERVIEW", "title": "iubenda legal requirements overview", "url": "https://www.iubenda.com/en/help/5720-legal-requirements-overview/", "kind": "secondary-explainer", "checkedOn": "2026-10-18", "access": "search-result", "note": "" }, { "id": "SRC-IUB-COOKIES", "title": "iubenda regional cookie consent comparison", "url": "https://www.iubenda.com/en/blog/gdpr-cookie-consent-cheatsheet-2/", "kind": "secondary-explainer", "checkedOn": "2026-10-18", "access": "read", "note": "Useful discovery index, not authority; regional cells and older summaries need primary-source checks." }, { "id": "SRC-IUB-US", "title": "iubenda US privacy implementation guide", "url": "https://www.iubenda.com/en/help/21165-how-to-comply-with-us-state-privacy-laws-using-iubenda/", "kind": "secondary-explainer", "checkedOn": "2026-10-18", "access": "read", "note": "" }, { "id": "SRC-IUB-BR", "title": "iubenda LGPD product/requirements outline", "url": "https://www.iubenda.com/en/lgpd/", "kind": "secondary-explainer", "checkedOn": "2026-10-18", "access": "search-result", "note": "" }, { "id": "SRC-IUB-WITHDRAWAL", "title": "iubenda online withdrawal-function article", "url": "https://www.iubenda.com/en/blog/online-withdrawal-function-eu-directive-2023-2673/", "kind": "secondary-explainer", "checkedOn": "2026-10-18", "access": "read", "note": "" }, { "id": "SRC-IUB-TERMS", "title": "iubenda terms legal changelog", "url": "https://www.iubenda.com/en/help/64425-terms-and-conditions-generator-legal-changelog/", "kind": "secondary-explainer", "checkedOn": "2026-10-18", "access": "search-result", "note": "" }, { "id": "SRC-SG-PDPC", "title": "Singapore PDPC selected-topics guidelines", "url": "https://www.pdpc.gov.sg/guidelines-and-consultation/2020/02/advisory-guidelines-on-the-personal-data-protection-act-for-selected-topics", "kind": "regulator-guidance", "checkedOn": "2026-10-18", "access": "blocked", "note": "Current page/PDF blocked by bot verification. Older indexed 2018/2021 excerpts are insufficient to mark a current pack researched." }, { "id": "SRC-JP-PPC", "title": "Japan PPC legal-text index", "url": "https://www.ppc.go.jp/en/legal/", "kind": "official-explanation", "checkedOn": "2026-10-18", "access": "read", "note": "Index links a 2023 consolidated translation; linked law fetch returned 403. A separately found June 2020 PDF has obsolete numbering and was not used to encode a rule." }, { "id": "SRC-EU-CRD-20260927", "title": "Consumer Rights Directive 2011/83/EU, consolidated 27 September 2026", "url": "https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02011L0083-20260927", "kind": "primary-law", "checkedOn": "2026-10-19", "access": "read", "note": "Selected current Articles 6, 8 and 22a reread in browser after direct tool retrieval encountered a challenge. Article 8(2) now includes 6(1)(la), the conditional durability label, alongside (a), (e), (o), (p). Consolidation, scope and national implementation still require review." }, { "id": "SRC-EU-EDPB-CONSENT", "title": "EDPB Guidelines 05/2020 on consent, version 1.1", "url": "https://www.edpb.europa.eu/system/files/documents/files/file1/edpb_guidelines_202005_consent_en.pdf", "kind": "regulator-guidance", "checkedOn": "2026-10-18", "access": "read", "note": "Read sections 3.1.3, 3.3.1, 3.4 and 5.1–5.2: purpose granularity, informed affirmative action, evidence and easy withdrawal. Scope/duration need contextual review; no prescribed software schema." }, { "id": "SRC-MDN-IFRAME", "title": "MDN iframe element reference", "url": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/iframe", "kind": "platform-documentation", "checkedOn": "2026-10-18", "access": "read", "note": "Sandbox, referrer policy, source navigation and load/error limitations. Technical behavior, not a legal applicability rule." }, { "id": "SRC-MDN-IMAGE", "title": "MDN image element reference", "url": "https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/img", "kind": "platform-documentation", "checkedOn": "2026-10-18", "access": "read", "note": "Resource source and image alternative/error behavior. Visibility or lazy loading does not establish permission." }, { "id": "SRC-US-CA-REGS-2026", "title": "California CCPA regulations effective 1 January 2026", "url": "https://www.cppa.ca.gov/regulations/pdf/ccpa_statute_eff_20260101.pdf", "kind": "law", "checkedOn": "2026-10-18", "access": "read", "note": "Read section 7025(b)–(c), pp. 44–48: qualifying signals, conflicts, known profiles/accounts, status and absence after a prior signal. Financial-incentive exceptions and re-opt-in require separate reviewed workflows." }, { "id": "SRC-W3C-GPC", "title": "W3C Global Privacy Control editor draft", "url": "https://w3c.github.io/gpc/", "kind": "platform-specification", "checkedOn": "2026-10-18", "access": "read", "note": "Current editor draft: header field value and duplicates, boolean navigator property, top-level navigation caching and optional support resource. This is not a finalized standard or a legal rule." }, { "id": "SRC-W3C-RESOURCE-TIMING", "title": "W3C Resource Timing candidate recommendation draft", "url": "https://www.w3.org/TR/2026/CRD-resource-timing-20260901/", "kind": "technical-standard", "checkedOn": "2026-10-18", "access": "read", "note": "Work in progress dated 1 September 2026. Resource inclusion, frame boundaries, cross-origin masking and bounded buffers limit discovery; an entry is not proof of successful network delivery." }, { "id": "SRC-US-VA-CODE", "title": "Virginia Code: Consumer Data Protection Act", "url": "https://law.lis.virginia.gov/vacodefull/title59.1/chapter53/", "kind": "law", "checkedOn": "2026-10-18", "access": "read", "note": "Read definitions, §59.1-578(A)(5) sensitive-data provision and §59.1-577(C) appeals. Other provisions, including specialized minor/social-platform rules, are not implemented by the generic scope guard." }, { "id": "SRC-EU-RIGHTS-GUIDE", "title": "EDPB small-business guide: respecting individuals’ rights", "url": "https://www.edpb.europa.eu/sme/be-compliant/respect-individuals-rights_en", "kind": "regulator-guidance", "checkedOn": "2026-10-18", "access": "read", "note": "Read rights-entry procedures, identity-doubt guidance and distinctions among rights. The software does not implement request fulfillment." }, { "id": "SRC-US-CA-AG-RIGHTS", "title": "California Attorney General: CCPA consumer request methods", "url": "https://www.oag.ca.gov/privacy/ccpa", "kind": "official-explanation", "checkedOn": "2026-10-18", "access": "read", "note": "Read request-to-know/delete/correct methods and existing-account provisions, and the distinct sale/sharing opt-out verification discussion. Methods differ by business and request context; no universal email-only rule is inferred." }, { "id": "SRC-CF-DO-EXPORTS", "title": "Cloudflare: Durable Object class exports", "url": "https://developers.cloudflare.com/durable-objects/reference/durable-objects-migrations/", "kind": "platform-documentation", "checkedOn": "2026-10-18", "access": "read", "note": "Read the current declarative exports flow, SQLite class binding example and its mutual exclusion with legacy migrations. Deployment and destructive namespace operations remain explicit host actions." }, { "id": "SRC-CF-WRANGLER-CONFIG", "title": "Cloudflare: Wrangler configuration", "url": "https://developers.cloudflare.com/workers/wrangler/configuration/", "kind": "platform-documentation", "checkedOn": "2026-10-18", "access": "read", "note": "Checked JSON/JSONC configuration, Worker entry, worker-first assets, bindings and class exports. Named Durable Object bindings and vars do not inherit; assets/exports whole-object inheritance was checked against installed Wrangler 4.151.1. Account, routing and endpoint behavior remain host decisions." }, { "id": "SRC-CF-DO-SQLITE", "title": "Cloudflare: SQLite-backed Durable Object storage", "url": "https://developers.cloudflare.com/durable-objects/api/sqlite-storage-api/", "kind": "platform-documentation", "checkedOn": "2026-10-19", "access": "read", "note": "Read SQLite-backed storage, asynchronous KV and transaction semantics used by scoped adapters and paid-order local admission. The host callback must use local transaction reads and return writes; external payment/network side effects are excluded. No universal retention or locality claim is inferred." }, { "id": "SRC-EU-EPRIVACY-MARKETING", "title": "ePrivacy Directive consolidated 19 December 2009, Article 13", "url": "https://eur-lex.europa.eu/eli/dir/2002/58/2009-12-19/eng", "kind": "legislation", "checkedOn": "2026-10-18", "access": "read", "note": "Read Article 13(1)–(5). Selected electronic direct-marketing rules, conditioned customer exception and national choices; national transposition remains separate research." }, { "id": "SRC-CA-CASL-S10", "title": "CASL section 10: express consent and implied-consent circumstances", "url": "https://laws-lois.justice.gc.ca/eng/acts/E-1.6/section-10.html", "kind": "legislation", "checkedOn": "2026-10-18", "access": "read", "note": "Read subsection 10(1) request purpose/identity/prescribed information, and 10(9)–(10) implied-consent conditions. Page states current to 2026-09-30; exceptions are not inferred by the toolkit." }, { "id": "SRC-CA-CRTC-548", "title": "CRTC 2012-548: consent requests and unsubscribe guidance", "url": "https://crtc.gc.ca/eng/archive/2012/2012-548.htm", "kind": "regulator-guidance", "checkedOn": "2026-10-18", "access": "read", "note": "Read paragraphs 5–20: sender/contact information, readily performed unsubscribe, separate requests and separation from general terms. Full prescribed particulars and sending workflow remain host/regional review." }, { "id": "SRC-CA-CRTC-549", "title": "CRTC 2012-549: affirmative express consent", "url": "https://crtc.gc.ca/eng/archive/2012/2012-549.htm", "kind": "regulator-guidance", "checkedOn": "2026-10-18", "access": "read", "note": "Read paragraphs 4–8: default opt-out does not obtain express consent; positive opt-in mechanisms and confirmation guidance. No sending or confirmation delivery is supplied." }, { "id": "SRC-GOOGLE-CONSENT-SETUP", "title": "Google consent mode implementation guide", "url": "https://developers.google.com/tag-platform/security/guides/consent", "kind": "platform-policy", "checkedOn": "2026-10-18", "access": "read", "note": "Reviewed defaults-before-measurement and update ordering; gtag and GTM template APIs differ." }, { "id": "SRC-GOOGLE-PRIVACY-CONTROLS", "title": "Google tag privacy controls and Analytics disable flag", "url": "https://developers.google.com/tag-platform/security/guides/privacy", "kind": "platform-policy", "checkedOn": "2026-10-18", "access": "read", "note": "Reviewed GA4 ga-disable flag and send_page_view control. This does not provide a general Ads unload or zero-network guarantee." }, { "id": "SRC-BR-ECOMMERCE", "title": "Brazil Decree 7,962/2013: electronic consumer contracts", "url": "https://www.planalto.gov.br/ccivil_03/_ato2011-2014/2013/decreto/d7962.htm", "kind": "law", "checkedOn": "2026-10-18", "access": "read", "note": "Article 5 addresses the same contracting tool, immediate acknowledgement and application-side financial notification; the optional ledger/dispatch API does not perform those external operations." }, { "id": "SRC-CF-DO-ALARMS", "title": "Cloudflare: Durable Object alarms", "url": "https://developers.cloudflare.com/durable-objects/api/alarms/", "kind": "platform-documentation", "checkedOn": "2026-10-19", "access": "read", "note": "Read the at-least-once alarm contract, finite automatic failure retries and host-managed continuation. The dispatch helpers return outcome data; they do not install an alarm, queue, scheduler or retry policy." }, { "id": "SRC-OPEN-COOKIE-DATABASE", "title": "Open Cookie Database: cookie metadata CSV", "url": "https://github.com/jkwakman/Open-Cookie-Database", "kind": "dataset", "checkedOn": "2026-10-19", "access": "read", "note": "Seed candidate for cookie metadata. No dataset imported. Cookie-level categories do not establish actual site use, legal basis, necessity or a complete provider/product profile." }, { "id": "SRC-OPEN-COOKIE-LICENSE", "title": "Open Cookie Database repository license", "url": "https://github.com/jkwakman/Open-Cookie-Database/blob/master/LICENSE", "kind": "license", "checkedOn": "2026-10-19", "access": "read", "note": "Apache License 2.0. Any future import must pin its exact source revision, preserve applicable notices/attribution and identify modifications." }, { "id": "SRC-BROWSER-GOOGLE-TAG", "title": "Google Tag official technical reference", "url": "https://developers.google.com/tag-platform/gtagjs", "kind": "technical-documentation", "checkedOn": "2026-10-19", "access": "read", "note": "Google tag loader path and gtag bootstrap; one tag can have multiple product destinations. Technical reference reviewed, not legal/provider-practice verification; external documentation is not reproduced." }, { "id": "SRC-BROWSER-GOOGLE-GTM", "title": "Google Gtm official technical reference", "url": "https://developers.google.com/tag-platform/tag-manager/protocol-relative-url?hl=en", "kind": "technical-documentation", "checkedOn": "2026-10-19", "access": "read", "note": "Tag Manager script/frame paths; only HTTPS is recognized by these rules. Technical reference reviewed, not legal/provider-practice verification; external documentation is not reproduced." }, { "id": "SRC-BROWSER-STRIPE-JS", "title": "Stripe Js official technical reference", "url": "https://docs.stripe.com/js", "kind": "technical-documentation", "checkedOn": "2026-10-19", "access": "read", "note": "Documented script delivery host; no payment feature or provider-practice classification. Technical reference reviewed, not legal/provider-practice verification; external documentation is not reproduced." }, { "id": "SRC-BROWSER-STRIPE-VERSION", "title": "Stripe Version official technical reference", "url": "https://docs.stripe.com/sdks/stripejs-versioning", "kind": "technical-documentation", "checkedOn": "2026-10-19", "access": "read", "note": "Versioned loader path and supported legacy v3 delivery. Rule is not a version recommendation. Technical reference reviewed, not legal/provider-practice verification; external documentation is not reproduced." }, { "id": "SRC-BROWSER-TURNSTILE", "title": "Turnstile official technical reference", "url": "https://developers.cloudflare.com/turnstile/get-started/client-side-rendering/", "kind": "technical-documentation", "checkedOn": "2026-10-19", "access": "read", "note": "Widget loader path, div class marker and turnstile API object. No challenge is executed. Technical reference reviewed, not legal/provider-practice verification; external documentation is not reproduced." }, { "id": "SRC-BROWSER-INTERCOM", "title": "Intercom official technical reference", "url": "https://developers.intercom.com/installing-intercom/web/installation", "kind": "technical-documentation", "checkedOn": "2026-10-19", "access": "read", "note": "Widget loader prefix and Intercom function; app/workspace suffix is never exported as a witness. Technical reference reviewed, not legal/provider-practice verification; external documentation is not reproduced." }, { "id": "SRC-BROWSER-POSTHOG-COOKIE", "title": "Posthog Cookie official technical reference", "url": "https://posthog.com/tutorials/nextjs-analytics", "kind": "technical-documentation", "checkedOn": "2026-10-19", "access": "read", "note": "Official tutorial excerpt describes a project-token-derived cookie name; only the name pattern is matched, never its value. Technical reference reviewed, not legal/provider-practice verification; external documentation is not reproduced." }, { "id": "SRC-BROWSER-POSTHOG-LOADER", "title": "Posthog Loader official technical reference", "url": "https://posthog.com/tutorials/framer-analytics", "kind": "technical-documentation", "checkedOn": "2026-10-19", "access": "read", "note": "Official tutorial excerpt describes asset-host rewriting and the array.js path. Custom hosts and proxies may not match. Technical reference reviewed, not legal/provider-practice verification; external documentation is not reproduced." }, { "id": "SRC-BROWSER-POSTHOG-REGIONS", "title": "Posthog Regions official technical reference", "url": "https://posthog.com/docs/advanced/proxy/nextjs-middleware", "kind": "technical-documentation", "checkedOn": "2026-10-19", "access": "read", "note": "Official proxy guide names US and EU asset hosts. Technical endpoint reference only; no inference about an operator deployment region or transfers. External documentation is not reproduced." }, { "id": "SRC-LINEAR-DESIGN-2026", "title": "Linear — A calmer interface for a product in motion", "url": "https://linear.app/now/behind-the-latest-design-refresh", "kind": "design-reference", "checkedOn": "2026-10-19", "access": "read", "note": "March 2026 product-design reference: restrained navigation, hierarchy, compact controls, quieter separators and neutral surfaces. Visual direction only, not an accessibility or legal authority. No Linear assets are reproduced." }, { "id": "SRC-CF-NO-TRANSFORM", "title": "Cloudflare Web Analytics — automatic injection and no-transform", "url": "https://developers.cloudflare.com/web-analytics/get-started/", "kind": "platform-documentation", "checkedOn": "2026-10-19", "access": "read", "note": "Official technical documentation: automatic setup can inject the beacon; Cache-Control public,no-transform prevents payload modification and automatic injection. This is transport behavior, not a legal exemption or a guarantee about every hosting feature." }, { "id": "SRC-PROFILE-CLOUDFLARE-PLACEMENT", "title": "Workers placement", "url": "https://developers.cloudflare.com/workers/configuration/placement/", "kind": "technical-documentation", "checkedOn": "2026-10-19", "access": "read", "note": "Public technical/legal reference read for these original notes. No provider practice or legal approval is implied; external text is not reproduced." }, { "id": "SRC-PROFILE-CLOUDFLARE-REGIONAL", "title": "Regional Services for Workers", "url": "https://developers.cloudflare.com/data-localization/how-to/workers/", "kind": "technical-documentation", "checkedOn": "2026-10-19", "access": "read", "note": "Public technical/legal reference read for these original notes. No provider practice or legal approval is implied; external text is not reproduced." }, { "id": "SRC-PROFILE-CLOUDFLARE-PRIVACY", "title": "Cloudflare privacy policy", "url": "https://www.cloudflare.com/privacypolicy/", "kind": "technical-documentation", "checkedOn": "2026-10-19", "access": "read", "note": "Public technical/legal reference read for these original notes. No provider practice or legal approval is implied; external text is not reproduced." }, { "id": "SRC-PROFILE-CLOUDFLARE-DPA", "title": "Cloudflare customer DPA", "url": "https://www.cloudflare.com/cloudflare-customer-dpa/", "kind": "technical-documentation", "checkedOn": "2026-10-19", "access": "read", "note": "Public technical/legal reference read for these original notes. No provider practice or legal approval is implied; external text is not reproduced." }, { "id": "SRC-PROFILE-STRIPE-ROLES", "title": "Stripe privacy center", "url": "https://stripe.com/legal/privacy-center", "kind": "technical-documentation", "checkedOn": "2026-10-19", "access": "read", "note": "Public technical/legal reference read for these original notes. No provider practice or legal approval is implied; external text is not reproduced." }, { "id": "SRC-PROFILE-STRIPE-PRIVACY", "title": "Stripe privacy policy", "url": "https://stripe.com/privacy", "kind": "technical-documentation", "checkedOn": "2026-10-19", "access": "read", "note": "Public technical/legal reference read for these original notes. No provider practice or legal approval is implied; external text is not reproduced." }, { "id": "SRC-PROFILE-STRIPE-DPA", "title": "Stripe DPA", "url": "https://stripe.com/legal/dpa", "kind": "technical-documentation", "checkedOn": "2026-10-19", "access": "read", "note": "Generic public DPA URL resolved to a localized page during retrieval. Check the agreement and entity for the actual account; no provider verification is implied." }, { "id": "SRC-PROFILE-SUPABASE-REGIONS", "title": "Supabase project regions", "url": "https://supabase.com/docs/guides/platform/regions", "kind": "technical-documentation", "checkedOn": "2026-10-19", "access": "read", "note": "Public technical/legal reference read for these original notes. No provider practice or legal approval is implied; external text is not reproduced." }, { "id": "SRC-PROFILE-SUPABASE-RESIDENCY", "title": "Supabase residency and transfers FAQ", "url": "https://supabase.com/legal/privacy-resources/data-residency-and-transfers-faq", "kind": "technical-documentation", "checkedOn": "2026-10-19", "access": "read", "note": "Public technical/legal reference read for these original notes. No provider practice or legal approval is implied; external text is not reproduced." }, { "id": "SRC-PROFILE-SUPABASE-SELF-HOSTING", "title": "Supabase self-hosting", "url": "https://supabase.com/docs/guides/self-hosting", "kind": "technical-documentation", "checkedOn": "2026-10-19", "access": "read", "note": "Public technical/legal reference read for these original notes. No provider practice or legal approval is implied; external text is not reproduced." }, { "id": "SRC-PROFILE-SUPABASE-PRIVACY", "title": "Supabase privacy policy", "url": "https://supabase.com/privacy", "kind": "technical-documentation", "checkedOn": "2026-10-19", "access": "read", "note": "Public technical/legal reference read for these original notes. No provider practice or legal approval is implied; external text is not reproduced." }, { "id": "SRC-PROFILE-SUPABASE-DPA", "title": "Supabase DPA", "url": "https://supabase.com/legal/customer-resources/data-processing-addendum", "kind": "technical-documentation", "checkedOn": "2026-10-19", "access": "read", "note": "Public technical/legal reference read for these original notes. No provider practice or legal approval is implied; external text is not reproduced." }, { "id": "SRC-PROFILE-RESEND-STORAGE", "title": "Resend GDPR and storage FAQ", "url": "https://resend.com/security/gdpr", "kind": "technical-documentation", "checkedOn": "2026-10-19", "access": "read", "note": "Public technical/legal reference read for these original notes. No provider practice or legal approval is implied; external text is not reproduced." }, { "id": "SRC-PROFILE-RESEND-DOMAINS", "title": "Resend domain settings", "url": "https://resend.com/docs/dashboard/domains/introduction", "kind": "technical-documentation", "checkedOn": "2026-10-19", "access": "read", "note": "Public technical/legal reference read for these original notes. No provider practice or legal approval is implied; external text is not reproduced." }, { "id": "SRC-PROFILE-RESEND-PRIVACY", "title": "Resend privacy policy", "url": "https://resend.com/legal/privacy-policy", "kind": "technical-documentation", "checkedOn": "2026-10-19", "access": "read", "note": "Public technical/legal reference read for these original notes. No provider practice or legal approval is implied; external text is not reproduced." }, { "id": "SRC-PROFILE-RESEND-DPA", "title": "Resend DPA", "url": "https://resend.com/legal/dpa", "kind": "technical-documentation", "checkedOn": null, "access": "blocked", "note": "Public reference URL recorded. Two retrieval attempts failed (timeout/internal error); its contents were not reviewed. Follow the link to review the current agreement." }, { "id": "SRC-EU-GUARANTEE-REG", "title": "Commission Implementing Regulation (EU) 2025/1960", "url": "https://eur-lex.europa.eu/eli/reg_impl/2025/1960/oj", "kind": "primary-law", "checkedOn": "2026-10-19", "access": "read", "note": "Articles 1-3 and Annexes I-II read in browser. Prescribed unchanged notice and limited editable label fields, online colour, optional nested display; applies from 27 September 2026." }, { "id": "SRC-EU-GUARANTEE-GUIDE", "title": "Commission practical guidelines on the guarantee notice and GARAN label, April 2026", "url": "https://commission.europa.eu/document/download/3e4dbee6-8184-4256-923d-c52551c7e9f0_en?filename=Practical%20guidelines%20Harmonised%20Label%26Notice%20product%20guarantees_ARES%2027042026.pdf", "kind": "official-guidance", "checkedOn": "2026-10-19", "access": "read", "note": "Selected sections 2-3 read, including digital display, producer edits, durations, font, QR destinations and product/order placement. Preliminary Commission-services guidance, not an authoritative Court interpretation." }, { "id": "SRC-EU-GUARANTEE-ASSETS", "title": "Commission official guarantee notice and label source files", "url": "https://commission.europa.eu/publications/practical-guidelines-and-high-resolution-vector-files-eu-notice-and-label-product-guarantees_en", "kind": "official-assets", "checkedOn": "2026-10-19", "access": "read", "note": "Page read and SVG/PDF notice archives plus GARAN template downloaded. Source archive and per-file hashes recorded. Notice SVGs contain outlined text and embedded PNG QR; GARAN template has live Inter text without embedded fonts. Actual source colours differ from statutory reference HEX values; no silent correction or conformity claim." }, { "id": "SRC-EU-REUSE", "title": "European Commission legal and reuse notice", "url": "https://commission.europa.eu/legal-notice_en", "kind": "official-guidance", "checkedOn": "2026-10-19", "access": "read", "note": "Reuse/copyright section read. General CC BY 4.0 policy has exceptions for logos/names/third-party rights. Prescribed artwork is not relicensed as Apache or represented as project branding." }, { "id": "SRC-EU-ORDER-CONNY-SUMMARY", "title": "CJEU C-400/22 Conny: official press summary", "url": "https://curia.europa.eu/jcms/upload/docs/application/pdf/2024-05/cp240090en.pdf", "kind": "court-summary", "checkedOn": "2026-10-19", "access": "read", "note": "Official press summary read. Full judgment is recorded separately as SRC-EU-ORDER-CONNY. The judgment takes precedence." }, { "id": "SRC-EU-ORDER-CONNY", "title": "CJEU C-400/22 Conny judgment", "url": "https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=celex%3A62022CJ0400", "kind": "court-judgment", "checkedOn": "2026-10-19", "access": "read", "note": "Full primary judgment retrieved and read, including paragraphs 42–56 and the operative part. Payment-obligation action also applies where payment depends on a later condition. Current EUR-Lex direct requests can show a JavaScript verification challenge." }, { "id": "SRC-EU-ORDER-FUHRMANN", "title": "CJEU C-249/21 Fuhrmann-2 judgment", "url": "https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A62021CJ0249", "kind": "court-judgment", "checkedOn": "2026-10-19", "access": "search-result", "note": "Indexed primary judgment excerpts reviewed, including paragraphs 28 and 34; official press release also read. The wording on the button itself must unambiguously express payment obligation. Full judgment retrieval remains open; direct requests show a JavaScript verification challenge." }, { "id": "SRC-CF-DO-LIMITS", "title": "Cloudflare: Durable Object storage limits", "url": "https://developers.cloudflare.com/durable-objects/platform/limits/", "kind": "platform-documentation", "checkedOn": "2026-10-19", "access": "read", "note": "Read SQLite combined key/value 2 MB and legacy KV value 128 KiB limits. The paid-order archive uses its own portable 64 KiB chunk profile; these bounds are engineering constraints, not legal deadlines or retention rules." }, { "id": "SRC-EU-DURABLE-CONTENT-SERVICES", "title": "CJEU Content Services, C-49/11, 5 July 2012", "url": "https://eur-lex.europa.eu/legal-content/EN/ALL/?uri=CELEX:62011CJ0049", "kind": "primary-law", "checkedOn": "2026-10-19", "access": "search-result", "note": "Official indexed judgment/summary: paragraphs 35, 42–51 and operative part reject the ordinary hyperlink arrangement in that case. Adequate future access and unchanged reproduction matter; the advanced-website question was left open. Direct full-text retrieval encountered a script/robot challenge. Prior Directive 97/7 context; current-law and national application require review." }, { "id": "SRC-UK-DUAA-STORAGE", "title": "Data (Use and Access) Act 2025: Schedule 12 storage/access amendments", "url": "https://www.legislation.gov.uk/ukpga/2025/18/pdfs/ukpga_20250018_en.pdf", "kind": "legislation", "checkedOn": "2026-10-19", "access": "read", "note": "Read Schedule 12 inserting PECR Schedule A1, especially paragraphs 5 and 6 (printed pages 233–234; PDF pages 243–244). This enacted source is read alongside current regulator guidance, not a complete commencement or national-applicability determination." }, { "id": "SRC-IE-DPC-COOKIE-NOTE", "title": "Irish DPC: cookies guidance note (April 2020)", "url": "https://www.dataprotection.ie/sites/default/files/uploads/2020-04/Guidance%20note%20on%20cookies%20and%20other%20tracking%20technologies.pdf", "kind": "regulator-guidance", "checkedOn": "2026-10-19", "access": "read", "note": "Linked from the current DPC guidance page. Read pp. 6-11 on exemptions, analytics, purpose choices, withdrawal and duration; the PDF says last updated April 2020." }, { "id": "SRC-IE-DPC-ANALYTICS", "title": "Irish DPC: consent for analytics cookies", "url": "https://www.dataprotection.ie/en/faqs/cookies/do-i-need-consent-analytics-cookies", "kind": "regulator-guidance", "checkedOn": "2026-10-19", "access": "read", "note": "The answer applies to first-party as well as third-party analytics; vendor identity alone does not create an exception." }, { "id": "SRC-LLMS-TXT", "title": "llms.txt proposal: format and Markdown documentation discovery", "url": "https://llmstxt.org/", "kind": "technical-specification", "checkedOn": "2026-10-19", "access": "read", "note": "Voluntary documentation convention, not a regulatory obligation. Read format, proposal and alternate/describedby link guidance; no indexing, crawler adoption or legal-compliance guarantee." } ], "jurisdictions": [ { "id": "EU-EEA", "status": "initial-research", "coverage": "Selected frontend, document, and integration obligations only; no production-supported pack.", "requirementIds": [ "REQ-EU-NOTICE", "REQ-EU-CONSENT", "REQ-EU-DEVICE", "REQ-EU-FAIR-CHOICE", "REQ-EU-TERMS", "REQ-EU-WITHDRAWAL", "REQ-EU-ORDER-ACTION", "REQ-EU-RETENTION-ERASURE", "REQ-EU-MARKETING", "REQ-EU-GUARANTEE-NOTICE", "REQ-EU-GUARANTEE-LABEL", "REQ-EU-ORDER-CONFIRMATION" ] }, { "id": "FR", "status": "initial-research", "coverage": "Selected frontend, document, and integration obligations only; no production-supported pack.", "requirementIds": [ "REQ-FR-SCOPE" ] }, { "id": "DE", "status": "initial-research", "coverage": "Selected frontend, document, and integration obligations only; no production-supported pack.", "requirementIds": [ "REQ-DE-DEVICE", "REQ-DE-CANCEL", "REQ-DE-WITHDRAWAL" ] }, { "id": "IT", "status": "initial-research", "coverage": "Selected frontend, document, and integration obligations only; no production-supported pack.", "requirementIds": [ "REQ-IT-REPROMPT" ] }, { "id": "ES", "status": "initial-research", "coverage": "Selected frontend, document, and integration obligations only; no production-supported pack.", "requirementIds": [ "REQ-ES-CHOICE" ] }, { "id": "IE", "status": "initial-research", "coverage": "Selected frontend, document, and integration obligations only; no production-supported pack.", "requirementIds": [ "REQ-IE-DEVICE", "REQ-IE-CONSENT-DURATION" ] }, { "id": "UK", "status": "initial-research", "coverage": "Selected frontend, document, and integration obligations only; no production-supported pack.", "requirementIds": [ "REQ-UK-EXCEPTIONS" ] }, { "id": "CH", "status": "initial-research", "coverage": "Selected frontend, document, and integration obligations only; no production-supported pack.", "requirementIds": [ "REQ-CH-PROFILING" ] }, { "id": "BR", "status": "initial-research", "coverage": "Selected frontend, document, and integration obligations only; no production-supported pack.", "requirementIds": [ "REQ-BR-COOKIE-UI", "REQ-BR-CONTRACT" ] }, { "id": "CA-FED", "status": "initial-research", "coverage": "Selected frontend, document, and integration obligations only; no production-supported pack.", "requirementIds": [ "REQ-CA-MEANINGFUL", "REQ-CA-OBA", "REQ-CA-CASL-OPTIN" ] }, { "id": "CA-QC", "status": "initial-research", "coverage": "Selected frontend, document, and integration obligations only; no production-supported pack.", "requirementIds": [ "REQ-QC-PROFILING" ] }, { "id": "AU", "status": "initial-research", "coverage": "Selected frontend, document, and integration obligations only; no production-supported pack.", "requirementIds": [ "REQ-AU-PIXELS" ] }, { "id": "NZ", "status": "initial-research", "coverage": "Selected frontend, document, and integration obligations only; no production-supported pack.", "requirementIds": [ "REQ-NZ-NOTICE", "REQ-NZ-INDIRECT" ] }, { "id": "ZA", "status": "initial-research", "coverage": "Selected frontend, document, and integration obligations only; no production-supported pack.", "requirementIds": [ "REQ-ZA-MARKETING" ] }, { "id": "US-CA", "status": "initial-research", "coverage": "Selected frontend, document, and integration obligations only; no production-supported pack.", "requirementIds": [ "REQ-US-CA-CHOICES", "REQ-US-CA-GPC", "REQ-US-CA-UI" ] }, { "id": "US-CO", "status": "initial-research", "coverage": "Selected frontend, document, and integration obligations only; no production-supported pack.", "requirementIds": [ "REQ-US-CO-GPC" ] }, { "id": "US-CT", "status": "initial-research", "coverage": "Selected frontend, document, and integration obligations only; no production-supported pack.", "requirementIds": [ "REQ-US-CT-GPC" ] }, { "id": "US-VA", "status": "initial-research", "coverage": "Selected frontend, document, and integration obligations only; no production-supported pack.", "requirementIds": [ "REQ-US-VA-RIGHTS" ] }, { "id": "US-FED", "status": "initial-research", "coverage": "Selected frontend, document, and integration obligations only; no production-supported pack.", "requirementIds": [ "REQ-US-COPPA-SCOPE" ] }, { "id": "TR", "status": "initial-research", "coverage": "Selected frontend, document, and integration obligations only; no production-supported pack.", "requirementIds": [ "REQ-TR-BASIS" ] }, { "id": "PLATFORM", "status": "initial-research", "coverage": "Selected frontend, document, and integration obligations only; no production-supported pack.", "requirementIds": [ "REQ-GOOGLE-MODE", "REQ-GOOGLE-CMP" ] }, { "id": "PRODUCT", "status": "initial-research", "coverage": "Selected frontend, document, and integration obligations only; no production-supported pack.", "requirementIds": [ "REQ-PRODUCT-A11Y", "REQ-PRODUCT-MOBILE", "REQ-PRODUCT-CONFIG", "REQ-PRODUCT-DOCUMENTS", "REQ-PRODUCT-SAFE-CONTENT", "REQ-PRODUCT-ARTIFACTS", "REQ-PRODUCT-PACKAGE", "REQ-PRODUCT-CF-ADMIN", "REQ-PRODUCT-CF-HISTORY", "REQ-PRODUCT-CONSENT-RUNTIME", "REQ-PRODUCT-TERMS-ACCEPTANCE", "REQ-PRODUCT-CF-HOST", "REQ-PRODUCT-CONSENT-EVIDENCE", "REQ-PRODUCT-AUTHORING", "REQ-PRODUCT-REACT", "REQ-PRODUCT-ASTRO", "REQ-PRODUCT-EMBEDS", "REQ-PRODUCT-PRIVACY-SIGNALS", "REQ-PRODUCT-PROCESSING-CHOICES", "REQ-PRODUCT-RETAINED-RELEASES", "REQ-PRODUCT-STORAGE-CLEANUP", "REQ-PRODUCT-SETUP", "REQ-PRODUCT-COLLECTION-NOTICE", "REQ-PRODUCT-EVIDENCE-EXPORT", "REQ-PRODUCT-DISCOVERY", "REQ-PRODUCT-REGIONAL-PROMPTS", "REQ-PRODUCT-EVIDENCE-LIFECYCLE", "REQ-PRODUCT-SCOPE-GUARDS", "REQ-PRODUCT-DEMO-WORKSPACE", "REQ-PRODUCT-RIGHTS-CENTER", "REQ-PRODUCT-CF-STARTER", "REQ-PRODUCT-FORM-PERMISSIONS", "REQ-PRODUCT-CF-DOCTOR", "REQ-PRODUCT-CONTRACT-ACTIONS", "REQ-PRODUCT-SYNTAX-HIGHLIGHTING", "REQ-PRODUCT-BUNDLE-BUDGET", "REQ-PRODUCT-SERVICE-CATALOG", "REQ-PRODUCT-SERVICE-DETECTION", "REQ-PRODUCT-SERVICE-PROFILES", "REQ-PRODUCT-INDIRECT-NOTICE", "REQ-PRODUCT-GUARANTEE-NOTICE", "REQ-PRODUCT-PAID-ORDER-ARCHIVES", "REQ-PRODUCT-ORDER-CONFIRMATION", "REQ-PRODUCT-STORAGE-EXCEPTIONS", "REQ-PRODUCT-LOCALIZATION", "REQ-PRODUCT-AGENT-INTEGRATION" ] } ], "requirements": [ { "id": "REQ-EU-NOTICE", "jurisdiction": "EU-EEA", "title": "Transparent processing disclosures", "kind": "law", "summary": "Provide applicable processing disclosures in an accessible notice.", "appliesWhen": "GDPR applies to the operator and collection/processing context.", "sourceRefs": [ { "sourceId": "SRC-EU-GDPR", "locator": "Articles 12–14" }, { "sourceId": "SRC-EU-RIGHTS-GUIDE", "locator": "Facilitate rights; electronic entry points; identity doubts" } ], "discoverySourceIds": [ "SRC-IUB-OVERVIEW" ], "featureIds": [ "FEAT-INVENTORY", "FEAT-DOCUMENTS", "FEAT-FORMS", "FEAT-RIGHTS" ], "verificationIds": [ "VERIFY-EU-NOTICE" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": null, "caveats": "Required particulars differ by context; a compiler cannot verify factual accuracy.", "implementationRefs": [ "packages/notabenda/src/config.ts", "packages/notabenda/src/documents.ts", "packages/notabenda/src/collection.ts", "packages/notabenda/src/content.ts", "packages/notabenda/src/rights-policy.ts", "packages/notabenda/src/rights.ts" ], "testRefs": [ "packages/notabenda/test/config.test.mjs", "packages/notabenda/test/documents.test.mjs", "packages/notabenda/test/collection.test.mjs", "packages/notabenda/test/rights.test.mjs" ], "implementationNote": "Declared document disclosures and a selected-purpose inline notice now share the inventory and pinned privacy revision. Actual surface timing, field-level mapping, complete applicable particulars, factual accuracy and legal review remain host work; regional support is partial." }, { "id": "REQ-EU-CONSENT", "jurisdiction": "EU-EEA", "title": "Demonstrable consent and easy withdrawal", "kind": "law", "summary": "Where consent is the legal basis, preserve the choice and support easy withdrawal.", "appliesWhen": "An operator relies on GDPR consent.", "sourceRefs": [ { "sourceId": "SRC-EU-GDPR", "locator": "Article 7" }, { "sourceId": "SRC-EU-EDPB-CONSENT", "locator": "Sections 5.1–5.2, paragraphs 104–120" } ], "discoverySourceIds": [ "SRC-IUB-OVERVIEW" ], "featureIds": [ "FEAT-CONTROLS", "FEAT-CHOICES", "FEAT-FORMS", "FEAT-RECORDS" ], "verificationIds": [ "VERIFY-EU-CONSENT" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": null, "caveats": "Durable browser receipts do not prove human identity; consent is not the only legal basis.", "implementationRefs": [ "packages/notabenda/src/controls.ts", "packages/notabenda-cf/src/consent.ts", "packages/notabenda/src/form-permission.ts", "packages/notabenda/src/content.ts", "packages/notabenda-cf/src/permissions.ts", "packages/notabenda-cf/src/lifecycle.ts", "packages/notabenda-cf/src/render.ts", "packages/notabenda/src/consent-engine.ts" ], "testRefs": [ "packages/notabenda/test/consent.test.mjs", "packages/notabenda/test/consent-evidence.test.mjs", "packages/notabenda/test/form-permission.test.mjs", "docs/verification/form-permissions.md", "packages/notabenda/test/setup-purpose.test.mjs" ], "implementationNote": "Local choices, withdrawal, expiry and cooperative cleanup are implemented. Optional server evidence preserves exact notices and transactional choice order; required-receipt browser mode checks current acknowledgments and bounded retries. Production retention, complete applicability and regional legal review remain incomplete. Ordinary purpose/channel fields and evaluated CF grant/withdrawal evidence now provide supporting mechanics; full applicability, meaningful presentation, specialized cases and regional review remain incomplete." }, { "id": "REQ-EU-DEVICE", "jurisdiction": "EU-EEA", "title": "Prior permission for non-exempt device access", "kind": "regulator-interpretation", "summary": "Keep consent-requiring storage/access inactive until a valid affirmative choice.", "appliesWhen": "Applicable national ePrivacy rules require permission for the declared activity.", "sourceRefs": [ { "sourceId": "SRC-EU-EDPB", "locator": "Applicable framework; practices A, B, H, I" } ], "discoverySourceIds": [ "SRC-IUB-COOKIES" ], "featureIds": [ "FEAT-ENFORCEMENT", "FEAT-REGIONS" ], "verificationIds": [ "VERIFY-EU-DEVICE" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": null, "caveats": "National law and exemptions require separate review; not limited to cookies.", "implementationRefs": [ "packages/notabenda/src/config.ts", "packages/notabenda/src/embeds.ts", "packages/notabenda/src/consent-engine.ts" ], "testRefs": [ "packages/notabenda/test/consent.test.mjs", "packages/notabenda/test/embeds.test.mjs" ], "implementationNote": "Declared cooperative services stay blocked until all purposes have a current grant. Arbitrary scripts, device-access exemptions, server processing, and national profiles still require integration and review. The iframe/image adapter now supplies inert placeholders and shared-service withdrawal cleanup; this does not complete national applicability or vendor integration review." }, { "id": "REQ-EU-FAIR-CHOICE", "jurisdiction": "EU-EEA", "title": "Clear choices without preselected opt-ins", "kind": "regulator-interpretation", "summary": "Avoid implied consent and misleading controls; offer a clear refusal path.", "appliesWhen": "Collecting tracker consent under the relevant EU/national rules.", "sourceRefs": [ { "sourceId": "SRC-EU-EDPB", "locator": "Practices A–E and K" } ], "discoverySourceIds": [ "SRC-IUB-COOKIES" ], "featureIds": [ "FEAT-CONTROLS", "FEAT-CHOICES" ], "verificationIds": [ "VERIFY-EU-FAIR-CHOICE" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": null, "caveats": "Balanced first-layer buttons are the project standard; do not claim identical statutory UI rules in every country.", "implementationRefs": [ "packages/notabenda/src/controls.ts", "packages/notabenda/src/config.ts", "packages/notabenda/src/styles.css", "packages/notabenda/src/consent-engine.ts" ], "testRefs": [ "packages/notabenda/test/consent.test.mjs", "docs/verification/consent-browser.md" ], "implementationNote": "No implied grant; dismissal and UI drafts do not grant. Built-in accept/reject controls are balanced. Complete accessibility, regional and wording review remains pending." }, { "id": "REQ-FR-SCOPE", "jurisdiction": "FR", "title": "Specific purposes and changes to consent scope", "kind": "regulator-interpretation", "summary": "Collect prior permission and revisit grants when an additional consent-requiring purpose is introduced.", "appliesWhen": "French tracker rules apply.", "sourceRefs": [ { "sourceId": "SRC-FR-CNIL", "locator": "Valid consent; prior consent; additional purposes" } ], "discoverySourceIds": [ "SRC-IUB-COOKIES" ], "featureIds": [ "FEAT-CHOICES", "FEAT-ENFORCEMENT", "FEAT-REGIONS" ], "verificationIds": [ "VERIFY-FR-SCOPE" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": null, "caveats": "Audience-measurement exemptions depend on configuration and conditions, not a vendor label. Shared-engine tests cover added purposes, changed disclosures, retained refusals and presentation-only edits. No complete French pack, exemption qualification or legal review is claimed.", "implementationRefs": [ "packages/notabenda/src/consent-engine.ts", "packages/notabenda/src/consent-notice.ts", "docs/verification/regional-consent.md" ], "testRefs": [ "packages/notabenda/test/regional-consent.test.mjs" ] }, { "id": "REQ-DE-DEVICE", "jurisdiction": "DE", "title": "Terminal storage and access conditions", "kind": "law", "summary": "Obtain informed consent unless a section 25 exception applies.", "appliesWhen": "German TDDDG section 25 applies to the activity.", "sourceRefs": [ { "sourceId": "SRC-DE-TDDDG", "locator": "Section 25(1)–(2)" } ], "discoverySourceIds": [ "SRC-IUB-COOKIES" ], "featureIds": [ "FEAT-ENFORCEMENT", "FEAT-REGIONS" ], "verificationIds": [ "VERIFY-DE-DEVICE" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": null, "caveats": "Transmission and requested-service necessity are narrow exceptions. Diagnostics require an explanation and cooperative lifecycle tests prevent category-based bypass. The library cannot establish that an operator's exception assertion is legally valid or stop code loaded outside its lifecycle.", "implementationRefs": [ "packages/notabenda/src/config.ts", "packages/notabenda/src/consent-engine.ts", "docs/verification/regional-consent.md" ], "testRefs": [ "packages/notabenda/test/regional-consent.test.mjs" ] }, { "id": "REQ-IT-REPROMPT", "jurisdiction": "IT", "title": "Respect a recorded refusal before prompting again", "kind": "regulator-interpretation", "summary": "Avoid repeated consent requests after refusal except under the stated conditions, including the six-month condition.", "appliesWhen": "Italian cookie guidelines apply and the visitor previously refused.", "sourceRefs": [ { "sourceId": "SRC-IT-GARANTE", "locator": "Recorded choices and exceptions to repeat solicitation" }, { "sourceId": "SRC-IT-GUIDE", "locator": "Sections 6.2 and 7.1: repeated solicitation, partial consent and closing the initial banner" } ], "discoverySourceIds": [ "SRC-IUB-COOKIES" ], "featureIds": [ "FEAT-CHOICES", "FEAT-REGIONS" ], "verificationIds": [ "VERIFY-IT-REPROMPT" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": null, "caveats": "Explicit solicitation guard only. Six calendar months run conservatively from a recorded withholding/dismissal action, not observed banner presentation. Applicability, legal review and complete regional support remain open.", "implementationRefs": [ "packages/notabenda/src/prompt-policy.ts", "packages/notabenda/src/config.ts", "packages/notabenda/src/consent-notice.ts", "packages/notabenda/src/content.ts", "packages/notabenda/src/consent-evidence.ts", "packages/notabenda-cf/src/consent.ts", "examples/repeat-prompts/build.mjs", "examples/repeat-prompts/client.mjs", "packages/notabenda/src/consent-engine.ts" ], "testRefs": [ "packages/notabenda/test/prompt-policy.test.mjs", "site/test/host.test.mjs" ] }, { "id": "REQ-ES-CHOICE", "jurisdiction": "ES", "title": "Simultaneous and equally visible accept/reject choices", "kind": "regulator-interpretation", "summary": "Offer acceptance and rejection at the same time, level, and visibility.", "appliesWhen": "Spanish consent-requiring tracker use falls within AEPD guidance.", "sourceRefs": [ { "sourceId": "SRC-ES-AEPD", "locator": "Accept/reject visibility paragraph" } ], "discoverySourceIds": [ "SRC-IUB-COOKIES" ], "featureIds": [ "FEAT-CONTROLS", "FEAT-REGIONS" ], "verificationIds": [ "VERIFY-ES-CHOICE" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": null, "caveats": "Consent exemptions and service-specific exceptions still require separate analysis.", "implementationRefs": [ "packages/notabenda/src/controls.ts", "packages/notabenda/src/styles.css" ], "testRefs": [ "docs/verification/consent-browser.md" ], "implementationNote": "Simultaneous equal-style accept/reject buttons implemented and initially inspected in Chromium. National applicability and full deployment review remain pending." }, { "id": "REQ-IE-DEVICE", "jurisdiction": "IE", "title": "Consent for non-exempt tracking", "kind": "regulator-interpretation", "summary": "Require affirmative consent where tracking is not strictly necessary for an explicitly requested service.", "appliesWhen": "Irish ePrivacy rules apply.", "sourceRefs": [ { "sourceId": "SRC-IE-DPC", "locator": "Consent and strictly necessary exception" }, { "sourceId": "SRC-IE-DPC-COOKIE-NOTE", "locator": "pp. 6-11: exemptions; analytics; multiple purposes; withdrawal; no implied consent" }, { "sourceId": "SRC-IE-DPC-ANALYTICS", "locator": "Answer and distinction between first-party and third-party analytics" } ], "discoverySourceIds": [ "SRC-IUB-COOKIES" ], "featureIds": [ "FEAT-ENFORCEMENT", "FEAT-REGIONS" ], "verificationIds": [ "VERIFY-IE-DEVICE" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": null, "caveats": "Do not import prompt durations or exemption assumptions from another country's pack. Shared-engine tests cover optional first-party measurement, affirmative granular choices and multipurpose gating. There is no reviewed Irish profile; remembered-consent duration is tracked separately by REQ-IE-CONSENT-DURATION.", "implementationRefs": [ "packages/notabenda/src/config.ts", "packages/notabenda/src/consent-engine.ts", "docs/verification/regional-consent.md" ], "testRefs": [ "packages/notabenda/test/regional-consent.test.mjs" ] }, { "id": "REQ-IE-CONSENT-DURATION", "jurisdiction": "IE", "title": "Review remembered-consent duration against DPC guidance", "kind": "regulator-recommendation", "summary": "Compare the configured remembered-consent lifetime with the DPC default of reaffirmation within six months and its case-specific justification for longer storage.", "appliesWhen": "Following Irish DPC guidance for cookies that remember a consent state.", "sourceRefs": [ { "sourceId": "SRC-IE-DPC-COOKIE-NOTE", "locator": "pp. 8-9, Withdrawal of consent and footnote 2" } ], "discoverySourceIds": [], "featureIds": [ "FEAT-CHOICES", "FEAT-REGIONS" ], "verificationIds": [ "VERIFY-IE-CONSENT-DURATION" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": "April 2020 guidance; retrieved through the current DPC page on 19 October 2026. This is guidance rather than a statutory fixed-day lifetime.", "caveats": "The explicit version-1 default cap uses the earlier of the configured grant lifetime and six clamped UTC calendar months. Refusal, Italian solicitation and evidence retention remain independent. Both receipt clocks are bounded separately. Source applicability, actual disclosures/vendor behavior, objective case-specific longer-period qualification and a complete reviewed Irish profile remain open. A six-calendar-month recommendation is not an automatic 180-day statutory limit.", "implementationRefs": [ "packages/notabenda/src/grant-expiry-policy.ts", "packages/notabenda/src/config.ts", "packages/notabenda/src/consent-runtime-config.ts", "packages/notabenda/src/consent-engine.ts", "packages/notabenda/src/consent-notice.ts", "packages/notabenda/src/consent-evidence.ts", "packages/notabenda/src/content.ts", "packages/notabenda/src/setup.ts", "packages/notabenda-cf/src/grant-expiry-policy.ts", "packages/notabenda-cf/src/consent.ts", "examples/repeat-prompts/build.mjs", "examples/repeat-prompts/client.mjs", "docs/verification/regional-consent.md" ], "testRefs": [ "packages/notabenda/test/grant-expiry.test.mjs" ] }, { "id": "REQ-UK-EXCEPTIONS", "jurisdiction": "UK", "title": "Conditional storage/access exceptions and objection", "kind": "regulator-interpretation", "summary": "Only enable an exception when its conditions hold; statistical/appearance exceptions require information and a simple free objection route.", "appliesWhen": "UK PECR applies and an operator opts into a qualifying exception.", "sourceRefs": [ { "sourceId": "SRC-UK-ICO", "locator": "At a glance; statistical/appearance exceptions; simple means of objecting" }, { "sourceId": "SRC-UK-DUAA-STORAGE", "locator": "Schedule 12 inserting PECR Schedule A1, paragraphs 5–6, printed pages 233–234" } ], "discoverySourceIds": [ "SRC-IUB-COOKIES" ], "featureIds": [ "FEAT-REGIONS", "FEAT-CONTROLS", "FEAT-ENFORCEMENT" ], "verificationIds": [ "VERIFY-UK-EXCEPTIONS" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": "ICO finalized updated guidance on 29 April 2026.", "caveats": "Optional host-assessed profiles only. Ordinary consent remains opt-in. Real qualification, downstream personal-data processing, aggregation/deletion behavior, accessibility and legal review remain open; software declarations do not prove their truth.", "implementationRefs": [ "packages/notabenda/src/storage-exception-policy.ts", "packages/notabenda/src/storage-exceptions.ts", "packages/notabenda/src/storage-exception-controls.ts", "packages/notabenda/src/storage-exceptions.css", "packages/notabenda/src/service-runner.ts", "packages/notabenda/src/storage-cleanup.ts", "examples/storage-exceptions/config.mjs", "examples/storage-exceptions/build.mjs", "examples/storage-exceptions/client.mjs" ], "testRefs": [ "packages/notabenda/test/storage-exceptions.test.mjs", "docs/verification/storage-exceptions.md", "site/test/storage-exceptions.test.mjs" ] }, { "id": "REQ-CH-PROFILING", "jurisdiction": "CH", "title": "Assess personalised-advertising and high-risk profiling consent", "kind": "regulator-interpretation", "summary": "Assess whether personalised advertising enables high-risk profiling that requires consent.", "appliesWhen": "Swiss FADP applies to the declared profiling/advertising activity.", "sourceRefs": [ { "sourceId": "SRC-CH-FDPIC", "locator": "Clarification on personalised advertising and high-risk profiling" } ], "discoverySourceIds": [ "SRC-IUB-OVERVIEW" ], "featureIds": [ "FEAT-INVENTORY", "FEAT-REGIONS", "FEAT-SCOPE-GUARDS" ], "verificationIds": [ "VERIFY-CH-PROFILING" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": "FDPIC update published 7 October 2025.", "caveats": "Do not equate all Swiss cookies with EU opt-in rules or assume all profiling has the same status.", "implementationRefs": [ "packages/notabenda/src/scope-guards.ts", "packages/notabenda/src/setup.ts", "packages/notabenda/src/consent-engine.ts" ], "testRefs": [ "packages/notabenda/test/scope-guards.test.mjs" ], "implementationNote": " Explicit operator declarations now block affected registered optional work and generic grants. This support boundary does not implement the specialized legal workflow, determine applicability or complete legal review." }, { "id": "REQ-BR-COOKIE-UI", "jurisdiction": "BR", "title": "ANPD cookie-control recommendations", "kind": "regulator-recommendation", "summary": "Provide understandable purposes, easy rejection of unnecessary cookies, and accessible management/withdrawal.", "appliesWhen": "Applying ANPD's cookie-guide recommendations to personal-data processing.", "sourceRefs": [ { "sourceId": "SRC-BR-ANPD", "locator": "Section 4: cookie banners and examples" } ], "discoverySourceIds": [ "SRC-IUB-BR" ], "featureIds": [ "FEAT-CONTROLS", "FEAT-REGIONS", "FEAT-CHOICES" ], "verificationIds": [ "VERIFY-BR-COOKIE-UI" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "planned", "effectiveFrom": null, "timingNote": null, "caveats": "These are regulator recommendations; LGPD legal bases require purpose-specific analysis, not a claim that consent is mandatory for all cookies.", "implementationRefs": [], "testRefs": [] }, { "id": "REQ-CA-MEANINGFUL", "jurisdiction": "CA-FED", "title": "Meaningful consent and material changes", "kind": "regulator-interpretation", "summary": "Explain collection, sharing, purposes, and consequences, with meaningful choices and withdrawal.", "appliesWhen": "PIPEDA applies and consent is required.", "sourceRefs": [ { "sourceId": "SRC-CA-OPC", "locator": "Meaningful consent: four key elements and clear choices" } ], "discoverySourceIds": [ "SRC-IUB-OVERVIEW" ], "featureIds": [ "FEAT-FORMS", "FEAT-DOCUMENTS", "FEAT-CHOICES" ], "verificationIds": [ "VERIFY-CA-MEANINGFUL" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": null, "caveats": "Provincial regimes and statutory exceptions must be evaluated separately.", "implementationRefs": [ "packages/notabenda/src/form-permission.ts", "packages/notabenda/src/content.ts", "packages/notabenda-cf/src/permissions.ts", "packages/notabenda-cf/src/lifecycle.ts", "packages/notabenda-cf/src/render.ts" ], "testRefs": [ "packages/notabenda/test/form-permission.test.mjs", "docs/verification/form-permissions.md" ], "implementationNote": " Ordinary purpose/channel fields and evaluated CF grant/withdrawal evidence now provide supporting mechanics; full applicability, meaningful presentation, specialized cases and regional review remain incomplete." }, { "id": "REQ-CA-OBA", "jurisdiction": "CA-FED", "title": "Conditional opt-out consent for behavioural advertising", "kind": "regulator-interpretation", "summary": "Do not assume opt-out consent is sufficient for all behavioural advertising.", "appliesWhen": "PIPEDA applies to online behavioural advertising.", "sourceRefs": [ { "sourceId": "SRC-CA-OBA", "locator": "Opt-out conditions; sensitive information; children" } ], "discoverySourceIds": [], "featureIds": [ "FEAT-REGIONS", "FEAT-ENFORCEMENT", "FEAT-SCOPE-GUARDS" ], "verificationIds": [ "VERIFY-CA-OBA" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": null, "caveats": "Any opt-out model needs review of the OPC conditions; the conservative default remains opt-in.", "implementationRefs": [ "packages/notabenda/src/scope-guards.ts", "packages/notabenda/src/setup.ts", "packages/notabenda/src/consent-engine.ts" ], "testRefs": [ "packages/notabenda/test/scope-guards.test.mjs" ], "implementationNote": " Explicit operator declarations now block affected registered optional work and generic grants. This support boundary does not implement the specialized legal workflow, determine applicability or complete legal review." }, { "id": "REQ-QC-PROFILING", "jurisdiction": "CA-QC", "title": "Profiling/identification/location functions off by default", "kind": "regulator-interpretation", "summary": "Notify people of covered functions and how to activate them; do not activate them by default.", "appliesWhen": "Québec private-sector collection rules cover the declared technology.", "sourceRefs": [ { "sourceId": "SRC-QC-CAI", "locator": "Technologies d'identification, de localisation et de profilage" } ], "discoverySourceIds": [], "featureIds": [ "FEAT-INVENTORY", "FEAT-REGIONS", "FEAT-ENFORCEMENT" ], "verificationIds": [ "VERIFY-QC-PROFILING" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "planned", "effectiveFrom": null, "timingNote": null, "caveats": "Scope and exceptions need Québec-specific review; this is not a statement that every cookie is covered.", "implementationRefs": [], "testRefs": [] }, { "id": "REQ-AU-PIXELS", "jurisdiction": "AU", "title": "Pixel notices and sensitive-data consent", "kind": "regulator-interpretation", "summary": "Provide applicable collection notice; assess express consent when pixels expose sensitive information.", "appliesWhen": "Australian Privacy Act/APP obligations apply to the operator and pixel activity.", "sourceRefs": [ { "sourceId": "SRC-AU-OAIC", "locator": "Privacy obligations; APP 5 notification; sensitive information" } ], "discoverySourceIds": [], "featureIds": [ "FEAT-DOCUMENTS", "FEAT-FORMS", "FEAT-SCOPE-GUARDS", "FEAT-DISCOVERY" ], "verificationIds": [ "VERIFY-AU-PIXELS" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": null, "caveats": "A privacy policy alone does not replace APP 5 notice; applicability/exemptions and actual data flows must be checked.", "implementationRefs": [ "packages/notabenda/src/discovery.ts", "packages/notabenda/src/scope-guards.ts", "packages/notabenda/src/setup.ts", "packages/notabenda/src/consent-engine.ts" ], "testRefs": [ "packages/notabenda/test/discovery.test.mjs", "docs/verification/discovery.md", "packages/notabenda/test/scope-guards.test.mjs" ], "implementationNote": "Explicit discovery supports limited origin/name inventory review. Australian applicability, appropriate notices, sensitive-data consent and unresolved sensitive-flow blocking remain unreviewed/incomplete. Explicit operator declarations now block affected registered optional work and generic grants. This support boundary does not implement the specialized legal workflow, determine applicability or complete legal review." }, { "id": "REQ-NZ-NOTICE", "jurisdiction": "NZ", "title": "Direct-collection privacy statement", "kind": "regulator-interpretation", "summary": "Explain collection, purposes, recipients, optionality/consequences, and access/correction rights.", "appliesWhen": "An agency collects personal information directly and the relevant Privacy Act principles apply.", "sourceRefs": [ { "sourceId": "SRC-NZ-STATEMENT", "locator": "Privacy statement contents and Principle 3" } ], "discoverySourceIds": [], "featureIds": [ "FEAT-DOCUMENTS", "FEAT-FORMS" ], "verificationIds": [ "VERIFY-NZ-NOTICE" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": null, "caveats": "Exceptions and context affect timing and particulars.", "implementationRefs": [ "packages/notabenda/src/config.ts", "packages/notabenda/src/documents.ts", "packages/notabenda/src/collection.ts", "packages/notabenda/src/content.ts" ], "testRefs": [ "packages/notabenda/test/config.test.mjs", "packages/notabenda/test/documents.test.mjs", "packages/notabenda/test/collection.test.mjs" ], "implementationNote": "Declared document disclosures and a selected-purpose inline notice now share the inventory and pinned privacy revision. Actual surface timing, field-level mapping, complete applicable particulars, factual accuracy and legal review remain host work; regional support is partial." }, { "id": "REQ-NZ-INDIRECT", "jurisdiction": "NZ", "title": "Indirect-collection notification", "kind": "regulator-interpretation", "summary": "Assess and provide applicable notification when information is collected from another source.", "appliesWhen": "An agency collects personal information indirectly under IPP3A, subject to exceptions.", "sourceRefs": [ { "sourceId": "SRC-NZ-IPP3A", "locator": "Requirements; reasonable steps; timing; collecting and holding agency; exceptions" }, { "sourceId": "SRC-NZ-IPP3A-PRINCIPLE", "locator": "Reproduced IPP3A(1)-(7), especially particulars and timing in (1)-(2)" } ], "discoverySourceIds": [], "featureIds": [ "FEAT-INVENTORY", "FEAT-DOCUMENTS", "FEAT-RIGHTS" ], "verificationIds": [ "VERIFY-NZ-INDIRECT" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": "2026-05-01", "timingNote": "IPP3A came into force on 1 May 2026.", "caveats": "Mechanism coverage only. No individual delivery/awareness or deadline workflow, sector-specific notice, lawful-collection determination or exception decision. Legal coverage remains unreviewed.", "implementationRefs": [ "packages/notabenda/src/indirect-collection.ts", "packages/notabenda/src/content.ts", "packages/notabenda/src/react-documents.ts", "packages/notabenda/src/astro/IndirectCollectionNotice.astro", "packages/notabenda/src/setup.ts", "examples/indirect-collection/build.mjs", "packages/notabenda/src/styles.css" ], "testRefs": [ "packages/notabenda/test/indirect-collection.test.mjs", "packages/notabenda/test/setup.test.mjs", "packages/notabenda/test/package.test.mjs", "packages/notabenda/test/astro-package.test.mjs", "site/test/host.test.mjs", "docs/verification/indirect-collection.md" ], "implementationNote": "Separate optional HTML/plain-text particulars pin an intact privacy release, full selected purpose facts, actual indirect category subsets and explicit source/recipient/law/access decisions. Advance/collected wording stays distinct. Hosts assess lawful collection, applicability, prior awareness, exceptions, timing and real notification; no delivery, consent or exemption evidence is created." }, { "id": "REQ-ZA-MARKETING", "jurisdiction": "ZA", "title": "Electronic direct-marketing permissions and objections", "kind": "regulator-interpretation", "summary": "Assess consent or the qualifying customer exception for unsolicited electronic marketing and provide applicable refusal mechanisms.", "appliesWhen": "POPIA section 69 applies to electronic direct marketing.", "sourceRefs": [ { "sourceId": "SRC-ZA-DM", "locator": "Section 3.5: section 69 electronic marketing" } ], "discoverySourceIds": [], "featureIds": [ "FEAT-FORMS", "FEAT-RECORDS", "FEAT-RIGHTS" ], "verificationIds": [ "VERIFY-ZA-MARKETING" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "planned", "effectiveFrom": null, "timingNote": null, "caveats": "Do not authorize sending on a generic cookie choice; customer exceptions and prescribed consent requirements need review.", "implementationRefs": [], "testRefs": [] }, { "id": "REQ-US-CA-CHOICES", "jurisdiction": "US-CA", "title": "Sale/sharing opt-out and applicable privacy notices", "kind": "regulator-interpretation", "summary": "Provide applicable notice and methods to opt out of sale/sharing; account for sensitive-information rights where applicable.", "appliesWhen": "The business and processing fall within CCPA/CPRA scope.", "sourceRefs": [ { "sourceId": "SRC-US-CA", "locator": "Consumer rights; business obligations" }, { "sourceId": "SRC-US-CA-REGS-2026", "locator": "Section 7026: methods, status, cessation, downstream notifications and re-opt-in solicitation conditions" }, { "sourceId": "SRC-US-CA-AG-RIGHTS", "locator": "Sections B–E: designated methods; account creation; verification distinctions" } ], "discoverySourceIds": [ "SRC-IUB-US" ], "featureIds": [ "FEAT-US-CHOICES", "FEAT-DOCUMENTS", "FEAT-RIGHTS" ], "verificationIds": [ "VERIFY-US-CA-CHOICES" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": null, "caveats": "Thresholds, exceptions, definitions, and sensitive-information limits require detailed pack review; no blanket US opt-in rule.", "implementationRefs": [ "packages/notabenda-cf/src/processing.ts", "packages/notabenda/src/rights-policy.ts", "packages/notabenda/src/rights.ts" ], "testRefs": [ "packages/notabenda/test/processing.test.mjs", "docs/verification/processing-choices-browser.md", "packages/notabenda/test/rights.test.mjs" ], "implementationNote": "Separate opt-out action and retained restrictions with exact privacy/wording references are implemented. This supplies one technical method and record only. Alternative methods, legal applicability, sensitive-information handling, associated identity contexts, cessation/propagation deadlines, notices and re-opt-in conditions remain unreviewed and incomplete." }, { "id": "REQ-US-CA-GPC", "jurisdiction": "US-CA", "title": "Honor applicable opt-out preference signals", "kind": "regulator-interpretation", "summary": "Process qualifying browser signals as applicable sale/sharing opt-outs.", "appliesWhen": "CCPA/CPRA applies and a qualifying preference signal is received.", "sourceRefs": [ { "sourceId": "SRC-US-CA", "locator": "Opt-out preference signals" }, { "sourceId": "SRC-US-CA-REGS-2026", "locator": "§7025(b)–(c), pp. 44–48" } ], "discoverySourceIds": [ "SRC-IUB-US" ], "featureIds": [ "FEAT-US-CHOICES", "FEAT-REGIONS" ], "verificationIds": [ "VERIFY-US-CA-GPC" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": null, "caveats": "Signal scope, conflict handling, and frictionless-mode details need regulation-level review.", "implementationRefs": [ "packages/notabenda/src/privacy-signals.ts" ], "testRefs": [ "packages/notabenda/test/privacy-signals.test.mjs" ], "implementationNote": "Declared browser/runtime restrictions, generic-accept precedence and lifecycle aborts are implemented. Known account/profile and downstream processing propagation, durable opt-out retention, applicability and legal review remain host work; no complete jurisdiction pack is claimed." }, { "id": "REQ-US-CA-UI", "jurisdiction": "US-CA", "title": "Symmetrical and understandable privacy choices", "kind": "regulator-interpretation", "summary": "Avoid interfaces that subvert or impair privacy choices.", "appliesWhen": "CCPA request/consent interface requirements apply.", "sourceRefs": [ { "sourceId": "SRC-US-CA-UI", "locator": "Clear and balanced choices; symmetrical methods" } ], "discoverySourceIds": [ "SRC-IUB-US" ], "featureIds": [ "FEAT-CONTROLS", "FEAT-US-CHOICES" ], "verificationIds": [ "VERIFY-US-CA-UI" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "planned", "effectiveFrom": null, "timingNote": null, "caveats": "Legal analysis is contextual; automated contrast checks alone are insufficient.", "implementationRefs": [], "testRefs": [] }, { "id": "REQ-US-CO-GPC", "jurisdiction": "US-CO", "title": "Recognized universal opt-out mechanism", "kind": "regulator-interpretation", "summary": "Honor recognized mechanisms for sale/targeted-advertising opt-outs and explain their processing.", "appliesWhen": "Colorado Privacy Act applies and the consumer uses a recognized mechanism.", "sourceRefs": [ { "sourceId": "SRC-US-CO", "locator": "Business obligations; GPC; privacy-policy explanation" } ], "discoverySourceIds": [ "SRC-IUB-US" ], "featureIds": [ "FEAT-US-CHOICES", "FEAT-REGIONS", "FEAT-DOCUMENTS" ], "verificationIds": [ "VERIFY-US-CO-GPC" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": "GPC obligation identified from 1 July 2024.", "caveats": "Recheck recognized mechanisms and applicability thresholds; this source is not a survey of all Colorado amendments.", "implementationRefs": [ "packages/notabenda/src/privacy-signals.ts" ], "testRefs": [ "packages/notabenda/test/privacy-signals.test.mjs" ], "implementationNote": "Declared browser/runtime restrictions, generic-accept precedence and lifecycle aborts are implemented. Known account/profile and downstream processing propagation, durable opt-out retention, applicability and legal review remain host work; no complete jurisdiction pack is claimed." }, { "id": "REQ-US-CT-GPC", "jurisdiction": "US-CT", "title": "Preference signals override conflicting prior choices", "kind": "regulator-interpretation", "summary": "Honor qualifying signals, including when they conflict with an earlier privacy choice.", "appliesWhen": "The controller is subject to CTDPA and receives a qualifying consumer signal.", "sourceRefs": [ { "sourceId": "SRC-US-CT", "locator": "Opt-out preference signal FAQs" } ], "discoverySourceIds": [ "SRC-IUB-US" ], "featureIds": [ "FEAT-US-CHOICES", "FEAT-REGIONS", "FEAT-CHOICES" ], "verificationIds": [ "VERIFY-US-CT-GPC" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": "Signal obligations identified from 1 January 2025.", "caveats": "Residency determination and other statutory criteria require review; do not infer applicability solely from browser language.", "implementationRefs": [ "packages/notabenda/src/privacy-signals.ts" ], "testRefs": [ "packages/notabenda/test/privacy-signals.test.mjs" ], "implementationNote": "Declared browser/runtime restrictions, generic-accept precedence and lifecycle aborts are implemented. Known account/profile and downstream processing propagation, durable opt-out retention, applicability and legal review remain host work; no complete jurisdiction pack is claimed." }, { "id": "REQ-US-VA-RIGHTS", "jurisdiction": "US-VA", "title": "Sensitive-data permission and rights appeals", "kind": "regulator-interpretation", "summary": "Support applicable sensitive-data consent and a route to appeal a rights decision.", "appliesWhen": "Virginia VCDPA applies to the operator and activity.", "sourceRefs": [ { "sourceId": "SRC-US-VA", "locator": "Sensitive data; appeal process" }, { "sourceId": "SRC-US-VA-CODE", "locator": "§59.1-571 definitions; §59.1-578(A)(5); §59.1-577(C)" } ], "discoverySourceIds": [ "SRC-IUB-US" ], "featureIds": [ "FEAT-FORMS", "FEAT-RIGHTS", "FEAT-SCOPE-GUARDS" ], "verificationIds": [ "VERIFY-US-VA-RIGHTS" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": null, "caveats": "The initial toolkit provides hooks/entry points; it does not adjudicate appeals or fully implement VCDPA workflows.", "implementationRefs": [ "packages/notabenda/src/scope-guards.ts", "packages/notabenda/src/setup.ts", "packages/notabenda/src/rights-policy.ts", "packages/notabenda/src/rights.ts", "packages/notabenda/src/consent-engine.ts" ], "testRefs": [ "packages/notabenda/test/scope-guards.test.mjs", "packages/notabenda/test/rights.test.mjs" ], "implementationNote": " Explicit operator declarations now block affected registered optional work and generic grants. This support boundary does not implement the specialized legal workflow, determine applicability or complete legal review. A configurable appeal entry point now exists; it does not implement the appeal decision, timing or escalation workflow." }, { "id": "REQ-US-COPPA-SCOPE", "jurisdiction": "US-FED", "title": "Child-related processing requires a separate supported flow", "kind": "regulator-interpretation", "summary": "Covered child-data flows may require verifiable parental consent, including separate third-party-disclosure consent.", "appliesWhen": "COPPA applies to a child-directed service or relevant actual-knowledge context.", "sourceRefs": [ { "sourceId": "SRC-US-COPPA", "locator": "Separate parental consent; retention" }, { "sourceId": "SRC-US-COPPA-RULE", "locator": "Compliance date and amended rule" } ], "discoverySourceIds": [], "featureIds": [ "FEAT-SCOPE-GUARDS", "FEAT-REGIONS" ], "verificationIds": [ "VERIFY-US-COPPA-SCOPE" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": "Most amended-rule provisions had a compliance deadline of 22 April 2026; safe-harbor provisions differ.", "caveats": "Do not collect birth dates or identity documents merely to activate a generic banner; no COPPA support claim.", "implementationRefs": [ "packages/notabenda/src/scope-guards.ts", "packages/notabenda/src/setup.ts", "packages/notabenda/src/consent-engine.ts" ], "testRefs": [ "packages/notabenda/test/scope-guards.test.mjs" ], "implementationNote": " Explicit operator declarations now block affected registered optional work and generic grants. This support boundary does not implement the specialized legal workflow, determine applicability or complete legal review." }, { "id": "REQ-TR-BASIS", "jurisdiction": "TR", "title": "Separate legal basis and disclosure from explicit consent", "kind": "regulator-interpretation", "summary": "Identify an applicable processing condition; do not substitute disclosure or a blanket checkbox for required explicit consent.", "appliesWhen": "Türkiye Law 6698 applies to the declared personal-data processing.", "sourceRefs": [ { "sourceId": "SRC-TR-KVKK", "locator": "Conditions for processing personal data" }, { "sourceId": "SRC-TR-COOKIES", "locator": "Cookie-processing decision summary" } ], "discoverySourceIds": [], "featureIds": [ "FEAT-INVENTORY", "FEAT-FORMS", "FEAT-REGIONS" ], "verificationIds": [ "VERIFY-TR-BASIS" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "planned", "effectiveFrom": null, "timingNote": null, "caveats": "Cookie and cross-border-transfer details need current Turkish-law review; the cited decision is case-specific.", "implementationRefs": [], "testRefs": [] }, { "id": "REQ-EU-TERMS", "jurisdiction": "EU-EEA", "title": "Consumer terms need an appropriate fairness profile", "kind": "official-explanation", "summary": "Use applicable consumer-contract protections when composing terms.", "appliesWhen": "The operator contracts with consumers under applicable EU/national consumer law.", "sourceRefs": [ { "sourceId": "SRC-EU-CONTRACTS", "locator": "Unfair contract terms directive overview" } ], "discoverySourceIds": [ "SRC-IUB-OVERVIEW" ], "featureIds": [ "FEAT-TERMS", "FEAT-INVENTORY" ], "verificationIds": [ "VERIFY-EU-TERMS" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": null, "caveats": "No generic terms pack establishes enforceability; sector and national review remain necessary.", "implementationRefs": [ "packages/notabenda/src/config.ts", "packages/notabenda/src/documents.ts" ], "testRefs": [ "packages/notabenda/test/config.test.mjs" ], "implementationNote": "Supplied structured terms, audience/service classification and review checks exist. Version-bound acceptance/storage mechanics now exist under REQ-PRODUCT-TERMS-ACCEPTANCE. Consumer fairness, paid checkout, national applicability and enforceability review remain unimplemented." }, { "id": "REQ-EU-WITHDRAWAL", "jurisdiction": "EU-EEA", "title": "Online contract withdrawal function", "kind": "law", "summary": "Provide the applicable online withdrawal function, confirmation flow, and durable acknowledgment.", "appliesWhen": "A covered online distance contract carries a withdrawal right under the relevant national implementation.", "sourceRefs": [ { "sourceId": "SRC-EU-WITHDRAWAL", "locator": "Article 2 inserting Article 11a; Article 3 application date" } ], "discoverySourceIds": [ "SRC-IUB-WITHDRAWAL" ], "featureIds": [ "FEAT-CONTRACT-ACTIONS", "FEAT-TERMS", "FEAT-RECORDS" ], "verificationIds": [ "VERIFY-EU-WITHDRAWAL" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": "Member States were to apply implementing measures from 19 June 2026.", "caveats": "A directive needs national implementation checks; exceptions and the withdrawal window depend on the contract. Privacy withdrawal is a separate action.", "implementationRefs": [ "packages/notabenda/src/contract-action-policy.ts", "packages/notabenda/src/contract-action.ts", "packages/notabenda/src/content.ts", "packages/notabenda-cf/src/contract-action-policy.ts", "packages/notabenda-cf/src/contracts.ts" ], "testRefs": [ "packages/notabenda/test/contract-action.test.mjs", "packages/notabenda-cf/test/contracts.test.mjs", "docs/verification/contract-actions.md" ], "implementationNote": "Initial shared declaration/form/receipt and host dispatch mechanics only. Applicability, national/sector exceptions, prompt real delivery, original contract matching and fulfillment remain separate; no production regional pack is claimed." }, { "id": "REQ-DE-CANCEL", "jurisdiction": "DE", "title": "Cancellation button for qualifying continuing consumer contracts", "kind": "law", "summary": "Provide the prescribed cancellation entry, confirmation flow, and electronic confirmation for covered contracts.", "appliesWhen": "BGB section 312k applies to an online continuing paid consumer contract and no stated exclusion applies.", "sourceRefs": [ { "sourceId": "SRC-DE-CANCEL", "locator": "Section 312k(1)–(6): direct confirmation page, timing, savable declaration and electronic confirmation" } ], "discoverySourceIds": [ "SRC-IUB-TERMS" ], "featureIds": [ "FEAT-CONTRACT-ACTIONS", "FEAT-TERMS", "FEAT-RECORDS" ], "verificationIds": [ "VERIFY-DE-CANCEL" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": null, "caveats": "Review statutory exclusions and accessibility requirements; this is separate from withdrawal during a cooling-off period.", "implementationRefs": [ "packages/notabenda/src/contract-action-policy.ts", "packages/notabenda/src/contract-action.ts", "packages/notabenda/src/content.ts", "packages/notabenda-cf/src/contract-action-policy.ts", "packages/notabenda-cf/src/contracts.ts" ], "testRefs": [ "packages/notabenda/test/contract-action.test.mjs", "packages/notabenda-cf/test/contracts.test.mjs", "docs/verification/contract-actions.md" ], "implementationNote": "Initial shared declaration/form/receipt and host dispatch mechanics only. Applicability, national/sector exceptions, prompt real delivery, original contract matching and fulfillment remain separate; no production regional pack is claimed." }, { "id": "REQ-DE-WITHDRAWAL", "jurisdiction": "DE", "title": "German electronic withdrawal function", "kind": "law", "summary": "Support the section 356a withdrawal function for covered online distance contracts.", "appliesWhen": "The contract falls within the current BGB withdrawal-function requirements.", "sourceRefs": [ { "sourceId": "SRC-DE-WITHDRAW", "locator": "Section 356a" } ], "discoverySourceIds": [ "SRC-IUB-WITHDRAWAL" ], "featureIds": [ "FEAT-CONTRACT-ACTIONS", "FEAT-TERMS" ], "verificationIds": [ "VERIFY-DE-WITHDRAWAL" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": "Current consolidated section read on 18 October 2026; implementation transition and sector scope remain review tasks.", "caveats": "Pack review must inspect the current consolidated section and related provisions before production support.", "implementationRefs": [ "packages/notabenda/src/contract-action-policy.ts", "packages/notabenda/src/contract-action.ts", "packages/notabenda/src/content.ts", "packages/notabenda-cf/src/contract-action-policy.ts", "packages/notabenda-cf/src/contracts.ts" ], "testRefs": [ "packages/notabenda/test/contract-action.test.mjs", "packages/notabenda-cf/test/contracts.test.mjs", "docs/verification/contract-actions.md" ], "implementationNote": "Initial shared declaration/form/receipt and host dispatch mechanics only. Applicability, national/sector exceptions, prompt real delivery, original contract matching and fulfillment remain separate; no production regional pack is claimed." }, { "id": "REQ-BR-CONTRACT", "jurisdiction": "BR", "title": "Consumer right of regret for qualifying distance contracts", "kind": "law", "summary": "Represent the applicable seven-day right of regret and a usable exercise route.", "appliesWhen": "Consumer Defence Code article 49 applies to the transaction.", "sourceRefs": [ { "sourceId": "SRC-BR-CONSUMER", "locator": "Article 49" }, { "sourceId": "SRC-BR-ECOMMERCE", "locator": "Article 5(1), (3), (4): same-tool route, financial notification and immediate acknowledgement" } ], "discoverySourceIds": [ "SRC-IUB-TERMS" ], "featureIds": [ "FEAT-TERMS", "FEAT-CONTRACT-ACTIONS" ], "verificationIds": [ "VERIFY-BR-CONTRACT" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": null, "caveats": "Trigger, start date, exceptions, refunds, and sector rules require review; do not apply a universal EU window.", "implementationRefs": [ "packages/notabenda/src/contract-action-policy.ts", "packages/notabenda/src/contract-action.ts", "packages/notabenda/src/content.ts", "packages/notabenda-cf/src/contract-action-policy.ts", "packages/notabenda-cf/src/contracts.ts" ], "testRefs": [ "packages/notabenda/test/contract-action.test.mjs", "packages/notabenda-cf/test/contracts.test.mjs", "docs/verification/contract-actions.md" ], "implementationNote": "Initial shared declaration/form/receipt and host dispatch mechanics only. Applicability, national/sector exceptions, prompt real delivery, original contract matching and fulfillment remain separate; no production regional pack is claimed." }, { "id": "REQ-GOOGLE-MODE", "jurisdiction": "PLATFORM", "title": "Consent Mode does not itself block all traffic", "kind": "platform-policy", "summary": "Distinguish Basic tag blocking from Advanced mode's possible cookieless pings.", "appliesWhen": "The site opts into the Google adapter.", "sourceRefs": [ { "sourceId": "SRC-GOOGLE-CONSENT", "locator": "Basic and advanced consent mode; consent types" }, { "sourceId": "SRC-GOOGLE-CONSENT-SETUP", "locator": "Default consent before measurement commands; gtag.js and GTM APIs" }, { "sourceId": "SRC-GOOGLE-PRIVACY-CONTROLS", "locator": "Turn off Google Analytics; turn off default page view measurement" } ], "discoverySourceIds": [], "featureIds": [ "FEAT-GOOGLE", "FEAT-ENFORCEMENT" ], "verificationIds": [ "VERIFY-GOOGLE-MODE" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": null, "caveats": "Google platform behavior does not establish the legal validity of a processing purpose. All-declared-purpose gating is conservative. GA4 disable flags are not a universal Ads kill switch; already loaded code and denied updates may still send traffic until a full document reset.", "implementationRefs": [ "packages/notabenda/src/google-basic.ts", "packages/notabenda/src/google-basic-policy.ts", "packages/notabenda/src/config.ts", "packages/notabenda/src/types.ts", "examples/google-basic/build.mjs", "examples/google-basic/client.mjs" ], "testRefs": [ "packages/notabenda/test/google-basic.test.mjs", "packages/notabenda/test/package.test.mjs", "site/test/google-basic.test.mjs", "docs/verification/google-basic.md" ], "implementationNote": "Optional Basic adapter validates explicit product-specific four-signal mappings, binds IDs/mappings into material scope, and gates a single owned Google service on effective permission, receipts and processing restrictions. Browser loader interception verifies initial silence/ordering; late/reentrant loads and synchronous terminal withdrawal are covered. Public local simulator and docs distinguish adapter tests from real vendor/browser acceptance. Post-load network silence, GTM/TCF/certification, connected-account settings and wider platform acceptance are not established." }, { "id": "REQ-GOOGLE-CMP", "jurisdiction": "PLATFORM", "title": "Publisher certification is a distinct requirement", "kind": "platform-policy", "summary": "A Consent Mode adapter is not a certified TCF CMP.", "appliesWhen": "Serving personalized ads in Google's covered publisher-product regions.", "sourceRefs": [ { "sourceId": "SRC-GOOGLE-CMP", "locator": "Certified CMP and TCF requirements" }, { "sourceId": "SRC-IAB-TCF", "locator": "Current TCF version and participation" } ], "discoverySourceIds": [], "featureIds": [ "FEAT-AD-CMP" ], "verificationIds": [ "VERIFY-GOOGLE-CMP" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "planned", "effectiveFrom": null, "timingNote": null, "caveats": "Recheck platform policies and current specifications before implementing the deferred CMP project.", "implementationRefs": [], "testRefs": [] }, { "id": "REQ-PRODUCT-A11Y", "jurisdiction": "PRODUCT", "title": "Accessible controls across themes", "kind": "product-standard", "summary": "Use WCAG 2.2 AA as the product's accessibility target.", "appliesWhen": "Any built-in widget or integration example is shipped.", "sourceRefs": [ { "sourceId": "SRC-WCAG", "locator": "Keyboard, contrast, focus, labels, reflow, target size" } ], "discoverySourceIds": [ "SRC-LINEAR-DESIGN-2026" ], "featureIds": [ "FEAT-CONTROLS", "FEAT-DEPLOYMENT" ], "verificationIds": [ "VERIFY-PRODUCT-A11Y" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": null, "caveats": "This is an engineering standard, not a claim of blanket legal compliance or certification.", "implementationRefs": [ "packages/notabenda/src/documents.ts", "packages/notabenda/src/styles.css", "packages/notabenda/src/controls.ts", "docs/DESIGN.md", "examples/static/choices-page.mjs", "examples/static/choices-page.css", "site/examples-page.mjs", "site/style.css", "examples/static/example-design.mjs", "examples/static/example-pages.css", "packages/notabenda-cf/src/admin-style.ts", "packages/notabenda-cf/src/presentation.ts", "site/admin-presentation.mjs", "site/build.mjs", "packages/notabenda/src/services.css", "packages/notabenda-cf/src/render.ts", "packages/notabenda-cf/src/setup.ts", "site/demo-admin.css", "site/syntax.mjs", "examples/static/example-theme.css", "examples/discovery/style.css", "examples/form-permissions/style.css", "examples/contract-actions/style.css", "scripts/build-controls-layout.mjs" ], "testRefs": [ "packages/notabenda/test/documents.test.mjs", "docs/verification/consent-browser.md", "docs/verification/terms-browser.md", "docs/verification/website-browser.md", "docs/verification/design-pass.md", "site/test/host.test.mjs", "docs/verification/ux-review.md", "site/test/guide-navigation.test.mjs", "packages/notabenda/test/controls.test.mjs", "packages/notabenda/test/consent-delivery.test.mjs", "docs/verification/consent-focus.md", "packages/notabenda/test/controls-layout.test.mjs", "docs/verification/controls-layout.md" ], "implementationNote": "Document semantics and initial native-dialog focus/Escape checks are implemented. Full WCAG, screen-reader, contrast, zoom and platform audit remains pending. Native entry relationships, separately named purpose controls and focus recovery for disappearing retry/notice controls are covered through both consent factories; broad accessibility acceptance remains pending. Shared defaults now use neutral surfaces, restrained navigation, compact operator headings/record rows, consistent small corners and deliberate light/dark permission controls. Real browser checks retain equal accept/reject actions, mobile setup targets and no horizontal overflow on inspected families. Full accessibility certification and untested platforms remain open. Long headings/Close labels now wrap, action columns adapt to text size, and logical side placement mirrors RTL. Whole-dialog scrolling is the safe fallback; measured resize observation retains fixed chrome only with a useful text-relative body viewport, preserves draft/focus and disconnects on teardown. Repeatable local fixtures and initial Chromium width/short-screen/large-text/RTL/no-observer checks extend evidence; actual browser zoom and broader platform/assistive-technology acceptance remain open." }, { "id": "REQ-PRODUCT-MOBILE", "jurisdiction": "PRODUCT", "title": "Visible permission request without intrusive mobile takeover", "kind": "product-standard", "summary": "Default to a compact bottom notice and user-opened drawer, preserving clear choices and page usability.", "appliesWhen": "Any built-in mobile consent surface is shipped.", "sourceRefs": [], "discoverySourceIds": [ "SRC-LINEAR-DESIGN-2026" ], "featureIds": [ "FEAT-CONTROLS", "FEAT-DEPLOYMENT" ], "verificationIds": [ "VERIFY-PRODUCT-MOBILE" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": null, "caveats": "Voluntary project UX requirement, not a claim that a law mandates drawers. Never clip or hide required choices to meet a height target.", "implementationRefs": [ "packages/notabenda/src/controls.ts", "packages/notabenda/src/styles.css", "docs/DESIGN.md", "examples/static/choices-page.mjs", "examples/static/choices-page.css", "site/examples-page.mjs", "site/style.css", "examples/static/example-design.mjs", "examples/static/example-pages.css", "packages/notabenda-cf/src/admin-style.ts", "packages/notabenda-cf/src/presentation.ts", "site/admin-presentation.mjs", "site/build.mjs", "packages/notabenda/src/services.css", "packages/notabenda-cf/src/render.ts", "packages/notabenda-cf/src/setup.ts", "site/demo-admin.css", "site/syntax.mjs", "examples/static/example-theme.css", "examples/discovery/style.css", "examples/form-permissions/style.css", "examples/contract-actions/style.css", "scripts/build-controls-layout.mjs" ], "testRefs": [ "docs/verification/consent-browser.md", "docs/verification/terms-browser.md", "docs/verification/website-browser.md", "docs/verification/design-pass.md", "docs/verification/ux-review.md", "site/test/guide-navigation.test.mjs", "packages/notabenda/test/controls.test.mjs", "packages/notabenda/test/consent-delivery.test.mjs", "docs/verification/consent-focus.md", "packages/notabenda/test/controls-layout.test.mjs", "docs/verification/controls-layout.md" ], "implementationNote": "Nonmodal initial notice and deliberately opened native drawer implemented. Initial Chromium phone-width checks recorded; full platform, zoom, assistive technology and device matrix remains pending. Native entry relationships, separately named purpose controls and focus recovery for disappearing retry/notice controls are covered through both consent factories; broad accessibility acceptance remains pending. Shared defaults now use neutral surfaces, restrained navigation, compact operator headings/record rows, consistent small corners and deliberate light/dark permission controls. Real browser checks retain equal accept/reject actions, mobile setup targets and no horizontal overflow on inspected families. Full accessibility certification and untested platforms remain open. Long headings/Close labels now wrap, action columns adapt to text size, and logical side placement mirrors RTL. Whole-dialog scrolling is the safe fallback; measured resize observation retains fixed chrome only with a useful text-relative body viewport, preserves draft/focus and disconnects on teardown. Repeatable local fixtures and initial Chromium width/short-screen/large-text/RTL/no-observer checks extend evidence; actual browser zoom and broader platform/assistive-technology acceptance remain open." }, { "id": "REQ-PRODUCT-CONFIG", "jurisdiction": "PRODUCT", "title": "Typed, validated site facts and public projection", "kind": "product-standard", "summary": "Validate declared site facts, stable references, and public output boundaries.", "appliesWhen": "The corresponding package feature is used.", "sourceRefs": [], "discoverySourceIds": [], "featureIds": [ "FEAT-INVENTORY", "FEAT-DEPLOYMENT" ], "verificationIds": [ "VERIFY-PRODUCT-CONFIG" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "Implementation checks establish the documented software behavior, not legal validity, completeness of operator facts, or production jurisdiction support.", "implementationRefs": [ "packages/notabenda/src/config.ts", "packages/notabenda/src/types.ts", "packages/notabenda/src/consent-runtime-config.ts", "packages/notabenda/src/consent-compile.ts", "packages/notabenda/src/setup-purpose.ts", "packages/notabenda/src/setup-purpose-ui.ts", "packages/notabenda/src/setup-purpose-cli.ts" ], "testRefs": [ "packages/notabenda/test/config.test.mjs", "packages/notabenda/test/consent-runtime.test.mjs", "packages/notabenda/test/setup-purpose.test.mjs" ] }, { "id": "REQ-PRODUCT-DOCUMENTS", "jurisdiction": "PRODUCT", "title": "Static privacy, cookie, and supplied terms pages", "kind": "product-standard", "summary": "Render versioned, safely structured documents with visible drafts and production review checks.", "appliesWhen": "The corresponding package feature is used.", "sourceRefs": [], "discoverySourceIds": [], "featureIds": [ "FEAT-DOCUMENTS", "FEAT-TERMS" ], "verificationIds": [ "VERIFY-PRODUCT-DOCUMENTS" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "Implementation checks establish the documented software behavior, not legal validity, completeness of operator facts, or production jurisdiction support.", "implementationRefs": [ "packages/notabenda/src/documents.ts", "packages/notabenda/src/config.ts", "packages/notabenda/src/cli.ts", "packages/notabenda/src/styles.css" ], "testRefs": [ "packages/notabenda/test/documents.test.mjs", "packages/notabenda/test/config.test.mjs", "packages/notabenda/test/cli.test.mjs" ] }, { "id": "REQ-PRODUCT-SAFE-CONTENT", "jurisdiction": "PRODUCT", "title": "Safe content, links, routes, and output writing", "kind": "product-standard", "summary": "Escape supplied text and reject unsafe links, inconsistent fields, traversal routes, and symbolic-link output destinations.", "appliesWhen": "The corresponding package feature is used.", "sourceRefs": [], "discoverySourceIds": [], "featureIds": [ "FEAT-DOCUMENTS", "FEAT-DEPLOYMENT" ], "verificationIds": [ "VERIFY-PRODUCT-SAFE-CONTENT" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "Implementation checks establish the documented software behavior, not legal validity, completeness of operator facts, or production jurisdiction support.", "implementationRefs": [ "packages/notabenda/src/config.ts", "packages/notabenda/src/documents.ts", "packages/notabenda/src/files.ts" ], "testRefs": [ "packages/notabenda/test/config.test.mjs", "packages/notabenda/test/documents.test.mjs", "packages/notabenda/test/content.test.mjs", "packages/notabenda/test/cli.test.mjs" ] }, { "id": "REQ-PRODUCT-ARTIFACTS", "jurisdiction": "PRODUCT", "title": "Portable content-addressed legal releases", "kind": "product-standard", "summary": "Retain deterministic public configuration, exact HTML, and structured content with versioned hashes.", "appliesWhen": "The corresponding package feature is used.", "sourceRefs": [], "discoverySourceIds": [], "featureIds": [ "FEAT-DOCUMENTS", "FEAT-RECORDS" ], "verificationIds": [ "VERIFY-PRODUCT-ARTIFACTS" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "Implementation checks establish the documented software behavior, not legal validity, completeness of operator facts, or production jurisdiction support.", "implementationRefs": [ "packages/notabenda/src/content.ts", "packages/notabenda/src/catalog-release.ts" ], "testRefs": [ "packages/notabenda/test/content.test.mjs", "packages/notabenda/test/cli.test.mjs", "packages/notabenda/test/history-integration.test.mjs", "packages/notabenda/test/catalog-release.test.mjs", "docs/verification/catalog-release.md", "site/test/host.test.mjs" ] }, { "id": "REQ-PRODUCT-PACKAGE", "jurisdiction": "PRODUCT", "title": "Installable npm API, CLI, types, styles, and Apache license", "kind": "product-standard", "summary": "Pack a dependency-free browser/SSR API and separate build-time tools without publishing.", "appliesWhen": "The corresponding package feature is used.", "sourceRefs": [], "discoverySourceIds": [], "featureIds": [ "FEAT-DEPLOYMENT" ], "verificationIds": [ "VERIFY-PRODUCT-PACKAGE" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "Implementation checks establish the documented software behavior, not legal validity, completeness of operator facts, or production jurisdiction support.", "implementationRefs": [ "packages/notabenda/src/cli.ts", "packages/notabenda/package.json", "packages/notabenda/src/headless.ts", "packages/notabenda/scripts/consent-styles.mjs", "scripts/measure-bundles.mjs" ], "testRefs": [ "packages/notabenda/test/package.test.mjs", "packages/notabenda/test/cli.test.mjs", "packages/notabenda/test/delivery.test.mjs", "site/test/delivery.test.mjs" ] }, { "id": "REQ-PRODUCT-CF-ADMIN", "jurisdiction": "PRODUCT", "title": "Scoped backoffice with host-owned authorization", "kind": "product-standard", "summary": "Require host authorization and present bounded, searchable stored evidence without executing payloads.", "appliesWhen": "The corresponding package feature is used.", "sourceRefs": [], "discoverySourceIds": [], "featureIds": [ "FEAT-BACKOFFICE" ], "verificationIds": [ "VERIFY-PRODUCT-CF-ADMIN" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "Implementation checks establish the documented software behavior, not legal validity, completeness of operator facts, or production jurisdiction support.", "implementationRefs": [ "packages/notabenda-cf/src/worker.ts", "packages/notabenda-cf/src/store.ts", "packages/notabenda-cf/src/types.ts", "packages/notabenda-cf/src/export.ts", "packages/notabenda-cf/src/admin-style.ts", "packages/notabenda-cf/src/presentation.ts", "site/admin-presentation.mjs", "packages/notabenda-cf/src/setup.ts", "packages/notabenda/src/setup-ui.ts", "packages/notabenda-cf/src/order-render.ts", "packages/notabenda-cf/src/order-admin-style.ts" ], "testRefs": [ "packages/notabenda-cf/test/admin.test.mjs", "packages/notabenda-cf/test/export.test.mjs", "packages/notabenda-cf/test/orders.test.mjs" ] }, { "id": "REQ-PRODUCT-CF-HISTORY", "jurisdiction": "PRODUCT", "title": "Immutable release archive and readable diffs", "kind": "product-standard", "summary": "Archive exact legal-document releases transactionally and compare versions within an authorized site/store.", "appliesWhen": "The corresponding package feature is used.", "sourceRefs": [], "discoverySourceIds": [], "featureIds": [ "FEAT-DOCUMENT-HISTORY", "FEAT-RECORDS" ], "verificationIds": [ "VERIFY-PRODUCT-CF-HISTORY" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "Implementation checks establish the documented software behavior, not legal validity, completeness of operator facts, or production jurisdiction support.", "implementationRefs": [ "packages/notabenda-cf/src/history.ts", "packages/notabenda/src/content.ts", "packages/notabenda/src/catalog-release.ts", "packages/notabenda/src/catalog-release-policy.ts", "packages/notabenda-cf/src/catalog-release-policy.ts", "packages/notabenda-cf/src/catalog-render.ts", "examples/catalog-releases/build.mjs" ], "testRefs": [ "packages/notabenda-cf/test/admin.test.mjs", "packages/notabenda/test/history-integration.test.mjs", "packages/notabenda/test/catalog-release.test.mjs", "docs/verification/catalog-release.md", "site/test/host.test.mjs" ] }, { "id": "REQ-PRODUCT-CONSENT-RUNTIME", "jurisdiction": "PRODUCT", "title": "Conservative local choice state and cooperative service lifecycle", "kind": "product-standard", "summary": "Keep registered optional work blocked until explicit current local permission, retire revoked starts, and keep prompt dismissal separate from permission.", "appliesWhen": "The local consent controller is used with cooperative service adapters.", "sourceRefs": [], "discoverySourceIds": [], "featureIds": [ "FEAT-CHOICES", "FEAT-ENFORCEMENT" ], "verificationIds": [ "VERIFY-PRODUCT-CONSENT-RUNTIME" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "Local-only state is untrusted and is not durable consent evidence, automatic arbitrary-script blocking, or a supported regional rule pack. Browser suspension and host adapter behavior bound enforcement.", "implementationRefs": [ "packages/notabenda/src/consent.ts", "packages/notabenda/src/consent-engine.ts", "packages/notabenda/src/consent-runtime-config.ts", "packages/notabenda/src/consent-runtime.ts" ], "testRefs": [ "packages/notabenda/test/consent.test.mjs", "packages/notabenda/test/consent-runtime.test.mjs", "packages/notabenda/test/setup-purpose.test.mjs" ] }, { "id": "REQ-EU-ORDER-ACTION", "jurisdiction": "EU-EEA", "title": "Paid electronic orders need a clear payment action and required information", "kind": "primary-law", "summary": "For applicable paid electronic distance contracts, present the required pre-order information and an unambiguous payment-obligation action. Contract confirmation on a durable medium is a separate requirement.", "appliesWhen": "An electronic distance contract with a consumer creates a payment obligation within the Directive and applicable national implementing law.", "sourceRefs": [ { "sourceId": "SRC-EU-CRD-20260927", "locator": "Current Article 8(2): Article 6(1)(a), (e), (la), (o), (p); Article 8(7) confirmation" }, { "sourceId": "SRC-EU-ORDER-CONNY", "locator": "Paragraphs 44–56 and operative part: conditional payment obligations" }, { "sourceId": "SRC-EU-ORDER-FUHRMANN", "locator": "Indexed primary paragraphs 28/34: button wording itself; complete judgment retrieval remains open" } ], "discoverySourceIds": [], "featureIds": [ "FEAT-TERMS", "FEAT-CONTRACT-ACTIONS", "FEAT-PAID-ORDERS" ], "verificationIds": [ "VERIFY-EU-ORDER-ACTION" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": "Current consolidation reread on 19 October 2026. Conditional harmonised durability label is now included in the pre-order cross-references.", "caveats": "Selected frontend mechanics and reusable Cloudflare archives/local admission are implemented. Applicability, national/linguistic review, complete pre-contract information, early-performance/digital-content permissions, real payment/stock-system acceptance and durable-medium confirmation remain separate open work. A received request does not mean payment, fulfillment or contract confirmation.", "implementationRefs": [ "packages/notabenda/src/paid-order-policy.ts", "packages/notabenda/src/paid-order.ts", "packages/notabenda/src/paid-order-action.ts", "packages/notabenda/src/paid-order-ui.ts", "packages/notabenda/src/orders.css", "packages/notabenda-authoring/src/paid-order-build.ts", "packages/notabenda/src/react-documents.ts", "packages/notabenda/src/astro/PaidOrderReview.astro", "examples/orders/build.mjs", "examples/orders/client.mjs", "site/order-demo.mjs", "site/order-demo-admin.mjs", "site/order-admin.css", "packages/notabenda-cf/src/orders.ts", "packages/notabenda-cf/src/order-context.ts", "packages/notabenda-cf/src/order-blobs.ts", "packages/notabenda-cf/src/order-render.ts", "packages/notabenda-cf/src/order-admin-style.ts", "packages/notabenda-cf/src/order-review.ts", "packages/notabenda-cf/src/order-review-style.ts", "packages/notabenda-cf/src/order-policy.ts", "packages/notabenda-cf/src/lifecycle.ts", "packages/notabenda-cf/src/worker.ts", "packages/notabenda-cf/scripts/sync-order-policy.mjs", "site/order-demo-legacy.mjs", "site/order-demo-admin-legacy.mjs" ], "testRefs": [ "packages/notabenda/test/paid-order.test.mjs", "site/test/order-demo.test.mjs", "site/test/demo.test.mjs", "docs/verification/paid-orders.md", "packages/notabenda-cf/test/orders.test.mjs", "packages/notabenda-cf/test/orders-package.test.mjs", "scripts/check-order-archive-runtime.mjs" ] }, { "id": "REQ-PRODUCT-TERMS-ACCEPTANCE", "jurisdiction": "PRODUCT", "title": "Explicit version-bound terms agreement with acknowledged storage", "kind": "product-standard", "summary": "Use an unchecked statement tied to exact archived terms and UI wording; only report recorded agreement after a matching server receipt. Bind subject, operation, intended scope, and active offer through trusted host context.", "appliesWhen": "An adopter opts into the terms-acceptance controller and transactional Cloudflare helpers.", "sourceRefs": [], "discoverySourceIds": [], "featureIds": [ "FEAT-TERMS", "FEAT-FORMS", "FEAT-RECORDS", "FEAT-BACKOFFICE" ], "verificationIds": [ "VERIFY-PRODUCT-TERMS-ACCEPTANCE" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "Host supplies auth, CSRF protection, authorization, clock, retention, exact pinned-document serving and workflow completion. A stored assertion does not prove a human click, identity, enforceability, delivery or purchase completion. Preview requires independent server opt-in. Browser/platform accessibility remains partial.", "implementationRefs": [ "packages/notabenda/src/terms.ts", "packages/notabenda/src/content.ts", "packages/notabenda-cf/src/terms.ts", "packages/notabenda-cf/src/render.ts", "packages/notabenda/src/styles.css", "packages/notabenda-cf/src/admin-style.ts", "examples/static/terms-build.mjs", "examples/static/example-theme.css" ], "testRefs": [ "packages/notabenda/test/terms.test.mjs", "docs/verification/terms-browser.md", "packages/notabenda-cf/test/admin.test.mjs" ], "implementationNote": "Immutable offer registration, explicit activation, active-check plus acceptance write in one transaction, deterministic per-site/subject/request idempotence, conservative client acknowledgment and readable agreement context are implemented. No public ingestion/auth endpoint is supplied." }, { "id": "REQ-PRODUCT-CF-HOST", "jurisdiction": "PRODUCT", "title": "A separate fail-closed Cloudflare host integration", "kind": "product-standard", "summary": "Serve repository-built assets with a host-owned authorization boundary before protected assets and a fixed synthetic Durable Object workspace. Keep credentials outside packages, public outputs and version control.", "appliesWhen": "Using this repository website as an integration example for Workers Static Assets and a SQLite-backed Durable Object.", "sourceRefs": [], "discoverySourceIds": [ "SRC-CF-NO-TRANSFORM" ], "featureIds": [ "FEAT-DEPLOYMENT", "FEAT-BACKOFFICE" ], "verificationIds": [ "VERIFY-PRODUCT-CF-HOST" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": null, "caveats": "Host template only; not package authentication or a multi-tenant identity provider. Stores synthetic examples, not durable visitor consent receipts. Cloud deployment, production routing, backup/retention and full browser/platform review remain separate.", "implementationRefs": [ "site/host.mjs", "site/worker.mjs", "site/build.mjs", "site/website-notice.mjs", "site/website-notice.css", "site/navigation.mjs", "site/guide-pages.mjs", "site/examples-page.mjs", "site/style.css" ], "testRefs": [ "site/test/host.test.mjs", "docs/verification/website-browser.md", "scripts/check-site-runtime.mjs", "site/test/website-notice.test.mjs", "site/test/site-organization.test.mjs" ], "implementationNote": "Repository-built landing/docs/examples, host-only env-key Basic authentication over HTTPS (loopback exception), canonical route protection, bounded same-origin demo writes and fixed-scope storage are implemented. Wrangler bundles successfully; actual local SQLite receipts survive process restart. Cloud deployment and production operational checks remain incomplete. Host website disclosure is separate from sample documents, requires explicit operator/contact facts for the public build and explains real demo storage before recorded forms. Public asset cache directives now append no-transform; protected/session responses remain private/no-store and add no-transform. This preserves built/archived representations against intermediary rewriting without admitting external script origins. Actual edge/browser verification remains distinct from build checks. Public website entry points, examples and guides share task groups; a complete reference index retains all guide/report routes." }, { "id": "REQ-PRODUCT-CONSENT-EVIDENCE", "jurisdiction": "PRODUCT", "title": "Version-bound cookie-choice evidence and ordered receipt handling", "kind": "product-standard", "summary": "Register exact notice wording and archived privacy/cookie references, atomically order host-authorized browser reports, and preserve withdrawal under retries and stale snapshots. Browser delivery must be explicitly integrated before claiming recorded visitor choices.", "appliesWhen": "An operator opts into the optional cookie-choice evidence backend.", "sourceRefs": [], "discoverySourceIds": [ "SRC-EU-EDPB-CONSENT" ], "featureIds": [ "FEAT-RECORDS", "FEAT-CHOICES", "FEAT-BACKOFFICE" ], "verificationIds": [ "VERIFY-PRODUCT-CONSENT-EVIDENCE" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": null, "caveats": "Host supplies authorization, opaque stream resolution, CSRF/origin controls, quotas, retention/erasure and replay policy. Reports are not verified human actions or legal-validity proof. Production visitor capability lifecycle, cloud deployment, retention and full platform/accessibility review remain incomplete.", "implementationRefs": [ "packages/notabenda/src/consent-notice.ts", "packages/notabenda/src/content.ts", "packages/notabenda-cf/src/consent.ts", "packages/notabenda-cf/src/render.ts", "packages/notabenda/src/consent-evidence.ts", "packages/notabenda/src/consent.ts", "packages/notabenda/src/controls.ts", "examples/static/recorded-consent.mjs", "packages/notabenda/src/consent-engine.ts", "packages/notabenda/src/consent-runtime.ts", "packages/notabenda/src/consent-evidence-factory.ts", "packages/notabenda/src/consent-runtime-evidence.ts" ], "testRefs": [ "packages/notabenda/test/consent-evidence.test.mjs", "docs/verification/consent-evidence-browser.md", "scripts/check-site-runtime.mjs", "packages/notabenda/test/consent-delivery.test.mjs", "packages/notabenda/test/consent-runtime.test.mjs", "docs/verification/consent-focus.md" ], "implementationNote": "Immutable notices, transactional stream revisions, restrictive revoke-all and historical receipts/current heads are implemented. Optional construction-time browser gating, exact-response validation, bounded single-command retries, immediate local withdrawal, reload/resume confirmation, storage-failure barriers and stale-generation retirement are covered by tests. Default browser mode remains local-only." }, { "id": "REQ-PRODUCT-AUTHORING", "jurisdiction": "PRODUCT", "title": "Markdown and MDX document authoring with YAML frontmatter", "kind": "product-standard", "summary": "Support both Markdown and MDX legal-document sources with YAML frontmatter for document configuration, host-supplied custom MDX components and immutable original-source/rendered-output history. Keep the core framework-independent.", "appliesWhen": "An operator authors privacy, cookie or terms revisions in .md or .mdx project files.", "sourceRefs": [], "discoverySourceIds": [], "featureIds": [ "FEAT-DOCUMENTS", "FEAT-TERMS", "FEAT-DOCUMENT-HISTORY", "FEAT-DEPLOYMENT" ], "verificationIds": [ "VERIFY-PRODUCT-AUTHORING" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "MDX is trusted executable build-time project code. Output is static, validated and sanitized; no browser hydration. The authoring API is optional and the CLI remains JSON-based. Private source archives have explicit size limits; host auth, retention and reproducible component builds remain adopter responsibilities.", "implementationRefs": [ "packages/notabenda-authoring/src/index.ts", "packages/notabenda-authoring/src/frontmatter.ts", "packages/notabenda-authoring/src/html.ts", "packages/notabenda/src/content.ts", "packages/notabenda-cf/src/history.ts", "packages/notabenda-cf/src/render.ts", "examples/authoring/build.mjs", "packages/notabenda-cf/src/source-diff.ts" ], "testRefs": [ "packages/notabenda-authoring/test/authoring.test.mjs", "packages/notabenda-authoring/test/package.test.mjs", "site/test/host.test.mjs", "scripts/check-site-runtime.mjs", "docs/verification/authoring.md" ], "implementationNote": "Optional Node build package compiles Markdown/MDX with strict YAML frontmatter and static custom components. Source/output hashes bind immutable private archives; the host-authorized backend supports escaped source inspection and source/rendered comparisons. Core and CF packages retain zero runtime dependencies." }, { "id": "REQ-PRODUCT-REACT", "jurisdiction": "PRODUCT", "title": "Optional React integration with one shared consent engine", "kind": "product-standard", "summary": "Provide optional React provider/hooks, static legal components and native controls around the existing host-owned controller. Keep default imports framework-independent, SSR/hydration conservative, snapshots immutable and saved choices distinct from effective permissions.", "appliesWhen": "A host integrates the toolkit into a React 19 application.", "sourceRefs": [], "discoverySourceIds": [], "featureIds": [ "FEAT-DEPLOYMENT", "FEAT-CONTROLS", "FEAT-DOCUMENTS", "FEAT-ENFORCEMENT" ], "verificationIds": [ "VERIFY-PRODUCT-REACT" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "Optional React 19 peer only. The host owns controller creation, lifecycle registration and destruction. UI permission is not an execution boundary: optional work must use registerService. Structured document wrappers do not reconstruct rich MDX artifacts. Astro and a complete browser/platform audit remain separate.", "implementationRefs": [ "packages/notabenda/src/react.ts", "packages/notabenda/src/react-documents.ts", "packages/notabenda/src/controls.ts", "examples/react/build.mjs", "examples/react/client.mjs", "examples/react/view.mjs", "packages/notabenda/src/react-form-permission.ts", "examples/form-permissions/react-build.mjs", "examples/form-permissions/react-client.mjs", "examples/form-permissions/react-view.mjs", "packages/notabenda/src/consent-engine.ts", "packages/notabenda/src/react-consent-bindings.ts", "packages/notabenda/src/react-consent.ts" ], "testRefs": [ "packages/notabenda/test/react.test.mjs", "packages/notabenda/test/react-package.test.mjs", "site/test/host.test.mjs", "docs/verification/react-browser.md", "packages/notabenda/test/react-form-permission.test.mjs", "packages/notabenda/test/react-consent.test.mjs", "docs/verification/consent-focus.md" ], "implementationNote": "Optional React 19 provider/hooks use cached immutable core snapshots and pure effective permissions, deterministic conservative SSR/hydration, host-owned controller lifecycle and one native controls bridge. Static legal wrappers have a separate server-safe subpath. Light/dark example, packed consumer checks, lifecycle/hydration tests and initial real Chromium flows pass; broader framework/platform review remains separate. Ordinary form-permission provider/hooks/native field share the core controller and optional journal, perform no mount-time transport, preserve host ownership through StrictMode, and keep SSR and form submission conservative. A separate react/consent entry accepts compiled or full controllers with an honestly narrower getter; the compatibility entry retains its full public getter. Both use one binding implementation with separate typed contexts and shared controls ownership. Prompt decisions and nested reference arrays are deeply immutable. Light/dark cookie examples use bounded compiled descriptors and explicit legal-link metadata." }, { "id": "REQ-PRODUCT-ASTRO", "jurisdiction": "PRODUCT", "title": "Astro static documents and one host-owned browser controller", "kind": "product-standard", "summary": "Ship reusable Astro document/control surfaces, a browser lifecycle bridge and a real static-build example. Keep legal pages readable without scripts and optional services governed by the existing controller across Astro navigation.", "appliesWhen": "A host integrates the toolkit into an Astro 7 site.", "sourceRefs": [], "discoverySourceIds": [], "featureIds": [ "FEAT-DEPLOYMENT", "FEAT-DOCUMENTS", "FEAT-CONTROLS", "FEAT-ENFORCEMENT" ], "verificationIds": [ "VERIFY-PRODUCT-ASTRO" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "Host owns controller creation, service registration and destruction. Every client-routed page retaining optional services needs a working preferences surface. Bridge does not select legal applicability or police unrelated scripts. Rich MDX releases use generated HTML/fragments, not a reconstructed structured projection. Astro 7 build example needs Node 22.22 or later.", "implementationRefs": [ "packages/notabenda/src/astro-client.ts", "packages/notabenda/src/astro/LegalDocument.astro", "packages/notabenda/src/astro/LegalLinks.astro", "packages/notabenda/src/astro/ConsentControls.astro", "packages/notabenda/src/astro/PreferencesButton.astro", "examples/astro/build.mjs", "examples/astro/src/scripts/client.mjs", "examples/astro/src/pages/astro/index.astro", "packages/notabenda/src/astro-form-permission.ts", "packages/notabenda/src/astro/FormPermissionField.astro", "examples/form-permissions/example.mjs", "examples/astro/src/lib/permission.mjs", "examples/astro/src/layouts/PermissionLayout.astro", "examples/astro/src/scripts/permission-client.mjs", "examples/astro/src/pages/form-permissions/astro/index.astro", "examples/astro/src/pages/form-permissions/astro/review.astro" ], "testRefs": [ "packages/notabenda/test/astro.test.mjs", "packages/notabenda/test/astro-build.test.mjs", "packages/notabenda/test/astro-package.test.mjs", "site/test/host.test.mjs", "docs/verification/astro-browser.md", "packages/notabenda/test/astro-form-permission.test.mjs", "site/test/astro-permission.test.mjs" ], "implementationNote": "Optional Astro 7 components and a host-owned browser lifecycle bridge ship with a real static-build example. Packed components compile in a separate consumer; default installs exclude Astro. Lifecycle/build tests and initial real Chromium navigation/mobile checks pass. Broader platform and accessibility review remains separate. Named Astro fields and a navigation bridge reuse the same permission controller without mount/page-load transport. Exact-offer matching, duplicate ownership, draft/pending retention, actual two-page builds and host session/contact/offer replacement are checked." }, { "id": "REQ-PRODUCT-EMBEDS", "jurisdiction": "PRODUCT", "title": "Inert media placeholders and shared consent-gated lifecycles", "kind": "product-standard", "summary": "Gate iframe and image sources behind every declared service purpose, with one lifecycle for several mounts, inert SSR copy and withdrawal cleanup. Initial allowed resource origins participate in consent scope.", "appliesWhen": "A host mounts optional iframe or image content through the toolkit.", "sourceRefs": [ { "sourceId": "SRC-MDN-IFRAME", "locator": "sandbox, referrerpolicy, src and error/load behavior" }, { "sourceId": "SRC-MDN-IMAGE", "locator": "src, alt and error behavior" } ], "discoverySourceIds": [], "featureIds": [ "FEAT-ENFORCEMENT", "FEAT-INVENTORY", "FEAT-CONTROLS" ], "verificationIds": [ "VERIFY-PRODUCT-EMBEDS" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "Initial URL origin matching does not constrain redirects or nested requests. Removing media cannot recall already sent data or erase remote storage. Host owns group lifetime, CSP and vendor applicability.", "implementationRefs": [ "packages/notabenda/src/embeds.ts", "packages/notabenda/src/config.ts", "packages/notabenda/src/types.ts", "examples/embeds/build.mjs", "examples/embeds/client.mjs" ], "testRefs": [ "packages/notabenda/test/embeds.test.mjs", "site/test/host.test.mjs", "packages/notabenda/test/package.test.mjs", "docs/verification/embeds-browser.md" ], "implementationNote": "Inert SSR and browser iframe/image surfaces share one host-owned service lifecycle, declared initial origins and all-purpose/evidence gating. Lifecycle, actual-ledger and packed consumer tests pass; initial Chromium fresh/refusal/grant/withdrawal/reload and mobile checks are recorded. Broader platform, vendor and regional review remains separate." }, { "id": "REQ-PRODUCT-PRIVACY-SIGNALS", "jurisdiction": "PRODUCT", "title": "Independent Global Privacy Control processing restriction", "kind": "product-standard", "summary": "Apply a declared GPC policy before optional service work. Keep cookie choices separate, classify every service, combine host/browser signals monotonically and expose pure service eligibility plus server-readable restrictions.", "appliesWhen": "The host explicitly enables a signal policy and classifies processing activities; it owns applicability and account/server enforcement.", "sourceRefs": [ { "sourceId": "SRC-W3C-GPC", "locator": "Sec-GPC header, JavaScript property and preference caching" } ], "discoverySourceIds": [], "featureIds": [ "FEAT-US-CHOICES", "FEAT-ENFORCEMENT", "FEAT-INVENTORY", "FEAT-CONTROLS" ], "verificationIds": [ "VERIFY-PRODUCT-PRIVACY-SIGNALS" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "Runtime observation latches within one controller, not an account-wide retained opt-out. No geographic inference, re-opt-in workflow, persistent opt-out record or origin-wide support declaration is supplied. Browser absence never establishes permission.", "implementationRefs": [ "packages/notabenda/src/privacy-signals.ts", "packages/notabenda/src/config.ts", "packages/notabenda/src/types.ts", "packages/notabenda/src/controls.ts", "examples/privacy-signals/build.mjs", "examples/privacy-signals/client.mjs", "packages/notabenda/src/consent-engine.ts", "packages/notabenda/src/react-consent-bindings.ts" ], "testRefs": [ "packages/notabenda/test/privacy-signals.test.mjs", "packages/notabenda/test/react.test.mjs", "site/test/host.test.mjs", "docs/verification/privacy-signals-browser.md" ], "implementationNote": "Explicit GPC policy and exhaustive activity classification govern service eligibility independently of cookie/receipt permission. Navigator/header, lifecycle, actual-ledger, React and site checks plus an initial labeled Chromium fixture verify this runtime mechanism. Legal CA/CO/CT obligations, durable account/profile opt-outs and downstream propagation remain partial." }, { "id": "REQ-PRODUCT-PROCESSING-CHOICES", "jurisdiction": "PRODUCT", "title": "Separate recorded processing opt-out and monotonic restrictions", "kind": "product-standard", "summary": "Provide a deliberate processing opt-out independent of cookie permission, pinned privacy wording, recoverable pending requests, a host-bound monotonic CF ledger and readable authorized evidence views.", "appliesWhen": "The operator explicitly classifies every service and supplies trusted stable context, request transports and applicable legal wording.", "sourceRefs": [ { "sourceId": "SRC-US-CA-REGS-2026", "locator": "Section 7026: opt-out methods and status; host cessation/propagation remains separate" } ], "discoverySourceIds": [], "featureIds": [ "FEAT-US-CHOICES", "FEAT-ENFORCEMENT", "FEAT-INVENTORY", "FEAT-CONTROLS", "FEAT-RECORDS" ], "verificationIds": [ "VERIFY-PRODUCT-PROCESSING-CHOICES" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "No identity system, automatic expiry, reset or re-opt-in. Context mapping, alternative methods, downstream execution, retention/erasure and legal applicability remain operator work. The synthetic protected fixture is not a production account model.", "implementationRefs": [ "packages/notabenda/src/processing.ts", "packages/notabenda/src/processing-choices.ts", "packages/notabenda/src/content.ts", "packages/notabenda/src/controls.ts", "packages/notabenda-cf/src/processing.ts", "packages/notabenda-cf/src/render.ts", "examples/processing-choices/build.mjs", "examples/processing-choices/client.mjs", "site/worker.mjs", "site/host.mjs", "packages/notabenda/src/consent-engine.ts", "packages/notabenda/src/react-consent-bindings.ts" ], "testRefs": [ "packages/notabenda/test/processing.test.mjs", "packages/notabenda/test/react.test.mjs", "packages/notabenda/test/package.test.mjs", "site/test/host.test.mjs", "scripts/check-site-runtime.mjs", "docs/verification/processing-choices-browser.md" ], "implementationNote": "Validated one-way requests union retained restrictions transactionally. Missing/failed state blocks covered work; cookie acceptance never removes restrictions. Original pending UUID and artifact bindings survive uncertain delivery. Search distinguishes event-time and current retained state." }, { "id": "REQ-PRODUCT-RETAINED-RELEASES", "jurisdiction": "PRODUCT", "title": "Explicit retained public document releases in clean builds", "kind": "product-standard", "summary": "Include selected prior public artifacts and exact pinned HTML in a clean deployment while current routes remain current. Reject private source envelopes, unsupported/corrupt inputs and wrong-site artifacts; keep publication and private history separate.", "appliesWhen": "The host supplies trusted public compiler artifacts it intends to make available alongside the current release.", "sourceRefs": [], "discoverySourceIds": [], "featureIds": [ "FEAT-DOCUMENTS", "FEAT-DOCUMENT-HISTORY", "FEAT-DEPLOYMENT" ], "verificationIds": [ "VERIFY-PRODUCT-RETAINED-RELEASES" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "Input selection and publication are explicit host decisions. Hashes are not an HTML sanitizer or author authentication. Linked CSS/assets, route redirects, production activation, notifications and retention/erasure remain host responsibilities. No automatic workspace/output discovery or schema upgrade.", "implementationRefs": [ "packages/notabenda/src/release-files.ts", "packages/notabenda/src/cli.ts", "examples/releases/build.mjs", "examples/authoring/build.mjs", "examples/rights/build.mjs", "examples/catalog-releases/build.mjs" ], "testRefs": [ "packages/notabenda/test/retained-releases.test.mjs", "packages/notabenda/test/package.test.mjs", "site/test/host.test.mjs", "docs/verification/retained-releases.md", "scripts/check-site-runtime.mjs", "packages/notabenda/test/rights.test.mjs", "packages/notabenda/test/catalog-release.test.mjs", "docs/verification/catalog-release.md", "site/test/demo-upgrade.test.mjs" ], "implementationNote": "A bounded build-time API and repeatable CLI input emit only immutable artifact paths. Exact historical bytes and rich bodies are preserved without source evaluation. Clean-build tests and a two-version example connect public pinned URLs to private authorized comparison." }, { "id": "REQ-PRODUCT-STORAGE-CLEANUP", "jurisdiction": "PRODUCT", "title": "Exact declared optional storage cleanup within service generations", "kind": "product-standard", "summary": "Remove explicitly selected accessible browser storage when an owned optional service is blocked, stopped, fails or is destroyed; preserve unrelated items and report limited outcomes.", "appliesWhen": "The host opts one consent-managed service into exact declared local/session storage or explicit JavaScript-accessible cookie expiration scopes.", "sourceRefs": [], "discoverySourceIds": [], "featureIds": [ "FEAT-ENFORCEMENT" ], "verificationIds": [ "VERIFY-PRODUCT-STORAGE-CLEANUP" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "Web storage absence is point-in-time. Cookie expiration requests are not verified deletion. Host controls producer teardown; server, third-party, HttpOnly, partitioned and undeclared storage remain outside this adapter. This does not complete legal erasure or withdrawal obligations.", "implementationRefs": [ "packages/notabenda/src/storage-cleanup.ts", "examples/storage-cleanup/build.mjs", "examples/storage-cleanup/client.mjs" ], "testRefs": [ "packages/notabenda/test/storage-cleanup.test.mjs", "docs/verification/storage-cleanup.md" ], "implementationNote": "Exact inventory ownership validation precedes mutation; independent blocked observation covers queued cancellation. Abort, failed startup, final teardown and destroy cleanup participate in the same generation lifecycle." }, { "id": "REQ-PRODUCT-SETUP", "jurisdiction": "PRODUCT", "title": "Shared advisory setup wizard and admin questionnaire", "kind": "product-standard", "summary": "Ask about coverage interests, actual practices and justifications, then advise configuration/integrations with catalog references and export a draft plus a separate private report.", "appliesWhen": "An operator initiates guided setup through the CLI or a host-authorized admin page.", "sourceRefs": [], "discoverySourceIds": [], "featureIds": [ "FEAT-SETUP" ], "verificationIds": [ "VERIFY-PRODUCT-SETUP" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "Advisory and draft only. No jurisdiction applicability, exemption, legal basis, compliance or content-review conclusion. No automatic service activation, deployment, account system or server persistence. Operator-private imported config fields are excluded from advisory exports; retain original files.", "implementationRefs": [ "packages/notabenda/src/setup.ts", "packages/notabenda/src/setup-cli.ts", "packages/notabenda/src/setup-ui.ts", "packages/notabenda-cf/src/setup.ts", "examples/setup/build.mjs", "examples/setup/client.mjs", "packages/notabenda-cf/src/admin-style.ts", "packages/notabenda-cf/src/presentation.ts", "site/admin-presentation.mjs", "packages/notabenda/src/setup-purpose.ts", "packages/notabenda/src/setup-purpose-ui.ts", "packages/notabenda/src/setup-purpose-cli.ts", "packages/notabenda/src/setup-catalog-cli.ts", "packages/notabenda/src/cli-json.ts", "packages/notabenda/src/catalog-node.ts", "packages/notabenda/src/catalog-review.ts", "packages/notabenda/src/catalog-review-ui.ts", "packages/notabenda/src/catalog-review-cli.ts" ], "testRefs": [ "packages/notabenda/test/setup.test.mjs", "packages/notabenda-cf/test/setup.test.mjs", "docs/verification/setup.md", "docs/verification/ux-review.md", "packages/notabenda/test/setup-purpose.test.mjs", "packages/notabenda/test/setup-project.test.mjs", "packages/notabenda/test/catalog-review.test.mjs", "docs/verification/catalog-review.md" ], "implementationNote": "Shared tri-state questionnaire and bounded normalized answers; explicit selected markets trigger review. Config/imported runtime settings stay separate from private notes. Contradictions remain unresolved; current exports invalidate on edits and saved reports resume answers only. Questionnaire revision 3 adds actual distance/continuing-contract practices and conditional regional/handoff review, accepts earlier reports and preserves unresolved new answers. Explicit public purpose add/edit/remove plans now power CLI/admin authoring; unresolved basis/retention/consequence text stays production-blocking, linked removals reject, existing restrictions/scopes persist, and stale catalog notes remain review items. Explicit wizard --project scanning now feeds the same actual-use confirmation as manual catalog search and writes separate private discovery findings. Noninteractive runs preserve prior pins and never select services from matches. Setup/catalog JSON and tracked source reads reject nonregular inputs without FIFO blocking. Browser/admin local-filesystem scanning remains unavailable. Explicit CLI/admin renewal compares selected reference/service/purpose facts, requires a new private reason and confirmation, rejects stale full-service snapshots and retains prior/next pins in bounded private report history. Operator labels and enforcement settings remain unchanged; focused CLI review does not reapply historical setup facts. Practice assessment now uses four grouped responsive grids with directly exposed native radio choices, visible explanations, optional private notes and unresolved counts. No per-question opening, automatic navigation, bulk answers or applicability-based hiding." }, { "id": "REQ-PRODUCT-COLLECTION-NOTICE", "jurisdiction": "PRODUCT", "title": "Version-bound inline direct-collection notice", "kind": "product-standard", "summary": "Render selected declared collection facts beside a host form, with a pinned privacy release, independent wording review, accessible static details and no implied acceptance or evidence write.", "appliesWhen": "The host supplies an appropriate direct/mixed-source inventory purpose and places a notice at a collection surface.", "sourceRefs": [], "discoverySourceIds": [], "featureIds": [ "FEAT-FORMS", "FEAT-DOCUMENTS" ], "verificationIds": [ "VERIFY-PRODUCT-COLLECTION-NOTICE" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "Purpose-level categories and optionality do not map individual fields. Host reviews inventory/policy/context, legal particulars, timing and availability. No indirect-notification workflow, marketing permission, parental authorization or proof of display/read/acceptance.", "implementationRefs": [ "packages/notabenda/src/collection.ts", "packages/notabenda/src/content.ts", "packages/notabenda/src/react-documents.ts", "packages/notabenda/src/astro/CollectionNotice.astro", "examples/collection/build.mjs" ], "testRefs": [ "packages/notabenda/test/collection.test.mjs", "packages/notabenda/test/react.test.mjs", "packages/notabenda/test/astro-package.test.mjs", "packages/notabenda/test/react-package.test.mjs", "packages/notabenda/test/package.test.mjs", "docs/verification/collection.md" ], "implementationNote": "Trusted public release integrity checks precede a bounded selected-facts projection. Content identity covers locale, scope, render policy and reviewed wording; unique instance/summary IDs support static vanilla, React and Astro markup." }, { "id": "REQ-PRODUCT-EVIDENCE-EXPORT", "jurisdiction": "PRODUCT", "title": "Explicitly authorized filtered evidence export", "kind": "product-standard", "summary": "Download bounded, filter-preserving evidence segments from a fixed host-authorized store, with fresh per-request export permission and explicit live-read continuation.", "appliesWhen": "The host explicitly grants a caller bulk-download permission on an already scoped evidence store.", "sourceRefs": [], "discoverySourceIds": [], "featureIds": [ "FEAT-RECORDS", "FEAT-BACKOFFICE" ], "verificationIds": [ "VERIFY-PRODUCT-EVIDENCE-EXPORT" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "All adapter-returned fields are included without redaction. No snapshot, signature, full subject-data export, automatic source/archive lookup, legal sufficiency, retention/erasure or backup/restore claim. Hosts own scope, access auditing and downloaded-copy handling.", "implementationRefs": [ "packages/notabenda-cf/src/export.ts", "packages/notabenda-cf/src/worker.ts", "packages/notabenda-cf/src/render.ts", "packages/notabenda-cf/src/types.ts" ], "testRefs": [ "packages/notabenda-cf/test/export.test.mjs", "packages/notabenda/test/package.test.mjs", "site/test/host.test.mjs", "scripts/check-site-runtime.mjs", "docs/verification/evidence-export.md" ], "implementationNote": "Script-free live review and attachment-only JSON preserve filters and incoming/forward cursors. Shared page validation checks normalized records against filters and UTF-8 order; each request requires fresh host authorization plus explicit bulk-read permission." }, { "id": "REQ-PRODUCT-DISCOVERY", "jurisdiction": "PRODUCT", "title": "Explicit origin/name-only browser discovery and local inventory review", "kind": "product-standard", "summary": "Provide opt-in browser observations, private local review and a standalone capture-file CLI with declared-inventory candidate mappings, clear coverage limits and no mandated CI workflow.", "appliesWhen": "An authorized developer/operator explicitly invokes discovery for a declared HTTP(S) site origin.", "sourceRefs": [ { "sourceId": "SRC-W3C-RESOURCE-TIMING", "locator": "Resources included; frame boundaries; cross-origin restrictions; resource timing buffers" } ], "discoverySourceIds": [], "featureIds": [ "FEAT-DISCOVERY" ], "verificationIds": [ "VERIFY-PRODUCT-DISCOVERY" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "No complete network trace, vendor/purpose inference, proof of no tracking, legal score or automatic configuration. Hosts authorize operator access and review potentially sensitive origin/name/label files. Framework/server/HttpOnly/partitioned storage and deeper inspection remain outside this baseline.", "implementationRefs": [ "packages/notabenda/src/discovery.ts", "packages/notabenda/src/discovery-ui.ts", "packages/notabenda/src/discovery-cli.ts", "examples/discovery/build.mjs", "examples/discovery/client.mjs", "packages/notabenda/src/setup-ui.ts" ], "testRefs": [ "packages/notabenda/test/discovery.test.mjs", "packages/notabenda/test/package.test.mjs", "site/test/host.test.mjs", "docs/verification/discovery.md", "scripts/check-site-runtime.mjs", "packages/notabenda/test/setup.test.mjs" ], "implementationNote": "Explicit point-in-time ResourceTiming/DOM/storage-name capture with bounded strict JSON normalization; optional browser UI and local CLI preserve per-scenario observations and public-inventory candidates. Source paths, URL credentials/queries/fragments, storage values, headers and bodies are excluded. Browser setup links to offline project discovery and displays the npx command for dependency/infrastructure coverage, with manual review and private-report handling. The UI does not execute commands or inspect the local project." }, { "id": "REQ-PRODUCT-REGIONAL-PROMPTS", "jurisdiction": "PRODUCT", "title": "Explicit and explainable regional solicitation guards", "kind": "product-standard", "summary": "Keep solicitation separate from permission, preserve withholding memory, require exact declared material transitions and bind their public explanation into evidence notices.", "appliesWhen": "An operator explicitly configures the supported repeat-prompt policy.", "sourceRefs": [], "discoverySourceIds": [], "featureIds": [ "FEAT-REGIONS", "FEAT-CHOICES" ], "verificationIds": [ "VERIFY-PRODUCT-REGIONAL-PROMPTS" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "Implements the documented software guard, not legal applicability or a complete jurisdiction profile.", "implementationRefs": [ "packages/notabenda/src/prompt-policy.ts", "packages/notabenda/src/config.ts", "packages/notabenda/src/consent-notice.ts", "packages/notabenda/src/content.ts", "packages/notabenda/src/consent-evidence.ts", "packages/notabenda-cf/src/consent.ts", "examples/repeat-prompts/build.mjs", "examples/repeat-prompts/client.mjs", "packages/notabenda/src/consent-engine.ts" ], "testRefs": [ "packages/notabenda/test/prompt-policy.test.mjs", "site/test/host.test.mjs" ] }, { "id": "REQ-PRODUCT-EVIDENCE-LIFECYCLE", "jurisdiction": "PRODUCT", "title": "Scoped evidence retirement, holds and resumable payload purge", "kind": "product-standard", "summary": "Retire a fixed host-bound evidence context before bounded transactional deletion; preserve holds, replay barriers and restore reapplication while exposing readable operational progress.", "appliesWhen": "A host invokes lifecycle operations for a configured consent, processing or terms ledger.", "sourceRefs": [], "discoverySourceIds": [], "featureIds": [ "FEAT-RECORDS", "FEAT-BACKOFFICE" ], "verificationIds": [ "VERIFY-PRODUCT-EVIDENCE-LIFECYCLE" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "Host supplies authorization, identity resolution, eligibility, scheduling and authoritative manifests outside backup rollback. Minimal pseudonymous metadata, shared archives, exports, backups and other application data remain. No complete erasure, legal sufficiency, automatic retention period or public deletion endpoint.", "implementationRefs": [ "packages/notabenda-cf/src/lifecycle.ts", "packages/notabenda-cf/src/consent.ts", "packages/notabenda-cf/src/processing.ts", "packages/notabenda-cf/src/terms.ts", "packages/notabenda-cf/src/render.ts", "packages/notabenda/src/consent-evidence.ts", "packages/notabenda/src/controls.ts", "packages/notabenda/src/processing-choices.ts", "packages/notabenda/src/terms.ts", "site/worker.mjs", "examples/lifecycle.mjs", "packages/notabenda-cf/src/records.ts", "packages/notabenda-cf/src/contract-dispatch.ts", "packages/notabenda/src/consent-engine.ts", "packages/notabenda-cf/src/orders.ts" ], "testRefs": [ "packages/notabenda-cf/test/lifecycle.test.mjs", "packages/notabenda/test/consent-delivery.test.mjs", "packages/notabenda/test/processing.test.mjs", "packages/notabenda/test/terms.test.mjs", "packages/notabenda/test/package.test.mjs", "site/test/host.test.mjs", "scripts/check-site-runtime.mjs", "docs/verification/evidence-lifecycle.md", "packages/notabenda-cf/test/contract-dispatch.test.mjs", "docs/verification/contract-dispatch.md", "packages/notabenda-cf/test/orders.test.mjs" ], "implementationNote": "Atomic retirement precedes retries and empty-head reads. Exact family/site/context event matching, transactional bounded scans, CAS holds and restartable manifests preserve restrictions. Browser controllers close terminal contexts. Read-only admin cards show holds, scan counters, timestamps and retained-data limitations." }, { "id": "REQ-EU-RETENTION-ERASURE", "jurisdiction": "EU-EEA", "title": "Storage limitation and qualified erasure", "kind": "law", "summary": "Limit identifiable retention to necessary purposes; assess applicable erasure grounds, exceptions and recipient notification obligations.", "appliesWhen": "GDPR applies to the stored personal data and controller processing context.", "sourceRefs": [ { "sourceId": "SRC-EU-GDPR", "locator": "Articles 5(1)(c),(e), 5(2), 17(1)–(3), 19" } ], "discoverySourceIds": [], "featureIds": [ "FEAT-RECORDS", "FEAT-BACKOFFICE" ], "verificationIds": [ "VERIFY-EU-RETENTION-ERASURE" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": null, "caveats": "Purpose, necessity, exceptions and recipient duties need contextual review. A scoped ledger purge leaves metadata and external copies; it does not establish fulfillment of an erasure request or a legal basis for continued retention.", "implementationRefs": [ "packages/notabenda-cf/src/lifecycle.ts", "packages/notabenda-cf/src/consent.ts", "packages/notabenda-cf/src/processing.ts", "packages/notabenda-cf/src/terms.ts", "packages/notabenda-cf/src/render.ts" ], "testRefs": [ "packages/notabenda-cf/test/lifecycle.test.mjs", "docs/verification/evidence-lifecycle.md" ], "implementationNote": "Host-controlled holds, retirement and scoped payload deletion provide engineering mechanics. Full identity resolution, lawful schedules, recipient handling, metadata disposition, copies and legal review remain incomplete." }, { "id": "REQ-PRODUCT-SCOPE-GUARDS", "jurisdiction": "PRODUCT", "title": "Explicit processing-scope guards for unsupported contexts", "kind": "product-standard", "summary": "Declare tri-state operator scope facts and prevent affected optional-purpose grants and registered service starts while preserving static documents and restrictive actions.", "appliesWhen": "An operator explicitly configures the scope-guard policy for a site or purpose; legacy absence remains visibly unassessed.", "sourceRefs": [], "discoverySourceIds": [], "featureIds": [ "FEAT-SCOPE-GUARDS", "FEAT-INVENTORY", "FEAT-ENFORCEMENT", "FEAT-CONTROLS", "FEAT-SETUP" ], "verificationIds": [ "VERIFY-PRODUCT-SCOPE-GUARDS" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "Declarations are public operator facts, not visitor attributes, authorization or legal clearance. Specialized child/sensitive/profiling/sector flows remain unsupported. Hosts own applicability, factual assessment, material revision discipline, unregistered/server code and separate workflows.", "implementationRefs": [ "packages/notabenda/src/scope-guard-policy.ts", "packages/notabenda/src/scope-guards.ts", "packages/notabenda/src/types.ts", "packages/notabenda/src/config.ts", "packages/notabenda/src/consent-notice.ts", "packages/notabenda/src/controls.ts", "packages/notabenda/src/setup.ts", "packages/notabenda/src/starter.ts", "packages/notabenda-cf/src/scope-guard-policy.ts", "packages/notabenda-cf/src/consent.ts", "packages/notabenda-cf/src/history.ts", "packages/notabenda-cf/src/render.ts", "examples/scope-guards/build.mjs", "examples/scope-guards/client.mjs", "packages/notabenda/src/consent-engine.ts", "packages/notabenda/src/react-consent-bindings.ts", "packages/notabenda/src/setup-purpose.ts" ], "testRefs": [ "packages/notabenda/test/scope-guards.test.mjs", "packages/notabenda/test/setup.test.mjs", "packages/notabenda/test/react.test.mjs", "packages/notabenda/test/package.test.mjs", "site/test/host.test.mjs", "scripts/check-site-runtime.mjs", "docs/verification/scope-guards.md", "packages/notabenda/test/setup-purpose.test.mjs" ], "implementationNote": "Site and purpose restrictions compose conservatively; optional eligibility and granular grants are checked in the browser and against CF archives. Available-choice actions use save, wholly blocked actions invent no refusal, and read-only evidence distinguishes guarded-off values. The wizard preserves imported restrictions and private reasoning." }, { "id": "REQ-PRODUCT-DEMO-WORKSPACE", "jurisdiction": "PRODUCT", "title": "Isolated fictional admin workspace for public examples", "kind": "product-standard", "summary": "Public example visitors get a separately provisioned DO database, fictional seeded journeys, generation-bound actions and session-bound access and idle cleanup; operational admin remains separately authorized. Example and demo-admin screens carry a visible corner marker, distinct from the project website and documentation.", "appliesWhen": "Public example or demo admin navigation.", "sourceRefs": [], "discoverySourceIds": [], "featureIds": [ "FEAT-BACKOFFICE" ], "verificationIds": [ "VERIFY-PRODUCT-DEMO-WORKSPACE" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "Capability grants access only to fictional demo data. Hosts own production authorization. Scheduled cleanup is distinct from the one-day idle access expiry.", "implementationRefs": [ "site/demo-host.mjs", "site/demo-seed.mjs", "site/demo-presentation.mjs", "site/demo-admin.css", "site/worker.mjs", "site/host.mjs", "scripts/serve-example.mjs", "site/demo-marker.mjs", "site/demo-marker.css" ], "testRefs": [ "site/test/demo.test.mjs", "docs/verification/demo-workspace.md", "scripts/check-site-runtime.mjs", "site/test/host.test.mjs", "site/test/demo-upgrade.test.mjs" ], "implementationNote": "Separate DO binding, bounded provisioning, session cookie and rolling idle expiry, seeded immutable ledgers and browser generation checks." }, { "id": "REQ-PRODUCT-RIGHTS-CENTER", "jurisdiction": "PRODUCT", "title": "Discoverable rights entry points with explicit application handoff", "kind": "product-standard", "summary": "Render operator-selected rights navigation with clear scope, safe public destinations and an account-independent contact fallback. Do not infer applicability, submit a request or claim fulfillment.", "appliesWhen": "An operator explicitly configures a rights center.", "sourceRefs": [], "discoverySourceIds": [], "featureIds": [ "FEAT-RIGHTS", "FEAT-DOCUMENTS", "FEAT-DEPLOYMENT" ], "verificationIds": [ "VERIFY-PRODUCT-RIGHTS-CENTER" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "Navigation and public information only. The host owns identity, intake, acknowledgments, response deadlines, decisions, fulfillment and appeals. A contact fallback does not establish that all required submission methods exist.", "implementationRefs": [ "packages/notabenda/src/rights-policy.ts", "packages/notabenda/src/rights.ts", "packages/notabenda/src/config.ts", "packages/notabenda/src/content.ts", "packages/notabenda/src/documents.ts", "packages/notabenda/src/react-documents.ts", "packages/notabenda/src/astro/RightsCenter.astro", "packages/notabenda/src/styles.css", "packages/notabenda-authoring/src/index.ts", "examples/rights/build.mjs", "packages/notabenda/src/setup.ts" ], "testRefs": [ "packages/notabenda/test/rights.test.mjs", "packages/notabenda/test/package.test.mjs", "site/test/host.test.mjs", "scripts/check-site-runtime.mjs", "docs/verification/rights-center.md" ], "implementationNote": "Static core/React/Astro surfaces, production review and strict configuration; supporting page emitted alongside legal builds, with its declaration bound in public configuration. Three immutable legal document kinds are preserved." }, { "id": "REQ-PRODUCT-CF-STARTER", "jurisdiction": "PRODUCT", "title": "Local Cloudflare starter with host-owned authorization and scoped evidence", "kind": "product-standard", "summary": "Provide an installable local scaffold for a standalone Worker, SQLite Durable Object, static setup assets and scoped admin. Never replace existing files, ship credentials, choose a tenant from browser input, install or deploy automatically.", "appliesWhen": "An adopter explicitly runs notabenda-cf init.", "sourceRefs": [ { "sourceId": "SRC-CF-DO-EXPORTS", "locator": "Define a Durable Object class; exports and legacy migrations are mutually exclusive" }, { "sourceId": "SRC-CF-WRANGLER-CONFIG", "locator": "Static assets, run_worker_first, bindings and exports" }, { "sourceId": "SRC-CF-DO-SQLITE", "locator": "SQLite-backed storage and asynchronous KV API" } ], "discoverySourceIds": [], "featureIds": [ "FEAT-DEPLOYMENT", "FEAT-BACKOFFICE", "FEAT-SETUP" ], "verificationIds": [ "VERIFY-PRODUCT-CF-STARTER" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "Host code owns identity, sessions, access policy, public ingestion if any, recording identity, retention, restore and routing. Builds and local checks are not proof of production deployment or compliance. CLI init performs no network or remote resource operations.", "implementationRefs": [ "packages/notabenda-cf/bin/notabenda-cf.mjs", "packages/notabenda-cf/package.json", "packages/notabenda-cf/templates/src/worker.mjs", "packages/notabenda-cf/templates/src/host.mjs", "packages/notabenda-cf/templates/src/workspace.mjs", "packages/notabenda-cf/templates/src/authorize.mjs", "packages/notabenda-cf/templates/src/setup.mjs", "packages/notabenda-cf/templates/scripts/build-assets.mjs" ], "testRefs": [ "packages/notabenda-cf/test/starter.test.mjs", "packages/notabenda/test/package.test.mjs", "docs/verification/cloudflare-starter.md", "scripts/check-cf-starter-runtime.mjs" ], "implementationNote": "Exclusive local scaffolding, a fail-closed host hook, fixed configured-site namespace selection, separate setup/export permission, private archive RPC and explicit Wrangler build/check/dev/deploy scripts." }, { "id": "REQ-PRODUCT-FORM-PERMISSIONS", "jurisdiction": "PRODUCT", "title": "Purpose/channel form permissions and evaluated evidence", "kind": "product-standard", "summary": "Separate optional fields from terms/cookies; bind stable purpose/channel permission to reviewed disclosures and a trusted person/contact generation, with acknowledged grants, independent withdrawal and evaluated current state.", "appliesWhen": "A host provides a reviewed ordinary consent context and its own identity, authorization and downstream operations.", "sourceRefs": [], "discoverySourceIds": [], "featureIds": [ "FEAT-FORMS", "FEAT-RECORDS" ], "verificationIds": [ "VERIFY-PRODUCT-FORM-PERMISSIONS" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": null, "caveats": "No implied-consent classifier, specialized authorization, identity/contact proof, sending or complete regional coverage. Browser recovery is opt-in and depends on retained transactional storage; it never authorizes background delivery. A historical receipt never decides current eligibility.", "implementationRefs": [ "packages/notabenda/src/form-permission.ts", "packages/notabenda/src/content.ts", "packages/notabenda-cf/src/permissions.ts", "packages/notabenda-cf/src/lifecycle.ts", "packages/notabenda-cf/src/render.ts", "examples/form-permissions/build.mjs", "examples/form-permissions/client.mjs", "site/permission-context.mjs", "site/demo-host.mjs", "site/worker.mjs", "site/permission-seed.mjs", "packages/notabenda/src/form-permission-journal.ts", "packages/notabenda/src/react-form-permission.ts", "examples/form-permissions/react-build.mjs", "examples/form-permissions/react-client.mjs", "examples/form-permissions/react-view.mjs", "packages/notabenda/src/astro-form-permission.ts", "packages/notabenda/src/astro/FormPermissionField.astro", "examples/form-permissions/example.mjs", "examples/astro/src/lib/permission.mjs", "examples/astro/src/layouts/PermissionLayout.astro", "examples/astro/src/scripts/permission-client.mjs", "examples/astro/src/pages/form-permissions/astro/index.astro", "examples/astro/src/pages/form-permissions/astro/review.astro" ], "testRefs": [ "packages/notabenda/test/form-permission.test.mjs", "docs/verification/form-permissions.md", "site/test/demo.test.mjs", "scripts/check-form-permission-runtime.mjs", "docs/verification/ux-review.md", "packages/notabenda/test/react-form-permission.test.mjs", "packages/notabenda/test/react-package.test.mjs", "packages/notabenda/test/astro-form-permission.test.mjs", "packages/notabenda/test/astro-package.test.mjs", "packages/notabenda/test/astro-build.test.mjs", "site/test/astro-permission.test.mjs" ], "implementationNote": "Ordinary opt-in/withdrawal mechanics, scoped history, isolated examples and optional IndexedDB recovery are implemented. Exact pending requests, withdrawal epochs and head/activation fences survive reload; stale-tab grants and storage failures are covered. React provider/hooks/native field and light/midnight examples reuse that controller with no mount-time network or ordinary-form writes. Wider platform acceptance and regional packs remain incomplete. Named Astro fields and a navigation bridge reuse the same permission controller without mount/page-load transport. Exact-offer matching, duplicate ownership, draft/pending retention, actual two-page builds and host session/contact/offer replacement are checked." }, { "id": "REQ-EU-MARKETING", "jurisdiction": "EU-EEA", "title": "Electronic direct marketing and conditioned exceptions", "kind": "legislation", "summary": "Article 13 distinguishes prior consent for specified electronic marketing, a conditioned existing-customer exception, national choices for other communications and sender/stop-address requirements.", "appliesWhen": "Relevant electronic direct marketing under applicable national implementation of ePrivacy Article 13.", "sourceRefs": [ { "sourceId": "SRC-EU-EPRIVACY-MARKETING", "locator": "Article 13(1)–(5)" }, { "sourceId": "SRC-EU-EDPB-CONSENT", "locator": "Sections 3.1.3, 3.3.1, 3.4, 5.1–5.2" } ], "discoverySourceIds": [], "featureIds": [ "FEAT-FORMS", "FEAT-REGIONS" ], "verificationIds": [ "VERIFY-EU-MARKETING" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": null, "caveats": "National rules, natural/legal persons, customer exception and actual messages require separate review. Generic optional permission records do not establish permission to send.", "implementationRefs": [ "packages/notabenda/src/form-permission.ts", "packages/notabenda/src/content.ts", "packages/notabenda-cf/src/permissions.ts", "packages/notabenda-cf/src/lifecycle.ts", "packages/notabenda-cf/src/render.ts" ], "testRefs": [ "packages/notabenda/test/form-permission.test.mjs", "docs/verification/form-permissions.md" ], "implementationNote": "Ordinary opt-in/withdrawal mechanics, scoped evidence, examples and optional transactional recovery are implemented. Broader legal/platform acceptance remains incomplete; no supported regional pack or downstream sending claim." }, { "id": "REQ-CA-CASL-OPTIN", "jurisdiction": "CA-FED", "title": "Affirmative CASL express-consent requests", "kind": "regulator-interpretation", "summary": "Express-consent requests require clear purpose and prescribed identification/information; CRTC guidance rejects default opt-out and separates requests from general terms.", "appliesWhen": "An operator seeks express consent for commercial electronic messages within CASL scope.", "sourceRefs": [ { "sourceId": "SRC-CA-CASL-S10", "locator": "Subsection 10(1); distinguish 10(9)–(10)" }, { "sourceId": "SRC-CA-CRTC-548", "locator": "Paragraphs 5–20, particularly 16 and 20" }, { "sourceId": "SRC-CA-CRTC-549", "locator": "Paragraphs 4–8" } ], "discoverySourceIds": [], "featureIds": [ "FEAT-FORMS", "FEAT-REGIONS" ], "verificationIds": [ "VERIFY-CA-CASL-OPTIN" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": null, "caveats": "Prescribed request/sender particulars, confirmation delivery, message-level unsubscribe fulfillment, applicability and exceptions remain incomplete. Cookie consent and terms acceptance are not CASL permission.", "implementationRefs": [ "packages/notabenda/src/form-permission.ts", "packages/notabenda/src/content.ts", "packages/notabenda-cf/src/permissions.ts", "packages/notabenda-cf/src/lifecycle.ts", "packages/notabenda-cf/src/render.ts" ], "testRefs": [ "packages/notabenda/test/form-permission.test.mjs", "docs/verification/form-permissions.md" ], "implementationNote": "Ordinary opt-in/withdrawal mechanics, scoped evidence, examples and optional transactional recovery are implemented. Broader legal/platform acceptance remains incomplete; no supported regional pack or downstream sending claim." }, { "id": "REQ-PRODUCT-CF-DOCTOR", "jurisdiction": "PRODUCT", "title": "Read-only Cloudflare starter diagnostics with explicit verification boundaries", "kind": "product-standard", "summary": "Inspect a generated local starter without executing project code, reading credentials, installing, contacting endpoints or modifying files. Report bounded local errors separately from manual host access and operational acceptance.", "appliesWhen": "An adopter explicitly runs notabenda-cf doctor against a local starter.", "sourceRefs": [ { "sourceId": "SRC-CF-WRANGLER-CONFIG", "locator": "JSON/JSONC configuration, environment inheritance, static asset worker-first routing and bindings" }, { "sourceId": "SRC-CF-DO-EXPORTS", "locator": "Live SQLite exports and mutual exclusion with legacy migrations" } ], "discoverySourceIds": [], "featureIds": [ "FEAT-DEPLOYMENT" ], "verificationIds": [ "VERIFY-PRODUCT-CF-DOCTOR" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "Checks target the generated starter contract, not arbitrary Wrangler projects. Filename/manifests checks do not establish private-content absence, installed-code integrity, secure authorization, actual endpoint behavior, account/routing correctness, data lifecycle or legal compliance. Doctor performs no automated repair, build or deployment.", "implementationRefs": [ "packages/notabenda-cf/bin/doctor.mjs", "packages/notabenda-cf/bin/notabenda-cf.mjs" ], "testRefs": [ "packages/notabenda-cf/test/doctor.test.mjs", "packages/notabenda/test/package.test.mjs", "docs/verification/cloudflare-doctor.md" ], "implementationNote": "Bounded static JSON/JSONC inspection, explicit named-environment binding selection, worker-first/private file diagnostics, default deny-stub detection and separate review results. Exit status records local blockers only; production readiness stays not-assessed. Packed CLI tested offline." }, { "id": "REQ-PRODUCT-CONTRACT-ACTIONS", "jurisdiction": "PRODUCT", "title": "Distinct contract declarations with durable receipt and independent host handoffs", "kind": "product-standard", "summary": "Provide versioned cancellation/withdrawal forms, explicit final actions, a savable exact receipt and transactional application/acknowledgement jobs. Preserve retries and separate visitor claims, receipt, provider acceptance and legal/contract fulfillment. Retire individual declarations without blocking future rights.", "appliesWhen": "A host explicitly enables the optional contract-action module for its reviewed transaction scope.", "sourceRefs": [ { "sourceId": "SRC-DE-CANCEL", "locator": "Section 312k(2)–(5)" }, { "sourceId": "SRC-DE-WITHDRAW", "locator": "Section 356a(1)–(5)" }, { "sourceId": "SRC-EU-WITHDRAWAL", "locator": "Article 11a; national implementation remains required" }, { "sourceId": "SRC-BR-ECOMMERCE", "locator": "Article 5; additional application-side obligations" }, { "sourceId": "SRC-CF-DO-ALARMS", "locator": "Background and alarm handler retries; host continuation remains necessary" } ], "discoverySourceIds": [], "featureIds": [ "FEAT-CONTRACT-ACTIONS", "FEAT-RECORDS", "FEAT-BACKOFFICE" ], "verificationIds": [ "VERIFY-PRODUCT-CONTRACT-ACTIONS" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": null, "caveats": "Initial email-acknowledgement mechanics, not complete regional packs or a delivery service. Host admission/anti-abuse, actual prompt dispatch, identity/contract matching, provider idempotency, fulfillment, refunds, retention and operational rehearsal remain necessary. Published form documents do not establish the original contract terms.", "implementationRefs": [ "packages/notabenda/src/contract-action-policy.ts", "packages/notabenda/src/contract-action.ts", "packages/notabenda/src/content.ts", "packages/notabenda-cf/src/contract-action-policy.ts", "packages/notabenda-cf/src/contracts.ts", "packages/notabenda-cf/src/lifecycle.ts", "packages/notabenda-cf/src/records.ts", "packages/notabenda-cf/src/render.ts", "examples/contract-actions/build.mjs", "examples/contract-actions/client.mjs", "examples/contract-actions/style.css", "site/contract-context.mjs", "site/contract-seed.mjs", "site/demo-host.mjs", "site/worker.mjs", "site/host.mjs", "packages/notabenda-cf/src/contract-dispatch.ts", "packages/notabenda/src/setup.ts", "packages/notabenda/src/setup-cli.ts" ], "testRefs": [ "packages/notabenda/test/contract-action.test.mjs", "packages/notabenda-cf/test/contracts.test.mjs", "docs/verification/contract-actions.md", "site/test/contracts.test.mjs", "scripts/check-contract-actions-runtime.mjs", "packages/notabenda-cf/test/contract-dispatch.test.mjs", "scripts/check-contract-dispatch-runtime.mjs", "scripts/fixtures/contract-dispatch-worker.mjs", "docs/verification/contract-dispatch.md", "packages/notabenda/test/setup.test.mjs", "docs/verification/setup.md", "site/test/demo-upgrade.test.mjs" ], "implementationNote": "Versioned archive-bound definitions, visible-field validation, native forms/headless state, bounded exact retry/recovery, transactional capture and independent leased jobs, immutable at-capture copy, provider CAS, private semantic inspection/search and per-declaration lifecycle. The isolated example deliberately retains its recovery command within a session-scoped tab, with no mount-time transport. Local SQLite capture/restart verified; real runners, provider delivery, regional and platform acceptance remain open. Optional single/paired dispatch runners validate before claim, bound asynchronous provider attempts, preserve independent acknowledgement, fence late results and report provider/settlement outcomes separately. Real SQLite restart/deduplication is verified with test-only provider simulation; production scheduling/provider delivery remains open." }, { "id": "REQ-PRODUCT-SYNTAX-HIGHLIGHTING", "jurisdiction": "PRODUCT", "title": "Readable syntax-highlighted source examples", "kind": "product-standard", "summary": "Render source examples with safe static language-aware highlighting, selectable source, accessible contrast and contained mobile scrolling.", "appliesWhen": "The website presents fenced source code or installation commands.", "sourceRefs": [ { "sourceId": "SRC-WCAG", "locator": "Contrast, keyboard focus and reflow" } ], "discoverySourceIds": [], "featureIds": [ "FEAT-DEPLOYMENT" ], "verificationIds": [ "VERIFY-PRODUCT-SYNTAX-HIGHLIGHTING" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "Unknown languages render as escaped plain text. This is a presentation standard, not a complete accessibility certification.", "implementationRefs": [ "site/syntax.mjs", "site/build.mjs", "docs/DESIGN.md" ], "testRefs": [ "site/test/syntax.test.mjs", "docs/verification/syntax-highlighting.md" ], "implementationNote": "Build-time Shiki grammars emit escaped text spans and external contrast-adjusted theme CSS. No runtime highlighting scripts or inline styles." }, { "id": "REQ-PRODUCT-BUNDLE-BUDGET", "jurisdiction": "PRODUCT", "title": "Measured browser delivery and optional component styles", "kind": "product-standard", "summary": "Measure actual browser bundles and published CSS; target 15 KiB gzip for core plus vanilla controls and 5 KiB for default consent CSS, reporting broader optional surfaces separately. Preserve validation and effective-permission behavior.", "appliesWhen": "Documenting or releasing browser runtime and stylesheet entry points.", "sourceRefs": [], "discoverySourceIds": [], "featureIds": [ "FEAT-DEPLOYMENT", "FEAT-CONTROLS" ], "verificationIds": [ "VERIFY-PRODUCT-BUNDLE-BUDGET" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": null, "caveats": "The compiled local consent-plus-controls profile meets 15 KiB gzip; the fully validating compatibility entry remains above target. Optional required-receipt code is reported separately. Transfer size is not startup/interaction timing or a full performance audit. Adopters choose whether to gate on the optional measurement tool.", "implementationRefs": [ "scripts/measure-bundles.mjs", "packages/notabenda/scripts/consent-styles.mjs", "examples/static/build.mjs", "examples/static/choices-build.mjs", "examples/static/choices-page.mjs", "examples/static/consent.mjs", "packages/notabenda/src/consent-runtime-config.ts", "packages/notabenda/src/consent-compile.ts", "packages/notabenda/src/consent-runtime.ts", "packages/notabenda/src/consent-evidence-factory.ts", "packages/notabenda/src/consent-runtime-evidence.ts", "packages/notabenda/src/react-consent.ts" ], "testRefs": [ "packages/notabenda/test/delivery.test.mjs", "docs/verification/browser-delivery.md", "site/test/delivery.test.mjs", "packages/notabenda/test/consent-runtime.test.mjs", "packages/notabenda/test/react-consent.test.mjs" ], "implementationNote": "Build-time full validation produces a bounded, independently parsed browser inventory with exact legacy material scopes. The shared engine keeps required evidence in an explicit optional entry and records authorization provenance on local choices. Consent-only CSS preserves canonical cascade and accessibility rules. Compatibility core-controls still exceeds target." }, { "id": "REQ-PRODUCT-SERVICE-CATALOG", "jurisdiction": "PRODUCT", "title": "Source-backed third-party catalog and resolved disclosures", "kind": "product-standard", "summary": "Standardize provider/product identities and source-backed facts, resolve reviewed site-specific use into shared public rendering, and pin revisions for immutable release history.", "appliesWhen": "Confirmed service selection or catalog-backed legal/preference/directory rendering.", "sourceRefs": [ { "sourceId": "SRC-OPEN-COOKIE-DATABASE", "locator": "README: download formats, wildcard matching and contributions" }, { "sourceId": "SRC-OPEN-COOKIE-LICENSE", "locator": "Apache-2.0 sections 2 and 4; candidate reuse and attribution" } ], "discoverySourceIds": [], "featureIds": [ "FEAT-SERVICE-CATALOG", "FEAT-INVENTORY", "FEAT-DOCUMENTS", "FEAT-SETUP" ], "verificationIds": [ "VERIFY-PRODUCT-SERVICE-CATALOG" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": null, "caveats": "Catalog facts and imported categories do not decide a site’s legal basis, provider role, actual settings, necessity or complete disclosure. Entries remain unreviewed after an operator declares actual use. Purposes must be explicitly declared through setup authoring or imported config; setup does not invent their meaning or legal basis. Private report pins do not automatically become archived legal-release evidence.", "implementationRefs": [ "packages/notabenda/src/catalog.ts", "packages/notabenda/src/catalog-seed.ts", "packages/notabenda/src/catalog-cli.ts", "scripts/build-service-catalog.py", "docs/SERVICE-CATALOG.md", "packages/notabenda/src/service-inventory.ts", "packages/notabenda/src/service-directory.ts", "packages/notabenda/src/services.css", "packages/notabenda/src/react-documents.ts", "packages/notabenda/src/astro/ServiceDirectory.astro", "examples/services/build.mjs", "docs/SERVICES.md", "packages/notabenda/src/catalog-plain.ts", "packages/notabenda/src/catalog-selection.ts", "packages/notabenda/src/catalog-ui.ts", "packages/notabenda/src/setup.ts", "packages/notabenda/src/setup-ui.ts", "packages/notabenda/src/setup-cli.ts", "examples/setup/build.mjs", "packages/notabenda/src/setup-purpose.ts", "packages/notabenda/src/setup-purpose-ui.ts", "packages/notabenda/src/setup-purpose-cli.ts", "packages/notabenda/src/catalog-browser.ts", "packages/notabenda/src/catalog-browser-policy.ts", "packages/notabenda/src/catalog-browser-capture.ts", "packages/notabenda/src/catalog-browser-cli.ts", "packages/notabenda/src/catalog-browser-ui.ts", "packages/notabenda/src/discovery-capture.ts", "packages/notabenda/src/discovery-ui.ts", "catalog/browser-rules.json", "catalog/browser-providers.json", "packages/notabenda/src/setup-catalog-cli.ts", "packages/notabenda/src/cli-json.ts", "packages/notabenda/src/catalog-node.ts", "packages/notabenda/src/catalog-review.ts", "packages/notabenda/src/catalog-review-ui.ts", "packages/notabenda/src/catalog-review-cli.ts", "packages/notabenda/src/catalog-release.ts", "packages/notabenda/src/catalog-release-policy.ts", "packages/notabenda/src/catalog-reference.ts", "packages/notabenda-cf/src/catalog-release-policy.ts", "packages/notabenda-cf/src/catalog-reference.ts", "packages/notabenda-cf/src/history.ts", "packages/notabenda-cf/src/catalog-render.ts", "packages/notabenda-cf/src/worker.ts", "examples/catalog-releases/build.mjs" ], "testRefs": [ "packages/notabenda/test/catalog.test.mjs", "packages/notabenda/test/package.test.mjs", "docs/verification/service-catalog.md", "packages/notabenda/test/services.test.mjs", "packages/notabenda/test/astro-package.test.mjs", "site/test/services.test.mjs", "packages/notabenda/test/catalog-selection.test.mjs", "site/test/catalog-setup.test.mjs", "packages/notabenda/test/setup-purpose.test.mjs", "packages/notabenda/test/catalog-browser.test.mjs", "packages/notabenda/test/catalog-browser-workflow.test.mjs", "packages/notabenda/test/setup-project.test.mjs", "packages/notabenda/test/catalog-review.test.mjs", "docs/verification/catalog-review.md", "packages/notabenda/test/catalog-release.test.mjs", "docs/verification/catalog-release.md", "site/test/host.test.mjs", "packages/notabenda-cf/test/starter.test.mjs" ], "implementationNote": "Optional versioned catalog normalization/search, licensed offline seed and source-linked public directory views now connect to CLI/admin setup review. Explicit selection supplies actual provider/location/purposes, preserves integrations/restrictions, and keeps minimized pinned reference metadata plus justification in a bounded private setup report. Resume checks the matching declared service facts. Optional browser recognition now preserves its complete rule/source snapshot. Optional documentation profiles now cover four products; independent provider-practice review and broader coverage remain open. Explicit wizard --project scanning now feeds the same actual-use confirmation as manual catalog search and writes separate private discovery findings. Noninteractive runs preserve prior pins and never select services from matches. Setup/catalog JSON and tracked source reads reject nonregular inputs without FIFO blocking. Browser/admin local-filesystem scanning remains unavailable. Explicit CLI/admin renewal compares selected reference/service/purpose facts, requires a new private reason and confirmation, rejects stale full-service snapshots and retains prior/next pins in bounded private report history. Operator labels and enforcement settings remain unchanged; focused CLI review does not reapply historical setup facts. Explicit post-compilation catalog finalization now binds current selected reference/site-use facts to a digest-only public descriptor and separate archive. Exact legal/source bytes are preserved; CF validates immutable storage and separately granted inspection/comparison. Justifications and questionnaire/re-review history stay outside the attachment." }, { "id": "REQ-PRODUCT-SERVICE-DETECTION", "jurisdiction": "PRODUCT", "title": "Explainable passive third-party recognition", "kind": "product-standard", "summary": "Recognize candidate products with bounded exact, pattern and combined passive signals, minimize retained observations and require review before configuration changes. Initial static project discovery covers declared SDK dependencies/imports and Terraform names without project execution or network probes.", "appliesWhen": "An authorized operator explicitly invokes catalog-backed service discovery.", "sourceRefs": [ { "sourceId": "SRC-BROWSER-GOOGLE-TAG", "locator": "Google tag loader path and gtag bootstrap; one tag can have multiple product destinations" }, { "sourceId": "SRC-BROWSER-GOOGLE-GTM", "locator": "Tag Manager script/frame paths; only HTTPS is recognized by these rules" }, { "sourceId": "SRC-BROWSER-STRIPE-JS", "locator": "Documented script delivery host; no payment feature or provider-practice classification" }, { "sourceId": "SRC-BROWSER-STRIPE-VERSION", "locator": "Versioned loader path and supported legacy v3 delivery. Rule is not a version recommendation" }, { "sourceId": "SRC-BROWSER-TURNSTILE", "locator": "Widget loader path, div class marker and turnstile API object. No challenge is executed" }, { "sourceId": "SRC-BROWSER-INTERCOM", "locator": "Widget loader prefix and Intercom function; app/workspace suffix is never exported as a witness" }, { "sourceId": "SRC-BROWSER-POSTHOG-COOKIE", "locator": "Official tutorial excerpt describes a project-token-derived cookie name; only the name pattern is matched, never its value" }, { "sourceId": "SRC-BROWSER-POSTHOG-LOADER", "locator": "Official tutorial excerpt describes asset-host rewriting and the array.js path. Custom hosts and proxies may not match" }, { "sourceId": "SRC-BROWSER-POSTHOG-REGIONS", "locator": "Official proxy guide names US and EU asset hosts" } ], "discoverySourceIds": [], "featureIds": [ "FEAT-SERVICE-CATALOG", "FEAT-DISCOVERY", "FEAT-SETUP" ], "verificationIds": [ "VERIFY-PRODUCT-SERVICE-DETECTION" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": null, "caveats": "A matched signature is a candidate, not execution, ownership, permission, legal classification or absence-of-tracking proof. Existing version-1 captures remain origin/name-only. Advanced code never arrives as executable catalog data. New recognition witnesses exclude observed paths/query/storage/global values; the embedded v1 origins, storage names and labels may still include identifiers. Combined signals need not be simultaneous or causal. Snapshots are unverified reports, not authenticated evidence.", "implementationRefs": [ "packages/notabenda/src/catalog-project.ts", "packages/notabenda/src/catalog-cli.ts", "packages/notabenda/src/discovery-cli.ts", "packages/notabenda/src/catalog-browser.ts", "packages/notabenda/src/catalog-browser-policy.ts", "packages/notabenda/src/catalog-browser-capture.ts", "packages/notabenda/src/catalog-browser-cli.ts", "packages/notabenda/src/catalog-browser-ui.ts", "packages/notabenda/src/discovery-capture.ts", "packages/notabenda/src/discovery-ui.ts", "catalog/browser-rules.json", "catalog/browser-providers.json", "packages/notabenda/src/setup-catalog-cli.ts", "packages/notabenda/src/cli-json.ts", "packages/notabenda/src/catalog-node.ts", "packages/notabenda/src/setup-cli.ts", "packages/notabenda/src/setup-ui.ts" ], "testRefs": [ "packages/notabenda/test/catalog.test.mjs", "packages/notabenda/test/package.test.mjs", "docs/verification/service-catalog.md", "packages/notabenda/test/catalog-browser.test.mjs", "packages/notabenda/test/catalog-browser-workflow.test.mjs", "packages/notabenda/test/setup-project.test.mjs", "packages/notabenda/test/setup.test.mjs" ], "implementationNote": "Bounded offline Node scanner and npx CLI, Git ignore-aware selection with fsmonitor disabled, built-in non-Git skips, source/development evidence labels and private exclusive review outputs are implemented. Optional browser path/name/global/marker and combined rules now add minimized channel witnesses, exact rule/source snapshots, local review UI and explicit CLI analysis. Arbitrary regex/executable rules are unsupported. Broader project detectors and automated release-provenance archival remain planned. Explicit wizard --project scanning now feeds the same actual-use confirmation as manual catalog search and writes separate private discovery findings. Noninteractive runs preserve prior pins and never select services from matches. Setup/catalog JSON and tracked source reads reject nonregular inputs without FIFO blocking. Browser/admin local-filesystem scanning remains unavailable. Browser setup links to offline project discovery and displays the npx command for dependency/infrastructure coverage, with manual review and private-report handling. The UI does not execute commands or inspect the local project." }, { "id": "REQ-PRODUCT-SERVICE-PROFILES", "jurisdiction": "PRODUCT", "title": "Sourced product documentation in service review", "kind": "product-standard", "summary": "Keep bounded, optional product notes, document links and site-specific review questions tied to public sources, selected revisions and retained review history.", "appliesWhen": "A catalog product supplies a documentation profile during explicit service review or retained-reference inspection.", "sourceRefs": [ { "sourceId": "SRC-PROFILE-CLOUDFLARE-PLACEMENT", "locator": "Public documentation, privacy or contractual reference; original conditional notes, not a verified provider classification." }, { "sourceId": "SRC-PROFILE-CLOUDFLARE-REGIONAL", "locator": "Public documentation, privacy or contractual reference; original conditional notes, not a verified provider classification." }, { "sourceId": "SRC-PROFILE-CLOUDFLARE-PRIVACY", "locator": "Public documentation, privacy or contractual reference; original conditional notes, not a verified provider classification." }, { "sourceId": "SRC-PROFILE-CLOUDFLARE-DPA", "locator": "Public documentation, privacy or contractual reference; original conditional notes, not a verified provider classification." }, { "sourceId": "SRC-PROFILE-STRIPE-ROLES", "locator": "Public documentation, privacy or contractual reference; original conditional notes, not a verified provider classification." }, { "sourceId": "SRC-PROFILE-STRIPE-PRIVACY", "locator": "Public documentation, privacy or contractual reference; original conditional notes, not a verified provider classification." }, { "sourceId": "SRC-PROFILE-STRIPE-DPA", "locator": "Public documentation, privacy or contractual reference; original conditional notes, not a verified provider classification." }, { "sourceId": "SRC-PROFILE-SUPABASE-REGIONS", "locator": "Public documentation, privacy or contractual reference; original conditional notes, not a verified provider classification." }, { "sourceId": "SRC-PROFILE-SUPABASE-RESIDENCY", "locator": "Public documentation, privacy or contractual reference; original conditional notes, not a verified provider classification." }, { "sourceId": "SRC-PROFILE-SUPABASE-SELF-HOSTING", "locator": "Public documentation, privacy or contractual reference; original conditional notes, not a verified provider classification." }, { "sourceId": "SRC-PROFILE-SUPABASE-PRIVACY", "locator": "Public documentation, privacy or contractual reference; original conditional notes, not a verified provider classification." }, { "sourceId": "SRC-PROFILE-SUPABASE-DPA", "locator": "Public documentation, privacy or contractual reference; original conditional notes, not a verified provider classification." }, { "sourceId": "SRC-PROFILE-RESEND-STORAGE", "locator": "Public documentation, privacy or contractual reference; original conditional notes, not a verified provider classification." }, { "sourceId": "SRC-PROFILE-RESEND-DOMAINS", "locator": "Public documentation, privacy or contractual reference; original conditional notes, not a verified provider classification." }, { "sourceId": "SRC-PROFILE-RESEND-PRIVACY", "locator": "Public documentation, privacy or contractual reference; original conditional notes, not a verified provider classification." } ], "discoverySourceIds": [ "SRC-PROFILE-RESEND-DPA" ], "featureIds": [ "FEAT-SERVICE-CATALOG", "FEAT-SETUP" ], "verificationIds": [ "VERIFY-PRODUCT-SERVICE-PROFILES" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": null, "caveats": "Documentation can change and describes provider claims or options. Source retrieval is not independent practice verification, a signed agreement or legal approval. Requirement links are conditional review context. Initial profiles cover four products; other entries may have no profile. Actual entity, location, purpose, basis, retention and settings remain operator-supplied.", "implementationRefs": [ "catalog/product-profiles.json", "catalog/schema.json", "scripts/build-service-catalog.py", "packages/notabenda/src/catalog-reference.ts", "packages/notabenda-cf/src/catalog-reference.ts", "packages/notabenda/src/catalog-profile.ts", "packages/notabenda-cf/src/catalog-profile.ts", "packages/notabenda/src/catalog-ui.ts", "packages/notabenda/src/catalog-review-ui.ts", "packages/notabenda/src/catalog-cli.ts", "packages/notabenda/src/setup-catalog-cli.ts", "packages/notabenda-cf/src/catalog-render.ts" ], "testRefs": [ "packages/notabenda/test/catalog-profile.test.mjs", "packages/notabenda/test/package.test.mjs", "docs/verification/catalog-profiles.md" ], "implementationNote": "Version-1 optional closed-schema profiles, static escaped renderer and terminal inspection; explicit picker copying preserves entered URLs and clears confirmation on edits. Selected source/profile revisions survive private setup pins, renewed comparison and separately authorized retained-release views. No external fetch, automatic setting, consent grant or public policy prose insertion." }, { "id": "REQ-PRODUCT-INDIRECT-NOTICE", "jurisdiction": "PRODUCT", "title": "Version-bound indirect-collection particulars", "kind": "product-standard", "summary": "Provide optional static HTML and plain-text indirect-collection notices with explicit reviewed context and pinned privacy facts, separate from direct forms, consent and delivery.", "appliesWhen": "A host explicitly chooses the NZ IPP3A profile for reviewed indirect or mixed-source collection facts.", "sourceRefs": [], "discoverySourceIds": [], "featureIds": [ "FEAT-FORMS", "FEAT-DOCUMENTS" ], "verificationIds": [ "VERIFY-PRODUCT-INDIRECT-NOTICE" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "No recipient case data, delivery receipts, legal applicability, timing or exception assessment. Structural normalization alone does not verify identity; digest/fact comparison does not authenticate the author.", "implementationRefs": [ "packages/notabenda/src/indirect-collection.ts", "packages/notabenda/src/content.ts", "packages/notabenda/src/react-documents.ts", "packages/notabenda/src/astro/IndirectCollectionNotice.astro", "packages/notabenda/src/setup.ts", "examples/indirect-collection/build.mjs", "packages/notabenda/src/styles.css" ], "testRefs": [ "packages/notabenda/test/indirect-collection.test.mjs", "packages/notabenda/test/setup.test.mjs", "packages/notabenda/test/package.test.mjs", "packages/notabenda/test/astro-package.test.mjs", "site/test/host.test.mjs", "docs/verification/indirect-collection.md" ], "implementationNote": "Bounded strict inputs require selected categories, recipient wording, particular-law review and usable rights route. The collecting/holding agency comes from the privacy release; neither source nor storage provider replaces it. Phase, reviewed wording and full purpose facts affect identity. Framework wrappers share the same script-free renderer." }, { "id": "REQ-EU-GUARANTEE-NOTICE", "jurisdiction": "EU-EEA", "title": "Prominent harmonised goods legal-guarantee notice", "kind": "primary-law", "summary": "Use the prescribed shop-level goods notice with appropriate language and online colour, preserving its contents and QR information.", "appliesWhen": "Applicable goods consumer contracts and relevant EU/national implementing law require this guarantee information.", "sourceRefs": [ { "sourceId": "SRC-EU-CRD-20260927", "locator": "Articles 6(1)(l) and 22a" }, { "sourceId": "SRC-EU-GUARANTEE-REG", "locator": "Articles 1 and 3; Annex I" }, { "sourceId": "SRC-EU-GUARANTEE-GUIDE", "locator": "Sections 2.1 and 2.3" }, { "sourceId": "SRC-EU-GUARANTEE-ASSETS", "locator": "Colour SVG notice archive and corresponding colour PDF page 1" } ], "discoverySourceIds": [], "featureIds": [ "FEAT-TERMS", "FEAT-DOCUMENTS" ], "verificationIds": [ "VERIFY-EU-GUARANTEE-NOTICE" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": "2026-09-27", "timingNote": "2025/1960 applies from 27 September 2026; applicable national transposition and scope require review.", "caveats": "Source integrity is not legal conformity, linguistic review or proof of prominent/legible placement. Actual source colour discrepancy remains open. No product guarantee, checkout action or confirmation is implied.", "implementationRefs": [ "packages/notabenda/src/guarantee-notice.ts", "packages/notabenda/src/guarantee-notice-build.ts", "packages/notabenda/src/guarantee-notice-json.ts", "packages/notabenda/src/guarantee-notice-data.ts", "packages/notabenda/src/guarantees.css", "packages/notabenda/src/react-documents.ts", "packages/notabenda/src/astro/LegalGuaranteeNotice.astro", "packages/notabenda/assets/guarantees/manifest.json", "examples/guarantees/build.mjs" ], "testRefs": [ "packages/notabenda/test/guarantee-notice.test.mjs", "packages/notabenda/test/package.test.mjs", "packages/notabenda/test/astro-package.test.mjs", "site/test/host.test.mjs", "docs/verification/guarantees.md" ], "implementationNote": "Optional static vanilla/React/Astro renderer with 24 unchanged official colour assets, selected-file content-addressed output, fixed QR information destination, PDF-extracted text alternative and explicit review. Colour/reference discrepancy, actual prominence, linguistic/legal review and device/QR acceptance remain open." }, { "id": "REQ-EU-GUARANTEE-LABEL", "jurisdiction": "EU-EEA", "title": "Conditional product durability-guarantee label", "kind": "primary-law", "summary": "Distinguish qualifying producer durability guarantees and show the prescribed product-specific label, including directly before applicable electronic ordering.", "appliesWhen": "Applicable goods consumer contracts and relevant EU/national implementing law require this guarantee information.", "sourceRefs": [ { "sourceId": "SRC-EU-CRD-20260927", "locator": "Articles 6(1)(la), 8(2) and 22a" }, { "sourceId": "SRC-EU-GUARANTEE-REG", "locator": "Article 2; Annex II" }, { "sourceId": "SRC-EU-GUARANTEE-GUIDE", "locator": "Sections 3.1-3.3" } ], "discoverySourceIds": [], "featureIds": [ "FEAT-TERMS", "FEAT-DOCUMENTS" ], "verificationIds": [ "VERIFY-EU-GUARANTEE-LABEL" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": "2026-09-27", "timingNote": "2025/1960 applies from 27 September 2026; applicable national transposition and scope require review.", "caveats": "Finished-file ingestion and static product-specific rendering include a sourced complete draft example. Qualification and review remain explicit host declarations, not producer identity/offer or statutory design verification. Software QR decoding covers selected raster sizes; physical devices, assistive technology, target placement, independent legal/design review, final order action and durable confirmation remain open. Original-file retention is host-owned and not integrated into the DO archive.", "implementationRefs": [ "packages/notabenda/src/guarantee-label.ts", "packages/notabenda/src/guarantee-notice-json.ts", "packages/notabenda-authoring/src/guarantee-label-build.ts", "packages/notabenda-authoring/src/guarantee-label-image.ts", "packages/notabenda/src/guarantees.css", "packages/notabenda/src/react-documents.ts", "packages/notabenda/src/astro/DurabilityGuaranteeLabel.astro", "docs/GUARANTEE-LABELS.md", "packages/notabenda-authoring/src/guarantee-label-clips.ts", "examples/guarantees/product-build.mjs", "examples/guarantees/producer/prepare.py", "examples/guarantees/producer/verify.py", "examples/guarantees/producer/manifest.json", "docs/GUARANTEE-PRODUCER-EXAMPLE.md", "packages/notabenda/src/files.ts", "packages/notabenda-cf/src/order-blobs.ts", "packages/notabenda-cf/src/orders.ts" ], "testRefs": [ "packages/notabenda-authoring/test/guarantee-label.test.mjs", "packages/notabenda-authoring/test/package.test.mjs", "packages/notabenda/test/package.test.mjs", "packages/notabenda/test/astro-package.test.mjs", "docs/verification/guarantees.md", "packages/notabenda-authoring/test/guarantee-producer.test.mjs", "packages/notabenda/test/cli.test.mjs", "site/test/host.test.mjs", "packages/notabenda-cf/test/orders.test.mjs" ], "implementationNote": "Optional bounded PNG/JPEG/outlined-SVG importer preserves original binary bytes and binds explicit qualifying facts, product, producer, duration, review and wording. A fixed maintainer fixture fills only the official template’s three fields with pinned Inter outlines, records source/font provenance and compares fixed artwork. Light/dark examples include optional enlarged inspection; software QR decoding uses development-only tools. No public template generator, automatic no-guarantee inference, payment action or confirmation." }, { "id": "REQ-PRODUCT-GUARANTEE-NOTICE", "jurisdiction": "PRODUCT", "title": "Source-preserving multilingual guarantee notice display", "kind": "product-standard", "summary": "Build and render one selected unchanged official notice with traceable asset/text provenance and a readable static alternative.", "appliesWhen": "A host explicitly selects the sourced EU goods legal-guarantee notice.", "sourceRefs": [], "discoverySourceIds": [], "featureIds": [ "FEAT-TERMS", "FEAT-DOCUMENTS" ], "verificationIds": [ "VERIFY-PRODUCT-GUARANTEE-NOTICE" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "Source integrity is not legal conformity, linguistic review or proof of prominent/legible placement. Actual source colour discrepancy remains open. No product guarantee, checkout action or confirmation is implied.", "implementationRefs": [ "packages/notabenda/src/guarantee-notice.ts", "packages/notabenda/src/guarantee-notice-build.ts", "packages/notabenda/src/guarantee-notice-json.ts", "packages/notabenda/src/guarantee-notice-data.ts", "packages/notabenda/src/guarantees.css", "packages/notabenda/src/react-documents.ts", "packages/notabenda/src/astro/LegalGuaranteeNotice.astro", "packages/notabenda/assets/guarantees/manifest.json", "examples/guarantees/build.mjs" ], "testRefs": [ "packages/notabenda/test/guarantee-notice.test.mjs", "packages/notabenda/test/package.test.mjs", "packages/notabenda/test/astro-package.test.mjs", "site/test/host.test.mjs", "docs/verification/guarantees.md" ] }, { "id": "REQ-PRODUCT-PAID-ORDER-ARCHIVES", "jurisdiction": "PRODUCT", "title": "Retained paid-order reviews, original files and atomic local admission", "kind": "product-standard", "summary": "Retain exact reviews and original producer files separately from small searchable receipts; bind one admission to a host checkout intent across quote revisions, with local host writes and replay protection in the same transaction.", "appliesWhen": "An adopter opts into notabenda-cf/orders.", "sourceRefs": [ { "sourceId": "SRC-CF-DO-SQLITE", "locator": "Asynchronous KV transaction contract and local atomicity" }, { "sourceId": "SRC-CF-DO-LIMITS", "locator": "SQLite combined key/value and legacy KV value limits; package chunk profile is separate" } ], "discoverySourceIds": [], "featureIds": [ "FEAT-PAID-ORDERS", "FEAT-BACKOFFICE", "FEAT-RECORDS" ], "verificationIds": [ "VERIFY-PRODUCT-PAID-ORDER-ARCHIVES" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "Host authorization, commercial correctness and external operations remain host-owned. No payment, fulfillment, contract formation or durable-medium confirmation is performed. Hashes do not provide WORM storage or prove customer presentation. Production/regional legal acceptance remains separate.", "implementationRefs": [ "packages/notabenda-cf/src/orders.ts", "packages/notabenda-cf/src/order-context.ts", "packages/notabenda-cf/src/order-blobs.ts", "packages/notabenda-cf/src/order-render.ts", "packages/notabenda-cf/src/order-admin-style.ts", "packages/notabenda-cf/src/lifecycle.ts", "packages/notabenda-cf/src/worker.ts", "packages/notabenda-cf/src/types.ts", "packages/notabenda-cf/scripts/sync-order-policy.mjs", "site/order-demo.mjs", "site/order-demo-admin.mjs" ], "testRefs": [ "packages/notabenda-cf/test/orders.test.mjs", "packages/notabenda-cf/test/orders-package.test.mjs", "scripts/check-order-archive-runtime.mjs", "site/test/order-demo.test.mjs", "site/test/demo.test.mjs", "docs/verification/paid-orders.md" ], "implementationNote": "64 KiB sealed chunks, bounded review/files, CAS activation, intent-level consumption, fresh post-decision clock, local mutation plans, scoped private archives, safe admin rendering/downloads and resumable retirement. Existing demo receipts retain their compatibility path." }, { "jurisdiction": "EU-EEA", "title": "Provide the concluded distance contract confirmation on a durable medium", "kind": "primary-law", "summary": "Applicable confirmation includes required pre-contract information and any relevant digital-content consent/acknowledgment; actual provision and timing remain separate from server retention.", "appliesWhen": "An in-scope distance consumer contract is concluded; assess national implementation and exceptions.", "sourceRefs": [ { "sourceId": "SRC-EU-CRD-20260927", "locator": "Article 2(10), Article 8(7), with Article 6(1) and 16(m)" }, { "sourceId": "SRC-EU-DURABLE-CONTENT-SERVICES", "locator": "Paragraphs 35, 42–51 and operative part; earlier directive context" } ], "discoverySourceIds": [], "featureIds": [ "FEAT-ORDER-CONFIRMATION", "FEAT-PAID-ORDERS" ], "researchStatus": "initial-research", "legalReviewStatus": "unreviewed", "implementationStatus": "partial", "effectiveFrom": null, "timingNote": "Article 8(7) selected text reread on 19 October 2026. Host coordinates actual goods delivery/service commencement and reasonable confirmation timing.", "caveats": "File retention and provider acceptance do not establish consumer receipt, legal sufficiency or timing. The host supplies reviewed complete personally addressed content, actual contract facts, frozen destination resolution, scheduling and provider/recipient reconciliation. This initial profile does not support omitting information based on prior durable provision or overwriting a mistaken confirmation.", "implementationRefs": [ "packages/notabenda-cf/src/order-confirmations.ts", "packages/notabenda-cf/src/order-confirmation-state.ts", "packages/notabenda-cf/src/order-confirmation-dispatch.ts", "packages/notabenda-cf/src/order-confirmation-render.ts", "packages/notabenda-cf/src/orders.ts", "packages/notabenda-cf/src/lifecycle.ts", "packages/notabenda-cf/src/worker.ts", "packages/notabenda-cf/src/types.ts", "site/order-confirmation-seed.mjs", "site/order-demo-admin.mjs" ], "testRefs": [ "packages/notabenda-cf/test/order-confirmations.test.mjs", "packages/notabenda-cf/test/orders-package.test.mjs", "site/test/order-demo.test.mjs", "scripts/check-order-confirmation-runtime.mjs", "docs/verification/order-confirmations.md" ], "implementationNote": "Bounded original files and manifest plus pending job seal atomically. Stable delivery identity, host callback dispatch, separate private inspection and lifecycle fencing preserve the admission capture. Production/regional and real delivery acceptance remain open.", "id": "REQ-EU-ORDER-CONFIRMATION", "verificationIds": [ "VERIFY-EU-ORDER-CONFIRMATION" ] }, { "jurisdiction": "PRODUCT", "title": "Immutable customer confirmation bundles and recoverable host delivery", "kind": "product-standard", "summary": "Bind personally addressed complete host files, immutable destination version and concluded-contract facts to an admitted order; atomically retain exact files and a delivery job, with bounded leases, separate inspection and retirement fences.", "appliesWhen": "A host opts into notabenda-cf/order-confirmations.", "sourceRefs": [ { "sourceId": "SRC-EU-CRD-20260927", "locator": "Article 2(10), Article 8(7), with Article 6(1) and 16(m)" }, { "sourceId": "SRC-EU-DURABLE-CONTENT-SERVICES", "locator": "Paragraphs 35, 42–51 and operative part; earlier directive context" } ], "discoverySourceIds": [], "featureIds": [ "FEAT-ORDER-CONFIRMATION", "FEAT-BACKOFFICE", "FEAT-RECORDS" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "File retention and provider acceptance do not establish consumer receipt, legal sufficiency or timing. The host supplies reviewed complete personally addressed content, actual contract facts, frozen destination resolution, scheduling and provider/recipient reconciliation. This initial profile does not support omitting information based on prior durable provision or overwriting a mistaken confirmation.", "implementationRefs": [ "packages/notabenda-cf/src/order-confirmations.ts", "packages/notabenda-cf/src/order-confirmation-state.ts", "packages/notabenda-cf/src/order-confirmation-dispatch.ts", "packages/notabenda-cf/src/order-confirmation-render.ts", "packages/notabenda-cf/src/orders.ts", "packages/notabenda-cf/src/lifecycle.ts", "packages/notabenda-cf/src/worker.ts", "packages/notabenda-cf/src/types.ts", "site/order-confirmation-seed.mjs", "site/order-demo-admin.mjs" ], "testRefs": [ "packages/notabenda-cf/test/order-confirmations.test.mjs", "packages/notabenda-cf/test/orders-package.test.mjs", "site/test/order-demo.test.mjs", "scripts/check-order-confirmation-runtime.mjs", "docs/verification/order-confirmations.md" ], "implementationNote": "Bounded original files and manifest plus pending job seal atomically. Stable delivery identity, host callback dispatch, separate private inspection and lifecycle fencing preserve the admission capture. Production/regional and real delivery acceptance remain open. Actual local SQLite confirmation/provider stores survived restart with the exact large attachment, manifest/destination and original admission. Lost-response recovery made two provider attempts with one simulated downstream commit; stale settlement was refused.", "id": "REQ-PRODUCT-ORDER-CONFIRMATION", "verificationIds": [ "VERIFY-PRODUCT-ORDER-CONFIRMATION" ] }, { "id": "REQ-PRODUCT-STORAGE-EXCEPTIONS", "jurisdiction": "PRODUCT", "title": "Independent and durable storage-exception objections", "kind": "product-standard", "summary": "Gate explicit statistical/appearance declarations behind hydration and usable controls, persist objections atomically across revisions, and require a current explicit action before resuming. Reuse lifecycle and exact-key cleanup without granting consent.", "appliesWhen": "An operator opts into the optional storage-exception controller.", "sourceRefs": [], "discoverySourceIds": [], "featureIds": [ "FEAT-REGIONS", "FEAT-CONTROLS", "FEAT-ENFORCEMENT" ], "verificationIds": [ "VERIFY-PRODUCT-STORAGE-EXCEPTIONS" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "Engineering gate only. The host owns qualification, truthful disclosure, connected controls, producer behavior, preference storage and downstream legal obligations. No server evidence or automatic provider qualification is implied.", "implementationRefs": [ "packages/notabenda/src/storage-exception-policy.ts", "packages/notabenda/src/storage-exceptions.ts", "packages/notabenda/src/storage-exception-controls.ts", "packages/notabenda/src/storage-exceptions.css", "packages/notabenda/src/service-runner.ts", "packages/notabenda/src/storage-cleanup.ts", "examples/storage-exceptions/config.mjs", "examples/storage-exceptions/build.mjs", "examples/storage-exceptions/client.mjs" ], "testRefs": [ "packages/notabenda/test/storage-exceptions.test.mjs", "docs/verification/storage-exceptions.md", "site/test/storage-exceptions.test.mjs" ] }, { "id": "REQ-PRODUCT-LOCALIZATION", "jurisdiction": "PRODUCT", "title": "Complete versioned messages for legal pages, consent controls and terms acceptance", "kind": "product-standard", "summary": "Validate complete selected plain-text dictionaries and fixed placeholders; render language/direction consistently; pin consent and terms-interface copy to its retained release; distinguish presentation revisions from material disclosure scopes while preserving legacy English artifacts.", "appliesWhen": "An operator supplies the optional localization declaration for legal pages, cookie-choice controls or ordinary terms acceptance.", "sourceRefs": [], "discoverySourceIds": [], "featureIds": [ "FEAT-LOCALIZATION", "FEAT-CONTROLS" ], "verificationIds": [ "VERIFY-PRODUCT-LOCALIZATION" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "Host owns translation, review, declared facts and semantic disclosure revisions. This contract covers legal pages, cookie-choice controls and ordinary terms acceptance; it is not a country compliance pack, automatic translation, comprehensive interface localization or proof of valid consent or an enforceable agreement.", "implementationRefs": [ "packages/notabenda/src/localization-policy.ts", "packages/notabenda/src/document-localization.ts", "packages/notabenda/src/localized-documents.ts", "packages/notabenda/src/config.ts", "packages/notabenda/src/documents.ts", "packages/notabenda/src/controls.ts", "packages/notabenda/src/consent-notice.ts", "packages/notabenda/src/consent-runtime-config.ts", "packages/notabenda/src/consent-evidence.ts", "packages/notabenda/src/content.ts", "packages/notabenda-cf/src/consent.ts", "packages/notabenda-cf/src/localization-policy.ts", "examples/localization/config.mjs", "examples/localization/build.mjs", "packages/notabenda/src/react-consent-bindings.ts", "packages/notabenda/src/astro-client.ts", "packages/notabenda/src/astro/PreferencesButton.astro", "packages/notabenda/src/terms-localization-policy.ts", "packages/notabenda/src/terms.ts", "packages/notabenda-cf/src/terms-localization-policy.ts", "packages/notabenda-cf/src/terms.ts", "packages/notabenda-cf/src/render.ts", "examples/localization/agreement-build.mjs", "examples/localization/agreement.mjs" ], "testRefs": [ "packages/notabenda/test/localization.test.mjs", "docs/verification/localization.md", "site/test/localization.test.mjs", "packages/notabenda/test/terms-localization.test.mjs", "site/test/demo.test.mjs" ] }, { "id": "REQ-PRODUCT-AGENT-INTEGRATION", "jurisdiction": "PRODUCT", "title": "Agent integration skill and public Markdown documentation", "kind": "product-standard", "summary": "Distribute a versioned integration skill with the package and website; provide a curated llms.txt and Markdown versions of maintained guides with working links and explicit review boundaries. Connect requested outcomes to version-matched configuration paths, separate host work, facts, current setup questions and observable acceptance scenarios.", "appliesWhen": "An agent helps an adopter configure, update or validate a Notabenda integration.", "sourceRefs": [ { "sourceId": "SRC-LLMS-TXT", "locator": "Proposal and Format: concise Markdown index, file-list links, Markdown alternates and describedby discovery." } ], "discoverySourceIds": [], "featureIds": [ "FEAT-SETUP", "FEAT-DEPLOYMENT" ], "verificationIds": [ "VERIFY-PRODUCT-AGENT-INTEGRATION" ], "researchStatus": "product-decision", "legalReviewStatus": "not-applicable", "implementationStatus": "implemented", "effectiveFrom": null, "timingNote": null, "caveats": "Instructions are advisory and version-specific. Facts, legal review, host authorization, deployment permission and optional CI remain adopter decisions. No package registry publication, automatic skill installation, account grant or compliance claim.", "implementationRefs": [ "skills/notabenda/SKILL.md", "skills/notabenda/agents/openai.yaml", "llms.txt", "site/agent-docs.mjs", "site/build.mjs", "site/host.mjs", "site/navigation.mjs", "site/guide-pages.mjs", "packages/notabenda/package.json", "packages/notabenda/scripts/copy-assets.mjs", "docs/AGENT-SETUP.md", "packages/notabenda/src/integration-reference.ts", "packages/notabenda/src/cli.ts", "skills/notabenda/references/configuration-target.md" ], "testRefs": [ "packages/notabenda/test/agent-integration.test.mjs", "site/test/agent-docs.test.mjs", "docs/verification/agent-integration.md", "site/test/host.test.mjs", "packages/notabenda/test/integration-reference.test.mjs" ], "implementationNote": "One maintained skill is copied into package distribution and explicit public website assets. Source-backed guides emit Markdown alternates; positional link edits retain authored examples. Tests pack and install the local package offline, execute documented commands, retain draft rejection and verify generated public links/types without opening evidence stores. Read-only describe CLI and optional integration API expose target/prerequisite maps, factual questions, separate host work and a shared-engine unknown-answer template. Actual compiler typechecks protect advertised config paths; project facts are never read by describe and no target is automatically enabled." } ], "verification": [ { "id": "VERIFY-EU-NOTICE", "requirementIds": [ "REQ-EU-NOTICE" ], "status": "partial", "expected": "Missing applicable controller, purpose, recipient, retention, transfer, or rights facts identify this requirement; inline collection notice links resolve.", "testRefs": [ "packages/notabenda/test/config.test.mjs", "packages/notabenda/test/documents.test.mjs" ] }, { "id": "VERIFY-EU-CONSENT", "requirementIds": [ "REQ-EU-CONSENT" ], "status": "partial", "expected": "An explicit purpose grant references the released wording; withdrawal uses the persistent controls and stops relevant future processing.", "testRefs": [ "packages/notabenda/test/consent.test.mjs" ] }, { "id": "VERIFY-EU-DEVICE", "requirementIds": [ "REQ-EU-DEVICE" ], "status": "partial", "expected": "A fresh and a rejected session produce no requests or device access for declared consent-requiring integrations.", "testRefs": [ "packages/notabenda/test/consent.test.mjs" ] }, { "id": "VERIFY-EU-FAIR-CHOICE", "requirementIds": [ "REQ-EU-FAIR-CHOICE" ], "status": "partial", "expected": "All themes show usable accept/reject/customize actions; scrolling, dismissal, and navigation never grant optional permission.", "testRefs": [ "packages/notabenda/test/consent.test.mjs", "docs/verification/consent-browser.md" ] }, { "id": "VERIFY-FR-SCOPE", "requirementIds": [ "REQ-FR-SCOPE" ], "status": "automated", "expected": "Adding an optional purpose leaves that purpose blocked until granted; a cosmetic release alone does not invalidate existing choices.", "testRefs": [ "packages/notabenda/test/regional-consent.test.mjs" ] }, { "id": "VERIFY-DE-DEVICE", "requirementIds": [ "REQ-DE-DEVICE" ], "status": "partial", "expected": "A declared exemption must name its condition; an advertising loader cannot bypass the decision engine by being labeled necessary. These shared-engine checks do not establish legal qualification of the declared exception.", "testRefs": [ "packages/notabenda/test/regional-consent.test.mjs" ] }, { "id": "VERIFY-IT-REPROMPT", "requirementIds": [ "REQ-IT-REPROMPT" ], "status": "partial", "expected": "Refusal, partial consent and dismissal suppress solicitation independently of choice expiry. Test exact material transitions, unavailable/legacy state, cross-tab acknowledgement and UTC calendar boundaries. Legal presentation-time interpretation and full platform review remain open.", "testRefs": [ "packages/notabenda/test/prompt-policy.test.mjs", "site/test/host.test.mjs" ] }, { "id": "VERIFY-ES-CHOICE", "requirementIds": [ "REQ-ES-CHOICE" ], "status": "partial", "expected": "Every built-in theme exposes both actions in the first layer without hiding rejection in a settings screen.", "testRefs": [ "docs/verification/consent-browser.md" ] }, { "id": "VERIFY-IE-DEVICE", "requirementIds": [ "REQ-IE-DEVICE" ], "status": "partial", "expected": "The Irish profile leaves optional trackers inert until an explicit choice and documents the requested-service reason for exemptions. Current automated scenarios exercise the shared engine with an explicit Irish declaration; profile review and duration policy remain open.", "testRefs": [ "packages/notabenda/test/regional-consent.test.mjs" ] }, { "id": "VERIFY-IE-CONSENT-DURATION", "requirementIds": [ "REQ-IE-CONSENT-DURATION" ], "status": "partial", "expected": "A reviewed duration policy distinguishes calendar-month guidance, explicit lifetimes and case-specific justification. It must not inherit another country's prompt interval or treat a vendor retention period as consent. Automated scenarios cover the explicit default cap, calendar edges, local migration, preserved refusals/solicitation memory and required-evidence/CF parity. Case-specific extensions and independent legal/platform review remain open.", "testRefs": [ "packages/notabenda/test/grant-expiry.test.mjs" ] }, { "id": "VERIFY-UK-EXCEPTIONS", "requirementIds": [ "REQ-UK-EXCEPTIONS" ], "status": "partial", "expected": "Software checks enforce declared prerequisites and usable objection controls. Independent review must establish actual qualification, disclosure, provider behavior and downstream data processing.", "testRefs": [ "packages/notabenda/test/storage-exceptions.test.mjs", "docs/verification/storage-exceptions.md", "site/test/storage-exceptions.test.mjs" ] }, { "id": "VERIFY-CH-PROFILING", "requirementIds": [ "REQ-CH-PROFILING" ], "status": "partial", "expected": "A Swiss advertising/profiling declaration requires an explicit risk/consent classification and leaves an unresolved activity blocked.", "testRefs": [ "packages/notabenda/test/scope-guards.test.mjs" ] }, { "id": "VERIFY-BR-COOKIE-UI", "requirementIds": [ "REQ-BR-COOKIE-UI" ], "status": "planned", "expected": "The Portuguese-language fixture exposes rejection and granular settings with optional choices initially off.", "testRefs": [] }, { "id": "VERIFY-CA-MEANINGFUL", "requirementIds": [ "REQ-CA-MEANINGFUL" ], "status": "planned", "expected": "A collection surface displays the relevant concise facts; an additional purpose does not silently inherit an unrelated grant.", "testRefs": [] }, { "id": "VERIFY-CA-OBA", "requirementIds": [ "REQ-CA-OBA" ], "status": "partial", "expected": "No Canadian profile enables a sensitive-data or child-related advertising flow merely by showing an opt-out notice.", "testRefs": [ "packages/notabenda/test/scope-guards.test.mjs" ] }, { "id": "VERIFY-QC-PROFILING", "requirementIds": [ "REQ-QC-PROFILING" ], "status": "planned", "expected": "A covered profiling function stays disabled until activation, and its collection surface describes it.", "testRefs": [] }, { "id": "VERIFY-AU-PIXELS", "requirementIds": [ "REQ-AU-PIXELS" ], "status": "partial", "expected": "A pixel fixture can be inventoried; the collection surface links an appropriate notice and unresolved sensitive-data exposure stays blocked.", "testRefs": [ "packages/notabenda/test/discovery.test.mjs", "docs/verification/discovery.md", "packages/notabenda/test/scope-guards.test.mjs" ] }, { "id": "VERIFY-NZ-NOTICE", "requirementIds": [ "REQ-NZ-NOTICE" ], "status": "partial", "expected": "An NZ collection notice provides the applicable facts before or with the collection flow and a usable rights route.", "testRefs": [ "packages/notabenda/test/config.test.mjs", "packages/notabenda/test/documents.test.mjs" ] }, { "id": "VERIFY-NZ-INDIRECT", "requirementIds": [ "REQ-NZ-INDIRECT" ], "status": "automated", "expected": "Mechanism checks cover explicit notification particulars, advance/collected wording, exact selected categories, usable links, release integrity and no permission/delivery side effects. Host notification, exceptions and legal acceptance remain unverified.", "testRefs": [ "packages/notabenda/test/indirect-collection.test.mjs", "packages/notabenda/test/setup.test.mjs", "packages/notabenda/test/package.test.mjs", "packages/notabenda/test/astro-package.test.mjs", "site/test/host.test.mjs", "docs/verification/indirect-collection.md" ] }, { "id": "VERIFY-ZA-MARKETING", "requirementIds": [ "REQ-ZA-MARKETING" ], "status": "planned", "expected": "A permission field records purpose/channel and text version; withdrawal reaches the application suppression hook.", "testRefs": [] }, { "id": "VERIFY-US-CA-CHOICES", "requirementIds": [ "REQ-US-CA-CHOICES" ], "status": "planned", "expected": "An applicable notice-at-collection route and sale/sharing control affect both browser and synthetic downstream processing.", "testRefs": [] }, { "id": "VERIFY-US-CA-GPC", "requirementIds": [ "REQ-US-CA-GPC" ], "status": "partial", "expected": "GPC applies before optional advertising starts, remains effective across reloads, and is not silently reversed by generic accept-all.", "testRefs": [ "packages/notabenda/test/privacy-signals.test.mjs" ] }, { "id": "VERIFY-US-CA-UI", "requirementIds": [ "REQ-US-CA-UI" ], "status": "planned", "expected": "All bundled layouts present readable, usable choices; opt-out is not hidden behind misleading text or extra persuasion.", "testRefs": [] }, { "id": "VERIFY-US-CO-GPC", "requirementIds": [ "REQ-US-CO-GPC" ], "status": "partial", "expected": "The Colorado fixture honors GPC for sale and targeted advertising and includes the corresponding policy explanation.", "testRefs": [ "packages/notabenda/test/privacy-signals.test.mjs" ] }, { "id": "VERIFY-US-CT-GPC", "requirementIds": [ "REQ-US-CT-GPC" ], "status": "partial", "expected": "A stored advertising grant is restricted by the applicable signal before any loader runs.", "testRefs": [ "packages/notabenda/test/privacy-signals.test.mjs" ] }, { "id": "VERIFY-US-VA-RIGHTS", "requirementIds": [ "REQ-US-VA-RIGHTS" ], "status": "partial", "expected": "Sensitive processing cannot inherit a cookie-category grant; a rights denial can link to the configured appeal route.", "testRefs": [ "packages/notabenda/test/scope-guards.test.mjs" ] }, { "id": "VERIFY-US-COPPA-SCOPE", "requirementIds": [ "REQ-US-COPPA-SCOPE" ], "status": "partial", "expected": "A configuration declaring a covered child-related flow is flagged unsupported until a separately reviewed parental-consent integration exists.", "testRefs": [ "packages/notabenda/test/scope-guards.test.mjs" ] }, { "id": "VERIFY-TR-BASIS", "requirementIds": [ "REQ-TR-BASIS" ], "status": "planned", "expected": "The configuration distinguishes disclosure from permission and refuses an unclassified optional processing purpose.", "testRefs": [] }, { "id": "VERIFY-EU-TERMS", "requirementIds": [ "REQ-EU-TERMS" ], "status": "partial", "expected": "Consumer mode cannot silently reuse an unchecked business-only limitation/waiver pack.", "testRefs": [ "packages/notabenda/test/config.test.mjs" ] }, { "id": "VERIFY-EU-WITHDRAWAL", "requirementIds": [ "REQ-EU-WITHDRAWAL" ], "status": "partial", "expected": "An eligible contract exposes an accessible action, collects the required statement details, confirms submission, and produces acknowledgment through the application's delivery channel.", "testRefs": [ "packages/notabenda/test/contract-action.test.mjs", "packages/notabenda-cf/test/contracts.test.mjs", "docs/verification/contract-actions.md" ] }, { "id": "VERIFY-DE-CANCEL", "requirementIds": [ "REQ-DE-CANCEL" ], "status": "partial", "expected": "A qualifying fixture exposes the cancellation route, confirmation step, saveable statement and durable electronic acknowledgment without sending a fake success.", "testRefs": [ "packages/notabenda/test/contract-action.test.mjs", "packages/notabenda-cf/test/contracts.test.mjs", "docs/verification/contract-actions.md" ] }, { "id": "VERIFY-DE-WITHDRAWAL", "requirementIds": [ "REQ-DE-WITHDRAWAL" ], "status": "partial", "expected": "The German fixture uses reviewed labels, required details, accessible entry during the applicable window, and the appropriate confirmation route.", "testRefs": [ "packages/notabenda/test/contract-action.test.mjs", "packages/notabenda-cf/test/contracts.test.mjs", "docs/verification/contract-actions.md" ] }, { "id": "VERIFY-BR-CONTRACT", "requirementIds": [ "REQ-BR-CONTRACT" ], "status": "partial", "expected": "An applicable Brazilian terms profile includes the reviewed right and links to a usable contract request route.", "testRefs": [ "packages/notabenda/test/contract-action.test.mjs", "packages/notabenda-cf/test/contracts.test.mjs", "docs/verification/contract-actions.md" ] }, { "id": "VERIFY-GOOGLE-MODE", "requirementIds": [ "REQ-GOOGLE-MODE" ], "status": "automated", "expected": "The default DOM loader attempts no Google request before grant or after initial refusal; explicit four-signal product gates and defaults precede initialization. Required receipts, GPC, late loads, reentrant changes and withdrawal remain restrictive. Already attempted tags require a terminal full-document reset. Local simulator/interception results are not vendor behavior or certification.", "testRefs": [ "packages/notabenda/test/google-basic.test.mjs", "packages/notabenda/test/package.test.mjs", "site/test/google-basic.test.mjs", "docs/verification/google-basic.md" ] }, { "id": "VERIFY-GOOGLE-CMP", "requirementIds": [ "REQ-GOOGLE-CMP" ], "status": "planned", "expected": "Documentation rejects the equivalence between a working adapter and Google CMP certification; no unregistered CMP identity is emitted.", "testRefs": [] }, { "id": "VERIFY-PRODUCT-A11Y", "requirementIds": [ "REQ-PRODUCT-A11Y" ], "status": "partial", "expected": "Keyboard, focus, screen-reader, contrast, zoom, mobile and RTL checks run against each built-in theme.", "testRefs": [ "packages/notabenda/test/documents.test.mjs", "docs/verification/consent-browser.md", "docs/verification/terms-browser.md", "docs/verification/website-browser.md", "docs/verification/design-pass.md", "site/test/host.test.mjs", "packages/notabenda/test/controls-layout.test.mjs", "docs/verification/controls-layout.md" ] }, { "id": "VERIFY-PRODUCT-MOBILE", "requirementIds": [ "REQ-PRODUCT-MOBILE" ], "status": "partial", "expected": "At 320/360/390/430px widths and short landscape heights, the initial notice remains nonmodal and readable; all choices work by tap/keyboard; a deliberate action opens the drawer; dismissal grants nothing; safe areas, keyboard, long text, zoom and reduced motion preserve access.", "testRefs": [ "docs/verification/consent-browser.md", "docs/verification/terms-browser.md", "docs/verification/website-browser.md", "docs/verification/design-pass.md", "packages/notabenda/test/controls-layout.test.mjs", "docs/verification/controls-layout.md" ] }, { "id": "VERIFY-PRODUCT-CONFIG", "requirementIds": [ "REQ-PRODUCT-CONFIG" ], "status": "automated", "expected": "Malformed input and broken references yield diagnostics; private/unknown nested fields never enter public output.", "testRefs": [ "packages/notabenda/test/config.test.mjs", "packages/notabenda/test/setup-purpose.test.mjs" ] }, { "id": "VERIFY-PRODUCT-DOCUMENTS", "requirementIds": [ "REQ-PRODUCT-DOCUMENTS" ], "status": "automated", "expected": "All three no-JS document outputs render declared/supplied content, navigation and version metadata; production rejects drafts/placeholders and generated terms.", "testRefs": [ "packages/notabenda/test/documents.test.mjs", "packages/notabenda/test/config.test.mjs", "packages/notabenda/test/cli.test.mjs" ] }, { "id": "VERIFY-PRODUCT-SAFE-CONTENT", "requirementIds": [ "REQ-PRODUCT-SAFE-CONTENT" ], "status": "automated", "expected": "Hostile content is inert; unsafe mailto/site links, malformed optional text, unsafe paths, and symlink destinations fail without leaking private metadata or replacing their targets.", "testRefs": [ "packages/notabenda/test/config.test.mjs", "packages/notabenda/test/documents.test.mjs", "packages/notabenda/test/content.test.mjs", "packages/notabenda/test/cli.test.mjs" ] }, { "id": "VERIFY-PRODUCT-ARTIFACTS", "requirementIds": [ "REQ-PRODUCT-ARTIFACTS" ], "status": "automated", "expected": "Publicly identical input has stable hashes; content changes create distinct artifacts, including cookie-table changes; exact pages and structured models remain retrievable.", "testRefs": [ "packages/notabenda/test/content.test.mjs", "packages/notabenda/test/cli.test.mjs", "packages/notabenda/test/history-integration.test.mjs", "packages/notabenda/test/catalog-release.test.mjs", "docs/verification/catalog-release.md", "site/test/host.test.mjs" ] }, { "id": "VERIFY-PRODUCT-PACKAGE", "requirementIds": [ "REQ-PRODUCT-PACKAGE" ], "status": "automated", "expected": "A packed tarball installs offline and exposes usable API/CLI/types/styles/license; its browser dependency graph excludes Node and framework imports.", "testRefs": [ "packages/notabenda/test/package.test.mjs", "packages/notabenda/test/cli.test.mjs" ] }, { "id": "VERIFY-PRODUCT-CF-ADMIN", "requirementIds": [ "REQ-PRODUCT-CF-ADMIN" ], "status": "automated", "expected": "Missing/denied/failed authorization never reads data; scope isolation, bounded scanning, search, safe details and sanitized errors pass simulated Worker/DO tests.", "testRefs": [ "packages/notabenda-cf/test/admin.test.mjs" ] }, { "id": "VERIFY-PRODUCT-CF-HISTORY", "requirementIds": [ "REQ-PRODUCT-CF-HISTORY" ], "status": "automated", "expected": "Repeated recording is idempotent, conflicts/tampering fail, exact history is retained, and actual core-generated privacy/cookie/terms artifacts can be compared safely.", "testRefs": [ "packages/notabenda-cf/test/admin.test.mjs", "packages/notabenda/test/history-integration.test.mjs", "packages/notabenda/test/catalog-release.test.mjs", "docs/verification/catalog-release.md", "site/test/host.test.mjs" ] }, { "id": "VERIFY-PRODUCT-CONSENT-RUNTIME", "requirementIds": [ "REQ-PRODUCT-CONSENT-RUNTIME" ], "status": "automated", "expected": "Real controller tests exercise all-purpose gating, material scope, refusal persistence, malformed/unavailable storage, expiry/resume, cross-tab refresh, failed-grant dismissal, permanently retired async starts, cleanup failures, destruction, and snapshot isolation.", "testRefs": [ "packages/notabenda/test/consent.test.mjs" ] }, { "id": "VERIFY-EU-ORDER-ACTION", "requirementIds": [ "REQ-EU-ORDER-ACTION" ], "status": "partial", "expected": "Verify exact mixed/deferred/recurring/conditional facts and payment action, readiness/recovery, immutable review/original-byte archives, production document gates, CAS activation, one admission across intent revisions, atomic local host plans, private admin/file inspection, retirement/restore and isolated SQLite demo integration. Durable confirmation and real production/regional acceptance remain open.", "testRefs": [ "packages/notabenda/test/paid-order.test.mjs", "site/test/order-demo.test.mjs", "site/test/demo.test.mjs", "docs/verification/paid-orders.md", "packages/notabenda-cf/test/orders.test.mjs", "packages/notabenda-cf/test/orders-package.test.mjs", "scripts/check-order-archive-runtime.mjs" ] }, { "id": "VERIFY-PRODUCT-TERMS-ACCEPTANCE", "requirementIds": [ "REQ-PRODUCT-TERMS-ACCEPTANCE" ], "status": "automated", "expected": "Exercise unchecked/coalesced submission, exact pinned document/action hashes, no optimistic success, lost-ack retry, active-offer transaction race, idempotency conflicts, server-bound subject/site/scope/operation, independent preview rejection, invalid clocks, store isolation and readable authorized evidence.", "testRefs": [ "packages/notabenda/test/terms.test.mjs", "docs/verification/terms-browser.md", "packages/notabenda-cf/test/admin.test.mjs" ] }, { "id": "VERIFY-PRODUCT-CF-HOST", "requirementIds": [ "REQ-PRODUCT-CF-HOST" ], "status": "partial", "expected": "Verify missing/bad keys before assets or DO access; normalized/direct-file routes; protected no-store responses; exact-origin bounded writes; persisted retry across object instances; allowlisted assets and a real local Workers runtime.", "testRefs": [ "site/test/host.test.mjs", "docs/verification/website-browser.md", "scripts/check-site-runtime.mjs" ] }, { "id": "VERIFY-PRODUCT-CONSENT-EVIDENCE", "requirementIds": [ "REQ-PRODUCT-CONSENT-EVIDENCE" ], "status": "automated", "expected": "Ledger and browser tests verify exact notice/command binding, transactional retries/CAS, old-notice revoke-all, fail-closed receipt gating, lost acknowledgments, stale reads, storage failures, reload/stream changes, server expiry, maximum response bounds and safe inspection. Manual Chromium and real local Worker observations supplement automation; production operations remain unverified.", "testRefs": [ "packages/notabenda/test/consent-evidence.test.mjs", "packages/notabenda/test/consent-delivery.test.mjs" ] }, { "id": "VERIFY-PRODUCT-AUTHORING", "requirementIds": [ "REQ-PRODUCT-AUTHORING" ], "status": "automated", "expected": "Both .md and .mdx compile with validated YAML frontmatter, stable section IDs, custom component rendering, source and output hashes, review guards and readable revision diffs. Invalid metadata fails clearly; default core remains import-safe and framework-free.", "testRefs": [ "packages/notabenda-authoring/test/authoring.test.mjs", "packages/notabenda-authoring/test/package.test.mjs", "site/test/host.test.mjs", "scripts/check-site-runtime.mjs", "docs/verification/authoring.md" ] }, { "id": "VERIFY-PRODUCT-REACT", "requirementIds": [ "REQ-PRODUCT-REACT" ], "status": "automated", "expected": "SSR emits no effective grants or remote resources; hydration matches then recovers current browser state. Required-receipt grants remain blocked until acknowledged. StrictMode leaves one controls mount, controller replacement unsubscribes old state, and optional peer imports never enter the default dependency graph. React form fields preserve conservative SSR/hydration, immutable snapshots, host ownership, form independence and explicit exact-request recovery through remount. Both full and compiled controller profiles pass the same consent SSR, hydration and receipt scenarios. Cross-entry hooks reject missing matching providers, controls share one ownership registry, compiled graphs exclude full config/document/form code, and packed declarations preserve both getter contracts.", "testRefs": [ "packages/notabenda/test/react.test.mjs", "packages/notabenda/test/react-package.test.mjs", "site/test/host.test.mjs", "docs/verification/react-browser.md", "packages/notabenda/test/react-form-permission.test.mjs", "packages/notabenda/test/react-consent.test.mjs" ] }, { "id": "VERIFY-PRODUCT-ASTRO", "requirementIds": [ "REQ-PRODUCT-ASTRO" ], "status": "automated", "expected": "A real Astro build produces no-script legal pages and self-hosted optional runtime. Before-swap closes drafts without writing consent; page-load mounts once, preserves refusal and reuses existing lifecycles. Core installation does not install Astro; packed components compile in a separate Astro consumer. Astro form fields preserve exact-offer named binding, host-owned draft/pending state and no automatic transport across navigation; the host closes replaced session/contact/offer contexts before refreshing the bridge.", "testRefs": [ "packages/notabenda/test/astro.test.mjs", "packages/notabenda/test/astro-build.test.mjs", "packages/notabenda/test/astro-package.test.mjs", "site/test/host.test.mjs", "docs/verification/astro-browser.md", "packages/notabenda/test/astro-form-permission.test.mjs", "site/test/astro-permission.test.mjs" ] }, { "id": "VERIFY-PRODUCT-EMBEDS", "requirementIds": [ "REQ-PRODUCT-EMBEDS" ], "status": "automated", "expected": "No resource attribute before effective permission, including detached media and required-receipt pending grants. All purposes required; withdrawal/expiry removes nodes synchronously. Several mounts share one lifecycle, stale local storage is rechecked, late events cannot resurrect media and origin changes invalidate grants.", "testRefs": [ "packages/notabenda/test/embeds.test.mjs", "site/test/host.test.mjs", "packages/notabenda/test/package.test.mjs", "docs/verification/embeds-browser.md" ] }, { "id": "VERIFY-PRODUCT-PRIVACY-SIGNALS", "requirementIds": [ "REQ-PRODUCT-PRIVACY-SIGNALS" ], "status": "automated", "expected": "A signal applies before queued optional work and aborts active or pending starts. Accept-all and late receipt acknowledgments never bypass it. Service eligibility stays separate from cookie grants, snapshots remain pure, and absent signals never create consent. Initial server observations combine with browser signals without erasing an observed true.", "testRefs": [ "packages/notabenda/test/privacy-signals.test.mjs", "packages/notabenda/test/react.test.mjs", "site/test/host.test.mjs", "docs/verification/privacy-signals-browser.md" ] }, { "id": "VERIFY-PRODUCT-PROCESSING-CHOICES", "requirementIds": [ "REQ-PRODUCT-PROCESSING-CHOICES" ], "status": "automated", "expected": "No request or acknowledgment can remove a restriction or substitute trusted context, provenance or policy artifact. Concurrency, rollback, stale reads, lost acknowledgment/reload, notice replacement, surviving local intent, teardown and cookie acceptance preserve effective restrictions. Authorized search shows exact wording and historical/current distinctions.", "testRefs": [ "packages/notabenda/test/processing.test.mjs", "packages/notabenda/test/react.test.mjs", "packages/notabenda/test/package.test.mjs", "site/test/host.test.mjs", "scripts/check-site-runtime.mjs", "docs/verification/processing-choices-browser.md" ] }, { "id": "VERIFY-PRODUCT-RETAINED-RELEASES", "requirementIds": [ "REQ-PRODUCT-RETAINED-RELEASES" ], "status": "automated", "expected": "An empty output directory receives the current mutable pages and exact supplied previous pinned pages. Public artifact hashes remain valid; private metadata/source archives, wrong-site inputs, corrupt hashes, unsupported schemas, accidental previews and excessive/non-JSON inputs fail before writes. Identical duplicates deduplicate and rich historical output is not re-evaluated.", "testRefs": [ "packages/notabenda/test/retained-releases.test.mjs", "packages/notabenda/test/package.test.mjs", "site/test/host.test.mjs", "docs/verification/retained-releases.md", "scripts/check-site-runtime.mjs", "packages/notabenda/test/rights.test.mjs", "packages/notabenda/test/catalog-release.test.mjs", "docs/verification/catalog-release.md", "site/test/demo-upgrade.test.mjs" ] }, { "id": "VERIFY-PRODUCT-STORAGE-CLEANUP", "requirementIds": [ "REQ-PRODUCT-STORAGE-CLEANUP" ], "status": "automated", "expected": "Only selected owned optional storage is touched; no producer starts after revocation, old final deletion precedes new writes, cleanup covers partial failures and zero-generation destruction, and cookie outcomes remain expiration requests.", "testRefs": [ "packages/notabenda/test/storage-cleanup.test.mjs", "docs/verification/storage-cleanup.md" ] }, { "id": "VERIFY-PRODUCT-SETUP", "requirementIds": [ "REQ-PRODUCT-SETUP" ], "status": "automated", "expected": "CLI and admin UI use the same bounded recommendation engine; unanswered topics stay unknown, imported settings persist, private notes never reach public artifacts, stale exports invalidate, reports resume, and host authorization guards every admin request.", "testRefs": [ "packages/notabenda/test/setup.test.mjs", "packages/notabenda-cf/test/setup.test.mjs", "docs/verification/setup.md", "packages/notabenda/test/setup-purpose.test.mjs", "packages/notabenda/test/setup-project.test.mjs", "packages/notabenda/test/catalog-review.test.mjs", "docs/verification/catalog-review.md" ] }, { "id": "VERIFY-PRODUCT-COLLECTION-NOTICE", "requirementIds": [ "REQ-PRODUCT-COLLECTION-NOTICE" ], "status": "automated", "expected": "Selected direct/mixed purposes produce deterministic reviewed/draft notices with intact pinned privacy references, explicit purpose-level semantics, safe static markup, stable unique IDs and no consent/submission side effects; corruption and invalid selections fail.", "testRefs": [ "packages/notabenda/test/collection.test.mjs", "packages/notabenda/test/react.test.mjs", "packages/notabenda/test/astro-package.test.mjs", "packages/notabenda/test/react-package.test.mjs", "packages/notabenda/test/package.test.mjs", "docs/verification/collection.md" ] }, { "id": "VERIFY-PRODUCT-EVIDENCE-EXPORT", "requirementIds": [ "REQ-PRODUCT-EVIDENCE-EXPORT" ], "status": "automated", "expected": "Unauthorized or revoked export access reaches no store. Exact filtered scoped fields, bounded traversal including empty continuing segments, fresh-read semantics and safe attachment headers pass; hostile adapter pages, backward cursors and out-of-filter records fail closed without payload leaks.", "testRefs": [ "packages/notabenda-cf/test/export.test.mjs", "packages/notabenda/test/package.test.mjs", "site/test/host.test.mjs", "scripts/check-site-runtime.mjs", "docs/verification/evidence-export.md" ] }, { "id": "VERIFY-PRODUCT-DISCOVERY", "requirementIds": [ "REQ-PRODUCT-DISCOVERY" ], "status": "automated", "expected": "Origin/name-only observations and candidate mappings remain bounded and detached, blocked APIs are explicit, hostile inputs/markup fail safely, UI captures only on request and revokes stale downloads, and CLI explicit inputs cannot overwrite existing output.", "testRefs": [ "packages/notabenda/test/discovery.test.mjs", "packages/notabenda/test/package.test.mjs", "site/test/host.test.mjs", "docs/verification/discovery.md", "scripts/check-site-runtime.mjs", "packages/notabenda/test/setup.test.mjs" ] }, { "id": "VERIFY-PRODUCT-REGIONAL-PROMPTS", "requirementIds": [ "REQ-PRODUCT-REGIONAL-PROMPTS" ], "status": "automated", "expected": "Explicit profile validates, explains and suppresses prompts without granting; exact transition/disclosure binds to the archived notice and stays distinct from permission scope. Legacy/cross-tab/lifetime/storage cases and calendar boundaries remain conservative.", "testRefs": [ "packages/notabenda/test/prompt-policy.test.mjs", "site/test/host.test.mjs" ] }, { "id": "VERIFY-PRODUCT-EVIDENCE-LIFECYCLE", "requirementIds": [ "REQ-PRODUCT-EVIDENCE-LIFECYCLE" ], "status": "automated", "expected": "Retirement blocks new and duplicate commands and empty-head resurrection; transactional purge is bounded, scoped, held, resumable and atomic. Restore reapplies the barrier before traffic. Terminal frontend and read-only admin preserve restrictions and describe remaining data.", "testRefs": [ "packages/notabenda-cf/test/lifecycle.test.mjs", "packages/notabenda/test/consent-delivery.test.mjs", "packages/notabenda/test/processing.test.mjs", "packages/notabenda/test/terms.test.mjs", "packages/notabenda/test/package.test.mjs", "site/test/host.test.mjs", "scripts/check-site-runtime.mjs", "docs/verification/evidence-lifecycle.md" ] }, { "id": "VERIFY-EU-RETENTION-ERASURE", "requirementIds": [ "REQ-EU-RETENTION-ERASURE" ], "status": "partial", "expected": "Scoped mechanics preserve holds and exact deletion boundaries; operator review must still establish purpose-specific periods, valid grounds/exceptions, identity scope, recipient handling and disposition of remaining metadata/copies.", "testRefs": [ "packages/notabenda-cf/test/lifecycle.test.mjs", "docs/verification/evidence-lifecycle.md" ] }, { "id": "VERIFY-PRODUCT-SCOPE-GUARDS", "requirementIds": [ "REQ-PRODUCT-SCOPE-GUARDS" ], "status": "automated", "expected": "Explicit present/unknown facts block affected optional work and grants; siblings remain usable, archives bind the policy, revisions invalidate grants, refusals survive, ordinary pages and restrictive actions remain usable, and private assessment notes stay out of public artifacts.", "testRefs": [ "packages/notabenda/test/scope-guards.test.mjs", "packages/notabenda/test/setup.test.mjs", "packages/notabenda/test/react.test.mjs", "packages/notabenda/test/package.test.mjs", "site/test/host.test.mjs", "scripts/check-site-runtime.mjs", "docs/verification/scope-guards.md" ] }, { "id": "VERIFY-PRODUCT-DEMO-WORKSPACE", "requirementIds": [ "REQ-PRODUCT-DEMO-WORKSPACE" ], "status": "automated", "expected": "Separate browser capabilities select only independent demo DOs; fake journeys are seeded with real APIs; expiry, generation mismatch, quota and origin checks prevent cross-session writes and resurrection.", "testRefs": [ "site/test/demo.test.mjs", "docs/verification/demo-workspace.md", "scripts/check-site-runtime.mjs", "site/test/host.test.mjs", "site/test/demo-upgrade.test.mjs" ] }, { "id": "VERIFY-PRODUCT-RIGHTS-CENTER", "requirementIds": [ "REQ-PRODUCT-RIGHTS-CENTER" ], "status": "automated", "expected": "Only configured actions appear; safe destinations and public fallback are explicit; static navigation changes no permissions and makes no request or receipt; private data is excluded; authored builds retain the supporting page.", "testRefs": [ "packages/notabenda/test/rights.test.mjs", "packages/notabenda/test/package.test.mjs", "site/test/host.test.mjs", "scripts/check-site-runtime.mjs", "docs/verification/rights-center.md" ] }, { "id": "VERIFY-PRODUCT-CF-STARTER", "requirementIds": [ "REQ-PRODUCT-CF-STARTER" ], "status": "automated", "expected": "Packed CLI scaffolds without overwrite or side effects; default authorization denies before storage/assets; caller input cannot select namespaces or grant export; fresh stores are empty; matching immutable and authored archives remain readable; local Wrangler bundles and serves the project.", "testRefs": [ "packages/notabenda-cf/test/starter.test.mjs", "packages/notabenda/test/package.test.mjs", "docs/verification/cloudflare-starter.md", "scripts/check-cf-starter-runtime.mjs" ] }, { "id": "VERIFY-PRODUCT-FORM-PERMISSIONS", "requirementIds": [ "REQ-PRODUCT-FORM-PERMISSIONS" ], "status": "automated", "expected": "Exact offers and host stream preconditions; CAS/activation ordering; independent withdrawals including failed/hung first reads; safe nonce retries; monotonic responses; scoped lifecycle and read-time evidence; isolated session routing and local SQLite restart. Broader UI/platform acceptance tracked separately. Transactional reload recovery preserves original command/artifact binding, storage failures never bypass withdrawal, and keyboard focus survives hidden controls. React form fields preserve conservative SSR/hydration, immutable snapshots, host ownership, form independence and explicit exact-request recovery through remount. Astro form fields preserve exact-offer named binding, host-owned draft/pending state and no automatic transport across navigation; the host closes replaced session/contact/offer contexts before refreshing the bridge.", "testRefs": [ "packages/notabenda/test/form-permission.test.mjs", "docs/verification/form-permissions.md", "site/test/demo.test.mjs", "scripts/check-form-permission-runtime.mjs", "packages/notabenda/test/react-form-permission.test.mjs", "packages/notabenda/test/astro-form-permission.test.mjs", "packages/notabenda/test/astro-package.test.mjs", "packages/notabenda/test/astro-build.test.mjs", "site/test/astro-permission.test.mjs" ] }, { "id": "VERIFY-EU-MARKETING", "requirementIds": [ "REQ-EU-MARKETING" ], "status": "planned", "expected": "Review national applicability, conditioned customer exceptions and each message workflow; generic ledger tests are only supporting mechanism evidence.", "testRefs": [ "docs/verification/form-permissions.md" ] }, { "id": "VERIFY-CA-CASL-OPTIN", "requirementIds": [ "REQ-CA-CASL-OPTIN" ], "status": "planned", "expected": "Review complete prescribed information and affirmative request flow, distinct terms, confirmation and actual unsubscribe delivery/fulfillment; supporting field tests alone do not pass this scenario.", "testRefs": [ "docs/verification/form-permissions.md" ] }, { "id": "VERIFY-PRODUCT-CF-DOCTOR", "requirementIds": [ "REQ-PRODUCT-CF-DOCTOR" ], "status": "automated", "expected": "Unchanged local project snapshots; throwing host/build/dynamic settings are not executed; no secret/source strings in diagnostics; malformed JSON/JSONC, missing env bindings, unsafe assets, lifecycle conflicts, symlinks and traversal stay blocked. Packed installed CLI works offline; manual auth/runtime/lifecycle checks cannot be promoted to a production verdict.", "testRefs": [ "packages/notabenda-cf/test/doctor.test.mjs", "packages/notabenda/test/package.test.mjs", "docs/verification/cloudflare-doctor.md" ] }, { "id": "VERIFY-PRODUCT-CONTRACT-ACTIONS", "requirementIds": [ "REQ-PRODUCT-CONTRACT-ACTIONS" ], "status": "partial", "expected": "Reviewed definition/archive integrity, profile-specific visible actions, deliberate confirmation, exact uncertain retries, atomic receipt/jobs, independent acknowledgement dispatch, expired-lease fencing, private semantic inspection/search, savable copy, per-declaration lifecycle, tab-scoped example recovery and local SQLite restart. Real delivery runners, regional legal review and broader platform acceptance remain open. Dispatch configuration validates before either claim; preflight abort/clock fences prevent external work; provider acceptance stays distinct from unknown settlement; local restart reclaims expired leases with stable downstream deduplication IDs. No timeout/abort authorizes retirement.", "testRefs": [ "packages/notabenda/test/contract-action.test.mjs", "packages/notabenda-cf/test/contracts.test.mjs", "docs/verification/contract-actions.md", "site/test/contracts.test.mjs", "scripts/check-contract-actions-runtime.mjs", "packages/notabenda-cf/test/contract-dispatch.test.mjs", "scripts/check-contract-dispatch-runtime.mjs", "scripts/fixtures/contract-dispatch-worker.mjs", "docs/verification/contract-dispatch.md", "site/test/demo-upgrade.test.mjs" ] }, { "id": "VERIFY-PRODUCT-SYNTAX-HIGHLIGHTING", "requirementIds": [ "REQ-PRODUCT-SYNTAX-HIGHLIGHTING" ], "status": "automated", "expected": "Built examples preserve exact text, safely escape content, load external token CSS, meet light/dark palette contrast and support focus/forced colors without browser scripts.", "testRefs": [ "site/test/syntax.test.mjs", "docs/verification/syntax-highlighting.md" ] }, { "id": "VERIFY-PRODUCT-BUNDLE-BUDGET", "requirementIds": [ "REQ-PRODUCT-BUNDLE-BUDGET" ], "status": "partial", "expected": "Compiled local consent plus controls stays below 15 KiB gzip and excludes full site validation, evidence implementation and build/backend/framework modules; exact scope and lifecycle parity tests pass. Required receipt and compatibility profiles are reported separately. Consent CSS stays below 5 KiB; compatibility target and interaction timing remain open.", "testRefs": [ "packages/notabenda/test/delivery.test.mjs", "docs/verification/browser-delivery.md", "site/test/delivery.test.mjs", "packages/notabenda/test/consent-runtime.test.mjs" ] }, { "id": "VERIFY-PRODUCT-SERVICE-CATALOG", "requirementIds": [ "REQ-PRODUCT-SERVICE-CATALOG" ], "status": "partial", "expected": "Schema and source/version validation, operator overrides/custom entries, selected-only browser graphs, shared renderer parity and unchanged pinned historical documents.", "testRefs": [ "packages/notabenda/test/catalog.test.mjs", "packages/notabenda/test/package.test.mjs", "docs/verification/service-catalog.md", "packages/notabenda/test/services.test.mjs", "packages/notabenda/test/astro-package.test.mjs", "site/test/services.test.mjs", "packages/notabenda/test/catalog-selection.test.mjs", "site/test/catalog-setup.test.mjs", "packages/notabenda/test/setup-purpose.test.mjs", "packages/notabenda/test/catalog-browser.test.mjs", "packages/notabenda/test/catalog-browser-workflow.test.mjs", "packages/notabenda/test/setup-project.test.mjs", "packages/notabenda/test/catalog-review.test.mjs", "docs/verification/catalog-review.md", "packages/notabenda/test/catalog-release.test.mjs", "docs/verification/catalog-release.md", "site/test/host.test.mjs" ] }, { "id": "VERIFY-PRODUCT-SERVICE-DETECTION", "requirementIds": [ "REQ-PRODUCT-SERVICE-DETECTION" ], "status": "partial", "expected": "Positive/negative and shared-host fixtures, bounded hostile patterns, no probe requests or SDK/getter execution, minimized witnesses with explicit legacy-name sensitivity, exact snapshot compatibility, unavailable/limited coverage and review-before-apply.", "testRefs": [ "packages/notabenda/test/catalog.test.mjs", "packages/notabenda/test/package.test.mjs", "docs/verification/service-catalog.md", "packages/notabenda/test/catalog-browser.test.mjs", "packages/notabenda/test/catalog-browser-workflow.test.mjs", "packages/notabenda/test/setup-project.test.mjs", "packages/notabenda/test/setup.test.mjs" ] }, { "id": "VERIFY-PRODUCT-SERVICE-PROFILES", "requirementIds": [ "REQ-PRODUCT-SERVICE-PROFILES" ], "status": "partial", "expected": "Reject malformed/source-unbound profiles; distinguish unread URLs; render escaped linked notes without network or automatic settings; preserve manual URLs, old pins and exact legal bytes while profile-only changes alter retained reference digests.", "testRefs": [ "packages/notabenda/test/catalog-profile.test.mjs", "packages/notabenda/test/package.test.mjs", "docs/verification/catalog-profiles.md" ] }, { "id": "VERIFY-PRODUCT-INDIRECT-NOTICE", "requirementIds": [ "REQ-PRODUCT-INDIRECT-NOTICE" ], "status": "automated", "expected": "Deterministic scoped identity and trusted-release comparison, strict bounded non-executable inputs, all core particulars visible, absolute text links, safe server-side framework rendering and no changes to direct notices or permissions.", "testRefs": [ "packages/notabenda/test/indirect-collection.test.mjs", "packages/notabenda/test/setup.test.mjs", "packages/notabenda/test/package.test.mjs", "packages/notabenda/test/astro-package.test.mjs", "site/test/host.test.mjs", "docs/verification/indirect-collection.md" ] }, { "id": "VERIFY-EU-GUARANTEE-NOTICE", "requirementIds": [ "REQ-EU-GUARANTEE-NOTICE" ], "status": "automated", "expected": "Mechanism checks preserve all source bytes, language binding, fixed destination and text alternatives. Legal/linguistic/design acceptance remains open.", "testRefs": [ "packages/notabenda/test/guarantee-notice.test.mjs", "packages/notabenda/test/package.test.mjs", "packages/notabenda/test/astro-package.test.mjs", "site/test/host.test.mjs", "docs/verification/guarantees.md" ] }, { "id": "VERIFY-EU-GUARANTEE-LABEL", "requirementIds": [ "REQ-EU-GUARANTEE-LABEL" ], "status": "automated", "expected": "Mechanism tests bind explicit product/offer declarations to unchanged finished bytes, reject unsupported input and exclude build parsers from frontend graphs. The complete draft example verifies pinned source/fonts, unchanged fixed artwork, field bindings, binary delivery and software QR decoding at selected sizes. Physical-device, legal/design, production-placement and order acceptance remain open.", "testRefs": [ "packages/notabenda-authoring/test/guarantee-label.test.mjs", "packages/notabenda-authoring/test/package.test.mjs", "packages/notabenda/test/package.test.mjs", "packages/notabenda/test/astro-package.test.mjs", "docs/verification/guarantees.md", "packages/notabenda-authoring/test/guarantee-producer.test.mjs", "packages/notabenda/test/cli.test.mjs", "site/test/host.test.mjs" ] }, { "id": "VERIFY-PRODUCT-GUARANTEE-NOTICE", "requirementIds": [ "REQ-PRODUCT-GUARANTEE-NOTICE" ], "status": "automated", "expected": "All 24 selected-file builds preserve known source hashes and provenance; bounded safe static renderers expose image, text, source attribution and QR information without a checkout or consent action.", "testRefs": [ "packages/notabenda/test/guarantee-notice.test.mjs", "packages/notabenda/test/package.test.mjs", "packages/notabenda/test/astro-package.test.mjs", "site/test/host.test.mjs", "docs/verification/guarantees.md" ] }, { "id": "VERIFY-PRODUCT-PAID-ORDER-ARCHIVES", "requirementIds": [ "REQ-PRODUCT-PAID-ORDER-ARCHIVES" ], "status": "automated", "expected": "Exercise file/review hash reconstruction and corruption, draft-document gates, activation/nonce races, one admission across revisions, exact recovery before clock/current checks, atomic host writes and rollback, near-budget reviews, separate archive/file permissions, scoped export exclusion, lifecycle purge/restore and a packed CF-only type/runtime consumer. Local SQLite HTTP/restart and Chromium mobile review supplement automation.", "testRefs": [ "packages/notabenda-cf/test/orders.test.mjs", "packages/notabenda-cf/test/orders-package.test.mjs", "scripts/check-order-archive-runtime.mjs", "site/test/order-demo.test.mjs", "site/test/demo.test.mjs", "docs/verification/paid-orders.md" ] }, { "id": "VERIFY-EU-ORDER-CONFIRMATION", "requirementIds": [ "REQ-EU-ORDER-CONFIRMATION" ], "status": "planned", "expected": "Independent review of applicable information, actual contract facts and digital-content acknowledgments; real personally addressed channel, unchanged reproduction, access period, actual provision and timing before goods delivery/service performance.", "testRefs": [ "docs/verification/order-confirmations.md" ] }, { "id": "VERIFY-PRODUCT-ORDER-CONFIRMATION", "requirementIds": [ "REQ-PRODUCT-ORDER-CONFIRMATION" ], "status": "automated", "expected": "Reject receipt-only/reference-only and unsafe/beyond-budget payloads; exact file retention, atomic rollback, detached inputs, immutable retry/destination version, independent admission recovery, stable provider deduplication after lost response/restart, stale lease/abort/timeout and uncertain settlement, separate admin permissions/downloads/export exclusion, orphan-job retirement/holds/purge and packed consumer.", "testRefs": [ "packages/notabenda-cf/test/order-confirmations.test.mjs", "packages/notabenda-cf/test/orders-package.test.mjs", "site/test/order-demo.test.mjs", "scripts/check-order-confirmation-runtime.mjs", "docs/verification/order-confirmations.md" ] }, { "id": "VERIFY-PRODUCT-STORAGE-EXCEPTIONS", "requirementIds": [ "REQ-PRODUCT-STORAGE-EXCEPTIONS" ], "status": "automated", "expected": "Default activity waits for hydration and presentation; objections abort immediately, survive reload/material revisions and failed saves; stale resume cannot clear newer state; notifications cannot reopen stale results; exact-key cleanup and consent remain separate.", "testRefs": [ "packages/notabenda/test/storage-exceptions.test.mjs", "docs/verification/storage-exceptions.md", "site/test/storage-exceptions.test.mjs" ] }, { "id": "VERIFY-PRODUCT-LOCALIZATION", "requirementIds": [ "REQ-PRODUCT-LOCALIZATION" ], "status": "automated", "expected": "Complete dictionaries reject omissions, extra keys, malformed placeholders, markup and oversized text; legal and consent roots expose language/direction; errors and ARIA use selected copy; cosmetic revisions preserve matching grants, material revisions preserve refusals; CF checks archived wording/scopes independently. Terms offers bind complete widget copy to the retained release, require a matching receipt, preserve v1 English behavior and support private language/copy inspection.", "testRefs": [ "packages/notabenda/test/localization.test.mjs", "docs/verification/localization.md", "site/test/localization.test.mjs", "packages/notabenda/test/terms-localization.test.mjs", "site/test/demo.test.mjs" ] }, { "id": "VERIFY-PRODUCT-AGENT-INTEGRATION", "requirementIds": [ "REQ-PRODUCT-AGENT-INTEGRATION" ], "status": "automated", "expected": "A locally packed/installed package exposes the exact versioned skill; its documented discovery, setup and preview commands run in a fresh fixture while production rejects drafts. Every generated Markdown guide and curated index target resolves, code examples retain their bytes, and public agent assets use read-only routes without evidence access or private report exposure. Advertised config paths typecheck against the actual SiteConfig declaration, current wizard IDs remain connected, unknowns stay unknown and describe reads no project facts or writes files.", "testRefs": [ "packages/notabenda/test/agent-integration.test.mjs", "site/test/agent-docs.test.mjs", "docs/verification/agent-integration.md", "site/test/host.test.mjs", "packages/notabenda/test/integration-reference.test.mjs" ] } ], "researchBacklog": [ { "id": "GAP-SG", "jurisdiction": "SG", "sourceIds": [ "SRC-SG-PDPC" ], "featureIds": [ "FEAT-REGIONS", "FEAT-FORMS" ], "status": "needs-source-verification", "question": "Retrieve and verify the current selected-topics cookie chapter and applicable PDPA exceptions before encoding a Singapore rule." }, { "id": "GAP-JP", "jurisdiction": "JP", "sourceIds": [ "SRC-JP-PPC" ], "featureIds": [ "FEAT-REGIONS", "FEAT-INVENTORY" ], "status": "needs-source-verification", "question": "Verify the current Japanese APPI text, personally referable information/recipient linkage, and applicable transfer rules; do not reuse the obsolete June 2020 translation." }, { "id": "GAP-US-STATES", "jurisdiction": "US-OTHER", "sourceIds": [ "SRC-IUB-US" ], "featureIds": [ "FEAT-US-CHOICES", "FEAT-REGIONS" ], "status": "not-researched", "question": "Individually research remaining state laws, thresholds/exemptions, effective amendments, sensitive/health/child rules and universal signals; no blanket state-law support claim." }, { "id": "GAP-EU-NATIONAL", "jurisdiction": "EU-OTHER", "sourceIds": [ "SRC-IUB-COOKIES" ], "featureIds": [ "FEAT-REGIONS" ], "status": "not-researched", "question": "Follow the comparison's remaining national-authority references, verify current primary sources, and encode each difference separately." }, { "id": "GAP-GLOBAL", "jurisdiction": "OTHER", "sourceIds": [], "featureIds": [ "FEAT-REGIONS", "FEAT-SCOPE-GUARDS" ], "status": "not-researched", "question": "Expand to further jurisdictions and sector/marketing/consumer laws according to explicit scope; including India commencement phases, South Korea, and additional national regimes." }, { "id": "GAP-EU-GUARANTEE-ASSETS", "jurisdiction": "EU-EEA", "sourceIds": [ "SRC-EU-GUARANTEE-REG", "SRC-EU-GUARANTEE-ASSETS", "SRC-EU-GUARANTEE-GUIDE" ], "featureIds": [ "FEAT-TERMS", "FEAT-DOCUMENTS" ], "status": "needs-source-verification", "question": "Resolve the official SVG/reference-colour discrepancy and independently review PDF text equivalents and actual digital legibility/QR usability. Do not silently recolour supplied files or claim statutory design conformity from source hashes." } ] }