Mock Data Layer (MSW)

Complete MSW v2 handlers and realistic mock data fixtures for a Drone Flight Controller (DFC-v2.1) project at DVT preparation stage.

Table of contents

  1. MSW Browser Setup
    1. src/mocks/mock-server.ts
    2. Conditional Initialization in src/main.tsx
  2. Handler Barrel Export
    1. src/mocks/handlers/index.ts
  3. Request Handlers
    1. src/mocks/handlers/sessions.ts
    2. src/mocks/handlers/agents.ts
    3. src/mocks/handlers/health.ts
    4. src/mocks/handlers/bom.ts
    5. src/mocks/handlers/compliance.ts
    6. src/mocks/handlers/digital-thread.ts
    7. src/mocks/handlers/supply-chain.ts
    8. src/mocks/handlers/approvals.ts
    9. src/mocks/handlers/artifacts.ts
  4. Mock Data Fixtures
    1. src/mocks/data/sessions.json
    2. src/mocks/data/agents.json
    3. src/mocks/data/bom.json
    4. src/mocks/data/bom-risk.json
    5. src/mocks/data/compliance.json
    6. src/mocks/data/digital-thread.json
    7. src/mocks/data/supply-chain.json
    8. src/mocks/data/approvals.json
    9. src/mocks/data/artifacts.json
    10. src/mocks/data/health.json
    11. src/mocks/data/gate-readiness.json
    12. src/mocks/data/testing.json
    13. src/mocks/data/websocket-events.json

MSW Browser Setup

src/mocks/mock-server.ts

Initializes the MSW service worker for browser-based request interception.

import { setupWorker } from 'msw/browser';
import { handlers } from './handlers';

export const worker = setupWorker(...handlers);

Conditional Initialization in src/main.tsx

The mock layer is only loaded when the VITE_MOCK_API environment variable is set. This keeps the MSW dependency out of production bundles entirely via dynamic import.

import React from 'react';
import ReactDOM from 'react-dom/client';
import { App } from './App';
import './index.css';

async function enableMocking() {
  if (import.meta.env.VITE_MOCK_API !== 'true') return;
  const { worker } = await import('./mocks/mock-server');
  return worker.start({ onUnhandledRequest: 'bypass' });
}

enableMocking().then(() => {
  ReactDOM.createRoot(document.getElementById('root')!).render(
    <React.StrictMode>
      <App />
    </React.StrictMode>,
  );
});

Handler Barrel Export

src/mocks/handlers/index.ts

Combines all domain-specific handler arrays into a single flat list for the worker.

import { sessionHandlers } from './sessions';
import { agentHandlers } from './agents';
import { healthHandlers } from './health';
import { bomHandlers } from './bom';
import { complianceHandlers } from './compliance';
import { digitalThreadHandlers } from './digital-thread';
import { supplyChainHandlers } from './supply-chain';
import { approvalHandlers } from './approvals';
import { artifactHandlers } from './artifacts';

export const handlers = [
  ...sessionHandlers,
  ...agentHandlers,
  ...healthHandlers,
  ...bomHandlers,
  ...complianceHandlers,
  ...digitalThreadHandlers,
  ...supplyChainHandlers,
  ...approvalHandlers,
  ...artifactHandlers,
];

Request Handlers

src/mocks/handlers/sessions.ts

import { http, HttpResponse, delay } from 'msw';
import sessionsData from '../data/sessions.json';
import type { Session } from '@/types/session';

const sessions: Session[] = sessionsData.sessions;

export const sessionHandlers = [
  // GET /api/v1/sessions — paginated session list
  http.get('/api/v1/sessions', async ({ request }) => {
    await delay(120);
    const url = new URL(request.url);
    const limit = Number(url.searchParams.get('limit') ?? 50);
    const offset = Number(url.searchParams.get('offset') ?? 0);
    const status = url.searchParams.get('status');

    let filtered = sessions;
    if (status) {
      filtered = sessions.filter((s) => s.status === status);
    }

    const page = filtered.slice(offset, offset + limit);

    return HttpResponse.json({
      sessions: page,
      total: filtered.length,
      limit,
      offset,
    });
  }),

  // GET /api/v1/session/:id — single session
  http.get('/api/v1/session/:id', async ({ params }) => {
    await delay(80);
    const session = sessions.find((s) => s.id === params.id);
    if (!session) {
      return HttpResponse.json(
        { error: { code: 'NOT_FOUND', message: `Session ${params.id} not found` } },
        { status: 404 },
      );
    }
    return HttpResponse.json(session);
  }),

  // POST /api/v1/session/create — create new session
  http.post('/api/v1/session/create', async ({ request }) => {
    await delay(200);
    const body = (await request.json()) as { skill: string; input?: Record<string, unknown> };
    const newSession: Session = {
      id: `ses-${String(sessions.length + 1).padStart(3, '0')}`,
      skill: body.skill,
      status: 'created',
      agent: body.skill,
      title: `New ${body.skill} session`,
      created: new Date().toISOString(),
      updated: new Date().toISOString(),
      trace: [],
      artifacts: [],
    };
    sessions.push(newSession);
    return HttpResponse.json(newSession, { status: 201 });
  }),

  // DELETE /api/v1/session/:id — delete session
  http.delete('/api/v1/session/:id', async ({ params }) => {
    await delay(100);
    const idx = sessions.findIndex((s) => s.id === params.id);
    if (idx === -1) {
      return HttpResponse.json(
        { error: { code: 'NOT_FOUND', message: `Session ${params.id} not found` } },
        { status: 404 },
      );
    }
    sessions.splice(idx, 1);
    return new HttpResponse(null, { status: 204 });
  }),
];

src/mocks/handlers/agents.ts

import { http, HttpResponse, delay } from 'msw';
import agentsData from '../data/agents.json';
import type { Agent } from '@/types/agent';

const agents: Agent[] = agentsData.agents;

export const agentHandlers = [
  // GET /api/v1/agents — all registered agents
  http.get('/api/v1/agents', async () => {
    await delay(100);
    return HttpResponse.json({ agents });
  }),

  // GET /api/v1/agent/:id/status — single agent status
  http.get('/api/v1/agent/:id/status', async ({ params }) => {
    await delay(80);
    const agent = agents.find((a) => a.id === params.id);
    if (!agent) {
      return HttpResponse.json(
        { error: { code: 'NOT_FOUND', message: `Agent ${params.id} not found` } },
        { status: 404 },
      );
    }
    return HttpResponse.json(agent);
  }),
];

src/mocks/handlers/health.ts

import { http, HttpResponse, delay } from 'msw';
import healthData from '../data/health.json';
import agentsData from '../data/agents.json';

export const healthHandlers = [
  // GET /api/v1/health — lightweight liveness probe
  http.get('/api/v1/health', async () => {
    await delay(50);
    return HttpResponse.json(healthData);
  }),

  // GET /api/v1/status — full system status
  http.get('/api/v1/status', async () => {
    await delay(100);
    return HttpResponse.json({
      version: '0.1.0',
      workspace: '/workspace/dfc-v2.1',
      sessions: { active: 2, pending: 1, completed: 5 },
      tools: healthData.components.tools,
      agents: agentsData.agents.map((a) => ({
        name: a.name,
        version: '1.0.0',
        loaded: true,
      })),
    });
  }),
];

src/mocks/handlers/bom.ts

import { http, HttpResponse, delay } from 'msw';
import bomData from '../data/bom.json';
import bomRiskData from '../data/bom-risk.json';

export const bomHandlers = [
  // GET /api/v1/bom — full bill of materials
  http.get('/api/v1/bom', async () => {
    await delay(150);
    return HttpResponse.json({ items: bomData.items });
  }),

  // GET /api/v1/bom/risk — aggregated risk summary
  http.get('/api/v1/bom/risk', async () => {
    await delay(100);
    return HttpResponse.json(bomRiskData);
  }),
];

src/mocks/handlers/compliance.ts

import { http, HttpResponse, delay } from 'msw';
import complianceData from '../data/compliance.json';

export const complianceHandlers = [
  // GET /api/v1/compliance/:market — compliance status per market
  http.get('/api/v1/compliance/:market', async ({ params }) => {
    await delay(120);
    const market = (params.market as string).toUpperCase();
    const data = complianceData.markets.find((m) => m.market === market);
    if (!data) {
      return HttpResponse.json(
        { error: { code: 'NOT_FOUND', message: `Market ${market} not found` } },
        { status: 404 },
      );
    }
    return HttpResponse.json(data);
  }),
];

src/mocks/handlers/digital-thread.ts

import { http, HttpResponse, delay } from 'msw';
import threadData from '../data/digital-thread.json';

export const digitalThreadHandlers = [
  // GET /api/v1/digital-thread — full graph
  http.get('/api/v1/digital-thread', async () => {
    await delay(200);
    return HttpResponse.json(threadData);
  }),

  // GET /api/v1/digital-thread/trace/:reqId — filtered subgraph
  http.get('/api/v1/digital-thread/trace/:reqId', async ({ params }) => {
    await delay(150);
    const reqId = params.reqId as string;

    // Filter to nodes reachable from the given requirement
    const reachable = new Set<string>([reqId]);
    let changed = true;
    while (changed) {
      changed = false;
      for (const edge of threadData.edges) {
        if (reachable.has(edge.source) && !reachable.has(edge.target)) {
          reachable.add(edge.target);
          changed = true;
        }
      }
    }

    const nodes = threadData.nodes.filter((n) => reachable.has(n.id));
    const edges = threadData.edges.filter(
      (e) => reachable.has(e.source) && reachable.has(e.target),
    );

    return HttpResponse.json({ nodes, edges });
  }),
];

src/mocks/handlers/supply-chain.ts

import { http, HttpResponse, delay } from 'msw';
import supplyChainData from '../data/supply-chain.json';

export const supplyChainHandlers = [
  // GET /api/v1/supply-chain/risks — supply chain risk items
  http.get('/api/v1/supply-chain/risks', async () => {
    await delay(130);
    return HttpResponse.json({ risks: supplyChainData.risks });
  }),
];

src/mocks/handlers/approvals.ts

import { http, HttpResponse, delay } from 'msw';
import approvalsData from '../data/approvals.json';
import type { Approval } from '@/types/approval';

const pending: Approval[] = [...approvalsData.pending];

export const approvalHandlers = [
  // GET /api/v1/pending — all pending approvals
  http.get('/api/v1/pending', async () => {
    await delay(100);
    return HttpResponse.json({ pending });
  }),

  // POST /api/v1/approve/:session — approve a session
  http.post('/api/v1/approve/:session', async ({ params }) => {
    await delay(200);
    const idx = pending.findIndex((a) => a.sessionId === params.session);
    if (idx !== -1) pending.splice(idx, 1);
    return HttpResponse.json({
      session_id: params.session,
      status: 'approved',
      applied: true,
    });
  }),

  // POST /api/v1/reject/:session — reject a session
  http.post('/api/v1/reject/:session', async ({ params, request }) => {
    await delay(200);
    const body = (await request.json()) as { reason: string };
    const idx = pending.findIndex((a) => a.sessionId === params.session);
    if (idx !== -1) pending.splice(idx, 1);
    return HttpResponse.json({
      session_id: params.session,
      status: 'rejected',
      reason: body.reason,
    });
  }),
];

src/mocks/handlers/artifacts.ts

import { http, HttpResponse, delay } from 'msw';
import artifactsData from '../data/artifacts.json';
import gateReadinessData from '../data/gate-readiness.json';
import testingData from '../data/testing.json';
import type { Artifact } from '@/types/artifact';

const artifacts: Artifact[] = artifactsData.artifacts;

export const artifactHandlers = [
  // GET /api/v1/artifacts/:id — artifact metadata
  http.get('/api/v1/artifacts/:id', async ({ params }) => {
    await delay(80);
    const artifact = artifacts.find((a) => a.id === params.id);
    if (!artifact) {
      return HttpResponse.json(
        { error: { code: 'NOT_FOUND', message: `Artifact ${params.id} not found` } },
        { status: 404 },
      );
    }
    return HttpResponse.json(artifact);
  }),

  // GET /api/v1/artifacts/:id/gltf — mock binary blob for 3D models
  http.get('/api/v1/artifacts/:id/gltf', async () => {
    await delay(300);
    // Return a minimal valid glTF 2.0 binary stub (GLB magic + header)
    const header = new ArrayBuffer(12);
    const view = new DataView(header);
    view.setUint32(0, 0x46546C67, false); // magic: glTF
    view.setUint32(4, 2, true);            // version: 2
    view.setUint32(8, 12, true);           // length: 12 (header only)
    return HttpResponse.arrayBuffer(header, {
      headers: { 'Content-Type': 'model/gltf-binary' },
    });
  }),

  // GET /api/v1/gate-readiness/:gate — gate readiness score
  http.get('/api/v1/gate-readiness/:gate', async ({ params }) => {
    await delay(100);
    const gate = (params.gate as string).toUpperCase();
    const data = gateReadinessData.gates.find((g) => g.gate === gate);
    if (!data) {
      return HttpResponse.json(
        { error: { code: 'NOT_FOUND', message: `Gate ${gate} not found` } },
        { status: 404 },
      );
    }
    return HttpResponse.json(data);
  }),

  // GET /api/v1/testing/coverage — test coverage data
  http.get('/api/v1/testing/coverage', async () => {
    await delay(120);
    return HttpResponse.json(testingData);
  }),
];

Mock Data Fixtures

All fixtures represent the Drone Flight Controller DFC-v2.1 project at DVT preparation stage.


src/mocks/data/sessions.json

Eight sessions representing a full development workflow from requirements through supply chain analysis.

