name: document-intelligence
description: >
Comprehensive construction document intelligence extraction system. Use when processing ANY construction documents (plans, specs, schedules, contracts, geotech, safety, SWPPP, sub lists, RFIs, submittals) to extract field-actionable data for daily reports, project management, quality control, and procurement. Also generates the Project Intelligence Dashboard and construction schedules (door, hardware, fixture, finish, plumbing, equipment, room) from extracted data. Triggers: "process documents", "extract from plans", "read the specs", "analyze schedule", "set up project", "add documents", "show project intelligence", "project intel", "what data do we have", "door schedule", "hardware schedule", "finish schedule", "generate schedules", "room schedule", "equipment schedule", any mention of construction document processing or project intelligence building. This skill should be used EVERY TIME construction documents need to be processed - it extracts deep, comprehensive data including specific values, schedules, specifications, and coordination information that goes far beyond basic document reading.
version: 1.0.0
Construction Document Intelligence
A comprehensive extraction system for construction project documents that captures deep, field-actionable intelligence for daily reports, project management, quality control, and procurement tracking.
Overview
This skill transforms raw construction documents into structured, actionable project intelligence by:
- Classifying documents automatically (plans, specs, schedules, contracts, etc.)
- Extracting comprehensive data with specific numerical values, not just descriptions
- Cross-referencing information across multiple documents
- Tracking extraction quality with confidence levels and coverage metrics
- Structuring output for downstream consumption by project management systems
Key difference from basic document reading: This skill extracts SPECIFIC VALUES and COMPLETE SCHEDULES rather than just summaries. For example:
- Not just "concrete requirements" → "4,000 PSI concrete, w/c ratio 0.45 max, slump 4"±1", air content 5.5%±1.5%, cure 7 days wet"
- Not just "room list" → Complete room schedule with ALL 50+ rooms, numbers, names, areas, departments
- Not just "schedule milestones" → Full critical path with durations, float, predecessors, constraints
When to Use This Skill
ALWAYS use this skill when:
- Setting up a new project (/set-project, /process-docs, project initialization)
- Processing construction drawings (plans, elevations, sections, details)
- Processing specification books or spec sections
- Processing CPM schedules (P6, MS Project, Asta)
- Processing geotech reports, safety plans, SWPPP documents
- Processing contracts, subcontractor lists, RFI logs, submittal logs
- Updating project intelligence with new document revisions
- Any task involving "extract", "process", "read", "analyze" + construction documents
Triggers include:
- "Process these plans and extract grid lines, rooms, and finishes"
- "Read the spec book and get concrete requirements"
- "Analyze this schedule for critical path and milestones"
- "Extract subcontractor information from these contracts"
- "Process the geotech report for bearing capacity and compaction requirements"
- "What are the weather thresholds in the specs?"
- "Set up project intelligence from these documents"
- "Show me the project intelligence" / "project intel dashboard" / "what data do we have"
- "Show me the door schedule" / "generate schedules" / "hardware schedule" / "finish schedule"
- "What schedules have been extracted?" / "room schedule" / "equipment schedule"
Core Capabilities
1. Extraction Pipeline (5-Phase Adaptive Model)
This extraction system uses a 5-phase adaptive model. The phases below (Phase 1-2) cover the per-document extraction methodology. Cross-referencing (Phase 3), remediation (Phase 4), and normalization (Phase 5) are orchestrated at the pipeline level — see commands/process-docs.md for the full pipeline and agents/extraction-pipeline-orchestrator.md for the meta-agent.
Phase 1 — Index & Classify (Lightweight)
For each document, extract metadata and classify:
- PDF metadata: creator application, dates, page count, title, author
- Document type classification (see
doc-orchestrator.md classification table)
- For plan PDFs: build sheet index from TOC or title blocks
- For specs: identify division/section structure
Phase 2A — Structural Analysis (Quick Scan)
Scan for structural patterns to guide extraction:
- Sheet index (for drawings), Table of contents (for specs)
- Headers, footers, tables, content signals
- Adaptive intensity: cover sheets get 2 passes, plan sheets get 4-6
Phase 2B — Deep Content Extraction (Targeted)
Based on document type, extract comprehensive intelligence following specialized references in extraction-rules.md.
Entity resolution during extraction: Assign tentative entity references using directory.json and specs-quality.json as lookup tables. Mark as "entity_status": "tentative". These are confirmed in Phase 3 (Cross-Reference) at the pipeline level.
Pass 4: Visual / Graphical Analysis (Plan Sheets and Drawings)
This pass is REQUIRED for any PDF that contains construction drawings, plan sheets, details, sections, or schedules embedded as graphics. Construction documents communicate ~80% of their information through drawings, not text. Skipping this pass means missing scale data, dimensions, room locations, door swings, equipment positions, and graphical notes.
Method 1 — Claude Vision (Primary, always available in Cowork):
- Convert PDF pages to images:
pdftoppm -png -r 200 "document.pdf" /tmp/sheet_images/sheet (or PyMuPDF)
- Use the Read tool to view each sheet image directly (Claude's native multimodal vision)
- Extract: scale data (per-view), dimension strings, detail callouts, room labels with grid locations, door swings, equipment locations, general notes, title block data, north arrow
- Store with
"source": "claude_vision" and "confidence": "medium"
Method 2 — Python Visual Pipeline (Optional Enhancement):
If cv2, skimage, sklearn are installed, optionally run visual_plan_analyzer.py for automated extraction with precise pixel coordinates:
- OCR text extraction, wall/line detection, symbol recognition
- Material zone detection (hatches → concrete, VCT, tile, insulation)
- Dimension extraction (pairing OCR text with dimension lines)
- Scale calibration (graphic scale bars AND text-format scales)
Falls back to OpenCV + Tesseract if PaddleOCR is unavailable. This pipeline is not required — Claude Vision handles the majority of extraction needs.
Method 3 — Tesseract OCR (Supplement for small text):
Supplement small text that Claude Vision misses: tesseract sheet.png output -l eng --psm 6
Priority: Claude Vision (primary, always available) > Tesseract (text supplement) > Python pipeline (optional precise coordinates)
DPI Recipes:
| Document Type |
DPI |
Notes |
| D-size drawings (24x36, 30x42) |
150 |
Crop to 1800x1200 for Vision |
| Letter-size PDFs (specs, submittals) |
200 |
Standard rendering |
| High-detail areas (enlarged plans, details) |
300-350 |
Zone crop specific areas |
| Text-extractable PDFs (contracts, reports) |
Skip |
Extract text directly, no rendering |
Atomic Python Script Pattern:
When updating multiple JSON files from extraction, use a single atomic script: read all targets → modify in memory → write all → print summary. This prevents partial writes and ensures consistency. See commands/process-docs.md for the code template.
Phase 2C: Scale Calibration Protocol (RECOMMENDED, non-blocking)
Scale calibration is RECOMMENDED before extracting measurement data from a sheet. It improves dimensional accuracy but is non-blocking — if calibration fails, record "scale_status": "uncalibrated" and continue extraction. Text-based data (room names, door marks, notes, equipment tags) is extracted regardless. Uncalibrated sheets are flagged for remediation in Phase 4.
Without a calibrated scale, pixel-based measurements are unreliable. This sub-pass runs as the FIRST step of visual analysis for every plan sheet.
Step 1 — Graphic Scale Bar Detection (Highest Priority):
Graphic scale bars are the most reliable scale anchor because they survive PDF resizing, printing at different sizes, and scanning. They are typically located near the title block or below individual views.
What to look for:
- A horizontal line with evenly-spaced tick marks (short perpendicular lines)
- Distance labels at ticks (e.g., "0", "4'", "8'", "16'" or "0", "5", "10", "20")
- Often has a subdivided first segment (finer ticks between 0 and the first major tick)
- May be labeled "GRAPHIC SCALE" or just have the unit label ("FEET", "INCHES")
- Common styles: open bar (ticks only), filled bar (alternating black/white segments), ladder bar (enclosed rectangles)
Claude Vision detection method:
- Scan the bottom-right quadrant of each sheet first (most common location), then title block area, then below each view
- Look for the characteristic pattern: horizontal line + evenly-spaced ticks + number labels increasing left-to-right
- Record: bar pixel length (endpoint to endpoint), bar real-world length (from labels), tick count, unit
- Calculate
pixels_per_foot = bar_pixel_length / bar_real_world_feet
Python pipeline detection method (Pass 7 enhanced):
- Detect candidate horizontal line segments 50-500px long
- Find perpendicular tick marks (short lines within 5px of the candidate, 10-30px tall)
- Require minimum 3 evenly-spaced ticks (spacing variance < 15%)
- Match nearby OCR text to tick positions for distance labels
- Calculate pixels_per_foot from tick spacing and label values
Step 2 — Text Scale Notation (Secondary):
Read text-format scale notations from title blocks and view labels:
- Architectural:
1/4" = 1'-0", 1/8" = 1'-0", 3/16" = 1'-0", 1/2" = 1'-0", 1" = 1'-0", 3" = 1'-0"
- Metric:
1:50, 1:100, 1:200
- Verbal:
SCALE: 1/4" = 1'-0", PLAN SCALE: 1/8"
- Per-view: Detail views often have their own scale different from the main plan
IMPORTANT: Text scales assume the sheet was printed or rendered at the nominal size (24×36", 30×42", etc.). If the PDF was resized during export or scanning, text scales will be WRONG. Always prefer graphic scale bar calibration when available.
Step 3 — Multi-Scale Zone Mapping:
Most plan sheets contain multiple views at different scales on the same sheet. Each view's scale must be mapped independently:
- Main floor plan: Typically 1/4" = 1'-0" or 1/8" = 1'-0"
- Enlarged plans (restrooms, kitchens, lobbies): Typically 1/2" = 1'-0"
- Details: Typically 1" = 1'-0", 1-1/2" = 1'-0", or 3" = 1'-0"
- Site plans: Typically 1" = 20'-0", 1" = 30'-0", or 1" = 50'-0"
For each view on a sheet, record:
{
"view_name": "FLOOR PLAN",
"scale_text": "1/4\" = 1'-0\"",
"pixels_per_foot": 62.5,
"calibration_method": "graphic_bar",
"zone_bbox": [120, 80, 2800, 3200],
"confidence": "high"
}
Step 4 — Known-Dimension Calibration Fallback:
When neither graphic scale bar nor text scale is found (rare but possible on details, sections, or scanned documents):
- Find the longest dimension string on the sheet (e.g., "132'-8"" for an overall building dimension)
- Measure its dimension line in pixels (endpoint to endpoint)
- Calculate:
pixels_per_foot = pixel_length / dimension_feet
- Mark calibration as
"method": "known_dimension", "confidence": "low"
- Cross-check: if ANY other dimension on the sheet can be measured and verified against this calibration, upgrade confidence to "medium"
Step 5 — Double Calibration (Stretch Detection):
Scanned documents and some PDF exports may have different horizontal and vertical scaling (stretched/skewed). After establishing scale:
- Find a horizontal dimension and calculate
h_pixels_per_foot
- Find a vertical dimension and calculate
v_pixels_per_foot
- If they differ by more than 3%: the image is stretched
- Record both values and set
"stretch_detected": true
- All subsequent area calculations must use the geometric mean:
pixels_per_foot = sqrt(h * v)
Scale Data Storage — REQUIRED:
Every plan sheet must have scale data recorded in plans-spatial.json under scale_calibration with per-sheet and per-view scale information:
"scale_calibration": {
"sheets": {
"A-101": {
"sheet_name": "FLOOR PLAN",
"calibration_method": "graphic_bar",
"graphic_bar": {
"pixel_length": 250,
"real_world_feet": 16,
"tick_count": 5,
"location": [2400, 3600]
},
"text_scale": "1/4\" = 1'-0\"",
"pixels_per_foot": {
"horizontal": 62.5,
"vertical": 62.3,
"mean": 62.4
},
"stretch_detected": false,
"zones": [
{
"view_name": "FLOOR PLAN",
"scale_text": "1/4\" = 1'-0\"",
"pixels_per_foot": 62.4,
"zone_bbox": [120, 80, 2800, 3200],
"confidence": "high"
},
{
"view_name": "ENLARGED RESTROOM PLAN",
"scale_text": "1/2\" = 1'-0\"",
"pixels_per_foot": 124.8,
"zone_bbox": [2850, 80, 3600, 1200],
"confidence": "high"
}
],
"confidence": "high",
"calibration_date": "2026-02-20"
}
}
}
If scale calibration fails for a sheet (no graphic bar, no text scale, no readable dimensions):
- Record
"calibration_method": "none", "scale_status": "uncalibrated", "confidence": "failed"
- Flag the sheet for Phase 4 remediation (re-attempt with different method or manual review)
- Continue extraction — text-based data (room names, door marks, notes, equipment tags, general notes) can still be extracted without scale
- Pixel-based measurements on uncalibrated sheets should be marked with
"confidence": "low" and "uncalibrated": true
Uncalibrated sheets reduce the extraction depth score but do not block the pipeline. They are queued for targeted remediation in Phase 4.
Pass 4B: Dimension String Chaining and Verification
After scale calibration, extract and chain dimension strings. Dimension chains are the primary cross-check for measurement accuracy.
What is a dimension chain?
On construction drawings, dimensions are arranged in "strings" — a series of sub-dimensions along a common line that sum to an overall dimension. For example, column grid spacing (31'-4" + 29'-0" + 29'-0" + 29'-0" + 14'-4" = 132'-8"). If the sub-dimensions don't sum to the overall, there's either an extraction error or a drawing error worth flagging.
Claude Vision extraction method:
- For each dimension string visible on the sheet, read ALL individual dimension values along the line
- Identify the overall dimension (the one spanning the entire string, usually offset further from the drawing)
- Sum the sub-dimensions and compare to the overall:
- Match within ±1": chain verified ✓
- Discrepancy > 1": flag for review — may indicate OCR misread or drawing error
- Tag each dimension with its orientation (horizontal/vertical/angled)
- Where possible, note what elements the dimension connects (e.g., "Grid 1 to Grid 2")
Store dimension chains in plans-spatial.json under dimensions.chains:
{
"chain_id": "DIM-CHAIN-001",
"sheet": "A-100",
"orientation": "horizontal",
"overall_value": "132'-8\"",
"overall_numeric_ft": 132.67,
"segments": [
{"value": "31'-4\"", "numeric_ft": 31.33, "from_element": "Grid 1", "to_element": "Grid 2"},
{"value": "29'-0\"", "numeric_ft": 29.0, "from_element": "Grid 2", "to_element": "Grid 3"}
],
"segments_sum_ft": 132.67,
"sum_matches_overall": true,
"discrepancy_ft": 0
}
Dimensions NOT part of any chain go into dimensions.isolated.
Pass 4C: Elevation Marker and Spot Elevation Extraction
Elevation markers appear on building sections, wall sections, and elevation views. They provide critical vertical measurement data.
What to look for:
- Level markers: Horizontal lines with text like "T.O. WALL 12'-0"", "FFE 0'-0"", "T.O. FOOTING -4'-0""
- Relative elevations: Dimensions prefixed with +/- relative to FFE (Finished Floor Elevation)
- Absolute elevations: Text like "EL. 856'-6"" referencing MSL (Mean Sea Level) datum
Spot elevations appear on civil/site plans as standalone numbers (e.g., "856.50") with an X or + marker:
- Existing spot elevations: Typically shown with parentheses or dashed text "(856.50)"
- Proposed spot elevations: Typically bold or standard text "856.50"
- FFE: Finished Floor Elevation, often boxed or highlighted
- Top of curb (TC): Labeled "TC" or "T/C"
Store elevation markers in plans-spatial.json under elevation_markers:
{
"sheet": "A-300",
"label": "T.O. WALL",
"elevation": "12'-0\"",
"elevation_ft": 12.0,
"datum": "FFE = 0'-0\"",
"marker_type": "level"
}
Store spot elevations in plans-spatial.json under site_grading.spot_elevations:
{
"sheet": "C-103",
"elevation_ft": 856.50,
"type": "proposed",
"label": "856.50'"
}
Pass 4D: Cross-Sheet Reference Extraction
Cross-sheet references are the connective tissue of a plan set. Every section cut, detail callout, elevation marker, and schedule reference on one sheet points to a view on another sheet. Building this index is what enables assembly chains and multi-page calculations.
What to extract:
Section Cut Markers — Circle with number/letter + arrow indicating viewing direction. Format: number / sheet_number (e.g., "3/A-301" means "Section 3 is on sheet A-301").
- Record: source sheet, marker location (grid reference), target sheet, section number, viewing direction
Detail Callouts — Circle or diamond with detail_number / sheet_number. Points to an enlarged detail view.
- Record: source sheet, marker location, target sheet, detail number, what's being detailed (wall, footing, connection, etc.)
Elevation Markers — Circle with number/letter, NO arrow (unlike section cuts). References an exterior or interior elevation view.
- Record: source sheet, target sheet, elevation number
Enlarged Plan References — Dashed rectangle on the main plan with label pointing to a larger-scale view on another sheet.
- Record: source sheet, target sheet, boundary on source (approximate grid bounds)
Schedule References — Door marks (D101), window marks (W-3), room numbers, equipment tags that cross-reference to schedule sheets.
- Record: mark/tag, plan sheet where it appears, schedule sheet it references
Spec Section References — Text like "SEE SECTION 03 30 00" or "PER SPEC 09 65 00" on drawings.
- Record: source sheet, spec section number, context
Store in plans-spatial.json under sheet_cross_references:
{
"detail_callouts": [
{
"id": "XREF-001",
"source_sheet": "A-100",
"source_location": {"grid": "C-3", "zone": "plan_area"},
"target_sheet": "A-501",
"target_detail": "3",
"callout_type": "section",
"description": "Building section at Grid 3",
"linked_elements": ["grid_3", "wall_type_2A"]
}
]
}
IMPORTANT: Cross-reference extraction should happen on EVERY sheet, not just architectural. Structural sheets reference details, MEP sheets reference riser diagrams, civil sheets reference profile views. Build the index incrementally — each processed sheet adds its references to the master index.
After processing all sheets in a document, verify the index:
- Every target sheet referenced should exist in the drawing index
- Flag "orphan references" — callouts pointing to sheets not in the set (may indicate missing sheets)
- Flag "unreferenced sheets" — sheets in the index that no other sheet points to (may be standalone or may be missing callouts)
Pass 4E: Contour Line and Grading Extraction (Civil/Site Sheets)
This pass applies ONLY to civil/site plan sheets (C-series sheets, grading plans, site plans with contour lines). Skip for architectural, structural, MEP, and other disciplines.
Contour lines represent terrain elevations. The difference between existing and proposed contours at any point equals the cut or fill depth — critical for earthwork volume estimation.
What to extract:
Contour Elevation Labels — 3-4 digit numbers (e.g., 856, 857, 858) placed along curved lines. These are the elevation values for each contour.
Existing Contours (current terrain):
- Dashed lines with elevation labels
- Represent the ground as it exists before construction
- Sometimes shown lighter or in a different color
Proposed Contours (design terrain):
- Solid lines with elevation labels
- Represent the finished grade after construction
- Usually shown heavier/darker than existing
Index Contours — Every 5th or 10th contour is drawn thicker. Labels are always shown on index contours. Use index contour spacing to determine the contour interval (typically 1', 2', or 5').
Drainage Patterns — Water flows perpendicular to contours, from high elevation to low. V-shaped contour patterns pointing uphill indicate valleys/swales (drainage paths). Contours bowing away from buildings should confirm positive drainage.
Cut/Fill Zones — Where proposed contours are LOWER than existing = CUT (excavation). Where proposed contours are HIGHER than existing = FILL (import/compaction). Document the general cut/fill pattern for the site.
Store in plans-spatial.json under site_grading:
{
"contours": {
"existing": [{"elevation_ft": 856.0, "line_style": "dashed", "sheet": "C-103"}],
"proposed": [{"elevation_ft": 856.0, "line_style": "solid", "sheet": "C-103"}],
"contour_interval_ft": 1.0
},
"cut_fill_volumes": {
"net_operation": "cut",
"avg_cut_depth_ft": 3.5,
"max_cut_depth_ft": 6.0,
"confidence": "low",
"note": "Rough estimate — verify with earthwork quantity takeoff"
},
"drainage_patterns": [
{"direction": "southeast", "high_elevation": 862, "low_elevation": 854, "fall_ft": 8}
]
}
Cross-check with SWPPP: The contour/grading data should be consistent with SWPPP disturbed area and cut/fill volumes. Flag if the grading plan shows significantly different earthwork than the SWPPP.
Pass 4F: Building Section and Wall Section Extraction (Section/Detail Sheets)
This pass applies to architectural section sheets (A-300 series), structural sections (S-300 series), wall section details (A-400/A-500 series), and any sheet containing building or wall section cuts. Skip for plan views, site plans, MEP plans, and reflected ceiling plans.
Building sections and wall sections are the primary source of vertical dimensioning, assembly composition, and structural depth data that cannot be obtained from plan views.
What to extract:
1. Building Sections (full-height cross-sections through the building):
- Floor-to-floor height: Distance from finished floor (FFE) to the next level or roof structure. For single-story buildings, this is the floor-to-roof structure distance.
- Foundation depth: Distance from finished grade to bottom of footing. Includes footing thickness, stem wall height, and any grade beam depth.
- Ridge height: Top of roof ridge above finished floor.
- Eave/parapet height: Top of exterior wall above finished floor.
- Roof slope: Read from slope triangle symbols (e.g., 4:12, 1/4":12") or calculate from rise/run dimensions.
- Ceiling height: Distance from FFE to bottom of ceiling system (ACT grid, GWB, exposed structure).
- Structural depth: Depth of roof joists, trusses, purlins, or beams visible in section.
- SOG thickness: Slab-on-grade thickness from section detail.
- Cut location: Which grid line and direction the section is cut through (from section marker on plan).
2. Wall Sections (enlarged vertical cuts through wall assemblies):
- Wall type identifier: Match to wall type legend (Type 1, Type 2, etc.) or wall schedule.
- Total wall thickness: Overall dimension from face to face.
- Layer-by-layer assembly (from exterior to interior):
- Material name (e.g., "5/8" Type X GWB", "3-5/8" metal stud", "R-13 batt insulation")
- Thickness of each layer
- Position classification: exterior_finish, sheathing, air_barrier, insulation, stud_cavity, interior_finish
- Fire rating: If noted on section (e.g., "1-HR FIRE PARTITION")
- Head/sill/jamb details: Conditions at top of wall, window sill, and door jamb if shown
- Base condition: How wall meets floor (reveals, base trim, sealant joints)
- Top condition: How wall meets structure above (deflection track, fire safing, sealant)
3. Section Identification:
- Section mark/number: The label that identifies this section (e.g., "1/A-300")
- Cut line reference: Which sheet and location the section is cut from
- Scale: Section scale (typically 3/4"=1'-0" for building sections, 1-1/2"=1'-0" or 3"=1'-0" for wall sections)
- Title: Section title as shown below the drawing
Store in plans-spatial.json under sections:
{
"sections": {
"building": [
{
"section_id": "SECT-A300-1",
"sheet": "A-300",
"section_mark": "1",
"cut_line_on_sheet": "A-100",
"cut_location": "Grid line 3, looking east",
"scale": "3/4\" = 1'-0\"",
"title": "Building Section - East/West",
"floor_to_floor_ft": 14.5,
"foundation_depth_ft": 4.0,
"footing_thickness_in": 12,
"stem_wall_height_ft": 2.0,
"ridge_height_ft": 22.5,
"eave_height_ft": 14.0,
"parapet_height_ft": 0,
"roof_slope": "4:12",
"roof_slope_degrees": 18.43,
"ceiling_height_ft": 10.0,
"ceiling_type": "ACT",
"structural_depth_in": 24,
"structural_member": "PEMB rafter",
"sog_thickness_in": 5,
"measurements": [
{"label": "FFE to T.O. Steel", "value_ft": 14.5, "confidence": "high"}
]
}
],
"wall": [
{
"section_id": "WSECT-A302-1",
"sheet": "A-302",
"section_mark": "1",
"wall_type": "Type 4",
"fire_rating": "1-HR",
"total_thickness_in": 5.25,
"layers": [
{"material": "5/8\" Type X GWB", "thickness_in": 0.625, "position": "interior_finish"},
{"material": "3-5/8\" 20ga metal stud @ 16\" OC", "thickness_in": 3.625, "position": "stud_cavity"},
{"material": "R-13 batt insulation", "thickness_in": 3.5, "position": "insulation"},
{"material": "5/8\" Type X GWB", "thickness_in": 0.625, "position": "interior_finish"}
],
"base_condition": "Vinyl base on GWB, sealant at floor line",
"top_condition": "Deflection track, fire safing above ceiling",
"head_detail": null,
"sill_detail": null,
"measurements": [
{"label": "Total assembly", "value_in": 5.25, "confidence": "high"}
]
}
]
}
}
Cross-checks after section extraction:
- Wall types vs plan annotations: Every wall type referenced on floor plans should have a corresponding wall section. Flag missing sections.
- Ceiling heights vs RCP: Section ceiling heights should match reflected ceiling plan height zones. Flag discrepancies > 2".
- Foundation depth vs geotech: Foundation embedment from sections should meet geotech minimum (e.g., 24" below grade for frost). Flag if shallower.
- Roof slope vs structural: Section roof slope should match structural framing slope. Flag if different.
- Fire ratings vs plan partitions: Wall section fire ratings should match fire-rated partition callouts on plans.
Pass 4G: Reflected Ceiling Plan (RCP) and MEP System Extraction
This pass applies to RCP sheets (A-102, A-5xx series, sheets titled "Reflected Ceiling Plan") and MEP plan sheets (M-series mechanical, P-series plumbing, E-series electrical). Skip for site plans, structural framing plans, and architectural floor plans (unless they contain MEP overlay data).
RCPs and MEP plans are the primary source for overhead-plane data (ceiling heights, fixture placement, HVAC devices) and system-level data (pipe sizes, duct sizes, panel schedules, equipment tags) that cannot be obtained from architectural floor plans or sections.
What to extract:
1. Reflected Ceiling Plan Data:
- Ceiling type per room/zone: ACT (acoustic ceiling tile), GWB (gypsum board), exposed structure, specialty (wood slat, metal panel, etc.)
- Ceiling grid module: 2'×2' or 2'×4' for ACT ceilings
- Ceiling tile product: Manufacturer and model from legend or notes (e.g., Armstrong Fine Fissured 1761)
- Ceiling height zones: Group rooms by ceiling height. Read height callouts (e.g., "9'-0" AFF", "CLG @ 10'-0"")
- Height transitions: Where ceiling height changes within or between rooms — soffits, bulkheads, stepped ceilings
- Lighting fixture positions: Symbol type + tag (e.g., 2×4 recessed troffer "A", 6" downlight "C") with room locations
- HVAC devices on ceiling: Supply diffusers, return grilles, exhaust grilles — tag and room
- Sprinkler heads: Approximate count per room (reference only — FP drawings govern)
- Access panels: Locations for above-ceiling MEP access
Store in plans-spatial.json under ceiling_data:
{
"ceiling_data": {
"source_sheet": "A-102",
"grid_type": "2x2",
"grid_module": "24\" x 24\"",
"tile_product": "Armstrong Fine Fissured Second Look 1761",
"height_zones": [
{"rooms": ["101", "102", "103"], "ceiling_height_ft": 9.0, "ceiling_type": "ACT"},
{"rooms": ["104"], "ceiling_height_ft": 10.0, "ceiling_type": "GWB"}
],
"fixture_positions": [
{"tag": "A", "type": "2x4 recessed troffer", "rooms": ["101", "102"], "count": 12},
{"tag": "C", "type": "6\" LED downlight", "rooms": ["103", "104"], "count": 8}
],
"soffits_bulkheads": [
{"room": "101", "description": "Soffit at perimeter, 8'-0\" AFF, 18\" wide"}
]
}
}
2. MEP System Data (Mechanical, Plumbing, Electrical):
Mechanical (M-series):
- Equipment tags and locations: RTU, AHU, EF, VRF, ERV — tag, grid/room position, capacity (tons, CFM, MBH)
- Duct sizes: Supply, return, exhaust — read duct size labels (e.g., "12×8", "10" RD") with system type
- Diffuser/grille tags: Cross-reference to RCP positions and mechanical schedule
- Ductwork routing: Major trunk runs with sizes, branches to rooms
Plumbing (P-series):
- Pipe sizes: Domestic cold/hot, sanitary, storm, gas, medical — read size labels (e.g., "2" CW", "4" SAN")
- Pipe material: As noted (copper, CPVC, PVC, cast iron, SS)
- Fixture connections: Which fixtures connect to which pipe runs
- Equipment: Water heaters, pumps, grease traps, backflow preventers — tag and location
Electrical (E-series):
- Panel schedules: Panel name, voltage, phase, main breaker, circuit list with loads
- Single-line diagram data: Service entrance size, transformer, main distribution, sub-panels
- Circuit assignments: Which circuits serve which rooms/equipment
- Receptacle and device counts: Per room counts of receptacles, switches, special outlets (GFCI, dedicated)
- Equipment connections: HVAC equipment electrical requirements (voltage, phase, MCA, MOCP)
Store in plans-spatial.json under mep_systems:
{
"mep_systems": {
"electrical": {
"source_sheets": ["E-100", "E-101", "E-200"],
"panel_schedules": [
{
"panel": "LP-1",
"location": "Electrical Room 110",
"voltage": "208/120V",
"phase": "3-phase",
"main_breaker": "225A",
"circuits": [
{"circuit": 1, "description": "Lighting - Rooms 101-103", "breaker": "20A", "load_va": 1800}
]
}
],
"single_line_data": {
"service_size": "400A",
"voltage": "208/120V 3-phase",
"transformer": "75 KVA"
},
"circuit_assignments": [
{"room": "101", "circuits": [1, 3, 5], "description": "Lighting + receptacles"}
]
},
"pipe_sizes": [
{"system": "domestic_cold", "size": "2\"", "material": "copper", "sheet": "P-100", "run_segments": []}
],
"duct_sizes": [
{"size": "12x8", "type": "supply", "sheet": "M-100", "run_segments": []}
],
"equipment": [
{
"tag": "RTU-1",
"type": "rooftop_unit",
"sheet": "M-100",
"position": {"grid": "C-3", "room": "Roof"},
"schedule_data": {"cooling_tons": 10, "heating_mbh": 250, "cfm": 4000, "voltage": "208V/3ph"}
}
]
}
}
Cross-checks after RCP + MEP extraction:
- RCP room numbers vs floor plan: Every room on RCP must exist in the floor plan room schedule
- Ceiling heights vs finish schedule: RCP height zones should match finish schedule ceiling column
- Fixture counts vs lighting schedule: Sum of fixture tags on RCP should match schedule quantities
- Diffuser counts vs mechanical schedule: Supply/return diffuser count should support required CFM per room
- Pipe sizes vs plumbing riser diagram: Pipe sizes on plan should match riser diagram
- Panel schedule loads vs connected equipment: Equipment MCA should not exceed circuit breaker rating
- Equipment tags on plan vs equipment schedules: Every tag on plan must appear in corresponding schedule
See references/plans-deep-extraction.md (MEP Drawings section and Reflected Ceiling Plan section) for detailed extraction rules, symbol libraries, and cross-reference tables.
MEP Extraction Depth Requirements:
For EVERY MEP sheet processed, the extraction must achieve the following minimums:
| Discipline |
Minimum Extraction |
| Mechanical |
Every equipment tag + cooling tons + heating MBH + CFM + electrical (V/ph/MCA/MOCP) + served rooms |
| Electrical |
Every panel schedule with ALL circuits, single-line diagram hierarchy, lighting fixture schedule with types/quantities/wattages |
| Plumbing |
Every fixture from schedule with type/mounting/connections/ADA/flow rate, water heater specs, pipe sizes by system |
| Fire Protection |
System type (wet/dry/pre-action), riser location, FDC, head schedule (type/temp/K-factor), fire pump if present |
Do NOT stop at equipment tags only. The extraction must capture schedule data (capacity, ratings, electrical requirements) from mechanical/electrical/plumbing schedule sheets (M-300, E-300, P-400 series).
Reference: See references/mep-deep-extraction.md for complete field-by-field extraction templates.
Pass 4G-2: MEP Schedule Sheets (M-300, E-300, P-400 Series)
This pass is MANDATORY for any project with MEP drawings. Schedule sheets contain the engineering data that equipment tags on plan sheets reference. Without schedule extraction, you only get tag names — not capacities, ratings, or specifications.
Processing order:
- M-300 series (Mechanical Schedules): Extract EVERY row from HVAC equipment schedules, exhaust fan schedules, diffuser/grille schedules
- E-300 series (Panel Schedules, Lighting Schedules): Extract EVERY panel with ALL circuits, EVERY lighting fixture type with quantities
- P-400 series (Plumbing Schedules): Extract EVERY fixture from plumbing fixture schedule, water heater/boiler schedule
- FP sheets (Fire Protection): Extract system type, riser diagram data, sprinkler head schedule
Output depth per discipline — see references/mep-deep-extraction.md for complete field lists.
Validation: After processing, verify:
- Every equipment tag on plan sheets has a matching schedule entry
- Panel schedule connected load ≤ main breaker rating
- Total CFM from diffusers ≤ equipment total CFM
- Every occupied room has lighting fixtures assigned
Pass 4H: Exterior Elevation and Accessibility Extraction
This pass applies to exterior elevation sheets (A-200 series) and architectural floor plans with accessibility annotations. Skip for sections, MEP plans, and civil/site sheets (except site accessibility routes).
Exterior elevations provide the vertical face of the building — material zones, window/door positions, grade line, and overall proportions. Accessibility data is typically annotated on floor plans and site plans as required routes, clearances, and signage.
What to extract:
1. Exterior Elevation Data (A-200 series):
- Elevation face: North, South, East, West (from title or orientation)
- Material zones: Each distinct cladding area with material type, color/finish, and approximate coverage area
- Primary cladding (metal panels, CMU, brick, etc.)
- Accent materials (stone veneer, brick banding, decorative panels)
- Foundation/base visible material
- Trim/fascia material and color
- Window and door positions: Mark numbers with their vertical positions on the elevation. Cross-reference to window/door schedules.
- Grade line elevation: The finished grade line with elevation value if noted
- Overall building dimensions: Height measurements (grade to eave, grade to ridge, floor-to-floor if multi-story)
- Roof material and slope: Visible from elevation — material type, color, slope direction
- Canopy/entry features: Portico structure, canopy material, entry surround
- Signage locations: Where building signage is indicated
Store in plans-spatial.json under elevations.exterior:
{
"elevations": {
"exterior": [
{
"face": "South",
"sheet": "A-200",
"materials": [
{"zone": "primary_cladding", "material": "Vertical metal panels", "color": "Champagne tan", "mfg_code": "Nucor 12-45"},
{"zone": "base", "material": "Split-face CMU", "color": "Warm gray", "height_ft": 4.0},
{"zone": "trim", "material": "Aluminum", "color": "Dark bronze anodized"}
],
"grade_line_elevation_ft": 856.0,
"window_positions": [
{"mark": "W-101", "sill_height_ft": 3.0, "head_height_ft": 7.0}
],
"door_positions": [
{"mark": "101", "type": "storefront entry", "width_ft": 6.0, "height_ft": 7.0}
],
"measurements": [
{"label": "Grade to eave", "value_ft": 14.0},
{"label": "Grade to ridge", "value_ft": 22.5}
]
}
]
}
}
2. Accessibility Data (Floor Plans + Site Plans):
- Accessible routes: Paths of travel from parking/entrance to all public spaces. Note route width (min 36" clear, 44" in corridors) and any obstructions.
- ADA restroom clearances: 60" turning radius, 18" centerline to side wall at WC, lavatory clearance (min 30"×48" clear floor space), grab bar locations (42" side, 36" rear).
- Door clearances: Maneuvering clearances at accessible doors (pull side: 18" beside latch, push side: 12"). Door hardware type (lever vs knob — lever required for accessible).
- Ramp data: Slope (max 1:12 = 8.33%), width (min 36"), landing size (60"×60" at top/bottom/turns), handrail heights (34"-38").
- Signage locations: Tactile/Braille signage at room doors, exit signs, directional signs. Mounting height (48"-60" AFF, latch side).
- Parking accessibility: Accessible stalls (8' wide + 5' access aisle), van access
…(truncated)
1---2name: document-intelligence-23description: <!-- STUB: Canonical source is foremanos-intel/skills/document-intelligence/SKILL.md. Run sync-stubs.sh to update. Do NOT edit directly. -->4---5<!-- STUB: Canonical source is foremanos-intel/skills/document-intelligence/SKILL.md. Run sync-stubs.sh to update. Do NOT edit directly. -->6---7name: document-intelligence8description: >9 Comprehensive construction document intelligence extraction system. Use when processing ANY construction documents (plans, specs, schedules, contracts, geotech, safety, SWPPP, sub lists, RFIs, submittals) to extract field-actionable data for daily reports, project management, quality control, and procurement. Also generates the Project Intelligence Dashboard and construction schedules (door, hardware, fixture, finish, plumbing, equipment, room) from extracted data. Triggers: "process documents", "extract from plans", "read the specs", "analyze schedule", "set up project", "add documents", "show project intelligence", "project intel", "what data do we have", "door schedule", "hardware schedule", "finish schedule", "generate schedules", "room schedule", "equipment schedule", any mention of construction document processing or project intelligence building. This skill should be used EVERY TIME construction documents need to be processed - it extracts deep, comprehensive data including specific values, schedules, specifications, and coordination information that goes far beyond basic document reading.10version: 1.0.011---1213# Construction Document Intelligence1415A comprehensive extraction system for construction project documents that captures deep, field-actionable intelligence for daily reports, project management, quality control, and procurement tracking.1617## Overview1819This skill transforms raw construction documents into structured, actionable project intelligence by:20211. **Classifying documents** automatically (plans, specs, schedules, contracts, etc.)222. **Extracting comprehensive data** with specific numerical values, not just descriptions233. **Cross-referencing** information across multiple documents244. **Tracking extraction quality** with confidence levels and coverage metrics255. **Structuring output** for downstream consumption by project management systems2627**Key difference from basic document reading**: This skill extracts SPECIFIC VALUES and COMPLETE SCHEDULES rather than just summaries. For example:28- Not just "concrete requirements" → "4,000 PSI concrete, w/c ratio 0.45 max, slump 4\"±1\", air content 5.5%±1.5%, cure 7 days wet"29- Not just "room list" → Complete room schedule with ALL 50+ rooms, numbers, names, areas, departments30- Not just "schedule milestones" → Full critical path with durations, float, predecessors, constraints3132## When to Use This Skill3334**ALWAYS use this skill when**:35- Setting up a new project (/set-project, /process-docs, project initialization)36- Processing construction drawings (plans, elevations, sections, details)37- Processing specification books or spec sections38- Processing CPM schedules (P6, MS Project, Asta)39- Processing geotech reports, safety plans, SWPPP documents40- Processing contracts, subcontractor lists, RFI logs, submittal logs41- Updating project intelligence with new document revisions42- Any task involving "extract", "process", "read", "analyze" + construction documents4344**Triggers include**:45- "Process these plans and extract grid lines, rooms, and finishes"46- "Read the spec book and get concrete requirements"47- "Analyze this schedule for critical path and milestones"48- "Extract subcontractor information from these contracts"49- "Process the geotech report for bearing capacity and compaction requirements"50- "What are the weather thresholds in the specs?"51- "Set up project intelligence from these documents"52- "Show me the project intelligence" / "project intel dashboard" / "what data do we have"53- "Show me the door schedule" / "generate schedules" / "hardware schedule" / "finish schedule"54- "What schedules have been extracted?" / "room schedule" / "equipment schedule"5556---5758## Core Capabilities5960### 1. Extraction Pipeline (5-Phase Adaptive Model)6162This extraction system uses a 5-phase adaptive model. The phases below (Phase 1-2) cover the per-document extraction methodology. Cross-referencing (Phase 3), remediation (Phase 4), and normalization (Phase 5) are orchestrated at the pipeline level — see `commands/process-docs.md` for the full pipeline and `agents/extraction-pipeline-orchestrator.md` for the meta-agent.6364#### Phase 1 — Index & Classify (Lightweight)65For each document, extract metadata and classify:66- PDF metadata: creator application, dates, page count, title, author67- Document type classification (see `doc-orchestrator.md` classification table)68- For plan PDFs: build sheet index from TOC or title blocks69- For specs: identify division/section structure7071#### Phase 2A — Structural Analysis (Quick Scan)72Scan for structural patterns to guide extraction:73- Sheet index (for drawings), Table of contents (for specs)74- Headers, footers, tables, content signals75- Adaptive intensity: cover sheets get 2 passes, plan sheets get 4-67677#### Phase 2B — Deep Content Extraction (Targeted)78Based on document type, extract comprehensive intelligence following specialized references in `extraction-rules.md`.7980**Entity resolution during extraction:** Assign tentative entity references using `directory.json` and `specs-quality.json` as lookup tables. Mark as `"entity_status": "tentative"`. These are confirmed in Phase 3 (Cross-Reference) at the pipeline level.8182#### Pass 4: Visual / Graphical Analysis (Plan Sheets and Drawings)8384**This pass is REQUIRED for any PDF that contains construction drawings, plan sheets, details, sections, or schedules embedded as graphics.** Construction documents communicate ~80% of their information through drawings, not text. Skipping this pass means missing scale data, dimensions, room locations, door swings, equipment positions, and graphical notes.8586**Method 1 — Claude Vision (Primary, always available in Cowork):**871. Convert PDF pages to images: `pdftoppm -png -r 200 "document.pdf" /tmp/sheet_images/sheet` (or PyMuPDF)882. Use the Read tool to view each sheet image directly (Claude's native multimodal vision)893. Extract: scale data (per-view), dimension strings, detail callouts, room labels with grid locations, door swings, equipment locations, general notes, title block data, north arrow904. Store with `"source": "claude_vision"` and `"confidence": "medium"`9192**Method 2 — Python Visual Pipeline (Optional Enhancement):**93If `cv2`, `skimage`, `sklearn` are installed, optionally run `visual_plan_analyzer.py` for automated extraction with precise pixel coordinates:94- OCR text extraction, wall/line detection, symbol recognition95- Material zone detection (hatches → concrete, VCT, tile, insulation)96- Dimension extraction (pairing OCR text with dimension lines)97- Scale calibration (graphic scale bars AND text-format scales)98Falls back to OpenCV + Tesseract if PaddleOCR is unavailable. **This pipeline is not required** — Claude Vision handles the majority of extraction needs.99100**Method 3 — Tesseract OCR (Supplement for small text):**101Supplement small text that Claude Vision misses: `tesseract sheet.png output -l eng --psm 6`102103**Priority:** Claude Vision (primary, always available) > Tesseract (text supplement) > Python pipeline (optional precise coordinates)104105**DPI Recipes:**106107| Document Type | DPI | Notes |108|--------------|-----|-------|109| D-size drawings (24x36, 30x42) | 150 | Crop to 1800x1200 for Vision |110| Letter-size PDFs (specs, submittals) | 200 | Standard rendering |111| High-detail areas (enlarged plans, details) | 300-350 | Zone crop specific areas |112| Text-extractable PDFs (contracts, reports) | Skip | Extract text directly, no rendering |113114**Atomic Python Script Pattern:**115When updating multiple JSON files from extraction, use a single atomic script: read all targets → modify in memory → write all → print summary. This prevents partial writes and ensures consistency. See `commands/process-docs.md` for the code template.116117#### Phase 2C: Scale Calibration Protocol (RECOMMENDED, non-blocking)118119**Scale calibration is RECOMMENDED before extracting measurement data from a sheet.** It improves dimensional accuracy but is **non-blocking** — if calibration fails, record `"scale_status": "uncalibrated"` and continue extraction. Text-based data (room names, door marks, notes, equipment tags) is extracted regardless. Uncalibrated sheets are flagged for remediation in Phase 4.120121Without a calibrated scale, pixel-based measurements are unreliable. This sub-pass runs as the FIRST step of visual analysis for every plan sheet.122123**Step 1 — Graphic Scale Bar Detection (Highest Priority):**124125Graphic scale bars are the most reliable scale anchor because they survive PDF resizing, printing at different sizes, and scanning. They are typically located near the title block or below individual views.126127**What to look for:**128- A horizontal line with evenly-spaced tick marks (short perpendicular lines)129- Distance labels at ticks (e.g., "0", "4'", "8'", "16'" or "0", "5", "10", "20")130- Often has a subdivided first segment (finer ticks between 0 and the first major tick)131- May be labeled "GRAPHIC SCALE" or just have the unit label ("FEET", "INCHES")132- Common styles: open bar (ticks only), filled bar (alternating black/white segments), ladder bar (enclosed rectangles)133134**Claude Vision detection method:**1351. Scan the bottom-right quadrant of each sheet first (most common location), then title block area, then below each view1362. Look for the characteristic pattern: horizontal line + evenly-spaced ticks + number labels increasing left-to-right1373. Record: bar pixel length (endpoint to endpoint), bar real-world length (from labels), tick count, unit1384. Calculate `pixels_per_foot = bar_pixel_length / bar_real_world_feet`139140**Python pipeline detection method (Pass 7 enhanced):**1411. Detect candidate horizontal line segments 50-500px long1422. Find perpendicular tick marks (short lines within 5px of the candidate, 10-30px tall)1433. Require minimum 3 evenly-spaced ticks (spacing variance < 15%)1444. Match nearby OCR text to tick positions for distance labels1455. Calculate pixels_per_foot from tick spacing and label values146147**Step 2 — Text Scale Notation (Secondary):**148149Read text-format scale notations from title blocks and view labels:150- Architectural: `1/4" = 1'-0"`, `1/8" = 1'-0"`, `3/16" = 1'-0"`, `1/2" = 1'-0"`, `1" = 1'-0"`, `3" = 1'-0"`151- Metric: `1:50`, `1:100`, `1:200`152- Verbal: `SCALE: 1/4" = 1'-0"`, `PLAN SCALE: 1/8"`153- Per-view: Detail views often have their own scale different from the main plan154155**IMPORTANT:** Text scales assume the sheet was printed or rendered at the nominal size (24×36", 30×42", etc.). If the PDF was resized during export or scanning, text scales will be WRONG. Always prefer graphic scale bar calibration when available.156157**Step 3 — Multi-Scale Zone Mapping:**158159Most plan sheets contain multiple views at different scales on the same sheet. Each view's scale must be mapped independently:160- **Main floor plan**: Typically 1/4" = 1'-0" or 1/8" = 1'-0"161- **Enlarged plans** (restrooms, kitchens, lobbies): Typically 1/2" = 1'-0"162- **Details**: Typically 1" = 1'-0", 1-1/2" = 1'-0", or 3" = 1'-0"163- **Site plans**: Typically 1" = 20'-0", 1" = 30'-0", or 1" = 50'-0"164165For each view on a sheet, record:166```json167{168 "view_name": "FLOOR PLAN",169 "scale_text": "1/4\" = 1'-0\"",170 "pixels_per_foot": 62.5,171 "calibration_method": "graphic_bar",172 "zone_bbox": [120, 80, 2800, 3200],173 "confidence": "high"174}175```176177**Step 4 — Known-Dimension Calibration Fallback:**178179When neither graphic scale bar nor text scale is found (rare but possible on details, sections, or scanned documents):1801. Find the longest dimension string on the sheet (e.g., "132'-8\"" for an overall building dimension)1812. Measure its dimension line in pixels (endpoint to endpoint)1823. Calculate: `pixels_per_foot = pixel_length / dimension_feet`1834. Mark calibration as `"method": "known_dimension"`, `"confidence": "low"`1845. Cross-check: if ANY other dimension on the sheet can be measured and verified against this calibration, upgrade confidence to "medium"185186**Step 5 — Double Calibration (Stretch Detection):**187188Scanned documents and some PDF exports may have different horizontal and vertical scaling (stretched/skewed). After establishing scale:1891. Find a horizontal dimension and calculate `h_pixels_per_foot`1902. Find a vertical dimension and calculate `v_pixels_per_foot`1913. If they differ by more than 3%: the image is stretched1924. Record both values and set `"stretch_detected": true`1935. All subsequent area calculations must use the geometric mean: `pixels_per_foot = sqrt(h * v)`194195**Scale Data Storage — REQUIRED:**196197Every plan sheet must have scale data recorded in `plans-spatial.json` under `scale_calibration` with per-sheet and per-view scale information:198199```json200"scale_calibration": {201 "sheets": {202 "A-101": {203 "sheet_name": "FLOOR PLAN",204 "calibration_method": "graphic_bar",205 "graphic_bar": {206 "pixel_length": 250,207 "real_world_feet": 16,208 "tick_count": 5,209 "location": [2400, 3600]210 },211 "text_scale": "1/4\" = 1'-0\"",212 "pixels_per_foot": {213 "horizontal": 62.5,214 "vertical": 62.3,215 "mean": 62.4216 },217 "stretch_detected": false,218 "zones": [219 {220 "view_name": "FLOOR PLAN",221 "scale_text": "1/4\" = 1'-0\"",222 "pixels_per_foot": 62.4,223 "zone_bbox": [120, 80, 2800, 3200],224 "confidence": "high"225 },226 {227 "view_name": "ENLARGED RESTROOM PLAN",228 "scale_text": "1/2\" = 1'-0\"",229 "pixels_per_foot": 124.8,230 "zone_bbox": [2850, 80, 3600, 1200],231 "confidence": "high"232 }233 ],234 "confidence": "high",235 "calibration_date": "2026-02-20"236 }237 }238}239```240241**If scale calibration fails for a sheet** (no graphic bar, no text scale, no readable dimensions):242- Record `"calibration_method": "none"`, `"scale_status": "uncalibrated"`, `"confidence": "failed"`243- Flag the sheet for Phase 4 remediation (re-attempt with different method or manual review)244- **Continue extraction** — text-based data (room names, door marks, notes, equipment tags, general notes) can still be extracted without scale245- Pixel-based measurements on uncalibrated sheets should be marked with `"confidence": "low"` and `"uncalibrated": true`246247Uncalibrated sheets reduce the extraction depth score but do not block the pipeline. They are queued for targeted remediation in Phase 4.248249#### Pass 4B: Dimension String Chaining and Verification250251After scale calibration, extract and chain dimension strings. Dimension chains are the primary cross-check for measurement accuracy.252253**What is a dimension chain?**254On construction drawings, dimensions are arranged in "strings" — a series of sub-dimensions along a common line that sum to an overall dimension. For example, column grid spacing (31'-4" + 29'-0" + 29'-0" + 29'-0" + 14'-4" = 132'-8"). If the sub-dimensions don't sum to the overall, there's either an extraction error or a drawing error worth flagging.255256**Claude Vision extraction method:**2571. For each dimension string visible on the sheet, read ALL individual dimension values along the line2582. Identify the overall dimension (the one spanning the entire string, usually offset further from the drawing)2593. Sum the sub-dimensions and compare to the overall:260 - Match within ±1": chain verified ✓261 - Discrepancy > 1": flag for review — may indicate OCR misread or drawing error2624. Tag each dimension with its orientation (horizontal/vertical/angled)2635. Where possible, note what elements the dimension connects (e.g., "Grid 1 to Grid 2")264265**Store dimension chains in `plans-spatial.json` under `dimensions.chains`:**266```json267{268 "chain_id": "DIM-CHAIN-001",269 "sheet": "A-100",270 "orientation": "horizontal",271 "overall_value": "132'-8\"",272 "overall_numeric_ft": 132.67,273 "segments": [274 {"value": "31'-4\"", "numeric_ft": 31.33, "from_element": "Grid 1", "to_element": "Grid 2"},275 {"value": "29'-0\"", "numeric_ft": 29.0, "from_element": "Grid 2", "to_element": "Grid 3"}276 ],277 "segments_sum_ft": 132.67,278 "sum_matches_overall": true,279 "discrepancy_ft": 0280}281```282283Dimensions NOT part of any chain go into `dimensions.isolated`.284285#### Pass 4C: Elevation Marker and Spot Elevation Extraction286287**Elevation markers** appear on building sections, wall sections, and elevation views. They provide critical vertical measurement data.288289**What to look for:**290- **Level markers**: Horizontal lines with text like "T.O. WALL 12'-0\"", "FFE 0'-0\"", "T.O. FOOTING -4'-0\""291- **Relative elevations**: Dimensions prefixed with +/- relative to FFE (Finished Floor Elevation)292- **Absolute elevations**: Text like "EL. 856'-6\"" referencing MSL (Mean Sea Level) datum293294**Spot elevations** appear on civil/site plans as standalone numbers (e.g., "856.50") with an X or + marker:295- **Existing spot elevations**: Typically shown with parentheses or dashed text "(856.50)"296- **Proposed spot elevations**: Typically bold or standard text "856.50"297- **FFE**: Finished Floor Elevation, often boxed or highlighted298- **Top of curb (TC)**: Labeled "TC" or "T/C"299300**Store elevation markers** in `plans-spatial.json` under `elevation_markers`:301```json302{303 "sheet": "A-300",304 "label": "T.O. WALL",305 "elevation": "12'-0\"",306 "elevation_ft": 12.0,307 "datum": "FFE = 0'-0\"",308 "marker_type": "level"309}310```311312**Store spot elevations** in `plans-spatial.json` under `site_grading.spot_elevations`:313```json314{315 "sheet": "C-103",316 "elevation_ft": 856.50,317 "type": "proposed",318 "label": "856.50'"319}320```321322#### Pass 4D: Cross-Sheet Reference Extraction323324Cross-sheet references are the connective tissue of a plan set. Every section cut, detail callout, elevation marker, and schedule reference on one sheet points to a view on another sheet. Building this index is what enables assembly chains and multi-page calculations.325326**What to extract:**3273281. **Section Cut Markers** — Circle with number/letter + arrow indicating viewing direction. Format: `number / sheet_number` (e.g., "3/A-301" means "Section 3 is on sheet A-301").329 - Record: source sheet, marker location (grid reference), target sheet, section number, viewing direction3303312. **Detail Callouts** — Circle or diamond with `detail_number / sheet_number`. Points to an enlarged detail view.332 - Record: source sheet, marker location, target sheet, detail number, what's being detailed (wall, footing, connection, etc.)3333343. **Elevation Markers** — Circle with number/letter, NO arrow (unlike section cuts). References an exterior or interior elevation view.335 - Record: source sheet, target sheet, elevation number3363374. **Enlarged Plan References** — Dashed rectangle on the main plan with label pointing to a larger-scale view on another sheet.338 - Record: source sheet, target sheet, boundary on source (approximate grid bounds)3393405. **Schedule References** — Door marks (D101), window marks (W-3), room numbers, equipment tags that cross-reference to schedule sheets.341 - Record: mark/tag, plan sheet where it appears, schedule sheet it references3423436. **Spec Section References** — Text like "SEE SECTION 03 30 00" or "PER SPEC 09 65 00" on drawings.344 - Record: source sheet, spec section number, context345346**Store in `plans-spatial.json` under `sheet_cross_references`:**347```json348{349 "detail_callouts": [350 {351 "id": "XREF-001",352 "source_sheet": "A-100",353 "source_location": {"grid": "C-3", "zone": "plan_area"},354 "target_sheet": "A-501",355 "target_detail": "3",356 "callout_type": "section",357 "description": "Building section at Grid 3",358 "linked_elements": ["grid_3", "wall_type_2A"]359 }360 ]361}362```363364**IMPORTANT**: Cross-reference extraction should happen on EVERY sheet, not just architectural. Structural sheets reference details, MEP sheets reference riser diagrams, civil sheets reference profile views. Build the index incrementally — each processed sheet adds its references to the master index.365366**After processing all sheets in a document**, verify the index:367- Every target sheet referenced should exist in the drawing index368- Flag "orphan references" — callouts pointing to sheets not in the set (may indicate missing sheets)369- Flag "unreferenced sheets" — sheets in the index that no other sheet points to (may be standalone or may be missing callouts)370371#### Pass 4E: Contour Line and Grading Extraction (Civil/Site Sheets)372373**This pass applies ONLY to civil/site plan sheets** (C-series sheets, grading plans, site plans with contour lines). Skip for architectural, structural, MEP, and other disciplines.374375Contour lines represent terrain elevations. The difference between existing and proposed contours at any point equals the cut or fill depth — critical for earthwork volume estimation.376377**What to extract:**3783791. **Contour Elevation Labels** — 3-4 digit numbers (e.g., 856, 857, 858) placed along curved lines. These are the elevation values for each contour.3803812. **Existing Contours** (current terrain):382 - **Dashed lines** with elevation labels383 - Represent the ground as it exists before construction384 - Sometimes shown lighter or in a different color3853863. **Proposed Contours** (design terrain):387 - **Solid lines** with elevation labels388 - Represent the finished grade after construction389 - Usually shown heavier/darker than existing3903914. **Index Contours** — Every 5th or 10th contour is drawn thicker. Labels are always shown on index contours. Use index contour spacing to determine the contour interval (typically 1', 2', or 5').3923935. **Drainage Patterns** — Water flows perpendicular to contours, from high elevation to low. V-shaped contour patterns pointing uphill indicate valleys/swales (drainage paths). Contours bowing away from buildings should confirm positive drainage.3943956. **Cut/Fill Zones** — Where proposed contours are LOWER than existing = CUT (excavation). Where proposed contours are HIGHER than existing = FILL (import/compaction). Document the general cut/fill pattern for the site.396397**Store in `plans-spatial.json` under `site_grading`:**398```json399{400 "contours": {401 "existing": [{"elevation_ft": 856.0, "line_style": "dashed", "sheet": "C-103"}],402 "proposed": [{"elevation_ft": 856.0, "line_style": "solid", "sheet": "C-103"}],403 "contour_interval_ft": 1.0404 },405 "cut_fill_volumes": {406 "net_operation": "cut",407 "avg_cut_depth_ft": 3.5,408 "max_cut_depth_ft": 6.0,409 "confidence": "low",410 "note": "Rough estimate — verify with earthwork quantity takeoff"411 },412 "drainage_patterns": [413 {"direction": "southeast", "high_elevation": 862, "low_elevation": 854, "fall_ft": 8}414 ]415}416```417418**Cross-check with SWPPP**: The contour/grading data should be consistent with SWPPP disturbed area and cut/fill volumes. Flag if the grading plan shows significantly different earthwork than the SWPPP.419420#### Pass 4F: Building Section and Wall Section Extraction (Section/Detail Sheets)421422**This pass applies to architectural section sheets** (A-300 series), structural sections (S-300 series), wall section details (A-400/A-500 series), and any sheet containing building or wall section cuts. Skip for plan views, site plans, MEP plans, and reflected ceiling plans.423424Building sections and wall sections are the primary source of vertical dimensioning, assembly composition, and structural depth data that cannot be obtained from plan views.425426**What to extract:**427428**1. Building Sections (full-height cross-sections through the building):**429430- **Floor-to-floor height**: Distance from finished floor (FFE) to the next level or roof structure. For single-story buildings, this is the floor-to-roof structure distance.431- **Foundation depth**: Distance from finished grade to bottom of footing. Includes footing thickness, stem wall height, and any grade beam depth.432- **Ridge height**: Top of roof ridge above finished floor.433- **Eave/parapet height**: Top of exterior wall above finished floor.434- **Roof slope**: Read from slope triangle symbols (e.g., 4:12, 1/4":12") or calculate from rise/run dimensions.435- **Ceiling height**: Distance from FFE to bottom of ceiling system (ACT grid, GWB, exposed structure).436- **Structural depth**: Depth of roof joists, trusses, purlins, or beams visible in section.437- **SOG thickness**: Slab-on-grade thickness from section detail.438- **Cut location**: Which grid line and direction the section is cut through (from section marker on plan).439440**2. Wall Sections (enlarged vertical cuts through wall assemblies):**441442- **Wall type identifier**: Match to wall type legend (Type 1, Type 2, etc.) or wall schedule.443- **Total wall thickness**: Overall dimension from face to face.444- **Layer-by-layer assembly** (from exterior to interior):445 - Material name (e.g., "5/8\" Type X GWB", "3-5/8\" metal stud", "R-13 batt insulation")446 - Thickness of each layer447 - Position classification: exterior_finish, sheathing, air_barrier, insulation, stud_cavity, interior_finish448- **Fire rating**: If noted on section (e.g., "1-HR FIRE PARTITION")449- **Head/sill/jamb details**: Conditions at top of wall, window sill, and door jamb if shown450- **Base condition**: How wall meets floor (reveals, base trim, sealant joints)451- **Top condition**: How wall meets structure above (deflection track, fire safing, sealant)452453**3. Section Identification:**454455- **Section mark/number**: The label that identifies this section (e.g., "1/A-300")456- **Cut line reference**: Which sheet and location the section is cut from457- **Scale**: Section scale (typically 3/4"=1'-0" for building sections, 1-1/2"=1'-0" or 3"=1'-0" for wall sections)458- **Title**: Section title as shown below the drawing459460**Store in `plans-spatial.json` under `sections`:**461```json462{463 "sections": {464 "building": [465 {466 "section_id": "SECT-A300-1",467 "sheet": "A-300",468 "section_mark": "1",469 "cut_line_on_sheet": "A-100",470 "cut_location": "Grid line 3, looking east",471 "scale": "3/4\" = 1'-0\"",472 "title": "Building Section - East/West",473 "floor_to_floor_ft": 14.5,474 "foundation_depth_ft": 4.0,475 "footing_thickness_in": 12,476 "stem_wall_height_ft": 2.0,477 "ridge_height_ft": 22.5,478 "eave_height_ft": 14.0,479 "parapet_height_ft": 0,480 "roof_slope": "4:12",481 "roof_slope_degrees": 18.43,482 "ceiling_height_ft": 10.0,483 "ceiling_type": "ACT",484 "structural_depth_in": 24,485 "structural_member": "PEMB rafter",486 "sog_thickness_in": 5,487 "measurements": [488 {"label": "FFE to T.O. Steel", "value_ft": 14.5, "confidence": "high"}489 ]490 }491 ],492 "wall": [493 {494 "section_id": "WSECT-A302-1",495 "sheet": "A-302",496 "section_mark": "1",497 "wall_type": "Type 4",498 "fire_rating": "1-HR",499 "total_thickness_in": 5.25,500 "layers": [501 {"material": "5/8\" Type X GWB", "thickness_in": 0.625, "position": "interior_finish"},502 {"material": "3-5/8\" 20ga metal stud @ 16\" OC", "thickness_in": 3.625, "position": "stud_cavity"},503 {"material": "R-13 batt insulation", "thickness_in": 3.5, "position": "insulation"},504 {"material": "5/8\" Type X GWB", "thickness_in": 0.625, "position": "interior_finish"}505 ],506 "base_condition": "Vinyl base on GWB, sealant at floor line",507 "top_condition": "Deflection track, fire safing above ceiling",508 "head_detail": null,509 "sill_detail": null,510 "measurements": [511 {"label": "Total assembly", "value_in": 5.25, "confidence": "high"}512 ]513 }514 ]515 }516}517```518519**Cross-checks after section extraction:**520- **Wall types vs plan annotations**: Every wall type referenced on floor plans should have a corresponding wall section. Flag missing sections.521- **Ceiling heights vs RCP**: Section ceiling heights should match reflected ceiling plan height zones. Flag discrepancies > 2".522- **Foundation depth vs geotech**: Foundation embedment from sections should meet geotech minimum (e.g., 24" below grade for frost). Flag if shallower.523- **Roof slope vs structural**: Section roof slope should match structural framing slope. Flag if different.524- **Fire ratings vs plan partitions**: Wall section fire ratings should match fire-rated partition callouts on plans.525526#### Pass 4G: Reflected Ceiling Plan (RCP) and MEP System Extraction527528**This pass applies to RCP sheets** (A-102, A-5xx series, sheets titled "Reflected Ceiling Plan") **and MEP plan sheets** (M-series mechanical, P-series plumbing, E-series electrical). Skip for site plans, structural framing plans, and architectural floor plans (unless they contain MEP overlay data).529530RCPs and MEP plans are the primary source for overhead-plane data (ceiling heights, fixture placement, HVAC devices) and system-level data (pipe sizes, duct sizes, panel schedules, equipment tags) that cannot be obtained from architectural floor plans or sections.531532**What to extract:**533534**1. Reflected Ceiling Plan Data:**535536- **Ceiling type per room/zone**: ACT (acoustic ceiling tile), GWB (gypsum board), exposed structure, specialty (wood slat, metal panel, etc.)537- **Ceiling grid module**: 2'×2' or 2'×4' for ACT ceilings538- **Ceiling tile product**: Manufacturer and model from legend or notes (e.g., Armstrong Fine Fissured 1761)539- **Ceiling height zones**: Group rooms by ceiling height. Read height callouts (e.g., "9'-0\" AFF", "CLG @ 10'-0\"")540- **Height transitions**: Where ceiling height changes within or between rooms — soffits, bulkheads, stepped ceilings541- **Lighting fixture positions**: Symbol type + tag (e.g., 2×4 recessed troffer "A", 6" downlight "C") with room locations542- **HVAC devices on ceiling**: Supply diffusers, return grilles, exhaust grilles — tag and room543- **Sprinkler heads**: Approximate count per room (reference only — FP drawings govern)544- **Access panels**: Locations for above-ceiling MEP access545546**Store in `plans-spatial.json` under `ceiling_data`:**547```json548{549 "ceiling_data": {550 "source_sheet": "A-102",551 "grid_type": "2x2",552 "grid_module": "24\" x 24\"",553 "tile_product": "Armstrong Fine Fissured Second Look 1761",554 "height_zones": [555 {"rooms": ["101", "102", "103"], "ceiling_height_ft": 9.0, "ceiling_type": "ACT"},556 {"rooms": ["104"], "ceiling_height_ft": 10.0, "ceiling_type": "GWB"}557 ],558 "fixture_positions": [559 {"tag": "A", "type": "2x4 recessed troffer", "rooms": ["101", "102"], "count": 12},560 {"tag": "C", "type": "6\" LED downlight", "rooms": ["103", "104"], "count": 8}561 ],562 "soffits_bulkheads": [563 {"room": "101", "description": "Soffit at perimeter, 8'-0\" AFF, 18\" wide"}564 ]565 }566}567```568569**2. MEP System Data (Mechanical, Plumbing, Electrical):**570571**Mechanical (M-series):**572- **Equipment tags and locations**: RTU, AHU, EF, VRF, ERV — tag, grid/room position, capacity (tons, CFM, MBH)573- **Duct sizes**: Supply, return, exhaust — read duct size labels (e.g., "12×8", "10\" RD") with system type574- **Diffuser/grille tags**: Cross-reference to RCP positions and mechanical schedule575- **Ductwork routing**: Major trunk runs with sizes, branches to rooms576577**Plumbing (P-series):**578- **Pipe sizes**: Domestic cold/hot, sanitary, storm, gas, medical — read size labels (e.g., "2\" CW", "4\" SAN")579- **Pipe material**: As noted (copper, CPVC, PVC, cast iron, SS)580- **Fixture connections**: Which fixtures connect to which pipe runs581- **Equipment**: Water heaters, pumps, grease traps, backflow preventers — tag and location582583**Electrical (E-series):**584- **Panel schedules**: Panel name, voltage, phase, main breaker, circuit list with loads585- **Single-line diagram data**: Service entrance size, transformer, main distribution, sub-panels586- **Circuit assignments**: Which circuits serve which rooms/equipment587- **Receptacle and device counts**: Per room counts of receptacles, switches, special outlets (GFCI, dedicated)588- **Equipment connections**: HVAC equipment electrical requirements (voltage, phase, MCA, MOCP)589590**Store in `plans-spatial.json` under `mep_systems`:**591```json592{593 "mep_systems": {594 "electrical": {595 "source_sheets": ["E-100", "E-101", "E-200"],596 "panel_schedules": [597 {598 "panel": "LP-1",599 "location": "Electrical Room 110",600 "voltage": "208/120V",601 "phase": "3-phase",602 "main_breaker": "225A",603 "circuits": [604 {"circuit": 1, "description": "Lighting - Rooms 101-103", "breaker": "20A", "load_va": 1800}605 ]606 }607 ],608 "single_line_data": {609 "service_size": "400A",610 "voltage": "208/120V 3-phase",611 "transformer": "75 KVA"612 },613 "circuit_assignments": [614 {"room": "101", "circuits": [1, 3, 5], "description": "Lighting + receptacles"}615 ]616 },617 "pipe_sizes": [618 {"system": "domestic_cold", "size": "2\"", "material": "copper", "sheet": "P-100", "run_segments": []}619 ],620 "duct_sizes": [621 {"size": "12x8", "type": "supply", "sheet": "M-100", "run_segments": []}622 ],623 "equipment": [624 {625 "tag": "RTU-1",626 "type": "rooftop_unit",627 "sheet": "M-100",628 "position": {"grid": "C-3", "room": "Roof"},629 "schedule_data": {"cooling_tons": 10, "heating_mbh": 250, "cfm": 4000, "voltage": "208V/3ph"}630 }631 ]632 }633}634```635636**Cross-checks after RCP + MEP extraction:**637- **RCP room numbers vs floor plan**: Every room on RCP must exist in the floor plan room schedule638- **Ceiling heights vs finish schedule**: RCP height zones should match finish schedule ceiling column639- **Fixture counts vs lighting schedule**: Sum of fixture tags on RCP should match schedule quantities640- **Diffuser counts vs mechanical schedule**: Supply/return diffuser count should support required CFM per room641- **Pipe sizes vs plumbing riser diagram**: Pipe sizes on plan should match riser diagram642- **Panel schedule loads vs connected equipment**: Equipment MCA should not exceed circuit breaker rating643- **Equipment tags on plan vs equipment schedules**: Every tag on plan must appear in corresponding schedule644645See `references/plans-deep-extraction.md` (MEP Drawings section and Reflected Ceiling Plan section) for detailed extraction rules, symbol libraries, and cross-reference tables.646647**MEP Extraction Depth Requirements:**648649For EVERY MEP sheet processed, the extraction must achieve the following minimums:650651| Discipline | Minimum Extraction |652|---|---|653| Mechanical | Every equipment tag + cooling tons + heating MBH + CFM + electrical (V/ph/MCA/MOCP) + served rooms |654| Electrical | Every panel schedule with ALL circuits, single-line diagram hierarchy, lighting fixture schedule with types/quantities/wattages |655| Plumbing | Every fixture from schedule with type/mounting/connections/ADA/flow rate, water heater specs, pipe sizes by system |656| Fire Protection | System type (wet/dry/pre-action), riser location, FDC, head schedule (type/temp/K-factor), fire pump if present |657658**Do NOT stop at equipment tags only.** The extraction must capture schedule data (capacity, ratings, electrical requirements) from mechanical/electrical/plumbing schedule sheets (M-300, E-300, P-400 series).659660**Reference**: See `references/mep-deep-extraction.md` for complete field-by-field extraction templates.661662#### Pass 4G-2: MEP Schedule Sheets (M-300, E-300, P-400 Series)663664**This pass is MANDATORY for any project with MEP drawings.** Schedule sheets contain the engineering data that equipment tags on plan sheets reference. Without schedule extraction, you only get tag names — not capacities, ratings, or specifications.665666**Processing order:**6671. **M-300 series** (Mechanical Schedules): Extract EVERY row from HVAC equipment schedules, exhaust fan schedules, diffuser/grille schedules6682. **E-300 series** (Panel Schedules, Lighting Schedules): Extract EVERY panel with ALL circuits, EVERY lighting fixture type with quantities6693. **P-400 series** (Plumbing Schedules): Extract EVERY fixture from plumbing fixture schedule, water heater/boiler schedule6704. **FP sheets** (Fire Protection): Extract system type, riser diagram data, sprinkler head schedule671672**Output depth per discipline** — see `references/mep-deep-extraction.md` for complete field lists.673674**Validation**: After processing, verify:675- Every equipment tag on plan sheets has a matching schedule entry676- Panel schedule connected load ≤ main breaker rating677- Total CFM from diffusers ≤ equipment total CFM678- Every occupied room has lighting fixtures assigned679680#### Pass 4H: Exterior Elevation and Accessibility Extraction681682**This pass applies to exterior elevation sheets** (A-200 series) **and architectural floor plans** with accessibility annotations. Skip for sections, MEP plans, and civil/site sheets (except site accessibility routes).683684Exterior elevations provide the vertical face of the building — material zones, window/door positions, grade line, and overall proportions. Accessibility data is typically annotated on floor plans and site plans as required routes, clearances, and signage.685686**What to extract:**687688**1. Exterior Elevation Data (A-200 series):**689690- **Elevation face**: North, South, East, West (from title or orientation)691- **Material zones**: Each distinct cladding area with material type, color/finish, and approximate coverage area692 - Primary cladding (metal panels, CMU, brick, etc.)693 - Accent materials (stone veneer, brick banding, decorative panels)694 - Foundation/base visible material695 - Trim/fascia material and color696- **Window and door positions**: Mark numbers with their vertical positions on the elevation. Cross-reference to window/door schedules.697- **Grade line elevation**: The finished grade line with elevation value if noted698- **Overall building dimensions**: Height measurements (grade to eave, grade to ridge, floor-to-floor if multi-story)699- **Roof material and slope**: Visible from elevation — material type, color, slope direction700- **Canopy/entry features**: Portico structure, canopy material, entry surround701- **Signage locations**: Where building signage is indicated702703**Store in `plans-spatial.json` under `elevations.exterior`:**704```json705{706 "elevations": {707 "exterior": [708 {709 "face": "South",710 "sheet": "A-200",711 "materials": [712 {"zone": "primary_cladding", "material": "Vertical metal panels", "color": "Champagne tan", "mfg_code": "Nucor 12-45"},713 {"zone": "base", "material": "Split-face CMU", "color": "Warm gray", "height_ft": 4.0},714 {"zone": "trim", "material": "Aluminum", "color": "Dark bronze anodized"}715 ],716 "grade_line_elevation_ft": 856.0,717 "window_positions": [718 {"mark": "W-101", "sill_height_ft": 3.0, "head_height_ft": 7.0}719 ],720 "door_positions": [721 {"mark": "101", "type": "storefront entry", "width_ft": 6.0, "height_ft": 7.0}722 ],723 "measurements": [724 {"label": "Grade to eave", "value_ft": 14.0},725 {"label": "Grade to ridge", "value_ft": 22.5}726 ]727 }728 ]729 }730}731```732733**2. Accessibility Data (Floor Plans + Site Plans):**734735- **Accessible routes**: Paths of travel from parking/entrance to all public spaces. Note route width (min 36" clear, 44" in corridors) and any obstructions.736- **ADA restroom clearances**: 60" turning radius, 18" centerline to side wall at WC, lavatory clearance (min 30"×48" clear floor space), grab bar locations (42" side, 36" rear).737- **Door clearances**: Maneuvering clearances at accessible doors (pull side: 18" beside latch, push side: 12"). Door hardware type (lever vs knob — lever required for accessible).738- **Ramp data**: Slope (max 1:12 = 8.33%), width (min 36"), landing size (60"×60" at top/bottom/turns), handrail heights (34"-38").739- **Signage locations**: Tactile/Braille signage at room doors, exit signs, directional signs. Mounting height (48"-60" AFF, latch side).740- **Parking accessibility**: Accessible stalls (8' wide + 5' access aisle), van access741742…(truncated)