Handoff — post-D roadmap pack (2026-08-25)

You are a coding agent (or human) picking up Maidan work after the 2026-08-25 strategy pass. This pack is the strategy and detailed scoping behind the post-272 forward work. The single canonical backlog is Open Work.md (with Roadmap.md); the items below are tracked there. Use this page for the why and the detail, then execute through the normal cluster workflow in CLAUDE.md (branch → PR → 8 required CI checks → squash/admin-merge → mandatory retro → vX.0.0 tag). The IDs here (A–J, S/M/C/E/R, L1–L6) are scoping labels, not a substitute for opening a cluster.

Code baseline this pack assumes: Program D closed at v266; clusters 267–272 all shipped (tags v267.0.0v272.0.0 on main) — the optional-deferrals sweep + the LSN read-replica program close. This pack was drafted 2026-08-25 while 270–272 were still in flight, so some in-body lines still say "in flight"; the current state is Open Work.md / CHANGELOG.md. J3 (the MCP 2026-07-28 upgrade, maidan-mcp) is the headline open item.

Star-hold (2026-08-24) still in force until Launch.md tag day. No GIF/topics/homepage beforehand. Slack and Git are projectors (Bet 1 / Bet 6), not products; both sit after the MCP pack.


Hard rules (fail the session if you break these)

  1. Do not re-do 267–272. All shipped (tags v267.0.0v272.0.0): A2A egress content→parts, MCP email tools, workspace import (both modes), search token-aware read routing + its metric. Check CHANGELOG.md before starting anything that sounds adjacent.
  2. Do not add a third database engine or a fourth agent protocol. Two SQL dialects (Postgres + SQLite). Industry wires: MCP + A2A + REST/WS.
  3. Do not invent MCP create-workspace tools so an IDE can bootstrap. Seed via REST/CLI. MCP is 78 tools; today 2024-11-05, J3 required (2026-07-28).
  4. MCP current must be 2026-07-28 (J3 / M.0). 2024-only is not acceptable. Do not ship deeplinks until that upgrade is honest (stateless Streamable HTTP, no pretending GET-session is 2026). Pack and public cut wait on J3.
  5. Do not commit unless asked. Do not clobber or stage compose.override.yaml (a local dev port-remap override).
  6. Name the claim path claim_next_thread (MCP + REST). EventKind wire: message_posted, thread_result_set, mention_recorded.
  7. Mail retry is a new mail_outbox table, not maidan_outbox.
  8. /ui is an operator console, not the product. No SPA, no Playwright unless the north star flips.
  9. Do not become Copilot. Git projector maps issues/PRs to threads and posts comments/check runs. Do not clone, commit, or open PRs as Maidan. Do not reimplement github-mcp-server.

What this pack is (source of truth)

Strategy pack (committed in Cluster 273). The actionable backlog lives in Open Work.md; this table maps each pack doc to the slice it scopes.

FileJobWhen to open it
This pagePickup, master ID list, try-out matrixAlways first
Pre-Public Hardening.mdPolish before public: residue, tests, examples, perf H, providers I, protocols JExecuting A–J
Path to Impressive.mdStrategy: north star, 90-day sequence, why not Slack-cloneDeciding, not implementing
Expansion Bets.mdFeatures after 270–272: Slack, Git, MCP pack, SDK, mailExecuting Bet 1–4, 6
Launch.mdProduction-ready extras, public-preview cut, when you may announceWhen the question is announce
Promotion.mdGet the word out: site, GitHub, Show HN, Reddit, LinkedIn, MediumTag week
Providers.mdOperator host matrix (where it runs)Recipes, env vars
Protocols.mdOperator wire matrix (how it talks)MCP vs A2A vs REST
docs/README.md, docs/Integration.mdIndex + integrator freeze sentenceLinking only

Already written (docs-only, treat as done): Hardening I1 (Providers.md), J1 (Protocols.md). Everything else in the tables below is still open.

Path is strategy; Hardening is polish checkboxes; Expansion Bets is product slices. If two files mention the same ID, Hardening owns A–J, Expansion Bets owns S. / M. / C.* / E.* / R.*.** Launch owns L1–L6. Path does not own IDs.


Master list — every upgrade / improvement / expansion

Status: done = this pack already produced the artifact. open = a later session executes it. other agent = do not touch. parked = needs David to un-hold.

Other agent's ladder (not us)

IDWhatStatus
267A2A egress content → parts (text-only)shipped v267
268MCP email-address toolsshipped v268
269workspace import storeshipped v269
270import REST + remap + 409shipped v270
271search token-aware replica routingshipped v271
272search replica-reads counter#522 waiting CI (2026-08-25)

Hardening A–G — reputation polish

