跳转至

CAD Release

CAD Release 使用 KiCad、ngspice 与 LibreOffice 生成电路板源文件、STEP、PDF、仿真、渲染和发布演示,并保留三份独立评审证据。

真实路径需要安装 KiCad、ngspice 和 LibreOffice。输出证明工作流跑过资格检查,不代表实物设计已经获得制造认证。

CAD 发布图

完整图定义

实际配置从 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.jsonmechanical-critique.jsoncad-critique.json 中的校验和。