Add gated Placement F2 pack skeleton for satellite xy.

Propose positions only from PCB footprints plus numeric decoupling max_distance_mm; otherwise skip with an explicit reason.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-13 17:50:47 +02:00
co-authored by Cursor
parent 54b0b07917
commit 86121e6547
10 changed files with 465 additions and 10 deletions
+10
View File
@@ -22,6 +22,7 @@ import type {
NetlistPreviewDesignator,
PauseCheckpoint,
PlacementPlan,
PlacementPack,
Project,
SkippedComponent,
ValidationReport,
@@ -618,6 +619,15 @@ export async function fetchPlacementPlan(projectId: string): Promise<PlacementPl
return res.json();
}
export async function fetchPlacementPack(projectId: string): Promise<PlacementPack> {
const res = await authFetch(`${BASE}/api/pipeline/${projectId}/placement/pack`);
if (!res.ok) {
const err = await res.json().catch(() => ({ detail: "Placement pack not found" }));
throw new Error(err.detail || "Placement pack not found");
}
return res.json();
}
// --- Logs ---
export async function fetchProjectLogs(
+18
View File
@@ -330,6 +330,24 @@ export interface PlacementPlan {
groups: PlacementIcGroup[];
}
export interface PlacementProposal {
ref: string;
anchor_ref: string;
rule_kind: string;
max_distance_mm: number;
proposed_x: number;
proposed_y: number;
layer?: string;
basis?: string;
}
export interface PlacementPack {
objective?: string;
status: "packed" | "skipped";
skip_reason?: string | null;
placements: PlacementProposal[];
}
// One entry per EDIF sub-design (`&NNNN` ID prefix). Returned by the upload
// endpoint and the subdesigns inspection endpoint; consumed by the wizard's
// sub-design picker step.