IDWhatStatus
A1–A2Scrub Cluster/PR diary from public types + impl comments (~771)open
A3Vault vs public split policyopen
A4Wikilink → Markdown on Integration/Production/AGENTS.mdopen
A5CONTRIBUTING/SECURITY "pre-release" toneopen
A6Fix mail.rs module-doc lie (wired, best-effort, no retry)open (overlaps Bet 4 E.1)
B1–B5Split monster files (mcp server 2230, pg/sqlite mods, models, Store)open; not during 270
C1–C4Error shape, naming drift, OpenAPI freshness, deprecation policyopen
C5MCP version honesty until J3, then 2026 copypartial (Integration names 2024 + J3; root README does not)
D1–D6Evidence.md, ignored-test guide, panic audit, coverage intent, parity, flakeopen
E1examples/ directoryopen (Bet 2 M.1 is the content)
E2README first screen: docker/binary before cargo runopen
E3–E5Architecture diagram, "what Maidan is not", freeze stale plansopen
F1–F4Advisory table, release snippet, threat-model vs controls, default-secure demoopen
G1–G5Root clutter, license headers, issue templates, CODEOWNERS, human changelogopen

Hardening H — performance / load (not a product bet)

IDWhatStatus
H1Postgres + SQLite loadgen baselines checked inopen; parallel with 270
H2Agent-shaped mix: MCP / WS / claim_next_threadafter H1
H3Optional nightly soak (error-rate, not p99)after H1
H4Measured opts only (context filter, search deny-set). No Redisafter H1 numbers
H5Production.md: stop saying load is "not covered"open; parallel
H6Reconcile scale-1.0 gate budgetslater

Hardening I — provider hosts (not a third DB)

IDWhatStatus
I1docs/Providers.mddone
I2Ollama/TEI compose + Voyage-as-openai-compatible noteopen
I3R2 / AWS S3 recipes next to MinIOopen
I4Keycloak + one SaaS OIDC recipeopen
I5Written Neon/RDS/Supabase: DATABASE_URL + pgvectoropen
I6LibSQL/Turso spike (driver flag or no)spike only

Hardening J — integration protocols (not a fourth protocol)

IDWhatStatus
J1docs/Protocols.mddone
J2Holding-pattern copy: today 2024, upgrade requiredpartial
J3Required MCP 2026-07-28 (stateless Streamable HTTP)P0; this is M.0
J4A2A Agent Card supportedInterfaces (JSON-RPC only)open
J5A2A file/data parts on egressafter 267 text
J6MCP OAuth RFC 8707 only if a real host refuses bearerspike
J7n8n/Zapier signed-webhook recipeopen
J8LangGraph / CrewAI / Agents SDK recipe on REST+WS or MCPopen (with Bet 2/3)

Expansion bets (features, after 270–272)

IDWhatStatus
Bet 2 M.0= J3. Required MCP 2026-07-28. Not a 2024 freezefirst expansion (P0)
M.1examples/ MCP snippets + 10-minute Integration pathafter M.0
M.2Offline DAG seed (3 scripted agents, no LLM)after M.1
M.3maidan demo compose profilelater
Bet 3 C.1Freeze ≤15 OpenAPI methods (REST+WS)after M.0
C.2TypeScript client + example bot (claim_next_thread)after C.1
C.3Python maidan on PyPIafter C.2
Bet 4 E.1mail_outbox table + fix mail.rs docsif claiming mail
E.2SKIP LOCKED worker + backoff + metricsafter E.1
Bet 1 S.1–S.4Slack projector MVP (HTTP Events, mention-only, final message)after pack/SDK
S.5Native chat.startStream / append / stopafter S.4
S.6Slack interactive HITLafter S.5
Bet 6 R.1–R.4GitHub App projector (mention → thread → comment)after pack; share bridge with Slack
R.5Check Run queued/in_progress/completedafter R.4
R.6–R.7GitLab adapter; Gitea/Forgejo recipeafter GitHub loop is boring
Bet 5Pointers into Hardening (not a bet)n/a
L1–L6Production-ready extras + public cut (Launch.md)after Hardening P0 + J3 + M.1; not Slack/Git
K1–K9Bug sweep 2026-08-25 (mail lie, Open Work 180, resume panic, outbox SKIP LOCKED, …)Hardening K; P0 with A6
Star-taxGIF, logo, OG, topics, homepageparked until Launch tag day

Sequence after 270–272: Hardening P0 + H1/H5 (can overlap) → J3 / M.0 MCP 2026-07-28 (P0, required) → M.1–M.2 pack → Bet 3 → Bet 4 if mail matters → Launch (blocked on J3) → Bet 1 or Bet 6 → H2–H4 + residue.

If only one expansion: J3 then Bet 2 pack. Not Slack first. Not a 2024-only pack.


Try-out matrix — major players and setups

Goal: a new user can try Maidan with whatever they already run. Ready means the code path exists. Recipe means a page/example is still owed. Later is a bet. No is a deliberate non-goal.

How they run the server

SetupReady?Next doc / slice
cargo run + sqlite::memory:Yes (README first command; E2 should demote this)E2
Docker Compose default / --profile fullYesDeploy.md
Helm / KubernetesYesDeploy.md
Release binary (linux/amd64, linux/arm64, Pi)YesPi.md, Releases
Windows nativeNo first-classWSL or Docker; do not add a fourth target
Fly / Railway / Render one-clickNoRecipe on Compose/Helm later; not a new runtime
Homebrew / nixNoStar-tax / pack-and-prove leftover

