docs: create milestone v3.0 roadmap (7 phases)

This commit is contained in:
lorentz 2026-07-14 23:52:00 -04:00
parent cefa963565
commit 0228639f24
3 changed files with 217 additions and 87 deletions

View file

@ -149,38 +149,39 @@ Populated during roadmap creation.
| Requirement | Phase | Status |
|-------------|-------|--------|
| DETECT-01 | TBD | Pending |
| DETECT-02 | TBD | Pending |
| DETECT-03 | TBD | Pending |
| EVID-01 | TBD | Pending |
| EVID-02 | TBD | Pending |
| EVID-03 | TBD | Pending |
| EVID-04 | TBD | Pending |
| CAMP-01 | TBD | Pending |
| CAMP-02 | TBD | Pending |
| CAMP-03 | TBD | Pending |
| BLAST-01 | TBD | Pending |
| BLAST-02 | TBD | Pending |
| CLASSIFY-01 | TBD | Pending |
| CLASSIFY-02 | TBD | Pending |
| CLASSIFY-03 | TBD | Pending |
| CLASSIFY-04 | TBD | Pending |
| CLASSIFY-05 | TBD | Pending |
| CLASSIFY-06 | TBD | Pending |
| REMED-01 | TBD | Pending |
| REMED-02 | TBD | Pending |
| REMED-03 | TBD | Pending |
| REMED-04 | TBD | Pending |
| REMED-05 | TBD | Pending |
| REMED-06 | TBD | Pending |
| NOTE-01 | TBD | Pending |
| ACCESS-01 | TBD | Pending |
| DETECT-01 | Phase 15 | Pending |
| DETECT-02 | Phase 15 | Pending |
| DETECT-03 | Phase 18 | Pending |
| EVID-01 | Phase 15 | Pending |
| EVID-02 | Phase 16 | Pending |
| EVID-03 | Phase 16 | Pending |
| EVID-04 | Phase 16 | Pending |
| CAMP-01 | Phase 18 | Pending |
| CAMP-02 | Phase 18 | Pending |
| CAMP-03 | Phase 18 | Pending |
| BLAST-01 | Phase 17 | Pending |
| BLAST-02 | Phase 17 | Pending |
| CLASSIFY-01 | Phase 19 | Pending |
| CLASSIFY-02 | Phase 19 | Pending |
| CLASSIFY-03 | Phase 19 | Pending |
| CLASSIFY-04 | Phase 19 | Pending |
| CLASSIFY-05 | Phase 19 | Pending |
| CLASSIFY-06 | Phase 19 | Pending |
| REMED-01 | Phase 20 | Pending |
| REMED-02 | Phase 20 | Pending |
| REMED-03 | Phase 20 | Pending |
| REMED-04 | Phase 20 | Pending |
| REMED-05 | Phase 20 | Pending |
| REMED-06 | Phase 20 | Pending |
| NOTE-01 | Phase 21 | Pending |
| ACCESS-01 | Phase 18 | Pending |
**Coverage:**
- v1 requirements: 26 total
- Mapped to phases: 0 (pending roadmap)
- Unmapped: 26 ⚠️ (resolved by roadmapper)
- Mapped to phases: 26 (Phases 15-21)
- Unmapped: 0 ✓
---
*Requirements defined: 2026-07-14*
*Traceability populated: 2026-07-14 — ROADMAP.md Phases 15-21*
*Last updated: 2026-07-14 after initial definition*

View file