{
  "sessions": [
    {
      "id": "ses-001",
      "skill": "requirements",
      "agent": "REQ",
      "title": "Requirements Extraction",
      "status": "completed",
      "created": "2025-01-15T09:00:00Z",
      "updated": "2025-01-15T09:12:34Z",
      "trace": [
        {
          "timestamp": "2025-01-15T09:00:01Z",
          "agent": "REQ",
          "action": "parse_prd",
          "message": "Parsing product requirements document...",
          "duration": 4200
        },
        {
          "timestamp": "2025-01-15T09:04:12Z",
          "agent": "REQ",
          "action": "extract_constraints",
          "message": "Extracting electrical and mechanical constraints...",
          "duration": 3800
        },
        {
          "timestamp": "2025-01-15T09:08:01Z",
          "agent": "REQ",
          "action": "generate_matrix",
          "message": "Generating requirements traceability matrix...",
          "duration": 2100
        },
        {
          "timestamp": "2025-01-15T09:11:32Z",
          "agent": "REQ",
          "action": "validate",
          "message": "Validating completeness — 42 requirements identified",
          "duration": 1020
        }
      ],
      "artifacts": [
        { "id": "art-001", "path": "constraints.json", "type": "file", "size": 8432 },
        { "id": "art-002", "path": "requirements_matrix.csv", "type": "file", "size": 12840 },
        { "id": "art-003", "path": "prd_summary.md", "type": "file", "size": 3200 }
      ]
    },
    {
      "id": "ses-002",
      "skill": "architecture",
      "agent": "SYS",
      "title": "System Architecture",
      "status": "completed",
      "created": "2025-01-16T10:00:00Z",
      "updated": "2025-01-16T10:22:15Z",
      "trace": [
        {
          "timestamp": "2025-01-16T10:00:02Z",
          "agent": "SYS",
          "action": "analyze_requirements",
          "message": "Analyzing 42 requirements for subsystem decomposition...",
          "duration": 5100
        },
        {
          "timestamp": "2025-01-16T10:05:12Z",
          "agent": "SYS",
          "action": "define_subsystems",
          "message": "Defining 6 subsystems: Power, Sensors, Comms, Motor Control, Flight Controller, Enclosure",
          "duration": 6200
        },
        {
          "timestamp": "2025-01-16T10:15:24Z",
          "agent": "SYS",
          "action": "generate_block_diagram",
          "message": "Generating system block diagram in Mermaid format...",
          "duration": 3400
        },
        {
          "timestamp": "2025-01-16T10:20:45Z",
          "agent": "SYS",
          "action": "validate_interfaces",
          "message": "Validating inter-subsystem interfaces — all 14 interfaces defined",
          "duration": 1500
        }
      ],
      "artifacts": [
        { "id": "art-004", "path": "architecture.md", "type": "file", "size": 18200 },
        { "id": "art-005", "path": "block_diagram.mermaid", "type": "file", "size": 4100 },
        { "id": "art-006", "path": "interface_spec.json", "type": "file", "size": 9600 }
      ]
    },
    {
      "id": "ses-003",
      "skill": "electronics",
      "agent": "EE",
      "title": "Schematic Review & DRC",
      "status": "completed",
      "created": "2025-01-18T08:30:00Z",
      "updated": "2025-01-18T09:15:42Z",
      "trace": [
        {
          "timestamp": "2025-01-18T08:30:02Z",
          "agent": "EE",
          "action": "load_schematic",
          "message": "Loading KiCad schematic (6 sheets, 312 components)...",
          "duration": 2800
        },
        {
          "timestamp": "2025-01-18T08:34:50Z",
          "agent": "EE",
          "action": "run_erc",
          "message": "Running Electrical Rules Check — 3 warnings, 0 errors",
          "duration": 8400
        },
        {
          "timestamp": "2025-01-18T08:48:52Z",
          "agent": "EE",
          "action": "run_drc",
          "message": "Running Design Rules Check — 1 warning (trace clearance on U3 pad 12), 0 errors",
          "duration": 12200
        },
        {
          "timestamp": "2025-01-18T09:09:04Z",
          "agent": "EE",
          "action": "export_bom",
          "message": "Exporting BOM — 45 unique components, 312 total placements",
          "duration": 3100
        },
        {
          "timestamp": "2025-01-18T09:14:15Z",
          "agent": "EE",
          "action": "generate_report",
          "message": "Generating DRC report with annotated schematic references",
          "duration": 1270
        }
      ],
      "artifacts": [
        { "id": "art-007", "path": "board.kicad_sch", "type": "file", "size": 245000 },
        { "id": "art-008", "path": "drc_report.json", "type": "file", "size": 6200 },
        { "id": "art-009", "path": "bom.csv", "type": "file", "size": 14800 }
      ]
    },
    {
      "id": "ses-004",
      "skill": "firmware",
      "agent": "FW",
      "title": "Firmware Scaffold Generation",
      "status": "completed",
      "created": "2025-01-20T11:00:00Z",
      "updated": "2025-01-20T11:34:22Z",
      "trace": [
        {
          "timestamp": "2025-01-20T11:00:01Z",
          "agent": "FW",
          "action": "analyze_architecture",
          "message": "Analyzing system architecture for firmware requirements...",
          "duration": 3200
        },
        {
          "timestamp": "2025-01-20T11:05:22Z",
          "agent": "FW",
          "action": "generate_hal",
          "message": "Generating HAL layer for STM32H743 (SPI, I2C, UART, PWM, ADC)...",
          "duration": 8500
        },
        {
          "timestamp": "2025-01-20T11:19:43Z",
          "agent": "FW",
          "action": "generate_drivers",
          "message": "Generating sensor drivers (BMI270, BMP390, MMC5983MA)...",
          "duration": 6400
        },
        {
          "timestamp": "2025-01-20T11:30:04Z",
          "agent": "FW",
          "action": "generate_cmake",
          "message": "Generating CMakeLists.txt and build configuration",
          "duration": 2200
        },
        {
          "timestamp": "2025-01-20T11:33:25Z",
          "agent": "FW",
          "action": "validate_build",
          "message": "Validating build configuration — cmake configure passed",
          "duration": 970
        }
      ],
      "artifacts": [
        { "id": "art-010", "path": "firmware/src/main.c", "type": "file", "size": 4200 },
        { "id": "art-011", "path": "firmware/CMakeLists.txt", "type": "file", "size": 2800 },
        { "id": "art-012", "path": "firmware/src/hal/", "type": "directory", "size": 28400 }
      ]
    },
    {
      "id": "ses-005",
      "skill": "simulation",
      "agent": "SIM",
      "title": "Power Rail SPICE Simulation",
      "status": "completed",
      "created": "2025-01-22T14:00:00Z",
      "updated": "2025-01-22T14:45:18Z",
      "trace": [
        {
          "timestamp": "2025-01-22T14:00:02Z",
          "agent": "SIM",
          "action": "extract_netlist",
          "message": "Extracting SPICE netlist from power subsystem...",
          "duration": 4600
        },
        {
          "timestamp": "2025-01-22T14:07:42Z",
          "agent": "SIM",
          "action": "run_dc_analysis",
          "message": "Running DC operating point analysis — all rails within spec",
          "duration": 8200
        },
        {
          "timestamp": "2025-01-22T14:21:24Z",
          "agent": "SIM",
          "action": "run_transient",
          "message": "Running transient analysis (motor startup surge, 0-100ms)...",
          "duration": 12400
        },
        {
          "timestamp": "2025-01-22T14:42:05Z",
          "agent": "SIM",
          "action": "generate_report",
          "message": "Generating simulation report — 3.3V rail ripple: 18mV (spec: <50mV), PASS",
          "duration": 3130
        }
      ],
      "artifacts": [
        { "id": "art-013", "path": "spice_results.json", "type": "file", "size": 52400 },
        { "id": "art-014", "path": "power_analysis.pdf", "type": "file", "size": 184000 },
        { "id": "art-015", "path": "transient_waveforms.csv", "type": "file", "size": 96200 }
      ]
    },
    {
      "id": "ses-006",
      "skill": "testing",
      "agent": "TST",
      "title": "DVT Test Plan Generation",
      "status": "pending_approval",
      "created": "2025-01-24T09:00:00Z",
      "updated": "2025-01-24T09:38:50Z",
      "trace": [
        {
          "timestamp": "2025-01-24T09:00:01Z",
          "agent": "TST",
          "action": "analyze_requirements",
          "message": "Mapping 42 requirements to test procedures...",
          "duration": 5400
        },
        {
          "timestamp": "2025-01-24T09:09:01Z",
          "agent": "TST",
          "action": "generate_test_cases",
          "message": "Generating 45 test cases across 6 categories...",
          "duration": 12200
        },
        {
          "timestamp": "2025-01-24T09:29:22Z",
          "agent": "TST",
          "action": "generate_fmea",
          "message": "Generating FMEA table — 12 failure modes identified",
          "duration": 7800
        },
        {
          "timestamp": "2025-01-24T09:37:43Z",
          "agent": "TST",
          "action": "compile_plan",
          "message": "Compiling DVT test plan document — awaiting approval",
          "duration": 1070
        }
      ],
      "artifacts": [
        { "id": "art-016", "path": "test_plan.md", "type": "file", "size": 34200 },
        { "id": "art-017", "path": "fmea_table.csv", "type": "file", "size": 8400 }
      ]
    },
    {
      "id": "ses-007",
      "skill": "manufacturing",
      "agent": "MFG",
      "title": "DFM Analysis & Gerber Export",
      "status": "running",
      "created": "2025-01-25T08:00:00Z",
      "updated": "2025-01-25T08:14:30Z",
      "trace": [
        {
          "timestamp": "2025-01-25T08:00:02Z",
          "agent": "MFG",
          "action": "load_pcb",
          "message": "Loading PCB layout for DFM analysis...",
          "duration": 3200
        },
        {
          "timestamp": "2025-01-25T08:05:22Z",
          "agent": "MFG",
          "action": "run_dfm_checks",
          "message": "Running DFM checks — 2 advisories (via-in-pad on U1, tight courtyard on J3)",
          "duration": 6800
        },
        {
          "timestamp": "2025-01-25T08:12:10Z",
          "agent": "MFG",
          "action": "generate_gerbers",
          "message": "Generating Gerber RS-274X files (6 copper layers + mask + silk)...",
          "duration": null
        }
      ],
      "artifacts": []
    },
    {
      "id": "ses-008",
      "skill": "supply-chain",
      "agent": "SC",
      "title": "Supply Chain Risk Assessment",
      "status": "running",
      "created": "2025-01-25T08:30:00Z",
      "updated": "2025-01-25T08:42:15Z",
      "trace": [
        {
          "timestamp": "2025-01-25T08:30:01Z",
          "agent": "SC",
          "action": "load_bom",
          "message": "Loading BOM (45 unique components)...",
          "duration": 1800
        },
        {
          "timestamp": "2025-01-25T08:33:01Z",
          "agent": "SC",
          "action": "query_distributors",
          "message": "Querying DigiKey, Mouser, and LCSC for stock and pricing...",
          "duration": 8400
        },
        {
          "timestamp": "2025-01-25T08:47:01Z",
          "agent": "SC",
          "action": "analyze_risks",
          "message": "Analyzing lifecycle, lead-time, and single-source risks...",
          "duration": null
        }
      ],
      "artifacts": []
    }
  ]
}

src/mocks/data/agents.json

Nine Phase 1 specialist agents with tool lists, current status, and session history.

{
  "agents": [
    {
      "id": "agent-req",
      "abbrev": "REQ",
      "name": "Requirements Agent",
      "description": "Extracts, validates, and manages hardware product requirements from PRDs and specifications",
      "status": "idle",
      "version": "1.0.0",
      "lastRun": "2025-01-15T09:12:34Z",
      "currentSession": null,
      "sessionsCompleted": 1,
      "tools": ["prd_parser", "constraint_extractor", "traceability_matrix"],
      "capabilities": [
        "PRD parsing and constraint extraction",
        "Requirements traceability matrix generation",
        "Completeness and consistency validation"
      ]
    },
    {
      "id": "agent-sys",
      "abbrev": "SYS",
      "name": "Systems Agent",
      "description": "Defines system architecture, subsystem decomposition, and interface specifications",
      "status": "idle",
      "version": "1.0.0",
      "lastRun": "2025-01-16T10:22:15Z",
      "currentSession": null,
      "sessionsCompleted": 1,
      "tools": ["architecture_generator", "interface_validator", "mermaid_renderer"],
      "capabilities": [
        "Subsystem decomposition from requirements",
        "Block diagram generation (Mermaid)",
        "Interface specification and validation"
      ]
    },
    {
      "id": "agent-ee",
      "abbrev": "EE",
      "name": "Electronics Agent",
      "description": "Performs schematic review, ERC/DRC checks, BOM export, and Gerber generation via KiCad",
      "status": "idle",
      "version": "1.0.0",
      "lastRun": "2025-01-18T09:15:42Z",
      "currentSession": null,
      "sessionsCompleted": 1,
      "tools": ["kicad_erc", "kicad_drc", "kicad_bom_export", "kicad_gerber_export"],
      "capabilities": [
        "KiCad schematic ERC validation",
        "PCB design rules check (DRC)",
        "BOM extraction and export",
        "Gerber RS-274X file generation"
      ]
    },
    {
      "id": "agent-fw",
      "abbrev": "FW",
      "name": "Firmware Agent",
      "description": "Generates firmware scaffolds, HAL layers, and driver code for embedded targets",
      "status": "idle",
      "version": "1.0.0",
      "lastRun": "2025-01-20T11:34:22Z",
      "currentSession": null,
      "sessionsCompleted": 1,
      "tools": ["code_generator", "cmake_builder", "hal_generator", "static_analyzer"],
      "capabilities": [
        "STM32 HAL layer generation",
        "Sensor driver scaffolding",
        "CMake build system configuration",
        "Static analysis integration"
      ]
    },
    {
      "id": "agent-sim",
      "abbrev": "SIM",
      "name": "Simulation Agent",
      "description": "Runs SPICE simulations, thermal analysis, and signal integrity checks",
      "status": "idle",
      "version": "1.0.0",
      "lastRun": "2025-01-22T14:45:18Z",
      "currentSession": null,
      "sessionsCompleted": 1,
      "tools": ["ngspice", "netlist_extractor", "waveform_analyzer"],
      "capabilities": [
        "NGSpice netlist extraction and simulation",
        "DC operating point analysis",
        "Transient analysis with waveform export",
        "Power rail ripple and stability checks"
      ]
    },
    {
      "id": "agent-tst",
      "abbrev": "TST",
      "name": "Test Engineering Agent",
      "description": "Generates test plans, FMEA tables, and test coverage analysis for hardware validation",
      "status": "idle",
      "version": "1.0.0",
      "lastRun": "2025-01-24T09:38:50Z",
      "currentSession": null,
      "sessionsCompleted": 1,
      "tools": ["test_plan_generator", "fmea_generator", "coverage_analyzer"],
      "capabilities": [
        "DVT/PVT test plan generation",
        "FMEA table construction",
        "Requirements-to-test coverage mapping",
        "Test procedure documentation"
      ]
    },
    {
      "id": "agent-mfg",
      "abbrev": "MFG",
      "name": "Manufacturing Agent",
      "description": "Performs DFM analysis, generates Gerber files, pick-and-place data, and manufacturing notes",
      "status": "running",
      "version": "1.0.0",
      "lastRun": null,
      "currentSession": "ses-007",
      "sessionsCompleted": 0,
      "tools": ["kicad_gerber_export", "dfm_checker", "pick_and_place_generator", "panelization_tool"],
      "capabilities": [
        "DFM rule checking (IPC-2221/IPC-7351)",
        "Gerber RS-274X and Excellon drill export",
        "Pick-and-place file generation",
        "Panel layout optimization"
      ]
    },
    {
      "id": "agent-sc",
      "abbrev": "SC",
      "name": "Supply Chain Agent",
      "description": "Queries distributor APIs for stock, pricing, and lead times; assesses supply chain risk",
      "status": "running",
      "version": "1.0.0",
      "lastRun": null,
      "currentSession": "ses-008",
      "sessionsCompleted": 0,
      "tools": ["digikey_api", "mouser_api", "lcsc_api", "lifecycle_checker"],
      "capabilities": [
        "Multi-distributor stock and price queries",
        "Lead time monitoring and alerts",
        "Component lifecycle status checking",
        "Alternate part recommendations"
      ]
    },
    {
      "id": "agent-reg",
      "abbrev": "REG",
      "name": "Regulatory Agent",
      "description": "Tracks compliance requirements across UKCA, CE, and FCC markets; manages evidence collection",
      "status": "idle",
      "version": "1.0.0",
      "lastRun": null,
      "currentSession": null,
      "sessionsCompleted": 0,
      "tools": ["regulation_database", "evidence_tracker", "compliance_checker"],
      "capabilities": [
        "Multi-market regulatory requirement mapping",
        "Evidence collection and gap analysis",
        "Compliance checklist generation",
        "Test lab submission tracking"
      ]
    }
  ]
}

src/mocks/data/bom.json

Forty-five components for the DFC-v2.1 drone flight controller. All part numbers are real. Risk scenarios include NRND lifecycle parts, long lead times, and single-source components.

