494 lines
19 KiB
Markdown
494 lines
19 KiB
Markdown
# 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-176570` is
|
|
> 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:
|
|
|
|
1. **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.
|
|
|
|
2. **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.
|
|
|
|
3. **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 `BlurtPriceSource` module in the indexer with fallback
|
|
chain
|
|
- 5-minute in-memory cache with background refresh
|
|
- Existing `/v1/listing-fee` endpoint 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`) via `create_community` op
|
|
- 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=1` integration 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_v2` with optional `operator_tag` field
|
|
- Indexer handler accepts both v1 and v2
|
|
- Frontend includes operator_tag when the instance config
|
|
provides one
|
|
- Tag attribution recorded in `operator_earnings` table 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_messages` table with appropriate indexes
|
|
- HTTP API endpoint: `GET /v1/chat/:order_permlink` returns
|
|
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/:permlink` endpoint
|
|
- 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
|