Add MODE=pcb layout exam job with AI and deterministic checks.

Parallel pcb_status pipeline: parse board, classify domains/groups,
inventory traces, PE-LAY/PLC/SI/DRT checks, per-IC datasheet review.
Findings merge into the report UI. No auto-place or pcbnew write-back.
This commit is contained in:
2026-09-19 22:54:17 +02:00
parent a2011dad91
commit 16c606ae3d
28 changed files with 1906 additions and 32 deletions
@@ -42,6 +42,7 @@ export function FindingsList({ findings, graph, onViewReference, projectId, isRe
const componentParam = searchParams.get("component");
const reviewParam = searchParams.get("review");
const searchParam = searchParams.get("q") ?? "";
const domainParam = searchParams.get("domain");
const statusFilters = useMemo(() => {
if (!statusParam) return new Set<FindingStatus>(["ERROR", "WARNING", "INFO"]);
@@ -84,9 +85,23 @@ export function FindingsList({ findings, graph, onViewReference, projectId, isRe
const st = f.finding_id ? reviews?.[f.finding_id]?.state : undefined;
if (st && st !== "open") return false;
}
if (domainParam === "layout") {
const layout =
(f.finding_id || "").startsWith("PCB-") ||
f.source === "pcb_review" ||
(f.rule_id || "").startsWith("PE-PLC") ||
(f.rule_id || "").startsWith("PE-LAY") ||
(f.rule_id || "").startsWith("PE-SI") ||
(f.rule_id || "").startsWith("PE-DRT");
if (!layout) return false;
} else if (domainParam === "schema") {
const layout =
(f.finding_id || "").startsWith("PCB-");
if (layout) return false;
}
return true;
},
[statusFilters, componentParam, searchParam, reviewParam, reviews]
[statusFilters, componentParam, searchParam, reviewParam, reviews, domainParam]
);
const filtered = useMemo(() => {
@@ -131,6 +146,8 @@ export function FindingsList({ findings, graph, onViewReference, projectId, isRe
onToggleNeedsReview={() =>
updateParams({ review: reviewParam === "open" ? null : "open" })
}
domain={domainParam ?? "all"}
onDomainChange={(v) => updateParams({ domain: v })}
designators={designators}
/>
<div className="space-y-1">