{
  "project": "DFC-v2.1",
  "revision": "B",
  "generatedBy": "ses-003",
  "generatedAt": "2025-01-18T09:14:15Z",
  "items": [
    {
      "id": "bom-001",
      "designator": "U1",
      "mpn": "STM32H743VIT6",
      "manufacturer": "STMicroelectronics",
      "description": "32-bit Arm Cortex-M7 MCU, 480 MHz, 2 MB Flash, 1 MB RAM, LQFP-100",
      "category": "MCU",
      "quantity": 1,
      "unitPrice": 12.50,
      "totalPrice": 12.50,
      "stock": 4820,
      "leadTime": 8,
      "lifecycle": "active",
      "risk": "low",
      "package": "LQFP-100",
      "specifications": { "core": "Cortex-M7", "flash": "2MB", "ram": "1MB", "speed": "480MHz", "voltage": "1.62-3.6V" },
      "alternates": [
        { "mpn": "STM32H753VIT6", "manufacturer": "STMicroelectronics", "unitPrice": 14.20, "note": "Adds crypto accelerator" },
        { "mpn": "STM32H750VBT6", "manufacturer": "STMicroelectronics", "unitPrice": 8.90, "note": "128KB flash, requires external" }
      ]
    },
    {
      "id": "bom-002",
      "designator": "U2",
      "mpn": "STM32F103C8T6",
      "manufacturer": "STMicroelectronics",
      "description": "32-bit Arm Cortex-M3 MCU, 72 MHz, 64 KB Flash, LQFP-48",
      "category": "MCU",
      "quantity": 1,
      "unitPrice": 2.80,
      "totalPrice": 2.80,
      "stock": 18200,
      "leadTime": 4,
      "lifecycle": "active",
      "risk": "low",
      "package": "LQFP-48",
      "specifications": { "core": "Cortex-M3", "flash": "64KB", "ram": "20KB", "speed": "72MHz", "voltage": "2.0-3.6V" },
      "alternates": [
        { "mpn": "STM32F103CBT6", "manufacturer": "STMicroelectronics", "unitPrice": 3.40, "note": "128KB flash" },
        { "mpn": "GD32F103C8T6", "manufacturer": "GigaDevice", "unitPrice": 1.90, "note": "Pin-compatible clone" }
      ]
    },
    {
      "id": "bom-003",
      "designator": "U3",
      "mpn": "BMI270",
      "manufacturer": "Bosch Sensortec",
      "description": "6-axis IMU (accel + gyro), 16-bit, SPI/I2C, LGA-14",
      "category": "Sensor",
      "quantity": 1,
      "unitPrice": 3.20,
      "totalPrice": 3.20,
      "stock": 12400,
      "leadTime": 6,
      "lifecycle": "active",
      "risk": "low",
      "package": "LGA-14",
      "specifications": { "axes": 6, "accelRange": "+-16g", "gyroRange": "+-2000dps", "interface": "SPI/I2C", "odr": "1600Hz" },
      "alternates": [
        { "mpn": "BMI088", "manufacturer": "Bosch Sensortec", "unitPrice": 4.80, "note": "Wider accel range, separate dies" },
        { "mpn": "LSM6DSO32", "manufacturer": "STMicroelectronics", "unitPrice": 3.60, "note": "+-32g accel range" }
      ]
    },
    {
      "id": "bom-004",
      "designator": "U4",
      "mpn": "BMP390",
      "manufacturer": "Bosch Sensortec",
      "description": "Barometric pressure sensor, 300-1250 hPa, SPI/I2C, LGA-10",
      "category": "Sensor",
      "quantity": 1,
      "unitPrice": 2.10,
      "totalPrice": 2.10,
      "stock": 8900,
      "leadTime": 5,
      "lifecycle": "active",
      "risk": "low",
      "package": "LGA-10",
      "specifications": { "range": "300-1250hPa", "resolution": "0.01hPa", "accuracy": "+-0.5hPa", "interface": "SPI/I2C" },
      "alternates": [
        { "mpn": "BMP388", "manufacturer": "Bosch Sensortec", "unitPrice": 1.90, "note": "Previous generation, slightly lower accuracy" },
        { "mpn": "DPS310XTSA1", "manufacturer": "Infineon", "unitPrice": 2.30, "note": "Comparable accuracy" }
      ]
    },
    {
      "id": "bom-005",
      "designator": "U5",
      "mpn": "ICM-42688-P",
      "manufacturer": "TDK InvenSense",
      "description": "6-axis IMU (backup), high-precision, SPI/I2C, LGA-14",
      "category": "Sensor",
      "quantity": 1,
      "unitPrice": 4.50,
      "totalPrice": 4.50,
      "stock": 320,
      "leadTime": 18,
      "lifecycle": "active",
      "risk": "high",
      "riskReason": "18-week lead time, low distributor stock",
      "package": "LGA-14",
      "specifications": { "axes": 6, "accelRange": "+-16g", "gyroRange": "+-2000dps", "interface": "SPI/I2C", "odr": "32000Hz" },
      "alternates": [
        { "mpn": "ICM-42605", "manufacturer": "TDK InvenSense", "unitPrice": 3.80, "note": "Lower ODR, 8-week lead" },
        { "mpn": "BMI270", "manufacturer": "Bosch Sensortec", "unitPrice": 3.20, "note": "Lower ODR but readily available" }
      ]
    },
    {
      "id": "bom-006",
      "designator": "U6",
      "mpn": "MMC5983MA",
      "manufacturer": "MEMSIC",
      "description": "3-axis magnetometer, 16-bit, SPI/I2C, LGA-16",
      "category": "Sensor",
      "quantity": 1,
      "unitPrice": 1.80,
      "totalPrice": 1.80,
      "stock": 6200,
      "leadTime": 6,
      "lifecycle": "active",
      "risk": "low",
      "package": "LGA-16",
      "specifications": { "axes": 3, "range": "+-8G", "resolution": "18-bit", "interface": "SPI/I2C", "bandwidth": "1000Hz" },
      "alternates": [
        { "mpn": "QMC5883L", "manufacturer": "QST", "unitPrice": 0.80, "note": "Lower resolution, I2C only" },
        { "mpn": "LIS3MDL", "manufacturer": "STMicroelectronics", "unitPrice": 1.60, "note": "+-16G range" }
      ]
    },
    {
      "id": "bom-007",
      "designator": "U7",
      "mpn": "TPS62823DLCR",
      "manufacturer": "Texas Instruments",
      "description": "3.3V synchronous buck converter, 3A, 2.4-5.5V input, SOT-583-8",
      "category": "Power",
      "quantity": 2,
      "unitPrice": 1.45,
      "totalPrice": 2.90,
      "stock": 24500,
      "leadTime": 4,
      "lifecycle": "active",
      "risk": "low",
      "package": "SOT-583-8",
      "specifications": { "topology": "buck", "vinMax": "5.5V", "vout": "3.3V", "iout": "3A", "efficiency": "95%", "frequency": "2.2MHz" },
      "alternates": [
        { "mpn": "TPS62822DLCR", "manufacturer": "Texas Instruments", "unitPrice": 1.45, "note": "1.8V output variant" },
        { "mpn": "AP3418KTR-G1", "manufacturer": "Diodes Inc.", "unitPrice": 0.95, "note": "2A, lower current" }
      ]
    },
    {
      "id": "bom-008",
      "designator": "U8",
      "mpn": "TPS7A2033DRVR",
      "manufacturer": "Texas Instruments",
      "description": "3.3V LDO, 300mA, ultra-low noise, SOT-236-5",
      "category": "Power",
      "quantity": 2,
      "unitPrice": 0.95,
      "totalPrice": 1.90,
      "stock": 31200,
      "leadTime": 3,
      "lifecycle": "active",
      "risk": "low",
      "package": "SOT-236-5",
      "specifications": { "topology": "LDO", "vinMax": "6V", "vout": "3.3V", "iout": "300mA", "noise": "4.4uVrms", "dropout": "200mV" },
      "alternates": [
        { "mpn": "TPS7A20DRVR", "manufacturer": "Texas Instruments", "unitPrice": 0.85, "note": "Adjustable output" },
        { "mpn": "ADP151AUJZ-3.3-R7", "manufacturer": "Analog Devices", "unitPrice": 1.10, "note": "9uVrms ultra-low noise" }
      ]
    },
    {
      "id": "bom-009",
      "designator": "U9",
      "mpn": "LP2985-33DBVR",
      "manufacturer": "Texas Instruments",
      "description": "3.3V LDO, 150mA, SOT-23-5",
      "category": "Power",
      "quantity": 1,
      "unitPrice": 0.65,
      "totalPrice": 0.65,
      "stock": 2100,
      "leadTime": 10,
      "lifecycle": "NRND",
      "risk": "high",
      "riskReason": "Not Recommended for New Designs — TI recommends TLV75533PDBVR as replacement",
      "package": "SOT-23-5",
      "specifications": { "topology": "LDO", "vinMax": "16V", "vout": "3.3V", "iout": "150mA", "noise": "30uVrms", "dropout": "280mV" },
      "alternates": [
        { "mpn": "TLV75533PDBVR", "manufacturer": "Texas Instruments", "unitPrice": 0.55, "note": "Recommended replacement, better specs" },
        { "mpn": "MIC5504-3.3YM5-TR", "manufacturer": "Microchip", "unitPrice": 0.40, "note": "300mA, SOT-23-5" }
      ]
    },
    {
      "id": "bom-010",
      "designator": "U10",
      "mpn": "BQ25180YBGR",
      "manufacturer": "Texas Instruments",
      "description": "1-cell Li-Ion/Li-Po battery charger, I2C config, DSBGA-12",
      "category": "Power",
      "quantity": 1,
      "unitPrice": 2.30,
      "totalPrice": 2.30,
      "stock": 7800,
      "leadTime": 6,
      "lifecycle": "active",
      "risk": "low",
      "package": "DSBGA-12",
      "specifications": { "vinMax": "5.5V", "chargeVoltage": "4.2V", "chargeCurrent": "1A", "interface": "I2C" },
      "alternates": [
        { "mpn": "MCP73831T-2ACI/OT", "manufacturer": "Microchip", "unitPrice": 0.65, "note": "Simpler, no I2C, 500mA max" },
        { "mpn": "BQ24075RGTR", "manufacturer": "Texas Instruments", "unitPrice": 2.80, "note": "Power path management" }
      ]
    },
    {
      "id": "bom-011",
      "designator": "U11",
      "mpn": "ESP32-S3-WROOM-1-N8R2",
      "manufacturer": "Espressif",
      "description": "WiFi + BLE 5.0 module, dual-core LX7, 8MB flash, 2MB PSRAM",
      "category": "Connectivity",
      "quantity": 1,
      "unitPrice": 3.40,
      "totalPrice": 3.40,
      "stock": 15600,
      "leadTime": 5,
      "lifecycle": "active",
      "risk": "low",
      "package": "Module-18x25.5mm",
      "specifications": { "wifi": "802.11 b/g/n", "bluetooth": "BLE 5.0", "flash": "8MB", "psram": "2MB", "gpio": 36, "voltage": "3.0-3.6V" },
      "alternates": [
        { "mpn": "ESP32-S3-WROOM-1-N16R8", "manufacturer": "Espressif", "unitPrice": 4.20, "note": "16MB flash, 8MB PSRAM" },
        { "mpn": "ESP32-C3-WROOM-02-N4", "manufacturer": "Espressif", "unitPrice": 2.10, "note": "Single-core, lower power" }
      ]
    },
    {
      "id": "bom-012",
      "designator": "U12",
      "mpn": "SX1262IMLTRT",
      "manufacturer": "Semtech",
      "description": "LoRa transceiver, 150MHz-960MHz, +22dBm, SPI, QFN-24",
      "category": "Connectivity",
      "quantity": 1,
      "unitPrice": 4.20,
      "totalPrice": 4.20,
      "stock": 1800,
      "leadTime": 8,
      "lifecycle": "active",
      "risk": "medium",
      "riskReason": "Single source — Semtech is the only manufacturer of LoRa transceivers",
      "package": "QFN-24",
      "specifications": { "frequency": "150-960MHz", "txPower": "+22dBm", "sensitivity": "-148dBm", "interface": "SPI", "voltage": "1.8-3.7V" },
      "alternates": [
        { "mpn": "SX1261IMLTRT", "manufacturer": "Semtech", "unitPrice": 3.80, "note": "+15dBm variant, same family" },
        { "mpn": "LLCC68IMLTRT", "manufacturer": "Semtech", "unitPrice": 3.20, "note": "Cost-optimized LoRa, reduced spreading factors" }
      ]
    },
    {
      "id": "bom-013",
      "designator": "U13",
      "mpn": "MAX-M10S",
      "manufacturer": "u-blox",
      "description": "Multi-GNSS receiver module (GPS/GLONASS/Galileo/BeiDou), LGA-24",
      "category": "Connectivity",
      "quantity": 1,
      "unitPrice": 12.80,
      "totalPrice": 12.80,
      "stock": 2400,
      "leadTime": 10,
      "lifecycle": "active",
      "risk": "medium",
      "riskReason": "Single source — u-blox proprietary GNSS platform",
      "package": "LGA-24",
      "specifications": { "constellations": "GPS/GLONASS/Galileo/BeiDou", "sensitivity": "-167dBm", "accuracy": "2.5m CEP", "interface": "UART/SPI/I2C", "voltage": "1.71-3.6V" },
      "alternates": [
        { "mpn": "MAX-M10S-00B", "manufacturer": "u-blox", "unitPrice": 11.50, "note": "Chip antenna variant" },
        { "mpn": "LC29H(DA)", "manufacturer": "Quectel", "unitPrice": 9.80, "note": "Dual-band, different form factor" }
      ]
    },
    {
      "id": "bom-014",
      "designator": "U14, U15, U16, U17",
      "mpn": "DRV8313PWPR",
      "manufacturer": "Texas Instruments",
      "description": "Triple half-bridge motor driver, 2.5A per channel, HTSSOP-28",
      "category": "Motor Driver",
      "quantity": 4,
      "unitPrice": 3.80,
      "totalPrice": 15.20,
      "stock": 9200,
      "leadTime": 6,
      "lifecycle": "active",
      "risk": "low",
      "package": "HTSSOP-28",
      "specifications": { "channels": 3, "currentPerChannel": "2.5A", "voltage": "8-60V", "rdson": "0.5ohm", "protection": "OCP/OTP/UVLO" },
      "alternates": [
        { "mpn": "DRV8316RRGFR", "manufacturer": "Texas Instruments", "unitPrice": 2.90, "note": "Integrated FETs, QFN-24" },
        { "mpn": "L6234PD013TR", "manufacturer": "STMicroelectronics", "unitPrice": 3.50, "note": "Three half-bridge, PowerSO-20" }
      ]
    },
    {
      "id": "bom-015",
      "designator": "U18",
      "mpn": "W25Q128JVSIQ",
      "manufacturer": "Winbond",
      "description": "128Mbit serial NOR flash, SPI/Dual/Quad, SOIC-8",
      "category": "Memory",
      "quantity": 1,
      "unitPrice": 1.20,
      "totalPrice": 1.20,
      "stock": 42000,
      "leadTime": 3,
      "lifecycle": "active",
      "risk": "low",
      "package": "SOIC-8",
      "specifications": { "density": "128Mbit", "interface": "SPI/Dual/Quad", "speed": "133MHz", "voltage": "2.7-3.6V", "endurance": "100K cycles" },
      "alternates": [
        { "mpn": "GD25Q128ESIG", "manufacturer": "GigaDevice", "unitPrice": 0.85, "note": "Pin-compatible, lower cost" },
        { "mpn": "IS25LP128-JBLE", "manufacturer": "ISSI", "unitPrice": 1.35, "note": "Low-power variant" }
      ]
    },
    {
      "id": "bom-016",
      "designator": "U19",
      "mpn": "IS42S16400J-7TLI",
      "manufacturer": "ISSI",
      "description": "64Mbit SDRAM, 16-bit bus, 143MHz, TSOP-II-54",
      "category": "Memory",
      "quantity": 1,
      "unitPrice": 2.40,
      "totalPrice": 2.40,
      "stock": 5600,
      "leadTime": 8,
      "lifecycle": "active",
      "risk": "low",
      "riskReason": "Price volatility +15% over last quarter",
      "package": "TSOP-II-54",
      "specifications": { "density": "64Mbit", "organization": "4M x 16", "speed": "143MHz", "voltage": "3.3V", "casLatency": "CL3" },
      "alternates": [
        { "mpn": "AS4C4M16SA-7TIN", "manufacturer": "Alliance Memory", "unitPrice": 2.20, "note": "Pin-compatible" },
        { "mpn": "MT48LC4M16A2P-6A:G", "manufacturer": "Micron", "unitPrice": 2.80, "note": "Widely available" }
      ]
    },
    {
      "id": "bom-017",
      "designator": "U20",
      "mpn": "ATECC608B-TNGLOOS-G",
      "manufacturer": "Microchip",
      "description": "Secure element, ECDH/ECDSA, I2C, UDFN-8",
      "category": "Security",
      "quantity": 1,
      "unitPrice": 0.72,
      "totalPrice": 0.72,
      "stock": 18400,
      "leadTime": 4,
      "lifecycle": "active",
      "risk": "low",
      "package": "UDFN-8",
      "specifications": { "crypto": "ECDH/ECDSA P-256", "interface": "I2C", "voltage": "2.0-5.5V", "certifications": "FIPS/CC" },
      "alternates": [
        { "mpn": "ATECC608A-MAHDA-T", "manufacturer": "Microchip", "unitPrice": 0.65, "note": "Previous gen, same pinout" }
      ]
    },
    {
      "id": "bom-018",
      "designator": "U21",
      "mpn": "SN74LVC1G125DCKR",
      "manufacturer": "Texas Instruments",
      "description": "Single bus buffer/gate, tri-state, SC70-5",
      "category": "Logic",
      "quantity": 3,
      "unitPrice": 0.28,
      "totalPrice": 0.84,
      "stock": 50000,
      "leadTime": 2,
      "lifecycle": "active",
      "risk": "low",
      "package": "SC70-5",
      "specifications": { "channels": 1, "voltage": "1.65-5.5V", "propagation": "3.5ns", "output": "tri-state" },
      "alternates": [
        { "mpn": "74LVC1G125GW", "manufacturer": "Nexperia", "unitPrice": 0.22, "note": "SOT-353 package" }
      ]
    },
    {
      "id": "bom-019",
      "designator": "U22",
      "mpn": "TXB0108PWR",
      "manufacturer": "Texas Instruments",
      "description": "8-bit bidirectional voltage-level translator, TSSOP-20",
      "category": "Logic",
      "quantity": 1,
      "unitPrice": 1.40,
      "totalPrice": 1.40,
      "stock": 22000,
      "leadTime": 3,
      "lifecycle": "active",
      "risk": "low",
      "package": "TSSOP-20",
      "specifications": { "channels": 8, "voltageA": "1.2-3.6V", "voltageB": "1.65-5.5V", "dataRate": "100Mbps" },
      "alternates": [
        { "mpn": "TXB0104PWR", "manufacturer": "Texas Instruments", "unitPrice": 0.90, "note": "4-bit variant" },
        { "mpn": "GTL2003PW", "manufacturer": "NXP", "unitPrice": 0.95, "note": "Passive FET-based" }
      ]
    },
    {
      "id": "bom-020",
      "designator": "U23",
      "mpn": "TMP117AIDRVR",
      "manufacturer": "Texas Instruments",
      "description": "High-accuracy digital temperature sensor, +-0.1C, I2C, SOT-6",
      "category": "Sensor",
      "quantity": 1,
      "unitPrice": 1.85,
      "totalPrice": 1.85,
      "stock": 14200,
      "leadTime": 4,
      "lifecycle": "active",
      "risk": "low",
      "package": "SOT-6",
      "specifications": { "accuracy": "+-0.1C", "range": "-55 to 150C", "resolution": "0.0078C", "interface": "I2C" },
      "alternates": [
        { "mpn": "STTS22HTR", "manufacturer": "STMicroelectronics", "unitPrice": 0.90, "note": "+-0.5C, lower cost" }
      ]
    },
    {
      "id": "bom-021",
      "designator": "U24",
      "mpn": "INA228AIDGSR",
      "manufacturer": "Texas Instruments",
      "description": "High-precision power monitor, 20-bit ADC, I2C, MSOP-10",
      "category": "Power",
      "quantity": 2,
      "unitPrice": 2.60,
      "totalPrice": 5.20,
      "stock": 8400,
      "leadTime": 5,
      "lifecycle": "active",
      "risk": "low",
      "package": "MSOP-10",
      "specifications": { "resolution": "20-bit", "busVoltage": "0-85V", "accuracy": "+-0.1%", "interface": "I2C" },
      "alternates": [
        { "mpn": "INA226AIDGSR", "manufacturer": "Texas Instruments", "unitPrice": 1.60, "note": "16-bit, lower resolution" }
      ]
    },
    {
      "id": "bom-022",
      "designator": "U25",
      "mpn": "NCP186AMT330TAG",
      "manufacturer": "onsemi",
      "description": "1V LDO regulator, 3.3V, 500mA, ultra-low noise, WDFN-4",
      "category": "Power",
      "quantity": 1,
      "unitPrice": 0.48,
      "totalPrice": 0.48,
      "stock": 15600,
      "leadTime": 4,
      "lifecycle": "NRND",
      "risk": "high",
      "riskReason": "NRND — onsemi recommends NCV8163AMT330TAG as replacement",
      "package": "WDFN-4",
      "specifications": { "topology": "LDO", "vinMax": "5.5V", "vout": "3.3V", "iout": "500mA", "noise": "6.5uVrms", "dropout": "145mV" },
      "alternates": [
        { "mpn": "NCV8163AMT330TAG", "manufacturer": "onsemi", "unitPrice": 0.52, "note": "Recommended replacement" },
        { "mpn": "AP7381-33Y-13", "manufacturer": "Diodes Inc.", "unitPrice": 0.35, "note": "150mA, ultra-low quiescent" }
      ]
    },
    {
      "id": "bom-023",
      "designator": "Y1",
      "mpn": "ABM8-25.000MHZ-B2-T",
      "manufacturer": "Abracon",
      "description": "25 MHz crystal, 10ppm, 18pF, 3.2x2.5mm",
      "category": "Crystal/Oscillator",
      "quantity": 1,
      "unitPrice": 0.35,
      "totalPrice": 0.35,
      "stock": 28000,
      "leadTime": 3,
      "lifecycle": "active",
      "risk": "low",
      "package": "3.2x2.5mm",
      "specifications": { "frequency": "25MHz", "tolerance": "10ppm", "loadCapacitance": "18pF", "esr": "40ohm" },
      "alternates": [
        { "mpn": "NX3225GA-25MHZ-STD-CRA-3", "manufacturer": "NDK", "unitPrice": 0.40, "note": "Higher reliability grade" }
      ]
    },
    {
      "id": "bom-024",
      "designator": "Y2",
      "mpn": "ABM8-8.000MHZ-B2-T",
      "manufacturer": "Abracon",
      "description": "8 MHz crystal, 10ppm, 18pF, 3.2x2.5mm",
      "category": "Crystal/Oscillator",
      "quantity": 1,
      "unitPrice": 0.30,
      "totalPrice": 0.30,
      "stock": 32000,
      "leadTime": 3,
      "lifecycle": "active",
      "risk": "low",
      "package": "3.2x2.5mm",
      "specifications": { "frequency": "8MHz", "tolerance": "10ppm", "loadCapacitance": "18pF", "esr": "60ohm" },
      "alternates": [
        { "mpn": "ECS-.327-12.5-34B-TR", "manufacturer": "ECS", "unitPrice": 0.25, "note": "Alternative supplier" }
      ]
    },
    {
      "id": "bom-025",
      "designator": "Y3",
      "mpn": "FA-128-32.768KHZ-12.5PF",
      "manufacturer": "Epson",
      "description": "32.768 kHz crystal, 20ppm, 12.5pF, 2.0x1.2mm",
      "category": "Crystal/Oscillator",
      "quantity": 1,
      "unitPrice": 0.45,
      "totalPrice": 0.45,
      "stock": 20000,
      "leadTime": 4,
      "lifecycle": "active",
      "risk": "low",
      "package": "2.0x1.2mm",
      "specifications": { "frequency": "32.768kHz", "tolerance": "20ppm", "loadCapacitance": "12.5pF" },
      "alternates": [
        { "mpn": "ABS07-32.768KHZ-T", "manufacturer": "Abracon", "unitPrice": 0.35, "note": "Same specs" }
      ]
    },
    {
      "id": "bom-026",
      "designator": "L1, L2",
      "mpn": "XAL4020-222MEB",
      "manufacturer": "Coilcraft",
      "description": "2.2uH power inductor, 5.5A, 4x4x2mm, shielded",
      "category": "Inductor",
      "quantity": 2,
      "unitPrice": 0.82,
      "totalPrice": 1.64,
      "stock": 16000,
      "leadTime": 4,
      "lifecycle": "active",
      "risk": "low",
      "package": "4020",
      "specifications": { "inductance": "2.2uH", "dcr": "22mohm", "saturationCurrent": "5.5A", "type": "shielded" },
      "alternates": [
        { "mpn": "NR4018T2R2M", "manufacturer": "Taiyo Yuden", "unitPrice": 0.55, "note": "Lower saturation current 4.2A" }
      ]
    },
    {
      "id": "bom-027",
      "designator": "L3",
      "mpn": "DFE201210P-1R0M=P2",
      "manufacturer": "Murata",
      "description": "1.0uH inductor, 2A, 2.0x1.25mm, shielded",
      "category": "Inductor",
      "quantity": 1,
      "unitPrice": 0.18,
      "totalPrice": 0.18,
      "stock": 45000,
      "leadTime": 3,
      "lifecycle": "active",
      "risk": "low",
      "package": "2012",
      "specifications": { "inductance": "1.0uH", "dcr": "95mohm", "saturationCurrent": "2.0A", "type": "shielded" },
      "alternates": [
        { "mpn": "LQH2MCN1R0M02L", "manufacturer": "Murata", "unitPrice": 0.15, "note": "Unshielded variant" }
      ]
    },
    {
      "id": "bom-028",
      "designator": "J1",
      "mpn": "10118194-0001LF",
      "manufacturer": "Amphenol",
      "description": "USB Micro-B receptacle, SMD, right-angle",
      "category": "Connector",
      "quantity": 1,
      "unitPrice": 0.45,
      "totalPrice": 0.45,
      "stock": 25000,
      "leadTime": 3,
      "lifecycle": "active",
      "risk": "low",
      "package": "SMD",
      "specifications": { "type": "USB Micro-B", "current": "1.8A", "contacts": 5, "mounting": "SMD right-angle" },
      "alternates": [
        { "mpn": "USB3131-30-0230-A", "manufacturer": "GCT", "unitPrice": 0.55, "note": "USB-C alternative" }
      ]
    },
    {
      "id": "bom-029",
      "designator": "J2",
      "mpn": "SM06B-SRSS-TB(LF)(SN)",
      "manufacturer": "JST",
      "description": "6-pin SH series connector, 1.0mm pitch, SMD",
      "category": "Connector",
      "quantity": 1,
      "unitPrice": 0.38,
      "totalPrice": 0.38,
      "stock": 18000,
      "leadTime": 4,
      "lifecycle": "active",
      "risk": "low",
      "package": "SMD",
      "specifications": { "type": "JST-SH", "pitch": "1.0mm", "pins": 6, "current": "1A" },
      "alternates": [
        { "mpn": "BM06B-SRSS-TB(LF)(SN)", "manufacturer": "JST", "unitPrice": 0.40, "note": "Bottom-entry variant" }
      ]
    },
    {
      "id": "bom-030",
      "designator": "J3, J4, J5, J6",
      "mpn": "SM03B-SRSS-TB(LF)(SN)",
      "manufacturer": "JST",
      "description": "3-pin SH series connector, 1.0mm pitch, SMD (motor/ESC)",
      "category": "Connector",
      "quantity": 4,
      "unitPrice": 0.25,
      "totalPrice": 1.00,
      "stock": 35000,
      "leadTime": 3,
      "lifecycle": "active",
      "risk": "low",
      "package": "SMD",
      "specifications": { "type": "JST-SH", "pitch": "1.0mm", "pins": 3, "current": "1A" },
      "alternates": [
        { "mpn": "53048-0310", "manufacturer": "Molex", "unitPrice": 0.30, "note": "PicoBlade equivalent" }
      ]
    },
    {
      "id": "bom-031",
      "designator": "J7",
      "mpn": "DF12(3.0)-30DP-0.5V(86)",
      "manufacturer": "Hirose",
      "description": "30-pin board-to-board connector, 0.5mm pitch, SMD",
      "category": "Connector",
      "quantity": 1,
      "unitPrice": 1.20,
      "totalPrice": 1.20,
      "stock": 8400,
      "leadTime": 6,
      "lifecycle": "active",
      "risk": "low",
      "package": "SMD",
      "specifications": { "type": "Board-to-Board", "pitch": "0.5mm", "pins": 30, "stackHeight": "3.0mm" },
      "alternates": [
        { "mpn": "WP3-P030VA1-R6000", "manufacturer": "JAE", "unitPrice": 1.10, "note": "Equivalent B2B" }
      ]
    },
    {
      "id": "bom-032",
      "designator": "J8",
      "mpn": "U.FL-R-SMT-1(80)",
      "manufacturer": "Hirose",
      "description": "U.FL coaxial connector for antenna, SMD",
      "category": "Connector",
      "quantity": 2,
      "unitPrice": 0.60,
      "totalPrice": 1.20,
      "stock": 22000,
      "leadTime": 3,
      "lifecycle": "active",
      "risk": "low",
      "package": "SMD",
      "specifications": { "type": "U.FL", "impedance": "50ohm", "frequency": "6GHz", "insertion": "500 cycles" },
      "alternates": [
        { "mpn": "CONUFL001-SMD-T", "manufacturer": "Linx", "unitPrice": 0.50, "note": "Compatible alternative" }
      ]
    },
    {
      "id": "bom-033",
      "designator": "D1",
      "mpn": "PMEG3020ER,115",
      "manufacturer": "Nexperia",
      "description": "Schottky diode, 30V, 2A, SOD-123W",
      "category": "Diode",
      "quantity": 2,
      "unitPrice": 0.15,
      "totalPrice": 0.30,
      "stock": 38000,
      "leadTime": 2,
      "lifecycle": "active",
      "risk": "low",
      "package": "SOD-123W",
      "specifications": { "vrrm": "30V", "ifav": "2A", "vf": "0.39V", "type": "Schottky" },
      "alternates": [
        { "mpn": "SS32", "manufacturer": "onsemi", "unitPrice": 0.08, "note": "SMA package, through-hole compatible" }
      ]
    },
    {
      "id": "bom-034",
      "designator": "D2, D3",
      "mpn": "PESD5V0S1BSF,115",
      "manufacturer": "Nexperia",
      "description": "ESD protection diode, 5V, SOD-962",
      "category": "Diode",
      "quantity": 4,
      "unitPrice": 0.08,
      "totalPrice": 0.32,
      "stock": 48000,
      "leadTime": 2,
      "lifecycle": "active",
      "risk": "low",
      "package": "SOD-962",
      "specifications": { "vwm": "5V", "ipp": "9A", "capacitance": "1.5pF", "type": "TVS" },
      "alternates": [
        { "mpn": "PRTR5V0U2X,215", "manufacturer": "Nexperia", "unitPrice": 0.10, "note": "Dual-line USB protection" }
      ]
    },
    {
      "id": "bom-035",
      "designator": "Q1, Q2",
      "mpn": "SI2301CDS-T1-GE3",
      "manufacturer": "Vishay",
      "description": "P-channel MOSFET, -20V, -3.1A, SOT-23",
      "category": "MOSFET",
      "quantity": 2,
      "unitPrice": 0.35,
      "totalPrice": 0.70,
      "stock": 26000,
      "leadTime": 3,
      "lifecycle": "active",
      "risk": "low",
      "package": "SOT-23",
      "specifications": { "type": "P-Channel", "vds": "-20V", "id": "-3.1A", "rdson": "80mohm", "vgs": "-1.5V" },
      "alternates": [
        { "mpn": "DMP2035U-7", "manufacturer": "Diodes Inc.", "unitPrice": 0.25, "note": "Similar specs, SOT-23" }
      ]
    },
    {
      "id": "bom-036",
      "designator": "Q3, Q4",
      "mpn": "SI2302CDS-T1-GE3",
      "manufacturer": "Vishay",
      "description": "N-channel MOSFET, 20V, 2.6A, SOT-23",
      "category": "MOSFET",
      "quantity": 2,
      "unitPrice": 0.30,
      "totalPrice": 0.60,
      "stock": 30000,
      "leadTime": 3,
      "lifecycle": "active",
      "risk": "low",
      "package": "SOT-23",
      "specifications": { "type": "N-Channel", "vds": "20V", "id": "2.6A", "rdson": "55mohm", "vgs": "1.0V" },
      "alternates": [
        { "mpn": "2N7002", "manufacturer": "Nexperia", "unitPrice": 0.04, "note": "Lower current, 300mA" }
      ]
    },
    {
      "id": "bom-037",
      "designator": "R1-R12",
      "mpn": "RC0402FR-0710KL",
      "manufacturer": "Yageo",
      "description": "10kohm resistor, 1%, 0402, 62.5mW",
      "category": "Passive",
      "quantity": 12,
      "unitPrice": 0.01,
      "totalPrice": 0.12,
      "stock": 50000,
      "leadTime": 2,
      "lifecycle": "active",
      "risk": "low",
      "package": "0402",
      "specifications": { "resistance": "10kohm", "tolerance": "1%", "power": "62.5mW", "tcr": "100ppm/C" },
      "alternates": [
        { "mpn": "CRCW040210K0FKEDC", "manufacturer": "Vishay", "unitPrice": 0.01, "note": "Alternative supplier" }
      ]
    },
    {
      "id": "bom-038",
      "designator": "R13-R20",
      "mpn": "RC0402FR-074K7L",
      "manufacturer": "Yageo",
      "description": "4.7kohm resistor, 1%, 0402, 62.5mW",
      "category": "Passive",
      "quantity": 8,
      "unitPrice": 0.01,
      "totalPrice": 0.08,
      "stock": 50000,
      "leadTime": 2,
      "lifecycle": "active",
      "risk": "low",
      "package": "0402",
      "specifications": { "resistance": "4.7kohm", "tolerance": "1%", "power": "62.5mW", "tcr": "100ppm/C" },
      "alternates": [
        { "mpn": "CRCW04024K70FKEDC", "manufacturer": "Vishay", "unitPrice": 0.01, "note": "Alternative supplier" }
      ]
    },
    {
      "id": "bom-039",
      "designator": "R21-R28",
      "mpn": "RC0402FR-07100KL",
      "manufacturer": "Yageo",
      "description": "100kohm resistor, 1%, 0402, 62.5mW",
      "category": "Passive",
      "quantity": 8,
      "unitPrice": 0.01,
      "totalPrice": 0.08,
      "stock": 50000,
      "leadTime": 2,
      "lifecycle": "active",
      "risk": "low",
      "package": "0402",
      "specifications": { "resistance": "100kohm", "tolerance": "1%", "power": "62.5mW", "tcr": "100ppm/C" },
      "alternates": [
        { "mpn": "CRCW0402100KFKEDC", "manufacturer": "Vishay", "unitPrice": 0.01, "note": "Alternative supplier" }
      ]
    },
    {
      "id": "bom-040",
      "designator": "R29-R32",
      "mpn": "ERJ-2RKF1001X",
      "manufacturer": "Panasonic",
      "description": "1kohm resistor, 1%, 0402, 100mW",
      "category": "Passive",
      "quantity": 4,
      "unitPrice": 0.01,
      "totalPrice": 0.04,
      "stock": 50000,
      "leadTime": 2,
      "lifecycle": "active",
      "risk": "low",
      "package": "0402",
      "specifications": { "resistance": "1kohm", "tolerance": "1%", "power": "100mW", "tcr": "100ppm/C" },
      "alternates": [
        { "mpn": "RC0402FR-071KL", "manufacturer": "Yageo", "unitPrice": 0.01, "note": "Standard alternative" }
      ]
    },
    {
      "id": "bom-041",
      "designator": "R33-R36",
      "mpn": "WSL0402R0100FEA",
      "manufacturer": "Vishay",
      "description": "10mohm current sense resistor, 1%, 0402, 125mW",
      "category": "Passive",
      "quantity": 4,
      "unitPrice": 0.18,
      "totalPrice": 0.72,
      "stock": 14000,
      "leadTime": 4,
      "lifecycle": "active",
      "risk": "low",
      "package": "0402",
      "specifications": { "resistance": "10mohm", "tolerance": "1%", "power": "125mW", "type": "current sense" },
      "alternates": [
        { "mpn": "SFR01MZPF-R010-11", "manufacturer": "Vishay", "unitPrice": 0.15, "note": "Thin film variant" }
      ]
    },
    {
      "id": "bom-042",
      "designator": "C1-C24",
      "mpn": "GRM155R71C104KA88D",
      "manufacturer": "Murata",
      "description": "100nF MLCC, 16V, X7R, 0402",
      "category": "Passive",
      "quantity": 24,
      "unitPrice": 0.02,
      "totalPrice": 0.48,
      "stock": 50000,
      "leadTime": 2,
      "lifecycle": "active",
      "risk": "low",
      "package": "0402",
      "specifications": { "capacitance": "100nF", "voltage": "16V", "dielectric": "X7R", "tolerance": "10%" },
      "alternates": [
        { "mpn": "CL05B104KO5NNNC", "manufacturer": "Samsung", "unitPrice": 0.015, "note": "Standard alternative" }
      ]
    },
    {
      "id": "bom-043",
      "designator": "C25-C36",
      "mpn": "GRM155R60J105KE19D",
      "manufacturer": "Murata",
      "description": "1uF MLCC, 6.3V, X5R, 0402",
      "category": "Passive",
      "quantity": 12,
      "unitPrice": 0.03,
      "totalPrice": 0.36,
      "stock": 48000,
      "leadTime": 2,
      "lifecycle": "active",
      "risk": "low",
      "package": "0402",
      "specifications": { "capacitance": "1uF", "voltage": "6.3V", "dielectric": "X5R", "tolerance": "10%" },
      "alternates": [
        { "mpn": "CL05A105KO5NNNC", "manufacturer": "Samsung", "unitPrice": 0.025, "note": "Standard alternative" }
      ]
    },
    {
      "id": "bom-044",
      "designator": "C37-C42",
      "mpn": "GRM188R61A106KE69D",
      "manufacturer": "Murata",
      "description": "10uF MLCC, 10V, X5R, 0603",
      "category": "Passive",
      "quantity": 6,
      "unitPrice": 0.05,
      "totalPrice": 0.30,
      "stock": 35000,
      "leadTime": 2,
      "lifecycle": "active",
      "risk": "low",
      "package": "0603",
      "specifications": { "capacitance": "10uF", "voltage": "10V", "dielectric": "X5R", "tolerance": "10%" },
      "alternates": [
        { "mpn": "CL10A106KP8NNNC", "manufacturer": "Samsung", "unitPrice": 0.04, "note": "Standard alternative" }
      ]
    },
    {
      "id": "bom-045",
      "designator": "C43-C44",
      "mpn": "TAJA476K010RNJ",
      "manufacturer": "AVX",
      "description": "47uF tantalum capacitor, 10V, size A (3216)",
      "category": "Passive",
      "quantity": 2,
      "unitPrice": 0.42,
      "totalPrice": 0.84,
      "stock": 12000,
      "leadTime": 4,
      "lifecycle": "active",
      "risk": "low",
      "package": "3216-A",
      "specifications": { "capacitance": "47uF", "voltage": "10V", "esr": "3.0ohm", "type": "tantalum" },
      "alternates": [
        { "mpn": "T491A476K010AT", "manufacturer": "KEMET", "unitPrice": 0.38, "note": "Standard alternative" }
      ]
    }
  ]
}

