Measurement plan
Measure pilot clarity, not moral worth.
Moral Trade needs enough instrumentation to learn whether visitors understand the pilot, reach a safe first action, and trust the review workflow. It does not need analytics that rank moral views, expose exact wishes, or optimize for engagement.
What we measure now
The current event taxonomy follows the same privacy limits as the product: public route paths, coarse stage labels, consent state, and bucketed performance signals. Query strings, hashes, raw search text, source notes, receipts, and private messages stay out of funnel events.
Orientation
page_view
Which public routes do visitors reach before choosing a first pilot path?
Allowed metadata: path, referrerPath, navigationType
Used for: Find confusing entry points and improve navigation copy.
hero_primary_cta_clicked
Do visitors choose the worked-example route before signup pressure?
Allowed metadata: hrefPath, label, routeFamily
Used for: Tune the homepage and primer toward concrete, low-risk examples.
worked_example_opened
Which examples make the mechanism legible enough to inspect details?
Allowed metadata: exampleId, template, routeFamily
Used for: Prioritize clearer examples and remove misleading ones.
Activation
signup_start
Where do visitors begin account creation after seeing the pilot boundaries?
Allowed metadata: path, partnerSlug, primaryGoal
Used for: Detect whether the site asks for accounts too early or from the wrong surfaces.
signup_complete
Can serious participants finish a low-friction account setup?
Allowed metadata: partnerSlug, primaryGoal
Used for: Identify account friction before widening the cohort.
onboarding_complete
Do new users choose a role, cause area, and first action?
Allowed metadata: participantKind, primaryGoal, firstAction
Used for: Route new users toward one reviewable action instead of a blank marketplace.
create_trade_started
Do users draft terms after inspecting examples and safety rules?
Allowed metadata: mode, template, generatedBy
Used for: Improve draft scaffolding when users stall before creating terms.
clone_example_action
Which worked examples become editable first actions?
Allowed metadata: exampleId, template
Used for: Invest in example formats that produce reviewable drafts.
wish_profile_started
Do users start broad wish previews before requesting private introductions?
Allowed metadata: causeAreaCount, fieldCount
Used for: Improve private matching onboarding while keeping exact wishes undisclosed.
cohort_interest_started
Which cohort paths attract people willing to invite one serious counterparty?
Allowed metadata: partnerSlug, primaryGoal
Used for: Prioritize cohort pages that create reviewable, consent-gated activity.
Trust and safety
privacy_grant_changed
Are people able to understand and change field-level sharing grants?
Allowed metadata: accessLevel, fieldCount, decision
Used for: Improve consent controls and privacy copy.
detail_request_submitted
Do broad previews lead to explicit, consent-gated detail requests?
Allowed metadata: targetKind, candidateBucket, bothConsented
Used for: Measure whether staged disclosure is working without exposing exact wishes.
detail_request_resolved
Can detail requests resolve without pressure or hidden disclosure?
Allowed metadata: targetKind, decision, stage
Used for: Improve resolution states and operator follow-up.
safety_report_submitted
Where do visitors flag coercion, fraud, pressure, or externality concerns?
Allowed metadata: targetKind, stage
Used for: Prioritize safety review and public rulebook clarifications.
match_consent_recorded
Do proposed introductions record both-party consent before identity-specific disclosure?
Allowed metadata: bothConsented, stage, hasMatch
Used for: Audit whether the matching workflow remains consent-gated.
background_scan_run
Can operators review broad matching signals without raw private text?
Allowed metadata: matchesCreated, candidateBucket, taskCount
Used for: Monitor operator queue quality, not user surveillance.
Performance
performance_metric_recorded
Do core routes stay fast enough for mobile and first-time visitors?
Allowed metadata: metricName, metricRating, metricValueBucket
Used for: Fix LCP, INP, and CLS regressions on the heaviest public routes.
Public goods
donation_route_clicked
Do visitors reach external donation routes from clear non-custodial pages?
Allowed metadata: targetKind, hasTargetUrl, causeAreas
Used for: Improve route clarity without claiming escrow, custody, or tax handling.
donation_logged
Can users record external-payment evidence for review?
Allowed metadata: causeAreas, stage, hasSession
Used for: Improve evidence workflows while avoiding payment custody claims.
evidence_submission_started
Where do users begin proof submission for commitments or public-good actions?
Allowed metadata: targetKind, stage
Used for: Improve proof scaffolding and reviewer triage.
public_good_action_logged
Are shared public-good actions becoming reviewable records?
Allowed metadata: causeAreas, stage, taskCount
Used for: Track public-good pilot participation in aggregate.
Protocol-quality audits
Copilot and review metrics stay public.
passThe evaluation contract measures whether assistance improves clarity without replacing human review, leaking private content, hiding false matches, or under-surfacing thresholded groups.
Cadence: monthly public aggregate. Privacy boundaries: aggregate only by default, no raw private wish text, no contact details, no source note leakage, small cell suppression, deviation review log redacted, free text quote requires consent.
Draft and review quality
Tracks whether structured drafts become valid faster while reviewers still overrule weak suggestions.
- Draft completion rate: increase_without_higher_blocked_precision_loss
- Time to valid draft: median_down_or_explained_before_promotion
- Explanation helpfulness: median_rating_not_lower_than_prior_period
- Reviewer efficiency minutes: median_down_or_explained_without_higher_overrule_rate
- Human overrule rate: stable_or_explained_by_policy_changes
Safety precision
Keeps blocking, privacy, and false-match checks visible before expanding any assisted workflow.
- Blocked-proposal precision: reviewer_confirmed_precision_not_lower_than_prior_period
- Privacy leakage incidents: zero_confirmed_incidents
- False match rate: decrease_without_privacy_leakage_increase
Surfacing parity
Looks for material preview gaps across privacy-thresholded slices before broader rollout.
- Subgroup surfacing parity: investigate_and_log_material_slice_gaps_before_rollout
Dispute health
Reports whether evidence, appeals, duplicate-proof issues, and unresolved disputes are improving.
- Appeal overturn rate: publish_with_challenge_context
- Evidence review SLA: meet_or_explain_public_sla
- Duplicate-proof miss rate: zero_unexplained_misses
- Unresolved dispute share: decrease_or_publish_reason_codes
Sample audit evidence
Surfacing parity sample: pass across 20 eligible previews, with 2 reviewed deviation log(s) and 0 unreviewed.
UX readiness sample: pass; blockers: 0.
Open evaluation JSONGuardrails
- Measure pilot clarity, not moral worth. Funnel events may show whether visitors find the right pilot path; they must not score users, causes, offers, or counterparties by moral value.
- Keep raw private content out. Exact wishes, source notes, private constraints, contact details, emails, receipts, prompts, and counterparty-specific messages are forbidden in analytics payloads.
- Use aggregate evidence for product decisions. Measurement should improve copy, route order, review operations, and performance; it must not create engagement feeds, hidden ranking, or autonomous outreach.
- Strip location-bearing URL detail. Analytics may keep route paths and coarse referrer paths, but query strings, hashes, raw search text, and UTM detail are sanitized or bucketed before storage.
- Bucket performance data. Web Vitals are recorded as metric name, rating, and value bucket, not raw traces or user-identifying diagnostic detail.
- Honor analytics objection. If the analytics opt-out cookie is present, optional attribution is cleared and funnel ingestion exits without writing a row; safety, security, payment, and rights-request records remain separately governed.
Performance baseline
The first performance baseline should cover the routes people use before trusting the pilot. Web Vitals may be recorded as LCP, INP, and CLS buckets; Lighthouse or PageSpeed-style runs should stay aggregate and route-level.
Executable baseline command
Run MORALTRADE_BASE_URL=http://127.0.0.1:3000 npm run measure:routes against a production build to capture local mobile and desktop route-health evidence before optimizing. The output path defaults to /tmp/moraltrade-public-route-baseline.json.
Devices: Mobile baseline 390x844; Desktop baseline 1440x1000.
Budgets: DOM content loaded under 10000ms, load under 15000ms, at least 400 body-text characters, and no more than 80 script tags.
- This route baseline is not a Lighthouse score and does not replace PSI or Lighthouse CI.
- The baseline records aggregate route health only; it must not include raw private wishes, source notes, contact details, or receipt contents.
- A passing local baseline does not prove production Core Web Vitals pass status.
/
Mobile and desktop route-level baseline.
/what-is-moral-trade
Mobile and desktop route-level baseline.
/offers
Mobile and desktop route-level baseline.
/worked-examples
Mobile and desktop route-level baseline.
/cohort
Mobile and desktop route-level baseline.
/signup
Mobile and desktop route-level baseline.
/login
Mobile and desktop route-level baseline.
/background-networking
Mobile and desktop route-level baseline.
/wish-registry
Mobile and desktop route-level baseline.
/mpgf
Mobile and desktop route-level baseline.
/measurement
Mobile and desktop route-level baseline.
Roadmap
active
Privacy-safe event taxonomy
Record only the approved funnel events and sanitized metadata listed on this page.
active
Core route performance baseline
Run the public route-baseline command on the home, offers, cohort, signup, login, Moral Trade, private matching, and public-goods routes on mobile and desktop before optimizing.
active
Browser-level analytics objection
Expose an opt-out control that clears the attribution cookie and suppresses optional funnel-event inserts for the current browser.
planned
Aggregate search visibility
Use Search Console only for aggregate query, indexing, and crawl diagnostics; do not merge search-console data into private wish or offer records.
planned
Monthly public aggregate
Publish cohort-scale counts for route clarity, review queues, safety reports, performance health, and disclosure resolution without exposing individual records.
Accountability links
Measurement is useful only if visitors can inspect the surrounding promises: privacy, pilot status, trust boundaries, validation, and public updates.