dealspace/MVP.md

16 KiB

Dealspace MVP Scope

Version: 1.0 — 2026-02-28
Status: Planning. Defines what ships in v1.0 vs what comes later.


Executive Summary

v1.0 ships a complete, end-to-end M&A deal workflow. An IB advisor can run a real deal from first request to buyer data room access. No AI matching, no external integrations, no mobile — just the core flow that makes Dealspace useful on day one.

Target: 6 sprints. Demoable to Misha after Sprint 2. Shippable after Sprint 6.


1. v1.0 Scope (Must Ship)

What the IB Analyst Needs on Day 1

  1. Create a project — name it, configure workstreams (Finance, Legal, IT, HR, Operations)
  2. Invite participants — seller admin, seller workers, assign to workstreams
  3. Issue request list — create requests, set priority/due dates, assign to seller users
  4. Track progress — see what's answered, what's pending, who's blocking
  5. Vet answers — approve or reject with comments
  6. Publish to data room — approved answers become visible to buyers
  7. Onboard buyers — invite buyer teams, they see published content

That's the minimum viable deal. Everything below supports this flow.

Core Features — v1.0

Feature Details
Entry Model Project → Workstream → Request List → Request/Answer. Full tree per SPEC.md.
RBAC All 7 roles: ib_admin, ib_member, seller_admin, seller_member, buyer_admin, buyer_member, observer. Workstream-scoped permissions.
Task Inbox The worker view. Seller members see "What do I need to do?" — not the full deal room.
Request Routing Chain Forward to CFO → forward to accountant → done → returns up the chain. assignee_id, return_to_id, origin_id fields.
File Upload Attach files to answers. Stored compressed + encrypted.
PDF Watermarking Dynamic watermark at serve time: {user_name} · {org_name} · {datetime} · CONFIDENTIAL. PDF only in v1.0.
Answer Vetting IB reviews submitted answers. Approve → published. Reject → back to seller with comment.
Data Room Buyer view: see published answers only. Pre-dataroom content invisible (DB-level, not UI filter).
Invite Flow Email-based invites. Accept → set password → you're in.
Auth Email + password. TOTP (2FA) required for admin roles. Session tokens with refresh.
Audit Log Every access grant, file download, status change, login. Never disabled.
Marketing Website muskepo.com — embedded in binary. Simple landing, signup CTA.

What's NOT in v1.0

Feature Why Not Now
AI Matching Fireworks embeddings + cosine similarity is straightforward, but human confirmation UX adds scope. v1.1.
Email/Slack/Teams Integration OAuth flows, DKIM verification, thread mapping — complex auth + security surface. v1.1+.
Video Watermarking ffmpeg transcoding at serve time is CPU-intensive, needs worker queue. v1.1.
DOCX/XLSX Watermarking XML manipulation is fiddly; PDF covers 80% of use cases. v1.1.
MCP Server Depends on stable schema + real usage patterns to know what tools matter. v2.0.
SSO/SAML Enterprise feature. Password + TOTP is fine for launch. v2.0.
Key Rotation Ship with a good initial key derivation setup. Document rotation procedure for v1.1.
Mobile App Never, or much later. Responsive web handles phones.
Public API Let the product stabilize first. v2.0.
Webhooks Same — need to know what events matter. v2.0.
Custom Themes Built-in Light/Dark/High-contrast is enough. Per-project branding is v2.0.
White-labeling Per-firm branding is enterprise upsell. v2.0.

2. v1.1 Scope

Ship within 4-6 weeks after v1.0 launch.

Feature Details
AI Matching Embed request text (Fireworks nomic-embed-text-v1.5). Score ≥ 0.72 → suggest match. Human clicks "Confirm" or "Not a match".
DOCX Watermarking Inject watermark into document.xml header/footer.
XLSX Watermarking Sheet protection + watermark row at top.
Answer Broadcast One answer satisfies N requests → all requesters notified. Uses answer_links table.
Delegation Out-of-office routing. "Forward my tasks to X until date Y."
Email Channel (Inbound) Accept replies via email. DKIM verification required. Map to entry via channel_threads.
Key Rotation Procedure Documented + tested process for rotating project encryption keys.

3. v2.0 Scope

6+ months out. After real customers are using the platform.

Feature Details
MCP Server Expose deal context to AI tools. Read: list requests, query answers. Write: suggest routing (human confirmation).
SSO/SAML Okta, Azure AD, etc. Enterprise requirement for larger banks.
Slack/Teams Integration Participate in deals without logging in. Thread-mapped via channel_threads.
Custom Themes Per-project brand colors + logo. CSS vars make this trivial once prioritized.
Public API RESTful API with API keys. Document with OpenAPI.
Webhooks Push notifications: answer published, request overdue, buyer accessed.
Per-Firm White-labeling "Powered by [hidden]" — full brand takeover. Enterprise pricing.
Video Watermarking ffmpeg overlay pipeline. Needs worker queue for CPU-bound transcoding.

4. Build Order (v1.0 Sprints)

Sprint 1: Foundation (Week 1-2)

