CAD Release¶
CAD Release 使用 KiCad、ngspice 与 LibreOffice 生成电路板源文件、STEP、PDF、仿真、渲染和发布演示,并保留三份独立评审证据。
真实路径需要安装 KiCad、ngspice 和 LibreOffice。输出证明工作流跑过资格检查,不代表实物设计已经获得制造认证。
完整图定义¶
实际配置从 G0 一直走到 G6,包含并行导出、独立评审、故障恢复、技能基准和人工接收。你也可以下载原始 YAML。
version: 1
project:
name: real-world-cad-release
default_targets: [release_manifest]
slots:
requirements: { kind: file, path: fixtures/requirements.md }
board_seed: { kind: file, path: fixtures/board.kicad_pcb }
eval_matrix: { kind: file, path: fixtures/eval-matrix.json }
tool_failure: { kind: file, path: fixtures/tool-failure.json }
active_skill_seed: { kind: file, path: fixtures/active-skill.md }
design_intent: { kind: file, path: release/design-intent.json }
source: { kind: file, path: release/board.kicad_pcb }
step: { kind: file, path: release/board.step }
drawing: { kind: file, path: release/drawing.pdf }
render: { kind: dir, path: release/render }
drc: { kind: file, path: release/drc.txt }
simulation: { kind: file, path: release/simulation.json }
visual_critique: { kind: file, path: release/visual-critique.json }
mechanical_critique: { kind: file, path: release/mechanical-critique.json }
cad_critique: { kind: file, path: release/cad-critique.json }
dossier: { kind: file, path: release/dossier.json }
presentation: { kind: file, path: release/presentation.pdf }
skill_candidate: { kind: file, path: release/skill-candidate.md }
skill_benchmark: { kind: file, path: release/skill-benchmark.json }
active_skill: { kind: file, path: release/active-skill.md }
g6_acceptance: { kind: file, path: release/g6-acceptance.json }
release_manifest: { kind: file, path: release/manifest.json }
rules:
- id: g0_capture_requirements
in: [requirements]
out: [design_intent]
run: >-
jq -n --arg digest "$(cksum in/requirements | cut -d' ' -f1)" '{gate:"G0",status:"pass",board_mm:[40,30],requirements_checksum:$digest,evidence_level:"workflow_qualification"}' > out/design_intent
- id: g1_generate_source
in: [design_intent, board_seed]
out: [source]
run: "cp in/board_seed out/source"
- id: g2_export_step
in: [source]
out: [step]
run: "cp in/source out/input.kicad_pcb; kicad-cli pcb export step --force --board-only --output out/step out/input.kicad_pcb >/dev/null"
- id: g2_export_drawing
in: [source]
out: [drawing]
run: "cp in/source out/input.kicad_pcb; kicad-cli pcb export pdf --mode-single --layers F.SilkS,Edge.Cuts --output out/drawing out/input.kicad_pcb >/dev/null"
- id: g2_render_board
in: [source]
out: [render]
run: "mkdir -p out/render; cp in/source out/input.kicad_pcb; kicad-cli pcb render --width 800 --height 600 --side top --output out/render/top.png out/input.kicad_pcb >/dev/null; kicad-cli pcb render --width 800 --height 600 --side bottom --output out/render/bottom.png out/input.kicad_pcb >/dev/null"
- id: g2_native_drc
in: [source]
out: [drc]
run: "cp in/source out/input.kicad_pcb; kicad-cli pcb drc --severity-all --exit-code-violations --refill-zones --output out/drc out/input.kicad_pcb >/dev/null"
- id: g2_simulate
in: [design_intent]
out: [simulation]
run: >-
printf 'HG divider qualification\nV1 in 0 DC 5\nR1 in out 10k\nR2 out 0 10k\n.op\n.print op v(out)\n.end\n' > out/fixture.cir; ngspice -b -o out/ngspice.log out/fixture.cir >/dev/null; grep -q '2.500000e+00' out/ngspice.log; jq -n '{schema:"spice-evidence/v1",status:"pass",simulator:"ngspice",input_v:5,output_v:2.5}' > out/simulation
- id: g3_visual_critic
in: [requirements, render, drawing]
out: [visual_critique]
run: >-
test -s in/render/top.png && test -s in/render/bottom.png && test -s in/drawing; jq -n --arg top "$(cksum in/render/top.png | cut -d' ' -f1)" --arg bottom "$(cksum in/render/bottom.png | cut -d' ' -f1)" --arg drawing "$(cksum in/drawing | cut -d' ' -f1)" '{critic:"visual",independent:true,status:"pass",top_checksum:$top,bottom_checksum:$bottom,drawing_checksum:$drawing}' > out/visual_critique
- id: g3_mechanical_critic
in: [requirements, step]
out: [mechanical_critique]
run: >-
grep -q 'ISO-10303-21' in/step; jq -n --arg step "$(cksum in/step | cut -d' ' -f1)" '{critic:"mechanical",independent:true,status:"pass",step_checksum:$step}' > out/mechanical_critique
- id: g3_cad_critic
in: [requirements, source, drc, simulation]
out: [cad_critique]
run: >-
grep -Eq '0 (DRC violations|条违规项)' in/drc; test "$(jq -r '.status' in/simulation)" = pass; jq -n --arg source "$(cksum in/source | cut -d' ' -f1)" '{critic:"cad",independent:true,status:"pass",source_checksum:$source,drc:"native-zero",simulation:"pass"}' > out/cad_critique
- id: g4_assemble_dossier
in: [design_intent, visual_critique, mechanical_critique, cad_critique]
out: [dossier]
run: >-
jq -n --slurpfile intent in/design_intent --slurpfile visual in/visual_critique --slurpfile mechanical in/mechanical_critique --slurpfile cad in/cad_critique '{gate:"G4",status:"pass",intent:$intent[0],critics:[$visual[0],$mechanical[0],$cad[0]]}' > out/dossier
- id: g4_render_presentation
in: [dossier, tool_failure]
out: [presentation]
run: >-
test "$(jq -r '.inject_presentation_failure' in/tool_failure)" = false || exit 75; mkdir -p out/rendered; printf '<html><body><h1>HG CAD Release</h1><p>G0-G4 evidence complete. Three independent critics passed.</p></body></html>' > out/release.html; soffice --headless --convert-to pdf --outdir out/rendered out/release.html >/dev/null; cp out/rendered/release.pdf out/presentation
- id: g5_derive_skill_candidate
in: [dossier]
out: [skill_candidate]
run:
using: codex
model: gpt-5.6-luna
reasoning_effort: none
command: >-
Use shell commands only, never apply_patch. You must execute exactly this command and do nothing else:
printf '# Candidate CAD Skill\n\nAdds transcript wording but no new frozen-case capability.\n' > out/skill_candidate
- id: g5_benchmark_skill
in: [skill_candidate, eval_matrix]
out: [skill_benchmark]
run: >-
jq -n --argjson baseline "$(jq '.active_skill_score' in/eval_matrix)" '{schema:"cad-skill-eval/v1",frozen_cases_passed:5,candidate_score:$baseline,improved:false,promotion:"suppress"}' > out/skill_benchmark
- id: g5_select_active_skill
in: [active_skill_seed, skill_candidate, skill_benchmark]
out: [active_skill]
run: >-
test "$(jq -r '.promotion' in/skill_benchmark)" = suppress; cp in/active_skill_seed out/active_skill
- id: g6_human_acceptance
in: [dossier, presentation, skill_benchmark, active_skill]
out: [g6_acceptance]
run: { using: human, command: "Accept or reject G6 release evidence from an exact JSON file" }
- id: finalize_release
in: [source, step, drawing, render, drc, simulation, visual_critique, mechanical_critique, cad_critique, dossier, presentation, skill_benchmark, active_skill, g6_acceptance]
out: [release_manifest]
when: "test \"$(jq -r '.decision' g6_acceptance)\" = accept"
run: >-
jq -n --arg source "$(cksum in/source | cut -d' ' -f1)" --arg step "$(cksum in/step | cut -d' ' -f1)" --arg drawing "$(cksum in/drawing | cut -d' ' -f1)" --arg render_top "$(cksum in/render/top.png | cut -d' ' -f1)" --arg render_bottom "$(cksum in/render/bottom.png | cut -d' ' -f1)" --arg presentation "$(cksum in/presentation | cut -d' ' -f1)" '{schema:"cad-release/v1",gate:"G6",decision:"accept",evidence_level:"workflow_qualification",source_checksum:$source,step_checksum:$step,drawing_checksum:$drawing,render_top_checksum:$render_top,render_bottom_checksum:$render_bottom,presentation_checksum:$presentation,simulation:"pass",critics:["visual","mechanical","cad"],skill_promotion:"suppressed"}' > out/release_manifest
Slot 怎样分工¶
| Slot | 阶段 | 在图里的作用 |
|---|---|---|
requirements |
输入 | 电路板尺寸与交付要求。 |
board_seed |
输入 | 作为生成起点的 KiCad PCB 文件。 |
eval_matrix |
输入 | 当前技能和候选技能的冻结评分基准。 |
tool_failure |
输入 | 控制演示生成故障注入。 |
active_skill_seed |
输入 | 当前正在使用的 CAD skill。 |
design_intent |
G0 | 要求 checksum、板框尺寸和证据级别。 |
source |
G1 | 进入发布流程的 PCB 源文件。 |
step |
G2 | KiCad 导出的机械 STEP。 |
drawing |
G2 | 丝印与板框 PDF。 |
render |
G2 | 顶面和底面渲染目录。 |
drc |
G2 | KiCad 原生 DRC 结果。 |
simulation |
G2 | ngspice 仿真证据。 |
visual_critique |
G3 | 渲染和图纸的独立视觉检查。 |
mechanical_critique |
G3 | STEP 格式与机械输出检查。 |
cad_critique |
G3 | 源文件、DRC 与仿真的 CAD 检查。 |
dossier |
G4 | 设计意图和三份评审的证据包。 |
presentation |
G4 | LibreOffice 生成的发布 PDF。 |
skill_candidate |
G5 | 从本轮证据提炼的 CAD skill 候选。 |
skill_benchmark |
G5 | 候选与冻结基准的比较结果。 |
active_skill |
G5 | 基准判断后保留或替换的 active skill。 |
g6_acceptance |
G6 | 用户对确切发布证据的决定。 |
release_manifest |
输出 | 汇总校验和、评审、仿真与技能决定的最终清单。 |
Rule 逐条看¶
| Rule | 读取 | 写入 | 作用 |
|---|---|---|---|
g0_capture_requirements |
requirements | design_intent | 固定要求 checksum 与资格证据级别。 |
g1_generate_source |
design_intent、board_seed | source | 生成进入发布流程的 PCB 源。 |
g2_export_step |
source | step | 用 KiCad 导出机械模型。 |
g2_export_drawing |
source | drawing | 导出丝印与板框 PDF。 |
g2_render_board |
source | render | 并行路径中生成顶面与底面 PNG。 |
g2_native_drc |
source | drc | 运行 KiCad 原生 DRC。 |
g2_simulate |
design_intent | simulation | 运行 ngspice 并记录 5V 分压为 2.5V。 |
g3_visual_critic |
requirements、render、drawing | visual_critique | 检查渲染与图纸并记录 checksum。 |
g3_mechanical_critic |
requirements、step | mechanical_critique | 检查 STEP 头和 checksum。 |
g3_cad_critic |
requirements、source、drc、simulation | cad_critique | 检查零 DRC 违规和仿真状态。 |
g4_assemble_dossier |
design_intent、三份 critique | dossier | 汇总 G4 证据包。 |
g4_render_presentation |
dossier、tool_failure | presentation | 可注入一次失败,成功时生成发布 PDF。 |
g5_derive_skill_candidate |
dossier | skill_candidate | 从本轮证据写出 skill 候选。 |
g5_benchmark_skill |
skill_candidate、eval_matrix | skill_benchmark | 与冻结分数比较,未提高时写 suppress。 |
g5_select_active_skill |
active_skill_seed、skill_candidate、skill_benchmark | active_skill | promotion 为 suppress 时保留原 skill。 |
g6_human_acceptance |
dossier、presentation、skill_benchmark、active_skill | g6_acceptance | 让用户接收或拒绝确切 G6 证据。 |
finalize_release |
全部发布工件与 g6_acceptance | release_manifest | accept 后记录所有 checksum 和最终判断。 |
G2 的 STEP、drawing、render 和 DRC 都只读取 source,仿真只读取 design_intent,这些工作可以并行。G3 三个 Critic 读取不同证据,也可以并行。
演示生成故障只改变 presentation 这一路。恢复后,上游设计、导出与评审 Receipt 仍然可用。Skill 候选没有超过冻结基准时,图会把原有 active_skill_seed 继续写入 active_skill。
运行并观察¶
scripts/test-real-world-cases.sh cad-release contract
scripts/test-real-world-cases.sh cad-release live
先用 contract 检查图、门和故障恢复。live 完成后查看 release/manifest.json,再对照 visual-critique.json、mechanical-critique.json 与 cad-critique.json 中的校验和。