src/mocks/data/bom-risk.json

Aggregated risk summary computed from the BOM. Two NRND components (LP2985-33DBVR and NCP186AMT330TAG), one long-lead-time part (ICM-42688-P), and two single-source items (SX1262IMLTRT, MAX-M10S).

{
  "overallScore": 34,
  "totalComponents": 45,
  "totalUniqueParts": 45,
  "totalPlacements": 312,
  "totalCost": 92.67,
  "singleSourceCount": 2,
  "singleSourceParts": [
    { "mpn": "SX1262IMLTRT", "manufacturer": "Semtech", "reason": "Sole LoRa transceiver manufacturer" },
    { "mpn": "MAX-M10S", "manufacturer": "u-blox", "reason": "Proprietary GNSS platform" }
  ],
  "eolCount": 0,
  "eolParts": [],
  "nrndCount": 2,
  "nrndParts": [
    { "mpn": "LP2985-33DBVR", "manufacturer": "Texas Instruments", "replacement": "TLV75533PDBVR" },
    { "mpn": "NCP186AMT330TAG", "manufacturer": "onsemi", "replacement": "NCV8163AMT330TAG" }
  ],
  "longLeadCount": 1,
  "longLeadParts": [
    { "mpn": "ICM-42688-P", "manufacturer": "TDK InvenSense", "leadTime": 18, "threshold": 12 }
  ],
  "riskBreakdown": {
    "high": 3,
    "medium": 2,
    "low": 40
  },
  "categoryBreakdown": [
    { "category": "MCU", "count": 2, "cost": 15.30 },
    { "category": "Sensor", "count": 5, "cost": 13.45 },
    { "category": "Power", "count": 8, "cost": 13.43 },
    { "category": "Connectivity", "count": 3, "cost": 20.40 },
    { "category": "Motor Driver", "count": 1, "cost": 15.20 },
    { "category": "Memory", "count": 2, "cost": 3.60 },
    { "category": "Security", "count": 1, "cost": 0.72 },
    { "category": "Logic", "count": 2, "cost": 2.24 },
    { "category": "Crystal/Oscillator", "count": 3, "cost": 1.10 },
    { "category": "Inductor", "count": 2, "cost": 1.82 },
    { "category": "Connector", "count": 5, "cost": 4.23 },
    { "category": "Diode", "count": 2, "cost": 0.62 },
    { "category": "MOSFET", "count": 2, "cost": 1.30 },
    { "category": "Passive", "count": 7, "cost": 1.88 }
  ]
}

