{
  "schema_version": "1.0",
  "generated_at": "2026-05-18T22:35:59.808Z",
  "source": "src/data/prds/*.json",
  "site_url": "https://mm.dreamineering.com",
  "endpoint": "https://mm.dreamineering.com/prd-index.json",
  "intent": "Priority-ordered PRD intent for engineering agents. Each entry has the objective, kill signal, feature IDs, and build contract rows needed to implement and verify the work.",
  "stats": {
    "total": 19,
    "active": 7,
    "backlog": 7,
    "proven": 0
  },
  "active": [
    {
      "slug": "prd-project-management-system",
      "name": "Project Management System",
      "status": "L2-partial",
      "category": "inner-loop",
      "priorityScore": 1875,
      "intentContract": {
        "objective": "A superoperator can open /plans and see truthful state — completion rates, cycle times, and active counts computed from real plan data — then navigate to any plan or task and take action. The Plans UI must tell the same truth as the CLI.",
        "outcomes": [
          "Plans UI completion rate matches CLI output (currently 74%) within 2 percentage points",
          "Active plans count is non-zero when active plans exist in the DB",
          "Every plan row is clickable and navigates to plan detail",
          "Day, week, month cadence views each show a non-empty, accurate state"
        ],
        "healthMetrics": "CLI truth (74% completion, 1.1d cycle time) must not regress. Existing plan data (114 plans) must be readable without migration."
      },
      "killSignal": "Plans UI math still wrong after N1. If the thing that's supposed to track whether we're on track can't show truthful numbers, kill it and go back to the markdown tables.",
      "featureIds": [],
      "buildContract": []
    },
    {
      "slug": "prd-agent-platform",
      "name": "Agent Platform",
      "status": "L2",
      "category": "inner-loop",
      "priorityScore": 1200,
      "intentContract": {
        "objective": "Unified agent platform — identity, memory, scaffolds, boundaries — because scattered capabilities mean scattered quality.",
        "outcomes": "1. Plans dashboard shows correct math + drill-down within 2 sessions. 2. drmg scaffold creates skill/hook/content files from templates. 3. Per-agent scope files declare what each agent can touch. 4. Pattern extractor proposes preventions from cross-run findings.",
        "healthMetrics": "Existing CLI commands must not break. Agent audit dimensions must remain stable. Template quality must not regress.",
        "constraints": "Hard: agents never write outside declared scope without human override. Steering: prefer hooks over rules for enforcement (hooks are active, rules are passive).",
        "autonomy": "Allowed: scaffold template selection, memory index structure, pattern grouping. Escalate: new agent identity creation, scope expansion. Never: delete agent memories, bypass boundary hooks.",
        "stopRules": "Complete when: all 5 features at L3+. Halt when: boundary hooks block >30% of legitimate agent actions (too restrictive).",
        "counterMetrics": "Agent task completion rate must not decrease. Session startup time must stay under 30 seconds.",
        "blastRadius": "Plans UI, scaffold CLI, agent config files (.claude/agents/), memory DB tables. No user-facing product pages affected.",
        "rollback": "Each feature is independent. Revert the specific commit. Scaffold templates are additive. Memory writes are append-only."
      },
      "killSignal": "Boundary hooks block >30% of legitimate agent actions after 30 days. Agent task completion rate drops below current baseline.",
      "featureIds": [
        "PUMP-001",
        "PUMP-002",
        "PUMP-003",
        "PUMP-004",
        "PUMP-005"
      ],
      "buildContract": [
        {
          "id": 1,
          "job": "Surface",
          "featureId": "PUMP-001",
          "successTest": "Dashboard totals match DB query"
        },
        {
          "id": 2,
          "job": "Surface",
          "featureId": "PUMP-001",
          "successTest": "Plans grouped by project in UI"
        },
        {
          "id": 3,
          "job": "Surface",
          "featureId": "PUMP-001",
          "successTest": "Click plan row shows phases + tasks"
        },
        {
          "id": 4,
          "job": "Prevention",
          "featureId": "PUMP-002",
          "successTest": "drmg scaffold skill creates valid skill file"
        },
        {
          "id": 5,
          "job": "Prevention",
          "featureId": "PUMP-002",
          "successTest": "Registry lists all scaffoldable types"
        },
        {
          "id": 6,
          "job": "Prevention",
          "featureId": "PUMP-003",
          "successTest": "Each agent has scope.json declaring allowed paths"
        },
        {
          "id": 7,
          "job": "Prevention",
          "featureId": "PUMP-003",
          "successTest": "Edit outside scope triggers warning"
        },
        {
          "id": 8,
          "job": "Prevention",
          "featureId": "PUMP-003",
          "successTest": "drmg audit --scope shows violations per agent"
        },
        {
          "id": 9,
          "job": "Learning",
          "featureId": "PUMP-004",
          "successTest": "Patterns extracted from 3+ runs of same agent"
        },
        {
          "id": 10,
          "job": "Learning",
          "featureId": "PUMP-004",
          "successTest": "Proposes rule/hook from recurring pattern"
        },
        {
          "id": 11,
          "job": "Learning",
          "featureId": "PUMP-005",
          "successTest": "Agent writes structured memory to DB via CLI"
        },
        {
          "id": 12,
          "job": "Identity",
          "featureId": "PUMP-005",
          "successTest": "drmg etl load --agent=nav runs without error and upserts profile + memories"
        },
        {
          "id": 13,
          "job": "Identity",
          "featureId": "PUMP-005",
          "successTest": "drmg agents context --agent=nav returns profile JSON usable by context-aggregator"
        }
      ]
    },
    {
      "slug": "prd-marketing-site-generator",
      "name": "Marketing Site Generator",
      "status": "L1",
      "category": "product",
      "priorityScore": 1200,
      "intentContract": {
        "objective": "Build a reference marketing site (berleytrails) by hand using shared CDD components. Extract the patterns into an Nx generator. Commission by generating a second site (stackmates) with zero custom code. The generator IS the product — sites are the proof.",
        "outcomes": "1. berleytrails marketing site live with sign-up, diagnostic, and standard sections. 2. nx g ./tools:marketing-site stackmates produces a deployable site with zero new components. 3. Diagnostic completion rate >30%. 4. Sales team lead quality rating >= 7/10 within 90 days.",
        "healthMetrics": "Existing CRM pipeline velocity must not degrade. Existing analytics tracking must not break. Auth system load must stay within current capacity. Existing apps in the monorepo must continue to build.",
        "constraints": "Hard: All contact data must have consent via diagnostic completion — zero scraped personal data. Hard: Sites must use @stackmates/ui-marketing shared components — no site-specific components. Hard: Generator must follow existing tools/generators/ patterns. Steering: Prefer configuration over code for site variants.",
        "autonomy": "Allowed: Deploy site variants, configure diagnostics, wire analytics events, add components to shared library. Escalate: New component types not in shared library, new CRM integrations, changes to generator schema after extraction. Never: Scrape personal data, send unsolicited contact, bypass consent, create site-specific components outside the shared library.",
        "stopRules": "Complete: stackmates site generated and deployed via generator with zero custom code. Halt: If berleytrails diagnostic produces lead quality rating <5/10 after 30 leads — revisit diagnostic design before extracting generator.",
        "counterMetrics": "Diagnostic completion rate must stay >30%. Generator output must build on first run. Site N+1 must require zero new components.",
        "blastRadius": "CRM (new contact intake channel), Analytics (new event types), Auth (diagnostic submission users), DNS (new domains), Nx workspace (new generator + new apps), @stackmates/ui-marketing (new shared components).",
        "rollback": "Sites are independent Nx apps — delete apps/{site}/ without affecting others. CRM contacts from diagnostics tagged by source — can filter/archive. Generator can be removed from tools/generators/ without affecting manually-built sites."
      },
      "killSignal": "HRV pilot lead quality rating <5/10 after 30 leads. If the diagnostic doesn't produce leads that sales teams prefer over traditional lead gen, the model is wrong — not the execution. Do not extract the generator until berleytrails proves the pattern works.",
      "featureIds": [
        "MKTG-001",
        "MKTG-004",
        "MKTG-005",
        "CRM-001"
      ],
      "buildContract": [
        {
          "id": 1,
          "job": "Build Reference Site",
          "featureId": "MKTG-001",
          "successTest": "All sections render with brief data at 375/768/1024px (S1)",
          "state": "Gap"
        },
        {
          "id": 2,
          "job": "Build Reference Site",
          "featureId": "MKTG-001",
          "successTest": "Form submits, creates CRM contact, shows success",
          "state": "Gap"
        },
        {
          "id": 3,
          "job": "Build Reference Site",
          "featureId": "MKTG-001",
          "successTest": "New theme applied without code changes",
          "state": "Built"
        },
        {
          "id": 4,
          "job": "Capture via Diagnostics",
          "featureId": "MKTG-001",
          "successTest": "Renders sections, computes scores, shows recommendations (S2)",
          "state": "Gap"
        },
        {
          "id": 5,
          "job": "Capture via Diagnostics",
          "featureId": "CRM-001",
          "successTest": "Contact created with all fields (S3)",
          "state": "Gap"
        },
        {
          "id": 6,
          "job": "Capture via Diagnostics",
          "featureId": "CRM-001",
          "successTest": "Leads filterable by score, pain section, date, source (S4)",
          "state": "Gap"
        },
        {
          "id": 7,
          "job": "Measure and Optimize",
          "featureId": "MKTG-004",
          "successTest": "6 event types fire with site_id and session_id (S6)",
          "state": "Gap"
        },
        {
          "id": 8,
          "job": "Measure and Optimize",
          "featureId": "MKTG-004",
          "successTest": "Funnel: views → starts → section completion → full completion → CRM",
          "state": "Gap"
        },
        {
          "id": 9,
          "job": "Measure and Optimize",
          "featureId": "MKTG-005",
          "successTest": "Search engines index with correct title, description, og:image",
          "state": "Built"
        },
        {
          "id": 10,
          "job": "Extract Generator",
          "featureId": "MKTG-001",
          "successTest": "nx g produces buildable app with zero new components (S5)",
          "state": "Built"
        },
        {
          "id": 11,
          "job": "Extract Generator",
          "featureId": "MKTG-005",
          "successTest": "Each site on own domain with independent deployment (S7)",
          "state": "Partial"
        },
        {
          "id": 12,
          "job": "Extract Generator",
          "featureId": "MKTG-001",
          "successTest": "stackmates live with distinct theme, own diagnostic, independent deploy (S7)",
          "state": "Gap"
        }
      ]
    },
    {
      "slug": "prd-prompt-deck",
      "name": "Prompt Deck",
      "status": "L1",
      "category": "product",
      "priorityScore": 1200,
      "intentContract": {
        "objective": "A user compresses their world into five cards — each a heading, image (mantra), and link to deeper thought chains. The grid persists across sessions, empty cells highlight gaps as strategy, and weekly return makes the grid sharper each pass. Used on PRD pages, venture pages, and the app.",
        "outcomes": [
          "PromptDeck component renders on >= 20 pages (PRDs + ventures + app)",
          "A user who fills a grid returns within 7 days and updates at least one card",
          "Empty cells are visually distinct and prompt action, not confusion",
          "Grid state persists across sessions for logged-in users"
        ],
        "healthMetrics": "pages_using_promptdeck >= 20. Return rate > 0% within 7 days of first fill. Zero regressions on existing PRD/venture pages that import PromptDeck."
      },
      "killSignal": "10 external users fill a grid. If zero return within 7 days, it's a novelty, not an instrument. Stop building and revisit the job.",
      "featureIds": [],
      "buildContract": []
    },
    {
      "slug": "prd-aeo-discovery-funnel",
      "name": "AEO Discovery Funnel",
      "status": "L1",
      "category": "inner-loop",
      "priorityScore": 800,
      "intentContract": {
        "objective": "Make Dreamineering's capabilities discoverable and evaluable by AI agents before Phase B ships the first live tool.",
        "outcomes": "1. robots.txt explicitly allows ≥6 AI bots. 2. did.json live at /.well-known/did.json. 3. agent.json capabilities.jobs[] has ≥5 declared jobs. 4. ≥3 pages live under /agents/. 5. AEO content lane producing ≥1 post/week.",
        "healthMetrics": "Existing human-facing pages must not regress in structure. agent.json must remain valid JSON. llms.txt generation must not break.",
        "constraints": "Hard: AEO pages live at /agents/ not polluting /docs/ or /ventures/. Steering: prefer schema.org structured data over custom formats.",
        "autonomy": "Allowed: robots.txt edits, static well-known files, new /agents/ pages, new skills. Escalate: changes to existing PRD pages or venture pages. Never: remove existing content, change URL structure of existing pages.",
        "stopRules": "Complete when all 5 AEO-001 to AEO-005 features at L2+. Halt if new /agents/ pages break the Docusaurus build.",
        "counterMetrics": "Existing page structure must not regress. sitemap.xml must not shrink. Build time must not increase by more than 10%.",
        "blastRadius": "New: static/.well-known/did.json, src/pages/agents/*, .agents/skills/aeo-writer/, .agents/skills/agent-persona/, .claude/hooks/aeo-surface-gate.sh. Modified: static/robots.txt, static/.well-known/agent.json. No existing venture/docs pages touched.",
        "rollback": "All new files are additive. Revert specific commits. agent.json jobs[] can be removed without breaking existing fields."
      },
      "killSignal": "AEO landing pages break Docusaurus build. Or /agents/ pages duplicate positioning already on /ventures/ pages (redundancy signal).",
      "featureIds": [
        "AEO-001",
        "AEO-002",
        "AEO-003",
        "AEO-004",
        "AEO-005"
      ],
      "buildContract": [
        {
          "id": 1,
          "job": "Discovery",
          "featureId": "AEO-001",
          "successTest": "curl mm.dreamineering.com/robots.txt | grep GPTBot returns Allow entry. /.well-known/did.json returns valid DID document."
        },
        {
          "id": 2,
          "job": "Declaration",
          "featureId": "AEO-002",
          "successTest": "curl agent.json | jq '.capabilities.jobs | length' returns >= 5. Each job has id, name, description, inputSchema, outputSchema."
        },
        {
          "id": 3,
          "job": "Surface",
          "featureId": "AEO-003",
          "successTest": "≥3 pages live at /agents/ with schema.org Service JSON-LD in <head>. Pages render in Docusaurus build without error."
        },
        {
          "id": 4,
          "job": "Tools",
          "featureId": "AEO-004",
          "successTest": "aeo-writer skill produces a valid jobs[] entry from PRD input. aeo-surface-gate.sh hook fires on agent.json edits and validates JSON schema."
        },
        {
          "id": 5,
          "job": "Content",
          "featureId": "AEO-005",
          "successTest": "≥1 agent-targeted post published in first week of AEO lane opening. Post includes structured data and links to /agents/ page."
        }
      ]
    },
    {
      "slug": "prd-rfp-engine",
      "name": "RFP Engine",
      "status": "L2",
      "category": "product",
      "priorityScore": 720,
      "intentContract": {
        "objective": "RFP response engine for construction bids that learns from every bid — answer once, auto-fill forever, win rate climbs.",
        "outcomes": "1. Answer library has 10+ approved entries within 14 days of pilot. 2. Second RFP auto-fills 5+ answers from first. 3. Win rate trends >30%.",
        "healthMetrics": "Answer quality (SME rejection rate <30%). Auto-fill accuracy. Page load <2s on RFP routes.",
        "constraints": "Hard: Multi-tenant isolation. Steering: Quality over speed — wrong answers cost more than slow answers.",
        "autonomy": "Allowed: UI layout, matching algorithm tuning, answer formatting. Escalate: New entity types, library schema changes. Never: Auto-approve answers without SME review.",
        "stopRules": "Complete when: all Build Contract rows at Live + 1 real RFP processed end-to-end. Halt when: library shows 0 queries after 14 days.",
        "counterMetrics": "Answer library must not become a data-entry chore. Auto-fill must not degrade answer quality.",
        "blastRadius": "RFP routes, answer matching algorithm, venture Q&A CRUD, deck generation. Depends on CRM contacts and deals.",
        "rollback": "Answer library can be disabled without affecting CRM CRUD. Auto-fill algorithm can be rolled back to manual-only."
      },
      "killSignal": "Ventures but no answers = project board. Library has 0 queries after 14 days = adoption failed.",
      "featureIds": [
        "RFP-011",
        "RFP-012",
        "RFP-013",
        "RFP-016",
        "RFP-017"
      ],
      "buildContract": [
        {
          "id": 11,
          "job": "Win More Bids",
          "featureId": "RFP-011",
          "successTest": "Cards show stage, linked deal, deadline. Drag between stages.",
          "state": "Live"
        },
        {
          "id": 12,
          "job": "Win More Bids",
          "featureId": "RFP-012",
          "successTest": "All Q&A visible, linked deal clickable, contacts with roles",
          "state": "Live"
        },
        {
          "id": 13,
          "job": "Win More Bids",
          "featureId": "RFP-013",
          "successTest": "Save + appears on kanban, link to deal optional",
          "state": "Live"
        },
        {
          "id": 16,
          "job": "Win More Bids",
          "featureId": "RFP-016",
          "successTest": "Add, edit, delete questions. Reorder by drag.",
          "state": "Live"
        },
        {
          "id": 17,
          "job": "Win More Bids",
          "featureId": "RFP-017",
          "successTest": "AI draft visible, manual override saves, approval status tracks",
          "state": "Live"
        },
        {
          "id": 18,
          "job": "Compound Answers",
          "featureId": "RFP-016",
          "successTest": "Venture B auto-fills 5+ answers from Venture A library",
          "state": "Live"
        },
        {
          "id": 21,
          "job": "Compound Answers",
          "featureId": "RFP-017",
          "successTest": "Approved answer queryable by keyword, linked to source venture",
          "state": "Built"
        },
        {
          "id": 24,
          "job": "Prove ROI",
          "featureId": "RFP-011",
          "successTest": "Fill rate %, time saved estimate, library growth chart",
          "state": "Broken"
        },
        {
          "id": 31,
          "job": "Win More Bids",
          "featureId": "RFP-013",
          "successTest": "8 criteria scored, recommendation displayed, saved per venture",
          "state": "Gap"
        }
      ]
    },
    {
      "slug": "prd-sales-crm",
      "name": "Sales CRM",
      "status": "L2-L3",
      "category": "product",
      "priorityScore": 720,
      "intentContract": {
        "objective": "Vertical CRM for construction/infrastructure sales with native entities (Property, Venture, multi-company deals) that eliminates the 3-5 tool juggle per deal.",
        "outcomes": "1. Deal pipeline visible in <10s (vs weekly team call). 2. Contact lookup in <5s (vs scrolling spreadsheets). 3. Follow-ups never forgotten (tasks with due dates).",
        "healthMetrics": "Auth uptime (no regression). Data integrity (no orphaned records). Page load <2s on all CRM routes.",
        "constraints": "Hard: Multi-tenant isolation (org data never leaks). Steering: Vertical-first (construction entities native, not configured).",
        "autonomy": "Allowed: UI layout, component choice, query optimization. Escalate: Schema changes, new entity types. Never: Delete user data, modify billing without confirmation.",
        "stopRules": "Complete when: all Build Contract rows at Live + 1 real user logs a call from deal detail. Halt when: auth regresses or deal pipeline shows stale data after 14 days.",
        "counterMetrics": "CRM must not become a data-entry chore — if reps stop logging after week 2, the workflow has failed.",
        "blastRadius": "CRM routes (all /crm/*), server actions (contact/deal/venture CRUD), Stripe webhooks (payment flow). Multi-tenant isolation is the critical boundary.",
        "rollback": "Feature flags per module. Stripe integration can be disabled without losing deal data."
      },
      "killSignal": "Contacts but no deals = rolodex. Deals with no activity for 14 days = dead pipeline.",
      "featureIds": [
        "CRM-001",
        "CRM-002",
        "CRM-003",
        "CRM-004"
      ],
      "buildContract": [
        {
          "id": 1,
          "job": "Know Who I'm Dealing With",
          "featureId": "CRM-001",
          "successTest": "List loads <1s, search filters in <500ms. 29 contacts render.",
          "state": "Partial"
        },
        {
          "id": 13,
          "job": "Capture Demand Evidence at Intake",
          "featureId": "CRM-001",
          "successTest": "Deal saved with verbatim_pain_quote populated, awareness_level set, BANT fields captured (TBC acceptable, blank is not). rfp-demand-intelligence triggered.",
          "state": "Gap"
        },
        {
          "id": 2,
          "job": "Know Who I'm Dealing With",
          "featureId": "CRM-001",
          "successTest": "Click contact → detail with linked entities (S1)",
          "state": "Partial"
        },
        {
          "id": 3,
          "job": "Know Who I'm Dealing With",
          "featureId": "CRM-001",
          "successTest": "Create saves, redirects to detail with canonical ID",
          "state": "Partial"
        },
        {
          "id": 4,
          "job": "Know Who I'm Dealing With",
          "featureId": "CRM-001",
          "successTest": "Company shows all contacts + deals + activity",
          "state": "Built"
        },
        {
          "id": 5,
          "job": "See Where Every Deal Stands",
          "featureId": "CRM-002",
          "successTest": "Cards/Table/Kanban views. 8 deals render with values (S2).",
          "state": "Live"
        },
        {
          "id": 6,
          "job": "See Where Every Deal Stands",
          "featureId": "CRM-002",
          "successTest": "Save + appears on pipeline in correct column",
          "state": "Live"
        },
        {
          "id": 7,
          "job": "See Where Every Deal Stands",
          "featureId": "CRM-002",
          "successTest": "All relationships visible, click-through to venture + contacts (S5)",
          "state": "Live"
        },
        {
          "id": 8,
          "job": "See Where Every Deal Stands",
          "featureId": "CRM-004",
          "successTest": "Assign role, see influence mapping, remove stakeholder",
          "state": "Live"
        },
        {
          "id": 9,
          "job": "See Where Every Deal Stands",
          "featureId": "CRM-002",
          "successTest": "Cards show correct counts. L4 verified.",
          "state": "Live"
        },
        {
          "id": 10,
          "job": "Never Let a Follow-Up Fall Through",
          "featureId": "CRM-003",
          "successTest": "Log from deal, appears on both deal and contact timelines (S4)",
          "state": "Built"
        },
        {
          "id": 11,
          "job": "Never Let a Follow-Up Fall Through",
          "featureId": "CRM-003",
          "successTest": "Page renders with tasks. Due dates visible.",
          "state": "Partial"
        },
        {
          "id": 12,
          "job": "Cross-Cutting",
          "featureId": "CRM-004",
          "successTest": "Link from either side, both detail pages show the link (S5)",
          "state": "Live"
        },
        {
          "id": 14,
          "job": "Surface Demand Evidence",
          "featureId": "CRM-004",
          "successTest": "Deal detail shows linked Demand Card with all populated fields. 'Promote to PRD' action triggers create-prd workflow. Card shows named_person + verbatim_pain_quote + kill_signal.",
          "state": "Gap"
        }
      ]
    }
  ],
  "backlog": [
    {
      "slug": "prd-protocol-coverage",
      "name": "Protocol Coverage",
      "status": "L0",
      "category": "product",
      "priorityScore": 1500,
      "intentContract": {
        "objective": "Prove every agent protocol interface is trustworthy — because untested protocol interfaces are the gap between documented architecture and deployed trust.",
        "outcomes": "1. Protocol coverage moves from 41% to 80% within 60 days. 2. Commerce Authorization Chain has passing tests at every stage. 3. Zero TESTED protocols regress to NOT STARTED.",
        "healthMetrics": "Existing 20 passing tests must not break. Auth flow (Better Auth RBAC + API Key A2A) must remain stable. A2A Discovery at L3 must not regress.",
        "constraints": "Hard: tests must hit real infrastructure — no mocking protocols. Steering: prioritize Commerce Authorization Chain (the revenue path) over Identity & Verification (the compliance path).",
        "autonomy": "Allowed: contract schema design, test spec structure, trophy layer assignment. Escalate: new external service dependencies (FIDO, Sui testnet), spending on test infrastructure. Never: modify production auth flow, change A2A discovery endpoints.",
        "stopRules": "Complete when: 80% coverage (39/49 protocols tested). Halt when: coverage hasn't moved from 41% to 60% after 60 days — contract-first approach is too slow.",
        "counterMetrics": "Existing integration test suite run time must stay under 5 minutes. Auth test reliability must stay above 99%.",
        "blastRadius": "apps/intents-e2e/ (test specs), contracts/ (Zod schemas), libs/agency/ (orchestrator patterns). No user-facing product pages affected.",
        "rollback": "Each domain is independent. Revert the specific contract + spec. Trophy layer assignment is metadata, not code. Test infrastructure can be decommissioned per-domain."
      },
      "killSignal": "After 60 days of active development, if protocol coverage has not moved from 41% to 60%, the contract-first approach is too slow. Switch to integration-test-only coverage or re-scope to Commerce Authorization Chain only.",
      "featureIds": [
        "PROT-001",
        "PROT-002",
        "PROT-003",
        "PROT-004",
        "PROT-005"
      ],
      "buildContract": [
        {
          "id": 1,
          "job": "Communication",
          "featureId": "PROT-001",
          "successTest": "Two agents coordinate a task end-to-end via JSON-RPC",
          "state": "Gap"
        },
        {
          "id": 2,
          "job": "Communication",
          "featureId": "PROT-001",
          "successTest": "Agent accesses tool via MCP and receives valid response",
          "state": "Gap"
        },
        {
          "id": 3,
          "job": "Communication",
          "featureId": "PROT-001",
          "successTest": "Query returns agents matching required capabilities",
          "state": "Gap"
        },
        {
          "id": 4,
          "job": "Commerce",
          "featureId": "PROT-002",
          "successTest": "User intent captured with cryptographic binding to agent key",
          "state": "Gap"
        },
        {
          "id": 5,
          "job": "Commerce",
          "featureId": "PROT-002",
          "successTest": "Agent action validated against 8 constraint types",
          "state": "Gap"
        },
        {
          "id": 6,
          "job": "Commerce",
          "featureId": "PROT-003",
          "successTest": "Agent A creates payment intent for Agent B with valid amount",
          "state": "Gap"
        },
        {
          "id": 7,
          "job": "Commerce",
          "featureId": "PROT-003",
          "successTest": "Budget check passes for amount within limits",
          "state": "Gap"
        },
        {
          "id": 8,
          "job": "Commerce",
          "featureId": "PROT-003",
          "successTest": "HTTP 402 triggers stablecoin payment and access granted",
          "state": "Gap"
        },
        {
          "id": 9,
          "job": "Commerce",
          "featureId": "PROT-005",
          "successTest": "Funds locked in escrow with proof-of-deposit on Sui testnet",
          "state": "Gap"
        },
        {
          "id": 10,
          "job": "Commerce",
          "featureId": "PROT-005",
          "successTest": "Agent action recorded on-chain with tamper-proof attestation",
          "state": "Gap"
        },
        {
          "id": 11,
          "job": "Measurement",
          "featureId": "PROT-004",
          "successTest": "FIDO credential proves correct human authorized the action",
          "state": "Gap"
        },
        {
          "id": 12,
          "job": "Measurement",
          "featureId": "PROT-002",
          "successTest": "High-value transaction triggers human approval before execution",
          "state": "Gap"
        },
        {
          "id": 13,
          "job": "Measurement",
          "featureId": "PROT-001",
          "successTest": "Script reads test results and outputs coverage % per domain",
          "state": "Gap"
        }
      ]
    },
    {
      "slug": "prd-workchart-bridge",
      "name": "WorkChart Bridge",
      "status": "L0",
      "category": "inner-loop",
      "priorityScore": 1500,
      "intentContract": {
        "objective": "Connect dream repo work charts to engineering repo execution engine — because a factory with blueprints that never reach the floor is a museum, not a factory.",
        "outcomes": "1. Content pipeline runs SEED and DRAFT stages via agency workflow within 1 session. 2. Work chart spine JSON is parseable by engineering pipeline runner. 3. Stage completion posts receipt to #meta via agent-comms.",
        "healthMetrics": "Existing work charts must not change format. Existing agency workflows must not break. Content pipeline manual process must remain available as fallback.",
        "constraints": "Hard: dream repo never writes TypeScript — it produces intent, engineering produces code. Steering: prefer stage-by-stage execution over monolithic workflow runs.",
        "autonomy": "Allowed: stage parsing, draft generation, receipt posting. Escalate: REVIEW stage decisions, PUBLISH actions. Never: auto-publish without human approval, modify work chart source files.",
        "stopRules": "Complete when: content pipeline SEED+DRAFT runs end-to-end via bridge. Halt when: bridge introduces latency >2x manual process.",
        "counterMetrics": "Content quality must not decrease. Voice consistency must pass existing quality gates. Manual pipeline must remain functional.",
        "blastRadius": "Content pipeline, agency lib workflows, agent-comms channels. No user-facing product pages affected directly.",
        "rollback": "Bridge is additive. Remove the workflow — manual pipeline still works. No data migration needed."
      },
      "killSignal": "",
      "featureIds": [
        "WKCH-001",
        "WKCH-002",
        "WKCH-003",
        "WKCH-004",
        "WKCH-005"
      ],
      "buildContract": [
        {
          "id": "B1",
          "job": "Spine-to-Stage Translation",
          "featureId": "WKCH-001",
          "successTest": "S2 — 7 tasks in spine produce 7 stages with correct fields",
          "state": "Gap"
        },
        {
          "id": "B2",
          "job": "Content Pipeline Automation",
          "featureId": "WKCH-002",
          "successTest": "S1 — draft file in <5min with quality gate pass",
          "state": "Gap"
        },
        {
          "id": "B3",
          "job": "Receipt and Feedback Loop",
          "featureId": "WKCH-003",
          "successTest": "S3 — receipt in #meta within 30s with all fields",
          "state": "Gap"
        },
        {
          "id": "B4",
          "job": "Human-in-the-Loop",
          "featureId": "WKCH-004",
          "successTest": "S4 — 100% pause rate on human stages",
          "state": "Gap"
        },
        {
          "id": "B5",
          "job": "Signal Loop Closure",
          "featureId": "WKCH-005",
          "successTest": "S5 — daily signal file with <24h freshness",
          "state": "Gap"
        }
      ]
    },
    {
      "slug": "prd-autoresearch-loop",
      "name": "Autoresearch Loop",
      "status": "L0",
      "category": "inner-loop",
      "priorityScore": 1200,
      "intentContract": {
        "objective": "Seven skills span pain-to-proof but none chain. Metrics aren't queryable. Every step needs a human trigger. The factory is designed but dormant.",
        "outcomes": "1. North Stars return scalars via CLI. 2. Validated outcomes propagate back to PRD frontmatter. 3. One PRD completes a full pain-to-proof cycle per month.",
        "healthMetrics": "Existing skill execution time. Comms CLI reliability. PRD frontmatter integrity.",
        "constraints": "Hard: Max 3 iterations per task before escalation. Budget cap per overnight session. No metric definition without named data source. Steering: Activation over creation. Wire existing skills before building new.",
        "autonomy": "Allowed: run tests, measure metrics, log experiments. Escalate: when metric regresses or Forbidden Outcome occurs. Never: push to production without validation.",
        "stopRules": "Complete when prd_full_cycles_per_month >= 1. Halt when any Forbidden Outcome occurs or metric regresses 2 consecutive iterations.",
        "counterMetrics": "Speed without understanding. Running loops that produce green tests but miss the actual pain. Metric gaming.",
        "blastRadius": "PRD frontmatter corruption. False commissioning. Noise in Comms channels drowning real signals.",
        "rollback": "Revert frontmatter fields. Delete session logs. Skills revert to manual trigger mode."
      },
      "killSignal": "Loop runs for 90 days with zero PRDs completing a full cycle. Or: metrics are defined but never queried.",
      "featureIds": [
        "LOOP-001",
        "LOOP-002",
        "LOOP-003",
        "LOOP-004",
        "LOOP-005"
      ],
      "buildContract": [
        {
          "id": 1,
          "job": "Metric Enforcement",
          "featureId": "LOOP-001",
          "successTest": "S1",
          "state": "Stub"
        },
        {
          "id": 2,
          "job": "Metric Enforcement",
          "featureId": "LOOP-002",
          "successTest": "S2",
          "state": "Stub"
        },
        {
          "id": 3,
          "job": "Return Signal",
          "featureId": "LOOP-003",
          "successTest": "S3",
          "state": "Stub"
        },
        {
          "id": 4,
          "job": "Return Signal",
          "featureId": "LOOP-003",
          "successTest": "S4",
          "state": "Stub"
        },
        {
          "id": 5,
          "job": "Experiment Infrastructure",
          "featureId": "LOOP-004",
          "successTest": "S5",
          "state": "Stub"
        },
        {
          "id": 6,
          "job": "Experiment Infrastructure",
          "featureId": "LOOP-005",
          "successTest": "S6",
          "state": "Stub"
        }
      ]
    },
    {
      "slug": "prd-multi-tenant-routing",
      "name": "Multi-Tenant Routing",
      "status": "L0",
      "category": "product",
      "priorityScore": 1200,
      "intentContract": {
        "objective": "Solar365 can sign in to dreamineering.com and see only their data — CRM, plans, ventures — scoped by URL-based org routing that prevents cross-tenant access.",
        "outcomes": [
          "Solar365 user signs in and lands on /org/solar365/dashboard within 3 seconds.",
          "Dreamineering user at /org/dreamineering/crm cannot access /org/solar365/crm — gets redirected to org picker.",
          "User with 2+ org memberships sees org switcher in nav and can switch without re-authentication."
        ],
        "healthMetrics": "Single-org users must not see org picker or experience redirect delays. Existing server actions must continue to resolve organisationId without modification. Login flow for single-org users must not regress.",
        "constraints": "Hard: Clerk for authentication (not replaceable). Hard: organisationId scoping on all server actions must remain unchanged. Hard: org slug must be unique and URL-safe. Steering: org context resolution should happen in layout, not middleware, to keep server component data loading simple.",
        "autonomy": "Allowed: route restructure under (app)/, new layout component for org resolution, auth adapter extension to accept org from params, org switcher component. Escalate: any change to ApplicationContext interface, any schema migration. Never: remove organisationId scoping from existing server actions, allow unauthenticated access to /org/* routes.",
        "stopRules": "Complete when: Solar365 user signs in, lands on /org/solar365/dashboard, and CRM shows only Solar365 data. Halt when: any test shows cross-tenant data leakage.",
        "counterMetrics": "Login time for single-org users must not increase by more than 200ms. Existing E2E tests must pass without modification.",
        "blastRadius": "Next.js route structure (all (app)/ routes move under (app)/org/[slug]/). Auth adapter validateContext method. Login redirect logic. AppShell nav component (org switcher addition). Old bookmarks to /dashboard etc. need redirects.",
        "rollback": "Route changes are reversible — move routes back from /org/[slug]/ to flat structure. Auth adapter change is additive — fallback to DB query if URL param missing."
      },
      "killSignal": "Solar365 signs in, creates a contact in CRM. If contact appears in Dreamineering's CRM, data isolation failed — halt everything.",
      "featureIds": [
        "USER-002",
        "AUTH-008",
        "AUTHZ-001"
      ],
      "buildContract": [
        {
          "id": "B1",
          "job": "org-routing",
          "featureId": "USER-002",
          "successTest": "S1: Solar365 user lands on /org/solar365/dashboard with correct data",
          "state": "Gap"
        },
        {
          "id": "B2",
          "job": "org-routing",
          "featureId": "AUTH-008",
          "successTest": "S1: ApplicationContext.organizationId matches URL slug's org ID",
          "state": "Gap"
        },
        {
          "id": "B3",
          "job": "org-switching",
          "featureId": "USER-002",
          "successTest": "S3: Multi-org user switches from Dreamineering to Solar365 in <2s without re-auth",
          "state": "Gap"
        },
        {
          "id": "B4",
          "job": "org-routing",
          "featureId": "AUTH-008",
          "successTest": "S5: Single-org user goes directly to /org/[slug]/dashboard. S3: Multi-org user sees picker.",
          "state": "Gap"
        },
        {
          "id": "B5",
          "job": "backwards-compat",
          "featureId": "USER-002",
          "successTest": "S4: All existing (app)/ routes redirect to org-scoped equivalents",
          "state": "Gap"
        }
      ]
    },
    {
      "slug": "prd-walked-depin-product",
      "name": "Walked DePIN Product",
      "status": "L0",
      "category": "product",
      "priorityScore": 1200,
      "intentContract": {
        "objective": "Prove the walked-object pattern works. One jar of manuka honey, registered at the hive, tested at the lab, split at the processor, transferred through export, scanned at the shelf. Every transfer a signed event. Every split atomic.",
        "outcomes": "1. One full-custody jar walked end to end on testnet in 30 days. 2. Operator onboarding under 10 CLI commands. 3. Scan-to-proof latency under 3 seconds.",
        "healthMetrics": "Existing apps unaffected. Sponsored transaction success rate above 99%. zkLogin flow completes in under 15 seconds.",
        "constraints": "Hard: Testnet only for V1. Steering: Manuka honey first, other units later. Budget: under $50/month infrastructure on testnet.",
        "autonomy": "Allowed: Move module internal structure, UI layout, CLI command shape. Escalate: Lab attestation partner selection, mainnet migration. Never: Mainnet deployment without audit, real operator data without consent.",
        "stopRules": "Complete when: all Build Contract rows at Live + one walked jar with full custody chain visible via QR scan. Halt when: operator onboarding exceeds 10 CLI commands, or scan latency exceeds 3 seconds, or zero walked jars after 30 days.",
        "counterMetrics": "Operator registration must not become a single point of failure — if one operator drops, others keep walking. Sponsored transactions must not create unbounded liability — cap per-operator daily gas spend.",
        "blastRadius": "New Move package on testnet. New Next.js app in NX monorepo. New NX libs for Sui object walking. Does NOT touch existing apps, Supabase, or Convex services.",
        "rollback": "Testnet contracts are disposable — redeploy to rollback. Frontend is a new app — delete the app to rollback. No shared state at risk."
      },
      "killSignal": "Zero walked jars on testnet after 30 days, OR operator registration requires more than 10 CLI commands, OR scan latency exceeds 3 seconds. Kill date: 2026-05-13.",
      "featureIds": [
        "WCAP-007",
        "WCAP-008",
        "WCAP-011",
        "WCAP-019",
        "WCAP-020"
      ],
      "buildContract": [
        {
          "id": 1,
          "job": "Register Source",
          "featureId": "WCAP-007",
          "successTest": "Hive object created on-chain with GPS, operator key, registration timestamp (S1)",
          "state": "Gap"
        },
        {
          "id": 2,
          "job": "Register Source",
          "featureId": "WCAP-008",
          "successTest": "Harvest event signed by operator key, linked to hive, weight and date recorded",
          "state": "Gap"
        },
        {
          "id": 3,
          "job": "Register Source",
          "featureId": "WCAP-008",
          "successTest": "Batch object references all harvest events. Total weight matches sum of harvests.",
          "state": "Gap"
        },
        {
          "id": 4,
          "job": "Attest Quality",
          "featureId": "WCAP-019",
          "successTest": "Lab attestation appears on batch object signed by lab key (S2)",
          "state": "Gap"
        },
        {
          "id": 5,
          "job": "Split Atomically",
          "featureId": "WCAP-019",
          "successTest": "Single PTB: consume batch + create N jar objects + link each to batch (S3)",
          "state": "Gap"
        },
        {
          "id": 6,
          "job": "Transfer Custody",
          "featureId": "WCAP-020",
          "successTest": "Transfer creates signed event. New owner visible on object. History retained.",
          "state": "Gap"
        },
        {
          "id": 7,
          "job": "Prove at Shelf",
          "featureId": "WCAP-011",
          "successTest": "QR scan returns full chain in under 3 seconds, no login required (S4)",
          "state": "Gap"
        },
        {
          "id": 8,
          "job": "Prove at Shelf",
          "featureId": "WCAP-011",
          "successTest": "Backward walk returns every prior owner, attestation, and event in under 2 seconds (S5)",
          "state": "Gap"
        },
        {
          "id": 9,
          "job": "Onboard Operators",
          "featureId": "WCAP-007",
          "successTest": "All operator transactions gas-free. Platform co-signs.",
          "state": "Gap"
        }
      ]
    },
    {
      "slug": "prd-prediction-game-sui",
      "name": "Prediction Game (Sui)",
      "status": "L0",
      "category": "product",
      "priorityScore": 900,
      "intentContract": {
        "objective": "Prove the Sui settlement stack works by shipping a prediction game where every capability an agent needs — atomic settlement, gasless onboarding, oracle data, owned assets — executes in a single product.",
        "outcomes": "1. 50+ predictions settled atomically on testnet in 30 days. 2. Zero users required to install a wallet extension. 3. Settlement completes in single PTB.",
        "healthMetrics": "Existing Supabase services must not degrade. Oracle uptime >95%. Sponsored tx success rate >99%.",
        "constraints": "Hard: Testnet only for V1. Steering: Rugby fixtures first, other sports later. Budget: <$50/month infrastructure on testnet.",
        "autonomy": "Allowed: UI layout, component choice, Move module internal structure. Escalate: Oracle data source selection, mainnet migration. Never: Mainnet deployment without audit, real-money staking without legal review.",
        "stopRules": "Complete when: all Build Contract rows at Live + 50 predictions settled. Halt when: PTB settlement requires >1 tx, or zero predictions after 30 days.",
        "counterMetrics": "Oracle must not become a single point of failure — if one operator goes offline, settlement must continue via fallback. Sponsored transactions must not create unbounded liability — cap per-user daily gas spend.",
        "blastRadius": "New Move packages on testnet. New Next.js app in NX monorepo. New NX libs for Sui integration. Does NOT touch existing apps, Supabase, or Convex services.",
        "rollback": "Testnet contracts are disposable — redeploy to rollback. Frontend is a new app — delete the app to rollback. No shared state at risk."
      },
      "killSignal": "Zero predictions on testnet after 30 days of deployment, OR PTB settlement requires more than one transaction. Either means the thesis is wrong for this use case. Kill date: 2026-06-30.",
      "featureIds": [
        "WCAP-007",
        "WCAP-008",
        "WCAP-011",
        "WCAP-019",
        "WCAP-020"
      ],
      "buildContract": [
        {
          "id": 1,
          "job": "Find and Pick",
          "featureId": "WCAP-007",
          "successTest": "Page loads <2s, shows 5+ fixtures sorted by kickoff (S1)",
          "state": "Gap"
        },
        {
          "id": 2,
          "job": "Find and Pick",
          "featureId": "WCAP-007",
          "successTest": "Filters reduce list correctly, URL params persist",
          "state": "Gap"
        },
        {
          "id": 3,
          "job": "Find and Pick",
          "featureId": "WCAP-008",
          "successTest": "Shows teams, odds, pool distribution, prediction count",
          "state": "Gap"
        },
        {
          "id": 4,
          "job": "Find and Pick",
          "featureId": "WCAP-008",
          "successTest": "Prediction object created on-chain, receipt minted (S2)",
          "state": "Gap"
        },
        {
          "id": 5,
          "job": "Settle Atomically",
          "featureId": "WCAP-019",
          "successTest": "OracleResult created as hot potato, consumed in same PTB (S3)",
          "state": "Gap"
        },
        {
          "id": 6,
          "job": "Settle Atomically",
          "featureId": "WCAP-019",
          "successTest": "Single PTB: consume oracle result + calculate payouts + distribute (S3)",
          "state": "Gap"
        },
        {
          "id": 7,
          "job": "Settle Atomically",
          "featureId": "WCAP-020",
          "successTest": "Winners receive (user_stake / winning_pool) * total_pool",
          "state": "Gap"
        },
        {
          "id": 8,
          "job": "Settle Atomically",
          "featureId": "WCAP-019",
          "successTest": "All predictions transition from pending to won/lost (S3)",
          "state": "Gap"
        },
        {
          "id": 9,
          "job": "Settle Atomically",
          "featureId": "WCAP-020",
          "successTest": "Receipt shows current status (pending/won/lost/claimed)",
          "state": "Gap"
        },
        {
          "id": 10,
          "job": "Track Record",
          "featureId": "WCAP-011",
          "successTest": "Shows all user predictions with status, stake, payout (S4)",
          "state": "Gap"
        },
        {
          "id": 11,
          "job": "Track Record",
          "featureId": "WCAP-011",
          "successTest": "Shows full prediction metadata: fixture, outcome, stake, result, payout",
          "state": "Gap"
        },
        {
          "id": 12,
          "job": "Track Record",
          "featureId": "WCAP-011",
          "successTest": "Ranked by win rate with minimum prediction count",
          "state": "Gap"
        },
        {
          "id": 13,
          "job": "Track Record",
          "featureId": "WCAP-011",
          "successTest": "Win rate, total staked, total won, streak",
          "state": "Gap"
        },
        {
          "id": 14,
          "job": "Onboard Frictionlessly",
          "featureId": "WCAP-008",
          "successTest": "User signs in with Google/Apple, gets Sui address",
          "state": "Gap"
        },
        {
          "id": 15,
          "job": "Onboard Frictionlessly",
          "featureId": "WCAP-007",
          "successTest": "All user PTBs gas-free. Platform co-signs.",
          "state": "Gap"
        },
        {
          "id": 16,
          "job": "Onboard Frictionlessly",
          "featureId": "WCAP-008",
          "successTest": "New user: browse → pick → authenticate → predict in <60s",
          "state": "Gap"
        },
        {
          "id": 17,
          "job": "Onboard Frictionlessly",
          "featureId": "WCAP-007",
          "successTest": "Users with existing Sui wallets can connect directly",
          "state": "Gap"
        },
        {
          "id": 18,
          "job": "Onboard Frictionlessly",
          "featureId": "WCAP-019",
          "successTest": "Admin can trigger manual settlement after timeout (S5)",
          "state": "Gap"
        }
      ]
    },
    {
      "slug": "prd-time-mind",
      "name": "Time + Mind",
      "status": "L0",
      "category": "product",
      "priorityScore": 768,
      "intentContract": {
        "objective": "Dual-layer calendar that closes the gap between intention and attention — business hats theme the blocks, the weekly score tells you if reality matched the plan.",
        "outcomes": "1. Alignment score computes from plan-cli timestamps without self-report. 2. Sunday planning takes <30 min with template import. 3. Alignment trends up over 4 weeks.",
        "healthMetrics": "No manual logging friction (reality captured automatically). Sunday planning doesn't become a chore (retention >60% at week 4). Score computation <5s.",
        "constraints": "Hard: Reality captured from plan-cli + commit history — no self-report. Steering: Solo-first — one person, one week before social features.",
        "autonomy": "Allowed: UI layout, visualization choices, archetype color scheme. Escalate: New archetype definitions, scoring formula changes. Never: Fabricate alignment data, auto-plan without user confirmation.",
        "stopRules": "Complete when: 4 consecutive weeks of alignment scoring with trending data. Halt when: user stops returning for Sunday planning after week 3.",
        "counterMetrics": "Planning time must not increase week-over-week. Review must not exceed 15 min. The instrument must not create more admin than it eliminates.",
        "blastRadius": "Low. Calendar is additive — no existing feature changes. If alignment score is wrong, user sees bad data but nothing breaks. If template import fails, user plans manually (current state).",
        "rollback": "Feature flag OFF removes Calendar from sidebar. Time block data persists in DB but is invisible. Plan-cli continues unaffected. Zero data loss on rollback."
      },
      "killSignal": "If the user stops returning for Sunday planning after week 3, the instrument is a chore, not a tool. If alignment score doesn't trend up over 4 weeks, seeing the gap doesn't change behavior. Kill date: 2026-06-24.",
      "featureIds": [
        "PROJ-010",
        "PROJ-011",
        "PROJ-012",
        "PROJ-014",
        "PROJ-016"
      ],
      "buildContract": [
        {
          "id": 1,
          "job": "Score and Learn",
          "featureId": "PROJ-014",
          "successTest": "Score = overlap_minutes / total_planned * 100; no self-report; trends visible (S5)",
          "state": "Gap"
        },
        {
          "id": 2,
          "job": "Plan the Week",
          "featureId": "PROJ-010",
          "successTest": "Two layers visible; blocks independently editable per layer (S3)",
          "state": "Built"
        },
        {
          "id": 3,
          "job": "Plan the Week",
          "featureId": "PROJ-012",
          "successTest": "Import populates DREAM layer with archetype-tagged blocks in <30s (S2)",
          "state": "Built"
        },
        {
          "id": 4,
          "job": "Plan the Week",
          "featureId": "PROJ-011",
          "successTest": "Each block shows archetype tag with distinct color; filter by archetype",
          "state": "Built"
        },
        {
          "id": 5,
          "job": "Capture Reality",
          "featureId": "PROJ-010",
          "successTest": "REALITY layer populates from DB; manual log only for meetings (S4)",
          "state": "Gap"
        },
        {
          "id": 6,
          "job": "Capture Reality",
          "featureId": "PROJ-016",
          "successTest": "Context loading completes in <90s; shows task slug + file path + first action (S7)",
          "state": "Gap"
        },
        {
          "id": 7,
          "job": "Plan the Week",
          "featureId": "PROJ-010",
          "successTest": "Category visible on each block; weekly summary shows % per category",
          "state": "Built"
        },
        {
          "id": 8,
          "job": "Score and Learn",
          "featureId": "PROJ-014",
          "successTest": "Side-by-side overlay renders; alignment % computed; review <15 min (S5)",
          "state": "Gap"
        },
        {
          "id": 9,
          "job": "Connect Modes",
          "featureId": "PROJ-011",
          "successTest": "Block shows blend ratio; actual blend logged",
          "state": "Gap"
        },
        {
          "id": 10,
          "job": "Score and Learn",
          "featureId": "PROJ-014",
          "successTest": "Yield = artifacts / hours from task completions + sessions; 4-week trend (S5)",
          "state": "Gap"
        },
        {
          "id": 11,
          "job": "Capture Reality",
          "featureId": "PROJ-011",
          "successTest": "Editing .claude/ during Engineer block triggers drift alert within 5 min",
          "state": "Gap"
        },
        {
          "id": 12,
          "job": "Score and Learn",
          "featureId": "PROJ-014",
          "successTest": "Peak hours tracked; % per bet visible; weekly comparison",
          "state": "Gap"
        },
        {
          "id": 13,
          "job": "Connect Modes",
          "featureId": "PROJ-014",
          "successTest": "Manual weekly score; 4-week trend; correlated with alignment",
          "state": "Gap"
        }
      ]
    }
  ],
  "proven": []
}