Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
69feaa6
feat(qualification): the Class-A I2C sensor node
JeffMboya Oct 22, 2026
c02134b
feat(qualification): make the I2C sensor node a standalone module
JeffMboya Oct 23, 2026
25ea1af
feat(qualification): the I2C sensor node, as an agent produced it
JeffMboya Oct 26, 2026
8096588
docs(qualification): the I2C sensor node's README and the agent's run
JeffMboya Oct 26, 2026
aee1237
feat(qualification): the I2C sensor node, released and reproduced thr…
Nov 1, 2026
d948e4f
feat(registry): record the reviewer of the parts the I2C sensor node …
Nov 1, 2026
2004758
docs(qualification): the sensor node's open items after the part reviews
Nov 1, 2026
7287c8d
docs(qualification): source the sensor node's input TVS from its LCSC…
Nov 1, 2026
3a64d29
fix(qualification): the sensor node's regulator notes follow the AMS1…
Nov 1, 2026
5a2670c
fix(qualification): the case 2 Gerbers carry the two inner copper layers
JeffMboya Nov 1, 2026
a82004b
docs(qualification): record the case 2 JLCPCB PCB DFM and commit its …
JeffMboya Nov 1, 2026
52096a8
feat(qualification): case 2 on its final layout: the connectors on tw…
JeffMboya Nov 1, 2026
eaf502b
feat(qualification): case 2 schematic is one A1 sheet
JeffMboya Nov 2, 2026
90578a1
docs(qualification): case 2 records the JLCPCB PCB DFM report and the…
JeffMboya Nov 2, 2026
b12e5e5
feat(qualification): case 2 exports with 0.2 mm drills on every via
JeffMboya Nov 2, 2026
b138bae
docs(qualification): case 2 records the JLCPCB PCB DFM of the final p…
JeffMboya Nov 2, 2026
afe3987
docs(qualification): case 2 records the JLCPCB assembly BOM matching …
JeffMboya Nov 2, 2026
5019c71
docs(qualification): case 2 records the JLCPCB quote with assembly
JeffMboya Nov 2, 2026
94c7c3c
docs(qualification): case 2 records the SMT DFM result of the final p…
JeffMboya Nov 2, 2026
fef0fd1
docs(qualification): case 2 states the SMT DFM result against the art…
JeffMboya Nov 2, 2026
6302324
docs(qualification): case 2 records the prompt-to-PCB path and tracks…
JeffMboya Nov 2, 2026
35ddf21
docs(qualification): case 2 records the confirmed SW1 match and the h…
JeffMboya Nov 2, 2026
5ac6c93
docs(qualification): case 2 states which artifacts are byte-identical…
JeffMboya Nov 2, 2026
e77a369
docs(qualification): case 2 records the PCB review sign-off
JeffMboya Nov 2, 2026
9e13463
feat(qualification): case 2 final exports through the Synth MCP server
JeffMboya Nov 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,14 @@ expression: board
"min_voltage_v": null,
"max_voltage_v": 50.0,
"max_current_ma": null
},
"provenance": {
"source": "seed",
"generator": null,
"datasheet_url": null,
"reviewed_by": "JeffMboya",
"reviewed_at": "2026-11-01",
"upstream_lcsc_pn": null
}
},
"source_span": {
Expand Down Expand Up @@ -186,6 +194,14 @@ expression: board
"min_voltage_v": null,
"max_voltage_v": 50.0,
"max_current_ma": null
},
"provenance": {
"source": "seed",
"generator": null,
"datasheet_url": null,
"reviewed_by": "JeffMboya",
"reviewed_at": "2026-11-01",
"upstream_lcsc_pn": null
}
},
"dnp": true,
Expand Down Expand Up @@ -243,6 +259,14 @@ expression: board
"min_voltage_v": null,
"max_voltage_v": 50.0,
"max_current_ma": null
},
"provenance": {
"source": "seed",
"generator": null,
"datasheet_url": null,
"reviewed_by": "JeffMboya",
"reviewed_at": "2026-11-01",
"upstream_lcsc_pn": null
}
},
"group": "Input",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,14 @@ expression: board
"min_voltage_v": null,
"max_voltage_v": 50.0,
"max_current_ma": null
},
"provenance": {
"source": "seed",
"generator": null,
"datasheet_url": null,
"reviewed_by": "JeffMboya",
"reviewed_at": "2026-11-01",
"upstream_lcsc_pn": null
}
},
"value": "10kohm",
Expand Down Expand Up @@ -170,6 +178,14 @@ expression: board
"min_voltage_v": null,
"max_voltage_v": 50.0,
"max_current_ma": null
},
"provenance": {
"source": "seed",
"generator": null,
"datasheet_url": null,
"reviewed_by": "JeffMboya",
"reviewed_at": "2026-11-01",
"upstream_lcsc_pn": null
}
},
"value": "4.7kohm",
Expand Down Expand Up @@ -228,6 +244,14 @@ expression: board
"min_voltage_v": null,
"max_voltage_v": 50.0,
"max_current_ma": null
},
"provenance": {
"source": "seed",
"generator": null,
"datasheet_url": null,
"reviewed_by": "JeffMboya",
"reviewed_at": "2026-11-01",
"upstream_lcsc_pn": null
}
},
"value": "22kohm",
Expand Down Expand Up @@ -286,6 +310,14 @@ expression: board
"min_voltage_v": null,
"max_voltage_v": 50.0,
"max_current_ma": null
},
"provenance": {
"source": "seed",
"generator": null,
"datasheet_url": null,
"reviewed_by": "JeffMboya",
"reviewed_at": "2026-11-01",
"upstream_lcsc_pn": null
}
},
"value": "4.7kohm",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,8 +79,16 @@ expression: board
"min_voltage_v": 3.5,
"max_voltage_v": 15.0,
"max_current_ma": 800.0,
"max_power_mw": 1360.0,
"thermal_resistance_c_per_w": 60.0
"max_power_mw": 1200.0,
"thermal_resistance_c_per_w": 90.0
},
"provenance": {
"source": "seed",
"generator": null,
"datasheet_url": null,
"reviewed_by": "JeffMboya",
"reviewed_at": "2026-11-01",
"upstream_lcsc_pn": null
}
},
"source_span": {
Expand Down Expand Up @@ -137,6 +145,14 @@ expression: board
"min_voltage_v": null,
"max_voltage_v": 50.0,
"max_current_ma": null
},
"provenance": {
"source": "seed",
"generator": null,
"datasheet_url": null,
"reviewed_by": "JeffMboya",
"reviewed_at": "2026-11-01",
"upstream_lcsc_pn": null
}
},
"value": "10u",
Expand Down Expand Up @@ -194,6 +210,14 @@ expression: board
"min_voltage_v": null,
"max_voltage_v": 50.0,
"max_current_ma": null
},
"provenance": {
"source": "seed",
"generator": null,
"datasheet_url": null,
"reviewed_by": "JeffMboya",
"reviewed_at": "2026-11-01",
"upstream_lcsc_pn": null
}
},
"value": "10u",
Expand Down Expand Up @@ -251,6 +275,14 @@ expression: board
"min_voltage_v": null,
"max_voltage_v": 50.0,
"max_current_ma": null
},
"provenance": {
"source": "seed",
"generator": null,
"datasheet_url": null,
"reviewed_by": "JeffMboya",
"reviewed_at": "2026-11-01",
"upstream_lcsc_pn": null
}
},
"value": "10u",
Expand Down Expand Up @@ -308,6 +340,14 @@ expression: board
"min_voltage_v": null,
"max_voltage_v": 50.0,
"max_current_ma": null
},
"provenance": {
"source": "seed",
"generator": null,
"datasheet_url": null,
"reviewed_by": "JeffMboya",
"reviewed_at": "2026-11-01",
"upstream_lcsc_pn": null
}
},
"value": "10u",
Expand Down
40 changes: 40 additions & 0 deletions qualification/class-a/i2c-sensor-node/PROVENANCE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# From prompt to PCB

