← Skills

Deterministic Pitched-L SIP Roofs

Native Read-only

Graph-owned pitched-L roof agents: SIPRoofPanelizer panel system, roof splines, eave plates, gable closures/transitions. Injected to pitched-L component agents.

/skills/sip_pitched_l_roofs.md

Estimated tokens
1192
Characters
4765
Source
Native

Markdown

# Deterministic Pitched-L SIP Roofs

Use this skill for graph-owned pitched-L agents. The manifest metadata marks them with
`generation_intent = deterministic_pitched_l`, but persisted component records may not
retain the metadata map; stable ids and `assembly_placement.graph.kind` therefore remain
authoritative routing signals.
These agents are enabled for one to three identical axis-aligned L storeys with one
uniform 15–45 degree gable pitch. Any other pitched-L request must fail eligibility
before component generation; do not approximate unsupported geometry.
Their `metadata` and `assembly_placement` come from the approved building graph and are
authoritative. Do not infer a footprint, choose a ridge direction, calculate a valley,
change a pitch, or replace graph coordinates with values derived from a bounding box.

## Roof panel system

For `metadata.builder = SIPRoofPanelizer`, pass `lower_wing`, `upper_wing`,
`pitch_degrees`, and `stock` directly to `SIPRoofPanelizer`. Build every descriptor
returned by its plan. Panel splits are fabrication parts; `GableRoom` is reference
envelope metadata only and must never be emitted as a manufacturable component.
The Design assembly may present these panels as one selectable `Part.makeCompound`, but
the compound MUST be built from the same panelizer result. Never infer pitch, wing split,
panel thickness, or ridge height from its bounding box.

## Structure and connections

For `metadata.builder = SIPRoofStructure`, use the exact skeleton and panel descriptors
provided by the manifest. Ridge and valley `from`/`to` values are immutable graph-owned
lines. Emit the planned ridge members, single continuous valley rafter, sloped rafters
beneath panel seams, transverse purlins beneath stock-row joints, wall-mounted joist
hangers at rafter eaves, and the catalogued frame fastener schedules.

The graph skeleton describes the **exterior roof face**. Derive each structural bearing
line on the parallel SIP underside by subtracting
`roof_panel_thickness / cos(pitch)` from its Z coordinate. That is the vertical
intercept of the normal-offset underside plane. The underside line is the
top/contact datum, never the bottom of a timber member. Ridge, valley and eave bearing
members must extend downward from it into the building envelope. Never place a member
directly on the exterior skeleton line: that embeds it through the full panel depth.
This is distinct from positioning the complete panel envelope at the walls: place the
exterior eave at `wall_top_z + roof_panel_thickness * cos(pitch)` so the panel solid's
lowest eave edge meets the wall top. Do not use the underside-plane intercept as the
whole-roof lift; the difference appears as a visible gap above the walls.

Both wing ridges must use the same double-bevelled `RidgeBoard` geometry as an ordinary
duo-pitch SIP roof. Centre its arris on the graph ridge line, place its arris exactly at
the panel underside, and extend its depth downward. A flat-topped box or an unbevelled
beam is prohibited because it only line-contacts the two roof slopes.

Every sloped rafter that reaches an eave must terminate in a catalogued joist hanger
fixed to the wall structure. Rafters and transverse purlins remain inside the building
envelope and their top faces are trimmed tangent to the SIP underside. Gable closures
remain non-bearing infill. Roof panels bear and fasten onto this recessed frame.

An L made from overlapping gable wings also exposes two transition gables even though
their footprint edges are classified as eaves: `gable_transition_south` and
`gable_transition_west`. Generate both from their graph outlines. The west transition
owns their shared southwest corner. Trim both against the actual `SIPRoofPanelizer`
envelope with `SIPRoofPanelizer.gable_transition(...)`; a visible triangle is not
acceptable if it occupies roof-panel volume.

Preserve STEP-measured `bounding_box` and `bbox_origin` when graph placement is refreshed.
The panelizer extrudes roof thickness inward and therefore produces a negative local Z
origin. Dropping it places the complete roof approximately one panel vertical projection
too low and drives it through the walls and bearing plates.

## Prohibited fallback

- Do not use `RoofPanel`, `PitchedRoofSlope`, or hand-authored solids for these agents.
- Do not merge the two roof wings into a rectangular gable roof.
- Do not add a second ridge, valley, eave plate, perimeter closure, transition closure,
  spline, or fastener agent.
- Do not present embedded panel splines as the roof-bearing structure. Use
  `SIPRoofStructure` and retain `roof_rafter`, `roof_purlin`, and `joist_hanger` parts
  for the design frame body.
- Fail with a missing-contract error if required graph metadata is absent.
v0.0.985