src/mocks/data/compliance.json

Three target markets with partial evidence checklists. The drone flight controller requires radio, EMC, and electrical safety certifications.

{
  "markets": [
    {
      "market": "UKCA",
      "overallProgress": 55,
      "regimes": [
        {
          "id": "ukca-rer",
          "name": "Radio Equipment Regulations 2017",
          "shortName": "RER 2017",
          "progress": 70,
          "evidenceItems": [
            { "id": "ukca-rer-001", "description": "RF conducted emissions test report (EN 300 328)", "status": "approved", "submittedDate": "2025-01-10T00:00:00Z", "approvedDate": "2025-01-12T00:00:00Z" },
            { "id": "ukca-rer-002", "description": "RF radiated emissions test report (EN 300 328)", "status": "approved", "submittedDate": "2025-01-10T00:00:00Z", "approvedDate": "2025-01-12T00:00:00Z" },
            { "id": "ukca-rer-003", "description": "Receiver blocking and spurious response", "status": "submitted", "submittedDate": "2025-01-20T00:00:00Z", "approvedDate": null },
            { "id": "ukca-rer-004", "description": "Receiver sensitivity and co-channel rejection", "status": "submitted", "submittedDate": "2025-01-20T00:00:00Z", "approvedDate": null },
            { "id": "ukca-rer-005", "description": "LoRa band-specific compliance (EN 300 220-2)", "status": "pending", "submittedDate": null, "approvedDate": null },
            { "id": "ukca-rer-006", "description": "GNSS receiver performance declaration", "status": "pending", "submittedDate": null, "approvedDate": null }
          ]
        },
        {
          "id": "ukca-emc",
          "name": "Electromagnetic Compatibility Regulations 2016",
          "shortName": "EMC 2016",
          "progress": 50,
          "evidenceItems": [
            { "id": "ukca-emc-001", "description": "Conducted emissions (EN 55032 Class B)", "status": "approved", "submittedDate": "2025-01-08T00:00:00Z", "approvedDate": "2025-01-11T00:00:00Z" },
            { "id": "ukca-emc-002", "description": "Radiated emissions (EN 55032 Class B)", "status": "approved", "submittedDate": "2025-01-08T00:00:00Z", "approvedDate": "2025-01-11T00:00:00Z" },
            { "id": "ukca-emc-003", "description": "ESD immunity (EN 61000-4-2)", "status": "submitted", "submittedDate": "2025-01-18T00:00:00Z", "approvedDate": null },
            { "id": "ukca-emc-004", "description": "Radiated immunity (EN 61000-4-3)", "status": "pending", "submittedDate": null, "approvedDate": null },
            { "id": "ukca-emc-005", "description": "Electrical fast transient (EN 61000-4-4)", "status": "pending", "submittedDate": null, "approvedDate": null },
            { "id": "ukca-emc-006", "description": "Surge immunity (EN 61000-4-5)", "status": "pending", "submittedDate": null, "approvedDate": null }
          ]
        },
        {
          "id": "ukca-esr",
          "name": "Electrical Equipment (Safety) Regulations 2016",
          "shortName": "Safety 2016",
          "progress": 45,
          "evidenceItems": [
            { "id": "ukca-esr-001", "description": "Insulation resistance and dielectric strength", "status": "approved", "submittedDate": "2025-01-05T00:00:00Z", "approvedDate": "2025-01-09T00:00:00Z" },
            { "id": "ukca-esr-002", "description": "Touch current and protective conductor current", "status": "submitted", "submittedDate": "2025-01-19T00:00:00Z", "approvedDate": null },
            { "id": "ukca-esr-003", "description": "Battery safety (IEC 62133-2)", "status": "pending", "submittedDate": null, "approvedDate": null },
            { "id": "ukca-esr-004", "description": "Temperature rise and thermal protection test", "status": "pending", "submittedDate": null, "approvedDate": null }
          ]
        }
      ]
    },
    {
      "market": "CE",
      "overallProgress": 45,
      "regimes": [
        {
          "id": "ce-red",
          "name": "Radio Equipment Directive 2014/53/EU",
          "shortName": "RED",
          "progress": 60,
          "evidenceItems": [
            { "id": "ce-red-001", "description": "Essential requirements Art.3.1(a) — Health & Safety", "status": "approved", "submittedDate": "2025-01-06T00:00:00Z", "approvedDate": "2025-01-10T00:00:00Z" },
            { "id": "ce-red-002", "description": "Essential requirements Art.3.1(b) — EMC", "status": "approved", "submittedDate": "2025-01-06T00:00:00Z", "approvedDate": "2025-01-10T00:00:00Z" },
            { "id": "ce-red-003", "description": "Essential requirements Art.3.2 — Spectrum efficiency", "status": "submitted", "submittedDate": "2025-01-21T00:00:00Z", "approvedDate": null },
            { "id": "ce-red-004", "description": "EU Declaration of Conformity draft", "status": "pending", "submittedDate": null, "approvedDate": null },
            { "id": "ce-red-005", "description": "Technical documentation package", "status": "pending", "submittedDate": null, "approvedDate": null }
          ]
        },
        {
          "id": "ce-emcd",
          "name": "EMC Directive 2014/30/EU",
          "shortName": "EMCD",
          "progress": 40,
          "evidenceItems": [
            { "id": "ce-emcd-001", "description": "EN 55032 emissions test report", "status": "approved", "submittedDate": "2025-01-08T00:00:00Z", "approvedDate": "2025-01-11T00:00:00Z" },
            { "id": "ce-emcd-002", "description": "EN 55035 immunity test report", "status": "submitted", "submittedDate": "2025-01-22T00:00:00Z", "approvedDate": null },
            { "id": "ce-emcd-003", "description": "EMC risk assessment document", "status": "pending", "submittedDate": null, "approvedDate": null },
            { "id": "ce-emcd-004", "description": "EMC design justification file", "status": "pending", "submittedDate": null, "approvedDate": null },
            { "id": "ce-emcd-005", "description": "Harmonised standard applicability matrix", "status": "pending", "submittedDate": null, "approvedDate": null }
          ]
        },
        {
          "id": "ce-lvd",
          "name": "Low Voltage Directive 2014/35/EU",
          "shortName": "LVD",
          "progress": 35,
          "evidenceItems": [
            { "id": "ce-lvd-001", "description": "EN 62368-1 safety test report", "status": "submitted", "submittedDate": "2025-01-15T00:00:00Z", "approvedDate": null },
            { "id": "ce-lvd-002", "description": "Safety risk assessment (EN ISO 12100)", "status": "pending", "submittedDate": null, "approvedDate": null },
            { "id": "ce-lvd-003", "description": "Battery subsystem safety evaluation (IEC 62133-2)", "status": "pending", "submittedDate": null, "approvedDate": null }
          ]
        }
      ]
    },
    {
      "market": "FCC",
      "overallProgress": 30,
      "regimes": [
        {
          "id": "fcc-15",
          "name": "FCC Part 15 — Unintentional Radiators",
          "shortName": "Part 15",
          "progress": 40,
          "evidenceItems": [
            { "id": "fcc-15-001", "description": "Conducted emissions (FCC Part 15 Subpart B)", "status": "approved", "submittedDate": "2025-01-09T00:00:00Z", "approvedDate": "2025-01-13T00:00:00Z" },
            { "id": "fcc-15-002", "description": "Radiated emissions (FCC Part 15 Subpart B)", "status": "submitted", "submittedDate": "2025-01-23T00:00:00Z", "approvedDate": null },
            { "id": "fcc-15-003", "description": "AC power line conducted emissions", "status": "pending", "submittedDate": null, "approvedDate": null },
            { "id": "fcc-15-004", "description": "FCC ID application package", "status": "pending", "submittedDate": null, "approvedDate": null },
            { "id": "fcc-15-005", "description": "Equipment authorization (Supplier DoC)", "status": "pending", "submittedDate": null, "approvedDate": null }
          ]
        },
        {
          "id": "fcc-15-247",
          "name": "FCC Part 15.247 — Spread Spectrum / Digital Modulation",
          "shortName": "Part 15.247",
          "progress": 20,
          "evidenceItems": [
            { "id": "fcc-247-001", "description": "Occupied bandwidth and power spectral density", "status": "submitted", "submittedDate": "2025-01-24T00:00:00Z", "approvedDate": null },
            { "id": "fcc-247-002", "description": "Antenna conducted output power", "status": "pending", "submittedDate": null, "approvedDate": null },
            { "id": "fcc-247-003", "description": "6 dB bandwidth and hopping sequence documentation", "status": "pending", "submittedDate": null, "approvedDate": null },
            { "id": "fcc-247-004", "description": "Spurious emissions (restricted bands)", "status": "pending", "submittedDate": null, "approvedDate": null },
            { "id": "fcc-247-005", "description": "Certification application (FCC Form 731)", "status": "pending", "submittedDate": null, "approvedDate": null }
          ]
        }
      ]
    }
  ]
}