The board is the output of an agent driving `synth mcp` from a prompt, followed by searches and scripts that drive the same MCP tools and Synth's exporter. This file is the record of that path. [`reproduce/`](reproduce/) is supplemental tooling that rebuilds the exports from the committed source; it is not the evidence that the board was made this way.

## The prompt and the agent trace

| | |
|---|---|
| Prompt | [`agent-run/prompt.md`](agent-run/prompt.md), exactly as given to the agent run `c2a4` |
| Tool-call trace | [`agent-run/tool-calls.md`](agent-run/tool-calls.md): every call of that run, in order (41 calls: `synth_export`, `synth_validate`, `synth_describe_placement`, `synth_place_with_hints`, and file reads and edits of the source and sidecar); `allow_incomplete` was never passed |
| Later steps | the compaction, the placement-advice and release searches, the THT-to-SMD spot search and the sidecar edits are scripts in [`agent-run/tools/`](agent-run/tools/) that drive `synth mcp` (`compact_drive.py`, `make_room_search_pcv.py`, `apply_advice_par6_pcv.py`, `describe_pl.py`) or the sidecar (`set_pos.py`, `tht_fix_spot.py`, `pcb2sidecar.py`); [`agent-run/exports.md`](agent-run/exports.md) records the three final exports |

## Versions

