Cross-discipline design-contradiction checker for construction drawing sets. Standalone tool broken out from Iron_Bid; a pipeline stage may later fold back into Iron_Bid. Pipeline: PDF->images -> per-sheet assertion extraction -> deterministic clustering by location -> per-cluster reasoning -> report. Includes CLI (cli/run_check.py) and web UI (backend/main.py). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 line
20 KiB
JSON
1 line
20 KiB
JSON
{"normalized_assertions": [{"assertion_id": "G31.04#9", "original_value": "250", "normalized_value": "250", "normalized_unit": "grams/liter", "normalized_attribute": "VOC_content", "normalization_notes": "Unit 'grams/liter' inferred from context.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#10", "original_value": "90", "normalized_value": "90", "normalized_unit": "minutes", "normalized_attribute": "fire_rating", "normalization_notes": "Assumed 'minutes' as unit for fire rating.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G31.04#11", "original_value": "1-hour", "normalized_value": "60", "normalized_unit": "minutes", "normalized_attribute": "fire_rating", "normalization_notes": "Converted '1-hour' to 60 minutes.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#12", "original_value": "18", "normalized_value": "18", "normalized_unit": "gauge", "normalized_attribute": "face_sheet_thickness", "normalization_notes": "Assumed 'gauge' as unit for thickness.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G31.04#13", "original_value": "7", "normalized_value": "7", "normalized_unit": "gauge", "normalized_attribute": "hinge_reinforcement_thickness", "normalization_notes": "Assumed 'gauge' as unit for thickness.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G31.04#14", "original_value": "16", "normalized_value": "16", "normalized_unit": "gauge", "normalized_attribute": "lock_reinforcement_thickness", "normalization_notes": "Assumed 'gauge' as unit for thickness.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G31.04#15", "original_value": "14", "normalized_value": "14", "normalized_unit": "gauge", "normalized_attribute": "closer_reinforcement_thickness", "normalization_notes": "Assumed 'gauge' as unit for thickness.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G31.04#16", "original_value": "1-3/4", "normalized_value": "1.75", "normalized_unit": "inches", "normalized_attribute": "door_thickness", "normalization_notes": "Converted '1-3/4' to 1.75 inches.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#17", "original_value": "1/8 inch at head and each jamb.", "normalized_value": "1/8 inch", "normalized_unit": "inches", "normalized_attribute": "clearance", "normalization_notes": "Extracted '1/8 inch' from the value.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#18", "original_value": "3/8", "normalized_value": "3/8", "normalized_unit": "inches", "normalized_attribute": "undercut", "normalization_notes": "Assumed 'inches' as unit for undercut.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G31.05#0", "original_value": "16", "normalized_value": "16", "normalized_unit": "inches", "normalized_attribute": "stud_spacing", "normalization_notes": "Assumed 'inches' as unit for spacing.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G31.05#1", "original_value": "Required for framed openings, wall-mounted cabinets, plumbing fixtures, wall mounted door hardware.", "normalized_value": "Required for framed openings, wall-mounted cabinets, plumbing fixtures, wall mounted door hardware.", "normalized_unit": null, "normalized_attribute": "blocking_requirement", "normalization_notes": "No unit or attribute change needed.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.05#2", "original_value": "Not more than 30 feet apart", "normalized_value": "30", "normalized_unit": "feet", "normalized_attribute": "control_joint_spacing", "normalization_notes": "Extracted '30 feet' from the value.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.05#3", "original_value": "4", "normalized_value": "4", "normalized_unit": "level", "normalized_attribute": "finish_level", "normalization_notes": "Assumed 'level' as unit for finish level.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G31.05#4", "original_value": "2", "normalized_value": "2", "normalized_unit": "level", "normalized_attribute": "finish_level", "normalization_notes": "Assumed 'level' as unit for finish level.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G31.05#5", "original_value": "1", "normalized_value": "1", "normalized_unit": "level", "normalized_attribute": "finish_level", "normalization_notes": "Assumed 'level' as unit for finish level.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G31.05#6", "original_value": "1/8 in 10 ft", "normalized_value": "1/8 inch in 10 feet", "normalized_unit": "inch/feet", "normalized_attribute": "tolerance", "normalization_notes": "Normalized 'in' to 'inch' and 'ft' to 'feet'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.05#7", "original_value": "5/8 inch thick", "normalized_value": "5/8", "normalized_unit": "inches", "normalized_attribute": "wall_type", "normalization_notes": "Extracted '5/8' and assumed 'inches' as unit.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G31.05#8", "original_value": "5/8", "normalized_value": "5/8", "normalized_unit": "inches", "normalized_attribute": "material_thickness", "normalization_notes": "Assumed 'inches' as unit for thickness.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G31.05#9", "original_value": "5/8", "normalized_value": "5/8", "normalized_unit": "inches", "normalized_attribute": "material_thickness", "normalization_notes": "Assumed 'inches' as unit for thickness.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G31.05#10", "original_value": "min 0.6 SCOF", "normalized_value": "0.6", "normalized_unit": "SCOF", "normalized_attribute": "slip_resistance", "normalization_notes": "Extracted '0.6' and kept 'SCOF' as unit.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.05#11", "original_value": "min 0.42 SCOF", "normalized_value": "0.42", "normalized_unit": "SCOF", "normalized_attribute": "slip_resistance", "normalization_notes": "Extracted '0.42' and kept 'SCOF' as unit.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.05#12", "original_value": "1/2", "normalized_value": "1/2", "normalized_unit": "inches", "normalized_attribute": "material_thickness", "normalization_notes": "Assumed 'inches' as unit for thickness.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G31.05#13", "original_value": "Polymer-modified sanded grout (ANSI A118.7)", "normalized_value": "Polymer-modified sanded grout (ANSI A118.7)", "normalized_unit": null, "normalized_attribute": "material_type", "normalization_notes": "No unit or attribute change needed.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.05#14", "original_value": "Waterproof membrane for wet areas", "normalized_value": "Waterproof membrane for wet areas", "normalized_unit": null, "normalized_attribute": "material_requirement", "normalization_notes": "No unit or attribute change needed.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.05#15", "original_value": "1/4 in 10 ft", "normalized_value": "1/4 inch in 10 feet", "normalized_unit": "inch/feet", "normalized_attribute": "tolerance", "normalization_notes": "Normalized 'in' to 'inch' and 'ft' to 'feet'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.06#0", "original_value": "1, 2, 3 or 4", "normalized_value": "1, 2, 3, or 4", "normalized_unit": "hours", "normalized_attribute": "wall_rating", "normalization_notes": "Assumed 'hours' as unit for wall rating.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G31.06#1", "original_value": "Channel shaped, fabricated from min 25 MSG corrosion-protected steel", "normalized_value": "Channel shaped, fabricated from min 25 MSG corrosion-protected steel", "normalized_unit": null, "normalized_attribute": "component_material", "normalization_notes": "No unit or attribute change needed.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.06#2", "original_value": "attached to floor and ceiling with fasteners 24 in. OC max", "normalized_value": "24", "normalized_unit": "inches", "normalized_attribute": "component_fastening", "normalization_notes": "Extracted '24' and assumed 'inches' as unit.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G31.06#3", "original_value": "24", "normalized_value": "24", "normalized_unit": "inches", "normalized_attribute": "stud_spacing", "normalization_notes": "Assumed 'inches' as unit for spacing.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G31.06#4", "original_value": "cut 3/8 to 3/4 in. less than assembly height", "normalized_value": "3/8 to 3/4", "normalized_unit": "inches", "normalized_attribute": "stud_length", "normalization_notes": "Extracted '3/8 to 3/4' and assumed 'inches' as unit.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G31.06#5", "original_value": "1-5/8", "normalized_value": "1.625", "normalized_unit": "inches", "normalized_attribute": "stud_depth", "normalization_notes": "Converted '1-5/8' to 1.625 inches.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.06#6", "original_value": "1 layer, 1/2 in. thick", "normalized_value": "1/2", "normalized_unit": "inches", "normalized_attribute": "gypsum_board_layers_thickness", "normalization_notes": "Extracted '1/2' and assumed 'inches' as unit.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G31.06#7", "original_value": "1 layer, 5/8 in. thick", "normalized_value": "5/8", "normalized_unit": "inches", "normalized_attribute": "gypsum_board_layers_thickness", "normalization_notes": "Extracted '5/8' and assumed 'inches' as unit.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G31.06#8", "original_value": "2 layers, 1/2 in. thick", "normalized_value": "1/2", "normalized_unit": "inches", "normalized_attribute": "gypsum_board_layers_thickness", "normalization_notes": "Extracted '1/2' and assumed 'inches' as unit.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "A11.01#0", "original_value": "7022 ELYSON EXCHANGE WAY CYPRESS, TX 77433", "normalized_value": "7022 ELYSON EXCHANGE WAY, CYPRESS, TX 77433", "normalized_unit": null, "normalized_attribute": "project_address", "normalization_notes": "Formatted address with commas for clarity.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A11.01#1", "original_value": "INTERIOR TENANT BUILD OUT AREA OF WORK IN EXISTING BUILDING C", "normalized_value": "INTERIOR TENANT BUILD OUT AREA OF WORK IN EXISTING BUILDING C", "normalized_unit": null, "normalized_attribute": "scope_description", "normalization_notes": "No unit or attribute change needed.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A11.01#2", "original_value": "7016 ELYSON EXCHANGE WAY", "normalized_value": "7016 ELYSON EXCHANGE WAY", "normalized_unit": null, "normalized_attribute": "address", "normalization_notes": "No unit or attribute change needed.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A11.01#3", "original_value": "7022 ELYSON EXCHANGE WAY", "normalized_value": "7022 ELYSON EXCHANGE WAY", "normalized_unit": null, "normalized_attribute": "address", "normalization_notes": "No unit or attribute change needed.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A11.01#4", "original_value": "7046 ELYSON EXCHANGE WAY", "normalized_value": "7046 ELYSON EXCHANGE WAY", "normalized_unit": null, "normalized_attribute": "address", "normalization_notes": "No unit or attribute change needed.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A11.01#5", "original_value": "7040 ELYSON EXCHANGE WAY", "normalized_value": "7040 ELYSON EXCHANGE WAY", "normalized_unit": null, "normalized_attribute": "address", "normalization_notes": "No unit or attribute change needed.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A11.01#6", "original_value": "7034 ELYSON EXCHANGE WAY", "normalized_value": "7034 ELYSON EXCHANGE WAY", "normalized_unit": null, "normalized_attribute": "address", "normalization_notes": "No unit or attribute change needed.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A11.01#7", "original_value": "7052 ELYSON EXCHANGE WAY", "normalized_value": "7052 ELYSON EXCHANGE WAY", "normalized_unit": null, "normalized_attribute": "address", "normalization_notes": "No unit or attribute change needed.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A11.01#8", "original_value": "7058 ELYSON EXCHANGE WAY", "normalized_value": "7058 ELYSON EXCHANGE WAY", "normalized_unit": null, "normalized_attribute": "address", "normalization_notes": "No unit or attribute change needed.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A11.01#9", "original_value": "7064 ELYSON EXCHANGE WAY", "normalized_value": "7064 ELYSON EXCHANGE WAY", "normalized_unit": null, "normalized_attribute": "address", "normalization_notes": "No unit or attribute change needed.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A11.01#10", "original_value": "7028 ELYSON EXCHANGE WAY", "normalized_value": "7028 ELYSON EXCHANGE WAY", "normalized_unit": null, "normalized_attribute": "address", "normalization_notes": "No unit or attribute change needed.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A11.01#11", "original_value": "7070 ELYSON EXCHANGE WAY", "normalized_value": "7070 ELYSON EXCHANGE WAY", "normalized_unit": null, "normalized_attribute": "address", "normalization_notes": "No unit or attribute change needed.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A11.01#12", "original_value": "Not in scope", "normalized_value": "Not in scope", "normalized_unit": null, "normalized_attribute": "scope_status", "normalization_notes": "No unit or attribute change needed.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A11.01#13", "original_value": "30'-0\"", "normalized_value": "30", "normalized_unit": "feet", "normalized_attribute": "overall_dim", "normalization_notes": "Extracted '30' and assumed 'feet' as unit.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A23.01#0", "original_value": "Interior finishes to comply with IBC Class C or higher, Section 803.9 and Table 803.9 of 2021 IBC.", "normalized_value": "Interior finishes to comply with IBC Class C or higher, Section 803.9 and Table 803.9 of 2021 IBC.", "normalized_unit": null, "normalized_attribute": "code_compliance", "normalization_notes": "No unit or attribute change needed.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A23.01#1", "original_value": "All materials for interior finish and trim shall be classified in accordance with ASTM 834.", "normalized_value": "All materials for interior finish and trim shall be classified in accordance with ASTM 834.", "normalized_unit": null, "normalized_attribute": "material_standard", "normalization_notes": "No unit or attribute change needed.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A23.01#2", "original_value": "Wall tile and tile base in restrooms with GWB walls shall be thin set with adhesive in accordance with ANSI A-108.5.", "normalized_value": "Wall tile and tile base in restrooms with GWB walls shall be thin set with adhesive in accordance with ANSI A-108.5.", "normalized_unit": null, "normalized_attribute": "installation_standard", "normalization_notes": "No unit or attribute change needed.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A23.01#3", "original_value": "All partitions must be fire stopped at the ceiling.", "normalized_value": "All partitions must be fire stopped at the ceiling.", "normalized_unit": null, "normalized_attribute": "fire_stopping", "normalization_notes": "No unit or attribute change needed.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A23.01#4", "original_value": "All locations of core drilling of the floor slab for installation of utilities to be coordinated with Landlord's structural engineer.", "normalized_value": "All locations of core drilling of the floor slab for installation of utilities to be coordinated with Landlord's structural engineer.", "normalized_unit": null, "normalized_attribute": "penetration", "normalization_notes": "No unit or attribute change needed.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A23.01#5", "original_value": "Polished concrete floor PC-1 throughout, U.N.O.", "normalized_value": "Polished concrete floor PC-1 throughout, U.N.O.", "normalized_unit": null, "normalized_attribute": "General Finish", "normalization_notes": "No unit or attribute change needed.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A23.01#6", "original_value": "Walls to be painted P-1 throughout.", "normalized_value": "Walls to be painted P-1 throughout.", "normalized_unit": null, "normalized_attribute": "General Finish", "normalization_notes": "No unit or attribute change needed.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A23.01#7", "original_value": "Vinyl base WB-1 throughout, U.N.O.", "normalized_value": "Vinyl base WB-1 throughout, U.N.O.", "normalized_unit": null, "normalized_attribute": "General Finish", "normalization_notes": "No unit or attribute change needed.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A23.01#8", "original_value": "Ceiling throughout entire space to be AT-1 acoustic ceiling tile with C4-A ceiling grid.", "normalized_value": "Ceiling throughout entire space to be AT-1 acoustic ceiling tile with C4-A ceiling grid.", "normalized_unit": null, "normalized_attribute": "General Ceiling", "normalization_notes": "No unit or attribute change needed.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A23.01#9", "original_value": "Armstrong DUNE #1774, 24\" X 24\" X 5/8\", White, Angled Tegular 15/16\"", "normalized_value": "Armstrong DUNE #1774, 24\" X 24\" X 5/8\", White, Angled Tegular 15/16\"", "normalized_unit": null, "normalized_attribute": "acoustic_ceiling_tile", "normalization_notes": "No unit or attribute change needed.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A23.01#10", "original_value": "Armstrong ULTIMA 1910, PRELUDE XL 15/16\" EXPOSED TEE IN WHITE, 15/16\" SQUARE LAY IN", "normalized_value": "Armstrong ULTIMA 191:0, PRELUDE XL 15/16\" EXPOSED TEE IN WHITE, 15/16\" SQUARE LAY IN", "normalized_unit": null, "normalized_attribute": "ceiling_grid", "normalization_notes": "Corrected product number from 1910 to 191:0 for formatting consistency.", "source_text_preserved": true, "normalization_confidence": "medium"}]} |