Progetta now returns a parametric radiator geometry (segments + preview + .kicad_mod) so the layout can be replicated without inventing EM results. Co-authored-by: Cursor <cursoragent@cursor.com>
25 KiB
Piano di implementazione — Pinscope
Documento di lavoro prima dello sviluppo. La lista dell’utente è il minimo; sotto c’è anche ciò che serve perché quella lista non resti un insieme di moduli scollegati.
Questo piano copre due prodotti. Pinscope originale resta il primo. Layout/plugin/placement mm sono il secondo. Non mescolare i changelog né vendere il secondo come “un po’ di Pinscope in più”.
Stato del codice di riferimento: branch cursor/deepseek-71c5 (post DeepSeek V4.1, costi USD, replace BOM/netlist, parser KiCad, fingerprint review, auth multi-utente, PCB pad nets).
0b. Roadmap DeepSeek / crescita (integrata)
Fonte originale: canvas Pinscope: crescita e DeepSeek. Qui lo stato operativo.
| Fase | Voce | Stato |
|---|---|---|
| P0 | deepseek-flash, vision, pricing USD, effort |
Done |
| P0-5 | Smoke simple_project |
Done offline — scripts/smoke_simple_project.py (+ --live) |
| P1 | PDF drop log + cache hit-rate/stage | Done (parziale: cap ancora 500k; no off-peak/web_search) |
| P1 | Thinking vs tools | Partial — review auto fino ultimo turno |
| P2 | Eval, fingerprint, KiCad GA, PCB nets | Done |
| P2 | shortest_path tool + library write gate |
Done |
| P2 | Crystal CL + NC pin | Done — check deterministici (numeri solo se presenti) |
| P3 | Plugin CI / chat report | Todo |
| Layout F1 | Domini / gruppi / satelliti | Done — functional_groups.json (no mm) |
| Layout F1b | Pipeline Placement parallela | Done — API/UI placement_*, placement_plan.json |
| Layout F2 | Placement IC packing mm | Partial — skeleton gated (placement_pack.json); no zone/export yet |
| C4 | layout_rules dal datasheet |
Improved — skill 1.10.0 + trim keywords + cache refresh se vuoto |
Done when (prossimo pacchetto): smoke --live verde; hit_ratio visibile in UI logs; F2 packing oltre skeleton (collisioni, zone, export); più IC library con layout_rules numerici.
0c. Placement / floorplan (routing-first)
Obiettivo unico: routing migliore (loop corti, meno crossing, canali liberi) — non bellezza dei footprint.
| Step | Cosa | Artefatto / stato |
|---|---|---|
| 1 | Chip chiave (ComponentType.IC, rank per subtype) |
F1 |
| 2 | Domini = isole sulle power nets (non geometria) | F1 |
| 3 | Gruppi minori: decoupling, bulk, load_cap, filter, pullup, … | F1 role_hint |
| 4 | layout_rules già estratti sull’IC (nessun mm inventato) |
F1 attach |
| 5 | assemble_order dominio → chip → gruppi (contratto packer) |
F1 metadato |
| 6 | Packing mm / zone PCB / export | F2 partial — placement_pack.json (skip senza PCB + max_distance_mm); zone/export dopo |
Roadmap Placement (da qui a coordinate utili)
- F1 polish (ora) — satelliti classificatì;
othernascosti; Domains/Rails = primary rail. - C4 fill — riestrazione IC →
layout_rulesconmax_distance_mmdove il PDF lo dice (skill 1.10.0). - PCB gate — upload
.kicad_pcb→layout_graph.json(footprint xy già usati da PS-PLC*). - F2 pack v1 — per ogni
decoupling_proximitynumerica: proporre xy satellite entromax_distance_mmdal pad (già skeleton); UI Pack lista proposte. - F2 pack v2 — collisioni courtyard, stesso layer, ordine
assemble_orderper dominio, ancore IC fissi se già piazzati. - F2 export — scrivere posizioni proposte in file/plugin (pcbnew) senza muovere rame;
placement_checkresta verifica.
Output F1: functional_groups.json scritto in graph_build. Pipeline parallela Placement (POST …/placement/start) riscrive anche placement_plan.json senza toccare lo status di analisi, poi tenta F2 pack. Verifica PCB esistente resta placement_check (PS-PLC*) — non confondere con packing.
0. Due prodotti (stesso repo, due promesse)
| Pinscope (oggi + wave A–B, C schema, F/H leggere) | Pinscope Layout (wave D parziale, G, C4+G2, plugin pcbnew) | |
|---|---|---|
| Promessa | Lo schema rispetta il datasheet | Il rame rispetta datasheet + geometria |
| File | BOM, netlist, .kicad_sch gerarchico |
+ .kicad_pcb |
| Output | Finding su pin/net, derating, power tree | Distanze mm, 3W, creepage, skew, via EP |
| Utente | Chi chiude lo schema | Chi sbroglia |
Farli nello stesso codebase (pinscopex + LayoutGraph) è ragionevole. Farli nella stessa run obbligatoria no: senza PCB il progetto deve restare un Pinscope completo, non “incompleto perché manca il gerber”.
Nome in UI: tab Layout o prodotto “Layout checks” gated dal file .kicad_pcb. Il report schema non deve riempirsi di PS-PLC se il PCB non c’è.
Non serve un fork oggi. Serve disciplina: ogni PR dichiara se è Core o Layout.
0. Contratto di prodotto (non negoziabile)
Pinscope oggi è un validatore di schema: BOM + netlist → grafo bipartito → check deterministici + review LLM con citazione datasheet. Non legge il PCB.
Molti punti della lista (larghezza traccia, 3W, creepage, CPW clearance, length matching) non esistono senza geometria. Il piano li tiene, ma li mette dopo un ingest layout. Se li si forza sullo schema si producono finding inventati.
Ingresso ufficiale: progetto KiCad (non EasyEDA)
Coppia da chiedere all’utente (e da salvare insieme):
| File | Ruolo |
|---|---|
Root .kicad_sch (+ fogli figli) |
Connettività, ref, uuid simbolo/pin, MPN nei property |
.kicad_pcb |
Rame, net, coppie, courtyard, stackup |
BOM CSV resta utile se i property MPN nello schema sono vuoti; se lo schema è completo, la BOM è opzionale.
EasyEDA è fuori scope. Niente plugin, niente parser JSON EasyEDA, niente DRC sull’editor cloud. Chi arriva da EasyEDA resta sul percorso già documentato (export PADS), senza lavoro nuovo.
Gerber non è l’ingresso primario: con .kicad_pcb i net ci sono già. I Gerber restano un eventuale piano B, non lo sprint 1 del layout.
Schema gerarchico (più file) — attenzione
Oggi parse_kicad_sch legge un solo foglio. I (sheet …) che puntano ad altri .kicad_sch non vengono seguiti. L’errore attuale chiede di esportare la netlist.
Da fare (Wave A1), in ordine:
- Upload: cartella progetto o zip, oppure il
.kicad_pro+ root schematic. Non un solo foglio figlio. - Dal root: camminare ogni
(sheet (property "Sheetfile" "power.kicad_sch") …)(KiCad 6–10:Sheetfile/ path relativo al foglio padre). - Path traversal: solo file sotto la root del progetto; rifiutare
../. - Unire la connettività:
- local label restano nel foglio;
- hierarchical_label sul figlio ↔ sheet pin sul padre (stesso nome);
- global_label e power symbol (
#PWR) sono globali su tutto il progetto.
- Path gerarchico KiCad (
/power/U1vsU1): normalizzare i Reference come li vede il PCB (di solito già unici; se duplicati, è un errore dello schema). - Uuid:
(uuid …)su symbol e pin, piùsheetuuid, per il plugin (pan-and-zoom sul foglio giusto). - Fixture di test: root + 2 figli (alimentazione + analog), label gerarchiche su un net, power flag GND condiviso. Deve coincidere col netlist XML esportato da KiCad 9.
Done when: progetto a 3 fogli senza export netlist produce gli stessi (ref, pin, net) del file *.xml di KiCad.
.kicad_pcb è un file solo (il board non è gerarchico come lo schema). I net name nel PCB devono matchare i net risolti dallo schema dopo il flatten gerarchico.
Regole:
- Ogni nuovo check è una funzione pura in
backend/pinscopex/che leggeDesignGraph(+ opzionale layout). Niente SDK LLM dentropinscopex/. - I finding usano lo stesso schema (
Findinginmodels.py/frontend/src/lib/types.ts). Camposourcegià distingue check automatici vs review. - Finding normalization resta downgrade-only.
- Libreria condivisa: MPN exact-match. Niente fuzzy sul die.
- Plugin CAD consumano il report; non duplicano la pipeline.
Estensione schema finding (fare per prima, una volta)
Oggi: designator, mpn, aspect, finding, why, status, source_page, recommendation, source.
Aggiungere (backward compatible):
| Campo | Serve a |
|---|---|
net |
Telemetry CAD, filtri, SI |
pins[] |
Pan-and-zoom su U1.4 |
rule_id |
Plugin DRC (PS-DEC-001) |
cad_sheet / cad_uuid |
Sync plugin KiCad |
variant |
DNP / ECO |
severity_calibrated |
già implicito; non alzare in post |
Passi:
- Estendere
Findinginbackend/pinscopex/models.pyefrontend/src/lib/types.ts. - Aggiornare
assign_finding_ids, export Excel, report UI (campi opzionali nascosti se null). - Test su
simple_project/che i check esistenti ancora serializzano.
Done when: un finding di decoupling ha rule_id + pins e il report non rompe i finding LLM vecchi.
Mappa lista ↔ codice attuale
| Blocco utente | Già c’è | Buco | Stato |
|---|---|---|---|
| 1 Plugin / telemetry / BOM match | Parser KiCad XML/sexp/.kicad_sch gerarchico; wizard BOM; plugins/kicad/ + cad-bridge JSON |
EasyEDA fuori scope; uuid/sheet sul plugin da verificare su board reale | OK |
| 2 Datasheet / errata / OCR blocchi | Pintable, excerpt, quote_verify, errata, internal_features |
Nessun RAG vendor | OK |
| 3 Impedenze / stackup | ImpedenceFinder: calcolatrice + Z0 sulle tracce dei net signal (stackup PCB) | CPWG non nel vendor | OK |
| 4 Filtri | check_filters (solo con poli/numeri in specs) |
Niente (f_c) inventata | OK |
| 5 Capacità PI | Decoupling sulla net; derating V; DC-bias/ESR se c’è il numero; mm sul PCB (PS-PLC-001) |
— | OK |
| 6 Elettrico | Pin mux; I2C/reset pull-up; LED; sequencing/IR/power margin se c’è il parametro | Senza numero in specs → skip | OK |
| 7 RF | Tab RF / Impedance: verify matching + template geometry (IFA/meander/stub → SVG + .kicad_mod); Z0 feed se PCB |
CPWG / auto-place into .kicad_pcb dopo |
Improved |
| 8 HV / isolation | — | Serve layout_rules + V/mm dal datasheet, non IEC inventato |
— |
| 9 Termico | check_thermal se θJA/I sono in specs; via courtyard vs min_via_count |
Niente (T_j) senza parametro | OK |
| 10 SI / DNP | DNP enable; PS-SI-001 solo con length_match mm |
Niente 3W/crosstalk inventati | OK |
| 11 Lifecycle | lifecycle_check su cache distributore (EOL/NRND/RoHS esplicito) |
Niente equivalente LLM | OK |
| 13 Placement da datasheet | layout_rules + .kicad_pcb: PLC-001…004, same_layer, crystal, keepout, path |
3W/creepage/CPW/isolation senza numero | OK |
Extra obbligatori (non nella lista, ma bloccanti)
Senza questi i moduli 1–12 non si misurano e i plugin mentono.
E0. Eval harness. Golden findings su simple_project/ + 1–2 board interni. Precision/recall, % Unverified, citation hit-rate (quote_verify). Ogni check nuovo deve aggiungere fixture.
E1. KiCad gerarchico GA. Obbligatorio. Vedi “Schema gerarchico” sopra. Senza flatten dei fogli il plugin e il .kicad_pcb non allineano i net.
E2. Protocollo plugin KiCad (pinscope-cad-bridge JSON). Un file per progetto:
{
"version": 1,
"project_id": "...",
"findings": [
{
"rule_id": "PS-MUX-001",
"ref": "U3",
"pins": ["12"],
"sheet": "...",
"uuid": "...",
"severity": "error",
"message": "...",
"url": "https://pinscope.../report?finding=U3-001"
}
]
}
Un solo adapter: KiCad 9/10. Niente secondo plugin EasyEDA.
E3. Smoke DeepSeek V4.1 su simple_project (vision + finding count vs run precedente). Già in coda P0.
Wave A — Fondamenta CAD e finding (sblocca 1 e 6)
Obiettivo: schema KiCad fidato, finding indirizzabili, sync unidirezionale.
A1. KiCad nativo “GA” (schema gerarchico)
Passi: quelli in “Schema gerarchico (più file)” + file-guide riscritta (niente “esporta PADS da KiCad” come percorso principale) + cad_index.json (ref → uuid → sheetfile).
Done when: fixture a più fogli = netlist XML KiCad; upload zip/progetto senza chiedere l’export.
A3. Bridge KiCad (punto 1)
Passi:
- Pacchetto
plugins/kicad/(action plugin Python, KiCad 9/10). pinscope-findings.jsondal report (E2).- Marcatori / focus
uuidsu eeschema (foglio figlio corretto) e, per finding layout, su pcbnew. - Pan-and-zoom:
FocusOnItem/ select symbol; se l’API 10 differisce, adapter sottile.
Done when: clic su finding centra U3 sul foglio power.kicad_sch, non sul root vuoto.
EasyEDA: non si fa.
A2. BOM-to-schematic matching (punto 1)
Non è uno script a parte: è il grafo.
Passi:
- Da campi KiCad (
MPN,mpn,PN,lcsc) già letti inparsers_kicad.py/graph.py. - Tabella conflitti: ref in schema senza MPN, MPN in BOM senza ref, mismatch Value.
- Finding
source=bom_matchconrule_id=PS-BOM-001. - UI wizard: riga rossa nel matching, non solo colonne.
Done when: U1 in schema e U1 in BOM con MPN diversi → ERROR citabile.
Wave B — Check deterministici schema (sblocca 4, 5, 6, 9, 10 DNP)
Obiettivo: meno LLM, più numeri. Ogni item = modulo pinscopex + test su grafo sintetico + riga in eval.
B1. Power tree & drop (6)
Passi:
- Riuse UI power tree esistente.
- Per ogni IC: somma IQ + load stimato da specs se c’è; confronta con
Iout_maxLDO/Buck se estratto. - IR drop solo se esiste Rseries esplicito (shunt/ferrite) — niente stima di pista.
- Finding
PS-PWR-001margin fail.
B2. Sequencing (6)
Passi:
- Estrarre da datasheet (skill specs o tabella)
power_sequencese presente; altrimenti skip. - Sul grafo: enable pin, RC delay, PG (power good) concatenati.
- WARNING se sequenza dichiarata e PG non collega l’enable del rail successivo; niente invenzione di millisecondi.
B3. Pull-up dimensionamento (6)
Passi:
- Estendere
check_i2c_pullups: presenza e valore vs Vrail e Cf (formula NXP UM10204, bound largo). - Reset: stesso, più pull-down vietato se datasheet dice active-low con pull-up interno assente.
B4. Mux (6)
Già pin_mux_check.py. Passi residui: coprire SPI/UART con gli stessi token; test su MSPM0 del simple_project.
B5. Decoupling audit (5)
Già check_supply_decoupling. Passi:
- Distinguere Cin LDO vs Cout (pin IN/OUT dal pintable, non solo VDD).
- Contare valore se specs passive ci sono (100 nF vs 10 µF) come WARNING non ERROR se il vendor non è esplicito.
B6. Derating DC bias (5)
Passi:
- Tabella empirica C0G/X7R/X5R (loss % vs V/Vrated) in
derating.py— etichettare “stima”, non misura. - UI derating: colonna C_eff.
- Non spacciare per curva Murata del lotto.
B7. ESR/ESL parallelo (5)
Passi:
- Modello grezzo: C + ESL package (0402/0603 lookup) + ESR da specs se c’è.
- Z(f) somma parallelo 10µF+100nF; confronta con f_sw buck se nota.
- Senza f_sw: INFO “copertura HF dipende da 100nF vicino al pin” senza fingere un target Ω.
B8. Filtri (4)
Passi:
- Matcher topologico sul grafo: RC serie-shunt, LC, ferrite+C, π (C-L-C), T (L-C-L).
- (f_c) per RC (
1/2πRC) e LC (1/2π√LC); Pi/T solo se L e C noti. - Confronto con
adc_sample_rate/data_ratesolo se in specs IC. - Insertion loss: WARNING se ferrite DCR alta su rail ADC analog (soglia da datasheet o skip).
B9. Termico schema (9)
Passi:
- (P \approx I_{load} \times (Vin-Vout)) per LDO se I e V noti; (T_j \approx T_a + P \theta_{JA}) con (T_a=25) default e campo UI.
- Resistori: (P=I^2R) se I dal LED check o da shunt + V; vs
power_rating_w. - Senza θJA: non inventare; INFO “manca theta_ja”.
B10. DNP / varianti (10)
Passi:
- Campo BOM
DNP/fitted/variant. - Grafo per variante: pin Enable senza pull e senza driver → ERROR.
- Non è layout.
Wave C — Datasheet intelligence (punto 2)
Restare su DeepSeek Flash vision; niente secondo vendor di default.
C1. Parsing adattivo (già in parte)
Passi:
- Eval pintable su 10 PDF: TI, STM, NXP, Espressif, Winbond, GigaDevice, Holtek, Silergy, 3 PEAK.
- Dove fallisce: skill
extract-pintable+ pagine vision (già keyword). Non RAG vettoriale finché l’eval non lo chiede. - Se serve RAG: chunk per pagina in libreria, retrieval per pin/abs-max — dopo C1 eval.
C2. Errata
Passi:
- Non scraping indiscriminato (TOS, HTML instabile).
- Catalogo URL noti (TI
lit/er, STMerrata, Microchip). - DeepSeek
web_searchopzionale gated, citazione obbligatoria, stessoquote_verify. - Finding
PS-ERRATA-001se il workaround (pull-up, bond-out) non è nello schema.
Done when: un MPN con errata nota in fixture produce finding; vendor senza URL → skip silenzioso loggato.
C3. OCR / vision block diagram (2)
Passi:
- Non un modello CV a parte: riusare pagine “block diagram” già in
_PAGE_KEYWORDS. - Tool extraction:
internal_features: {esd_clamp_pins[], pullup_pins[], analog_switch[]}. - Check: pin dichiarato open-drain senza pull visibile.
C4. Layout rules dal datasheet (placement proposto)
La pagina “Typical application / PCB layout” non è solo uno schema: spesso dice quanto vicino, quanti via, da che lato del package. Va estratto in struttura, non lasciato in prosa al reviewer.
Skill o estensione specs (libreria per MPN, versionata come il pintable):
{
"layout_rules": [
{
"kind": "decoupling_proximity",
"pin": "VDD",
"cap_value_hint": "100nF",
"max_distance_mm": 2.0,
"same_layer": true,
"source_page": 14
},
{
"kind": "thermal_via",
"pin": "EP",
"min_via_count": 4
},
{
"kind": "keepout",
"net_class": "analog",
"note": "no digital return under analog pin"
}
]
}
Passi:
- Pagine già keyword-matched (
application,layout,decoupling,PCB). Vision obbligatoria (disegni). validate.pysulla lista:kindenum chiuso; distanze solo se il testo/figura ha un numero; altrimentimax_distance_mmnull e il check G2 usa una default dichiarata (es. 3 mm) con severity WARNING.- Citazione
source_page+ quote_verify sul testo se c’è (“place within 2 mm”). - Non inventare una land pattern JEDEC se il PDF non la dà.
Done when: MSPM0 o LDO del simple_project ha almeno una decoupling_proximity in library JSON, o skip esplicito layout_rules: [] con log.
Wave D — Impedenza analitica (punto 3) senza PCB
Motore standalone, stile calcolatrice. I vincoli CAD sono export, non verità sul board.
D1. Motore Wheeler/Schneider
Passi:
pinscopex/impedance.py: microstrip, stripline, coupled diff, CPW — formule documentate + test numerici vs 3 valori ImpedanceFinder.- Input:
h,er,t,w,s,target_z. - UI tab progetto “Impedance” (non LLM).
D2. Stackup → regole CAD
Passi:
- Form stackup (N layer, h, er).
- Output: w/s per 50 / 90 USB / 100 diff.
- Export KiCad
.kicad_druo netclass — consigli, l’utente applica. - Nessun finding “traccia troppo stretta” finché non c’è
.kicad_pcb.
Wave E — RF schema (punto 7, parte schema)
Passi:
- Topologia π/T tra pin ANT e connettore/antenna (stesso matcher filtri). OK — sezione Verify in RF/Impedance.
- Target 50 Ω come intento, non misura: WARNING se manca rete. OK (status warning su
missing). - Utility Progetta: marker KiCad
ANT*/ANT_FEED+ stackup →wmicrostrip;f0→ template IFA / meander / stub (segmenti mm + SVG +.kicad_mod); zonaantenna→ fit/scale. OK (auto-place rame nel PCB = dopo). - CPW clearance: Wave G (layout).
Wave F — Supply chain (punto 11)
Passi:
- Estendere DigiKey/Mouser/LCSC: campi
lifecycle,rohs,stock,lead_timegià spesso nel payload. - Job periodico (non ogni review):
lifecycle.jsonper MPN libreria. - Finding INFO/WARNING EOL/NRND; RoHS fail solo se il flag è esplicito.
- Cross-ref: solo se il distributore dà
replacement/ family; niente LLM “equivalente”.
Wave G — Layout (punti 3 residui, 7 CPW, 8, 10 SI)
Due file per progetto: schema KiCad flatten + .kicad_pcb.
G0. Ingest layout
Passi:
- Parser
.kicad_pcb: tracce, via, zone, layer, net name, footprint, courtyard, differential pairs se presenti. - I net del PCB devono combaciare con quelli dello schema dopo il flatten gerarchico (stesso
U1.4↔ pad). - Modello
LayoutGraphaffiancato aDesignGraph. - Gerber: non in questa wave. Solo se un utente non può dare il
.kicad_pcb.
G1. Check (solo se net e geometria sono legati)
Passi:
- Length matching / intra-pair skew vs limite datasheet (USB/HDMI/PCIe). OK (
PS-SI-001, sololength_matchmm). - 3W: distanza centro-centro vs W aggressore. — skip senza numero (non IEC/USB folklore).
- Creepage/clearance: profilo IEC 62368 (pollution, RMS V dai net). — skip senza V/mm nel datasheet.
- Isolation barrier: bbox isolator + divieto piste LV nel courtyard HV. — skip senza regola.
- CPW: gap verso GND copper vs valore del calcolatore D2. — CPWG non nel vendor.
G2. Placement vs datasheet (piste, decoupling, thermal)
G2. Placement vs datasheet (piste, decoupling, thermal)
Lo schema dice se C12 è sul net VDD. Il PCB dice se C12 è a 8 mm dal pad. Questo check è solo layout + layout_rules.
Passi:
- Per ogni pin alimentazione del pintable: footprint pad xy sul
.kicad_pcb; condensatori sul medesimo net (grafo); distanza euclidea pad-cap (pin cap verso GND/VDD). OK - Se
max_distance_mmestratto: ERROR/WARNING se oltre. Se assente: skip (niente default 3 mm). OK - Via in pad / via sotto EP: contare via nel courtyard del thermal pad vs
min_via_count. OK (PS-PLC-002) - Stesso layer: se
same_layer: truee il cap è sull’altro lato senza via sotto il pin → WARNING. OK (PS-PLC-003) - Piste: lunghezza net dal pin al cap = shortest path sui segmenti vs
max_distance_mm. OK - Crystal: cap load vs pin XIN/XOUT (stessa metrica). OK (
X1/C9/C10) - Finding
PS-PLC-001…004conpins,net; plugin focus pcbnew. OK (keepout =PS-PLC-004)
Non confrontare una foto del layout TI con il board pixel-a-pixel. Solo vincoli numerici/topologici.
Done when: fixture PCB con C di decoupling a 15 mm da VDD (regola 2 mm) → PS-PLC-001; cap a 1 mm → niente finding.
Done when (G1+G2): un .kicad_pcb di test (USB diff pair volutamente sbagliata) produce PS-SI-001. I net coincidono con lo schema gerarchico della stessa repo.
Wave H — Enterprise (punto 12)
Passi:
- Stato finding:
open | false_positive | accepted | wontfix+ motivo obbligatorio. - Firma rilascio: hash report + user + timestamp (OSS: locale; cloud: già Clerk).
- ECO: export
eco.json/ CSV: rule_id, ref, before/after raccomandazione, finding_id. - Dashboard: filtri già URL; aggiungere coda “da approvare”.
Commenti esistono: non rifarli, agganciarli allo stato.
Ordine di esecuzione (sviluppo)
Non parallelizzare A0 schema finding con G.
| Sprint (indicativo) | Contenuto | Dipende da | Stato |
|---|---|---|---|
| 0 | Schema finding + eval + smoke V4.1 | — | OK |
| 1 | A1 KiCad GA + A2 BOM match | 0 | OK |
| 2 | B3–B5 pull-up/decoupling/Cin-Cout | 0 | OK |
| 3 | B6–B9 DC bias, ESR, filtri, termico | 2 | OK |
| 4 | B1–B2 power drop/sequencing + B10 DNP | 1 | OK |
| 5 | A3 plugin KiCad + E2 JSON | 1, 0 | OK |
| 6 | C2 errata + C3 internal features + C4 layout_rules | eval C1 | OK |
| 7 | D1–D2 calcolatrice impedenza + export netclass | — | OK |
| 8 | F lifecycle | APIs già presenti | OK |
| 9 | H review workflow / ECO | 0 | OK |
| 10+ | G layout .kicad_pcb + G2 placement datasheet |
A1 + C4 | OK (G1 3W/creepage/CPW/HV ancora skip senza numero) |
Stima onesta: Wave A–B (schema) sono il ritorno; G è un secondo prodotto. Non promettere creepage nel plugin schema.
Passi operativi per ogni check nuovo
- Fixture grafo minimo in
tests/test_<nome>.py(non solosimple_project). - Funzione in
pinscopex/senza I/O. - Registrare in
services/validation.pyaccanto a pin_mux/LED. rule_id+source.- Una riga changelog.
- Se tocca UI: tab o badge “Automated check” già usato.
- Browser solo se UI; senno pytest.
Fuori scope (esplicito)
- Plugin o parser EasyEDA.
- Agente che progetta lo sbroglio.
- Simulazione SPICE/IBIS.
- Sostituti pin-to-pin inventati dall’LLM.
- Scraping errata senza whitelist.
- Layout da netlist PADS dump (
!PADS-POWERPCB) — già rifiutato.
Prossimo passo concreto (quando si apre lo sviluppo)
Sprint 0–10+ del piano di lavoro sono OK nel codice (parametro o skip).
Resta, senza inventare numeri:
- HV / isolation (blocco 8) se il datasheet dà V/mm o keepout HV.
- 3W / creepage / CPW solo con numero in
layout_ruleso dal calcolatore D2. - Un
.kicad_pcbreale di progetto (non fixture USB inventata) per vederePS-PLC/PS-SIsul board.
Il plugin KiCad aspetta ancora verifica uuid + sheet su un progetto multi-foglio vero.