跳转至

CAD Release

CAD Release uses KiCad, ngspice, and LibreOffice to produce PCB source, STEP, PDF, simulation, renders, and a release presentation while retaining three independent review artifacts.

The live path requires KiCad, ngspice, and LibreOffice. Its output qualifies the workflow; it does not certify the physical design for manufacturing.

CAD release graph

Complete graph definition

The configuration runs from G0 through G6 and includes parallel export, independent critics, failure recovery, a skill benchmark, and human acceptance. You can also download the raw 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

What each Slot does

Slot Stage Role in the graph
requirements input Board dimensions and delivery requirements.
board_seed input KiCad PCB used as the source seed.
eval_matrix input Frozen score baseline for the active and candidate skills.
tool_failure input Controls injected presentation failure.
active_skill_seed input Currently active CAD skill.
design_intent G0 Requirements checksum, board dimensions, and evidence level.
source G1 PCB source entering the release flow.
step G2 Mechanical STEP exported by KiCad.
drawing G2 Silkscreen and board-outline PDF.
render G2 Directory containing top and bottom renders.
drc G2 Native KiCad DRC result.
simulation G2 ngspice simulation evidence.
visual_critique G3 Independent visual check of renders and drawing.
mechanical_critique G3 STEP-format and mechanical-output check.
cad_critique G3 Source, DRC, and simulation check.
dossier G4 Evidence package containing intent and all three critiques.
presentation G4 Release PDF generated through LibreOffice.
skill_candidate G5 CAD skill candidate derived from this run.
skill_benchmark G5 Comparison with the frozen baseline.
active_skill G5 Skill retained or selected after the benchmark.
g6_acceptance G6 Human decision over the exact release evidence.
release_manifest output Final checksums, critics, simulation, and skill decision.

What each Rule does

Rule Reads Writes Work
g0_capture_requirements requirements design_intent Freezes the requirements checksum and qualification level.
g1_generate_source design_intent, board_seed source Produces the PCB source entering release.
g2_export_step source step Exports the mechanical model with KiCad.
g2_export_drawing source drawing Exports silkscreen and edge cuts as PDF.
g2_render_board source render Produces top and bottom PNG renders.
g2_native_drc source drc Runs native KiCad DRC.
g2_simulate design_intent simulation Runs ngspice and records a 5 V to 2.5 V divider result.
g3_visual_critic requirements, render, drawing visual_critique Checks render and drawing files and records checksums.
g3_mechanical_critic requirements, step mechanical_critique Checks the STEP header and checksum.
g3_cad_critic requirements, source, drc, simulation cad_critique Checks zero DRC violations and simulation status.
g4_assemble_dossier design_intent, three critiques dossier Builds the G4 evidence package.
g4_render_presentation dossier, tool_failure presentation Can fail once by injection; otherwise produces the release PDF.
g5_derive_skill_candidate dossier skill_candidate Derives a skill candidate from the evidence.
g5_benchmark_skill skill_candidate, eval_matrix skill_benchmark Compares with the frozen score and writes suppress if it did not improve.
g5_select_active_skill active_skill_seed, skill_candidate, skill_benchmark active_skill Retains the seed skill when promotion is suppressed.
g6_human_acceptance dossier, presentation, skill_benchmark, active_skill g6_acceptance Accepts or rejects the exact G6 evidence.
finalize_release all release artifacts and g6_acceptance release_manifest Records checksums and the final decision after acceptance.

The STEP, drawing, render, and DRC Rules read only source; simulation reads design_intent. These G2 branches can run in parallel. The three G3 Critics also read separate evidence and can run in parallel.

An injected presentation failure affects only the presentation branch. Recovery can reuse upstream design, export, and review Receipts. When the skill candidate does not beat the frozen baseline, the graph carries active_skill_seed forward as active_skill.

Run and inspect it

scripts/test-real-world-cases.sh cad-release contract
scripts/test-real-world-cases.sh cad-release live

Use contract mode to check graph structure, gates, and failure recovery. After live mode, inspect release/manifest.json and compare it with the checksums in the three critique files.