Repository navigation
Specs
Twenty-two specs decomposing the PRD into implementable units. Each follows the same template: Description → Business rules → Acceptance Criteria → Out of Scope → Decision Logs.
Business rules are numbered BR-<spec>-<n> and trace back to PRD requirement IDs. Decisions are numbered DL-<spec>-<n>.
Adding a spec? Start from TEMPLATE.md — it carries the template, the numbering conventions, and the two verification scripts (PRD coverage and template compliance) to run afterwards.
| # | Spec | Milestone | Depends on |
|---|---|---|---|
| 001 | Authentication & Account | M0 | 003, 002 |
| 002 | Configuration Layer | M0 | — |
| 003 | Tenant Isolation & Security | M0 | 001 |
| 004 | LGPD & Data Subject Rights | M6 (part in M1) | 001, 003, 005 |
| 005 | B3 Extract Import & Reconciliation | M1 | 003, 006, 004 |
| 006 | Transaction Ledger | M2 | 003 |
| 007 | Position & Cost Basis Engine | M2 | 006 |
| 008 | Market Data Service | M4 | 002, 003 |
| 009 | Valuation Engine | M4 | 007, 008 |
| 010 | Wallets & Allocation | M3 | 006, 007 |
| 011 | Reporting Framework | M5 | 009, 010 |
| 012 | Performance Report | M5 | 009, 011 |
| 013 | Portfolio Value Report | M5 | 009, 011 |
| 014 | Earnings Report | M5 | 006, 011 |
| 015 | Composition Report | M5 | 009, 011 |
| 016 | Platform: Performance, Availability & Accessibility | M0 → continuous | 002 |
| 017 | Wallet Balancing | M7 | 002, 009, 010, 011 |
| 018 | Buy/Sell Opportunity | M7 | 002, 004, 007, 008 |
| 019 | Wallet Goals | M7 | 009, 010, 013, 014 |
| 020 | User Onboarding | M8 | 001, 005, 009, 010 |
| 021 | Personal Deployment | M9 | 002, 003, 008, 009, 016, 018 |
| 022 | Interface Design & Navigation | M10 | 001, 002, 004, 005, 010, 011, 016, 018, 020 |
M0 001 Auth ── 002 Config ── 003 Isolation
│
M1 005 B3 Import ──┤ (+ CPF stripping from 004, pulled forward)
│
M2 006 Ledger ── 007 Cost Basis
│
M3 010 Wallets ────┤
│
M4 008 Market Data ── 009 Valuation
│
M5 011 Framework ── 012 Performance
├── 013 Portfolio Value
├── 014 Earnings
└── 015 Composition
M6 004 LGPD (remainder)
M7 017 Balancing ── needs 009 valuation + 010 wallets
018 Opportunity ── needs 008 quotes + 004 consent
019 Goals ── needs 013 portfolio value + 014 earnings
M8 020 Onboarding ── extracted from 005; needs 001, 005, 009, 010
taken ahead of further features (PRD R1)
M9 021 Personal deployment ── loopback personal production; needs 002, 003, 008, 009, 016, 018
M10 022 Interface redesign ── prototype first; regroups every existing screen, adds no calculation
016 Platform qualities ── budgets set in M0, enforced continuously
These are asserted in more than one spec because they are the checks most likely to catch a real defect:
- Rebuild equals incremental. Positions and valuation snapshots recomputed from the ledger must exactly match the incrementally-maintained state — SPEC-006, SPEC-007, SPEC-009.
- Totals are invariant across groupings. Switching a report's grouping must never change a total — SPEC-011, and every report spec.
- Reports agree with each other. Composition's total = Portfolio Value's endpoint; Earnings' total = Portfolio Value's earnings driver — SPEC-013, SPEC-014, SPEC-015. From M7 this extends to goals: a current-value growth goal must equal Portfolio Value for the same wallet and date, and a year's goal income must equal the Earnings report's total for that wallet and year — SPEC-019.
- SPEC-002 blocks SPEC-008. The market data service must change its own polling cadence at runtime under budget pressure, which is unimplementable if the interval is a constant.
- CPF stripping (SPEC-004, BR-004-02) belongs in M1, not M6. Every other LGPD control can be retrofitted; this one cannot. Once a CPF reaches a database and a backup, "we never stored it" is retroactively false.
Carried from PRD §11 and unresolved at spec level: Q1 aggregator path, Q2 investment funds, Q3 IR/tax reporting, Q4 IR/IOF net values, Q5 sector data source, Q6 target allocations, Q7 when to upgrade the quote tier, Q8 forward-looking dividend calendar.