@ -3,7 +3,8 @@
## Milestones
- ✅ **v1.0 Mobile Shell Redesign** — Phases 1-9.1 (shipped 2026-07-10)
- 📋 **v2.0 PAX8 Integration** — Phases 10-14 (planned)
- ✅ **v2.0 PAX8 Integration** — Phases 10-14 (shipped 2026-07-12)
- 🚧 **v3.0 Phishing Triage Automation** — Phases 15-21 (in progress)
## Phases
@ -218,7 +219,8 @@ under `/mobile/*` — no `/mobile-v2`, no parallel routes.
</details>
### 📋 v2.0 PAX8 Integration (Planned)
<details>
<summary>✅ v2.0 PAX8 Integration (Phases 10-14) - SHIPPED 2026-07-12</summary>
**Milestone Goal:** Sync PAX8 licensing/subscription data into Pulse, read-only,
mapped to Autotask companies, so managers can see subscription costs and seat
@ -241,9 +243,7 @@ render, including the manual-resolution workflow for flagged companies.
- [x] **Phase 11: Company, Catalog & Subscription Sync** — Read-only sync of current-state companies, product catalog, and subscriptions into Postgres (completed 2026-07-11)
- [x] **Phase 12: Orders/Invoices & Company Matching** — Historical cost sync plus fuzzy-name auto-matching (with flagging) of PAX8 companies to Autotask companies (completed 2026-07-11)
- [x] **Phase 13: Scheduler & Admin Toggle** — Daily `pax8-daily` cron entry and an on/off switch in `/admin/integrations` (completed 2026-07-11)
- [x] **Phase 14: /pax8 UI Surface** — New page listing companies/subscriptions/cost breakdown, plus manual resolution of flagged company matches (completed 2026-07-11)
## Phase Details
- [x] **Phase 14: /pax8 UI Surface** — New page listing companies/subscriptions/cost breakdown, plus manual resolution of flagged company matches (completed 2026-07-12)
### Phase 10: PAX8 Client & Auth Foundation
**Goal**: Pulse can authenticate to the PAX8 API via OAuth2 client-credentials, and the Postgres schema for all four PAX8 entities exists — proving the integration pattern before any sync logic is built on top of it.
@ -325,10 +325,136 @@ render, including the manual-resolution workflow for flagged companies.
- [x] 14-06-PLAN.md — Automated gates + human verification of all 4 SCs and the view/resolve permission split (PAX8-12, PAX8-13, PAX8-14)
**UI hint**: yes
</details>
### 🚧 v3.0 Phishing Triage Automation (In Progress)
**Milestone Goal:** Detect candidate phishing/spam report tickets in Autotask, extract
and parse original-message evidence, classify each as `SPAM` / `UNWANTED` / `THREAT`,
group duplicate reports into campaigns, and prepare (never auto-execute) remediation
actions behind an explicit human-approval gate.
Seven phases follow the domain's natural dependency chain rather than a generic
foundation→features→polish template. Phase 15 lands the durable data model
(campaigns/reports/messages/indicators/classifications/remediation_actions/
audit_events, migration 097+) together with ticket detection and basic ticket-level
evidence, since every later service writes to that schema. Phase 16 is the pure,
testable RFC822/MIME `.eml` parser — it has no dependency on detection beyond the
schema, but campaign grouping depends on its output (Message-ID, indicators), so it
must land before Phase 18. Phase 17 (Mimecast blast-radius) has no dependency on the
parser or on campaigns — it only needs the Phase 15 schema — so it's sequenced here
as an independent unit that could equally have been built in parallel with Phase 16
by a second workstream. Phase 18 is the first phase to expose `/api/phishing/*`
routes (campaign list/get, on-demand ticket analysis) and is where ACCESS-01's
auth convention is established for every phishing endpoint that follows. Phase 19
(classification) depends on both Phase 17's blast-radius output and Phase 18's
campaign data as inputs — it cannot run before either. Phase 20 (remediation/
approval/audit) depends on campaigns existing (Phase 18) and classifications
existing (Phase 19), since you can't approve or gate an action that doesn't
reference either. Phase 21 (Autotask triage note) is last because its note content
summarizes classification, blast radius, and recommended/approved remediation state
— it has nothing to summarize until Phases 19 and 20 exist.
- [ ] **Phase 15: Data Model, Detection & Ticket Evidence** — New phishing schema (migration 097) + idempotent Autotask ticket scanner + base ticket evidence capture
- [ ] **Phase 16: EML/MIME Evidence Parser** — Pure RFC822/MIME parser: `.eml` selection (`rfc.eml` over `OriginatingEmail.eml`), normalized headers/URLs/attachments, sanitized body preview, synthetic-fixture tests
- [ ] **Phase 17: Mimecast Blast Radius Lookup** — Blast-radius abstraction with graceful `unavailable` degradation when Mimecast isn't configured
- [ ] **Phase 18: Campaign Grouping & Phishing Analysis API** — Message-ID-first dedupe/grouping, on-demand single-ticket analysis, and the first `/api/phishing/*` routes with the ACCESS-01 auth convention
- [ ] **Phase 19: Classification Engine** — Deterministic SPAM/UNWANTED/THREAT rule classifier over bounded structured evidence, KnowBe4-simulation guard, (re-)trigger API
- [ ] **Phase 20: Remediation, Approval & Audit Safety** — Proposed-only remediation actions, approve/remediate/mark-false-positive APIs, idempotent re-run, full audit trail
- [ ] **Phase 21: Autotask Triage Note** — Sanitized internal triage note posted via existing safe note-write path, or returned via API if no such path exists
## Phase Details
### Phase 15: Data Model, Detection & Ticket Evidence
**Goal**: The durable phishing-triage schema exists in Postgres, and Pulse can scan Autotask/Pulse tickets for known phishing/spam-report patterns idempotently, capturing base ticket-level evidence for each candidate.
**Depends on**: Nothing (first phase of v3.0)
**Requirements**: DETECT-01, DETECT-02, EVID-01
**Success Criteria** (what must be TRUE):
1. A new migration (`migrations/097_*.sql` or next available number) creates `campaigns`, `reports`, `messages`, `indicators`, `classifications`, `remediation_actions`, and `audit_events` tables with `IF NOT EXISTS`, ready for every later phase to read/write
2. Running the ticket scanner against Autotask/Pulse tickets flags candidates matching the known title/body patterns ("Phishing Report", "Spam Alert", "Phishing Alert - Email Security Report", "KnowBe4 Phish Alert Report", "Source: KnowBe4 Phish Alert Button", "userSubmissionsReportMessage", "reported message destinations", "Microsoft directly") and persists a `reports` row per candidate
3. Re-scanning tickets that haven't changed since last processed does not reprocess or duplicate their `reports` rows; a ticket whose Autotask data changed since last processed IS reprocessed (idempotent on ticket state, not just ticket ID)
4. Each flagged ticket's stored evidence includes ticket ID/number, company, requester/reporter, title, description, notes, relevant time entries, and attachment metadata (EVID-01)
**Plans**: TBD
**UI hint**: no
### Phase 16: EML/MIME Evidence Parser
**Goal**: Given a ticket's attachments, Pulse selects the correct original reported message and parses its RFC822/MIME structure into normalized, actionable evidence — without ever executing or fetching anything from the message.
**Depends on**: Phase 15 (messages/indicators tables to persist output into)
**Requirements**: EVID-02, EVID-03, EVID-04
**Success Criteria** (what must be TRUE):
1. Given synthetic fixtures with both `rfc.eml` and `OriginatingEmail.eml` present, the selection logic picks `rfc.eml` as the original reported message, matching case-insensitively and by `message/rfc822` content-type — not filename alone
2. Parsing a synthetic `.eml` fixture produces normalized headers (From, display name, sender email/domain, Reply-To, Return-Path, To, Cc, Subject, Date, Message-ID, Received chain, SPF/DKIM/DMARC results), a list of extracted URLs, and attachment metadata (name, content-type, size, hash)
3. The parser never executes or fetches any URL found in a message — verified by tests asserting no outbound network calls happen during parsing
4. Parsed output includes a sanitized/truncated body preview stored alongside the raw evidence, distinct from the full raw body
5. `npx vitest run` for the new parser test file passes using synthetic fixtures only (no real customer email)
**Plans**: TBD
**UI hint**: no
### Phase 17: Mimecast Blast Radius Lookup
**Goal**: Pulse can ask "how far did this message spread" via a Mimecast blast-radius abstraction when Mimecast is configured, and gets a clean `unavailable` signal — never a crash or a block — when it isn't.
**Depends on**: Phase 15 (schema to store lookup results against)
**Requirements**: BLAST-01, BLAST-02
**Success Criteria** (what must be TRUE):
1. When Mimecast is configured, querying the blast-radius abstraction for a message (keyed on message ID, sender, recipient/reporter, subject, and date window) returns normalized delivery data — matched/delivered/held/rejected/clicked counts and per-recipient status
2. When Mimecast is not configured, the same lookup call returns `status: unavailable` synchronously rather than throwing, timing out, or blocking the caller
3. The lookup follows the existing `lib/services/` factory convention (`getMimecastClient()` + `isMimecastConfigured()`-equivalent) so Phase 19's classifier can call it without knowing whether Mimecast is present
**Plans**: TBD
**UI hint**: no
### Phase 18: Campaign Grouping & Phishing Analysis API
**Goal**: Duplicate reports of the same phishing/spam campaign are automatically grouped and accumulate over time, and an operator can trigger analysis of a specific ticket or browse campaigns through a properly access-controlled `/api/phishing/*` surface.
**Depends on**: Phase 16 (parsed Message-ID/indicators to key grouping on)
**Requirements**: CAMP-01, CAMP-02, CAMP-03, DETECT-03, ACCESS-01
**Success Criteria** (what must be TRUE):
1. Two reports sharing the same original Message-ID are grouped into the same campaign; absent a shared Message-ID, reports sharing attachment-hash/URL-domain + subject + sender within a time window are grouped instead; absent that too, sender + normalized subject + client + time-window groups them as the final fallback
2. A campaign accumulates additional linked ticket reports and recipients as new duplicate reports arrive over time, without ever creating a second campaign for the same underlying report
3. `POST /api/phishing/tickets/{ticket_id}/analyze` runs detection + evidence extraction + campaign grouping for one specific ticket on demand and returns the resulting campaign linkage, instead of waiting for the next scheduled scan
4. `GET /api/phishing/campaigns` lists campaigns and `GET /api/phishing/campaigns/{id}` returns full detail (linked reports, messages, indicators, classification history)
5. Every `/api/phishing/*` route introduced in this phase calls `requireAuth()` (or `requirePermission()`) and rejects an unauthenticated/unauthorized request with 401/403 — establishing the auth convention every later phishing endpoint (Phases 19-21) must also follow
**Plans**: TBD
**UI hint**: no
### Phase 19: Classification Engine
**Goal**: Every campaign gets a deterministic SPAM/UNWANTED/THREAT verdict, built from bounded structured evidence (never raw unbounded email), that correctly flags destructive-action recommendations for approval and doesn't cry wolf on routine KnowBe4 simulations.
**Depends on**: Phase 17 (blast-radius input), Phase 18 (campaign data input + auth convention)
**Requirements**: CLASSIFY-01, CLASSIFY-02, CLASSIFY-03, CLASSIFY-04, CLASSIFY-05, CLASSIFY-06
**Success Criteria** (what must be TRUE):
1. Classifying a campaign returns exactly one of `SPAM` / `UNWANTED` / `THREAT` with confidence, a short summary, evidence-backed reasons, recommended actions, and a `requires_approval` flag
2. A classification whose recommended actions include any destructive action (purge/block/delete/reset) always has `requires_approval: true` — proven by a test asserting the invariant can't be produced any other way
3. Classifying a campaign with incomplete evidence (no Mimecast data, no `.eml`) lowers confidence and names the specific missing evidence in the reasons
4. A synthetic KnowBe4 security-awareness-simulation fixture is not classified as `THREAT` absent contrary evidence
5. `POST /api/phishing/campaigns/{id}/classify` (re-)triggers classification, enforces the Phase 18 auth convention, and the classifier only ever receives structured, size-bounded evidence — long bodies are redacted/truncated before reaching any AI layer, and IT Glue-sourced evidence (if referenced) goes through the existing redacted `lib/services/analyzer/itglue-search.ts` path
**Plans**: TBD
**UI hint**: no
### Phase 20: Remediation, Approval & Audit Safety
**Goal**: Remediation actions are proposed, never auto-executed, and every approve/remediate/mark-false-positive action is gated by elevated permission, idempotent on re-run, and fully audited.
**Depends on**: Phase 18 (campaigns to act against), Phase 19 (classifications to approve/act on)
**Requirements**: REMED-01, REMED-02, REMED-03, REMED-04, REMED-05, REMED-06
**Success Criteria** (what must be TRUE):
1. Recommended remediation actions are persisted with status `proposed`, and no code path in this milestone executes one automatically
2. `POST /api/phishing/campaigns/{id}/approve` records approver, timestamp, and the exact approved action parameters, and is gated behind a permission level above plain read access (beyond the Phase 18 baseline)
3. `POST /api/phishing/campaigns/{id}/remediate` proceeds only for already-approved actions against a configured, non-destructive-by-default provider path; otherwise it returns `not_implemented`/an explicit failure and never silently succeeds without taking or logging an action
4. Re-running remediation against an already-completed action does not duplicate the destructive effect — proven by a test that calls remediate twice and asserts a single effect/log entry
5. `POST /api/phishing/campaigns/{id}/mark-false-positive` exists, and every state-changing action (classify, approve, remediate, mark-false-positive) writes an `audit_events` row recording actor, event type, and payload
**Plans**: TBD
**UI hint**: no
### Phase 21: Autotask Triage Note
**Goal**: Once a campaign is classified, a human-readable, sanitized internal triage note either gets posted to the Autotask ticket (if a safe write path already exists) or is returned via API for manual use — never a raw/unsanitized dump, never a silent no-op.
**Depends on**: Phase 19 (classification content to summarize), Phase 20 (recommended/approved remediation state to include)
**Requirements**: NOTE-01
**Success Criteria** (what must be TRUE):
1. If Pulse has a safe existing Autotask note-writing method, triggering note generation for a classified campaign posts an internal triage note summarizing classification, evidence, blast radius, and recommended actions to the originating ticket
2. The posted (or returned) note text is sanitized — no raw secrets/tokens/full malicious URL query strings appear in it
3. If no safe note-writing path exists, the same note content is returned via the API response instead of attempting any Autotask write, and no partial/unsanitized write is ever attempted as a fallback
**Plans**: TBD
**UI hint**: no
## Progress
**Execution Order:**
Phases execute in numeric order. v1.0 (Phases 1-9.1) shipped 2026-07-10. v2.0 phases run 10 → 11 → 12 → 13 → 14 — each is a hard dependency on the previous within this milestone (no parallelization: auth → current-state sync → historical sync + matching → scheduling → UI, in that order).
Phases execute in numeric order. v1.0 (Phases 1-9.1) shipped 2026-07-10. v2.0 (Phases 10-14) shipped 2026-07-12. v3.0 phases run 15 → 16 → 17 → 18 → 19 → 20 → 21 in strict sequence — Phase 17 has no functional dependency on Phase 16 and could run in parallel with it if split across two workstreams, but both must complete before Phase 19.
| Phase | Milestone | Plans Complete | Status | Completed |
|-------|-----------|----------------|--------|-----------|
@ -343,15 +469,24 @@ Phases execute in numeric order. v1.0 (Phases 1-9.1) shipped 2026-07-10. v2.0 ph
| 8. Engagement User Profile | v1.0 | 2/2 | Complete | 2026-07-10 |
| 9. User Profile & Preferences | v1.0 | 6/6 | Complete | 2026-07-10 |
| 9.1. ntfy Backend Fix | v1.0 | 1/1 | Complete | 2026-07-10 |
| 10. PAX8 Client & Auth Foundation | v2.0 | 3/3 | Complete | 2026-07-10 |
| 11. Company, Catalog & Subscription Sync | v2.0 | 3/3 | Complete | 2026-07-11 |
| 12. Orders/Invoices & Company Matching | v2.0 | 5/5 | Complete | 2026-07-11 |
| 13. Scheduler & Admin Toggle | v2.0 | 3/3 | Complete | 2026-07-11 |
| 14. /pax8 UI Surface | v2.0 | 6/6 | Complete | 2026-07-12 |
| 10. PAX8 Client & Auth Foundation | v2.0 | 3/3 | Complete | 2026-07-10 |
| 11. Company, Catalog & Subscription Sync | v2.0 | 3/3 | Complete | 2026-07-11 |
| 12. Orders/Invoices & Company Matching | v2.0 | 5/5 | Complete | 2026-07-11 |
| 13. Scheduler & Admin Toggle | v2.0 | 3/3 | Complete | 2026-07-11 |
| 14. /pax8 UI Surface | v2.0 | 6/6 | Complete | 2026-07-12 |
| 15. Data Model, Detection & Ticket Evidence | v3.0 | 0/TBD | Not started | - |
| 16. EML/MIME Evidence Parser | v3.0 | 0/TBD | Not started | - |
| 17. Mimecast Blast Radius Lookup | v3.0 | 0/TBD | Not started | - |
| 18. Campaign Grouping & Phishing Analysis API | v3.0 | 0/TBD | Not started | - |
| 19. Classification Engine | v3.0 | 0/TBD | Not started | - |
| 20. Remediation, Approval & Audit Safety | v3.0 | 0/TBD | Not started | - |
| 21. Autotask Triage Note | v3.0 | 0/TBD | Not started | - |
---
*Roadmap created: 2026-05-03*
*v2.0 phases added: 2026-07-10*
*v3.0 phases added: 2026-07-14*
*Source spec (v1.0): `docs/superpowers/specs/2026-05-03-mobile-shell-design.md`*
*Source seed (v2.0): `.planning/seeds/SEED-002-pax8-integration.md`*
*Source requirements (v3.0): `.planning/REQUIREMENTS.md`*
</content>