| | |
|---|---|
| Synth, agent run and searches | commit `cfec42751ffd898cd4425322247e56b77951ed0e`, the merge of Synth pull requests #370, #388 and #394 |
| Synth, final exports | commit `aaa8d193fe9573c554a5ed4a4a1c26a492030c8d` (branch `SYN-case2-binary` of `JeffMboya/synth`): the same merge plus the stitching-via fix of #388. `synth --version` prints `synth-cli 0.1.1`; `synth mcp --stdio` is the same binary |
| KiCadRoutingTools | `9399bfb29e072bfe60b10d9cdae20c274fc2a17a` |
| KiCad | 10.0.7 (library tables for DRC and ERC), on a 16-vCPU server |

## Inputs

- Source and sidecar: [`i2c_sensor_node.synth`](i2c_sensor_node.synth) and [`i2c_sensor_node.placement.layout.toml`](i2c_sensor_node.placement.layout.toml).
- User registry: [`reproduce/user-registry/`](reproduce/user-registry/), the parts the exports ran with.

## Generated artifacts and hashes

The README's reproducibility table has the first ten characters of SHA-256 of each exported file for the three exports. The routed board file carries random ids from the router and KiCad, so its three raw hashes differ and are compared after masking those ids; the schematic, project, symbol, BOM, placement and un-routed board files are byte-identical, and the Gerber, drill and job files differ in the creation time in their headers, so they are compared by a content hash with that time masked. The Gerber content hash is in [`fab/GERBER_CONTENT_SHA256`](fab/GERBER_CONTENT_SHA256) and the file hashes in [`fab/SHA256SUMS`](fab/SHA256SUMS).

## Validation commands and results

| Command | Result file |
|---|---|
| The `synth_export` tool of `synth mcp --stdio` on the source and sidecar, three times into empty directories ([`agent-run/tools/mcp_export.py`](agent-run/tools/mcp_export.py) makes the call and records it) | [`export/`](export/), with `i2c_sensor_node.routing.json`; the three recorded sessions are in [`agent-run/mcp-final-export/`](agent-run/mcp-final-export/); `release.json` (the reviewer record and the signal-integrity findings) is the report `synth export-kicad` writes for the same source |
| `kicad-cli pcb drc --refill-zones --severity-all --format json` with the KiCad footprint library table | [`reports/kicad_drc.json`](reports/kicad_drc.json) |
| `kicad-cli sch erc --severity-all --format json` | [`reports/kicad_erc.json`](reports/kicad_erc.json) |
| [`reproduce/compare_exports.py`](reproduce/compare_exports.py) on the three exports | the hash table in the README |
| [`agent-run/tools/fab_package.sh`](agent-run/tools/fab_package.sh) | [`fab/`](fab/) |
| JLCPCB PCB DFM, quote and BOM matching on the package in `fab/` | [`reports/`](reports/) |
Loading
Loading