{"id":"bumpgrade-mobile-admin-dashboard-source-data","generatedFrom":"src/lib/mobile-admin-dashboard.ts","updatedAt":"2026-05-25","status":"live-public-mobile-dashboard-ready","issue":153,"parentIssue":13,"featureId":"feature-mobile-admin","route":"/mobile-admin/dashboard/source-data","sourceRoutes":["/mobile-admin/dashboard/source-data","/mobile-admin/source-data","/mobile-admin/ios/source-data","/mobile-admin/android/source-data","/api/auth/[...all]","/api/mobile-admin/private-rows","/api/mobile-admin/private-rows/actions","/api/mobile-admin/director-reviews","/api/mobile-admin/commerce-reviews","/api/mobile-admin/actions","/features/source-data","/roadmap/source-data","/admin/source-data","/admin/director/source-data","/commerce/source-data","/agent-docs/source-data"],"caveat":"This dashboard contract is public-safe. It gives mobile clients one live digest route, redacted Director workstream briefings, public-safe private-row counts, redacted low-risk private-row action summaries, redacted Director review summaries, redacted commerce review summaries, push-readiness blockers, and distribution-readiness blockers, but it is not live push notifications, high-risk billing or publishing confirmed-write support, physical-device proof, App Store distribution, or Play Store distribution.","redaction":{"privateBuyerDataIncluded":false,"rawInboxBodiesIncluded":false,"ownerEmailValuesIncluded":false,"sessionIdentifiersIncluded":false,"r2ObjectKeysIncluded":false,"signedUrlsIncluded":false,"uploadBodiesIncluded":false,"secretValuesIncluded":false,"writeTokensIncluded":false},"platformStatus":[{"platform":"ios","issue":67,"status":"simulator-smoke-ready","sourceDataRoute":"/mobile-admin/ios/source-data","validationCommand":"npm run mobile:ios:validate","smokeCommand":"npm run mobile:ios:smoke","screenshotPath":"/pr-screenshots/issue-67-ios-mobile-admin-simulator.png"},{"platform":"android","issue":68,"status":"emulator-smoke-ready","sourceDataRoute":"/mobile-admin/android/source-data","validationCommand":"npm run mobile:android:validate","smokeCommand":"npm run mobile:android:smoke","screenshotPath":"/pr-screenshots/issue-68-android-mobile-admin-emulator.png"}],"privateAuth":{"id":"mobile-private-owner-session","issue":414,"status":"owner-session-contract-ready","sessionRoute":"/api/auth/[...all]","loginRoute":"/login","callbackSurface":"/admin/director","acceptedRoles":["owner"],"deniedStates":["signed_out","not_allowlisted","email_unverified","session_unavailable"],"redactionBoundary":"Mobile auth source-data may name routes, roles, denial states, and issue evidence, but it must not expose owner email values, session IDs, cookies, tokens, raw Better Auth payloads, or private admin rows.","privateRowsIncluded":false,"ownerEmailValuesIncluded":false,"sessionIdentifiersIncluded":false},"privateRowsApi":{"id":"mobile-private-rows-api","issue":414,"status":"owner-mobile-private-rows-ready","route":"/api/mobile-admin/private-rows","authBoundary":"owner-session","readBoundary":"The endpoint returns owner-only private row notes and synthetic private payload metadata only to authenticated owners. Public mobile source-data exposes route, status, counts, public row labels, and redaction flags without owner-only notes, private payload JSON, owner email values, session IDs, cookies, tokens, or raw rows.","summarySource":"d1","loadError":null,"counts":{"privateRows":2,"requiresActionRows":1,"unreadRows":2,"ownerOnlyNotes":2,"privatePayloadRows":2},"redaction":{"privateRowsIncludedInPublicSourceData":false,"ownerOnlyNotesIncludedInPublicSourceData":false,"privatePayloadIncludedInPublicSourceData":false,"ownerEmailValuesIncluded":false,"sessionIdentifiersIncluded":false,"cookiesIncluded":false,"tokensIncluded":false,"rawRowsIncluded":false},"latestRows":[{"id":"mobile-private-row-director-queue","rowKind":"owner_director_queue","sourceRoute":"/admin/director/source-data","sourceRecordId":"bumpgrade-director-status","priority":"high","readState":"unread","requiresAction":true,"privateFieldsAvailable":true,"createdAt":"2026-05-24T10:23:58.000Z"},{"id":"mobile-private-row-action-intent-followup","rowKind":"mobile_action_intent_followup","sourceRoute":"/api/mobile-admin/actions","sourceRecordId":"mobile-admin-action-intent-contract","priority":"normal","readState":"unread","requiresAction":false,"privateFieldsAvailable":true,"createdAt":"2026-05-24T10:28:58.000Z"}]},"privateRowActionsApi":{"id":"mobile-private-row-actions-api","issue":428,"status":"owner-mobile-private-row-actions-ready","route":"/api/mobile-admin/private-rows/actions","authBoundary":"owner-session","actionBoundary":"The endpoint mutates only private-row workflow state after exact confirmation, idempotency, stale row revision, stale-state token, and audit-correlation checks. It creates no billing mutation, commerce mutation, publishing mutation, push notification, distribution state change, moderation action, creator-speech action, or public agent write.","summarySource":"d1","loadError":null,"counts":{"privateRowActions":0,"markReadActions":0,"deferActions":0,"productionMutationsCreatedRecords":0,"billingMutationsCreatedRecords":0,"pushNotificationsSentRecords":0,"distributionStateChangedRecords":0},"redaction":{"actorEmailIncluded":false,"actorEmailHashIncluded":false,"actorUserIdIncluded":false,"privateNoteIncluded":false,"privatePayloadIncluded":false,"ownerOnlyNoteIncluded":false,"idempotencyKeysIncluded":false,"staleStateTokenIncludedInPublicSourceData":false,"staleStateTokenHashIncluded":false,"rawRowsIncluded":false,"productionMutationCreated":false,"billingMutationCreated":false,"pushNotificationSent":false,"distributionStateChanged":false},"latestActions":[]},"directorReviewApi":{"id":"mobile-director-review-api","issue":414,"status":"owner-mobile-director-review-ready","route":"/api/mobile-admin/director-reviews","authBoundary":"owner-session","reviewBoundary":"The endpoint records low-risk production owner review state after exact confirmation, idempotency, current Director source-revision checks, stale-state token checks, and audit correlation. It changes only Director review state and creates no billing mutation, publishing mutation, push notification, distribution state change, public agent write, or private-row change.","summarySource":"d1","loadError":null,"counts":{"directorReviews":0,"reviewedWorkstreams":0,"productionAdminStateRecordedRows":0,"billingMutationCreatedRows":0,"pushNotificationSentRows":0,"distributionStateChangedRows":0,"publicAgentWriteCreatedRows":0},"redaction":{"actorEmailIncluded":false,"actorEmailHashIncluded":false,"actorUserIdIncluded":false,"reviewNoteIncluded":false,"idempotencyKeysIncluded":false,"staleStateTokenIncludedInPublicSourceData":false,"staleStateTokenHashIncluded":false,"rawRowsIncluded":false,"billingMutationCreated":false,"pushNotificationSent":false,"distributionStateChanged":false,"publicAgentWriteCreated":false},"latestReviews":[]},"commerceReviewApi":{"id":"mobile-commerce-review-api","issue":414,"status":"owner-mobile-commerce-review-ready","route":"/api/mobile-admin/commerce-reviews","authBoundary":"owner-session","reviewBoundary":"The endpoint records low-risk owner commerce review state after exact confirmation, idempotency, current commerce source-revision checks, stale-state token checks, and audit correlation. It changes only commerce review state and creates no billing mutation, refund, subscription change, price change, fulfillment change, entitlement change, push notification, distribution state change, public agent write, or private-row change.","summarySource":"d1","loadError":null,"counts":{"commerceReviews":0,"reviewedTargets":0,"commerceStateRecordedRows":0,"billingMutationCreatedRows":0,"refundCreatedRows":0,"subscriptionChangedRows":0,"priceChangedRows":0,"fulfillmentStateChangedRows":0,"entitlementStateChangedRows":0,"pushNotificationSentRows":0,"distributionStateChangedRows":0,"publicAgentWriteCreatedRows":0},"redaction":{"actorEmailIncluded":false,"actorEmailHashIncluded":false,"actorUserIdIncluded":false,"reviewNoteIncluded":false,"idempotencyKeysIncluded":false,"staleStateTokenIncludedInPublicSourceData":false,"staleStateTokenHashIncluded":false,"rawRowsIncluded":false,"billingMutationCreated":false,"refundCreated":false,"subscriptionChanged":false,"priceChanged":false,"fulfillmentStateChanged":false,"entitlementStateChanged":false,"pushNotificationSent":false,"distributionStateChanged":false,"publicAgentWriteCreated":false},"latestReviews":[]},"confirmedActions":[{"id":"mobile-confirm-review-agent-work","issue":414,"title":"Review and confirm agent work","status":"owner-director-review-api-ready","surface":"Owner-attention and work-log inbox","requiredInputs":["actorUserId","role","workstreamId","expectedDirectorGeneratedAt","idempotencyKey","staleStateToken","auditCorrelationId"],"mutationBoundary":"The current /api/mobile-admin/director-reviews endpoint can record owner-confirmed Director workstream review state for this action. /api/mobile-admin/actions remains available for audit-only action intent evidence, but higher-risk production mutations still require domain-specific confirmed-write APIs."},{"id":"mobile-confirm-commerce-health-review","issue":414,"title":"Review commerce health","status":"owner-commerce-review-api-ready","surface":"Commerce health summary","requiredInputs":["actorUserId","role","reviewTargetId","expectedCommerceGeneratedAt","idempotencyKey","staleStateToken","auditCorrelationId"],"mutationBoundary":"The current /api/mobile-admin/commerce-reviews endpoint can record owner-confirmed commerce-health review state for this action. It does not create checkout, refund, subscription, price, fulfillment, entitlement, push, distribution, private-row, or public agent mutations."},{"id":"mobile-confirm-commerce-change","issue":414,"title":"Confirm commerce or fulfillment changes","status":"future-api-required","surface":"Commerce health summary","requiredInputs":["actorUserId","role","priceId","amount","currency","idempotencyKey","staleStateToken","auditCorrelationId"],"mutationBoundary":"No mobile checkout, refund, subscription, price, fulfillment, or entitlement mutation is live until the shared confirmed-write API and platform evidence exist."}],"actionIntentApi":{"id":"mobile-action-intent-api","issue":414,"status":"owner-mobile-action-intent-ready","route":"/api/mobile-admin/actions","authBoundary":"owner-session","intentBoundary":"The endpoint records redacted action intent evidence only. It creates no production admin mutation, billing mutation, push notification, distribution state change, private mobile row exposure, or direct public agent write.","summarySource":"d1","loadError":null,"counts":{"actionIntents":0,"reviewAgentWorkIntents":0,"commerceChangeIntents":0,"productionMutationsCreatedRecords":0,"billingMutationsCreatedRecords":0,"pushNotificationsSentRecords":0,"distributionStateChangedRecords":0},"redaction":{"actorEmailIncluded":false,"actorEmailHashIncluded":false,"actorUserIdIncluded":false,"privateNoteIncluded":false,"idempotencyKeysIncluded":false,"staleStateTokenIncludedInPublicSourceData":false,"staleStateTokenHashIncluded":false,"rawRowsIncluded":false,"productionMutationCreated":false,"billingMutationCreated":false,"pushNotificationSent":false,"distributionStateChanged":false},"latestIntents":[]},"pushNotificationBoundary":{"id":"mobile-push-notification-boundary","issue":414,"status":"push-boundary-ready","sendCapability":"disabled-provider-contract-required","requiredProviders":[{"platform":"ios","provider":"APNs","requiredEvidence":["APNs provider choice and credential storage path","iOS bundle ID and entitlement proof","Device-token registration contract","Owner-confirmed send preflight with idempotency and audit correlation"]},{"platform":"android","provider":"FCM","requiredEvidence":["FCM provider choice and credential storage path","Android package and google-services configuration proof","Device-token registration contract","Owner-confirmed send preflight with idempotency and audit correlation"]}],"blockedBy":["No APNs credential plumbing is present in the repo.","No FCM credential plumbing is present in the repo.","No private device-token registration contract exists yet.","No owner-confirmed push send preflight or provider-call API exists yet."],"redactionFlags":["apnsCredentialsIncluded=false","fcmCredentialsIncluded=false","deviceTokensIncluded=false","recipientIdentifiersIncluded=false","pushPayloadBodiesIncluded=false","providerResponsesIncluded=false","queueRowsIncluded=false","deliveryReceiptsIncluded=false","pushNotificationsSent=false"],"publicSourceDataSummary":"Public mobile source-data may expose provider names, disabled send status, required evidence, blocked-by reasons, and redaction flags. It must not expose APNs/FCM credentials, device tokens, recipient identities, push payload bodies, queue rows, provider responses, or delivery receipts."},"distributionReadiness":{"id":"mobile-distribution-readiness-boundary","issue":414,"status":"distribution-boundary-ready","installableDistributionClaim":false,"platformEvidence":[{"platform":"ios","currentEvidence":"The iOS app foundation has a simulator smoke target and screenshots, but physical-device proof is parked while the detected iPhone target is unavailable.","requiredBeforeClaim":["Available physical iPhone target or explicit simulator-only acceptance decision","Bundle identifier and signing profile decision","TestFlight or App Store Connect distribution path","Private-row/auth smoke proof labeled as simulator, physical device, or distribution evidence"],"blockedBy":["Detected iPhone target is unavailable to devicectl in the current environment."]},{"platform":"android","currentEvidence":"The Android app foundation has an emulator smoke target and screenshots, but physical-device proof is parked because no Android device is attached.","requiredBeforeClaim":["Attached Android physical device or explicit emulator-only acceptance decision","Release signing and package identity decision","Play Console/internal testing distribution path","Private-row/auth smoke proof labeled as emulator, physical device, or distribution evidence"],"blockedBy":["adb currently reports no attached physical Android devices in the project blocker audit."]}],"readinessChecklist":["Keep simulator and emulator screenshots labeled as non-distribution evidence.","Record physical-device smoke proof separately from simulator/emulator proof.","Record signing, bundle/package, and store-track decisions before claiming installability.","Do not label App Store, TestFlight, Play Store, or internal testing as live until platform evidence exists."],"redactionFlags":["signingCredentialsIncluded=false","provisioningProfilesIncluded=false","keystoreMaterialIncluded=false","storeAccountIdentifiersIncluded=false","privateTesterListsIncluded=false","physicalDevicePrivateRowsIncluded=false","appStoreDistributionLive=false","playStoreDistributionLive=false"],"publicSourceDataSummary":"Public mobile source-data may expose simulator/emulator status, required platform evidence, and current blockers. It must not expose signing credentials, provisioning profiles, keystore material, store account identifiers, private tester lists, or physical-device private rows."},"featureSummary":{"updatedAt":"2026-05-25","total":18,"live":15,"launchPreview":3,"pending":0,"mobileFeature":{"id":"feature-mobile-admin","status":"launch-preview","issue":414,"evidence":["Current active follow-up tracked by issue #414.","Original foundation contract tracked by issue #13.","iOS app slice tracked by issue #67.","Android app slice tracked by issue #68.","Live dashboard source-data bridge tracked by issue #153.","Mobile dashboard foundation rendering tracked by issue #155.","Mobile dashboard live hydration tracked by issue #157.","Mobile owner-session and confirmed-action UI contract tracked by issue #414.","Mobile owner-session private-row inspection API tracked by issue #414.","Mobile owner-confirmed private-row workflow action API tracked by issue #428.","Mobile owner-confirmed Director workstream review API tracked by issue #414.","Mobile owner-confirmed commerce-health review API tracked by issue #414.","Mobile audit-only action intent API tracked by issue #414.","Mobile Director workstream digest tracked by issue #414.","Mobile push-notification readiness boundary tracked by issue #414.","Mobile distribution-readiness boundary tracked by issue #414.","`/mobile-admin/source-data` exposes jobs, API dependencies, stack decision, and confirmed-write boundaries.","`/mobile-admin/dashboard/source-data` exposes a public-safe digest of Director workstreams, feature, roadmap, work-log, attention, commerce, agent, private-row, and platform status for mobile clients.","`/api/mobile-admin/private-rows` is owner-session-only and returns read-only private rows without production mutations.","`/api/mobile-admin/private-rows/actions` is owner-session-only and mutates only low-risk private-row workflow state with redacted audit evidence.","`/api/mobile-admin/director-reviews` is owner-session-only and records low-risk Director workstream acknowledgement state with redacted audit evidence.","`/api/mobile-admin/commerce-reviews` is owner-session-only and records low-risk commerce-health acknowledgement state with redacted audit evidence.","`/api/mobile-admin/actions` is owner-gated and records redacted action intent evidence without production admin, billing, push, distribution, or private-row mutation.","`/mobile-admin/source-data` exposes push-readiness and distribution-readiness boundaries without APNs/FCM credentials, device tokens, signing credentials, provisioning profiles, keystore material, private tester lists, or store account identifiers.","`/mobile-admin/ios/source-data` exposes the first iOS foundation, fixture, simulator target, smoke command, and screenshot path.","`/mobile-admin/android/source-data` exposes the first Android foundation, fixture asset, emulator smoke command, and screenshot path."]}},"roadmapSummary":{"updatedAt":"2026-05-26","counts":[{"status":"shipped","label":"Shipped","description":"Merged, deployed, and safe to describe as live public surface area.","count":21},{"status":"active","label":"Active","description":"Currently being implemented or validated.","count":3},{"status":"blocked","label":"Blocked","description":"Known unblock condition is public-safe and specific.","count":0},{"status":"next","label":"Next","description":"Queued near-term because later work depends on it.","count":0},{"status":"planned","label":"Planned","description":"Tracked parity work with an issue, but not active yet.","count":3}],"mobileRoadmapItem":null},"adminDigest":{"source":"d1","loadError":null,"roadmapCounts":[{"status":"live","count":21},{"status":"active","count":3},{"status":"blocked","count":0},{"status":"pending","count":3},{"status":"idea","count":0},{"status":"parked","count":0}],"counts":{"roadmapItems":27,"workLogEntries":50,"userJourneys":43,"openAttentionItems":2},"recentWorkLogEntries":[{"id":"work-log-2026-05-29-public-agent-doc-source-data-aliases","title":"Added public agent-doc source-data aliases","completedAt":"2026-05-29T03:54:27.000Z","githubIssueNumbers":[535,564],"closedPrNumbers":[582],"prCommentUrl":"https://github.com/markitics/bumpgrade/pull/582#issuecomment-4570359690"},{"id":"work-log-2026-05-29-add-before-after-importer-offer-visuals","title":"Add before-after importer and offer visuals","completedAt":"2026-05-29T03:06:29.000Z","githubIssueNumbers":[554,535],"closedPrNumbers":[581],"prCommentUrl":"https://github.com/markitics/bumpgrade/pull/581#issuecomment-4570095750"},{"id":"work-log-2026-05-29-add-approved-customer-proof-trust-signals","title":"Add approved customer-proof trust signals","completedAt":"2026-05-29T02:22:08.000Z","githubIssueNumbers":[535,553,579],"closedPrNumbers":[580],"prCommentUrl":"https://github.com/markitics/bumpgrade/pull/580#issuecomment-4569928400"},{"id":"work-log-2026-05-29-user-journey-proof-source","title":"Make admin journey proof source explicit","completedAt":"2026-05-29T01:19:30.000Z","githubIssueNumbers":[535,544],"closedPrNumbers":[578],"prCommentUrl":"https://github.com/markitics/bumpgrade/pull/578#issuecomment-4569657588"},{"id":"work-log-2026-05-29-noncanonical-comparison-boundary","title":"Marked adjacent comparison examples as non-canonical","completedAt":"2026-05-29T00:49:05.000Z","githubIssueNumbers":[542,535],"closedPrNumbers":[577],"prCommentUrl":"https://github.com/markitics/bumpgrade/pull/577#issuecomment-4569500476"}],"attentionItems":[{"id":"mark-attention-2026-05-25-email-sender-domain-before-subscriber-delivery","category":"blocked","state":"open","urgency":"medium","title":"Choose and verify audience sender before subscriber email delivery","responseChannelIds":["read_only","github_issue","project_email","codex_desktop"],"linkIssueNumbers":[],"lastActivityAt":"2026-05-26T21:05:28.000Z"},{"id":"mark-attention-2026-05-18-rkmoriarty-auth-alignment","category":"review","state":"open","urgency":"medium","title":"Confirm authenticated sender alignment for a private trusted sender","responseChannelIds":["read_only","github_issue","project_email","codex_desktop"],"linkIssueNumbers":[],"lastActivityAt":"2026-05-18T14:17:27.000Z"}]},"directorDigest":{"sourceDataRoute":"/admin/director/source-data","source":"d1","loadError":null,"totals":{"workstreams":9,"onTrack":4,"atRisk":1,"blocked":0,"done":4,"quiet":0,"changedPastDay":0,"changedPastWeek":0,"needsMark":2},"windows":[{"id":"past-1-day","label":"Past 1 day","workLogEntries":0,"shippedPrs":0,"changedWorkstreams":0,"needsMark":0,"recentChanges":[]},{"id":"past-7-days","label":"Past 7 days","workLogEntries":0,"shippedPrs":0,"changedWorkstreams":0,"needsMark":0,"recentChanges":[]}],"briefingControls":[{"id":"past-1-day","label":"Past 1 day","title":"Changed since yesterday","href":"/admin/work-log?window=past-1-day","sourceRoute":"/admin/work-log/source-data","primaryMetric":{"value":0,"label":"work-log entries"},"secondaryMetric":"0 workstreams changed","workstreamIds":[]},{"id":"past-7-days","label":"Past 7 days","title":"Weekly CMO-style recap","href":"/admin/work-log?window=past-7-days","sourceRoute":"/admin/work-log/source-data","primaryMetric":{"value":0,"label":"work-log entries"},"secondaryMetric":"0 workstreams changed","workstreamIds":[]},{"id":"executive-queue","label":"Due and pending","title":"Executive queue","href":"#executive-queue","sourceRoute":"/admin/director/source-data","primaryMetric":{"value":2,"label":"due now"},"secondaryMetric":"11 total queue items","workstreamIds":["security-trust","product-commerce","analytics-growth","mobile-admin","audience-email","operations-control"]},{"id":"workstream-map","label":"Nested teams","title":"Workstream map","href":"#workstream-map","sourceRoute":"/admin/director/source-data","primaryMetric":{"value":9,"label":"workstreams"},"secondaryMetric":"1 risk flag","workstreamIds":["marketing","product-commerce","audience-email","analytics-growth","mobile-admin","agent-readiness","security-trust","infrastructure","operations-control"]}],"executiveQueue":[{"id":"due-now","label":"Due now","itemCount":2,"items":[{"id":"mark-attention-2026-05-25-email-sender-domain-before-subscriber-delivery","title":"Choose and verify audience sender before subscriber email delivery","workstreamId":"security-trust","workstreamTitle":"Security / Trust","priority":"high","queueLabel":"Needs owner action"},{"id":"mark-attention-2026-05-18-rkmoriarty-auth-alignment","title":"Confirm authenticated sender alignment for a private trusted sender","workstreamId":"security-trust","workstreamTitle":"Security / Trust","priority":"high","queueLabel":"Needs owner action"}]},{"id":"in-flight","label":"In flight","itemCount":3,"items":[{"id":"roadmap-advanced-funnel-builder-parity","title":"Advanced funnel editing, resource delivery, and agent-safe writes","workstreamId":"product-commerce","workstreamTitle":"Product / Commerce","priority":"medium","queueLabel":"In flight"},{"id":"roadmap-live-analytics-execution","title":"Live analytics automation, experiment routing, notification execution, and agent-safe writes","workstreamId":"analytics-growth","workstreamTitle":"Analytics / Growth","priority":"medium","queueLabel":"In flight"},{"id":"roadmap-mobile-admin","title":"Publisher admin apps for iOS and Android","workstreamId":"mobile-admin","workstreamTitle":"Mobile Admin","priority":"medium","queueLabel":"In flight"}]},{"id":"pending-next","label":"Pending next","itemCount":3,"items":[{"id":"roadmap-live-publisher-offer-billing","title":"Live publisher-offer checkout and webhook rollout","workstreamId":"product-commerce","workstreamTitle":"Product / Commerce","priority":"normal","queueLabel":"Pending next"},{"id":"roadmap-live-email-delivery-execution","title":"Live email delivery, automation execution, and agent-safe writes","workstreamId":"audience-email","workstreamTitle":"Audience / Email","priority":"normal","queueLabel":"Pending next"},{"id":"roadmap-live-affiliate-execution","title":"Live affiliate payout execution, partner notifications, fraud enforcement, and agent-safe writes","workstreamId":"analytics-growth","workstreamTitle":"Analytics / Growth","priority":"normal","queueLabel":"Pending next"}]},{"id":"watchlist","label":"Watchlist","itemCount":3,"items":[{"id":"roadmap-stripe-commerce","title":"Stripe payments and checkout architecture","workstreamId":"product-commerce","workstreamTitle":"Product / Commerce","priority":"normal","queueLabel":"Watch"},{"id":"roadmap-better-auth","title":"Publisher and admin authentication","workstreamId":"security-trust","workstreamTitle":"Security / Trust","priority":"normal","queueLabel":"Watch"},{"id":"roadmap-codex-email","title":"Codex project email and reply monitor","workstreamId":"operations-control","workstreamTitle":"Operations / Project Control","priority":"normal","queueLabel":"Watch"}]}],"workstreams":[{"id":"marketing","title":"Marketing","status":"done","currentFocus":"Homepage, positioning, feature catalog, comparison pages, SEO, resources, and public launch copy.","defaultOpen":false,"counts":{"active":0,"pending":0,"shipped":4,"blocked":0,"changedPastDay":0,"changedPastWeek":0,"needsMark":0},"brief":{"headline":"Homepage, positioning, feature catalog, comparison pages, SEO, resources, and public launch copy.","signals":[{"id":"due-now","label":"Due","state":"empty","title":"Nothing due","summary":"No current item.","count":0},{"id":"in-flight","label":"Doing","state":"empty","title":"No active work","summary":"No current item.","count":0},{"id":"pending-next","label":"Next","state":"empty","title":"No pending item","summary":"No current item.","count":0},{"id":"changed-7-days","label":"Changed 7d","state":"empty","title":"No recent change","summary":"No current item.","count":0},{"id":"watchlist","label":"Watch","state":"empty","title":"No watch item","summary":"No current item.","count":0}]}},{"id":"product-commerce","title":"Product / Commerce","status":"on_track","currentFocus":"Advanced funnel editing, resource delivery, and agent-safe writes","defaultOpen":false,"counts":{"active":1,"pending":1,"shipped":3,"blocked":0,"changedPastDay":0,"changedPastWeek":0,"needsMark":0},"brief":{"headline":"Doing: Advanced funnel editing, resource delivery, and agent-safe writes","signals":[{"id":"due-now","label":"Due","state":"empty","title":"Nothing due","summary":"No current item.","count":0},{"id":"in-flight","label":"Doing","state":"active","title":"Advanced funnel editing, resource delivery, and agent-safe writes","summary":"Active post-MVP funnel parity for visual funnel editing, resource delivery, webinar integrations, unauthenticated public agent writes, and stronger resource fulfillment; owner-confirmed checkout unlinking, resource delivery links, funnel-scoped private download-token delivery, owner-session agent-created resource delivery tokens, redacted resource-delivery receipt evidence after successful private download redemption, webinar event/replay links, visual block style controls, bounded canvas layout controls, archived-draft purge, bulk archived-draft purge, within-step block reordering, drag/drop block placement through existing move endpoints, cross-step block moves, and owner-session direct agent-safe draft writes are now part of this bucket's shipped evidence.","count":1},{"id":"pending-next","label":"Next","state":"pending","title":"Live publisher-offer checkout and webhook rollout","summary":"Pending live-mode publisher-offer billing after the first package, amount, Stripe Price policy, and live webhook secret are confirmed. Bumpgrade account-plan self-serve checkout remains separate.","count":1},{"id":"changed-7-days","label":"Changed 7d","state":"empty","title":"No recent change","summary":"No current item.","count":0},{"id":"watchlist","label":"Watch","state":"watch","title":"Stripe payments and checkout architecture","summary":"Cloudflare secret inventory includes the live Stripe secret but not a live webhook signing secret, so the first self-serve activation verifies Checkout Session success server-side on /pricing/success.","count":1}]}},{"id":"audience-email","title":"Audience / Email","status":"on_track","currentFocus":"Live email delivery, automation execution, and agent-safe writes","defaultOpen":false,"counts":{"active":0,"pending":1,"shipped":1,"blocked":0,"changedPastDay":0,"changedPastWeek":0,"needsMark":0},"brief":{"headline":"Next: Live email delivery, automation execution, and agent-safe writes","signals":[{"id":"due-now","label":"Due","state":"empty","title":"Nothing due","summary":"No current item.","count":0},{"id":"in-flight","label":"Doing","state":"empty","title":"No active work","summary":"No current item.","count":0},{"id":"pending-next","label":"Next","state":"pending","title":"Live email delivery, automation execution, and agent-safe writes","summary":"Pending post-MVP execution bucket for sender/domain/provider setup, Cloudflare Queue producer and consumer execution, recipient payload generation, provider calls, delivery attempts, results, webhooks, polling, receipts, live imports, exports, automation execution, and direct agent-safe write APIs.","count":1},{"id":"changed-7-days","label":"Changed 7d","state":"empty","title":"No recent change","summary":"No current item.","count":0},{"id":"watchlist","label":"Watch","state":"empty","title":"No watch item","summary":"No current item.","count":0}]}},{"id":"analytics-growth","title":"Analytics / Growth","status":"on_track","currentFocus":"Live analytics automation, experiment routing, notification execution, and agent-safe writes","defaultOpen":false,"counts":{"active":1,"pending":1,"shipped":4,"blocked":0,"changedPastDay":0,"changedPastWeek":0,"needsMark":0},"brief":{"headline":"Doing: Live analytics automation, experiment routing, notification execution, and agent-safe writes","signals":[{"id":"due-now","label":"Due","state":"empty","title":"Nothing due","summary":"No current item.","count":0},{"id":"in-flight","label":"Doing","state":"active","title":"Live analytics automation, experiment routing, notification execution, and agent-safe writes","summary":"Active post-MVP execution bucket for custom/non-seeded analytics event schemas beyond the current seeded boundary, owner-confirmed winner rollout and rollback routing, automated alert/notification execution, Cloudflare Queue producer and consumer execution, provider calls, delivery attempts, results, webhooks, polling, receipts, raw/private exports, and direct agent-safe analytics write APIs. Public-safe source/campaign rules, seeded sandbox funnel copy routing, baseline holdout, and owner-confirmed winner rollout contracts are now live through the existing assignment API.","count":1},{"id":"pending-next","label":"Next","state":"pending","title":"Live affiliate payout execution, partner notifications, fraud enforcement, and agent-safe writes","summary":"Pending post-MVP execution bucket for payable commission finalization, private payout account and tax boundaries, Stripe payouts/transfers/reversals/receipts/reconciliation, payable statement creation, partner notification execution, provider configuration and sends, authenticated private partner portals, buyer attribution finalization, and direct agent-safe affiliate/referral write APIs. Owner-confirmed fraud enforcement records, public-safe partner portal status pages, and public-safe partner statement snapshots are live as non-payout issue #424 slices.","count":1},{"id":"changed-7-days","label":"Changed 7d","state":"empty","title":"No recent change","summary":"No current item.","count":0},{"id":"watchlist","label":"Watch","state":"empty","title":"No watch item","summary":"No current item.","count":0}]}},{"id":"mobile-admin","title":"Mobile Admin","status":"on_track","currentFocus":"Publisher admin apps for iOS and Android","defaultOpen":false,"counts":{"active":1,"pending":0,"shipped":0,"blocked":0,"changedPastDay":0,"changedPastWeek":0,"needsMark":0},"brief":{"headline":"Doing: Publisher admin apps for iOS and Android","signals":[{"id":"due-now","label":"Due","state":"empty","title":"Nothing due","summary":"No current item.","count":0},{"id":"in-flight","label":"Doing","state":"active","title":"Publisher admin apps for iOS and Android","summary":"Current follow-up for installable private mobile admin parity after the completed read-only dashboard, Director workstream digest, iOS foundation, Android foundation, live-hydration, owner-session/confirmed-action contract, owner-gated private-row inspection, low-risk private-row workflow actions, owner-confirmed Director workstream reviews, owner-confirmed commerce-health reviews, owner-gated audit-only action-intent API, and push/distribution readiness-boundary slices.","count":1},{"id":"pending-next","label":"Next","state":"empty","title":"No pending item","summary":"No current item.","count":0},{"id":"changed-7-days","label":"Changed 7d","state":"empty","title":"No recent change","summary":"No current item.","count":0},{"id":"watchlist","label":"Watch","state":"empty","title":"No watch item","summary":"No current item.","count":0}]}},{"id":"agent-readiness","title":"Agent Readiness","status":"done","currentFocus":"Agent docs, manifests, source-data contracts, MCP roadmap, stable IDs, and write-safety boundaries.","defaultOpen":false,"counts":{"active":0,"pending":0,"shipped":1,"blocked":0,"changedPastDay":0,"changedPastWeek":0,"needsMark":0},"brief":{"headline":"Agent docs, manifests, source-data contracts, MCP roadmap, stable IDs, and write-safety boundaries.","signals":[{"id":"due-now","label":"Due","state":"empty","title":"Nothing due","summary":"No current item.","count":0},{"id":"in-flight","label":"Doing","state":"empty","title":"No active work","summary":"No current item.","count":0},{"id":"pending-next","label":"Next","state":"empty","title":"No pending item","summary":"No current item.","count":0},{"id":"changed-7-days","label":"Changed 7d","state":"empty","title":"No recent change","summary":"No current item.","count":0},{"id":"watchlist","label":"Watch","state":"empty","title":"No watch item","summary":"No current item.","count":0}]}},{"id":"security-trust","title":"Security / Trust","status":"at_risk","currentFocus":"Decision needed: Choose and verify audience sender before subscriber email delivery","defaultOpen":true,"counts":{"active":0,"pending":0,"shipped":4,"blocked":0,"changedPastDay":0,"changedPastWeek":0,"needsMark":2},"brief":{"headline":"Due: Choose and verify audience sender before subscriber email delivery","signals":[{"id":"due-now","label":"Due","state":"needs_mark","title":"Choose and verify audience sender before subscriber email delivery","summary":"Confirm the audience sender address/domain to use for subscriber-facing Bumpgrade email, then verify/configure it with the provider and update Cloudflare Email Sending allowed sender addresses.","count":2},{"id":"in-flight","label":"Doing","state":"empty","title":"No active work","summary":"No current item.","count":0},{"id":"pending-next","label":"Next","state":"empty","title":"No pending item","summary":"No current item.","count":0},{"id":"changed-7-days","label":"Changed 7d","state":"empty","title":"No recent change","summary":"No current item.","count":0},{"id":"watchlist","label":"Watch","state":"watch","title":"Publisher and admin authentication","summary":"Production admin access requires a verified owner email; project email remains tracked in #10.","count":1}]}},{"id":"infrastructure","title":"Infrastructure","status":"done","currentFocus":"Cloudflare, D1, deploys, CI, runtime boundaries, migrations, and production operations.","defaultOpen":false,"counts":{"active":0,"pending":0,"shipped":1,"blocked":0,"changedPastDay":0,"changedPastWeek":0,"needsMark":0},"brief":{"headline":"Cloudflare, D1, deploys, CI, runtime boundaries, migrations, and production operations.","signals":[{"id":"due-now","label":"Due","state":"empty","title":"Nothing due","summary":"No current item.","count":0},{"id":"in-flight","label":"Doing","state":"empty","title":"No active work","summary":"No current item.","count":0},{"id":"pending-next","label":"Next","state":"empty","title":"No pending item","summary":"No current item.","count":0},{"id":"changed-7-days","label":"Changed 7d","state":"empty","title":"No recent change","summary":"No current item.","count":0},{"id":"watchlist","label":"Watch","state":"empty","title":"No watch item","summary":"No current item.","count":0}]}},{"id":"operations-control","title":"Operations / Project Control","status":"done","currentFocus":"Roadmap, work-log, owner-attention queue, director dashboard, decisions, blockers, and project hygiene.","defaultOpen":false,"counts":{"active":0,"pending":0,"shipped":3,"blocked":0,"changedPastDay":0,"changedPastWeek":0,"needsMark":0},"brief":{"headline":"Watch: Codex project email and reply monitor","signals":[{"id":"due-now","label":"Due","state":"empty","title":"Nothing due","summary":"No current item.","count":0},{"id":"in-flight","label":"Doing","state":"empty","title":"No active work","summary":"No current item.","count":0},{"id":"pending-next","label":"Next","state":"empty","title":"No pending item","summary":"No current item.","count":0},{"id":"changed-7-days","label":"Changed 7d","state":"empty","title":"No recent change","summary":"No current item.","count":0},{"id":"watchlist","label":"Watch","state":"watch","title":"Codex project email and reply monitor","summary":"Owner policy requires private runtime sender rules before inbound email can steer Codex; From text alone is not trusted.","count":1}]}}],"redaction":{"privateRowsIncluded":false,"ownerEmailValuesIncluded":false,"rawAttentionBodiesIncluded":false,"rawWorkLogBodiesIncluded":false,"privateEvidenceIncluded":false}},"commerceDigest":{"sourceDataRoute":"/commerce/source-data","tableCount":15,"liveTables":["commerce_products","commerce_prices","checkout_intents","checkout_referral_attributions","checkout_post_purchase_decisions","affiliate_commission_ledger_entries","affiliate_commission_ledger_actions","stripe_webhook_events","billing_subscriptions","payment_audit_events","product_entitlements","product_fulfillment_tasks","product_asset_uploads","product_entitlement_revocation_intents","product_protected_content_sections"],"reviewApiRoute":"/api/mobile-admin/commerce-reviews","reviewedTargetCount":0,"privateFieldsIncluded":false},"agentDigest":{"sourceDataRoute":"/agent-docs/source-data","readContractCount":95,"sourceEvidenceRouteCount":26,"mcpPlanCount":76,"mobileReadContracts":[{"id":"read-mobile-admin-contract","route":"/mobile-admin/source-data","auth":"public"},{"id":"read-mobile-admin-dashboard","route":"/mobile-admin/dashboard/source-data","auth":"public"},{"id":"create-owner-mobile-admin-commerce-review","route":"/api/mobile-admin/commerce-reviews","auth":"owner-session"},{"id":"create-owner-mobile-admin-director-review","route":"/api/mobile-admin/director-reviews","auth":"owner-session"},{"id":"create-owner-mobile-admin-private-row-action","route":"/api/mobile-admin/private-rows/actions","auth":"owner-session"},{"id":"read-owner-mobile-admin-private-rows","route":"/api/mobile-admin/private-rows","auth":"owner-session"},{"id":"create-owner-mobile-admin-action-intent","route":"/api/mobile-admin/actions","auth":"owner-session"},{"id":"read-ios-mobile-admin","route":"/mobile-admin/ios/source-data","auth":"public"},{"id":"read-android-mobile-admin","route":"/mobile-admin/android/source-data","auth":"public"}]},"nextMobileMilestones":["Add higher-risk domain-specific confirmed-write APIs before mobile can approve billing-impacting, fulfillment, publishing, moderation, or creator-speech actions.","Add physical-device proof for private mobile row inspection beyond simulator/emulator foundations.","Choose and configure private APNs/FCM provider credentials, device-token registration, send preflight, queue, delivery-result, and receipt contracts before any push sends.","Record physical-device and App Store/TestFlight or Play Store/internal-testing evidence separately from simulator/emulator proof before claiming installable app readiness."],"writeBoundary":["The first private mobile row slice is read-only through /api/mobile-admin/private-rows and cannot mutate production state.","The first Mobile Admin private-row confirmed-write slice can mark private rows read or deferred through /api/mobile-admin/private-rows/actions, but it cannot mutate billing, commerce, publishing, moderation, creator speech, push notifications, distribution, or public agent state.","The first domain-specific Mobile Admin confirmed-write slice can acknowledge Director workstreams through /api/mobile-admin/director-reviews, but it mutates only low-risk owner review state.","The first Mobile Admin commerce review slice can acknowledge commerce source-data health through /api/mobile-admin/commerce-reviews, but it cannot create checkouts, refunds, subscription changes, price changes, fulfillment changes, entitlement changes, push notifications, distribution state, private-row changes, or public agent writes.","The first mobile app slices can record audit-only action intents through /api/mobile-admin/actions, but higher-risk production mutations remain disabled until additional domain-specific confirmed-write APIs exist.","Do not ship mobile-only product semantics; mobile reads and writes must map to the same feature, roadmap, commerce, admin, and agent contracts as web.","Public, destructive, billing-impacting, publishing, moderation, source-editing, and creator-speech writes require explicit confirmation text.","Billing-impacting mobile actions require amount, currency, price/product stale-state checks, idempotency, audit correlation, redaction, and webhook evidence.","Mobile push sends remain disabled until APNs/FCM provider configuration, device-token registration, send preflight, queue, delivery-result, receipt, idempotency, consent, audit, and redaction boundaries exist.","Mobile distribution remains disabled until physical-device proof and App Store/TestFlight or Play Store/internal-testing evidence are recorded separately from simulator/emulator proof.","Private admin data requires an authenticated owner or publisher session; public source-data routes must remain safe for anonymous agents."]}