← Migration Readiness ReportReadinessRunbookRestore script

Cutover Readiness Report

Date: 2026-05-29 Environment: TEST box (98.84.88.134) β€” read-only baseline Scope: Phase-0/Baseline parity + Phase-2 functional gap assessment


1. Executive Summary

Readiness Verdict: 🟒 GREEN

Cutover will work: the live TEST baseline is fully healthy and data-matched (11/11 datasets match expected exactly, 11/11 plugins ready, all 3 bridge views resolve, bootstrap ready), with zero cutover blockers β€” the only outstanding item is four deliberately-gated write interactions that ship today as read-only ports and lose no data.


2. Current State

Area Status Detail
Bootstrap βœ… Ready bootstrapStatus=ready, bootstrapInviteActive=false
API Health βœ… OK /api/health status=ok, deploymentMode=authenticated
Plugins βœ… 11/11 ready 16 rows in plugins table (11 ready + 5 uninstalled); readiness sourced from public.plugins
Bridge views βœ… 3/3 resolve knowledge_intake=247, deep_analysis_issues=186, subscriptions_view=1779
MCP service βœ… Active sears-kairos-agents.service=active; 127.0.0.1:18893/health=ok; 74 tools across voice, sms, monday, doc-search, memory, google-ads, facebook-ads, kenmore, eddie-meeting, model-lab
ngrok βšͺ Inactive (expected) ngrok-paperclip.service=inactive
Data parity βœ… allMatch=true 11/11 datasets match expected; 0 mismatches

Data Parity Detail

Dataset Count Expected Match
action_overlay 3494 3494 βœ…
human_agents 261 261 βœ…
milestones 455 455 βœ…
frameworks 54 54 βœ…
subscriptions 1779 1779 βœ…
email_templates 13 13 βœ…
pilot_users 5 5 βœ…
rhythm_activities 0 0 βœ…
knowledge_intake 247 247 βœ…
deep_analysis_issues 186 186 βœ…
subscriptions_view 1779 1779 βœ…

Note: /api/plugins returned HTTP 403 ("Board access required") with no authenticated board session, so plugin readiness was sourced authoritatively from the public.plugins table (11 ready / 5 uninstalled). Live MCP tool count is 74 (task referenced an expected count loosely; 74 is the live value).


3. The One Remaining Functional Gap

All four interactions below already ship as READ-ONLY ports β€” no data is lost at cutover; only these write actions are dormant.

Feature Verdict Summary
Reviews β€” approve 🟒 feasible-now Restorable on stock host. Decision lives plugin-owned (namespace upsert) and is reflected via issues.update + issues.createComment/createInteraction + issues.wakeup. No host change.
Reviews β€” request-changes 🟒 feasible-now Same plugin/capabilities as approve; second POST route (or branch on body.outcome). Sends issue back to todo; enforce β‰₯5-char comment + idempotency in-plugin. No host change.
invite-human 🟑 partial Board-level membership invite feasible-now via first-class access.invites.create. The fork's issue-scoped participant token + MSGraph email are not host-exposed, so a faithful issue-scoped invite needs an in-plugin scoped token/link + external mailer (http.fetch) or a host extension.
send-digest πŸ”΄ needs-host-change No email/notify/digest host RPC exists anywhere in sdk/src or server. A faithful platform-sender digest requires a new workerβ†’host email RPC wired to existing server/src/services/email.ts; otherwise an interim http.fetch+secrets external-mailer workaround.

Fidelity caveats

Identity is not a blocker: onApiRequest.actor.userId and performAction context already deliver host-resolved identity. The only constraint is that all four must be implemented as POST API routes (or performAction), never as ctx.data.register data handlers, which receive no actor.


4. Cutover Blockers

None β€” the remaining items are deliberate gated switches.

cutoverBlockers: []. The baseline is healthy and fully matched; all four outstanding interactions ship today as read-only ports, so cutover loses no data. Three of the four are restorable on the stock host with no host change; only send-digest carries a genuine host gap, and it is deferrable post-cutover (or unblockable immediately via the http.fetch workaround).


5. Recommended Sequence to Cutover-Confident

  1. Reviews β€” approve (feasible-now, stock host) β€” plugin-namespace decision + issues.update/createComment/createInteraction/wakeup. Fix ops-views version drift (worker logs v0.6.0 vs manifest v0.7.0).
  2. Reviews β€” request-changes (feasible-now, stock host) β€” second POST route; enforce β‰₯5-char comment + idempotency via the namespace decision row.
  3. invite-human (partial, stock host) β€” ship board-level invite via access.invites.create now; decide separately on issue-scoped token + email (in-plugin mailer vs. host extension).
  4. send-digest (needs-host-change) — either land the new worker→host email RPC (protocol.ts + host-client-factory METHOD_CAPABILITY_MAP + capability enum + wire to server/src/services/email.ts) post-cutover, or ship the http.fetch+secrets interim mailer if a same-platform sender is not required for cutover.

Net: ship approve / request-changes / invite-human now on the stock host; treat send-digest as a deferred post-cutover host extension or an http.fetch interim. None of the four are required to declare cutover.


6. Standing Notes β€” No Switches Flipped