Database hosts

PlayerReady?Next
Compose Postgres, vanilla PGYesDeploy
RDS, Aurora, Cloud SQL, Neon, Supabase, Crunchy, AlloyDBSame dialect; recipe owedI5
SQLite file / memory / PiYesProviders, Pi
MySQL / Mongo / Dynamo / Cockroach-as-engineNodo not add
LibSQL / TursoUnknownI6 spike

Embeddings / objects / auth / mail / bus

PlayerReady?Next
hash-v1 (default, not semantic)Yeswarn in prod (E4)
OpenAI, Azure OpenAI, Ollama, vLLM, TEI, Voyage-if-/v1/embeddingsYes (one HTTP shape)I2 recipe
Pinecone / Qdrant as primaryNovectors stay with RBAC
LocalFs artifactsYeslaptop default
MinIO, AWS S3, R2, B2, GarageS3-compatible yesI3 recipes
Native GCS / Azure BlobNo unless S3 blocked
OIDC: Keycloak, Authentik, Auth0, Google, OktaGeneric discovery yesI4 recipes
SAML / SCIMNodocument OIDC requirement
SMTP (SES/SendGrid/Mailgun/Postfix as relay)Yes, best-effortBet 4 for retry
Redis / NATS busNoPostgres LISTEN or in-memory

Agent hosts (the "try it from my IDE" list)

PlayerWireReady?Next
CursorMCP stdio or Streamable HTTPCode speaks 2024-11-05 onlyblockerJ3 then M.1. Target 2026-07-28.
Claude DesktopMCP stdioSameM.1
VS Code / CopilotMCPSameM.1
Claude CodeMCPSameM.1
ChatGPT connectors / custom GPTMCP remoteSame; OAuth may blockJ6 if they refuse bearer
Windsurf, Continue, Cline, Goose, JetBrainsMCPSame JSON-RPCM.1 generic snippet covers them
Gemini / VertexMCP and/or A2AMCP same; A2A card schema customJ4
Zed / JetBrains ACP coding agentZed ACPNo native. Optional worker laternot Bet 2
ChatGPT Assistants / Responses as native wireNothey speak MCP now

Frameworks and automation

PlayerWireReady?Next
Raw REST + OpenAPIYesGET /openapi.jsonBet 3 wraps this
WebSocket live eventsYesIntegration.md
LangGraph, CrewAI, OpenAI Agents SDK, PydanticAIMCP or REST+WSCode yes; no recipeJ8
n8n, Zapier, Makewebhooks + RESTCode yes; no recipeJ7
Temporal / Prefect as nativeNoMaidan is the orchestrator
GraphQL / gRPC-for-RESTNoOpenAPI is the IT path

Other agents / humans

PlayerWireReady?Next
Another org's A2A agent (Foundry, Bedrock, Salesforce, SAP)A2A JSON-RPCSubset yes; card may fail strict SDKs; text-only filesJ4, J5
Second Maidan/.well-known/maidan.jsonYesfederation
Humans in /uisession + WSOperator console onlyno SPA
Humans in SlackEvents APINoBet 1 projector
Humans in GitHub / GitLab / GiteaApp/webhookNoBet 6 projector. Agents still use official GitHub MCP for repo I/O.
Microsoft Teams / DiscordNoafter Slack if ever
PagerDuty / Sentrywebhook → thread → claim_next_threadPossible via webhooksrecipe later, not a protocol
Copilot coding agent / GitLab DuoTheir runtimeNothey live in the forge; we project
Grafana / Datadog / Honeycomb/metrics + OTLP smokeYesProduction.md

If a name is not in this table, it is either "speaks MCP or OpenAPI, use those" or a do-not-chase (IBM ACP, ANP, AP2, A2UI, AG-UI native, stealth Slack).


First slices a later session should actually run

Pick one. Default if David says "start":

  1. E2 + C5/J2 — README first screen + holding-pattern MCP copy on the root README (today 2024, J3 required). Half day. Parallel with 270.
  2. A6mail.rs module docs. Same half day.
  3. H1 + H5 — loadgen Postgres baseline + Production.md honesty.
  4. After 270–272 (or a dedicated MCP branch off those files): J3 / M.0 MCP 2026-07-28, then M.1 → M.2 pack. That is the try-out story. A 2024-only pack is not it.

Do not open Slack or the SDK until J3 is green. J3 is the first expansion.


Known nits (do not "fix" by rewriting history)

  • docs/Open Work.md header may still say an old tag. Other agent's living backlog. Leave it unless E5.
  • Wikilinks remain in Integration/Production/AGENTS.md (A4).
  • CLAUDE.md "latest tag" lags (still mentioned v268 in places). Don't fight the other agent on that file except the read-order pointer.
  • Expansion Bets residue line may say 765 in Bet 5 vs 771 in the audit header. Prefer 771 (2026-08-25 afternoon re-scan).
  • Path see-also used to have raw docs/... paths; prefer Markdown links.
  • Star-hold has no ADR in Decisions.md.

See also