Expected Inputs
context/staging/structure.json(produced by structural-engine; includes members, roof, hub, footings, geometry sections)context/staging/joinery-model.json
Pre-Flight: Run Geometry Engine If Not Present
python3 scripts/geometry_engine.py \
context/staging/structure.json
CRITICAL: Source of Truth for All Angles and Dimensions
You are FORBIDDEN from computing any angle or dimension internally.
Read all fabrication values from context/staging/structure.json (geometry section):
| Blueprint Field | JSON Path |
|---|---|
| Miter (saw swing) | compound_cut.miter_deg |
| Blade Bevel | compound_cut.bevel_deg |
| Pitch angle | compound_cut.pitch_angle_deg |
| Beam ring flat miter | beam_ring.beam_miter_deg |
| Rafter length (total) | rafter.total_with_overhang_in |
| Roof rise | roof_rise.rise_in |
| Total building height | total_height.total_height_ft |
| SVG coordinates | svg_coordinates.* |
Critical angle distinction — the most common drift failure:
beam_ring.beam_miter_deg= flat cut across beam end (30.00° for hex/4:12) — used for ring beam crosscuts only.compound_cut.miter_deg= compound saw swing for hip rafters (28.71° for hex/4:12) — NOT the same value.- Never use the rafter miter as the beam miter or vice versa.
The most common hallucination: Using the pitch angle (e.g. 18.43°) as the compound miter setting. The miter angle for a hexagonal hip rafter at 4:12 pitch is 28.71°, not 18.43°. The geometry engine calculates this correctly — use it.
Shop Blueprint Determinism Rule
Shop blueprints are fabrication artifacts, not concept art.
For every revision, all blueprint dimensions, angles, and saw settings MUST be sourced from:
context/staging/structure.json
outputs/shop-blueprint/SB01-cut-list.json
Do not infer, estimate, or copy angles from images, render prompts, or visual references.
If blueprint values differ from structure.json (geometry section), stop and create a drift report rather than publishing the output. Every blueprint must include a test-cut warning for compound cuts.
SVG XML Hard Rules (mandatory — same as drawing-generator)
- Comments:
<!-- ... -->only. No--inside comment bodies. - Text nodes: escape
&→&,"→",<→<,>→> - Validate every SVG before writing:
python3 -c "import xml.etree.ElementTree as ET; ET.parse('outputs/blueprint-shop.svg'); print('XML OK')" - Then run the full validator:
python3 scripts/svg_validator.py \ outputs/<sheet>.svg context/staging/structure.json
Behavior
Produce output files:
outputs/blueprint-plan.svg— Footprint with post coordinates, beam ring, diagonal.outputs/blueprint-elevation.svg— Dimensioned elevation with all critical labels.outputs/blueprint-isometric.svg— Mathematically projected parallel wireframe. NO AI image generation. Use exact SVG polygon paths derived from the coordinate map.outputs/blueprint-component-isolation.svg— Isolated detail for compound cut geometry (rafter top/bottom, bird's mouth, hub bolt placement).
Cut List Rules
When generating the cut list table:
- Copy
miter_degandbevel_degverbatim fromstructure.json(geometry section). - Format as:
Miter: XX.X° / Bevel: X.X° - Include a note:
⚠ Test cut on scrap before cutting all [N] pieces. - Never include a "Derived by" note — all values come from the geometry engine.
Always prioritize fabrication clarity over visual aesthetics. Dense dimensions, bold callout arrows, and explicit warnings are preferred.
Gotchas
- Miter angle ≠ pitch angle — the most common failure mode. For a hexagonal hip rafter at 4:12, pitch_angle=18.43° but miter_deg=28.71°. Any blueprint showing miter ≈ pitch angle will produce cuts that fail at the hub. Copy
miter_degverbatim fromstructure.json(geometry section) every time. - "Test cut on scrap" warning is non-negotiable. It must appear in every cut list that includes compound angles. Omitting it exposes the builder to waste on an expensive timber run.
- Isometric is parallel projection, not perspective. No foreshortening, no vanishing points. Compute SVG polygon paths from the coordinate map. Any visual foreshortening indicates a calculation error.
- SB01-cut-list.json must be written as a build artifact. builder-docs-generator reads board-foot totals from this file to generate the budget estimate. If the JSON is not written, the downstream builder documents will be incomplete.
- Component isolation sheet must show the bird's-mouth cut geometry. This is the most referenced detail at the job site. Missing or vague bird's-mouth dimensions are the leading cause of builder callbacks.
Smoke Test
- Angle accuracy gate: Given
structure.jsongeometry section with miter_deg=28.71: all blueprint text labels show miter=28.71° exactly; no sheet shows miter≈18.43°. ✓ - SB01-cut-list.json presence: After skill completes:
outputs/shop-blueprint/SB01-cut-list.jsonexists with board-foot totals populated. ✓ - Validator gate: All four output SVGs pass
svg_validator.pybefore skill signals completion. ✓
Completion: HANDOFF_BLOCK
On successful SVG and cut-list generation, emit this block so the design-orchestrator can proceed to Stage 5 (Blueprint QA):
{
"stage": "shop-blueprint-generator",
"status": "COMPLETE",
"outputs": [
"outputs/blueprint-plan.svg",
"outputs/blueprint-elevation.svg",
"outputs/blueprint-isometric.svg",
"outputs/blueprint-component-isolation.svg",
"outputs/shop-blueprint/SB01-cut-list.json"
],
"sheets_validated": 4,
"next_stage": "validation-agent (Stage 5 Blueprint QA) → Stage 5.75 Drawing Red-Team Gate"
}
If any sheet fails validation or SB01-cut-list.json was not written, set "status": "FAIL" and list the blocking issues.
🚨 Drawing Red-Team Gate — Embedded Enforcement
This skill MUST NOT claim its own SVG outputs are complete or "builder-meaningful."
Blueprint generation ends at SVG + cut-list production. The stage is NOT complete until:
- The adversarial gate has run independently:
python3 plugins/garden-structure-designer/scripts/run_drawing_red_team.py \ --svg-dir outputs \ --model context/staging/structure.json \ --report-dir context/staging \ --md-dir outputs context/staging/drawing-red-team-report.jsonexists withmay_claim_success: true.
Do NOT set package status to PASS, READY, or DESIGN COMPLETE from within this skill.
Passing svg_validator.py is necessary but not sufficient — the red-team gate is the authoritative final check.
Stop-and-Diagnose Before Renderer Rewrite
If generated SVGs fail the red-team gate, this skill must not immediately rewrite drawing logic.
First determine whether the failure is caused by:
- path split between
context/stagingandplugins/garden-structure-designer/context/staging; - stale quality dashboard;
- missing geometry section in
structure.json; - missing
schema-validation-report.json; - missing
physics-validation-report.json; - red-team/content validator correctly rejecting placeholder drawings;
- renderer genuinely lacking required drawing content.
Only rewrite render_drawings.py after confirming:
- the active staging path is known;
structure.jsonis current and its geometry section is populated;- the quality dashboard reads the same staging path;
- the red-team/content validator is running against current SVGs;
- the failure is genuinely renderer output quality.
If the failure is a path/reporting problem, fix the path/reporting problem first.