You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Parent: #344
Depends on #345 and the deployed/staged collector contract from #346.
Outcome
Connect the opt-in local Contributor Metrics envelope to the aggregate-only collector and roll it out to preview/dev only.
This issue owns:
A dedicated exact-origin contribution egress client.
Sealed batch lifecycle, retry/deduplication, scheduling, manual send, and local audit.
Firefox built-in data-collection consent integration and a compatible older-runtime path.
Chrome prominent disclosure/consent and all product/store/privacy documentation.
Preview/dev packaging and live end-to-end verification.
A hard proof that store artifacts still contain no collector origin or active contribution path.
Completing this issue does not authorize store telemetry. Store enablement requires a separate owner go/no-go issue after preview evidence and policy review.
Egress architecture
Dedicated client
Add one narrow contribution client in peerd-egress; do not add the collector to provider safeFetch and do not route contributions through open-web webFetch.
Required behavior:
One generated/configured exact HTTPS origin and one versioned POST path.
POST only.
credentials: 'omit'; no cookies, Authorization, API key, DPoP proof, session credentials, Referer, user-provided headers, or browser-derived metadata under application control.
redirect: 'error'; any redirect is a failed upload.
Freeze the bytes for preview/send/retry. A retry sends the identical envelope/token; live counters continue into a new pending aggregate.
On an accepted receipt, retire the sealed batch exactly once and preserve counts accumulated after sealing.
Concurrent alarm/manual sends share one in-flight operation.
Service-worker eviction/restart resumes a sealed pending batch without duplication.
A newer/unknown sealed-batch version fails read-only with a diagnostic.
Retry with bounded exponential backoff and jitter; no tight retry loops.
Queue/backlog and retention are bounded by named code constants.
Disable/revoke aborts the live request, cancels alarms, and clears pending/sealed batches and retry metadata.
Collector kill-switch/rejection never disables peerd or changes consent.
Scheduling and controls
Preview/dev participants receive:
An explicit Enable Contributor Metrics consent action.
A Send now action.
Automatic contribution no more frequently than the documented schedule, with randomized jitter.
Last attempted/accepted status in coarse human-readable form.
Exact pending/sealed payload bytes and collector origin visible in Settings.
Disable and clear that immediately stops/cancels the contribution path.
No onboarding modal on update that blocks normal use. A prominent, discoverable disclosure is required before enablement, but declining/ignoring it leaves full product behavior unchanged.
No collection or scheduling starts merely because a browser permission exists; both browser consent (where applicable) and peerd's current disclosure-version consent must be valid.
Browser and package consent
Firefox
Use Firefox's built-in data-collection permission system for technical/interaction data where available:
Declare only the optional category required by the v0 payload.
Request it from the direct user gesture that enables Contributor Metrics.
A denial/cancel leaves participation disabled and records no telemetry-specific data.
Revocation detected through the permissions API stops collection and clears pending state.
Implement the required compliant custom consent experience for supported older Firefox versions if they remain in the compatibility range; otherwise make any minimum-version change an explicit owner decision.
Generated Firefox manifests and AMO metadata must agree.
Chrome requires a prominent in-product disclosure and affirmative informed consent for changed data practices. The disclosure cannot live only in the privacy policy or store listing.
Show data categories, purpose, collector, retention posture, forbidden-content list, revocation behavior, and a link to the published policy before Enable.
Update the Chrome Web Store privacy/data-use declarations and listing before publishing any artifact with an active upload path.
Treat an existing install upgrading from "no telemetry" as a changed-practice case; do not infer consent from use of preview/dev.
Preview/dev may include the endpoint and uploader after consent.
Store Chrome and store Firefox artifacts must contain no collector hostname/path, no contribution alarm/route, and no way to enable upload.
Generated manifest.json and channel-config.js remain generator-owned.
Add packaging/source invariants that fail CI if collector traces enter a store artifact.
The web build follows the store no-contribution posture unless separately decided.
Do not use a runtime channel probe. The generated channel configuration is the authority.
Documentation and trust-model update
Before preview rollout, update every live "no telemetry/no backend" statement so the repository and published materials are consistent.
At minimum audit and update as applicable:
AGENTS.md
README.md
SECURITY.md
docs/security/THREAT-MODEL.md
docs/security/RED-TEAM-RESULTS.md
docs/store/PRIVACY.md
docs/store/LISTING.md
docs/store/REVIEWER-NOTES.md
docs/store/PERMISSION-JUSTIFICATIONS.md
store data-use forms and the published peerd.ai privacy page
contributor/developer documentation for the schema and collector
The honest headline should be equivalent to:
No account, model proxy, content telemetry, or telemetry by default. People using preview/dev may explicitly opt in to content-free Contributor Metrics and inspect the exact aggregate payload before it is sent.
Do not keep an unqualified "no backend" claim once a collector exists. State that there is no required application/model backend and that the optional collector is a one-way aggregate sink.
Document:
Permitted and forbidden fields.
Transport/edge IP processing and application non-retention.
Aggregate and dedupe retention.
Lack of user-level deletion because no identity is collected.
How to revoke/clear pending data.
Why operational completion is not task success.
Why accepted data is observational and may be poisoned/noisy.
How schema/consent versions change.
Live measurement semantics
For the initial web-actor question, the contribution scorecard must distinguish:
Requested surface from resolved surface.
Runtime/manifest fallback reasons.
Page-code runs from discrete page action calls.
Actor turns, errors, cancellation, classified failure, duration, and token buckets.
Provider/catalog-known model cohort.
Binary "worked/didn't work" counts.
Do not compute or publish "task success rate" from clean completion alone. Report:
Operational completion rate.
User-reported worked rate where feedback exists.
Feedback coverage.
Efficiency/error measures.
Do not remotely assign code/tools arms. v0 observes the user's locally selected/configured surface and labels the result observational.
Parent: #344
Depends on #345 and the deployed/staged collector contract from #346.
Outcome
Connect the opt-in local Contributor Metrics envelope to the aggregate-only collector and roll it out to preview/dev only.
This issue owns:
Completing this issue does not authorize store telemetry. Store enablement requires a separate owner go/no-go issue after preview evidence and policy review.
Egress architecture
Dedicated client
Add one narrow contribution client in
peerd-egress; do not add the collector to providersafeFetchand do not route contributions through open-webwebFetch.Required behavior:
credentials: 'omit'; no cookies, Authorization, API key, DPoP proof, session credentials, Referer, user-provided headers, or browser-derived metadata under application control.redirect: 'error'; any redirect is a failed upload.The host shell injects network IO. The pure client contract stays independently Bun-testable.
Sealed batch lifecycle
Scheduling and controls
Preview/dev participants receive:
No onboarding modal on update that blocks normal use. A prominent, discoverable disclosure is required before enablement, but declining/ignoring it leaves full product behavior unchanged.
No collection or scheduling starts merely because a browser permission exists; both browser consent (where applicable) and peerd's current disclosure-version consent must be valid.
Browser and package consent
Firefox
Use Firefox's built-in data-collection permission system for technical/interaction data where available:
Reference:
https://extensionworkshop.com/documentation/develop/firefox-builtin-data-consent/
Chrome
Chrome requires a prominent in-product disclosure and affirmative informed consent for changed data practices. The disclosure cannot live only in the privacy policy or store listing.
References:
https://developer.chrome.com/docs/webstore/program-policies/disclosure-requirements
https://developer.chrome.com/docs/webstore/user_data
Channel boundary
manifest.jsonandchannel-config.jsremain generator-owned.Do not use a runtime channel probe. The generated channel configuration is the authority.
Documentation and trust-model update
Before preview rollout, update every live "no telemetry/no backend" statement so the repository and published materials are consistent.
At minimum audit and update as applicable:
AGENTS.mdREADME.mdSECURITY.mddocs/security/THREAT-MODEL.mddocs/security/RED-TEAM-RESULTS.mddocs/store/PRIVACY.mddocs/store/LISTING.mddocs/store/REVIEWER-NOTES.mddocs/store/PERMISSION-JUSTIFICATIONS.mdThe honest headline should be equivalent to:
Do not keep an unqualified "no backend" claim once a collector exists. State that there is no required application/model backend and that the optional collector is a one-way aggregate sink.
Document:
Live measurement semantics
For the initial web-actor question, the contribution scorecard must distinguish:
Do not compute or publish "task success rate" from clean completion alone. Report:
Do not remotely assign code/tools arms. v0 observes the user's locally selected/configured surface and labels the result observational.
Tests and verification
Pure/client
In-browser
Live E2E
Against a controlled staging collector:
Packaging/store
Adversarial review
Run independent reviews for:
Acceptance criteria
Non-goals