src/mocks/data/digital-thread.json

A representative subgraph of the full digital thread with 30 nodes and 45 edges showing traceability from requirements through design, components, tests, evidence, and certifications.

{
  "nodes": [
    { "id": "REQ-001", "type": "requirement", "label": "Flight controller shall support 4 independent BLDC motors", "status": "verified", "priority": "critical" },
    { "id": "REQ-002", "type": "requirement", "label": "System shall fuse data from dual redundant IMUs at >= 400 Hz", "status": "verified", "priority": "critical" },
    { "id": "REQ-003", "type": "requirement", "label": "3.3V rail ripple shall not exceed 50mV under full motor load", "status": "verified", "priority": "high" },
    { "id": "REQ-004", "type": "requirement", "label": "System shall provide GPS/GLONASS/Galileo/BeiDou positioning", "status": "verified", "priority": "high" },
    { "id": "REQ-005", "type": "requirement", "label": "Wireless telemetry via WiFi (primary) and LoRa (long-range)", "status": "in-progress", "priority": "high" },
    { "id": "REQ-006", "type": "requirement", "label": "Firmware OTA update capability over WiFi", "status": "in-progress", "priority": "medium" },
    { "id": "REQ-007", "type": "requirement", "label": "System shall comply with FCC Part 15 and CE RED", "status": "in-progress", "priority": "critical" },
    { "id": "REQ-008", "type": "requirement", "label": "Operating temperature range -20C to +60C", "status": "not-started", "priority": "medium" },

    { "id": "DES-PWR", "type": "design", "label": "Power Subsystem", "subsystem": "power", "revision": "B" },
    { "id": "DES-SNS", "type": "design", "label": "Sensor Fusion Module", "subsystem": "sensors", "revision": "B" },
    { "id": "DES-COM", "type": "design", "label": "Communications Module", "subsystem": "comms", "revision": "A" },
    { "id": "DES-MOT", "type": "design", "label": "Motor Control Subsystem", "subsystem": "motor", "revision": "B" },
    { "id": "DES-FCC", "type": "design", "label": "Flight Controller Core", "subsystem": "controller", "revision": "B" },
    { "id": "DES-ENC", "type": "design", "label": "Enclosure & Thermal", "subsystem": "enclosure", "revision": "A" },

    { "id": "CMP-STM32H7", "type": "component", "label": "STM32H743VIT6", "bomRef": "bom-001" },
    { "id": "CMP-BMI270", "type": "component", "label": "BMI270", "bomRef": "bom-003" },
    { "id": "CMP-ICM42688", "type": "component", "label": "ICM-42688-P", "bomRef": "bom-005" },
    { "id": "CMP-DRV8313", "type": "component", "label": "DRV8313PWPR", "bomRef": "bom-014" },
    { "id": "CMP-ESP32S3", "type": "component", "label": "ESP32-S3-WROOM-1", "bomRef": "bom-011" },
    { "id": "CMP-SX1262", "type": "component", "label": "SX1262IMLTRT", "bomRef": "bom-012" },
    { "id": "CMP-MAXM10S", "type": "component", "label": "MAX-M10S", "bomRef": "bom-013" },
    { "id": "CMP-TPS62823", "type": "component", "label": "TPS62823DLCR", "bomRef": "bom-007" },

    { "id": "TST-001", "type": "test", "label": "Motor driver thermal stress test", "status": "passed" },
    { "id": "TST-002", "type": "test", "label": "Dual IMU fusion accuracy test", "status": "passed" },
    { "id": "TST-003", "type": "test", "label": "Power rail ripple under load", "status": "passed" },
    { "id": "TST-004", "type": "test", "label": "LoRa range and throughput test", "status": "pending" },

    { "id": "EVD-001", "type": "evidence", "label": "SPICE simulation report — power rail analysis", "artifactRef": "art-013" },
    { "id": "EVD-002", "type": "evidence", "label": "DRC report — clean pass with 1 advisory", "artifactRef": "art-008" },

    { "id": "CRT-FCC", "type": "certification", "label": "FCC Part 15 Certification", "market": "FCC", "status": "in-progress" },
    { "id": "CRT-CE", "type": "certification", "label": "CE RED Certification", "market": "CE", "status": "in-progress" }
  ],
  "edges": [
    { "source": "REQ-001", "target": "DES-MOT", "relationship": "SATISFIED_BY" },
    { "source": "REQ-001", "target": "CMP-DRV8313", "relationship": "SATISFIED_BY" },
    { "source": "REQ-002", "target": "DES-SNS", "relationship": "SATISFIED_BY" },
    { "source": "REQ-002", "target": "CMP-BMI270", "relationship": "SATISFIED_BY" },
    { "source": "REQ-002", "target": "CMP-ICM42688", "relationship": "SATISFIED_BY" },
    { "source": "REQ-003", "target": "DES-PWR", "relationship": "SATISFIED_BY" },
    { "source": "REQ-003", "target": "CMP-TPS62823", "relationship": "SATISFIED_BY" },
    { "source": "REQ-004", "target": "DES-COM", "relationship": "SATISFIED_BY" },
    { "source": "REQ-004", "target": "CMP-MAXM10S", "relationship": "SATISFIED_BY" },
    { "source": "REQ-005", "target": "DES-COM", "relationship": "SATISFIED_BY" },
    { "source": "REQ-005", "target": "CMP-ESP32S3", "relationship": "SATISFIED_BY" },
    { "source": "REQ-005", "target": "CMP-SX1262", "relationship": "SATISFIED_BY" },
    { "source": "REQ-006", "target": "CMP-ESP32S3", "relationship": "SATISFIED_BY" },
    { "source": "REQ-006", "target": "DES-FCC", "relationship": "SATISFIED_BY" },
    { "source": "REQ-007", "target": "CRT-FCC", "relationship": "SATISFIED_BY" },
    { "source": "REQ-007", "target": "CRT-CE", "relationship": "SATISFIED_BY" },
    { "source": "REQ-008", "target": "DES-ENC", "relationship": "SATISFIED_BY" },

    { "source": "DES-FCC", "target": "CMP-STM32H7", "relationship": "MANUFACTURED_BY" },
    { "source": "DES-SNS", "target": "CMP-BMI270", "relationship": "MANUFACTURED_BY" },
    { "source": "DES-SNS", "target": "CMP-ICM42688", "relationship": "MANUFACTURED_BY" },
    { "source": "DES-MOT", "target": "CMP-DRV8313", "relationship": "MANUFACTURED_BY" },
    { "source": "DES-COM", "target": "CMP-ESP32S3", "relationship": "MANUFACTURED_BY" },
    { "source": "DES-COM", "target": "CMP-SX1262", "relationship": "MANUFACTURED_BY" },
    { "source": "DES-COM", "target": "CMP-MAXM10S", "relationship": "MANUFACTURED_BY" },
    { "source": "DES-PWR", "target": "CMP-TPS62823", "relationship": "MANUFACTURED_BY" },

    { "source": "CMP-DRV8313", "target": "TST-001", "relationship": "TESTED_BY" },
    { "source": "CMP-BMI270", "target": "TST-002", "relationship": "TESTED_BY" },
    { "source": "CMP-ICM42688", "target": "TST-002", "relationship": "TESTED_BY" },
    { "source": "CMP-TPS62823", "target": "TST-003", "relationship": "TESTED_BY" },
    { "source": "CMP-SX1262", "target": "TST-004", "relationship": "TESTED_BY" },
    { "source": "DES-MOT", "target": "TST-001", "relationship": "TESTED_BY" },
    { "source": "DES-SNS", "target": "TST-002", "relationship": "TESTED_BY" },
    { "source": "DES-PWR", "target": "TST-003", "relationship": "TESTED_BY" },
    { "source": "DES-COM", "target": "TST-004", "relationship": "TESTED_BY" },

    { "source": "TST-003", "target": "EVD-001", "relationship": "PRODUCES" },
    { "source": "DES-FCC", "target": "EVD-002", "relationship": "PRODUCES" },

    { "source": "EVD-001", "target": "CRT-CE", "relationship": "JUSTIFIES" },
    { "source": "EVD-002", "target": "CRT-CE", "relationship": "JUSTIFIES" },
    { "source": "EVD-001", "target": "CRT-FCC", "relationship": "JUSTIFIES" },
    { "source": "EVD-002", "target": "CRT-FCC", "relationship": "JUSTIFIES" },

    { "source": "REQ-001", "target": "TST-001", "relationship": "VERIFIED_BY" },
    { "source": "REQ-002", "target": "TST-002", "relationship": "VERIFIED_BY" },
    { "source": "REQ-003", "target": "TST-003", "relationship": "VERIFIED_BY" },
    { "source": "REQ-005", "target": "TST-004", "relationship": "VERIFIED_BY" },
    { "source": "REQ-007", "target": "CRT-FCC", "relationship": "VERIFIED_BY" }
  ]
}

src/mocks/data/supply-chain.json

Active supply chain risk items flagged by the SC agent analysis.

{
  "risks": [
    {
      "id": "scr-001",
      "mpn": "ICM-42688-P",
      "manufacturer": "TDK InvenSense",
      "category": "lead_time",
      "severity": "high",
      "title": "18-week lead time on backup IMU",
      "description": "ICM-42688-P has an 18-week lead time across all major distributors (DigiKey, Mouser, LCSC). Current stock at DigiKey is 320 units. At projected consumption of 500 units/month for DVT, stock will be exhausted before replenishment.",
      "impact": "DVT build may be delayed by 8-10 weeks if not addressed",
      "mitigation": "Place advance order immediately or qualify ICM-42605 (8-week lead) as alternate",
      "detectedAt": "2025-01-25T08:42:00Z",
      "bomRef": "bom-005",
      "distributorStock": [
        { "distributor": "DigiKey", "stock": 320, "leadTime": 18, "unitPrice": 4.50 },
        { "distributor": "Mouser", "stock": 0, "leadTime": 20, "unitPrice": 4.65 },
        { "distributor": "LCSC", "stock": 145, "leadTime": 16, "unitPrice": 4.30 }
      ]
    },
    {
      "id": "scr-002",
      "mpn": "LP2985-33DBVR",
      "manufacturer": "Texas Instruments",
      "category": "lifecycle",
      "severity": "high",
      "title": "NRND status — LP2985-33DBVR",
      "description": "Texas Instruments has marked LP2985-33DBVR as Not Recommended for New Designs. Product change notification (PCN) issued 2024-09-15. Last-time buy date not yet announced but typically 12-18 months after NRND.",
      "impact": "Component may become unavailable during production ramp. Design change required.",
      "mitigation": "Replace with TLV75533PDBVR (pin-compatible, better dropout, lower cost). BOM change pending approval.",
      "detectedAt": "2025-01-25T08:38:00Z",
      "bomRef": "bom-009",
      "distributorStock": [
        { "distributor": "DigiKey", "stock": 2100, "leadTime": 10, "unitPrice": 0.65 },
        { "distributor": "Mouser", "stock": 1800, "leadTime": 12, "unitPrice": 0.68 },
        { "distributor": "LCSC", "stock": 5200, "leadTime": 6, "unitPrice": 0.45 }
      ]
    },
    {
      "id": "scr-003",
      "mpn": "MAX-M10S",
      "manufacturer": "u-blox",
      "category": "single_source",
      "severity": "medium",
      "title": "Single source — GNSS module",
      "description": "MAX-M10S is a u-blox proprietary GNSS module with no second-source equivalent. The M10 platform uses u-blox's proprietary baseband and RF front-end. Quectel LC29H is a potential alternate but requires PCB redesign due to different footprint.",
      "impact": "Any u-blox supply disruption would halt production. Alternate requires board respin.",
      "mitigation": "Maintain 3-month safety stock. Evaluate Quectel LC29H for rev C board layout.",
      "detectedAt": "2025-01-25T08:40:00Z",
      "bomRef": "bom-013",
      "distributorStock": [
        { "distributor": "DigiKey", "stock": 2400, "leadTime": 10, "unitPrice": 12.80 },
        { "distributor": "Mouser", "stock": 1200, "leadTime": 12, "unitPrice": 13.10 },
        { "distributor": "LCSC", "stock": 800, "leadTime": 8, "unitPrice": 11.50 }
      ]
    },
    {
      "id": "scr-004",
      "mpn": "SX1262IMLTRT",
      "manufacturer": "Semtech",
      "category": "single_source",
      "severity": "medium",
      "title": "Single source — LoRa transceiver",
      "description": "Semtech holds exclusive patents on LoRa modulation. SX1262IMLTRT and all LoRa-compatible transceivers are manufactured solely by Semtech. LLCC68 is a cost-reduced variant but still single-source.",
      "impact": "No alternative LoRa supplier exists. Sub-GHz ISM alternatives (Sigfox, proprietary FSK) would require protocol redesign.",
      "mitigation": "Maintain safety stock. Consider dual-protocol support (LoRa + proprietary FSK fallback) in firmware.",
      "detectedAt": "2025-01-25T08:41:00Z",
      "bomRef": "bom-012",
      "distributorStock": [
        { "distributor": "DigiKey", "stock": 1800, "leadTime": 8, "unitPrice": 4.20 },
        { "distributor": "Mouser", "stock": 2200, "leadTime": 8, "unitPrice": 4.25 },
        { "distributor": "LCSC", "stock": 3400, "leadTime": 6, "unitPrice": 3.80 }
      ]
    },
    {
      "id": "scr-005",
      "mpn": "IS42S16400J-7TLI",
      "manufacturer": "ISSI",
      "category": "price_volatility",
      "severity": "low",
      "title": "Price increase — SDRAM +15%",
      "description": "IS42S16400J-7TLI unit price has increased 15% over the last quarter ($2.09 -> $2.40) at DigiKey. DRAM spot market trends suggest continued upward pressure due to data center demand affecting legacy node capacity allocation.",
      "impact": "BOM cost increase of $0.31 per unit. Minimal impact at current volumes.",
      "mitigation": "Lock pricing with distributor via blanket PO for 6-month supply. Alliance Memory AS4C4M16SA-7TIN is pin-compatible at $2.20.",
      "detectedAt": "2025-01-25T08:43:00Z",
      "bomRef": "bom-016",
      "distributorStock": [
        { "distributor": "DigiKey", "stock": 5600, "leadTime": 8, "unitPrice": 2.40 },
        { "distributor": "Mouser", "stock": 3200, "leadTime": 10, "unitPrice": 2.45 },
        { "distributor": "LCSC", "stock": 8800, "leadTime": 6, "unitPrice": 2.15 }
      ]
    }
  ]
}