View file

@ -3,10 +3,10 @@ gsd_state_version: 1.0
milestone: v3.0
milestone_name: Phishing Triage Automation
status: planning
last_updated: "2026-07-15T03:33:51.575Z"
last_activity: 2026-07-15
last_updated: "2026-07-14T00:00:00.000Z"
last_activity: 2026-07-14
progress:
total_phases: 0
total_phases: 7
completed_phases: 0
total_plans: 0
completed_plans: 0
@ -17,50 +17,39 @@ progress:
## Project Reference
See: .planning/PROJECT.md (updated 2026-07-10)
See: .planning/PROJECT.md (updated 2026-07-14)
**Core value:** Managers can see PAX8 subscription costs and seat counts alongside existing Autotask company data in Pulse, without manually cross-referencing PAX8's own portal.
**Current focus:** Milestone complete
**Core value:** A manager/security operator can see every phishing/spam report ticket automatically triaged, deduplicated into campaigns, and classified — with any destructive remediation gated behind explicit human approval.
**Current focus:** Phase 15: Data Model, Detection & Ticket Evidence
## Current Position
Phase: Not started (defining requirements)
Plan: —
Status: Defining requirements
Last activity: 2026-07-15 — Milestone v3.0 started
Phase: 15 of 21 (Data Model, Detection & Ticket Evidence)
Plan: — (not yet planned)
Status: Roadmap approved, ready to plan Phase 15
Last activity: 2026-07-14 — v3.0 ROADMAP.md created, 26/26 requirements mapped across Phases 15-21
Progress: [░░░░░░░░░░] 0%
## Performance Metrics
**Velocity:**
- Total plans completed: 50 (all from v1.0 Mobile Shell Redesign)
- Total plans completed: 50 (v1.0: 42, v2.0: 20 across phases 10-14 — see per-phase table)
- Average duration: —
- Total execution time: 0.0 hours (v2.0)
- Total execution time: 0.0 hours (v3.0)
**By Phase:**
| Phase | Plans | Total | Avg/Plan |
|-------|-------|-------|----------|
| 01 | 2 | - | - |
| 02 | 2 | - | - |
| 03 | 2 | - | - |
| 04 | 3 | - | - |
| 05 | 2 | - | - |
| 06 | 3 | - | - |
| 07 | 3 | - | - |
| 07.1 | 5 | - | - |
| 08 | 2 | - | - |
| 09 | 6 | - | - |
| 09.1 | 1 | - | - |
| 10 | 3 | - | - |
| 11 | 3 | - | - |
| 12 | 5 | - | - |
| 13 | 3 | - | - |
| 14 | 6 | - | - |
| 01-09.1 (v1.0) | 34 | - | - |
| 10-14 (v2.0) | 20 | - | - |
| 15-21 (v3.0) | TBD | - | - |
**Recent Trend:**
- Last 5 plans: — (v1.0 closed; v2.0 not yet executed)
- Last 5 plans: — (v2.0 closed 2026-07-12; v3.0 not yet executed)
- Trend: —
*Updated after each plan completion*
@ -72,22 +61,27 @@ Last activity: 2026-07-15 — Milestone v3.0 started
Decisions are logged in PROJECT.md Key Decisions table.
Recent decisions affecting current work:
- v2.0 roadmap: 5 phases (10-14), strictly sequential — auth foundation →
current-state sync → historical sync + company matching → scheduler/admin
toggle → UI — each phase is a hard dependency on the previous, no
parallelization within this milestone
- Phase 10 isolates OAuth2 client-credentials auth + the full PAX8 schema
migration before any sync logic is written, to de-risk the new external
integration early
- PAX8-08 (read-only guarantee) and PAX8-11 (flag don't guess) are treated as
constraints verified within their natural sync phase (11 and 12
respectively), not standalone phases
- PAX8-12 (admin resolves flagged matches) is delivered on the `/pax8` page
itself (Phase 14) rather than a separate `/admin` surface — `/pax8` is the
dedicated home for this integration's data and review workflow
- v3.0 roadmap: 7 phases (15-21), each a hard dependency on at least one
predecessor except Phase 17 (Mimecast blast-radius), which only depends on
the Phase 15 schema and could be built in parallel with Phase 16 (EML
parser) if split across two workstreams — sequenced after 16 here for a
single execution thread
- The durable schema (campaigns/reports/messages/indicators/classifications/
remediation_actions/audit_events) lands in Phase 15, before any service
that writes to it — new migration, next number after 096 (097+)
- ACCESS-01 is mapped to Phase 18 (the first phase introducing
`/api/phishing/*` routes) rather than a standalone terminal phase; every
later phishing endpoint (19, 20, 21) is expected to continue enforcing the
same `requireAuth`/`requirePermission` convention as a success-criteria
carry-forward, not a re-mapped requirement
- Classification (Phase 19) is sequenced after both Phase 17 (blast-radius)
and Phase 18 (campaigns) since it needs both as inputs
- Remediation/approval/audit (Phase 20) is sequenced after Phase 18
(campaigns) and Phase 19 (classifications) — can't approve/gate an action
that doesn't reference either
- Autotask triage note (Phase 21) is last — its content summarizes
classification + blast radius + recommended/approved remediation state,
so it has nothing to summarize until Phases 19-20 exist
### Pending Todos
@ -115,7 +109,7 @@ Items acknowledged and carried forward from previous milestone close:
## Session Continuity
Last session: 2026-07-11T17:25:07.458Z
Stopped at: Phase 14 UI-SPEC approved
Resume file: .planning/phases/14-pax8-ui-surface/14-UI-SPEC.md
Last session: 2026-07-14T00:00:00.000Z
Stopped at: v3.0 ROADMAP.md and STATE.md created; REQUIREMENTS.md traceability populated
Resume file: None — next step is `/gsd:plan-phase 15`
</content>