`
`;
};
const p0Tasks: Task[] = [
{ name:'Architecture Design', status:'done', detail:'3-tier architecture: Supabase → Papr Vector → Papr KG. Data flow defined.' },
{ name:'KG Schema & Node Policies', status:'done', detail:'14 node types with uniqueness policies (lookup/upsert/per-audit). Relationship map complete.' },
{ name:'SQL Schema (Supabase)', status:'done', detail:'All tables defined: lookup tables, auth, stakeholders, conflicts, recommendations, sprints.' },
{ name:'Papr SDK Integration Guide', status:'done', detail:'3-tier integration: seed, structured sync, narrative. Correct SDK syntax verified.' },
{ name:'Agent Job Specs', status:'done', detail:'Job creation patterns, pipeline DAG, autoTrigger dependencies documented.' },
{ name:'Namespace & Embedding Strategy', status:'done', detail:'Per-client namespace_id, transform_embedding with mode:auto, domain_id:general.' },
{ name:'Milestone Tracker', status:'done', detail:'This tracker — 6 phases, 38 tasks, critical path defined.' },
];
const p1Tasks: Task[] = [
{ name:'Supabase project setup', status:'done', detail:'PostgreSQL database provisioned. Connection pooling enabled.' },
{ name:'Auth configuration', status:'done', detail:'Supabase Auth with email/password + invite-only for clients. RLS policies.' },
{ name:'Lookup tables seeded', status:'done', detail:'5 domains, 20 subcategories inserted. display_order and icons set.' },
{ name:'Core tables created', status:'done', detail:'clients, audits, rubric_items, rubric_scoring, evidence_sources, findings.' },
{ name:'RLS policies applied', status:'done', detail:'Row-level security: clients see only their data, RR team sees all.' },
{ name:'Profiles + roles', status:'done', detail:'user_profiles table with role enum (admin/consultant/client). Linked to Supabase Auth.' },
];
const renderPhase = (title: string, icon: string, status: Status, tasks: Task[]) => {
const done = tasks.filter(t => t.status === 'done').length;
const pct = Math.round((done / tasks.length) * 100);
const rows = tasks.map(t =>
`
| | |
`
).join('');
return `
`;
};
export function renderMilestones(): string {
const total = 38; const done = 13; const pct = Math.round((done/total)*100);
return `
Implementation Milestones
Overall Progress
/ tasks (%)
Phase 0 & 1 done. Next: Phase 2 (Agent Jobs). Critical path: P2 → (P3 ∥ P4) → P5
`
`;
};
interface Task { name: string; status: Status; detail: string; }
interface Milestone { id: string; title: string; status: Status; icon: string; tasks: Task[]; }
const phases: Milestone[] = [
{ id:'p2', title:'Phase 2 — Build Agent Jobs', status:'todo', icon:'ic-bolt', tasks:[
{ name:'Transcript Processor', status:'todo', detail:'Agent job: parse uploaded transcripts, extract stakeholder quotes, map to rubric items, chunk & store to Papr vector memory with per-client namespace' },
{ name:'Rubric Scorer', status:'todo', detail:'Agent job: score each rubric item per stakeholder based on transcript evidence. Write perspective_scores to Supabase with stakeholder_id FK' },
{ name:'Conflict Detector', status:'todo', detail:'Agent job: compare perspective_scores per rubric item, flag disagreements >1pt variance, create conflict rows with resolution_status=pending' },
{ name:'Audit Analyzer', status:'todo', detail:'Agent job: synthesize scores + resolved conflicts into domain-level findings. Write audit_synthesis and computed domain scores to Supabase' },
{ name:'Recommendation Planner', status:'todo', detail:'Agent job: gap analysis (score vs 3.5 benchmark), impact/effort prioritization, cross-domain dependencies. Outputs max 8 recommendations with 2+ sprints each' },
{ name:'Report Writer', status:'todo', detail:'Agent job: generate full narrative audit report incorporating findings, evidence, and recommendations. Write to Supabase audit_reports' },
{ name:'Executive Summary Writer', status:'todo', detail:'Agent job: generate concise 2-page executive summary for client leadership. Write to Supabase exec_summaries' },
{ name:'Memory Sync', status:'todo', detail:'Agent job: push all structured data to Papr KG (Tier 2) + report narrative sections to vector memory (Tier 3). Handles both graph and vector in one job' },
]},
{ id:'p3', title:'Phase 3 — Vector Memory Integration', status:'todo', icon:'ic-brain', tasks:[
{ name:'Namespace strategy', status:'todo', detail:'Configure per-client namespace_id pattern. Set up transform_embedding with mode:auto, domain_id:general' },
{ name:'Seed rubric reference data', status:'todo', detail:'Tier 1: seed Domain, Subcategory, RubricItem nodes to Papr so lookup policies work for future memory.add() calls' },
{ name:'Verify transcript vector search', status:'todo', detail:'Test semantic search across transcript chunks — "what did the CRO say about pricing?" returns correct evidence' },
{ name:'Verify cross-client search', status:'todo', detail:'Test namespace-scoped search. Queries in client A namespace never return client B data' },
]},
{ id:'p4', title:'Phase 4 — Knowledge Graph Integration', status:'todo', icon:'ic-graph', tasks:[
{ name:'Register KG schema', status:'todo', detail:'Call papr.schemas.create() with all 14 node types, relationship definitions, and lookup/upsert policies' },
{ name:'Build Memory Sync job logic', status:'todo', detail:'Implement the Tier 2 structured sync: Client, Audit, Stakeholder, PerspectiveScore, Conflict, Recommendation, Sprint nodes' },
{ name:'Build Tier 3 narrative sync', status:'todo', detail:'Implement auto-extract mode for report sections — let Papr discover entities (tools, competitors, metrics) and link to known anchors' },
{ name:'Verify graph queries', status:'todo', detail:'Test GraphQL queries: "all audits for Client X", "which domains score below 2.5 across all clients"' },
{ name:'Cross-client pattern detection', status:'todo', detail:'Verify Pattern and Theme nodes merge correctly across audits — "weak pricing governance" seen in 5 clients = 1 node, 5 edges' },
]},
{ id:'p5', title:'Phase 5 — Portals & Deployment', status:'todo', icon:'ic-rocket', tasks:[
{ name:'Admin portal — audit management', status:'todo', detail:'Client list, create/manage audits, upload transcripts, trigger pipeline, monitor job status' },
{ name:'Admin portal — conflict resolution UI', status:'todo', detail:'View flagged conflicts, override scores, mark resolved. Only admin/RR team roles can resolve' },
{ name:'Admin portal — report editing', status:'todo', detail:'Edit AI-generated report sections before publishing. Track edit history per section' },
{ name:'Admin portal — benchmarking dashboard', status:'todo', detail:'Cross-client comparison (admin-only). Domain heatmaps, trend lines, anonymized percentiles' },
{ name:'Customer portal — audit view', status:'todo', detail:'Read-only: executive summary, interactive scorecard with evidence drill-down, full report download' },
{ name:'Customer portal — recommendation tracker', status:'todo', detail:'View recommendations + sprints, update sprint progress, mark deliverables complete' },
{ name:'Publish & access controls', status:'todo', detail:'RR team clicks "Publish" → client gets portal access. Supabase RLS policies enforce data isolation' },
{ name:'Deploy to Digital Ocean', status:'todo', detail:'Containerize admin + customer portals. CI/CD pipeline. SSL + custom domain setup' },
]},
];
export function renderMilestones2(): string {
return phases.map(p => {
const done = p.tasks.filter(t => t.status === 'done').length;
const pct = Math.round((done / p.tasks.length) * 100);
const rows = p.tasks.map(t => `
`).join('');
return `
%">
` : ''}