Files
periscope/docs/motore-finding.md
T
michele a63e5bd7ab Fase A identity on PCB HEAD: operator fence, keep BOM/SPOF/EMI.
Replace Faradworks Inc. TOS/privacy/contact/metadata with Michele Bigi.
Dual-read pinscope_* keys; write periscope_* only. AGPL LICENSE and
GitHub fork parent unchanged. validate.py not edited.
2026-09-20 12:41:17 +02:00

121 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Motore finding — schema e PCB (stesso oggetto)
Fonte: specifica di Michele (Project chat). Vale per **analizzatore schematico e PCB**. Un finding è un oggetto riproducibile, non un paragrafo LLM.
Libreria datasheet: **una** (`library/extracted` + extracted/ di progetto). Lesame PDF profondo gira **una volta** (pipeline schema). Il job PCB consuma quella cache e aggiunge solo geometria.
---
## 1. Tre strati — non mescolare
Ogni finding ha **tre campi distinti**:
| Strato | Nome campo | Chi lo produce | Cosa può contenere |
| --- | --- | --- | --- |
| **FACT** | `facts` | Motore deterministico (netlist, BOM, `.kicad_pcb`) | Solo osservabili: pin, net, mm, V, A, width, thickness |
| **REQUIREMENT** | `requirement` | Rule DB + estrazione libreria (citazione, pagina, MPN) | Testo **sourced**. Provenance nel DB, non nella prosa del modello |
| **INFERENCE** | `inference` | Ingegnere / LLM **solo** qui | Giudizio. Mai copiare uninferenza in `facts` o `requirement` |
Non mescolare: un check non scrive “probabilmente sottodimensionato” dentro `facts`. Se manca un parametro, `evidence_status=INSUFFICIENT` e si **dice** che manca — non si inventa 1 oz, 10 °C, 50 Ω, IEC.
`finding` / `why` restano per compatibilità UI (copia di facts / requirement).
---
## 2. Provenance datasheet (rule DB)
Sul **record di regola**, non nel testo LLM:
| `provenance` | Significato | Classe / severity |
| --- | --- | --- |
| **MANDATORY** | Shall / abs-max / pin NC | Può essere **RULE** + ERROR |
| **RECOMMENDED** | Should / layout note | **Mai ERROR**. RISK o INFO |
| **TYPICAL** | Typical / default application | INFO o RISK, mai RULE ERROR |
| **EXAMPLE** | Figure / typical application circuit | REVIEW o INFO |
**Recommended ≠ ERROR.** Il clamp è nel motore (`complete_finding`).
---
## 3. Classi — Design Rule ≠ Design Review
| `finding_class` | Ruolo |
| --- | --- | --- |
| **RULE** | Violazione di un requisito MANDATORY misurato (FACT vs REQUIREMENT). Deterministico. |
| **RISK** | Margine / derating / inferenza ingegneristica con evidenza parziale. |
| **REVIEW** | Esame AI (schema o PCB). Non è una design rule. |
| **INFO** | Inventario, evidenza insufficiente, decisione del progettista, skip onesto. |
LLM `source=review` / `pcb_review` → sempre **REVIEW**, mai RULE.
---
## 4. Intent + memoria DECISION
Il progettista può dichiarare un intent (es. **PSEL tied low on purpose**). Persistenza: `decisions.json` nel progetto, fingerprint:
`{rule_id\|source}|{designator}|{net}|{aspect}`
`wontfix` / `false_positive` sul report **scrive** una DECISION. Al rescan il motore **non ri-naga** come ERROR: finding `suppressed=true`, `finding_class=INFO`, `decision_id` valorizzato.
---
## 5. Severity, confidence, evidence — indipendenti
- `status` (severity): ERROR | WARNING | INFO
- `confidence`: 01 (quanto è solido il FACT+REQUIREMENT)
- `evidence_status`: SUFFICIENT | INSUFFICIENT
Alto confidence + INFO è legale (misura chiara, non è un fault). Bassa confidence + ERROR **non** è legale se evidence è INSUFFICIENT: si declassa.
---
## 6. Oggetto finding (riproducibile)
Campi obbligatori del motore (oltre a designator / MPN / ids esistenti):
```
facts, requirement, inference
source (pagina/MPN/rule_id)
calculation
assumptions[]
confidence
status (severity)
action # cosa fare; UI usa anche recommendation
provenance
finding_class
evidence_status
decision_id? suppressed?
```
---
## 7. Libreria unica / esame unico
| Store | Path |
| --- | --- |
| Estrazioni IC | `library/extracted/{safe_mpn}.json` (shared) `extracted/` progetto |
| PDF blob | `library/datasheets/blobs/{md5}.pdf` |
PCB: `review_ic_async(..., pdf_path=None)` se c’è pintable. Skip: `no library extraction — run schematic review first`.
---
## 8. Cosa è solo PCB
Geometria board: width/thickness, via, pour courtyard, placement mm, return/stitch, pad-net vs schema (`PE-LAY-*` gerarchia `/net`). **Non** duplicare check schema (mux, LED, filtri netlist).
---
## 9. Fasi (non fingere completezza)
**Fase A:** oggetto finding + clamp provenance/class (**ERROR solo se RULE e MANDATORY**) + decisions + UI schema/PCB + libreria condivisa + check geometria già gated.
**Fase B (questa slice):** gerarchia component→pin→net→block; derating PASS/MARGIN/RISK da Vop/Vrated; timing RC/strap solo con numeri; PI local vs bulk; ESD e return path come REVIEW.
**Fase B close-out:** BOM↔PCB↔datasheet (package/pinout/V/T/I); SPOF REVIEW; EMI solo con FACT in `layout_rules`; Tj da θJA+rame+via quando tutti i parametri ci sono.
**Fase B leftovers:** thermal FEM / OpenEMS; ImpedenceFinder LICENSE UNKNOWN; auto-place pcbnew; GitHub fork detach.
**Fase A identity (shipped on product HEAD):** operator TOS/privacy/fence; not a `validate.py` rewrite.