Date: 2026-05-29 Environment: TEST box (98.84.88.134) β read-only baseline Scope: Phase-0/Baseline parity + Phase-2 functional gap assessment
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.
| 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 |
| 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/pluginsreturned HTTP 403 ("Board access required") with no authenticated board session, so plugin readiness was sourced authoritatively from thepublic.pluginstable (11 ready / 5 uninstalled). Live MCP tool count is 74 (task referenced an expected count loosely; 74 is the live value).
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. |
approvals/issue_execution_decisions, so decisions become plugin-owned + issue-reflected (acceptable tradeoff). Status flips via issues.update bypass server execution-policy validation, so mandatory-comment and stage rules must be enforced in-plugin.access.invites.create mints a company/board join invite β broader scope than the fork's issue-scoped participant token; no host RPC for participant subscriptions or platform email.http.fetch workaround does not use the platform's configured sender (SPF/DKIM, credentials in plugin secrets, test-mode + per-recipient logic all re-implemented in-plugin); a content-bearing digest also needs issues/agents data added to comms coreReadTables or via a cross-schema bridge view.Identity is not a blocker:
onApiRequest.actor.userIdandperformActioncontext already deliver host-resolved identity. The only constraint is that all four must be implemented as POST API routes (orperformAction), never asctx.data.registerdata handlers, which receive no actor.
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).
issues.update/createComment/createInteraction/wakeup. Fix ops-views version drift (worker logs v0.6.0 vs manifest v0.7.0).access.invites.create now; decide separately on issue-scoped token + email (in-plugin mailer vs. host extension).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.fetchinterim. None of the four are required to declare cutover.
.86 is untouched. Production (.86) has not been modified in any way as part of this assessment.ngrok-paperclip.service=inactive), as expected for this baseline.