Authored: 2026-05-04 UTC
Owner: Kristerpher
Status: Operator review required before Wave 1 dispatch
Parent epic: #94 Production Release v1.0
Raxx v1.0 is not a feature-completeness milestone. It is a trust milestone.
The product thesis (from memory: project_structure_gap_thesis.md, project_strategic_position.md): Raxx fills the structure gap — it enforces the entry/credit/exit structure the user already decided on, before emotion gets a vote. That is not an AI product and it is not an Alpaca product. It is an automation layer that the user controls, backed by their own broker.
Three things must be true on launch day:
A real user can self-onboard. Kristerpher can walk through raxx.app as a first-time visitor, hit the same door every customer will hit, connect a paper-trading broker account, and have a working dashboard. The operator shortcut path is not launch.
MBT v1 (securities-only) is shippable and stable. This is the launch flagship per #256. Options-backtest stays gated behind ENABLE_OPTIONS_BACKTEST=false. The backtesting and trading surfaces are polished — not prototypes.
The operator can run the platform safely. Token rotation does not fail silently (#907). Deploys are traceable (#731). The console shows real status for every surface (#146). The operator is not manually SSH-ing or running ad hoc heroku config:set to recover from incidents.
What v1.0 explicitly is NOT:
The epic #94 was written when the platform was "runs on my laptop." The intent is unchanged but the scope is now larger. The original #94 scope (Heroku deploy, docs site, marketing site, platform live) is subsumed into the wave structure below.
These epics block the first real user from self-onboarding or the operator from running the platform safely.
| Epic | Title | Why Critical |
|---|---|---|
| #94 | Production Release v1.0 | Meta-epic — the gates below close this |
| #256 | MBT v1 — securities-only launch | Launch flagship; defines what customers come to use |
| #907 | Velvet — centralized token + rotation service | Rotation is visibly broken (#891); platform cannot run safely without it |
| #908 | Velvet scaffold (sub-card of #907) | First Velvet milestone; blocks all subsequent Velvet work |
| #731 | Console-driven deploy flow | Without this, every prod deploy is a manual CLI operation with no audit trail |
| #146 | raxx-console (parent) | Operator control plane; must be production-stable before launch |
| #581 | status.raxx.app | Customers need a place to check service health; required for trust |
| #707 | FreeScout productionization | First customer email must land; broken email pipeline = broken support = broken trust |
| #469 | Onboarding Wizard | Self-onboarding is the launch criterion; without this, there is no v1.0 |
| #582 | getraxx.com launch readiness | Marketing site must be indexable; waitlist backend wired; noindex header removed |
| #270 | Market Calendar Service v1 | Backtest + trade-lifecycle engine depend on it; required for MBT v1 polish pass |
| #988 | Console self-deploy web layer | Blocks #731 full implementation; operator gets kicked off platform on self-deploy without it |
| #798 | Staging-to-prod flag promotion flow | Required for safely gating ENABLE_OPTIONS_BACKTEST and future flags before launch |
Not blocking first user, but needed before the platform feels complete for early adopters.
| Epic | Title | Why Launch-Window |
|---|---|---|
| #651 | support.raxx.app | Customer-facing support portal; important but FreeScout ops (#707) must come first |
| #871 | Console-version manager (drop env-switcher) | Console UX cleanup; architectural correctness; safe post-launch with workaround in place |
| #780 | P5 detail drawer | Polish for console dashboard; not blocking |
| #500 | Workflow UUID tracing | Critical for support transparency at scale; not needed for first customer but needed before volume |
| #482 | demo.raxx.app | Open-flow demo for conversion; getraxx.com (#582) comes first |
| #204 | Founders Promo | Cohort mechanics and engagement loop; requires onboarding (#469) to ship first |
| #985 | Deploy button pulsing ring | UX polish; post-launch |
| #270 (Phase 2) | Market Calendar RSS alerts + cutover | Phase 1 is critical-path; Phase 2 alerts are launch-window |
| Epic | Title | Reason for Deferral |
|---|---|---|
| #183 | Multi-tenant Alpaca architecture | BYOB hybrid model (#495) satisfies v1.0; full multi-tenant is v2 |
| #495 | Hybrid broker model (BYOB) | Alpaca-default is sufficient for v1.0; BYOB unlocks broader market but is not gating |
| #403 | Billing console (customer revenue) | No paying customers at v1.0; Stripe integration is a v1.1 requirement |
| #757 | Billing telemetry (operator vendor costs) | Feasibility study concluded: scope-down or defer (#908 BLR finding) |
| #80 | AI-Assisted Trading | Explicitly post-v1.0 per product thesis; AI augments, does not headline |
| #78 | Exploration Platform | Platform for individual traders — v2 product surface |
| #85 | Options chain viewer + iron condor builder | Valuable but not required for securities-only MBT v1.0 |
| #90 | In-window trade simulator | Post-MBT; future product surface |
| #245 | Trade-Lifecycle Assistant | Blocked (depends on live trading data + ML layer); post-v1.0 |
| #167 | Raxx iOS companion | Explicitly non-goal in #94; post-v1.0 |
| #250 | Passkey E2E encryption | Blocked; architecture design not complete; post-v1.0 |
| #120 | Brand + site redesign | Confidence Engine direction is locked; cosmetic pass is launch-window; full redesign is post |
| #161 | NDA + digital-signature portal | Attorney-bound; required for investor/partner conversations, not first-customer flow |
| #148 | Business formation + compliance | Required before revenue; can proceed in parallel with engineering; not a code blocker |
| #417 | Target-adapter framework | Superseded by Velvet (#907); close after #907 ships |
| #253 | Automated credential rotation pipelines | Superseded by Velvet (#907); close after #907 ships |
| #970 | CF Access Workspace OIDC IDP swap | Phase 1 RBAC refinement; important but post-launch; current one-time-pin posture is adequate for solo operator |
| #925 | GITHUB_API_SECRETS_TOKEN provision | Immediate fix (PR partially merged); completes as part of Wave 1 token ops |
| #986 | AFFECTED_SITES bug | Superseded by Velvet v2 (#907) — Mode A handler is deprecated when Velvet ships |
| #987 | CF_PAGES_DEPLOY_TOKEN expiry | Operational rotation needed now; handled as immediate operator action, not a wave card |
Note on #148 and #161: per memory feedback_human_to_human_drive.md, attorney-bound items get separate handling and must not block engineering work that can proceed independently. Entity formation and NDA portal are on a parallel legal track; the engineering wave plan does not wait on them.
Four waves of parallelizable work. Each wave is a logical grouping of work that can be dispatched simultaneously once its prior-wave gate is cleared. Wave duration is in feature-dev-days, defined as one agent-fleet working day (single developer + agents; no external team).
Theme: Get the infrastructure layer safe so every subsequent wave can ship without incident.
Gate: Wave 1 must be complete before Wave 2 dispatches. These are the pre-conditions for everything else.
| Epic / Card | Work | Parallelizable with |
|---|---|---|
| #907 / #908 | Velvet scaffold: Heroku app pair + Postgres + manifest loader | Independent; start immediately |
| #907 / B2 | Velvet DB: rotation_jobs v2 schema + rotation_job_consumers | Depends on B1 (scaffold) |
| #907 / B10 | Velvet auth: stage-endpoint auth middleware | Depends on B1 |
| #907 / B3 | Velvet bus: service-bus core, fan-out, SSE | Depends on B2 + B10 |
| #907 / B4 | Velvet adapter: Postmark (first end-to-end rotation proof) | Depends on B3 |
| #907 / B5 | Velvet adapter: Heroku config-var | Depends on B3 |
| #988 | Console self-deploy web layer (architect in flight) | Independent; runs in parallel with Velvet scaffold |
| #731 | Console deploy flow (deploy button + callback plumbing) | Depends on #988 design output |
| #270 | Market Calendar Service v1 (Blueprint inside Raptor) | Independent; parallelizable with all of above |
| #925 | GITHUB_API_SECRETS_TOKEN secrets:write provision (partial PR already merged) | Independent; complete immediately |
Dependencies: None — Wave 1 is the root.
Pending input: #988 architect output (in flight — do not block Wave 1 start; proceed with Velvet and Market Calendar in parallel while design resolves).
Estimated duration: 5–6 feature-dev-days.
Operator decisions required before Wave 1 dispatches:
required: true/false flag? Current design blocks all; recommend Option B (per-consumer flag) so a low-priority consumer failure does not block a critical Heroku rotation.active: false pending this decision.rotation_leaked escalation — Slack alert only (current design), or auto-FreeScout ticket too? Recommend Option B for a solo operator (fewer places to check).Theme: Velvet is functional for real rotations; console is a stable operator surface.
Gate: Wave 1 complete (Velvet scaffold live, B3 service bus shipped, #731 deploy flow working, #988 web layer shipped).
| Epic / Card | Work | Parallelizable with |
|---|---|---|
| #907 / B6 | Velvet adapter: GitHub Actions secret (PUT_ENCRYPTED + NaCl) | With B7, B8, B9 |
| #907 / B7 | Velvet UI: stage-wizard modal (3-panel + revocation) | With B6, B8 |
| #907 / B8 | Velvet adapter: Cloudflare DNS (operator-manual per OQ7 decision) | With B6, B7 |
| #907 / B9 | Velvet API: revocation flow + rotation_leaked Slack alert |
With B6, B7, B8 |
| #907 / B12 | Velvet: testing flow automation + throwaway token lifecycle | With B6–B9 after B3 |
| #907 / B13 | Velvet: GET /rotations history endpoint | With B6–B9 |
| #146 | Console parent — P5 dashboard tile stabilization, RBAC groundwork | Parallel with Velvet work |
| #798 | Staging-to-prod flag promotion flow | Depends on #146 console stability; parallel with Velvet |
| #871 | Console-version manager (drop env-switcher) | Parallel with Velvet adapters |
| #707 | FreeScout productionization (email pipeline, branding, daily backup) | Independent; parallel with all |
| #984 | FreeScout module install redesign (research in flight) | Depends on #984 research output; parallel once resolved |
Dependencies: Wave 1 complete.
Pending input: #984 FreeScout module install research (in flight — if the right install path is confirmed, cards dispatch; if blocked, FreeScout module work moves to interim and the email-pipeline portion of #707 proceeds without it).
Estimated duration: 5–6 feature-dev-days.
Operator decisions required before Wave 2 dispatches:
Theme: The surfaces a customer actually touches. Self-onboarding works. Marketing site is live. Status page is up.
Gate: Wave 2 complete (Velvet rotation is functional and safe; console is stable; FreeScout email pipeline is green).
| Epic / Card | Work | Parallelizable with |
|---|---|---|
| #256 | MBT v1 polish — all Antlers pages, loading/empty/error states, options-backtest gate | Independent; start this wave |
| #469 | Onboarding Wizard — passkey registration UI, email verify, broker connect, first-run dashboard | Parallel with #256 |
| #582 | getraxx.com launch readiness — legal copy, Privacy Policy, ToS, waitlist backend, noindex removal | Parallel with #256, #469 |
| #581 | status.raxx.app — surface taxonomy wired, 3P upstream status, market time widget, FreeScout ticket mirror | Depends on #707 (FreeScout ops must be stable); parallel with #256, #469 |
| #270 (Phase 2) | Market Calendar RSS alerts + MarketTimeWidget cutover | Depends on Wave 1 Phase 1 completion |
Dependencies: Wave 2 complete. For #581: #707 must be at email-pipeline-green before the FreeScout ticket-mirror feature is built.
Estimated duration: 6–8 feature-dev-days (largest wave; most customer-facing work).
Operator decisions required before Wave 3 dispatches:
docs/legal/ and await attorney sign-off.Theme: Every critical-path item is shipped and smoke-tested. The noindex header is removed. The waitlist is open.
Gate: Wave 3 complete. All critical-path acceptance criteria pass. Attorney sign-off on marketing copy received.
| Epic / Card | Work | Parallelizable with |
|---|---|---|
| #94 (close gate) | Full critical-path smoke test: self-onboarding end-to-end, Velvet rotation drill, deploy via console, status page health check | Sequential — final gate |
| #582 (final) | Remove noindex header from getraxx.com; submit sitemap to Google | After attorney sign-off |
| #581 (final) | Verify all surface taxonomy wired; market time widget live; FreeScout ticket mirror smoke test | After #581 Wave 3 cards |
| #146 (final) | Console production hardening smoke test | After all Wave 2 console work |
| #907 / B11 | Velvet operator runbook v2 + handler-author guide | After B4, B5, B9 |
| #907 / B14 | Deprecate PR #906 Heroku handler behind off-flag | After B5, B7 |
| #907 / B15 | SSM Parameter Store integration (passwords) — if OQ resolution allows | Depends on D2 path shape OQ (existing card); may slip to post-v1.0 |
| Docs | API reference + getting-started doc (per original #94 scope) | Parallel with smoke testing |
Dependencies: Wave 3 complete.
Estimated duration: 4–5 feature-dev-days.
Operator decisions required before Wave 4 dispatches:
With a solo developer plus agent fleet at current velocity, this maps to approximately 5–7 calendar weeks assuming no major architectural re-work.
Every decision below has a wave dependency. The "blocks" column shows which wave cannot start (or cannot close) until the decision is made. Decisions are ordered by urgency.
| # | Decision | Wave blocked | Options | Recommendation |
|---|---|---|---|---|
| D1 | CF_PAGES_DEPLOY_TOKEN rotation (#987) | Wave 1 CI reliability | Manual CF dashboard rotation; enter new value in Infisical | Do it today. Not a wave card, just an operator task. |
| D2 | Velvet OQ4: partial-distribute threshold | Wave 1 (B3 service bus core) | A: any failure blocks. B: per-consumer required flag |
Option B. Minimal YAML addition; prevents low-priority consumer failure from blocking critical Heroku rotation. |
| D3 | Velvet OQ5: force-revoke authorization | Wave 1 (B9) | A: single-operator type-to-confirm. B: 4-eyes pattern | Option A. Solo operator platform at v1.0; 4-eyes requires RBAC work not yet done. |
| D4 | Velvet OQ7: Cloudflare token rotation method | Wave 1 (B8, subscription manifest activation) | A: Velvet-guided CF dashboard walkthrough. B: OPERATOR_MANUAL form | Option A or B — both are acceptable; the manifest entry is already drafted for OPERATOR_MANUAL. Decide before B8 is dispatched. |
| D5 | Velvet OQ9: rotation_leaked escalation path | Wave 1 (B9, B7) | A: Slack alert only. B: Slack + auto-FreeScout ticket | Option B for a solo operator. Same pattern as Status page "Investigate" button. |
| D6 | #988 self-deploy web layer approach | Wave 1 (#731 depends on this) | A: CF Pages edge worker + cross-env polling. B: other architect proposal | Await architect output (in flight). Approve before #731 feature cards dispatch. |
| # | Decision | Wave blocked | Options | Recommendation |
|---|---|---|---|---|
| D7 | Velvet OQ2: healthcheck timeout | Wave 2 (B3 manifest format finalization) | A: 15s uniform. B: per-consumer configurable YAML field | Option B. Future-proofs the manifest without changing the API contract. |
| D8 | Velvet OQ3: distribute fan-out concurrency | Wave 2 (B3) | A: parallel max_concurrency=4. B: sequential | Option A. Heroku config-var PATCHes triggering dyno restarts are expected; parallel is fine. |
| D9 | #984 FreeScout module install path | Wave 2 (#984 fix card, #707 completion) | Research in flight; decision is: approve the proposed install path once research returns | Approve immediately when research returns. No engineering decision to pre-make. |
| D10 | Velvet OQ8: PR #906 retirement scope | Wave 2 (B14) | A: include PR #906 removal in v2 slate as B14. B: separate epic under #81 | Option A. It is a single feature-flag flip; include in v2 slate. |
| # | Decision | Wave blocked | Options | Recommendation |
|---|---|---|---|---|
| D11 | #469 broker-connect scope at v1.0 | Wave 3 (onboarding wizard broker step) | A: paper trading only. B: paper + live Alpaca | Option A for v1.0. Live Alpaca connect adds credential-handling complexity; launch on paper, unlock live in 30-day window. |
| D12 | #256 options-backtest gate copy | Wave 3 (#256 polish) | "Coming soon — data licensing in progress" or other message | Approve message text before #256 polish card dispatches. |
| D13 | #582 attorney sign-off on marketing copy | Wave 3 / Wave 4 (noindex removal) | Attorney review track (parallel) | Do not let this block Wave 3 engineering; ensure attorney consult is booked this week so approval is in hand by Wave 3 close. |
| # | Decision | Wave blocked | Options | Recommendation |
|---|---|---|---|---|
| D14 | Go/no-go walkthrough on staging | Wave 4 launch | Personal self-onboarding walkthrough by Kristerpher | Required before noindex removed. Schedule at Wave 3 close. |
| D15 | #148 entity formation status confirmation | Wave 4 (noindex removal / waitlist open) | A: formation complete. B: launch as sole proprietor under named risk | Confirm status before waitlist opens. Legal track, not engineering. |
| D16 | Velvet B15: SSM Parameter Store — D2 path shape | Wave 4 (B15) | Depends on OQ on existing card re: path shape convention | If unresolved by Wave 4, B15 slips to post-v1.0. Not blocking launch. |
Wave assignment: Wave 1 (output gates Wave 1 #731 sub-cards).
Status: Architect has the design brief; three options enumerated (CF Pages edge worker, cross-env polling, other). Design output expected before Wave 1 dispatches.
Action: Do not block Wave 1 on this. Start Velvet (#908) and Market Calendar (#270) immediately. When the architect returns the design, Kristerpher approves the approach and #731 cards dispatch in parallel.
If delayed past Wave 1: #731 deploy flow ships without the self-deploy web layer; the operator accepts the "kicked off the platform on self-deploy" behavior until Wave 2.
Wave assignment: Wave 1 (B1–B5, B10) + Wave 2 (B6–B9, B12–B13) + Wave 4 (B11, B14, B15).
Status: Design locked 2026-05-03. Subscription manifest committed. ADRs 0037–0040 filed. B1 (#908) is the immediate first card.
Action: Dispatch B1 (#908) as soon as OQ4, OQ5, OQ7, OQ9 decisions are made (D2–D5 above). These are the only pre-conditions for B1.
Open questions still blocking B3 specifically: OQ1 (static manifest only — current design is locked per ADR-0040; no decision needed unless Kristerpher wants to reopen), OQ6 (testing flow audit logging — propose Option A: log with label; no decision needed unless Kristerpher disagrees).
Wave assignment: Wave 2 (FreeScout module fix), but #707 email-pipeline work in Wave 2 can proceed without the module fix.
Status: Research dispatched 2026-05-04. FreeScout instance is rebuilt (54.146.13.200). Ten paid modules are unattributed; correct install procedure under investigation.
Action: If research returns before Wave 2 dispatch, include the fix card in Wave 2 alongside #707. If research is still unresolved at Wave 2 dispatch, ship #707 email-pipeline work and tag the module install as an interim operational gap tracked separately. Do not hold the full #707 epic for module attribution.
Risk: If modules require a specific install path (e.g., SSH access, specific artisan invocation), the research output may generate a new card rather than a simple fix. Wave 2 scope absorbs that card.
Wave 1 (Days 1-6)
#908 Velvet scaffold ──────────────────────────────────────────┐
└─ B2 DB schema │
└─ B3 Service bus core ───────────────────────────────── ├─ Wave 2
├─ B4 Postmark adapter (Wave 1 proof) │
└─ B5 Heroku adapter (Wave 1) │
#988 Self-deploy design ──────────────────────────────────────┘
└─ #731 Console deploy flow (Wave 1 close / Wave 2 start)
#270 Market Calendar v1 (Wave 1, independent)
#925 GH token provision (Wave 1, immediate, independent)
Wave 2 (Days 7-12)
B6 GH Actions adapter ──────────────────────────────────────── ┐
B7 Stage-wizard UI ─────────────────────────────────────────── ├─ Wave 3
B8 CF DNS adapter ──────────────────────────────────────────── │
B9 Revocation flow ─────────────────────────────────────────── │
#146 Console stability ──────────────────────────────────────── │
#798 Flag promotion flow ────────────────────────────────────── │
#707 FreeScout email pipeline ──────────────────────────────── ┘
Wave 3 (Days 13-20)
#256 MBT v1 polish ─────────────────────────────────────────── ┐
#469 Onboarding Wizard ──────────────────────────────────────── ├─ Wave 4
#582 getraxx.com readiness ──────────────────────────────────── │
#581 status.raxx.app ────────────────────────────────────────── ┘
Wave 4 (Days 21-26)
Smoke testing → go/no-go → noindex removal → waitlist open
The following epics should be commented on and closed after the named replacement ships:
| Epic to close | Superseded by | Close when |
|---|---|---|
| #417 Target-adapter framework | #907 Velvet | After B5 (Heroku adapter) ships |
| #253 Automated credential rotation pipelines | #907 Velvet | After B9 (revocation flow) ships |
| Legacy Velvet v1 cards #914, #915, #916 | Velvet v2 B4, B5+B6, B8 | After respective v2 adapters ship |
Kristerpher should not dispatch any work against #417 or #253. They are dead epics as of the Velvet v2 design lock.
All sequencing above assumes:
- One developer (Kristerpher) reviewing and approving agent-output PRs
- Agent fleet (architect, feature-developer, card-groomer) operating on isolated worktrees
- PRs branch from main per memory feedback_pr_base_main.md
- No external team members; all decisions are Kristerpher's
Practical implications: - Wave 1 can dispatch multiple parallel cards simultaneously (Velvet B1, #988 design, #270, #925) without blocking — the agent fleet handles parallel execution - The bottleneck is Kristerpher's PR review queue. At peak parallelism (Wave 2, ~4–5 open PRs simultaneously), review cadence is the critical path, not the engineering work itself - Recommend: batch PR reviews at 2x daily rather than reviewing each immediately; this keeps agent throughput high without context-switching overhead
In priority order:
Rotate CF_PAGES_DEPLOY_TOKEN (#987) manually in the CF dashboard. Enter new value in Infisical. This unblocks internal-docs deploys and is a 10-minute operator task.
Make OQ4, OQ5, OQ7, OQ9 decisions (D2–D5 above). These are the only gates before #908 (Velvet scaffold) dispatches. Each is a one-line decision; all recommendations are in Section 4.
Review #988 architect output when it arrives and approve the web-layer approach (D6). Do not wait on this before starting the rest of Wave 1.
Book attorney consult for marketing copy review (#582 attorney gate, D13). This must be in flight by end of this week so approval is in hand by Wave 3 close (~Day 20).
Confirm #148 entity formation status (D15). Even if formation is incomplete, confirm whether you are proceeding to launch as a sole proprietor so that decision is made explicitly, not by accident.
For reference: the Velvet OQ table from the design doc, with v1.0 ship-plan disposition:
| OQ | Question | Disposition for v1.0 |
|---|---|---|
| OQ1 | Static manifest only vs runtime API? | Closed — ADR-0040 locks static only. No decision needed. |
| OQ2 | Healthcheck timeout per consumer | Decision D7 — before Wave 2. Recommend Option B (configurable). |
| OQ3 | Fan-out parallel vs sequential | Decision D8 — before Wave 2. Recommend Option A (parallel, max_concurrency=4). |
| OQ4 | Partial distribute threshold | Decision D2 — before Wave 1. Recommend Option B (per-consumer required flag). |
| OQ5 | Force-revoke authorization | Decision D3 — before Wave 1. Recommend Option A (single operator, type-to-confirm). |
| OQ6 | Testing flow audit logging | Propose Option A (log with label, filterable). Kristerpher to confirm or silence. |
| OQ7 | Cloudflare token rotation method | Decision D4 — before Wave 1. Either option acceptable; manifest entry drafted. |
| OQ8 | PR #906 retirement timeline | Decision D10 — before Wave 2. Recommend Option A (include in v2 slate as B14). |
| OQ9 | rotation_leaked escalation path | Decision D5 — before Wave 1. Recommend Option B (Slack + auto-FreeScout ticket). |