19 KiB
Phase 5 — Plan
Status: Draft for review, pre-implementation Date: 2026-04-19 Depends on: Phase 4 deployed, PHASE-5-BACKLOG.md, ADR-0012 (cross-post), ADR-0013 (operator incentives), ADR-0014 (chat + reputation) — all currently stubs awaiting resolution of open questions.
2026-05-11 forward note (Part 120 audit): Sub-phases 5a, 5b, and 5d have all shipped, much faster than the "summer 2026 / fall 2026 / winter 2026→2027" timeline projected below. Specifically:
- Sub-phase 5a (ecosystem reach) → ✅ shipped. Cross-post flow lives at SYNDICATION-CHECKPOINT.md (Post A + Post B
- ADR-0017 preview). Real price feed (Klingex composite) shipped. Morphit Blurt community at
blurt-176570is live.- Sub-phase 5b (operator incentives) → ✅ shipped as ADR-0013 (accepted + implemented 2026-05-02). Operator registration, tag claim, payout pipeline all in place; per-order operator payouts active.
- Sub-phase 5c (encrypted chat + reputation) → realised as Phase 5d under ADR-0015 (not ADR-0014; the original ADR-0014 forward-secrecy plan was replaced by simpler per-message ECIES per ADR-0015). See CHAT-CRYPTO.md + CHAT-UI-DESIGN.md. Shipped through Phase 5d.
The original timeline projections at the end of this doc are historical; the actual sequencing was faster and the chat design shifted from forward-secrecy session protocols (ADR-0014) to stateless ECIES (ADR-0015). This file is preserved as the historical plan; current state is reflected in REVISIT-LIST.md and the ADRs.
Goals
Phase 5 is the ecosystem reach + decentralization phase. Phase 4 built the economics (fees, loyalty, welcome bonus). Phase 5 uses those economic primitives to grow Morphit beyond the three committed operators into a self-sustaining network.
Three independent-but-related bodies of work, each ship-able on its own:
-
5a — Ecosystem reach. User-facing features that push Morphit's presence out onto the Blurt social layer and into the daily lives of current users. Cross-post flow (ADR-0012), Morphit Blurt community, real price feed, Phase 4 loose ends.
-
5b — Operator incentives. The economic mechanism that rewards third-party node operators with a share of listing fees (ADR-0013). This is the structural change that unlocks decentralization.
-
5c — Encrypted chat + reputation. End-to-end encrypted counterparty chat replacing the current in-memory bridge (ADR-0014). The biggest feature in Phase 5; probably its own release.
Each of these has its own design doc to come
(PHASE-5a-DESIGN.md etc.) once the relevant ADR(s) land in
Accepted state. This plan document is the phase-level index
and sequencing view.
Non-goals (explicitly out of Phase 5)
Carried from PHASE-5-BACKLOG.md:
- No blockchain beyond Blurt. Not adding Ethereum, Solana, or any other chain.
- No custody, no escrow. P2P stays P2P.
- No KYC. Ever, per ADR-0001.
- No mobile native apps. SvelteKit frontend on mobile web is the mobile story.
- No in-protocol dispute resolution. Reputation is chain-tracked; Morphit does not arbitrate.
Additional non-goals specific to Phase 5:
- No paid promotion. Cross-post flow reaches users via organic content only. No ads, no sponsored slots outside the featured-slot auction (which is a backlog item deferred past Phase 5's initial scope).
- No governance infrastructure. Operator fee-split percentages, policy decisions, and tag-revocation rules remain Agorise-set in Phase 5. A governance token or DAO structure is out of scope.
- No migration to a new indexer storage layer. Postgres stays. No Redis, no ClickHouse, no distributed anything.
Sub-phase 5a — Ecosystem reach
Scope: frontend + Blurt-side work that increases Morphit's visibility and closes UX gaps from Phase 4.
Dependencies:
- ADR-0012 Accepted (open questions resolved)
- Morphit Blurt community created on the Blurt chain (one-time manual step, depends on ADR-0012 Q2 resolution)
Milestones
5a-M1: Feedback-submit UI. The precondition for the cross-post flow. Users currently see counterparty feedback but have no way to submit their own feedback from the Morphit UI. Add:
- A feedback-submit card on the completed-order detail page
- Form: 5-star rating + optional short comment (same shape as
morphit_feedback_v1's payload) - Posting-key signing + broadcast path
- Success state that segues into cross-post UI (see 5a-M3)
Done when: a user can successfully submit feedback for a trade they completed, and it lands indexed on the next block.
5a-M2: Klingex/real price feed.
Replace the $0.002 BLURT hardcoded fallback with a real
price source. Fetches from Klingex primarily, Coingecko
secondary, hardcoded floor as ultimate fallback.
- New
BlurtPriceSourcemodule in the indexer with fallback chain - 5-minute in-memory cache with background refresh
- Existing
/v1/listing-feeendpoint returns fresh prices
Done when: the indexer's quoted listing fee tracks BLURT's actual USD price to within ~5% during a typical day.
5a-M3: Cross-post flow. Implements ADR-0012. The frontend offers post-trade cross- posting via the user's own posting key.
- Cross-post modal appearing after feedback submission
- Template in 10 locales
- Posting-key re-unlock prompt (even though the key is session-unlocked, per ADR-0012 rationale)
- Analytics: count opt-in rate (local storage only, no server reporting — privacy constraint)
Done when: a user completing their first trade can post a localized "first trade on Morphit" entry to Blurt signed with their own posting key, with Morphit never touching the post content after submission.
5a-M4: Morphit Blurt community creation + homepage integration. One-time Blurt-side setup, plus small frontend integration.
- Create the community on Blurt with agreed name (currently
proposed:
morphit) viacreate_communityop - Moderator roster: Agorise + one-two community volunteers
- Homepage tile linking to the community's recent posts feed (fetched live from Blurt)
Done when: the community exists, has moderation rules documented, and appears on the Morphit homepage.
5a-M5: Phase 4 loose ends cluster. From PHASE-5-BACKLOG.md §8:
- Structured logging migration (handler
console.log→logger.info({handler, signer, reason}, msg)) /v1/health?verbose=1integration tests- XMR viewkey verification script for operators
- Persian and Chinese translation quality audit pass
- FAQ search scoring tweaks
Done when: each of these sub-items either lands or gets explicitly deferred to Phase 6 with reason recorded.
Size: MEDIUM
Rough fuzzy estimate: 5-8 weeks of engineering across the five milestones. M1 and M3 are the largest; M4 is a one-day task; M5 is cumulative small items.
Risks
- M1 blocks M3. Cross-post flow can't ship without feedback-submit UI. If feedback-submit hits a design snag, M3 slips.
- Klingex API stability. If Klingex rate-limits us or goes down, the fallback chain protects the feature but operators see log noise. Mitigation: add circuit breaker from Phase 4 explorer work to the price source too (code reuse).
- Translation fidelity. Native-speaker review of Persian and Chinese could surface real errors that need locale- specific fixes, not just polish.
Sub-phase 5b — Operator incentives
Scope: the economic mechanism that converts Morphit from a single-operator project into a network of aligned operators.
Dependencies:
- ADR-0013 Accepted — this includes resolving all six of its open questions, which requires Agorise policy input alongside the technical decisions.
- At least one external-party operator identified as a pilot deploy partner (to prove the mechanism works end- to-end before general launch).
Milestones
5b-M1: Operator registration op.
New morphit_operator_register_v1 custom_json + its indexer
handler + the operators table. Depends on ADR-0013 Q1
(registration fee amount) being resolved.
- Payload shape:
{ tag, display_name, contact_url, registration_fee_transfer_permlink? } - Handler validates tag uniqueness, verifies fee transfer sibling, inserts into operators table
- Introduces an operator-registration schema migration (v7)
Done when: an operator can register via CLI and is
persistent + discoverable via a /v1/operators API.
5b-M2: Referrer tracking in order op. The biggest interface decision, per ADR-0013 Q2. Assuming we land on option (a) — a new payload field:
morphit_order_v2with optionaloperator_tagfield- Indexer handler accepts both v1 and v2
- Frontend includes operator_tag when the instance config provides one
- Tag attribution recorded in
operator_earningstable per order
Done when: an order posted through an operator-branded frontend can be unambiguously attributed to that operator at indexing time, and operator earnings accumulate.
5b-M3: Monthly payout automation.
The indexer runs a monthly pass that computes per-operator
earnings and queues payouts via the existing
relay_pending_transfers path.
- New
kind='operator_payout'on the queue - Idempotent — safe to re-run if a pass crashes mid-way
- Operator-initiated claim op for the "pull don't push" pattern (per ADR-0013 Q4 leaning)
Done when: an operator can claim their accumulated earnings via a signed op and receive the payout in a subsequent block.
5b-M4: Operator directory + frontend integration.
A public-facing /operators page with the list of
registered operators, their tags, contact info, and
optional stats (if operators opt in to showing trade
volume). Also a "run a Morphit node" landing page with
the one-time setup steps and CLI tools.
Done when: anyone curious about running Morphit themselves has a single page with the economics, the setup instructions, and links to join the existing operators.
5b-M5: Three new FAQ entries + 10-locale translation.
- "How do I run a Morphit node?"
- "How do operators earn?"
- "How do I find a good operator?" (Last one is new — users seeing multiple operator instances will ask.)
Done when: the three entries land in all 10 locales,
wired into FAQ_KEYS in the frontend-side index.
Size: LARGE
Fuzzy estimate: 6-10 weeks of engineering, plus Agorise policy input time that's not engineering but gates M1.
Risks
- ADR-0013 open questions. Six open questions, some policy-heavy. ADR closure could itself take weeks.
- First-operator bootstrap. Who's the pilot partner? The mechanism is testable in isolation but genuine usefulness requires a real external operator trying it for a real deployment. Without that, we ship a feature no one verified end-to-end.
- Spam registration risk. If the registration fee lands low (e.g., free + probation per Q1), we could see spam registrations. Mitigation: add a rate limit on the handler, cap total registered operators per IP.
- Fee-split economics. If the split percentage is set wrong, either Morphit treasury drains too fast (too generous) or operators don't bother (too stingy). The fallback plan: treat the initial number as a governance parameter that Agorise can adjust in future phases without requiring new op versions.
Sub-phase 5c — Encrypted chat + reputation
Scope: replace the in-memory/websocket chat with an end-to-end encrypted protocol per ADR-0015 (per-message ECIES via X25519 + ChaCha20-Poly1305). Add reputation signals derived from chat and feedback data.
Dependencies:
- ADR-0014 Accepted
- ADR-0015 Accepted (resolves the cipher choice for ADR-0014 Q1, replacing the original heavier-protocol proposal).
- A storage-model sub-ADR (ADR-0014 Q2) — big enough decision that squashing it into the parent ADR would make it unreadable.
Milestones
5c-M1: Crypto module.
Implement apps/web/src/lib/chat/crypto.ts per ADR-0015:
- X25519 chat-identity derivation from Blurt posting key
- Per-message ephemeral keypair generation
- ECDH-derived per-message key with BLAKE2b domain separation
- ChaCha20-Poly1305-IETF AEAD on the ciphertext
- Wipe ephemerals after use for sender-side PFS
Done when: a pair of Morphit-browser clients can exchange encrypted messages end-to-end in an integration test, without any network round-trips to Morphit servers.
5c-M2: Chat identity key management.
Per the sub-ADR resolving ADR-0014 Q1. Leaning toward option
2 (published long-term chat identity via
morphit_chat_identity_v1 op).
- New op + indexer handler
- Frontend "first-time chat setup" UI that generates the key, publishes the pubkey, and stores the privkey in the encrypted-envelope pattern from Phase 4a
- Key-rotation flow (user-initiated, e.g. if they suspect compromise)
Done when: every Morphit account that wants to use chat has a chat identity published to chain; private key stored encrypted on the user's device.
5c-M3: morphit_chat_v1 op + indexer handler.
The transport for ciphertexts.
- Payload:
{ order_permlink, recipient, ciphertext, header } - Handler verifies sender is a counterparty in the referenced order
chat_messagestable with appropriate indexes- HTTP API endpoint:
GET /v1/chat/:order_permlinkreturns all ciphertexts for that order (clients decrypt locally)
Done when: messages flow through the Blurt chain and land in the indexer, ciphertexts persisted and retrievable, no plaintext ever in indexer logs.
5c-M4: Chat UI replacement. Retire the in-memory chat. New chat UI that:
- Reads from the indexer's
/v1/chat/:permlinkendpoint - Decrypts locally with the user's chat identity
- Queues outgoing messages, signs them, broadcasts
- Handles offline-recipient case (they see the messages when they come online and decrypt)
Done when: users can conduct a full counterparty conversation, leave, come back a day later, see the full history, continue the conversation.
5c-M5: Reputation signals in UI. Display-only, no chain-inclusion (per ADR-0014 Q4 leaning).
- "N messages exchanged" displayed on completed-trade detail
- Response-time stat (average turnaround)
- Rendered in orderbook as an optional column for users who've been in chats with the counterparty before
Done when: a user browsing the orderbook sees at-a-glance reputation signals from previous counterparty interactions.
5c-M6: Key-loss onboarding + documentation. Losing the chat identity private key = losing all past chat history. This is scary; users need to know upfront.
- Backup flow: on chat-identity creation, show the user their chat privkey encoded as a Blurt-style recovery phrase + offer to print it
- Clear warnings in the UI when a user imports a chat identity key
- FAQ entry: "What happens if I lose my chat key?"
Done when: the key-loss implications are documented and the backup flow is working.
Size: LARGE+
Fuzzy estimate: 12-16 weeks. This is genuinely a new crypto protocol layered onto a new transport; the biggest feature Morphit has shipped.
Risks
- libsignal JS port maturity. The official JS port is less actively maintained than the Rust or mobile versions. Mitigation: assess at M1 start; if it's stale, consider libsignal's Rust+wasm path (more maintenance but more current).
- On-chain storage load. If chat volume is high, we contribute meaningful bytes to the Blurt chain. Need a community conversation with Blurt witnesses before launch. Mitigation: land the storage decision (ADR-0014 Q2 sub-ADR) early and socialize it.
- Key-loss UX is the single biggest UX risk. If users routinely lose chat history due to key loss, the feature is worse than the current in-memory chat (which loses on reload but at least doesn't pretend to be durable). Mitigation: obsess over the backup + warning flow in M6.
- Scope creep into "Morphit Messenger". Chat could easily grow into a standalone messaging app. Phase 5c stays scoped to counterparty-per-order chat. General messaging stays out of scope explicitly.
Cross-cutting sequencing
Three sub-phases, each independently ship-able:
Phase 4 ships (Q2 2026)
│
├─────► 5a — Ecosystem reach (5-8 weeks)
│ Start: immediately after Phase 4 ops-review
│ Blocks: nothing; dependent: none
│
├─────► 5b — Operator incentives (6-10 weeks + ADR time)
│ Start: after ADR-0013 Accepted
│ Blocks: decentralization goal
│ Dependent: 5a's price feed (for accurate
│ fee attribution); not strict
│
└─────► 5c — Encrypted chat (12-16 weeks + sub-ADR time)
Start: after ADR-0014 + sub-ADRs Accepted
Blocks: the current chat weakness
Dependent: could use 5b's operator list for
key-discovery fallback, not strict
Recommended order
5a first — small, user-visible, resolves Phase 4 gaps, builds team momentum. ADR-0012 has only three open questions; they resolve in normal design review, not multi-party negotiation.
5b second — higher leverage (decentralization), but gated by ADR-0013's open questions which have policy content needing external input. While ADR-0013 is being resolved in parallel, engineering proceeds on 5a.
5c last — biggest investment; worth starting only once team has capacity. Might actually be Phase 6 depending on team size.
Parallel paths
Within a sub-phase, milestones can go in parallel:
- 5a: M1 (feedback UI) and M2 (price feed) are independent. M4 (community) is a one-day task that can fit anywhere. M3 (cross-post) depends on M1.
- 5b: M1 (registration) and M2 (referrer tracking) can develop in parallel once ADR-0013 is accepted.
- 5c: M1 (libsignal) and M2 (identity keys) are independent foundations; M3 builds on both; M4-6 build on M3.
Open questions at the phase level
- Parallelism vs. focus. Can the team do 5a and 5b in parallel tracks? Depends on team size. Solo engineer should do them sequentially; two+ can split.
- Sub-phase release cadence. Do we ship 5a as its own release, then 5b, then 5c? Or bundle them? I lean toward separate releases — Phase 4 taught us that smaller releases catch issues earlier.
- Do we do ADR-0013 before 5a ships, or concurrently? If ADR-0013 work (which is partly policy, not engineering) runs in the background during 5a engineering, 5b can start immediately after 5a ends with no dead time.
- Do we incorporate any 5c work into 5b? Some chat infrastructure (e.g., the new custom_json op shape patterns, the indexer handler patterns) could be pre-built during 5b idle time. Low value, probably not worth optimizing.
Timeline anchor
None committed. Rough ballpark assuming solo engineering:
- 5a: summer 2026 realistic
- 5b: fall 2026 realistic
- 5c: winter 2026 into 2027 realistic
With two engineers these can overlap significantly.
Design-doc changelog
- 2026-04-19 initial draft post-Phase-4 closeout