Goal: Skeleton that boots, connects to DB, returns health check.

  • Project structure per SPEC.md 11.1
  • SQLite + migrations (8 tables from SPEC.md 16.6)
  • lib/crypto.go — Pack/Unpack, AES-256-GCM, key derivation
  • lib/types.go — Entry, User, Access structs
  • lib/dbcore.go — EntryRead, EntryWrite, EntryDelete (the three choke points)
  • lib/rbac.go — CheckAccess, role definitions
  • lib/store.go — ObjectStore interface + filesystem impl
  • api/middleware.go — logging, CORS, panic recovery
  • api/routes.go/health returns 200
  • Basic config loading from .env
  • make build, make run, make test

Demo: curl /health returns {"status":"ok"}.

Sprint 2: Core Flow (Week 3-4)

Goal: Create project, workstreams, requests. Invite users. This is the first Misha demo.

  • User registration + login (email/password)
  • Session management (JWT or opaque tokens)
  • POST /api/projects — create project
  • POST /api/workstreams — create workstream under project
  • POST /api/requests — create request under workstream
  • GET /api/projects/:id — project with workstreams tree
  • GET /api/workstreams/:id/requests — requests in workstream
  • Invite flow — generate invite link, accept, set password
  • Access grants — assign role + workstream to user
  • Basic portal UI: login, project list, workstream tabs, request list

Demo: Johan logs in as IB admin, creates "TechCorp Sale" project, adds Finance workstream, creates request "Provide audited financials FY2024", invites seller user.

Sprint 3: Worker View (Week 5-6)

Goal: Task inbox. The accountant sees what they need to do.

  • GET /api/inbox — returns entries where assignee_id = me
  • Task inbox UI — list of "my tasks" with status, due date, priority
  • Request detail view — see full request, thread of events
  • Forward action — assign to someone else, set return_to_id
  • Return action — mark done, returns to return_to_id
  • entry_events table population — every action creates event
  • Routing chain visibility for IB admin

Demo: Seller accountant logs in, sees "Provide audited financials" in their inbox, clicks in, sees request details.

Sprint 4: Files (Week 7-8)

Goal: Upload answers with attachments. Download with watermark.

  • POST /api/answers — create answer linked to request
  • File upload endpoint — stores via ObjectStore
  • File metadata in answer's Data JSON
  • lib/watermark.go — PDF watermark injection
  • GET /api/files/:id — serve file with watermark applied
  • Answer submission — seller marks answer ready for review
  • UI: upload files, attach to answer, submit

Demo: Accountant uploads PDF, submits answer. Downloads their own upload — watermark shows their name + timestamp.

Sprint 5: Data Room (Week 9-10)

Goal: IB vets answers. Approved → published to data room. Buyers see it.

  • Answer vetting UI — IB sees submitted answers
  • Approve action — status = approved, stage = dataroom
  • Reject action — status = rejected, add rejection reason, back to seller
  • Data room view — buyers see published answers only
  • Buyer invite flow — same as seller but buyer roles
  • Stage-based visibility in CheckAccess — buyers can't see pre-dataroom
  • Audit log writes for vetting actions + file downloads

Demo: IB approves answer. Logs in as buyer — sees the published answer in data room. Downloads PDF — watermark shows buyer's name.

Sprint 6: Polish (Week 11-12)

Goal: Production-ready. Marketing site. Demo data. Deploy.

  • TOTP (2FA) for admin roles
  • Password reset flow
  • Marketing website — embedded in binary, serves at /
  • Demo data seed script — realistic TechCorp Sale scenario
  • Error handling polish — consistent error responses
  • Rate limiting on auth endpoints
  • Caddy config for muskepo.com
  • systemd unit for Dealspace binary
  • Deploy to 82.24.174.112
  • Smoke test checklist

Demo: Full flow end-to-end. Marketing site live at muskepo.com.


5. Demo Scenario

Setup: IB advisor at Goldman Sachs is selling TechCorp, a mid-market tech company. First 10 minutes in Dealspace.

Minute 0-2: Create the Deal

  1. Login → IB admin dashboard (empty state: "Create your first project")
  2. Click "New Project" → Modal: Project name, deal type, expected close date
    • Name: "TechCorp Sale"
    • Type: "Sell-side M&A"
    • Expected close: 2026-06-30
  3. Create → Lands in project view with default workstreams

Screen: Project header (TechCorp Sale), workstream tabs (Finance | Legal | IT | HR | Operations), empty request list.

Minute 2-4: Configure Workstreams

  1. Click Finance tab → Empty state: "No requests yet"
  2. Click "Add Request List" → Name: "Initial Due Diligence"
  3. Add requests (quick-add mode, one per line):
    • "Audited financial statements FY2023-2025" (Priority: High)
    • "Revenue breakdown by customer top 20" (Priority: High)
    • "Cap table and option pool details" (Priority: Normal)
    • "AR/AP aging reports" (Priority: Normal)
  4. Repeat for Legal tab:
    • "Material contracts list"
    • "IP portfolio summary"
    • "Pending litigation summary"

