Register library components from a datasheet without an exam (2.63.1).
POST /api/library/datasheets now writes an IC inbox card or a passive/discrete model. Empty pintables never enter library/extracted. AF Board+AI runs after unchanged run_pcb_checks (PE-SI / HF line stay).
This commit is contained in:
@@ -1,13 +1,14 @@
|
||||
# Albero delle analisi Periscope
|
||||
|
||||
Versione codice **2.63.0** (`periscope/src/frontend/content/changelog.md`). Letto in `/Users/michelebigi/Development/periscope`. Costituzione senza eccezioni: via ≠ pad ≠ traccia ≠ zona; niente I/Z/mm inventati; skip se manca evidenza. **Non è DRC KiCad.** DRC = KiCad. Questo documento mappa l’analisi, non implementa.
|
||||
Versione codice **2.63.1** (`periscope/src/frontend/content/changelog.md`). Letto in `/Users/michelebigi/Development/periscope`. Costituzione senza eccezioni: via ≠ pad ≠ traccia ≠ zona; niente I/Z/mm inventati; skip se manca evidenza. **Non è DRC KiCad.** DRC = KiCad. Questo documento mappa l’analisi, non implementa.
|
||||
|
||||
I test pytest stanno in `tests/datasheet/`, `tests/library/`, `tests/schematic/`, `tests/pcb/`, `tests/af_ai/` (stessi file di 2.62.1, cartelle di mestiere). I path `tests/test_*.py` sotto i nodi restano i nomi file.
|
||||
|
||||
Due pipeline:
|
||||
Due pipeline più una porta libreria (non è un esame):
|
||||
|
||||
0. **Libreria** — `POST /api/library/datasheets` registra un componente da PDF senza `MODE=run`/`MODE=pcb`.
|
||||
1. **Schematico / review AI** — `MODE=run`, `services/pipeline.py` → `validate_design_async` (`validation.py`): estrazione datasheet, check deterministici, review IC DeepSeek.
|
||||
2. **Esame PCB** — `MODE=pcb`, `services/pcb_pipeline.py` → `run_pcb_checks` (`pcb_checks.py`) + review AI PCB (`pcb_review.py` / `pcb_validation.py`). Non auto-place.
|
||||
2. **Esame PCB** — `MODE=pcb`, `services/pcb_pipeline.py` → `run_pcb_checks` (`pcb_checks.py`, lista 2.62.1 **invariata**) + sezione additiva AF Board+AI (`af_ai_hf.py`) + review AI PCB (`pcb_review.py` / `pcb_validation.py`). Non auto-place.
|
||||
|
||||
I certifier USB-C / Ethernet / PoE girano su **entrambe** le pipeline (grafo, non geometria). DDR / CPU / FPGA / USB-PD sono la stessa qualità di finding ma partono da `run_pcb_checks` (grafo). Niente pezzo sul grafo → silenzio, non N/A.
|
||||
|
||||
@@ -16,7 +17,9 @@ Nodi analisi: **108** (99 PE-* + 1 LED senza `rule_id` + 8 processo estrazione/A
|
||||
---
|
||||
|
||||
```
|
||||
Periscope 2.62.1
|
||||
Periscope 2.63.1
|
||||
├── 0. Libreria (porta, non esame)
|
||||
│ └── PDF + MPN → scheda (inbox IC / passivo / discreto) senza MODE=run/pcb
|
||||
├── 1. Schematico / review AI (MODE=run)
|
||||
│ ├── ingest (non è analisi: parser → grafo)
|
||||
│ ├── estrazione datasheet
|
||||
@@ -25,7 +28,7 @@ Periscope 2.62.1
|
||||
│ └── review AI per-IC + post-pass
|
||||
└── 2. Esame PCB (MODE=pcb)
|
||||
├── ingest layout (non è DRC)
|
||||
├── run_pcb_checks
|
||||
├── run_pcb_checks ← 2.62.1 invariato (SI + HF line inclusi)
|
||||
│ ├── net / footprint
|
||||
│ ├── placement vs layout_rules
|
||||
│ ├── SI + linee HF (2.62.0 Fase A)
|
||||
@@ -35,6 +38,7 @@ Periscope 2.62.1
|
||||
│ ├── ESD / return / EMI / SPOF
|
||||
│ ├── BOM ↔ PCB ↔ datasheet
|
||||
│ └── resto Fase B (2.62.1)
|
||||
├── AF Board + AI (additivo: flag → investigate_hf_hypotheses; non sostituisce SI/HF)
|
||||
├── review AI PCB
|
||||
└── tab antenna RF (non in run_pcb_checks)
|
||||
```
|
||||
|
||||
@@ -40,6 +40,8 @@ Zero eccezioni al principio. Le sezioni “non conformi” restano debito: non s
|
||||
|
||||
**Conforme nel disegno, non nel dispatcher.** Ogni modulo (`si_check`, `hf_line_check`, `stackup_check`, …) ha un mestiere e skip senza evidenza. `run_pcb_checks` è un elenco esplicito — si legge. **Non conforme:** `except Exception: log + skip` per ogni check (fallimento strumento vs finding vs dati, collassati). `pcb_power_thermal.py` (~748) e `si_check.py` (~862) e `interface_class_check.py` (~831) sono al limite: ancora un dominio, ma non “piccoli moduli”.
|
||||
|
||||
AF Board+AI (`af_ai_hf.py`) è **additivo**: `pcb_pipeline` chiama `append_investigated` dopo `run_pcb_checks`. Non entra nella lista 2.62.1. Non è DRC.
|
||||
|
||||
Non è DRC (clearance/track_width/annular restano KiCad). FEM assente: **conforme al vincolo**.
|
||||
|
||||
## 9. Check schematico (derating, LED, crystal, mux, rail, …)
|
||||
@@ -58,7 +60,7 @@ Non è DRC (clearance/track_width/annular restano KiCad). FEM assente: **conform
|
||||
|
||||
**Prima: non conforme come porta.** Catalogo e `library_has_*` vivevano in `services/projects.py` (CRUD progetti + libreria). La pagina `/library` era sola lettura e l’empty state mandava a “crea un progetto e lancia la review”. Admin `/admin/components` mescola libreria e users.
|
||||
|
||||
**Dopo questa macro-fase: conforme come porta, con debito.** `services/library.py` + `routers/library.py` + `/library` (import PDF senza esame, GET/PUT scheda). Store content-addressed (`datasheet_store.py`) resta esplicito. `library_gate.py` è piccolo e duro (niente pintable velenosa). Debito: `projects.py` re-export per non riscrivere la pipeline; `list_library_catalog` prima ingoiava JSON rotti — ora logga e salta la riga (dato rotto ≠ crash dello store).
|
||||
**Dopo 2.63.1: conforme come porta.** `POST /api/library/datasheets` registra una scheda (inbox IC o modello passivo/discreto) senza esame. Pintable vuota non va in `library/extracted/` (`library_gate`). PUT promuove inbox → extracted. `projects.py` re-export resta debito. `list_library_catalog` logga e salta JSON rotti.
|
||||
|
||||
## 13. Pipeline orchestrazione (`pipeline.py`, `pcb_pipeline.py`, job)
|
||||
|
||||
|
||||
+10
-12
@@ -1,27 +1,25 @@
|
||||
# Libreria componenti — porta prodotto
|
||||
|
||||
La libreria **non** vive dentro l’esame. È una porta a sé: pagina `/library` + API `/api/library`. L’analisi (preliminare datasheet, schematico, PCB) *usa* la libreria; non è l’unico modo per riempirla.
|
||||
La libreria **non** vive dentro l’esame. È una porta a sé: pagina `/library` + API `/api/library`. L’analisi *usa* la libreria; non è l’unico modo per riempirla.
|
||||
|
||||
## Flusso
|
||||
|
||||
```text
|
||||
PDF + MPN
|
||||
PDF + MPN + kind (ic | passive_part | simple)
|
||||
↓
|
||||
POST /api/library/datasheets
|
||||
↓
|
||||
blob MD5 + ref MPN
|
||||
↓
|
||||
catalogo (tab Datasheets)
|
||||
scheda componente
|
||||
IC → library/inbox/{mpn}.json (niente pintable inventata)
|
||||
passive_part → library/passives/{mpn}.json
|
||||
simple → library/models/{mpn}.json
|
||||
```
|
||||
|
||||
Nessun progetto, nessun `MODE=run` / `MODE=pcb`. Stesso store `library/datasheets/{blobs,refs}`.
|
||||
|
||||
Aggiornare una scheda già estratta:
|
||||
|
||||
```text
|
||||
GET /api/library/components/{ic|passive|passive_part|simple}/{mpn}
|
||||
PUT stesso path (JSON)
|
||||
```
|
||||
`library/extracted/` si scrive **solo** con pintable valida (`library_gate`: ≥2 pin, almeno un nome). PUT `/api/library/components/ic/{mpn}` promuove inbox → extracted.
|
||||
|
||||
Pintable IC: `library_gate` rifiuta pintable vuota o senza nomi (niente stub in libreria condivisa).
|
||||
|
||||
@@ -29,9 +27,9 @@ Pintable IC: `library_gate` rifiuta pintable vuota o senza nomi (niente stub in
|
||||
|
||||
- Non è admin/Clerk/JWT (non si tocca auth).
|
||||
- Non è DRC, non è FEM.
|
||||
- Non estrae da sola il pintable (LLM = preliminare datasheet nell’analisi, o un job futuro). Il PDF c’è comunque.
|
||||
- Non sostituisce `library_has_*` usati dalla pipeline.
|
||||
- Non inventa pin dal PDF. L’LLM prelim resta un mestiere a parte; la scheda c’è comunque.
|
||||
- Non sostituisce `library_has_*` usati dalla pipeline (`library_has_extraction` resta falso finché non c’è pintable).
|
||||
|
||||
## Test
|
||||
|
||||
`tests/library/` — catalogo, alias MPN, import PDF senza progetto, GET/PUT scheda, rifiuto PDF non valido.
|
||||
`tests/library/` — catalogo, alias MPN, import PDF senza progetto (scheda IC in inbox, passivo in passives), GET/PUT scheda, promozione pintable, rifiuto PDF non valido / kind ignoto.
|
||||
|
||||
Reference in New Issue
Block a user