src/mocks/data/approvals.json

Three pending approvals awaiting human review in the approval queue.

{
  "pending": [
    {
      "id": "appr-001",
      "sessionId": "ses-006",
      "agent": "TST",
      "title": "DVT Test Plan Approval",
      "description": "Test Engineering Agent generated a DVT test plan covering 45 test cases across 6 categories. Includes FMEA table with 12 identified failure modes. Requires engineering lead approval before DVT execution can begin.",
      "requestedAt": "2025-01-24T09:38:50Z",
      "requestedBy": "agent-tst",
      "priority": "high",
      "changes": [
        { "path": "test_plan.md", "action": "add", "additions": 842, "deletions": 0, "size": 34200 },
        { "path": "fmea_table.csv", "action": "add", "additions": 156, "deletions": 0, "size": 8400 },
        { "path": "requirements_matrix.csv", "action": "modify", "additions": 45, "deletions": 12, "size": 14200 }
      ],
      "context": {
        "gate": "DVT",
        "blockedBy": [],
        "blocking": ["DVT test execution", "Gate readiness review"]
      }
    },
    {
      "id": "appr-002",
      "sessionId": "ses-008",
      "agent": "SC",
      "title": "BOM Alternate: LP2985 Replacement",
      "description": "Supply Chain Agent recommends replacing LP2985-33DBVR (NRND) with TLV75533PDBVR. Drop-in replacement with better dropout voltage (130mV vs 280mV), lower cost ($0.55 vs $0.65), and active lifecycle status. Pin-compatible SOT-23-5 package.",
      "requestedAt": "2025-01-25T08:44:00Z",
      "requestedBy": "agent-sc",
      "priority": "medium",
      "changes": [
        { "path": "bom.csv", "action": "modify", "additions": 1, "deletions": 1, "size": 14900 }
      ],
      "context": {
        "gate": "DVT",
        "blockedBy": [],
        "blocking": ["Gerber export finalization"],
        "oldPart": { "mpn": "LP2985-33DBVR", "manufacturer": "Texas Instruments", "unitPrice": 0.65, "lifecycle": "NRND" },
        "newPart": { "mpn": "TLV75533PDBVR", "manufacturer": "Texas Instruments", "unitPrice": 0.55, "lifecycle": "active" }
      }
    },
    {
      "id": "appr-003",
      "sessionId": "ses-004",
      "agent": "FW",
      "title": "Firmware HAL Update — New IMU Driver",
      "description": "Firmware Agent generated a new ICM-42688-P driver to support the backup IMU. Includes SPI initialization, FIFO configuration, and sensor fusion integration. Also updates CMakeLists.txt to include the new source file.",
      "requestedAt": "2025-01-25T09:00:00Z",
      "requestedBy": "agent-fw",
      "priority": "medium",
      "changes": [
        { "path": "firmware/src/drivers/icm42688.c", "action": "add", "additions": 285, "deletions": 0, "size": 9200 },
        { "path": "firmware/src/drivers/icm42688.h", "action": "add", "additions": 68, "deletions": 0, "size": 2400 },
        { "path": "firmware/CMakeLists.txt", "action": "modify", "additions": 3, "deletions": 1, "size": 2900 }
      ],
      "context": {
        "gate": "DVT",
        "blockedBy": ["Backup IMU hardware availability"],
        "blocking": ["Sensor fusion validation test"]
      }
    }
  ]
}

src/mocks/data/artifacts.json

Artifacts produced by completed sessions. Each entry includes metadata for display in the session detail view and artifact browser.

{
  "artifacts": [
    {
      "id": "art-001",
      "sessionId": "ses-001",
      "agent": "REQ",
      "path": "constraints.json",
      "filename": "constraints.json",
      "type": "json",
      "mimeType": "application/json",
      "size": 8432,
      "description": "Extracted hardware constraints from PRD (42 requirements, electrical/mechanical/environmental)",
      "createdAt": "2025-01-15T09:12:34Z",
      "checksum": "sha256:a1b2c3d4e5f6789012345678abcdef0123456789abcdef0123456789abcdef01"
    },
    {
      "id": "art-002",
      "sessionId": "ses-001",
      "agent": "REQ",
      "path": "requirements_matrix.csv",
      "filename": "requirements_matrix.csv",
      "type": "csv",
      "mimeType": "text/csv",
      "size": 12840,
      "description": "Requirements traceability matrix — 42 requirements mapped to subsystems and verification methods",
      "createdAt": "2025-01-15T09:12:34Z",
      "checksum": "sha256:b2c3d4e5f678901234567890bcdef0123456789abcdef0123456789abcdef0123"
    },
    {
      "id": "art-003",
      "sessionId": "ses-001",
      "agent": "REQ",
      "path": "prd_summary.md",
      "filename": "prd_summary.md",
      "type": "markdown",
      "mimeType": "text/markdown",
      "size": 3200,
      "description": "Executive summary of product requirements with key decisions and open questions",
      "createdAt": "2025-01-15T09:12:34Z",
      "checksum": "sha256:c3d4e5f67890123456789012cdef0123456789abcdef0123456789abcdef012345"
    },
    {
      "id": "art-004",
      "sessionId": "ses-002",
      "agent": "SYS",
      "path": "architecture.md",
      "filename": "architecture.md",
      "type": "markdown",
      "mimeType": "text/markdown",
      "size": 18200,
      "description": "System architecture document — 6 subsystems, 14 interfaces, power budget, and communication protocols",
      "createdAt": "2025-01-16T10:22:15Z",
      "checksum": "sha256:d4e5f6789012345678901234def0123456789abcdef0123456789abcdef0123456"
    },
    {
      "id": "art-005",
      "sessionId": "ses-002",
      "agent": "SYS",
      "path": "block_diagram.mermaid",
      "filename": "block_diagram.mermaid",
      "type": "mermaid",
      "mimeType": "text/plain",
      "size": 4100,
      "description": "System block diagram in Mermaid format showing all subsystems and data flows",
      "createdAt": "2025-01-16T10:22:15Z",
      "checksum": "sha256:e5f678901234567890123456ef0123456789abcdef0123456789abcdef01234567"
    },
    {
      "id": "art-006",
      "sessionId": "ses-002",
      "agent": "SYS",
      "path": "interface_spec.json",
      "filename": "interface_spec.json",
      "type": "json",
      "mimeType": "application/json",
      "size": 9600,
      "description": "Interface specification for 14 inter-subsystem interfaces (SPI, I2C, UART, PWM, GPIO)",
      "createdAt": "2025-01-16T10:22:15Z",
      "checksum": "sha256:f6789012345678901234567890123456789abcdef0123456789abcdef012345678"
    },
    {
      "id": "art-007",
      "sessionId": "ses-003",
      "agent": "EE",
      "path": "board.kicad_sch",
      "filename": "board.kicad_sch",
      "type": "kicad_schematic",
      "mimeType": "application/x-kicad-schematic",
      "size": 245000,
      "description": "KiCad schematic (6 sheets) — 312 components, passed ERC with 3 warnings",
      "createdAt": "2025-01-18T09:15:42Z",
      "checksum": "sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01"
    },
    {
      "id": "art-008",
      "sessionId": "ses-003",
      "agent": "EE",
      "path": "drc_report.json",
      "filename": "drc_report.json",
      "type": "json",
      "mimeType": "application/json",
      "size": 6200,
      "description": "Design Rules Check report — 0 errors, 1 warning (trace clearance on U3 pad 12)",
      "createdAt": "2025-01-18T09:15:42Z",
      "checksum": "sha256:123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123"
    },
    {
      "id": "art-009",
      "sessionId": "ses-003",
      "agent": "EE",
      "path": "bom.csv",
      "filename": "bom.csv",
      "type": "csv",
      "mimeType": "text/csv",
      "size": 14800,
      "description": "Bill of Materials export — 45 unique components, 312 placements, $92.67 total unit cost",
      "createdAt": "2025-01-18T09:15:42Z",
      "checksum": "sha256:23456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234"
    },
    {
      "id": "art-010",
      "sessionId": "ses-004",
      "agent": "FW",
      "path": "firmware/src/main.c",
      "filename": "main.c",
      "type": "c_source",
      "mimeType": "text/x-csrc",
      "size": 4200,
      "description": "Firmware entry point — system init, RTOS task creation, watchdog configuration",
      "createdAt": "2025-01-20T11:34:22Z",
      "checksum": "sha256:3456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef012345"
    },
    {
      "id": "art-011",
      "sessionId": "ses-004",
      "agent": "FW",
      "path": "firmware/CMakeLists.txt",
      "filename": "CMakeLists.txt",
      "type": "cmake",
      "mimeType": "text/plain",
      "size": 2800,
      "description": "CMake build configuration for STM32H743 target with arm-none-eabi toolchain",
      "createdAt": "2025-01-20T11:34:22Z",
      "checksum": "sha256:456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456"
    },
    {
      "id": "art-013",
      "sessionId": "ses-005",
      "agent": "SIM",
      "path": "spice_results.json",
      "filename": "spice_results.json",
      "type": "json",
      "mimeType": "application/json",
      "size": 52400,
      "description": "NGSpice simulation results — DC operating points, transient analysis, power rail characterization",
      "createdAt": "2025-01-22T14:45:18Z",
      "checksum": "sha256:6789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
    },
    {
      "id": "art-014",
      "sessionId": "ses-005",
      "agent": "SIM",
      "path": "power_analysis.pdf",
      "filename": "power_analysis.pdf",
      "type": "pdf",
      "mimeType": "application/pdf",
      "size": 184000,
      "description": "Power analysis report with waveform plots — 3.3V ripple 18mV (spec <50mV), all rails PASS",
      "createdAt": "2025-01-22T14:45:18Z",
      "checksum": "sha256:789abcdef0123456789abcdef0123456789abcdef0123456789abcdef012345678"
    },
    {
      "id": "art-016",
      "sessionId": "ses-006",
      "agent": "TST",
      "path": "test_plan.md",
      "filename": "test_plan.md",
      "type": "markdown",
      "mimeType": "text/markdown",
      "size": 34200,
      "description": "DVT test plan — 45 test cases, 6 categories, pass/fail criteria, equipment requirements",
      "createdAt": "2025-01-24T09:38:50Z",
      "checksum": "sha256:9abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
    }
  ]
}

src/mocks/data/health.json

Healthy system status with all Phase 1 tools detected.

{
  "status": "healthy",
  "version": "0.1.0",
  "uptime": 14400,
  "timestamp": "2025-01-25T12:00:00Z",
  "components": {
    "gateway": "ok",
    "llm_provider": "ok",
    "workspace": "ok",
    "tools": [
      { "name": "kicad", "version": "8.0.1", "available": true, "path": "/usr/bin/kicad-cli" },
      { "name": "ngspice", "version": "42", "available": true, "path": "/usr/bin/ngspice" },
      { "name": "python", "version": "3.12.1", "available": true, "path": "/usr/bin/python3" },
      { "name": "cmake", "version": "3.28.1", "available": true, "path": "/usr/bin/cmake" },
      { "name": "arm-none-eabi-gcc", "version": "13.2.0", "available": true, "path": "/usr/bin/arm-none-eabi-gcc" },
      { "name": "openocd", "version": "0.12.0", "available": true, "path": "/usr/bin/openocd" }
    ]
  }
}

src/mocks/data/gate-readiness.json

Gate readiness scores for EVT, DVT, and PVT milestones. DVT is the current target gate with blockers identified.

{
  "gates": [
    {
      "gate": "EVT",
      "score": 88,
      "status": "ready",
      "updatedAt": "2025-01-25T08:00:00Z",
      "breakdown": {
        "evidence": { "score": 92, "total": 24, "completed": 22, "label": "Evidence Completeness" },
        "defects": { "score": 85, "total": 20, "resolved": 17, "label": "Defect Resolution" },
        "requirements": { "score": 87, "total": 42, "verified": 37, "label": "Requirements Coverage" }
      },
      "blockers": []
    },
    {
      "gate": "DVT",
      "score": 62,
      "status": "at-risk",
      "updatedAt": "2025-01-25T08:00:00Z",
      "breakdown": {
        "evidence": { "score": 55, "total": 36, "completed": 20, "label": "Evidence Completeness" },
        "defects": { "score": 78, "total": 15, "resolved": 12, "label": "Defect Resolution" },
        "requirements": { "score": 53, "total": 42, "verified": 22, "label": "Requirements Coverage" }
      },
      "blockers": [
        "Test plan pending approval (ses-006)",
        "2 NRND components need alternates (LP2985-33DBVR, NCP186AMT330TAG)"
      ]
    },
    {
      "gate": "PVT",
      "score": 15,
      "status": "not-ready",
      "updatedAt": "2025-01-25T08:00:00Z",
      "breakdown": {
        "evidence": { "score": 12, "total": 48, "completed": 6, "label": "Evidence Completeness" },
        "defects": { "score": 20, "total": 10, "resolved": 2, "label": "Defect Resolution" },
        "requirements": { "score": 13, "total": 42, "verified": 5, "label": "Requirements Coverage" }
      },
      "blockers": [
        "DVT gate not yet passed",
        "Manufacturing DFM analysis incomplete",
        "Compliance evidence insufficient for all 3 markets",
        "Supply chain risks unresolved"
      ]
    }
  ]
}

src/mocks/data/testing.json

Test coverage data across all categories with FMEA entries for the drone flight controller.

