app
AI Flow: Reverse Engineering
Public Made by Adomby adom
Photos of a PCB to a tagged KiCad copy: parts placed, copper and nets with their evidence, a schematic, a measured confidence score, bench tests and a video of the run.
main
Caleb
Add the Compute Module 5 run of version 0.4.0: report, evidence images, audit sheets and KiCad copy
e47f4f7
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619
{
"at": "2026-11-10T01:58:52Z",
"belowTarget": [
"F.Mask opening 0.721",
"F exposed metal 0.689",
"F.Cu 0.698",
"B.Mask opening 0.355",
"B exposed metal 0.354",
"B holes 0.194",
"B.Cu 0.749"
],
"board": "/home/adom/project/CM5_RE/run6/reverse-flow/.fidelity-board.kicad_pcb",
"boardAreaMm2": 2194.63,
"categories": {
"copper": {
"formula": "100 x the lower IoU of F.Cu and B.Cu, each the lower of its held-out tiles and the second photo. Only bare mask counts: pixels under parts, silk or metal are in neither the numerator nor the denominator, so they cannot raise it. See layers.*.scoredShareOfBoard for how much of the board this covers.",
"score": 69.8
},
"placement": {
"formula": "100 x the lowest of: F exposed metal IoU, F holes IoU (held-out, second photo), and the share of parts whose library pads sit within 0.25 mm of the pads the photo shows",
"score": 68.9
},
"vias": {
"blobTestF1": 14.5,
"notMeasured": "the bottom photo shows no lit domes (one light across the face is not seen), so a blob test for domes measures nothing here; the category stays capped until another check covers it",
"score": null
}
},
"generatedBy": "check fidelity",
"inputs": {
"copper.json": "geometry:fdf35d9462c24060222e8ba6b9a6d5eb301d3e2bc4a59775bc7202f1eb69f8cc",
"parts.json": "8d0dc46ea6df10d5930dfb06d85f914079a93efa0077d27e0d81492b578bb928",
"photo-layers.json": "5a2acfe0e28d850704b8faf11bcc52f7f516b0892f588ed7cf6dc6e52101060e"
},
"layers": {
"B exposed metal": {
"bestShiftMm": {
"iouThere": 0.354,
"x": 0.0,
"y": 0.0
},
"excludedBecause": {
"partBodiesMm2": 829.96
},
"excludedMm2": 829.96,
"heldOutTiles": {
"boardMm2": 23.79,
"boundaryMedianMm": 0.367,
"boundaryP95Mm": 3.7,
"boundarySamples": 19435,
"iou": 0.354,
"photoMm2": 54.73,
"precision": 0.863,
"recall": 0.375
},
"iouTuningTiles": 0.374,
"perBlob": {
"blobs": 113,
"iouMedian": 0.002,
"iouP10": 0.0,
"under05": 68
},
"scoredMm2": 1364.67,
"scoredShareOfBoard": 0.622,
"shiftTest": {
"iouAtBestOfFourShifts": 0.244,
"iouAtZero": 0.354,
"scoresWorse": true,
"shiftMm": 0.25
}
},
"B holes": {
"bestShiftMm": {
"iouThere": 0.223,
"x": -0.1,
"y": 0.0
},
"excludedBecause": {
"note": "a hole with a pin and solder in it does not show",
"partBodiesMm2": 829.96,
"solderedMetalMm2": 58.97
},
"excludedMm2": 888.94,
"heldOutTiles": {
"boardMm2": 0.48,
"boundaryMedianMm": 15.717,
"boundaryP95Mm": 16.067,
"boundarySamples": 57,
"iou": 0.194,
"photoMm2": 0.13,
"precision": 0.206,
"recall": 0.778
},
"iouTuningTiles": 0.012,
"perHole": {
"centreErrorMedianMm": 0.001,
"centreErrorP95Mm": 0.001,
"diameterErrorMedianMm": 0.0,
"diameterErrorP95Mm": 0.0,
"drillsWithNoPhotoHole": 8,
"holesOnPhoto": 1,
"withADrill": 1,
"withNoDrill": 0
},
"scoredMm2": 1305.7,
"scoredShareOfBoard": 0.595,
"shiftTest": {
"iouAtBestOfFourShifts": 0.184,
"iouAtZero": 0.194,
"scoresWorse": true,
"shiftMm": 0.25
}
},
"B.Cu": {
"bestShiftMm": {
"iouThere": 0.749,
"x": 0.0,
"y": 0.0
},
"excludedBecause": {
"holesMm2": 0.2,
"metalMm2": 110.37,
"note": "copper can be read only under bare mask; a margin of 6 px around anything else goes too",
"partBodiesMm2": 829.96,
"silkMm2": 4.53
},
"excludedMm2": 1286.56,
"heldOutTiles": {
"boardMm2": 215.07,
"boundaryMedianMm": 0.05,
"boundaryP95Mm": 0.375,
"boundarySamples": 59543,
"iou": 0.749,
"photoMm2": 253.27,
"precision": 0.932,
"recall": 0.792
},
"iouTuningTiles": 0.75,
"plotAgainstRead": {
"iouVisibleOnly": 0.95,
"iouWholeBoard": 0.757,
"meaning": "KiCad's plotted copper against the pours and tracks of copper.json drawn directly. The whole-board figure also counts pads and vias, which the read layer does not draw",
"plotOnlyVisibleMm2": 15.53,
"readOnlyVisibleMm2": 7.58
},
"scoredMm2": 908.07,
"scoredShareOfBoard": 0.414,
"shiftTest": {
"iouAtBestOfFourShifts": 0.619,
"iouAtZero": 0.749,
"scoresWorse": true,
"shiftMm": 0.25
},
"visibility": {
"agreementVisibleOnly": 0.749,
"hiddenBy": {
"holesMm2": 0.2,
"marginBesideThemMm2": 341.51,
"metalMm2": 110.37,
"partBodiesMm2": 829.96,
"silkMm2": 4.53
},
"visibleMm2": 908.07,
"visibleShareOfBoard": 0.414
}
},
"B.Mask opening": {
"bestShiftMm": {
"iouThere": 0.355,
"x": 0.0,
"y": 0.0
},
"excludedBecause": {
"partBodiesMm2": 829.96
},
"excludedMm2": 829.96,
"heldOutTiles": {
"boardMm2": 24.41,
"boundaryMedianMm": 0.35,
"boundaryP95Mm": 3.558,
"boundarySamples": 19431,
"iou": 0.355,
"photoMm2": 54.86,
"precision": 0.851,
"recall": 0.379
},
"iouTuningTiles": 0.368,
"scoredMm2": 1364.67,
"scoredShareOfBoard": 0.622,
"shiftTest": {
"iouAtBestOfFourShifts": 0.244,
"iouAtZero": 0.355,
"scoresWorse": true,
"shiftMm": 0.25
}
},
"B.SilkS": {
"bestShiftMm": {
"iouThere": 0.974,
"x": 0.0,
"y": 0.0
},
"edgeAgainstLuminance": {
"meaning": "positive: the photographed edge lies outside the drawn shape",
"medianAbsMm": 0.025,
"medianSignedMm": 0.025,
"p95AbsMm": 0.1,
"samples": 421
},
"excludedBecause": {
"holesMm2": 0.2,
"partBodiesMm2": 829.96
},
"excludedMm2": 830.16,
"heldOutTiles": {
"boardMm2": 2.45,
"boundaryMedianMm": 0.0,
"boundaryP95Mm": 0.025,
"boundarySamples": 3173,
"iou": 0.974,
"photoMm2": 2.46,
"precision": 0.989,
"recall": 0.984
},
"iouTuningTiles": 0.975,
"scoredMm2": 1364.47,
"scoredShareOfBoard": 0.622,
"shiftTest": {
"iouAtBestOfFourShifts": 0.218,
"iouAtZero": 0.974,
"scoresWorse": true,
"shiftMm": 0.25
}
},
"F exposed metal": {
"bestShiftMm": {
"iouThere": 0.689,
"x": 0.0,
"y": 0.0
},
"excludedBecause": {
"partBodiesMm2": 748.24
},
"excludedMm2": 748.24,
"heldOutTiles": {
"boardMm2": 77.17,
"boundaryMedianMm": 0.0,
"boundaryP95Mm": 5.142,
"boundarySamples": 29255,
"iou": 0.689,
"photoMm2": 101.4,
"precision": 0.944,
"recall": 0.718
},
"iouTuningTiles": 0.657,
"perBlob": {
"blobs": 68,
"iouMedian": 0.775,
"iouP10": 0.0,
"under05": 25
},
"scoredMm2": 1446.4,
"scoredShareOfBoard": 0.659,
"shiftTest": {
"iouAtBestOfFourShifts": 0.489,
"iouAtZero": 0.689,
"scoresWorse": true,
"shiftMm": 0.25
}
},
"F holes": {
"bestShiftMm": {
"iouThere": 0.944,
"x": 0.0,
"y": 0.0
},
"excludedBecause": {
"note": "a hole with a pin and solder in it does not show",
"partBodiesMm2": 748.24,
"solderedMetalMm2": 114.76
},
"excludedMm2": 862.99,
"heldOutTiles": {
"boardMm2": 11.93,
"boundaryMedianMm": 0.025,
"boundaryP95Mm": 0.108,
"boundarySamples": 1306,
"iou": 0.944,
"photoMm2": 12.09,
"precision": 0.978,
"recall": 0.964
},
"iouTuningTiles": 0.902,
"perHole": {
"centreErrorMedianMm": 0.0,
"centreErrorP95Mm": 0.001,
"diameterErrorMedianMm": 0.0,
"diameterErrorP95Mm": 0.0,
"drillsWithNoPhotoHole": 1,
"holesOnPhoto": 8,
"withADrill": 8,
"withNoDrill": 0
},
"scoredMm2": 1331.64,
"scoredShareOfBoard": 0.607,
"shiftTest": {
"iouAtBestOfFourShifts": 0.778,
"iouAtZero": 0.944,
"scoresWorse": true,
"shiftMm": 0.25
}
},
"F.Cu": {
"bestShiftMm": {
"iouThere": 0.698,
"x": 0.0,
"y": 0.0
},
"excludedBecause": {
"holesMm2": 31.38,
"metalMm2": 206.71,
"note": "copper can be read only under bare mask; a margin of 6 px around anything else goes too",
"partBodiesMm2": 748.24,
"silkMm2": 47.81
},
"excludedMm2": 1279.06,
"heldOutTiles": {
"boardMm2": 349.64,
"boundaryMedianMm": 0.108,
"boundaryP95Mm": 1.092,
"boundarySamples": 47451,
"iou": 0.698,
"photoMm2": 325.06,
"precision": 0.793,
"recall": 0.853
},
"iouTuningTiles": 0.665,
"plotAgainstRead": {
"iouVisibleOnly": 0.903,
"iouWholeBoard": 0.852,
"meaning": "KiCad's plotted copper against the pours and tracks of copper.json drawn directly. The whole-board figure also counts pads and vias, which the read layer does not draw",
"plotOnlyVisibleMm2": 3.41,
"readOnlyVisibleMm2": 70.22
},
"scoredMm2": 915.57,
"scoredShareOfBoard": 0.417,
"shiftTest": {
"iouAtBestOfFourShifts": 0.677,
"iouAtZero": 0.698,
"scoresWorse": true,
"shiftMm": 0.25
},
"visibility": {
"agreementVisibleOnly": 0.698,
"hiddenBy": {
"holesMm2": 31.38,
"marginBesideThemMm2": 244.92,
"metalMm2": 206.71,
"partBodiesMm2": 748.24,
"silkMm2": 47.81
},
"visibleMm2": 915.57,
"visibleShareOfBoard": 0.417
}
},
"F.Mask opening": {
"bestShiftMm": {
"iouThere": 0.721,
"x": 0.0,
"y": 0.0
},
"excludedBecause": {
"partBodiesMm2": 748.24
},
"excludedMm2": 748.24,
"heldOutTiles": {
"boardMm2": 89.23,
"boundaryMedianMm": 0.0,
"boundaryP95Mm": 5.183,
"boundarySamples": 28047,
"iou": 0.721,
"photoMm2": 113.49,
"precision": 0.952,
"recall": 0.748
},
"iouTuningTiles": 0.708,
"scoredMm2": 1446.4,
"scoredShareOfBoard": 0.659,
"shiftTest": {
"iouAtBestOfFourShifts": 0.546,
"iouAtZero": 0.721,
"scoresWorse": true,
"shiftMm": 0.25
}
},
"F.SilkS": {
"bestShiftMm": {
"iouThere": 0.984,
"x": 0.0,
"y": 0.0
},
"edgeAgainstLuminance": {
"meaning": "positive: the photographed edge lies outside the drawn shape",
"medianAbsMm": 0.013,
"medianSignedMm": 0.013,
"p95AbsMm": 0.063,
"samples": 1955
},
"excludedBecause": {
"holesMm2": 31.38,
"partBodiesMm2": 748.24
},
"excludedMm2": 779.62,
"heldOutTiles": {
"boardMm2": 22.19,
"boundaryMedianMm": 0.0,
"boundaryP95Mm": 0.025,
"boundarySamples": 17227,
"iou": 0.984,
"photoMm2": 22.16,
"precision": 0.991,
"recall": 0.992
},
"iouTuningTiles": 0.981,
"scoredMm2": 1415.01,
"scoredShareOfBoard": 0.645,
"shiftTest": {
"iouAtBestOfFourShifts": 0.328,
"iouAtZero": 0.984,
"scoresWorse": true,
"shiftMm": 0.25
}
}
},
"layersWorst": 19.4,
"outline": {
"perPhoto": {
"bottom.jpg": {
"bottom": {
"maxGapMm": 0.129,
"medianGapMm": 0.126
},
"cornerRadiiMm": [
2.9,
0.84,
2.78,
2.84
],
"left": {
"maxGapMm": 0.037,
"medianGapMm": 0.025
},
"right": {
"blocked": true
},
"top": {
"maxGapMm": 0.117,
"medianGapMm": 0.044
}
},
"top.jpg": {
"bottom": {
"maxGapMm": 0.012,
"medianGapMm": 0.011
},
"cornerRadiiMm": [
2.72,
2.6,
2.66,
0.0
],
"left": {
"blocked": true
},
"right": {
"maxGapMm": 0.011,
"medianGapMm": 0.006
},
"top": {
"maxGapMm": 0.037,
"medianGapMm": 0.022
}
}
},
"worstMedianGapMm": 0.126
},
"outlineOffStatedMm": 0.17796207461141797,
"pxPerMm": 40.0,
"samples": {
"edgeAgainstLuminance": "threshold-free: the nearest steepest edge in the luminance, for bias in where the silk edge was put",
"heldOut": "tile set B, primary photos",
"secondPhoto": "tile set B, the other photo of each face, registered through its holes; same camera position and light, so it tests noise and registration, not a choice of threshold",
"tuning": "tile set A of a 5 mm checkerboard, primary photos: thresholds come from here"
},
"scaleCheck": {
"boardMm": [
55.0,
40.0
],
"bottomRegistration": {
"leaveOneOutMaxMm": 0.099,
"leaveOneOutRmsMm": 0.04,
"pairs": 252,
"quadraticRmsMm": 0.039,
"through": "vias showing on both faces",
"translationOnlyMaxMm": 0.116,
"translationOnlyRmsMm": 0.047
},
"edges": {
"bottom": {
"bottomInlierShare": 0.9668367346938777,
"bottomPhotoMm": 39.976,
"bowMmBottom": 0.029,
"bowMmTop": -0.032,
"tiltMradBottom": 0.135,
"tiltMradTop": 0.032,
"topInlierShare": 0.7602040816326531,
"topPhotoMm": 39.861
},
"left": {
"bottomInlierShare": 1.0,
"bottomPhotoMm": 0.097,
"bowMmBottom": 0.027,
"bowMmTop": 0.014,
"tiltMradBottom": 0.667,
"tiltMradTop": 3.851,
"topInlierShare": 0.34558823529411764,
"topPhotoMm": 0.12
},
"right": {
"bottomInlierShare": 0.4411764705882353,
"bottomPhotoMm": 55.005,
"bowMmBottom": -0.033,
"bowMmTop": -0.017,
"tiltMradBottom": 0.136,
"tiltMradTop": -0.713,
"topInlierShare": 0.6727941176470589,
"topPhotoMm": 55.014
},
"top": {
"bottomInlierShare": 0.8418367346938775,
"bottomPhotoMm": 0.069,
"bowMmBottom": 0.033,
"bowMmTop": 0.038,
"tiltMradBottom": 2.162,
"tiltMradTop": -0.392,
"topInlierShare": 0.6760204081632653,
"topPhotoMm": 0.045
}
},
"outlineMm": [
[
100.084,
100.056
],
[
155.028,
100.0345
],
[
154.9996,
139.8622
],
[
100.1105,
139.8605
]
],
"pxPerMm": 60.153,
"rulers": {
"holes": {
"x": null,
"y": null
},
"meaning": "ratio 1.001 means the frame draws 0.1% larger than the library pitch",
"perRuler": [
{
"holes": false,
"name": "J1",
"pads": 14,
"x": 1.0019,
"xBaselineMm": 629.6,
"y": null,
"yBaselineMm": 0.0
},
{
"holes": false,
"name": "J2",
"pads": 5,
"x": 0.9942,
"xBaselineMm": 75.2,
"y": null,
"yBaselineMm": 0.0
}
],
"smallPads": {
"x": {
"ratio": 1.00108,
"rulers": 2,
"spreadBetweenRulers": 0.00239
},
"y": null
}
}
},
"secondPhotos": {},
"targetIoU": 0.8,
"viaLayer": {
"domesInHeldOutTiles": 399,
"domesWithAVia": 53,
"f1": 0.145,
"note": "domes here are small dark spots found by a plain blob test on the bottom face, not the flow's via detector: an independent floor, not a truth",
"precision": 0.161,
"recall": 0.133,
"viasInHeldOutTiles": 330,
"viasOnADome": 53,
"viasOnSilk": 0
}
}