Screen: Finance tab shows 4 requests, all status "Open", assigned to "Seller (unassigned)".

Minute 4-6: Invite Seller Team

  1. Click "Manage Team" → Team panel slides out
  2. Click "Invite Seller" → Enter email: sarah@techcorp.com
    • Role: Seller Admin
    • Message: "Welcome to the TechCorp sale process. You'll manage your team's responses."
  3. Send invite → Sarah gets email with magic link
  4. Add another: mike@techcorp.com
    • Role: Seller Member
    • Workstreams: Finance (checkbox)
    • Message: "You'll be handling the financial document requests."

Screen: Team panel shows: Johan (IB Admin), Sarah (Seller Admin - Pending), Mike (Seller Member - Pending).

Minute 6-8: Seller Accepts & Sees Inbox

Switch to Sarah's perspective

  1. Sarah clicks invite link → Set password screen → Sets password → Lands in app
  2. Dashboard: "TechCorp Sale" project card, 7 requests awaiting assignment
  3. Click into project → Sees all requests, can assign to team
  4. Assigns "Audited financial statements" to Mike

Switch to Mike's perspective

  1. Mike clicks invite link → Set password → Lands in app
  2. Task Inbox: Shows 1 task — "Audited financial statements FY2023-2025"
    • From: Goldman Sachs
    • Due: 2026-03-15
    • Priority: High
  3. Click task → Request detail: full description, empty answer area
  4. Upload button → Select PDF → File uploads
  5. "Submit Answer" → Status changes to "Submitted"

Screen: Mike's inbox now empty. Task shows "Submitted" status.

Minute 8-10: IB Vets & Publishes

Back to Johan (IB admin)

  1. Notification badge: "1 answer ready for review"
  2. Click into vetting queue → Shows Mike's submitted answer
  3. Preview PDF → Watermark visible: "Johan Jongsma · Goldman Sachs · 2026-02-28 · CONFIDENTIAL"
  4. Click "Approve & Publish" → Answer moves to data room
  5. Status updates: Request shows "Published ✓"

Later: Onboard buyer

  1. "Invite Buyer"buyer@apollo.com, Buyer Admin
  2. Buyer logs in → Sees data room with 1 published document
  3. Downloads PDF → Watermark: "Tom Smith · Apollo · 2026-02-28 · CONFIDENTIAL"

End state: One complete request cycle. IB created request → Seller answered → IB vetted → Buyer accessed. Watermarks prove chain of custody.


6. Success Metrics for v1.0

Not revenue. Product quality. What makes this a success before a single dollar changes hands?

Functionality Metrics

Metric Target
End-to-end completion One full request cycle (create → answer → vet → publish → buyer download) works without errors
RBAC enforcement Zero test cases where user sees/modifies data they shouldn't
Watermark integrity 100% of downloaded PDFs have correct watermark with actual user/org/timestamp
Audit completeness Every file download and status change has audit log entry

Performance Metrics

Metric Target
Page load (p95) < 500ms for inbox, project view, request detail
File upload < 2s for 10MB PDF
Watermarked download < 3s for 10MB PDF (watermark applied at serve time)
Concurrent users Handle 50 simultaneous users without degradation

Usability Metrics (Misha Demo)

Metric Target
Time to first request IB admin can create project + first request in < 2 minutes
Worker clarity Seller member understands their task inbox within 30 seconds of first login
Zero training Misha can complete demo scenario without Johan explaining UI

Security Metrics

Metric Target
No plaintext content All Summary/Data fields encrypted in DB — SELECT returns gibberish
Session security Tokens expire, refresh works, logout invalidates
TOTP enforcement Admin roles blocked from sensitive actions without 2FA

Reliability Metrics

Metric Target
Uptime 99% in first month (allows for hotfixes)
Data integrity Zero data loss, zero corruption in normal operation
Graceful errors No unhandled panics in production logs

7. Risk Mitigations

Risk Mitigation
PDF watermarking is slow Cache watermarked versions per (file, user, hour). Invalidate on user/project change.
RBAC bugs expose data Every CheckAccess path has explicit test. No data query without RBAC.
Demo fails in front of Misha Sprint 2 demo is minimal. Practice run before call. Fallback: video recording.
Scope creep This document is the contract. Features not listed are explicitly v1.1+.
Key management Ship with per-project derived keys. Rotation documented but not automated in v1.0.

8. Open Questions

Resolve before Sprint 3:

  1. Invite UX: Magic link (one-click) vs. invite code (manual entry)?

    • Lean: Magic link. Simpler UX, standard pattern.
  2. Request quick-add: Inline form vs. bulk paste (one per line)?

    • Lean: Both. Inline for singles, paste mode for mass import.
  3. Notification strategy: In-app only, or email for key events?

    • Lean: In-app only for v1.0. Email notifications are v1.1.
  4. Watermark font: System font or embedded?

    • Lean: Embedded. Consistent across all environments.

This document defines v1.0. Features not listed here are not in v1.0. No exceptions without updating this document first.