{
  "summary": {
    "totalTestCases": 45,
    "passed": 28,
    "failed": 5,
    "pending": 12,
    "coverage": 62,
    "lastRunAt": "2025-01-24T09:38:50Z"
  },
  "categories": [
    {
      "name": "Power",
      "totalTests": 8,
      "passed": 6,
      "failed": 0,
      "pending": 2,
      "coverage": 75,
      "tests": [
        { "id": "tst-pwr-001", "name": "3.3V rail regulation under load", "status": "passed", "duration": 120 },
        { "id": "tst-pwr-002", "name": "3.3V rail ripple measurement", "status": "passed", "duration": 180 },
        { "id": "tst-pwr-003", "name": "Motor startup surge transient", "status": "passed", "duration": 240 },
        { "id": "tst-pwr-004", "name": "Battery charger CV/CC profile", "status": "passed", "duration": 600 },
        { "id": "tst-pwr-005", "name": "Power sequencing verification", "status": "passed", "duration": 90 },
        { "id": "tst-pwr-006", "name": "Reverse polarity protection", "status": "passed", "duration": 60 },
        { "id": "tst-pwr-007", "name": "Sleep mode current consumption", "status": "pending", "duration": null },
        { "id": "tst-pwr-008", "name": "Thermal shutdown recovery", "status": "pending", "duration": null }
      ]
    },
    {
      "name": "Communication",
      "totalTests": 6,
      "passed": 4,
      "failed": 0,
      "pending": 2,
      "coverage": 67,
      "tests": [
        { "id": "tst-com-001", "name": "WiFi throughput and range test", "status": "passed", "duration": 300 },
        { "id": "tst-com-002", "name": "BLE connection stability", "status": "passed", "duration": 180 },
        { "id": "tst-com-003", "name": "LoRa range test (1km LOS)", "status": "passed", "duration": 900 },
        { "id": "tst-com-004", "name": "GNSS time-to-first-fix (cold start)", "status": "passed", "duration": 120 },
        { "id": "tst-com-005", "name": "LoRa packet error rate at max range", "status": "pending", "duration": null },
        { "id": "tst-com-006", "name": "Simultaneous WiFi + LoRa operation", "status": "pending", "duration": null }
      ]
    },
    {
      "name": "Sensors",
      "totalTests": 8,
      "passed": 4,
      "failed": 2,
      "pending": 2,
      "coverage": 50,
      "tests": [
        { "id": "tst-sns-001", "name": "Primary IMU calibration accuracy", "status": "passed", "duration": 240 },
        { "id": "tst-sns-002", "name": "Backup IMU failover test", "status": "failed", "duration": 180, "failureReason": "I2C bus contention detected during failover — driver timing issue" },
        { "id": "tst-sns-003", "name": "Barometer altitude accuracy (+-1m)", "status": "passed", "duration": 600 },
        { "id": "tst-sns-004", "name": "Magnetometer hard/soft iron calibration", "status": "passed", "duration": 300 },
        { "id": "tst-sns-005", "name": "Sensor fusion Kalman filter convergence", "status": "passed", "duration": 420 },
        { "id": "tst-sns-006", "name": "IMU vibration rejection test", "status": "failed", "duration": 360, "failureReason": "Gyro drift exceeds 0.5 deg/s at 200Hz vibration — mounting needs damping" },
        { "id": "tst-sns-007", "name": "Temperature compensation across -20C to +60C", "status": "pending", "duration": null },
        { "id": "tst-sns-008", "name": "Dual-IMU fusion accuracy under vibration", "status": "pending", "duration": null }
      ]
    },
    {
      "name": "Motor Control",
      "totalTests": 5,
      "passed": 3,
      "failed": 1,
      "pending": 1,
      "coverage": 60,
      "tests": [
        { "id": "tst-mot-001", "name": "Motor driver thermal stress (continuous 2A)", "status": "passed", "duration": 1800 },
        { "id": "tst-mot-002", "name": "PWM frequency accuracy (20kHz)", "status": "passed", "duration": 60 },
        { "id": "tst-mot-003", "name": "Motor RPM closed-loop response time", "status": "passed", "duration": 120 },
        { "id": "tst-mot-004", "name": "Motor driver overcurrent protection", "status": "failed", "duration": 90, "failureReason": "OCP trigger at 2.8A instead of specified 2.5A — threshold resistor value needs adjustment" },
        { "id": "tst-mot-005", "name": "Motor brake and coast mode switching", "status": "pending", "duration": null }
      ]
    },
    {
      "name": "Firmware",
      "totalTests": 10,
      "passed": 7,
      "failed": 1,
      "pending": 2,
      "coverage": 70,
      "tests": [
        { "id": "tst-fw-001", "name": "Boot time measurement (<500ms)", "status": "passed", "duration": 10 },
        { "id": "tst-fw-002", "name": "Watchdog reset recovery", "status": "passed", "duration": 30 },
        { "id": "tst-fw-003", "name": "RTOS task scheduling latency", "status": "passed", "duration": 60 },
        { "id": "tst-fw-004", "name": "Flash wear-leveling write endurance", "status": "passed", "duration": 3600 },
        { "id": "tst-fw-005", "name": "OTA firmware update (WiFi)", "status": "passed", "duration": 45 },
        { "id": "tst-fw-006", "name": "OTA update rollback on checksum failure", "status": "passed", "duration": 30 },
        { "id": "tst-fw-007", "name": "Secure boot chain verification", "status": "passed", "duration": 15 },
        { "id": "tst-fw-008", "name": "Memory leak detection (72hr soak test)", "status": "failed", "duration": 259200, "failureReason": "Heap fragmentation after 48 hours — telemetry buffer not properly freed" },
        { "id": "tst-fw-009", "name": "I2C bus recovery after SDA stuck low", "status": "pending", "duration": null },
        { "id": "tst-fw-010", "name": "SPI DMA transfer integrity at max clock", "status": "pending", "duration": null }
      ]
    },
    {
      "name": "Environmental",
      "totalTests": 8,
      "passed": 4,
      "failed": 1,
      "pending": 3,
      "coverage": 38,
      "tests": [
        { "id": "tst-env-001", "name": "Operating temperature range (-20C to +60C)", "status": "passed", "duration": 7200 },
        { "id": "tst-env-002", "name": "Thermal cycling (100 cycles, -40C to +85C)", "status": "passed", "duration": 86400 },
        { "id": "tst-env-003", "name": "Humidity exposure (85C/85%RH, 168h)", "status": "passed", "duration": 604800 },
        { "id": "tst-env-004", "name": "Random vibration (MIL-STD-810H)", "status": "passed", "duration": 3600 },
        { "id": "tst-env-005", "name": "Mechanical shock (40G, 11ms half-sine)", "status": "failed", "duration": 60, "failureReason": "U.FL antenna connector dislodged at 35G — retention clip needed" },
        { "id": "tst-env-006", "name": "Salt fog corrosion (48h)", "status": "pending", "duration": null },
        { "id": "tst-env-007", "name": "IP54 ingress protection", "status": "pending", "duration": null },
        { "id": "tst-env-008", "name": "Altitude simulation (0-5000m)", "status": "pending", "duration": null }
      ]
    }
  ],
  "fmea": [
    {
      "id": "fmea-001",
      "component": "DRV8313PWPR",
      "failureMode": "Motor driver thermal shutdown during sustained high-current operation",
      "effect": "Motor stops unexpectedly, drone loses altitude control",
      "cause": "Inadequate heatsinking or ambient temperature exceeds design margin",
      "severity": 9,
      "occurrence": 3,
      "detection": 4,
      "rpn": 108,
      "mitigation": "Add thermal pad to PCB, implement firmware temperature monitoring with gradual power reduction"
    },
    {
      "id": "fmea-002",
      "component": "BMI270",
      "failureMode": "IMU sensor drift exceeding calibration bounds",
      "effect": "Inaccurate attitude estimation, flight instability",
      "cause": "Temperature-induced bias drift, vibration coupling",
      "severity": 8,
      "occurrence": 4,
      "detection": 3,
      "rpn": 96,
      "mitigation": "Dual-IMU redundancy with cross-validation, vibration-isolated mounting"
    },
    {
      "id": "fmea-003",
      "component": "MAX-M10S",
      "failureMode": "GPS signal loss in urban canyon or under interference",
      "effect": "Loss of position hold, failsafe RTH may drift",
      "cause": "Multipath interference, jamming, antenna obstruction",
      "severity": 7,
      "occurrence": 5,
      "detection": 2,
      "rpn": 70,
      "mitigation": "Multi-constellation support, barometric altitude backup, dead reckoning via IMU"
    },
    {
      "id": "fmea-004",
      "component": "BQ25180YBGR",
      "failureMode": "Battery overcurrent during fast charge",
      "effect": "Battery cell damage, thermal runaway risk",
      "cause": "Charge current setpoint error, faulty I2C configuration",
      "severity": 10,
      "occurrence": 2,
      "detection": 3,
      "rpn": 60,
      "mitigation": "Hardware current limit via sense resistor independent of I2C, NTC temperature monitoring"
    },
    {
      "id": "fmea-005",
      "component": "ESP32-S3-WROOM-1",
      "failureMode": "WiFi connection drops during OTA firmware update",
      "effect": "Partial firmware image, device bricked until manual recovery",
      "cause": "RF interference, insufficient signal strength, power brownout",
      "severity": 8,
      "occurrence": 3,
      "detection": 5,
      "rpn": 120,
      "mitigation": "A/B partition scheme with automatic rollback, checksum verification before boot swap"
    },
    {
      "id": "fmea-006",
      "component": "SX1262IMLTRT",
      "failureMode": "LoRa desensitization from co-located WiFi transmitter",
      "effect": "Reduced LoRa range, intermittent packet loss on telemetry",
      "cause": "Insufficient RF isolation between WiFi and LoRa antennas",
      "severity": 5,
      "occurrence": 4,
      "detection": 3,
      "rpn": 60,
      "mitigation": "Antenna placement optimization, SAW filter on LoRa RX path, time-division multiplexing"
    },
    {
      "id": "fmea-007",
      "component": "TPS62823DLCR",
      "failureMode": "3.3V buck converter output oscillation",
      "effect": "MCU brown-out resets, sensor data corruption",
      "cause": "Insufficient output capacitance, high ESR bulk cap, PCB layout loop area",
      "severity": 8,
      "occurrence": 2,
      "detection": 4,
      "rpn": 64,
      "mitigation": "Layout per TI reference design, add 22uF ceramic bulk cap, verify loop bandwidth with bode plot"
    },
    {
      "id": "fmea-008",
      "component": "W25Q128JVSIQ",
      "failureMode": "Flash memory data corruption during power loss",
      "effect": "Loss of configuration data, flight logs, or calibration constants",
      "cause": "Incomplete write during power interruption",
      "severity": 6,
      "occurrence": 3,
      "detection": 4,
      "rpn": 72,
      "mitigation": "Journaling filesystem, CRC verification on read, dual-copy critical data with checksums"
    },
    {
      "id": "fmea-009",
      "component": "STM32H743VIT6",
      "failureMode": "MCU lockup due to hard fault in ISR context",
      "effect": "Complete loss of flight control, uncontrolled descent",
      "cause": "Stack overflow in nested interrupts, null pointer dereference",
      "severity": 10,
      "occurrence": 2,
      "detection": 3,
      "rpn": 60,
      "mitigation": "MPU stack guard regions, watchdog timer with independent clock, co-processor failsafe"
    },
    {
      "id": "fmea-010",
      "component": "ICM-42688-P",
      "failureMode": "Backup IMU SPI bus failure",
      "effect": "Loss of redundant IMU data, reduced fault tolerance",
      "cause": "Solder joint fatigue from vibration, ESD damage",
      "severity": 6,
      "occurrence": 3,
      "detection": 5,
      "rpn": 90,
      "mitigation": "Continuous health monitoring with cross-check against primary IMU, conformal coating"
    },
    {
      "id": "fmea-011",
      "component": "Connectors (J3-J6)",
      "failureMode": "Motor connector intermittent contact under vibration",
      "effect": "Motor power interruption, asymmetric thrust, crash",
      "cause": "Vibration loosening connector retention, contact oxidation",
      "severity": 9,
      "occurrence": 3,
      "detection": 6,
      "rpn": 162,
      "mitigation": "Locking connector upgrade, conformal coating on contacts, vibration testing per MIL-STD-810H"
    },
    {
      "id": "fmea-012",
      "component": "MMC5983MA",
      "failureMode": "Magnetometer reading corrupted by motor current",
      "effect": "Incorrect heading estimation, compass navigation errors",
      "cause": "Electromagnetic interference from BLDC motor currents",
      "severity": 5,
      "occurrence": 5,
      "detection": 3,
      "rpn": 75,
      "mitigation": "Magnetometer placement away from motor traces, calibration with motors running, timing sync with motor commutation"
    }
  ]
}

src/mocks/data/websocket-events.json

A replay sequence of 14 WebSocket events simulating a live agent workflow for demo mode. Events are ordered chronologically with delay hints for realistic playback timing.

{
  "description": "WebSocket event replay sequence for demo mode. delayMs indicates the pause before sending each event.",
  "events": [
    {
      "delayMs": 0,
      "event": "session.started",
      "data": {
        "sessionId": "ses-007",
        "agent": "MFG",
        "skill": "manufacturing",
        "title": "DFM Analysis & Gerber Export",
        "timestamp": "2025-01-25T08:00:00Z"
      }
    },
    {
      "delayMs": 3000,
      "event": "agent.progress",
      "data": {
        "sessionId": "ses-007",
        "agent": "MFG",
        "progress": 0.1,
        "message": "Analyzing PCB design — loading 6-layer stackup...",
        "timestamp": "2025-01-25T08:00:03Z"
      }
    },
    {
      "delayMs": 5000,
      "event": "agent.progress",
      "data": {
        "sessionId": "ses-007",
        "agent": "MFG",
        "progress": 0.3,
        "message": "Running DFM checks — 312 components, 45 unique parts...",
        "timestamp": "2025-01-25T08:00:08Z"
      }
    },
    {
      "delayMs": 6000,
      "event": "agent.progress",
      "data": {
        "sessionId": "ses-007",
        "agent": "MFG",
        "progress": 0.5,
        "message": "Generating Gerber RS-274X files (F.Cu, In1.Cu, In2.Cu, In3.Cu, In4.Cu, B.Cu, F.Mask, B.Mask, F.SilkS, B.SilkS)...",
        "timestamp": "2025-01-25T08:00:14Z"
      }
    },
    {
      "delayMs": 4000,
      "event": "agent.progress",
      "data": {
        "sessionId": "ses-007",
        "agent": "MFG",
        "progress": 0.7,
        "message": "Creating pick-and-place data — 312 placements across top and bottom layers...",
        "timestamp": "2025-01-25T08:00:18Z"
      }
    },
    {
      "delayMs": 3000,
      "event": "agent.progress",
      "data": {
        "sessionId": "ses-007",
        "agent": "MFG",
        "progress": 0.9,
        "message": "Finalizing manufacturing notes — 2 DFM advisories documented...",
        "timestamp": "2025-01-25T08:00:21Z"
      }
    },
    {
      "delayMs": 2000,
      "event": "session.complete",
      "data": {
        "sessionId": "ses-007",
        "agent": "MFG",
        "status": "completed",
        "artifacts": [
          { "id": "art-018", "path": "gerber/DFC-v2.1-gerbers.zip", "size": 284000 },
          { "id": "art-019", "path": "manufacturing/pick_and_place.csv", "size": 18400 },
          { "id": "art-020", "path": "manufacturing/dfm_report.json", "size": 5200 }
        ],
        "timestamp": "2025-01-25T08:00:23Z"
      }
    },
    {
      "delayMs": 2000,
      "event": "session.started",
      "data": {
        "sessionId": "ses-008",
        "agent": "SC",
        "skill": "supply-chain",
        "title": "Supply Chain Risk Assessment",
        "timestamp": "2025-01-25T08:00:25Z"
      }
    },
    {
      "delayMs": 4000,
      "event": "agent.progress",
      "data": {
        "sessionId": "ses-008",
        "agent": "SC",
        "progress": 0.2,
        "message": "Querying distributor APIs — DigiKey, Mouser, LCSC...",
        "timestamp": "2025-01-25T08:00:29Z"
      }
    },
    {
      "delayMs": 6000,
      "event": "agent.progress",
      "data": {
        "sessionId": "ses-008",
        "agent": "SC",
        "progress": 0.5,
        "message": "Analyzing lead times and lifecycle status for 45 components...",
        "timestamp": "2025-01-25T08:00:35Z"
      }
    },
    {
      "delayMs": 3000,
      "event": "bom.updated",
      "data": {
        "component": "LP2985-33DBVR",
        "field": "lifecycle",
        "oldValue": "active",
        "newValue": "NRND",
        "message": "LP2985-33DBVR flagged as NRND — replacement recommended: TLV75533PDBVR",
        "timestamp": "2025-01-25T08:00:38Z"
      }
    },
    {
      "delayMs": 4000,
      "event": "agent.progress",
      "data": {
        "sessionId": "ses-008",
        "agent": "SC",
        "progress": 0.8,
        "message": "Generating risk report — 5 risk items identified (2 high, 2 medium, 1 low)...",
        "timestamp": "2025-01-25T08:00:42Z"
      }
    },
    {
      "delayMs": 3000,
      "event": "session.complete",
      "data": {
        "sessionId": "ses-008",
        "agent": "SC",
        "status": "completed",
        "artifacts": [
          { "id": "art-021", "path": "supply-chain/risk_report.json", "size": 12400 },
          { "id": "art-022", "path": "supply-chain/distributor_quotes.csv", "size": 8200 }
        ],
        "timestamp": "2025-01-25T08:00:45Z"
      }
    },
    {
      "delayMs": 1000,
      "event": "approval.requested",
      "data": {
        "approvalId": "appr-002",
        "sessionId": "ses-008",
        "agent": "SC",
        "title": "BOM Alternate: LP2985 Replacement",
        "priority": "medium",
        "message": "Supply Chain Agent recommends replacing LP2985-33DBVR (NRND) with TLV75533PDBVR",
        "timestamp": "2025-01-25T08:00:46Z"
      }
    }
  ]
}