From 1d248a88082a736183a0e7e475021e3cb3249d31 Mon Sep 17 00:00:00 2001 From: woogi Date: Fri, 3 Jul 2026 00:22:02 +0000 Subject: [PATCH] Initial commit: Conflict Checker 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 --- .gitignore | 20 + ...uction Intelligence Extraction Engine.docx | Bin 0 -> 16764 bytes ...lligence Object Normalization Engine.docx | Bin 0 -> 14103 bytes README.md | 77 + backend/.env.example | 30 + ...c0518ecc59111fe6a62718717a87ebafaec13.json | 1 + ...a2baa3d31f05d6f5fb18b3e24f744ff79d5ed.json | 1 + ...e952db1c8a5ea7db4a98319a6fb39b52fee07.json | 1 + ...ebd99621821fa732daa8e007d4c469440c772.json | 1 + ...1e69acea448077564c44501785f1e5426f1b3.json | 1 + ...456f01268708285d4a1315cec9b99ed484154.json | 1 + ...fc13d87dea0156c5a84818b1612a648638400.json | 1 + ...ec627270f1761814cd6c91e262a7f4926cf04.json | 1 + ...6e64471e780e8f51bd0a4cc040d16b5a3b0b5.json | 1 + ...2f2529ea774e89eb6eb2571bf1d926ed53fec.json | 1 + ...494745b9753736ce6fa96d6bcc27339daa6b5.json | 1 + ...024f3f8e3d02c729544aa0d5e87ecd70026f0.json | 1 + ...ef136ac420654963d685fa16fd55e1ff83435.json | 1 + ...76449503cf8b441333caca1195a2b275eee26.json | 1 + ...19b2b9c3b08d3ab81bd468ae3fb2254878ae2.json | 1 + ...10b90fe9572651883b0e7d22bc668698469f5.json | 1 + ...f16d8ac36fafb68ffb832335e8332eb5f0027.json | 1 + ...4c73dc80db88d84c449a10b759dcf7942160c.json | 1 + ...49910b588df73b5cd94e843e112bfbd8868f6.json | 1 + ...17f81651b1399b0f1c8ebd002f7a39c32aa53.json | 1 + ...6761bb5eb7af55d1fbcedca9137db5c66ca0d.json | 1 + ...79c61bf9ab2a6dbf4afcc69a6a001c4a521a4.json | 1 + ...7405f0e9648f0656544adae30703b9a36e9ce.json | 1 + ...ac242901707843115216ee61ac38d46660b2e.json | 1 + ...d3ac5accf91387d3976dbeb2e91f2a72ccfbb.json | 1 + ...a13495d9491aed527b6fea2ef8c2c777e1948.json | 1 + ...7b6b27f72adceee0578546fe6ef8e0a1b5652.json | 1 + ...7cdac4dc6bda7c454d33f29d16263d6a71f3c.json | 1 + ...cb4dc5002cc0e2f98bb0c93a13bfb95f16813.json | 1 + ...9be49fb42ae49d098238dbb6297580b416cdd.json | 1 + ...e55fc1feb1355c136c6478fd3b36fd91bc53a.json | 1 + ...10c1f7d7320521dffc5f32bd5bda41bff8f60.json | 1 + ...2f7318f409186c1afe5446667d50bf4a48971.json | 1 + ...a6ce174f5fab1704934d80f15a4ab28256543.json | 1 + ...97bc612dd8555e9f3e1563cd975f38c206d70.json | 1 + ...7115fb87041448ab46ac600c2b66f662f4cd5.json | 1 + ...e958a5e4340e3dc0f2e9ed7e650940ebf6f30.json | 1 + ...17e431331697c600b684535b8886567788326.json | 1 + ...ca406d3f6def38f81306a70af5a6cc1338f66.json | 1 + ...ee4a40dd4caa453f1b84cf5b95e3482265fa1.json | 1 + ...a42ffed994277d607ab2471c1ee4eee57caa8.json | 1 + ...c41ec3b50ad234c9918b9c09a645daf79e477.json | 1 + ...bc38a2766757915d3054d6a9716a1df0fcfd5.json | 1 + ...84c18daa3e3b55bb8d007ce8c43dd06d9a20c.json | 1 + ...e545f7654e71a0251bedd9944583e6542647e.json | 1 + ...2bef3ada41e8d05f3c10863e04b1007871751.json | 1 + ...724f184bfac20005ed0f109e27de2c2132c86.json | 1 + ...404b2b3e07e3fc77bcb0b62fa6cfacca7ddb7.json | 1 + ...de65c57a0215fc52206054cf15bc5d4620cfb.json | 1 + ...b8f534d588066cdf5e8dccdf854ef00828856.json | 1 + ...d7a8fd6eaef87f5021ff71f83a0a1407b01d3.json | 1 + ...c72ff755ddb9616c9028127e21b31c9f2e96c.json | 1 + ...c74c9a29a0ce4dae25ab6fbd398603f725a1b.json | 1 + ...8cbc4e4df71f44755cae27b259d8d0d20bc42.json | 1 + ...cc61662867c9da4204545611a8a1329a821b1.json | 1 + ...7eed5d6bf1958184e43e18b4d9eece48acf13.json | 1 + ...f87aecd05cdadf7742cfb8deb651e05a33d09.json | 1 + ...cea922d55dfc7604e2c60e6dcfcb6035e4812.json | 1 + ...e59fe5af382a1f3bc61e84d39c61363c500b6.json | 1 + ...daaa85aaa2e87937d0a46466a59dec41282b6.json | 1 + ...84c115a813481a7402cbd086c01ae149a2bf6.json | 1 + ...237a9a4366f969540d28d4356c66ceebc8280.json | 1 + ...0c784c08672a1b6d8f7ba849012e960821c1a.json | 1 + ...ef575326230008360f59b202c4045f42daa37.json | 1 + ...8e93cd473e965604151bff54bb163986fa9ac.json | 1 + ...2ddf2ffb78f98375512c617f39256725d15a6.json | 1 + ...655f3266879a74456b4c09aa77ddee3261810.json | 1 + ...02e1f4b6c92c49cdb5951a5e1cb0386145182.json | 1 + ...bed8af875c4c33d1d7893d5b2a2959218fc0c.json | 1 + ...ad0e5bf9ab5a03c1f78fc4871de29af1edec6.json | 1 + ...dec9f591a2cc8de69245cb6e5f08b6dc655a7.json | 1 + ...0deb016daeeae64f46035f7f11e6d6c92e57c.json | 1 + ...0288443379a9d4ea9346a8a261c2b30da7bdd.json | 1 + ...c65473898c20bb1c1e72a9ba985ae1e903a98.json | 1 + ...23f40b6144ebbc4e0dd8273e583d4826c2ba0.json | 1 + ...3d66668c185b9aab1231a8f71420ddf24c1b2.json | 1 + ...2259bf84da17582c822f4e0ae645ddc8a86c3.json | 1 + ...641e1b8d9a3af00760b7e8a82e19d8230847e.json | 1 + ...92d567d699e59c294ba8eb8aede1072c39eb1.json | 1 + ...502578cdf78dce18dfd6e218ba4423f136c01.json | 1 + ...65861b8ce926365211792121f9458e3bff1a6.json | 1 + ...3c0400a7f25f574c7caaeb7ceb0956bc6f6f2.json | 1 + ...6e7d24bac1a8619ce5fa08bfff5a145e38d77.json | 1 + ...b9b5f8eefae97441653ed9ef7448b67aaa80e.json | 1 + ...791d43bff40a48d1348e576220a49b878068c.json | 1 + ...46a6cbbc5030eec6e3960c9a61ee92ee404c7.json | 1 + ...6b0ce486e1582acc2303538b4b446b1ec5344.json | 1 + ...4f5156b443b3d609ffb458eb716f918235634.json | 1 + ...e778958b3fa6475bc60494c8c240d499d78fb.json | 1 + ...e3538526a20c129fca1e41c1b98377389e79f.json | 1 + ...9cf800922604510dc1af4bebb7c1caf8f0c25.json | 1 + ...dcb5c6c7fd8327e89467eb2917411da1a4c85.json | 1 + ...dffaad4ad316fa93c0b983985bdecaea1bbdf.json | 1 + ...3db5566f1cc530e8ce8f57cfcbea99d5b8319.json | 1 + ...838c657705e4bde5fb6cf6eaba4278a6ee872.json | 1 + ...89d5fe616611d4136bee9ffb0cf6ba12e2456.json | 1 + ...81a22611c5708a8d088ec1bc70d748db38cba.json | 1 + ...0aee8574c9cc1d3ccc48d3de0d7deac439229.json | 1 + ...d2414eab1d470119f33a75b61f306e1597faa.json | 1 + ...6e2417c9ccf44f1023fc963724ccd370df294.json | 1 + ...d1d0e05fb08a36a88b00d5c267bee0afe6624.json | 1 + ...8f6582fe606f1304487063fe64523b8c5b1d7.json | 1 + ...505a4c2088ab3abd9dbce2f0cbe84cd265deb.json | 1 + ...5244380bb9fa61cf0fa0b025241c6607d1796.json | 1 + ...3a5902eb902befa2a7e8e30378d6e8048f753.json | 1 + ...d06a7821983291632155705880f8a4a177517.json | 1 + ...8e6ff595e89c907ea1e82f4535f8ee5e2e52e.json | 1 + ...8fb13e2f42cbd136bf506b86fbd63f8d3953a.json | 1 + ...e3d19b049702bc07a50f0d0d1b154257a9a97.json | 1 + ...5d797488bb6535f1a3dbb44209a3585872d94.json | 1 + ...4126e938a68a61af560c152709f244a8febc1.json | 1 + ...e44a071addae947cfb23a54ce3d0e88d2d10d.json | 1 + ...d86ee980f5d6b9f08db95e1fced96607a790a.json | 1 + ...de95b5f8dbd3d0f807a9eefb7620a534af216.json | 1 + ...7aa3d7dd653075c30ffa2d0ca00f7ff85da80.json | 1 + ...f7119cbbe93fad25a00eff37fb4dbf7ab3f47.json | 1 + ...f180d6f07b3beff6b0029dd6136d38416beba.json | 1 + ...6aebc6164a547b3169d6e48725d9944f8912b.json | 1 + ...f3871041fbc21dad113a4430943dd63472e7f.json | 1 + ...402848b6965bb7d5df83097261096b8d152ed.json | 1 + ...81a2525bd980f66cbf3f29cb31f75030bc966.json | 1 + ...dd5913b9cd6392640d2c9f2f4a98a67a78ec1.json | 1 + ...a249cefa844eb40054db10863c9d9b30372b5.json | 1 + ...061b42e0d910a8ffd9e64dd77bed7f6898b0e.json | 1 + ...d21d4bad304343429b01a0bea447078f4b849.json | 1 + ...4c2fc7a51d68b76aadc748451089adc845091.json | 1 + ...cbc6ee09cebd0f773bd29adce1378a3fdb302.json | 1 + ...feec36838bd5831c0f521190276172b08ccc7.json | 1 + ...a6d318a7b927ab36210e493b67ef6a92b7d4d.json | 1 + ...1e6fad4c347d6adf3cc733a02c2005c44ba47.json | 1 + ...138a34816271ed79b30a0fe4aa8fdd02c980a.json | 1 + ...41506813a88f2900fc6e0163c761646d7221d.json | 1 + ...efd2bf16e758943b0f035a9590cb25ce6daf7.json | 1 + ...09025d3f8481c6d70ab3af73d80bee42bd1d4.json | 1 + ...c19088391fae336a1db4b14c4ea7ce92de0c1.json | 1 + ...9cd2c0334b5458b4ad32a223ae820713807a2.json | 1 + ...be0e007c53aea1951dcf37b8bd4166f8f541c.json | 1 + ...ad41b4cc76069244a5fb1376bf25b8e60bd0a.json | 1 + ...228bb087b3d36c0eeea21834e49f141dafb1d.json | 1 + ...9d54f2a7cf9a98cb7242343be0d4ee4785638.json | 1 + ...109a488a00efd281b796f449b57b40e34b4c5.json | 1 + ...76d304fcbde673ec617724c1820c184a66f14.json | 1 + ...2526c4d15fae56d99ce4baf234b1c05caf481.json | 1 + ...4cdbec38081f38ea42c73e691c653ea099b5e.json | 1 + ...6633e67e12e27b5b1bb916546c5d63d266b20.json | 1 + ...89447b53f60c4eb670f2f8ab44c576adbad6a.json | 1 + ...52b98160c944b0da455eba4344f204236bf10.json | 1 + ...560e28a396f055bda307359a5cc3dbdbd74ea.json | 1 + ...40d1ad6c878321acfe18faaa445acfbc340af.json | 1 + ...f976b478206012c267bbd6d8bfb3236e74428.json | 1 + ...e3448cb4648248b1a1a8c9276d899644691c5.json | 1 + ...bafcaf303d31c2402aad6cb1845bb4ac9373d.json | 1 + ...e87c05d15775169093962e56682591d27d960.json | 1 + ...f53bc0c4ff7958238f1dd0947c865f54ed0f3.json | 1 + ...3890da217c8cf089b21fe1f50215feadc964f.json | 1 + ...30dd0916fd2c68db593fbef1ddc938df36dd7.json | 1 + ...0cc89990528dd5e9523c00af6cc8fb9204f56.json | 1 + ...2ba8f06a89441bd01ba6f0ef6e19530a8b744.json | 1 + ...493ecf569f6cc5d5243a2c84c1d7cd08d5e37.json | 1 + ...aa310940252cef5487b8068a78005982106ad.json | 1 + ...7c439e56124c4f7d94dad70ce5b6524fd82e5.json | 1 + ...b98e20d0cb05709055d1e188b8b538765d951.json | 1 + ...930e9bb7df000a0d17a996ce9d1e071b09d72.json | 1 + ...454a1e0ffb0a168982c8f347919d426c50fce.json | 1 + ...b2a7794f23d948952450e10dc4f1d87293f24.json | 1 + ...d3f6431d3318ebe2f8db17bf52caef1278d4f.json | 1 + ...21f321e22b81870db90b6f7953191542d5ae5.json | 1 + ...247437bf78f3d7f8aa034f7321ccdda30e8a6.json | 1 + ...3d0b317e18810bbc2fda05b21f92afbe2bfe1.json | 1 + ...276c344c81f0734997df8b599db5dc719c9e0.json | 1 + ...dee287691d89c064407113ba4731329cd0f97.json | 1 + ...0d0225bbd9957fdc1165b35c02279ddf2ebde.json | 1 + ...970ac4e600d300da5732e5ba18613813d659c.json | 1 + ...326a44a5c244fa1728222c0f5bd68e441ef70.json | 1 + ...ace910eec76f0ac3550a8c1436bfa42c7e57c.json | 1 + ...642dec69690374cb45591cda6a8ff3d4ea050.json | 1 + ...c6934bb1701bcb1d15b21ca5d08935089f95f.json | 1 + ...2ba20771ecce29afc726eec9e07e08d9132fc.json | 1 + ...f278dee49e4bd9c8562c6b86dd8b00907425a.json | 1 + ...c2ba0f9e6296b31537b93ef2744e83d7ab76a.json | 1 + ...5e03159c9e25950eebcab9abb39fe49861d3f.json | 1 + ...fbf5ad38df971b43038ec19f12f0fbc01ccd6.json | 1 + ...4466464ee18152ddcc7a06c013592d8437343.json | 1 + ...fe3d0e282e5ba41874dd10626b9c03bf67389.json | 1 + ...e712c6e9f6e206a732c4280a7580d7f8f6cd7.json | 1 + ...87f91046a5b063ceb70c7283e5f6f117752d4.json | 1 + ...01854966b104f5adc5a6ff4708fc31d09631d.json | 1 + ...39b050c539925467f587ec73769443a1a6eef.json | 1 + ...6cb7bee60645df18228f4e8225620c4c08b99.json | 1 + ...30f097bf9a4eb46db8cfbf015a125201e6811.json | 1 + ...d70cd567b84277b847564f971fb77f2edb2f2.json | 1 + ...9d8c633f2190c988ea8dd0556ec37738a5442.json | 1 + ...95094116506f5d2e9fa573e4cf5b3b83ec479.json | 1 + ...d83aa53c94c6cf9d319148fef24a3e6cefa5b.json | 1 + ...af11771f0bc3eef7ae44fda7ef12b867f91fb.json | 1 + ...b289ceb714365d9537b8df2912833c166ae7b.json | 1 + ...8daaa50a49bcf15badbe940cc58fe09dd53ab.json | 1 + ...69706944fb52cd37254891c169dcca4271c99.json | 1 + ...2546b1b644d9dfbfca30267453d1cfb7e3cc4.json | 1 + ...6ec86b7e2eba3a8f8e818875debaa7db571bd.json | 1 + ...121a107e14ffc424521bd8312624eea1dc1ca.json | 1 + ...3bcf9eb9715f1f3ceba6352603f7973d05a96.json | 1 + ...8e198ed7b5612d1d1fb9dfe86a45e1194fa8f.json | 1 + ...0c319912b74f7dcd329d73195baf0451bcd89.json | 1 + ...b6909ce54e06f340b826de877e70f75aac810.json | 1 + ...143f66f419fafca252e009a97d5177b59f85b.json | 1 + ...4efcd13c8284f4a1f6603502674cb4c100c28.json | 1 + ...54460cfcaca91b3104ce59b17b9825b987415.json | 1 + ...c5a0a71d5577f192d96fda7fd8120a4e34ab3.json | 1 + ...1381afc4fc877dcdd0420ba0e6df69c29db3c.json | 1 + ...06cb4273e9045499244021f6997f4bce4114c.json | 1 + ...04fb00a4199db99c26e848d26e47d65fd351e.json | 1 + ...4252bd2d624325ca6d6e738d5451b22fa66ef.json | 1 + ...85d49a5010d546606b2c6c777500a255ee16e.json | 1 + ...5cba450a5d8c69ffb9f600ca46d0632ffdf70.json | 1 + ...c43c8fd7045af0280374d44f4e39e1120f739.json | 1 + ...7c07a7b040a681b95a5aef821d6511031ecb0.json | 1 + ...e82228ff885c4c30055e05c6de169756903e2.json | 1 + ...10f2cc3182bec79338a80b4077924732333bf.json | 1 + ...dc7525e3a51eeaae0cb267e9f89974e4376d3.json | 1 + ...67a31e09746af3e3772ba2beafb601ef2b171.json | 1 + ...280a9db5cbcbd94ebd0fc9916a78c23718dad.json | 1 + backend/__init__.py | 0 backend/code_corpus/README.md | 43 + backend/code_corpus/ada_2010.txt | 3585 +++++++++++++++++ backend/config.py | 101 + backend/email_sender.py | 123 + backend/jobs.py | 166 + backend/llm.py | 351 ++ backend/main.py | 112 + backend/pipeline/__init__.py | 0 backend/pipeline/_serialize.py | 64 + backend/pipeline/_stage.py | 125 + backend/pipeline/clusterer.py | 172 + backend/pipeline/code_refs.py | 118 + backend/pipeline/code_review.py | 72 + backend/pipeline/conflict_checker.py | 136 + backend/pipeline/constructability.py | 35 + backend/pipeline/extractor.py | 287 ++ backend/pipeline/jurisdiction.py | 37 + backend/pipeline/llm_clusterer.py | 97 + backend/pipeline/normalizer.py | 184 + backend/pipeline/pdf_processor.py | 88 + backend/pipeline/qaqc_review.py | 34 + backend/pipeline/report.py | 88 + backend/pipeline/rfi.py | 46 + backend/pipeline/risk.py | 63 + backend/pipeline/runner.py | 185 + backend/pipeline/sheet_index.py | 117 + backend/pipeline/validator.py | 36 + backend/prompts.py | 690 ++++ backend/prompts.py.v1 | 183 + cli/run_check.py | 60 + frontend/index.html | 300 ++ requirements.txt | 9 + samples/.gitkeep | 0 scripts/setup_vllm.sh | 153 + 262 files changed, 8209 insertions(+) create mode 100644 .gitignore create mode 100644 Changes/Stage 2 - Construction Intelligence Extraction Engine.docx create mode 100644 Changes/Stage 3 - Project Intelligence Object Normalization Engine.docx create mode 100644 README.md create mode 100644 backend/.env.example create mode 100644 backend/.llm_cache/00d67658bc54dd199e63def8eacc0518ecc59111fe6a62718717a87ebafaec13.json create mode 100644 backend/.llm_cache/0165e136ff5f1871e77f7548142a2baa3d31f05d6f5fb18b3e24f744ff79d5ed.json create mode 100644 backend/.llm_cache/024a38eeb18d89221ead5a42371e952db1c8a5ea7db4a98319a6fb39b52fee07.json create mode 100644 backend/.llm_cache/075c8fd8a9097e3c6081f3eb1ffebd99621821fa732daa8e007d4c469440c772.json create mode 100644 backend/.llm_cache/07caa4ba223bd4f94226c00a1151e69acea448077564c44501785f1e5426f1b3.json create mode 100644 backend/.llm_cache/08f70f602def064922edb17f444456f01268708285d4a1315cec9b99ed484154.json create mode 100644 backend/.llm_cache/092bb11f66b6e7991a5c1c6db12fc13d87dea0156c5a84818b1612a648638400.json create mode 100644 backend/.llm_cache/093df0dc56667ca5091d2df00f4ec627270f1761814cd6c91e262a7f4926cf04.json create mode 100644 backend/.llm_cache/0bc1907b473fb0cb45cbe5324336e64471e780e8f51bd0a4cc040d16b5a3b0b5.json create mode 100644 backend/.llm_cache/0bcfb7dc26419f5a9fb9ed8794a2f2529ea774e89eb6eb2571bf1d926ed53fec.json create mode 100644 backend/.llm_cache/0c0deceb7f6f7b6ac22394b22a3494745b9753736ce6fa96d6bcc27339daa6b5.json create mode 100644 backend/.llm_cache/0db936defc031367e880119f314024f3f8e3d02c729544aa0d5e87ecd70026f0.json create mode 100644 backend/.llm_cache/0eba402129067c50d06fc3f8ec9ef136ac420654963d685fa16fd55e1ff83435.json create mode 100644 backend/.llm_cache/10e21408ee0d209a0706415bc0b76449503cf8b441333caca1195a2b275eee26.json create mode 100644 backend/.llm_cache/11ac27cc5ff06924fa45ee2355a19b2b9c3b08d3ab81bd468ae3fb2254878ae2.json create mode 100644 backend/.llm_cache/12690bdad4816b33779cbff749910b90fe9572651883b0e7d22bc668698469f5.json create mode 100644 backend/.llm_cache/12e967bcee49a18954f717dbcd9f16d8ac36fafb68ffb832335e8332eb5f0027.json create mode 100644 backend/.llm_cache/13c126ebd335e986ada06d461464c73dc80db88d84c449a10b759dcf7942160c.json create mode 100644 backend/.llm_cache/140301f681b964b23f6db93a3bc49910b588df73b5cd94e843e112bfbd8868f6.json create mode 100644 backend/.llm_cache/1543b986c73d354a5ffcc9e1fd917f81651b1399b0f1c8ebd002f7a39c32aa53.json create mode 100644 backend/.llm_cache/155bf07ad9c9f8eda4769839da76761bb5eb7af55d1fbcedca9137db5c66ca0d.json create mode 100644 backend/.llm_cache/170e22d42c192b1151c770bcfc679c61bf9ab2a6dbf4afcc69a6a001c4a521a4.json create mode 100644 backend/.llm_cache/172070abad073c6fa099f57ce147405f0e9648f0656544adae30703b9a36e9ce.json create mode 100644 backend/.llm_cache/17cb9dfef45ce2282dafae5a61dac242901707843115216ee61ac38d46660b2e.json create mode 100644 backend/.llm_cache/17fbff8dd54e4c46f402df702acd3ac5accf91387d3976dbeb2e91f2a72ccfbb.json create mode 100644 backend/.llm_cache/19da242da7c54b44c8b3dab0efca13495d9491aed527b6fea2ef8c2c777e1948.json create mode 100644 backend/.llm_cache/1a0a5793ec6e7c9e20b422e169a7b6b27f72adceee0578546fe6ef8e0a1b5652.json create mode 100644 backend/.llm_cache/1af0fb5846750100f9ad7fd0dff7cdac4dc6bda7c454d33f29d16263d6a71f3c.json create mode 100644 backend/.llm_cache/1bc9e0cffeb4bbf75f78f58f03bcb4dc5002cc0e2f98bb0c93a13bfb95f16813.json create mode 100644 backend/.llm_cache/1cbb2bbd558ba57450ae0afcb349be49fb42ae49d098238dbb6297580b416cdd.json create mode 100644 backend/.llm_cache/1cd3af1a1f14f4b719467ce4281e55fc1feb1355c136c6478fd3b36fd91bc53a.json create mode 100644 backend/.llm_cache/241ab3138437ce1301c56e3c65610c1f7d7320521dffc5f32bd5bda41bff8f60.json create mode 100644 backend/.llm_cache/24fcbd4905e36d5813706ed04d12f7318f409186c1afe5446667d50bf4a48971.json create mode 100644 backend/.llm_cache/27a07b97ba6210766b0f40a9d31a6ce174f5fab1704934d80f15a4ab28256543.json create mode 100644 backend/.llm_cache/290caff42dfea3171129e30e9da97bc612dd8555e9f3e1563cd975f38c206d70.json create mode 100644 backend/.llm_cache/2942a8450705536b95ed63d28d07115fb87041448ab46ac600c2b66f662f4cd5.json create mode 100644 backend/.llm_cache/2b01c8405b28b711f53d5c182f1e958a5e4340e3dc0f2e9ed7e650940ebf6f30.json create mode 100644 backend/.llm_cache/2bde869babc2c832293790e52ab17e431331697c600b684535b8886567788326.json create mode 100644 backend/.llm_cache/2c53670e9affa7566ac0d64656fca406d3f6def38f81306a70af5a6cc1338f66.json create mode 100644 backend/.llm_cache/2cdd00a9ad89916273b7d91fca9ee4a40dd4caa453f1b84cf5b95e3482265fa1.json create mode 100644 backend/.llm_cache/2dfe9ecb84024e616acb90e15b4a42ffed994277d607ab2471c1ee4eee57caa8.json create mode 100644 backend/.llm_cache/2f5a0ddb2846e8b895d5f457f88c41ec3b50ad234c9918b9c09a645daf79e477.json create mode 100644 backend/.llm_cache/2faeacc07f1535554028e29f476bc38a2766757915d3054d6a9716a1df0fcfd5.json create mode 100644 backend/.llm_cache/2fee1564682d7ee7cf5c92ac40584c18daa3e3b55bb8d007ce8c43dd06d9a20c.json create mode 100644 backend/.llm_cache/3202742c258411be34ba083eb41e545f7654e71a0251bedd9944583e6542647e.json create mode 100644 backend/.llm_cache/3281acc7ade57e8d4a1b1be80d72bef3ada41e8d05f3c10863e04b1007871751.json create mode 100644 backend/.llm_cache/32e387c76f4be36e8ed98de081c724f184bfac20005ed0f109e27de2c2132c86.json create mode 100644 backend/.llm_cache/363bf16fd9c3097674ff7580dba404b2b3e07e3fc77bcb0b62fa6cfacca7ddb7.json create mode 100644 backend/.llm_cache/36b2834012d1cdc00773719f54bde65c57a0215fc52206054cf15bc5d4620cfb.json create mode 100644 backend/.llm_cache/380a548a0110bc3dbe3f3b57a90b8f534d588066cdf5e8dccdf854ef00828856.json create mode 100644 backend/.llm_cache/3b9f1e438c00801e9ba8497152dd7a8fd6eaef87f5021ff71f83a0a1407b01d3.json create mode 100644 backend/.llm_cache/3bbd4435e1b3f7ef47e31711d1dc72ff755ddb9616c9028127e21b31c9f2e96c.json create mode 100644 backend/.llm_cache/3cd1fab325af7f4d28a3610366fc74c9a29a0ce4dae25ab6fbd398603f725a1b.json create mode 100644 backend/.llm_cache/3ce6e0c9d2cf1d2e25e65a501b68cbc4e4df71f44755cae27b259d8d0d20bc42.json create mode 100644 backend/.llm_cache/3e6dd9cce1a067b4701054a3d81cc61662867c9da4204545611a8a1329a821b1.json create mode 100644 backend/.llm_cache/3f5b3eda58a05acadba332da7197eed5d6bf1958184e43e18b4d9eece48acf13.json create mode 100644 backend/.llm_cache/3f8c03352748c65fea4cfc3a396f87aecd05cdadf7742cfb8deb651e05a33d09.json create mode 100644 backend/.llm_cache/40bd89c0b28a852243ac6f7a685cea922d55dfc7604e2c60e6dcfcb6035e4812.json create mode 100644 backend/.llm_cache/414e0bb3f2732c3f70611f12dc5e59fe5af382a1f3bc61e84d39c61363c500b6.json create mode 100644 backend/.llm_cache/44aa5ac5c6cb4ad2b7a0a972fa1daaa85aaa2e87937d0a46466a59dec41282b6.json create mode 100644 backend/.llm_cache/460a94ceb07c364257a28e301eb84c115a813481a7402cbd086c01ae149a2bf6.json create mode 100644 backend/.llm_cache/4736f1f036206441dc800cb9336237a9a4366f969540d28d4356c66ceebc8280.json create mode 100644 backend/.llm_cache/47572e3fe895bf8fa6c5bffc2bf0c784c08672a1b6d8f7ba849012e960821c1a.json create mode 100644 backend/.llm_cache/4808f74298547d8d95afb6c470bef575326230008360f59b202c4045f42daa37.json create mode 100644 backend/.llm_cache/48324978c34148db15dbfad521d8e93cd473e965604151bff54bb163986fa9ac.json create mode 100644 backend/.llm_cache/49eb4e78f4aff2a3cb8482acdd12ddf2ffb78f98375512c617f39256725d15a6.json create mode 100644 backend/.llm_cache/4a5ff8d4dc6779fdc19bed1c97b655f3266879a74456b4c09aa77ddee3261810.json create mode 100644 backend/.llm_cache/4de863a781810edd080e14bce2a02e1f4b6c92c49cdb5951a5e1cb0386145182.json create mode 100644 backend/.llm_cache/4ed6384da200b13372364d652adbed8af875c4c33d1d7893d5b2a2959218fc0c.json create mode 100644 backend/.llm_cache/4fcc63d1dea13a3b8905e499a24ad0e5bf9ab5a03c1f78fc4871de29af1edec6.json create mode 100644 backend/.llm_cache/500da885cd202bbff17c6a19e24dec9f591a2cc8de69245cb6e5f08b6dc655a7.json create mode 100644 backend/.llm_cache/51e0edf53a06e88d8c04b25875d0deb016daeeae64f46035f7f11e6d6c92e57c.json create mode 100644 backend/.llm_cache/5290db3c3cbfde71b1f4fa86f520288443379a9d4ea9346a8a261c2b30da7bdd.json create mode 100644 backend/.llm_cache/54149139ee9d23f0f666fdecb2bc65473898c20bb1c1e72a9ba985ae1e903a98.json create mode 100644 backend/.llm_cache/545128e614c46dc729d2e6077f323f40b6144ebbc4e0dd8273e583d4826c2ba0.json create mode 100644 backend/.llm_cache/5625798cc6b481217fadb79597f3d66668c185b9aab1231a8f71420ddf24c1b2.json create mode 100644 backend/.llm_cache/5703d1971205f211105ae9684f02259bf84da17582c822f4e0ae645ddc8a86c3.json create mode 100644 backend/.llm_cache/5772700489d178685e11f2d5620641e1b8d9a3af00760b7e8a82e19d8230847e.json create mode 100644 backend/.llm_cache/58009723e7c8075c777e5d863aa92d567d699e59c294ba8eb8aede1072c39eb1.json create mode 100644 backend/.llm_cache/58daffa7606ccf1318c9cd8ecea502578cdf78dce18dfd6e218ba4423f136c01.json create mode 100644 backend/.llm_cache/58ec57f3333fac1a12303359f1265861b8ce926365211792121f9458e3bff1a6.json create mode 100644 backend/.llm_cache/59782ab0aaa8a11f64155a963843c0400a7f25f574c7caaeb7ceb0956bc6f6f2.json create mode 100644 backend/.llm_cache/5978dd820b32dd093f1417c143d6e7d24bac1a8619ce5fa08bfff5a145e38d77.json create mode 100644 backend/.llm_cache/59e2537a261853b30c5d3008889b9b5f8eefae97441653ed9ef7448b67aaa80e.json create mode 100644 backend/.llm_cache/5ad27788186f11c9f7aa1db3617791d43bff40a48d1348e576220a49b878068c.json create mode 100644 backend/.llm_cache/5ae1b3586346ad16f13bb4e13d446a6cbbc5030eec6e3960c9a61ee92ee404c7.json create mode 100644 backend/.llm_cache/5cc93c3efe8e6a50d132c8cb63f6b0ce486e1582acc2303538b4b446b1ec5344.json create mode 100644 backend/.llm_cache/5d0ec2772739e1e97d6226aa2df4f5156b443b3d609ffb458eb716f918235634.json create mode 100644 backend/.llm_cache/5d8464409ad2405c6d4a3fe7cf8e778958b3fa6475bc60494c8c240d499d78fb.json create mode 100644 backend/.llm_cache/5e21d1ed89bdac1cdad37d9250ae3538526a20c129fca1e41c1b98377389e79f.json create mode 100644 backend/.llm_cache/5e398049be067cbfd3b928b4d019cf800922604510dc1af4bebb7c1caf8f0c25.json create mode 100644 backend/.llm_cache/5f07bd8db640e7b464f1b3f06c7dcb5c6c7fd8327e89467eb2917411da1a4c85.json create mode 100644 backend/.llm_cache/5f9821293f843070b7780ec20e2dffaad4ad316fa93c0b983985bdecaea1bbdf.json create mode 100644 backend/.llm_cache/5fe9a84e8621e168ae6a48d1ffb3db5566f1cc530e8ce8f57cfcbea99d5b8319.json create mode 100644 backend/.llm_cache/61d37dd1d26169deb1832bd50ed838c657705e4bde5fb6cf6eaba4278a6ee872.json create mode 100644 backend/.llm_cache/6305b6214a2123c512140b4d2e789d5fe616611d4136bee9ffb0cf6ba12e2456.json create mode 100644 backend/.llm_cache/630675e64d6af9eb77ea54b180181a22611c5708a8d088ec1bc70d748db38cba.json create mode 100644 backend/.llm_cache/684dd3d6e85a164f67e099fa6940aee8574c9cc1d3ccc48d3de0d7deac439229.json create mode 100644 backend/.llm_cache/68520074ae27092425fce236404d2414eab1d470119f33a75b61f306e1597faa.json create mode 100644 backend/.llm_cache/69c0e5851b410b8a4286d0705336e2417c9ccf44f1023fc963724ccd370df294.json create mode 100644 backend/.llm_cache/6b42e7a63706e1f4d35848dbf0cd1d0e05fb08a36a88b00d5c267bee0afe6624.json create mode 100644 backend/.llm_cache/6c05f68ba574bfea115fcda55d08f6582fe606f1304487063fe64523b8c5b1d7.json create mode 100644 backend/.llm_cache/6ce8dd3c7ac41789ab26615cf83505a4c2088ab3abd9dbce2f0cbe84cd265deb.json create mode 100644 backend/.llm_cache/721c2f124ed75ad637983ce8e425244380bb9fa61cf0fa0b025241c6607d1796.json create mode 100644 backend/.llm_cache/72d0da67995823841c6d605708c3a5902eb902befa2a7e8e30378d6e8048f753.json create mode 100644 backend/.llm_cache/72e4fca2cb73aadb7d4dda04526d06a7821983291632155705880f8a4a177517.json create mode 100644 backend/.llm_cache/733ba8263f08d2d9523e74558798e6ff595e89c907ea1e82f4535f8ee5e2e52e.json create mode 100644 backend/.llm_cache/7362425b747d8ed60044c1f51358fb13e2f42cbd136bf506b86fbd63f8d3953a.json create mode 100644 backend/.llm_cache/73793cd0af913c3b697e43a0fffe3d19b049702bc07a50f0d0d1b154257a9a97.json create mode 100644 backend/.llm_cache/739f477f970b30b5942d9be25075d797488bb6535f1a3dbb44209a3585872d94.json create mode 100644 backend/.llm_cache/7511a9940d17fad2588299574364126e938a68a61af560c152709f244a8febc1.json create mode 100644 backend/.llm_cache/754e82699ceae8b22408b48ab4ee44a071addae947cfb23a54ce3d0e88d2d10d.json create mode 100644 backend/.llm_cache/76778c61f079c10da8f67c9989bd86ee980f5d6b9f08db95e1fced96607a790a.json create mode 100644 backend/.llm_cache/76b4c7d5aef957011c95b8df024de95b5f8dbd3d0f807a9eefb7620a534af216.json create mode 100644 backend/.llm_cache/772db8b1ef72e07d1da604254ef7aa3d7dd653075c30ffa2d0ca00f7ff85da80.json create mode 100644 backend/.llm_cache/77b1392b0a0faefbabbe973cb95f7119cbbe93fad25a00eff37fb4dbf7ab3f47.json create mode 100644 backend/.llm_cache/79dc2be35041085078ca2fea9a8f180d6f07b3beff6b0029dd6136d38416beba.json create mode 100644 backend/.llm_cache/7a1bb8d5dac63be4823ebddb85e6aebc6164a547b3169d6e48725d9944f8912b.json create mode 100644 backend/.llm_cache/7a86d0b4261b79fe346814c9664f3871041fbc21dad113a4430943dd63472e7f.json create mode 100644 backend/.llm_cache/7c99962acaca61019e7ee6b9160402848b6965bb7d5df83097261096b8d152ed.json create mode 100644 backend/.llm_cache/7d6983551070b0f715420bc1f8281a2525bd980f66cbf3f29cb31f75030bc966.json create mode 100644 backend/.llm_cache/7dd3ae7e40214eeb987a03610fddd5913b9cd6392640d2c9f2f4a98a67a78ec1.json create mode 100644 backend/.llm_cache/7dd437de9e5ff67754df7bea4c6a249cefa844eb40054db10863c9d9b30372b5.json create mode 100644 backend/.llm_cache/7e2906d79b8d26fa1fa9df15b2b061b42e0d910a8ffd9e64dd77bed7f6898b0e.json create mode 100644 backend/.llm_cache/80dabfb85559619efedb756043ed21d4bad304343429b01a0bea447078f4b849.json create mode 100644 backend/.llm_cache/81e664a4f0055e9bf931e9b377d4c2fc7a51d68b76aadc748451089adc845091.json create mode 100644 backend/.llm_cache/823d398090162aa28d5042bc919cbc6ee09cebd0f773bd29adce1378a3fdb302.json create mode 100644 backend/.llm_cache/8345ad448b2496bb5d044f288cefeec36838bd5831c0f521190276172b08ccc7.json create mode 100644 backend/.llm_cache/845791251d61b4ae7ecde92306aa6d318a7b927ab36210e493b67ef6a92b7d4d.json create mode 100644 backend/.llm_cache/84a6ec59ed38aff66e335d229541e6fad4c347d6adf3cc733a02c2005c44ba47.json create mode 100644 backend/.llm_cache/856aedebaa2874e6e943d0c1abb138a34816271ed79b30a0fe4aa8fdd02c980a.json create mode 100644 backend/.llm_cache/8a55617f156c9954bc8ebaac53941506813a88f2900fc6e0163c761646d7221d.json create mode 100644 backend/.llm_cache/8d432a5f3cea06f00b9461f641eefd2bf16e758943b0f035a9590cb25ce6daf7.json create mode 100644 backend/.llm_cache/8ede7f207a8db86234e40d1522309025d3f8481c6d70ab3af73d80bee42bd1d4.json create mode 100644 backend/.llm_cache/8f28dbe53dc8042af3ee0c6d26bc19088391fae336a1db4b14c4ea7ce92de0c1.json create mode 100644 backend/.llm_cache/8f2fc93050d2a508df7bc4a06f99cd2c0334b5458b4ad32a223ae820713807a2.json create mode 100644 backend/.llm_cache/8f9f0679eca276752804638079dbe0e007c53aea1951dcf37b8bd4166f8f541c.json create mode 100644 backend/.llm_cache/91ee4df2c43730a64eaa48f896fad41b4cc76069244a5fb1376bf25b8e60bd0a.json create mode 100644 backend/.llm_cache/92cee23aa60a99f9e4c45a739e9228bb087b3d36c0eeea21834e49f141dafb1d.json create mode 100644 backend/.llm_cache/92f905bdcf5cc7eedc1156e45da9d54f2a7cf9a98cb7242343be0d4ee4785638.json create mode 100644 backend/.llm_cache/935fbec5bb113e4b935fa7af7f5109a488a00efd281b796f449b57b40e34b4c5.json create mode 100644 backend/.llm_cache/940440c08c7c6ec534916cb9a9d76d304fcbde673ec617724c1820c184a66f14.json create mode 100644 backend/.llm_cache/95ecd22fcd3eacdedb9129a63a92526c4d15fae56d99ce4baf234b1c05caf481.json create mode 100644 backend/.llm_cache/95ed99a5203bcda168abd1680714cdbec38081f38ea42c73e691c653ea099b5e.json create mode 100644 backend/.llm_cache/9949036110150af3de67c100a206633e67e12e27b5b1bb916546c5d63d266b20.json create mode 100644 backend/.llm_cache/9a1cd123ace88cf0b0475c877ce89447b53f60c4eb670f2f8ab44c576adbad6a.json create mode 100644 backend/.llm_cache/9a7686121676011435407f6727152b98160c944b0da455eba4344f204236bf10.json create mode 100644 backend/.llm_cache/9af0116a2b0f21432c5e924d50c560e28a396f055bda307359a5cc3dbdbd74ea.json create mode 100644 backend/.llm_cache/9b08ddaeccc5d49ac12eb192f3f40d1ad6c878321acfe18faaa445acfbc340af.json create mode 100644 backend/.llm_cache/9c1a39c365875208e6dd5b5a5f8f976b478206012c267bbd6d8bfb3236e74428.json create mode 100644 backend/.llm_cache/9f43501bc4057591061d837e50ce3448cb4648248b1a1a8c9276d899644691c5.json create mode 100644 backend/.llm_cache/a24fff72a83a6c8abcd658b1342bafcaf303d31c2402aad6cb1845bb4ac9373d.json create mode 100644 backend/.llm_cache/a4b92db32e4a5cb1f6f9df318a0e87c05d15775169093962e56682591d27d960.json create mode 100644 backend/.llm_cache/a4fe1ea824fbdecec2bf34528cbf53bc0c4ff7958238f1dd0947c865f54ed0f3.json create mode 100644 backend/.llm_cache/a50bcda16a2086a707cd2e74e003890da217c8cf089b21fe1f50215feadc964f.json create mode 100644 backend/.llm_cache/a5a9777dd4d52a4fc195396224e30dd0916fd2c68db593fbef1ddc938df36dd7.json create mode 100644 backend/.llm_cache/a719bc8a6b9075970fe80faabd60cc89990528dd5e9523c00af6cc8fb9204f56.json create mode 100644 backend/.llm_cache/a99c0d294d3591930adcdd6ce542ba8f06a89441bd01ba6f0ef6e19530a8b744.json create mode 100644 backend/.llm_cache/aac50ee4570b6f5ac52ebf49729493ecf569f6cc5d5243a2c84c1d7cd08d5e37.json create mode 100644 backend/.llm_cache/ab3ad18d654e1246f24fb737b05aa310940252cef5487b8068a78005982106ad.json create mode 100644 backend/.llm_cache/ac2f1c3225585197efec0a49dea7c439e56124c4f7d94dad70ce5b6524fd82e5.json create mode 100644 backend/.llm_cache/ae537240e9e41f52ffd11f88642b98e20d0cb05709055d1e188b8b538765d951.json create mode 100644 backend/.llm_cache/af861c954aa740cb9122c2912dd930e9bb7df000a0d17a996ce9d1e071b09d72.json create mode 100644 backend/.llm_cache/aff6839a20a95faf0bcb649e9a1454a1e0ffb0a168982c8f347919d426c50fce.json create mode 100644 backend/.llm_cache/b072a8667cf9ee125f2b5977017b2a7794f23d948952450e10dc4f1d87293f24.json create mode 100644 backend/.llm_cache/b20559ec11c1c6472bb8457c267d3f6431d3318ebe2f8db17bf52caef1278d4f.json create mode 100644 backend/.llm_cache/b2b21e64c0963afcc575b6f0b7121f321e22b81870db90b6f7953191542d5ae5.json create mode 100644 backend/.llm_cache/b3bc1fd546ce206e1d1bea37812247437bf78f3d7f8aa034f7321ccdda30e8a6.json create mode 100644 backend/.llm_cache/b3c5a73e6fdade7bd8ede1ab78d3d0b317e18810bbc2fda05b21f92afbe2bfe1.json create mode 100644 backend/.llm_cache/b439dfb74ed4df4e554c07532a2276c344c81f0734997df8b599db5dc719c9e0.json create mode 100644 backend/.llm_cache/b69facce908657a2334828498e7dee287691d89c064407113ba4731329cd0f97.json create mode 100644 backend/.llm_cache/b789ff27145f2a5bbec8e83f7f70d0225bbd9957fdc1165b35c02279ddf2ebde.json create mode 100644 backend/.llm_cache/b86714b2e29cc7d5d8ff4f1ab49970ac4e600d300da5732e5ba18613813d659c.json create mode 100644 backend/.llm_cache/b99f73a054dfafa4912b15b06ad326a44a5c244fa1728222c0f5bd68e441ef70.json create mode 100644 backend/.llm_cache/ba8863b173e9e76d4738a2ff423ace910eec76f0ac3550a8c1436bfa42c7e57c.json create mode 100644 backend/.llm_cache/bc31b0a3334a6b356059ff117d2642dec69690374cb45591cda6a8ff3d4ea050.json create mode 100644 backend/.llm_cache/bd713ad5137c1c6d09f930e88f3c6934bb1701bcb1d15b21ca5d08935089f95f.json create mode 100644 backend/.llm_cache/beea62c77ceee2cca4db65c8f532ba20771ecce29afc726eec9e07e08d9132fc.json create mode 100644 backend/.llm_cache/c0fd1b81f83fb59d8295139915bf278dee49e4bd9c8562c6b86dd8b00907425a.json create mode 100644 backend/.llm_cache/c2137b5b5701e56c94e9cd75b54c2ba0f9e6296b31537b93ef2744e83d7ab76a.json create mode 100644 backend/.llm_cache/c282405522dff62240c604c0fbc5e03159c9e25950eebcab9abb39fe49861d3f.json create mode 100644 backend/.llm_cache/c30c9bdd9bcbb35c6e967b26388fbf5ad38df971b43038ec19f12f0fbc01ccd6.json create mode 100644 backend/.llm_cache/c3ce3cb76b69013dd53d325aa484466464ee18152ddcc7a06c013592d8437343.json create mode 100644 backend/.llm_cache/c4f1fc27f87c34f25be0dc726d9fe3d0e282e5ba41874dd10626b9c03bf67389.json create mode 100644 backend/.llm_cache/c618885683a5c93e308d2ff2662e712c6e9f6e206a732c4280a7580d7f8f6cd7.json create mode 100644 backend/.llm_cache/c63987fd07e93521b384fb13f6287f91046a5b063ceb70c7283e5f6f117752d4.json create mode 100644 backend/.llm_cache/c65379485b783a7658fa67f9e4301854966b104f5adc5a6ff4708fc31d09631d.json create mode 100644 backend/.llm_cache/c68a7d42678dfba9a9c4e87ae5f39b050c539925467f587ec73769443a1a6eef.json create mode 100644 backend/.llm_cache/c7981f8456cb858d2140ba96dd46cb7bee60645df18228f4e8225620c4c08b99.json create mode 100644 backend/.llm_cache/c832a3bb30429d839326e47a32b30f097bf9a4eb46db8cfbf015a125201e6811.json create mode 100644 backend/.llm_cache/c9b8c40b6adedaf1c65583b0b41d70cd567b84277b847564f971fb77f2edb2f2.json create mode 100644 backend/.llm_cache/cb9c0fab25d4b49368412b625ab9d8c633f2190c988ea8dd0556ec37738a5442.json create mode 100644 backend/.llm_cache/ccc7fb4ba807df3626666003b9495094116506f5d2e9fa573e4cf5b3b83ec479.json create mode 100644 backend/.llm_cache/ce8122630efd6d8724770fc8baed83aa53c94c6cf9d319148fef24a3e6cefa5b.json create mode 100644 backend/.llm_cache/ceedc254cfc972101dbfb1d78b8af11771f0bc3eef7ae44fda7ef12b867f91fb.json create mode 100644 backend/.llm_cache/cf1fe0cb89126765ff1b34ce95bb289ceb714365d9537b8df2912833c166ae7b.json create mode 100644 backend/.llm_cache/d125eb17f6b30bc790531b63b358daaa50a49bcf15badbe940cc58fe09dd53ab.json create mode 100644 backend/.llm_cache/d2e21880bc98c83f8ded0b4eb8169706944fb52cd37254891c169dcca4271c99.json create mode 100644 backend/.llm_cache/d552cc34ae9cf59ec9a04acb4872546b1b644d9dfbfca30267453d1cfb7e3cc4.json create mode 100644 backend/.llm_cache/d997d581ba7c64e723d87f9fa0a6ec86b7e2eba3a8f8e818875debaa7db571bd.json create mode 100644 backend/.llm_cache/db4080e6c546d27627d8cca92f3121a107e14ffc424521bd8312624eea1dc1ca.json create mode 100644 backend/.llm_cache/db59b33ffbe19f17b5959e0cac43bcf9eb9715f1f3ceba6352603f7973d05a96.json create mode 100644 backend/.llm_cache/dcdc25abbcf4f3f1456299222d78e198ed7b5612d1d1fb9dfe86a45e1194fa8f.json create mode 100644 backend/.llm_cache/de48415a0659bc6ea80a4b221d60c319912b74f7dcd329d73195baf0451bcd89.json create mode 100644 backend/.llm_cache/e07522bcda164582ba135fc543fb6909ce54e06f340b826de877e70f75aac810.json create mode 100644 backend/.llm_cache/e3632a26d5166da7939adb265b9143f66f419fafca252e009a97d5177b59f85b.json create mode 100644 backend/.llm_cache/e67cf9a52b829e8c4f078e8cf154efcd13c8284f4a1f6603502674cb4c100c28.json create mode 100644 backend/.llm_cache/e7f2a1a79b8192ca3d391f792dc54460cfcaca91b3104ce59b17b9825b987415.json create mode 100644 backend/.llm_cache/ea5299dcfedb8e03b06e0dc40ecc5a0a71d5577f192d96fda7fd8120a4e34ab3.json create mode 100644 backend/.llm_cache/eb4cf699fd7f62aea50dd06dbc61381afc4fc877dcdd0420ba0e6df69c29db3c.json create mode 100644 backend/.llm_cache/ebdf8dc9f95cd8850ef34124dd506cb4273e9045499244021f6997f4bce4114c.json create mode 100644 backend/.llm_cache/eeaee351768a4fc7d395283a98e04fb00a4199db99c26e848d26e47d65fd351e.json create mode 100644 backend/.llm_cache/ef1fd2f8aec9dd163d5ad1158794252bd2d624325ca6d6e738d5451b22fa66ef.json create mode 100644 backend/.llm_cache/f464819404af683b85c709c08aa85d49a5010d546606b2c6c777500a255ee16e.json create mode 100644 backend/.llm_cache/f5675517c4bbe2c364ea71c2e265cba450a5d8c69ffb9f600ca46d0632ffdf70.json create mode 100644 backend/.llm_cache/f74322804e799d75ffa83cdac0ac43c8fd7045af0280374d44f4e39e1120f739.json create mode 100644 backend/.llm_cache/f829bd526260778715ade9e37817c07a7b040a681b95a5aef821d6511031ecb0.json create mode 100644 backend/.llm_cache/f88d744fc451bc19f503774c8efe82228ff885c4c30055e05c6de169756903e2.json create mode 100644 backend/.llm_cache/f9c1aec361df42d5f7219b5230510f2cc3182bec79338a80b4077924732333bf.json create mode 100644 backend/.llm_cache/fb328cfa3356ab561febe9615a8dc7525e3a51eeaae0cb267e9f89974e4376d3.json create mode 100644 backend/.llm_cache/fcad1ea68b8363538ca944bc11167a31e09746af3e3772ba2beafb601ef2b171.json create mode 100644 backend/.llm_cache/fce44924bd91dcce5d1d613eba4280a9db5cbcbd94ebd0fc9916a78c23718dad.json create mode 100644 backend/__init__.py create mode 100644 backend/code_corpus/README.md create mode 100644 backend/code_corpus/ada_2010.txt create mode 100644 backend/config.py create mode 100644 backend/email_sender.py create mode 100644 backend/jobs.py create mode 100644 backend/llm.py create mode 100644 backend/main.py create mode 100644 backend/pipeline/__init__.py create mode 100644 backend/pipeline/_serialize.py create mode 100644 backend/pipeline/_stage.py create mode 100644 backend/pipeline/clusterer.py create mode 100644 backend/pipeline/code_refs.py create mode 100644 backend/pipeline/code_review.py create mode 100644 backend/pipeline/conflict_checker.py create mode 100644 backend/pipeline/constructability.py create mode 100644 backend/pipeline/extractor.py create mode 100644 backend/pipeline/jurisdiction.py create mode 100644 backend/pipeline/llm_clusterer.py create mode 100644 backend/pipeline/normalizer.py create mode 100644 backend/pipeline/pdf_processor.py create mode 100644 backend/pipeline/qaqc_review.py create mode 100644 backend/pipeline/report.py create mode 100644 backend/pipeline/rfi.py create mode 100644 backend/pipeline/risk.py create mode 100644 backend/pipeline/runner.py create mode 100644 backend/pipeline/sheet_index.py create mode 100644 backend/pipeline/validator.py create mode 100644 backend/prompts.py create mode 100644 backend/prompts.py.v1 create mode 100644 cli/run_check.py create mode 100644 frontend/index.html create mode 100644 requirements.txt create mode 100644 samples/.gitkeep create mode 100644 scripts/setup_vllm.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a8c0a00 --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +# Python +.venv/ +venv/ +__pycache__/ +*.pyc +*.pyo + +# Secrets / env +.env +*.env +backend/.env + +# Runtime data & artifacts +backend/uploads/ +backend/outputs/ +out/ +*.log + +# Sample drawing sets (large binaries) +samples/*.pdf diff --git a/Changes/Stage 2 - Construction Intelligence Extraction Engine.docx b/Changes/Stage 2 - Construction Intelligence Extraction Engine.docx new file mode 100644 index 0000000000000000000000000000000000000000..352c72793a23f682fc23eda61a97add552e8fce3 GIT binary patch literal 16764 zcmZ|119W6-(*~NPW81c^iEZ2F#I|is>||nF6Wg{uaWc`wH|PA{|DW&7y|;Vq-K%@; zr&jH%+V5Lz1!({%Di8=HB#rbyM=VTt6eCs2|xFI+?8|VeqpCkggEf7)0yC_n2_r6yB5lt8`LUA;`p(=1hsH zi7YQ4W17N~Db!hT?~&QqeM7Erl3HjNTlM|lK1|Y=`zI!iE8LJsEo+Ri%OaP8;dx62 zCK9s&hf<+i5_?7ZP!x+{IsvVCu$RF?(gsxdkx24l^6{hfc|SddYj8C2;|hn1YZ9@C z=h}$X6I*Fd%YVDf2qSTkbEtjPrh02id(>Y-oo$3lSrv8ZW`m;$G6yGLC*_ue|i(L<_nuLD$; zC4=Nv!U6JMoQJm}Y3@EGcI<~MPUgwR1uUkv9D}~7b$&T(WZ1!`=sbEjYYC3xwxAI^ zYTgbPQg+cNiUd5R!GxP6RNwGwIiCqFd@PSrDEv!jEpFehjz4uZ2Lc2H^ZBXoXlm`m zK>yddDp6JrzyvE+gY2<=g9MIZbzRV6sSKr=x@?*TV3Gi_2U*08fc}0@z7@Er6v*Q`HulWeoqWJzxa>ppucs zxsXe5Ca;v+HY{=!;W-r5+&T1`1RN&Q)QtUWO-|584<)xRR`(coTeRU8_h2MkKSHW_ zqrt*GVzuCnmIDn2I__*@s;u8@*I-pnsrpS5H`T7B+(~~NjH*bnXna2TeT&Z%y`D6f z+zcPXQ$8A7H`__lOr7-EFPe{8U(Ve=D~jXa@@VE(Ur)sZ0)o~9215Fjhnt8A^&B;7rK5<>#eizAADd#e&Wa54q0V2`x1_O>=8bRn;mi`g#i*0LbAxTkXnjf z*&h57+YFDsiEbE#RHJjNNVtk?+~&4Z^|T2H=;MP%kE??O@4v}nS2}0XRYq5*-XFcV zWk>^{O__Pt+dA7Ueyl$2BW%AJzOt(b;ztcI{uWB?#LK;ij+WfMyfo{T7~px)DufV^+@z#c=9Mi~F(?35qyk7mZyy%3$O&G_C2dsdZp}k_*mh%+%J9IaQC~Ssg4n% z>F(_|Gs!>N*GICW2E@_yw8&If?8Yd^Sxw0MjK4Vye^t^CNh0VnzMg(BxHPK1Y7e#Q zAF?xbZ*~Hb;`GhD*2uarA@0FiGwfJYpCh>TTV8wrnITEKGyllLwf;oNNqx!Z`;5@B z7yGVk+IcbU6zwDotW$ ziu@7-nuJzwAjZE8s&xMW{G7_fvKI;lRK@@l5ZKXel)i&)P5J{QD#!5!AA)XqPcO0# zvios1)Xjj=ZUCbp5Pu`u1e`;b#GN1kI>o+fQNw~8kjNi2o@aVKk9_M_dg)gPABU^WIsfJHS?^}9J)M(q!?TRknB3Y0nw52SuCHz3n z@`glee^C|$eM^_5w&>}Mj{vn21XwGNK=P1c8)zf5Z(*9{0Y7%85W#)Fkl5&81cz#+ zGi)U_`q6G%C<(Aep{*K&gRAvJPZGf*c5Qx})+xqhCk=QI@)fK}3ANyFs?mhR$@hoc zvaPf9m(2-*R;#Qfq1((&ChY;~M(nVG%aEZN-cvt5CFF|e;f;q-W~Qh^L{+~0V4#OtI~0JjTWT>1P>Lq-M5FQ z0?HhQ0|@NMrLqXv zqi=h4GHkrsORFp_4micpT*n*^zKkjFBsv(0HbrjPP$9)HP*PM1u&W6U z!#FfRrgd>LwWE5kXUJzJ%k$IlNnNI5=nb;jfpusT+>4Rw)^AB`n$Q#c z94`7xaxG(@`3qx7-MpF%VLO-`5Asy)3PL|%?5ZuAlc#_+*#1jx5Y=~}-&OkOM<`3D zNYese&Uf_k(GVIz-2|~4g}=o0FlsKxo^f}ijLkUO60?a7hKo|(riJ2GN2$Yldns7q zBE8N)ljBs+V_^FbaPKeH+XLffTS)Aqv$IO# zi>h^+(_w#w#D>A_5Eu@OE%?w3Z~W!ordS7S0W{nuL1I6?>e1riVYvy6J+iLZqg)GK z3o+1h!0!~j<932R14OTW%GsPc=Nkt192bGSp(}iI} zT(7VH4Gb!es1l3RKbB5A5nRPyU=-+rNIemBEucs$(I1<$fE21yl_wr_EkA__Dlge< zr9VC?&(H)$J_XqXqp~oV)BcAfvc?szO(Lk;aith9v;SbIMUJn%L~I^wAWym)AaR0$6fYcmF*Of*hhXZYK z<`4#zcz;QQ>2geVsukeS8cCv~29q;AM5t;HA(7rDC4f@jR8N1&?wS>T38{bkCRM_W zeh&+i+H)+Z#(3c&k_MO-ytyRUrD`JvcCAeS0IIa%m588c>*O0uk!~2ya8N0CkmEU7 z)i`1f?w7QQ`V~eMT@K+RoIDQiR;zSp$6BoF6%I@Q^E*ecw-33qt%3U5wCvl$qB)40 zjOzF_X{a|(qQO@kut;e)b5n{e9^pvK&hNExA$#@QOlAJ4-aGAdyH?#~@T+B=1NF+1 zK;YZ;50D`QN;31xiIx51`|Um~{Eavxi%-C^Bsq8QMfg@kZK4*v*@OWNBNH}X`F9~a zGn$J+I`({tk-Qk`)XH3{Y~*M}S(kn;c6Q~sN7#~vk+=?7BQj+8AJ0LMLDo$bZJ_k? ze#Z*n=okK0c0VQoJBfDMvom%oRB0S>knQgfs6L@o9n-kT=V3G~Z=|9T;>=!U?#adi zyEq-V;VKw%62t@r$6mU%=_+ng*7wyydo#ilu$+`%71d+*U0dnGZ{5aiC;POf0qo-# zDvtaEx%%C^%K#s()WC>OHC9jii#^eG#Wcakv%-!Z`Us%E`}p$qx4HT`yy0P&R@h;S z^`<*?iHE3$6{zW1%ys_oY4f5%r&dd4G;4x8(&Bz?IXE#xqNkM76ruLsWmF}8n5i%l zgODc(I;UbcoUGQN+J|PL2n>S7qUwvCl~ALYT~ACSML*qqZk0zXG_Xx_UGpY_uc5{Z zfM3THuB)fd^09v}WV!kXL=P1W?srwa9*~}KFoG}7L3_XUt&HRA8m&AI!%vNw>+&7U z{X;X%AMUHn0q`{h_42z_rW*ol6OUDFa@7NC6tTErtF7wnn2bKS)&hkf!G=fjMw%%-l< zV$M>Yp{-Dn%q;Xw?gr?G9&n}9Ii$Mz6=fx1wNb@4=r)=O$HJ-*e1TWL2VkgXO& zRL`QzK1m;3kzHR;J`yoJHwKnAkIvba<=IO=6BiB}s(Pnl2=c<8nbzE*`M&auAB*b6 z^=k<+KFfw%YkME3qjzhQESC@0UXWSiz;Uw=HdC1omYv*tkgIRnRy!T%JFjM>O^U$B zpEg(a-!zXd-t2gJG(V&J>V6^0e5C0cnjZ?$CSf`&kg+*LCx&ettKa(8Jd>Wbn}n|MeJ?J{B^5)bL6Z)*XhX9rG1>fln^&9Yg*Ew zgFd`dvUw*ponHKqSA%ybmTInSQR=c|_0f_{f5RMTcMI=IN+>|UM&0$RAAhJB%qCdI zr68TV+p?OTgQ?p~ZJnE8Qi9Axd-3mW`tgVsjb&@^!Gv6&qRV*dWw}}%sZeunh=s_2Ahc&j7t_Ew-}Q4ZLqYv(J|NTDXc} zSi5W+3M8@pGL3UWaTWH_?rz%eA>$p8DUM<^W1dFWC^n5tT#{_G;#E6lXd8ik%~w7LJC6;ed~&xwvl6TbJ}j+eJBx0|eY6G&+D_jT(AL z2BRzkZ~Be5yR<({8<~@vgVkP-)pEz$59@}9#k!}Ht8_WGg$yEyr{aYYL%#N^Df%_m zy!4|DSvVbw*wN-taMGORH^`xblt?iLNxm`IB@WyuyQ)!RIk&(i)B`m~IxJYlTll&; zJ+#(glQ@PCk$RPqPlU;qp6$u6?EOcB4OT3f5r5(&|g#mYBqY?|* zj&}o|6^2f#9d!5o&k5RFN*5Cd@~yE?z}kwMZmtU`_AJOez#Z~{3;74gxrCj2r!?;i zTRm>kndPNlBG|CK-r(GH|dWP%xBsXw`$+N3d_&Pq8&P1;JETvUV+whc%)Ix@l&NQb|u{fdFFqsLMH}( zXn$AZ?ivExP~ehC#~R(C2YzgO7@1=ch_aUewUypElL@9JDa24OlNiAab=|-aQQNpB z#q2e!sUaq&3AU+A6#L<;R$4P!xeH24sxGTl!xmAp;IgLAx{(bLNjBy*u#Fd3Jdy*1tm1}8?0 z@ahnJ&W3KuK=#Ky3yY0Bex8$iBj-y=qq!g4wCU|HhSUo3)ygBDZ2bm;^-0q6JHO?p zrsbTeXsHl(iDj9u+r2M>wzt+K+7kSYx`xj@rJV~)%8mLaW(4IMJNZ-hsiDs_b$ud0 zbSu>diBm!5(?@xLmh$!q`_Vk$)s&Ul-j|$tg%DTOrJ-v)tnf+agKJ>~j%cTIe={G# zK)~;Tq=fQr+HvJI9P0H)VXt)SJjZja@nH)PzAtFolXUJ`V}Z+azx1M?g2C6SVS%kh z23TCpB}aTk#;$F5Q0eq5GSB$tO?LF0e2zytaU_=cwS$zyazM`?*T6?53@(btcp8HG z!IwC_jFd*eo4b*j?&z!`LV)$FT`q=4pN-JPNGbPpb-RoJy&Q^(msYQrAtc|eL-BXd z>@a(U{9-}rGJ2sLG6D$RsoAbT0+Ist{JjC%y{$~ey)0oYO=FGVjJe0LD(xqMb9Ri; zN=-ru8M9(6_r5_-7iOn%ITMTc3`budkH1o#kXfaU?2gW>!Rs@8KLtw}Mn9fh$gQ$7 zcCdDMG$%jLK1F-jaoh-KH%MN~sY{bLFoi1ML3QDd$f4jVPj4ubAbgi3&&Qtc+vuHd zi%RO10B#x9&4hXo$_K@<{+{5Z76p2apc7`y+WB2!dZAGv@U1q8knS$GJg6}(kLtsz z%y8YbVf(v1KMzqLrssK`G)%qh#;@?RwC`Qc%19FU>7yK;3YH=CxgI|me?L6*+{J{9 z7Pp*WPVl9Qi61NjTFl$p7h;p4(XkHV+YXBm_cN zb1t#T1&*oqd(S-rVH4rvu>5>qX*SJ8nNlN+%J4@$k`gg&v z?-IP*PeGc7LI!NqJzI5GGdwac`Ck{jlh@zOv%y`5ST?YCZC8bv=7Wu`M4TC%37Vtp zHv3l|2-nSQ0Lic>l!*pj_-hHcu`3L;==l@I?nq@f*tu(Lx{p^)JDb^?!F0O<6E4qs zV*&0B!2qV^-2i+DqX^s_>r_9^dHRpzT7ux3{_CB4gOAB~y%m05AE)PMLhsx54>No0 zb36pOSomPf%1juiUhH#f4oh2&D4eb1^brkZ7%!!j4k#MF=0w6A>omW{77-$NOPT>K z?4jIlyGQu36_K;oqt{K3md)(lzRGbUwE0+>ejaGe@;Tg&FlH8H>pbGx6tcMKuQHQ@ zFG0M1iNa-vq=?$TV5kPboGo?|`83C5Fybr+N z>BJ`tT)-B*4ysrFQ!n^@E?j@r!fzh)@>JAI-09FwT3A^+mU$zW=DrXkLyI_!VjY$M zj~4X;uCBX!t{{JxO50867q9C=NM_wsA?*U0uvfjy_3UmU6<;y$pj9*3{_+>S&<``vxg__L zW~op%6tY|ZRzqUKT~*%(?2%X5Ih7s|Uu7olEAB=FB9ZHmL3Y%*r)J4~*w`;Qj%yXX z-%(Yy!XP+g%hkoxJ#cEt_&;mc9<58^CY^e$CTvD!UAR2pf2}fm1WN7i&2s`w{WB7; z$u1Xm%yU2!cCgchJ(}VwmKFRO-$pO=0I3}Dp{`Fyzp}t8^&n|k0^Z!;jZqBDpZZyX z**m+lNSJnxK!$Amn(Sb|F}q){+{q4=W5C$8reB6vu5@VJ7`Z^?pr~(}kFt&7T+(kL zZD;oNZ9ngnykFyWL950a7w?5#y%YSqis4e#X9oINiE97_0>b^@D#rhmcK*AT@pqZ0 zX<<{YpAfa@MxE$*YfdgZ3Tu6`-lRo~z<+K&P9raX#l?=HU6X4+ghPk@!|^#NzPg3L z)4=Yhw_S`s@pwSKV)Lae%}&wAcBMgwCjTxW)sNi{-#c1bCOrXhRzAl|)iAB+iC7CE z%gXu0zCx=f%Eb!n1cqPUqnqB~I@2bHmIEI$jk5DJ8=5W)7C+;9H*j4-=&u9tz5-t= zVDw0xXpsUdPxR>+@TB+6TMFOg>}EK`+N%MP8Qc#SvJCgF#g5?!>q>77O}NLH*yS<$T|Qc1j5A`9+&|G4T6 z@^9${uSS#Dd`ivx^T7MJ^vvw+oNeu#O`ZNK1^q2P*=Rv{5F%L78liT#Ncw1|{s~)n zgF7HNHA46h1tXp=THW^_kMBQxZ*BQDSkWBpvuH8V^>ZWxgNA*$bqsWmaIO}@@|jfG zNRV6*y=v4&?h{x}RH(-ZYv!2mnY4SP-em)BOfIn2KOiu5eE-d-N?&6B&1c;%79R)* z`G5Jeb+Iurb+oiK|BJ&xO~u#(0mM#dqSa|MY@}IO7N$%Y=FG`+@-vfeB(00@mNFct z6IVKBakax4G}b`{1}dTS0)FAD_hZYGh2_{+_e!rj?rN~}U?(uZXuSz?f-*4V) zo}jz&Zr=`>%pxR~=|O~e-X67Cqbx(SM_e%A0w~*{lDbj$+88i0kB=r@;#xy49UK<7 z_t+@Xtft+yHJ&5bbU!Q&CS^<4OZm1wnrF)CZTktZa$;2rYN5!q+rbX=GH?`H2&f~v z>q%T|-rG0T1mBW3AC69I)>o1j^jFvHO5fXWgA$)75omJ9i8r%@q)iC z=zoEBDSuzPO^KP3)k(?*a5_W`9EVL#HYD4LhXatG?q1)12YPPiH1-D5f%WB~aHcuv z2Qd9Kfj6_RU<}P#>5YbfjuxcwU^Ev0{5crGj7P-)mg^}9tAje4$PTn8S{ynW*bZ7_ zscxlOnP{F>ej9-wk4x?Sd3j`SI$)NKu^dPn(VhULnP>+X^jx4v7;+`VUmS?By}Xv1 zQN$3kfDu#?GmsKi5H*w#S{N~eD7+6*#BfP91W(*n6Uon(@tAbr*z7d0Mqwfb`BDjc zK?b`bo%PLZZe{X27HiUwCHZ7+I;-s_Yw98lm4jLgvN`IzR@Vo@zaNm{G296*Xdob) zuRuTu|NDSAIeS?D&+~hstL>D@iR!zpzkB1g{5#a4>Y+9PZ zY7$&lgi~R~GKvuxoq_U6p19XYDCjXs7Ny5%)k4Inj;CIkb&k7A5X#iv-Osz7>0FBPLS zQX|?cy_xMLYurztT3GG5fH2|hnT(tThx9(#r&`?p2;G)A0mc$$IFJ}(1z!BMG>I`*w;AS)P#IK# z*V7gl)f%5~WC41_PLw^*NDa?i%4rI6wu91$07Ud`U}>DY;lTZkO}1xA`sNUuvd(jE zpy*KfPRW-ye*tYx8Ia<}YFG0;q#kA1b1ke=Wh+FdrAZc7L#v^*3B)_fJ1Nv{rX&0! z2yZyNbyb1ehP~b0cCR_38T0G-nMd~z&HggM!$8`p+rAP20Gt!?TWkp}ZhP>lGtd)h=6 zl2@DO;7NxjYmTGSMQN{nTP@~QMUc$ZwHP+T$?CL(43BwLZYJHP;$oVXynR zh9226xHj_5cMtn_;qJ%)Rm{US0?e$vhp`4u7qd84#*UqE)N7?ZdJULB`XZ( zyU>_G>TI+DVl;|`+j(}yaiX&wcCT30B{0|mfT7nhf~1rd`tr8RHp#e$|KOf!;(ev7 zfpABw&aXysZ8@`Ng{)vE7e^ycxpLWQNCpy9$hfu8YYC)2K7L%eTNAlJZm8deOgmxx zG&{qE-aRE2Xh8gG;IFMVJ#l`(Img)L{&vP;S{OejFN8#|<-YZDTjKmkB0&F<1nV9n zbRMgZ-Qn8oe8>@Z4vm>jZS1_pE>_abh)oe?j-^kNr=TvDzr_xHPkX(^ zK|r|(Uq-XzR2)66x&Axrtq<(Jd3bGl=jU1Oo!z|4)PEIi1v1>T+?ztkZAWhMR2&>>!r10ymt}JANfaiM z#GvC^W|fg}+cT@2A9;{*Ol#ZUzRGOA){A?m!q?+3*#2OSEug7UwRJ}SEwS5J{j{HOf@P&^d$4GKzE!A#0g0HNSYh;zwyZ!t#nz)44FcHmM)B2gqe z^3B5OWJP|K>lIG}*@k2@e?-)ayOfonHKLLtyQR5d3cR6so|?xH>V(SBcQB%fB8_9Y z5#B`po=n_u0J%Irm8T6z*GPr5BYa3&tE>u&U3F7a3O~puU{PKg4l&+#stm=8P;y`* zh9iMdpE&uM)vTN8BVz`4)Ag##GPMNrL`|qzE$s>(aoD~WK(esJ`s6()+oO_Ygv8m1riztskx2{(gdOIyFbltX_-uKQtEX~ zWD(PkAJyO2o*$^WIB2@JHudf~<*Qxm-OLu`1BYbodiMv2@0lpI(x&!>wo>zBw}&%Q zWn{a~w6V=-t7->XlZH=0iq?|4>iBf0qH^wvt|>sO2zT-U&83Vu?cErKS^}qFtX$7! z0|FW;^-)p+W^&&@>aGlZi;M>8W?gYu!#A=loWCm|qsh_SQFxmLRnGP&2vH@f5JaqS zqOQYA*8vJ|&(hI-83!df|kv@aL^%%4QUOc%`RHt8mcW z4+Y1;<#IMa+PwBqWLTie4zlLHb#My{jfAV1lw@9@pS zw%^_56HX`R(b2cuwjrJ0vLZ5wsKfCiG?W{;VGH?jiNk^Z8zDIl*{BIwsSt zslRZHw5h+hZn%8cPWARO7Ot34hho$Jw-gC%0Vu1VPP)TqMEif8m&SHBe>GnI9d2jO z_D1#-B7*Ozf2wkx_nTWH0 zur9P0T@vauIM=CdEr++avhKkrXPGfV|NDfBjVsL}HCQHaGP2Cxz#}~HGp8zX5WL%D zTV^7cfEkUWiC)U?j3YupZU%JlCB~JDfqcS7G$QWPwBw^*Fna7}BjOtL za&U7DwG|K9#WnAMEjs=Ih zeVjbg9Ca0d<7mP>38M>2LRP$zjKt%92QVR62s|q$Y~u*D=MAwto-I4<7=MYHyS@Fq zCpyI=U+L(|qtDVbxYdOIOwDrYqv3)|y8i|wp$#3Fa0p%_TPN+ll>3gwTPrWx4ZEBD z&#F`+YV}3Sf>{{m2+5VSmrC!coE&xOxfBo0B9G*hMQT5T2645i?zmx{dwqW{z7wrY zK_0-+z;bu~8{prv1U8WqGx?O|!lx_|KW*#(WNBz`|CcDUmHuu=|M5suun{5cQSPWq zgt!L;Sw@vb=arNjmWA48Qb#8{-_5Rc52A&D)O6|~rjRD4f%xZs4 zwXMo7j()r;?WW`>V8EIXjndvy)%8mlnX#nH%(x2CMZBf=x#!5h{z#){mu;@y05)$iIQ4$-F zsV?AxD+RnNhnkc2q-ro9%oo|2-<=Ne12=&U`NZec!N)|>q~%}uvSe#J&)IB*FYHW0 z`$KbgwnnkZSVr-qBl(`lG4ANWzNiP?a0(&w&`TvdEJuxQl1qfBXDfpGF_V_%Bc!PD zDGfBw@jYh6P{tT=;V9V69>@nsmt0Ksnp;}U2XTt;uAJ|w&GoVQrZHV2{r0Hl?BvYE zZ!65LwJLla$GcI)hzU61OB?Hws5(#=urA^e%mk~plkVfdEm&6vss0&|iv z1wAu4u2_tDIIbE2o35ClXc_@%9p}TK7IiNCM&EF`3uxzUxf+KuKp}|}r~4m$o_y1n z7SG~9Kw=U1(?VVP+pV#ILh$i+>{U1}AKOF9fm{7|fsnBa+L=T*T756(RNX~?Qwj+5 z3HyRA!Rd$pl&Txy{Q~=Bik+`81xE#w7awP>g3IVmYY9;L%)HWpBZh%P8WL(=!H2B~ z=V2&gFVh1v9$z6oQK0hRON;UL!T&HhW}Qo$q@V#ewtD}@b4z811RhIRhU54F%zK$H z-UkHgNJMcOn*NG82qvyblz=KyStv8>l0=Y9FB&glQQ>U8pnsi?*P+#1KerOeitS#4 z{bA-N-=BXh8KqT0MLWz^(JYk!OlRSoxInE&m1?G$ktmjtvEDfD!CFL?Q9o3`I}qgBWfZ96FQK`dNL1u$dqMDFF{RkZ8kY zw;4|~)MURHv>Ss#CI?k!P5%;ClM^Khv0==K?6RM-F(XmsbNhThIeOY4n?r}r*`=y0ooA<*NF1{qd&hP2;g22zVF<*i7{qk^KonhPi z<6fVie|Z-h_F=viA083HZHB2;9AF8$nNm7E1$FU+Sdt%OKVS%HTnoR1)CJPP5(0V( zB>Nq|A3%=MfbL-ISW4-#(-6_aHDJT9favutk=)c1un{{bv2KeTyEHOLZrQ^N8P{mk z#2mYjF2YP-=bDrfhpPGzaYxN5M1)M3Q)nFQ{5uSj=C~n@SL_QO^fh7-`GBYJgT4Mi zp_@G+f@gWMZu>W**-nT&$q3heb}l6%W(%TO+rV%~XpS9`9)TJ(SPATUn2;LP1A{T1 z!=2XnDORE2z$qYyYOrlnWznK_g<|VY^NR$_JfXB6V>%NIrHs(Vlh(t2!nv~$VSc#w z(P3sK!j%#s1_D)MPTv#=nEreGdms{rDOeYM@(pkEXmfHIoQm-BFD6oB9<@7)Z-m$hvQkUdyje8B{TR?$X9zpJv#pHadJ*5*RiC>%ink*NZfSE0o{0#;NNR>&eO;3t zWi5}!d|J$WA8LDVkMq}IcO>(mPNhgJrVKc6;T{a_D}X>uiF|zIoN+IbHcAmuk^aR( zI9rQO#dWh%Iv3Q-+5WjGu*mnYP)W$4dB$0d;hS!E8l4kOTLp5|1lYt+)o3*BvWldU z$L*5}W#Pq^#)z)uSJmU?WoG{Lz9w1JYAu55YirW|-MWom{Up)dwk~5VG$YQ0Ni&2G zzh&Gf0hTWXR>l-c@}pY=zngwNh^7|Q&}WuDpU%ZHXj8nkUqsYokbgy;U&*x8DYG^8 zCL3fcksGQsw7nrE;!L^EI~cLy!CZ_X3aGz$43xMW-amyOrL4rsF6VRxnp)g_m-Ap-kgO6M+#UDu}=!WendOBB!kN z=}FZChKwJM0){BU+kH*$>skfYrX#&hX`)LZ?uB|96HBG1u;0R)I|1fal*5UNa<;G@ zMjD-B@*#3l!KL*RMb@{i3~-s*&DBbtwV)&y7Dolke;VPi;x@H9YHB=|SIw(;wC>ASpzy_f9B1NinS_^?fo^3swhK z@kdG07a*2)E4i|T+EmzKR7(`8S#e8DTyV#&IW8#7TNwKgXwAtLFu>Df z5x%^{gLKTkg(CTf6GBCcqVz6UtGltqr^4Zl~^WT@o1Pu9-#tfkv!J@G%LV z(S#G(F8<-Hz{$QxVx5rfLXA&N6O@@nulgCpB+fT8db!>m}(cD?A!sS;Mr-7@n02AVV??GH9FCatLHo_!@%b}6X?V2&5?!+wCm9}5InPG122_! z?3%r%m0EGFvQB;wn5YKD$s!$f+%f%)_ZA!M?b8PhJ_zgRu;5GaP$rI3-!;+C%Yw{C z<4cmvOIXIyRWVbBme|{)SNY!e4t$XO8eWmLSb$Zr6*sE?lw=`C_nM9f{SieE^O@X1 z>xaA42v&g5Iv&Eqmgc$G`Cht{o~NY1PjeCn$~%>7eq_rhOTO&D$$07k$iv$z#C!>I zd`=9-v5;D43!pHxxeAECAl9)i*d^mKy!D?Hw??WR45tG$&C878&sgL6KE(` z2+vAiBHZq-lpU6`EyeS){wVulP?Px+Z{b%Yliq7=3!G`7UdNgZ#f2gM5V#W7R?yJ7 z_@lY70?n~=jpc^_ z^e;tTvicn5ttk;Be<8{KB>vt5EK^UKVr_TOgd969Bq;dh_D)Qho#AQ#I)OG+>e7i0 zEErfEr&wys?&6X(lZys$ViY8fK*dDVtCknIE;U6(7ox;Eu>*J5Dq!$D@KbgVlcLEG zH#Ho9Sa+VyW#OZ;wL*9%6Mog|0N-NehIFbPvtoEU32lD5>NKMTL7-RO&3%va@4Mmq zED*1LhA*g4|4J;_I;$8OS^pgiUVIz3Eo4Luee{4Hf1wJEKPreX=Wu0-QhWh|PcsjAm_7&^W_X-VZ^P|Cw&>1mR(cNb+eqMrYvo(am&U&L>Q z8Bj!BB1Dt2!wc|kz@|GB%})k9;8U+5*(PcXPA%r7Y<;9jMfB`nW z5;WDENQEO3tOF4W^;OrB(gUnjx9WZ3YZJSNsq+w!PK^@oQqnh?AJ{|-?BS;&1#|a4 z+L~}%H+rJU;OJal;-Z0)BA1Xvbzb;am=Gnanv!sgUKz4ndV*vaFNI)i5I+njDNR*43WfMAgZDn3d>Iv>Ve1RL?_9Y!dBehW{2zpTi&=w#a18;r!79GZu!gI2Bl}^GU0FjW=oGCUr zk>%-aNL_d`i82G`H8K;kr_UKiTnpuFqq_Ix%_w=fcVg7I%msnivdR#%By{;TEN@ZI zNNmRcKq6#QY_~`kl6)al%fA&D<}ye?Qjan}0#Q~(Hg2>&@7R5~23s93ws5$(CIM@B zwv9+Np_S&e{K-#T+ZmxD6<}oP|4Kmx&tK zH86+q+oJoyfOj=vhNLY0EQ6xejAdQ$0XBmD3*m)Kk!}kRXDpO}UJm7~?X}CWFK1nm zdce`<_^a8>J6+#GAA~6RSFg!@cetqsdBYc0W)-y&W5Cocx5!JU-do35ItUf6HDIMB z@j#j7Fksm)PQ#lK)OR0Z+jhehCv&9Z{AQDz4uM}(I=`GX(r;stcOE{RwFE_SnNf=z zHgAOqC_3vBMgTvjL5CT|SKshxIGqX1e=LoX%l&K2T3o+f9es|~ED!(y^yjCpgRzw( zJ>6gTssw2nU`7~`8YK6v8x$ykQgilF1y_hmcX$#b_VFYza5q;_Q!v>4r-b zuQ!;vg|8I6)3BpLL&cs=OqTU~?&z(^C{(|zd@r~kT(v@+u%ZglI|X7pS<>59B+ypp)g>dJ{31rpMX90;_Z zN(UELV#&L|x3uny`FjEnfS5KBX@n9oOR@(yn{Ye_I!+ceoZa# zp#YrzRx#WSd1~8Quk$bN$BjtxDO1$Y)g6>qpk8R+nh83`YJ{%`Pibp(IT~+aV9TLb zLrK!KfcPu>ZX)T(3>Joy`JH91T2v^LF(qg>j`GZN^yVQk!vjP25dN)*J44a6-q`xf z4Il`U+DO-}tRCsm>AK+=W3u5tC`t_DTTU7aG{b)l+OB(FMz@!t^RZK-b>&%)Ha@|g zNm4kbvA%+M0vlY-0CkWGu#wxMozDzeEG^xqejybnK3(s23)mL*&a*8+^IStmLpD<( zoHVWm5#XqJT13%3yX$~BpEHg%x zmA&X=)}qKpqnDwJKsQAn{Mj0W+n$Ay3Qz|rVw@zZE#m7>_f=X~Z;BXM4h_TGP&&|7 z-t=3Sxn%zJNca4R0IaWoR|m3Xgr>TpMq;cN;~LUW^Qaogy#h-{%f8B<4ZthDO<%e0 z?kfKGH!ibK({@5=is9s-j96hAhVdhX89NfKDE@c?Y?fxd{8Klf86J%-+^doafA=9q&!_ymjl3})^ zUC~dGIFf3_k%o$Ca9Vwcs>iD^z*O-pbX*8#L4z=R!D3KLNFz`{R*XjCl2gbD1Lnt& zNC5uvh=;QAjq@_c`mJ{i5IMl;aA;^Z+d!UAGJCM_7NBFfWULZER>*c%25x8+9wEbN zqrE-Sk{N>eN2}R@Pz;F@pzm_;`7TMdP?^A_4z2Mwo%4Ez@EtTZFiukRtq%%TR}eYr zyWWcBxcH4yd9+{w`5=OxBu$1aJ>D{{alN4Zr#!l5SN<^z43Q$8ltI`C@EgP!D`~=p zI%g8%VB5gQwkmw^OWv8*t_~=!p4nH}O}(`%cq|%Khth@GmN2h;_u$d0f=`#qu6}g# zQS+g>W??iT%1bPm_cdV+EA;b|xn(xMjTkS%F+|S+c>_Otspv6}OIBwGB*Y#V>bY$T z1>@zWz#PtJ;`;5>+-Sz$By2=pu#@T;_3;7JcER(*LJ5}&;p`fdMq*o@HKAUYK}ZMK zLhZ0Kz|D8dZx7LApQ(o?!jKrBP{dTC!$b$XNv!oW88d-=%np&R3k}$Qpk|!v!ZAWa zt$V^fOiP9->#Z+vM;j$B)@630^q5*m6?O$eAZEo!5V|?rVHVZndHy82rs1O$e&6~? zCxH~mT(0B72soTP)|cDYm`E2tYpp9x0Je#lfTL(zUO)SiOY6s~X6LHQ-Ce=(jFn2E zbx0tAW>a)s6*)S9n!Gz>4iGjSG2Wvk`!=2h8v(=Y9SMEJgzjBMM--&o&Nb8Vm?RM! zPz2mmUn~cguZe1JxQl#=SAE|6El(VNyy4QkRobpWbc@=mefvJZ)gOlmFVrp*A19u{ zr)bOOE6151yY*f_ah*mD(OQ3A;hP|dYz9J+Z5Q3^jR;s~Uj~kruSMTwAn=0+O8AV? zNiX7(V&WOIctH*=F9(#S5l#OUV@TLL!3KMoLUNQ(yo5JJskK+=%Gf?QT6Gp%kz#9H z4BE~}v6Q(r>Xk6Q)DLbm5KK4<ZcavnP;jhg$F}U*Chu1cFQ^qs(%cPLKe|i;d(dvS zL`EUVbJ!-q4sQYb%ty}oSkZGiFM)ygA-X#1PQ;D z%y42rgad^I4FGonhL7LL&VOk6BOaxtOh$zFK%eb z*LO_R+B(N|u_$YqZ37YNThrs-v%dBUA5Q~A9CFo+*YtBL2thJ#8qTr;EThq8-rld#u=fa-vcoVuyICnp5Y`G0O=Ny~PsNC4(EunZVp#=9j~zxCq;( zZ!iZ=1zqwpA2<@}U8}7s_5%hKx$XBot#pe;m3bD7YotKq)+i~D%XT^-0fKEIKA`r= zeROCM3!+htwPe&Bd?HSO%8`b6J8kljq~StQV6|l3#I|@ip)Z&3x7Qq%5l!YSK0e$5 zZAex{8*LTn;RYTHc_`FG?h*GdoFOD7!)58X;q zqQ!_WvQQoFQ4V_wbb}^Nd`Xav!?bL+K0m@x1sa+lc_&=HCEg=tU5;7HKLa^cD|XGbQ!qHKC>vq6y%71{YETwjr*W7 zP)K@}XD}Au+c&2vlt@{~qK^;zt-?#f;xRJW=4U|VoYM`B!K%G8i?A|PZV3%FA`v>e zIka_<*v(zz-NNv4eC4T=+iHOZEp8Dl_CiCU!YV};e$l=!H&L4w4Tf5@?&yGYAbW++ zihW<(Lhhr4*LlPK?R)6pZphA<*V+zwHxYB39T-i3!>>vwvo`t=TD(xFnd@_f$x$)1 zM+jiq#Th^9FWEe@f!rRTdowGldAdkgO4x--2o~^8_e|lI~C#Tk{ zW?BMck7=&h)enHF3y|neHXM8h1i2k(MMC#I@dmLYN0Mz$aQnVFH>#Y+JUa(j8vHBI zV-6!Fv{R&e&HOP_^@ob%wAEcInoPRJG^;MMaXC~!{*~`i``hY{)7_28eCWIpBSzdH ziGL~0&z=kt$UWE_TuwGuV zRv5J2ToSk=4OQg0F2{mBg@q>OJmZ(u34i_QvnA3mB6}dQn0D+@93}*1;U7W={(csT zpjFXMvI+b)-U(`?OhpifMXd54IndnFPIp3(w#*6-@LpGn@#k^9ye4QAIjkJwFG{aL z)+L(R&kfF|zev_5-@w?itd08{r1jSf!02n5XAMjUoHPLzoP!wG!sksj#d&nEZsx2W z-H^B(u&T<}k7j*W&f%~xGELg!1@?=f6He7-2eh#~;IPVIX?ayVRZZwhiP}i5yIx_s z6N_-9FYx2z+pB^nXCU!a~;L^X$ z_Xey47$eYoQV+Is-9+b1pLWOc^P#Ka)LKiypzR4ahcqXI|1=IPkz) z!8wvlUSSUZ=mQpI<+;idc0}abQ!m!9b0cq{8}2*K@2ZYz5e6^Gfi?vT z=(7+v%iX%rr^N=@S(-k7h)ceqiFx9NON4DVc1r(VE*Us!)S5(+?ROwh%OAB5+ zRKkW*p9{2e5wic?F3lG}f~huF0W!g96q)8~4?L_;3(*knC!7^0D&WxpIA2xr91?hv z@-r)8@}Fd|wXPddmDb)&P1WdAyUw!`N>Uz$p24FByNh;Zjd*m~rd(R9Jt0+|M&k$f z4Cx_65W>8?YP`=s@^L{C77YEk;#-|RET4@!OX%x2<{&|a?8DzZoaH*p9~8sGD+~dP zDN`a2PT%uX55(bz;4XA{6y503L-HzczlG?RJJ*Hii(pGh3nqU#WYH_1@6hj=S>^7R z+mp^NHs;v0GR3N0tu@0au2wh0I40UM#JE-%n`Ie|G%7s7i&-kd3gMEK!dgV5uq{#btzZG8WFa*BR#Wm40=)1z6?SF1pApzStcuF~SP*ZRc2_$CdTz z9*wNJj~T;0#YKf)i7{ut)<09Z`ML6P9?b2-G^H0r&TB1S=e||A~>%bJ7 zvnB0fQd+OCVDW@i>47&mJVFiVt}XGDMY@w&$3yzZK_ZxLI=6W(Wt<>jwu@;k2l$3j zaMg4Ep@=>w#s=c4b*WzhM^i=Od(iE)-hK2|eAYWVgbk^zp-k}t;

Q#Bl>OQ}?lZ zrc-s@;};>PN-$!t6gqEiZwf8R<69QhTAx-W$bQAhCyP7gQ(Z(+JVvU{3CtUA6bCB_ zP#7)uAa*-K6?rsWPAin_hB!eoAwN|z6QfD`P<7^K+F=2FUX60{fwJU8SzL=yi8MS{ zCUaxVY?e^~F>fXIp(H5vO;da1{O7^d=%Z7TZM?(yLDeL^ahHSY)Gt}E)&l^sON3*d z(2e^gh_#1<$nK~OPlJgc!2jmW&Q*OTAfMV#0|)>B&VPCH|A-0yWY2#K3r+JIGW`T7 zJvXX^N1L-U*^!uQKkAKIH1Pdq=VI0J{F$9?>A$OU?gg`Jv3)qa1jbdj;CtxV9(&nF z`w@-%=gT)=N>gtat#4K8wX5^(5KwmPwENuA&@k%oi?Z-KTq=iZyiCNH37A*TCG-_q zK2t1ISjE%-^cvmp0@Io@IxrvjkZP2kqh42co;N#=?On%l4yL>I$F%^wltb^4IME;h zRGjG3(&J9=n=|Lo0{VCKf>xr4 ztv{pY^?Bj`J9;LzwoW#-PR5RZi4T8=Pde%=91tOlaE-us*9f{O#{LN#IK4XnSQP@e zU^xTsE*kA$9gn{{d~R)c*I7{Q?XqYv&~$Ue0|JM=xwQ1O53#T2L-QGxS&0#y5j<;D zh3?~-Pn4*}32J7U?in?EBz{Tz-xytBu6=-GX!-ox&wkBNH>^*kNC5!=0O`Me+BjPq z7(1BTnEvJApqi%49s|mT#QsOGJ@zaTB7#6U2o~YD6SJ|!ohvX#@1q8GE{98Bwc@2b*&(C-YkXCQcE0WzkkXFGcJw;^O4}nVZB{Vc z2$_Lh;4MJ!1YSmCHWW^*rJx)f^t{I5>v-;Py|rG&pwwa8dG2I^-T^DD8`fi*eJVH0 zzE<8Cuz!j`w<*-`T;pY!=VL$tp&Jo-C&td723>IjFq$iauFvx|!U}_~pZgULYFL7d z@DO`G@5%|72pA`wCDYUBYovcYhzy{q`hU8WQ+P`r{FFUp6+pikGPRHB}ZET@R zNyzwgKY|vp*rxjZQd_WG!=~^4!^kcD*dVj>;87ZWrvHvZ?Y@bEw0E|>e?jKNQ$_K^ zC(jt!3VdOFZVOLjp_lD#W=BM&ESs#+su=WwU>t0DQjq+otIWX8iY=El?()_b>)1)3 zwcg8tUz0OFLJw=F;N%akRAHY#SIFQjZ|lJM`v?%a<}@Q zM8DA1bj;*H@!8Vdx$#_j3b8LaiAkKFn{dgrx@evP8fV0gQX?e)@#`hI6(TP9tCqrg zv%A^1LgMW4l0sttkxag>i|kF}fv)KF$Y0m4Ra=48!EDW*zB3;kI$caJz8&7TcdO)6 zaCe@KO=sOh=-Ka~;gjF^Q`e zR2or>h}j;EI)WU!<1v!ndv2M+)JOF zU+K93H{$8}5ixCo?oC_%=82g{TBg?9`M$Ynm6tj1-PP95*2m^9v(U!n3EX{|_qr0A zndgH5iR8y?HMn1R8+ZfK#NK!y%2v={KGGm6d;xcAvE)$Fz-WJ~M>5L1wTUu=j4aN+0T5A?CRjZi1}%D@WTp07GT&n*%J0I*-|bq65V{1s|ULdDK-! z;1pLD+nR5|^~l2>tD%)jo55NwP0~1O8V#jQKwgnvi6O4j?O_*zxWi$sD{@@cY~S5% zcAGPrF)YT<+`Bu}`^&x_1kg<0_LTqwgK;1v#gx$Cd=ENx0+^&arIdajjv%cwg9%nU zB(_JL&<5`1n`MntKC1GMdY~)k(g0I@hy8{I3F6B-Uw;Q4*48f?(ld@eT}G#naNw9R zNL7tvqYxI3Xf=bB?KMCD3~?DwfUJi@>&K19XqyF61*I3c{R|B`C~xV^5U#K-f#Hzt zvoDrBjryodpb8lROXil}0VY?e*_s7~u3m=< zlhL4-KGtyF8xim!J1`O<{blusM1Z_UOgpdr~rH_ zU~jF~J+Z!kIY(IKezu088t5HAE(C@zH`Y5h6U34H0D8@hKMI%BZ&;i=(F0 z*PgQ8`%EdK?u^4y;S#Edr{zTQX4rtD@iF~N7}>d|(%h`=gknt2OW=r(#=^2%qDP*m zBEWg zm}hYv(~8QlC!LSdNE`m+j0{Kn_^K#eLVA0-Ot3U-kA`u;t+~_r9;*0ZM<3WQUyVd(_L`8p$r7o1O zyGBn}pFy3mup16i)%z z1ZOjSgx8BYmzAJ4qL3iDrnzG9zax8`nnn|7g-Fr0GoT71j$^tK+(bP6NLaTAx;#IX zrSVT!ONFo{ct~8WtO|@-aaBlR$LqoHr#To48aXouxBKKC5Bd=I62O0*3R^n zGJ(D6dQ)beT!en6qEi;)1(X#B+0^L`H|DifXk?3F zvNTjzUHQ>Ur3Rryi^^~xaY1Tsk2QB+Exvi)+gVQsm{?Dj+(ql?+jC%RJM`mBIz%xy z7!oxATez1)w?=MY56t>IAJ>Njnd4i9i1g)nFpn;%b{D@Dkik{5Q+RrW(kQf2NlsJ! z6i^$lgWnW>YH@`_jy3B&h$AR%NLy@ZCnPGbH-f{x0UK&y(&mTjzr4^*7& z)ZLpKI`2$+tBGB8yxNnIId?_Zh|posWcWk^JCIh{ytxK$FRY*?-kgbj;NN3MbI8F8>eebI7wvkU}Vfd}4{m95LU`6{wSk+sd+OsM|QZ!&C=?{}2 z*mWILYGIo8%GYP39#P?Fcm&O9+GgKt)yp1OG<|;6I*ti^1s|_hX9S^FGn&dcj=IK^z^dPdxLw_+t@eno9yA_k_=tJ1Z zUyz%MEgzuQfnGa^C-iVJ*z9k_%wI-OM{sqwx`ECQt+*7v#ZcGT<#|2!Lc&&lS+j;N z!MS2c5yg->F5lmIZjibQQgF8z>VCHU0RJ~(=>R}BNBg9ulED8UEdQcZ*$KTifebJq zx}XO#g05*~Aa@G)pv^q|C<5U^yCZByp07oXR@w{FrRbt5@4nquC9B@8gqbi2pt_M4 z#R%y)SQ=-sO>Vwi`}77&N_FP|%bz-ELXRS*aM12!3!LCQ3n0BRML0@MezqpB6dnwE3HbctfVH2#SbIe@~2^szy)}Ogb2|$Jo*rDjBeR( zKJ>wR*)fCB+}?SCK-06~XQUc33MCi{g_Y(e3KMA#Q10ONAL&+9U)V?5RDZRuJAczm z_3|_nte94XWYzt56!C30_rIIshPKv!?TP=*OS5NsBl-ytz_wLChjNZ5 zNjT#{;Q_K4o?wVYU??6F`SE6HR_!>Sbf1Lj)|X@N<_+ACRns7}3-wi-nCcAHWpYcy z{{6kId+^ywYK*||KE7i8O1(%0h7pXEG_yD05Etysu}TyO_cqyviO|`9TJ3P6m!do4 zkl-s9JsQ{|!}8^`q8hYvFjEN3SG6P9($IPw zQbu2i35JxeMq8ET$D-sQ9cFb=&Q5h(JCndTMf-vyH%co8o$g;hDIz3tegXbF4p=I6 z!?>T>B>JB?d@37q4z_lV^oF($#(%Njq6BHn{?BCkkhtctPe_py$iQRsSkYism~}KENhq%kQK7~1=Zw`J>dHK7 z3n@F?W>(#{TtKWq`U7c;WxZ%4X;IGASH@hBP`KSmjzNZR)kP^cz?S}p<{EOKBOrnz zQ$5QvLJnV{cnL3J&%pe)Q8?xDX69%{kI#ke#!>rC?t%E|`HP zg33-Z+)_Poyt!Mq63;GiM=TM}LYMwdld50UH8s3GKgExl<3x^6paW<)+|r%@>kk45 zXe1+I^cl|~aOMN@Lze1U<@OP(B$0K#Ydbp%}xq~(#!Y%+r8D$o&XQJ9? zD*-l$@08742mwd@+~vgNxd~F&uVd>QI7ZAXl>>WLdT6^b%e__Qwkq3Ly78v8o04PT z0V@Jj3OjRUmoK5DhT_iC<4S}Vapqp<#zSn)6YSCQc6$q&@N^A>UOtoC#DQ~pv3+K0 za53YLZ@P*Xs2iy{XH$MY1}Z3TgQD332au+M!pp^ph%6Su#MVHQU4R8wa=2CYH7DN_ zt3kanUZtm>I_={IZUP$eiO#8ljtC`5%D?btN!NCsvsw#Y*cyfOhvaT=j$)BAkK#o| z@II5F-_e17Q4PG|5J2LllSsB-iX7b_6AM<&mIv`=A}PywibY(Am++*81;3ne2t?V?Y3z)`e_q z3C9zXn9~_(2tDommdU19PuNcT@>mSv<2S4yGTiu1%{>T~&MiU=-;@GWFgQBAGV*Fy zHCcbPsyPIb&J#!RDkefVQ6?X84y6C>`+OY>oFhit05`SMq-JZLHn5P2XqD_(^#Dfs z-QNC^CEKsmtm(_EW5$lT%d*QqQYoXd6B7Ni=gfiz008yV@xOa^oXm`^jp_fsGydiJ zg@&~48XHE}qbkDp_7o$@=E(2Ce3{MS*eo`oc;@NN7>Wh_v*OVOJ<~ZZm<)N?E^7W8 zE*K%GYW}G0=ffaobD7%%=Syrv@{${FTIgOKFP;7DG^m?eGD}bD1yN2LR$gNPZfU{)RCK zDk@JHk0MlAC^h4ph@VU+94BU0;bb+hd!3HkuF+gSyBxuS);R9YQbd|jKUBG)QF5_Alay+fwZH;9XR|2b z&N7J<-JVgrZmx7LgBP7ya03Z9jD^&qQ1zWE94Ow8kd(_KCF3k3xp}OhU^iZPnHI=i zOt6j&3D`|cUA0=#goGQ7jFQ5Cv`Tj|b9(t@-KJl{u4u$mf zWr^)C_Z!lu*B1OOo(~t;xDtO`-{;c{d|#W!d^wU|mj`RA^jlsZ_qu$1OFLLF4|A<} za0uY8(~Pa6z~&$uDWy}BkQdJgCHc{I1Nsn#wQ!4wT|n*3!62sq(%*Rc4|nNj<5VDIG9#R^2?%q5V&4|(;jcl35yPs74z5w&*Bj$L*lvxRWDy7om;|t| z2Hi4N6fRnmE4J!1y@)r@6G-bZq%}fU$OvgXX+7vCm^}*? z$B=^`V!gWzbT;ge+GRX-#R1%$)&shn5ScGDY@CkACfAuRunp-8xS7yW_;>anMvIg% zz$1&7&Zd>$O-rVXfM!BqZ-ylFdub*)Ece^TfuDR{&tK(k4xZ9$ATueUr?TNlo~{LZ zj^Fgu0k^gac*Nwo93Ke4+E;gp>k_@JaIPVJ3dk|a!^u3e?8n>ZJBM&-;n*+CS_%@A zrFSy%b-V^H?+x#&ERju`HMOBf9!hD)z@9#43YvFF)r+YOM%+{b)a@nYq%mwju zvU@2CDDpWdR1mOlo_129PtxvAqjjWit3ZmJ0G&8ijzZNet4JJq+&ZaH6kKR&4DU*Q zQ$AW+V&Y5hYm!E(*1)g6wj$ZvsayZqPaM^4<2=SpJ>o==I8E^IB<1!4*!;D?(vVz1 zc64*#sp;o~aB4vfU1sUa>1+(WCi(mKi}0EZG7FTsF4n&JSwE=o{J6kOJfH} z@}2G1QyUUIHIF(LI*@n4^oLb52y&t8-4hBA5)7*!y55=)#wEew6|G^S*7=wNA5vRft6L#dl(u!l?H zsXSOH<_?95Qaz(wO(~r(*&2RDnD}eB6;|x$D)|e|>jEn_?ZFmB^AwF%E!ONtWsdF9 zXxS1Op`_=~>Uuh=1FJ`;{ zT>`-8q65)>7GxBl|0whwjh&o6cX$4$&{z6gMHyf^uT(*J>FYATsUxynUuZ7`v&9yH7@PMC|LlRgv6|j$2K!= z!_^sKV_SXJ1bl_*hVV>*${-3W!MnyL$9h!V%oa67`|H9Nthwt+038NxeZ9pz1mDv--pqgBMBQ|+oP%X^~{D9tW?sWYv!6pV%eq2D*1tb zq8bD{i)7Sc+xQ9hJtoM@yAKL%5XQlN-iQ35OccAmYoecr8HttJhd7yspp3n%V!8}9 zp|?k;@>kz4!2RU6u!^jO0?dld*iqf*L^B!Mw{!%kk4QS`PjLseANEo$NDf@%Xb2Ze zlKW!&Tj_Rso`M`7^+_xU&t$IYp$)Gz*^)g6!>K!P9`0r##%rL%OF{^?nZz2aKe@j3 zm4Dm?k(O1#4k@Spt=|t(E5zEtFk0YdoVsy8?U-dMy$ZB7d^N=i!5PU*_}iW3vV&6A z#W)_8jt zq@-_P^*0y1NE){(WIzddbcY&$r3{HXEQl*-cVUi{e+7U`(;G$K-wQgt80H`mOiob| zs$!Y#0lNJdI=Vh-NoA*3$irpsX_ByW6J{`=n){-f3Bt!$#AkxxUqn?RK%KJ91MJm+ zMSCWkpA5Rst6IwdNmo^c_7y;Vlq8s1oAIDS09(AulQokc9dv3raI!gp5?d%p3p@nU zLff3e9kf-u>eqxt6PvrS(-44GjRMYMViI)+7U4Ww*lBRV?7g?9I_&0+j&L#<8mFhI zaDcebB?MueC*BnXc*%;oI4px_hBT+nS5oxXLQq!l<5tubb$1rmdAsjum3zQj9Inuo z33`vfK|&3bycGJ1Bf5Jk;WAL>$v2jyw`WgFb~()w%jtX2^nt*cEet&NqX6#)tS?oh z%HBOh4$?zLyLr;p!=#V5LYk22|#WUi(?hxovf;DEPn0`NFgUmrhi z?-8p#sg|n6?-Ez*V^xsL1zR)XV2hm1TgB#KRnGxLZp5GAG(0Rhn1A@32eLYc9r7w6 z$J$`flsTGg7Aaq&r#xQtuibiMpu`qC*z|LjaJ2;fri&Qr)G_7&3xI87)# zy$}+x*n?0hEQU&(x3eczb$coGRc2f`j_uI=}-8dlFDy5Ey+LN{}EXJL}UFy|9_*qN&kWVEe8B);7=O< z+khL{e;)o%QvRojKkJX*Ci-aqJ9z(CF8+l7xy1a2<1zdP{>Oszr-eVK_1_lG|7*eI d^HAIWPV#b+pkROf2jTM#^V#}z&-B-~{{!nCdH?_b literal 0 HcmV?d00001 diff --git a/README.md b/README.md new file mode 100644 index 0000000..9a9560b --- /dev/null +++ b/README.md @@ -0,0 +1,77 @@ +# Conflict Checker + +Cross-discipline **design contradiction** detector for construction drawing sets. +Built for architects to back-check a set (Arch / Struct / Mech / Elec / Plumb / FP / …) +**before** it goes out to a GC for bid. It flags information that *disagrees between +disciplines* — e.g. the RCP ceiling height vs the mechanical duct elevation, a door +schedule count vs the floor plan, a column that lands in a corridor. + +> This is **not** the IronBid scope-ownership conflict checker (who-owns-what for bidding). +> That stays in IronBid; this tool is a separate, design-QA pipeline. + +## How it works (hybrid extract-then-compare) + +``` +PDF -> page images -> per-sheet grounded facts -> cluster by location -> reason -> report + Stage 0 Stage 1 (vision) Stage 2 (no LLM) Stage 3 Stage 4 +``` + +1. **Stage 0** `pdf_processor` — PDF pages to base64 JPEGs (100 DPI, 2400px cap). +2. **Stage 1** `extractor` — one vision call per sheet extracts discrete, **grounded** + assertions (each carries verbatim `source_text` and a `location_key`). A grounding + guard drops any assertion whose number isn't in its own source text. +3. **Stage 2** `clusterer` — deterministic: groups assertions that refer to the same + grid / room / tag across **≥2 disciplines** (or a schedule-vs-plan within one). This + keeps Stage 3 calls small and few. +4. **Stage 3** `conflict_checker` — one reasoning call per cluster (with the relevant + sheet images) decides whether the disciplines genuinely contradict, and classifies it. +5. **Stage 4** `report` — `conflicts.json` + a readable `report.md`. + +The model is **`google/gemini-2.5-pro`** via OpenRouter (configurable). **All prompt +tuning lives in `backend/prompts.py`** — the system prompts, the attribute vocabulary, +and the conflict taxonomy. + +## Setup + +```bash +python3 -m venv .venv && . .venv/bin/activate +pip install -r requirements.txt # needs system poppler-utils for pdf2image +cp backend/.env.example backend/.env # then set AI_API_KEY to your OpenRouter key +``` + +## Run + +CLI (the fast tuning loop — also dumps `assertions.json` / `clusters.json` for inspection): + +```bash +python cli/run_check.py samples/your_set.pdf --out out/your_set +# -> out/your_set/report.md + conflicts.json +``` + +Web UI (upload + view): + +```bash +uvicorn backend.main:app --reload # open http://127.0.0.1:8000 +``` + +## Conflict categories + +`dimensional_disagreement`, `elevation_disagreement`, `location_mismatch`, +`missing_element`, `schedule_vs_plan_mismatch`, `tag_or_reference_inconsistency`, +`spatial_clash`, `note_or_spec_contradiction`. + +## Tuning + +- Edit prompts/vocab/taxonomy in `backend/prompts.py`. +- Inspect `out//assertions.json` to see what Stage 1 extracted, and + `out//clusters.json` to see what got compared. Most false negatives are a + clustering/extraction miss; most false positives are a Stage-3 prompt issue. +- Build a golden set: hand-verify `conflicts.json` for a known set and diff future runs. + +## Known limitations (v1) + +- A location appearing in only **one** discipline never forms a cluster, so pure + "missing element" gaps aren't caught deterministically (Stage 3 still catches missing + counterparts when the location is co-located). +- Stage 3 currently sends **full pages**, not crops. If accuracy/cost needs it, add + crop-by-grid later. diff --git a/backend/.env.example b/backend/.env.example new file mode 100644 index 0000000..705c680 --- /dev/null +++ b/backend/.env.example @@ -0,0 +1,30 @@ +# Copy to backend/.env and fill in your OpenRouter key. + +AI_BASE_URL=https://openrouter.ai/api/v1 +AI_API_KEY=sk-or-... +MODEL=google/gemini-2.5-pro + +# Pipeline tuning +PDF_DPI=100 +MAX_PAGES=60 +MAX_DIMENSION=2400 +LLM_TIMEOUT=180 +EXTRACT_MAX_TOKENS=8192 +REASON_MAX_TOKENS=4096 +EXTRACT_CONCURRENCY=4 +REASON_CONCURRENCY=4 + +# Public URL users reach this server on (used for the link in result emails) +APP_BASE_URL=http://localhost:8099 + +# Email notifications (optional). Leave SMTP_HOST blank to disable. +# Examples: +# Gmail: SMTP_HOST=smtp.gmail.com SMTP_PORT=587 (use an App Password) +# M365: SMTP_HOST=smtp.office365.com SMTP_PORT=587 +SMTP_HOST= +SMTP_PORT=587 +SMTP_USER= +SMTP_PASSWORD= +SMTP_FROM= +SMTP_USE_TLS=true +SMTP_USE_SSL=false diff --git a/backend/.llm_cache/00d67658bc54dd199e63def8eacc0518ecc59111fe6a62718717a87ebafaec13.json b/backend/.llm_cache/00d67658bc54dd199e63def8eacc0518ecc59111fe6a62718717a87ebafaec13.json new file mode 100644 index 0000000..8518173 --- /dev/null +++ b/backend/.llm_cache/00d67658bc54dd199e63def8eacc0518ecc59111fe6a62718717a87ebafaec13.json @@ -0,0 +1 @@ +{"issues": [{"issue_id": "QAQC-MS-001", "source_stage": "qaqc", "category": "missing_sheet", "severity": "critical", "confidence": "high", "location": "Entire Drawing Set", "disciplines": ["Structural"], "sheets": [], "description": "The entire Structural (S) series of drawings is missing from the set. Structural plans and details are fundamental for any scope involving new construction or modifications, including supporting new rooftop equipment. Notes on other disciplines' drawings (e.g., E05.02, M03.01) explicitly call for coordination with a structural engineer, but no structural information is provided. This omission makes the set incomplete for bidding, permitting, and construction.", "evidence": [{"discipline": "Electrical", "sheet": "E05.02", "source_text": "VERIFY SUPPORT SIZING AND DESIGNED WITH PROJECT STRUCTURAL ENGINEER PRIOR TO ASSEMBLY.", "asserted_value": "Coordination with structural engineer required"}, {"discipline": "Mechanical", "sheet": "M03.01", "source_text": "ANGLE IRON FRAME ALL AROUND ROOF OPENING RE: STRUCTURAL.", "asserted_value": "Coordination with structural drawings required"}], "recommended_resolution": "Provide the complete Structural drawing set (foundation plans, framing plans, details, general notes) as required for the project scope.", "code_reference": null}, {"issue_id": "QAQC-MS-002", "source_stage": "qaqc", "category": "missing_sheet", "severity": "critical", "confidence": "high", "location": "Architectural Series", "disciplines": ["Architectural"], "sheets": [], "description": "An Architectural Floor Plan, presumed to be numbered A21.01, is missing. The sheet index jumps from General sheets to A22.01 (Reflected Ceiling Plan). A dimensioned floor plan showing partition layout is the primary drawing for a build-out and is essential for all other disciplines to coordinate with. The 'missing_expected_sheets' report notes this logical gap and a failed extraction for the page where it should be.", "evidence": [{"discipline": "Architectural", "sheet": "sheet_index", "source_text": "Missing expected sheet A21.01 based on numbering sequence before A22.01", "asserted_value": "Missing Architectural Floor Plan"}], "recommended_resolution": "Provide the missing main Architectural Floor Plan sheet (A21.01).", "code_reference": null}, {"issue_id": "QAQC-MS-003", "source_stage": "qaqc", "category": "missing_sheet", "severity": "high", "confidence": "high", "location": "Mechanical Series", "disciplines": ["Mechanical"], "sheets": ["M01.01", "M02.02"], "description": "A Mechanical floor plan, presumed to be numbered M02.01, is missing. The drawing set jumps from Mechanical schedules (M01.01) to the Mechanical Roof Plan (M02.02) without providing a plan for the interior ductwork, diffusers, and thermostats. This plan is necessary to understand the HVAC system layout within the tenant space.", "evidence": [{"discipline": "Mechanical", "sheet": "sheet_index", "source_text": "Missing expected sheet M02.01 based on numbering sequence before M02.02", "asserted_value": "Missing Mechanical Floor Plan"}], "recommended_resolution": "Provide the missing Mechanical Floor Plan sheet (M02.01) showing the HVAC layout for the tenant space.", "code_reference": null}, {"issue_id": "QAQC-MS-004", "source_stage": "qaqc", "category": "missing_sheet", "severity": "high", "confidence": "high", "location": "Life Safety", "disciplines": ["Electrical", "Fire Protection"], "sheets": ["E04.01", "A22.01"], "description": "A comprehensive Fire Alarm plan is not provided. While sheet A22.01 shows some notification appliances (strobes), the set lacks a dedicated plan showing the full system, including the Fire Alarm Control Panel (FACP), pull stations, smoke/heat detectors, duct detectors, and associated wiring/riser diagrams as required by NFPA 72. Sheet E04.01 covers 'Special Systems' but appears to focus on data cabling, not life safety. This is a critical omission for life safety review and permit.", "evidence": [{"discipline": "Technology / Low Voltage", "sheet": "E04.01", "source_text": "(2) CAT.6/18\"", "asserted_value": "Sheet E04.01 shows data outlets, not a complete fire alarm system."}, {"discipline": "General", "sheet": "G11.03", "source_text": "TENANT IS REQUIRED TO USE LANDLORD'S FIRE ALARM MONITORING COMPANY TO CONNECT TENANT'S SYSTEM TO LANDLORD'S FIRE ALARM PANEL.", "asserted_value": "A tenant fire alarm system is explicitly required."}], "recommended_resolution": "Provide a complete Fire Alarm plan compliant with NFPA 72 and local AHJ requirements. This may be a separate 'FA' series sheet or integrated into the Electrical 'E' sheets.", "code_reference": "NFPA 72"}, {"issue_id": "QAQC-MSCH-001", "source_stage": "qaqc", "category": "missing_schedule", "severity": "high", "confidence": "high", "location": "Architectural Series", "disciplines": ["Architectural"], "sheets": ["G11.01", "G31.06"], "description": "A Partition Type Legend or Schedule is missing. General Note 25.D on G11.01 bases dimensions 'to the face of sheathing of partition type as scheduled,' but no such schedule exists. Without it, contractors cannot determine the construction, thickness, fire-rating, or acoustic rating of the various walls, making bidding inaccurate and construction impossible. A UL assembly detail like U419 is not a substitute for a project-specific partition schedule referenced on the plans.", "evidence": [{"discipline": "General", "sheet": "G11.01", "source_text": "Dimensions shown on drawings shall be to the face of sheathing of partition type as scheduled, unless otherwise noted.", "asserted_value": "Reference to a partition schedule that does not exist."}], "recommended_resolution": "Provide a Partition Type Legend/Schedule on the architectural drawings, with types clearly tagged on the floor plans. This schedule should define the full assembly (studs, gypsum board layers, insulation, etc.) and ratings (Fire, STC) for each wall type.", "code_reference": null}, {"issue_id": "QAQC-MSCH-002", "source_stage": "qaqc", "category": "missing_schedule", "severity": "critical", "confidence": "high", "location": "Architectural Series", "disciplines": ["Architectural"], "sheets": [], "description": "A Door and Hardware Schedule is missing from the drawing set. There are no door tags on the plans and no schedule defining the type, size, material, fire rating of doors/frames, and the required hardware group for each opening. This information is essential for procurement, cost estimating, and ensuring life safety/egress compliance.", "evidence": [{"discipline": "Architectural", "sheet": "sheet_index", "source_text": "No sheet titled 'Door Schedule' or similar exists.", "asserted_value": "Absence of door schedule sheet"}, {"discipline": "General", "sheet": "G31.04", "source_text": "SECTION 08 11 13 - HOLLOW METAL DOORS AND FRAMES", "asserted_value": "Specification for doors is provided, but with no schedule to indicate which doors or where."}], "recommended_resolution": "Provide a comprehensive Door and Hardware Schedule. Add door tags to all openings on the floor plans to correlate with the schedule. Provide a hardware group schedule or specification Section 08 71 00.", "code_reference": null}, {"issue_id": "QAQC-INFO-001", "source_stage": "qaqc", "category": "missing_information", "severity": "high", "confidence": "high", "location": "A22.01 - REFLECTED CEILING PLAN", "disciplines": ["Architectural", "Mechanical", "Electrical", "Plumbing"], "sheets": ["A22.01", "G11.01"], "description": "Finished ceiling heights are not indicated on the Reflected Ceiling Plan (A22.01) or anywhere else in the set, despite a general note on G11.01 stating that they are. This is critical missing information required by all trades for locating overhead elements like ductwork, piping, conduit, and light fixtures, as well as for constructing partitions.", "evidence": [{"discipline": "General", "sheet": "G11.01", "source_text": "24. CEILING HEIGHTS ARE INDICATED FROM THE FLOOR ELEVATION TO THE FACE OF THE SUSPENDED CEILING SYSTEM OR FACE OF FINISH MATERIAL AS SCHEDULED.", "asserted_value": "Note implies ceiling heights are documented, but they are not."}, {"discipline": "Architectural", "sheet": "A22.01", "source_text": "(no source text for absence)", "asserted_value": "No ceiling height tags are present on the plan."}], "recommended_resolution": "Add ceiling height dimensions or tags (e.g., 9'-0\" AFF) for all rooms and areas on the Reflected Ceiling Plan (A22.01).", "code_reference": null}, {"issue_id": "QAQC-MD-001", "source_stage": "qaqc", "category": "missing_detail", "severity": "medium", "confidence": "high", "location": "A24.01 - FURNITURE/ POWER/ DATA FLOOR PLAN", "disciplines": ["Architectural"], "sheets": ["A24.01"], "description": "Sheet A24.01 contains a note calling out detail '3/A92.01' for a foundation pour back detail where the existing slab is cut. Sheet A92.01 is not included in the drawing set, leaving this construction detail completely undefined. This is necessary information for the contractor.", "evidence": [{"discipline": "Architectural", "sheet": "A24.01", "source_text": "G. REFER TO DETAIL 3/A92.01 FOR FOUNDATION POUR BACK DETAIL WHERE EXISTING SLAB IS CUT.", "asserted_value": "3/A92.01"}], "recommended_resolution": "Provide sheet A92.01 with the referenced detail, or re-reference the callout to an existing detail that provides the required information.", "code_reference": null}, {"issue_id": "QAQC-CLAR-001", "source_stage": "qaqc", "category": "clarity", "severity": "medium", "confidence": "high", "location": "A51.01 / TYPICAL RESTROOM LAVATORY DETAIL", "disciplines": ["Architectural", "Plumbing"], "sheets": ["A51.01"], "description": "The typical restroom lavatory detail on sheet A51.01 contains contradictory accessibility clearance information. It has two notes for toe clearance under the sink: '9\" MIN. TOE CLEAR' and '6\" MAX. TOE CLEAR'. These notes are mutually exclusive and create confusion regarding ADA compliance. A single, correct requirement must be specified.", "evidence": [{"discipline": "Architectural", "sheet": "A51.01", "source_text": "9\" MIN. TOE CLEAR", "asserted_value": "9\" MIN"}, {"discipline": "Architectural", "sheet": "A51.01", "source_text": "6\" MAX. TOE CLEAR", "asserted_value": "6\" MAX"}], "recommended_resolution": "Review accessibility standards (e.g., 2012 TAS) and correct the detail on A51.01 to show the single, valid requirement for toe clearance.", "code_reference": "2012 Texas Accessibility Standards"}]} \ No newline at end of file diff --git a/backend/.llm_cache/0165e136ff5f1871e77f7548142a2baa3d31f05d6f5fb18b3e24f744ff79d5ed.json b/backend/.llm_cache/0165e136ff5f1871e77f7548142a2baa3d31f05d6f5fb18b3e24f744ff79d5ed.json new file mode 100644 index 0000000..42c54cf --- /dev/null +++ b/backend/.llm_cache/0165e136ff5f1871e77f7548142a2baa3d31f05d6f5fb18b3e24f744ff79d5ed.json @@ -0,0 +1 @@ +[{"assertion_id": "G21.01#9", "attribute": "general_note", "value": "2018 INTERNATIONAL BUILDING CODE (IBC) CH. 2-10 WITH HARRIS COUNTY AMENDMENTS", "source_text": "2018 INTERNATIONAL BUILDING CODE (IBC) CH. 2-10 WITH HARRIS COUNTY AMENDMENTS", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a specific code reference and is already in a standard format.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G21.01#10", "attribute": "general_note", "value": "2021 INTERNATIONAL FIRE CODE (IFC) WITH HARRIS COUNTY AMENDMENTS", "source_text": "2021 INTERNATIONAL FIRE CODE (IFC) WITH HARRIS COUNTY AMENDMENTS", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a specific code reference and is already in a standard format.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G21.01#11", "attribute": "general_note", "value": "2021 STATE OF TEXAS ADOPTED INTERNATIONAL MECHANICAL CODE (IMC)", "source_text": "2021 STATE OF TEXAS ADOPTED INTERNATIONAL MECHANICAL CODE (IMC)", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a specific code reference and is already in a standard format.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G21.01#12", "attribute": "general_note", "value": "2018 STATE OF TEXAS ADOPTED INTERNATIONAL PLUMBING CODE (IPC)", "source_text": "2018 STATE OF TEXAS ADOPTED INTERNATIONAL PLUMBING CODE (IPC)", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a specific code reference and is already in a standard format.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G21.01#13", "attribute": "general_note", "value": "2023 STATE OF TEXAS ADOPTED 2014 NFPA 70 NATIONAL ELECTRICAL CODE (NEC)", "source_text": "2023 STATE OF TEXAS ADOPTED 2014 NFPA 70 NATIONAL ELECTRICAL CODE (NEC)", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a specific code reference and is already in a standard format.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G21.01#14", "attribute": "general_note", "value": "2012 TEXAS ACCESSIBILITY STANDARDS", "source_text": "2012 TEXAS ACCESSIBILITY STANDARDS", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a specific standard reference and is already in a standard format.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G21.01#15", "attribute": "general_note", "value": "PROJECT IS A TENANT INTERIOR REMODEL OF 3,323 SF", "source_text": "PROJECT IS A TENANT INTERIOR REMODEL OF 3,323 SF", "normalized_value": "3323", "normalized_unit": "square feet", "normalized_attribute": "area", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G21.01#16", "attribute": "general_note", "value": "THE BUILDING IS FULLY SPRINKLERED", "source_text": "THE BUILDING IS FULLY SPRINKLERED.", "normalized_value": "true", "normalized_unit": null, "normalized_attribute": "fully_sprinklered", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.01#0", "attribute": "administration", "value": "Ten (10) copies required for submittal.", "source_text": "NUMBER OF COPIES FOR SUBMITTAL - TEN (10).", "normalized_value": "10", "normalized_unit": "copies", "normalized_attribute": "submittal_copy_count", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.01#1", "attribute": "administration", "value": "In case of discrepancies, the contractor shall provide the better quality or greater quantity of work at no additional cost.", "source_text": "WHERE DISCREPANCIES EXIST WITHIN THE CONTRACT DOCUMENTS, THE PROSPECTIVE BIDDER OR CONTRACTOR SHALL PROVIDE THE BETTER QUALITY OR GREATER QUANTITY OF WORK INVOLVED, NO ADDITIONAL COST TO OWNER.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive clause.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.01#2", "attribute": "administration", "value": "One electronic copy in PDF format required for submittal.", "source_text": "ELECTRONIC DOCUMENTS: SUBMIT ONE ELECTRONIC COPY IN PDF FORMAT.", "normalized_value": "1", "normalized_unit": "copy", "normalized_attribute": "electronic_submittal_copy_count", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.01#3", "attribute": "administration", "value": "Architect review time for submittals is 7 calendar days.", "source_text": "REVIEW TIME: ARCHITECT WILL RESPOND AND RETURN SUBMITTALS TO CONTRACTOR WITHIN SEVEN (7) CALENDAR DAYS OF RECEIPT.", "normalized_value": "7", "normalized_unit": "calendar days", "normalized_attribute": "review_time", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.01#4", "attribute": "administration", "value": "Add an additional seven (7) calendar days for sequential review by consultants or owner.", "source_text": "FOR SEQUENTIAL REVIEW INVOLVING THE ARCHITECT'S CONSULTANT, OWNER OR ANOTHER REVIEWER, ALLOW AN ADDITIONAL SEVEN (7) CALENDARS DAYS.", "normalized_value": "7", "normalized_unit": "calendar days", "normalized_attribute": "additional_review_time", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.02#0", "attribute": "owner_occupancy", "value": "Conduct selective demolition so Owner's operations are not disrupted.", "source_text": "OWNER WILL OCCUPY PORTIONS OF BUILDING IMMEDIATELY ADJACENT TO SELECTIVE DEMOLITION AREA. CONDUCT SELECTIVE DEMOLITION SO OWNER'S OPERATIONS ARE NOT DISRUPTED.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive requirement.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.02#1", "attribute": "notification_requirement", "value": "A report on the presence of hazardous materials is on file for review and use.", "source_text": "HAZARDOUS MATERIALS PRESENT IN BUILDINGS AND STRUCTURES TO BE SELECTIVELY DEMOLISHED. A REPORT ON THE PRESENCE OF HAZARDOUS MATERIALS IS ON FILE FOR REVIEW AND USE. EXAMINE REPORT AND BECOME AWARE OF LOCATIONS WHERE HAZARDOUS MATERIALS ARE PRESENT.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive requirement.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.02#2", "attribute": "technician_qualification", "value": "Refrigerant Recovery Technician must be certified by an EPA-approved certification program.", "source_text": "REFRIGERANT RECOVERY TECHNICIAN QUALIFICATIONS: CERTIFIED BY AN EPA-APPROVED CERTIFICATION PROGRAM.", "normalized_value": "EPA-approved certification program", "normalized_unit": null, "normalized_attribute": "certification", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.02#3", "attribute": "code_compliance", "value": "Comply with ASSE A10.6 and NFPA 241.", "source_text": "STANDARDS: COMPLY WITH ASSE A10.6 AND NFPA 241.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a list of standards and is already in a standard format.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.02#4", "attribute": "system_extension", "value": "Provide extensions to existing utilities including plumbing, fire protection, electrical, and telecommunications.", "source_text": "PROVIDE EXTENSIONS TO EXISTING UTILITIES, AS REQUIRED BY PRODUCTS AND SYSTEMS TO BE INSTALLED, INCLUDING PLUMBING, FIRE PROTECTION, ELECTRICAL, AND TELECOMMUNICATIONS.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive requirement.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.02#5", "attribute": "firestopping_requirement", "value": "Seal voids at penetrations of fire-rated construction with fire rated material in accordance with Section 07 8400.", "source_text": "AT PENETRATIONS OF FIRE-RATED WALLS, PARTITIONS, OR FLOOR CONSTRUCTION, COMPLETELY SEAL VOIDS WITH FIRE RATED MATERIAL IN ACCORDANCE WITH SECTION 07 8400, TO FULL THICKNESS OF THE PENETRATED ELEMENT.", "normalized_value": "07 8400", "normalized_unit": null, "normalized_attribute": "related_section", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.02#6", "attribute": "related_section", "value": "01 3300", "source_text": "SECTION 01 3300 - ADMINISTRATIVE REQUIREMENTS: SUBMITTALS PROCEDURES; SHOP DRAWINGS, PRODUCT DATA, AND SAMPLES.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is already in standard CSI MasterFormat.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.02#7", "attribute": "related_section", "value": "01 7000", "source_text": "SECTION 01 7000 - EXECUTION AND CLOSEOUT REQUIREMENTS: CONTRACT CLOSEOUT PROCEDURES.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is already in standard CSI MasterFormat.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.02#8", "attribute": "as-built_requirement", "value": "Record measured depths of foundations in relation to finish first floor datum.", "source_text": "MEASURED DEPTHS OF FOUNDATIONS IN RELATION TO FINISH FIRST FLOOR DATUM.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive requirement.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.02#9", "attribute": "as-built_requirement", "value": "Record measured horizontal and vertical locations of underground utilities and appurtenances.", "source_text": "MEASURED HORIZONTAL AND VERTICAL LOCATIONS OF UNDERGROUND UTILITIES AND APPURTENANCES, REFERENCED TO PERMANENT SURFACE IMPROVEMENTS.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive requirement.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.02#10", "attribute": "as-built_requirement", "value": "Record measured locations of internal utilities and appurtenances concealed in construction.", "source_text": "MEASURED LOCATIONS OF INTERNAL UTILITIES AND APPURTENANCES CONCEALED IN CONSTRUCTION, REFERENCED TO VISIBLE AND ACCESSIBLE FEATURES OF THE WORK.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive requirement.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.02#11", "attribute": "binder_size", "value": "1-1/2 inch, 2 inch maximum", "source_text": "PROVIDE COMMERCIAL QUALITY 1-1/2 INCH, THREE D RING BINDERS WITH DURABLE PLASTIC COVERS; 2-INCH MAXIMUM RING SIZE. WHEN MULTIPLE BINDERS ARE USED, CORRELATE DATA INTO RELATED CONSISTENT GROUPINGS.", "normalized_value": "1.5", "normalized_unit": "inches", "normalized_attribute": "binder_ring_size", "normalization_notes": "Source also specifies a maximum ring size of 2 inches.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G31.03#0", "attribute": "general_note", "value": "Owner will occupy adjacent spaces during construction.", "source_text": "OWNER WILL OCCUPY ADJACENT SPACES DURING CONSTRUCTION.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive statement.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.03#1", "attribute": "installer_qualification", "value": "Minimum of five years experience with related thin masonry installations.", "source_text": "INSTALLER QUALIFICATIONS: PROOF OF A MINIMUM OF FIVE YEARS EXPERIENCE WITH RELATED THIN MASONRY INSTALLATIONS.", "normalized_value": "5", "normalized_unit": "years", "normalized_attribute": "minimum_experience", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.03#2", "attribute": "performance_testing", "value": "Test reports shall indicate 24-hour cold water absorption, 5-hour boil absorption, saturation coefficient, initial rate of absorption, and efflorescence.", "source_text": "THIN BRICK TEST REPORTS SHALL INDICATE: 1. 24-HOUR COLD WATER ABSORPTION, 2. 5-HOUR BOIL ABSORPTION, 3. SATURATION COEFFICIENT, 4. INITIAL RATE OF ABSORPTION, AND 5. EFFLORESCENCE.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a list of required tests.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.03#3", "attribute": "mockup_size", "value": "48\" LONG BY 48\"", "source_text": "BUILD MOCKUP PANELS FOR EACH TYPE OF EXPOSED THIN BRICK AND MORTAR COLOR AND CONSTRUCTION IN SIZES APPROXIMATELY 48\" (1200 MM) LONG BY 48\" (1200 MM).", "normalized_value": "48\" x 48\"", "normalized_unit": null, "normalized_attribute": "dimensions", "normalization_notes": "Source text also provides metric equivalent: 1200 mm.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.03#4", "attribute": "deflection_limit", "value": "L/360", "source_text": "SUBSTRATE SYSTEM DESIGNED WITH A WALL DEFLECTION NOT GREATER THAN L/360.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a standard engineering ratio.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.03#5", "attribute": "installer_qualification", "value": "Minimum of 3 years experience in high quality non ferrous ornamental metal work.", "source_text": "FABRICATOR QUALIFICATIONS: MINIMUM OF 3 YEARS EXPERIENCE IN HIGH QUALITY NON FERROUS ORNAMENTAL METAL WORK OF THE TYPE AND SCOPE SPECIFIED.", "normalized_value": "3", "normalized_unit": "years", "normalized_attribute": "minimum_experience", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.03#6", "attribute": "material_standard", "value": "ASTM B221", "source_text": "ALUMINUM: EXTRUSIONS: ASTM B221.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is already in standard format.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.03#7", "attribute": "material_standard", "value": "ASTM A1008", "source_text": "STEEL: SHEET: ASTM A1008.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is already in standard format.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.03#8", "attribute": "general_note", "value": "Coordinate with foundation of wall panels, ceiling panels and trim specified in Section 064000.", "source_text": "COORDINATE WITH FOUNDATION OF WALL PANELS, CEILING PANELS AND TRIM SPECIFIED IN SECTION 064000.", "normalized_value": "064000", "normalized_unit": null, "normalized_attribute": "related_section", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.03#9", "attribute": "coating_system", "value": "Shop applied polyester or fluoropolymer powder coat finish system with added inhibitors for exterior locations.", "source_text": "FINISHES: 1. POWDER COAT: SHOP APPLIED POLYESTER OR FLUOROPOLYMER POWDER COAT FINISH SYSTEM WITH ADDED INHIBITORS FOR EXTERIOR LOCATIONS, CUSTOM COLOR OR AS INDICATED ON THE DRAWINGS.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive requirement.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#0", "attribute": "reference_standard", "value": "North American Architectural Woodwork Standards (NAAWS), current edition", "source_text": "REFERENCES: MINIMUM STANDARDS FOR WORK IN THIS SECTION SHALL BE IN CONFORMITY WITH THE NORTH AMERICAN ARCHITECTURAL WOODWORK STANDARDS (NAAWS), CURRENT EDITION.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is already in a standard format.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#1", "attribute": "material_specification", "value": "Use fire-retardant treated MDF core for panel fabrication unless indicated otherwise.", "source_text": "FIRE RETARDANT TREATED MDF CORE FOR PANEL FABRICATION UNLESS INDICATED OTHERWISE.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive requirement.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#2", "attribute": "installation_tolerance", "value": "1/16", "source_text": "MAXIMUM VARIATION FROM TRUE POSITION: 1/16 INCH UNLESS OTHERWISE SPECIFIED.", "normalized_value": "0.0625", "normalized_unit": "inches", "normalized_attribute": "positional_tolerance", "normalization_notes": "Source text specifies units as inches.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#3", "attribute": "installation_tolerance", "value": "1/32", "source_text": "MAXIMUM VARIATION FROM TRUE ALIGNMENT WITH ABUTTING MATERIALS: 1/32 INCH UNLESS OTHERWISE SPECIFIED OR REQUIRED BY NAWWS GRADE.", "normalized_value": "0.03125", "normalized_unit": "inches", "normalized_attribute": "alignment_tolerance", "normalization_notes": "Source text specifies units as inches.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#4", "attribute": "warranty_duration", "value": "10", "source_text": "WARRANTY: PROVIDE MANUFACTURER'S 10 YEAR WARRANTY AGAINST DEFECTS IN MATERIALS AND WORKMANSHIP.", "normalized_value": "10", "normalized_unit": "years", "normalized_attribute": null, "normalization_notes": "Source text specifies units as years.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#5", "attribute": "installation_tolerance", "value": "1/8 inch in 10 feet, noncumulative", "source_text": "MAXIMUM VARIATION FROM LEVEL AND PLUMB: 1/8 INCH IN 10 FEET, NONCUMULATIVE.", "normalized_value": "0.125", "normalized_unit": "inches per 10 feet", "normalized_attribute": "level_and_plumb_tolerance", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#6", "attribute": "installation_tolerance", "value": "plus or minus 1/16", "source_text": "MAXIMUM JOINT WIDTH BETWEEN ADJACENT PIECES AT JOINT: PLUS OR MINUS 1/16.", "normalized_value": "+/- 0.0625", "normalized_unit": "inches", "normalized_attribute": "joint_width_tolerance", "normalization_notes": "Unit of 'inches' is inferred from context of surrounding tolerances.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G31.04#7", "attribute": "testing_standard", "value": "ASTM E119 or UL 263", "source_text": "FIRESTOPPING: TESTED IN ACCORDANCE WITH ASTM E119 OR UL 263 TO MEET THE HOURLY F-RATINGS OF THE CONSTRUCTION BEING PENETRATED.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a list of standards and is already in a standard format.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#8", "attribute": "listing_requirement", "value": "UL Assemblies", "source_text": "EXCEPT WHERE OTHER RATED ASSEMBLIES ARE REQUIRED BY THE CODE AUTHORITY, FIRESTOPPING SYSTEMS SHALL BE UL ASSEMBLIES.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is already in a standard format.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#9", "attribute": "VOC_content", "value": "250", "source_text": "VOLATILE ORGANIC COMPOUND (VOC) CONTENT: SEALANTS SHALL MEET THE REQUIREMENTS OF SCAQMD RULE 1168; (MAX VOC CONTENT 250 GRAMS/LITER).", "normalized_value": "250", "normalized_unit": "g/L", "normalized_attribute": "max_voc_content", "normalization_notes": "Source text specifies units as grams/liter.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#10", "attribute": "fire_rating", "value": "90", "source_text": "WHERE REQUIRED, INSTALLED FRAME AND DOOR ASSEMBLY SHALL CONFORM TO A 90 MINUTE RATED CLASS C INDICATED.", "normalized_value": "90", "normalized_unit": "minutes", "normalized_attribute": null, "normalization_notes": "Source text specifies units as minutes.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#11", "attribute": "fire_rating", "value": "1-hour", "source_text": "INCLUDE 1-HOUR LABEL ON FIRE RATED DOOR ASSEMBLIES LOCATED AT 1 HOUR RATED EXIT CORRIDORS.", "normalized_value": "60", "normalized_unit": "minutes", "normalized_attribute": null, "normalization_notes": "Converted 1 hour to 60 minutes for consistency.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#12", "attribute": "face_sheet_thickness", "value": "18", "source_text": "ANSI A250.8, SEAMLESS, MINIMUM 18 GAGE FACE SHEETS.", "normalized_value": "18", "normalized_unit": "gage", "normalized_attribute": null, "normalization_notes": "Source text specifies units as gage.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#13", "attribute": "hinge_reinforcement_thickness", "value": "7", "source_text": "HINGE REINFORCEMENTS FOR FULL MORTISE HINGES: MINIMUM 7 GAGE.", "normalized_value": "7", "normalized_unit": "gage", "normalized_attribute": null, "normalization_notes": "Source text specifies units as gage.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#14", "attribute": "lock_reinforcement_thickness", "value": "16", "source_text": "LOCK REINFORCEMENTS: MINIMUM 16 GAGE.", "normalized_value": "16", "normalized_unit": "gage", "normalized_attribute": null, "normalization_notes": "Source text specifies units as gage.", "source_text_preserved": true, "normalization_confidence": "high"}] \ No newline at end of file diff --git a/backend/.llm_cache/024a38eeb18d89221ead5a42371e952db1c8a5ea7db4a98319a6fb39b52fee07.json b/backend/.llm_cache/024a38eeb18d89221ead5a42371e952db1c8a5ea7db4a98319a6fb39b52fee07.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/024a38eeb18d89221ead5a42371e952db1c8a5ea7db4a98319a6fb39b52fee07.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/075c8fd8a9097e3c6081f3eb1ffebd99621821fa732daa8e007d4c469440c772.json b/backend/.llm_cache/075c8fd8a9097e3c6081f3eb1ffebd99621821fa732daa8e007d4c469440c772.json new file mode 100644 index 0000000..9d1c153 --- /dev/null +++ b/backend/.llm_cache/075c8fd8a9097e3c6081f3eb1ffebd99621821fa732daa8e007d4c469440c772.json @@ -0,0 +1 @@ +{"sheet_number": "A22.01", "discipline": "Architectural", "sheet_title": "REFLECTED CEILING PLAN", "level": null, "scale": "1/4\" = 1'-0\"", "assertions": [{"assertion_id": "A2201-GN-001", "subject": "Fire Alarm Strobe", "category": "fire_alarm", "attribute": "mounting_height_AFF", "value": "80", "unit": "in", "location_key": {"sheet_number": "A22.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "ALL WALL STROBES SHALL BE LOCATED @ +80\" AFF", "coordination_targets": ["electrical", "fire_alarm", "code", "ada"], "conflict_potential": "medium", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "A2201-GN-002", "subject": "Fire Alarm Strobe", "category": "fire_alarm", "attribute": "device_location", "value": "centered in ceiling tile", "unit": null, "location_key": {"sheet_number": "A22.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "ALL CEILING STROBES TO BE CENTERED IN CEILING TILE.", "coordination_targets": ["electrical", "fire_alarm", "architectural"], "conflict_potential": "low", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "A2201-GN-003", "subject": "Fire Alarm Strobe", "category": "fire_alarm", "attribute": "device_location", "value": "align vertically with receptacle below where occurs", "unit": null, "location_key": {"sheet_number": "A22.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "ALL STROBES ARE TO ALIGN VERTICALLY WITH RECEPTACLE BELOW WHERE OCCURS.", "coordination_targets": ["electrical", "fire_alarm", "architectural"], "conflict_potential": "medium", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "A2201-GN-004", "subject": "Ceiling Device", "category": "ceiling", "attribute": "device_location", "value": "center of acoustical ceiling panel", "unit": null, "location_key": {"sheet_number": "A22.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "INSTALL NEW SPRINKLER HEADS AND LIGHT FIXTURES AT THE CENTER OF THE ACOUSTICAL CEILING PANEL U.N.O.", "coordination_targets": ["electrical", "fire_protection", "architectural"], "conflict_potential": "medium", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "A2201-GN-005", "subject": "Fire Alarm Device", "category": "fire_alarm", "attribute": "device_location", "value": "centered and aligned with light fixtures", "unit": null, "location_key": {"sheet_number": "A22.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "ALL FIRE ALARM / LIFE SAFETY EQUIPMENT LOCATIONS TO BE LOCATED CENTERED AND ALIGNED WITH LIGHT FIXTURES.", "coordination_targets": ["electrical", "fire_alarm", "architectural"], "conflict_potential": "medium", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "A2201-GN-006", "subject": "Ceiling", "category": "ceiling", "attribute": "ceiling_finish", "value": "AT-1 ACOUSTIC CEILING TILE", "unit": null, "location_key": {"sheet_number": "A22.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "CEILING THROUGHOUT ENTIRE SPACE TO BE AT-1 ACOUSTIC CEILING TILE", "coordination_targets": ["architectural"], "conflict_potential": "low", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "A2201-GN-007", "subject": "Ceiling", "category": "ceiling", "attribute": "ceiling_grid", "value": "C4-A CEILING GRID", "unit": null, "location_key": {"sheet_number": "A22.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "C4-A CEILING GRID.", "coordination_targets": ["architectural"], "conflict_potential": "low", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "A2201-SCH-001", "subject": "Light Fixture", "category": "schedule_entry", "attribute": "description", "value": "2' x 2' RECESSED INDIRECT, 4000K, 90+CRI, ACRYLIC SHEILDING, WHITE FINISH", "unit": null, "location_key": {"sheet_number": "A22.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "L-4", "detail_reference": null, "plan_zone": null}, "source_text": "TAG: L-4, MANUF.: LITHONIA, MODEL: 2BLT2-33L-ADSM-EZ1-LP940, DESCRIPTION: 2' x 2' RECESSED INDIRECT, 4000K, 90+CRI, ACRYLIC SHEILDING, WHITE FINISH", "coordination_targets": ["electrical", "specialty"], "conflict_potential": "medium", "code_review_relevance": "none", "confidence": "high"}, {"assertion_id": "A2201-SCH-002", "subject": "Light Fixture", "category": "schedule_entry", "attribute": "description", "value": "16\" PENDANT, 2700K, DOMED LENSE, MATT BLACK", "unit": null, "location_key": {"sheet_number": "A22.01", "grid": null, "room": null, "room_name": "Sales Area", "level": null, "tag": "L-6", "detail_reference": null, "plan_zone": "C/4.5"}, "source_text": "TAG: L-6, MANUF.: CONNEXION, MODEL: BLE-C-WHA16-106CSB20-LED16-2700K-DL, DESCRIPTION: 16\" PENDANT, 2700K, DOMED LENSE, MATT BLACK, PENDANT 5'-5\" AFF", "coordination_targets": ["electrical", "specialty"], "conflict_potential": "medium", "code_review_relevance": "none", "confidence": "high"}, {"assertion_id": "A2201-SCH-003", "subject": "Light Fixture", "category": "equipment_elev", "attribute": "mounting_height_AFF", "value": "5'-5\"", "unit": null, "location_key": {"sheet_number": "A22.01", "grid": null, "room": null, "room_name": "Sales Area", "level": null, "tag": "L-6", "detail_reference": null, "plan_zone": "C/4.5"}, "source_text": "PENDANT 5'-5\" AFF", "coordination_targets": ["electrical", "architectural", "code", "ada"], "conflict_potential": "high", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "A2201-RM-001", "subject": "men's restroom", "category": "room", "attribute": "room_name", "value": "MEN'S RESTROOM", "unit": null, "location_key": {"sheet_number": "A22.01", "grid": "A/4.5", "room": null, "room_name": "MEN'S RESTROOM", "level": null, "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "MEN'S RESTROOM", "coordination_targets": ["architectural", "mechanical", "electrical", "plumbing"], "conflict_potential": "low", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "A2201-RM-002", "subject": "women's restroom", "category": "room", "attribute": "room_name", "value": "WOMEN'S RESTROOM", "unit": null, "location_key": {"sheet_number": "A22.01", "grid": "B/4.5", "room": null, "room_name": "WOMEN'S RESTROOM", "level": null, "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "WOMEN'S RESTROOM", "coordination_targets": ["architectural", "mechanical", "electrical", "plumbing"], "conflict_potential": "low", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "A2201-RM-003", "subject": "room dimension", "category": "room_dimension", "attribute": "width", "value": "10'-0\"", "unit": null, "location_key": {"sheet_number": "A22.01", "grid": "A/4.5", "room": null, "room_name": "MEN'S RESTROOM", "level": null, "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "10'-0\"", "coordination_targets": ["architectural", "structural"], "conflict_potential": "medium", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "A2201-RM-004", "subject": "room dimension", "category": "room_dimension", "attribute": "width", "value": "10'-0\"", "unit": null, "location_key": {"sheet_number": "A22.01", "grid": "B/4.5", "room": null, "room_name": "WOMEN'S RESTROOM", "level": null, "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "10'-0\"", "coordination_targets": ["architectural", "structural"], "conflict_potential": "medium", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "A2201-RM-005", "subject": "Exhaust Fan", "category": "mechanical", "attribute": "fixture_location", "value": "MEN'S RESTROOM contains an exhaust fan", "unit": null, "location_key": {"sheet_number": "A22.01", "grid": "A/4.5", "room": null, "room_name": "MEN'S RESTROOM", "level": null, "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "EXHAUST FAN", "coordination_targets": ["mechanical", "electrical", "architectural"], "conflict_potential": "high", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "A2201-RM-006", "subject": "Exhaust Fan", "category": "mechanical", "attribute": "fixture_location", "value": "WOMEN'S RESTROOM contains an exhaust fan", "unit": null, "location_key": {"sheet_number": "A22.01", "grid": "B/4.5", "room": null, "room_name": "WOMEN'S RESTROOM", "level": null, "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "EXHAUST FAN", "coordination_targets": ["mechanical", "electrical", "architectural"], "conflict_potential": "high", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "A2201-RM-007", "subject": "Sales Area", "category": "room", "attribute": "room_name", "value": "SALES AREA", "unit": null, "location_key": {"sheet_number": "A22.01", "grid": "C/4", "room": null, "room_name": "SALES AREA", "level": null, "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "SALES AREA", "coordination_targets": ["architectural", "mechanical", "electrical", "plumbing"], "conflict_potential": "low", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "A2201-RM-008", "subject": "Light Fixture L-6", "category": "electrical", "attribute": "fixture_count", "value": "3", "unit": null, "location_key": {"sheet_number": "A22.01", "grid": "C/4.5", "room": null, "room_name": "SALES AREA", "level": null, "tag": "L-6", "detail_reference": null, "plan_zone": null}, "source_text": "L-6", "coordination_targets": ["electrical", "architectural"], "conflict_potential": "low", "code_review_relevance": "none", "confidence": "high"}, {"assertion_id": "A2201-RN-001", "subject": "Building Sign", "category": "keynote_assertion", "attribute": "power_requirement", "value": "Power required for building sign", "unit": null, "location_key": {"sheet_number": "A22.01", "grid": "D/5", "room": null, "room_name": null, "level": null, "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "PROVIDE POWER FOR BUILDING SIGN", "coordination_targets": ["electrical", "structural", "architectural", "specialty"], "conflict_potential": "high", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "A2201-RN-002", "subject": "Building Sign", "category": "keynote_assertion", "attribute": "power_requirement", "value": "Power required for building sign", "unit": null, "location_key": {"sheet_number": "A22.01", "grid": "D/4", "room": null, "room_name": null, "level": null, "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "PROVIDE POWER FOR BUILDING SIGN", "coordination_targets": ["electrical", "structural", "architectural", "specialty"], "conflict_potential": "high", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "A2201-EQ-001", "subject": "Ceiling Occupancy Sensor", "category": "electrical", "attribute": "fixture_count", "value": "3", "unit": null}]} \ No newline at end of file diff --git a/backend/.llm_cache/07caa4ba223bd4f94226c00a1151e69acea448077564c44501785f1e5426f1b3.json b/backend/.llm_cache/07caa4ba223bd4f94226c00a1151e69acea448077564c44501785f1e5426f1b3.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/07caa4ba223bd4f94226c00a1151e69acea448077564c44501785f1e5426f1b3.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/08f70f602def064922edb17f444456f01268708285d4a1315cec9b99ed484154.json b/backend/.llm_cache/08f70f602def064922edb17f444456f01268708285d4a1315cec9b99ed484154.json new file mode 100644 index 0000000..ef120d7 --- /dev/null +++ b/backend/.llm_cache/08f70f602def064922edb17f444456f01268708285d4a1315cec9b99ed484154.json @@ -0,0 +1 @@ +[{"issue_id": "DEDUP-01", "overall_risk_score": 100, "severity": "critical", "risk_drivers": ["permit_risk", "life_safety", "accessibility", "structural", "mep_coordination", "cost_exposure", "schedule_impact", "change_order_risk"], "recommended_priority": "immediate", "senior_architect_summary": "The drawings reference multiple conflicting building codes (2018 & 2021 IBC), while the jurisdiction requires the 2015 IBC. This is a fatal flaw that guarantees permit rejection and requires immediate correction of the design basis for the entire project to avoid a complete redesign."}, {"issue_id": "QAQC-002-M", "overall_risk_score": 100, "severity": "critical", "risk_drivers": ["life_safety", "permit_risk", "structural", "mep_coordination", "constructability", "cost_exposure", "schedule_impact", "change_order_risk"], "recommended_priority": "immediate", "senior_architect_summary": "The complete absence of structural drawings, despite the addition of new rooftop equipment, creates a severe life-safety hazard and makes the project unpermittable and unbuildable. A structural engineer must be engaged immediately to design and document the necessary structural support."}, {"issue_id": "CBI-003", "overall_risk_score": 99, "severity": "critical", "risk_drivers": ["life_safety", "permit_risk", "structural", "constructability", "cost_exposure", "schedule_impact", "change_order_risk"], "recommended_priority": "immediate", "senior_architect_summary": "The design improperly delegates the engineering of supports for heavy suspended equipment to the contractor, creating a significant life-safety risk from potential structural failure. The structural engineer of record must provide a complete, engineered design for these supports."}, {"issue_id": "QAQC-001-M", "overall_risk_score": 98, "severity": "critical", "risk_drivers": ["permit_risk", "constructability", "mep_coordination", "cost_exposure", "schedule_impact", "bid_ambiguity", "change_order_risk"], "recommended_priority": "immediate", "senior_architect_summary": "Core architectural and mechanical plan sheets are missing, rendering the set incomplete for bidding, permitting, or construction. This omission prevents verification of critical dimensions, ceiling heights, and MEP system layouts, and must be rectified immediately."}, {"issue_id": "verizon-elyson-002", "overall_risk_score": 92, "severity": "critical", "risk_drivers": ["accessibility", "permit_risk", "constructability", "cost_exposure", "schedule_impact", "change_order_risk"], "recommended_priority": "before_permit", "senior_architect_summary": "A floor-mounted toilet is specified, which has a strict 59-inch ADA depth clearance requirement. The architectural plans needed to verify this dimension are missing, creating a critical risk of building a non-compliant restroom that would require costly demolition and rework to fix."}, {"issue_id": "QAQC-003", "overall_risk_score": 90, "severity": "critical", "risk_drivers": ["permit_risk", "bid_ambiguity", "cost_exposure", "schedule_impact", "life_safety", "accessibility", "change_order_risk"], "recommended_priority": "before_bid", "senior_architect_summary": "The lack of Door and Window Schedules and corresponding plan tags means critical data for fire ratings, egress, hardware, cost, and procurement is undefined. The set is not biddable or permittable without this information."}, {"issue_id": "QAQC-004", "overall_risk_score": 88, "severity": "high", "risk_drivers": ["bid_ambiguity", "permit_risk", "life_safety", "cost_exposure", "schedule_impact", "constructability", "change_order_risk"], "recommended_priority": "before_bid", "senior_architect_summary": "The absence of a wall type schedule and lack of rated partition callouts on the plans creates massive bid ambiguity and a fire-code compliance risk. It is impossible to accurately price or build the partitions without this fundamental information."}, {"issue_id": "DEDUP-02", "overall_risk_score": 85, "severity": "critical", "risk_drivers": ["mep_coordination", "constructability", "cost_exposure", "schedule_impact", "change_order_risk"], "recommended_priority": "before_bid", "senior_architect_summary": "A major MEP coordination failure exists where a 480V water heater is specified but served by a 208V circuit. This will lead to procurement of incorrect equipment and significant rework, cost overruns, and schedule delays if not corrected before bidding."}, {"issue_id": "DEDUP-04", "overall_risk_score": 85, "severity": "high", "risk_drivers": ["permit_risk", "mep_coordination", "cost_exposure", "schedule_impact", "change_order_risk"], "recommended_priority": "before_permit", "senior_architect_summary": "The drawings reference conflicting versions of the National Electrical Code (2014 and 2023). This ambiguity creates a permit risk and may lead to non-compliant electrical design, requiring correction and resubmission."}, {"issue_id": "accessibility_ramp_slip_resistance_01", "overall_risk_score": 82, "severity": "high", "risk_drivers": ["life_safety", "accessibility", "permit_risk", "cost_exposure", "change_order_risk"], "recommended_priority": "before_bid", "senior_architect_summary": "A specification for tiling on ramps requires a slip resistance value that is less than half of what is mandated by the Texas Accessibility Standards (TAS). This creates a significant non-compliance and slip-and-fall liability risk and must be corrected before material procurement."}, {"issue_id": "DEDUP-03", "overall_risk_score": 80, "severity": "critical", "risk_drivers": ["mep_coordination", "constructability", "cost_exposure", "schedule_impact", "change_order_risk", "owner_decision"], "recommended_priority": "before_bid", "senior_architect_summary": "Heavy electrical and plumbing equipment requiring service is located above a hard-lid gypsum board ceiling, making future access for maintenance or replacement impossible without demolition. This is a significant constructability and long-term O&M issue that must be resolved."}, {"issue_id": "PROJ-A5101-1", "overall_risk_score": 80, "severity": "high", "risk_drivers": ["accessibility", "permit_risk", "constructability", "change_order_risk"], "recommended_priority": "before_permit", "senior_architect_summary": "The restroom door swings inward, obstructing the required ADA clear floor space at the toilet. This is a clear accessibility violation that makes the restroom non-compliant and must be corrected by reversing the door swing."}, {"issue_id": "PROJ-G1102-1", "overall_risk_score": 78, "severity": "high", "risk_drivers": ["accessibility", "permit_risk", "constructability", "change_order_risk"], "recommended_priority": "before_permit", "senior_architect_summary": "A typical detail specifies an allowable door hardware mounting height of 33 inches, which is below the 34-inch minimum required by the ADA. This is a clear accessibility code violation that must be corrected to avoid failed inspections and costly rework."}, {"issue_id": "PROJ-A5101-2", "overall_risk_score": 77, "severity": "high", "risk_drivers": ["accessibility", "permit_risk", "constructability"], "recommended_priority": "before_permit", "senior_architect_summary": "The restroom elevation incorrectly shows the rear grab bar centered on the toilet, violating ADA standards for placement. The detail must be corrected to show the required offset installation to ensure compliance."}, {"issue_id": "verizon-elyson-001", "overall_risk_score": 75, "severity": "high", "risk_drivers": ["accessibility", "permit_risk", "constructability", "cost_exposure", "change_order_risk"], "recommended_priority": "before_bid", "senior_architect_summary": "An ADA-required sink is specified as a 'self-rimming' model, which often implies installation in a cabinet that obstructs required knee/toe clearance. The drawings must be clarified with a detail showing a compliant installation to avoid costly rework."}, {"issue_id": "DEDUP-06", "overall_risk_score": 75, "severity": "high", "risk_drivers": ["bid_ambiguity", "schedule_impact", "constructability", "cost_exposure", "change_order_risk"], "recommended_priority": "before_bid", "senior_architect_summary": "The drawings create a contractual conflict by assigning responsibility for roof penetrations and flashing to both the General Contractor and the Landlord's designated roofer. This ambiguity will cause bid confusion, schedule delays, and potential roof warranty issues."}, {"issue_id": "CBI-007", "overall_risk_score": 72, "severity": "high", "risk_drivers": ["structural", "constructability", "cost_exposure", "bid_ambiguity"], "recommended_priority": "before_construction", "senior_architect_summary": "The design for supporting a heavy, wall-mounted network rack is undefined, simply stating to 'coordinate for plywood backing.' This is unsafe and ambiguous; a proper detail specifying the backing material, fire rating, and engineered attachment to the structure is required."}, {"issue_id": "DEDUP-05", "overall_risk_score": 70, "severity": "high", "risk_drivers": ["bid_ambiguity", "cost_exposure", "schedule_impact", "constructability", "change_order_risk", "owner_decision"], "recommended_priority": "before_bid", "senior_architect_summary": "A direct contradiction exists between the floor plan (specifying polished concrete) and an interior elevation (calling for tile) in the restrooms. This ambiguity must be resolved before bidding to avoid significant cost and schedule impacts."}, {"issue_id": "DEDUP-09", "overall_risk_score": 68, "severity": "medium", "risk_drivers": ["life_safety", "permit_risk", "cost_exposure", "bid_ambiguity", "change_order_risk"], "recommended_priority": "before_bid", "senior_architect_summary": "The hollow metal door specification contains conflicting requirements, calling for both 90-minute and 1-hour fire ratings. This ambiguity must be resolved to ensure correctly rated doors are specified, procured, and installed for life safety compliance."}, {"issue_id": "DEDUP-07", "overall_risk_score": 65, "severity": "medium", "risk_drivers": ["life_safety", "permit_risk", "constructability", "bid_ambiguity", "change_order_risk"], "recommended_priority": "before_construction", "senior_architect_summary": "The drawings contain a contradiction where an electrical detail specifies a blanket '3-hour' firestop, conflicting with general notes that correctly require UL-listed systems matching the rating of the penetrated assembly. This ambiguity must be resolved to ensure proper life-safety compliance."}, {"issue_id": "DEDUP-08", "overall_risk_score": 60, "severity": "medium", "risk_drivers": ["bid_ambiguity", "cost_exposure", "schedule_impact", "owner_decision", "change_order_risk"], "recommended_priority": "before_bid", "senior_architect_summary": "The project is inconsistently described as both a 'first generation build-out' and a 'remodel.' This fundamental ambiguity about the existing conditions must be clarified to enable accurate demolition scope and bidding."}] \ No newline at end of file diff --git a/backend/.llm_cache/092bb11f66b6e7991a5c1c6db12fc13d87dea0156c5a84818b1612a648638400.json b/backend/.llm_cache/092bb11f66b6e7991a5c1c6db12fc13d87dea0156c5a84818b1612a648638400.json new file mode 100644 index 0000000..902ae60 --- /dev/null +++ b/backend/.llm_cache/092bb11f66b6e7991a5c1c6db12fc13d87dea0156c5a84818b1612a648638400.json @@ -0,0 +1 @@ +{"issues": [{"issue_id": "VerizonElyson-ADA-001", "source_stage": "code", "category": "ada", "severity": "medium", "confidence": "high", "location": "Sales Area", "disciplines": ["Electrical"], "sheets": ["E04.01"], "description": "A communication outlet in the Sales Area is specified to be mounted at 55 inches above finished floor. This height exceeds the 48-inch maximum for high side or forward reach for operable parts under ADA guidelines. This could render the outlet unusable for a person in a wheelchair.", "evidence": [{"discipline": "Electrical", "sheet": "E04.01", "source_text": "(2) CAT.6/55\"/H", "asserted_value": "55"}], "recommended_resolution": "Verify the function of this outlet. If it is not exempt as serving dedicated, non-user-adjustable equipment, relocate the outlet to be within the accessible reach range, typically a maximum of 48 inches AFF.", "code_reference": "ADA 205.1"}, {"issue_id": "VerizonElyson-CODE-001", "source_stage": "code", "category": "building_code", "severity": "low", "confidence": "high", "location": "Sheet E05.01", "disciplines": ["Electrical", "Fire Protection"], "sheets": ["E05.01"], "description": "A note regarding separation of electrical outlets in rated walls references \"UBC 4304\". The adopted code for this project is the 2015 IBC, not the Uniform Building Code (UBC). This outdated reference can cause confusion for contractors and inspectors.", "evidence": [{"discipline": "Electrical", "sheet": "E05.01", "source_text": "IN ACCORDANCE WITH UBC 4304 OUTLETS ON OPPOSITE SIDES OF WALLS OR PARTITIONS IN THE SAME STUD SPACE MUST BE SEPARATED BY A MIN. OF 24\" HORIZONTAL DISTANCE.", "asserted_value": "24"}], "recommended_resolution": "Update the note to reference the correct section from the 2015 International Building Code (e.g., IBC Section 714.4.2).", "code_reference": null}, {"issue_id": "VerizonElyson-ADA-002", "source_stage": "code", "category": "ada", "severity": "high", "confidence": "high", "location": "Men's and Women's Restrooms", "disciplines": ["Architectural", "Plumbing"], "sheets": ["E04.01", "P01.01", "G21.01"], "description": "The drawing set specifies ADA-compliant water closets but lacks dimensioned floor plans or enlarged plans of the restrooms to verify compliance. There is no information to confirm the required 60-inch minimum width and 59-inch minimum depth for the wheelchair accessible compartment, nor clearances around the fixture.", "evidence": [{"discipline": "Plumbing", "sheet": "P01.01", "source_text": "WATER CLOSET (FLOOR MOUNTED) (A.D.A.)", "asserted_value": "Floor Mounted"}, {"discipline": "Electrical", "sheet": "E04.01", "source_text": "MEN'S RESTROOM", "asserted_value": "MEN'S RESTROOM"}], "recommended_resolution": "Provide enlarged and fully dimensioned plans of the Men's and Women's restrooms demonstrating compliance with all applicable TAS and ADA requirements for compartment size, door maneuvering clearances, and fixture clearances.", "code_reference": "ADA 604.8.1.1"}, {"issue_id": "VerizonElyson-ADA-003", "source_stage": "code", "category": "ada", "severity": "high", "confidence": "high", "location": "Restrooms and Lounge", "disciplines": ["Architectural", "Plumbing"], "sheets": ["P01.01", "E04.01"], "description": "The plumbing schedule specifies ADA-compliant lavatories and a sink, but no plans show the installation details. Dimensions are required to verify the lavatory and sink counter/rim height (34 inches maximum), knee and toe clearance, and clear floor space for a forward approach.", "evidence": [{"discipline": "Plumbing", "sheet": "P01.01", "source_text": "LAVATORY (WALL MOUNTED) (A.D.A.)", "asserted_value": "true"}, {"discipline": "Plumbing", "sheet": "P01.01", "source_text": "SINGLE BOWL SINK (A.D.A)", "asserted_value": "true"}], "recommended_resolution": "Provide enlarged and fully dimensioned plans and elevations of the lavatory and sink locations, demonstrating compliance with TAS and ADA requirements for clear floor space, knee/toe clearance, and mounting height.", "code_reference": "ADA 606.2"}]} \ No newline at end of file diff --git a/backend/.llm_cache/093df0dc56667ca5091d2df00f4ec627270f1761814cd6c91e262a7f4926cf04.json b/backend/.llm_cache/093df0dc56667ca5091d2df00f4ec627270f1761814cd6c91e262a7f4926cf04.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/093df0dc56667ca5091d2df00f4ec627270f1761814cd6c91e262a7f4926cf04.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/0bc1907b473fb0cb45cbe5324336e64471e780e8f51bd0a4cc040d16b5a3b0b5.json b/backend/.llm_cache/0bc1907b473fb0cb45cbe5324336e64471e780e8f51bd0a4cc040d16b5a3b0b5.json new file mode 100644 index 0000000..ac2023b --- /dev/null +++ b/backend/.llm_cache/0bc1907b473fb0cb45cbe5324336e64471e780e8f51bd0a4cc040d16b5a3b0b5.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "SUBMITTAL_FORMAT_AND_QUANTITY_CONFLICT-01", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "Specifications - Submittal Procedures", "disciplines": ["General"], "sheets": ["G31.01"], "description": "The specification contains conflicting requirements for the format and quantity of submittals. One section requires ten (10) hard copies for submittal, while another section describes an electronic-first workflow requiring one (1) PDF copy, with hard copies to be provided only after electronic approval. This creates ambiguity for the contractor's bidding and administrative process.", "evidence": [{"discipline": "General", "sheet": "G31.01", "source_text": "NUMBER OF COPIES FOR SUBMITTAL - TEN (10).", "asserted_value": "10 copies required for submittal"}, {"discipline": "General", "sheet": "G31.01", "source_text": "ELECTRONIC DOCUMENTS: SUBMIT ONE ELECTRONIC COPY IN PDF FORMAT.", "asserted_value": "1 electronic copy required for submittal"}], "recommended_resolution": "verify with architect"}]} \ No newline at end of file diff --git a/backend/.llm_cache/0bcfb7dc26419f5a9fb9ed8794a2f2529ea774e89eb6eb2571bf1d926ed53fec.json b/backend/.llm_cache/0bcfb7dc26419f5a9fb9ed8794a2f2529ea774e89eb6eb2571bf1d926ed53fec.json new file mode 100644 index 0000000..2da1a58 --- /dev/null +++ b/backend/.llm_cache/0bcfb7dc26419f5a9fb9ed8794a2f2529ea774e89eb6eb2571bf1d926ed53fec.json @@ -0,0 +1 @@ +{"sheet_number": "G31.06", "discipline": "General", "sheet_title": "UL RATINGS - DESIGN #U419", "level": null, "scale": null, "assertions": [{"subject": "UL Design U419", "attribute": "wall_rating", "value": "1, 2, 3 or 4", "source_text": "Nonbearing Wall Ratings \u2014 1, 2, 3 or 4 Hr (See Items 4 & 5 through 5J)", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "UL Design U419"}}, {"subject": "UL Design U419 - Item 1 Floor and Ceiling Runners", "attribute": "component_material", "value": "Channel shaped, fabricated from min 25 MSG corrosion-protected steel", "source_text": "1. Floor and Ceiling Runners \u2014 (Not Shown) \u2014 For use with Item 2 \u2014 Channel shaped, fabricated from min 25 MSG corrosion-protected steel", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "UL Design U419, Item 1"}}, {"subject": "UL Design U419 - Item 1 Floor and Ceiling Runners", "attribute": "component_fastening", "value": "attached to floor and ceiling with fasteners 24 in. OC max", "source_text": "attached to floor and ceiling with fasteners 24 in. OC max.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "UL Design U419, Item 1"}}, {"subject": "UL Design U419 - Item 2 Steel Studs", "attribute": "stud_spacing", "value": "24", "source_text": "1C. Framing Members* \u2014 Steel Studs \u2014 (Not Shown. As an alternate to Item 1) \u2014 min 0.015 in. (min bare metal thickness) galvanized steel, spaced a max of 24 in. OC.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "UL Design U419, Item 2"}}, {"subject": "UL Design U419 - Item 2 Steel Studs", "attribute": "stud_length", "value": "cut 3/8 to 3/4 in. less than assembly height", "source_text": "Studs to be cut 3/8 to 3/4 in. less than assembly height.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "UL Design U419, Item 2"}}, {"subject": "UL Design U419 - 1 Hr Rating", "attribute": "stud_depth", "value": "1-5/8", "source_text": "Rating, Hr: 1, Min Stud Depth, in.: 1-5/8", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "UL Design U419, Item 5, 1 Hr Rating"}}, {"subject": "UL Design U419 - 1 Hr Rating", "attribute": "gypsum_board_layers_thickness", "value": "1 layer, 1/2 in. thick", "source_text": "Rating, Hr: 1, Min Thkns of Gyp Bd & Layers: 1 layer, 1/2 in. thick", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "UL Design U419, Item 5, 1 Hr Rating"}}, {"subject": "UL Design U419 - 1-1/2 Hr Rating", "attribute": "gypsum_board_layers_thickness", "value": "1 layer, 5/8 in. thick", "source_text": "Rating, Hr: 1-1/2, Min Thkns of Gyp Bd & Layers: 1 layer, 5/8 in. thick", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "UL Design U419, Item 5, 1-1/2 Hr Rating"}}, {"subject": "UL Design U419 - 2 Hr Rating", "attribute": "gypsum_board_layers_thickness", "value": "2 layers, 1/2 in. thick", "source_text": "Rating, Hr: 2, Min Stud Depth, in.: 1-5/8, Min Thkns of Gyp Bd & Layers: 2 layers, 1/2 in. thick", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "UL Design U419, Item 5, 2 Hr Rating (1-5/8 stud)"}}]} \ No newline at end of file diff --git a/backend/.llm_cache/0c0deceb7f6f7b6ac22394b22a3494745b9753736ce6fa96d6bcc27339daa6b5.json b/backend/.llm_cache/0c0deceb7f6f7b6ac22394b22a3494745b9753736ce6fa96d6bcc27339daa6b5.json new file mode 100644 index 0000000..b34402d --- /dev/null +++ b/backend/.llm_cache/0c0deceb7f6f7b6ac22394b22a3494745b9753736ce6fa96d6bcc27339daa6b5.json @@ -0,0 +1 @@ +{"issues": [{"issue_id": "VZE_2024_01_G3105_1", "source_stage": "code", "category": "ada", "severity": "medium", "confidence": "high", "location": "Specification Section 09 30 00, Sheet G31.05", "disciplines": ["Architectural", "Interiors", "Specifications"], "sheets": ["G31.05"], "description": "The specification for tile slip resistance (Section 09 30 00) references ASTM C1028 for measuring Static Coefficient of Friction (SCOF). This ASTM standard was withdrawn in 2014, making it obsolete for a project under 2015 codes. The current industry standard is ANSI A326.3, which measures Dynamic Coefficient of Friction (DCOF). Relying on a withdrawn standard may result in the installation of flooring that does not meet the requirements for slip-resistant surfaces under the ADA, TAS, and IBC.", "evidence": [{"discipline": "General", "sheet": "G31.05", "source_text": "STATIC COEFFICIENT OF FRICTION: MIN. 0.6 FOR LEVEL SURFACES, MIN. 0.42 FOR RAMPS PER ASTM C1028 OR ANSI A137.1.", "asserted_value": "min 0.6 SCOF"}], "recommended_resolution": "Update the specification to reference the current standard, ANSI A326.3, and specify a required DCOF value (e.g., >= 0.42 for interior, level spaces expected to be walked upon when wet) to ensure compliance with accessibility requirements for slip-resistant surfaces.", "code_reference": null}, {"issue_id": "VZE_2024_01_G3104_1", "source_stage": "code", "category": "fire_separation", "severity": "high", "confidence": "high", "location": "Specification Section 081113, Sheet G31.04", "disciplines": ["Architectural", "Specifications"], "sheets": ["G31.04"], "description": "Specification section 081113 contains conflicting and potentially incorrect requirements for fire-rated doors. It specifies a '90 minute rated Class C' door, which is a contradiction; Class C doors are 20-minute rated, while 90-minute doors are Class B. It also calls for a '1-hour label' on doors in 1-hour exit corridors, where a 20-minute door is typically required by the IBC. This confusion could lead to the installation of improperly rated door assemblies, compromising life safety.", "evidence": [{"discipline": "General", "sheet": "G31.04", "source_text": "WHERE REQUIRED, INSTALLED FRAME AND DOOR ASSEMBLY SHALL CONFORM TO A 90 MINUTE RATED CLASS C INDICATED.", "asserted_value": "90"}, {"discipline": "General", "sheet": "G31.04", "source_text": "INCLUDE 1-HOUR LABEL ON FIRE RATED DOOR ASSEMBLIES LOCATED AT 1 HOUR RATED EXIT CORRIDORS.", "asserted_value": "1-hour"}], "recommended_resolution": "Revise specification 081113 to align with IBC Chapter 7 requirements for opening protectives. The door and frame schedule, cross-referenced with the code plan, should clearly indicate the required rating and class for each specific opening based on the wall assembly it is located in.", "code_reference": null}]} \ No newline at end of file diff --git a/backend/.llm_cache/0db936defc031367e880119f314024f3f8e3d02c729544aa0d5e87ecd70026f0.json b/backend/.llm_cache/0db936defc031367e880119f314024f3f8e3d02c729544aa0d5e87ecd70026f0.json new file mode 100644 index 0000000..ca9c067 --- /dev/null +++ b/backend/.llm_cache/0db936defc031367e880119f314024f3f8e3d02c729544aa0d5e87ecd70026f0.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "g31.04_spec_081113_fire_rating", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "Hollow Metal Doors and Frames Specification / Section 08 11 13", "disciplines": ["Architectural"], "sheets": ["G31.04"], "description": "The specification for hollow metal doors provides conflicting fire rating requirements. Section 3, paragraph A.1 states that fire-rated assemblies shall have a 90-minute rating, while paragraph A.1.b specifies a 1-hour label for doors in 1-hour rated corridors. This must be clarified to ensure doors are specified and procured with the correct fire rating.", "evidence": [{"discipline": "General", "sheet": "G31.04", "source_text": "WHERE REQUIRED, INSTALLED FRAME AND DOOR ASSEMBLY SHALL CONFORM TO A 90 MINUTE RATED CLASS C INDICATED.", "asserted_value": "90 MINUTE"}, {"discipline": "General", "sheet": "G31.04", "source_text": "INCLUDE 1-HOUR LABEL ON FIRE RATED DOOR ASSEMBLIES LOCATED AT 1 HOUR RATED EXIT CORRIDORS.", "asserted_value": "1-HOUR"}], "recommended_resolution": "verify with architect"}]} \ No newline at end of file diff --git a/backend/.llm_cache/0eba402129067c50d06fc3f8ec9ef136ac420654963d685fa16fd55e1ff83435.json b/backend/.llm_cache/0eba402129067c50d06fc3f8ec9ef136ac420654963d685fa16fd55e1ff83435.json new file mode 100644 index 0000000..11bf5fb --- /dev/null +++ b/backend/.llm_cache/0eba402129067c50d06fc3f8ec9ef136ac420654963d685fa16fd55e1ff83435.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "room_name_women's_restroom_vs_room", "category": "tag_or_reference_inconsistency", "severity": "low", "confidence": "high", "location": "Women's Restroom (Room 102)", "disciplines": ["Architectural", "Plumbing"], "sheets": ["A24.01", "P02.01"], "description": "The room is labeled 'WOMEN'S RESTROOM' on Architectural and most other drawings, but is labeled 'WOMEN'S ROOM' on Plumbing sheet P02.01. All drawings should use consistent naming for rooms and spaces to avoid confusion during bidding and construction.", "evidence": [{"discipline": "Architectural", "sheet": "A24.01", "source_text": "WOMEN'S RESTROOM", "asserted_value": "WOMEN'S RESTROOM"}, {"discipline": "Plumbing", "sheet": "P02.01", "source_text": "WOMEN'S ROOM", "asserted_value": "WOMEN'S ROOM"}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/10e21408ee0d209a0706415bc0b76449503cf8b441333caca1195a2b275eee26.json b/backend/.llm_cache/10e21408ee0d209a0706415bc0b76449503cf8b441333caca1195a2b275eee26.json new file mode 100644 index 0000000..5bf6db7 --- /dev/null +++ b/backend/.llm_cache/10e21408ee0d209a0706415bc0b76449503cf8b441333caca1195a2b275eee26.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "room_103_name_inconsistency", "category": "tag_or_reference_inconsistency", "severity": "low", "confidence": "high", "location": "Men's Restroom", "disciplines": ["Architectural", "Electrical"], "sheets": ["A24.01", "E03.01"], "description": "The room is labeled 'MEN'S RESTROOM' on the architectural plans and most other discipline drawings, but is generically labeled 'RESTROOM' on the electrical lighting plan. While the location is clear, inconsistent naming can lead to confusion when referencing room schedules or coordinating finishes and equipment.", "evidence": [{"discipline": "Architectural", "sheet": "A24.01", "source_text": "MEN'S RESTROOM", "asserted_value": "MEN'S RESTROOM"}, {"discipline": "Electrical", "sheet": "E03.01", "source_text": "RESTROOM", "asserted_value": "RESTROOM"}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/11ac27cc5ff06924fa45ee2355a19b2b9c3b08d3ab81bd468ae3fb2254878ae2.json b/backend/.llm_cache/11ac27cc5ff06924fa45ee2355a19b2b9c3b08d3ab81bd468ae3fb2254878ae2.json new file mode 100644 index 0000000..083b051 --- /dev/null +++ b/backend/.llm_cache/11ac27cc5ff06924fa45ee2355a19b2b9c3b08d3ab81bd468ae3fb2254878ae2.json @@ -0,0 +1 @@ +{"issues": [{"issue_id": "P03-001", "source_stage": "code", "category": "building_code", "severity": "medium", "confidence": "high", "location": "Plumbing Details on Sheet P03.01", "disciplines": ["Plumbing", "General", "Architectural"], "sheets": ["P03.01"], "description": "A general note on the plumbing details sheet references the '2021 IBC' for a vapor retarder requirement. The project's adopted building code is the 2015 IBC. Citing an incorrect code edition can lead to confusion during plan review and may not reflect the requirements of the authority having jurisdiction.", "evidence": [{"discipline": "Plumbing", "sheet": "P03.01", "source_text": "PER 2021 IBC, CHAPTER 19, SECTION 1907: POLYETHYLENE VAPOR RETARDER MINIMUM 6-MIL SHALL BE REQUIRED.", "asserted_value": "Vapor retarder per 2021 IBC"}], "recommended_resolution": "Verify the vapor retarder requirement in the applicable 2015 International Building Code and update the note on sheet P03.01 to cite the correct code section and edition.", "code_reference": null}]} \ No newline at end of file diff --git a/backend/.llm_cache/12690bdad4816b33779cbff749910b90fe9572651883b0e7d22bc668698469f5.json b/backend/.llm_cache/12690bdad4816b33779cbff749910b90fe9572651883b0e7d22bc668698469f5.json new file mode 100644 index 0000000..b3629c2 --- /dev/null +++ b/backend/.llm_cache/12690bdad4816b33779cbff749910b90fe9572651883b0e7d22bc668698469f5.json @@ -0,0 +1 @@ +{"prioritized_issues": [{"issue_id": "juris-01", "overall_risk_score": 100, "severity": "critical", "risk_drivers": ["permit_risk", "accessibility", "life_safety", "code_reference", "change_order_risk", "owner_decision", "bid_ambiguity"], "recommended_priority": "immediate", "senior_architect_summary": "Critical jurisdictional conflict between project code profile (San Diego, CA) and construction drawings (Harris County, TX). This affects all applicable codes and standards (California vs. Texas), making code review impossible. Must be resolved immediately to enable proper permitting and compliance."}, {"issue_id": "JURISDICTION-CONFLICT-001", "overall_risk_score": 100, "severity": "critical", "risk_drivers": ["permit_risk", "accessibility", "life_safety", "code_reference", "change_order_risk", "owner_decision", "bid_ambiguity"], "recommended_priority": "immediate", "senior_architect_summary": "Critical conflict between project code profile (San Diego, CA) and architectural plans (Cypress, TX). This affects all applicable codes and standards (California vs. Texas), making code review impossible. Must be resolved immediately to enable proper permitting and compliance."}, {"issue_id": "pendant_headroom_clearance", "overall_risk_score": 90, "severity": "critical", "risk_drivers": ["life_safety", "accessibility", "constructability", "cost_exposure", "change_order_risk", "schedule_impact", "bid_ambiguity"], "recommended_priority": "immediate", "senior_architect_summary": "Pendant light fixtures in the Sales Area are mounted at 65 inches, violating ADA headroom clearance requirements (80 inches). This poses a collision hazard and requires rework if fixtures are over circulation paths."}, {"issue_id": "VZE-CA-SD-002", "overall_risk_score": 85, "severity": "high", "risk_drivers": ["life_safety", "permit_risk", "structural", "constructability", "cost_exposure", "change_order_risk", "schedule_impact"], "recommended_priority": "before_permit", "senior_architect_summary": "HVAC vent (VTR) is within 10 feet of outdoor air intake, violating mechanical code. This could introduce sewer gas into the building and requires relocation before permit approval."}, {"issue_id": "verizon_elyson_wc_stall_depth_coordination", "overall_risk_score": 80, "severity": "high", "risk_drivers": ["accessibility", "constructability", "cost_exposure", "change_order_risk", "schedule_impact", "bid_ambiguity"], "recommended_priority": "before_permit", "senior_architect_summary": "Floor-mounted water closet requires 59-inch stall depth. If architectural plans do not accommodate this, either fixtures or plans must be revised before permit submission."}, {"issue_id": "VZE-CA-SD-003", "overall_risk_score": 75, "severity": "high", "risk_drivers": ["life_safety", "permit_risk", "constructability", "cost_exposure", "change_order_risk", "schedule_impact"], "recommended_priority": "before_permit", "senior_architect_summary": "HVAC condensate drain connects directly to sanitary sewer, violating plumbing code. Requires indirect connection via air gap or break before permit approval."}, {"issue_id": "ISSUE-001", "overall_risk_score": 70, "severity": "high", "risk_drivers": ["mep_coordination", "constructability", "cost_exposure", "change_order_risk", "schedule_impact", "bid_ambiguity"], "recommended_priority": "before_construction", "senior_architect_summary": "Lighting layout discrepancy between electrical and architectural plans. Must be resolved to avoid ceiling and wiring rework during construction."}, {"issue_id": "ISSUE-002", "overall_risk_score": 65, "severity": "high", "risk_drivers": ["permit_risk", "accessibility", "code_reference", "change_order_risk", "owner_decision", "bid_ambiguity"], "recommended_priority": "before_permit", "senior_architect_summary": "Conflicting IBC versions (2018 vs. 2021) across drawings. Project must be designed to a single code edition for permitting and compliance."}, {"issue_id": "ISSUE-003", "overall_risk_score": 60, "severity": "medium", "risk_drivers": ["mep_coordination", "constructability", "cost_exposure", "change_order_risk", "schedule_impact", "bid_ambiguity"], "recommended_priority": "before_construction", "senior_architect_summary": "Mechanical clearance conflict with exhaust fans. Overlapping 10' radius zones violate required separation, requiring coordination before construction."}, {"issue_id": "ISSUE-004", "overall_risk_score": 55, "severity": "medium", "risk_drivers": ["accessibility", "constructability", "cost_exposure", "change_order_risk", "schedule_impact", "bid_ambiguity"], "recommended_priority": "before_construction", "senior_architect_summary": "Inconsistent knee clearance heights (28\" vs. 29\") between general and specific details. May cause fabrication confusion, requiring coordination before construction."}, {"issue_id": "ISSUE-005", "overall_risk_score": 50, "severity": "medium", "risk_drivers": ["mep_coordination", "constructability", "cost_exposure", "change_order_risk", "schedule_impact", "bid_ambiguity"], "recommended_priority": "before_construction", "senior_architect_summary": "Vent pipe size discrepancy (2\" vs. 1 1/2\") between plans. Must be resolved to ensure proper material procurement and installation."}, {"issue_id": "ISSUE-006", "overall_risk_score": 45, "severity": "medium", "risk_drivers": ["mep_coordination", "constructability", "cost_exposure", "change_order_risk", "schedule_impact", "bid_ambiguity"], "recommended_priority": "before_construction", "senior_architect_summary": "Missing electrical panels H and L in architectural plans. Required for wall construction coordination and clearances."}, {"issue_id": "ISSUE-007", "overall_risk_score": 40, "severity": "medium", "risk_drivers": ["mep_coordination", "constructability", "cost_exposure", "change_order_risk", "schedule_impact", "bid_ambiguity"], "recommended_priority": "before_construction", "senior_architect_summary": "Missing floor drain in architectural plan for Cleaning Supplies/Storage. Affects slab depression, waterproofing, and slope requirements."}, {"issue_id": "ISSUE-008", "overall_risk_score": 35, "severity": "medium", "risk_drivers": ["accessibility", "constructability", "cost_exposure", "change_order_risk", "schedule_impact", "bid_ambiguity"], "recommended_priority": "before_construction", "senior_architect_summary": "Missing thermostatic mixing valve in architectural detail for lavatory L-1. Required for ADA compliance and clearances."}, {"issue_id": "ISSUE-009", "overall_risk_score": 30, "severity": "medium", "risk_drivers": ["mep_coordination", "constructability", "cost_exposure", "change_order_risk", "schedule_impact", "bid_ambiguity"], "recommended_priority": "before_construction", "senior_architect_summary": "Missing thermostatic mixing valve in architectural plans for drinking fountain EDF-1. Requires space coordination."}, {"issue_id": "ISSUE-010", "overall_risk_score": 25, "severity": "medium", "risk_drivers": ["permit_risk", "code_reference", "change_order_risk", "owner_decision", "bid_ambiguity"], "recommended_priority": "before_permit", "senior_architect_summary": "Conflicting NEC versions (2014 vs. 2023) across drawings. Must be resolved for permitting and compliance."}, {"issue_id": "ISSUE-011", "overall_risk_score": 20, "severity": "medium", "risk_drivers": ["constructability", "cost_exposure", "change_order_risk", "schedule_impact", "bid_ambiguity"], "recommended_priority": "before_construction", "senior_architect_summary": "Inconsistent vapor barrier requirements (15 mil vs. 6 mil). More stringent Landlord requirement must be applied consistently."}, {"issue_id": "ISSUE-012", "overall_risk_score": 15, "severity": "medium", "risk_drivers": ["bid_ambiguity", "change_order_risk", "owner_decision"], "recommended_priority": "before_bid", "senior_architect_summary": "Inconsistent project scope descriptions (first-gen retail vs. tenant remodel). Must be clarified to avoid bidding errors."}, {"issue_id": "ISSUE-013", "overall_risk_score": 10, "severity": "medium", "risk_drivers": ["mep_coordination", "constructability", "change_order_risk", "schedule_impact", "bid_ambiguity"], "recommended_priority": "before_construction", "senior_architect_summary": "Duplicate RTU-1 tags on mechanical roof plan. Creates ambiguity for contractors; requires unique identifiers."}, {"issue_id": "ISSUE-014", "overall_risk_score": 5, "severity": "medium", "risk_drivers": ["mep_coordination", "constructability", "change_order_risk", "schedule_impact", "bid_ambiguity"], "recommended_priority": "before_construction", "senior_architect_summary": "Duplicate FD-1 tags for floor drains in Men's and Women's restrooms. Requires unique identifiers for clarity."}, {"issue_id": "ISSUE-015", "overall_risk_score": 5, "severity": "low", "risk_drivers": ["constructability", "change_order_risk", "schedule_impact", "bid_ambiguity"], "recommended_priority": "track_only", "senior_architect_summary": "Potential access conflict between data outlets and shelving in storage room. Requires clarification on shelving height."}, {"issue_id": "ISSUE-016", "overall_risk_score": 5, "severity": "low", "risk_drivers": ["mep_coordination", "constructability", "change_order_risk", "schedule_impact", "bid_ambiguity"], "recommended_priority": "track_only", "senior_architect_summary": "Transformer installation note conflicts with exposed ceiling. Requires coordination to resolve."}, {"issue_id": "ISSUE-017", "overall_risk_score": 5, "severity": "low", "risk_drivers": ["constructability", "change_order_risk", "schedule_impact", "bid_ambiguity"], "recommended_priority": "track_only", "senior_architect_summary": "Inconsistent restroom labeling across disciplines. Requires standardization for clarity."}, {"issue_id": "ISSUE-018", "overall_risk_score": 5, "severity": "low", "risk_drivers": ["constructability", "change_order_risk", "schedule_impact", "bid_ambiguity"], "recommended_priority": "track_only", "senior_architect_summary": "Typo in ASTM reference (834 vs. E-84) for fire rating. Requires correction for consistency."}, {"issue_id": "ADA-CARPET-PILE-HEIGHT-001", "overall_risk_score": 40, "severity": "medium", "risk_drivers": ["accessibility", "code_reference", "change_order_risk", "schedule_impact", "bid_ambiguity"], "recommended_priority": "before_permit", "senior_architect_summary": "Carpet tile in accessible areas lacks pile height specification. Must be confirmed to meet ADA 302.2 (1/2\" max) before permit submission."}, {"issue_id": "CODE-SLIP-RESISTANCE-001", "overall_risk_score": 35, "severity": "medium", "risk_drivers": ["accessibility", "code_reference", "change_order_risk", "schedule_impact", "bid_ambiguity"], "recommended_priority": "before_permit", "senior_architect_summary": "Polished concrete slip resistance spec uses obsolete SCOF (0.50). Must be revised to ANSI A326.3 DCOF (0.42) for compliance."}, {"issue_id": "VZE-CA-SD-001", "overall_risk_score": 30, "severity": "medium", "risk_drivers": ["accessibility", "code_reference", "change_order_risk", "schedule_impact", "bid_ambiguity"], "recommended_priority": "before_permit", "senior_architect_summary": "Lavatory toe clearance specified at 6\" instead of required 9\". Must be revised to meet ADA 606.2 before permit submission."}, {"issue_id": "data_outlet_height", "overall_risk_score": 25, "severity": "medium", "risk_drivers": ["accessibility", "code_reference", "change_order_risk", "schedule_impact", "bid_ambiguity"], "recommended_priority": "before_permit", "senior_architect_summary": "Data outlet at 55\" exceeds ADA reach range (48\"). Must be relocated or justified as dedicated use before permit submission."}]} \ No newline at end of file diff --git a/backend/.llm_cache/12e967bcee49a18954f717dbcd9f16d8ac36fafb68ffb832335e8332eb5f0027.json b/backend/.llm_cache/12e967bcee49a18954f717dbcd9f16d8ac36fafb68ffb832335e8332eb5f0027.json new file mode 100644 index 0000000..6bc0b33 --- /dev/null +++ b/backend/.llm_cache/12e967bcee49a18954f717dbcd9f16d8ac36fafb68ffb832335e8332eb5f0027.json @@ -0,0 +1 @@ +{"issues": [{"issue_id": "8f8b3c9b-6d6a-4d2c-8064-a212356c9a9d", "source_stage": "code", "category": "building_code", "severity": "critical", "confidence": "high", "location": "General - Code Data Sheets", "disciplines": ["Architectural", "General"], "sheets": ["G11.04", "G21.01"], "description": "The drawing set lists multiple conflicting versions of the applicable building, fire, and electrical codes. Sheet G21.01 specifies the 2021 IFC, while the project profile specifies the 2018 IFC. Sheet G11.04 references the 2021 IBC. Sheet G21.01 lists a nonsensical reference for the NEC (\"2023 STATE OF TEXAS ADOPTED 2014 NFPA 70 NATIONAL ELECTRICAL CODE (NEC)\"), which conflicts with the 2020 NEC in the project profile. It is impossible to perform a code compliance review or construct the project without a clearly defined and consistently applied set of codes.", "evidence": [{"discipline": "General", "sheet": "G11.04", "source_text": "AREA LIMITATION: UNLIMITED (TABLES 504.3, 504.4, 506.2 IBC 2021)", "asserted_value": "IBC 2021"}, {"discipline": "General", "sheet": "G21.01", "source_text": "2018 INTERNATIONAL BUILDING CODE (IBC) CH. 2-10 WITH HARRIS COUNTY AMENDMENTS", "asserted_value": "2018 INTERNATIONAL BUILDING CODE"}, {"discipline": "General", "sheet": "G21.01", "source_text": "2021 INTERNATIONAL FIRE CODE (IFC) WITH HARRIS COUNTY AMENDMENTS", "asserted_value": "2021 INTERNATIONAL FIRE CODE"}, {"discipline": "General", "sheet": "G21.01", "source_text": "2023 STATE OF TEXAS ADOPTED 2014 NFPA 70 NATIONAL ELECTRICAL CODE (NEC)", "asserted_value": "2023 ... 2014 NEC"}], "recommended_resolution": "Revise the drawings to consistently state the single set of applicable code editions for all disciplines, as adopted by the Authority Having Jurisdiction. All code analysis and design should be updated to reflect the correct codes.", "code_reference": null}, {"issue_id": "4a7e9f2d-1ea2-4a0b-9c76-5544d6da61ff", "source_stage": "code", "category": "building_code", "severity": "critical", "confidence": "high", "location": "General - Project Information", "disciplines": ["Architectural", "General"], "sheets": ["G11.01", "G21.01"], "description": "The project jurisdiction is ambiguous. The project profile lists the jurisdiction as the \"City of Katy,\" but the project address on sheet G11.01 is in \"Cypress, TX,\" and the Authority Having Jurisdiction (AHJ) is listed as \"Harris County\" on sheet G21.01. These are different jurisdictions with potentially different code adoptions and local amendments. This must be clarified before a review can proceed.", "evidence": [{"discipline": "General", "sheet": "G11.01", "source_text": "7022 ELYSON EXCHANGE WAY CYPRESS, TX 77433", "asserted_value": "CYPRESS, TX"}, {"discipline": "General", "sheet": "G21.01", "source_text": "AUTHORITY HAVING JURISDICTION: HARRIS COUNTY", "asserted_value": "HARRIS COUNTY"}], "recommended_resolution": "Confirm the correct project address and governing Authority Having Jurisdiction (AHJ). Revise all project documentation, including the code information on the drawings, to reflect the requirements of the correct AHJ.", "code_reference": null}]} \ No newline at end of file diff --git a/backend/.llm_cache/13c126ebd335e986ada06d461464c73dc80db88d84c449a10b759dcf7942160c.json b/backend/.llm_cache/13c126ebd335e986ada06d461464c73dc80db88d84c449a10b759dcf7942160c.json new file mode 100644 index 0000000..de1984c --- /dev/null +++ b/backend/.llm_cache/13c126ebd335e986ada06d461464c73dc80db88d84c449a10b759dcf7942160c.json @@ -0,0 +1 @@ +{"issues": [{"issue_id": "VER-ELY-001", "source_stage": "code", "category": "ada", "severity": "high", "confidence": "high", "location": "Women's Room", "disciplines": ["Plumbing", "Architectural"], "sheets": ["P02.01"], "description": "An electric drinking fountain (EDF-1) is shown exclusively within the Women's Room. This does not provide equitable access for all building occupants, as required by accessibility standards. Drinking fountains must be accessible to people regardless of gender. The Men's Restroom plan does not show a drinking fountain.", "evidence": [{"discipline": "Plumbing", "sheet": "P02.01", "source_text": "EDF-1", "asserted_value": "EDF-1 is located in WOMEN'S ROOM."}], "recommended_resolution": "Relocate the drinking fountain to a common area accessible to all occupants, or provide an additional equivalent fixture accessible to occupants who do not use the Women's Room. Verify all fixture locations and counts comply with plumbing code and accessibility standards.", "code_reference": null}, {"issue_id": "VER-ELY-002", "source_stage": "code", "category": "building_code", "severity": "medium", "confidence": "high", "location": "Lounge - Sink SK-1", "disciplines": ["Plumbing"], "sheets": ["P02.01", "P03.01"], "description": "The drawings show conflicting information for the vent pipe size serving the lounge sink (SK-1). Sheet P02.01 indicates a 2\" vent, while the riser diagram on Sheet P03.01 indicates a 1 1/2\" vent. This discrepancy must be resolved to ensure proper installation and code compliance.", "evidence": [{"discipline": "Plumbing", "sheet": "P02.01", "source_text": "2\"V", "asserted_value": "2"}, {"discipline": "Plumbing", "sheet": "P03.01", "source_text": "1 1/2\"V", "asserted_value": "1.5"}], "recommended_resolution": "The engineer of record must determine the correct vent size required by the plumbing code and update all relevant drawings (plans, risers, etc.) to show a consistent and compliant size.", "code_reference": null}, {"issue_id": "VER-ELY-003", "source_stage": "code", "category": "building_code", "severity": "high", "confidence": "high", "location": "Water Heater EWH-1", "disciplines": ["Plumbing"], "sheets": ["P02.02", "P03.01"], "description": "Drawing notes for water heater EWH-1 specify routing both the Temperature and Pressure (T&P) relief valve drain and the auxiliary pan drain to a floor sink. The wording is ambiguous and could be interpreted as allowing the drains to be combined. Combining a T&P relief drain with any other pipe is a life safety hazard and is prohibited by plumbing codes, as it could obstruct the valve's emergency relief function.", "evidence": [{"discipline": "Plumbing", "sheet": "P02.02", "source_text": "KEYED NOTE: 1 EWH-1 ABOVE CEILING SUSPENDED AS HIGH AS POSSIBLE IN CEILING PLENUM. PROVIDE AUXILIARY DRAIN PAN BELOW WATER HEATER...ROUTE 3/4\" T&P DRAIN LINE AND 3/4\" AUXILIARY DRAIN LINES TO FLOOR SINK BELOW.", "asserted_value": "Route 3/4\" T&P drain line and 3/4\" auxiliary drain lines to floor sink below."}], "recommended_resolution": "Revise drawing notes to explicitly require the T&P relief valve drain and the auxiliary pan drain to be run as separate, independent lines to their termination point above the floor sink receptor, in compliance with the applicable plumbing code.", "code_reference": null}]} \ No newline at end of file diff --git a/backend/.llm_cache/140301f681b964b23f6db93a3bc49910b588df73b5cd94e843e112bfbd8868f6.json b/backend/.llm_cache/140301f681b964b23f6db93a3bc49910b588df73b5cd94e843e112bfbd8868f6.json new file mode 100644 index 0000000..120818f --- /dev/null +++ b/backend/.llm_cache/140301f681b964b23f6db93a3bc49910b588df73b5cd94e843e112bfbd8868f6.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "893c5d64-1507-4f61-b48c-de79f3238ca7", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "All rated wall penetrations", "disciplines": ["Electrical", "Plumbing", "General"], "sheets": ["E05.01", "P01.01", "G31.04"], "description": "The Electrical detail for a typical wall sleeve penetration prescriptively specifies a '3 HOUR RATED CAULK'. However, the Plumbing notes and General Specifications state that firestopping assemblies must be rated to match the hourly rating of the construction being penetrated. This creates a conflict for any penetration through a rated wall that is not 3-hour rated, leading to confusion about which requirement to follow and potentially incorrect material installation or unnecessary cost.", "evidence": [{"discipline": "Electrical", "sheet": "E05.01", "source_text": "PACK BOTH ENDS OF SLEEVE WITH 3M FIRE DAM 150 3 HOUR RATED CAULK OR APPROVED EQUAL", "asserted_value": "Firestopping shall be 3-hour rated."}, {"discipline": "Plumbing", "sheet": "P01.01", "source_text": "SEAL ALL PENETRATIONS THROUGH RATED WALLS, FLOORS AND CEILINGS WITH A UL LISTED ASSEMBLY TO PROVIDE A RATING EQUAL TO OR GREATER THAN THE RATING OF THE WALL, FLOOR OR CEILING.", "asserted_value": "Firestopping rating shall be equal to or greater than the rating of the penetrated element."}, {"discipline": "General", "sheet": "G31.04", "source_text": "FIRESTOPPING: TESTED IN ACCORDANCE WITH ASTM E119 OR UL 263 TO MEET THE HOURLY F-RATINGS OF THE CONSTRUCTION BEING PENETRATED.", "asserted_value": "Firestopping rating shall meet the hourly F-rating of the penetrated element."}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/1543b986c73d354a5ffcc9e1fd917f81651b1399b0f1c8ebd002f7a39c32aa53.json b/backend/.llm_cache/1543b986c73d354a5ffcc9e1fd917f81651b1399b0f1c8ebd002f7a39c32aa53.json new file mode 100644 index 0000000..7d9bd22 --- /dev/null +++ b/backend/.llm_cache/1543b986c73d354a5ffcc9e1fd917f81651b1399b0f1c8ebd002f7a39c32aa53.json @@ -0,0 +1 @@ +{"sheet_index": [{"sheet_id": "G01.01", "sheet_number": "G01.01", "sheet_title": "COVER SHEET", "discipline": "General", "drawing_type": "cover", "level": null, "page_number": 1, "qaqc_relevance": "low", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "G11.01", "sheet_number": "G11.01", "sheet_title": "VICINITY PLAN, ABBREVIATIONS, PROJECT GENERAL NOTES & SHEET INDEX", "discipline": "General", "drawing_type": "sheet_index", "level": null, "page_number": 2, "qaqc_relevance": "low", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "G11.02", "sheet_number": "G11.02", "sheet_title": "SYMBOLS & TYPICAL HEIGHTS", "discipline": "General", "drawing_type": "notes", "level": null, "page_number": 3, "qaqc_relevance": "medium", "code_review_relevance": "low", "confidence": "high"}, {"sheet_id": "G11.03", "sheet_number": "G11.03", "sheet_title": "LANDLORD WORK LETTER", "discipline": "General", "drawing_type": "notes", "level": "BUILDING C", "page_number": 4, "qaqc_relevance": "medium", "code_review_relevance": "low", "confidence": "high"}, {"sheet_id": "G11.04", "sheet_number": "G11.04", "sheet_title": "FIRE CODE DESIGN AND COMPLIANCE REVIEW", "discipline": "General", "drawing_type": "code_life_safety", "level": null, "page_number": 5, "qaqc_relevance": "high", "code_review_relevance": "high", "confidence": "high"}, {"sheet_id": "G21.01", "sheet_number": "G21.01", "sheet_title": "CODE / EXITING PLAN", "discipline": "General", "drawing_type": "code_life_safety", "level": null, "page_number": 6, "qaqc_relevance": "high", "code_review_relevance": "high", "confidence": "high"}, {"sheet_id": "G31.01", "sheet_number": "G31.01", "sheet_title": "SPECIFICATIONS", "discipline": "General", "drawing_type": "specifications", "level": null, "page_number": 7, "qaqc_relevance": "low", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "G31.02", "sheet_number": "G31.02", "sheet_title": "SPECIFICATIONS", "discipline": "General", "drawing_type": "specifications", "level": null, "page_number": 8, "qaqc_relevance": "low", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "G31.03", "sheet_number": "G31.03", "sheet_title": "SPECIFICATIONS", "discipline": "General", "drawing_type": "specifications", "level": null, "page_number": 9, "qaqc_relevance": "low", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "G31.04", "sheet_number": "G31.04", "sheet_title": "SPECIFICATIONS", "discipline": "General", "drawing_type": "specifications", "level": null, "page_number": 10, "qaqc_relevance": "low", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "G31.05", "sheet_number": "G31.05", "sheet_title": "SPECIFICATIONS", "discipline": "General", "drawing_type": "specifications", "level": null, "page_number": 11, "qaqc_relevance": "low", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "G31.06", "sheet_number": "G31.06", "sheet_title": "UL RATINGS - DESIGN #U419", "discipline": "General", "drawing_type": "detail", "level": null, "page_number": 12, "qaqc_relevance": "high", "code_review_relevance": "high", "confidence": "high"}, {"sheet_id": "A11.01", "sheet_number": "A11.01", "sheet_title": "SITE PLAN", "discipline": "Architectural", "drawing_type": "site_plan", "level": null, "page_number": 13, "qaqc_relevance": "medium", "code_review_relevance": "low", "confidence": "high"}, {"sheet_id": "page-14", "sheet_number": null, "sheet_title": "Page 14 (extraction failed)", "discipline": "Architectural", "drawing_type": "floor_plan", "level": null, "page_number": 14, "qaqc_relevance": "high", "code_review_relevance": "medium", "confidence": "low"}, {"sheet_id": "page-15", "sheet_number": null, "sheet_title": "Page 15 (extraction failed)", "discipline": "Architectural", "drawing_type": "reflected_ceiling_plan", "level": null, "page_number": 15, "qaqc_relevance": "high", "code_review_relevance": "medium", "confidence": "low"}, {"sheet_id": "A23.01", "sheet_number": "A23.01", "sheet_title": "FINISH PLAN", "discipline": "Architectural", "drawing_type": "floor_plan", "level": null, "page_number": 16, "qaqc_relevance": "high", "code_review_relevance": "low", "confidence": "high"}, {"sheet_id": "A24.01", "sheet_number": "A24.01", "sheet_title": "FURNITURE/ POWER/ DATA FLOOR PLAN", "discipline": "Architectural", "drawing_type": "floor_plan", "level": null, "page_number": 17, "qaqc_relevance": "high", "code_review_relevance": "medium", "confidence": "high"}, {"sheet_id": "A25.01", "sheet_number": "A25.01", "sheet_title": "ROOF PLAN", "discipline": "Architectural", "drawing_type": "roof_plan", "level": "Roof", "page_number": 18, "qaqc_relevance": "high", "code_review_relevance": "low", "confidence": "high"}, {"sheet_id": "A51.01", "sheet_number": "A51.01", "sheet_title": "ELEVATIONS, ENLARGED PLANS, & DETAILS", "discipline": "Architectural", "drawing_type": "detail", "level": null, "page_number": 19, "qaqc_relevance": "high", "code_review_relevance": "medium", "confidence": "high"}, {"sheet_id": "page-20", "sheet_number": null, "sheet_title": "Page 20 (extraction failed)", "discipline": "Architectural", "drawing_type": "detail", "level": null, "page_number": 20, "qaqc_relevance": "high", "code_review_relevance": "medium", "confidence": "low"}, {"sheet_id": "M01.01", "sheet_number": "M01.01", "sheet_title": "MECHANICAL NOTES & SCHEDULES", "discipline": "Mechanical", "drawing_type": "schedule", "level": null, "page_number": 21, "qaqc_relevance": "medium", "code_review_relevance": "low", "confidence": "high"}, {"sheet_id": "page-22", "sheet_number": null, "sheet_title": "Page 22 (extraction failed)", "discipline": "Mechanical", "drawing_type": "mep_plan", "level": null, "page_number": 22, "qaqc_relevance": "high", "code_review_relevance": "medium", "confidence": "low"}, {"sheet_id": "M02.02", "sheet_number": "M02.02", "sheet_title": "MECHANICAL ROOF PLAN", "discipline": "Mechanical", "drawing_type": "roof_plan", "level": "ROOF", "page_number": 23, "qaqc_relevance": "high", "code_review_relevance": "low", "confidence": "high"}, {"sheet_id": "M03.01", "sheet_number": "M03.01", "sheet_title": "MECHANICAL DETAILS", "discipline": "Mechanical", "drawing_type": "detail", "level": null, "page_number": 24, "qaqc_relevance": "high", "code_review_relevance": "low", "confidence": "high"}, {"sheet_id": "E01.01", "sheet_number": "E01.01", "sheet_title": "NOTES AND LEGEND", "discipline": "Electrical", "drawing_type": "notes", "level": null, "page_number": 25, "qaqc_relevance": "medium", "code_review_relevance": "low", "confidence": "high"}, {"sheet_id": "E01.02", "sheet_number": "E01.02", "sheet_title": "ONE LINE DIAGRAM AND SCHEDULES", "discipline": "Electrical", "drawing_type": "one_line", "level": null, "page_number": 26, "qaqc_relevance": "high", "code_review_relevance": "low", "confidence": "high"}, {"sheet_id": "E02.01", "sheet_number": "E02.01", "sheet_title": "FLOOR PLAN - POWER", "discipline": "Electrical", "drawing_type": "mep_plan", "level": null, "page_number": 27, "qaqc_relevance": "high", "code_review_relevance": "medium", "confidence": "high"}, {"sheet_id": "E02.02", "sheet_number": "E02.02", "sheet_title": "ROOF PLAN - POWER", "discipline": "Electrical", "drawing_type": "roof_plan", "level": "ROOF", "page_number": 28, "qaqc_relevance": "high", "code_review_relevance": "low", "confidence": "high"}, {"sheet_id": "E03.01", "sheet_number": "E03.01", "sheet_title": "FLOOR PLAN - LIGHTING", "discipline": "Electrical", "drawing_type": "mep_plan", "level": null, "page_number": 29, "qaqc_relevance": "high", "code_review_relevance": "medium", "confidence": "high"}, {"sheet_id": "E04.01", "sheet_number": "E04.01", "sheet_title": "FLOOR PLAN - SPECIAL SYSTEMS", "discipline": "Electrical", "drawing_type": "mep_plan", "level": null, "page_number": 30, "qaqc_relevance": "high", "code_review_relevance": "medium", "confidence": "high"}, {"sheet_id": "E05.01", "sheet_number": "E05.01", "sheet_title": "DETAILS", "discipline": "Electrical", "drawing_type": "detail", "level": null, "page_number": 31, "qaqc_relevance": "high", "code_review_relevance": "low", "confidence": "high"}, {"sheet_id": "E05.02", "sheet_number": "E05.02", "sheet_title": "DETAILS", "discipline": "Electrical", "drawing_type": "detail", "level": null, "page_number": 32, "qaqc_relevance": "high", "code_review_relevance": "low", "confidence": "high"}, {"sheet_id": "P01.01", "sheet_number": "P01.01", "sheet_title": "NOTES AND LEGEND", "discipline": "Plumbing", "drawing_type": "notes", "level": null, "page_number": 33, "qaqc_relevance": "medium", "code_review_relevance": "low", "confidence": "high"}, {"sheet_id": "P02.01", "sheet_number": "P02.01", "sheet_title": "FLOOR PLAN - SANITARY WASTE & VENT", "discipline": "Plumbing", "drawing_type": "mep_plan", "level": null, "page_number": 34, "qaqc_relevance": "high", "code_review_relevance": "medium", "confidence": "high"}, {"sheet_id": "P02.02", "sheet_number": "P02.02", "sheet_title": "FLOOR PLAN - DOMESTIC WATER", "discipline": "Plumbing", "drawing_type": "mep_plan", "level": null, "page_number": 35, "qaqc_relevance": "high", "code_review_relevance": "medium", "confidence": "high"}, {"sheet_id": "P03.01", "sheet_number": "P03.01", "sheet_title": "DETAILS & RISERS", "discipline": "Plumbing", "drawing_type": "riser_diagram", "level": null, "page_number": 36, "qaqc_relevance": "high", "code_review_relevance": "medium", "confidence": "high"}], "missing_expected_sheets": [{"expected_sheet_type": "Structural Discipline", "reason": "No sheets with the 'S' discipline prefix are present in the sheet index. A complete construction set typically includes foundation and framing plans.", "confidence": "high"}, {"expected_sheet_type": "Architectural Construction/Dimension Plan", "reason": "The set includes finish and furniture plans, but a primary dimensioned construction plan (typically A21 series) is not explicitly listed. This is likely page 14.", "confidence": "high"}, {"expected_sheet_type": "Architectural Reflected Ceiling Plan", "reason": "The set lacks an explicit Architectural Reflected Ceiling Plan (RCP), which is standard for coordinating ceiling elements. This is likely page 15.", "confidence": "high"}, {"expected_sheet_type": "Mechanical Floor Plan", "reason": "The Mechanical sheets jump from notes (M01.01) to the roof plan (M02.02), skipping the main floor plan. Page 22, a failed extraction, is likely this sheet (M02.01).", "confidence": "high"}, {"expected_sheet_type": "Building/Wall Sections", "reason": "The architectural set contains plans and some elevations/details, but lacks dedicated building or wall section sheets (typically A3x or A4x series).", "confidence": "medium"}, {"expected_sheet_type": "Fire Protection / Sprinkler Plan", "reason": "No Fire Protection sheets ('FP' prefix) are present. Depending on project scope, sprinkler plans may be required.", "confidence": "medium"}]} \ No newline at end of file diff --git a/backend/.llm_cache/155bf07ad9c9f8eda4769839da76761bb5eb7af55d1fbcedca9137db5c66ca0d.json b/backend/.llm_cache/155bf07ad9c9f8eda4769839da76761bb5eb7af55d1fbcedca9137db5c66ca0d.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/155bf07ad9c9f8eda4769839da76761bb5eb7af55d1fbcedca9137db5c66ca0d.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/170e22d42c192b1151c770bcfc679c61bf9ab2a6dbf4afcc69a6a001c4a521a4.json b/backend/.llm_cache/170e22d42c192b1151c770bcfc679c61bf9ab2a6dbf4afcc69a6a001c4a521a4.json new file mode 100644 index 0000000..d447fb6 --- /dev/null +++ b/backend/.llm_cache/170e22d42c192b1151c770bcfc679c61bf9ab2a6dbf4afcc69a6a001c4a521a4.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "P0201_duplicate_fixture_tag_FD1", "category": "tag_or_reference_inconsistency", "severity": "medium", "confidence": "high", "location": "Men's and Women's Restrooms", "disciplines": ["Plumbing"], "sheets": ["P02.01"], "description": "The fixture tag 'FD-1' is used for two separate floor drains, one located in the Men's Restroom and another in the Women's Restroom. Fixture tags must be unique to avoid ambiguity in fixture schedules, procurement, and installation. One tag should be revised, for example, to 'FD-2'.", "evidence": [{"discipline": "Plumbing", "sheet": "P02.01", "source_text": "3\"FD-1", "asserted_value": "Fixture tag for floor drain in Men's Restroom"}, {"discipline": "Plumbing", "sheet": "P02.01", "source_text": "3\"FD-1", "asserted_value": "Fixture tag for floor drain in Women's Room"}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/172070abad073c6fa099f57ce147405f0e9648f0656544adae30703b9a36e9ce.json b/backend/.llm_cache/172070abad073c6fa099f57ce147405f0e9648f0656544adae30703b9a36e9ce.json new file mode 100644 index 0000000..b30cd1d --- /dev/null +++ b/backend/.llm_cache/172070abad073c6fa099f57ce147405f0e9648f0656544adae30703b9a36e9ce.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "CLEANING_SUPPLIES_STORAGE_1_missing_mop_sink", "category": "missing_element", "severity": "medium", "confidence": "high", "location": "Room CLEANING SUPPLIES/STORAGE", "disciplines": ["Plumbing", "Architectural"], "sheets": ["P02.01", "A23.01", "A24.01"], "description": "The plumbing plan P02.01 indicates a mop sink (MS-1) and associated drains (FD-1, FS-1) within the 'CLEANING SUPPLIES/STORAGE' room. These fixed plumbing fixtures are not shown on the architectural plans, including the Finish Plan (A23.01) and Furniture/Power/Data Plan (A24.01). Architectural plans should show fixed equipment for proper spatial coordination, wall blocking confirmation, and finish application.", "evidence": [{"discipline": "Plumbing", "sheet": "P02.01", "source_text": "MS-1", "asserted_value": "Mop Sink MS-1 is shown in this room."}, {"discipline": "Architectural", "sheet": "A23.01", "source_text": "CLEANING SUPPLIES/STORAGE", "asserted_value": "Architectural Finish Plan shows this room as empty, with no fixed equipment like a mop sink."}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/17cb9dfef45ce2282dafae5a61dac242901707843115216ee61ac38d46660b2e.json b/backend/.llm_cache/17cb9dfef45ce2282dafae5a61dac242901707843115216ee61ac38d46660b2e.json new file mode 100644 index 0000000..49e0f7f --- /dev/null +++ b/backend/.llm_cache/17cb9dfef45ce2282dafae5a61dac242901707843115216ee61ac38d46660b2e.json @@ -0,0 +1 @@ +{"issues": [{"issue_id": "PROJ-G1104-1", "source_stage": "code", "category": "building_code", "severity": "critical", "confidence": "high", "location": "Sheet G11.04 - FIRE CODE DESIGN AND COMPLIANCE REVIEW", "disciplines": ["General", "Architectural"], "sheets": ["G11.04"], "description": "The Fire Code Design and Compliance Review sheet cites the 2021 IBC for area limitations. However, the project's adopted code profile for Harris County specifies the 2015 IBC. All design calculations, including area, height, and egress, must be based on the legally adopted 2015 IBC.", "evidence": [{"discipline": "General", "sheet": "G11.04", "source_text": "AREA LIMITATION: UNLIMITED (TABLES 504.3, 504.4, 506.2 IBC 2021)", "asserted_value": "IBC 2021"}], "recommended_resolution": "Verify the adopted code with Harris County. If it is the 2015 IBC, revise all code analysis and design elements on sheet G11.04 and throughout the drawing set to comply with the 2015 IBC and remove references to the 2021 IBC.", "code_reference": null}, {"issue_id": "PROJ-G1102-1", "source_stage": "code", "category": "ada", "severity": "high", "confidence": "high", "location": "Sheet G11.02 - SYMBOLS & TYPICAL HEIGHTS, Door Hardware Detail", "disciplines": ["Architectural", "General"], "sheets": ["G11.02"], "description": "The typical mounting height for door hardware is specified as 33\"-36\" AFF. The ADA requires operable parts of door hardware to be a minimum of 34 inches above the finished floor. Installing hardware at 33 inches would not be compliant.", "evidence": [{"discipline": "General", "sheet": "G11.02", "source_text": "33\"-36\" AFF", "asserted_value": "33-36"}], "recommended_resolution": "Revise the typical mounting height detail on sheet G11.02 to specify a range of 34 inches minimum to 48 inches maximum to the operable part of the hardware, in accordance with ADA 404.2.7. Ensure all door hardware in the project adheres to this revised range.", "code_reference": "ADA 404.2.7"}, {"issue_id": "PROJ-A5101-1", "source_stage": "code", "category": "ada", "severity": "high", "confidence": "high", "location": "Sheet A51.01, Detail 3 - ENLARGED RESTROOM PLAN", "disciplines": ["Architectural"], "sheets": ["A51.01"], "description": "The door to the single-user restroom swings inward and directly into the clear floor space required for the water closet fixture. This obstructs access to the fixture and violates accessibility standards.", "evidence": [{"discipline": "Architectural", "sheet": "A51.01", "source_text": "Image evidence: Door swing arc shown overlapping the toilet fixture on the Enlarged Restroom Plan.", "asserted_value": "Inward door swing obstructing fixture."}], "recommended_resolution": "Revise the restroom layout. The recommended solution is to reverse the door to swing out into the corridor, ensuring it does not obstruct the accessible route. Alternatively, reconfigure the restroom interior so the door swing does not encroach on any fixture clearances.", "code_reference": "ADA 603.2.3"}, {"issue_id": "PROJ-A5101-2", "source_stage": "code", "category": "ada", "severity": "high", "confidence": "high", "location": "Sheet A51.01, Detail 5 - INTERIOR ELEVATION - RESTROOM", "disciplines": ["Architectural"], "sheets": ["A51.01"], "description": "The restroom elevation detail shows the 36-inch rear grab bar centered on the water closet. Standard accessibility requirements specify that where a water closet is positioned near a side wall (e.g., 18 inches on center), the rear grab bar must be offset to provide adequate support, typically by extending 12 inches from the toilet centerline towards the near wall and 24 inches towards the open side. The centered installation shown is non-compliant.", "evidence": [{"discipline": "Architectural", "sheet": "A51.01", "source_text": "Image evidence: Interior elevation showing rear grab bar centered above toilet.", "asserted_value": "Centered rear grab bar."}], "recommended_resolution": "Revise the restroom plan and elevation details to show the rear grab bar offset from the toilet centerline in accordance with accessibility standards. For a toilet 18 inches from the wall, the bar should extend 12 inches toward the near side wall and 24 inches toward the open side.", "code_reference": null}]} \ No newline at end of file diff --git a/backend/.llm_cache/17fbff8dd54e4c46f402df702acd3ac5accf91387d3976dbeb2e91f2a72ccfbb.json b/backend/.llm_cache/17fbff8dd54e4c46f402df702acd3ac5accf91387d3976dbeb2e91f2a72ccfbb.json new file mode 100644 index 0000000..b87cb58 --- /dev/null +++ b/backend/.llm_cache/17fbff8dd54e4c46f402df702acd3ac5accf91387d3976dbeb2e91f2a72ccfbb.json @@ -0,0 +1 @@ +{"issues": [{"issue_id": "CBI-001", "source_stage": "constructability", "category": "other", "severity": "critical", "confidence": "high", "location": "General Notes and Project Description", "disciplines": ["General"], "sheets": ["G11.04", "G21.01", "G31.02"], "description": "The project scope is defined inconsistently as both a 'FIRST GENERATION RETAIL SPACE' build-out (implying an empty shell) and a 'TENANT INTERIOR REMODEL' (implying existing construction to be demolished). Specification 02 41 00 for selective demolition also implies a remodel. This ambiguity presents a major risk to bidders who cannot accurately determine the scope of demolition work.", "evidence": [{"discipline": "General", "sheet": "G11.04", "source_text": "PROJECT IS A TENANT INTERIOR LEASE SPACE BUILD OUT FOR A FIRST GENERATION RETAIL SPACE.", "asserted_value": "First Generation Build-out"}, {"discipline": "General", "sheet": "G21.01", "source_text": "PROJECT IS A TENANT INTERIOR REMODEL OF 3,323 SF", "asserted_value": "Remodel"}], "recommended_resolution": "Clarify if the project is a first-generation build-out or a remodel and ensure all drawing sheets consistently reflect the correct scope of work, particularly regarding demolition.", "code_reference": null}, {"issue_id": "CBI-002", "source_stage": "constructability", "category": "access_clearance", "severity": "critical", "confidence": "high", "location": "INVENTORY Room, West Wall", "disciplines": ["Architectural", "Plumbing"], "sheets": ["A24.01", "P02.02"], "description": "The Architectural plan shows a Network Rack System to be mounted on the west wall of the INVENTORY room, while the Plumbing plan shows the Electric Water Heater (EWH-1) mounted in the exact same location. These two pieces of equipment cannot occupy the same space, creating a direct spatial clash.", "evidence": [{"discipline": "Architectural", "sheet": "A24.01", "source_text": "RACK SYSTEM ABOVE SAFE @ -74\" TO BOTTOM", "asserted_value": "Network Rack is located on west wall of Inventory room."}, {"discipline": "Plumbing", "sheet": "P02.02", "source_text": "EWH-1", "asserted_value": "Electric Water Heater is located on west wall of Inventory room."}], "recommended_resolution": "Coordinate the architectural, plumbing, and electrical drawings to relocate either the network rack or the water heater to resolve the spatial clash. It is strongly advised not to locate water-bearing equipment above or adjacent to sensitive electronic equipment.", "code_reference": null}, {"issue_id": "CBI-003", "source_stage": "constructability", "category": "support_anchorage", "severity": "critical", "confidence": "high", "location": "Roof", "disciplines": ["Architectural", "Mechanical"], "sheets": ["A25.01", "M01.01", "M02.02"], "description": "The Architectural Roof Plan (A25.01) shows and provides dimensions for only one new Rooftop Unit (RTU). The Mechanical Roof Plan (M02.02) and schedule (M01.01) clearly indicate two new RTUs (RTU-1 & RTU-2). This discrepancy poses a risk that structural support, roof curbs, and warranty-compliant penetrations may only be provided for one unit, leaving the second unit without required support.", "evidence": [{"discipline": "Architectural", "sheet": "A25.01", "source_text": "2 NEW RTU, PROVIDE NEW MECHANICAL ROOF CURBS AS NECESSARY...", "asserted_value": "Architectural roof plan shows one graphic location for 'NEW RTU'."}, {"discipline": "Mechanical", "sheet": "M02.02", "source_text": "RTU-1, RTU-2", "asserted_value": "Mechanical roof plan shows two distinct RTUs."}, {"discipline": "Mechanical", "sheet": "M01.01", "source_text": "TAG: RTU-1,2; MFR. CARRIER; MODEL 50FE-M07", "asserted_value": "Mechanical schedule lists two RTUs."}], "recommended_resolution": "The Architectural and Mechanical plans must be coordinated. The Architectural Roof Plan should be updated to show the correct quantity and locations for both RTUs to ensure proper structural and roofing provisions are made.", "code_reference": null}, {"issue_id": "CBI-004", "source_stage": "constructability", "category": "detail_gap", "severity": "high", "confidence": "high", "location": "Ceilings, throughout space", "disciplines": ["Architectural", "General"], "sheets": ["A22.01", "A23.01", "G31.05"], "description": "There is a fundamental conflict in the ceiling material specified. The Reflected Ceiling Plan (A22.01) and Finish Plan (A23.01) both specify an acoustical tile ceiling (AT-1) throughout the space. However, the Gypsum Board specification (09 29 00 on sheet G31.05) explicitly includes a specification for 5/8\" gypsum board on ceilings. This ambiguity affects bidding and the entire interior construction sequence.", "evidence": [{"discipline": "Architectural", "sheet": "A23.01", "source_text": "N. CEILING THROUGHOUT ENTIRE SPACE TO BE AT-1 ACOUSTIC CEILING TILE WITH C4-A CEILING GRID.", "asserted_value": "Acoustic Tile Ceiling"}, {"discipline": "General", "sheet": "G31.05", "source_text": "THICKNESS: ... B. CEILINGS: 5/8 INCH.", "asserted_value": "Gypsum Board Ceiling"}], "recommended_resolution": "Clarify the intended ceiling material. If both are used in different areas, the plans and specifications must be updated to clearly delineate the locations of each ceiling type. If only one type is intended, the conflicting specification or plan note should be removed.", "code_reference": null}, {"issue_id": "CBI-005", "source_stage": "constructability", "category": "support_anchorage", "severity": "high", "confidence": "high", "location": "LOUNGE and INVENTORY room ceiling space", "disciplines": ["Plumbing", "Electrical"], "sheets": ["E02.01", "E05.02", "P02.02", "P03.01"], "description": "Heavy equipment, including a transformer (E02.01, Note 7) and a 30-gallon water heater (P02.02, Note 1), is required to be suspended from the structure. The supporting details on E05.02 and P03.01 are incomplete and defer final design, with E05.02 stating 'Verify support sizing and designed with project structural engineer'. The contractor cannot build or price this work without a complete, engineered design for anchoring these heavy point loads to the primary building structure.", "evidence": [{"discipline": "Electrical", "sheet": "E05.02", "source_text": "VERIFY SUPPORT SIZING AND DESIGNED WITH PROJECT STRUCTURAL ENGINEER PRIOR TO ASSEMBLY.", "asserted_value": "Suspended transformer support requires external engineering."}, {"discipline": "Plumbing", "sheet": "P03.01", "source_text": "2\" UNISTRUT SUPPORT. 1/2\" ALL THREADED RODS COMPLETE WITH DOUBLE NUTS AND LOCK WASHERS.", "asserted_value": "Water heater support detail does not specify connection to primary structure."}], "recommended_resolution": "Provide complete, engineered structural details for suspending the transformer and the water heater. Details must show the connection method to the primary building structure and specify all required members, bracing, and fasteners.", "code_reference": null}, {"issue_id": "CBI-006", "source_stage": "constructability", "category": "dimension_closure", "severity": "high", "confidence": "high", "location": "Detail 5/A51.01 TYPICAL RESTROOM", "disciplines": ["Architectural"], "sheets": ["A51.01"], "description": "The typical restroom lavatory detail contains contradictory dimensional requirements for the toe clearance. The detail simultaneously calls for a '9\" MIN. TOE CLEAR' and a '6\" MAX. TOE CLEAR'. It is impossible to build something that is both a minimum of 9 inches and a maximum of 6 inches.", "evidence": [{"discipline": "Architectural", "sheet": "A51.01", "source_text": "9\" MIN. TOE CLEAR", "asserted_value": "Minimum 9 inches"}, {"discipline": "Architectural", "sheet": "A51.01", "source_text": "6\" MAX. TOE CLEAR", "asserted_value": "Maximum 6 inches"}], "recommended_resolution": "Review the accessibility requirements and correct the detail to show a single, valid, and buildable range for the toe clearance dimension.", "code_reference": null}, {"issue_id": "CBI-007", "source_stage": "constructability", "category": "access_clearance", "severity": "high", "confidence": "high", "location": "LOUNGE", "disciplines": ["Architectural", "Electrical"], "sheets": ["A24.01", "E01.02"], "description": "The Architectural Furniture/Power/Data plan shows a single generic 'PANEL' symbol on the east wall of the Lounge. The Electrical Panel Schedules on E01.02 list two separate panels, 'H' and 'L', both located in the Lounge. The architectural plan does not provide adequate space or location information for two panels, creating a risk of insufficient wall space, missing backing, and clearance violations.", "evidence": [{"discipline": "Architectural", "sheet": "A24.01", "source_text": "PANEL", "asserted_value": "One panel symbol shown on plan"}, {"discipline": "Electrical", "sheet": "E01.02", "source_text": "PANEL NAME H, LOCATION LOUNGE... PANEL NAME L, LOCATION LOUNGE", "asserted_value": "Two panels scheduled in Lounge"}], "recommended_resolution": "Coordinate the architectural and electrical plans. The architectural plan should be updated to show the correct quantity, size, and location of both electrical panels 'H' and 'L' to ensure adequate space and support are provided.", "code_reference": null}, {"issue_id": "CBI-008", "source_stage": "constructability", "category": "other", "severity": "high", "confidence": "high", "location": "General Notes", "disciplines": ["General", "Architectural", "Electrical"], "sheets": ["G21.01", "A23.01", "E01.01"], "description": "Multiple, conflicting editions of governing building codes are cited across the drawing set. Sheet G21.01 references the 2018 IBC and 2014 NEC, while other sheets (A23.01, E01.01) reference the 2021 IBC and 2023 NEC. A contractor cannot determine which set of regulations to follow, creating significant bidding and construction risk.", "evidence": [{"discipline": "General", "sheet": "G21.01", "source_text": "2018 INTERNATIONAL BUILDING CODE (IBC) CH. 2-10", "asserted_value": "2018 IBC"}, {"discipline": "Architectural", "sheet": "A23.01", "source_text": "INTERIOR FINISHES TO COMPLY WITH IBC...OF 2021 IBC.", "asserted_value": "2021 IBC"}, {"discipline": "General", "sheet": "G21.01", "source_text": "2023 STATE OF TEXAS ADOPTED 2014 NFPA 70 NATIONAL ELECTRICAL CODE (NEC)", "asserted_value": "2014 NEC"}, {"discipline": "Electrical", "sheet": "E01.01", "source_text": "CONTRACTOR SHALL CONFORM TO ALL LOCAL, STATE, AND APPLICABLE CODES, 2023 NEC, 2021 IBC, 2021 IECC, NFPA, ETC.", "asserted_value": "2023 NEC"}], "recommended_resolution": "Determine the single correct edition for each applicable code (IBC, NEC, etc.) enforced by the Authority Having Jurisdiction for this project. Update all references throughout the entire drawing set to be consistent.", "code_reference": null}, {"issue_id": "CBI-009", "source_stage": "constructability", "category": "tolerance_fit", "severity": "medium", "confidence": "high", "location": "INVENTORY Room, West Wall", "disciplines": ["Architectural", "Electrical"], "sheets": ["A24.01", "E04.01"], "description": "The Architectural plan states the network rack is to be mounted with its bottom at 74 inches Above Finished Floor (AFF). The Special Systems (Data) plan shows the corresponding data outlets on the same wall at 18 inches AFF. The significant vertical separation between the equipment and its termination points will lead to impractical and messy field wiring. The outlet height is not coordinated with the equipment it serves.", "evidence": [{"discipline": "Architectural", "sheet": "A24.01", "source_text": "RACK SYSTEM ABOVE SAFE @ -74\" TO BOTTOM", "asserted_value": "Rack bottom at 74\" AFF"}, {"discipline": "Electrical", "sheet": "E04.01", "source_text": "(2) CAT.6/18\"", "asserted_value": "Data outlets at 18\" AFF"}], "recommended_resolution": "Coordinate the data outlet mounting height with the network rack configuration. Relocate the data outlets to a height appropriate for termination within or immediately adjacent to the rack system.", "code_reference": null}, {"issue_id": "CBI-010", "source_stage": "constructability", "category": "detail_gap", "severity": "medium", "confidence": "high", "location": "Slab Penetration Pour Back", "disciplines": ["General", "Plumbing"], "sheets": ["G11.03", "P03.01"], "description": "There are conflicting specifications for the vapor barrier required at concrete slab pour-backs. The Landlord Work Letter (G11.03) mandates a '15 Mil vapor barrier', while the Plumbing detail for pipe sleeves through the slab (P03.01) specifies a 'MINIMUM 6-MIL' vapor retarder. The contractor needs a single, clear requirement to follow to avoid disputes and ensure compliance with landlord requirements.", "evidence": [{"discipline": "General", "sheet": "G11.03", "source_text": "ii. 15 Mil vapor barrier", "asserted_value": "15 Mil"}, {"discipline": "Plumbing", "sheet": "P03.01", "source_text": "POLYETHYLENE VAPOR RETARDER MINIMUM 6-MIL SHALL BE REQUIRED.", "asserted_value": "6 Mil"}], "recommended_resolution": "Clarify the required vapor barrier thickness and material specification. Typically landlord requirements are governing, so the plumbing detail should likely be revised to match the 15 Mil requirement on sheet G11.03.", "code_reference": null}, {"issue_id": "CBI-011", "source_stage": "constructability", "category": "detail_gap", "severity": "medium", "confidence": "high", "location": "Fire Rated Penetrations", "disciplines": ["Electrical", "Plumbing", "General"], "sheets": ["E05.01", "P01.01", "G31.04"], "description": "The Electrical detail 4/E05.01 prescriptively calls for a '3 HOUR RATED CAULK' at sleeved penetrations. This contradicts general notes on G31.04 and P01.01, which require firestopping systems to have a UL-listed assembly with a rating matching the construction being penetrated. Using a fixed 3-hour rating is potentially non-compliant for a 4-hour wall or over-specified and more costly for a 1-hour wall, creating ambiguity for the contractor.", "evidence": [{"discipline": "Electrical", "sheet": "E05.01", "source_text": "PACK BOTH ENDS OF SLEEVE WITH 3M FIRE DAM 150 3 HOUR RATED CAULK OR APPROVED EQUAL", "asserted_value": "Prescriptive 3 Hour Rating"}, {"discipline": "General", "sheet": "G31.04", "source_text": "FIRESTOPPING: TESTED IN ACCORDANCE WITH ASTM E119 OR UL 263 TO MEET THE HOURLY F-RATINGS OF THE CONSTRUCTION BEING PENETRATED.", "asserted_value": "Performance-based: Match rating of penetrated assembly."}], "recommended_resolution": "Revise the electrical detail to remove the prescriptive 3-hour rating. The note should be changed to require a UL-listed firestop assembly with an F-rating equal to or greater than the fire-resistance rating of the wall or floor being penetrated, consistent with the rest of the contract documents.", "code_reference": null}]} \ No newline at end of file diff --git a/backend/.llm_cache/19da242da7c54b44c8b3dab0efca13495d9491aed527b6fea2ef8c2c777e1948.json b/backend/.llm_cache/19da242da7c54b44c8b3dab0efca13495d9491aed527b6fea2ef8c2c777e1948.json new file mode 100644 index 0000000..6c4e89e --- /dev/null +++ b/backend/.llm_cache/19da242da7c54b44c8b3dab0efca13495d9491aed527b6fea2ef8c2c777e1948.json @@ -0,0 +1 @@ +{"sheet_number": "G31.04", "discipline": "General", "sheet_title": "SPECIFICATIONS", "level": null, "scale": null, "assertions": [{"subject": "Architectural Woodwork", "attribute": "reference_standard", "value": "North American Architectural Woodwork Standards (NAAWS), current edition", "source_text": "REFERENCES: MINIMUM STANDARDS FOR WORK IN THIS SECTION SHALL BE IN CONFORMITY WITH THE NORTH AMERICAN ARCHITECTURAL WOODWORK STANDARDS (NAAWS), CURRENT EDITION.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "064000"}}, {"subject": "Wood Veneer Faced Paneling", "attribute": "material_specification", "value": "Use fire-retardant treated MDF core for panel fabrication unless indicated otherwise.", "source_text": "FIRE RETARDANT TREATED MDF CORE FOR PANEL FABRICATION UNLESS INDICATED OTHERWISE.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "064000 2.1.C.2"}}, {"subject": "Architectural Woodwork", "attribute": "installation_tolerance", "value": "1/16", "source_text": "MAXIMUM VARIATION FROM TRUE POSITION: 1/16 INCH UNLESS OTHERWISE SPECIFIED.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "064000 3.1.E.1"}}, {"subject": "Architectural Woodwork", "attribute": "installation_tolerance", "value": "1/32", "source_text": "MAXIMUM VARIATION FROM TRUE ALIGNMENT WITH ABUTTING MATERIALS: 1/32 INCH UNLESS OTHERWISE SPECIFIED OR REQUIRED BY NAWWS GRADE.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "064000 3.1.E.2"}}, {"subject": "Solid Surfacing Fabrications", "attribute": "warranty_duration", "value": "10", "source_text": "WARRANTY: PROVIDE MANUFACTURER'S 10 YEAR WARRANTY AGAINST DEFECTS IN MATERIALS AND WORKMANSHIP.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "066110 4.B"}}, {"subject": "Solid Surfacing Fabrications", "attribute": "installation_tolerance", "value": "1/8 inch in 10 feet, noncumulative", "source_text": "MAXIMUM VARIATION FROM LEVEL AND PLUMB: 1/8 INCH IN 10 FEET, NONCUMULATIVE.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "066110 3.1.E.4.A"}}, {"subject": "Solid Surfacing Fabrications", "attribute": "installation_tolerance", "value": "plus or minus 1/16", "source_text": "MAXIMUM JOINT WIDTH BETWEEN ADJACENT PIECES AT JOINT: PLUS OR MINUS 1/16.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "066110 3.1.E.4.B"}}, {"subject": "Firestopping", "attribute": "testing_standard", "value": "ASTM E119 or UL 263", "source_text": "FIRESTOPPING: TESTED IN ACCORDANCE WITH ASTM E119 OR UL 263 TO MEET THE HOURLY F-RATINGS OF THE CONSTRUCTION BEING PENETRATED.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "078400 3.B"}}, {"subject": "Firestopping", "attribute": "listing_requirement", "value": "UL Assemblies", "source_text": "EXCEPT WHERE OTHER RATED ASSEMBLIES ARE REQUIRED BY THE CODE AUTHORITY, FIRESTOPPING SYSTEMS SHALL BE UL ASSEMBLIES.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "078400 3.C"}}, {"subject": "Joint Sealants", "attribute": "VOC_content", "value": "250", "source_text": "VOLATILE ORGANIC COMPOUND (VOC) CONTENT: SEALANTS SHALL MEET THE REQUIREMENTS OF SCAQMD RULE 1168; (MAX VOC CONTENT 250 GRAMS/LITER).", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "079200 2.1.A.1"}}, {"subject": "Hollow Metal Doors", "attribute": "fire_rating", "value": "90", "source_text": "WHERE REQUIRED, INSTALLED FRAME AND DOOR ASSEMBLY SHALL CONFORM TO A 90 MINUTE RATED CLASS C INDICATED.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "081113 3.B.1"}}, {"subject": "Hollow Metal Doors", "attribute": "fire_rating", "value": "1-hour", "source_text": "INCLUDE 1-HOUR LABEL ON FIRE RATED DOOR ASSEMBLIES LOCATED AT 1 HOUR RATED EXIT CORRIDORS.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "081113 3.B.3"}}, {"subject": "Hollow Metal Doors", "attribute": "face_sheet_thickness", "value": "18", "source_text": "ANSI A250.8, SEAMLESS, MINIMUM 18 GAGE FACE SHEETS.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "081113 2.1.C.1"}}, {"subject": "Hollow Metal Doors", "attribute": "hinge_reinforcement_thickness", "value": "7", "source_text": "HINGE REINFORCEMENTS FOR FULL MORTISE HINGES: MINIMUM 7 GAGE.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "081113 2.1.D.1"}}, {"subject": "Hollow Metal Doors", "attribute": "lock_reinforcement_thickness", "value": "16", "source_text": "LOCK REINFORCEMENTS: MINIMUM 16 GAGE.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "081113 2.1.D.2"}}, {"subject": "Hollow Metal Doors", "attribute": "closer_reinforcement_thickness", "value": "14", "source_text": "CLOSER REINFORCEMENTS: MINIMUM 14 GAGE, 20 INCHES LONG.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "081113 2.1.D.3"}}, {"subject": "Hollow Metal Doors", "attribute": "door_thickness", "value": "1-3/4", "source_text": "THICKNESS: 1-3/4 INCH, UNLESS OTHERWISE NOTED ON DRAWINGS.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "081113 2.1.E.8"}}, {"subject": "Hollow Metal Doors", "attribute": "clearance", "value": "1/8 inch at head and each jamb.", "source_text": "CLEARANCES: FABRICATE FOR 1/8 INCH CLEARANCE AT HEAD AND EACH JAMB.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "081113 2.1.E.10"}}, {"subject": "Hollow Metal Doors", "attribute": "undercut", "value": "3/8", "source_text": "3/8 INCH AT SILL WHERE NO THRESHOLD", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "081113 2.1.E.10"}}]} \ No newline at end of file diff --git a/backend/.llm_cache/1a0a5793ec6e7c9e20b422e169a7b6b27f72adceee0578546fe6ef8e0a1b5652.json b/backend/.llm_cache/1a0a5793ec6e7c9e20b422e169a7b6b27f72adceee0578546fe6ef8e0a1b5652.json new file mode 100644 index 0000000..45439d3 --- /dev/null +++ b/backend/.llm_cache/1a0a5793ec6e7c9e20b422e169a7b6b27f72adceee0578546fe6ef8e0a1b5652.json @@ -0,0 +1 @@ +{"issues": [{"issue_id": "code_version_conflict_01", "source_stage": "code", "category": "building_code", "severity": "critical", "confidence": "high", "location": "General Notes on Sheet G21.01", "disciplines": ["General", "Architectural"], "sheets": ["G21.01"], "description": "The Code/Exiting Plan sheet G21.01 states the project is designed to the 2018 International Building Code (IBC) and 2021 International Fire Code (IFC). However, the project's code profile indicates the Authority Having Jurisdiction (Harris County) has adopted the 2015 IBC and 2015 IFC. Designing to a code version that has not been adopted by the jurisdiction can lead to significant review comments and redesign. This fundamental discrepancy must be clarified with the AHJ.", "evidence": [{"discipline": "General", "sheet": "G21.01", "source_text": "2018 INTERNATIONAL BUILDING CODE (IBC) CH. 2-10 WITH HARRIS COUNTY AMENDMENTS", "asserted_value": "2018 INTERNATIONAL BUILDING CODE (IBC) CH. 2-10 WITH HARRIS COUNTY AMENDMENTS"}, {"discipline": "General", "sheet": "G21.01", "source_text": "2021 INTERNATIONAL FIRE CODE (IFC) WITH HARRIS COUNTY AMENDMENTS", "asserted_value": "2021 INTERNATIONAL FIRE CODE (IFC) WITH HARRIS COUNTY AMENDMENTS"}], "recommended_resolution": "Verify the currently adopted and enforced code editions with the Harris County Engineering Department and Harris County Fire Marshal's Office. Revise the design, drawings, and code analysis to comply with the correct, legally adopted code versions.", "code_reference": null}, {"issue_id": "accessibility_ramp_slip_resistance_01", "source_stage": "code", "category": "tas_tdlr", "severity": "high", "confidence": "high", "location": "Specification Section 09 30 00 on Sheet G31.05", "disciplines": ["General", "Architectural"], "sheets": ["G31.05"], "description": "Specification section 09 30 00 for Tiling requires a minimum Static Coefficient of Friction (SCOF) of 0.42 for ramps. The project is subject to the 2012 Texas Accessibility Standards (TAS), which under Section 302.1 requires a minimum SCOF of 0.8 for ramp surfaces. The specified value of 0.42 is substantially lower than the TAS requirement and would not provide a compliant slip-resistant surface.", "evidence": [{"discipline": "General", "sheet": "G31.05", "source_text": "STATIC COEFFICIENT OF FRICTION: MIN. 0.6 FOR LEVEL SURFACES, MIN. 0.42 FOR RAMPS PER ASTM C1028 OR ANSI A137.1.", "asserted_value": "min 0.42 SCOF"}], "recommended_resolution": "Revise specification 09 30 00 to require ramp surfaces to have a static coefficient of friction of at least 0.8 to comply with 2012 TAS Section 302.1. Verify that all specified flooring materials for ramps meet this requirement.", "code_reference": null}, {"issue_id": "ada_door_hardware_height_01", "source_stage": "code", "category": "ada", "severity": "medium", "confidence": "medium", "location": "All accessible doors", "disciplines": ["General", "Architectural"], "sheets": ["G11.02"], "description": "Operable parts of door hardware, such as handles, latches, and locks, must be mounted between 34 inches minimum and 48 inches maximum above the finish floor. The provided drawing assertions do not contain information confirming this mounting height. This is a critical accessibility requirement that should be explicitly defined on the drawings.", "evidence": [], "recommended_resolution": "Verify and explicitly note on the drawings (e.g., on the Typical Heights sheet G11.02 or in the Door Schedule) that all operable hardware for accessible doors is to be mounted between 34 inches and 48 inches above the finish floor.", "code_reference": "ADA 404.2.7"}, {"issue_id": "ada_restroom_door_swing_01", "source_stage": "code", "category": "ada", "severity": "high", "confidence": "low", "location": "MEN'S RESTROOM, WOMEN'S RESTROOM", "disciplines": ["Architectural", "Plumbing"], "sheets": ["G21.01", "P02.01", "P02.02"], "description": "Doors are not permitted to swing into the clear floor space or clearance required for any plumbing fixture in a multi-user restroom. Without dimensioned restroom plans, compliance cannot be verified. This is a common issue that can render fixtures inaccessible.", "evidence": [{"discipline": "General", "sheet": "G21.01", "source_text": "MEN'S RESTROOM", "asserted_value": "MEN'S RESTROOM"}, {"discipline": "General", "sheet": "G21.01", "source_text": "WOMEN'S RESTROOM", "asserted_value": "WOMEN'S RESTROOM"}], "recommended_resolution": "Review the enlarged restroom floor plans to ensure that door swings do not encroach upon the required clear floor space at any accessible fixture (water closet, lavatory, etc.). Adjust door swing, door location, or room layout as necessary to comply.", "code_reference": "ADA 603.2.3"}, {"issue_id": "ada_employee_work_area_access_01", "source_stage": "code", "category": "ada", "severity": "medium", "confidence": "low", "location": "INVENTORY, MANAGER'S OFFICE, SALES AREA", "disciplines": ["Architectural"], "sheets": ["G21.01"], "description": "Spaces used only by employees as work areas must be designed so that individuals with disabilities can approach, enter, and exit the space. The accessibility of circulation paths within these areas (e.g., Inventory, Manager's Office, behind sales counters) cannot be verified from the provided information. Common barriers include narrow door openings or constricted pathways.", "evidence": [{"discipline": "General", "sheet": "G21.01", "source_text": "INVENTORY", "asserted_value": "INVENTORY"}, {"discipline": "General", "sheet": "G21.01", "source_text": "MANAGER'S OFFICE", "asserted_value": "MANAGER'S OFFICE"}], "recommended_resolution": "Review the dimensioned floor plans to confirm that employee work areas are located on an accessible route and are provided with compliant door openings and clearances for approach, entry, and exit.", "code_reference": "ADA 203.9"}]} \ No newline at end of file diff --git a/backend/.llm_cache/1af0fb5846750100f9ad7fd0dff7cdac4dc6bda7c454d33f29d16263d6a71f3c.json b/backend/.llm_cache/1af0fb5846750100f9ad7fd0dff7cdac4dc6bda7c454d33f29d16263d6a71f3c.json new file mode 100644 index 0000000..17f1d69 --- /dev/null +++ b/backend/.llm_cache/1af0fb5846750100f9ad7fd0dff7cdac4dc6bda7c454d33f29d16263d6a71f3c.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "lounge_panel_quantity_mismatch", "category": "schedule_vs_plan_mismatch", "severity": "medium", "confidence": "high", "location": "LOUNGE", "disciplines": ["Architectural", "Electrical"], "sheets": ["A24.01", "E01.02"], "description": "The architectural plan shows a single electrical panel symbol labeled 'PANEL' on the wall in the Lounge, but the electrical schedules list two distinct panels (H and L) to be located in the Lounge. The architectural plan must be updated to show both panels to ensure adequate wall space and backing are provided during construction.", "evidence": [{"discipline": "Architectural", "sheet": "A24.01", "source_text": "PANEL", "asserted_value": "One electrical panel is shown on plan."}, {"discipline": "Electrical", "sheet": "E01.02", "source_text": "PANEL NAME H, LOCATION LOUNGE; PANEL NAME L, LOCATION LOUNGE", "asserted_value": "Two electrical panels (H and L) are scheduled in the Lounge."}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/1bc9e0cffeb4bbf75f78f58f03bcb4dc5002cc0e2f98bb0c93a13bfb95f16813.json b/backend/.llm_cache/1bc9e0cffeb4bbf75f78f58f03bcb4dc5002cc0e2f98bb0c93a13bfb95f16813.json new file mode 100644 index 0000000..b86d167 --- /dev/null +++ b/backend/.llm_cache/1bc9e0cffeb4bbf75f78f58f03bcb4dc5002cc0e2f98bb0c93a13bfb95f16813.json @@ -0,0 +1 @@ +{"normalized_assertions": [{"assertion_id": "E01.02#9", "original_value": "5'-5\"", "normalized_value": "65", "normalized_unit": "inches", "normalized_attribute": "mounting_height_AFF", "normalization_notes": "Converted feet to inches (5'-5\" = 65 inches).", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#10", "original_value": "Type X is a LED exit sign with Nickel Cadmium battery and self diagnostics.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "schedule_entry", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#11", "original_value": "Emergency egress operation in fixtures shall provide minimum 400 lumens for minimum 90 minutes.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "note", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#12", "original_value": "5", "normalized_value": "5", "normalized_unit": "kVA", "normalized_attribute": "connected_load", "normalization_notes": "Assumed unit based on context (Connected (KVA): 5).", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "E01.02#13", "original_value": "21", "normalized_value": "21", "normalized_unit": "kVA", "normalized_attribute": "connected_load", "normalization_notes": "Assumed unit based on context (Connected (KVA): 21).", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "E01.02#14", "original_value": "<17", "normalized_value": "<17", "normalized_unit": "kVA", "normalized_attribute": "connected_load", "normalization_notes": "Assumed unit based on context (Connected (KVA): <17).", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "E01.02#15", "original_value": "100", "normalized_value": "100", "normalized_unit": "amps", "normalized_attribute": "service_size", "normalization_notes": "Assumed unit based on context (100 AMPS).", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "E01.02#16", "original_value": "LOUNGE", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "equipment_location", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#17", "original_value": "SURFACE", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "mounting", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#18", "original_value": "LOUNGE", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "equipment_location", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E02.01#0", "original_value": "Coordinate final receptacle/data locations with architect/owner prior to rough-in.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "general_note", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E02.01#1", "original_value": "Coordinate final floorbox locations with architect/owner prior to rough-in.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "general_note", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E02.01#2", "original_value": "Refer to architectural drawings for dimensional locations of all outlets.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "general_note", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E02.01#3", "original_value": "Provide combination (power/data) Hubbell Systemone fully recessed floorbox #CFB4G25 with flush round cover (finish approved by architect).", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "keynote_assertion", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E02.01#4", "original_value": "Provide (power) Hubbell Systemone fully recessed floorbox #PFBI with flush round cover (finish approved by architect).", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "keynote_assertion", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E02.01#5", "original_value": "1-1/4\"C with pullstring for data to ceiling space above rack system in inventory room.", "normalized_value": "1.25", "normalized_unit": "inches", "normalized_attribute": "penetration", "normalization_notes": "Converted 1-1/4\" to decimal inches (1.25 inches).", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E02.01#6", "original_value": "Provide power for building sign. Coordinate final location and mounting height prior to rough-in.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "keynote_assertion", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E02.01#7", "original_value": "Furnish and install #10 Cu ground with ground lug for connection to network racks.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "keynote_assertion", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E02.01#8", "original_value": "(3) 3\" conduit sleeves from 6\" below dropped ceiling to 6\" above dropped ceiling.", "normalized_value": "3", "normalized_unit": "units", "normalized_attribute": "penetration", "normalization_notes": "Extracted quantity from (3) 3\" conduit sleeves.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "E02.01#9", "original_value": "Transformer to be suspended from structure at high level above accessible ceiling.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "keynote_assertion", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E02.02#0", "original_value": "1/4\" = 1'-0\"", "normalized_value": "0.25\" = 12\"", "normalized_unit": "inches", "normalized_attribute": "scale", "normalization_notes": "Converted feet to inches (1'-0\" = 12\") and simplified fraction (1/4\" = 0.25\").", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E03.01#0", "original_value": "1/4\" = 1'-0\"", "normalized_value": "0.25\" = 12\"", "normalized_unit": "inches", "normalized_attribute": "scale", "normalization_notes": "Converted feet to inches (1'-0\" = 12\") and simplified fraction (1/4\" = 0.25\").", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E03.01#1", "original_value": "Coordinate all light switch locations with architect/owner prior to rough-in.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "general_note", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E03.01#2", "original_value": "Connect all type 'X' emergency fixtures to nearest lighting circuit via non-switched hot leg. Provide fixtures with nickel cadmium battery.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "general_note", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E03.01#3", "original_value": "All lighting systems shall be tested to ensure proper calibration, adjustment, programming, and operation in accordance with IECC 2021 Section C408.3.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "general_note", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E03.01#4", "original_value": "Provide dimmer switch for control of sales area lighting. Coordinate final location with owner prior to rough-in.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "keynote_assertion", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E03.01#5", "original_value": "INVENTORY", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E03.01#6", "original_value": "RESTROOM", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E03.01#7", "original_value": "MANAGER'S OFFICE", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E03.01#8", "original_value": "CLEANING SUPPLIES/STORAGE", "normalized_value": null, "normalized_unit": "storage", "normalized_attribute": "room_name", "normalization_notes": "Normalized 'storage' as a category, though not explicitly stated in the original value.", "source_text_preserved": true, "normalization_confidence": "low"}, {"assertion_id": "E03.01#9", "original_value": "SALES AREA", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E03.01#10", "original_value": "fixture locations not matching arch", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "general_note", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#0", "original_value": "INVENTORY", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#1", "original_value": "LOUNGE", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#2", "original_value": "MEN'S RESTROOM", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#3", "original_value": "WOMEN'S RESTROOM", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#4", "original_value": "MANAGER'S OFFICE", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#5", "original_value": "CLEANING SUPPLIES/STORAGE", "normalized_value": null, "normalized_unit": "storage", "normalized_attribute": "room_name", "normalization_notes": "Normalized 'storage' as a category, though not explicitly stated in the original value.", "source_text_preserved": true, "normalization_confidence": "low"}, {"assertion_id": "E04.01#6", "original_value": "SALES AREA", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#7", "original_value": "2 CAT.6 cables at 18 inches AFF", "normalized_value": "2", "normalized_unit": "units", "normalized_attribute": "equipment_location", "normalization_notes": "Extracted quantity from '2 CAT.6 cables at 18 inches AFF'.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "E04.01#8", "original_value": "2 CAT.6 cables at 18 inches AFF", "normalized_value": "2", "normalized_unit": "units", "normalized_attribute": "equipment_location", "normalization_notes": "Extracted quantity from '2 CAT.6 cables at 18 inches AFF'.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "E04.01#9", "original_value": "2 CAT.6 cables at 18 inches AFF", "normalized_value": "2", "normalized_unit": "units", "normalized_attribute": "equipment_location", "normalization_notes": "Extracted quantity from '2 CAT.6 cables at 18 inches AFF'.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "E04.01#10", "original_value": "2 CAT.6 cables at 18 inches AFF", "normalized_value": "2", "normalized_unit": "units", "normalized_attribute": "equipment_location", "normalization_notes": "Extracted quantity from '2 CAT.6 cables at 18 inches AFF'.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "E04.01#11", "original_value": "2 CAT.6 cables at 18 inches AFF", "normalized_value": "2", "normalized_unit": "units", "normalized_attribute": "equipment_location", "normalization_notes": "Extracted quantity from '2 CAT.6 cables at 18 inches AFF'.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "E04.01#12", "original_value": "2 CAT.6 cables at 55 inches AFF", "normalized_value": "2", "normalized_unit": "units", "normalized_attribute": "equipment_location", "normalization_notes": "Extracted quantity from '2 CAT.6 cables at 55 inches AFF'.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "E04.01#13", "original_value": "2 CAT.6 cables at 38.5 inches AFF", "normalized_value": "2", "normalized_unit": "units", "normalized_attribute": "equipment_location", "normalization_notes": "Extracted quantity from '2 CAT.6 cables at 38.5 inches AFF'.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "E05.01#0", "original_value": "For an I.G. device, the conduit shall be suitable for a ground path or an additional ground shall be pulled to ground the box", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "grounding_requirement", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#1", "original_value": "Isolated ground bar shall be insulated from enclosure or installed if not existing, when indicated", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "grounding_requirement", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#2", "original_value": "Tie wire", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "prohibited_material", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#3", "original_value": "25", "normalized_value": "25", "normalized_unit": "%", "normalized_attribute": "future_capacity", "normalization_notes": "Assumed percentage based on context (25% future capacity).", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "E05.01#4", "original_value": "3/4\" TO 1\"", "normalized_value": "0.75\" TO 1\"", "normalized_unit": "inches", "normalized_attribute": "component_size", "normalization_notes": "Converted fraction to decimal (3/4\" = 0.75\").", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#5", "original_value": "1 1/4\" TO 6\"", "normalized_value": "1.25\" TO 6\"", "normalized_unit": "inches", "normalized_attribute": "component_size", "normalization_notes": "Converted fraction to decimal (1 1/4\" = 1.25\").", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#6", "original_value": "3 Hour", "normalized_value": "3", "normalized_unit": "hours", "normalized_attribute": "fire_rating", "normalization_notes": "Converted '3 Hour' to numerical value with unit.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#7", "original_value": "SCHEDULE 40 BLACK STEEL PIPE SLEEVE", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "material", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#8", "original_value": "1", "normalized_value": "1", "normalized_unit": "inches", "normalized_attribute": "installation_depth", "normalization_notes": "Assumed unit based on context (Minimum (1\") deep).", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "E05.01#9", "original_value": "6", "normalized_value": "6", "normalized_unit": "inches", "normalized_attribute": "extension_beyond_wall", "normalization_notes": "Assumed unit based on context (Extend conduit (6\") beyond wall).", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "E05.01#10", "original_value": "4-11/16\" square, 2-5/8\" deep", "normalized_value": "4.6875\" square, 2.625\" deep", "normalized_unit": "inches", "normalized_attribute": "size", "normalization_notes": "Converted fractions to decimals (11/16\" = 0.6875\", 5/8\" = 0.625\").", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#11", "original_value": "1", "normalized_value": "1", "normalized_unit": "inches", "normalized_attribute": "size", "normalization_notes": "Assumed unit based on context (1\" conduit minimum).", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "E05.01#12", "original_value": "6", "normalized_value": "6", "normalized_unit": "inches", "normalized_attribute": "stub_up_height", "normalization_notes": "Assumed unit based on context (Stub conduit 6\" into ceiling space).", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "E05.01#13", "original_value": "4'-0\"", "normalized_value": "48", "normalized_unit": "inches", "normalized_attribute": "grid_spacing", "normalization_notes": "Converted feet to inches (4'-0\" = 48 inches).", "source_text_preserved": true, "normalization_confidence": "high"}]} \ No newline at end of file diff --git a/backend/.llm_cache/1cbb2bbd558ba57450ae0afcb349be49fb42ae49d098238dbb6297580b416cdd.json b/backend/.llm_cache/1cbb2bbd558ba57450ae0afcb349be49fb42ae49d098238dbb6297580b416cdd.json new file mode 100644 index 0000000..d650c95 --- /dev/null +++ b/backend/.llm_cache/1cbb2bbd558ba57450ae0afcb349be49fb42ae49d098238dbb6297580b416cdd.json @@ -0,0 +1 @@ +{"issues": [{"issue_id": "VER-ELY-P02.01-001", "source_stage": "code", "category": "ada", "severity": "high", "confidence": "high", "location": "Women's Restroom", "disciplines": ["Plumbing", "Architectural"], "sheets": ["P02.01"], "description": "The plans indicate the only drinking fountain (EDF-1) is located inside the Women's Restroom. This denies access to drinking water for male occupants and any person unable to use the Women's Restroom, which does not provide equitable access to building amenities.", "evidence": [{"discipline": "Plumbing", "sheet": "P02.01", "source_text": "EDF-1", "asserted_value": "EDF-1 is located in WOMEN'S ROOM."}], "recommended_resolution": "Relocate the drinking fountain to a common use area accessible to all occupants, such as the Sales Area or a corridor. If only one fountain is provided, it must be a hi-lo unit to serve both standing persons and wheelchair users.", "code_reference": null}, {"issue_id": "VER-ELY-P03.01-001", "source_stage": "code", "category": "building_code", "severity": "low", "confidence": "high", "location": "Pipe Penetration Detail", "disciplines": ["Plumbing", "Architectural"], "sheets": ["P03.01"], "description": "A detail note on sheet P03.01 cites the '2021 IBC, CHAPTER 19, SECTION 1907' for a vapor retarder requirement. The project's adopted building code is the 2015 IBC. All code references on the drawings should align with the applicable code for the jurisdiction.", "evidence": [{"discipline": "Plumbing", "sheet": "P03.01", "source_text": "PER 2021 IBC, CHAPTER 19, SECTION 1907: POLYETHYLENE VAPOR RETARDER MINIMUM 6-MIL SHALL BE REQUIRED.", "asserted_value": "Vapor retarder detail cites 2021 IBC."}], "recommended_resolution": "Verify the vapor retarder requirement under the 2015 IBC and update the code citation on the drawing.", "code_reference": null}, {"issue_id": "VER-ELY-P03.01-002", "source_stage": "code", "category": "building_code", "severity": "medium", "confidence": "medium", "location": "Water Heater EWH-1", "disciplines": ["Plumbing"], "sheets": ["P02.02", "P03.01"], "description": "The Temperature and Pressure (T&P) relief valve drain line for water heater EWH-1 is routed from the unit's location above the ceiling to a floor sink below. Plumbing codes typically require the T&P discharge point to be readily observable to serve as a visual safety indicator of malfunction. Routing the drain through a concealed space before discharge may not meet this requirement's intent.", "evidence": [{"discipline": "Plumbing", "sheet": "P03.01", "source_text": "A.S.M.E. RATED TEMP. AND PRESSURE RELIEF VALVE. PIPE DISCHARGE 3/4\" TO FLOOR SINK PER PLANS", "asserted_value": "Pipe discharge 3/4\" to floor sink per plans"}, {"discipline": "Plumbing", "sheet": "P02.02", "source_text": "KEYED NOTE: 1 EWH-1 ABOVE CEILING SUSPENDED AS HIGH AS POSSIBLE IN CEILING PLENUM. PROVIDE AUXILIARY DRAIN PAN BELOW WATER HEATER...", "asserted_value": "EWH-1 is located above ceiling, suspended as high as possible in ceiling plenum and requires an auxiliary drain pan."}], "recommended_resolution": "Verify with the Authority Having Jurisdiction (Harris County) that this T&P drain termination method is acceptable. The International Plumbing Code generally requires the discharge to be visible.", "code_reference": null}]} \ No newline at end of file diff --git a/backend/.llm_cache/1cd3af1a1f14f4b719467ce4281e55fc1feb1355c136c6478fd3b36fd91bc53a.json b/backend/.llm_cache/1cd3af1a1f14f4b719467ce4281e55fc1feb1355c136c6478fd3b36fd91bc53a.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/1cd3af1a1f14f4b719467ce4281e55fc1feb1355c136c6478fd3b36fd91bc53a.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/241ab3138437ce1301c56e3c65610c1f7d7320521dffc5f32bd5bda41bff8f60.json b/backend/.llm_cache/241ab3138437ce1301c56e3c65610c1f7d7320521dffc5f32bd5bda41bff8f60.json new file mode 100644 index 0000000..1930a70 --- /dev/null +++ b/backend/.llm_cache/241ab3138437ce1301c56e3c65610c1f7d7320521dffc5f32bd5bda41bff8f60.json @@ -0,0 +1 @@ +{"sheet_index": [{"sheet_id": "page-1", "sheet_number": null, "sheet_title": "Page 1 (extraction failed)", "discipline": "Unknown", "drawing_type": "cover", "level": null, "page_number": 1, "qaqc_relevance": "low", "code_review_relevance": "none", "confidence": "low"}, {"sheet_id": "G11.01", "sheet_number": "G11.01", "sheet_title": "VICINITY PLAN, ABBREVIATIONS, PROJECT GENERAL NOTES & SHEET INDEX", "discipline": "Architectural", "drawing_type": "sheet_index", "level": null, "page_number": 2, "qaqc_relevance": "medium", "code_review_relevance": "low", "confidence": "high"}, {"sheet_id": "G11.02", "sheet_number": "G11.02", "sheet_title": "SYMBOLS & TYPICAL HEIGHTS", "discipline": "Architectural", "drawing_type": "notes", "level": null, "page_number": 3, "qaqc_relevance": "medium", "code_review_relevance": "low", "confidence": "high"}, {"sheet_id": "G11.03", "sheet_number": "G11.03", "sheet_title": "LANDLORD WORK LETTER", "discipline": "Architectural", "drawing_type": "notes", "level": "BUILDING C", "page_number": 4, "qaqc_relevance": "medium", "code_review_relevance": "low", "confidence": "high"}, {"sheet_id": "G11.04", "sheet_number": "G11.04", "sheet_title": "FIRE CODE DESIGN AND COMPLIANCE REVIEW", "discipline": "Architectural", "drawing_type": "code_life_safety", "level": null, "page_number": 5, "qaqc_relevance": "high", "code_review_relevance": "high", "confidence": "high"}, {"sheet_id": "G21.01", "sheet_number": "G21.01", "sheet_title": "CODE / EXITING PLAN", "discipline": "Architectural", "drawing_type": "code_life_safety", "level": null, "page_number": 6, "qaqc_relevance": "high", "code_review_relevance": "high", "confidence": "high"}, {"sheet_id": "G31.01", "sheet_number": "G31.01", "sheet_title": "SPECIFICATIONS", "discipline": "Specifications", "drawing_type": "specifications", "level": null, "page_number": 7, "qaqc_relevance": "low", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "G31.02", "sheet_number": "G31.02", "sheet_title": "SPECIFICATIONS", "discipline": "Specifications", "drawing_type": "specifications", "level": null, "page_number": 8, "qaqc_relevance": "low", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "G31.03", "sheet_number": "G31.03", "sheet_title": "SPECIFICATIONS", "discipline": "Specifications", "drawing_type": "specifications", "level": null, "page_number": 9, "qaqc_relevance": "low", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "G31.04", "sheet_number": "G31.04", "sheet_title": "SPECIFICATIONS", "discipline": "Specifications", "drawing_type": "specifications", "level": null, "page_number": 10, "qaqc_relevance": "low", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "G31.05", "sheet_number": "G31.05", "sheet_title": "SPECIFICATIONS", "discipline": "Specifications", "drawing_type": "specifications", "level": null, "page_number": 11, "qaqc_relevance": "low", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "G31.06", "sheet_number": "G31.06", "sheet_title": "UL RATINGS - DESIGN #U419", "discipline": "Fire Protection", "drawing_type": "detail", "level": null, "page_number": 12, "qaqc_relevance": "medium", "code_review_relevance": "high", "confidence": "high"}, {"sheet_id": "A11.01", "sheet_number": "A11.01", "sheet_title": "SITE PLAN", "discipline": "Architectural", "drawing_type": "site_plan", "level": null, "page_number": 13, "qaqc_relevance": "high", "code_review_relevance": "high", "confidence": "high"}, {"sheet_id": "page-14", "sheet_number": null, "sheet_title": "Page 14 (extraction failed)", "discipline": "Unknown", "drawing_type": null, "level": null, "page_number": 14, "qaqc_relevance": "low", "code_review_relevance": "none", "confidence": "low"}, {"sheet_id": "A22.01", "sheet_number": "A22.01", "sheet_title": "REFLECTED CEILING PLAN", "discipline": "Architectural", "drawing_type": "reflected_ceiling_plan", "level": null, "page_number": 15, "qaqc_relevance": "high", "code_review_relevance": "medium", "confidence": "high"}, {"sheet_id": "A23.01", "sheet_number": "A23.01", "sheet_title": "FINISH PLAN", "discipline": "Interiors", "drawing_type": "floor_plan", "level": null, "page_number": 16, "qaqc_relevance": "medium", "code_review_relevance": "low", "confidence": "high"}, {"sheet_id": "A24.01", "sheet_number": "A24.01", "sheet_title": "FURNITURE/ POWER/ DATA FLOOR PLAN", "discipline": "Architectural", "drawing_type": "floor_plan", "level": null, "page_number": 17, "qaqc_relevance": "high", "code_review_relevance": "low", "confidence": "high"}, {"sheet_id": "A25.01", "sheet_number": "A25.01", "sheet_title": "ROOF PLAN", "discipline": "Architectural", "drawing_type": "roof_plan", "level": "ROOF", "page_number": 18, "qaqc_relevance": "high", "code_review_relevance": "medium", "confidence": "high"}, {"sheet_id": "A51.01", "sheet_number": "A51.01", "sheet_title": "ELEVATIONS, ENLARGED PLANS, & DETAILS", "discipline": "Architectural", "drawing_type": "detail", "level": null, "page_number": 19, "qaqc_relevance": "high", "code_review_relevance": "medium", "confidence": "high"}, {"sheet_id": "page-20", "sheet_number": null, "sheet_title": "Page 20 (extraction failed)", "discipline": "Unknown", "drawing_type": null, "level": null, "page_number": 20, "qaqc_relevance": "low", "code_review_relevance": "none", "confidence": "low"}, {"sheet_id": "M01.01", "sheet_number": "M01.01", "sheet_title": "MECHANICAL NOTES & SCHEDULES", "discipline": "Mechanical", "drawing_type": "notes", "level": null, "page_number": 21, "qaqc_relevance": "medium", "code_review_relevance": "low", "confidence": "high"}, {"sheet_id": "page-22", "sheet_number": null, "sheet_title": "Page 22 (extraction failed)", "discipline": "Unknown", "drawing_type": null, "level": null, "page_number": 22, "qaqc_relevance": "low", "code_review_relevance": "none", "confidence": "low"}, {"sheet_id": "M02.02", "sheet_number": "M02.02", "sheet_title": "MECHANICAL ROOF PLAN", "discipline": "Mechanical", "drawing_type": "roof_plan", "level": "ROOF", "page_number": 23, "qaqc_relevance": "high", "code_review_relevance": "medium", "confidence": "high"}, {"sheet_id": "M03.01", "sheet_number": "M03.01", "sheet_title": "MECHANICAL DETAILS", "discipline": "Mechanical", "drawing_type": "detail", "level": null, "page_number": 24, "qaqc_relevance": "high", "code_review_relevance": "medium", "confidence": "high"}, {"sheet_id": "E01.01", "sheet_number": "E01.01", "sheet_title": "NOTES AND LEGEND", "discipline": "Electrical", "drawing_type": "notes", "level": null, "page_number": 25, "qaqc_relevance": "medium", "code_review_relevance": "low", "confidence": "high"}, {"sheet_id": "E01.02", "sheet_number": "E01.02", "sheet_title": "ONE LINE DIAGRAM AND SCHEDULES", "discipline": "Electrical", "drawing_type": "one_line", "level": null, "page_number": 26, "qaqc_relevance": "high", "code_review_relevance": "high", "confidence": "high"}, {"sheet_id": "E02.01", "sheet_number": "E02.01", "sheet_title": "FLOOR PLAN - POWER", "discipline": "Electrical", "drawing_type": "mep_plan", "level": null, "page_number": 27, "qaqc_relevance": "high", "code_review_relevance": "medium", "confidence": "high"}, {"sheet_id": "E02.02", "sheet_number": "E02.02", "sheet_title": "ROOF PLAN - POWER", "discipline": "Electrical", "drawing_type": "roof_plan", "level": "ROOF", "page_number": 28, "qaqc_relevance": "high", "code_review_relevance": "medium", "confidence": "high"}, {"sheet_id": "E03.01", "sheet_number": "E03.01", "sheet_title": "FLOOR PLAN - LIGHTING", "discipline": "Electrical", "drawing_type": "mep_plan", "level": null, "page_number": 29, "qaqc_relevance": "high", "code_review_relevance": "high", "confidence": "high"}, {"sheet_id": "E04.01", "sheet_number": "E04.01", "sheet_title": "FLOOR PLAN - SPECIAL SYSTEMS", "discipline": "Technology / Low Voltage", "drawing_type": "mep_plan", "level": null, "page_number": 30, "qaqc_relevance": "high", "code_review_relevance": "medium", "confidence": "high"}, {"sheet_id": "E05.01", "sheet_number": "E05.01", "sheet_title": "DETAILS", "discipline": "Electrical", "drawing_type": "detail", "level": null, "page_number": 31, "qaqc_relevance": "high", "code_review_relevance": "medium", "confidence": "high"}, {"sheet_id": "E05.02", "sheet_number": "E05.02", "sheet_title": "DETAILS", "discipline": "Electrical", "drawing_type": "detail", "level": null, "page_number": 32, "qaqc_relevance": "high", "code_review_relevance": "medium", "confidence": "high"}, {"sheet_id": "P01.01", "sheet_number": "P01.01", "sheet_title": "NOTES AND LEGEND", "discipline": "Plumbing", "drawing_type": "notes", "level": null, "page_number": 33, "qaqc_relevance": "medium", "code_review_relevance": "low", "confidence": "high"}, {"sheet_id": "P02.01", "sheet_number": "P02.01", "sheet_title": "FLOOR PLAN - SANITARY WASTE & VENT", "discipline": "Plumbing", "drawing_type": "mep_plan", "level": null, "page_number": 34, "qaqc_relevance": "high", "code_review_relevance": "high", "confidence": "high"}, {"sheet_id": "P02.02", "sheet_number": "P02.02", "sheet_title": "FLOOR PLAN - DOMESTIC WATER", "discipline": "Plumbing", "drawing_type": "mep_plan", "level": null, "page_number": 35, "qaqc_relevance": "high", "code_review_relevance": "high", "confidence": "high"}, {"sheet_id": "P03.01", "sheet_number": "P03.01", "sheet_title": "DETAILS & RISERS", "discipline": "Plumbing", "drawing_type": "riser_diagram", "level": null, "page_number": 36, "qaqc_relevance": "high", "code_review_relevance": "high", "confidence": "high"}], "missing_expected_sheets": [{"expected_sheet_type": "floor_plan", "reason": "Logical gap in architectural plan numbering (likely A21.01) before A22.01. Page 14 extraction failed in this location. A floor plan is fundamental to a drawing set.", "confidence": "high"}, {"expected_sheet_type": "mep_plan", "reason": "Logical gap in mechanical plan numbering (likely M02.01) before M02.02. Page 22 extraction failed in this location. A main level mechanical plan is expected.", "confidence": "high"}, {"expected_sheet_type": "structural_plan", "reason": "No sheets with an 'S' prefix are present. Structural drawings are typically required for any project involving new construction or significant renovation.", "confidence": "high"}, {"expected_sheet_type": "building_elevation", "reason": "A standard part of an architectural set. A51.01 mentions 'ELEVATIONS' but this may refer to interior or partial elevations, not primary building elevations.", "confidence": "medium"}, {"expected_sheet_type": "section", "reason": "Building sections are a standard part of an architectural set and are not explicitly listed.", "confidence": "medium"}, {"expected_sheet_type": "fire_alarm_plan", "reason": "No dedicated Fire Alarm sheets are present. E04.01 'Special Systems' may contain this information, but dedicated sheets are common and often required for life safety review.", "confidence": "medium"}]} \ No newline at end of file diff --git a/backend/.llm_cache/24fcbd4905e36d5813706ed04d12f7318f409186c1afe5446667d50bf4a48971.json b/backend/.llm_cache/24fcbd4905e36d5813706ed04d12f7318f409186c1afe5446667d50bf4a48971.json new file mode 100644 index 0000000..d517b7c --- /dev/null +++ b/backend/.llm_cache/24fcbd4905e36d5813706ed04d12f7318f409186c1afe5446667d50bf4a48971.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "9426f022-777b-4dfa-89ca-ca922d56a70e", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "Polished Concrete Floor PC-1", "disciplines": ["Architectural", "General"], "sheets": ["A23.01", "G31.05"], "description": "The finish plan note for Polished Concrete Floor (PC-1) requires a minimum Static Coefficient of Friction (SCOF) of 0.50. However, the general specification for Polished Concrete Flooring requires a minimum SCOF of 0.60 for level surfaces. These are conflicting performance requirements for the same floor finish, which will create ambiguity for the contractor during bidding and installation.", "evidence": [{"discipline": "Architectural", "sheet": "A23.01", "source_text": "SLIP RESISTANCE OF FLOOR TO BE NO LESS THAN A 0.50 STATIC COEFFICIENT OF FRICTION (SCOF)", "asserted_value": ">= 0.50 SCOF"}, {"discipline": "General", "sheet": "G31.05", "source_text": "STATIC COEFFICIENT OF FRICTION: MIN. 0.6 FOR LEVEL SURFACES, MIN. 0.42 FOR RAMPS PER ASTM C1028 OR ANSI A137.1.", "asserted_value": ">= 0.60 SCOF"}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/27a07b97ba6210766b0f40a9d31a6ce174f5fab1704934d80f15a4ab28256543.json b/backend/.llm_cache/27a07b97ba6210766b0f40a9d31a6ce174f5fab1704934d80f15a4ab28256543.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/27a07b97ba6210766b0f40a9d31a6ce174f5fab1704934d80f15a4ab28256543.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/290caff42dfea3171129e30e9da97bc612dd8555e9f3e1563cd975f38c206d70.json b/backend/.llm_cache/290caff42dfea3171129e30e9da97bc612dd8555e9f3e1563cd975f38c206d70.json new file mode 100644 index 0000000..f322817 --- /dev/null +++ b/backend/.llm_cache/290caff42dfea3171129e30e9da97bc612dd8555e9f3e1563cd975f38c206d70.json @@ -0,0 +1 @@ +{"sheet_number": "G21.01", "discipline": "General", "sheet_title": "CODE / EXITING PLAN", "level": null, "scale": "1/4\" = 1'-0\"", "assertions": [{"subject": "Room Name", "attribute": "room_name", "value": "INVENTORY", "source_text": "INVENTORY", "confidence": "high", "location_key": {"grid": null, "room": "INVENTORY", "level": null, "tag": null}}, {"subject": "Room Name", "attribute": "room_name", "value": "LOUNGE", "source_text": "LOUNGE", "confidence": "high", "location_key": {"grid": null, "room": "LOUNGE", "level": null, "tag": null}}, {"subject": "Room Name", "attribute": "room_name", "value": "MEN'S RESTROOM", "source_text": "MEN'S RESTROOM", "confidence": "high", "location_key": {"grid": null, "room": "MEN'S RESTROOM", "level": null, "tag": null}}, {"subject": "Room Name", "attribute": "room_name", "value": "WOMEN'S RESTROOM", "source_text": "WOMEN'S RESTROOM", "confidence": "high", "location_key": {"grid": null, "room": "WOMEN'S RESTROOM", "level": null, "tag": null}}, {"subject": "Room Name", "attribute": "room_name", "value": "MANAGER'S OFFICE", "source_text": "MANAGER'S OFFICE", "confidence": "high", "location_key": {"grid": null, "room": "MANAGER'S OFFICE", "level": null, "tag": null}}, {"subject": "Room Name", "attribute": "room_name", "value": "CLEANING SUPPLIES/STORAGE", "source_text": "CLEANING SUPPLIES/STORAGE", "confidence": "high", "location_key": {"grid": null, "room": "CLEANING SUPPLIES/STORAGE", "level": null, "tag": null}}, {"subject": "Room Name", "attribute": "room_name", "value": "SALES AREA", "source_text": "SALES AREA", "confidence": "high", "location_key": {"grid": null, "room": "SALES AREA", "level": null, "tag": null}}, {"subject": "Note", "attribute": "general_note", "value": "AUTHORITY HAVING JURISDICTION: HARRIS COUNTY", "source_text": "AUTHORITY HAVING JURISDICTION: HARRIS COUNTY", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Note", "attribute": "general_note", "value": "AUTHORITY HAVING JURISDICTION (ACCESSIBILITY): STATE OF TEXAS", "source_text": "STATE OF TEXAS (ACCESSIBILITY)", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Note", "attribute": "general_note", "value": "2018 INTERNATIONAL BUILDING CODE (IBC) CH. 2-10 WITH HARRIS COUNTY AMENDMENTS", "source_text": "2018 INTERNATIONAL BUILDING CODE (IBC) CH. 2-10 WITH HARRIS COUNTY AMENDMENTS", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Note", "attribute": "general_note", "value": "2021 INTERNATIONAL FIRE CODE (IFC) WITH HARRIS COUNTY AMENDMENTS", "source_text": "2021 INTERNATIONAL FIRE CODE (IFC) WITH HARRIS COUNTY AMENDMENTS", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Note", "attribute": "general_note", "value": "2021 STATE OF TEXAS ADOPTED INTERNATIONAL MECHANICAL CODE (IMC)", "source_text": "2021 STATE OF TEXAS ADOPTED INTERNATIONAL MECHANICAL CODE (IMC)", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Note", "attribute": "general_note", "value": "2018 STATE OF TEXAS ADOPTED INTERNATIONAL PLUMBING CODE (IPC)", "source_text": "2018 STATE OF TEXAS ADOPTED INTERNATIONAL PLUMBING CODE (IPC)", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Note", "attribute": "general_note", "value": "2023 STATE OF TEXAS ADOPTED 2014 NFPA 70 NATIONAL ELECTRICAL CODE (NEC)", "source_text": "2023 STATE OF TEXAS ADOPTED 2014 NFPA 70 NATIONAL ELECTRICAL CODE (NEC)", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Note", "attribute": "general_note", "value": "2012 TEXAS ACCESSIBILITY STANDARDS", "source_text": "2012 TEXAS ACCESSIBILITY STANDARDS", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Note", "attribute": "general_note", "value": "PROJECT IS A TENANT INTERIOR REMODEL OF 3,323 SF", "source_text": "PROJECT IS A TENANT INTERIOR REMODEL OF 3,323 SF", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Note", "attribute": "general_note", "value": "THE BUILDING IS FULLY SPRINKLERED", "source_text": "THE BUILDING IS FULLY SPRINKLERED.", "confidence": "medium", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}]} \ No newline at end of file diff --git a/backend/.llm_cache/2942a8450705536b95ed63d28d07115fb87041448ab46ac600c2b66f662f4cd5.json b/backend/.llm_cache/2942a8450705536b95ed63d28d07115fb87041448ab46ac600c2b66f662f4cd5.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/2942a8450705536b95ed63d28d07115fb87041448ab46ac600c2b66f662f4cd5.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/2b01c8405b28b711f53d5c182f1e958a5e4340e3dc0f2e9ed7e650940ebf6f30.json b/backend/.llm_cache/2b01c8405b28b711f53d5c182f1e958a5e4340e3dc0f2e9ed7e650940ebf6f30.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/2b01c8405b28b711f53d5c182f1e958a5e4340e3dc0f2e9ed7e650940ebf6f30.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/2bde869babc2c832293790e52ab17e431331697c600b684535b8886567788326.json b/backend/.llm_cache/2bde869babc2c832293790e52ab17e431331697c600b684535b8886567788326.json new file mode 100644 index 0000000..819012c --- /dev/null +++ b/backend/.llm_cache/2bde869babc2c832293790e52ab17e431331697c600b684535b8886567788326.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "lavatory_knee_clearance_height", "category": "dimensional_disagreement", "severity": "medium", "confidence": "high", "location": "Restroom Accessible Lavatories", "disciplines": ["General", "Architectural"], "sheets": ["G11.02", "A51.01"], "description": "The general typical details on sheet G11.02 show a minimum knee clearance height of 28 inches for an accessible lavatory, while the specific restroom elevation on sheet A51.01 shows a minimum knee clearance height of 2'-5\" (29 inches). While the 29\" dimension meets the 28\" requirement, the inconsistency between the general standard and the specific detail can cause confusion for fabrication and installation and should be reconciled.", "evidence": [{"discipline": "General", "sheet": "G11.02", "source_text": "28\" MIN", "asserted_value": "28 inches"}, {"discipline": "Architectural", "sheet": "A51.01", "source_text": "2'-5\" MIN.KNEE CLEARANCE", "asserted_value": "29 inches"}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/2c53670e9affa7566ac0d64656fca406d3f6def38f81306a70af5a6cc1338f66.json b/backend/.llm_cache/2c53670e9affa7566ac0d64656fca406d3f6def38f81306a70af5a6cc1338f66.json new file mode 100644 index 0000000..6ebe247 --- /dev/null +++ b/backend/.llm_cache/2c53670e9affa7566ac0d64656fca406d3f6def38f81306a70af5a6cc1338f66.json @@ -0,0 +1 @@ +{"sheet_number": "G11.02", "discipline": "General", "sheet_title": "SYMBOLS & TYPICAL HEIGHTS", "level": null, "scale": null, "assertions": [{"subject": "Counter", "attribute": "knee_clearance_width", "value": "36", "source_text": "36\" MIN", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Counter", "attribute": "counter_height_AFF", "value": "34", "source_text": "34\" MAX", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Counter", "attribute": "knee_clearance_height", "value": "28", "source_text": "28\" MIN", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Signage", "attribute": "mounting_height_range_AFF", "value": "48-60", "source_text": "TACTILE CHARACTERS ON SIGNS SHALL BE LOCATED 48\" AFF MIN MEASURED FROM THE BASELINE OF THE LOWEST TACTILE CHARACTER AND 60\" AFF MAX MEASURED FROM THE BASELINE OF THE HIGHEST TACTILE CHARACTER.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Fire Extinguisher Cabinet", "attribute": "protrusion_allowance", "value": "4", "source_text": "NOTE: FIRE EXTINGUISHER CANNOT PROTRUDE MORE THAN 4\"", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Casework", "attribute": "counter_height_range_AFF", "value": "30-36", "source_text": "COUNTER/CREDENZA @ 30\"-36\" UNO", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Grab Bar", "attribute": "mounting_height_range_AFF", "value": "33-36", "source_text": "33\"-36\" AFF", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Grab Bar", "attribute": "load_requirement", "value": "250", "source_text": "NOTE: ALLOWABLE STRESSES SHALL NOT BE EXCEEDED FOR MATERIALS USED WHERE A VERTICAL OR HORIZONTAL FORCE OF 250 LBS. IS APPLIED AT ANY POINT ON THE GRAB BAR, FASTENER MOUNTING DEVICE OR SUPPORTING STRUCTURE.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Lavatory", "attribute": "clear_floor_space", "value": "30x48", "source_text": "CLEAR FLOOR SPACE 30\" MIN 48\" MIN", "confidence": "high", "location_key": {"grid": null, "room": "30", "level": null, "tag": null}}, {"subject": "Lavatory", "attribute": "rim_height_AFF", "value": "34", "source_text": "34\" MAX", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Lavatory", "attribute": "general_note", "value": "Insulate exposed pipes", "source_text": "INSULATE EXPOSED PIPES", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Mirror", "attribute": "mounting_height_AFF", "value": "40", "source_text": "40\" MAX", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Soap Dispenser", "attribute": "mounting_height_AFF", "value": "48", "source_text": "48\" MAX", "confidence": "medium", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}]} \ No newline at end of file diff --git a/backend/.llm_cache/2cdd00a9ad89916273b7d91fca9ee4a40dd4caa453f1b84cf5b95e3482265fa1.json b/backend/.llm_cache/2cdd00a9ad89916273b7d91fca9ee4a40dd4caa453f1b84cf5b95e3482265fa1.json new file mode 100644 index 0000000..24cf601 --- /dev/null +++ b/backend/.llm_cache/2cdd00a9ad89916273b7d91fca9ee4a40dd4caa453f1b84cf5b95e3482265fa1.json @@ -0,0 +1 @@ +{"sheet_number": "M01.01", "discipline": "Mechanical", "sheet_title": "MECHANICAL NOTES & SCHEDULES", "level": null, "scale": "N.T.S", "assertions": [{"subject": "RTU-1,2", "attribute": "equipment_type", "value": "ROOFTOP A/C UNIT", "source_text": "DESCRIPTION ROOFTOP A/C UNIT", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "RTU-1,2"}}, {"subject": "RTU-1,2", "attribute": "manufacturer", "value": "CARRIER", "source_text": "MFR. CARRIER", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "RTU-1,2"}}, {"subject": "RTU-1,2", "attribute": "model_number", "value": "50FE-M07", "source_text": "MODEL 50FE-M07", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "RTU-1,2"}}, {"subject": "RTU-1,2", "attribute": "weight", "value": "711", "source_text": "WEIGHT (LBS) 711", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "RTU-1,2"}}, {"subject": "RTU-1,2", "attribute": "supply_airflow", "value": "2100", "source_text": "CFM 2100", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "RTU-1,2"}}, {"subject": "RTU-1,2", "attribute": "fan_horsepower", "value": "3.0", "source_text": "HP 3.0", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "RTU-1,2"}}, {"subject": "RTU-1,2", "attribute": "cooling_capacity_nominal", "value": "6.0", "source_text": "NOM TONS 6.0", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "RTU-1,2"}}, {"subject": "RTU-1,2", "attribute": "heating_capacity", "value": "10.6", "source_text": "ELEC KW 10.6", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "RTU-1,2"}}, {"subject": "RTU-1,2", "attribute": "voltage", "value": "460", "source_text": "VOLT 460", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "RTU-1,2"}}, {"subject": "RTU-1,2", "attribute": "phase", "value": "3", "source_text": "PH 3", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "RTU-1,2"}}, {"subject": "RTU-1,2", "attribute": "mca", "value": "24", "source_text": "MCA 24", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "RTU-1,2"}}, {"subject": "RTU-1,2", "attribute": "mocp", "value": "25", "source_text": "MOCP 25", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "RTU-1,2"}}, {"subject": "RTU-1,2", "attribute": "efficiency_rating", "value": "11.2 EER - 15.5 IEER", "source_text": "11.2 EER - 15.5 IEER", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "RTU-1,2"}}, {"subject": "RTU-1,2", "attribute": "filter_rating", "value": "8 MERV", "source_text": "REMARKS: 1. PROVIDE 8\" MERV FILTERS", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "RTU-1,2"}}, {"subject": "RTU-1,2", "attribute": "refrigerant_type", "value": "R-454B", "source_text": "6. REFRIGERANT SHALL BE R-454B.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "RTU-1,2"}}, {"subject": "RTU-1,2", "attribute": "roof_curb_height", "value": "14", "source_text": "9. PROVIDE 14\" HIGH INSULATED ROOF CURB.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "RTU-1,2"}}, {"subject": "RTU-1,2", "attribute": "accessory", "value": "115V single phase powered convenience power outlet", "source_text": "5. PROVIDE 115V SINGLE PHASE POWERED CONVENIENCE POWER OUTLET ON UNIT.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "RTU-1,2"}}, {"subject": "RTU-1,2", "attribute": "accessory", "value": "Low leak enthalpy economizer", "source_text": "10. FURNISH WITH LOW LEAK ENTHALPY ECONOMIZER PER IECC REQUIREMENTS.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "RTU-1,2"}}]} \ No newline at end of file diff --git a/backend/.llm_cache/2dfe9ecb84024e616acb90e15b4a42ffed994277d607ab2471c1ee4eee57caa8.json b/backend/.llm_cache/2dfe9ecb84024e616acb90e15b4a42ffed994277d607ab2471c1ee4eee57caa8.json new file mode 100644 index 0000000..a904514 --- /dev/null +++ b/backend/.llm_cache/2dfe9ecb84024e616acb90e15b4a42ffed994277d607ab2471c1ee4eee57caa8.json @@ -0,0 +1 @@ +{"sheet_number": "M03.01", "discipline": "Mechanical", "sheet_title": "MECHANICAL DETAILS", "level": null, "scale": "NOT TO SCALE", "assertions": [{"subject": "Insulated Flexible Duct", "attribute": "max_length", "value": "6'-0\"", "source_text": "INSULATED FLEXIBLE DUCT MAX. LENGTH 6'-0\"", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Duct", "attribute": "sizing_criteria", "value": "Same as scheduled neck connection of diffuser", "source_text": "DUCT SIZE IS SAME AS SCHEDULED NECK CONNECTION OF DIFFUSER", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Ceiling Diffuser Connection", "attribute": "general_note", "value": "The flanged bellmouth fitting must be provided, where height of duct shown on plans can accommodate the fitting. Only where the duct height does not allow the installation of bellmouth fitting, provide straight fitting.", "source_text": "THE FLANGED BELLMOUTH FITTING MUST BE PROVIDED, WHERE HEIGHT OF DUCT SHOWN ON PLANS CAN ACCOMMODATE THE FITTING. ONLY WHERE THE DUCT HEIGHT DOES NOT ALLOW THE INSTALLATION OF BELLMOUTH FITTING, PROVIDE STRAIGHT FITTING.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Condensate Drain", "attribute": "slope", "value": "1/8\" per foot", "source_text": "PITCH DOWN TOWARD DRAIN MIN. 1/8\" PER FOOT", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Condensate Drain Line", "attribute": "sizing_criteria", "value": "Not less than one pipe size large than the drain pan connection size", "source_text": "DRAIN LINE SHALL BE NOT LESS THAN ONE PIPE SIZE LARGE THAN THE DRAIN PAN CONNECTION SIZE", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Condensate Drain Vent", "attribute": "vent_location", "value": "Top of vent nipple above top of AHU drain pan", "source_text": "TOP OF VENT NIPPLE ABOVE TOP OF AHU DRAIN PAN", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Condensate Drain", "attribute": "termination_point", "value": "Sanitary sewer", "source_text": "NOTE: CONDENSATE DRAIN TO TERMINATE TO SANITARY SEWER.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Condensate Piping", "attribute": "pipe_size", "value": "3/4\"", "source_text": "3/4\" CONDENSATE PIPING AT 1/8\" PER FOOT SLOPE", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Condensate Piping", "attribute": "slope", "value": "1/8\" per foot", "source_text": "3/4\" CONDENSATE PIPING AT 1/8\" PER FOOT SLOPE", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Roof Top Unit", "attribute": "scope_supply", "value": "Gasketed and insulated roof curb supplied with unit", "source_text": "GASKETED AND INSULATED ROOF CURB SUPPLIED WITH UNIT RE: ARCH.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": "ROOF", "tag": null}}, {"subject": "Roof Top Unit Opening", "attribute": "framing_requirement", "value": "Angle iron frame all around roof opening", "source_text": "ANGLE IRON FRAME ALL AROUND ROOF OPENING RE: STRUCTURAL.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": "ROOF", "tag": null}}, {"subject": "Roof Top Unit Ductwork", "attribute": "smoke_detector_type", "value": "Ionization-type smoke detector as required", "source_text": "IONIZATION-TYPE SMOKE DETECTOR AS REQUIRED.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": "ROOF", "tag": null}}, {"subject": "Return Air Duct", "attribute": "opening_protection", "value": "Cover opening with 1/2\" galvanized steel mesh screen", "source_text": "RETURN AIR DUCT. COVER OPENING WITH 1/2\" GALVANIZED STEEL MESH SCREEN.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": "ROOF", "tag": null}}, {"subject": "Rooftop Equipment", "attribute": "vibration_isolation", "value": "Spring isolations bolt to unit & plate", "source_text": "SPRING ISOLATIONS BOLT TO UNIT & PLATE", "confidence": "high", "location_key": {"grid": null, "room": null, "level": "ROOF", "tag": null}}, {"subject": "Rooftop Equipment Curb", "attribute": "roofing_material", "value": "E.P.D.M. Membrane", "source_text": "E.P.D.M. MEMBRANE", "confidence": "high", "location_key": {"grid": null, "room": null, "level": "ROOF", "tag": null}}, {"subject": "Rooftop Equipment Curb", "attribute": "fastener_spacing", "value": "12\" O.C.", "source_text": "FASTENING PLATE FASTENED 12\" O.C.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": "ROOF", "tag": null}}, {"subject": "Duct Clearance", "attribute": "vertical_clearance", "value": "12\"", "source_text": "MINIMUM 12\"", "confidence": "high", "location_key": {"grid": null, "room": null, "level": "ROOF", "tag": null}}]} \ No newline at end of file diff --git a/backend/.llm_cache/2f5a0ddb2846e8b895d5f457f88c41ec3b50ad234c9918b9c09a645daf79e477.json b/backend/.llm_cache/2f5a0ddb2846e8b895d5f457f88c41ec3b50ad234c9918b9c09a645daf79e477.json new file mode 100644 index 0000000..bf5f549 --- /dev/null +++ b/backend/.llm_cache/2f5a0ddb2846e8b895d5f457f88c41ec3b50ad234c9918b9c09a645daf79e477.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "CLEANING_SUPPLIES_STORAGE_missing_floor_drain", "category": "missing_element", "severity": "medium", "confidence": "high", "location": "CLEANING SUPPLIES/STORAGE", "disciplines": ["Plumbing", "Architectural"], "sheets": ["P02.01", "A23.01"], "description": "The plumbing plan P02.01 indicates a floor drain (FD) in the Cleaning Supplies/Storage room. This floor drain is not shown on the architectural finish plan A23.01. The architectural plan must be updated to include the floor drain, as its absence impacts slab depression, waterproofing details, and floor slope requirements.", "evidence": [{"discipline": "Plumbing", "sheet": "P02.01", "source_text": "Plan shows a floor drain symbol 'FD' in room 'CLEANING SUPPLIES/STORAGE'.", "asserted_value": "Floor Drain required"}, {"discipline": "Architectural", "sheet": "A23.01", "source_text": "Finish plan for 'CLEANING SUPPLIES/STORAGE' shows a Floor Service Sink 'FSS' but does not show a floor drain.", "asserted_value": "Floor Drain not shown"}], "recommended_resolution": "coordinate drawings"}, {"conflict_id": "CLEANING_SUPPLIES_STORAGE_data_shelving_clash", "category": "clearance_conflict", "severity": "low", "confidence": "medium", "location": "CLEANING SUPPLIES/STORAGE, west wall", "disciplines": ["Electrical", "Architectural"], "sheets": ["E04.01", "A24.01"], "description": "Data outlets shown on sheet E04.01 at 18 inches AFF on the west wall of the storage room are in the same location as 'SHELVING, U.N.O.' on the architectural furniture plan A24.01. The undefined height and configuration of the shelving creates a potential access conflict with the data outlets.", "evidence": [{"discipline": "Electrical", "sheet": "E04.01"}]}]} \ No newline at end of file diff --git a/backend/.llm_cache/2faeacc07f1535554028e29f476bc38a2766757915d3054d6a9716a1df0fcfd5.json b/backend/.llm_cache/2faeacc07f1535554028e29f476bc38a2766757915d3054d6a9716a1df0fcfd5.json new file mode 100644 index 0000000..6a42645 --- /dev/null +++ b/backend/.llm_cache/2faeacc07f1535554028e29f476bc38a2766757915d3054d6a9716a1df0fcfd5.json @@ -0,0 +1 @@ +{"sheet_number": "G31.01", "discipline": "General", "sheet_title": "SPECIFICATIONS", "level": null, "scale": null, "assertions": [{"subject": "Submittals", "attribute": "administration", "value": "Ten (10) copies required for submittal.", "source_text": "NUMBER OF COPIES FOR SUBMITTAL - TEN (10).", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Contract Documents", "attribute": "administration", "value": "In case of discrepancies, the contractor shall provide the better quality or greater quantity of work at no additional cost.", "source_text": "WHERE DISCREPANCIES EXIST WITHIN THE CONTRACT DOCUMENTS, THE PROSPECTIVE BIDDER OR CONTRACTOR SHALL PROVIDE THE BETTER QUALITY OR GREATER QUANTITY OF WORK INVOLVED, NO ADDITIONAL COST TO OWNER.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Submittals", "attribute": "administration", "value": "One electronic copy in PDF format required for submittal.", "source_text": "ELECTRONIC DOCUMENTS: SUBMIT ONE ELECTRONIC COPY IN PDF FORMAT.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Submittals", "attribute": "administration", "value": "Architect review time for submittals is 7 calendar days.", "source_text": "REVIEW TIME: ARCHITECT WILL RESPOND AND RETURN SUBMITTALS TO CONTRACTOR WITHIN SEVEN (7) CALENDAR DAYS OF RECEIPT.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Submittals", "attribute": "administration", "value": "Add an additional seven (7) calendar days for sequential review by consultants or owner.", "source_text": "FOR SEQUENTIAL REVIEW INVOLVING THE ARCHITECT'S CONSULTANT, OWNER OR ANOTHER REVIEWER, ALLOW AN ADDITIONAL SEVEN (7) CALENDARS DAYS.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}]} \ No newline at end of file diff --git a/backend/.llm_cache/2fee1564682d7ee7cf5c92ac40584c18daa3e3b55bb8d007ce8c43dd06d9a20c.json b/backend/.llm_cache/2fee1564682d7ee7cf5c92ac40584c18daa3e3b55bb8d007ce8c43dd06d9a20c.json new file mode 100644 index 0000000..8d4a7dd --- /dev/null +++ b/backend/.llm_cache/2fee1564682d7ee7cf5c92ac40584c18daa3e3b55bb8d007ce8c43dd06d9a20c.json @@ -0,0 +1 @@ +[{"sheet_number": "G01.01", "discipline": "General", "sheet_title": "COVER SHEET", "level": null, "scale": null, "assertions": [{"assertion_id": "G01.01-001", "subject": "Project", "category": "note", "attribute": "project_name", "value": "VERIZON ELYSON", "unit": null, "location_key": {"sheet_number": "G01.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": null, "detail_reference": null, "plan_zone": "Title Block"}, "source_text": "VERIZON ELYSON", "coordination_targets": ["architectural", "civil", "structural", "mechanical", "electrical", "plumbing", "fire_protection", "fire_alarm", "technology", "specialty", "owner_standard"], "conflict_potential": "medium", "code_review_relevance": "none", "confidence": "high"}, {"assertion_id": "G01.01-002", "subject": "Project", "category": "note", "attribute": "site_address", "value": "7022 ELYSON EXCHANGE WAY CYPRESS, TEXAS 77433", "unit": null, "location_key": {"sheet_number": "G01.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": null, "detail_reference": null, "plan_zone": "Title Block"}, "source_text": "7022 ELYSON EXCHANGE WAY CYPRESS, TEXAS 77433", "coordination_targets": ["architectural", "civil", "structural", "mechanical", "electrical", "plumbing", "fire_protection", "fire_alarm", "technology", "specialty", "owner_standard"], "conflict_potential": "high", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "G01.01-003", "subject": "Owner", "category": "note", "attribute": "company_name", "value": "CK WARWICK GROUP, LLC", "unit": null, "location_key": {"sheet_number": "G01.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": null, "detail_reference": null, "plan_zone": "Project Directory"}, "source_text": "OWNER: CK WARWICK GROUP, LLC", "coordination_targets": ["owner_standard"], "conflict_potential": "low", "code_review_relevance": "none", "confidence": "high"}, {"assertion_id": "G01.01-004", "subject": "Architect", "category": "note", "attribute": "company_name", "value": "ESTUDIO", "unit": null, "location_key": {"sheet_number": "G01.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": null, "detail_reference": null, "plan_zone": "Project Directory"}, "source_text": "ARCHITECT: ESTUDIO", "coordination_targets": ["architectural"], "conflict_potential": "low", "code_review_relevance": "none", "confidence": "high"}, {"assertion_id": "G01.01-005", "subject": "MEP Engineer", "category": "note", "attribute": "company_name", "value": "POWERS INDUSTRY", "unit": null, "location_key": {"sheet_number": "G01.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": null, "detail_reference": null, "plan_zone": "Project Directory"}, "source_text": "MEP: POWERS INDUSTRY", "coordination_targets": ["mechanical", "electrical", "plumbing"], "conflict_potential": "medium", "code_review_relevance": "none", "confidence": "high"}, {"assertion_id": "G01.01-006", "subject": "Copyright", "category": "note", "attribute": "copyright_notice", "value": "Copyright @ eStudio Architecture 2026.", "unit": null, "location_key": {"sheet_number": "G01.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": null, "detail_reference": null, "plan_zone": "Title Block"}, "source_text": "Copyright @ eStudio Architecture 2026.", "coordination_targets": [], "conflict_potential": "low", "code_review_relevance": "none", "confidence": "high"}, {"assertion_id": "G01.01-007", "subject": "Drawing Issue", "category": "general_note", "attribute": "issue_description", "value": "CLIENT REVIEW", "unit": null, "location_key": {"sheet_number": "G01.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": null, "detail_reference": null, "plan_zone": "Issue Block"}, "source_text": "Issue Description CLIENT REVIEW", "coordination_targets": ["architectural", "structural", "mechanical", "electrical", "plumbing", "civil"], "conflict_potential": "low", "code_review_relevance": "none", "confidence": "high"}, {"assertion_id": "G01.01-008", "subject": "Drawing Issue", "category": "general_note", "attribute": "issue_date", "value": "2026-06-18", "unit": null, "location_key": {"sheet_number": "G01.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": null, "detail_reference": null, "plan_zone": "Issue Block"}, "source_text": "2026-06-18", "coordination_targets": ["architectural", "structural", "mechanical", "electrical", "plumbing", "civil"], "conflict_potential": "low", "code_review_relevance": "none", "confidence": "high"}, {"assertion_id": "G01.01-009", "subject": "Project", "category": "general_note", "attribute": "project_number", "value": "00.000.00", "unit": null, "location_key": {"sheet_number": "G01.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": null, "detail_reference": null, "plan_zone": "Title Block"}, "source_text": "Project number 00.000.00", "coordination_targets": ["owner_standard"], "conflict_potential": "medium", "code_review_relevance": "none", "confidence": "high"}, {"assertion_id": "G01.01-010", "subject": "Exterior Signage", "category": "specialty", "attribute": "sign_text", "value": "verizon", "unit": null, "location_key": {"sheet_number": "G01.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": null, "detail_reference": "Exterior Elevation Rendering", "plan_zone": "Front Elevation"}, "source_text": "verizon", "coordination_targets": ["architectural", "structural", "electrical", "specialty", "owner_standard", "code"], "conflict_potential": "high", "code_review_relevance": "medium", "confidence": "high"}]}] \ No newline at end of file diff --git a/backend/.llm_cache/3202742c258411be34ba083eb41e545f7654e71a0251bedd9944583e6542647e.json b/backend/.llm_cache/3202742c258411be34ba083eb41e545f7654e71a0251bedd9944583e6542647e.json new file mode 100644 index 0000000..2050275 --- /dev/null +++ b/backend/.llm_cache/3202742c258411be34ba083eb41e545f7654e71a0251bedd9944583e6542647e.json @@ -0,0 +1 @@ +{"sheet_number": "A25.01", "discipline": "Architectural", "sheet_title": "ROOF PLAN", "level": "ROOF", "scale": "1/4\" = 1'-0\"", "assertions": [{"assertion_id": "A25.01-001", "subject": "Drawing Scale", "category": "note", "attribute": "scale", "value": "1/4\" = 1'-0\"", "unit": null, "location_key": {"sheet_number": "A25.01", "grid": null, "room": null, "room_name": null, "level": "ROOF", "tag": "ROOF PLAN", "detail_reference": null, "plan_zone": null}, "source_text": "ROOF PLAN\n1/4\" = 1'-0\"", "coordination_targets": [], "conflict_potential": "low", "code_review_relevance": "none", "confidence": "high"}, {"assertion_id": "A25.01-002", "subject": "General Note B", "category": "general_note", "attribute": "coordination_instruction", "value": "CONTRACTOR TO REFER TO MECHANICAL DRAWINGS FOR ALL ROOFTOP UNIT REQUIREMENTS, DETAILS, AND SPECIFICATIONS.", "unit": null, "location_key": {"sheet_number": "A25.01", "grid": null, "room": null, "room_name": null, "level": "ROOF", "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "B. CONTRACTOR TO REFER TO MECHANICAL DRAWINGS FOR ALL ROOFTOP UNIT REQUIREMENTS, DETAILS, AND SPECIFICATIONS.", "coordination_targets": ["mechanical"], "conflict_potential": "high", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "A25.01-003", "subject": "General Note C", "category": "general_note", "attribute": "coordination_instruction", "value": "CONTRACTORS SHALL VERIFY LOCATIONS OF EXISTING SYSTEMS AND OPENINGS; SUCH AS EXISTING RTU'S, ROOF VENTS, HVAC, ROOF ACCESS, AND OTHER PENETRATIONS, VERIFY COORDINATIONS REQUIRED BETWEEN EXISTING PENETRATIONS AND EQUIPMENT WITH NEW.", "unit": null, "location_key": {"sheet_number": "A25.01", "grid": null, "room": null, "room_name": null, "level": "ROOF", "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "C. CONTRACTORS SHALL VERIFY LOCATIONS OF EXISTING SYSTEMS AND OPENINGS; SUCH AS EXISTING RTU'S, ROOF VENTS, HVAC, ROOF ACCESS, AND OTHER PENETRATIONS, VERIFY COORDINATIONS REQUIRED BETWEEN EXISTING PENETRATIONS AND EQUIPMENT WITH NEW.", "coordination_targets": ["mechanical", "structural", "plumbing", "electrical"], "conflict_potential": "high", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "A25.01-004", "subject": "General Note D", "category": "general_note", "attribute": "roofing_requirement", "value": "REPAIR AND SEAL ROOF IF REQUIRED AROUND ALL NEW PENETRATIONS AND EQUIPMENT, PER MANUFACTURER'S RECOMMENDATIONS.", "unit": null, "location_key": {"sheet_number": "A25.01", "grid": null, "room": null, "room_name": null, "level": "ROOF", "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "D. REPAIR AND SEAL ROOF IF REQUIRED AROUND ALL NEW PENETRATIONS AND EQUIPMENT, PER MANUFACTURER'S RECOMMENDATIONS.", "coordination_targets": ["specialty", "owner_standard"], "conflict_potential": "medium", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "A25.01-005", "subject": "Keynote 2", "category": "keynote_assertion", "attribute": "coordination_instruction", "value": "NEW RTU, PROVIDE NEW MECHANICAL ROOF CURBS AS NECESSARY TO ACCOMODATE NEW RTU. GC TO INSTALL FLASHING PER PER ROOFING MANUFACTURING STANDARDS, GC SHALL COORDINATE ROOF WORK WITH LL REQUIREMENTS TO MAINTAIN EXISTING ROOFING WARRANTY. REFER TO MEP DRAWINGS FOR MORE INFORMATION.", "unit": null, "location_key": {"sheet_number": "A25.01", "grid": null, "room": null, "room_name": null, "level": "ROOF", "tag": "2", "detail_reference": null, "plan_zone": null}, "source_text": "2 NEW RTU, PROVIDE NEW MECHANICAL ROOF CURBS AS NECESSARY TO ACCOMODATE NEW RTU. GC TO INSTALL FLASHING PER PER ROOFING MANUFACTURING STANDARDS, GC SHALL COORDINATE ROOF WORK WITH LL REQUIREMENTS TO MAINTAIN EXISTING ROOFING WARRANTY. REFER TO MEP DRAWINGS FOR MORE INFORMATION.", "coordination_targets": ["mechanical", "structural", "owner_standard"], "conflict_potential": "high", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "A25.01-006", "subject": "New RTU", "category": "equipment_location", "attribute": "clearance", "value": "6'-9\"", "unit": null, "location_key": {"sheet_number": "A25.01", "grid": "B-C/5", "room": null, "room_name": null, "level": "ROOF", "tag": "2", "detail_reference": null, "plan_zone": "MECHANICAL ZONE"}, "source_text": "6'-9\"", "coordination_targets": ["mechanical", "structural"], "conflict_potential": "high", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "A25.01-007", "subject": "New RTU", "category": "equipment_location", "attribute": "clearance", "value": "3'-3 1/4\"", "unit": null, "location_key": {"sheet_number": "A25.01", "grid": "B/4-5", "room": null, "room_name": null, "level": "ROOF", "tag": "2", "detail_reference": null, "plan_zone": "MECHANICAL ZONE"}, "source_text": "3'-3 1/4\"", "coordination_targets": ["mechanical", "structural"], "conflict_potential": "high", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "A25.01-008", "subject": "Roof Curb Detail", "category": "detail_callout", "attribute": "scale", "value": "6\" = 1'-0\"", "unit": null, "location_key": {"sheet_number": "A25.01", "grid": null, "room": null, "room_name": null, "level": "ROOF", "tag": null, "detail_reference": "ROOF CURB DETAIL", "plan_zone": null}, "source_text": "ROOF CURB DETAIL\n6\" = 1'-0\"", "coordination_targets": [], "conflict_potential": "low", "code_review_relevance": "none", "confidence": "high"}, {"assertion_id": "A25.01-009", "subject": "Roof Curb Framing", "category": "detail_callout", "attribute": "component", "value": "2X4 Wood Nailer", "unit": null, "location_key": {"sheet_number": "A25.01", "grid": null, "room": null}}]} \ No newline at end of file diff --git a/backend/.llm_cache/3281acc7ade57e8d4a1b1be80d72bef3ada41e8d05f3c10863e04b1007871751.json b/backend/.llm_cache/3281acc7ade57e8d4a1b1be80d72bef3ada41e8d05f3c10863e04b1007871751.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/3281acc7ade57e8d4a1b1be80d72bef3ada41e8d05f3c10863e04b1007871751.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/32e387c76f4be36e8ed98de081c724f184bfac20005ed0f109e27de2c2132c86.json b/backend/.llm_cache/32e387c76f4be36e8ed98de081c724f184bfac20005ed0f109e27de2c2132c86.json new file mode 100644 index 0000000..5e68b69 --- /dev/null +++ b/backend/.llm_cache/32e387c76f4be36e8ed98de081c724f184bfac20005ed0f109e27de2c2132c86.json @@ -0,0 +1 @@ +{"sheet_number": null, "discipline": "Unknown", "sheet_title": "Page 14 (extraction failed)", "level": null, "scale": null, "assertions": []} \ No newline at end of file diff --git a/backend/.llm_cache/363bf16fd9c3097674ff7580dba404b2b3e07e3fc77bcb0b62fa6cfacca7ddb7.json b/backend/.llm_cache/363bf16fd9c3097674ff7580dba404b2b3e07e3fc77bcb0b62fa6cfacca7ddb7.json new file mode 100644 index 0000000..c746ac9 --- /dev/null +++ b/backend/.llm_cache/363bf16fd9c3097674ff7580dba404b2b3e07e3fc77bcb0b62fa6cfacca7ddb7.json @@ -0,0 +1 @@ +{"sheet_number": "G11.01", "discipline": "General", "sheet_title": "VICINITY PLAN, ABBREVIATIONS, PROJECT GENERAL NOTES & SHEET INDEX", "level": null, "scale": null, "assertions": [{"subject": "Project", "attribute": "address", "value": "7022 ELYSON EXCHANGE WAY, CYPRESS, TX 77433", "source_text": "7022 ELYSON EXCHANGE WAY CYPRESS, TX 77433", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Project", "attribute": "building_identifier", "value": "BUILDING C", "source_text": "ELYSON TOWN CENTER - BUILDING C", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "General Requirement", "attribute": "code_reference", "value": "Through-fire-resistive walls shall conform to the authority having jurisdiction's current adopted version of the IBC and local ammendments.", "source_text": "THROUGH-FIRE-RESISTIVE WALLS SHALL CONFORM TO THE AUTHORITY HAVING JURISDICTION'S CURRENT ADOPTED VERSION OF THE IBC AND LOCAL AMMENDMENTS AS WELL AS DIRECTIVES BY THE LOCAL FIRE MARSHAL'S AUTHORITY.", "confidence": "high", "location_key": {"grid": null, "room": "PROJECT GENERAL NOTES", "level": null, "tag": "12"}}, {"subject": "Fire Extinguisher", "attribute": "max_travel_distance", "value": "75", "source_text": "PROVIDER FOR EXTINGUISHERS WITH TRAVEL DISTANCE NOT TO EXCEED 75' IN ACCORDANCE W/ NFPA STANDARD 10", "confidence": "high", "location_key": {"grid": null, "room": "PROJECT GENERAL NOTES", "level": null, "tag": "13"}}, {"subject": "Ceiling Height", "attribute": "dimension_convention", "value": "Indicated from the floor elevation to the face of the structural slab, unless otherwise noted", "source_text": "CEILING HEIGHTS SHOWN ARE INDICATED FROM THE FLOOR ELEVATION TO THE FACE OF THE STRUCTURAL SLAB, UNLESS SPECIFICALLY OTHERWISE NOTED.", "confidence": "high", "location_key": {"grid": null, "room": "PROJECT GENERAL NOTES", "level": null, "tag": "24"}}, {"subject": "Ceiling Height", "attribute": "dimension_convention", "value": "Indicated in RCP's are from finished floor elevation to face of suspended ceiling system or finish material", "source_text": "CEILING HEIGHTS INDICATED IN RCP'S ARE INDICATED FROM THE FINISHED FLOOR ELEVATION TO THE FACE OF SUSPENDED CEILING SYSTEM OR FACE OF FINISH MATERIAL AS SCHEDULED.", "confidence": "high", "location_key": {"grid": null, "room": "PROJECT GENERAL NOTES", "level": null, "tag": "24"}}, {"subject": "Dimensions", "attribute": "dimension_convention", "value": "Dimensions are to centerline of grid/steel unless noted otherwise.", "source_text": "DIMENSIONS ARE INDICATED TO: A. THE CENTERLINE OF THE STRUCTURAL GRID AND STRUCTURAL STEEL MEMBERS.", "confidence": "high", "location_key": {"grid": null, "room": "PROJECT GENERAL NOTES", "level": null, "tag": "25.A"}}, {"subject": "Dimensions", "attribute": "dimension_convention", "value": "Dimensions are to face of cast in place or precast concrete walls unless noted otherwise.", "source_text": "DIMENSIONS ARE INDICATED TO: B. THE FACE OF CAST IN PLACE OR PRECAST CONCRETE WALLS.", "confidence": "high", "location_key": {"grid": null, "room": "PROJECT GENERAL NOTES", "level": null, "tag": "25.B"}}, {"subject": "Dimensions", "attribute": "dimension_convention", "value": "Dimensions are to nominal face of masonry walls unless noted otherwise.", "source_text": "DIMENSIONS ARE INDICATED TO: C. THE NOMINAL FACE OF MASONRY WALLS.", "confidence": "high", "location_key": {"grid": null, "room": "PROJECT GENERAL NOTES", "level": null, "tag": "25.C"}}, {"subject": "Fire Sprinkler System", "attribute": "code_reference", "value": "NFPA STD. 13", "source_text": "THE FIRE SPRINKLER CONTRACTOR...MODIFICATIONS TO THE EXISTING AUTOMATIC FIRE SPRINKLER SYSTEM SHALL CONFORM TO NFPA STD. 13.", "confidence": "high", "location_key": {"grid": null, "room": "PROJECT GENERAL NOTES", "level": null, "tag": "34"}}, {"subject": "UL Ratings", "attribute": "wall_rating", "value": "DESIGN #U419", "source_text": "G31.06 UL RATINGS - DESIGN #U419", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}]} \ No newline at end of file diff --git a/backend/.llm_cache/36b2834012d1cdc00773719f54bde65c57a0215fc52206054cf15bc5d4620cfb.json b/backend/.llm_cache/36b2834012d1cdc00773719f54bde65c57a0215fc52206054cf15bc5d4620cfb.json new file mode 100644 index 0000000..713ef4a --- /dev/null +++ b/backend/.llm_cache/36b2834012d1cdc00773719f54bde65c57a0215fc52206054cf15bc5d4620cfb.json @@ -0,0 +1 @@ +{"issues": [{"issue_id": "CON-001", "source_stage": "qaqc", "category": "missing_sheet", "severity": "critical", "confidence": "high", "location": "Entire Project", "disciplines": ["Structural", "Architectural", "Mechanical", "Electrical"], "sheets": ["M03.01", "E05.02", "A25.01"], "description": "The drawing set is entirely missing the Structural discipline (S-series sheets). Structural drawings are required to specify support for new rooftop units (RTUs), suspended transformers, framing for roof openings, and requirements for any slab penetrations. Multiple notes on Architectural, Mechanical and Electrical sheets refer to coordination with a structural engineer, but no drawings are provided.", "evidence": [{"discipline": "System", "sheet": "sheet_index", "source_text": "No sheets with the 'S' discipline prefix are present in the sheet index.", "asserted_value": "Missing Structural Drawings"}, {"discipline": "Electrical", "sheet": "E05.02", "source_text": "VERIFY SUPPORT SIZING AND DESIGNED WITH PROJECT STRUCTURAL ENGINEER PRIOR TO ASSEMBLY.", "asserted_value": "Reference to project structural engineer"}, {"discipline": "Mechanical", "sheet": "M03.01", "source_text": "ANGLE IRON FRAME ALL AROUND ROOF OPENING RE: STRUCTURAL.", "asserted_value": "Reference to structural drawings"}], "recommended_resolution": "Provide a complete set of structural drawings, including foundation plans, framing plans, and all necessary details for the new scope of work. Ensure MEP and Architectural drawings are coordinated with the new structural information.", "code_reference": null}, {"issue_id": "CON-002", "source_stage": "qaqc", "category": "missing_sheet", "severity": "critical", "confidence": "high", "location": "Entire Project", "disciplines": ["Architectural", "Mechanical", "Electrical", "Plumbing"], "sheets": [], "description": "Critical architectural plans appear to be missing from the set, corresponding to pages 14 and 15 where file extraction failed. These are expected to be the primary Architectural Dimension/Construction Plan and the Reflected Ceiling Plan (RCP). Without a dimensioned plan, construction layout is impossible. Without an RCP, coordination of lighting, HVAC diffusers, and sprinkler heads is impossible and ceiling heights are undefined.", "evidence": [{"discipline": "Architectural", "sheet": "page-14", "source_text": "Page 14 (extraction failed)", "asserted_value": "Expected to be the Dimension/Construction Plan"}, {"discipline": "Architectural", "sheet": "page-15", "source_text": "Page 15 (extraction failed)", "asserted_value": "Expected to be the Reflected Ceiling Plan"}], "recommended_resolution": "Provide the missing Architectural Dimension Plan and Reflected Ceiling Plan. Ensure all disciplines are coordinated with these new sheets.", "code_reference": null}, {"issue_id": "CON-003", "source_stage": "qaqc", "category": "missing_sheet", "severity": "critical", "confidence": "high", "location": "Entire Project", "disciplines": ["Mechanical", "Architectural"], "sheets": [], "description": "The Mechanical HVAC floor plan, expected as M02.01, is missing from the set, corresponding to page 22 where extraction failed. The sheet index jumps from Mechanical notes (M01.01) to the Mechanical Roof Plan (M02.02). Without the floor plan showing ductwork layout, diffuser locations, and thermostat locations, the HVAC system cannot be bid, permitted, or constructed.", "evidence": [{"discipline": "Mechanical", "sheet": "page-22", "source_text": "Page 22 (extraction failed)", "asserted_value": "Expected to be the Mechanical Floor Plan"}], "recommended_resolution": "Provide the missing Mechanical Floor Plan M02.01 and ensure it is coordinated with the architectural RCP and lighting plan.", "code_reference": null}, {"issue_id": "CON-004", "source_stage": "code", "category": "building_code", "severity": "critical", "confidence": "high", "location": "Project Wide", "disciplines": ["General", "Electrical", "Architectural", "Plumbing"], "sheets": ["E01.01", "G21.01", "A23.01"], "description": "Various drawings cite conflicting, and in some cases outdated, building, electrical, and energy codes. For example, G21.01 cites the 2018 IBC and 2014 NEC, while E01.01 cites the 2023 NEC and 2021 IBC, and other architectural and plumbing sheets cite 2021 codes. The project's adopted codes for the jurisdiction are reportedly the 2015/2017 editions. This fundamental discrepancy, identified across conflict, code, and QAQC reviews, must be resolved to establish a single, correct basis of design for permitting and construction.", "evidence": [{"discipline": "Electrical", "sheet": "E01.01", "source_text": "CONTRACTOR SHALL CONFORM TO ALL LOCAL, STATE, AND APPLICABLE CODES, 2023 NEC, 2021 IBC, 2021 IECC, NFPA, ETC.", "asserted_value": "2023 NEC, 2021 IBC, 2021 IECC"}, {"discipline": "General", "sheet": "G21.01", "source_text": "2018 INTERNATIONAL BUILDING CODE (IBC) CH. 2-10 WITH HARRIS COUNTY AMENDMENTS", "asserted_value": "2018 IBC"}, {"discipline": "General", "sheet": "G21.01", "source_text": "2023 STATE OF TEXAS ADOPTED 2014 NFPA 70 NATIONAL ELECTRICAL CODE (NEC)", "asserted_value": "2014 NEC"}, {"discipline": "Architectural", "sheet": "A23.01", "source_text": "INTERIOR FINISHES TO COMPLY WITH IBC CLASS C OR HIGHER SECTION 803.9 AND TABLE 803.9 OF 2021 IBC.", "asserted_value": "2021 IBC"}, {"discipline": "Plumbing", "sheet": "P03.01", "source_text": "PER 2021 IBC, CHAPTER 19, SECTION 1907: POLYETHYLENE VAPOR RETARDER MINIMUM 6-MIL SHALL BE REQUIRED.", "asserted_value": "Vapor retarder per 2021 IBC"}], "recommended_resolution": "Verify the correct, currently enforced code editions with the Authority Having Jurisdiction. Update all code references on all sheets to reflect the single correct set of codes, and ensure the design complies with those specific requirements.", "code_reference": null}, {"issue_id": "CON-005", "source_stage": "qaqc", "category": "missing_schedule", "severity": "critical", "confidence": "high", "location": "Architectural Sheets", "disciplines": ["Architectural"], "sheets": ["G31.04"], "description": "The drawing set lacks a Door and Frame Schedule. Floor plans show new doors, but there is no schedule to define their type, size, material, fire rating, hardware group, or other essential attributes. This information is critical for procurement, accurate bidding, and code compliance.", "evidence": [{"discipline": "System", "sheet": "sheet_index", "source_text": "No sheet with a door schedule is present in the sheet index.", "asserted_value": "Missing Door Schedule"}, {"discipline": "General", "sheet": "G31.04", "source_text": "ANSI A250.8, SEAMLESS, MINIMUM 18 GAGE FACE SHEETS.", "asserted_value": "Specification for hollow metal doors exists, but no schedule applies it to specific locations."}], "recommended_resolution": "Create and issue a complete Door and Frame Schedule, including a hardware schedule/sets. Key all doors on the floor plans to this schedule.", "code_reference": null}, {"issue_id": "CON-006", "source_stage": "qaqc", "category": "missing_information", "severity": "critical", "confidence": "high", "location": "Architectural Plans", "disciplines": ["Architectural"], "sheets": ["G11.03", "G31.06"], "description": "The set lacks a partition type legend and a plan showing where different wall types are to be constructed. Notes require demising partitions to be insulated and extend to the roof deck, and a UL detail for rated walls is provided, but there is no drawing that defines, typifies, and locates these different wall constructions. This is essential for bidding, material ordering, and correct construction.", "evidence": [{"discipline": "System", "sheet": "sheet_index", "source_text": "No sheet contains a partition type legend.", "asserted_value": "Missing Partition Type Legend"}, {"discipline": "General", "sheet": "G11.03", "source_text": "Tenant shall furnish and install all demising partitions from finished floor slab to roof deck.", "asserted_value": "Requirement for a specific wall type exists with no corresponding visual definition or location plan."}], "recommended_resolution": "Provide a Partition Type Legend detailing all wall assemblies used in the project. Use partition type tags on the dimensioned floor plan to indicate the location of each wall type.", "code_reference": null}, {"issue_id": "CON-007", "source_stage": "code", "category": "tas_tdlr", "severity": "critical", "confidence": "high", "location": "Men's Restroom 103 and Women's Restroom 102", "disciplines": ["Architectural", "Plumbing"], "sheets": ["A51.01"], "description": "The enlarged restroom plan detail indicates the centerline of the accessible water closet (WC-1) is located 7 to 9 inches from the side wall. The Texas Accessibility Standards (TAS) and ADA require this dimension to be between 16 and 18 inches. A 7-9 inch dimension makes the fixture unusable by a person transferring from a wheelchair and renders the required grab bars ineffective.", "evidence": [{"discipline": "Architectural", "sheet": "A51.01", "source_text": "7\"-9\"", "asserted_value": "7-9"}], "recommended_resolution": "Revise the restroom layout in both Men's 103 and Women's 102 to provide a 16-inch to 18-inch clearance from the side wall to the centerline of the water closet. Coordinate changes with plumbing and wall framing.", "code_reference": "TAS 604.2; ADA 604.2"}, {"issue_id": "CON-008", "source_stage": "conflict", "category": "location_mismatch", "severity": "high", "confidence": "high", "location": "SALES AREA Ceiling", "disciplines": ["Architectural", "Electrical"], "sheets": ["E03.01"], "description": "The electrical lighting plan on sheet E03.01 shows a specific layout for light fixtures, while an architectural reflected ceiling plan inset on the same sheet shows a completely different, denser grid layout. A handwritten note on the drawing explicitly calls out this discrepancy, stating 'fixture locations not matching arch'.", "evidence": [{"discipline": "Electrical", "sheet": "E03.01", "source_text": "fixture locations not matching arch", "asserted_value": "The main electrical lighting plan shows a linear arrangement of fixtures."}, {"discipline": "Architectural", "sheet": "E03.01", "source_text": "[Inset image of architectural reflected ceiling plan]", "asserted_value": "The architectural plan inset shows a dense grid of light fixtures."}], "recommended_resolution": "The Architectural and Electrical disciplines must coordinate to produce a single, correct reflected ceiling and lighting plan for the Sales Area.", "code_reference": null}, {"issue_id": "CON-009", "source_stage": "code", "category": "ada", "severity": "high", "confidence": "high", "location": "SALES AREA and INVENTORY room", "disciplines": ["Electrical", "Architectural"], "sheets": ["E04.01", "A24.01"], "description": "Multiple electrical and data outlets are specified at mounting heights that violate ADA reach range requirements. Outlets in the INVENTORY room are specified at 60 inches AFF, and a data outlet in the SALES AREA is specified at 55 inches AFF, both exceeding the 48-inch maximum high forward reach.", "evidence": [{"discipline": "Electrical", "sheet": "E04.01", "source_text": "(2) CAT.6/55\"/H", "asserted_value": "55"}, {"discipline": "Architectural", "sheet": "A24.01", "source_text": "(2) 20A, OUTLETS AT 60\" A.F.F.", "asserted_value": "60"}], "recommended_resolution": "Revise the mounting height of all specified outlets to be no more than 48 inches above the finished floor to comply with ADA section 308.", "code_reference": "ADA 205.1; ADA 308"}, {"issue_id": "CON-010", "source_stage": "code", "category": "tas_tdlr", "severity": "high", "confidence": "high", "location": "Men's Restroom 103 and Women's Restroom 102", "disciplines": ["Architectural"], "sheets": ["A51.01"], "description": "The lavatory detail on sheet A51.01 specifies '6\" MAX. TOE CLEAR'. Accessible lavatories require a toe clearance area that is a minimum of 9 inches high from the floor. Providing a maximum height of 6 inches would obstruct the feet of a person using a wheelchair, preventing a close approach to the lavatory.", "evidence": [{"discipline": "Architectural", "sheet": "A51.01", "source_text": "6\" MAX. TOE CLEAR", "asserted_value": "6"}], "recommended_resolution": "Revise the lavatory detail to provide the required toe clearance. Per TAS 606.2, the space under the lavatory must be clear for a minimum height of 9 inches above the finished floor.", "code_reference": "ADA 606.2; TAS 606.2"}, {"issue_id": "CON-011", "source_stage": "conflict", "category": "elevation_disagreement", "severity": "high", "confidence": "high", "location": "INVENTORY Room", "disciplines": ["Architectural", "Electrical"], "sheets": ["A24.01", "E04.01", "E02.01"], "description": "There are multiple contradictions regarding data infrastructure for the network rack in the INVENTORY room. Architectural plans show a rack at 74 inches AFF, but Electrical plans specify data outlets at 18 inches AFF. Furthermore, Architectural notes call for (3) 3-inch conduits, while the Electrical plan has conflicting keynotes for both (1) 1-1/4-inch and (3) 3-inch conduits.", "evidence": [{"discipline": "Architectural", "sheet": "A24.01", "source_text": "RACK SYSTEM ABOVE SAFE @ ~74\" TO BOTTOM", "asserted_value": "Network rack at ~74 inches AFF"}, {"discipline": "Electrical", "sheet": "E04.01", "source_text": "(2) CAT.6/18\"", "asserted_value": "CAT 6 outlets at 18 inches AFF"}, {"discipline": "Architectural", "sheet": "A24.01", "source_text": "PROVIDE (3) 3\" CONDUITS FROM DIRECTLY ABOVE THE NETWORK RACK INTO THE SALES CEILING PLENUM AREA FOR DATA CABLING - FIELD COORDINATE.", "asserted_value": "(3) 3-inch conduits"}, {"discipline": "Electrical", "sheet": "E02.01", "source_text": "3 PROVIDE 1-1/4\"C WITH PULLSTRING FOR DATA TO CEILING SPACE ABOVE RACK SYSTEM IN INVENTORY ROOM VIA NEAREST FULL HEIGHT INTERIOR WALL.", "asserted_value": "(1) 1-1/4 inch conduit"}, {"discipline": "Electrical", "sheet": "E02.01", "source_text": "6 FURNISH AND INSTALL (3) 3\" CONDUIT SLEEVES FROM 6\" BELOW DROPPED CEILING TO 6\" ABOVE DROPPED CEILING FOR DATA EQUIPMENT WIRING.", "asserted_value": "(3) 3-inch conduit sleeves"}], "recommended_resolution": "The Architect and Electrical Engineer must coordinate to determine the correct location and infrastructure requirements (outlet height, conduit size and quantity) for the network rack and update all drawings to be consistent.", "code_reference": null}, {"issue_id": "CON-012", "source_stage": "qaqc", "category": "missing_information", "severity": "high", "confidence": "high", "location": "A23.01", "disciplines": ["Architectural"], "sheets": ["A23.01", "A51.01"], "description": "The finish information provided on sheet A23.01 and other architectural sheets is incomplete. The finish legend or notes fail to define specifications (manufacturer, product name, color, etc.) for Paint Tag 'P-1', Wall Base Tag 'WB-1', and Wall Tile Tag 'CT-1'. A full interior finish schedule is required for accurate pricing and procurement.", "evidence": [{"discipline": "Architectural", "sheet": "A23.01", "source_text": "L. WALLS TO BE PAINTED P-1 THROUGHOUT.", "asserted_value": "P-1 is not defined."}, {"discipline": "Architectural", "sheet": "A23.01", "source_text": "M. VINYL BASE WB-1 THROUGHOUT, U.N.O.", "asserted_value": "WB-1 is not defined."}, {"discipline": "Architectural", "sheet": "A51.01", "source_text": "CT-1 TILE WAINSCOT", "asserted_value": "CT-1 is shown on elevations but not defined in any schedule or legend."}], "recommended_resolution": "Complete the Finish Legend or provide a separate tabular Interior Finish Schedule with all required information for all finish tags used on the plans.", "code_reference": null}, {"issue_id": "CON-013", "source_stage": "qaqc", "category": "missing_detail", "severity": "high", "confidence": "high", "location": "A24.01", "disciplines": ["Architectural", "Structural"], "sheets": ["A24.01"], "description": "General Note G on the Furniture/Power/Data Plan (A24.01) refers to detail '3/A92.01' for a 'foundation pour back detail where existing slab is cut'. Sheet A92.01 does not exist in the drawing set. This detail is critical for any work involving slab cuts, such as for under-slab plumbing or electrical.", "evidence": [{"discipline": "Architectural", "sheet": "A24.01", "source_text": "G. REFER TO DETAIL 3/A92.01 FOR FOUNDATION POUR BACK DETAIL WHERE EXISTING SLAB IS CUT.", "asserted_value": "A non-existent detail is referenced."}], "recommended_resolution": "Provide the referenced detail sheet A92.01 or add the detail to an existing detail sheet and correct the reference on A24.01.", "code_reference": null}, {"issue_id": "CON-014", "source_stage": "code", "category": "ada", "severity": "high", "confidence": "high", "location": "Circulation Paths", "disciplines": ["Electrical", "Architectural"], "sheets": ["E01.02"], "description": "Light fixture types L-5 and L-6 are specified as pendants mounted at 5'-5\" (65 inches) above the finished floor. If these fixtures are located in any circulation path, they would be protruding objects that violate the minimum 80-inch head clearance requirement for accessible routes.", "evidence": [{"discipline": "Electrical", "sheet": "E01.02", "source_text": "TYPE: L-5, DESCRIPTION: 12\" PENDANT, MOUNTING: PENDANT, NOTES: PENDANT 5'-5\" AFF", "asserted_value": "65"}, {"discipline": "Electrical", "sheet": "E01.02", "source_text": "TYPE: L-6, DESCRIPTION: 16\" PENDANT, MOUNTING: PENDANT, NOTES: PENDANT 5'-5\" AFF", "asserted_value": "65"}], "recommended_resolution": "Verify the locations of all L-5 and L-6 fixtures on the lighting plan (E03.01). If they are within any accessible route or path of travel, either raise the mounting height to provide a minimum of 80 inches of clearance from the floor or relocate them outside of circulation paths.", "code_reference": "ADA 307.4"}, {"issue_id": "CON-015", "source_stage": "conflict", "category": "detail_vs_plan_mismatch", "severity": "medium", "confidence": "high", "location": "Lounge, Sink SK-1", "disciplines": ["Plumbing"], "sheets": ["P02.01", "P03.01"], "description": "The plumbing floor plan shows a 2-inch vent pipe for sink SK-1, while the plumbing riser diagram indicates a 1 1/2-inch vent for the fixture group that includes this sink. The pipe size needs to be consistent across all drawings.", "evidence": [{"discipline": "Plumbing", "sheet": "P02.01", "source_text": "2\"V", "asserted_value": "2-inch vent"}, {"discipline": "Plumbing", "sheet": "P03.01", "source_text": "1 1/2\"V", "asserted_value": "1 1/2-inch vent"}], "recommended_resolution": "The plumbing engineer must clarify the correct vent pipe size for SK-1 and update the drawings for consistency.", "code_reference": null}, {"issue_id": "CON-016", "source_stage": "conflict", "category": "missing_element", "severity": "medium", "confidence": "high", "location": "CLEANING SUPPLIES/STORAGE Room", "disciplines": ["Plumbing", "Architectural"], "sheets": ["P02.01", "A24.01"], "description": "The plumbing plan shows a floor drain (FD) in the CLEANING SUPPLIES/STORAGE room, but the architectural plan does not show this floor drain. The architectural plan should be updated to include the drain to ensure coordination for slab penetration and floor finishes.", "evidence": [{"discipline": "Plumbing", "sheet": "P02.01", "source_text": "Floor drain shown graphically with tag 'FD'.", "asserted_value": "Floor Drain is present"}, {"discipline": "Architectural", "sheet": "A24.01", "source_text": "Architectural plan for CLEANING SUPPLIES/STORAGE room shows a mop sink but does not show a floor drain.", "asserted_value": "Floor Drain is not present"}], "recommended_resolution": "The Architect and Plumbing Engineer should coordinate to confirm if the floor drain is required. If so, the architectural plans must be updated to show its location.", "code_reference": null}, {"issue_id": "CON-017", "source_stage": "conflict", "category": "missing_element", "severity": "medium", "confidence": "high", "location": "LOUNGE", "disciplines": ["Plumbing", "Architectural"], "sheets": ["P02.02", "G21.01"], "description": "The plumbing plan indicates a new water fountain (WF) in the Lounge and provides plumbing for it. However, the architectural floor plan does not show this water fountain, creating a conflict in the scope of work.", "evidence": [{"discipline": "Plumbing", "sheet": "P02.02", "source_text": "KEYED NOTE: 4 ROUTE 1/2\" COLD WATER DOWN TO RECESSED VALVE BOX. CONFIRM EXACT LOCATION WITH OWNER/ARCHITECT.", "asserted_value": "Water Fountain (WF) and associated plumbing are required."}, {"discipline": "Architectural", "sheet": "G21.01", "source_text": "The architectural plan for the LOUNGE shows a sink and counter but does not depict a water fountain.", "asserted_value": "No water fountain is shown."}], "recommended_resolution": "The Architect and Owner must confirm if the water fountain is part of the project scope. If so, the architectural plans must be updated to show its location.", "code_reference": null}, {"issue_id": "CON-018", "source_stage": "conflict", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "Roof", "disciplines": ["General", "Architectural"], "sheets": ["G11.03", "A25.01"], "description": "The Landlord Work Letter on G11.03 explicitly states that all roof penetrations must be performed by the Landlord's designated roofing contractor. However, a general note on the Architectural Roof Plan A25.01 directs the Tenant's contractor to repair and seal the roof. This creates a contractual and procedural conflict that could void the roof warranty.", "evidence": [{"discipline": "General", "sheet": "G11.03", "source_text": "6. ROOF; a. ALL ROOF PENETRATIONS MUST BE MADE BY LANDLORD'S ROOFING CONTRACTOR, AT TENANTS COST. The Landlord's Superintendent must be notified a minimum of five (5) days in advance.", "asserted_value": "Landlord's roofing contractor must perform all roof penetrations."}, {"discipline": "Architectural", "sheet": "A25.01", "source_text": "D. REPAIR AND SEAL ROOF IF REQUIRED AROUND ALL NEW PENETRATIONS AND EQUIPMENT, PER MANUFACTURER'S RECOMMENDATIONS.", "asserted_value": "The contractor for this project is instructed to repair and seal the roof around penetrations."}], "recommended_resolution": "Revise the note on A25.01 to require coordination with the Landlord's roofing contractor, consistent with the requirements on G11.03.", "code_reference": null}, {"issue_id": "CON-019", "source_stage": "conflict", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "All rated wall penetrations", "disciplines": ["Electrical", "Plumbing", "General"], "sheets": ["E05.01", "P01.01", "G31.04"], "description": "The plans provide conflicting requirements for firestopping penetrations. The Electrical detail prescriptively specifies a '3 HOUR RATED CAULK', while the Plumbing notes and General Specifications require firestopping assemblies to be rated to match the hourly rating of the construction being penetrated. This creates confusion for penetrations through walls that are not 3-hour rated.", "evidence": [{"discipline": "Electrical", "sheet": "E05.01", "source_text": "PACK BOTH ENDS OF SLEEVE WITH 3M FIRE DAM 150 3 HOUR RATED CAULK OR APPROVED EQUAL", "asserted_value": "Firestopping shall be 3-hour rated."}, {"discipline": "Plumbing", "sheet": "P01.01", "source_text": "SEAL ALL PENETRATIONS THROUGH RATED WALLS, FLOORS AND CEILINGS WITH A UL LISTED ASSEMBLY TO PROVIDE A RATING EQUAL TO OR GREATER THAN THE RATING OF THE WALL, FLOOR OR CEILING.", "asserted_value": "Firestopping rating shall be equal to or greater than the rating of the penetrated element."}, {"discipline": "General", "sheet": "G31.04", "source_text": "FIRESTOPPING: TESTED IN ACCORDANCE WITH ASTM E119 OR UL 263 TO MEET THE HOURLY F-RATINGS OF THE CONSTRUCTION BEING PENETRATED.", "asserted_value": "Firestopping rating shall meet the hourly F-rating of the penetrated element."}], "recommended_resolution": "Revise the electrical detail E05.01 to remove the prescriptive '3 HOUR' requirement and align with the performance-based requirement to match the rating of the penetrated assembly, as correctly stated on other sheets.", "code_reference": null}, {"issue_id": "CON-020", "source_stage": "conflict", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "Restroom Toilet Paper Dispenser", "disciplines": ["Architectural", "General"], "sheets": ["G11.02"], "description": "Sheet G11.02 contains conflicting mounting heights for toilet paper dispensers. The 'Typical Device & Sign Mounting Heights' diagram shows a zone between 36 inches and 48 inches AFF, while a specific TAS detail on the same sheet dimensions it to a minimum of 19 inches AFF. The 19 inch dimension is more consistent with accessibility standards.", "evidence": [{"discipline": "General", "sheet": "G11.02", "source_text": "TOILET PAPER DISPENSER", "asserted_value": "36\"- 48\" AFF"}, {"discipline": "Architectural", "sheet": "G11.02", "source_text": "19\" MIN AFF", "asserted_value": "19\" MIN AFF"}], "recommended_resolution": "Remove the incorrect 36\"-48\" AFF range for the toilet paper dispenser from the typical mounting heights diagram to avoid confusion.", "code_reference": "TAS 604.7"}, {"issue_id": "CON-021", "source_stage": "conflict", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "Roof Curb for new RTUs", "disciplines": ["Architectural", "Mechanical"], "sheets": ["M01.01", "A25.01"], "description": "The mechanical schedule specifies a 14-inch high roof curb for new RTUs, and an architectural detail note supports this. However, another note in the same architectural detail calls for a 12-inch curb ('Nominate 1'0\"'). This ambiguity affects bidding and installation.", "evidence": [{"discipline": "Mechanical", "sheet": "M01.01", "source_text": "9. PROVIDE 14\" HIGH INSULATED ROOF CURB.", "asserted_value": "14 inches"}, {"discipline": "Architectural", "sheet": "A25.01", "source_text": "Nominate 1'0\" for P.Con.", "asserted_value": "12 inches"}, {"discipline": "Architectural", "sheet": "A25.01", "source_text": "14\" HIGH PER IECC & MFR'S REQ.'", "asserted_value": "14 inches"}], "recommended_resolution": "Confirm the required curb height with the Mechanical engineer and remove the conflicting 12-inch dimension from the architectural detail.", "code_reference": null}, {"issue_id": "CON-022", "source_stage": "code", "category": "other", "severity": "medium", "confidence": "high", "location": "Floor Finish Specifications", "disciplines": ["General", "Architectural"], "sheets": ["G31.05", "A23.01"]}]} \ No newline at end of file diff --git a/backend/.llm_cache/380a548a0110bc3dbe3f3b57a90b8f534d588066cdf5e8dccdf854ef00828856.json b/backend/.llm_cache/380a548a0110bc3dbe3f3b57a90b8f534d588066cdf5e8dccdf854ef00828856.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/380a548a0110bc3dbe3f3b57a90b8f534d588066cdf5e8dccdf854ef00828856.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/3b9f1e438c00801e9ba8497152dd7a8fd6eaef87f5021ff71f83a0a1407b01d3.json b/backend/.llm_cache/3b9f1e438c00801e9ba8497152dd7a8fd6eaef87f5021ff71f83a0a1407b01d3.json new file mode 100644 index 0000000..1cbe902 --- /dev/null +++ b/backend/.llm_cache/3b9f1e438c00801e9ba8497152dd7a8fd6eaef87f5021ff71f83a0a1407b01d3.json @@ -0,0 +1 @@ +{"issues": [{"issue_id": "verizon-elyson-001", "source_stage": "code", "category": "ada", "severity": "high", "confidence": "high", "location": "Lounge - Sink (SK-1)", "disciplines": ["Plumbing", "Architectural"], "sheets": ["P01.01", "P02.01"], "description": "The plumbing fixture schedule on sheet P01.01 specifies sink SK-1 as a \"self-rimming\" model, which is typically installed in a countertop with base cabinetry underneath. However, as an ADA-compliant sink in a common use area (Lounge), it must provide knee and toe clearance for a forward approach. Standard cabinetry would obstruct this required clearance, rendering the fixture non-compliant.", "evidence": [{"discipline": "Plumbing", "sheet": "P01.01", "source_text": "LBAO221965PDC ELKAY, 18 GAUGE TYPE 304 STAINLESS STEEL SINK, SELF-RIMMING, 22\"X19\"X6.5\" NOM. DIMENSIONS...", "asserted_value": "SELF-RIMMING"}, {"discipline": "Plumbing", "sheet": "P01.01", "source_text": "SINGLE BOWL SINK (A.D.A)", "asserted_value": "SINGLE BOWL SINK (A.D.A)"}, {"discipline": "Plumbing", "sheet": "P02.01", "source_text": "SK-1", "asserted_value": "fixture_location: SK-1 is located in LOUNGE."}], "recommended_resolution": "Provide an architectural detail or elevation of the SK-1 installation confirming knee and toe clearance per ADA 606.2 and 306. The design should specify an open-front cabinet or cantilevered counter. Also, verify the counter surface height does not exceed 34 inches AFF per ADA 606.3.", "code_reference": "ADA 606.2"}, {"issue_id": "verizon-elyson-002", "source_stage": "code", "category": "ada", "severity": "critical", "confidence": "high", "location": "Men's Restroom and Women's Room", "disciplines": ["Plumbing", "Architectural", "General"], "sheets": ["P01.01", "P02.01"], "description": "The fixture schedule specifies water closet WC-1 as a \"FLOOR MOUNTED\" model, which is shown on plans in the single-user Men's and Women's restrooms. Per ADA, a wheelchair accessible compartment with a floor-mounted water closet requires a minimum clear depth of 59 inches. The architectural plans that would confirm this dimension are not available, creating a critical risk that the constructed rooms will not meet the minimum required depth.", "evidence": [{"discipline": "Plumbing", "sheet": "P01.01", "source_text": "WATER CLOSET (FLOOR MOUNTED) (A.D.A.)", "asserted_value": "Floor Mounted"}, {"discipline": "Plumbing", "sheet": "P02.01", "source_text": "WC-1", "asserted_value": "fixture_location: WC-1 is located in MEN'S RESTROOM."}], "recommended_resolution": "Verify on the dimensioned architectural floor plan (likely missing sheet on Page 14) that the clear depth of both the Men's and Women's restrooms is at least 59 inches, measured from the rear wall to the opposite wall/face of door. If this dimension is not met, the room size must be increased, or the fixture must be changed to a wall-hung model and the room depth verified to be at least 56 inches.", "code_reference": "ADA 604.8.1.1"}, {"issue_id": "verizon-elyson-003", "source_stage": "code", "category": "ada", "severity": "medium", "confidence": "high", "location": "Lounge", "disciplines": ["Plumbing", "Architectural"], "sheets": ["P02.02"], "description": "Keynote 4 on the plumbing plan calls for a recessed valve box in the Lounge but defers the final placement decision by stating \"CONFIRM EXACT LOCATION WITH OWNER/ARCHITECT.\" The valve is an operable part that must be within accessible reach ranges in a common use area like a lounge. Leaving the location unspecified creates a high risk of non-compliant installation.", "evidence": [{"discipline": "Plumbing", "sheet": "P02.02", "source_text": "KEYED NOTE: 4 ROUTE 1/2\" COLD WATER DOWN TO RECESSED VALVE BOX. CONFIRM EXACT LOCATION WITH OWNER/ARCHITECT.", "asserted_value": "KEYED NOTE: 4 ROUTE 1/2\" COLD WATER DOWN TO RECESSED VALVE BOX. CONFIRM EXACT LOCATION WITH OWNER/ARCHITECT."}], "recommended_resolution": "Revise the drawing to specify the mounting location and height of the recessed valve box. The operable part of the valve must be located within accessible reach ranges as defined by ADA Standards section 309, and have the required clear floor space for approach.", "code_reference": "ADA 205.1"}]} \ No newline at end of file diff --git a/backend/.llm_cache/3bbd4435e1b3f7ef47e31711d1dc72ff755ddb9616c9028127e21b31c9f2e96c.json b/backend/.llm_cache/3bbd4435e1b3f7ef47e31711d1dc72ff755ddb9616c9028127e21b31c9f2e96c.json new file mode 100644 index 0000000..d7ed013 --- /dev/null +++ b/backend/.llm_cache/3bbd4435e1b3f7ef47e31711d1dc72ff755ddb9616c9028127e21b31c9f2e96c.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "scope_description_01", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "Project Scope Description", "disciplines": ["General"], "sheets": ["G11.04", "G21.01"], "description": "The scope of work is described inconsistently. G11.04 describes the project as a 'LEASE SPACE BUILD OUT FOR A FIRST GENERATION RETAIL SPACE', implying a new, unfinished shell space. G21.01 describes the project as a 'TENANT INTERIOR REMODEL', implying alteration of a previously finished space. This must be clarified for accurate bidding and understanding of demolition scope.", "evidence": [{"discipline": "General", "sheet": "G11.04", "source_text": "PROJECT IS A TENANT INTERIOR LEASE SPACE BUILD OUT FOR A FIRST GENERATION RETAIL SPACE.", "asserted_value": "First Generation Build-Out"}, {"discipline": "General", "sheet": "G21.01", "source_text": "PROJECT IS A TENANT INTERIOR REMODEL OF 3,323 SF", "asserted_value": "Remodel"}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/3cd1fab325af7f4d28a3610366fc74c9a29a0ce4dae25ab6fbd398603f725a1b.json b/backend/.llm_cache/3cd1fab325af7f4d28a3610366fc74c9a29a0ce4dae25ab6fbd398603f725a1b.json new file mode 100644 index 0000000..60d8f7b --- /dev/null +++ b/backend/.llm_cache/3cd1fab325af7f4d28a3610366fc74c9a29a0ce4dae25ab6fbd398603f725a1b.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "inv_rack_data_conduit_quantity", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "INVENTORY room, network rack", "disciplines": ["Architectural", "Electrical"], "sheets": ["A24.01", "E02.01"], "description": "The Architectural drawing specifies a requirement for three 3-inch conduits for data cabling at the network rack. The Electrical drawing shows both the required three 3-inch conduits (as sleeves) and an additional, separate 1-1/4 inch conduit for data. The total scope and quantity of data pathways is inconsistent between the drawings and must be clarified.", "evidence": [{"discipline": "Architectural", "sheet": "A24.01", "source_text": "PROVIDE (3) 3\" CONDUITS FROM DIRECTLY ABOVE THE NETWORK RACK INTO THE SALES CEILING PLENUM AREA FOR DATA CABLING - FIELD COORDINATE.", "asserted_value": "(3) 3-inch conduits"}, {"discipline": "Electrical", "sheet": "E02.01", "source_text": "3 PROVIDE 1-1/4\"C WITH PULLSTRING FOR DATA TO CEILING SPACE ABOVE RACK SYSTEM IN INVENTORY ROOM... 6 FURNISH AND INSTALL (3) 3\" CONDUIT SLEEVES... FOR DATA EQUIPMENT WIRING.", "asserted_value": "(3) 3-inch conduits AND (1) 1-1/4 inch conduit"}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/3ce6e0c9d2cf1d2e25e65a501b68cbc4e4df71f44755cae27b259d8d0d20bc42.json b/backend/.llm_cache/3ce6e0c9d2cf1d2e25e65a501b68cbc4e4df71f44755cae27b259d8d0d20bc42.json new file mode 100644 index 0000000..a1c2770 --- /dev/null +++ b/backend/.llm_cache/3ce6e0c9d2cf1d2e25e65a501b68cbc4e4df71f44755cae27b259d8d0d20bc42.json @@ -0,0 +1 @@ +{"normalized_assertions": [{"assertion_id": "G11.04#5", "original_value": "1", "normalized_value": "1", "normalized_unit": null, "normalized_attribute": "number_of_floors", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.04#6", "original_value": "30'-0\"", "normalized_value": "360", "normalized_unit": "inches", "normalized_attribute": "building_height", "normalization_notes": "Converted 30 feet to 360 inches", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.04#7", "original_value": "2402160146", "normalized_value": "2402160146", "normalized_unit": null, "normalized_attribute": "shell_building_permit_number", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.04#8", "original_value": "2311220004", "normalized_value": "2311220004", "normalized_unit": null, "normalized_attribute": "civil_project_number", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.04#9", "original_value": "PROJECT IS A TENANT INTERIOR LEASE SPACE BUILD OUT FOR A FIRST GENERATION RETAIL SPACE. THE SCOPE OF WORK CONSISTS OF NEW CEILINGS, FLOORING, FINISHES, NONSTRUCTURAL WALLS, ELECTRICAL, MECHANICAL AND PLUMBING", "normalized_value": "PROJECT IS A TENANT INTERIOR LEASE SPACE BUILD OUT FOR A FIRST GENERATION RETAIL SPACE. THE SCOPE OF WORK CONSISTS OF NEW CEILINGS, FLOORING, FINISHES, NONSTRUCTURAL WALLS, ELECTRICAL, MECHANICAL AND PLUMBING", "normalized_unit": null, "normalized_attribute": "project_description", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.04#10", "original_value": "OCC. CLASS M, AREA SPECIFIC USE Mercantile, GROSS SF 3,323, SF PER OCC. 60, DESIGN OCC. 56", "normalized_value": "OCC. CLASS M, AREA SPECIFIC USE Mercantile, GROSS SF 3,323, SF PER OCC. 60, DESIGN OCC. 56", "normalized_unit": null, "normalized_attribute": "schedule_entry", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.04#11", "original_value": "2", "normalized_value": "2", "normalized_unit": null, "normalized_attribute": "required_exit_count", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G21.01#0", "original_value": "INVENTORY", "normalized_value": "INVENTORY", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G21.01#1", "original_value": "LOUNGE", "normalized_value": "LOUNGE", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G21.01#2", "original_value": "MEN'S RESTROOM", "normalized_value": "MEN'S RESTROOM", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "source_text_preserved": "MEN'S RESTROOM", "normalization_confidence": "high"}, {"assertion_id": "G21.01#3", "original_value": "WOMEN'S RESTROOM", "normalized_value": "WOMEN'S RESTROOM", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G21.01#4", "original_value": "MANAGER'S OFFICE", "normalized_value": "MANAGER'S OFFICE", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G21.01#5", "original_value": "CLEANING SUPPLIES/STORAGE", "normalized_value": "CLEANING SUPPLIES/STORAGE", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G21.01#6", "original_value": "SALES AREA", "normalized_value": "SALES AREA", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G21.01#7", "original_value": "AUTHORITY HAVING JURISDICTION: HARRIS COUNTY", "normalized_value": "AUTHORITY HAVING JURISDICTION: HARRIS COUNTY", "normalized_unit": null, "normalized_attribute": "general_note", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G21.01#8", "original_value": "AUTHORITY HAVING JURISDICTION (ACCESSIBILITY): STATE OF TEXAS", "normalized_value": "AUTHORITY HAVING JURISDICTION (ACCESSIBILITY): STATE OF TEXAS", "normalized_unit": null, "normalized_attribute": "general_note", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G21.01#9", "original_value": "2018 INTERNATIONAL BUILDING CODE (IBC) CH. 2-10 WITH HARRIS COUNTY AMENDMENTS", "normalized_value": "2018 INTERNATIONAL BUILDING CODE (IBC) CH. 2-10 WITH HARRIS COUNTY AMENDMENTS", "normalized_unit": null, "normalized_attribute": "general_note", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G21.01#10", "original_value": "2021 INTERNATIONAL FIRE CODE (IFC) WITH HARRIS COUNTY AMENDMENTS", "normalized_value": "2021 INTERNATIONAL FIRE CODE (IFC) WITH HARRIS COUNTY AMENDMENTS", "normalized_unit": null, "normalized_attribute": "general_note", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G21.01#11", "original_value": "2021 STATE OF TEXAS ADOPTED INTERNATIONAL MECHANICAL CODE (IMC)", "normalized_value": "2021 STATE OF TEXAS ADOPTED INTERNATIONAL MECHANICAL CODE (IMC)", "normalized_unit": null, "normalized_attribute": "general_note", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G21.01#12", "original_value": "2018 STATE OF TEXAS ADOPTED INTERNATIONAL PLUMBING CODE (IPC)", "normalized_value": "2018 STATE OF TEXAS ADOPTED INTERNATIONAL PLUMBING CODE (IPC)", "normalized_unit": null, "normalized_attribute": "general_note", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G21.01#13", "original_value": "2023 STATE OF TEXAS ADOPTED 2014 NFPA 70 NATIONAL ELECTRICAL CODE (NEC)", "normalized_value": "2023 STATE OF TEXAS ADOPTED 2014 NFPA 70 NATIONAL ELECTRICAL CODE (NEC)", "normalized_unit": null, "normalized_attribute": "general_note", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G21.01#14", "original_value": "2012 TEXAS ACCESSIBILITY STANDARDS", "normalized_value": "2012 TEXAS ACCESSIBILITY STANDARDS", "normalized_unit": null, "normalized_attribute": "general_note", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G21.01#15", "original_value": "PROJECT IS A TENANT INTERIOR REMODEL OF 3,323 SF", "normalized_value": "PROJECT IS A TENANT INTERIOR REMODEL OF 3,323 SF", "normalized_unit": null, "normalized_attribute": "general_note", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G21.01#16", "original_value": "THE BUILDING IS FULLY SPRINKLERED", "normalized_value": "THE BUILDING IS FULLY SPRINKLERED", "normalized_unit": null, "normalized_attribute": "general_note", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.01#0", "original_value": "Ten (10) copies required for submittal.", "normalized_value": "Ten (10) copies required for submittal.", "normalized_unit": null, "normalized_attribute": "administration", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.01#1", "original_value": "In case of discrepancies, the contractor shall provide the better quality or greater quantity of work at no additional cost.", "normalized_value": "In case of discrepancies, the contractor shall provide the better quality or greater quantity of work at no additional cost.", "normalized_unit": null, "normalized_attribute": "administration", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.01#2", "original_value": "One electronic copy in PDF format required for submittal.", "normalized_value": "One electronic copy in PDF format required for submittal.", "normalized_unit": null, "normalized_attribute": "administration", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.01#3", "original_value": "Architect review time for submittals is 7 calendar days.", "normalized_value": "Architect review time for submittals is 7 calendar days.", "normalized_unit": null, "normalized_attribute": "administration", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.01#4", "original_value": "Add an additional seven (7) calendar days for sequential review by consultants or owner.", "normalized_value": "Add an additional seven (7) calendar days for sequential review by consultants or owner.", "normalized_unit": null, "normalized_attribute": "administration", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.02#0", "original_value": "Conduct selective demolition so Owner's operations are not disrupted.", "normalized_value": "Conduct selective demolition so Owner's operations are not disrupted.", "normalized_unit": null, "normalized_attribute": "owner_occupancy", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.02#1", "original_value": "A report on the presence of hazardous materials is on file for review and use.", "normalized_value": "A report on the presence of hazardous materials is on file for review and use.", "normalized_unit": null, "normalized_attribute": "notification_requirement", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.02#2", "original_value": "Refrigerant Recovery Technician must be certified by an EPA-approved certification program.", "normalized_value": "Refrigerant Recovery Technician must be certified by an EPA-approved certification program.", "normalized_unit": null, "normalized_attribute": "technician_qualification", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.02#3", "original_value": "Comply with ASSE A10.6 and NFPA 241.", "normalized_value": "Comply with ASSE A10.6 and NFPA 241.", "normalized_unit": null, "normalized_attribute": "code_compliance", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.02#4", "original_value": "Provide extensions to existing utilities including plumbing, fire protection, electrical, and telecommunications.", "normalized_value": "Provide extensions to existing utilities including plumbing, fire protection, electrical, and telecommunications.", "normalized_unit": null, "normalized_attribute": "system_extension", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.02#5", "original_value": "Seal voids at penetrations of fire-rated construction with fire rated material in accordance with Section 07 8400.", "normalized_value": "Seal voids at penetrations of fire-rated construction with fire rated material in accordance with Section 07 8400.", "normalized_unit": null, "normalized_attribute": "firestopping_requirement", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.02#6", "original_value": "01 3300", "normalized_value": "01 3300", "normalized_unit": null, "normalized_attribute": "related_section", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.02#7", "original_value": "01 7000", "normalized_value": "01 7000", "normalized_unit": null, "normalized_attribute": "related_section", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.02#8", "original_value": "Record measured depths of foundations in relation to finish first floor datum.", "normalized_value": "Record measured depths of foundations in relation to finish first floor datum.", "normalized_unit": null, "normalized_attribute": "as-built_requirement", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.02#9", "original_value": "Record measured horizontal and vertical locations of underground utilities and appurtenances.", "normalized_value": "Record measured horizontal and vertical locations of underground utilities and appurtenances.", "normalized_unit": null, "normalized_attribute": "as-built_requirement", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.02#10", "original_value": "Record measured locations of internal utilities and appurtenances concealed in construction.", "normalized_value": "Record measured locations of internal utilities and appurtenances concealed in construction.", "normalized_unit": null, "normalized_attribute": "as-built_requirement", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.02#11", "original_value": "1-1/2 inch, 2 inch maximum", "normalized_value": "1-1/2 inch, 2 inch maximum", "normalized_unit": null, "normalized_attribute": "binder_size", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.03#0", "original_value": "Owner will occupy adjacent spaces during construction.", "normalized_value": "Owner will occupy adjacent spaces during construction.", "normalized_unit": null, "normalized_attribute": "general_note", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.03#1", "original_value": "Minimum of five years experience with related thin masonry installations.", "normalized_value": "Minimum of five years experience with related thin masonry installations.", "normalized_unit": null, "normalized_attribute": "installer_qualification", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.03#2", "original_value": "Test reports shall indicate 24-hour cold water absorption, 5-hour boil absorption, saturation coefficient, initial rate of absorption, and efflorescence.", "normalized_value": "Test reports shall indicate 24-hour cold water absorption, 5-hour boil absorption, saturation coefficient, initial rate of absorption, and efflorescence.", "normalized_unit": null, "normalized_attribute": "performance_testing", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.03#3", "original_value": "48\" LONG BY 48\"", "normalized_value": "48\" long by 48\"", "normalized_unit": null, "normalized_attribute": "mockup_size", "normalization_notes": "Lowered case for consistency", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G31.03#4", "original_value": "L/360", "normalized_value": "L/360", "normalized_unit": null, "normalized_attribute": "deflection_limit", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.03#5", "original_value": "Minimum of 3 years experience in high quality non ferrous ornamental metal work.", "normalized_value": "Minimum of 3 years experience in high quality non ferrous ornamental metal work.", "normalized_unit": null, "normalized_attribute": "installer_qualification", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.03#6", "original_value": "ASTM B221", "normalized_value": "ASTM B221", "normalized_unit": null, "normalized_attribute": "material_standard", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.03#7", "original_value": "ASTM A1008", "normalized_value": "ASTM A1008", "normalized_unit": null, "normalized_attribute": "material_standard", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.03#8", "original_value": "Coordinate with foundation of wall panels, ceiling panels and trim specified in Section 064000.", "normalized_value": "Coordinate with foundation of wall panels, ceiling panels and trim specified in Section 064000.", "normalized_unit": null, "normalized_attribute": "general_note", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.03#9", "original_value": "Shop applied polyester or fluoropolymer powder coat finish system with added inhibitors for exterior locations.", "normalized_value": "Shop applied polyester or fluoropolymer powder coat finish system with added inhibitors for exterior locations.", "normalized_unit": null, "normalized_attribute": "coating_system", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#0", "original_value": "North American Architectural Woodwork Standards (NAAWS), current edition", "normalized_value": "North American Architectural Woodwork Standards (NAAWS), current edition", "normalized_unit": null, "normalized_attribute": "reference_standard", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#1", "original_value": "Use fire-retardant treated MDF core for panel fabrication unless indicated otherwise.", "normalized_value": "Use fire-retardant treated MDF core for panel fabrication unless indicated otherwise.", "normalized_unit": null, "normalized_attribute": "material_specification", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#2", "original_value": "1/16", "normalized_value": "1/16", "normalized_unit": null, "normalized_attribute": "installation_tolerance", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#3", "original_value": "1/32", "normalized_value": "1/32", "normalized_unit": null, "normalized_attribute": "installation_tolerance", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#4", "original_value": "10", "normalized_value": "10", "normalized_unit": null, "normalized_attribute": "warranty_duration", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#5", "original_value": "1/8 inch in 10 feet, noncumulative", "normalized_value": "1/8 inch in 10 feet, noncumulative", "normalized_unit": null, "normalized_attribute": "installation_tolerance", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#6", "original_value": "plus or minus 1/16", "normalized_value": "plus or minus 1/16", "normalized_unit": null, "normalized_attribute": "installation_tolerance", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#7", "original_value": "ASTM E119 or UL 263", "normalized_value": "ASTM E119 or UL 263", "normalized_unit": null, "normalized_attribute": "testing_standard", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#8", "original_value": "UL Assemblies", "normalized_value": "UL Assemblies", "normalized_unit": null, "normalized_attribute": "listing_requirement", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}]} \ No newline at end of file diff --git a/backend/.llm_cache/3e6dd9cce1a067b4701054a3d81cc61662867c9da4204545611a8a1329a821b1.json b/backend/.llm_cache/3e6dd9cce1a067b4701054a3d81cc61662867c9da4204545611a8a1329a821b1.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/3e6dd9cce1a067b4701054a3d81cc61662867c9da4204545611a8a1329a821b1.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/3f5b3eda58a05acadba332da7197eed5d6bf1958184e43e18b4d9eece48acf13.json b/backend/.llm_cache/3f5b3eda58a05acadba332da7197eed5d6bf1958184e43e18b4d9eece48acf13.json new file mode 100644 index 0000000..1880a3a --- /dev/null +++ b/backend/.llm_cache/3f5b3eda58a05acadba332da7197eed5d6bf1958184e43e18b4d9eece48acf13.json @@ -0,0 +1 @@ +{"issues": [{"issue_id": "CODE-VERIZON-001", "source_stage": "code", "category": "energy", "severity": "medium", "confidence": "high", "location": "Electrical Notes on E01.02 and E03.01", "disciplines": ["Electrical"], "sheets": ["E01.02", "E03.01"], "description": "The electrical general notes cite the 2021 edition of the IECC, but the project's adopted code profile specifies the 2015 IECC. This discrepancy could lead to the project being designed and inspected against the wrong code version.", "evidence": [{"discipline": "Electrical", "sheet": "E01.02", "source_text": "1. PROVIDE LOW-VOLTAGE DRY-TYPE TRANSFORMERS THAT MEET THE MINIMUM EFFICIENCY REQUIREMENTS OF 2021 IECC TABLE C405.8.", "asserted_value": "2021 IECC"}, {"discipline": "Electrical", "sheet": "E03.01", "source_text": "3. ALL LIGHTING SYSTEMS SHALL BE TESTED TO ENSURE PROPER CALIBRATION, ADJUSTMENT, PROGRAMMING, AND OPERATION IN ACCORDANCE WITH IECC 2021 SECTION C408.3.", "asserted_value": "IECC 2021"}], "recommended_resolution": "Revise all notes and specifications to reference the correct adopted code, the 2015 IECC, and ensure all design criteria comply with that edition.", "code_reference": null}, {"issue_id": "CODE-VERIZON-002", "source_stage": "code", "category": "ada", "severity": "high", "confidence": "high", "location": "Luminaire Schedule", "disciplines": ["Electrical", "Architectural"], "sheets": ["E01.02"], "description": "Light fixture types L-5 and L-6 are specified as pendants mounted at 5'-5\" (65 inches) above the finished floor. If these fixtures are located in any circulation path, they would be protruding objects that violate the minimum 80-inch head clearance requirement for accessible routes.", "evidence": [{"discipline": "Electrical", "sheet": "E01.02", "source_text": "TYPE: L-5, DESCRIPTION: 12\" PENDANT, MOUNTING: PENDANT, NOTES: PENDANT 5'-5\" AFF", "asserted_value": "65"}, {"discipline": "Electrical", "sheet": "E01.02", "source_text": "TYPE: L-6, DESCRIPTION: 16\" PENDANT, MOUNTING: PENDANT, NOTES: PENDANT 5'-5\" AFF", "asserted_value": "65"}], "recommended_resolution": "Verify the locations of all L-5 and L-6 fixtures on the lighting plan (E03.01). If they are within any accessible route or path of travel, either raise the mounting height to provide a minimum of 80 inches of clearance from the floor or relocate them outside of circulation paths.", "code_reference": null}, {"issue_id": "CODE-VERIZON-003", "source_stage": "code", "category": "ada", "severity": "high", "confidence": "high", "location": "Sales Area", "disciplines": ["Electrical"], "sheets": ["E04.01"], "description": "A data outlet (CAT.6) is specified to be mounted at 55 inches AFF. Data outlets are considered operable parts and must be located within accessible reach ranges. The maximum high reach for an operable part is typically 48 inches AFF. The 55-inch mounting height exceeds this limit, making it non-compliant.", "evidence": [{"discipline": "Electrical", "sheet": "E04.01", "source_text": "(2) CAT.6/55\"/H", "asserted_value": "55"}], "recommended_resolution": "Revise the mounting height of the specified data outlet to be no more than 48 inches above the finished floor.", "code_reference": "ADA 205.1"}, {"issue_id": "CODE-VERIZON-004", "source_stage": "code", "category": "ada", "severity": "medium", "confidence": "high", "location": "Restrooms", "disciplines": ["Architectural", "Plumbing", "Electrical"], "sheets": ["E03.01", "E04.01"], "description": "Electrical plans provide conflicting information about restrooms (one 'RESTROOM' on E03.01 vs. 'MEN'S' and 'WOMEN'S' on E04.01). More importantly, the drawing set lacks enlarged restroom plans with dimensions, fixture clearances, door swings, and accessory mounting heights. This information is required to verify compliance with accessibility standards for clear floor space, turning space, and door maneuvering clearances.", "evidence": [{"discipline": "Electrical", "sheet": "E03.01", "source_text": "RESTROOM", "asserted_value": "RESTROOM"}, {"discipline": "Electrical", "sheet": "E04.01", "source_text": "MEN'S RESTROOM", "asserted_value": "MEN'S RESTROOM"}, {"discipline": "Electrical", "sheet": "E04.01", "source_text": "WOMEN'S RESTROOM", "asserted_value": "WOMEN'S RESTROOM"}], "recommended_resolution": "Provide enlarged, fully dimensioned floor plans of all restrooms. Plans should clearly show toilet centerline, clear floor space at all fixtures, door swing, location of grab bars and all other accessories, and turning space to confirm compliance with all applicable TAS and ADA requirements.", "code_reference": "ADA 603.2.3"}]} \ No newline at end of file diff --git a/backend/.llm_cache/3f8c03352748c65fea4cfc3a396f87aecd05cdadf7742cfb8deb651e05a33d09.json b/backend/.llm_cache/3f8c03352748c65fea4cfc3a396f87aecd05cdadf7742cfb8deb651e05a33d09.json new file mode 100644 index 0000000..9e77016 --- /dev/null +++ b/backend/.llm_cache/3f8c03352748c65fea4cfc3a396f87aecd05cdadf7742cfb8deb651e05a33d09.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "firestopping_rating_01", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "Electrical Penetration Sleeve Detail vs. General Firestopping Specifications", "disciplines": ["General", "Plumbing", "Electrical"], "sheets": ["G31.04", "P01.01", "E05.01"], "description": "The Electrical detail for a wall sleeve (4/E05.01) prescriptively calls for '3 HOUR RATED CAULK'. However, the general specifications and plumbing notes require firestopping assemblies to be UL-listed and have a rating that matches the wall being penetrated, which may be 1-hour or 2-hour. Applying a blanket 3-hour requirement via a detail, without reference to a specific UL assembly or the actual wall rating, is contradictory and may lead to non-compliant installations. The detail should require a UL assembly appropriate for the specific wall rating.", "evidence": [{"discipline": "General", "sheet": "G31.04", "source_text": "FIRESTOPPING: TESTED IN ACCORDANCE WITH ASTM E119 OR UL 263 TO MEET THE HOURLY F-RATINGS OF THE CONSTRUCTION BEING PENETRATED.", "asserted_value": "Firestopping rating to match the penetrated element's rating"}, {"discipline": "Plumbing", "sheet": "P01.01", "source_text": "7. SEAL ALL PENETRATIONS THROUGH RATED WALLS, FLOORS AND CEILINGS WITH A UL LISTED ASSEMBLY TO PROVIDE A RATING EQUAL TO OR GREATER THAN THE RATING OF THE WALL, FLOOR OR CEILING.", "asserted_value": "UL listed assembly rating to be equal or greater than the penetrated element's rating"}, {"discipline": "Electrical", "sheet": "E05.01", "source_text": "PACK BOTH ENDS OF SLEEVE WITH 3M FIRE DAM 150 3 HOUR RATED CAULK OR APPROVED EQUAL", "asserted_value": "3 Hour Rated Caulk"}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/40bd89c0b28a852243ac6f7a685cea922d55dfc7604e2c60e6dcfcb6035e4812.json b/backend/.llm_cache/40bd89c0b28a852243ac6f7a685cea922d55dfc7604e2c60e6dcfcb6035e4812.json new file mode 100644 index 0000000..8457e1a --- /dev/null +++ b/backend/.llm_cache/40bd89c0b28a852243ac6f7a685cea922d55dfc7604e2c60e6dcfcb6035e4812.json @@ -0,0 +1 @@ +{"project_code_profile": {"project_name": "Verizon Elyson", "project_address": "7022 ELYSON EXCHANGE WAY", "jurisdiction": {"city": null, "county": null, "state": "CA", "country": "US", "authority_having_jurisdiction": ["City of San Diego"], "fire_marshal": null, "building_department": null, "accessibility_reviewer": null}, "project_classification": {"project_type": "unknown", "work_type": "unknown", "occupancy": null, "construction_type": null, "sprinklered": null, "public_project": null, "healthcare_project": false, "food_service_project": false, "airport_project": false, "school_project": false}, "adopted_codes": {"building_code": null, "existing_building_code": null, "fire_code": null, "mechanical_code": null, "plumbing_code": null, "electrical_code": null, "energy_code": null, "accessibility_code": null}, "review_paths": {"ibc_review": true, "iebc_review": false, "fire_code_review": true, "ada_review": true, "tas_tdlr_review": false, "municode_review": true, "health_department_review": false, "owner_standard_review": false}, "local_amendment_sources": [{"source_name": "Municode", "jurisdiction": "San Diego", "source_url": null, "status": "needs_lookup"}], "missing_information": ["City jurisdiction", "County jurisdiction", "Project type", "Work type", "Occupancy", "Construction type", "Sprinklered status", "Public project status"], "assumptions": ["Project is in California", "Project is not healthcare, food service, airport, or school related"], "human_confirmation_required": true}} \ No newline at end of file diff --git a/backend/.llm_cache/414e0bb3f2732c3f70611f12dc5e59fe5af382a1f3bc61e84d39c61363c500b6.json b/backend/.llm_cache/414e0bb3f2732c3f70611f12dc5e59fe5af382a1f3bc61e84d39c61363c500b6.json new file mode 100644 index 0000000..6b03656 --- /dev/null +++ b/backend/.llm_cache/414e0bb3f2732c3f70611f12dc5e59fe5af382a1f3bc61e84d39c61363c500b6.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "edf1_tmv_missing_on_plan", "category": "missing_element", "severity": "medium", "confidence": "high", "location": "Women's Restroom, wall at Drinking Fountain EDF-1", "disciplines": ["Plumbing", "Architectural"], "sheets": ["P03.01", "P02.01"], "description": "The plumbing riser diagram on sheet P03.01 indicates that a thermostatic mixing valve (TMV) is required to supply tempered water to the electric drinking fountain (EDF-1). However, this TMV is not located on the plumbing floor plan on P02.01. The valve requires physical space within the wall and potentially an access panel, which is not accounted for and must be coordinated with architecture.", "evidence": [{"discipline": "Plumbing", "sheet": "P03.01", "source_text": "WATER T.S. PLAN - FOR PIPE SIZING ONLY (TYPICAL)", "asserted_value": "Riser diagram shows fixture EDF-1 is supplied with tempered water via a Thermostatic Mixing Valve (TMV)."}, {"discipline": "Plumbing", "sheet": "P02.01", "source_text": "FLOOR PLAN- SANITARY WASTE & VENT", "asserted_value": "The floor plan shows fixture EDF-1, but the required TMV is not shown in the adjacent wall."}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/44aa5ac5c6cb4ad2b7a0a972fa1daaa85aaa2e87937d0a46466a59dec41282b6.json b/backend/.llm_cache/44aa5ac5c6cb4ad2b7a0a972fa1daaa85aaa2e87937d0a46466a59dec41282b6.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/44aa5ac5c6cb4ad2b7a0a972fa1daaa85aaa2e87937d0a46466a59dec41282b6.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/460a94ceb07c364257a28e301eb84c115a813481a7402cbd086c01ae149a2bf6.json b/backend/.llm_cache/460a94ceb07c364257a28e301eb84c115a813481a7402cbd086c01ae149a2bf6.json new file mode 100644 index 0000000..1d2573d --- /dev/null +++ b/backend/.llm_cache/460a94ceb07c364257a28e301eb84c115a813481a7402cbd086c01ae149a2bf6.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "lounge_transformer_ceiling_conflict_1", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "Lounge", "disciplines": ["Electrical", "Architectural"], "sheets": ["E02.01", "A23.01"], "description": "Electrical Keynote 7 on sheet E02.01 states that the transformer is to be suspended 'ABOVE ACCESSIBLE CEILING'. However, the Architectural Finish Plan A23.01 specifies a hard-lid Gypsum Board Ceiling (C1) in the Lounge, where the transformer is likely located to serve Panel L. A gypsum board ceiling is not accessible, which conflicts with the electrical requirement and would prevent future service of the transformer.", "evidence": [{"discipline": "Electrical", "sheet": "E02.01", "source_text": "7 TRANSFORMER TO BE SUSPENDED FROM STRUCTURE AT HIGH LEVEL ABOVE ACCESSIBLE CEILING.", "asserted_value": "Transformer requires an accessible ceiling."}, {"discipline": "Architectural", "sheet": "A23.01", "source_text": "C1 CEILING TYPE: GYPSUM BOARD CEILING ... LOCATION: ... LOUNGE...", "asserted_value": "Ceiling is specified as Gypsum Board (not accessible)."}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/4736f1f036206441dc800cb9336237a9a4366f969540d28d4356c66ceebc8280.json b/backend/.llm_cache/4736f1f036206441dc800cb9336237a9a4366f969540d28d4356c66ceebc8280.json new file mode 100644 index 0000000..c0b8d82 --- /dev/null +++ b/backend/.llm_cache/4736f1f036206441dc800cb9336237a9a4366f969540d28d4356c66ceebc8280.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "vapor_barrier_spec_discrepancy", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "Slab-on-Grade Penetration Pour Back", "disciplines": ["General", "Plumbing"], "sheets": ["G11.03", "P03.01"], "description": "The Landlord Work Letter requires a 15 mil vapor barrier for concrete pour-backs at penetrations, while the plumbing Backfill Piping Detail specifies a 6 mil vapor retarder. These are conflicting material specifications for the same scope of work. The contractor needs a single, clear requirement to follow, and landlord requirements are typically non-negotiable.", "evidence": [{"discipline": "General", "sheet": "G11.03", "source_text": "b. The Tenant shall fire caulk the opening for any penetrations into the roof deck and at any penetrations. Demolising concrete slab shall be poured back complete with the following items as a minimum: ... ii. 15 Mil vapor barrier", "asserted_value": "15 Mil vapor barrier"}, {"discipline": "Plumbing", "sheet": "P03.01", "source_text": "PER 2021 IBC, CHAPTER 19, SECTION 1907: POLYETHYLENE VAPOR RETARDER MINIMUM 6-MIL SHALL BE REQUIRED.", "asserted_value": "6-mil Polyethylene vapor retarder minimum"}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/47572e3fe895bf8fa6c5bffc2bf0c784c08672a1b6d8f7ba849012e960821c1a.json b/backend/.llm_cache/47572e3fe895bf8fa6c5bffc2bf0c784c08672a1b6d8f7ba849012e960821c1a.json new file mode 100644 index 0000000..42f8d47 --- /dev/null +++ b/backend/.llm_cache/47572e3fe895bf8fa6c5bffc2bf0c784c08672a1b6d8f7ba849012e960821c1a.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "A1101_Building_C_Label_Missing", "category": "tag_or_reference_inconsistency", "severity": "medium", "confidence": "high", "location": "Site Plan, Area of Work", "disciplines": ["Architectural"], "sheets": ["A11.01"]}]} \ No newline at end of file diff --git a/backend/.llm_cache/4808f74298547d8d95afb6c470bef575326230008360f59b202c4045f42daa37.json b/backend/.llm_cache/4808f74298547d8d95afb6c470bef575326230008360f59b202c4045f42daa37.json new file mode 100644 index 0000000..ac82437 --- /dev/null +++ b/backend/.llm_cache/4808f74298547d8d95afb6c470bef575326230008360f59b202c4045f42daa37.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "CLEANING_SUPPLIES_STORAGE_001", "category": "missing_element", "severity": "medium", "confidence": "high", "location": "CLEANING SUPPLIES/STORAGE Room", "disciplines": ["Plumbing", "Architectural"], "sheets": ["P02.01", "A24.01"], "description": "The plumbing plan shows a floor drain (FD) in the CLEANING SUPPLIES/STORAGE room, which is expected given the presence of a mop sink. However, the architectural plan does not show this floor drain. The architectural plan should be updated to include the drain to ensure coordination for slab penetration and floor finishes.", "evidence": [{"discipline": "Plumbing", "sheet": "P02.01", "source_text": "Floor drain shown graphically with tag 'FD'.", "asserted_value": "Floor Drain is present"}, {"discipline": "Architectural", "sheet": "A24.01", "source_text": "Architectural plan for CLEANING SUPPLIES/STORAGE room shows a mop sink but does not show a floor drain.", "asserted_value": "Floor Drain is not present"}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/48324978c34148db15dbfad521d8e93cd473e965604151bff54bb163986fa9ac.json b/backend/.llm_cache/48324978c34148db15dbfad521d8e93cd473e965604151bff54bb163986fa9ac.json new file mode 100644 index 0000000..7856bed --- /dev/null +++ b/backend/.llm_cache/48324978c34148db15dbfad521d8e93cd473e965604151bff54bb163986fa9ac.json @@ -0,0 +1 @@ +{"normalized_assertions": [{"assertion_id": "P02.02#2", "original_value": "MEN'S RESTROOM", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.02#3", "original_value": "WOMEN'S RESTROOM", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.02#4", "original_value": "CLEANING SUPPLIES/STORAGE", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.02#5", "original_value": "MANAGER'S OFFICE", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.02#6", "original_value": "SALES AREA", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.02#7", "original_value": "EWH-1 is located above ceiling, suspended as high as possible in ceiling plenum and requires an auxiliary drain pan.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.02#8", "original_value": "Route 3/4\" T&P drain line and 3/4\" auxiliary drain lines to floor sink below.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "Drain Routing", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.02#9", "original_value": "Provide adequate supports to prevent any movement of T&P and aux. drain lines.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "Support Requirement", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.02#10", "original_value": "Route proposed 1-1/4\" CW line to existing 2\" water main line.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "keynote_assertion", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.02#11", "original_value": "Route 1/2\" cold and hot water down.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "keynote_assertion", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.02#12", "original_value": "Route 1/2\" cold water down to recessed valve box. Confirm exact location with owner/architect.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "keynote_assertion", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.02#13", "original_value": "2", "normalized_value": "2", "normalized_unit": "inches", "normalized_attribute": "pipe_size", "normalization_notes": "Assumed 'inches' as unit for pipe size based on context.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "P03.01#0", "original_value": "Saw-cut and route proposed sanitary waste line to existing 4\" sanitary waste line or larger.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "general_note", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#1", "original_value": "Route proposed new vent branch line to existing 4\" vent main line or larger.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "general_note", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#2", "original_value": "170-LF LEONARD", "normalized_value": "170-LF LEONARD", "normalized_unit": null, "normalized_attribute": "equipment_model", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#3", "original_value": "110", "normalized_value": "110", "normalized_unit": "\u00b0F", "normalized_attribute": "temperature", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#4", "original_value": "Pipe discharge 3/4\" to floor sink per plans", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "pressure_relief_drain", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#5", "original_value": "A.O. SMITH PMC-2", "normalized_value": "A.O. SMITH PMC-2", "normalized_unit": null, "normalized_attribute": "expansion_tank_model", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#6", "original_value": "4\" DEEP AUXILIARY DRAIN PAN 18 GAUGE GALVANIZED STEEL.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "drain_pan", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#7", "original_value": "3/4\" auxiliary drain line to floor sink", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "drain_line", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#8", "original_value": "2\" Unistrut support. 1/2\" All threaded rods complete with double nuts and lock washers.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "support_spec", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#9", "original_value": "Must be installed in an upright position.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "installation_note", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#10", "original_value": "Install at an accessible location. Provide access panel where required.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "accessibility", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#11", "original_value": "6-mil Polyethylene vapor retarder minimum", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "vapor_retarder", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#12", "original_value": "2\" larger than the pipe", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "sleeve_size", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#13", "original_value": "Connection from PVC below slab to Cast Iron above slab with transition coupling", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "pipe_material", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#14", "original_value": "No exposed PVC above slab", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "installation_note", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#15", "original_value": "1 1/2", "normalized_value": "1 1/2", "normalized_unit": "inches", "normalized_attribute": "vent_size", "normalization_notes": "Assumed 'inches' as unit for pipe size based on context.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "P03.01#16", "original_value": "2", "normalized_value": "2", "normalized_unit": "inches", "normalized_attribute": "sanitary_size", "normalization_notes": "Assumed 'inches' as unit for pipe size based on context.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "P03.01#17", "original_value": "2", "normalized_value": "2", "normalized_unit": "inches", "normalized_attribute": "vent_size", "normalization_notes": "Assumed 'inches' as unit for pipe size based on context.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "P03.01#18", "original_value": "3", "normalized_value": "3", "normalized_unit": "inches", "normalized_attribute": "sanitary_size", "normalization_notes": "Assumed 'inches' as unit for pipe size based on context.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "P03.01#19", "original_value": "2", "normalized_value": "2", "normalized_unit": "inches", "normalized_attribute": "sanitary_size", "normalization_notes": "Assumed 'inches' as unit for pipe size based on context.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "P03.01#20", "original_value": "2", "normalized_value": "2", "normalized_unit": "inches", "normalized_attribute": "vent_size", "normalization_notes": "Assumed 'inches' as unit for pipe size based on context.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "P03.01#21", "original_value": "Fixture units 1-11 require J.R. SMITH FIG. NO 5005 (Symbol A), Size 3/4\", B Size 4\"", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "schedule_entry", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}]} \ No newline at end of file diff --git a/backend/.llm_cache/49eb4e78f4aff2a3cb8482acdd12ddf2ffb78f98375512c617f39256725d15a6.json b/backend/.llm_cache/49eb4e78f4aff2a3cb8482acdd12ddf2ffb78f98375512c617f39256725d15a6.json new file mode 100644 index 0000000..9409fff --- /dev/null +++ b/backend/.llm_cache/49eb4e78f4aff2a3cb8482acdd12ddf2ffb78f98375512c617f39256725d15a6.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "AT-1_C4-A_Ceiling_Specification_Conflict", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "Ceiling System, Throughout Entire Space", "disciplines": ["Architectural"], "sheets": ["A23.01"], "description": "The finish legend specifies two different acoustical ceiling tiles and incompatible edge profiles for the same ceiling system. Tile AT-1 is an Armstrong 'DUNE #1774' with an 'ANGLED TEGULAR' edge. The specification for its grid, C4-A, contradictorily describes a different tile, 'ULTIMA 1910', and specifies a 'SQUARE LAY IN' edge profile. The contractor cannot determine which tile product, thickness, and edge profile to order and install.", "evidence": [{"discipline": "Architectural", "sheet": "A23.01", "source_text": "AT ACOUSTIC CEILING TILE MANUF: ARMSTRONG MODEL: DUNE #1774 COLOR: WHITE SIZE: 24\" X 24\" X 5/8\" EDGE PROFILE: ANGLED TEGULAR 15/16\"", "asserted_value": "Armstrong DUNE #1774, 5/8\" thick, Angled Tegular edge"}, {"discipline": "Architectural", "sheet": "A23.01", "source_text": "C4 CEILING TILE GRID ... PRODUCT: ULTIMA 1910 ... SIZE: 24\" X 24\" X 3/4\" ... EDGE PROFILE: 15/16\" SQUARE LAY IN", "asserted_value": "Armstrong ULTIMA 1910, 3/4\" thick, Square Lay-in edge"}], "recommended_resolution": "verify with architect"}]} \ No newline at end of file diff --git a/backend/.llm_cache/4a5ff8d4dc6779fdc19bed1c97b655f3266879a74456b4c09aa77ddee3261810.json b/backend/.llm_cache/4a5ff8d4dc6779fdc19bed1c97b655f3266879a74456b4c09aa77ddee3261810.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/4a5ff8d4dc6779fdc19bed1c97b655f3266879a74456b4c09aa77ddee3261810.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/4de863a781810edd080e14bce2a02e1f4b6c92c49cdb5951a5e1cb0386145182.json b/backend/.llm_cache/4de863a781810edd080e14bce2a02e1f4b6c92c49cdb5951a5e1cb0386145182.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/4de863a781810edd080e14bce2a02e1f4b6c92c49cdb5951a5e1cb0386145182.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/4ed6384da200b13372364d652adbed8af875c4c33d1d7893d5b2a2959218fc0c.json b/backend/.llm_cache/4ed6384da200b13372364d652adbed8af875c4c33d1d7893d5b2a2959218fc0c.json new file mode 100644 index 0000000..1c69e66 --- /dev/null +++ b/backend/.llm_cache/4ed6384da200b13372364d652adbed8af875c4c33d1d7893d5b2a2959218fc0c.json @@ -0,0 +1 @@ +{"sheet_number": "E04.01", "discipline": "Electrical", "sheet_title": "FLOOR PLAN - SPECIAL SYSTEMS", "level": null, "scale": "1/4\" = 1'-0\"", "assertions": [{"subject": "Room", "attribute": "room_name", "value": "INVENTORY", "source_text": "INVENTORY", "confidence": "high", "location_key": {"grid": "A/2-3", "room": "INVENTORY", "level": null, "tag": null}}, {"subject": "Room", "attribute": "room_name", "value": "LOUNGE", "source_text": "LOUNGE", "confidence": "high", "location_key": {"grid": "A/3", "room": "LOUNGE", "level": null, "tag": null}}, {"subject": "Room", "attribute": "room_name", "value": "MEN'S RESTROOM", "source_text": "MEN'S RESTROOM", "confidence": "high", "location_key": {"grid": "A/3-4", "room": "MEN'S RESTROOM", "level": null, "tag": null}}, {"subject": "Room", "attribute": "room_name", "value": "WOMEN'S RESTROOM", "source_text": "WOMEN'S RESTROOM", "confidence": "high", "location_key": {"grid": "A/4-5", "room": "WOMEN'S RESTROOM", "level": null, "tag": null}}, {"subject": "Room", "attribute": "room_name", "value": "MANAGER'S OFFICE", "source_text": "MANAGER'S OFFICE", "confidence": "high", "location_key": {"grid": "A/4-5", "room": "MANAGER'S OFFICE", "level": null, "tag": null}}, {"subject": "Room", "attribute": "room_name", "value": "CLEANING SUPPLIES/STORAGE", "source_text": "CLEANING SUPPLIES/STORAGE", "confidence": "high", "location_key": {"grid": "A/3-4", "room": "CLEANING SUPPLIES/STORAGE", "level": null, "tag": null}}, {"subject": "Room", "attribute": "room_name", "value": "SALES AREA", "source_text": "SALES AREA", "confidence": "high", "location_key": {"grid": null, "room": "SALES AREA", "level": null, "tag": null}}, {"subject": "Data Outlet", "attribute": "equipment_location", "value": "2 CAT.6 cables at 18 inches AFF", "source_text": "(2) CAT.6/18\"", "confidence": "high", "location_key": {"grid": "A/2-3", "room": "INVENTORY", "level": null, "tag": null}}, {"subject": "Data Outlet", "attribute": "equipment_location", "value": "2 CAT.6 cables at 18 inches AFF", "source_text": "(2) CAT.6/18\"", "confidence": "high", "location_key": {"grid": "A/3", "room": "LOUNGE", "level": null, "tag": null}}, {"subject": "Data Outlet", "attribute": "equipment_location", "value": "2 CAT.6 cables at 18 inches AFF", "source_text": "(2) CAT.6/18\"", "confidence": "high", "location_key": {"grid": "A/3-4", "room": "CLEANING SUPPLIES/STORAGE", "level": null, "tag": null}}, {"subject": "Data Outlet", "attribute": "equipment_location", "value": "2 CAT.6 cables at 18 inches AFF", "source_text": "(2) CAT.6/18\"", "confidence": "high", "location_key": {"grid": "A/4", "room": "CLEANING SUPPLIES/STORAGE", "level": null, "tag": null}}, {"subject": "Data Outlet", "attribute": "equipment_location", "value": "2 CAT.6 cables at 18 inches AFF", "source_text": "(2) CAT.6/18\"", "confidence": "high", "location_key": {"grid": "A/4", "room": "MANAGER'S OFFICE", "level": null, "tag": null}}, {"subject": "Data Outlet", "attribute": "equipment_location", "value": "2 CAT.6 cables at 55 inches AFF", "source_text": "(2) CAT.6/55\"/H", "confidence": "high", "location_key": {"grid": "B/2", "room": "SALES AREA", "level": null, "tag": null}}, {"subject": "Data Outlet", "attribute": "equipment_location", "value": "2 CAT.6 cables at 38.5 inches AFF", "source_text": "(2) CAT.6/38.5\"/H", "confidence": "high", "location_key": {"grid": "B/2", "room": "SALES AREA", "level": null, "tag": null}}]} \ No newline at end of file diff --git a/backend/.llm_cache/4fcc63d1dea13a3b8905e499a24ad0e5bf9ab5a03c1f78fc4871de29af1edec6.json b/backend/.llm_cache/4fcc63d1dea13a3b8905e499a24ad0e5bf9ab5a03c1f78fc4871de29af1edec6.json new file mode 100644 index 0000000..232bfd6 --- /dev/null +++ b/backend/.llm_cache/4fcc63d1dea13a3b8905e499a24ad0e5bf9ab5a03c1f78fc4871de29af1edec6.json @@ -0,0 +1 @@ +[{"sheet_number": "A21.01", "discipline": "Architectural", "sheet_title": "FLOOR PLAN", "level": null, "scale": "1/4\" = 1'-0\"", "assertions": [{"assertion_id": "A2101-0001", "subject": "Room", "category": "room", "attribute": "room_name", "value": "WOMEN'S RESTROOM", "unit": null, "location_key": {"sheet_number": "A21.01", "grid": null, "room": "102", "room_name": "WOMEN'S RESTROOM", "level": null, "tag": null, "detail_reference": null, "plan_zone": "A"}, "source_text": "WOMEN'S RESTROOM", "coordination_targets": ["architectural", "mechanical", "electrical", "plumbing", "fire_protection", "life_safety"], "conflict_potential": "low", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "A2101-0002", "subject": "Room", "category": "room", "attribute": "room_number", "value": "102", "unit": null, "location_key": {"sheet_number": "A21.01", "grid": null, "room": "102", "room_name": "WOMEN'S RESTROOM", "level": null, "tag": null, "detail_reference": null, "plan_zone": "A"}, "source_text": "102", "coordination_targets": ["architectural", "mechanical", "electrical", "plumbing", "fire_protection", "life_safety"], "conflict_potential": "low", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "A2101-0003", "subject": "Room", "category": "room", "attribute": "room_name", "value": "MEN'S RESTROOM", "unit": null, "location_key": {"sheet_number": "A21.01", "grid": null, "room": "103", "room_name": "MEN'S RESTROOM", "level": null, "tag": null, "detail_reference": null, "plan_zone": "A"}, "source_text": "MEN'S RESTROOM", "coordination_targets": ["architectural", "mechanical", "electrical", "plumbing", "fire_protection", "life_safety"], "conflict_potential": "low", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "A2101-0004", "subject": "Room", "category": "room", "attribute": "room_number", "value": "103", "unit": null, "location_key": {"sheet_number": "A21.01", "grid": null, "room": "103", "room_name": "MEN'S RESTROOM", "level": null, "tag": null, "detail_reference": null, "plan_zone": "A"}, "source_text": "103", "coordination_targets": ["architectural", "mechanical", "electrical", "plumbing", "fire_protection", "life_safety"], "conflict_potential": "low", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "A2101-0005", "subject": "Room", "category": "room", "attribute": "room_name", "value": "CLEANING / STORAGE", "unit": null, "location_key": {"sheet_number": "A21.01", "grid": null, "room": "104", "room_name": "CLEANING SUPPLIES/STORAGE", "level": null, "tag": null, "detail_reference": null, "plan_zone": "B"}, "source_text": "CLEANING / STORAGE", "coordination_targets": ["architectural", "mechanical", "electrical", "plumbing"], "conflict_potential": "low", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "A2101-0006", "subject": "Room", "category": "room", "attribute": "room_number", "value": "104", "unit": null, "location_key": {"sheet_number": "A21.01", "grid": null, "room": "104", "room_name": "CLEANING SUPPLIES/STORAGE", "level": null, "tag": null, "detail_reference": null, "plan_zone": "B"}, "source_text": "104", "coordination_targets": ["architectural", "mechanical", "electrical", "plumbing"], "conflict_potential": "low", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "A2101-0007", "subject": "Room", "category": "room", "attribute": "room_name", "value": "LOUNGE", "unit": null, "location_key": {"sheet_number": "A21.01", "grid": null, "room": "105", "room_name": "LOUNGE", "level": null, "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "LOUNGE", "coordination_targets": ["architectural", "mechanical", "electrical", "plumbing"], "conflict_potential": "low", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "A2101-0008", "subject": "Room", "category": "room", "attribute": "room_number", "value": "105", "unit": null, "location_key": {"sheet_number": "A21.01", "grid": null, "room": "105", "room_name": "LOUNGE", "level": null, "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "105", "coordination_targets": ["architectural", "mechanical", "electrical", "plumbing"], "conflict_potential": "low", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "A2101-0009", "subject": "Room", "category": "room", "attribute": "room_name", "value": "MANAGER'S OFFICE", "unit": null, "location_key": {"sheet_number": "A21.01", "grid": null, "room": "106", "room_name": "MANAGER'S OFFICE", "level": null, "tag": null, "detail_reference": null, "plan_zone": "A/B"}, "source_text": "MANAGER'S OFFICE", "coordination_targets": ["architectural", "mechanical", "electrical", "technology"], "conflict_potential": "low", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "A2101-0010", "subject": "Room", "category": "room", "attribute": "room_number", "value": "106", "unit": null, "location_key": {"sheet_number": "A21.01", "grid": null, "room": "106", "room_name": "MANAGER'S OFFICE", "level": null, "tag": null, "detail_reference": null, "plan_zone": "A/B"}, "source_text": "106", "coordination_targets": ["architectural", "mechanical", "electrical", "technology"], "conflict_potential": "low", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "A2101-0011", "subject": "Room", "category": "room", "attribute": "room_name", "value": "INVENTORY", "unit": null, "location_key": {"sheet_number": "A21.01", "grid": null, "room": "107", "room_name": "INVENTORY", "level": null, "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "INVENTORY", "coordination_targets": ["architectural", "mechanical", "electrical", "structural"], "conflict_potential": "low", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "A2101-0012", "subject": "Room", "category": "room", "attribute": "room_number", "value": "107", "unit": null, "location_key": {"sheet_number": "A21.01", "grid": null, "room": "107", "room_name": "INVENTORY", "level": null, "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "107", "coordination_targets": ["architectural", "mechanical", "electrical", "structural"], "conflict_potential": "low", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "A2101-0013", "subject": "Room", "category": "room", "attribute": "room_name", "value": "EXISTING FIRE RISER ROOM", "unit": null, "location_key": {"sheet_number": "A21.01", "grid": null, "room": null, "room_name": "EXISTING FIRE RISER ROOM", "level": null, "tag": null, "detail_reference": null, "plan_zone": "A"}, "source_text": "EXISTING FIRE RISER ROOM", "coordination_targets": ["fire_protection", "architectural", "life_safety"], "conflict_potential": "high", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "A2101-0014", "subject": "Dimension", "category": "room", "attribute": "room_dimension", "value": "11'-6\"", "unit": "ft-in", "location_key": {"sheet_number": "A21.01", "grid": null, "room": "107", "room_name": "INVENTORY", "level": null, "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "11'-6\"", "coordination_targets": ["structural", "architectural"], "conflict_potential": "medium", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "A2101-0015", "subject": "Dimension", "category": "room", "attribute": "room_dimension", "value": "12'-2 1/8\"", "unit": "ft-in", "location_key": {"sheet_number": "A21.01", "grid": null, "room": "107", "room_name": "INVENTORY", "level": null, "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "12'-2 1/8\"", "coordination_targets": ["structural", "architectural"], "conflict_potential": "medium", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "A2101-0016", "subject": "Dimension", "category": "room", "attribute": "room_dimension", "value": "10'-0\"", "unit": "ft-in", "location_key": {"sheet_number": "A21.01", "grid": null, "room": "105", "room_name": "LOUNGE", "level": null, "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "10'-0\"", "coordination_targets": ["structural", "architectural"], "conflict_potential": "medium", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "A2101-0017", "subject": "Dimension", "category": "room", "attribute": "room_dimension", "value": "15'-7\"", "unit": "ft-in", "location_key": {"sheet_number": "A21.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": null, "detail_reference": null, "plan_zone": "B"}, "source_text": "15'-7\"", "coordination_targets": ["structural", "architectural"], "conflict_potential": "medium", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "A2101-0018", "subject": "Dimension", "category": "room", "attribute": "room_dimension", "value": "8'-7\"", "unit": "ft-in", "location_key": {"sheet_number": "A21.01", "grid": null, "room": "106", "room_name": "MANAGER'S OFFICE", "level": null, "tag": null, "detail_reference": null, "plan_zone": "B"}, "source_text": "8'-7\"", "coordination_targets": ["structural", "architectural"], "conflict_potential": "medium", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "A2101-0019", "subject": "Dimension", "category": "room", "attribute": "room_dimension", "value": "7'-3 3/4\"", "unit": "ft-in"}]}] \ No newline at end of file diff --git a/backend/.llm_cache/500da885cd202bbff17c6a19e24dec9f591a2cc8de69245cb6e5f08b6dc655a7.json b/backend/.llm_cache/500da885cd202bbff17c6a19e24dec9f591a2cc8de69245cb6e5f08b6dc655a7.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/500da885cd202bbff17c6a19e24dec9f591a2cc8de69245cb6e5f08b6dc655a7.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/51e0edf53a06e88d8c04b25875d0deb016daeeae64f46035f7f11e6d6c92e57c.json b/backend/.llm_cache/51e0edf53a06e88d8c04b25875d0deb016daeeae64f46035f7f11e6d6c92e57c.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/51e0edf53a06e88d8c04b25875d0deb016daeeae64f46035f7f11e6d6c92e57c.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/5290db3c3cbfde71b1f4fa86f520288443379a9d4ea9346a8a261c2b30da7bdd.json b/backend/.llm_cache/5290db3c3cbfde71b1f4fa86f520288443379a9d4ea9346a8a261c2b30da7bdd.json new file mode 100644 index 0000000..9ba1c4f --- /dev/null +++ b/backend/.llm_cache/5290db3c3cbfde71b1f4fa86f520288443379a9d4ea9346a8a261c2b30da7bdd.json @@ -0,0 +1 @@ +{"project_code_profile": {"project_name": "Verizon Elyson", "project_address": "7022 ELYSON EXCHANGE WAY CYPRESS, TEXAS 77433", "jurisdiction": {"city": "Cypress (Unincorporated)", "county": "Harris County", "state": "Texas", "country": "USA", "authority_having_jurisdiction": ["Harris County Engineering Department", "Harris County Fire Marshal's Office", "Texas Department of Licensing and Regulation (TDLR)"], "fire_marshal": "Harris County Fire Marshal's Office", "building_department": "Harris County Engineering Department", "accessibility_reviewer": "Texas Department of Licensing and Regulation (TDLR)"}, "project_classification": {"project_type": "Commercial", "work_type": "tenant_improvement", "occupancy": "M - Mercantile", "construction_type": null, "sprinklered": "unknown", "public_project": false, "healthcare_project": false, "food_service_project": false, "airport_project": false, "school_project": false}, "adopted_codes": {"building_code": "2015 IBC", "existing_building_code": "2015 IEBC", "fire_code": "2015 IFC", "mechanical_code": "2015 IMC", "plumbing_code": "2015 IPC", "electrical_code": "2023 NEC", "energy_code": "2015 IECC", "accessibility_code": "2010 ADA; Texas Accessibility Standards (TAS)"}, "review_paths": {"ibc_review": true, "iebc_review": true, "fire_code_review": true, "ada_review": true, "tas_tdlr_review": true, "municode_review": true, "health_department_review": false, "owner_standard_review": false}, "local_amendment_sources": [{"source_name": "Harris County Regulations for the Construction of Buildings and Structures", "jurisdiction": "Harris County, TX", "source_url": "https://www.eng.hctx.net/permits/Codes", "status": "needs_lookup"}], "missing_information": ["Verification of all adopted code editions for Harris County.", "Construction type of the existing building.", "Fire sprinkler status of the building.", "Owner standards and design criteria from Verizon."], "assumptions": ["Project is located in unincorporated Harris County and is not subject to any municipal extraterritorial jurisdiction (ETJ) building regulations.", "Work type 'new interior buildout' is an alteration to an existing building shell and falls under IEBC requirements."], "human_confirmation_required": true}} \ No newline at end of file diff --git a/backend/.llm_cache/54149139ee9d23f0f666fdecb2bc65473898c20bb1c1e72a9ba985ae1e903a98.json b/backend/.llm_cache/54149139ee9d23f0f666fdecb2bc65473898c20bb1c1e72a9ba985ae1e903a98.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/54149139ee9d23f0f666fdecb2bc65473898c20bb1c1e72a9ba985ae1e903a98.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/545128e614c46dc729d2e6077f323f40b6144ebbc4e0dd8273e583d4826c2ba0.json b/backend/.llm_cache/545128e614c46dc729d2e6077f323f40b6144ebbc4e0dd8273e583d4826c2ba0.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/545128e614c46dc729d2e6077f323f40b6144ebbc4e0dd8273e583d4826c2ba0.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/5625798cc6b481217fadb79597f3d66668c185b9aab1231a8f71420ddf24c1b2.json b/backend/.llm_cache/5625798cc6b481217fadb79597f3d66668c185b9aab1231a8f71420ddf24c1b2.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/5625798cc6b481217fadb79597f3d66668c185b9aab1231a8f71420ddf24c1b2.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/5703d1971205f211105ae9684f02259bf84da17582c822f4e0ae645ddc8a86c3.json b/backend/.llm_cache/5703d1971205f211105ae9684f02259bf84da17582c822f4e0ae645ddc8a86c3.json new file mode 100644 index 0000000..fdb9a07 --- /dev/null +++ b/backend/.llm_cache/5703d1971205f211105ae9684f02259bf84da17582c822f4e0ae645ddc8a86c3.json @@ -0,0 +1 @@ +{"issues": [{"issue_id": "ELEC-ADA-001", "source_stage": "code", "category": "ada", "severity": "medium", "confidence": "medium", "location": "Sales Area", "disciplines": ["Electrical", "Architectural"], "sheets": ["E04.01"], "description": "A communication outlet in the Sales Area is noted to be mounted at 55 inches above the finished floor. This height exceeds the 48-inch maximum reach range for operable parts accessible to persons in wheelchairs. While an exception exists for outlets serving dedicated equipment, the use is not explicitly defined as such.", "evidence": [{"discipline": "Electrical", "sheet": "E04.01", "source_text": "(2) CAT.6/55\"/H", "asserted_value": "55"}], "recommended_resolution": "Verify the intended use of this outlet. If for general use, relocate to a height no greater than 48 inches above the finished floor. If for dedicated use (e.g., a high wall-mounted display), add a note clarifying this purpose to justify the mounting height per ADA 205.1, Exception 2.", "code_reference": "ADA 205.1"}, {"issue_id": "PLUMB-ADA-001", "source_stage": "code", "category": "ada", "severity": "medium", "confidence": "high", "location": "Accessible Sink Location (SK-1)", "disciplines": ["Plumbing", "Architectural", "Interiors"], "sheets": ["P01.01"], "description": "An accessible sink (SK-1) is specified as 'self-rimming.' A self-rimming or drop-in sink places the rim above the countertop surface, which can easily cause the overall height to exceed the 34-inch maximum allowed for the sink rim or counter.", "evidence": [{"discipline": "Plumbing", "sheet": "P01.01", "source_text": "SINGLE BOWL SINK (A.D.A)", "asserted_value": "true"}, {"discipline": "Plumbing", "sheet": "P01.01", "source_text": "LBAO221965PDC ELKAY, 18 GAUGE TYPE 304 STAINLESS STEEL SINK, SELF-RIMMING, 22\"X19\"X6.5\" NOM. DIMENSIONS...", "asserted_value": "Self-rimming"}], "recommended_resolution": "Confirm mounting details. The top of the sink rim must not exceed 34 inches above the finished floor. Consider specifying an undermount sink for easier compliance or ensure the countertop is lowered to accommodate the rim height of the specified sink.", "code_reference": "ADA 606.3"}, {"issue_id": "ELEC-CODE-001", "source_stage": "code", "category": "building_code", "severity": "low", "confidence": "high", "location": "Sheet E05.01", "disciplines": ["Electrical"], "sheets": ["E05.01"], "description": "A note requires separation of electrical outlets in rated walls 'IN ACCORDANCE WITH UBC 4304'. The project is governed by the 2018 IBC, not the outdated Uniform Building Code (UBC). Referencing a superseded code is improper and may lead to incorrect implementation.", "evidence": [{"discipline": "Electrical", "sheet": "E05.01", "source_text": "IN ACCORDANCE WITH UBC 4304 OUTLETS ON OPPOSITE SIDES OF WALLS OR PARTITIONS IN THE SAME STUD SPACE MUST BE SEPARATED BY A MIN. OF 24\" HORIZONTAL DISTANCE.", "asserted_value": "UBC 4304"}], "recommended_resolution": "Revise the note to reference the applicable section of the 2018 IBC (e.g., IBC Section 714 for penetrations) and ensure the stated requirement aligns with the project's specific fire-rated wall assemblies and UL designs.", "code_reference": null}, {"issue_id": "GEN-BC-001", "source_stage": "code", "category": "building_code", "severity": "critical", "confidence": "high", "location": "Entire Project", "disciplines": ["Structural", "Architectural", "Electrical"], "sheets": ["E05.02", "G11.01"], "description": "The drawing set appears to be missing structural drawings, despite an electrical detail note on sheet E05.02 explicitly requiring coordination with a 'project structural engineer' for supporting a transformer. Any project involving alterations or addition of significant loads to the building structure requires structural plans and calculations for review and permitting.", "evidence": [{"discipline": "Electrical", "sheet": "E05.02", "source_text": "VERIFY SUPPORT SIZING AND DESIGNED WITH PROJECT STRUCTURAL ENGINEER PRIOR TO ASSEMBLY.", "asserted_value": null}], "recommended_resolution": "Provide a complete set of structural drawings and calculations, prepared and sealed by a licensed professional engineer. The documents must address all structural modifications, including support for new equipment.", "code_reference": null}]} \ No newline at end of file diff --git a/backend/.llm_cache/5772700489d178685e11f2d5620641e1b8d9a3af00760b7e8a82e19d8230847e.json b/backend/.llm_cache/5772700489d178685e11f2d5620641e1b8d9a3af00760b7e8a82e19d8230847e.json new file mode 100644 index 0000000..56c2a19 --- /dev/null +++ b/backend/.llm_cache/5772700489d178685e11f2d5620641e1b8d9a3af00760b7e8a82e19d8230847e.json @@ -0,0 +1 @@ +{"issues": [{"issue_id": "verizon_elyson_code_001", "source_stage": "code", "category": "building_code", "severity": "critical", "confidence": "high", "location": "Electrical General Notes on sheet E01.01", "disciplines": ["Electrical", "General"], "sheets": ["E01.01"], "description": "Electrical sheet E01.01 specifies that the design conforms to newer codes (2023 NEC, 2021 IBC, 2021 IECC) than those adopted by the jurisdiction (2017 NEC, 2015 IBC, 2015 IECC per project profile). Using incorrect code editions for design can lead to non-compliant systems for electrical, energy, and life safety, requiring redesign.", "evidence": [{"discipline": "Electrical", "sheet": "E01.01", "source_text": "CONTRACTOR SHALL CONFORM TO ALL LOCAL, STATE, AND APPLICABLE CODES, 2023 NEC, 2021 IBC, 2021 IECC, NFPA, ETC., AND ALL OTHER LOCAL CODES AND AMENDMENTS WHERE THERE ARE CONFLICTS BETWEEN CODES, STANDARDS AND DRAWINGS AND SPECIFICATIONS ARISE, THE MORE STRINGENT SHALL APPLY.", "asserted_value": "NEC 2023, IBC 2021, IECC 2021, NFPA"}], "recommended_resolution": "Revise all engineering notes and design parameters to conform to the codes adopted by Harris County: 2017 NEC, 2015 IBC, and 2015 IECC. Verify the correct code editions with the Authority Having Jurisdiction.", "code_reference": null}, {"issue_id": "verizon_elyson_ada_001", "source_stage": "code", "category": "tas_tdlr", "severity": "critical", "confidence": "high", "location": "Men's Restroom 103 and Women's Restroom 102 per Detail 3/A51.01", "disciplines": ["Architectural", "Plumbing"], "sheets": ["A51.01"], "description": "The enlarged restroom plan detail indicates the centerline of the accessible water closet (WC-1) is located 7 to 9 inches from the side wall. The Texas Accessibility Standards (TAS) and ADA require this dimension to be between 16 and 18 inches. A 7-9 inch dimension makes the fixture unusable by a person transferring from a wheelchair and renders the required grab bars ineffective.", "evidence": [{"discipline": "Architectural", "sheet": "A51.01", "source_text": "7\"-9\"", "asserted_value": "7-9"}], "recommended_resolution": "Revise the restroom layout in both Men's 103 and Women's 102 to provide a 16-inch to 18-inch clearance from the side wall to the centerline of the water closet. Coordinate changes with plumbing and wall framing.", "code_reference": null}, {"issue_id": "verizon_elyson_ada_002", "source_stage": "code", "category": "tas_tdlr", "severity": "high", "confidence": "high", "location": "Men's Restroom 103 and Women's Restroom 102 per Detail 4/A51.01", "disciplines": ["Architectural"], "sheets": ["A51.01"], "description": "The lavatory detail on sheet A51.01 specifies '6\" MAX. TOE CLEAR'. Accessible lavatories require a toe clearance area that is a minimum of 9 inches high from the floor. Providing a maximum height of 6 inches would obstruct the feet of a person using a wheelchair, preventing a close approach to the lavatory.", "evidence": [{"discipline": "Architectural", "sheet": "A51.01", "source_text": "6\" MAX. TOE CLEAR", "asserted_value": "6"}], "recommended_resolution": "Clarify the lavatory detail to provide the required toe clearance. Per TAS 606.2, the space under the lavatory must be clear for a minimum height of 9 inches above the finished floor to a depth of 17 inches.", "code_reference": "ADA 606.2"}, {"issue_id": "verizon_elyson_code_002", "source_stage": "code", "category": "building_code", "severity": "medium", "confidence": "medium", "location": "Roof Plan, vicinity of RTU-2", "disciplines": ["Mechanical", "Plumbing"], "sheets": ["M02.02"], "description": "The Mechanical Roof Plan shows a plumbing vent termination (VTR) located in close proximity to the outdoor air intake of RTU-2, likely within the 10-foot minimum separation distance noted on the drawing itself. Mechanical and plumbing codes require such separation to prevent entrainment of contaminated air into the building's ventilation system.", "evidence": [{"discipline": "Mechanical", "sheet": "M02.02", "source_text": "LIMIT OF 10' RADIUS FROM ANY OUTDOOR AIR INTAKE.", "asserted_value": "10"}, {"discipline": "Mechanical", "sheet": "M02.02", "source_text": "10\"RD VTR", "asserted_value": "10"}], "recommended_resolution": "Verify the distance between all plumbing vent terminations and HVAC outdoor air intakes. Relocate any vents that are within the required 10-foot separation distance, per the International Mechanical Code.", "code_reference": null}, {"issue_id": "verizon_elyson_code_003", "source_stage": "code", "category": "building_code", "severity": "medium", "confidence": "high", "location": "Mechanical Details", "disciplines": ["Mechanical", "Plumbing"], "sheets": ["M03.01"], "description": "A detail note on sheet M03.01 specifies that the HVAC condensate drain is to terminate at the sanitary sewer. The International Plumbing Code generally prohibits direct connections of condensate drains to sanitary sewers to prevent potential cross-contamination. An indirect connection via an approved air-gapped receptor is typically required.", "evidence": [{"discipline": "Mechanical", "sheet": "M03.01", "source_text": "NOTE: CONDENSATE DRAIN TO TERMINATE TO SANITARY SEWER.", "asserted_value": "Sanitary Sewer"}], "recommended_resolution": "Verify the 2015 IPC and local amendments regarding condensate drain termination. Revise plumbing details and plans to show an indirect connection to an approved receptor (e.g., floor drain, floor sink) with a proper air gap, if direct connection to the sanitary sewer is prohibited.", "code_reference": null}]} \ No newline at end of file diff --git a/backend/.llm_cache/58009723e7c8075c777e5d863aa92d567d699e59c294ba8eb8aede1072c39eb1.json b/backend/.llm_cache/58009723e7c8075c777e5d863aa92d567d699e59c294ba8eb8aede1072c39eb1.json new file mode 100644 index 0000000..631c3e9 --- /dev/null +++ b/backend/.llm_cache/58009723e7c8075c777e5d863aa92d567d699e59c294ba8eb8aede1072c39eb1.json @@ -0,0 +1 @@ +{"prioritized_issues": [{"issue_id": "CON-001", "overall_risk_score": 100, "severity": "critical", "risk_drivers": ["structural", "life_safety", "mep_coordination", "permit_risk", "constructability", "bid_ambiguity", "cost_exposure", "schedule_impact", "change_order_risk"], "recommended_priority": "immediate", "senior_architect_summary": "The complete absence of structural drawings is a fundamental failure of the drawing set. It presents an extreme risk to life safety, permit approval, and project viability. This must be resolved before any other action is taken, as it makes the project un-biddable and un-buildable."}, {"issue_id": "CON-002", "overall_risk_score": 100, "severity": "critical", "risk_drivers": ["constructability", "bid_ambiguity", "mep_coordination", "permit_risk", "cost_exposure", "schedule_impact", "change_order_risk"], "recommended_priority": "immediate", "senior_architect_summary": "The absence of the primary architectural dimensioned floor plan and the reflected ceiling plan renders the drawing set unusable. Without these core sheets, bidding, interdisciplinary coordination, permitting, and construction are impossible. This is a critical gap that must be filled immediately."}, {"issue_id": "CON-003", "overall_risk_score": 98, "severity": "critical", "risk_drivers": ["mep_coordination", "constructability", "bid_ambiguity", "permit_risk", "cost_exposure", "schedule_impact", "change_order_risk"], "recommended_priority": "immediate", "senior_architect_summary": "The missing Mechanical HVAC floor plan halts all progress on a major building system. It prevents bidding, interdisciplinary coordination with architectural and electrical, and permitting. The sheet must be provided immediately to maintain the project schedule."}, {"issue_id": "CON-004", "overall_risk_score": 95, "severity": "critical", "risk_drivers": ["permit_risk", "change_order_risk", "cost_exposure", "bid_ambiguity", "constructability", "schedule_impact", "life_safety"], "recommended_priority": "immediate", "senior_architect_summary": "Conflicting code references across all disciplines undermine the entire design basis and create unacceptable permit risk. A single, correct set of codes must be established with the Authority Having Jurisdiction and applied globally to the drawings to avoid a flawed bid, permit rejection, and potential redesign."}, {"issue_id": "CON-005", "overall_risk_score": 90, "severity": "critical", "risk_drivers": ["bid_ambiguity", "cost_exposure", "constructability", "permit_risk", "life_safety", "accessibility", "change_order_risk", "schedule_impact"], "recommended_priority": "immediate", "senior_architect_summary": "The lack of a door schedule makes it impossible to bid, procure, or install doors correctly. This creates significant risk related to cost, schedule, life safety (fire ratings), and accessibility. The schedule must be provided before the set is issued for bidding."}, {"issue_id": "CON-006", "overall_risk_score": 88, "severity": "critical", "risk_drivers": ["bid_ambiguity", "cost_exposure", "constructability", "permit_risk", "life_safety", "schedule_impact", "change_order_risk"], "recommended_priority": "immediate", "senior_architect_summary": "Without partition types defined and located, the scope of wall construction is ambiguous. This poses a high risk for bidding errors, change orders, and incorrect construction of rated assemblies. This information is essential for pricing and construction and must be added immediately."}, {"issue_id": "CON-007", "overall_risk_score": 92, "severity": "critical", "risk_drivers": ["accessibility", "permit_risk", "change_order_risk", "constructability", "cost_exposure", "schedule_impact"], "recommended_priority": "immediate", "senior_architect_summary": "The specified water closet location is a clear and significant violation of TAS/ADA requirements, rendering the accessible stall unusable. This guarantees permit rejection and/or costly field rework of framing and plumbing. The restroom layout must be corrected immediately."}, {"issue_id": "CON-008", "overall_risk_score": 85, "severity": "high", "risk_drivers": ["bid_ambiguity", "mep_coordination", "cost_exposure", "owner_decision", "constructability", "change_order_risk", "schedule_impact"], "recommended_priority": "before_bid", "senior_architect_summary": "A direct contradiction between the architectural and electrical lighting layouts on the same sheet creates significant bid ambiguity and guarantees RFIs and potential change orders. A single, coordinated design must be established before issuing for bid to ensure the Owner receives the intended design at the bid price."}, {"issue_id": "CON-009", "overall_risk_score": 80, "severity": "high", "risk_drivers": ["accessibility", "permit_risk", "change_order_risk", "constructability", "cost_exposure"], "recommended_priority": "before_permit", "senior_architect_summary": "Specified outlet mounting heights violate ADA reach range requirements. This represents a clear code violation that will lead to failed inspections and required rework. All outlet heights must be reviewed and corrected before the permit submission."}, {"issue_id": "CON-010", "overall_risk_score": 82, "severity": "high", "risk_drivers": ["accessibility", "permit_risk", "change_order_risk", "constructability", "cost_exposure"], "recommended_priority": "before_permit", "senior_architect_summary": "The lavatory toe clearance detail is a direct violation of TAS/ADA requirements. This will cause a failed accessibility inspection and require rework of plumbing and millwork. The detail must be corrected before the permit submission."}, {"issue_id": "CON-011", "overall_risk_score": 75, "severity": "high", "risk_drivers": ["mep_coordination", "bid_ambiguity", "constructability", "change_order_risk", "owner_decision"], "recommended_priority": "before_bid", "senior_architect_summary": "Multiple contradictions exist between Architectural and Electrical drawings regarding the network rack's location and infrastructure. These coordination failures create bid ambiguity and will lead to RFIs and change orders. A coordinated solution must be documented before bidding."}, {"issue_id": "CON-012", "overall_risk_score": 78, "severity": "high", "risk_drivers": ["bid_ambiguity", "cost_exposure", "change_order_risk", "owner_decision", "schedule_impact"], "recommended_priority": "before_bid", "senior_architect_summary": "The lack of definitions for specified finishes makes accurate bidding impossible and exposes the owner to significant cost risk via change orders. A complete interior finish schedule is required before issuing for bid to control project cost and scope."}, {"issue_id": "CON-013", "overall_risk_score": 70, "severity": "high", "risk_drivers": ["structural", "constructability", "bid_ambiguity", "change_order_risk"], "recommended_priority": "before_bid", "senior_architect_summary": "A reference to a non-existent foundation pour-back detail leaves a critical information gap for any slab demolition. This detail is essential for structural integrity and constructability. The detail must be provided and correctly referenced before bidding."}, {"issue_id": "CON-014", "overall_risk_score": 83, "severity": "high", "risk_drivers": ["accessibility", "life_safety", "permit_risk", "change_order_risk", "cost_exposure"], "recommended_priority": "before_permit", "senior_architect_summary": "Pendant light fixtures are specified at a mounting height that creates a protruding object hazard, violating ADA/TAS head clearance requirements. This is a life safety and accessibility violation that must be corrected before permit submission to avoid rework."}, {"issue_id": "CON-015", "overall_risk_score": 30, "severity": "medium", "risk_drivers": ["bid_ambiguity", "mep_coordination", "change_order_risk"], "recommended_priority": "before_construction", "senior_architect_summary": "A minor discrepancy exists between the plumbing plan and riser diagram regarding a vent pipe size. While the cost impact is negligible, this ambiguity will likely generate an RFI and should be corrected for drawing clarity before construction."}, {"issue_id": "CON-016", "overall_risk_score": 45, "severity": "medium", "risk_drivers": ["mep_coordination", "bid_ambiguity", "constructability", "change_order_risk"], "recommended_priority": "before_bid", "senior_architect_summary": "A conflict exists where a floor drain is shown on the plumbing plan but not on the architectural plan. This must be coordinated to establish the correct scope, ensure accurate bidding, and avoid a change order for a missed slab penetration."}, {"issue_id": "CON-017", "overall_risk_score": 55, "severity": "medium", "risk_drivers": ["owner_decision", "bid_ambiguity", "cost_exposure", "change_order_risk", "mep_coordination"], "recommended_priority": "before_bid", "senior_architect_summary": "Plumbing drawings indicate a water fountain that is not shown on architectural plans, creating a scope and coordination conflict. The Owner and Architect must confirm if this item is desired, and the drawings must be reconciled before bidding to avoid change orders."}, {"issue_id": "CON-018", "overall_risk_score": 65, "severity": "medium", "risk_drivers": ["cost_exposure", "bid_ambiguity", "change_order_risk", "owner_decision"], "recommended_priority": "before_bid", "senior_architect_summary": "Conflicting notes create a contractual risk by instructing the GC to perform work reserved for the Landlord's contractor. This could void the roof warranty, creating significant financial exposure. The architectural note must be revised to align with the Landlord's requirements."}, {"issue_id": "CON-019", "overall_risk_score": 60, "severity": "medium", "risk_drivers": ["life_safety", "constructability", "bid_ambiguity", "permit_risk", "change_order_risk"], "recommended_priority": "before_permit", "senior_architect_summary": "A prescriptive and potentially incorrect firestopping requirement on the electrical drawings conflicts with the correct performance-based requirements elsewhere. This must be corrected to ensure code compliance, life safety, and bid clarity."}, {"issue_id": "CON-020", "overall_risk_score": 35, "severity": "medium", "risk_drivers": ["accessibility", "constructability", "bid_ambiguity"], "recommended_priority": "before_construction", "senior_architect_summary": "Conflicting mounting heights are provided for the toilet paper dispenser. Although a minor issue, the incorrect dimension should be removed from the general diagram to avoid field confusion and ensure correct, accessible installation."}, {"issue_id": "CON-021", "overall_risk_score": 40, "severity": "medium", "risk_drivers": ["bid_ambiguity", "mep_coordination", "constructability", "change_order_risk"], "recommended_priority": "before_bid", "senior_architect_summary": "Conflicting dimensions for the RTU roof curb height create ambiguity for bidders. The correct height must be confirmed and the drawings made consistent to ensure proper installation, energy code compliance, and weatherproofing."}]} \ No newline at end of file diff --git a/backend/.llm_cache/58daffa7606ccf1318c9cd8ecea502578cdf78dce18dfd6e218ba4423f136c01.json b/backend/.llm_cache/58daffa7606ccf1318c9cd8ecea502578cdf78dce18dfd6e218ba4423f136c01.json new file mode 100644 index 0000000..7c1eed6 --- /dev/null +++ b/backend/.llm_cache/58daffa7606ccf1318c9cd8ecea502578cdf78dce18dfd6e218ba4423f136c01.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "room_102_name_inconsistency_01", "category": "tag_or_reference_inconsistency", "severity": "low", "confidence": "high", "location": "Women's Restroom 102", "disciplines": ["General", "Architectural", "Electrical", "Plumbing"], "sheets": ["G21.01", "A51.01", "E03.01", "P02.01"], "description": "The women's restroom is labeled inconsistently across the drawing set. It is identified as 'WOMEN'S RESTROOM', 'WOMEN'S / RESTROOM', a generic 'RESTROOM', and 'WOMEN'S ROOM' on various plans. While the intent is clear, this inconsistency can lead to confusion during documentation, submittals, and RFIs. All drawings should be updated to use a single, consistent name for this room, preferably 'WOMEN'S RESTROOM 102'.", "evidence": [{"discipline": "General", "sheet": "G21.01", "source_text": "WOMEN'S RESTROOM", "asserted_value": "WOMEN'S RESTROOM"}, {"discipline": "Electrical", "sheet": "E03.01", "source_text": "RESTROOM", "asserted_value": "RESTROOM"}, {"discipline": "Architectural", "sheet": "A51.01", "source_text": "WOMEN'S / RESTROOM", "asserted_value": "WOMEN'S / RESTROOM"}, {"discipline": "Plumbing", "sheet": "P02.01", "source_text": "WOMEN'S ROOM", "asserted_value": "WOMEN'S ROOM"}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/58ec57f3333fac1a12303359f1265861b8ce926365211792121f9458e3bff1a6.json b/backend/.llm_cache/58ec57f3333fac1a12303359f1265861b8ce926365211792121f9458e3bff1a6.json new file mode 100644 index 0000000..457a8ad --- /dev/null +++ b/backend/.llm_cache/58ec57f3333fac1a12303359f1265861b8ce926365211792121f9458e3bff1a6.json @@ -0,0 +1 @@ +[{"assertion_id": "A51.01#16", "original_value": "33\"-36\"", "normalized_value": "33-36", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": "Value is a range.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#17", "original_value": "17\"-19\"", "normalized_value": "17-19", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": "Value is a range.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#18", "original_value": "7\"-9\"", "normalized_value": "7-9", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": "Value is a range.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#19", "original_value": "3'-6\"", "normalized_value": "42", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": "Source text includes 'MIN.'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#20", "original_value": "3'-4\"", "normalized_value": "40", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M01.01#0", "original_value": "ROOFTOP A/C UNIT", "normalized_value": "ROOFTOP A/C UNIT", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is already in a standard format.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M01.01#1", "original_value": "CARRIER", "normalized_value": "Carrier", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Normalized to title case.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M01.01#2", "original_value": "50FE-M07", "normalized_value": "50FE-M07", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is already in a standard format.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M01.01#3", "original_value": "711", "normalized_value": "711", "normalized_unit": "LBS", "normalized_attribute": null, "normalization_notes": "Unit 'LBS' from source text context.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M01.01#4", "original_value": "2100", "normalized_value": "2100", "normalized_unit": "CFM", "normalized_attribute": null, "normalization_notes": "Unit 'CFM' from source text context.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M01.01#5", "original_value": "3.0", "normalized_value": "3.0", "normalized_unit": "HP", "normalized_attribute": null, "normalization_notes": "Unit 'HP' from source text context.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M01.01#6", "original_value": "6.0", "normalized_value": "6.0", "normalized_unit": "Tons", "normalized_attribute": null, "normalization_notes": "Unit 'TONS' from source text context, normalized to 'Tons'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M01.01#7", "original_value": "10.6", "normalized_value": "10.6", "normalized_unit": "kW", "normalized_attribute": null, "normalization_notes": "Unit 'ELEC KW' from source text context, normalized to 'kW'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M01.01#8", "original_value": "460", "normalized_value": "460", "normalized_unit": "V", "normalized_attribute": null, "normalization_notes": "Unit 'VOLT' from source text context, normalized to 'V'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M01.01#9", "original_value": "3", "normalized_value": "3", "normalized_unit": "phase", "normalized_attribute": null, "normalization_notes": "Unit 'PH' from source text context, normalized to 'phase'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M01.01#10", "original_value": "24", "normalized_value": "24", "normalized_unit": "A", "normalized_attribute": null, "normalization_notes": "Unit 'A' (Amps) inferred from attribute 'MCA' (Minimum Circuit Ampacity).", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "M01.01#11", "original_value": "25", "normalized_value": "25", "normalized_unit": "A", "normalized_attribute": null, "normalization_notes": "Unit 'A' (Amps) inferred from attribute 'MOCP' (Maximum Overcurrent Protection).", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "M01.01#12", "original_value": "11.2 EER - 15.5 IEER", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Composite value with multiple ratings (EER, IEER). Not safe to normalize into a single value.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M01.01#13", "original_value": "8 MERV", "normalized_value": "8", "normalized_unit": "MERV", "normalized_attribute": null, "normalization_notes": "Parsed value and unit from original string.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M01.01#14", "original_value": "R-454B", "normalized_value": "R-454B", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is already in a standard format.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M01.01#15", "original_value": "14", "normalized_value": "14", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": "Unit 'inches' from '14\" HIGH' in source text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M01.01#16", "original_value": "115V single phase powered convenience power outlet", "normalized_value": "115V, 1-phase, powered convenience power outlet", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Standardized 'single phase' to '1-phase'.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "M01.01#17", "original_value": "Low leak enthalpy economizer", "normalized_value": "Low Leak Enthalpy Economizer", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Normalized to title case.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M02.02#0", "original_value": "1/4\" = 1'-0\"", "normalized_value": "1/4\" = 1'-0\"", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is in standard drawing scale format.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M02.02#1", "original_value": "8\"RD", "normalized_value": "8", "normalized_unit": "inches", "normalized_attribute": "diameter", "normalization_notes": "'RD' from original value interpreted as 'Round Duct', implying diameter.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "M02.02#2", "original_value": "10\"RD", "normalized_value": "10", "normalized_unit": "inches", "normalized_attribute": "diameter", "normalization_notes": "'RD' from original value interpreted as 'Round Duct', implying diameter.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "M02.02#3", "original_value": "Terminate exhaust duct to manufacturer provided vent cap.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text, no normalization applied.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M02.02#4", "original_value": "Supply / return duct to transition in vertical to RTU curb opening.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text, no normalization applied.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M02.02#5", "original_value": "Limit of 10' radius from any outdoor air intake.", "normalized_value": "10", "normalized_unit": "ft", "normalized_attribute": null, "normalization_notes": "Extracted clearance radius from descriptive text.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "M02.02#6", "original_value": "Economizer Hood", "normalized_value": "Economizer Hood", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Normalized to title case.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#0", "original_value": "6'-0\"", "normalized_value": "72", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": "Source text includes 'MAX. LENGTH'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#1", "original_value": "Same as scheduled neck connection of diffuser", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text, no normalization applied.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#2", "original_value": "The flanged bellmouth fitting must be provided, where height of duct shown on plans can accommodate the fitting. Only where the duct height does not allow the installation of bellmouth fitting, provide straight fitting.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text, no normalization applied.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#3", "original_value": "1/8\" per foot", "normalized_value": "1/8", "normalized_unit": "in/ft", "normalized_attribute": null, "normalization_notes": "Standardized slope unit.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#4", "original_value": "Not less than one pipe size large than the drain pan connection size", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text, no normalization applied.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#5", "original_value": "Top of vent nipple above top of AHU drain pan", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text, no normalization applied.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#6", "original_value": "Sanitary sewer", "normalized_value": "Sanitary Sewer", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Normalized to title case.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#7", "original_value": "3/4\"", "normalized_value": "0.75", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#8", "original_value": "1/8\" per foot", "normalized_value": "1/8", "normalized_unit": "in/ft", "normalized_attribute": null, "normalization_notes": "Standardized slope unit.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#9", "original_value": "Gasketed and insulated roof curb supplied with unit", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text, no normalization applied.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#10", "original_value": "Angle iron frame all around roof opening", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text, no normalization applied.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#11", "original_value": "Ionization-type smoke detector as required", "normalized_value": "Ionization-type", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Condition 'as required' removed from normalized value.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "M03.01#12", "original_value": "Cover opening with 1/2\" galvanized steel mesh screen", "normalized_value": "0.5", "normalized_unit": "inches", "normalized_attribute": "mesh_size", "normalization_notes": "Refers to mesh screen size.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "M03.01#13", "original_value": "Spring isolations bolt to unit & plate", "normalized_value": "Spring isolations bolt to unit and plate", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Replaced '&' with 'and'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#14", "original_value": "E.P.D.M. Membrane", "normalized_value": "EPDM Membrane", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Standardized acronym.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#15", "original_value": "12\" O.C.", "normalized_value": "12", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": "'O.C.' from original value means 'On Center'.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "M03.01#16", "original_value": "12\"", "normalized_value": "12", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": "Source text includes 'MINIMUM'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.01#0", "original_value": "2023 NEC, 2021 IBC, 2021 IECC, NFPA, ETC.", "normalized_value": "NEC 2023, IBC 2021, IECC 2021, NFPA", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Standardized code list format and removed 'ETC.'.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "E01.01#1", "original_value": "25/50 Flame and Smoke hazard ratings per ASTM E-84, NFPA 255 and UL 723", "normalized_value": "25/50", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Flame and Smoke hazard rating. Standards listed in source: ASTM E-84, NFPA 255, UL 723.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "E01.01#2", "original_value": "Penetrations between non-conditioned and conditioned spaces shall be sealed", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text, no normalization applied.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.01#3", "original_value": "Min 4\" high pad that extends a min of 4\" around the equipment", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Complex value with multiple dimensions (height, extension). Not safe to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#0", "original_value": "480", "normalized_value": "480", "normalized_unit": "V", "normalized_attribute": null, "normalization_notes": "Unit 'V' from source text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#1", "original_value": "3", "normalized_value": "3", "normalized_unit": "phase", "normalized_attribute": null, "normalization_notes": "Source text indicates 'Value: .3' and 'Units: phi', but assertion was extracted as '3', which is assumed correct for a 3-phase system.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "E01.02#2", "original_value": "35400", "normalized_value": "35400", "normalized_unit": "A", "normalized_attribute": null, "normalization_notes": "Unit 'A' from source text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#3", "original_value": "500", "normalized_value": "500", "normalized_unit": "kVA", "normalized_attribute": null, "normalization_notes": "Unit 'KVA' from source text, normalized to 'kVA'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#4", "original_value": "Provide low-voltage dry-type transformers that meet the minimum efficiency requirements of 2021 IECC table C405.8.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text, no normalization applied.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#5", "original_value": "Provide as-built drawings for electrical power systems to the building owner.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text, no normalization applied.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#6", "original_value": "Type L-4 is a 2'x2' recessed indirect light fixture.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Complex description. Contains fixture size 2'x2' from source text, but not safe to extract as a single normalized value.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#7", "original_value": "Type L-4E is same as L-4 and includes an emergency battery backup.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text, no normalization applied.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#8", "original_value": "5'-5\"", "normalized_value": "65", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": "Attribute 'mounting_height_AFF' indicates height is Above Finished Floor.", "source_text_preserved": true, "normalization_confidence": "high"}] \ No newline at end of file diff --git a/backend/.llm_cache/59782ab0aaa8a11f64155a963843c0400a7f25f574c7caaeb7ceb0956bc6f6f2.json b/backend/.llm_cache/59782ab0aaa8a11f64155a963843c0400a7f25f574c7caaeb7ceb0956bc6f6f2.json new file mode 100644 index 0000000..5936294 --- /dev/null +++ b/backend/.llm_cache/59782ab0aaa8a11f64155a963843c0400a7f25f574c7caaeb7ceb0956bc6f6f2.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "lounge_water_fountain_scope", "category": "missing_element", "severity": "medium", "confidence": "high", "location": "LOUNGE", "disciplines": ["Plumbing", "Architectural"], "sheets": ["P02.02", "G21.01"], "description": "The plumbing plan indicates a new water fountain (WF) in the Lounge and provides a cold water line and recessed valve box for it. However, the architectural floor plan does not show this water fountain, creating a conflict in the scope of work and potential spatial conflicts with other elements shown on the same wall (e.g., electrical panels).", "evidence": [{"discipline": "Plumbing", "sheet": "P02.02", "source_text": "KEYED NOTE: 4 ROUTE 1/2\" COLD WATER DOWN TO RECESSED VALVE BOX. CONFIRM EXACT LOCATION WITH OWNER/ARCHITECT.", "asserted_value": "Water Fountain (WF) and associated plumbing are required."}, {"discipline": "Architectural", "sheet": "G21.01", "source_text": "The architectural plan for the LOUNGE shows a sink and counter but does not depict a water fountain.", "asserted_value": "No water fountain is shown."}], "recommended_resolution": "verify with architect"}]} \ No newline at end of file diff --git a/backend/.llm_cache/5978dd820b32dd093f1417c143d6e7d24bac1a8619ce5fa08bfff5a145e38d77.json b/backend/.llm_cache/5978dd820b32dd093f1417c143d6e7d24bac1a8619ce5fa08bfff5a145e38d77.json new file mode 100644 index 0000000..4d05de7 --- /dev/null +++ b/backend/.llm_cache/5978dd820b32dd093f1417c143d6e7d24bac1a8619ce5fa08bfff5a145e38d77.json @@ -0,0 +1 @@ +{"issues": [{"issue_id": "CODE-CONFLICT-001", "source_stage": "code", "category": "building_code", "severity": "high", "confidence": "high", "location": "Electrical Notes and Schedules", "disciplines": ["Architectural", "Electrical"], "sheets": ["E01.01", "E01.02"], "description": "The electrical drawings cite the 2021 edition of the IBC and IECC, which conflicts with the project's adopted codes of record listed in the project profile (2015 IBC, 2015 IECC). The entire design basis must be consistent with the codes enforced by the jurisdiction for the project to be compliant. This discrepancy must be clarified and all sheets must reference the correct, applicable code editions.", "evidence": [{"discipline": "Electrical", "sheet": "E01.01", "source_text": "CONTRACTOR SHALL CONFORM TO ALL LOCAL, STATE, AND APPLICABLE CODES, 2023 NEC, 2021 IBC, 2021 IECC, NFPA, ETC., AND ALL OTHER LOCAL CODES AND AMENDMENTS WHERE THERE ARE CONFLICTS BETWEEN CODES, STANDARDS AND DRAWINGS AND SPECIFICATIONS ARISE, THE MORE STRINGENT SHALL APPLY.", "asserted_value": "2021 IBC, 2021 IECC"}, {"discipline": "Electrical", "sheet": "E01.02", "source_text": "1. PROVIDE LOW-VOLTAGE DRY-TYPE TRANSFORMERS THAT MEET THE MINIMUM EFFICIENCY REQUIREMENTS OF 2021 IECC TABLE C405.8.", "asserted_value": "2021 IECC"}], "recommended_resolution": "Verify the applicable code editions with the Harris County Engineering Department and update all drawing references to be consistent with the adopted codes for the permit application. Ensure design elements comply with the correct (2015) code editions.", "code_reference": null}, {"issue_id": "ADA-HEAD-CLEARANCE-001", "source_stage": "code", "category": "ada", "severity": "high", "confidence": "high", "location": "Lighting Fixture Schedule / Lighting Plan", "disciplines": ["Electrical", "Architectural"], "sheets": ["E01.02", "E03.01"], "description": "Pendant light fixtures L-5 and L-6 are scheduled with a mounting height of 5'-5\" (65 inches) above the finished floor. Standard accessible routes require a minimum vertical clearance of 80 inches to prevent protruding objects from becoming hazards for all users, particularly those with vision impairments. If these fixtures are located within a path of travel, they would present a significant hazard.", "evidence": [{"discipline": "Electrical", "sheet": "E01.02", "source_text": "TYPE: L-5, DESCRIPTION: 12\" PENDANT, MOUNTING: PENDANT, NOTES: PENDANT 5'-5\" AFF", "asserted_value": "65"}, {"discipline": "Electrical", "sheet": "E01.02", "source_text": "TYPE: L-6, DESCRIPTION: 16\" PENDANT, MOUNTING: PENDANT, NOTES: PENDANT 5'-5\" AFF", "asserted_value": "65"}], "recommended_resolution": "Verify the locations of light fixture types L-5 and L-6 on the floor plan (Sheet E03.01). If they are located over any circulation path, either raise the mounting height to provide a minimum of 80 inches of clearance from the floor to the bottom of the fixture, or relocate the fixtures to be outside of circulation paths (e.g., directly over furniture or counters).", "code_reference": "ADA 206.2.4"}, {"issue_id": "MECH-INTAKE-SEPARATION-001", "source_stage": "code", "category": "building_code", "severity": "medium", "confidence": "medium", "location": "Roof", "disciplines": ["Mechanical", "Plumbing"], "sheets": ["M02.02"], "description": "The Mechanical Roof Plan indicates that a 10-foot radius of separation is required from any outdoor air intake. The plan also shows a '10\"RD VTR' (assumed to be a plumbing Vent Through Roof) which appears to be located within or very close to this 10-foot radius around an RTU. Codes require separation between sources of potential contaminants (like plumbing vents) and outdoor air intakes to prevent the introduction of noxious or harmful fumes or gases into the building's air supply.", "evidence": [{"discipline": "Mechanical", "sheet": "M02.02", "source_text": "LIMIT OF 10' RADIUS FROM ANY OUTDOOR AIR INTAKE.", "asserted_value": "120"}, {"discipline": "Mechanical", "sheet": "M02.02", "source_text": "10\"RD VTR", "asserted_value": "10"}], "recommended_resolution": "Verify the exact distance between the termination of the plumbing vent (VTR) and the edge of the nearest HVAC outdoor air intake. If the distance is less than the code-mandated 10 feet, relocate the vent or the intake to achieve compliance.", "code_reference": null}, {"issue_id": "PLUMB-CONDENSATE-001", "source_stage": "code", "category": "building_code", "severity": "medium", "confidence": "high", "location": "Mechanical Details", "disciplines": ["Mechanical", "Plumbing"], "sheets": ["M03.01"], "description": "A detail on sheet M03.01 directs HVAC condensate waste to terminate at the sanitary sewer. The International Plumbing Code (IPC) prohibits direct connections of condensate drains to the sanitary system to prevent cross-contamination. Such connections must be indirect, typically through an air gap or air break into a trapped and vented receptor.", "evidence": [{"discipline": "Mechanical", "sheet": "M03.01", "source_text": "NOTE: CONDENSATE DRAIN TO TERMINATE TO SANITARY SEWER.", "asserted_value": "Sanitary sewer"}], "recommended_resolution": "Revise the condensate drain detail and plumbing plans to show an indirect connection to the sanitary sewer system that complies with the applicable plumbing code, likely involving routing the drain to a floor sink or other approved, trapped, and vented fixture via an air gap.", "code_reference": null}, {"issue_id": "ADA-OPERABLE-PART-001", "source_stage": "code", "category": "ada", "severity": "low", "confidence": "high", "location": "Sales Area", "disciplines": ["Electrical", "Architectural"], "sheets": ["E03.01"], "description": "A keynote on the lighting plan states that the location for a dimmer switch in the Sales Area is to be coordinated with the owner, rather than being specified on the drawings. As an operable part on an accessible route, the switch must comply with accessibility standards for location, mounting height, and clear floor space. The final location must be clearly indicated on the drawings for a compliance review before construction.", "evidence": [{"discipline": "Electrical", "sheet": "E03.01", "source_text": "ELECTRICAL KEYED NOTES: 1 PROVIDE DIMMER SWITCH FOR CONTROL OF SALES AREA LIGHTING. COORDINATE FINAL LOCATION WITH OWNER PRIOR TO ROUGH-IN.", "asserted_value": "Provide dimmer switch for control of sales area lighting. Coordinate final location with owner prior to rough-in."}], "recommended_resolution": "Determine the final location for the dimmer switch and clearly indicate its position and mounting height on the electrical plans to verify compliance with ADA requirements for operable parts, including reach ranges and clear floor space.", "code_reference": "ADA 205.1"}]} \ No newline at end of file diff --git a/backend/.llm_cache/59e2537a261853b30c5d3008889b9b5f8eefae97441653ed9ef7448b67aaa80e.json b/backend/.llm_cache/59e2537a261853b30c5d3008889b9b5f8eefae97441653ed9ef7448b67aaa80e.json new file mode 100644 index 0000000..b2487a7 --- /dev/null +++ b/backend/.llm_cache/59e2537a261853b30c5d3008889b9b5f8eefae97441653ed9ef7448b67aaa80e.json @@ -0,0 +1 @@ +{"sheet_number": "G11.02", "discipline": "General", "sheet_title": "SYMBOLS & TYPICAL HEIGHTS", "level": null, "scale": null, "assertions": [{"assertion_id": "G11.02-ACC-001", "subject": "Door Threshold", "category": "accessibility", "attribute": "max_level_change", "value": "1/4", "unit": "in", "location_key": {"sheet_number": "G11.02", "grid": null, "room": null, "room_name": null, "level": null, "tag": null, "detail_reference": "STANDARD TAS DOOR THRESHOLD HEIGHT", "plan_zone": null}, "source_text": "1/4\" MAX", "coordination_targets": ["architectural", "code", "ada"], "conflict_potential": "medium", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "G11.02-ACC-002", "subject": "Door Threshold", "category": "accessibility", "attribute": "max_bevel_slope", "value": "1:2", "unit": null, "location_key": {"sheet_number": "G11.02", "grid": null, "room": null, "room_name": null, "level": null, "tag": null, "detail_reference": "STANDARD TAS DOOR THRESHOLD HEIGHT", "plan_zone": null}, "source_text": "1/2\" MAX", "coordination_targets": ["architectural", "code", "ada"], "conflict_potential": "medium", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "G11.02-ACC-003", "subject": "Accessible Counter", "category": "accessibility", "attribute": "min_knee_clearance_width", "value": "36", "unit": "in", "location_key": {"sheet_number": "G11.02", "grid": null, "room": null, "room_name": null, "level": null, "tag": null, "detail_reference": "STANDARD TAS COUNTER HEIGHTS & CLEARENCES", "plan_zone": null}, "source_text": "36\" MIN", "coordination_targets": ["architectural", "code", "ada"], "conflict_potential": "medium", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "G11.02-ACC-004", "subject": "Accessible Counter", "category": "accessibility", "attribute": "max_height", "value": "34", "unit": "in", "location_key": {"sheet_number": "G11.02"}}]} \ No newline at end of file diff --git a/backend/.llm_cache/5ad27788186f11c9f7aa1db3617791d43bff40a48d1348e576220a49b878068c.json b/backend/.llm_cache/5ad27788186f11c9f7aa1db3617791d43bff40a48d1348e576220a49b878068c.json new file mode 100644 index 0000000..39c6acf --- /dev/null +++ b/backend/.llm_cache/5ad27788186f11c9f7aa1db3617791d43bff40a48d1348e576220a49b878068c.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "CNT-INV-001", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "INVENTORY Room", "disciplines": ["Architectural", "Electrical"], "sheets": ["A24.01", "E02.01"], "description": "There is a contradiction regarding the size and quantity of data conduits required to be run from the INVENTORY room to the ceiling plenum. Architectural note calls for (3) 3\" conduits. Electrical plan E02.01 has two conflicting keynotes for this location: Keynote 3 calls for (1) 1-1/4\" conduit, while Keynote 6 calls for (3) 3\" conduit sleeves. This must be clarified before construction.", "evidence": [{"discipline": "Architectural", "sheet": "A24.01", "source_text": "PROVIDE (3) 3\" CONDUITS FROM DIRECTLY ABOVE THE NETWORK RACK INTO THE SALES CEILING PLENUM AREA FOR DATA CABLING - FIELD COORDINATE.", "asserted_value": "(3) 3-inch conduits"}, {"discipline": "Electrical", "sheet": "E02.01", "source_text": "3 PROVIDE 1-1/4\"C WITH PULLSTRING FOR DATA TO CEILING SPACE ABOVE RACK SYSTEM IN INVENTORY ROOM VIA NEAREST FULL HEIGHT INTERIOR WALL.", "asserted_value": "(1) 1-1/4 inch conduit"}, {"discipline": "Electrical", "sheet": "E02.01", "source_text": "6 FURNISH AND INSTALL (3) 3\" CONDUIT SLEEVES FROM 6\" BELOW DROPPED CEILING TO 6\" ABOVE DROPPED CEILING FOR DATA EQUIPMENT WIRING.", "asserted_value": "(3) 3-inch conduit sleeves"}], "recommended_resolution": "coordinate drawings"}, {"conflict_id": "CNT-INV-002", "category": "elevation_disagreement", "severity": "medium", "confidence": "high", "location": "INVENTORY Room", "disciplines": ["Architectural", "Electrical"], "sheets": ["A24.01", "E04.01"], "description": "The Architectural plan designates a high-mounted network rack at approximately 74\" AFF. However, the Special Systems plan shows data outlets at 18\" AFF in this room and does not indicate any data termination at the height required for the network rack. The data outlet location must be coordinated with the equipment it serves.", "evidence": [{"discipline": "Architectural", "sheet": "A24.01", "source_text": "RACK SYSTEM ABOVE SAFE @ ~74\" TO BOTTOM", "asserted_value": "Network rack at ~74 inches AFF"}, {"discipline": "Electrical", "sheet": "E04.01", "source_text": "(2) CAT.6/18\"", "asserted_value": "CAT 6 outlets at 18 inches AFF"}], "recommended_resolution": "coordinate drawings"}, {"conflict_id": "CNT-INV-003", "category": "spatial_clash", "severity": "high", "confidence": "high", "location": "INVENTORY Room", "disciplines": ["Architectural", "Plumbing"], "sheets": ["A24.01", "P02.01", "P02.02"], "description": "A proposed 1-1/4\" cold water line is routed through the INVENTORY room. This room is designated by Architecture to house the main Network Rack for the tenant. Routing water lines in the same room as critical IT equipment, especially if located above, creates a significant risk of water damage from leaks or condensation, potentially disabling business operations. The pipe should be rerouted.", "evidence": [{"discipline": "Architectural"}]}]} \ No newline at end of file diff --git a/backend/.llm_cache/5ae1b3586346ad16f13bb4e13d446a6cbbc5030eec6e3960c9a61ee92ee404c7.json b/backend/.llm_cache/5ae1b3586346ad16f13bb4e13d446a6cbbc5030eec6e3960c9a61ee92ee404c7.json new file mode 100644 index 0000000..d34081d --- /dev/null +++ b/backend/.llm_cache/5ae1b3586346ad16f13bb4e13d446a6cbbc5030eec6e3960c9a61ee92ee404c7.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "893d39", "category": "schedule_vs_plan_mismatch", "severity": "high", "confidence": "high", "location": "Restroom Floor", "disciplines": ["Architectural"], "sheets": ["A23.01", "A51.01"], "description": "The Finish Plan (A23.01) specifies Polished Concrete (PC-2) for the restroom floors. In contrast, the Typical Restroom Elevation detail (3/A51.01) clearly calls out 'TILE FLOOR'. These are mutually exclusive flooring materials with significant cost and constructability differences.", "evidence": [{"discipline": "Architectural", "sheet": "A23.01", "source_text": "PC-2 POLISHED CONCRETE ... GRADE: 2 (MEDIUMS EXPOSED), WITH A CLASS 1 (MATTE) FINISH ... LOCATION: CORRIDOR, RESTROOMS, LOUNGE, INVENTORY, CLEANING SUPPLIES/STORAGE", "asserted_value": "Polished Concrete"}, {"discipline": "Architectural", "sheet": "A51.01", "source_text": "TILE FLOOR (SEE A-101)", "asserted_value": "Tile Floor"}], "recommended_resolution": "coordinate drawings"}, {"conflict_id": "52f8d3", "category": "detail_vs_plan_mismatch", "severity": "medium", "confidence": "high", "location": "Restroom", "disciplines": ["Architectural"], "sheets": ["A51.01"], "description": "The Typical Restroom Elevation (2/A51.01) dimensions the side grab bar at 3'-4\" long, while the Grab Bar Blocking Detail (6/A51.01) specifies a minimum length of 3'-6\". The grab bar shown in elevation does not meet the minimum length specified in the blocking detail.", "evidence": [{"discipline": "Architectural", "sheet": "A51.01", "source_text": "3'-4\"", "asserted_value": "3'-4\""}, {"discipline": "Architectural", "sheet": "A51.01", "source_text": "3'-6\" MIN.", "asserted_value": "3'-6\" MIN."}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/5cc93c3efe8e6a50d132c8cb63f6b0ce486e1582acc2303538b4b446b1ec5344.json b/backend/.llm_cache/5cc93c3efe8e6a50d132c8cb63f6b0ce486e1582acc2303538b4b446b1ec5344.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/5cc93c3efe8e6a50d132c8cb63f6b0ce486e1582acc2303538b4b446b1ec5344.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/5d0ec2772739e1e97d6226aa2df4f5156b443b3d609ffb458eb716f918235634.json b/backend/.llm_cache/5d0ec2772739e1e97d6226aa2df4f5156b443b3d609ffb458eb716f918235634.json new file mode 100644 index 0000000..c54d5cf --- /dev/null +++ b/backend/.llm_cache/5d0ec2772739e1e97d6226aa2df4f5156b443b3d609ffb458eb716f918235634.json @@ -0,0 +1 @@ +{"sheet_number": "A51.01", "discipline": "Architectural", "sheet_title": "ELEVATIONS, ENLARGED PLANS, & DETAILS", "level": null, "scale": "As Noted", "assertions": [{"subject": "Room", "attribute": "room_name", "value": "MEN'S RESTROOM", "source_text": "MEN'S RESTROOM", "confidence": "high", "location_key": {"grid": null, "room": "103", "level": null, "tag": null}}, {"subject": "Room", "attribute": "room_number", "value": "103", "source_text": "103", "confidence": "high", "location_key": {"grid": null, "room": "103", "level": null, "tag": null}}, {"subject": "Room", "attribute": "room_name", "value": "WOMEN'S / RESTROOM", "source_text": "WOMEN'S / RESTROOM", "confidence": "high", "location_key": {"grid": null, "room": "102", "level": null, "tag": null}}, {"subject": "Room", "attribute": "room_number", "value": "102", "source_text": "102", "confidence": "high", "location_key": {"grid": null, "room": "102", "level": null, "tag": null}}, {"subject": "Water Closet", "attribute": "fixture_location", "value": "WC-1", "source_text": "WC-1", "confidence": "high", "location_key": {"grid": null, "room": "103", "level": null, "tag": "WC-1"}}, {"subject": "Water Closet", "attribute": "fixture_location", "value": "WC-1", "source_text": "WC-1", "confidence": "high", "location_key": {"grid": null, "room": "102", "level": null, "tag": "WC-1"}}, {"subject": "Lavatory", "attribute": "fixture_location", "value": "L-1", "source_text": "L-1", "confidence": "high", "location_key": {"grid": null, "room": "103", "level": null, "tag": "L-1"}}, {"subject": "Lavatory", "attribute": "fixture_location", "value": "L-1", "source_text": "L-1", "confidence": "high", "location_key": {"grid": null, "room": "102", "level": null, "tag": "L-1"}}, {"subject": "Drinking Fountain", "attribute": "equipment_location", "value": "EDF-1", "source_text": "EDF-1", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "EDF-1"}}, {"subject": "Signage", "attribute": "detail_callout", "value": "G11.02", "source_text": "HANDICAPPED RESTROOM SIGNAGE (SEE G11.02)", "confidence": "high", "location_key": {"grid": null, "room": "102, 103", "level": null, "tag": null}}, {"subject": "Lavatory", "attribute": "mounting_height", "value": "2'-10\"", "source_text": "2'-10\" MAX.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Lavatory", "attribute": "clearance", "value": "2'-5\"", "source_text": "2'-5\" MIN.KNEE CLEARANCE", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Lavatory", "attribute": "clearance", "value": "6\"", "source_text": "6\" MAX. TOE CLEAR", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Mirror", "attribute": "mounting_height", "value": "3'-4\"", "source_text": "3'-4\" MAX. TO BOTTOM OF REFLECTIVE SURFACE", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "5"}}, {"subject": "Paper Towel Dispenser", "attribute": "clearance", "value": "1'-5\"", "source_text": "1'-5\" MIN.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "3"}}, {"subject": "Wall Finish", "attribute": "wainscot_height", "value": "4'-0\"", "source_text": "4'-0\"", "confidence": "high", "location_key": {"grid": null, "room": "Typical Restroom", "level": null, "tag": "CT-1"}}, {"subject": "Grab Bar", "attribute": "mounting_height", "value": "33\"-36\"", "source_text": "33\"-36\"", "confidence": "high", "location_key": {"grid": null, "room": "Typical Restroom", "level": null, "tag": "1"}}, {"subject": "Water Closet", "attribute": "seat_height", "value": "17\"-19\"", "source_text": "17\"-19\"", "confidence": "high", "location_key": {"grid": null, "room": "Typical Restroom", "level": null, "tag": "WC-1"}}, {"subject": "Toilet Tissue Dispenser", "attribute": "mounting_location", "value": "7\"-9\"", "source_text": "7\"-9\"", "confidence": "high", "location_key": {"grid": null, "room": "Typical Restroom", "level": null, "tag": "2"}}, {"subject": "Grab Bar", "attribute": "length", "value": "3'-6\"", "source_text": "3'-6\" MIN.", "confidence": "high", "location_key": {"grid": null, "room": "Typical Restroom", "level": null, "tag": "1"}}, {"subject": "Grab Bar", "attribute": "length", "value": "3'-4\"", "source_text": "3'-4\"", "confidence": "high", "location_key": {"grid": null, "room": "Typical Restroom", "level": null, "tag": "1"}}]} \ No newline at end of file diff --git a/backend/.llm_cache/5d8464409ad2405c6d4a3fe7cf8e778958b3fa6475bc60494c8c240d499d78fb.json b/backend/.llm_cache/5d8464409ad2405c6d4a3fe7cf8e778958b3fa6475bc60494c8c240d499d78fb.json new file mode 100644 index 0000000..e8a6433 --- /dev/null +++ b/backend/.llm_cache/5d8464409ad2405c6d4a3fe7cf8e778958b3fa6475bc60494c8c240d499d78fb.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "C001", "category": "location_mismatch", "severity": "high", "confidence": "high", "location": "SALES AREA", "disciplines": ["Architectural", "Electrical"], "sheets": ["E03.01", "A24.01"], "description": "The electrical lighting plan for the Sales Area on sheet E03.01 shows a different layout of light fixtures than the architectural reflected ceiling plan, which is shown as an inset on the same drawing. The electrical engineer's plan shows long continuous rows of fixtures, while the architectural plan shows fixtures arranged in groups to align with the furniture layout shown on A24.01. A handwritten note explicitly calls out the discrepancy. This must be resolved before construction to avoid significant rework of the ceiling and wiring.", "evidence": [{"discipline": "Electrical", "sheet": "E03.01", "source_text": "The main lighting plan on E03.01 shows a regular grid of long fixture rows in the Sales Area, which is inconsistent with the inset architectural RCP.", "asserted_value": "Lighting layout with long, continuous rows."}, {"discipline": "Architectural", "sheet": "E03.01", "source_text": "The inset reflected ceiling plan on E03.01 shows fixtures arranged in groups relating to the furniture layout. A handwritten note states: 'fixture locations not matching arch'.", "asserted_value": "Lighting layout with fixtures grouped over furniture pods."}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/5e21d1ed89bdac1cdad37d9250ae3538526a20c129fca1e41c1b98377389e79f.json b/backend/.llm_cache/5e21d1ed89bdac1cdad37d9250ae3538526a20c129fca1e41c1b98377389e79f.json new file mode 100644 index 0000000..893dca2 --- /dev/null +++ b/backend/.llm_cache/5e21d1ed89bdac1cdad37d9250ae3538526a20c129fca1e41c1b98377389e79f.json @@ -0,0 +1 @@ +{"issues": [{"issue_id": "DEDUP-01", "source_stage": "code", "category": "building_code", "severity": "critical", "confidence": "high", "location": "General Codes & Standards Notes", "disciplines": ["General", "Electrical", "Plumbing", "Architectural"], "sheets": ["G21.01", "E01.01", "P03.01", "A23.01", "G11.04"], "description": "The drawing set references multiple conflicting versions of the International Building Code (IBC). Findings from conflict, code, and constructability reviews confirm that sheets reference the 2018 IBC (G21.01) and 2021 IBC (E01.01, P03.01, A23.01, G11.04), while the adopted code for the jurisdiction (Harris County) is believed to be the 2015 IBC. All design elements must be based on a single, correct, and legally adopted code edition.", "evidence": [{"discipline": "General", "sheet": "G21.01", "source_text": "2018 INTERNATIONAL BUILDING CODE (IBC) CH. 2-10 WITH HARRIS COUNTY AMENDMENTS", "asserted_value": "2018 IBC"}, {"discipline": "Electrical", "sheet": "E01.01", "source_text": "CONTRACTOR SHALL CONFORM TO ALL LOCAL, STATE, AND APPLICABLE CODES, 2023 NEC, 2021 IBC, 2021 IECC, NFPA, ETC.", "asserted_value": "2021 IBC"}, {"discipline": "Plumbing", "sheet": "P03.01", "source_text": "PER 2021 IBC, CHAPTER 19, SECTION 1907: POLYETHYLENE VAPOR RETARDER MINIMUM 6-MIL SHALL BE REQUIRED.", "asserted_value": "2021 IBC"}, {"discipline": "Architectural", "sheet": "A23.01", "source_text": "INTERIOR FINISHES TO COMPLY WITH IBC CLASS C OR HIGHER SECTION 803.9 AND TABLE 803.9 OF 2021 IBC.", "asserted_value": "2021 IBC"}, {"discipline": "General", "sheet": "G11.04", "source_text": "AREA LIMITATION: UNLIMITED (TABLES 504.3, 504.4, 506.2 IBC 2021)", "asserted_value": "IBC 2021"}], "recommended_resolution": "Verify the currently adopted and enforced code edition with the Harris County Engineering Department. Revise the design, drawings, and all code analysis to comply with the single, correct, legally adopted code version.", "code_reference": null}, {"issue_id": "QAQC-001-M", "source_stage": "qaqc", "category": "missing_sheet", "severity": "critical", "confidence": "high", "location": "Drawing Set", "disciplines": ["Architectural", "Mechanical"], "sheets": ["G11.01"], "description": "Essential architectural and mechanical plan sheets are missing from the drawing set. The sheet index indicates pages 14 (likely Architectural Dimension/Construction Plan), 15 (likely Architectural Reflected Ceiling Plan), and 22 (Mechanical HVAC Plan) failed extraction. The lack of these sheets makes it impossible to verify critical information like ceiling heights, dimensions, and HVAC layouts. The set is incomplete and cannot be bid, permitted, or built.", "evidence": [{"discipline": "System", "sheet": "sheet_index", "source_text": "Page 14 (extraction failed), Architectural, floor_plan", "asserted_value": "Missing Architectural Construction/Dimension Plan"}, {"discipline": "System", "sheet": "sheet_index", "source_text": "Page 15 (extraction failed), Architectural, reflected_ceiling_plan", "asserted_value": "Missing Architectural Reflected Ceiling Plan"}, {"discipline": "System", "sheet": "sheet_index", "source_text": "Page 22 (extraction failed), Mechanical, mep_plan", "asserted_value": "Missing Mechanical Floor Plan"}], "recommended_resolution": "Incorporate the missing plan sheets (A-Dimension Plan, A-Reflected Ceiling Plan, M-HVAC Plan) into the drawing set and update the sheet index. Provide the Reflected Ceiling Plan, clearly indicating the height of all ceiling types.", "code_reference": null}, {"issue_id": "QAQC-002-M", "source_stage": "qaqc", "category": "missing_sheet", "severity": "critical", "confidence": "high", "location": "Drawing Set", "disciplines": ["Structural", "Architectural", "Mechanical", "Electrical"], "sheets": ["G01.01", "A25.01", "M03.01", "E05.02", "G11.01"], "description": "The drawing set contains no Structural discipline sheets (S-series). This is a critical omission as new rooftop units (RTUs) are specified, which impose new loads on the existing roof structure. Notes on M, E, and A sheets explicitly reference coordination with a structural engineer, who is not listed on the cover sheet. Without structural drawings, the project is unbuildable and unsafe.", "evidence": [{"discipline": "System", "sheet": "sheet_index", "source_text": "Missing Expected Sheet: Structural Discipline", "asserted_value": "No S-sheets are present"}, {"discipline": "Mechanical", "sheet": "M03.01", "source_text": "ANGLE IRON FRAME ALL AROUND ROOF OPENING RE: STRUCTURAL.", "asserted_value": "Reference to Structural"}, {"discipline": "Electrical", "sheet": "E05.02", "source_text": "VERIFY SUPPORT SIZING AND DESIGNED WITH PROJECT STRUCTURAL ENGINEER PRIOR TO ASSEMBLY.", "asserted_value": "Requires verification with Structural Engineer"}], "recommended_resolution": "Engage a structural engineer to review the existing structure, design support for new equipment, and produce the necessary structural drawings (S-series). Add the structural engineer to the consultant list on the cover sheet.", "code_reference": null}, {"issue_id": "QAQC-003", "source_stage": "qaqc", "category": "missing_schedule", "severity": "critical", "confidence": "high", "location": "Drawing Set", "disciplines": ["Architectural"], "sheets": ["G11.01", "A24.01"], "description": "The drawing set lacks Door and Window Schedules. Doors are shown on plans but are not tagged. Without schedules, essential information such as door/window sizes, types, materials, hardware groups, and fire-ratings are completely undefined. This information is critical for cost estimating, procurement, and code compliance for permitting.", "evidence": [{"discipline": "Architectural", "sheet": "G11.01", "source_text": "Sheet Index", "asserted_value": "No Door Schedule or Window Schedule sheet is listed."}, {"discipline": "Architectural", "sheet": "A24.01", "source_text": "Architectural Floor Plan", "asserted_value": "Doors are graphically indicated but have no identifying tags."}], "recommended_resolution": "Create and add Door and Window Schedules to the drawing set. Add corresponding tags to all doors and windows on the floor plans.", "code_reference": null}, {"issue_id": "DEDUP-02", "source_stage": "constructability", "category": "schedule_vs_plan_mismatch", "severity": "critical", "confidence": "high", "location": "Electric Water Heater EWH-1 and Electrical Panels 'H'/'L'", "disciplines": ["Plumbing", "Electrical"], "sheets": ["P01.01", "E01.02"], "description": "The plumbing fixture schedule specifies a 480V, 3-phase electric water heater (EWH-1). The electrical one-line diagram and panel schedules show the 'WATER HEATING' load is served from Panel 'L', which is fed from panel 'H' at 208Y/120V. The specified equipment is incompatible with the provided power source. This was found in both conflict and constructability reviews and will result in ordering the wrong equipment or requiring significant electrical redesign and rework.", "evidence": [{"discipline": "Plumbing", "sheet": "P01.01", "source_text": "EWH-1 | VOLTS 480 | PHASE 3", "asserted_value": "480V, 3-Phase"}, {"discipline": "Electrical", "sheet": "E01.02", "source_text": "PANEL NAME: E | MAINS 100.0 | VOLTS 208Y/120 | PHASE 3 WIRE 4W ... DESCRIPTION: WATER HEATING", "asserted_value": "208Y/120V"}], "recommended_resolution": "Coordinate electrical and plumbing drawings. Either change the water heater specification to a 208V model or provide a new 480V power circuit and source for the water heater.", "code_reference": null}, {"issue_id": "DEDUP-03", "source_stage": "constructability", "category": "access_clearance", "severity": "critical", "confidence": "high", "location": "Above ceiling in Lounge and Corridor", "disciplines": ["Electrical", "Plumbing", "Architectural"], "sheets": ["E02.01", "P02.02", "A23.01"], "description": "An electrical transformer and a 30-gallon water heater (EWH-1) are specified to be suspended above the ceiling, with notes requiring access. However, the architectural finish plan shows a hard-lid gypsum board ceiling (C1) in the Lounge area where this equipment is likely located. Installing heavy equipment requiring service above a non-accessible hard-lid ceiling makes future replacement impossible without demolition.", "evidence": [{"discipline": "Electrical", "sheet": "E02.01", "source_text": "7 TRANSFORMER TO BE SUSPENDED FROM STRUCTURE AT HIGH LEVEL ABOVE ACCESSIBLE CEILING.", "asserted_value": "Transformer requires accessible ceiling"}, {"discipline": "Plumbing", "sheet": "P02.02", "source_text": "KEYED NOTE: 1 EWH-1 ABOVE CEILING SUSPENDED AS HIGH AS POSSIBLE IN CEILING PLENUM.", "asserted_value": "Water heater suspended above ceiling"}, {"discipline": "Architectural", "sheet": "A23.01", "source_text": "FINISH LEGEND: CEILING TYPES: C1, FINISH: GYPSUM BOARD CEILING... LOCATION: ...LOUNGE", "asserted_value": "Lounge has a GWB hard-lid ceiling"}], "recommended_resolution": "Relocate suspended equipment to be above an accessible ceiling (e.g., ACT) or specify appropriately sized access panels in the hard-lid ceiling for equipment replacement. Confirm final locations on all discipline drawings.", "code_reference": null}, {"issue_id": "CBI-003", "source_stage": "constructability", "category": "support_anchorage", "severity": "critical", "confidence": "high", "location": "Above ceiling in Lounge area", "disciplines": ["Electrical", "Plumbing", "Structural"], "sheets": ["E05.02", "P03.01"], "description": "The structural design for supporting heavy, suspended equipment (electrical transformer and water heater) is improperly delegated to the field. Details direct the contractor to coordinate with a structural engineer, but no engineered design is provided in the drawings. This poses a significant life-safety risk. The drawings must include a fully engineered support design from the structural engineer of record.", "evidence": [{"discipline": "Electrical", "sheet": "E05.02", "source_text": "VERIFY SUPPORT SIZING AND DESIGNED WITH PROJECT STRUCTURAL ENGINEER PRIOR TO ASSEMBLY.", "asserted_value": "Delegation of structural support design for transformer"}, {"discipline": "Plumbing", "sheet": "P03.01", "source_text": "DETAIL 4 - EWH-1 ABOVE CEILING DETAIL: 2\" UNISTRUT SUPPORT. 1/2\" ALL THREADED RODS...", "asserted_value": "Generic, non-engineered support shown for water heater"}], "recommended_resolution": "Provide engineered structural details for the suspension of the transformer and water heater, signed and sealed by the structural engineer. Details must show connection to the building structure and specify all components.", "code_reference": null}, {"issue_id": "verizon-elyson-002", "source_stage": "code", "category": "ada", "severity": "critical", "confidence": "high", "location": "Men's Restroom and Women's Room", "disciplines": ["Plumbing", "Architectural", "General"], "sheets": ["P01.01", "P02.01"], "description": "The fixture schedule specifies 'FLOOR MOUNTED' water closets in the single-user restrooms. Per ADA 604.8.1.1, a wheelchair accessible compartment with a floor-mounted water closet requires a minimum clear depth of 59 inches. The architectural plans that would confirm this dimension are missing, creating a critical risk that the constructed rooms will not meet the minimum required depth.", "evidence": [{"discipline": "Plumbing", "sheet": "P01.01", "source_text": "WATER CLOSET (FLOOR MOUNTED) (A.D.A.)", "asserted_value": "Floor Mounted"}, {"discipline": "Plumbing", "sheet": "P02.01", "source_text": "WC-1", "asserted_value": "fixture_location: WC-1 is located in MEN'S RESTROOM."}], "recommended_resolution": "Verify on the dimensioned architectural floor plan (likely missing sheet on Page 14) that the clear depth of both single-user restrooms is at least 59 inches. If not met, the room size must be increased, or the fixture must be changed to a wall-hung model and the room depth verified to be at least 56 inches.", "code_reference": "ADA 604.8.1.1"}, {"issue_id": "QAQC-004", "source_stage": "qaqc", "category": "missing_detail", "severity": "high", "confidence": "high", "location": "Architectural Drawings", "disciplines": ["Architectural"], "sheets": ["G31.05", "G11.01"], "description": "There are no wall type definitions or a partition legend in the drawing set. There is no comprehensive drawing that defines the full wall assemblies (stud size/gauge, spacing, insulation, STC ratings, UL design, and hourly ratings). Furthermore, the locations of any required fire-rated partitions are not shown on plan. This makes it impossible to accurately bid or construct the partitions as required by code.", "evidence": [{"discipline": "Architectural", "sheet": "G11.01", "source_text": "Sheet Index", "asserted_value": "No sheet titled 'Wall Types' or 'Partition Legend' is listed."}, {"discipline": "General", "sheet": "G31.06", "source_text": "UL RATINGS - DESIGN #U419", "asserted_value": "A rated wall assembly is provided, but no plan indicates where it is to be used."}], "recommended_resolution": "Create a partition schedule/legend with dimensioned graphics for each wall type used in the project, including non-rated and rated assemblies. On the architectural floor plan, tag all walls with their corresponding partition type.", "code_reference": null}, {"issue_id": "DEDUP-04", "source_stage": "code", "category": "building_code", "severity": "high", "confidence": "high", "location": "General Codes & Standards Notes", "disciplines": ["General", "Electrical"], "sheets": ["G21.01", "E01.01"], "description": "The drawing set references conflicting versions of the National Electrical Code (NEC). Sheet G21.01 lists the 2014 NEC, while the electrical general notes on E01.01 list the 2023 NEC. The applicable code for the project must be clarified and used consistently to ensure compliance.", "evidence": [{"discipline": "General", "sheet": "G21.01", "source_text": "2023 STATE OF TEXAS ADOPTED 2014 NFPA 70 NATIONAL ELECTRICAL CODE (NEC)", "asserted_value": "2014 NEC"}, {"discipline": "Electrical", "sheet": "E01.01", "source_text": "CONTRACTOR SHALL CONFORM TO ALL LOCAL, STATE, AND APPLICABLE CODES, 2023 NEC, 2021 IBC...", "asserted_value": "2023 NEC"}], "recommended_resolution": "Verify the applicable NEC edition with the Authority Having Jurisdiction and update all references throughout the drawing set to be consistent.", "code_reference": null}, {"issue_id": "DEDUP-05", "source_stage": "constructability", "category": "schedule_vs_plan_mismatch", "severity": "high", "confidence": "high", "location": "Restroom Floor", "disciplines": ["Architectural"], "sheets": ["A23.01", "A51.01"], "description": "The architectural drawings show conflicting floor finishes for the restrooms, an issue identified in both conflict and constructability reviews. The Finish Plan (A23.01) specifies Polished Concrete (PC-2), while the Typical Restroom Elevation (3/A51.01) clearly calls out 'TILE FLOOR'. These are mutually exclusive materials with significant cost and construction differences.", "evidence": [{"discipline": "Architectural", "sheet": "A23.01", "source_text": "PC-2 POLISHED CONCRETE ... GRADE: 2 (MEDIUMS EXPOSED), WITH A CLASS 1 (MATTE) FINISH ... LOCATION: CORRIDOR, RESTROOMS, LOUNGE, INVENTORY, CLEANING SUPPLIES/STORAGE", "asserted_value": "Polished Concrete"}, {"discipline": "Architectural", "sheet": "A51.01", "source_text": "TILE FLOOR (SEE A-101)", "asserted_value": "Tile Floor"}], "recommended_resolution": "Clarify the intended floor finish for the restrooms and ensure all plans, elevations, details, and specifications are consistent.", "code_reference": null}, {"issue_id": "DEDUP-06", "source_stage": "constructability", "category": "sequencing", "severity": "high", "confidence": "high", "location": "Rooftop Work", "disciplines": ["General", "Architectural"], "sheets": ["G11.03", "A25.01"], "description": "There is a contractual and sequencing conflict regarding roofing work. The Landlord Work Letter (G11.03) mandates that ALL roof penetrations be performed by the Landlord's designated roofing contractor. However, the architectural roof plan (A25.01) directs the General Contractor (GC) to install flashing. This ambiguity over responsibility will cause bidding confusion, delays, and potential warranty voidance.", "evidence": [{"discipline": "General", "sheet": "G11.03", "source_text": "5. Roof, d. ALL ROOF PENETRATIONS MUST BE MADE BY LANDLORD'S ROOFING CONTRACTOR, AT TENANTS COST.", "asserted_value": "Landlord's roofer must perform all roof penetrations."}, {"discipline": "Architectural", "sheet": "A25.01", "source_text": "KEYNOTES 2. NEW RTU...GC TO INSTALL FLASHING PER PER ROOFING MANUFACTURING STANDARDS. GC SHALL COORDINATE ROOF WORK WITH LL REQUIREMENTS TO MAINTAIN EXISTING ROOFING WARRANTY.", "asserted_value": "GC to install flashing."}], "recommended_resolution": "Clarify which entity is responsible for making and flashing roof penetrations and update the drawings consistently. If the Landlord's roofer must be used, the GC's scope must be clearly defined.", "code_reference": null}, {"issue_id": "PROJ-G1102-1", "source_stage": "code", "category": "ada", "severity": "high", "confidence": "high", "location": "Sheet G11.02 - SYMBOLS & TYPICAL HEIGHTS, Door Hardware Detail", "disciplines": ["Architectural", "General"], "sheets": ["G11.02"], "description": "The typical mounting height for door hardware is specified as 33\"-36\" AFF. The ADA requires operable parts of door hardware to be a minimum of 34 inches above the finished floor. Installing hardware at 33 inches would not be compliant.", "evidence": [{"discipline": "General", "sheet": "G11.02", "source_text": "33\"-36\" AFF", "asserted_value": "33-36"}], "recommended_resolution": "Revise the typical mounting height detail on sheet G11.02 to specify a range of 34 inches to 48 inches to the operable part of the hardware.", "code_reference": "ADA 404.2.7"}, {"issue_id": "PROJ-A5101-1", "source_stage": "code", "category": "ada", "severity": "high", "confidence": "high", "location": "Sheet A51.01, Detail 3 - ENLARGED RESTROOM PLAN", "disciplines": ["Architectural"], "sheets": ["A51.01"], "description": "The door to the single-user restroom swings inward and directly into the clear floor space required for the water closet fixture. This obstructs access to the fixture and violates ADA standards.", "evidence": [{"discipline": "Architectural", "sheet": "A51.01", "source_text": "Image evidence: Door swing arc shown overlapping the toilet fixture on the Enlarged Restroom Plan.", "asserted_value": "Inward door swing obstructing fixture."}], "recommended_resolution": "Revise the restroom layout to reverse the door to swing out into the corridor, ensuring it does not obstruct any required accessible route or clearance.", "code_reference": "ADA 603.2.3"}, {"issue_id": "PROJ-A5101-2", "source_stage": "code", "category": "ada", "severity": "high", "confidence": "high", "location": "Sheet A51.01, Detail 5 - INTERIOR ELEVATION - RESTROOM", "disciplines": ["Architectural"], "sheets": ["A51.01"], "description": "The restroom elevation detail shows the 36-inch rear grab bar centered on the water closet. ADA requirements specify that the rear grab bar must be offset from the centerline to provide adequate support on both sides (typically extending 12 inches from the toilet centerline towards the near wall and 24 inches towards the open side). The centered installation shown is non-compliant.", "evidence": [{"discipline": "Architectural", "sheet": "A51.01", "source_text": "Image evidence: Interior elevation showing rear grab bar centered above toilet.", "asserted_value": "Centered rear grab bar."}], "recommended_resolution": "Revise the restroom plan and elevation details to show the rear grab bar offset from the toilet centerline in accordance with accessibility standards (e.g., 12\" toward side wall, 24\" toward open side).", "code_reference": "ADA 604.5.1"}, {"issue_id": "accessibility_ramp_slip_resistance_01", "source_stage": "code", "category": "tas_tdlr", "severity": "high", "confidence": "high", "location": "Specification Section 09 30 00 on Sheet G31.05", "disciplines": ["General", "Architectural"], "sheets": ["G31.05"], "description": "Specification section 09 30 00 for Tiling requires a minimum Static Coefficient of Friction (SCOF) of 0.42 for ramps. The project is subject to the 2012 Texas Accessibility Standards (TAS), which Section 302.1 requires a minimum SCOF of 0.8 for ramp surfaces. The specified value is non-compliant.", "evidence": [{"discipline": "General", "sheet": "G31.05", "source_text": "STATIC COEFFICIENT OF FRICTION: MIN. 0.6 FOR LEVEL SURFACES, MIN. 0.42 FOR RAMPS PER ASTM C1028 OR ANSI A137.1.", "asserted_value": "min 0.42 SCOF"}], "recommended_resolution": "Revise specification 09 30 00 to require ramp surfaces to have a static coefficient of friction of at least 0.8 to comply with 2012 TAS Section 302.1.", "code_reference": "TAS 302.1"}, {"issue_id": "verizon-elyson-001", "source_stage": "code", "category": "ada", "severity": "high", "confidence": "high", "location": "Lounge - Sink (SK-1)", "disciplines": ["Plumbing", "Architectural"], "sheets": ["P01.01", "P02.01"], "description": "The plumbing fixture schedule specifies sink SK-1 as a \"self-rimming\" model. As an ADA-compliant sink in a common use area, it must provide knee and toe clearance. Standard cabinetry used with self-rimming sinks would obstruct this required clearance.", "evidence": [{"discipline": "Plumbing", "sheet": "P01.01", "source_text": "LBAO221965PDC ELKAY, 18 GAUGE TYPE 304 STAINLESS STEEL SINK, SELF-RIMMING, 22\"X19\"X6.5\" NOM. DIMENSIONS...", "asserted_value": "SELF-RIMMING"}, {"discipline": "Plumbing", "sheet": "P01.01", "source_text": "SINGLE BOWL SINK (A.D.A)", "asserted_value": "SINGLE BOWL SINK (A.D.A)"}], "recommended_resolution": "Provide an architectural detail or elevation of the SK-1 installation confirming knee and toe clearance per ADA 606.2 and 306. Specify an open-front cabinet or cantilevered counter.", "code_reference": "ADA 606.2"}, {"issue_id": "CBI-007", "source_stage": "constructability", "category": "support_anchorage", "severity": "high", "confidence": "high", "location": "Inventory Room", "disciplines": ["Architectural"], "sheets": ["A24.01"], "description": "A wall-mounted network 'RACK SYSTEM' is shown, but a note merely states to 'COORDINATE WITH TENANT FOR PLYWOOD BACKING'. This is insufficient. The drawings must specify the size, thickness, fire-rating of the plywood backing and, more importantly, the method of attachment to the wall structure (e.g., blocking, fasteners) to safely support the weight of the equipment.", "evidence": [{"discipline": "Architectural", "sheet": "A24.01", "source_text": "RACK SYSTEM ABOVE SAFE @ ~74\" TO BOTTOM", "asserted_value": "Heavy equipment is wall mounted."}, {"discipline": "Architectural", "sheet": "A24.01", "source_text": "COORDINATE WITH TENANT FOR PLYWOOD BACKING FOR MOUNTING NETWORK RACK", "asserted_value": "Support design is undefined and delegated."}], "recommended_resolution": "Provide a detail specifying the plywood backing dimensions, fire-treatment requirements, and engineered fastening to the wall structure adequate for the anticipated load of the fully-populated network rack.", "code_reference": null}, {"issue_id": "DEDUP-07", "source_stage": "conflict", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "Electrical Penetration Sleeve Detail vs. General Firestopping Specifications", "disciplines": ["General", "Plumbing", "Electrical"], "sheets": ["G31.04", "P01.01", "E05.01"], "description": "Firestopping specifications are contradictory. An Electrical detail (4/E05.01) prescriptively calls for '3 HOUR RATED CAULK'. However, general specifications (G31.04) and plumbing notes (P01.01) correctly require firestopping assemblies to be UL-listed and have a rating that matches the wall being penetrated. Applying a blanket 3-hour requirement is incorrect and may lead to non-compliant installations.", "evidence": [{"discipline": "General", "sheet": "G31.04", "source_text": "FIRESTOPPING: TESTED IN ACCORDANCE WITH ASTM E119 OR UL 263 TO MEET THE HOURLY F-RATINGS OF THE CONSTRUCTION BEING PENETRATED.", "asserted_value": "Firestopping rating to match the penetrated element's rating"}, {"discipline": "Plumbing", "sheet": "P01.01", "source_text": "7. SEAL ALL PENETRATIONS THROUGH RATED WALLS, FLOORS AND CEILINGS WITH A UL LISTED ASSEMBLY TO PROVIDE A RATING EQUAL TO OR GREATER THAN THE RATING OF THE WALL, FLOOR OR CEILING.", "asserted_value": "UL listed assembly rating to be equal or greater than the penetrated element's rating"}, {"discipline": "Electrical", "sheet": "E05.01", "source_text": "PACK BOTH ENDS OF SLEEVE WITH 3M FIRE DAM 150 3 HOUR RATED CAULK OR APPROVED EQUAL", "asserted_value": "3 Hour Rated Caulk"}], "recommended_resolution": "Revise the Electrical detail on E05.01 to remove the prescriptive '3 HOUR' requirement and instead require a UL-listed firestop assembly with a rating appropriate for the specific wall being penetrated, consistent with general specifications.", "code_reference": null}, {"issue_id": "DEDUP-08", "source_stage": "constructability", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "Project Scope Description", "disciplines": ["General"], "sheets": ["G11.04", "G21.01"], "description": "The scope of work is described inconsistently across the drawing set. Sheet G11.04 describes the project as a 'LEASE SPACE BUILD OUT FOR A FIRST GENERATION RETAIL SPACE', implying a new shell. Sheet G21.01 describes it as a 'TENANT INTERIOR REMODEL', implying alteration of a previously finished space. This must be clarified for accurate bidding and demolition scope.", "evidence": [{"discipline": "General", "sheet": "G11.04", "source_text": "PROJECT IS A TENANT INTERIOR LEASE SPACE BUILD OUT FOR A FIRST GENERATION RETAIL SPACE.", "asserted_value": "First Generation Build-Out"}, {"discipline": "General", "sheet": "G21.01", "source_text": "PROJECT IS A TENANT INTERIOR REMODEL OF 3,323 SF", "asserted_value": "Remodel"}], "recommended_resolution": "Clarify the true nature of the project (remodel vs. first-gen build-out) and make all descriptive notes consistent.", "code_reference": null}, {"issue_id": "DEDUP-09", "source_stage": "conflict", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "Hollow Metal Doors and Frames Specification / Section 08 11 13", "disciplines": ["Architectural"], "sheets": ["G31.04"], "description": "The specification for hollow metal doors on sheet G31.04 provides conflicting fire rating requirements. One paragraph states fire-rated assemblies shall have a 90-minute rating, while another specifies a 1-hour label for doors in 1-hour rated corridors. This must be clarified to ensure doors are specified and procured with the correct fire rating.", "evidence": [{"discipline": "General", "sheet": "G31.04"}]}]} \ No newline at end of file diff --git a/backend/.llm_cache/5e398049be067cbfd3b928b4d019cf800922604510dc1af4bebb7c1caf8f0c25.json b/backend/.llm_cache/5e398049be067cbfd3b928b4d019cf800922604510dc1af4bebb7c1caf8f0c25.json new file mode 100644 index 0000000..e652c02 --- /dev/null +++ b/backend/.llm_cache/5e398049be067cbfd3b928b4d019cf800922604510dc1af4bebb7c1caf8f0c25.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "room_name_inconsistency_A51.01_P02.01", "category": "tag_or_reference_inconsistency", "severity": "medium", "confidence": "high", "location": "Restrooms (Rooms 102, 103)", "disciplines": ["Architectural", "Plumbing"], "sheets": ["A51.01", "P02.01"]}]} \ No newline at end of file diff --git a/backend/.llm_cache/5f07bd8db640e7b464f1b3f06c7dcb5c6c7fd8327e89467eb2917411da1a4c85.json b/backend/.llm_cache/5f07bd8db640e7b464f1b3f06c7dcb5c6c7fd8327e89467eb2917411da1a4c85.json new file mode 100644 index 0000000..fda2a0f --- /dev/null +++ b/backend/.llm_cache/5f07bd8db640e7b464f1b3f06c7dcb5c6c7fd8327e89467eb2917411da1a4c85.json @@ -0,0 +1 @@ +{"sheet_number": "G31.06", "discipline": "General", "sheet_title": "UL RATINGS - DESIGN #U419", "level": null, "scale": null, "assertions": [{"assertion_id": "G31.06-001", "subject": "Fire Resistance Assembly", "category": "wall_partition", "attribute": "wall_rating", "value": "1, 2, 3, or 4 Hour", "unit": "Hr", "location_key": {"sheet_number": "G31.06", "grid": null, "room": null, "room_name": null, "level": null, "tag": "U419", "detail_reference": "DESIGN No. U419", "plan_zone": null}, "source_text": "Nonbearing Wall Ratings -- 1, 2, 3 or 4 Hr (See Items 4 & 5 through 5J)", "coordination_targets": ["architectural", "life_safety", "code", "structural"], "conflict_potential": "high", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "G31.06-002", "subject": "Fire Resistance Assembly", "category": "note", "attribute": "UL Certification", "value": "BXUV - Fire Resistance Ratings - ANSI/UL 263 Certified for United States", "unit": null, "location_key": {"sheet_number": "G31.06", "grid": null, "room": null, "room_name": null, "level": null, "tag": "U419", "detail_reference": "DESIGN No. U419", "plan_zone": null}, "source_text": "BXUV - Fire Resistance Ratings - ANSI/UL 263 Certified for United States", "coordination_targets": ["architectural", "life_safety", "code"], "conflict_potential": "low", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "G31.06-003", "subject": "Fire Resistance Assembly", "category": "note", "attribute": "UL Certification", "value": "BXUV7 - Fire Resistance Ratings - CAN/ULC S101 Certified for Canada", "unit": null, "location_key": {"sheet_number": "G31.06", "grid": null, "room": null, "room_name": null, "level": null, "tag": "U419", "detail_reference": "DESIGN No. U419", "plan_zone": null}, "source_text": "BXUV7 - Fire Resistance Ratings - CAN/ULC S101 Certified for Canada", "coordination_targets": ["architectural", "life_safety", "code"], "conflict_potential": "low", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "G31.06-004", "subject": "1-Hour Rated Wall Assembly U419", "category": "wall_partition", "attribute": "wall_rating_assembly", "value": "Min 1-5/8\" stud depth with 1 layer of 5/8\" thick gypsum board on each side.", "unit": null, "location_key": {"sheet_number": "G31.06", "grid": null, "room": null, "room_name": null, "level": null, "tag": "U419", "detail_reference": "Gypsum Board Protection on each side of Wall Table", "plan_zone": null}, "source_text": "Rating, Hr: 1, Min Depth, In. (Item 2): 1-5/8, No. of Layers & Thickness of Panel: 1 layer, 5/8 in. thick", "coordination_targets": ["architectural", "structural", "code", "life_safety"], "conflict_potential": "high", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "G31.06-005", "subject": "2-Hour Rated Wall Assembly U419", "category": "wall_partition", "attribute": "wall_rating_assembly", "value": "Min 2-1/2\" stud depth with 1 layer of 1/2\" thick gypsum board on each side.", "unit": null, "location_key": {"sheet_number": "G31.06", "grid": null, "room": null, "room_name": null, "level": null, "tag": "U419", "detail_reference": "Gypsum Board Protection on each side of Wall Table", "plan_zone": null}, "source_text": "Rating, Hr: 2, Min Depth, In. (Item 2): 2-1/2, No. of Layers & Thickness of Panel: 1 layer, 1/2 in. thick", "coordination_targets": ["architectural", "structural", "code", "life_safety"], "conflict_potential": "high", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "G31.06-006", "subject": "2-Hour Rated Wall Assembly U419", "category": "wall_partition", "attribute": "wall_rating_assembly", "value": "Min 1-5/8\" stud depth with 2 layers of 1/2\" thick gypsum board on each side.", "unit": null, "location_key": {"sheet_number": "G31.06", "grid": null, "room": null, "room_name": null, "level": null, "tag": "U419", "detail_reference": "Gypsum Board Protection on each side of Wall Table", "plan_zone": null}, "source_text": "Rating, Hr: 2, Min Depth, In. (Item 2): 1-5/8, No. of Layers & Thickness of Panel: 2 layers, 1/2 in. thick", "coordination_targets": ["architectural", "structural", "code", "life_safety"], "conflict_potential": "high", "code_review_relevance": "high"}]} \ No newline at end of file diff --git a/backend/.llm_cache/5f9821293f843070b7780ec20e2dffaad4ad316fa93c0b983985bdecaea1bbdf.json b/backend/.llm_cache/5f9821293f843070b7780ec20e2dffaad4ad316fa93c0b983985bdecaea1bbdf.json new file mode 100644 index 0000000..c7e84fc --- /dev/null +++ b/backend/.llm_cache/5f9821293f843070b7780ec20e2dffaad4ad316fa93c0b983985bdecaea1bbdf.json @@ -0,0 +1 @@ +{"sheet_number": "P02.02", "discipline": "Plumbing", "sheet_title": "FLOOR PLAN - DOMESTIC WATER", "level": null, "scale": "1/4\" = 1'-0\"", "assertions": [{"subject": "Room Name", "attribute": "room_name", "value": "INVENTORY", "source_text": "INVENTORY", "confidence": "high", "location_key": {"grid": "2", "room": "INVENTORY", "level": null, "tag": null}}, {"subject": "Room Name", "attribute": "room_name", "value": "LOUNGE", "source_text": "LOUNGE", "confidence": "high", "location_key": {"grid": "2", "room": "LOUNGE", "level": null, "tag": null}}, {"subject": "Room Name", "attribute": "room_name", "value": "MEN'S RESTROOM", "source_text": "MEN'S RESTROOM", "confidence": "high", "location_key": {"grid": "A/2", "room": "MEN'S RESTROOM", "level": null, "tag": null}}, {"subject": "Room Name", "attribute": "room_name", "value": "WOMEN'S RESTROOM", "source_text": "WOMEN'S RESTROOM", "confidence": "high", "location_key": {"grid": "A/2", "room": "WOMEN'S RESTROOM", "level": null, "tag": null}}, {"subject": "Room Name", "attribute": "room_name", "value": "CLEANING SUPPLIES/STORAGE", "source_text": "CLEANING SUPPLIES/STORAGE", "confidence": "high", "location_key": {"grid": "A/2", "room": "CLEANING SUPPLIES/STORAGE", "level": null, "tag": null}}, {"subject": "Room Name", "attribute": "room_name", "value": "MANAGER'S OFFICE", "source_text": "MANAGER'S OFFICE", "confidence": "high", "location_key": {"grid": "A/B/2", "room": "MANAGER'S OFFICE", "level": null, "tag": null}}, {"subject": "Room Name", "attribute": "room_name", "value": "SALES AREA", "source_text": "SALES AREA", "confidence": "high", "location_key": {"grid": "B/C/D", "room": "SALES AREA", "level": null, "tag": null}}, {"subject": "General Note", "attribute": "keynote_assertion", "value": "EWH-1 is located above ceiling, suspended as high as possible in ceiling plenum and requires an auxiliary drain pan.", "source_text": "KEYED NOTE: 1 EWH-1 ABOVE CEILING SUSPENDED AS HIGH AS POSSIBLE IN CEILING PLENUM. PROVIDE AUXILIARY DRAIN PAN BELOW WATER HEATER...", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "1"}}, {"subject": "EWH-1", "attribute": "Drain Routing", "value": "Route 3/4\" T&P drain line and 3/4\" auxiliary drain lines to floor sink below.", "source_text": "ROUTE 3/4\" T&P DRAIN LINE AND 3/4\" AUXILIARY DRAIN LINES TO FLOOR SINK BELOW.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "1"}}, {"subject": "EWH-1 Drain Lines", "attribute": "Support Requirement", "value": "Provide adequate supports to prevent any movement of T&P and aux. drain lines.", "source_text": "PROVIDE ADEQUATE SUPPORTS TO PREVENT ANY MOVEMENT OF T&P AND AUX. DRAIN LINES.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "1"}}, {"subject": "General Note", "attribute": "keynote_assertion", "value": "Route proposed 1-1/4\" CW line to existing 2\" water main line.", "source_text": "KEYED NOTE: 2 ROUTE PROPOSED 1-1/4\" CW LINE TO EXISTING 2\" WATER MAIN LINE AT THIS APPROXIMATE LOCATION. FIELD VERIFY EXACT LOCATION AND SIZE OF EXISTING PIPE.", "confidence": "high", "location_key": {"grid": "2", "room": "INVENTORY", "level": null, "tag": "2"}}, {"subject": "General Note", "attribute": "keynote_assertion", "value": "Route 1/2\" cold and hot water down.", "source_text": "KEYED NOTE: 3 ROUTE 1/2\" COLD AND HOT WATER DOWN.", "confidence": "high", "location_key": {"grid": "2", "room": "LOUNGE", "level": null, "tag": "3"}}, {"subject": "General Note", "attribute": "keynote_assertion", "value": "Route 1/2\" cold water down to recessed valve box. Confirm exact location with owner/architect.", "source_text": "KEYED NOTE: 4 ROUTE 1/2\" COLD WATER DOWN TO RECESSED VALVE BOX. CONFIRM EXACT LOCATION WITH OWNER/ARCHITECT.", "confidence": "high", "location_key": {"grid": "2", "room": "LOUNGE", "level": null, "tag": "4"}}, {"subject": "Domestic Water Line", "attribute": "pipe_size", "value": "2", "source_text": "(E)2\"CW", "confidence": "high", "location_key": {"grid": "2", "room": "INVENTORY", "level": null, "tag": null}}]} \ No newline at end of file diff --git a/backend/.llm_cache/5fe9a84e8621e168ae6a48d1ffb3db5566f1cc530e8ce8f57cfcbea99d5b8319.json b/backend/.llm_cache/5fe9a84e8621e168ae6a48d1ffb3db5566f1cc530e8ce8f57cfcbea99d5b8319.json new file mode 100644 index 0000000..b8b93ad --- /dev/null +++ b/backend/.llm_cache/5fe9a84e8621e168ae6a48d1ffb3db5566f1cc530e8ce8f57cfcbea99d5b8319.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "wc_tagging_01", "category": "tag_or_reference_inconsistency", "severity": "low", "confidence": "high", "location": "Men's Restroom (Room 102) and Women's Restroom (Room 103)", "disciplines": ["Architectural", "Plumbing"], "sheets": ["A51.01", "P02.01"], "description": "The same fixture tag, 'WC-1', is used for two separate physical water closets, one in the Men's Restroom and one in the Women's Restroom. While the specified fixture type is the same, using a non-unique identifier for distinct assets can lead to confusion in quantity takeoff and construction documentation. Each fixture should have a unique tag.", "evidence": [{"discipline": "Plumbing", "sheet": "P02.01", "source_text": "WC-1", "asserted_value": "The water closet in the WOMEN'S ROOM is tagged WC-1."}, {"discipline": "Plumbing", "sheet": "P02.01", "source_text": "WC-1", "asserted_value": "The water closet in the MEN'S RESTROOM is tagged WC-1."}, {"discipline": "Architectural", "sheet": "A51.01", "source_text": "WC-1", "asserted_value": "The architectural plan tags the water closets in both the Men's and Women's restrooms as WC-1."}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/61d37dd1d26169deb1832bd50ed838c657705e4bde5fb6cf6eaba4278a6ee872.json b/backend/.llm_cache/61d37dd1d26169deb1832bd50ed838c657705e4bde5fb6cf6eaba4278a6ee872.json new file mode 100644 index 0000000..e416f3b --- /dev/null +++ b/backend/.llm_cache/61d37dd1d26169deb1832bd50ed838c657705e4bde5fb6cf6eaba4278a6ee872.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "roof_fan_clearance_01", "category": "clearance_conflict", "severity": "medium", "confidence": "high", "location": "Roof", "disciplines": ["Mechanical", "Architectural"], "sheets": ["M02.02", "A25.01"], "description": "The Mechanical Roof Plan indicates a 10-foot radius clearance requirement associated with the new exhaust fans (Keynote 3). However, the fans are shown located only 6'-9\" apart per the Architectural Roof Plan, causing their required clearance zones to overlap as depicted on the Mechanical plan. The designed layout violates the specified clearance.", "evidence": [{"discipline": "Mechanical", "sheet": "M02.02", "source_text": "LIMIT OF 10' RADIUS FROM ANY OUTDOOR AIR INTAKE.", "asserted_value": "10' radius clearance"}, {"discipline": "Architectural", "sheet": "A25.01", "source_text": "6'-9\"", "asserted_value": "6'-9\" separation"}, {"discipline": "Mechanical", "sheet": "M02.02", "source_text": "Visual drawing of two new exhaust fans with overlapping 10' radius clearance circles.", "asserted_value": "Fans located closer than 10' to each other"}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/6305b6214a2123c512140b4d2e789d5fe616611d4136bee9ffb0cf6ba12e2456.json b/backend/.llm_cache/6305b6214a2123c512140b4d2e789d5fe616611d4136bee9ffb0cf6ba12e2456.json new file mode 100644 index 0000000..67575b2 --- /dev/null +++ b/backend/.llm_cache/6305b6214a2123c512140b4d2e789d5fe616611d4136bee9ffb0cf6ba12e2456.json @@ -0,0 +1 @@ +[{"rfi_id": "CON-001", "issue_id": "CON-001", "title": "Conflicting and Incorrect Code References", "background": "The drawing set references multiple, conflicting, and incorrect building code editions. For example, sheet G21.01 references the 2018 IBC, while sheet A23.01 references the 2021 IBC. Sheet G21.01 references the 2014 NEC, while sheet E01.01 references the 2023 NEC. A jurisdictional review indicates the adopted codes are the 2015 IBC and 2015 IFC. Designing to incorrect codes creates significant permit and redesign risk.", "question": "Please confirm the single, correct, adopted code edition for the project jurisdiction for all applicable codes (IBC, IFC, NEC, IECC, etc.) and revise the entire drawing set to reflect these codes consistently.", "sheets_referenced": ["G11.04", "G21.01", "A23.01", "E01.01", "E01.02", "P03.01"], "disciplines_to_respond": ["General", "Architectural", "Electrical", "Plumbing"], "suggested_response_needed": "Confirmation of correct code editions and a commitment to update the entire drawing set for consistency.", "priority": "high"}, {"rfi_id": "CON-003", "issue_id": "CON-003", "title": "Missing Architectural Floor Plan (A21.01)", "background": "The primary architectural floor plan, anticipated to be sheet A21.01, is missing from the submitted drawing set. This sheet is fundamental for defining the overall layout, dimensions, room tags, and scope of work for all disciplines.", "question": "Please provide the missing architectural floor plan sheet A21.01.", "sheets_referenced": [], "disciplines_to_respond": ["Architectural"], "suggested_response_needed": "Inclusion of the missing sheet A21.01 in the drawing set.", "priority": "high"}, {"rfi_id": "CON-002", "issue_id": "CON-002", "title": "Conflicting Project Scope Definition", "background": "The project scope is described inconsistently across general notes. Sheet G11.04 defines the project as a 'FIRST GENERATION RETAIL SPACE' build-out, implying an empty shell. In contrast, sheet G21.01 describes it as a 'TENANT INTERIOR REMODEL,' implying existing construction requires demolition. This ambiguity prevents an accurate understanding of the work.", "question": "Please clarify whether the project is a first-generation build-out or a remodel, and ensure all drawings consistently reflect the correct scope of work, particularly regarding any demolition.", "sheets_referenced": ["G11.04", "G21.01"], "disciplines_to_respond": ["General"], "suggested_response_needed": "A clear statement of project scope (remodel vs. first-gen) and revisions to drawing notes for consistency.", "priority": "high"}, {"rfi_id": "CON-005", "issue_id": "CON-005", "title": "Missing Partition/Wall and Door Schedules", "background": "The drawing set references partition types (e.g., G11.01, 'partition type as scheduled') and door assembly ratings (e.g., G31.04, '90 MINUTE RATED'), but the corresponding Partition/Wall Type Schedule and Door and Frame Schedule are not provided. This information is essential for material takeoff, pricing, and construction.", "question": "Please provide a comprehensive Partition Type/Wall Schedule with assembly details and a full Door and Frame Schedule with locations, types, ratings, and associated hardware sets.", "sheets_referenced": ["G11.01", "G31.06"], "disciplines_to_respond": ["Architectural", "General"], "suggested_response_needed": "Inclusion of the missing Partition Schedule and Door Schedule in the drawing set.", "priority": "high"}, {"rfi_id": "CON-004", "issue_id": "CON-004", "title": "Missing Mechanical Floor Plan (M02.01)", "background": "The mechanical floor plan for the interior tenant space, anticipated as sheet M02.01, is missing. While the Mechanical Roof Plan (M02.02) is included, the interior plan showing ductwork layout, diffusers, thermostats, and equipment locations is absent, preventing MEP coordination and bidding.", "question": "Please provide the missing mechanical floor plan sheet M02.01.", "sheets_referenced": [], "disciplines_to_respond": ["Mechanical"], "suggested_response_needed": "Inclusion of the missing sheet M02.01 in the drawing set.", "priority": "high"}, {"rfi_id": "CON-006", "issue_id": "CON-006", "title": "Missing Finished Ceiling Heights", "background": "A general note on sheet G11.01 states 'Ceiling heights are indicated...', but the Reflected Ceiling Plan (A22.01) and other drawings do not specify any finished ceiling heights. This omission impacts all disciplines for wall heights, service routing, and clearances.", "question": "Please add finished ceiling height dimensions or tags to all rooms and areas on the Reflected Ceiling Plan, A22.01.", "sheets_referenced": ["A22.01", "G11.01"], "disciplines_to_respond": ["Architectural", "Mechanical", "Electrical", "Plumbing"], "suggested_response_needed": "An updated Reflected Ceiling Plan with ceiling heights indicated for all spaces.", "priority": "high"}, {"rfi_id": "CON-008", "issue_id": "CON-008", "title": "Discrepancy in Quantity of New Rooftop Units", "background": "A conflict exists regarding the number of new rooftop units (RTUs). The Architectural Roof Plan (A25.01) graphically depicts one 'NEW RTU' location. However, the Mechanical Roof Plan (M02.02) and schedule (M01.01) call for two new units, RTU-1 and RTU-2. This discrepancy risks inadequate structural and roofing provisions.", "question": "Please clarify the required quantity of new RTUs and coordinate the Architectural and Mechanical plans to show the correct number and locations of all units.", "sheets_referenced": ["A25.01", "M01.01", "M02.02"], "disciplines_to_respond": ["Architectural", "Mechanical"], "suggested_response_needed": "Updated Architectural and Mechanical roof plans showing a consistent quantity and location for all RTUs.", "priority": "high"}, {"rfi_id": "CON-007", "issue_id": "CON-007", "title": "Equipment Spatial Conflict in INVENTORY Room", "background": "A direct spatial conflict exists on the west wall of the INVENTORY room. Plan A24.01 shows a wall-mounted Network Rack System at this location, while Plumbing plan P02.02 shows the Electric Water Heater (EWH-1) in the exact same position.", "question": "Please coordinate the architectural and plumbing layouts to resolve the conflict between the network rack and the water heater. A new, coordinated location for one of the items is required.", "sheets_referenced": ["A24.01", "P02.02"], "disciplines_to_respond": ["Architectural", "Plumbing"], "suggested_response_needed": "Updated Architectural and Plumbing plans showing the conflicting equipment in separate, coordinated locations.", "priority": "high"}, {"rfi_id": "CON-009", "issue_id": "CON-009", "title": "Missing Structural Drawings", "background": "The drawing set does not include any Structural ('S') drawings. The scope includes new rooftop equipment (M01.01) and suspended heavy equipment like transformers (E05.02), which require structural analysis and design for support. A note on E05.02 explicitly requires coordination with a project structural engineer, but no such engineer or drawings are identified.", "question": "Please engage a structural engineer and provide structural drawings addressing the support of all new equipment, including RTUs and suspended items, as well as any required modifications to the existing structure.", "sheets_referenced": ["A25.01", "M01.01", "E05.02"], "disciplines_to_respond": ["Structural", "Architectural", "Mechanical", "Electrical"], "suggested_response_needed": "Inclusion of a complete set of structural drawings and calculations for permit and construction.", "priority": "high"}, {"rfi_id": "CON-020", "issue_id": "CON-020", "title": "Incomplete Structural Support Details for Suspended Equipment", "background": "Details for suspending a transformer (E05.02) and a 30-gallon water heater (P03.01) are incomplete and defer final design. Electrical detail E05.02 states to 'VERIFY SUPPORT SIZING AND DESIGNED WITH PROJECT STRUCTURAL ENGINEER,' and Plumbing detail P03.01 provides a generic unistrut concept without specifying connection to the primary structure. This defers engineering to the contractor.", "question": "Please provide complete, engineered structural details showing the connection and anchorage of the suspended transformer and water heater to the primary building structure. Specify all required members, bracing, and fasteners.", "sheets_referenced": ["E02.01", "E05.02", "P02.02", "P03.01"], "disciplines_to_respond": ["Plumbing", "Electrical", "Structural"], "suggested_response_needed": "Engineered structural details for supporting the suspended equipment, to be included in the Structural drawing set.", "priority": "high"}, {"rfi_id": "CON-010", "issue_id": "CON-010", "title": "Missing Fire Sprinkler and Fire Alarm Plans", "background": "The scope appears to include modifications to the fire protection systems, as new sprinkler heads (A22.01) and fire alarm devices (A22.01, G11.03) are noted. However, dedicated Fire Sprinkler and Fire Alarm system plans showing full layouts, routing, or calculations are not provided in the set.", "question": "Please provide dedicated Fire Sprinkler and Fire Alarm plans prepared by a qualified engineer, or add a note to the General/Life Safety sheets explicitly stating these systems will be handled as a deferred submittal.", "sheets_referenced": ["G11.03", "A22.01", "E04.01"], "disciplines_to_respond": ["Fire Protection", "Electrical", "Architectural"], "suggested_response_needed": "Inclusion of FP/FA plans in the set, or a note confirming deferred submittal.", "priority": "high"}, {"rfi_id": "CON-015", "issue_id": "CON-015", "title": "Restroom Door Swing Obstructs Lavatory Clear Floor Space", "background": "In both the Men's and Women's Restrooms (A51.01), the entry door swings inward and its path obstructs the required clear floor space at the lavatory. This configuration appears to prevent use of the lavatory after entering and closing the door.", "question": "Please revise the restroom layout to ensure the door swing does not encroach upon the required 30\"x48\" clear floor space for the lavatory, or demonstrate compliance via ADA 603.2.3 Exception 2 and provide dimensions showing the clear space is available beyond the door swing.", "sheets_referenced": ["G21.01", "A51.01"], "disciplines_to_respond": ["Architectural"], "suggested_response_needed": "Updated restroom plans demonstrating compliant lavatory clearances with respect to the door swing.", "priority": "high"}, {"rfi_id": "CON-016", "issue_id": "CON-016", "title": "Contradictory Specification for Fire-Rated Doors", "background": "A note on sheet G31.04 contains a conflicting specification for fire-rated doors, stating: '...ASSEMBLY SHALL CONFORM TO A 90 MINUTE RATED CLASS C INDICATED.' This is a contradiction, as 90-minute openings are Class B, while Class C openings are 20-minute rated.", "question": "Please revise the door specification to align with IBC Chapter 7, clarifying the correct required rating (in minutes/hours) and class (e.g., B) for the intended application.", "sheets_referenced": ["G31.04"], "disciplines_to_respond": ["Architectural", "Specifications"], "suggested_response_needed": "Correction of the fire-rated door specification and coordination with the forthcoming door schedule.", "priority": "high"}, {"rfi_id": "CON-014", "issue_id": "CON-014", "title": "Contradictory Dimensions for Lavatory Toe Clearance", "background": "The typical restroom lavatory detail on sheet A51.01 contains two conflicting dimensions for toe clearance. One leader line indicates '9\" MIN. TOE CLEAR' while another indicates '6\" MAX. TOE CLEAR'. These requirements are mutually exclusive.", "question": "Please correct the lavatory detail on sheet A51.01 to show a single, valid, and compliant dimension for toe clearance that meets the applicable accessibility code.", "sheets_referenced": ["A51.01"], "disciplines_to_respond": ["Architectural", "Plumbing"], "suggested_response_needed": "An updated detail A51.01 with corrected and compliant dimensions.", "priority": "high"}, {"rfi_id": "CON-012", "issue_id": "CON-012", "title": "Discrepancy in Quantity of Electrical Panels Shown vs. Scheduled", "background": "Architectural plan A24.01 shows a single generic 'PANEL' symbol in the Lounge. However, Electrical Panel Schedules on E01.02 list two separate panels, 'H' and 'L', to be located in the Lounge. The architectural plan does not account for the required wall space and clearances for two panels.", "question": "Please coordinate the architectural and electrical plans. Update plan A24.01 to show the correct quantity, size, and location of both electrical panels 'H' and 'L' to ensure adequate space and support are provided.", "sheets_referenced": ["A24.01", "E01.02"], "disciplines_to_respond": ["Architectural", "Electrical"], "suggested_response_needed": "Updated Architectural plan showing locations for both electrical panels.", "priority": "high"}, {"rfi_id": "CON-017", "issue_id": "CON-017", "title": "Potential Head-Height Obstruction from Pendant Light Fixtures", "background": "Pendant light fixtures (types L-5 and L-6) are scheduled on E01.02 and noted on A22.01 with a mounting height of 5'-5\" (65 inches) AFF. If these fixtures are located within a path of travel, they will create a head-height obstruction, violating the 80-inch minimum vertical clearance requirement per ADA 307.4.", "question": "Please verify the locations of light fixture types L-5 and L-6. If any are located over a circulation path, please raise the specified mounting height to provide at least 80 inches of clearance from the floor to the bottom of the fixture.", "sheets_referenced": ["E01.02", "E03.01", "A22.01"], "disciplines_to_respond": ["Electrical", "Architectural"], "suggested_response_needed": "Confirmation of fixture locations and, if necessary, an updated lighting schedule/plan with compliant mounting heights.", "priority": "high"}, {"rfi_id": "CON-019", "issue_id": "CON-019", "title": "Drinking Fountain Located in Gender-Specific Restroom", "background": "Plumbing plan P02.01 shows the only drinking fountain (EDF-1) provided in the tenant space is located inside the Women's Restroom. This denies access to drinking water for other occupants and does not provide equitable access to amenities per IBC 2902.3.", "question": "Please relocate the drinking fountain to a common use area, such as a corridor, that is accessible to all occupants. Confirm if a single hi-lo unit is required.", "sheets_referenced": ["P02.01"], "disciplines_to_respond": ["Plumbing", "Architectural"], "suggested_response_needed": "Updated plumbing and architectural plans showing the drinking fountain in a new, compliant location.", "priority": "high"}, {"rfi_id": "CON-018", "issue_id": "CON-018", "title": "Missing Dimensioned Plans for Restroom Accessibility Compliance", "background": "While fixtures are specified as 'A.D.A.' on the plumbing fixture schedule (P01.01), the drawing set lacks enlarged and fully dimensioned floor plans or elevations of the restrooms. This prevents verification of compliance with required clearances for fixtures, door maneuvering, compartment size, and knee/toe space per ADA standards.", "question": "Please provide enlarged, fully dimensioned plans and elevations of the Men's and Women's restrooms demonstrating compliance with all applicable accessibility requirements.", "sheets_referenced": ["P01.01", "E04.01"], "disciplines_to_respond": ["Plumbing", "Architectural", "Electrical"], "suggested_response_needed": "New drawing sheets with enlarged, dimensioned restroom plans and elevations.", "priority": "high"}, {"rfi_id": "CON-011", "issue_id": "CON-011", "title": "Conflicting Ceiling Material Specifications", "background": "There is a conflict in the specified ceiling materials. The Reflected Ceiling Plan (A22.01) and Finish Plan (A23.01) both specify an acoustical tile ceiling (AT-1) 'THROUGHOUT ENTIRE SPACE'. However, the Gypsum Board specification on sheet G31.05 includes a specification for 5/8\" gypsum board on ceilings.", "question": "Please clarify the intended ceiling material(s). If both acoustical tile and gypsum board ceilings are to be used, please update the plans and specifications to clearly delineate the locations of each ceiling type.", "sheets_referenced": ["A22.01", "A23.01", "G31.05"], "disciplines_to_respond": ["Architectural", "General"], "suggested_response_needed": "Clarification of ceiling types and locations, with updated plans and specifications as needed for consistency.", "priority": "high"}, {"rfi_id": "CON-013", "issue_id": "CON-013", "title": "Reference to Missing Detail Sheet A92.01", "background": "Note G on sheet A24.01 directs the user to 'Refer to detail 3/A92.01 for foundation pour back detail'. Sheet A92.01 does not exist in the drawing set, making this a reference to a missing, critical construction detail.", "question": "Please provide the missing sheet A92.01 with the required foundation pour back detail, or correct the note to point to the correct, existing detail elsewhere in the set.", "sheets_referenced": ["A24.01"], "disciplines_to_respond": ["Architectural"], "suggested_response_needed": "Provision of the missing detail or correction of the detail reference.", "priority": "high"}, {"rfi_id": "CON-026", "issue_id": "CON-026", "title": "Obsolete and Conflicting Slip Resistance Specification for Tile", "background": "The specifications for tile slip resistance contain two issues. First, they reference ASTM C1028 for Static Coefficient of Friction (SCOF), which is an obsolete standard withdrawn in 2014. Second, sheet G31.05 requires a SCOF of 0.6 while sheet A23.01 requires 0.5.", "question": "Please update the specifications to reference the current standard, ANSI A326.3, and specify a single, consistent required Dynamic Coefficient of Friction (DCOF) value for all floor tile.", "sheets_referenced": ["G31.05", "A23.01"], "disciplines_to_respond": ["Architectural", "Interiors", "Specifications"], "suggested_response_needed": "An updated specification note with the correct standard and a single, unified slip resistance value.", "priority": "medium"}, {"rfi_id": "CON-027", "issue_id": "CON-027", "title": "Lack of Knee/Toe Clearance at Lounge Sink", "background": "The employee lounge sink is shown on detail A51.01 with a standard base cabinet underneath. This configuration does not appear to provide the required knee and toe clearance for a forward approach by a wheelchair user per ADA 606.2.", "question": "Please revise the cabinetry detail for the lounge sink to provide compliant knee and toe clearance, or confirm that a compliant parallel approach is intended and that adequate clear floor space is provided.", "sheets_referenced": ["A51.01"], "disciplines_to_respond": ["Architectural"], "suggested_response_needed": "An updated detail showing compliant knee/toe clearance, or confirmation of a compliant parallel approach.", "priority": "medium"}, {"rfi_id": "CON-023", "issue_id": "CON-023", "title": "Conflicting Firestopping Penetration Requirements", "background": "A discrepancy exists in firestopping requirements. Electrical detail E05.01 prescriptively calls for a '3 HOUR RATED CAULK' at all penetrations. This contradicts general notes (e.g., G31.04) which correctly require firestopping assemblies to have a rating equal to that of the construction being penetrated.", "question": "Please clarify the firestopping requirement. It is recommended to revise the electrical detail to require a UL-listed firestop assembly with an F-rating equal to or greater than the fire-resistance rating of the assembly being penetrated, ensuring consistency with general notes and code.", "sheets_referenced": ["E05.01", "P01.01", "G31.04"], "disciplines_to_respond": ["Electrical", "Plumbing", "General"], "suggested_response_needed": "Revised details and notes to specify a single, code-compliant method for firestopping.", "priority": "medium"}, {"rfi_id": "CON-024", "issue_id": "CON-024", "title": "Missing Exterior Elevations for Building Signage", "background": "A note on the Reflected Ceiling Plan (A22.01) states 'PROVIDE POWER FOR BUILDING SIGN,' which indicates that new exterior signage is part of the work scope. However, the drawing set lacks exterior building elevations to define the location, size, attachment, and specifications for this new sign.", "question": "Please provide exterior elevation sheets, clearly indicating the design, location, and mounting specifications for the new building sign.", "sheets_referenced": ["A22.01", "A51.01"], "disciplines_to_respond": ["Architectural"], "suggested_response_needed": "Inclusion of exterior elevation drawings showing signage.", "priority": "medium"}, {"rfi_id": "CON-021", "issue_id": "CON-021", "title": "Vertical Conflict Between Network Rack and Data Outlet Mounting Heights", "background": "In the INVENTORY room, there is a conflict between equipment and outlet mounting heights. The architectural plan (A24.01) specifies the network rack bottom to be mounted at 74 inches AFF, but the special systems plan (E04.01) shows the corresponding data outlets terminating at 18 inches AFF. This separation is impractical for cabling.", "question": "Please coordinate and revise the mounting height of the data outlets to be located immediately adjacent to or within the intended network rack location for proper termination.", "sheets_referenced": ["A24.01", "E04.01"], "disciplines_to_respond": ["Architectural", "Electrical"], "suggested_response_needed": "An updated electrical plan showing revised data outlet mounting heights.", "priority": "medium"}, {"rfi_id": "CON-022", "issue_id": "CON-022", "title": "Conflicting Vapor Barrier Specifications for Slab Pour-Backs", "background": "Conflicting requirements exist for the vapor barrier at slab pour-backs. The Landlord Work Letter on sheet G11.03 mandates a '15 Mil vapor barrier'. In contrast, a Plumbing detail on sheet P03.01 specifies a 'MINIMUM 6-MIL' vapor retarder.", "question": "Please clarify the single required thickness for the vapor barrier at slab pour-backs and update the drawings for consistency. Note that Landlord requirements are typically governing.", "sheets_referenced": ["G11.03", "P03.01"], "disciplines_to_respond": ["General", "Plumbing"], "suggested_response_needed": "Clarification of the requirement and a revised Plumbing detail if necessary.", "priority": "medium"}, {"rfi_id": "CON-025", "issue_id": "CON-025", "title": "Incomplete Finish Documentation - Missing Finish Schedule", "background": "The finish documentation is incomplete for bidding purposes. While a Finish Plan (A23.01) with material tags is provided, it relies on general notes like 'PC-1 throughout, U.N.O.' A comprehensive Room Finish Schedule in a matrix format, which specifies the finish for the floor, base, walls, and ceiling of each room, is missing.", "question": "Please provide a Room Finish Schedule that lists every room and clearly specifies the materials for each surface (floor, base, walls, ceiling) to eliminate ambiguity.", "sheets_referenced": ["A23.01"], "disciplines_to_respond": ["Interiors"], "suggested_response_needed": "Inclusion of a Room Finish Schedule in the drawing set.", "priority": "medium"}] \ No newline at end of file diff --git a/backend/.llm_cache/630675e64d6af9eb77ea54b180181a22611c5708a8d088ec1bc70d748db38cba.json b/backend/.llm_cache/630675e64d6af9eb77ea54b180181a22611c5708a8d088ec1bc70d748db38cba.json new file mode 100644 index 0000000..753cb7e --- /dev/null +++ b/backend/.llm_cache/630675e64d6af9eb77ea54b180181a22611c5708a8d088ec1bc70d748db38cba.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "code_ibc_version_mismatch", "category": "note_or_spec_contradiction", "severity": "high", "confidence": "high", "location": "General Codes & Standards Notes", "disciplines": ["General", "Electrical", "Plumbing", "Architectural"], "sheets": ["G21.01", "E01.01", "P03.01", "A23.01"], "description": "The drawing set references two different versions of the International Building Code (IBC). The general code plan G21.01 lists the 2018 IBC, while the Electrical (E01.01), Plumbing (P03.01), and Architectural (A23.01) sheets reference the 2021 IBC. The project must be designed and permitted under a single, consistent code edition.", "evidence": [{"discipline": "General", "sheet": "G21.01", "source_text": "2018 INTERNATIONAL BUILDING CODE (IBC) CH. 2-10 WITH HARRIS COUNTY AMENDMENTS", "asserted_value": "2018 IBC"}, {"discipline": "Electrical", "sheet": "E01.01", "source_text": "CONTRACTOR SHALL CONFORM TO ALL LOCAL, STATE, AND APPLICABLE CODES, 2023 NEC, 2021 IBC, 2021 IECC, NFPA, ETC.", "asserted_value": "2021 IBC"}, {"discipline": "Plumbing", "sheet": "P03.01", "source_text": "PER 2021 IBC, CHAPTER 19, SECTION 1907: POLYETHYLENE VAPOR RETARDER MINIMUM 6-MIL SHALL BE REQUIRED.", "asserted_value": "2021 IBC"}, {"discipline": "Architectural", "sheet": "A23.01", "source_text": "INTERIOR FINISHES TO COMPLY WITH IBC CLASS C OR HIGHER SECTION 803.9 AND TABLE 803.9 OF 2021 IBC.", "asserted_value": "2021 IBC"}], "recommended_resolution": "verify with architect"}, {"conflict_id": "code_nec_version_mismatch", "category": "note_or_spec_contradiction", "severity": "high", "confidence": "high", "location": "General Codes & Standards Notes", "disciplines": ["General", "Electrical"], "sheets": ["G21.01", "E01.01"], "description": "The drawing set references two different versions of the National Electrical Code (NEC). The general code plan G21.01 lists the 2014 NEC, while the electrical general notes on E01.01 list the 2023 NEC. The applicable code for the project must be clarified and used consistently.", "evidence": [{"discipline": "General", "sheet": "G21.01", "source_text": "2023 STATE OF TEXAS ADOPTED 2014 NFPA 70 NATIONAL ELECTRICAL CODE (NEC)", "asserted_value": "2014 NEC"}, {"discipline": "Electrical", "sheet": "E01.01", "source_text": "CONTRACTOR SHALL CONFORM TO ALL LOCAL, STATE, AND APPLICABLE CODES, 2023 NEC, 2021 IBC...", "asserted_value": "2023 NEC"}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/684dd3d6e85a164f67e099fa6940aee8574c9cc1d3ccc48d3de0d7deac439229.json b/backend/.llm_cache/684dd3d6e85a164f67e099fa6940aee8574c9cc1d3ccc48d3de0d7deac439229.json new file mode 100644 index 0000000..2a64545 --- /dev/null +++ b/backend/.llm_cache/684dd3d6e85a164f67e099fa6940aee8574c9cc1d3ccc48d3de0d7deac439229.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "roof_penetration_responsibility_conflict", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "Roof", "disciplines": ["General", "Architectural"], "sheets": ["G11.03", "A25.01"], "description": "The Landlord Work Letter on G11.03 explicitly states that all roof penetrations must be performed by the Landlord's designated roofing contractor. However, a general note on the Architectural Roof Plan A25.01 directs the Tenant's contractor to repair and seal the roof. This creates a contractual and procedural conflict over which party is responsible for executing the roofing work. Performing this work without adhering to the Landlord's requirement could void the building's roof warranty and lead to financial disputes.", "evidence": [{"discipline": "General", "sheet": "G11.03", "source_text": "6. ROOF; a. ALL ROOF PENETRATIONS MUST BE MADE BY LANDLORD'S ROOFING CONTRACTOR, AT TENANTS COST. The Landlord's Superintendent must be notified a minimum of five (5) days in advance.", "asserted_value": "Landlord's roofing contractor must perform all roof penetrations."}, {"discipline": "Architectural", "sheet": "A25.01", "source_text": "D. REPAIR AND SEAL ROOF IF REQUIRED AROUND ALL NEW PENETRATIONS AND EQUIPMENT, PER MANUFACTURER'S RECOMMENDATIONS.", "asserted_value": "The contractor for this project is instructed to repair and seal the roof around penetrations."}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/68520074ae27092425fce236404d2414eab1d470119f33a75b61f306e1597faa.json b/backend/.llm_cache/68520074ae27092425fce236404d2414eab1d470119f33a75b61f306e1597faa.json new file mode 100644 index 0000000..434a3aa --- /dev/null +++ b/backend/.llm_cache/68520074ae27092425fce236404d2414eab1d470119f33a75b61f306e1597faa.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "firestop_rating_mismatch_01", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "Firestopping at wall penetrations", "disciplines": ["Electrical", "Plumbing", "General"], "sheets": ["E05.01", "P01.01", "G11.01"], "description": "The electrical detail for a sleeve penetration (Detail 4) prescriptively calls for a '3 HOUR RATED CAULK'. This contradicts the general notes on the Plumbing and General sheets, which require firestopping assemblies to have a rating equal to that of the construction being penetrated. Specifying a fixed 3-hour rating may be insufficient if a higher-rated wall is penetrated, or excessive and more costly for a standard 1-hour wall. The detail should be revised to specify a UL-listed assembly with a rating matching the penetrated wall, consistent with project-wide notes.", "evidence": [{"discipline": "Electrical", "sheet": "E05.01", "source_text": "PACK BOTH ENDS OF SLEEVE WITH 3M FIRE DAM 150 3 HOUR RATED CAULK OR APPROVED EQUAL", "asserted_value": "3 HOUR RATED CAULK"}, {"discipline": "Plumbing", "sheet": "P01.01", "source_text": "SEAL ALL PENETRATIONS THROUGH RATED WALLS, FLOORS AND CEILINGS WITH A UL LISTED ASSEMBLY TO PROVIDE A RATING EQUAL TO OR GREATER THAN THE RATING OF THE WALL, FLOOR OR CEILING.", "asserted_value": "RATING EQUAL TO OR GREATER THAN THE RATING OF THE WALL"}, {"discipline": "General", "sheet": "G31.04", "source_text": "FIRESTOPPING: TESTED IN ACCORDANCE WITH ASTM E119 OR UL 263 TO MEET THE HOURLY F-RATINGS OF THE CONSTRUCTION BEING PENETRATED.", "asserted_value": "MEET THE HOURLY F-RATINGS OF THE CONSTRUCTION BEING PENETRATED"}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/69c0e5851b410b8a4286d0705336e2417c9ccf44f1023fc963724ccd370df294.json b/backend/.llm_cache/69c0e5851b410b8a4286d0705336e2417c9ccf44f1023fc963724ccd370df294.json new file mode 100644 index 0000000..5709f12 --- /dev/null +++ b/backend/.llm_cache/69c0e5851b410b8a4286d0705336e2417c9ccf44f1023fc963724ccd370df294.json @@ -0,0 +1 @@ +[{"assertion_id": "G31.05#6", "attribute": "tolerance", "original_value": "1/8 in 10 ft", "normalized_value": "0.125 in 10 ft", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Normalized fraction to decimal.", "source_text": "TOLERANCES: A. MAXIMUM VARIATION OF FINISHED GYPSUM BOARD SURFACE FROM A TRUE PLANE IS 1/8 INCH IN 10 FEET IN ANY DIRECTION.", "normalization_confidence": "high"}, {"assertion_id": "G31.05#7", "attribute": "wall_type", "original_value": "5/8 inch thick", "normalized_value": "0.625", "normalized_unit": "inches", "normalized_attribute": "material_thickness", "normalization_notes": "Normalized fraction to decimal and re-assigned attribute from 'wall_type' to 'material_thickness'.", "source_text": "THICKNESS: A. VERTICAL SURFACES: 5/8 INCH, UNLESS NOTED OTHERWISE ON DRAWINGS.", "normalization_confidence": "high"}, {"assertion_id": "G31.05#8", "attribute": "material_thickness", "original_value": "5/8", "normalized_value": "0.625", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": "Normalized fraction to decimal. Unit 'inches' is from source text.", "source_text": "THICKNESS: ... B. CEILINGS: 5/8 INCH.", "normalization_confidence": "high"}, {"assertion_id": "G31.05#9", "attribute": "material_thickness", "original_value": "5/8", "normalized_value": "0.625", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": "Normalized fraction to decimal. Unit 'inches' is from source text.", "source_text": "THICKNESS: 5/8 INCH UNLESS NOTED OTHERWISE ON DRAWINGS.", "normalization_confidence": "high"}, {"assertion_id": "G31.05#10", "attribute": "slip_resistance", "original_value": "min 0.6 SCOF", "normalized_value": "0.6", "normalized_unit": "SCOF", "normalized_attribute": "minimum_static_coefficient_of_friction", "normalization_notes": "Applies to level surfaces, per ASTM C1028 or ANSI A137.1.", "source_text": "STATIC COEFFICIENT OF FRICTION: MIN. 0.6 FOR LEVEL SURFACES, MIN. 0.42 FOR RAMPS PER ASTM C1028 OR ANSI A137.1.", "normalization_confidence": "high"}, {"assertion_id": "G31.05#11", "attribute": "slip_resistance", "original_value": "min 0.42 SCOF", "normalized_value": "0.42", "normalized_unit": "SCOF", "normalized_attribute": "minimum_static_coefficient_of_friction", "normalization_notes": "Applies to ramps, per ASTM C1028 or ANSI A137.1.", "source_text": "STATIC COEFFICIENT OF FRICTION: MIN. 0.6 FOR LEVEL SURFACES, MIN. 0.42 FOR RAMPS PER ASTM C1028 OR ANSI A137.1.", "normalization_confidence": "high"}, {"assertion_id": "G31.05#12", "attribute": "material_thickness", "original_value": "1/2", "normalized_value": "0.5", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": "Normalized fraction to decimal. Unit 'inches' is from source text, which also specifies a minimum requirement and a 13mm equivalent.", "source_text": "CEMENTITIOUS BACKER BOARD: A. 1/2 INCH (13 MM) THICKNESS MINIMUM", "normalization_confidence": "high"}, {"assertion_id": "G31.05#13", "attribute": "material_type", "original_value": "Polymer-modified sanded grout (ANSI A118.7)", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text": "GROUT: A. POLYMER-MODIFIED SANDED GROUT (ANSI A118.7).", "normalization_confidence": "high"}, {"assertion_id": "G31.05#14", "attribute": "material_requirement", "original_value": "Waterproof membrane for wet areas", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text": "WATERPROOF MEMBRANE FOR WET AREAS.", "normalization_confidence": "high"}, {"assertion_id": "G31.05#15", "attribute": "tolerance", "original_value": "1/4 in 10 ft", "normalized_value": "0.25 in 10 ft", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Normalized fraction to decimal.", "source_text": "ENSURE SUBSTRATE DEVIATION DOES NOT EXCEED 1/4 INCH IN 10 FEET.", "normalization_confidence": "high"}, {"assertion_id": "G31.06#0", "attribute": "wall_rating", "original_value": "1, 2, 3, or 4 Hour", "normalized_value": "1, 2, 3, 4", "normalized_unit": "Hour", "normalized_attribute": null, "normalization_notes": "Represents a list of possible ratings.", "source_text": "Nonbearing Wall Ratings -- 1, 2, 3 or 4 Hr (See Items 4 & 5 through 5J)", "normalization_confidence": "high"}, {"assertion_id": "G31.06#1", "attribute": "UL Certification", "original_value": "BXUV - Fire Resistance Ratings - ANSI/UL 263 Certified for United States", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text": "BXUV - Fire Resistance Ratings - ANSI/UL 263 Certified for United States", "normalization_confidence": "high"}, {"assertion_id": "G31.06#2", "attribute": "UL Certification", "original_value": "BXUV7 - Fire Resistance Ratings - CAN/ULC S101 Certified for Canada", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text": "BXUV7 - Fire Resistance Ratings - CAN/ULC S101 Certified for Canada", "normalization_confidence": "high"}, {"assertion_id": "G31.06#3", "attribute": "wall_rating_assembly", "original_value": "Min 1-5/8\" stud depth with 1 layer of 5/8\" thick gypsum board on each side.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Complex assertion describing a 1-hour rated assembly. Contains multiple values (stud depth, layers, thickness).", "source_text": "Rating, Hr: 1, Min Depth, In. (Item 2): 1-5/8, No. of Layers & Thickness of Panel: 1 layer, 5/8 in. thick", "normalization_confidence": "low"}, {"assertion_id": "G31.06#4", "attribute": "wall_rating_assembly", "original_value": "Min 2-1/2\" stud depth with 1 layer of 1/2\" thick gypsum board on each side.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Complex assertion describing a 2-hour rated assembly. Contains multiple values (stud depth, layers, thickness).", "source_text": "Rating, Hr: 2, Min Depth, In. (Item 2): 2-1/2, No. of Layers & Thickness of Panel: 1 layer, 1/2 in. thick", "normalization_confidence": "low"}, {"assertion_id": "G31.06#5", "attribute": "wall_rating_assembly", "original_value": "Min 1-5/8\" stud depth with 2 layers of 1/2\" thick gypsum board on each side.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Complex assertion describing a 2-hour rated assembly. Contains multiple values (stud depth, layers, thickness).", "source_text": "Rating, Hr: 2, Min Depth, In. (Item 2): 1-5/8, No. of Layers & Thickness of Panel: 2 layers, 1/2 in. thick", "normalization_confidence": "low"}, {"assertion_id": "A11.01#0", "attribute": "project_address", "original_value": "7022 ELYSON EXCHANGE WAY CYPRESS, TX 77433", "normalized_value": "7022 ELYSON EXCHANGE WAY, CYPRESS, TX 77433", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Standardized address format.", "source_text": "VERIZON ELYSON\n7022 ELYSON EXCHANGE WAY\nCYPRESS, TX 77433", "normalization_confidence": "high"}, {"assertion_id": "A11.01#1", "attribute": "scope_description", "original_value": "INTERIOR TENANT BUILD OUT AREA OF WORK IN EXISTING BUILDING C", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text": "INTERIOR TENANT BUILD OUT AREA OF WORK IN EXISTING BUILDING C 7022 ELYSON EXCHANGE WAY", "normalization_confidence": "high"}, {"assertion_id": "A11.01#2", "attribute": "address", "original_value": "7016 ELYSON EXCHANGE WAY", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Partial address. City, State, and ZIP code are not specified in the source text.", "source_text": "BUILDING B\n7016 ELYSON\nEXCHANGE WAY", "normalization_confidence": "high"}, {"assertion_id": "A11.01#3", "attribute": "address", "original_value": "7022 ELYSON EXCHANGE WAY", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Partial address. City, State, and ZIP code are not specified in the source text.", "source_text": "EXISTING BUILDING C\n7022 ELYSON\nEXCHANGE WAY", "normalization_confidence": "high"}, {"assertion_id": "A11.01#4", "attribute": "address", "original_value": "7046 ELYSON EXCHANGE WAY", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Partial address. City, State, and ZIP code are not specified in the source text.", "source_text": "BUILDING D\n7046 ELYSON\nEXCHANGE WAY", "normalization_confidence": "high"}, {"assertion_id": "A11.01#5", "attribute": "address", "original_value": "7040 ELYSON EXCHANGE WAY", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Partial address. City, State, and ZIP code are not specified in the source text.", "source_text": "BUILDING E\n7040 ELYSON\nEXCHANGE WAY", "normalization_confidence": "high"}, {"assertion_id": "A11.01#6", "attribute": "address", "original_value": "7034 ELYSON EXCHANGE WAY", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Partial address. City, State, and ZIP code are not specified in the source text.", "source_text": "BUILDING F\n7034 ELYSON EXCHANGE\nWAY", "normalization_confidence": "high"}, {"assertion_id": "A11.01#7", "attribute": "address", "original_value": "7052 ELYSON EXCHANGE WAY", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Partial address. City, State, and ZIP code are not specified in the source text.", "source_text": "BUILDING G\n7052 ELYSON\nEXCHANGE WAY", "normalization_confidence": "high"}, {"assertion_id": "A11.01#8", "attribute": "address", "original_value": "7058 ELYSON EXCHANGE WAY", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Partial address. City, State, and ZIP code are not specified in the source text.", "source_text": "BUILDING H\n7058 ELYSON\nEXCHANGE WAY", "normalization_confidence": "high"}, {"assertion_id": "A11.01#9", "attribute": "address", "original_value": "7064 ELYSON EXCHANGE WAY", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Partial address. City, State, and ZIP code are not specified in the source text.", "source_text": "BUILDING J\n7064 ELYSON EXCHANGE WAY", "normalization_confidence": "high"}, {"assertion_id": "A11.01#10", "attribute": "address", "original_value": "7028 ELYSON EXCHANGE WAY", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Partial address. City, State, and ZIP code are not specified in the source text.", "source_text": "BUILDING K\n7028 ELYSON\nEXCHANGE WAY", "normalization_confidence": "high"}, {"assertion_id": "A11.01#11", "attribute": "address", "original_value": "7070 ELYSON EXCHANGE WAY", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Partial address. City, State, and ZIP code are not specified in the source text.", "source_text": "BUILDING L\n7070 ELYSON\nEXCHANGE WAY", "normalization_confidence": "high"}, {"assertion_id": "A11.01#12", "attribute": "scope_status", "original_value": "Not in scope", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text": "BLDGS. A\nNOT IN\nSCOPE", "normalization_confidence": "high"}, {"assertion_id": "A11.01#13", "attribute": "overall_dim", "original_value": "30'-0\"", "normalized_value": "360", "normalized_unit": "inches", "normalized_attribute": "length", "normalization_notes": "Converted feet and inches to inches.", "source_text": "30' - 0\"", "normalization_confidence": "high"}, {"assertion_id": "A22.01#0", "attribute": "mounting_height_AFF", "original_value": "80", "normalized_value": "80", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": "Unit 'inches' and context 'Above Finished Floor' are from source text.", "source_text": "ALL WALL STROBES SHALL BE LOCATED @ +80\" AFF", "normalization_confidence": "high"}, {"assertion_id": "A22.01#1", "attribute": "device_location", "original_value": "centered in ceiling tile", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text": "ALL CEILING STROBES TO BE CENTERED IN CEILING TILE.", "normalization_confidence": "high"}, {"assertion_id": "A22.01#2", "attribute": "device_location", "original_value": "align vertically with receptacle below where occurs", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text": "ALL STROBES ARE TO ALIGN VERTICALLY WITH RECEPTACLE BELOW WHERE OCCURS.", "normalization_confidence": "high"}, {"assertion_id": "A22.01#3", "attribute": "device_location", "original_value": "center of acoustical ceiling panel", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Source text includes 'U.N.O.' which typically means 'Unless Noted Otherwise'.", "source_text": "INSTALL NEW SPRINKLER HEADS AND LIGHT FIXTURES AT THE CENTER OF THE ACOUSTICAL CEILING PANEL U.N.O.", "normalization_confidence": "high"}, {"assertion_id": "A22.01#4", "attribute": "device_location", "original_value": "centered and aligned with light fixtures", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text": "ALL FIRE ALARM / LIFE SAFETY EQUIPMENT LOCATIONS TO BE LOCATED CENTERED AND ALIGNED WITH LIGHT FIXTURES.", "normalization_confidence": "high"}, {"assertion_id": "A22.01#5", "attribute": "ceiling_finish", "original_value": "AT-1 ACOUSTIC CEILING TILE", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "AT-1 is a finish tag.", "source_text": "CEILING THROUGHOUT ENTIRE SPACE TO BE AT-1 ACOUSTIC CEILING TILE", "normalization_confidence": "high"}, {"assertion_id": "A22.01#6", "attribute": "ceiling_grid", "original_value": "C4-A CEILING GRID", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "C4-A is a material tag.", "source_text": "C4-A CEILING GRID.", "normalization_confidence": "high"}, {"assertion_id": "A22.01#7", "attribute": "description", "original_value": "2' x 2' RECESSED INDIRECT, 4000K, 90+CRI, ACRYLIC SHEILDING, WHITE FINISH", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Complex description for light fixture L-4. Contains multiple values (dimensions, color temp, CRI, etc.).", "source_text": "TAG: L-4, MANUF.: LITHONIA, MODEL: 2BLT2-33L-ADSM-EZ1-LP940, DESCRIPTION: 2' x 2' RECESSED INDIRECT, 4000K, 90+CRI, ACRYLIC SHEILDING, WHITE FINISH", "normalization_confidence": "medium"}, {"assertion_id": "A22.01#8", "attribute": "description", "original_value": "16\" PENDANT, 2700K, DOMED LENSE, MATT BLACK", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Complex description for light fixture L-6. Contains multiple values (dimensions, color temp, finish, etc.).", "source_text": "TAG: L-6, MANUF.: CONNEXION, MODEL: BLE-C-WHA16-106CSB20-LED16-2700K-DL, DESCRIPTION: 16\" PENDANT, 2700K, DOMED LENSE, MATT BLACK, PENDANT 5'-5\" AFF", "normalization_confidence": "medium"}, {"assertion_id": "A22.01#9", "attribute": "mounting_height_AFF", "original_value": "5'-5\"", "normalized_value": "65", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": "Converted feet and inches to inches. AFF stands for Above Finished Floor.", "source_text": "PENDANT 5'-5\" AFF", "normalization_confidence": "high"}, {"assertion_id": "A22.01#10", "attribute": "room_name", "original_value": "MEN'S RESTROOM", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text": "MEN'S RESTROOM", "normalization_confidence": "high"}, {"assertion_id": "A22.01#11", "attribute": "room_name", "original_value": "WOMEN'S RESTROOM", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text": "WOMEN'S RESTROOM", "normalization_confidence": "high"}, {"assertion_id": "A22.01#12", "attribute": "width", "original_value": "10'-0\"", "normalized_value": "120", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": "Converted feet and inches to inches.", "source_text": "10'-0\"", "normalization_confidence": "high"}, {"assertion_id": "A22.01#13", "attribute": "width", "original_value": "10'-0\"", "normalized_value": "120", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": "Converted feet and inches to inches.", "source_text": "10'-0\"", "normalization_confidence": "high"}, {"assertion_id": "A22.01#14", "attribute": "fixture_location", "original_value": "MEN'S RESTROOM contains an exhaust fan", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "This is a synthesized assertion based on graphical context.", "source_text": "EXHAUST FAN", "normalization_confidence": "medium"}, {"assertion_id": "A22.01#15", "attribute": "fixture_location", "original_value": "WOMEN'S RESTROOM contains an exhaust fan", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "This is a synthesized assertion based on graphical context.", "source_text": "EXHAUST FAN", "normalization_confidence": "medium"}, {"assertion_id": "A22.01#16", "attribute": "room_name", "original_value": "SALES AREA", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text": "SALES AREA", "normalization_confidence": "high"}, {"assertion_id": "A22.01#18", "attribute": "power_requirement", "original_value": "Power required for building sign", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text": "PROVIDE POWER FOR BUILDING SIGN", "normalization_confidence": "high"}, {"assertion_id": "A22.01#19", "attribute": "power_requirement", "original_value": "Power required for building sign", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text": "PROVIDE POWER FOR BUILDING SIGN", "normalization_confidence": "high"}, {"assertion_id": "A23.01#0", "attribute": "general_note", "original_value": "Interior finishes to comply with IBC Class C or higher; Section 803.9 and Table 803.9 of 2021 IBC.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text": "B. INTERIOR FINISHES TO COMPLY WITH IBC CLASS C OR HIGHER SECTION 803.9 AND TABLE 803.9 OF 2021 IBC.", "normalization_confidence": "high"}, {"assertion_id": "A23.01#1", "attribute": "general_note", "original_value": "All materials used for interior finish and trim shall be classified in accordance with ASTM 834.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text": "C. ALL MATERIALS USED FOR INTERIOR FINISH AND TRIM SHALL BE CLASSIFIED IN ACCORDANCE WITH ASTM 834.", "normalization_confidence": "high"}, {"assertion_id": "A23.01#2", "attribute": "general_note", "original_value": "All floor finishes shall have a min. S.C.O.F. of .6 wet or dry.", "normalized_value": "0.6", "normalized_unit": "SCOF", "normalized_attribute": "minimum_static_coefficient_of_friction", "normalization_notes": "Extracted specific requirement from a general note. Applies to all floor finishes, wet or dry.", "source_text": "F. ALL FLOOR FINISHES SHALL HAVE A MIN. S.C.O.F. OF .6 WET OR DRY.", "normalization_confidence": "high"}, {"assertion_id": "A23.01#3", "attribute": "general_note", "original_value": "All partitions must be fire stopped at the ceiling.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text": "G. ALL PARTITIONS MUST BE FIRE STOPPED AT THE CEILING.", "normalization_confidence": "high"}, {"assertion_id": "A23.01#4", "attribute": "general_note", "original_value": "All locations of core drilling of the floor slab for installation of utilities to be coordinated with landlord's structural engineer before performing the work.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text": "H. ALL LOCATIONS OF CORE DRILLING OF THE FLOOR SLAB FOR INSTALLATION OF UTILITIES TO BE COORDINATED WITH LANDLORD'S STRUCTURAL ENGINEER BEFORE PERFORMING THE WORK.", "normalization_confidence": "high"}, {"assertion_id": "A23.01#5", "attribute": "general_note", "original_value": "Polished concrete floor PC-1 throughout, U.N.O.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "U.N.O. likely stands for 'Unless Noted Otherwise'. PC-1 is a finish tag.", "source_text": "K. POLISHED CONCRETE FLOOR PC-1 THROUGHOUT, U.N.O.", "normalization_confidence": "high"}, {"assertion_id": "A23.01#6", "attribute": "general_note", "original_value": "Walls to be painted P-1 throughout.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "P-1 is a finish tag.", "source_text": "L. WALLS TO BE PAINTED P-1 THROUGHOUT.", "normalization_confidence": "high"}, {"assertion_id": "A23.01#7", "attribute": "general_note", "original_value": "Vinyl base WB-1 throughout, U.N.O.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "U.N.O. likely stands for 'Unless Noted Otherwise'. WB-1 is a finish tag.", "source_text": "M. VINYL BASE WB-1 THROUGHOUT, U.N.O.", "normalization_confidence": "high"}, {"assertion_id": "A23.01#8", "attribute": "general_note", "original_value": "Ceiling throughout entire space to be AT-1 acoustic ceiling tile with C4-A ceiling grid.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "AT-1 and C4-A are material tags.", "source_text": "N. CEILING THROUGHOUT ENTIRE SPACE TO BE AT-1 ACOUSTIC CEILING TILE WITH C4-A CEILING GRID.", "normalization_confidence": "high"}, {"assertion_id": "A23.01#9", "attribute": "general_note", "original_value": "Refer to Plumbing Engineer sheets for plumbing fixture specification.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text": "O. NOTE: REFER TO PLUMBING ENGINEER SHEETS FOR PLUMBING FIXTURE SPECIFICATION.", "normalization_confidence": "high"}, {"assertion_id": "A23.01#10", "attribute": "keynote_assertion", "original_value": "Acoustic Ceiling Tile AT: Armstrong DUNE #1774, 24\" X 24\" X 5/8\", Angled Tegular 15/16\"", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Complex assertion describing a specific product. It contains multiple values including dimensions (24\" X 24\" X 5/8\"), model number, and edge profile.", "source_text": "AT 1 ACOUSTIC CEILING TILE MANUF: ARMSTRONG MODEL: DUNE #1774 COLOR: WHITE SIZE: 24\" X 24\" X 5/8\" EDGE PROFILE: ANGLED TEGULAR 15/16\" LOCATION: THROUGHOUT ENTIRE SPACE", "normalization_confidence": "medium"}] \ No newline at end of file diff --git a/backend/.llm_cache/6b42e7a63706e1f4d35848dbf0cd1d0e05fb08a36a88b00d5c267bee0afe6624.json b/backend/.llm_cache/6b42e7a63706e1f4d35848dbf0cd1d0e05fb08a36a88b00d5c267bee0afe6624.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/6b42e7a63706e1f4d35848dbf0cd1d0e05fb08a36a88b00d5c267bee0afe6624.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/6c05f68ba574bfea115fcda55d08f6582fe606f1304487063fe64523b8c5b1d7.json b/backend/.llm_cache/6c05f68ba574bfea115fcda55d08f6582fe606f1304487063fe64523b8c5b1d7.json new file mode 100644 index 0000000..1a6b194 --- /dev/null +++ b/backend/.llm_cache/6c05f68ba574bfea115fcda55d08f6582fe606f1304487063fe64523b8c5b1d7.json @@ -0,0 +1 @@ +{"normalized_assertions": [{"assertion_id": "A23.01#11", "original_value": "CLASS A", "normalized_value": "A", "normalized_unit": null, "normalized_attribute": "fire_rating_class", "normalization_notes": "Normalized from 'CLASS A'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A23.01#12", "original_value": "Shaw NEXT GEN 2.0, VERIZON STANDARD, 24\" X 24\", ASHLAR STACK PATTERN 50% OFFSET", "normalized_value": "24", "normalized_unit": "inches", "normalized_attribute": "width", "normalization_notes": "Parsed from '24\" X 24\"' in source text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A23.01#12", "original_value": "Shaw NEXT GEN 2.0, VERIZON STANDARD, 24\" X 24\", ASHLAR STACK PATTERN 50% OFFSET", "normalized_value": "24", "normalized_unit": "inches", "normalized_attribute": "height", "normalization_notes": "Parsed from '24\" X 24\"' in source text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A23.01#13", "original_value": "CPT1", "normalized_value": "CPT-1", "normalized_unit": null, "normalized_attribute": "finish_floor_type", "normalization_notes": "Standardized tag format from 'CPT1' (source 'CPT 1').", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A23.01#14", "original_value": "CPT1", "normalized_value": "CPT-1", "normalized_unit": null, "normalized_attribute": "finish_floor_type", "normalization_notes": "Standardized tag format from 'CPT1' (source 'CPT 1').", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A23.01#15", "original_value": "Grade 2 (Medium Exposed), with a Class 1 (Matte) Finish", "normalized_value": "2", "normalized_unit": null, "normalized_attribute": "polished_concrete_grade", "normalization_notes": "Parsed from 'Grade 2 (Medium Exposed)'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A23.01#15", "original_value": "Grade 2 (Medium Exposed), with a Class 1 (Matte) Finish", "normalized_value": "1", "normalized_unit": null, "normalized_attribute": "polished_concrete_class", "normalization_notes": "Parsed from 'Class 1 (Matte) Finish'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A23.01#16", "original_value": "0.50", "normalized_value": "0.50", "normalized_unit": "SCOF", "normalized_attribute": "slip_resistance_scof_min", "normalization_notes": "Unit from source text 'STATIC COEFFICIENT OF FRICTION (SCOF)'. Source specifies 'no less than', so this is a minimum value.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A23.01#17", "original_value": "PC1", "normalized_value": "PC-1", "normalized_unit": null, "normalized_attribute": "finish_floor_type", "normalization_notes": "Standardized tag format from 'PC1' (source 'PC 1').", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#0", "original_value": "Refer to project general notes on sheet G11.01", "normalized_value": "G11.01", "normalized_unit": null, "normalized_attribute": "sheet_reference", "normalization_notes": "Extracted from note.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#1", "original_value": "Installation of all Cellular Sales / Verizon display fixtures shall be performed by a qualified Cellular Sales / Verizon vendor.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "general_note", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "low"}, {"assertion_id": "A24.01#2", "original_value": "Contractor's electrician must be available during installation to install electrical connections as needed.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "general_note", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "low"}, {"assertion_id": "A24.01#3", "original_value": "Position wall mount power transition boxes on back side of wall for accessibility, especially if transition boxes are behind wall fixtures.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "general_note", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "low"}, {"assertion_id": "A24.01#4", "original_value": "Refer to detail 3/A92.01 for foundation pour back detail where existing slab is cut.", "normalized_value": "3/A92.01", "normalized_unit": null, "normalized_attribute": "detail_reference", "normalization_notes": "Extracted from note.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#5", "original_value": "Coordinate with tenant for plywood backing for mounting network rack", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "general_note", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "low"}, {"assertion_id": "A24.01#6", "original_value": "Provide (3) 3\" conduits from network rack to sales ceiling plenum", "normalized_value": "3", "normalized_unit": null, "normalized_attribute": "conduit_quantity", "normalization_notes": "Parsed from '(3) 3\" conduits'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#6", "original_value": "Provide (3) 3\" conduits from network rack to sales ceiling plenum", "normalized_value": "3", "normalized_unit": "inches", "normalized_attribute": "conduit_size", "normalization_notes": "Parsed from '(3) 3\" conduits'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#7", "original_value": "(2) 20A, OUTLETS AT 60\" A.F.F.", "normalized_value": "2", "normalized_unit": null, "normalized_attribute": "outlet_quantity", "normalization_notes": "Parsed from '(2) 20A, OUTLETS...'", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#7", "original_value": "(2) 20A, OUTLETS AT 60\" A.F.F.", "normalized_value": "20", "normalized_unit": "A", "normalized_attribute": "outlet_amperage", "normalization_notes": "Parsed from '(2) 20A, OUTLETS...'", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#7", "original_value": "(2) 20A, OUTLETS AT 60\" A.F.F.", "normalized_value": "60", "normalized_unit": "inches", "normalized_attribute": "outlet_mounting_height", "normalization_notes": "Parsed from '60\" A.F.F.'. A.F.F. means Above Finished Floor.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#8", "original_value": "(1) 10 GAUGE GROUND BLOCK WITH GROUND WIRE CONNECTED TO THE PANEL GROUND (REQUIRED FOR WARRANTY)", "normalized_value": "1", "normalized_unit": null, "normalized_attribute": "ground_block_quantity", "normalization_notes": "Parsed from '(1) 10 GAUGE GROUND BLOCK...'", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#8", "original_value": "(1) 10 GAUGE GROUND BLOCK WITH GROUND WIRE CONNECTED TO THE PANEL GROUND (REQUIRED FOR WARRANTY)", "normalized_value": "10", "normalized_unit": "gauge", "normalized_attribute": "ground_wire_gauge", "normalization_notes": "Parsed from '(1) 10 GAUGE GROUND BLOCK...'", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#9", "original_value": "RACK SYSTEM", "normalized_value": "RACK SYSTEM", "normalized_unit": null, "normalized_attribute": "equipment_location", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#10", "original_value": "~74", "normalized_value": "74", "normalized_unit": "inches", "normalized_attribute": "equipment_elevation", "normalization_notes": "Unit 'inches' from source text '74\"'. The '~' indicates the value is approximate. Refers to bottom of rack system.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#11", "original_value": "EXISTING FIRE RISER ROOM", "normalized_value": "EXISTING FIRE RISER ROOM", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#12", "original_value": "CORRIDOR", "normalized_value": "CORRIDOR", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#13", "original_value": "INVENTORY", "normalized_value": "INVENTORY", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#14", "original_value": "MEN'S RESTROOM", "normalized_value": "MEN'S RESTROOM", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#15", "original_value": "WOMEN'S RESTROOM", "normalized_value": "WOMEN'S RESTROOM", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#16", "original_value": "MANAGER'S OFFICE", "normalized_value": "MANAGER'S OFFICE", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#17", "original_value": "CLEANING SUPPLIES/STORAGE", "normalized_value": "CLEANING SUPPLIES/STORAGE", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#18", "original_value": "SALES AREA", "normalized_value": "SALES AREA", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#19", "original_value": "14'-2 1/8\"", "normalized_value": "170.125", "normalized_unit": "inches", "normalized_attribute": "dimension", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A25.01#0", "original_value": "ROOF PLAN IS FOR REFERENCE ONLY. CONTRACTORS ARE TO VERIFY EXISTING CONDITIONS (DIMENSIONS, CLEARANCES, STRUCTURE TYPE, ETC.) IN THE FIELD.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "text_content", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "low"}, {"assertion_id": "A25.01#1", "original_value": "CONTRACTOR TO REFER TO MECHANICAL DRAWINGS FOR ALL ROOFTOP UNIT REQUIREMENTS, DETAILS, AND SPECIFICATIONS.", "normalized_value": "MECHANICAL", "normalized_unit": null, "normalized_attribute": "drawing_reference", "normalization_notes": "Refers to Mechanical drawings.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A25.01#2", "original_value": "CONTRACTORS SHALL VERIFY LOCATIONS OF EXISTING SYSTEMS AND OPENINGS; SUCH AS EXISTING RTU'S, ROOF VENTS, HVAC, ROOF ACCESS, AND OTHER PENETRATIONS. VERIFY COORDINATIONS REQUIRED BETWEEN EXISTING PENETRATIONS AND EQUIPMENT WITH NEW.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "text_content", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "low"}, {"assertion_id": "A25.01#3", "original_value": "REPAIR AND SEAL ROOF IF REQUIRED AROUND ALL NEW PENETRATIONS AND EQUIPMENT, PER MANUFACTURER'S RECOMMENDATIONS.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "text_content", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "low"}, {"assertion_id": "A25.01#4", "original_value": "NEW RTU, PROVIDE NEW MECHANICAL ROOF CURBS AS NECESSARY TO ACCOMODATE NEW RTU. GC TO INSTALL FLASHING PER PER ROOFING MANUFACTURING STANDARDS. GC SHALL COORDINATE ROOF WORK WITH LL REQUIREMENTS TO MAINTAIN EXISTING ROOFING WARRANTY. REFER TO MEP DRAWINGS FOR MORE INFORMATION.", "normalized_value": "MEP", "normalized_unit": null, "normalized_attribute": "drawing_reference", "normalization_notes": "Refers to MEP drawings.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A25.01#5", "original_value": "2", "normalized_value": "2", "normalized_unit": null, "normalized_attribute": "new_equipment_count", "normalization_notes": "Source text refers to '2 NEW RTU'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A25.01#6", "original_value": "6'-9\"", "normalized_value": "81", "normalized_unit": "inches", "normalized_attribute": "clearance", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A25.01#7", "original_value": "3'-3 1/4\"", "normalized_value": "39.25", "normalized_unit": "inches", "normalized_attribute": "clearance", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A25.01#8", "original_value": "ROOF CURB DETAIL", "normalized_value": "ROOF CURB DETAIL", "normalized_unit": null, "normalized_attribute": "detail_title", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A25.01#9", "original_value": "6\" = 1'-0\"", "normalized_value": "1:2", "normalized_unit": null, "normalized_attribute": "scale_ratio", "normalization_notes": "Normalized from 6 inches = 12 inches.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A25.01#10", "original_value": "Prefabricated Metal Curb", "normalized_value": "Prefabricated Metal Curb", "normalized_unit": null, "normalized_attribute": "component", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A25.01#11", "original_value": "2X4 WOOD NAILER", "normalized_value": "2", "normalized_unit": "inches", "normalized_attribute": "component_nominal_dimension_1", "normalization_notes": "Parsed from '2X4'. These are nominal dimensions.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A25.01#11", "original_value": "2X4 WOOD NAILER", "normalized_value": "4", "normalized_unit": "inches", "normalized_attribute": "component_nominal_dimension_2", "normalization_notes": "Parsed from '2X4'. These are nominal dimensions.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A25.01#12", "original_value": "12", "normalized_value": "12", "normalized_unit": "inches", "normalized_attribute": "fastener_spacing_on_center", "normalization_notes": "Unit 'inches' and 'on_center' context from '12\" (304 MM) O.C.' in source text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A25.01#13", "original_value": "TPO MEMBRANE ADHERED OR MECHANICALLY FASTENED", "normalized_value": "TPO MEMBRANE ADHERED OR MECHANICALLY FASTENED", "normalized_unit": null, "normalized_attribute": "component", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A25.01#14", "original_value": "1 1/2", "normalized_value": "1.5", "normalized_unit": "inches", "normalized_attribute": "weld_size_min", "normalization_notes": "Unit 'inches' and 'MIN.' from '1 1/2\" (38 MM) MIN. WELD' in source text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A25.01#15", "original_value": "WOOD NAILER INSTALLED TO MEET APPLICABLE BUILDING CODES", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "general_note", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "low"}, {"assertion_id": "A25.01#16", "original_value": "COUNTERFLASHING SKIRT", "normalized_value": "COUNTERFLASHING SKIRT", "normalized_unit": null, "normalized_attribute": "component", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#0", "original_value": "MEN'S RESTROOM", "normalized_value": "MEN'S RESTROOM", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#1", "original_value": "103", "normalized_value": "103", "normalized_unit": null, "normalized_attribute": "room_number", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#2", "original_value": "WOMEN'S / RESTROOM", "normalized_value": "WOMEN'S RESTROOM", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": "Removed extraneous '/' character.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "A51.01#3", "original_value": "102", "normalized_value": "102", "normalized_unit": null, "normalized_attribute": "room_number", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#4", "original_value": "WC-1", "normalized_value": "WC-1", "normalized_unit": null, "normalized_attribute": "fixture_location", "normalization_notes": "Value is a standard tag.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#5", "original_value": "WC-1", "normalized_value": "WC-1", "normalized_unit": null, "normalized_attribute": "fixture_location", "normalization_notes": "Value is a standard tag.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#6", "original_value": "L-1", "normalized_value": "L-1", "normalized_unit": null, "normalized_attribute": "fixture_location", "normalization_notes": "Value is a standard tag.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#7", "original_value": "L-1", "normalized_value": "L-1", "normalized_unit": null, "normalized_attribute": "fixture_location", "normalization_notes": "Value is a standard tag.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#8", "original_value": "EDF-1", "normalized_value": "EDF-1", "normalized_unit": null, "normalized_attribute": "equipment_location", "normalization_notes": "Value is a standard tag.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#9", "original_value": "G11.02", "normalized_value": "G11.02", "normalized_unit": null, "normalized_attribute": "sheet_reference", "normalization_notes": "Extracted from '(SEE G11.02)' in source text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#10", "original_value": "2'-10\"", "normalized_value": "34", "normalized_unit": "inches", "normalized_attribute": "mounting_height_max", "normalization_notes": "'MAX.' from source text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#11", "original_value": "2'-5\"", "normalized_value": "29", "normalized_unit": "inches", "normalized_attribute": "knee_clearance_min", "normalization_notes": "'MIN.' and 'KNEE CLEARANCE' from source text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#12", "original_value": "6\"", "normalized_value": "6", "normalized_unit": "inches", "normalized_attribute": "toe_clearance_max", "normalization_notes": "'MAX.' and 'TOE CLEAR' from source text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#13", "original_value": "3'-4\"", "normalized_value": "40", "normalized_unit": "inches", "normalized_attribute": "mounting_height_max", "normalization_notes": "'MAX. TO BOTTOM OF REFLECTIVE SURFACE' from source text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#14", "original_value": "1'-5\"", "normalized_value": "17", "normalized_unit": "inches", "normalized_attribute": "clearance_min", "normalization_notes": "'MIN.' from source text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#15", "original_value": "4'-0\"", "normalized_value": "48", "normalized_unit": "inches", "normalized_attribute": "wainscot_height", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}]} \ No newline at end of file diff --git a/backend/.llm_cache/6ce8dd3c7ac41789ab26615cf83505a4c2088ab3abd9dbce2f0cbe84cd265deb.json b/backend/.llm_cache/6ce8dd3c7ac41789ab26615cf83505a4c2088ab3abd9dbce2f0cbe84cd265deb.json new file mode 100644 index 0000000..ad0a2be --- /dev/null +++ b/backend/.llm_cache/6ce8dd3c7ac41789ab26615cf83505a4c2088ab3abd9dbce2f0cbe84cd265deb.json @@ -0,0 +1 @@ +{"issues": [{"issue_id": "8930a845-d8ca-4c9f-b70c-25e173e6583d", "source_stage": "code", "category": "building_code", "severity": "high", "confidence": "high", "location": "General Notes on Electrical Sheets", "disciplines": ["Electrical", "Architectural"], "sheets": ["E01.01", "E01.02", "E03.01"], "description": "The electrical drawings repeatedly reference the 2021 IBC and 2021 IECC for compliance, but the project's adopted codes are the 2018 IBC and 2018 IECC according to the project profile. This creates a direct conflict regarding the basis of design and applicable codes for the project.", "evidence": [{"discipline": "Electrical", "sheet": "E01.01", "source_text": "CONTRACTOR SHALL CONFORM TO ALL LOCAL, STATE, AND APPLICABLE CODES, 2023 NEC, 2021 IBC, 2021 IECC, NFPA, ETC., AND ALL OTHER LOCAL CODES AND AMENDMENTS WHERE THERE ARE CONFLICTS BETWEEN CODES, STANDARDS AND DRAWINGS AND SPECIFICATIONS ARISE, THE MORE STRINGENT SHALL APPLY.", "asserted_value": "2021 IBC, 2021 IECC"}, {"discipline": "Electrical", "sheet": "E01.02", "source_text": "1. PROVIDE LOW-VOLTAGE DRY-TYPE TRANSFORMERS THAT MEET THE MINIMUM EFFICIENCY REQUIREMENTS OF 2021 IECC TABLE C405.8.", "asserted_value": "2021 IECC"}, {"discipline": "Electrical", "sheet": "E03.01", "source_text": "ELECTRICAL GENERAL NOTES: 3. ALL LIGHTING SYSTEMS SHALL BE TESTED TO ENSURE PROPER CALIBRATION, ADJUSTMENT, PROGRAMMING, AND OPERATION IN ACCORDANCE WITH IECC 2021 SECTION C408.3.", "asserted_value": "{\"code\": \"IECC\", \"year\": \"2021\", \"section\": \"C408.3\"}"}], "recommended_resolution": "Revise all notes on the electrical drawings to reference the correct, adopted code editions for the project (2018 IBC and 2018 IECC) as specified in the project profile. Confirm the correct basis of design with the authority having jurisdiction.", "code_reference": null}, {"issue_id": "3be54a6c-d232-47d9-93e5-de219800742f", "source_stage": "code", "category": "ada", "severity": "high", "confidence": "high", "location": "Sales Area", "disciplines": ["Electrical", "Architectural", "Interiors"], "sheets": ["E01.02", "E03.01"], "description": "Pendant light fixtures (Types L-5 and L-6) are scheduled to be mounted at 5'-5\" (65 inches) above the finished floor. If these fixtures are located within circulation paths, such as the Sales Area where they appear on plan E03.01, this mounting height would create a head-height obstruction. Accessible routes require a minimum vertical clearance of 80 inches.", "evidence": [{"discipline": "Electrical", "sheet": "E01.02", "source_text": "TYPE: L-5, DESCRIPTION: 12\" PENDANT, MOUNTING: PENDANT, NOTES: PENDANT 5'-5\" AFF", "asserted_value": "65"}, {"discipline": "Electrical", "sheet": "E01.02", "source_text": "TYPE: L-6, DESCRIPTION: 16\" PENDANT, MOUNTING: PENDANT, NOTES: PENDANT 5'-5\" AFF", "asserted_value": "65"}], "recommended_resolution": "Verify the location of all L-5 and L-6 pendant fixtures on the Lighting Plan (E03.01). Raise the mounting height of any fixtures located within circulation paths to provide at least 80 inches of vertical clearance, or relocate the fixtures outside of circulation paths.", "code_reference": null}, {"issue_id": "4e7232e0-27b0-4f51-b05c-3f2d2aa80d23", "source_stage": "code", "category": "ada", "severity": "medium", "confidence": "high", "location": "Sales Area", "disciplines": ["Electrical", "Architectural"], "sheets": ["E03.01"], "description": "A keyed note on the lighting plan specifies a dimmer switch but defers its final placement by stating 'Coordinate final location with owner prior to rough-in'. Light switches are operable parts that must comply with ADA accessibility standards for location, height, and operation. Deferring this decision without providing mandatory compliance parameters creates a risk of a non-compliant installation.", "evidence": [{"discipline": "Electrical", "sheet": "E03.01", "source_text": "ELECTRICAL KEYED NOTES: 1 PROVIDE DIMMER SWITCH FOR CONTROL OF SALES AREA LIGHTING. COORDINATE FINAL LOCATION WITH OWNER PRIOR TO ROUGH-IN.", "asserted_value": "Coordinate final location with owner prior to rough-in."}], "recommended_resolution": "Specify the exact mounting location and height for the dimmer switch on the drawings to ensure it complies with ADA and TAS requirements for operable parts, including accessible reach ranges (typically 48 inches maximum height) and clear floor space. Do not defer this code-required information to field coordination without parameters.", "code_reference": "ADA 205.1"}]} \ No newline at end of file diff --git a/backend/.llm_cache/721c2f124ed75ad637983ce8e425244380bb9fa61cf0fa0b025241c6607d1796.json b/backend/.llm_cache/721c2f124ed75ad637983ce8e425244380bb9fa61cf0fa0b025241c6607d1796.json new file mode 100644 index 0000000..0f9764c --- /dev/null +++ b/backend/.llm_cache/721c2f124ed75ad637983ce8e425244380bb9fa61cf0fa0b025241c6607d1796.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "scope_description_mismatch", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "General Project Notes", "disciplines": ["General"], "sheets": ["G11.04", "G21.01"], "description": "The project scope is described inconsistently across drawing sheets. Sheet G11.04 describes the project as a 'build out for a first generation retail space', which implies construction in a new, unfinished shell. Sheet G21.01 describes it as a 'remodel', which implies alteration of an existing, previously finished space. This discrepancy must be clarified as it impacts the understanding of existing conditions, demolition scope, and overall project cost and schedule.", "evidence": [{"discipline": "General", "sheet": "G11.04", "source_text": "PROJECT IS A TENANT INTERIOR LEASE SPACE BUILD OUT FOR A FIRST GENERATION RETAIL SPACE.", "asserted_value": "Build-out of first-generation space"}, {"discipline": "General", "sheet": "G21.01", "source_text": "PROJECT IS A TENANT INTERIOR REMODEL OF 3,323 SF", "asserted_value": "Remodel"}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/72d0da67995823841c6d605708c3a5902eb902befa2a7e8e30378d6e8048f753.json b/backend/.llm_cache/72d0da67995823841c6d605708c3a5902eb902befa2a7e8e30378d6e8048f753.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/72d0da67995823841c6d605708c3a5902eb902befa2a7e8e30378d6e8048f753.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/72e4fca2cb73aadb7d4dda04526d06a7821983291632155705880f8a4a177517.json b/backend/.llm_cache/72e4fca2cb73aadb7d4dda04526d06a7821983291632155705880f8a4a177517.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/72e4fca2cb73aadb7d4dda04526d06a7821983291632155705880f8a4a177517.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/733ba8263f08d2d9523e74558798e6ff595e89c907ea1e82f4535f8ee5e2e52e.json b/backend/.llm_cache/733ba8263f08d2d9523e74558798e6ff595e89c907ea1e82f4535f8ee5e2e52e.json new file mode 100644 index 0000000..ca3957a --- /dev/null +++ b/backend/.llm_cache/733ba8263f08d2d9523e74558798e6ff595e89c907ea1e82f4535f8ee5e2e52e.json @@ -0,0 +1 @@ +{"issues": [{"issue_id": "VZN_CYP_001", "source_stage": "code", "category": "ada_review", "severity": "high", "confidence": "high", "location": "Men's Restroom (103) and Women's Restroom (102)", "disciplines": ["Architectural"], "sheets": ["A51.01"], "description": "The doors to the single-user restrooms swing into the clear floor space required for the lavatory (L-1). This is not permitted unless specific conditions are met.", "evidence": [{"discipline": "Architectural", "sheet": "A51.01", "source_text": "WOMEN'S / RESTROOM, PLAN 1/2\" = 1'-0\"", "asserted_value": "Door swings into lavatory clear floor space"}, {"discipline": "Architectural", "sheet": "A51.01", "source_text": "MEN'S RESTROOM, PLAN 1/2\" = 1'-0\"", "asserted_value": "Door swings into lavatory clear floor space"}], "recommended_resolution": "Verify that a clear floor space of at least 30 inches by 48 inches is provided within the restroom, beyond the arc of the door swing, to meet Exception 2 of ADA 603.2.3. If this space is not available, the door swing must be reversed or the layout reconfigured so the door does not swing into any fixture's required clear floor space.", "code_reference": "ADA 603.2.3"}, {"issue_id": "VZN_CYP_002", "source_stage": "code", "category": "ada_review", "severity": "medium", "confidence": "high", "location": "Lounge", "disciplines": ["Architectural"], "sheets": ["A51.01"], "description": "The employee lounge sink is shown with a standard cabinet underneath, which likely does not provide the required knee and toe clearance for a forward approach.", "evidence": [{"discipline": "Architectural", "sheet": "A51.01", "source_text": "3'-0\"", "asserted_value": "36"}], "recommended_resolution": "Confirm the approach type for the lounge sink. If a forward approach is required, revise the cabinetry detail to provide knee and toe clearance compliant with ADA 306. Alternatively, confirm if a parallel approach is acceptable per ADA 606.2 Exception 1 (e.g., if it's considered a wet bar) and ensure clear floor space for a parallel approach is provided.", "code_reference": "ADA 606.2"}, {"issue_id": "VZN_CYP_003", "source_stage": "code", "category": "ada_review", "severity": "medium", "confidence": "high", "location": "Inventory Room", "disciplines": ["Architectural", "Electrical"], "sheets": ["A24.01"], "description": "Electrical outlets in the Inventory room are specified to be mounted at 60 inches above the finished floor, which exceeds the 48-inch maximum high reach range for accessible operable parts.", "evidence": [{"discipline": "Architectural", "sheet": "A24.01", "source_text": "(2) 20A, OUTLETS AT 60\" A.F.F.", "asserted_value": "60"}], "recommended_resolution": "Relocate the outlets to a height within the accessible reach range (typically 15\" min to 48\" max AFF). If the outlets serve a dedicated use and are not for general use, add a note to clarify this and confirm the exception in ADA 205.1 applies.", "code_reference": "ADA 205.1"}, {"issue_id": "VZN_CYP_004", "source_stage": "code", "category": "tas_tdlr", "severity": "medium", "confidence": "medium", "location": "Sales Area", "disciplines": ["Architectural", "Interiors"], "sheets": ["A22.01"], "description": "Pendant lights (L-6) in the Sales Area are noted to be mounted at 5'-5\" (65 inches) AFF. If these fixtures are located above a circulation path, they would be a head-height obstruction, violating the 80-inch minimum headroom clearance requirement.", "evidence": [{"discipline": "Architectural", "sheet": "A22.01", "source_text": "PENDANT 5'-5\" AFF", "asserted_value": "65"}], "recommended_resolution": "Verify the location of pendant light fixtures L-6 on the floor plan. Ensure they are not located in circulation paths or, if they are, raise the mounting height to provide at least 80 inches of clear headroom from the floor to the bottom of the fixture.", "code_reference": null}, {"issue_id": "VZN_CYP_005", "source_stage": "code", "category": "ada_review", "severity": "medium", "confidence": "high", "location": "Typical Restroom Details", "disciplines": ["Architectural"], "sheets": ["A51.01"], "description": "The typical rear grab bar is dimensioned as 3'-4\" (40 inches) long. A 40-inch bar may not comply with the requirement for the bar to extend at least 12 inches on one side and 24 inches on the other side of the water closet centerline.", "evidence": [{"discipline": "Architectural", "sheet": "A51.01", "source_text": "3'-4\"", "asserted_value": "40"}], "recommended_resolution": "Verify the rear grab bar dimensions and placement relative to the water closet centerline. The standard requires the bar to be a minimum of 36 inches long and extend from the centerline a minimum of 12 inches on one side and 24 inches on the other. A 36-inch or 42-inch bar is typical. The 40-inch dimension should be reviewed and corrected if it does not meet placement requirements.", "code_reference": "ADA 604.5"}, {"issue_id": "VZN_CYP_006", "source_stage": "code", "category": "building_code", "severity": "low", "confidence": "high", "location": "General Notes", "disciplines": ["Architectural"], "sheets": ["A23.01"], "description": "General note on the Finish Plan incorrectly references the 2021 IBC for interior finish compliance. The project's adopted code is the 2015 IBC.", "evidence": [{"discipline": "Architectural", "sheet": "A23.01", "source_text": "B. INTERIOR FINISHES TO COMPLY WITH IBC CLASS C OR HIGHER SECTION 803.9 AND TABLE 803.9 OF 2021 IBC.", "asserted_value": "2021 IBC"}], "recommended_resolution": "Revise the general note to reference the correct adopted code, the 2015 International Building Code (IBC).", "code_reference": null}, {"issue_id": "VZN_CYP_007", "source_stage": "code", "category": "ada_review", "severity": "low", "confidence": "high", "location": "General Notes and Finish Specifications", "disciplines": ["Architectural"], "sheets": ["A23.01"], "description": "The drawing contains conflicting requirements for floor slip resistance. General Note F requires a minimum Static Coefficient of Friction (SCOF) of 0.6, while the Polished Concrete (PC-1) specification requires a minimum SCOF of 0.50.", "evidence": [{"discipline": "Architectural", "sheet": "A23.01", "source_text": "F. ALL FLOOR FINISHES SHALL HAVE A MIN. S.C.O.F. OF .6 WET OR DRY.", "asserted_value": "0.6"}, {"discipline": "Architectural", "sheet": "A23.01", "source_text": "SLIP RESISTANCE OF FLOOR TO BE NO LESS THAN A 0.50 STATIC COEFFICIENT OF FRICTION (SCOF)", "asserted_value": "0.5"}], "recommended_resolution": "Clarify and consolidate the floor slip resistance requirement. Resolve the conflict between the 0.6 and 0.5 SCOF values. Consider specifying compliance with current industry standards, such as ANSI A326.3 for Dynamic Coefficient of Friction (DCOF), as SCOF is an outdated metric.", "code_reference": null}, {"issue_id": "VZN_CYP_008", "source_stage": "code", "category": "ada_review", "severity": "low", "confidence": "high", "location": "Areas with Carpet Tile (CPT 1)", "disciplines": ["Architectural", "Interiors"], "sheets": ["A23.01"], "description": "The specification for Carpet Tile (CPT 1) does not include the pile height. To be accessible, carpet pile height must not exceed 1/2 inch.", "evidence": [{"discipline": "Architectural", "sheet": "A23.01", "source_text": "CPT 1 CARPET TILE MANUF: SHAW PRODUCT: NEXT GEN 2.0, VERIZON STANDARD STYLE: 42JCP SIZE: 24\" X 24\" INSTALLATION: ASHLAR STACK PATTERN 50% OFFSET", "asserted_value": "Carpet tile spec missing pile height"}], "recommended_resolution": "Update the carpet tile specification to include the pile height and confirm it is 1/2 inch maximum to comply with ADA requirements.", "code_reference": "ADA 302.2"}, {"issue_id": "VZN_CYP_009", "source_stage": "code", "category": "other", "severity": "medium", "confidence": "high", "location": "Typical Restroom Details", "disciplines": ["Architectural"], "sheets": ["A51.01"], "description": "The lavatory detail shows conflicting dimensions for toe clearance, calling out both '9\" MIN. TOE CLEAR' and '6\" MAX. TOE CLEAR'. These notes are contradictory and do not clearly define the required clearances.", "evidence": [{"discipline": "Architectural", "sheet": "A51.01", "source_text": "9\" MIN. TOE CLEAR", "asserted_value": "9"}, {"discipline": "Architectural", "sheet": "A51.01", "source_text": "6\" MAX. TOE CLEAR", "asserted_value": "6"}], "recommended_resolution": "Revise the lavatory detail to remove the conflicting notes and provide clear, accurate dimensions for knee and toe clearance that comply with ADA Figure 306. For example, clarify that toe clearance must be 9 inches high minimum.", "code_reference": "ADA 606.2"}]} \ No newline at end of file diff --git a/backend/.llm_cache/7362425b747d8ed60044c1f51358fb13e2f42cbd136bf506b86fbd63f8d3953a.json b/backend/.llm_cache/7362425b747d8ed60044c1f51358fb13e2f42cbd136bf506b86fbd63f8d3953a.json new file mode 100644 index 0000000..7521287 --- /dev/null +++ b/backend/.llm_cache/7362425b747d8ed60044c1f51358fb13e2f42cbd136bf506b86fbd63f8d3953a.json @@ -0,0 +1 @@ +{"sheet_number": "E01.01", "discipline": "Electrical", "sheet_title": "NOTES AND LEGEND", "level": null, "scale": null, "assertions": [{"subject": "Governing Codes", "attribute": "general_note", "value": "2023 NEC, 2021 IBC, 2021 IECC, NFPA, ETC.", "source_text": "CONTRACTOR SHALL CONFORM TO ALL LOCAL, STATE, AND APPLICABLE CODES, 2023 NEC, 2021 IBC, 2021 IECC, NFPA, ETC., AND ALL OTHER LOCAL CODES AND AMENDMENTS WHERE THERE ARE CONFLICTS BETWEEN CODES, STANDARDS AND DRAWINGS AND SPECIFICATIONS ARISE, THE MORE STRINGENT SHALL APPLY.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "All Products", "attribute": "material_rating", "value": "25/50 Flame and Smoke hazard ratings per ASTM E-84, NFPA 255 and UL 723", "source_text": "ALL PRODUCTS SHALL COMPLY WITH 25/50 FLAME AND SMOKE HAZARD RATINGS PER ASTM E-84, NFPA 255 AND UL 723.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Penetrations", "attribute": "penetration_sealing", "value": "Penetrations between non-conditioned and conditioned spaces shall be sealed", "source_text": "CONNECTIONS PENETRATIONS BETWEEN NON-CONDITIONED AND CONDITIONED SPACES SHALL BE SEALED TO ELIMINATE MOISTURE INFILTRATION.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Electrical Equipment", "attribute": "housekeeping_pad_dimensions", "value": "Min 4\" high pad that extends a min of 4\" around the equipment", "source_text": "ALL ELECTRICAL EQUIPMENT SHALL BE PROVIDED WITH A MIN. 4\" HOUSEKEEPING PAD THAT EXTENDS A MINIMUM OF 4\" ALL THE WAY AROUND THE EQUIPMENT.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}]} \ No newline at end of file diff --git a/backend/.llm_cache/73793cd0af913c3b697e43a0fffe3d19b049702bc07a50f0d0d1b154257a9a97.json b/backend/.llm_cache/73793cd0af913c3b697e43a0fffe3d19b049702bc07a50f0d0d1b154257a9a97.json new file mode 100644 index 0000000..f9bbd16 --- /dev/null +++ b/backend/.llm_cache/73793cd0af913c3b697e43a0fffe3d19b049702bc07a50f0d0d1b154257a9a97.json @@ -0,0 +1 @@ +{"sheet_number": null, "discipline": "Unknown", "sheet_title": "Page 22 (extraction failed)", "level": null, "scale": null, "assertions": []} \ No newline at end of file diff --git a/backend/.llm_cache/739f477f970b30b5942d9be25075d797488bb6535f1a3dbb44209a3585872d94.json b/backend/.llm_cache/739f477f970b30b5942d9be25075d797488bb6535f1a3dbb44209a3585872d94.json new file mode 100644 index 0000000..9e9344c --- /dev/null +++ b/backend/.llm_cache/739f477f970b30b5942d9be25075d797488bb6535f1a3dbb44209a3585872d94.json @@ -0,0 +1 @@ +{"sheet_number": "G01.01", "discipline": "General", "sheet_title": "COVER SHEET", "level": null, "scale": null, "assertions": [{"subject": "Project", "attribute": "project_name", "value": "VERIZON ELYSON", "source_text": "VERIZON ELYSON", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Project", "attribute": "project_address", "value": "7022 ELYSON EXCHANGE WAY CYPRESS, TX 77433", "source_text": "7022 ELYSON EXCHANGE WAY\nCYPRESS, TX 77433", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Project", "attribute": "consultant_info", "value": "OWNER: CK WARWICK GROUP, LLC, CHRIS WARCWICK, P: 214-906-0048", "source_text": "OWNER:\nCK WARWICK GROUP, LLC\nCHRIS WARCWICK\nP: 214-906-0048", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Project", "attribute": "consultant_info", "value": "ARCHITECT: ESTUDIO, PROJECT MANAGER KELLY BARNETT, 1824 SPRING STREET, SUITE 100 HOUSTON, TEXAS 77007, P: 713-433-5000", "source_text": "ARCHITECT:\nESTUDIO\nPROJECT MANAGER\nKELLY BARNETT\n1824 SPRING STREET, SUITE 100\nHOUSTON, TEXAS 77007\nP: 713-433-5000", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Project", "attribute": "consultant_info", "value": "MEP: POWERS INDUSTRY, KAMIL BEY, 5718 WESTHEIMER RD SUITE 1000 HOUSTON, TX 77057, P: 1-(713) 560-1418", "source_text": "MEP:\nPOWERS INDUSTRY\nKAMIL BEY\n5718 WESTHEIMER RD\nSUITE 1000\nHOUSTON, TX 77057\nP: 1-(713) 560-1418", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Project", "attribute": "project_number", "value": "00.000.00", "source_text": "Project number 00.000.00", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Drawing Set", "attribute": "issuance_status", "value": "CLIENT REVIEW", "source_text": "Issue Description\nCLIENT REVIEW", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Drawing Set", "attribute": "issuance_date", "value": "2026-06-18", "source_text": "YYYY-MM-DD\n2026-06-18", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Signage", "attribute": "signage_text", "value": "verizon", "source_text": "verizon", "confidence": "high", "location_key": {"grid": null, "room": "Exterior", "level": null, "tag": null}}, {"subject": "Drawing Set", "attribute": "general_note", "value": "Copyright @ eStudio Architecture 2026.", "source_text": "Copyright @ eStudio Architecture 2026.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}]} \ No newline at end of file diff --git a/backend/.llm_cache/7511a9940d17fad2588299574364126e938a68a61af560c152709f244a8febc1.json b/backend/.llm_cache/7511a9940d17fad2588299574364126e938a68a61af560c152709f244a8febc1.json new file mode 100644 index 0000000..b25ef99 --- /dev/null +++ b/backend/.llm_cache/7511a9940d17fad2588299574364126e938a68a61af560c152709f244a8febc1.json @@ -0,0 +1 @@ +{"rfi_comments": [{"rfi_id": "RFI-001", "issue_id": "juris-01", "title": "Project Jurisdiction Conflict", "question": "Please clarify the correct project jurisdiction (Harris County, TX vs. San Diego, CA) and confirm the applicable building codes, accessibility standards, and review paths. This is critical for a valid code review.", "background": "The project's code profile lists the jurisdiction as San Diego, CA, with Texas Accessibility Standards (TAS) review disabled. However, sheet G21.01 explicitly states the Authority Having Jurisdiction is Harris County, TX, and the applicable accessibility standard is the 2012 Texas Accessibility Standards. This discrepancy creates a conflict between California and Texas codes, making a correct code review impossible.", "sheets_referenced": ["G21.01"], "disciplines_to_respond": ["General", "Architectural"], "suggested_response_needed": "Confirm the correct project jurisdiction and update the code profile accordingly.", "priority": "high"}, {"rfi_id": "RFI-002", "issue_id": "JURISDICTION-CONFLICT-001", "title": "Project Location and Jurisdiction Discrepancy", "question": "Please confirm the correct project jurisdiction (City of San Diego, CA or Cypress, TX) and revise all code references, accessibility standards, and address information throughout the drawing set accordingly.", "background": "The code profile indicates the project is in San Diego, CA, while sheet A11.01 states the address is in Cypress, TX. This discrepancy affects all applicable building, fire, and accessibility codes (e.g., California Building Code vs. IBC/Texas state amendments, California accessibility standards vs. Texas Accessibility Standards/ADA).", "sheets_referenced": ["G11.01", "A11.01"], "disciplines_to_respond": ["General", "Architectural"], "suggested_response_needed": "The Architect of Record must confirm the correct project jurisdiction and revise all code references and address information accordingly.", "priority": "high"}, {"rfi_id": "RFI-003", "issue_id": "pendant_headroom_clearance", "title": "Pendant Light Fixture Headroom Clearance", "question": "Verify the location of pendant fixtures L-5 and L-6. If they are located above circulation paths, revise the mounting height to provide at least 80 inches of clear headroom to the lowest point of the fixture. Alternatively, relocate the fixtures to be directly over furniture or other elements not part of a circulation path.", "background": "Pendant light fixtures L-5 and L-6 are specified to be mounted at 5'-5\" (65 inches) above the finished floor. These fixtures appear to be located in the open 'Sales Area' on the lighting plan. The standard required head clearance for accessible circulation paths is 80 inches minimum. A 65-inch mounting height creates a significant overhead obstruction and collision hazard.", "sheets_referenced": ["E01.02", "E03.01"], "disciplines_to_respond": ["Electrical", "Architectural"], "suggested_response_needed": "Confirm the location of the fixtures and adjust mounting height or relocation as needed.", "priority": "high"}, {"rfi_id": "RFI-004", "issue_id": "VZE-CA-SD-002", "title": "Vent Through Roof (VTR) Proximity to Outdoor Air Intake", "question": "Relocate the 10\" VTR and/or the RTU-1 outdoor air intake to ensure they are separated by a minimum of 10 feet, as required by the International Mechanical Code (typically Section 501.3.1 or similar).", "background": "The Mechanical Roof Plan shows a 10\" vent through roof (VTR), likely a plumbing vent, located within the 10-foot minimum separation radius required from the outdoor air intake (economizer hood) of RTU-1. This proximity can introduce noxious fumes or sewer gas into the building's ventilation system.", "sheets_referenced": ["M02.02"], "disciplines_to_respond": ["Mechanical", "Plumbing"], "suggested_response_needed": "Relocate the VTR or RTU-1 outdoor air intake to meet the 10-foot separation requirement.", "priority": "high"}, {"rfi_id": "RFI-005", "issue_id": "verizon_elyson_wc_stall_depth_coordination", "title": "Toilet Compartment Depth for Floor-Mounted Water Closet", "question": "Verify that the architectural plans show that the wheelchair accessible compartments provide a minimum clear interior depth of 59 inches to accommodate the specified floor-mounted water closet. If this dimension is not met, either revise the architectural plans or change the plumbing fixture to a wall-hung model and confirm the stall depth is at least 56 inches.", "background": "Plumbing fixture WC-1 is specified as a 'FLOOR MOUNTED' model. According to ADA 604.8.1.1, wheelchair accessible compartments with floor-mounted water closets require a minimum depth of 59 inches. This is 3 inches deeper than the requirement for a wall-hung model (56 inches).", "sheets_referenced": ["P01.01", "G21.01"], "disciplines_to_respond": ["Plumbing", "Architectural"], "suggested_response_needed": "Confirm the compartment depth in architectural plans or adjust the plumbing fixture type.", "priority": "high"}, {"rfi_id": "RFI-006", "issue_id": "VZE-CA-SD-003", "title": "HVAC Condensate Drainage Connection to Sanitary Sewer", "question": "Clarify and detail the method of connecting the condensate drain to the sanitary sewer. Ensure the connection is indirect and compliant with the applicable plumbing code, typically by draining to a floor sink or other approved receptor with a visible air gap.", "background": "A note on the mechanical details states that the condensate drain will terminate in the sanitary sewer. Direct connection of HVAC condensate to a sanitary sewer is prohibited by plumbing codes as it can allow sewer gas to enter the building's air supply. An indirect connection via an air gap or air break is required.", "sheets_referenced": ["M03.01"], "disciplines_to_respond": ["Mechanical", "Plumbing"], "suggested_response_needed": "Provide details for an indirect connection to the sanitary sewer.", "priority": "high"}, {"rfi_id": "RFI-007", "issue_id": "ISSUE-001", "title": "Lighting Plan vs. Reflected Ceiling Plan Discrepancy", "question": "Please coordinate the electrical lighting plan (E03.01) with the architectural reflected ceiling plan (inset on E03.01) to resolve the discrepancy in fixture layout. This must be resolved before construction to avoid significant rework of the ceiling and wiring.", "background": "The electrical lighting plan for the Sales Area on sheet E03.01 shows a different layout of light fixtures than the architectural reflected ceiling plan, which is shown as an inset on the same drawing. The electrical engineer's plan shows long continuous rows of fixtures, while the architectural plan shows fixtures arranged in groups to align with the furniture layout shown on A24.01.", "sheets_referenced": ["E03.01", "A24.01"], "disciplines_to_respond": ["Architectural", "Electrical"], "suggested_response_needed": "Coordinate the lighting plan with the reflected ceiling plan.", "priority": "medium"}, {"rfi_id": "RFI-008", "issue_id": "ISSUE-002", "title": "Conflicting IBC Editions in Drawing Set", "question": "Please confirm the correct edition of the International Building Code (IBC) to be used for the project (2018 vs. 2021) and ensure all drawings are consistent with the selected edition.", "background": "The Code/Exiting Plan on G21.01 specifies the 2018 IBC, while the Architectural Finish Plan (A23.01) and Electrical Notes (E01.01) both reference the 2021 IBC. The entire project must be designed to a single, consistent code edition for permitting and construction.", "sheets_referenced": ["G21.01", "A23.01", "E01.01"], "disciplines_to_respond": ["General", "Architectural", "Electrical"], "suggested_response_needed": "Confirm the correct IBC edition and update all drawings accordingly.", "priority": "medium"}, {"rfi_id": "RFI-009", "issue_id": "ISSUE-003", "title": "Exhaust Fan Clearance Conflict", "question": "Please resolve the conflict between the 10-foot radius clearance requirement for the exhaust fans and their current 6'-9\" separation as shown on the Architectural Roof Plan. Ensure the fans are located at least 10 feet apart to meet the required clearance.", "background": "The Mechanical Roof Plan indicates a 10-foot radius clearance requirement associated with the new exhaust fans (Keynote 3). However, the fans are shown located only 6'-9\" apart per the Architectural Roof Plan, causing their required clearance zones to overlap.", "sheets_referenced": ["M02.02", "A25.01"], "disciplines_to_respond": ["Mechanical", "Architectural"], "suggested_response_needed": "Adjust the fan locations to meet the 10-foot separation requirement.", "priority": "medium"}, {"rfi_id": "RFI-010", "issue_id": "ISSUE-004", "title": "Knee Clearance Inconsistency Between General and Specific Details", "question": "Please reconcile the discrepancy between the general typical details on sheet G11.02 (28\" minimum knee clearance) and the specific restroom elevation on sheet A51.01 (29\" minimum knee clearance). Ensure all drawings are consistent with the correct minimum knee clearance requirement.", "background": "The general typical details on sheet G11.02 show a minimum knee clearance height of 28 inches for an accessible lavatory, while the specific restroom elevation on sheet A51.01 shows a minimum knee clearance height of 29 inches. While the 29\" dimension meets the 28\" requirement, the inconsistency between the general standard and the specific detail can cause confusion for fabrication and installation.", "sheets_referenced": ["G11.02", "A51.01"], "disciplines_to_respond": ["General", "Architectural"], "suggested_response_needed": "Coordinate the knee clearance dimensions across all relevant drawings.", "priority": "medium"}, {"rfi_id": "RFI-011", "issue_id": "ISSUE-005", "title": "Vent Pipe Size Discrepancy Between Sanitary Waste & Vent Plan and Typical Piping Riser Diagram", "question": "Please confirm the correct size of the vent pipe for the main vent branch serving the fixtures (2 inches vs. 1 1/2 inches) and coordinate the drawings to ensure consistency in material procurement and installation.", "background": "The vent pipe size is shown as 2 inches on the Sanitary Waste & Vent Plan (P02.01) for the main vent branch serving the fixtures, but is shown as 1 1/2 inches on the typical piping riser diagram (P03.01). The correct size needs to be confirmed and drawings coordinated for proper material procurement and installation.", "sheets_referenced": ["P02.01", "P03.01"], "disciplines_to_respond": ["Plumbing"], "suggested_response_needed": "Confirm the correct vent pipe size and coordinate the drawings.", "priority": "medium"}, {"rfi_id": "RFI-012", "issue_id": "ISSUE-006", "title": "Missing Electrical Panels in Architectural Plans", "question": "Please update the architectural plans to show the electrical panels 'H' and 'L' located on the west wall of the Lounge, as indicated on the electrical one-line diagram and power plan. This is necessary for coordinating wall construction, finishes, and required clearances.", "background": "The electrical one-line diagram and power plan show electrical panels 'H' and 'L' located on the west wall of the Lounge. The architectural plans do not show these panels, which is necessary for coordinating wall construction, finishes, and required clearances.", "sheets_referenced": ["E01.02", "E02.01", "A23.01"], "disciplines_to_respond": ["Electrical", "Architectural"], "suggested_response_needed": "Update the architectural plans to include the electrical panels 'H' and 'L'.", "priority": "medium"}, {"rfi_id": "RFI-013", "issue_id": "ISSUE-007", "title": "Missing Floor Drain in Architectural Finish Plan", "question": "Please update the architectural finish plan A23.01 to include the floor drain indicated in the plumbing plan P02.01 for the Cleaning Supplies/Storage room. This is necessary for coordinating slab depression, waterproofing details, and floor slope requirements.", "background": "The plumbing plan P02.01 indicates a floor drain (FD) in the Cleaning Supplies/Storage room. This floor drain is not shown on the architectural finish plan A23.01. The architectural plan must be updated to include the floor drain, as its absence impacts slab depression, waterproofing details, and floor slope requirements.", "sheets_referenced": ["P02.01", "A23.01"], "disciplines_to_respond": ["Plumbing", "Architectural"], "suggested_response_needed": "Update the architectural finish plan to include the floor drain.", "priority": "medium"}, {"rfi_id": "RFI-014", "issue_id": "ADA-CARPET-PILE-HEIGHT-001", "title": "Carpet Pile Height for Accessibility Compliance", "question": "Verify that the specified carpet tile product (Shaw NEXT GEN 2.0) has a pile height of 1/2 inch or less. Add the pile height information to the finish schedule or specifications to confirm compliance with ADA 302.2.", "background": "The finish schedule specifies carpet tile CPT1 in accessible areas (Sales Area, Manager's Office) but does not specify the pile height. To comply with accessibility standards, carpet pile height must be 1/2 inch maximum to ensure navigability for people using mobility devices.", "sheets_referenced": ["A23.01"], "disciplines_to_respond": ["Architectural"], "suggested_response_needed": "Confirm the pile height of the specified carpet tile and update the finish schedule.", "priority": "medium"}, {"rfi_id": "RFI-015", "issue_id": "ISSUE-008", "title": "Missing Thermostatic Mixing Valve in Architectural Elevations", "question": "Please update the architectural elevations detailing the under-sink conditions (Details 2, 3, and 6) to show the thermostatic mixing valve (TMV) required for lavatory L-1. This is necessary for coordinating space, clearances, and insulated wrap requirements, particularly for ADA compliance.", "background": "The plumbing fixture schedule for lavatory L-1 explicitly requires a thermostatic mixing valve (TMV). However, the architectural elevations detailing the under-sink conditions (Details 2, 3, and 6) do not show this valve. Instead, they depict hot and cold supply lines connecting directly to the faucet.", "sheets_referenced": ["P01.01", "A51.01"], "disciplines_to_respond": ["Plumbing", "Architectural"], "suggested_response_needed": "Update the architectural elevations to include the thermostatic mixing valve.", "priority": "medium"}, {"rfi_id": "RFI-016", "issue_id": "CODE-SLIP-RESISTANCE-001", "title": "Slip Resistance Specification for Polished Concrete Floor", "question": "Please revise the specification for polished concrete (PC1) to require a wet Dynamic Coefficient of Friction (DCOF) of 0.42 or greater when tested per ANSI A326.3. Provide product data or test reports demonstrating compliance.", "background": "The specification for polished concrete floor (PC1) requires a Static Coefficient of Friction (SCOF) of 0.50. SCOF is an obsolete test method for slip resistance. The current building codes and industry standards reference ANSI A326.3, which requires a Dynamic Coefficient of Friction (DCOF) of 0.42 or greater for level interior spaces expected to be walked upon when wet, such as restrooms.", "sheets_referenced": ["A23.01"], "disciplines_to_respond": ["Architectural"], "suggested_response_needed": "Revise the slip resistance specification to use DCOF and provide compliance documentation.", "priority": "medium"}, {"rfi_id": "RFI-017", "issue_id": "ISSUE-009", "title": "Missing Thermostatic Mixing Valve in Plumbing Floor Plan", "question": "Please update the plumbing floor plan P02.01 to show the thermostatic mixing valve (TMV) required for the electric drinking fountain (EDF-1). This is necessary for coordinating physical space within the wall and potential access panel requirements.", "background": "The plumbing riser diagram on sheet P03.01 indicates that a thermostatic mixing valve (TMV) is required to supply tempered water to the electric drinking fountain (EDF-1). However, this TMV is not located on the plumbing floor plan on P02.01. The valve requires physical space within the wall and potentially an access panel, which is not accounted for and must be coordinated with architecture.", "sheets_referenced": ["P03.01", "P02.01"], "disciplines_to_respond": ["Plumbing", "Architectural"], "suggested_response_needed": "Update the plumbing floor plan to include the thermostatic mixing valve.", "priority": "medium"}, {"rfi_id": "RFI-018", "issue_id": "VZE-CA-SD-001", "title": "Toe Clearance for Accessible Lavatory", "question": "Please verify the dimensioning of the toe clearance at the accessible lavatories. The detail should be revised to provide a minimum clear height of 9 inches for toe space, extending for the required depth per ADA standards, to ensure proper forward approach for a wheelchair user.", "background": "The sink detail specifies a '6\" MAX. TOE CLEAR', which appears to indicate the height of the toe kick space under the lavatory cabinet. ADA Standards generally require a minimum height of 9 inches for toe clearance to allow for a wheelchair user's footrests to pass underneath. A 6-inch high space would not be sufficient.", "sheets_referenced": ["A51.01"], "disciplines_to_respond": ["Architectural", "Plumbing"], "suggested_response_needed": "Revise the toe clearance detail to meet ADA 606.2 requirements.", "priority": "medium"}, {"rfi_id": "RFI-019", "issue_id": "ISSUE-010", "title": "Conflicting National Electrical Code (NEC) Editions", "question": "Please confirm the correct edition of the National Electrical Code (NEC) to be used for the project (2014 vs. 2023) and ensure all drawings are consistent with the selected edition.", "background": "There is an inconsistency in the referenced version of the National Electrical Code (NEC). The Code/Exiting plan on G21.01 has a confusing note citing '2023 STATE OF TEXAS ADOPTED 2014 NFPA 70...', while the Electrical Notes on E01.01 clearly state '2023 NEC'. The correct and consistent code version needs to be established across the drawing set.", "sheets_referenced": ["G21.01", "E01.01"], "disciplines_to_respond": ["General", "Electrical"], "suggested_response_needed": "Confirm the correct NEC edition and update all drawings accordingly.", "priority": "medium"}, {"rfi_id": "RFI-020", "issue_id": "data_outlet_height", "title": "Data Outlet Height for Accessibility Compliance", "question": "Please relocate the data outlet to a maximum height of 48 inches above the finished floor to comply with accessible reach range requirements. If the outlet is intended for dedicated equipment (e.g., a wall-mounted display) and not general use, provide documentation to justify the 'dedicated use' exception.", "background": "A CAT.6 data outlet in the 'Sales Area' is specified to be mounted at 55 inches above the finished floor. This height exceeds the 48-inch maximum for unobstructed reach range for operable parts, making it inaccessible to individuals using a wheelchair. While there is an exception for dedicated use receptacles, it is not clear that this outlet qualifies.", "sheets_referenced": ["E04.01"], "disciplines_to_respond": ["Electrical", "Architectural"], "suggested_response_needed": "Adjust the data outlet height or provide justification for the dedicated use exception.", "priority": "medium"}, {"rfi_id": "RFI-021", "issue_id": "ISSUE-011", "title": "Vapor Barrier Requirement Discrepancy", "question": "Please confirm the correct vapor barrier requirement for floor slab infills (15 mil vs. 6 mil) and ensure all relevant drawings are consistent with the more stringent Landlord requirement.", "background": "The Landlord Work Letter on sheet G11.03 requires a 15 mil vapor barrier for floor slab infills, while a note on a plumbing detail on sheet P03.01 specifies a minimum of 6 mil, citing the IBC. While the 15 mil requirement meets the minimum 6 mil code requirement, the discrepancy in the contract documents creates ambiguity for the bidding contractor. The more stringent Landlord requirement must be consistently applied across all relevant drawings.", "sheets_referenced": ["G11.03", "P03.01"], "disciplines_to_respond": ["General", "Plumbing"], "suggested_response_needed": "Coordinate the vapor barrier requirements across all relevant drawings.", "priority": "medium"}, {"rfi_id": "RFI-022", "issue_id": "ISSUE-012", "title": "Project Scope Description Inconsistency", "question": "Please clarify whether the project is a 'build out for a first generation retail space' or a 'tenant interior remodel' and revise all relevant drawings accordingly.", "background": "The project scope is described inconsistently across two different sheets. Sheet G11.04 states the project is a 'build out for a first generation retail space,' which implies working in a new, empty shell building. However, sheet G21.01 describes the project as a 'tenant interior remodel,' which implies demolition and alteration of a previously finished space. This must be clarified as it significantly impacts the scope of work, demolition requirements, and bidding.", "sheets_referenced": ["G11.04", "G21.01"], "disciplines_to_respond": ["General", "General"], "suggested_response_needed": "Clarify the project scope and revise all relevant drawings accordingly.", "priority": "medium"}, {"rfi_id": "RFI-023", "issue_id": "ISSUE-013", "title": "Duplicate Fixture Tag for Rooftop Units", "question": "Please assign unique tags to the two distinct new rooftop units on the Mechanical Roof Plan (M02.02) to avoid ambiguity for contractors, installers, and commissioning agents. Each piece of equipment requires a unique identifier for clear reference.", "background": "The Mechanical Roof Plan on M02.02 shows two distinct new rooftop units, but both are identically tagged as 'RTU-1'. The Rooftop Unit Schedule on M01.01 defines the specifications for a unit type 'RTU-1'. While the units may be identical models, assigning the same tag to two separate physical objects creates ambiguity for contractors, installers, and commissioning agents.", "sheets_referenced": ["M02.02", "M01.01"], "disciplines_to_respond": ["Mechanical"], "suggested_response_needed": "Assign unique tags to the rooftop units.", "priority": "medium"}, {"rfi_id": "RFI-024", "issue_id": "ISSUE-014", "title": "Duplicate Fixture Tag for Floor Drains", "question": "Please revise the fixture tag 'FD-1' for one of the floor drains to avoid ambiguity in fixture schedules, procurement, and installation. One tag should be revised, for example, to 'FD-2'.", "background": "The fixture tag 'FD-1' is used for two separate floor drains, one located in the Men's Restroom and another in the Women's Restroom. Fixture tags must be unique to avoid ambiguity in fixture schedules, procurement, and installation.", "sheets_referenced": ["P02.01"], "disciplines_to_respond": ["Plumbing"], "suggested_response_needed": "Revise the duplicate fixture tag to ensure uniqueness.", "priority": "medium"}, {"rfi_id": "RFI-025", "issue_id": "ISSUE-015", "title": "Potential Access Conflict Between Data Outlets and Shelving", "question": "Please clarify the height and configuration of the shelving on the west wall of the storage room (A24.01) to ensure it does not conflict with the data outlets shown on sheet E04.01 at 18 inches AFF.", "background": "Data outlets shown on sheet E04.01 at 18 inches AFF on the west wall of the storage room are in the same location as 'SHELVING, U.N.O.' on the architectural furniture plan A24.01. The undefined height and configuration of the shelving creates a potential access conflict with the data outlets.", "sheets_referenced": ["E04.01", "A24.01"], "disciplines_to_respond": ["Electrical", "Architectural"], "suggested_response_needed": "Clarify shelving height and configuration to avoid access conflict.", "priority": "low"}, {"rfi_id": "RFI-026", "issue_id": "ISSUE-016", "title": "Transformer Installation Conflict with Exposed Ceiling", "question": "Please clarify the installation requirements for the transformer in the Lounge, as the architectural finish plan indicates the ceiling is 'Exposed to Deck', meaning there is no accessible ceiling below the structure. The electrical keynote states the transformer should be suspended 'above accessible ceiling', which may not be feasible.", "background": "Electrical keynote 7 for the transformer in the Lounge states it is to be suspended 'above accessible ceiling'. However, the architectural finish plan indicates the ceiling in the Lounge is 'Exposed to Deck', meaning there is no accessible ceiling below the structure.", "sheets_referenced": ["E02.01", "A23.01"], "disciplines_to_respond": ["Electrical", "Architectural"], "suggested_response_needed": "Clarify transformer installation requirements based on actual ceiling conditions.", "priority": "low"}, {"rfi_id": "RFI-027", "issue_id": "ISSUE-017", "title": "Inconsistent Room Labeling for Women's Restroom", "question": "Please update all drawings to use a single, consistent name for the women's restroom, preferably 'WOMEN'S RESTROOM 102', to avoid confusion during documentation, submittals, and RFIs.", "background": "The women's restroom is labeled inconsistently across the drawing set. It is identified as 'WOMEN'S RESTROOM', 'WOMEN'S / RESTROOM', a generic 'RESTROOM', and 'WOMEN'S ROOM' on various plans. While the intent is clear, this inconsistency can lead to confusion during documentation, submittals, and RFIs.", "sheets_referenced": ["G21.01", "A51.01", "E03.01", "P02.01"], "disciplines_to_respond": ["General", "Architectural", "Electrical", "Plumbing"], "suggested_response_needed": "Update all drawings with a consistent room name.", "priority": "low"}, {"rfi_id": "RFI-028", "issue_id": "ISSUE-018", "title": "Incorrect ASTM Standard Reference for Fire Rating", "question": "Please correct the reference to 'ASTM 834' in the Architectural Finish Plan (A23.01) to 'ASTM E-84' to match the correct standard referenced in the Electrical sheet (E01.01). 'ASTM 834' appears to be a typo and must be corrected.", "background": "Architectural and Electrical sheets reference different ASTM standards for the same purpose of material fire rating. The Architectural Finish Plan incorrectly cites 'ASTM 834' for finish classification, while the Electrical sheet correctly references 'ASTM E-84' for flame and smoke ratings. ASTM E-84 is the correct standard; 'ASTM 834' appears to be a typo that must be corrected.", "sheets_referenced": ["A23.01", "E01.01"], "disciplines_to_respond": ["Architectural", "Electrical"], "suggested_response_needed": "Correct the ASTM standard reference in the Architectural Finish Plan.", "priority": "low"}]} \ No newline at end of file diff --git a/backend/.llm_cache/754e82699ceae8b22408b48ab4ee44a071addae947cfb23a54ce3d0e88d2d10d.json b/backend/.llm_cache/754e82699ceae8b22408b48ab4ee44a071addae947cfb23a54ce3d0e88d2d10d.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/754e82699ceae8b22408b48ab4ee44a071addae947cfb23a54ce3d0e88d2d10d.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/76778c61f079c10da8f67c9989bd86ee980f5d6b9f08db95e1fced96607a790a.json b/backend/.llm_cache/76778c61f079c10da8f67c9989bd86ee980f5d6b9f08db95e1fced96607a790a.json new file mode 100644 index 0000000..23d11f6 --- /dev/null +++ b/backend/.llm_cache/76778c61f079c10da8f67c9989bd86ee980f5d6b9f08db95e1fced96607a790a.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "inv_rack_data_height", "category": "elevation_disagreement", "severity": "medium", "confidence": "high", "location": "INVENTORY Room, west wall", "disciplines": ["Architectural", "Electrical"], "sheets": ["A24.01", "E04.01"], "description": "The architectural plan specifies the network rack bottom is to be mounted at 74 inches AFF. However, the special systems plan shows the corresponding CAT.6 data cables terminating at 18 inches AFF on the same wall. The termination height for data cabling should be coordinated with the height and configuration of the rack it serves.", "evidence": [{"discipline": "Architectural", "sheet": "A24.01", "source_text": "RACK SYSTEM ABOVE SAFE @ -74\" TO BOTTOM", "asserted_value": "74\" AFF"}, {"discipline": "Electrical", "sheet": "E04.01", "source_text": "(2) CAT.6/18\"", "asserted_value": "18\" AFF"}], "recommended_resolution": "coordinate drawings"}, {"conflict_id": "inv_rack_vs_ewh", "category": "spatial_clash", "severity": "high", "confidence": "high", "location": "INVENTORY Room, west wall", "disciplines": ["Architectural", "Plumbing"], "sheets": ["A24.01", "P02.02"], "description": "The architectural plan shows a network rack system on the west wall of the Inventory room. The plumbing plan shows an Electric Water Heater (EWH) in the same location. These two pieces of equipment cannot occupy the same space. Furthermore, locating a water heater, a potential source of leaks, directly below or adjacent to sensitive network equipment is a major operational risk and is strongly discouraged.", "evidence": [{"discipline": "Architectural", "sheet": "A24.01", "source_text": "RACK SYSTEM ABOVE SAFE @ -74\" TO BOTTOM", "asserted_value": "Network Rack System"}, {"discipline": "Plumbing", "sheet": "P02.02", "source_text": "EWH", "asserted_value": "Electric Water Heater"}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/76b4c7d5aef957011c95b8df024de95b5f8dbd3d0f807a9eefb7620a534af216.json b/backend/.llm_cache/76b4c7d5aef957011c95b8df024de95b5f8dbd3d0f807a9eefb7620a534af216.json new file mode 100644 index 0000000..48aa28e --- /dev/null +++ b/backend/.llm_cache/76b4c7d5aef957011c95b8df024de95b5f8dbd3d0f807a9eefb7620a534af216.json @@ -0,0 +1 @@ +[{"assertion_id": "M01.01#10", "attribute": "mca", "original_value": "24", "source_text": "MCA 24", "normalized_value": "24", "normalized_unit": "A", "normalized_attribute": null, "normalization_notes": "MCA stands for Minimum Circuit Ampacity, measured in Amperes (A).", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M01.01#11", "attribute": "mocp", "original_value": "25", "source_text": "MOCP 25", "normalized_value": "25", "normalized_unit": "A", "normalized_attribute": null, "normalization_notes": "MOCP stands for Maximum Overcurrent Protection, measured in Amperes (A).", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M01.01#12", "attribute": "efficiency_rating", "original_value": "11.2 EER - 15.5 IEER", "source_text": "11.2 EER - 15.5 IEER", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value contains multiple distinct ratings (EER and IEER) that cannot be combined into a single normalized value.", "source_text_preserved": true, "normalization_confidence": "low"}, {"assertion_id": "M01.01#13", "attribute": "filter_rating", "original_value": "8 MERV", "source_text": "REMARKS: 1. PROVIDE 8\" MERV FILTERS", "normalized_value": "8", "normalized_unit": "MERV", "normalized_attribute": null, "normalization_notes": "Normalized based on the extracted value '8 MERV'. The source text '8\"' may indicate filter thickness, but the extracted value specifies the MERV rating.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "M01.01#14", "attribute": "refrigerant_type", "original_value": "R-454B", "source_text": "6. REFRIGERANT SHALL BE R-454B.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Original value is a standard identifier.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M01.01#15", "attribute": "roof_curb_height", "original_value": "14", "source_text": "9. PROVIDE 14\" HIGH INSULATED ROOF CURB.", "normalized_value": "14", "normalized_unit": "in", "normalized_attribute": null, "normalization_notes": "Unit 'inches' inferred from the double prime symbol (\") in the source text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M01.01#16", "attribute": "accessory", "original_value": "115V single phase powered convenience power outlet", "source_text": "5. PROVIDE 115V SINGLE PHASE POWERED CONVENIENCE POWER OUTLET ON UNIT.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M01.01#17", "attribute": "accessory", "original_value": "Low leak enthalpy economizer", "source_text": "10. FURNISH WITH LOW LEAK ENTHALPY ECONOMIZER PER IECC REQUIREMENTS.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M02.02#0", "attribute": "scale", "original_value": "1/4\" = 1'-0\"", "source_text": "1 MECHANICAL ROOF PLAN 1/4\" = 1'-0\"", "normalized_value": "1:48", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Converted architectural scale to a unitless ratio.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M02.02#1", "attribute": "duct_size", "original_value": "8\"RD", "source_text": "VTR 8\"RD", "normalized_value": "8", "normalized_unit": "in", "normalized_attribute": "diameter", "normalization_notes": "RD is interpreted as Round Duct, so the dimension is a diameter. Unit from double prime (\").", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M02.02#2", "attribute": "duct_size", "original_value": "10\"RD", "source_text": "10\"RD VTR", "normalized_value": "10", "normalized_unit": "in", "normalized_attribute": "diameter", "normalization_notes": "RD is interpreted as Round Duct, so the dimension is a diameter. Unit from double prime (\").", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M02.02#3", "attribute": "keynote_assertion", "original_value": "Terminate exhaust duct to manufacturer provided vent cap.", "source_text": "TERMINATE EXHAUST DUCT TO MANUFACTURER PROVIDED VENT CAP.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M02.02#4", "attribute": "keynote_assertion", "original_value": "Supply / return duct to transition in vertical to RTU curb opening.", "source_text": "SUPPLY / RETURN DUCT TO TRANSITION IN VERTICAL TO RTU CURB OPENING.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M02.02#5", "attribute": "clearance_requirement", "original_value": "Limit of 10' radius from any outdoor air intake.", "source_text": "LIMIT OF 10' RADIUS FROM ANY OUTDOOR AIR INTAKE.", "normalized_value": "120", "normalized_unit": "in", "normalized_attribute": "radius", "normalization_notes": "Converted 10 feet to 120 inches.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M02.02#6", "attribute": "accessory", "original_value": "Economizer Hood", "source_text": "ECONOMIZER HOOD.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#0", "attribute": "max_length", "original_value": "6'-0\"", "source_text": "INSULATED FLEXIBLE DUCT MAX. LENGTH 6'-0\"", "normalized_value": "72", "normalized_unit": "in", "normalized_attribute": null, "normalization_notes": "Converted 6 feet 0 inches to 72 inches.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#1", "attribute": "sizing_criteria", "original_value": "Same as scheduled neck connection of diffuser", "source_text": "DUCT SIZE IS SAME AS SCHEDULED NECK CONNECTION OF DIFFUSER", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#2", "attribute": "general_note", "original_value": "The flanged bellmouth fitting must be provided, where height of duct shown on plans can accommodate the fitting. Only where the duct height does not allow the installation of bellmouth fitting, provide straight fitting.", "source_text": "THE FLANGED BELLMOUTH FITTING MUST BE PROVIDED, WHERE HEIGHT OF DUCT SHOWN ON PLANS CAN ACCOMMODATE THE FITTING. ONLY WHERE THE DUCT HEIGHT DOES NOT ALLOW THE INSTALLATION OF BELLMOUTH FITTING, PROVIDE STRAIGHT FITTING.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#3", "attribute": "slope", "original_value": "1/8\" per foot", "source_text": "PITCH DOWN TOWARD DRAIN MIN. 1/8\" PER FOOT", "normalized_value": "1:96", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Converted slope to a unitless ratio (1/8 inch rise per 12 inches run).", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#4", "attribute": "sizing_criteria", "original_value": "Not less than one pipe size large than the drain pan connection size", "source_text": "DRAIN LINE SHALL BE NOT LESS THAN ONE PIPE SIZE LARGE THAN THE DRAIN PAN CONNECTION SIZE", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#5", "attribute": "vent_location", "original_value": "Top of vent nipple above top of AHU drain pan", "source_text": "TOP OF VENT NIPPLE ABOVE TOP OF AHU DRAIN PAN", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#6", "attribute": "termination_point", "original_value": "Sanitary sewer", "source_text": "NOTE: CONDENSATE DRAIN TO TERMINATE TO SANITARY SEWER.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#7", "attribute": "pipe_size", "original_value": "3/4\"", "source_text": "3/4\" CONDENSATE PIPING AT 1/8\" PER FOOT SLOPE", "normalized_value": "0.75", "normalized_unit": "in", "normalized_attribute": null, "normalization_notes": "Converted fraction to decimal. Unit from double prime (\").", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#8", "attribute": "slope", "original_value": "1/8\" per foot", "source_text": "3/4\" CONDENSATE PIPING AT 1/8\" PER FOOT SLOPE", "normalized_value": "1:96", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Converted slope to a unitless ratio (1/8 inch rise per 12 inches run).", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#9", "attribute": "scope_supply", "original_value": "Gasketed and insulated roof curb supplied with unit", "source_text": "GASKETED AND INSULATED ROOF CURB SUPPLIED WITH UNIT RE: ARCH.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#10", "attribute": "framing_requirement", "original_value": "Angle iron frame all around roof opening", "source_text": "ANGLE IRON FRAME ALL AROUND ROOF OPENING RE: STRUCTURAL.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#11", "attribute": "smoke_detector_type", "original_value": "Ionization-type smoke detector as required", "source_text": "IONIZATION-TYPE SMOKE DETECTOR AS REQUIRED.", "normalized_value": "Ionization-type", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Extracted detector type from descriptive text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#12", "attribute": "opening_protection", "original_value": "Cover opening with 1/2\" galvanized steel mesh screen", "source_text": "RETURN AIR DUCT. COVER OPENING WITH 1/2\" GALVANIZED STEEL MESH SCREEN.", "normalized_value": "0.5", "normalized_unit": "in", "normalized_attribute": "mesh_size", "normalization_notes": "Converted fraction to decimal. Unit from double prime (\").", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#13", "attribute": "vibration_isolation", "original_value": "Spring isolations bolt to unit & plate", "source_text": "SPRING ISOLATIONS BOLT TO UNIT & PLATE", "normalized_value": "Spring", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Extracted isolator type from text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#14", "attribute": "roofing_material", "original_value": "E.P.D.M. Membrane", "source_text": "E.P.D.M. MEMBRANE", "normalized_value": "EPDM", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Normalized abbreviation by removing periods.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#15", "attribute": "fastener_spacing", "original_value": "12\" O.C.", "source_text": "FASTENING PLATE FASTENED 12\" O.C.", "normalized_value": "12", "normalized_unit": "in", "normalized_attribute": "spacing", "normalization_notes": "O.C. means 'On Center'. Unit from double prime (\").", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#16", "attribute": "vertical_clearance", "original_value": "12\"", "source_text": "MINIMUM 12\"", "normalized_value": "12", "normalized_unit": "in", "normalized_attribute": null, "normalization_notes": "Unit from double prime (\").", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.01#0", "attribute": "general_note", "original_value": "2023 NEC, 2021 IBC, 2021 IECC, NFPA, ETC.", "source_text": "CONTRACTOR SHALL CONFORM TO ALL LOCAL, STATE, AND APPLICABLE CODES, 2023 NEC, 2021 IBC, 2021 IECC, NFPA, ETC., AND ALL OTHER LOCAL CODES AND AMENDMENTS WHERE THERE ARE CONFLICTS BETWEEN CODES, STANDARDS AND DRAWINGS AND SPECIFICATIONS ARISE, THE MORE STRINGENT SHALL APPLY.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "List of applicable codes.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.01#1", "attribute": "material_rating", "original_value": "25/50 Flame and Smoke hazard ratings per ASTM E-84, NFPA 255 and UL 723", "source_text": "ALL PRODUCTS SHALL COMPLY WITH 25/50 FLAME AND SMOKE HAZARD RATINGS PER ASTM E-84, NFPA 255 AND UL 723.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.01#2", "attribute": "penetration_sealing", "original_value": "Penetrations between non-conditioned and conditioned spaces shall be sealed", "source_text": "CONNECTIONS PENETRATIONS BETWEEN NON-CONDITIONED AND CONDITIONED SPACES SHALL BE SEALED TO ELIMINATE MOISTURE INFILTRATION.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.01#3", "attribute": "housekeeping_pad_dimensions", "original_value": "Min 4\" high pad that extends a min of 4\" around the equipment", "source_text": "ALL ELECTRICAL EQUIPMENT SHALL BE PROVIDED WITH A MIN. 4\" HOUSEKEEPING PAD THAT EXTENDS A MINIMUM OF 4\" ALL THE WAY AROUND THE EQUIPMENT.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value contains multiple dimensions (height and clearance) that cannot be combined into a single normalized value.", "source_text_preserved": true, "normalization_confidence": "low"}, {"assertion_id": "E01.02#0", "attribute": "Base Voltage", "original_value": "480", "source_text": "Parameter: Base Voltage, Symbol: VB=, Value: 480, Units: V", "normalized_value": "480", "normalized_unit": "V", "normalized_attribute": null, "normalization_notes": "Unit provided in source text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#1", "attribute": "Phases", "original_value": "3", "source_text": "Parameter: Phases, Symbol: P=, Value: .3, Units: phi", "normalized_value": "3", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Normalized based on the extracted value '3', which is assumed correct for electrical phases, despite the source text showing '.3'.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "E01.02#2", "attribute": "Utility Fault", "original_value": "35400", "source_text": "Parameter: Utility Fault, Symbol: ISC=, Value: 35400, Units: A", "normalized_value": "35400", "normalized_unit": "A", "normalized_attribute": null, "normalization_notes": "Unit provided in source text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#3", "attribute": "Base Total Power", "original_value": "500", "source_text": "Parameter: Base Total Power, Symbol: SB=, Value: 500, Units: KVA", "normalized_value": "500", "normalized_unit": "kVA", "normalized_attribute": null, "normalization_notes": "Unit provided in source text, normalized casing to 'kVA'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#4", "attribute": "general_note", "original_value": "Provide low-voltage dry-type transformers that meet the minimum efficiency requirements of 2021 IECC table C405.8.", "source_text": "1. PROVIDE LOW-VOLTAGE DRY-TYPE TRANSFORMERS THAT MEET THE MINIMUM EFFICIENCY REQUIREMENTS OF 2021 IECC TABLE C405.8.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#5", "attribute": "general_note", "original_value": "Provide as-built drawings for electrical power systems to the building owner.", "source_text": "4. CONTRACTOR SHALL PROVIDE AS-BUILT DRAWINGS FOR ELECTRICAL POWER SYSTEMS TO THE BUILDING OWNER.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#6", "attribute": "schedule_entry", "original_value": "Type L-4 is a 2'x2' recessed indirect light fixture.", "source_text": "TYPE: L-4, MANUFACTURER: LITHONIA, CATALOG NUMBER: 2BLT2-33L-ADSM-EZ1-LP840, DESCRIPTION: 2'x2' RECESSED INDIRECT, 4000K, 90+CRI, ACRYLIC SHIELDING, WHITE FINISH, MOUNTING: RECESSED", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text which includes a dimension (2'x2'). Not safe to normalize part of the description.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#7", "attribute": "schedule_entry", "original_value": "Type L-4E is same as L-4 and includes an emergency battery backup.", "source_text": "TYPE: L-4E, CATALOG NUMBER: 2BLT2-33L-ADSM-EZ1-LP840-E10WLCP, NOTES: TYPE L-4E SAME EXCEPT PROVIDE WITH EMERGENCY BATTERY BACKUP.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#8", "attribute": "mounting_height_AFF", "original_value": "5'-5\"", "source_text": "TYPE: L-5, DESCRIPTION: 12\" PENDANT, MOUNTING: PENDANT, NOTES: PENDANT 5'-5\" AFF", "normalized_value": "65", "normalized_unit": "in", "normalized_attribute": null, "normalization_notes": "Converted 5 feet 5 inches to 65 inches. AFF means Above Finished Floor.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#9", "attribute": "mounting_height_AFF", "original_value": "5'-5\"", "source_text": "TYPE: L-6, DESCRIPTION: 16\" PENDANT, MOUNTING: PENDANT, NOTES: PENDANT 5'-5\" AFF", "normalized_value": "65", "normalized_unit": "in", "normalized_attribute": null, "normalization_notes": "Converted 5 feet 5 inches to 65 inches. AFF means Above Finished Floor.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#10", "attribute": "schedule_entry", "original_value": "Type X is a LED exit sign with Nickel Cadmium battery and self diagnostics.", "source_text": "TYPE: X, DESCRIPTION: LED EXIT SIGN WITH NICKEL CADMIUM BATTERY AND SELF DIAGNOSTICS", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#11", "attribute": "note", "original_value": "Emergency egress operation in fixtures shall provide minimum 400 lumens for minimum 90 minutes.", "source_text": "1. EMERGENCY EGRESS OPERATION IN FIXTURES SHALL PROVIDE MINIMUM 400 LUMENS FOR MINIMUM 90 MINUTES", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value contains multiple distinct measures (lumens and minutes) that cannot be combined into a single normalized value.", "source_text_preserved": true, "normalization_confidence": "low"}, {"assertion_id": "E01.02#12", "attribute": "connected_load", "original_value": "5", "source_text": "DESCRIPTION: WATER HEATING, CONNECTED (KVA): 5, DEMAND (KVA): 5", "normalized_value": "5", "normalized_unit": "kVA", "normalized_attribute": null, "normalization_notes": "Unit 'kVA' from 'CONNECTED (KVA)' in source text. Normalized casing.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#13", "attribute": "connected_load", "original_value": "21", "source_text": "DESCRIPTION: HVAC HEATING *, CONNECTED (KVA): 21, DEMAND (KVA): 21", "normalized_value": "21", "normalized_unit": "kVA", "normalized_attribute": null, "normalization_notes": "Unit 'kVA' from 'CONNECTED (KVA)' in source text. Normalized casing.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#14", "attribute": "connected_load", "original_value": "<17", "source_text": "DESCRIPTION: HVAC COOLING *, CONNECTED (KVA): <17, DEMAND (KVA): <17", "normalized_value": "<17", "normalized_unit": "kVA", "normalized_attribute": null, "normalization_notes": "Unit 'kVA' from 'CONNECTED (KVA)' in source text. Preserved operator. Normalized casing.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#15", "attribute": "service_size", "original_value": "100", "source_text": "RECOMMENDED SERVICE SIZE AT 480V 3P 4W = 100 AMPS", "normalized_value": "100", "normalized_unit": "A", "normalized_attribute": null, "normalization_notes": "Unit 'AMPS' from source text normalized to 'A'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#16", "attribute": "equipment_location", "original_value": "LOUNGE", "source_text": "PANEL NAME H, LOCATION LOUNGE", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": "Original value is a location name.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#17", "attribute": "mounting", "original_value": "SURFACE", "source_text": "MOUNTING SURFACE", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Original value is a standard categorical value.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#18", "attribute": "equipment_location", "original_value": "LOUNGE", "source_text": "PANEL NAME L, LOCATION LOUNGE", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": "Original value is a location name.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E02.01#0", "attribute": "general_note", "original_value": "Coordinate final receptacle/data locations with architect/owner prior to rough-in.", "source_text": "1. COORDINATE FINAL RECEPTACLE/DATA LOCATIONS WITH ARCHITECT/OWNER PRIOR TO ROUGH-IN.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E02.01#1", "attribute": "general_note", "original_value": "Coordinate final floorbox locations with architect/owner prior to rough-in.", "source_text": "2. COORDINATE FINAL FLOORBOX LOCATIONS WITH ARCHITECT/OWNER PRIOR TO ROUGH-IN.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E02.01#2", "attribute": "general_note", "original_value": "Refer to architectural drawings for dimensional locations of all outlets.", "source_text": "3. REFER TO ARCHITECTURAL DRAWINGS FOR DIMENSIONAL LOCATIONS OF ALL OUTLETS.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E02.01#3", "attribute": "keynote_assertion", "original_value": "Provide combination (power/data) Hubbell Systemone fully recessed floorbox #CFB4G25 with flush round cover (finish approved by architect).", "source_text": "1 PROVIDE COMBINATION (POWER/DATA) HUBBELL SYSTEMONE FULLY RECESSED FLOORBOX #CFB4G25 WITH FLUSH ROUND COVER (FINISH APPROVED BY ARCHITECT). PROVIDE WITH (1) DUPLEX RECEPTACLE. COORDINATE CONCRETE DEPTH REQUIREMENTS WITH G.C. COORDINATE FLOOR BOX ACCESSORIES WITH OWNER.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text with a product model number.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E02.01#4", "attribute": "keynote_assertion", "original_value": "Provide (power) Hubbell Systemone fully recessed floorbox #PFBI with flush round cover (finish approved by architect).", "source_text": "2 PROVIDE (POWER) HUBBELL SYSTEMONE FULLY RECESSED FLOORBOX #PFBI WITH FLUSH ROUND COVER (FINISH APPROVED BY ARCHITECT). PROVIDE WITH (1) DUPLEX RECEPTACLE. COORDINATE CONCRETE DEPTH REQUIREMENTS WITH G.C. COORDINATE FLOOR BOX ACCESSORIES WITH OWNER.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text with a product model number.", "source_text_preserved": true, "normalization_confidence": "high"}] \ No newline at end of file diff --git a/backend/.llm_cache/772db8b1ef72e07d1da604254ef7aa3d7dd653075c30ffa2d0ca00f7ff85da80.json b/backend/.llm_cache/772db8b1ef72e07d1da604254ef7aa3d7dd653075c30ffa2d0ca00f7ff85da80.json new file mode 100644 index 0000000..c461a34 --- /dev/null +++ b/backend/.llm_cache/772db8b1ef72e07d1da604254ef7aa3d7dd653075c30ffa2d0ca00f7ff85da80.json @@ -0,0 +1 @@ +{"sheet_number": "E05.01", "discipline": "Electrical", "sheet_title": "DETAILS", "level": null, "scale": "NOT TO SCALE", "assertions": [{"subject": "Panel Grounding", "attribute": "grounding_requirement", "value": "For an I.G. device, the conduit shall be suitable for a ground path or an additional ground shall be pulled to ground the box", "source_text": "NEUTRAL BUS FOR AN I.G. DEVICE, THE CONDUIT SHALL BE SUITABLE FOR A GROUND PATH OR AN ADDITIONAL GROUND SHALL BE PULLED TO GROUND THE BOX.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Panel Grounding", "attribute": "grounding_requirement", "value": "Isolated ground bar shall be insulated from enclosure or installed if not existing, when indicated", "source_text": "ISOLATED GROUND BAR (WHEN INDICATED) INSULATED FROM ENCLOSURE OR INSTALL BOTH IF NOT EXISTING", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Raceway Support", "attribute": "prohibited_material", "value": "Tie wire", "source_text": "NOTE: TIE WIRE SHALL NOT BE USED AS A COMPONENT OF ANY RACEWAY HANGER SYSTEM.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Conduit Rack", "attribute": "future_capacity", "value": "25", "source_text": "PROVIDE SPACE & SUPPORT FOR 25% FUTURE CAPACITY", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Conduit Rack", "attribute": "component_size", "value": "3/4\" TO 1\"", "source_text": "CONDUIT CLAMP - 3/4\" TO 1\"", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "Conduit Clamp"}}, {"subject": "Conduit Rack", "attribute": "component_size", "value": "1 1/4\" TO 6\"", "source_text": "UNISTRUT 2 PIECE CHANNEL PIPE STRAPS - 1 1/4\" TO 6\"", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "Unistrut 2 piece channel pipe straps"}}, {"subject": "Wall Penetration", "attribute": "fire_rating", "value": "3 Hour", "source_text": "PACK BOTH ENDS OF SLEEVE WITH 3M FIRE DAM 150 3 HOUR RATED CAULK OR APPROVED EQUAL", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Wall Penetration", "attribute": "material", "value": "SCHEDULE 40 BLACK STEEL PIPE SLEEVE", "source_text": "SCHEDULE 40 BLACK STEEL PIPE SLEEVE", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "Sleeve"}}, {"subject": "Wall Penetration Seal", "attribute": "installation_depth", "value": "1", "source_text": "MINIMUM (1\") DEEP", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "Fire Caulk"}}, {"subject": "Conduit Penetration", "attribute": "extension_beyond_wall", "value": "6", "source_text": "EXTEND CONDUIT (6\") BEYOND WALL", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "Conduit"}}, {"subject": "Data Outlet Box", "attribute": "size", "value": "4-11/16\" square, 2-5/8\" deep", "source_text": "4-11/16\" SQUARE, 2-5/8\" DEEP JUNCTION BOX", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Data Conduit", "attribute": "size", "value": "1", "source_text": "1\" CONDUIT MINIMUM", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Data Conduit", "attribute": "stub_up_height", "value": "6", "source_text": "STUB CONDUIT 6\" INTO CEILING SPACE", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Data Cabling Support", "attribute": "grid_spacing", "value": "4'-0\"", "source_text": "J-HOOKS SPACED EVERY 4'0\" TO THE ASSOCIATED TELECOMMUNICATION ROOM", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "J-Hooks"}}, {"subject": "CAT6 Cabling", "attribute": "service_loop", "value": "12", "source_text": "NOTE: IF PULLING CAT6 CABLING COIL A MINIMUM 12\" IN THE BACK BOX.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Recessed Fixture", "attribute": "support_requirement", "value": "Must be supported by wire hanger at each corner, independent of ceiling support system", "source_text": "WIRE HANGER AT EACH CORNER OF FIXTURE INDEPENDENT OF CEILING SUPPORT SYSTEM.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "Recessed Troffer"}}, {"subject": "Outlets in Rated Wall", "attribute": "separation_distance", "value": "24", "source_text": "IN ACCORDANCE WITH UBC 4304 OUTLETS ON OPPOSITE SIDES OF WALLS OR PARTITIONS IN THE SAME STUD SPACE MUST BE SEPARATED BY A MIN. OF 24\" HORIZONTAL DISTANCE.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}]} \ No newline at end of file diff --git a/backend/.llm_cache/77b1392b0a0faefbabbe973cb95f7119cbbe93fad25a00eff37fb4dbf7ab3f47.json b/backend/.llm_cache/77b1392b0a0faefbabbe973cb95f7119cbbe93fad25a00eff37fb4dbf7ab3f47.json new file mode 100644 index 0000000..1ef37ee --- /dev/null +++ b/backend/.llm_cache/77b1392b0a0faefbabbe973cb95f7119cbbe93fad25a00eff37fb4dbf7ab3f47.json @@ -0,0 +1 @@ +{"sheet_number": "G31.03", "discipline": "General", "sheet_title": "SPECIFICATIONS", "level": null, "scale": null, "assertions": [{"subject": "Phasing and Site Logistics", "attribute": "general_note", "value": "Owner will occupy adjacent spaces during construction.", "source_text": "OWNER WILL OCCUPY ADJACENT SPACES DURING CONSTRUCTION.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "SPEC 01 73 29"}}, {"subject": "Thin Brick", "attribute": "installer_qualification", "value": "Minimum of five years experience with related thin masonry installations.", "source_text": "INSTALLER QUALIFICATIONS: PROOF OF A MINIMUM OF FIVE YEARS EXPERIENCE WITH RELATED THIN MASONRY INSTALLATIONS.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "SPEC 04 22 00"}}, {"subject": "Thin Brick", "attribute": "performance_testing", "value": "Test reports shall indicate 24-hour cold water absorption, 5-hour boil absorption, saturation coefficient, initial rate of absorption, and efflorescence.", "source_text": "THIN BRICK TEST REPORTS SHALL INDICATE: 1. 24-HOUR COLD WATER ABSORPTION, 2. 5-HOUR BOIL ABSORPTION, 3. SATURATION COEFFICIENT, 4. INITIAL RATE OF ABSORPTION, AND 5. EFFLORESCENCE.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "SPEC 04 22 00"}}, {"subject": "Thin Brick Mockup", "attribute": "mockup_size", "value": "48\" LONG BY 48\"", "source_text": "BUILD MOCKUP PANELS FOR EACH TYPE OF EXPOSED THIN BRICK AND MORTAR COLOR AND CONSTRUCTION IN SIZES APPROXIMATELY 48\" (1200 MM) LONG BY 48\" (1200 MM).", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "SPEC 04 22 00"}}, {"subject": "Wall Substrate", "attribute": "deflection_limit", "value": "L/360", "source_text": "SUBSTRATE SYSTEM DESIGNED WITH A WALL DEFLECTION NOT GREATER THAN L/360.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "SPEC 04 22 00"}}, {"subject": "Metal Fabrications", "attribute": "installer_qualification", "value": "Minimum of 3 years experience in high quality non ferrous ornamental metal work.", "source_text": "FABRICATOR QUALIFICATIONS: MINIMUM OF 3 YEARS EXPERIENCE IN HIGH QUALITY NON FERROUS ORNAMENTAL METAL WORK OF THE TYPE AND SCOPE SPECIFIED.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "SPEC 05 50 00"}}, {"subject": "Aluminum Extrusions", "attribute": "material_standard", "value": "ASTM B221", "source_text": "ALUMINUM: EXTRUSIONS: ASTM B221.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "SPEC 05 50 00"}}, {"subject": "Steel Sheet", "attribute": "material_standard", "value": "ASTM A1008", "source_text": "STEEL: SHEET: ASTM A1008.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "SPEC 05 50 00"}}, {"subject": "Metal Fabrications", "attribute": "general_note", "value": "Coordinate with foundation of wall panels, ceiling panels and trim specified in Section 064000.", "source_text": "COORDINATE WITH FOUNDATION OF WALL PANELS, CEILING PANELS AND TRIM SPECIFIED IN SECTION 064000.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "SPEC 05 50 00"}}, {"subject": "Metal Finish", "attribute": "coating_system", "value": "Shop applied polyester or fluoropolymer powder coat finish system with added inhibitors for exterior locations.", "source_text": "FINISHES: 1. POWDER COAT: SHOP APPLIED POLYESTER OR FLUOROPOLYMER POWDER COAT FINISH SYSTEM WITH ADDED INHIBITORS FOR EXTERIOR LOCATIONS, CUSTOM COLOR OR AS INDICATED ON THE DRAWINGS.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "SPEC 05 50 00"}}]} \ No newline at end of file diff --git a/backend/.llm_cache/79dc2be35041085078ca2fea9a8f180d6f07b3beff6b0029dd6136d38416beba.json b/backend/.llm_cache/79dc2be35041085078ca2fea9a8f180d6f07b3beff6b0029dd6136d38416beba.json new file mode 100644 index 0000000..01b7a1c --- /dev/null +++ b/backend/.llm_cache/79dc2be35041085078ca2fea9a8f180d6f07b3beff6b0029dd6136d38416beba.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "A2501_01", "category": "tag_or_reference_inconsistency", "severity": "medium", "confidence": "high", "location": "Sheet A25.01, New RTU locations and detail area", "disciplines": ["Architectural"], "sheets": ["A25.01"], "description": "Keynote 2 on the roof plan calls for new mechanical roof curbs, and a 'ROOF CURB DETAIL' is provided on the same sheet. However, the detail is not numbered and is not referenced in the keynote or by the plan callouts, leaving it unclear if this is the correct detail to be used for the new RTUs. This creates ambiguity for the contractor on which standard to follow.", "evidence": [{"discipline": "Architectural", "sheet": "A25.01", "source_text": "KEYNOTES\n2. NEW RTU, PROVIDE NEW MECHANICAL ROOF CURBS AS NECESSARY TO ACCOMODATE NEW RTU. GC TO INSTALL FLASHING PER PER ROOFING MANUFACTURING STANDARDS. GC SHALL COORDINATE ROOF WORK WITH LL REQUIREMENTS TO MAINTAIN EXISTING ROOFING WARRANTY. REFER TO MEP DRAWINGS FOR MORE INFORMATION.", "asserted_value": "Requirement for new roof curbs with no reference to a specific detail."}, {"discipline": "Architectural", "sheet": "A25.01", "source_text": "ROOF CURB DETAIL", "asserted_value": "An un-numbered and un-referenced detail for a roof curb is provided."}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/7a1bb8d5dac63be4823ebddb85e6aebc6164a547b3169d6e48725d9944f8912b.json b/backend/.llm_cache/7a1bb8d5dac63be4823ebddb85e6aebc6164a547b3169d6e48725d9944f8912b.json new file mode 100644 index 0000000..7dab410 --- /dev/null +++ b/backend/.llm_cache/7a1bb8d5dac63be4823ebddb85e6aebc6164a547b3169d6e48725d9944f8912b.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "A23.01_conflict_01", "category": "note_or_spec_contradiction", "severity": "low", "confidence": "high", "location": "General Notes and Finish Legend", "disciplines": ["Architectural"], "sheets": ["A23.01"]}]} \ No newline at end of file diff --git a/backend/.llm_cache/7a86d0b4261b79fe346814c9664f3871041fbc21dad113a4430943dd63472e7f.json b/backend/.llm_cache/7a86d0b4261b79fe346814c9664f3871041fbc21dad113a4430943dd63472e7f.json new file mode 100644 index 0000000..69168b8 --- /dev/null +++ b/backend/.llm_cache/7a86d0b4261b79fe346814c9664f3871041fbc21dad113a4430943dd63472e7f.json @@ -0,0 +1 @@ +[{"assertion_id": "P02.02#2", "original_attribute": "room_name", "original_value": "MEN'S RESTROOM", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a proper name. No normalization applied.", "source_text_preserved": "MEN'S RESTROOM", "normalization_confidence": "high"}, {"assertion_id": "P02.02#3", "original_attribute": "room_name", "original_value": "WOMEN'S RESTROOM", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a proper name. No normalization applied.", "source_text_preserved": "WOMEN'S RESTROOM", "normalization_confidence": "high"}, {"assertion_id": "P02.02#4", "original_attribute": "room_name", "original_value": "CLEANING SUPPLIES/STORAGE", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a proper name. No normalization applied.", "source_text_preserved": "CLEANING SUPPLIES/STORAGE", "normalization_confidence": "high"}, {"assertion_id": "P02.02#5", "original_attribute": "room_name", "original_value": "MANAGER'S OFFICE", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a proper name. No normalization applied.", "source_text_preserved": "MANAGER'S OFFICE", "normalization_confidence": "high"}, {"assertion_id": "P02.02#6", "original_attribute": "room_name", "original_value": "SALES AREA", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a proper name. No normalization applied.", "source_text_preserved": "SALES AREA", "normalization_confidence": "high"}, {"assertion_id": "P02.02#7", "original_attribute": "keynote_assertion", "original_value": "EWH-1 is located above ceiling, suspended as high as possible in ceiling plenum and requires an auxiliary drain pan.", "normalized_value": {"subject": "EWH-1", "location": "above ceiling", "installation": "suspended as high as possible in ceiling plenum", "requirement": "auxiliary drain pan"}, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Parsed descriptive text into structured data.", "source_text_preserved": "KEYED NOTE: 1 EWH-1 ABOVE CEILING SUSPENDED AS HIGH AS POSSIBLE IN CEILING PLENUM. PROVIDE AUXILIARY DRAIN PAN BELOW WATER HEATER...", "normalization_confidence": "high"}, {"assertion_id": "P02.02#8", "original_attribute": "Drain Routing", "original_value": "Route 3/4\" T&P drain line and 3/4\" auxiliary drain lines to floor sink below.", "normalized_value": {"T&P_drain_line_size": {"value": 0.75, "unit": "inches"}, "auxiliary_drain_line_size": {"value": 0.75, "unit": "inches"}, "destination": "floor sink"}, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Extracted pipe sizes and destination from text. 3/4\" converted to 0.75 inches.", "source_text_preserved": "ROUTE 3/4\" T&P DRAIN LINE AND 3/4\" AUXILIARY DRAIN LINES TO FLOOR SINK BELOW.", "normalization_confidence": "high"}, {"assertion_id": "P02.02#9", "original_attribute": "Support Requirement", "original_value": "Provide adequate supports to prevent any movement of T&P and aux. drain lines.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Qualitative performance requirement. No normalization applied.", "source_text_preserved": "PROVIDE ADEQUATE SUPPORTS TO PREVENT ANY MOVEMENT OF T&P AND AUX. DRAIN LINES.", "normalization_confidence": "low"}, {"assertion_id": "P02.02#10", "original_attribute": "keynote_assertion", "original_value": "Route proposed 1-1/4\" CW line to existing 2\" water main line.", "normalized_value": {"proposed_line_size": {"value": 1.25, "unit": "inches"}, "existing_line_size": {"value": 2, "unit": "inches"}}, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Extracted pipe sizes from text. 1-1/4\" converted to 1.25 inches.", "source_text_preserved": "KEYED NOTE: 2 ROUTE PROPOSED 1-1/4\" CW LINE TO EXISTING 2\" WATER MAIN LINE AT THIS APPROXIMATE LOCATION. FIELD VERIFY EXACT LOCATION AND SIZE OF EXISTING PIPE.", "normalization_confidence": "high"}, {"assertion_id": "P02.02#11", "original_attribute": "keynote_assertion", "original_value": "Route 1/2\" cold and hot water down.", "normalized_value": {"pipe_size": {"value": 0.5, "unit": "inches"}, "media": ["cold water", "hot water"]}, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Extracted pipe size from text. 1/2\" converted to 0.5 inches.", "source_text_preserved": "KEYED NOTE: 3 ROUTE 1/2\" COLD AND HOT WATER DOWN.", "normalization_confidence": "high"}, {"assertion_id": "P02.02#12", "original_attribute": "keynote_assertion", "original_value": "Route 1/2\" cold water down to recessed valve box. Confirm exact location with owner/architect.", "normalized_value": {"pipe_size": {"value": 0.5, "unit": "inches"}, "media": "cold water", "destination": "recessed valve box"}, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Extracted pipe size from text. 1/2\" converted to 0.5 inches.", "source_text_preserved": "KEYED NOTE: 4 ROUTE 1/2\" COLD WATER DOWN TO RECESSED VALVE BOX. CONFIRM EXACT LOCATION WITH OWNER/ARCHITECT.", "normalization_confidence": "high"}, {"assertion_id": "P02.02#13", "original_attribute": "pipe_size", "original_value": "2", "normalized_value": 2, "normalized_unit": "inches", "normalized_attribute": "pipe_diameter", "normalization_notes": "Unit 'inches' inferred from source text '\"' symbol.", "source_text_preserved": "(E)2\"CW", "normalization_confidence": "high"}, {"assertion_id": "P03.01#0", "original_attribute": "general_note", "original_value": "Saw-cut and route proposed sanitary waste line to existing 4\" sanitary waste line or larger.", "normalized_value": {"target_pipe_size_min": {"value": 4, "unit": "inches"}, "target_pipe_type": "sanitary waste line"}, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Extracted minimum pipe size from text.", "source_text_preserved": "KEYED NOTE: 1 SAW-CUT AND ROUTE PROPOSED SANITARY WASTE LINE TO EXISTING 4\" SANITARY WASTE LINE OR LARGER APPROXIMATELY THIS POINT. FIELD VERIFY EXACT LOCATION, SIZE. DIRECTION OF FLOW AND DEPTH OF OF EXISTING PIPE.", "normalization_confidence": "high"}, {"assertion_id": "P03.01#1", "original_attribute": "general_note", "original_value": "Route proposed new vent branch line to existing 4\" vent main line or larger.", "normalized_value": {"target_pipe_size_min": {"value": 4, "unit": "inches"}, "target_pipe_type": "vent main line"}, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Extracted minimum pipe size from text.", "source_text_preserved": "KEYED NOTE: 2 ROUTE PROPOSED NEW VENT BRANCH LINE TO EXISTING 4\" VENT MAIN LINE OR LARGER AT APPROXIMATELY THIS POINT. FIELD VERIFY EXACT LOCATION, SIZE, & ELEVATION OF EXISTING PIPE.", "normalization_confidence": "high"}, {"assertion_id": "P03.01#2", "original_attribute": "equipment_model", "original_value": "170-LF LEONARD", "normalized_value": {"manufacturer": "LEONARD", "model": "170-LF"}, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Parsed into manufacturer and model.", "source_text_preserved": "PROVIDE MODEL 170-LF LEONARD THERMOSTATIC MIXING VALVE.", "normalization_confidence": "high"}, {"assertion_id": "P03.01#3", "original_attribute": "temperature", "original_value": "110", "normalized_value": 110, "normalized_unit": "degrees Fahrenheit", "normalized_attribute": "outlet_temperature", "normalization_notes": "Unit 'degrees Fahrenheit' inferred from source text '\u00b0F'.", "source_text_preserved": "OUTLET TEMP SHALL BE 110\u00b0F.", "normalization_confidence": "high"}, {"assertion_id": "P03.01#4", "original_attribute": "pressure_relief_drain", "original_value": "Pipe discharge 3/4\" to floor sink per plans", "normalized_value": {"pipe_size": {"value": 0.75, "unit": "inches"}, "destination": "floor sink per plans"}, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Extracted pipe size from text. 3/4\" converted to 0.75 inches.", "source_text_preserved": "A.S.M.E. RATED TEMP. AND PRESSURE RELIEF VALVE. PIPE DISCHARGE 3/4\" TO FLOOR SINK PER PLANS", "normalization_confidence": "high"}, {"assertion_id": "P03.01#5", "original_attribute": "expansion_tank_model", "original_value": "A.O. SMITH PMC-2", "normalized_value": {"manufacturer": "A.O. SMITH", "model": "PMC-2"}, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Parsed into manufacturer and model.", "source_text_preserved": "EXPANSION TANK A.O. SMITH PMC-2", "normalization_confidence": "high"}, {"assertion_id": "P03.01#6", "original_attribute": "drain_pan", "original_value": "4\" DEEP AUXILIARY DRAIN PAN 18 GAUGE GALVANIZED STEEL.", "normalized_value": {"type": "Auxiliary Drain Pan", "depth": {"value": 4, "unit": "inches"}, "gauge": 18, "material": "Galvanized Steel"}, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Parsed description into structured data.", "source_text_preserved": "4\" DEEP AUXILIARY DRAIN PAN 18 GAUGE GALVANIZED STEEL.", "normalization_confidence": "high"}, {"assertion_id": "P03.01#7", "original_attribute": "drain_line", "original_value": "3/4\" auxiliary drain line to floor sink", "normalized_value": {"pipe_size": {"value": 0.75, "unit": "inches"}, "type": "auxiliary drain line", "destination": "floor sink per plans"}, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Extracted pipe size from text. 3/4\" converted to 0.75 inches.", "source_text_preserved": "3/4\" AUXILIARY DRAIN LINE TO FLOOR SINK PER PLANS", "normalization_confidence": "high"}, {"assertion_id": "P03.01#8", "original_attribute": "support_spec", "original_value": "2\" Unistrut support. 1/2\" All threaded rods complete with double nuts and lock washers.", "normalized_value": {"unistrut_support_size": {"value": 2, "unit": "inches"}, "threaded_rod_size": {"value": 0.5, "unit": "inches"}, "fasteners": "double nuts and lock washers"}, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Parsed description into structured data. 1/2\" converted to 0.5 inches.", "source_text_preserved": "2\" UNISTRUT SUPPORT. 1/2\" ALL THREADED RODS COMPLETE WITH DOUBLE NUTS AND LOCK WASHERS.", "normalization_confidence": "high"}, {"assertion_id": "P03.01#9", "original_attribute": "installation_note", "original_value": "Must be installed in an upright position.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Qualitative installation constraint. No normalization applied.", "source_text_preserved": "1. ALWAYS INSTALL IN UPRIGHT POSITION", "normalization_confidence": "low"}, {"assertion_id": "P03.01#10", "original_attribute": "accessibility", "original_value": "Install at an accessible location. Provide access panel where required.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Qualitative requirement. No normalization applied.", "source_text_preserved": "2. INSTALL AT AN ACCESSIBLE LOCATION. PROVIDE ACCESS PANEL WHERE REQUIRED.", "normalization_confidence": "low"}, {"assertion_id": "P03.01#11", "original_attribute": "vapor_retarder", "original_value": "6-mil Polyethylene vapor retarder minimum", "normalized_value": {"thickness_min": {"value": 6, "unit": "mil"}, "material": "Polyethylene"}, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Parsed description into structured data. 'mil' is a standard unit (1/1000 inch).", "source_text_preserved": "PER 2021 IBC, CHAPTER 19, SECTION 1907: POLYETHYLENE VAPOR RETARDER MINIMUM 6-MIL SHALL BE REQUIRED.", "normalization_confidence": "high"}, {"assertion_id": "P03.01#12", "original_attribute": "sleeve_size", "original_value": "2\" larger than the pipe", "normalized_value": {"rule": "ADD", "value": 2, "unit": "inches", "base": "pipe diameter"}, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Normalized as a rule for calculating sleeve size relative to pipe size.", "source_text_preserved": "SLEEVE SHALL BE 2\" LARGER THEN THE PIPE", "normalization_confidence": "high"}, {"assertion_id": "P03.01#13", "original_attribute": "pipe_material", "original_value": "Connection from PVC below slab to Cast Iron above slab with transition coupling", "normalized_value": {"below_slab_material": "PVC", "above_slab_material": "Cast Iron", "connection_method": "transition coupling"}, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Parsed description of material transition into structured data.", "source_text_preserved": "MAKE CONNECTION FROM PVC BELOW SLAB TO CAST IRON ABOVE SLAB WITH TRANSISTION COUPLING", "normalization_confidence": "high"}, {"assertion_id": "P03.01#14", "original_attribute": "installation_note", "original_value": "No exposed PVC above slab", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Qualitative installation constraint. No normalization applied.", "source_text_preserved": "NO EXPOSED PVC ABOVE SLAB.", "normalization_confidence": "low"}, {"assertion_id": "P03.01#15", "original_attribute": "vent_size", "original_value": "1 1/2", "normalized_value": 1.5, "normalized_unit": "inches", "normalized_attribute": "pipe_diameter", "normalization_notes": "Unit 'inches' inferred from source text '\"' symbol. '1 1/2' converted to 1.5.", "source_text_preserved": "1 1/2\"V", "normalization_confidence": "high"}, {"assertion_id": "P03.01#16", "original_attribute": "sanitary_size", "original_value": "2", "normalized_value": 2, "normalized_unit": "inches", "normalized_attribute": "pipe_diameter", "normalization_notes": "Unit 'inches' inferred from source text '\"' symbol.", "source_text_preserved": "2\"SAN", "normalization_confidence": "high"}, {"assertion_id": "P03.01#17", "original_attribute": "vent_size", "original_value": "2", "normalized_value": 2, "normalized_unit": "inches", "normalized_attribute": "pipe_diameter", "normalization_notes": "Unit 'inches' inferred from source text '\"' symbol.", "source_text_preserved": "2\"V", "normalization_confidence": "high"}, {"assertion_id": "P03.01#18", "original_attribute": "sanitary_size", "original_value": "3", "normalized_value": 3, "normalized_unit": "inches", "normalized_attribute": "pipe_diameter", "normalization_notes": "Unit 'inches' inferred from source text '\"' symbol.", "source_text_preserved": "3\"SAN", "normalization_confidence": "high"}, {"assertion_id": "P03.01#19", "original_attribute": "sanitary_size", "original_value": "2", "normalized_value": 2, "normalized_unit": "inches", "normalized_attribute": "pipe_diameter", "normalization_notes": "Unit 'inches' inferred from source text '\"' symbol.", "source_text_preserved": "2\"SAN", "normalization_confidence": "high"}, {"assertion_id": "P03.01#20", "original_attribute": "vent_size", "original_value": "2", "normalized_value": 2, "normalized_unit": "inches", "normalized_attribute": "pipe_diameter", "normalization_notes": "Unit 'inches' inferred from source text '\"' symbol.", "source_text_preserved": "2\"V", "normalization_confidence": "high"}, {"assertion_id": "P03.01#21", "original_attribute": "schedule_entry", "original_value": "Fixture units 1-11 require J.R. SMITH FIG. NO 5005 (Symbol A), Size 3/4\", B Size 4\"", "normalized_value": {"manufacturer": "J.R. SMITH", "figure_no": "5005", "symbol": "A", "fixture_unit_range": {"min": 1, "max": 11}, "size_a": {"value": 0.75, "unit": "inches"}, "size_b": {"value": 4, "unit": "inches"}}, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Parsed schedule row into structured data. 3/4\" converted to 0.75 inches.", "source_text_preserved": "5005 | A | 1 - 11 | 3/4\" | 4\"", "normalization_confidence": "high"}] \ No newline at end of file diff --git a/backend/.llm_cache/7c99962acaca61019e7ee6b9160402848b6965bb7d5df83097261096b8d152ed.json b/backend/.llm_cache/7c99962acaca61019e7ee6b9160402848b6965bb7d5df83097261096b8d152ed.json new file mode 100644 index 0000000..bcf3b4a --- /dev/null +++ b/backend/.llm_cache/7c99962acaca61019e7ee6b9160402848b6965bb7d5df83097261096b8d152ed.json @@ -0,0 +1 @@ +{"sheet_number": "E03.01", "discipline": "Electrical", "sheet_title": "FLOOR PLAN - LIGHTING", "level": null, "scale": "1/4\" = 1'-0\"", "assertions": [{"subject": "FLOOR PLAN - LIGHTING", "attribute": "scale", "value": "1/4\" = 1'-0\"", "source_text": "SCALE: 1/4\" = 1'-0\"", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "1"}}, {"subject": "Light Switches", "attribute": "general_note", "value": "Coordinate all light switch locations with architect/owner prior to rough-in.", "source_text": "ELECTRICAL GENERAL NOTES: 1. COORDINATE ALL LIGHT SWITCH LOCATIONS WITH ARCHITECT/OWNER PRIOR TO ROUGH-IN.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "1"}}, {"subject": "Emergency Fixtures", "attribute": "general_note", "value": "Connect all type 'X' emergency fixtures to nearest lighting circuit via non-switched hot leg. Provide fixtures with nickel cadmium battery.", "source_text": "ELECTRICAL GENERAL NOTES: 2. CONNECT ALL TYPE 'X' EMERGENCY FIXTURES TO NEAREST LIGHTING CIRCUIT VIA NON-SWITCHED HOT LEG. PROVIDE FIXTURES WITH NICKEL CADMIUM BATTERY.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "2"}}, {"subject": "Lighting Systems", "attribute": "general_note", "value": "All lighting systems shall be tested to ensure proper calibration, adjustment, programming, and operation in accordance with IECC 2021 Section C408.3.", "source_text": "ELECTRICAL GENERAL NOTES: 3. ALL LIGHTING SYSTEMS SHALL BE TESTED TO ENSURE PROPER CALIBRATION, ADJUSTMENT, PROGRAMMING, AND OPERATION IN ACCORDANCE WITH IECC 2021 SECTION C408.3.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "3"}}, {"subject": "Dimmer Switch", "attribute": "keynote_assertion", "value": "Provide dimmer switch for control of sales area lighting. Coordinate final location with owner prior to rough-in.", "source_text": "ELECTRICAL KEYED NOTES: 1 PROVIDE DIMMER SWITCH FOR CONTROL OF SALES AREA LIGHTING. COORDINATE FINAL LOCATION WITH OWNER PRIOR TO ROUGH-IN.", "confidence": "high", "location_key": {"grid": null, "room": "SALES AREA", "level": null, "tag": "1"}}, {"subject": "Room Name", "attribute": "room_name", "value": "INVENTORY", "source_text": "INVENTORY", "confidence": "high", "location_key": {"grid": null, "room": "INVENTORY", "level": null, "tag": null}}, {"subject": "Room Name", "attribute": "room_name", "value": "RESTROOM", "source_text": "RESTROOM", "confidence": "high", "location_key": {"grid": null, "room": "RESTROOM", "level": null, "tag": null}}, {"subject": "Room Name", "attribute": "room_name", "value": "MANAGER'S OFFICE", "source_text": "MANAGER'S OFFICE", "confidence": "high", "location_key": {"grid": null, "room": "MANAGER'S OFFICE", "level": null, "tag": null}}, {"subject": "Room Name", "attribute": "room_name", "value": "CLEANING SUPPLIES/STORAGE", "source_text": "CLEANING SUPPLIES/STORAGE", "confidence": "high", "location_key": {"grid": null, "room": "CLEANING SUPPLIES/STORAGE", "level": null, "tag": null}}, {"subject": "Room Name", "attribute": "room_name", "value": "SALES AREA", "source_text": "SALES AREA", "confidence": "high", "location_key": {"grid": null, "room": "SALES AREA", "level": null, "tag": null}}, {"subject": "Coordination Note", "attribute": "general_note", "value": "fixture locations not matching arch", "source_text": "fixture locations not matching arch", "confidence": "high", "location_key": {"grid": null, "room": "SALES AREA", "level": null, "tag": null}}]} \ No newline at end of file diff --git a/backend/.llm_cache/7d6983551070b0f715420bc1f8281a2525bd980f66cbf3f29cb31f75030bc966.json b/backend/.llm_cache/7d6983551070b0f715420bc1f8281a2525bd980f66cbf3f29cb31f75030bc966.json new file mode 100644 index 0000000..69c66d1 --- /dev/null +++ b/backend/.llm_cache/7d6983551070b0f715420bc1f8281a2525bd980f66cbf3f29cb31f75030bc966.json @@ -0,0 +1 @@ +{"sheet_number": "A51.01", "discipline": "Architectural", "sheet_title": "ELEVATIONS, ENLARGED PLANS, & DETAILS", "level": null, "scale": "As Noted", "assertions": [{"assertion_id": "A5101.1.001", "subject": "Room", "category": "room", "attribute": "room_name", "value": "MEN'S RESTROOM", "unit": null, "location_key": {"sheet_number": "A51.01", "grid": null, "room": "103", "room_name": "MEN'S RESTROOM", "level": null, "tag": null, "detail_reference": "1", "plan_zone": null}, "source_text": "MEN'S RESTROOM", "coordination_targets": ["architectural", "specialty"], "conflict_potential": "low", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "A5101.1.002", "subject": "Room", "category": "room", "attribute": "room_number", "value": "103", "unit": null, "location_key": {"sheet_number": "A51.01", "grid": null, "room": "103", "room_name": "MEN'S RESTROOM", "level": null, "tag": null, "detail_reference": "1", "plan_zone": null}, "source_text": "103", "coordination_targets": ["architectural", "specialty"], "conflict_potential": "low", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "A5101.1.003", "subject": "Room", "category": "room", "attribute": "room_name", "value": "WOMEN'S / RESTROOM", "unit": null, "location_key": {"sheet_number": "A51.01", "grid": null, "room": "102", "room_name": "WOMEN'S / RESTROOM", "level": null, "tag": null, "detail_reference": "1", "plan_zone": null}, "source_text": "WOMEN'S / RESTROOM", "coordination_targets": ["architectural", "specialty"], "conflict_potential": "low", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "A5101.1.004", "subject": "Room", "category": "room", "attribute": "room_number", "value": "102", "unit": null, "location_key": {"sheet_number": "A51.01", "grid": null, "room": "102", "room_name": "WOMEN'S / RESTROOM", "level": null, "tag": null, "detail_reference": "1", "plan_zone": null}, "source_text": "102", "coordination_targets": ["architectural", "specialty"], "conflict_potential": "low", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "A5101.1.005", "subject": "Equipment", "category": "equipment", "attribute": "equipment_location", "value": "EDF-1 is located outside restrooms 102 and 103", "unit": null, "location_key": {"sheet_number": "A51.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "EDF-1", "detail_reference": "1", "plan_zone": null}, "source_text": "EDF-1", "coordination_targets": ["architectural", "plumbing", "electrical", "structural", "ada"], "conflict_potential": "medium", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "A5101.1.006", "subject": "Fixture", "category": "plumbing", "attribute": "fixture_location", "value": "Restrooms contain WC-1", "unit": null, "location_key": {"sheet_number": "A51.01", "grid": null, "room": "102, 103", "room_name": "MEN'S RESTROOM, WOMEN'S / RESTROOM", "level": null, "tag": "WC-1", "detail_reference": "1", "plan_zone": null}, "source_text": "WC-1", "coordination_targets": ["architectural", "plumbing"], "conflict_potential": "low", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "A5101.1.007", "subject": "Fixture", "category": "plumbing", "attribute": "fixture_location", "value": "Restrooms contain L-1", "unit": null, "location_key": {"sheet_number": "A51.01", "grid": null, "room": "102, 103", "room_name": "MEN'S RESTROOM, WOMEN'S / RESTROOM", "level": null, "tag": "L-1", "detail_reference": "1", "plan_zone": null}, "source_text": "L-1", "coordination_targets": ["architectural", "plumbing"], "conflict_potential": "low", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "A5101.1.008", "subject": "Signage", "category": "specialty", "attribute": "detail_callout", "value": "SEE G11.02", "unit": null, "location_key": {"sheet_number": "A51.01", "grid": null, "room": "102, 103", "room_name": "MEN'S RESTROOM, WOMEN'S / RESTROOM", "level": null, "tag": null, "detail_reference": "1", "plan_zone": null}, "source_text": "HANDICAPPED RESTROOM SIGNAGE (SEE G11.02)", "coordination_targets": ["architectural", "ada"], "conflict_potential": "medium", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "A5101.2.001", "subject": "Fixture", "category": "accessibility", "attribute": "clearance", "value": "9", "unit": "in", "location_key": {"sheet_number": "A51.01", "grid": null, "room": null, "room_name": "TYPICAL RESTROOM", "level": null, "tag": "L-1", "detail_reference": "2", "plan_zone": null}, "source_text": "9\" MIN. TOE CLEAR", "coordination_targets": ["plumbing", "ada"], "conflict_potential": "medium", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "A5101.2.002", "subject": "Fixture", "category": "accessibility", "attribute": "clearance", "value": "6", "unit": "in", "location_key": {"sheet_number": "A51.01", "grid": null, "room": null, "room_name": "TYPICAL RESTROOM", "level": null, "tag": "L-1", "detail_reference": "2", "plan_zone": null}, "source_text": "6\" MAX. TOE CLEAR", "coordination_targets": ["plumbing", "ada"], "conflict_potential": "medium", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "A5101.2.003", "subject": "Fixture", "category": "plumbing", "attribute": "mounting_height", "value": "2'-5\" MIN.", "unit": "ft-in", "location_key": {"sheet_number": "A51.01", "grid": null, "room": null, "room_name": "TYPICAL RESTROOM", "level": null, "tag": "L-1", "detail_reference": "2", "plan_zone": null}, "source_text": "2'-5\" MIN.", "coordination_targets": ["plumbing", "ada"], "conflict_potential": "medium", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "A5101.2.004", "subject": "Fixture", "category": "plumbing", "attribute": "mounting_height", "value": "2'-10\" MAX.", "unit": "ft-in", "location_key": {"sheet_number": "A51.01", "grid": null, "room": null, "room_name": "TYPICAL RESTROOM", "level": null, "tag": "L-1", "detail_reference": "2", "plan_zone": null}, "source_text": "2'-10\" MAX.", "coordination_targets": ["plumbing", "ada"], "conflict_potential": "medium", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "A5101.3.001", "subject": "Fixture", "category": "plumbing", "attribute": "mounting_height", "value": "17\"-19\"", "unit": "in", "location_key": {"sheet_number": "A51.01", "grid": null, "room": null, "room_name": "TYPICAL RESTROOM", "level": null, "tag": "WC-1", "detail_reference": "3", "plan_zone": null}, "source_text": "17\"-19\"", "coordination_targets": ["plumbing", "ada", "code"], "conflict_potential": "high", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "A5101.3.002", "subject": "Grab Bar", "category": "accessibility", "attribute": "mounting_height", "value": "33\"-36\"", "unit": "in", "location_key": {"sheet_number": "A51.01", "grid": null, "room": null, "room_name": "TYPICAL RESTROOM", "level": null, "tag": null, "detail_reference": "3", "plan_zone": null}, "source_text": "33\"-36\"", "coordination_targets": ["structural", "ada", "code"], "conflict_potential": "high", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "A5101.3.003", "subject": "Grab Bar", "category": "accessibility", "attribute": "length", "value": "3'-6\" MIN.", "unit": "ft-in", "location_key": {"sheet_number": "A51.01", "grid": null, "room": null, "room_name": "TYPICAL RESTROOM", "level": null, "tag": "side grab bar", "detail_reference": "3", "plan_zone": null}, "source_text": "3'-6\" MIN.", "coordination_targets": ["ada", "code"], "conflict_potential": "medium", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "A5101.3.004", "subject": "Grab Bar", "category": "accessibility", "attribute": "length", "value": "3'-4\"", "unit": "ft-in", "location_key": {"sheet_number": "A51.01", "grid": null, "room": null, "room_name": "TYPICAL RESTROOM", "level": null, "tag": "rear grab bar", "detail_reference": "3", "plan_zone": null}, "source_text": "3'-4\"", "coordination_targets": ["ada", "code"], "conflict_potential": "medium", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "A5101.3.005", "subject": "Toilet Accessory", "category": "specialty", "attribute": "location", "value": "7\"-9\"", "unit": "in", "location_key": {"sheet_number": "A51.01", "grid": null, "room": null, "room_name": "TYPICAL RESTROOM", "level": null, "tag": "TOILET TISSUE DISPENSER", "detail_reference": "3", "plan_zone": null}, "source_text": "7\"-9\"", "coordination_targets": ["ada", "code"], "conflict_potential": "medium", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "A5101.4.001", "subject": "Millwork", "category": "specialty", "attribute": "overall_dim", "value": "3'-0\"", "unit": "ft-in", "location_key": {"sheet_number": "A51.01", "grid": null, "room": null, "room_name": "Lounge", "level": null, "tag": "Sink cabinet", "detail_reference": "4", "plan_zone": null}, "source_text": "3'-0\"", "coordination_targets": ["architectural", "plumbing"], "conflict_potential": "low", "code_review_relevance": "none", "confidence": "high"}, {"assertion_id": "A5101.4.002", "subject": "Millwork", "category": "specialty", "attribute": "equipment_location", "value": "Space provided for CLIENT'S REFRIGERATOR", "unit": null, "location_key": {"sheet_number": "A51.01", "grid": null, "room": null, "room_name": "Lounge", "level": null, "tag": null}}]} \ No newline at end of file diff --git a/backend/.llm_cache/7dd3ae7e40214eeb987a03610fddd5913b9cd6392640d2c9f2f4a98a67a78ec1.json b/backend/.llm_cache/7dd3ae7e40214eeb987a03610fddd5913b9cd6392640d2c9f2f4a98a67a78ec1.json new file mode 100644 index 0000000..66bd2eb --- /dev/null +++ b/backend/.llm_cache/7dd3ae7e40214eeb987a03610fddd5913b9cd6392640d2c9f2f4a98a67a78ec1.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "lounge_panels_missing_on_arch", "category": "missing_element", "severity": "medium", "confidence": "high", "location": "Lounge", "disciplines": ["Electrical", "Architectural"], "sheets": ["E01.02", "E02.01", "A23.01"], "description": "The electrical one-line diagram and power plan show electrical panels 'H' and 'L' located on the west wall of the Lounge. The architectural plans do not show these panels, which is necessary for coordinating wall construction, finishes, and required clearances.", "evidence": [{"discipline": "Electrical", "sheet": "E01.02", "source_text": "PANEL NAME H, LOCATION LOUNGE; PANEL NAME L, LOCATION LOUNGE", "asserted_value": "Panels H and L are located in the Lounge."}, {"discipline": "Architectural", "sheet": "A23.01", "source_text": "The Finish Plan for the Lounge shows a blank wall where the electrical plans show panels H and L.", "asserted_value": "No electrical panels are shown on the west wall of the Lounge."}], "recommended_resolution": "coordinate drawings"}, {"conflict_id": "transformer_note_vs_ceiling_condition", "category": "note_or_spec_contradiction", "severity": "low", "confidence": "high", "location": "Lounge", "disciplines": ["Electrical", "Architectural"], "sheets": ["E02.01", "A23.01"], "description": "Electrical keynote 7 for the transformer in the Lounge states it is to be suspended 'above accessible ceiling'. However, the architectural finish plan indicates the ceiling in the Lounge is 'Exposed to Deck', meaning there is no accessible ceiling below the structure.", "evidence": [{"discipline": "Electrical", "sheet": "E02.01", "source_text": "7 TRANSFORMER TO BE SUSPENDED FROM STRUCTURE AT HIGH LEVEL ABOVE ACCESSIBLE CEILING.", "asserted_value": "Transformer is above an accessible ceiling."}, {"discipline": "Architectural", "sheet": "A23.01", "source_text": "F01 CEILING FINISH LOCATION: LOUNGE, CORRIDOR, SALES AREA, RESTROOMS; FINISH: EXPOSED TO DECK", "asserted_value": "Ceiling is exposed to deck (no accessible ceiling)."}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/7dd437de9e5ff67754df7bea4c6a249cefa844eb40054db10863c9d9b30372b5.json b/backend/.llm_cache/7dd437de9e5ff67754df7bea4c6a249cefa844eb40054db10863c9d9b30372b5.json new file mode 100644 index 0000000..53e7409 --- /dev/null +++ b/backend/.llm_cache/7dd437de9e5ff67754df7bea4c6a249cefa844eb40054db10863c9d9b30372b5.json @@ -0,0 +1 @@ +{"prioritized_issues": [{"issue_id": "CON-001", "overall_risk_score": 100, "severity": "critical", "risk_drivers": ["life_safety", "accessibility", "permit_risk", "structural", "mep_coordination", "constructability", "cost_exposure", "schedule_impact", "bid_ambiguity", "change_order_risk"], "recommended_priority": "immediate", "senior_architect_summary": "The entire drawing set references multiple conflicting and incorrect building codes against the jurisdictional requirements. This guarantees permit rejection, requires a full-set redesign, and poses a major liability risk across all disciplines. All work must halt until the correct code basis is established and implemented."}, {"issue_id": "CON-003", "overall_risk_score": 99, "severity": "critical", "risk_drivers": ["permit_risk", "mep_coordination", "constructability", "cost_exposure", "schedule_impact", "bid_ambiguity", "change_order_risk"], "recommended_priority": "immediate", "senior_architect_summary": "The primary architectural floor plan is missing from the set. This sheet is the foundation for all disciplines, showing layout, dimensions, and wall types. Without it, the documents are fundamentally incomplete and cannot be permitted, bid, or built."}, {"issue_id": "CON-002", "overall_risk_score": 98, "severity": "critical", "risk_drivers": ["bid_ambiguity", "cost_exposure", "schedule_impact", "change_order_risk", "owner_decision", "constructability"], "recommended_priority": "immediate", "senior_architect_summary": "The project is inconsistently described as both a 'remodel' and a 'first generation build-out.' This major scope ambiguity makes it impossible for bidders to determine the extent of demolition, leading to extreme bid ambiguity and high change order risk. The core scope must be clarified immediately."}, {"issue_id": "CON-005", "overall_risk_score": 96, "severity": "critical", "risk_drivers": ["life_safety", "permit_risk", "constructability", "cost_exposure", "schedule_impact", "bid_ambiguity", "change_order_risk"], "recommended_priority": "immediate", "senior_architect_summary": "Essential partition type and door schedules are missing, despite being referenced. The drawings cannot be priced or built without knowing the construction of partitions or the specifications for doors, frames, and hardware, including critical fire ratings for life safety and permit compliance."}, {"issue_id": "CON-004", "overall_risk_score": 95, "severity": "critical", "risk_drivers": ["mep_coordination", "constructability", "cost_exposure", "schedule_impact", "bid_ambiguity", "change_order_risk", "permit_risk"], "recommended_priority": "immediate", "senior_architect_summary": "The primary interior mechanical plan is missing, leaving no information on ductwork, diffuser, or interior equipment layout. This makes MEP coordination impossible and prevents accurate bidding and installation. The set is incomplete for permit and construction."}, {"issue_id": "CON-006", "overall_risk_score": 94, "severity": "critical", "risk_drivers": ["mep_coordination", "constructability", "cost_exposure", "schedule_impact", "bid_ambiguity", "change_order_risk", "accessibility"], "recommended_priority": "immediate", "senior_architect_summary": "Finished ceiling heights are not indicated anywhere in the set. This is a critical omission that prevents MEP coordination, determination of partition heights, fixture mounting heights, and proper lighting installation. All disciplines are impacted."}, {"issue_id": "CON-008", "overall_risk_score": 93, "severity": "critical", "risk_drivers": ["structural", "mep_coordination", "constructability", "cost_exposure", "schedule_impact", "bid_ambiguity", "change_order_risk", "permit_risk"], "recommended_priority": "immediate", "senior_architect_summary": "The architectural roof plan shows one RTU while the mechanical plan requires two. This creates a high risk that required structural support and roof curbing for the second unit will be completely missed, leading to major cost, schedule, and structural impacts during construction."}, {"issue_id": "CON-007", "overall_risk_score": 92, "severity": "critical", "risk_drivers": ["mep_coordination", "constructability", "cost_exposure", "schedule_impact", "change_order_risk", "owner_decision"], "recommended_priority": "immediate", "senior_architect_summary": "A direct spatial clash exists between the network rack (Architectural) and the electric water heater (Plumbing). This guarantees a field conflict and a change order. Furthermore, locating water-bearing equipment over sensitive electronics poses a significant operational risk to the owner."}, {"issue_id": "CON-009", "overall_risk_score": 88, "severity": "high", "risk_drivers": ["life_safety", "structural", "permit_risk", "constructability", "cost_exposure", "schedule_impact", "bid_ambiguity"], "recommended_priority": "before_permit", "senior_architect_summary": "Structural drawings are entirely missing from the set. With new heavy rooftop and suspended equipment in scope, a structural analysis and engineered support details are mandatory for life safety, permitting, and construction. The project cannot proceed without them."}, {"issue_id": "CON-020", "overall_risk_score": 86, "severity": "high", "risk_drivers": ["life_safety", "structural", "constructability", "bid_ambiguity", "change_order_risk", "cost_exposure"], "recommended_priority": "before_bid", "senior_architect_summary": "Structural support details for heavy suspended equipment (transformer, water heater) are incomplete and improperly defer engineering design to the contractor. This is a life safety risk, unbiddable as-is, and must be resolved with engineered details from the design team."}, {"issue_id": "CON-010", "overall_risk_score": 85, "severity": "high", "risk_drivers": ["life_safety", "permit_risk", "mep_coordination", "cost_exposure", "schedule_impact", "bid_ambiguity"], "recommended_priority": "before_permit", "senior_architect_summary": "Fire sprinkler and fire alarm plans are missing. These life safety systems are required for permitting. The set must either include these system plans or explicitly state they are deferred submittals to avoid guaranteed permit rejection and bid ambiguity."}, {"issue_id": "CON-015", "overall_risk_score": 84, "severity": "high", "risk_drivers": ["accessibility", "permit_risk", "constructability", "change_order_risk"], "recommended_priority": "before_permit", "senior_architect_summary": "The entry door swing in both restrooms obstructs the required clear floor space at the lavatory, a clear accessibility violation. The layout must be revised to be compliant to avoid permit rejection and costly rework after installation."}, {"issue_id": "CON-016", "overall_risk_score": 83, "severity": "high", "risk_drivers": ["life_safety", "permit_risk", "constructability", "bid_ambiguity", "change_order_risk"], "recommended_priority": "before_permit", "senior_architect_summary": "The door specification creates confusion by calling for a '90 minute rated Class C' assembly, which is a contradiction. This ambiguity risks the installation of incorrect life safety assemblies and must be corrected to align with standard fire door classifications."}, {"issue_id": "CON-014", "overall_risk_score": 82, "severity": "high", "risk_drivers": ["accessibility", "permit_risk", "constructability", "change_order_risk"], "recommended_priority": "before_permit", "senior_architect_summary": "An accessibility detail for the lavatory contains contradictory and impossible dimensions ('9\" MIN. TOE CLEAR' vs '6\" MAX. TOE CLEAR'). This is an accessibility violation that is impossible to build and must be corrected before permit submission."}, {"issue_id": "CON-012", "overall_risk_score": 80, "severity": "high", "risk_drivers": ["mep_coordination", "accessibility", "constructability", "cost_exposure", "change_order_risk"], "recommended_priority": "before_bid", "senior_architect_summary": "The architectural plan allocates space for one electrical panel, but the electrical schedule requires two panels in the same room. This will lead to insufficient wall space, accessibility clearance violations, and guaranteed field rework. The plans must be coordinated."}, {"issue_id": "CON-017", "overall_risk_score": 80, "severity": "high", "risk_drivers": ["life_safety", "accessibility", "permit_risk", "constructability", "change_order_risk"], "recommended_priority": "before_permit", "senior_architect_summary": "Pendant light fixtures are specified to be mounted at 65 inches AFF, which is well below the 80-inch minimum clearance required in circulation paths. This creates a hazardous head-height obstruction and is an accessibility violation that must be corrected."}, {"issue_id": "CON-019", "overall_risk_score": 79, "severity": "high", "risk_drivers": ["accessibility", "permit_risk", "constructability", "change_order_risk"], "recommended_priority": "before_permit", "senior_architect_summary": "The project's only drinking fountain is located inside the Women's Restroom, which denies equitable access to all occupants. This is a building code violation that must be resolved by relocating the fountain to a common, accessible area."}, {"issue_id": "CON-018", "overall_risk_score": 78, "severity": "high", "risk_drivers": ["accessibility", "permit_risk", "constructability", "bid_ambiguity", "change_order_risk"], "recommended_priority": "before_permit", "senior_architect_summary": "The set lacks dimensioned, enlarged restroom plans. Without them, it is impossible for plan reviewers or contractors to verify compliance with numerous accessibility clearance requirements, guaranteeing permit comments and construction RFIs."}, {"issue_id": "CON-011", "overall_risk_score": 75, "severity": "high", "risk_drivers": ["bid_ambiguity", "cost_exposure", "change_order_risk", "constructability", "mep_coordination"], "recommended_priority": "before_bid", "senior_architect_summary": "The drawings specify an acoustical tile ceiling while a specification calls for a gypsum board ceiling. This fundamental conflict creates significant bid ambiguity due to the large cost and construction sequencing difference between the two systems."}, {"issue_id": "CON-013", "overall_risk_score": 70, "severity": "high", "risk_drivers": ["constructability", "bid_ambiguity", "change_order_risk", "structural"], "recommended_priority": "before_bid", "senior_architect_summary": "A note for a foundation pour-back detail references a sheet and detail that do not exist in the set. The absence of this key construction detail for slab work creates bid ambiguity and requires immediate correction or provisioning of the detail."}, {"issue_id": "CON-026", "overall_risk_score": 60, "severity": "high", "risk_drivers": ["life_safety", "accessibility", "permit_risk", "cost_exposure", "bid_ambiguity"], "recommended_priority": "before_permit", "senior_architect_summary": "The tile slip resistance specification references an obsolete standard (ASTM C1028) and provides conflicting values. This must be updated to the current ANSI A326.3 standard for DCOF to ensure user safety, compliance, and reduce firm liability."}, {"issue_id": "CON-027", "overall_risk_score": 58, "severity": "medium", "risk_drivers": ["accessibility", "permit_risk", "change_order_risk", "constructability"], "recommended_priority": "before_permit", "senior_architect_summary": "The employee lounge sink is detailed with a standard base cabinet, which likely violates accessibility requirements for knee and toe clearance. This must be verified and detailed for compliance to avoid a permit comment or field correction."}, {"issue_id": "CON-023", "overall_risk_score": 55, "severity": "medium", "risk_drivers": ["life_safety", "constructability", "bid_ambiguity", "cost_exposure", "permit_risk"], "recommended_priority": "before_construction", "senior_architect_summary": "A conflict exists between a specific detail prescriptively requiring '3-hour' fire caulk and general notes correctly requiring firestop ratings to match the penetrated assembly. The prescriptive detail is incorrect and must be revised to prevent confusion and improper life safety installations."}, {"issue_id": "CON-024", "overall_risk_score": 50, "severity": "medium", "risk_drivers": ["bid_ambiguity", "owner_decision", "constructability", "permit_risk", "cost_exposure"], "recommended_priority": "before_bid", "senior_architect_summary": "The scope includes new exterior signage, but the required exterior elevations defining its design, attachment, and location are missing. These drawings are necessary for owner approval, landlord/zoning review, and accurate bidding."}, {"issue_id": "CON-021", "overall_risk_score": 45, "severity": "medium", "risk_drivers": ["mep_coordination", "constructability", "change_order_risk"], "recommended_priority": "before_construction", "senior_architect_summary": "A coordination conflict exists between the high mounting height of the network rack (74\") and the low termination height of its data outlets (18\"). This is impractical and will require an RFI and field rework. The heights should be coordinated for a workable solution."}, {"issue_id": "CON-022", "overall_risk_score": 40, "severity": "medium", "risk_drivers": ["bid_ambiguity", "cost_exposure", "change_order_risk", "constructability"], "recommended_priority": "before_bid", "senior_architect_summary": "The drawings contain conflicting requirements for the slab vapor barrier thickness (15 mil vs 6 mil). This ambiguity affects cost and should be resolved to ensure accurate bids and compliance with landlord requirements, which are likely the governing factor."}, {"issue_id": "CON-025", "overall_risk_score": 35, "severity": "medium", "risk_drivers": ["bid_ambiguity", "change_order_risk", "cost_exposure", "constructability"], "recommended_priority": "before_bid", "senior_architect_summary": "Finish documentation relies on ambiguous general notes ('P-1 throughout') instead of a comprehensive room finish schedule. This creates unnecessary risk for bidder assumptions and future change order claims, and should be replaced with a detailed schedule for clarity."}]} \ No newline at end of file diff --git a/backend/.llm_cache/7e2906d79b8d26fa1fa9df15b2b061b42e0d910a8ffd9e64dd77bed7f6898b0e.json b/backend/.llm_cache/7e2906d79b8d26fa1fa9df15b2b061b42e0d910a8ffd9e64dd77bed7f6898b0e.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/7e2906d79b8d26fa1fa9df15b2b061b42e0d910a8ffd9e64dd77bed7f6898b0e.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/80dabfb85559619efedb756043ed21d4bad304343429b01a0bea447078f4b849.json b/backend/.llm_cache/80dabfb85559619efedb756043ed21d4bad304343429b01a0bea447078f4b849.json new file mode 100644 index 0000000..2473f53 --- /dev/null +++ b/backend/.llm_cache/80dabfb85559619efedb756043ed21d4bad304343429b01a0bea447078f4b849.json @@ -0,0 +1 @@ +{"normalized_assertions": [{"assertion_id": "E05.01#14", "original_value": "12", "normalized_value": "12", "normalized_unit": "inches", "normalized_attribute": "service_loop", "normalization_notes": "Converted 12\" to inches", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#15", "original_value": "Must be supported by wire hanger at each corner, independent of ceiling support system", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "support_requirement", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#16", "original_value": "24", "normalized_value": "24", "normalized_unit": "inches", "normalized_attribute": "separation_distance", "normalization_notes": "Converted 24\" to inches", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.02#0", "original_value": "Circuiting to all non dedicated electrical receptacles and switches are required to utilize parallel circuiting by the use of 'pig tails' to each device so that if an outlet is removed or fails electrical continuity the circuit will not be compromised.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "general_note", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.02#1", "original_value": "All electrical wiring must be properly spliced by twisting the wires together and use of approved and listed compression wire nuts for any wiring.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "general_note", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.02#2", "original_value": "Confirm switching requirement with the owner.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "general_note", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.02#3", "original_value": "Emergency lights on this circuit will receive a hot leg which is not routed via the lighting controller so that the emergency ballast has a constant hot to detect power loss.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "general_note", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.02#4", "original_value": "Grounding electrode conductor to ground to 3/4\" x 10' Cu rod or building steel.", "normalized_value": "3/4\" x 10'", "normalized_unit": null, "normalized_attribute": "grounding_electrode", "normalization_notes": "Normalized units in original value", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.02#5", "original_value": "6", "normalized_value": "6", "normalized_unit": "inches", "normalized_attribute": "housekeeping_pad", "normalization_notes": "Converted 6\" to inches", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.02#6", "original_value": "3\" larger than the transformer (6\" at the rear)", "normalized_value": "3\" larger than the transformer (6\" at the rear)", "normalized_unit": null, "normalized_attribute": "clearance_from_equipment", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.02#7", "original_value": "Neoprene vibration isolation pad", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "vibration_isolation", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.02#8", "original_value": "Provide NEC working clearance in front of transformers.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "NEC_working_clearance", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.02#9", "original_value": "Min 1/4", "normalized_value": "1/4", "normalized_unit": "\"", "normalized_attribute": "fastener_size", "normalization_notes": "Assumed unit is inches for fastener size", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "E05.02#10", "original_value": "4", "normalized_value": "4", "normalized_unit": null, "normalized_attribute": "fastener_count", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.02#11", "original_value": "Secure to bottom cord of structure. Provide (2) 1-1/2\" x 1-1/2\" x 3/16\" angled cord to top cord within 6\" of point load. (Typ. for 4).", "normalized_value": "Secure to bottom cord of structure. Provide (2) 1-1/2\" x 1-1/2\" x 3/16\" angled cord to top cord within 6\" of point load. (Typ. for 4).", "normalized_unit": null, "normalized_attribute": "structural_connection", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.02#12", "original_value": "4 spring vibration isolators sized for weight of transformer.", "normalized_value": "4 spring vibration isolators sized for weight of transformer.", "normalized_unit": null, "normalized_attribute": "vibration_isolation", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.02#13", "original_value": "Anvil trapeze assembly model #45/#46", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "equipment_model", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.02#14", "original_value": "Verify support sizing and designed with project structural engineer prior to assembly.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "general_note", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#0", "original_value": "Seal all penetrations through rated walls, floors and ceilings with a UL listed assembly to provide a rating equal to or greater than the rating of the wall, floor or ceiling.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "wall_rating", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#1", "original_value": "Insulate all exposed drain piping and water supply piping beneath A.D.A. compliant lavatories & sinks with fully molded closed cell vinyl insulation kit as manufactured by Truebro, Brocar or McGuire.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "pipe_insulation", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#2", "original_value": "Provide UL fire rated assemblies where pipes penetrate above grade floors. Provide UL fire rated assemblies were pipes penetrate fire rated walls.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "fire_rating_assembly", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#3", "original_value": "Sanitary Waste and Vent (Below Slab Only): Schedule 40 PVC", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "pipe_material_below_slab", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#4", "original_value": "Sanitary Waste and Vent (Above Slab Only): Cast iron pipe and fittings, ASTM A 888 or CISPI 301.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "pipe_material_above_slab", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#5", "original_value": "Domestic Water: Type 'L' copper tubing with wrought copper fittings and 95/5 (tin/antimony) solder joints.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "pipe_material_domestic_water", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#6", "original_value": "480", "normalized_value": "480", "normalized_unit": "volts", "normalized_attribute": "voltage", "normalization_notes": "Converted 'volts' to volts", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#7", "original_value": "3", "normalized_value": "3", "normalized_unit": "phase", "normalized_attribute": "phase", "normalization_notes": "Converted 'phase' to phase", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#8", "original_value": "5", "normalized_value": "5", "normalized_unit": "kW", "normalized_attribute": "power_kW", "normalization_notes": "Converted 'kW' to kW", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#9", "original_value": "30", "normalized_value": "30", "normalized_unit": "gallons", "normalized_attribute": "tank_capacity", "normalization_notes": "Converted 'gallons' to gallons", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#10", "original_value": "Floor Mounted", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "mounting_type", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#11", "original_value": "ADA 17\"H elongated bowl", "normalized_value": "17", "normalized_unit": "inches", "normalized_attribute": "ada_compliant_height", "normalization_notes": "Converted 17\"H to inches", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#12", "original_value": "Flush handle to be on the wide side of the stall.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "flush_handle_location", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#13", "original_value": "Wall Mounted", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "mounting_type", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#14", "original_value": "LF-170 LEONARD THERMOSTATIC MIXING VALVE WITH THE OUTLET TEMPERATURE TO BE SET AT 110F.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "thermostatic_mixing_valve", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#15", "original_value": "LAVATORY (WALL MOUNTED) (A.D.A.)", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "ada_compliant_fixture", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#16", "original_value": "Floor Mounted", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "mounting_type", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#17", "original_value": "Wall Mount Faucet", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "mounting_type", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#18", "original_value": "Self-rimming", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "mounting_type", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#19", "original_value": "SINGLE BOWL SINK (A.D.A)", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "ada_compliant_fixture", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#20", "original_value": "Install automatic pressure drop activated trap primer by PPP products PR-500.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "trap_primer", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#0", "original_value": "INVENTORY", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#1", "original_value": "LOUNGE", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#2", "original_value": "MEN'S RESTROOM", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#3", "original_value": "WOMEN'S ROOM", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#4", "original_value": "MANAGER'S OFFICE", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#5", "original_value": "CLEANING SUPPLIES/STORAGE", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#6", "original_value": "SALES AREA", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#7", "original_value": "EDF-1 is located in WOMEN'S ROOM.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "fixture_location", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#8", "original_value": "WC-1 is located in WOMEN'S ROOM.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "fixture_location", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#9", "original_value": "FD-1 is located in WOMEN'S ROOM.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "fixture_location", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#10", "original_value": "WC-1 is located in MEN'S RESTROOM.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "fixture_location", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#11", "original_value": "L-1 is located in MEN'S RESTROOM.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "fixture_location", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#12", "original_value": "SK-1 is located in LOUNGE.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "fixture_location", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#13", "original_value": "MS-1 is located in CLEANING SUPPLIES/STORAGE.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "fixture_location", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#14", "original_value": "FD-1 is located in CLEANING SUPPLIES/STORAGE.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "fixture_location", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#15", "original_value": "FS-1 is located in CLEANING SUPPLIES/STORAGE.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "fixture_location", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#16", "original_value": "2", "normalized_value": "2", "normalized_unit": "\"", "normalized_attribute": "pipe_size", "normalization_notes": "Converted 2\" to inches", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#17", "original_value": "2", "normalized_value": "2", "normalized_unit": "\"", "normalized_attribute": "pipe_size", "normalization_notes": "Converted 2\" to inches", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#18", "original_value": "2", "normalized_value": "2", "normalized_unit": "\"", "normalized_attribute": "pipe_size", "normalization_notes": "Converted 2\" to inches", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.02#0", "original_value": "INVENTORY", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.02#1", "original_value": "LOUNGE", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": "No numerical or unit conversion needed", "source_text_preserved": true, "normalization_confidence": "high"}]} \ No newline at end of file diff --git a/backend/.llm_cache/81e664a4f0055e9bf931e9b377d4c2fc7a51d68b76aadc748451089adc845091.json b/backend/.llm_cache/81e664a4f0055e9bf931e9b377d4c2fc7a51d68b76aadc748451089adc845091.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/81e664a4f0055e9bf931e9b377d4c2fc7a51d68b76aadc748451089adc845091.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/823d398090162aa28d5042bc919cbc6ee09cebd0f773bd29adce1378a3fdb302.json b/backend/.llm_cache/823d398090162aa28d5042bc919cbc6ee09cebd0f773bd29adce1378a3fdb302.json new file mode 100644 index 0000000..0f1e5c2 --- /dev/null +++ b/backend/.llm_cache/823d398090162aa28d5042bc919cbc6ee09cebd0f773bd29adce1378a3fdb302.json @@ -0,0 +1 @@ +{"project_code_profile": {"project_name": "Verizon Elyson", "project_address": "7022 Elyson Exchange Way", "jurisdiction": {"city": "Katy (unincorporated)", "county": "Harris County", "state": "Texas", "country": "USA", "authority_having_jurisdiction": ["Harris County Engineering Department"], "fire_marshal": "Harris County Fire Marshal's Office", "building_department": "Harris County Engineering Department - Permits Division", "accessibility_reviewer": "Texas Department of Licensing and Regulation (TDLR)"}, "project_classification": {"project_type": "Commercial", "work_type": "unknown", "occupancy": "unknown", "construction_type": "unknown", "sprinklered": "unknown", "public_project": false, "healthcare_project": false, "food_service_project": false, "airport_project": false, "school_project": false}, "adopted_codes": {"building_code": "2015 IBC", "existing_building_code": "2015 IEBC", "fire_code": "2015 IFC", "mechanical_code": "2015 IMC", "plumbing_code": "2015 IPC", "electrical_code": "2017 NEC", "energy_code": "2015 IECC", "accessibility_code": "2012 Texas Accessibility Standards (TAS)"}, "review_paths": {"ibc_review": true, "iebc_review": true, "fire_code_review": true, "ada_review": true, "tas_tdlr_review": true, "municode_review": true, "health_department_review": false, "owner_standard_review": true}, "local_amendment_sources": [{"source_name": "Harris County Local Amendments", "jurisdiction": "Harris County", "source_url": "https://www.eng.hctx.net/permits/Codes-Regulations", "status": "needs_lookup"}], "missing_information": ["Confirmation that project is in unincorporated Harris County jurisdiction and not within an incorporated city limit.", "Work Type (e.g. new_building, remodel, tenant_improvement)", "Primary Occupancy Group(s) (e.g. M, B, S)", "Construction Type (e.g. I-A, V-B)", "Sprinklered status", "Owner standards or design guidelines from Verizon."], "assumptions": ["Project is a commercial tenant space under the jurisdiction of unincorporated Harris County.", "Project work will be extensive enough to trigger IEBC review.", "Owner (Verizon) has brand standards that must be incorporated and reviewed.", "The listed adopted codes for Harris County are assumed based on publicly available data and require verification with the AHJ."], "human_confirmation_required": true}} \ No newline at end of file diff --git a/backend/.llm_cache/8345ad448b2496bb5d044f288cefeec36838bd5831c0f521190276172b08ccc7.json b/backend/.llm_cache/8345ad448b2496bb5d044f288cefeec36838bd5831c0f521190276172b08ccc7.json new file mode 100644 index 0000000..d2bfa22 --- /dev/null +++ b/backend/.llm_cache/8345ad448b2496bb5d044f288cefeec36838bd5831c0f521190276172b08ccc7.json @@ -0,0 +1 @@ +{"sheet_index": [{"sheet_id": "G01.01", "sheet_number": "G01.01", "sheet_title": "COVER SHEET", "discipline": "General", "drawing_type": "cover", "level": null, "page_number": 1, "qaqc_relevance": "high", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "G11.01", "sheet_number": "G11.01", "sheet_title": "VICINITY PLAN, ABBREVIATIONS, PROJECT GENERAL NOTES & SHEET INDEX", "discipline": "General", "drawing_type": "sheet_index", "level": null, "page_number": 2, "qaqc_relevance": "high", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "G11.02", "sheet_number": "G11.02", "sheet_title": "SYMBOLS & TYPICAL HEIGHTS", "discipline": "General", "drawing_type": "notes", "level": null, "page_number": 3, "qaqc_relevance": "medium", "code_review_relevance": "none", "confidence": "medium"}, {"sheet_id": "G11.03", "sheet_number": "G11.03", "sheet_title": "LANDLORD WORK LETTER", "discipline": "General", "drawing_type": "notes", "level": "BUILDING C", "page_number": 4, "qaqc_relevance": "medium", "code_review_relevance": "none", "confidence": "medium"}, {"sheet_id": "G11.04", "sheet_number": "G11.04", "sheet_title": "FIRE CODE DESIGN AND COMPLIANCE REVIEW", "discipline": "General", "drawing_type": "code_life_safety", "level": null, "page_number": 5, "qaqc_relevance": "high", "code_review_relevance": "high", "confidence": "high"}, {"sheet_id": "G21.01", "sheet_number": "G21.01", "sheet_title": "CODE / EXITING PLAN", "discipline": "General", "drawing_type": "code_life_safety", "level": null, "page_number": 6, "qaqc_relevance": "high", "code_review_relevance": "high", "confidence": "high"}, {"sheet_id": "G31.01", "sheet_number": "G31.01", "sheet_title": "SPECIFICATIONS", "discipline": "General", "drawing_type": "specifications", "level": null, "page_number": 7, "qaqc_relevance": "high", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "G31.02", "sheet_number": "G31.02", "sheet_title": "SPECIFICATIONS", "discipline": "General", "drawing_type": "specifications", "level": null, "page_number": 8, "qaqc_relevance": "high", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "G31.03", "sheet_number": "G31.03", "sheet_title": "SPECIFICATIONS", "discipline": "General", "drawing_type": "specifications", "level": null, "page_number": 9, "qaqc_relevance": "high", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "G31.04", "sheet_number": "G31.04", "sheet_title": "SPECIFICATIONS", "discipline": "General", "drawing_type": "specifications", "level": null, "page_number": 10, "qaqc_relevance": "high", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "G31.05", "sheet_number": "G31.05", "sheet_title": "SPECIFICATIONS", "discipline": "General", "drawing_type": "specifications", "level": null, "page_number": 11, "qaqc_relevance": "high", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "G31.06", "sheet_number": "G31.06", "sheet_title": "UL RATINGS - DESIGN #U419", "discipline": "General", "drawing_type": "notes", "level": null, "page_number": 12, "qaqc_relevance": "medium", "code_review_relevance": "none", "confidence": "medium"}, {"sheet_id": "A11.01", "sheet_number": "A11.01", "sheet_title": "SITE PLAN", "discipline": "Architectural", "drawing_type": "site_plan", "level": null, "page_number": 13, "qaqc_relevance": "high", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "page-14", "sheet_number": null, "sheet_title": "Page 14 (extraction failed)", "discipline": "Unknown", "drawing_type": null, "level": null, "page_number": 14, "qaqc_relevance": "low", "code_review_relevance": "none", "confidence": "low"}, {"sheet_id": "page-15", "sheet_number": null, "sheet_title": "Page 15 (extraction failed)", "discipline": "Unknown", "drawing_type": null, "level": null, "page_number": 15, "qaqc_relevance": "low", "code_review_relevance": "none", "confidence": "low"}, {"sheet_id": "A23.01", "sheet_number": "A23.01", "sheet_title": "FINISH PLAN", "discipline": "Architectural", "drawing_type": "floor_plan", "level": null, "page_number": 16, "qaqc_relevance": "high", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "A24.01", "sheet_number": "A24.01", "sheet_title": "FURNITURE/ POWER/ DATA FLOOR PLAN", "discipline": "Architectural", "drawing_type": "floor_plan", "level": null, "page_number": 17, "qaqc_relevance": "high", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "A25.01", "sheet_number": "A25.01", "sheet_title": "ROOF PLAN", "discipline": "Architectural", "drawing_type": "roof_plan", "level": "Roof", "page_number": 18, "qaqc_relevance": "high", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "A51.01", "sheet_number": "A51.01", "sheet_title": "ELEVATIONS, ENLARGED PLANS, & DETAILS", "discipline": "Architectural", "drawing_type": "detail", "level": null, "page_number": 19, "qaqc_relevance": "high", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "page-20", "sheet_number": null, "sheet_title": "Page 20 (extraction failed)", "discipline": "Unknown", "drawing_type": null, "level": null, "page_number": 20, "qaqc_relevance": "low", "code_review_relevance": "none", "confidence": "low"}, {"sheet_id": "M01.01", "sheet_number": "M01.01", "sheet_title": "MECHANICAL NOTES & SCHEDULES", "discipline": "Mechanical", "drawing_type": "notes", "level": null, "page_number": 21, "qaqc_relevance": "high", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "page-22", "sheet_number": null, "sheet_title": "Page 22 (extraction failed)", "discipline": "Unknown", "drawing_type": null, "level": null, "page_number": 22, "qaqc_relevance": "low", "code_review_relevance": "none", "confidence": "low"}, {"sheet_id": "M02.02", "sheet_number": "M02.02", "sheet_title": "MECHANICAL ROOF PLAN", "discipline": "Mechanical", "drawing_type": "roof_plan", "level": "ROOF", "page_number": 23, "qaqc_relevance": "high", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "M03.01", "sheet_number": "M03.01", "sheet_title": "MECHANICAL DETAILS", "discipline": "Mechanical", "drawing_type": "detail", "level": null, "page_number": 24, "qaqc_relevance": "high", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "E01.01", "sheet_number": "E01.01", "sheet_title": "NOTES AND LEGEND", "discipline": "Electrical", "drawing_type": "notes", "level": null, "page_number": 25, "qaqc_relevance": "high", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "E01.02", "sheet_number": "E01.02", "sheet_title": "ONE LINE DIAGRAM AND SCHEDULES", "discipline": "Electrical", "drawing_type": "one_line", "level": null, "page_number": 26, "qaqc_relevance": "high", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "E02.01", "sheet_number": "E02.01", "sheet_title": "FLOOR PLAN - POWER", "discipline": "Electrical", "drawing_type": "floor_plan", "level": null, "page_number": 27, "qaqc_relevance": "high", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "E02.02", "sheet_number": "E02.02", "sheet_title": "ROOF PLAN - POWER", "discipline": "Electrical", "drawing_type": "roof_plan", "level": "ROOF", "page_number": 28, "qaqc_relevance": "high", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "E03.01", "sheet_number": "E03.01", "sheet_title": "FLOOR PLAN - LIGHTING", "discipline": "Electrical", "drawing_type": "floor_plan", "level": null, "page_number": 29, "qaqc_relevance": "high", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "E04.01", "sheet_number": "E04.01", "sheet_title": "FLOOR PLAN - SPECIAL SYSTEMS", "discipline": "Electrical", "drawing_type": "floor_plan", "level": null, "page_number": 30, "qaqc_relevance": "high", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "E05.01", "sheet_number": "E05.01", "sheet_title": "DETAILS", "discipline": "Electrical", "drawing_type": "detail", "level": null, "page_number": 31, "qaqc_relevance": "high", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "E05.02", "sheet_number": "E05.02", "sheet_title": "DETAILS", "discipline": "Electrical", "drawing_type": "detail", "level": null, "page_number": 32, "qaqc_relevance": "high", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "P01.01", "sheet_number": "P01.01", "sheet_title": "NOTES AND LEGEND", "discipline": "Plumbing", "drawing_type": "notes", "level": null, "page_number": 33, "qaqc_relevance": "high", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "P02.01", "sheet_number": "P02.01", "sheet_title": "FLOOR PLAN - SANITARY WASTE & VENT", "discipline": "Plumbing", "drawing_type": "floor_plan", "level": null, "page_number": 34, "qaqc_relevance": "high", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "P02.02", "sheet_number": "P02.02", "sheet_title": "FLOOR PLAN - DOMESTIC WATER", "discipline": "Plumbing", "drawing_type": "floor_plan", "level": null, "page_number": 35, "qaqc_relevance": "high", "code_review_relevance": "none", "confidence": "high"}, {"sheet_id": "P03.01", "sheet_number": "P03.01", "sheet_title": "DETAILS & RISERS", "discipline": "Plumbing", "drawing_type": "detail", "level": null, "page_number": 36, "qaqc_relevance": "high", "code_review_relevance": "none", "confidence": "high"}], "missing_expected_sheets": [{"expected_sheet_type": "civil_utility", "reason": "No sheet found with civil utility plan or related information", "confidence": "medium"}]} \ No newline at end of file diff --git a/backend/.llm_cache/845791251d61b4ae7ecde92306aa6d318a7b927ab36210e493b67ef6a92b7d4d.json b/backend/.llm_cache/845791251d61b4ae7ecde92306aa6d318a7b927ab36210e493b67ef6a92b7d4d.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/845791251d61b4ae7ecde92306aa6d318a7b927ab36210e493b67ef6a92b7d4d.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/84a6ec59ed38aff66e335d229541e6fad4c347d6adf3cc733a02c2005c44ba47.json b/backend/.llm_cache/84a6ec59ed38aff66e335d229541e6fad4c347d6adf3cc733a02c2005c44ba47.json new file mode 100644 index 0000000..821404b --- /dev/null +++ b/backend/.llm_cache/84a6ec59ed38aff66e335d229541e6fad4c347d6adf3cc733a02c2005c44ba47.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "c001", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "Rooftop Work", "disciplines": ["General", "Architectural"], "sheets": ["G11.03", "A25.01"], "description": "The Landlord Work Letter on G11.03 specifies that all roof penetrations must be made by the Landlord's roofer, at the Tenant's cost. However, the Architectural roof plan keynote on A25.01 states 'GC TO INSTALL FLASHING...'. This creates a contradiction regarding who performs the roofing work, which can lead to contractual disputes, warranty issues, and coordination problems during construction.", "evidence": [{"discipline": "General", "sheet": "G11.03", "source_text": "5. Roof, d. ALL ROOF PENETRATIONS MUST BE MADE BY LANDLORD'S ROOFING CONTRACTOR, AT TENANTS COST.", "asserted_value": "Landlord's roofer must perform all roof penetrations."}, {"discipline": "Architectural", "sheet": "A25.01", "source_text": "KEYNOTES 2. NEW RTU...GC TO INSTALL FLASHING PER PER ROOFING MANUFACTURING STANDARDS. GC SHALL COORDINATE ROOF WORK WITH LL REQUIREMENTS TO MAINTAIN EXISTING ROOFING WARRANTY.", "asserted_value": "GC to install flashing."}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/856aedebaa2874e6e943d0c1abb138a34816271ed79b30a0fe4aa8fdd02c980a.json b/backend/.llm_cache/856aedebaa2874e6e943d0c1abb138a34816271ed79b30a0fe4aa8fdd02c980a.json new file mode 100644 index 0000000..56e1abf --- /dev/null +++ b/backend/.llm_cache/856aedebaa2874e6e943d0c1abb138a34816271ed79b30a0fe4aa8fdd02c980a.json @@ -0,0 +1 @@ +{"sheet_number": null, "discipline": "Unknown", "sheet_title": "Page 20 (extraction failed)", "level": null, "scale": null, "assertions": []} \ No newline at end of file diff --git a/backend/.llm_cache/8a55617f156c9954bc8ebaac53941506813a88f2900fc6e0163c761646d7221d.json b/backend/.llm_cache/8a55617f156c9954bc8ebaac53941506813a88f2900fc6e0163c761646d7221d.json new file mode 100644 index 0000000..4865aaf --- /dev/null +++ b/backend/.llm_cache/8a55617f156c9954bc8ebaac53941506813a88f2900fc6e0163c761646d7221d.json @@ -0,0 +1 @@ +{"normalized_assertions": [{"assertion_id": "A51.01#16", "original_value": "33\"-36\"", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Range in inches, no clear conversion to other units.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "A51.01#17", "original_value": "17\"-19\"", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Range in inches, no clear conversion to other units.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "A51.01#18", "original_value": "7\"-9\"", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Range in inches, no clear conversion to other units.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "A51.01#19", "original_value": "3'-6\" MIN.", "normalized_value": "3'-6\"", "normalized_unit": "feet and inches", "normalized_attribute": "length", "normalization_notes": "Removed 'MIN.' qualifier, preserved unit as feet and inches.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#20", "original_value": "3'-4\"", "normalized_value": "3'-4\"", "normalized_unit": "feet and inches", "normalized_attribute": "length", "normalization_notes": "Preserved unit as feet and inches.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M01.01#0", "original_value": "ROOFTOP A/C UNIT", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "No unit or numerical value to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M01.01#1", "original_value": "CARRIER", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "No unit or numerical value to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M01.01#2", "original_value": "50FE-M07", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "No unit or numerical value to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M01.01#3", "original_value": "711", "normalized_value": "711", "normalized_unit": "pounds (lbs)", "normalized_attribute": "weight", "normalization_notes": "Assumed unit based on context (weight).", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "M01.01#4", "original_value": "2100", "normalized_value": "2100", "normalized_unit": "cubic feet per minute (CFM)", "normalized_attribute": "supply_airflow", "normalization_notes": "Assumed unit based on context (airflow).", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "M01.01#5", "original_value": "3.0", "normalized_value": "3.0", "normalized_unit": "horsepower (hp)", "normalized_attribute": "fan_horsepower", "normalization_notes": "Assumed unit based on context (horsepower).", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "M01.01#6", "original_value": "6.0", "normalized_value": "6.0", "normalized_unit": "tons", "normalized_attribute": "cooling_capacity_nominal", "normalization_notes": "Assumed unit based on context (cooling capacity).", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "M01.01#7", "original_value": "10.6", "normalized_value": "10.6", "normalized_unit": "kilowatts (kW)", "normalized_attribute": "heating_capacity", "normalization_notes": "Assumed unit based on context (heating capacity).", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "M01.01#8", "original_value": "460", "normalized_value": "460", "normalized_unit": "volts (V)", "normalized_attribute": "voltage", "normalization_notes": "Assumed unit based on context (voltage).", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "M01.01#9", "original_value": "3", "normalized_value": "3", "normalized_unit": "phase", "normalized_attribute": "phase", "normalization_notes": "Assumed unit based on context (electrical phase).", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "M01.01#10", "original_value": "24", "normalized_value": "24", "normalized_unit": "amps (A)", "normalized_attribute": "mca", "normalization_notes": "Assumed unit based on context (minimum circuit ampere).", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "M01.01#11", "original_value": "25", "normalized_value": "25", "normalized_unit": "amps (A)", "normalized_attribute": "mocp", "normalization_notes": "Assumed unit based on context (maximum overcurrent protection).", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "M01.01#12", "original_value": "11.2 EER - 15.5 IEER", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "No numerical value to normalize; units are specific to efficiency ratings.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "M01.01#13", "original_value": "8 MERV", "normalized_value": "8", "normalized_unit": "MERV rating", "normalized_attribute": "filter_rating", "normalization_notes": "Extracted numerical value with unit (MERV rating).", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "M01.01#14", "original_value": "R-454B", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "No unit or numerical value to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M01.01#15", "original_value": "14", "normalized_value": "14", "normalized_unit": "inches (in)", "normalized_attribute": "roof_curb_height", "normalization_notes": "Assumed unit based on context (height).", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "M01.01#16", "original_value": "115V single phase powered convenience power outlet", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "No unit or numerical value to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M01.01#17", "original_value": "Low leak enthalpy economizer", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "No unit or numerical value to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M02.02#0", "original_value": "1/4\" = 1'-0\"", "normalized_value": "1/4\" = 1'-0\"", "normalized_unit": "scale", "normalized_attribute": "scale", "normalization_notes": "Preserved scale notation.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M02.02#1", "original_value": "8\"RD", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "No clear unit or numerical value to normalize.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "M02.02#2", "original_value": "10\"RD", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "No clear unit or numerical value to normalize.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "M02.02#3", "original_value": "Terminate exhaust duct to manufacturer provided vent cap.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "No unit or numerical value to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M02.02#4", "original_value": "Supply / return duct to transition in vertical to RTU curb opening.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "No unit or numerical value to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M02.02#5", "original_value": "Limit of 10' radius from any outdoor air intake.", "normalized_value": "10'", "normalized_unit": "feet", "normalized_attribute": "clearance_requirement", "normalization_notes": "Extracted numerical value with unit (feet).", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "M02.02#6", "original_value": "Economizer Hood", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "No unit or numerical value to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#0", "original_value": "6'-0\"", "normalized_value": "6'-0\"", "normalized_unit": "feet and inches", "normalized_attribute": "max_length", "normalization_notes": "Preserved unit as feet and inches.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#1", "original_value": "Same as scheduled neck connection of diffuser", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "No unit or numerical value to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#2", "original_value": "The flanged bellmouth fitting must be provided, where height of duct shown on plans can accommodate the fitting. Only where the duct height does not allow the installation of bellmouth fitting, provide straight fitting.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "No unit or numerical value to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#3", "original_value": "1/8\" per foot", "normalized_value": "1/8\" per foot", "normalized_unit": "slope", "normalized_attribute": "slope", "normalization_notes": "Preserved slope notation.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#4", "original_value": "Not less than one pipe size large than the drain pan connection size", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "No unit or numerical value to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#5", "original_value": "Top of vent nipple above top of AHU drain pan", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "No unit or numerical value to normalized.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#6", "original_value": "Sanitary sewer", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "No unit or numerical value to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#7", "original_value": "3/4\"", "normalized_value": "3/4\"", "normalized_unit": "inches", "normalized_attribute": "pipe_size", "normalization_notes": "Preserved unit as inches.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#8", "original_value": "1/8\" per foot", "normalized_value": "1/8\" per foot", "normalized_unit": "slope", "normalized_attribute": "slope", "normalization_notes": "Preserved slope notation.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#9", "original_value": "Gasketed and insulated roof curb supplied with unit", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "No unit or numerical value to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#10", "original_value": "Angle iron frame all around roof opening", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "No unit or numerical value to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#11", "original_value": "Ionization-type smoke detector as required", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "No unit or numerical value to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#12", "original_value": "Cover opening with 1/2\" galvanized steel mesh screen", "normalized_value": "1/2\"", "normalized_unit": "inches", "normalized_attribute": "opening_protection", "normalization_notes": "Extracted numerical value with unit (inches).", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "M03.01#13", "original_value": "Spring isolations bolt to unit & plate", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "No unit or numerical value to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#14", "original_value": "E.P.D.M. Membrane", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "No unit or numerical value to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "M03.01#15", "original_value": "12\" O.C.", "normalized_value": "12\"", "normalized_unit": "inches", "normalized_attribute": "fastener_spacing", "normalization_notes": "Extracted numerical value with unit (inches).", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "M03.01#16", "original_value": "12\"", "normalized_value": "12\"", "normalized_unit": "inches", "normalized_attribute": "vertical_clearance", "normalization_notes": "Preserved unit as inches.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.01#0", "original_value": "2023 NEC, 2021 IBC, 2021 IECC, NFPA, ETC.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "No unit or numerical value to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.01#1", "original_value": "25/50 Flame and Smoke hazard ratings per ASTM E-84, NFPA 255 and UL 723", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "No unit or numerical value to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.01#2", "original_value": "Penetrations between non-conditioned and conditioned spaces shall be sealed", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "No unit or numerical value to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.01#3", "original_value": "Min 4\" high pad that extends a min of 4\" around the equipment", "normalized_value": "4\"", "normalized_unit": "inches", "normalized_attribute": "housekeeping_pad_dimensions", "normalization_notes": "Extracted numerical value with unit (inches).", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "E01.02#0", "original_value": "480", "normalized_value": "480", "normalized_unit": "volts (V)", "normalized_attribute": "Base Voltage", "normalization_notes": "Assumed unit based on context (voltage).", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "E01.02#1", "original_value": "3", "normalized_value": "3", "normalized_unit": "phase", "normalized_attribute": "Phases", "normalization_notes": "Assumed unit based on context (electrical phase).", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "E01.02#2", "original_value": "35400", "normalized_value": "35400", "normalized_unit": "amps (A)", "normalized_attribute": "Utility Fault", "normalization_notes": "Assumed unit based on context (current).", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "E01.02#3", "original_value": "500", "normalized_value": "500", "normalized_unit": "kVA", "normalized_attribute": "Base Total Power", "normalization_notes": "Assumed unit based on context (power).", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "E01.02#4", "original_value": "Provide low-voltage dry-type transformers that meet the minimum efficiency requirements of 2021 IECC table C405.8.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "No unit or numerical value to normalize.", "source_text_preserved": "true", "normalization_confidence": "high"}, {"assertion_id": "E01.02#5", "original_value": "Provide as-built drawings for electrical power systems to the building owner.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "No unit or numerical value to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#6", "original_value": "Type L-4 is a 2'x2' recessed indirect light fixture.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "No unit or numerical value to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#7", "original_value": "Type L-4E is same as L-4 and includes an emergency battery backup.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "No unit or numerical value to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#8", "original_value": "5'-5\" AFF", "normalized_value": "5'-5\"", "normalized_unit": "feet and inches", "normalized_attribute": "mounting_height_AFF", "normalization_notes": "Preserved unit as feet and inches.", "source_text_preserved": true, "normalization_confidence": "high"}]} \ No newline at end of file diff --git a/backend/.llm_cache/8d432a5f3cea06f00b9461f641eefd2bf16e758943b0f035a9590cb25ce6daf7.json b/backend/.llm_cache/8d432a5f3cea06f00b9461f641eefd2bf16e758943b0f035a9590cb25ce6daf7.json new file mode 100644 index 0000000..6e3202d --- /dev/null +++ b/backend/.llm_cache/8d432a5f3cea06f00b9461f641eefd2bf16e758943b0f035a9590cb25ce6daf7.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "code_version_ibc", "category": "note_or_spec_contradiction", "severity": "high", "confidence": "high", "location": "Codes Enforced / General Notes", "disciplines": ["General", "Architectural", "Electrical"], "sheets": ["G21.01", "A23.01", "E01.01"], "description": "There is a conflict between the specified editions of the International Building Code (IBC). The general code sheet G21.01 lists the 2018 IBC, while both the Architectural finish sheet A23.01 and Electrical notes sheet E01.01 reference the 2021 IBC. The entire project must be designed and permitted under a single, correct code edition. This is a critical item to resolve before issuance.", "evidence": [{"discipline": "General", "sheet": "G21.01", "source_text": "2018 INTERNATIONAL BUILDING CODE (IBC) CH. 2-10 WITH HARRIS COUNTY AMENDMENTS", "asserted_value": "2018 IBC"}, {"discipline": "Architectural", "sheet": "A23.01", "source_text": "INTERIOR FINISHES TO COMPLY WITH IBC CLASS C OR HIGHER SECTION 803.9 AND TABLE 803.9 OF 2021 IBC.", "asserted_value": "2021 IBC"}, {"discipline": "Electrical", "sheet": "E01.01", "source_text": "CONTRACTOR SHALL CONFORM TO ALL LOCAL, STATE, AND APPLICABLE CODES, 2023 NEC, 2021 IBC, 2021 IECC, NFPA, ETC., AND ALL OTHER LOCAL CODES AND AMENDMENTS...", "asserted_value": "2021 IBC"}], "recommended_resolution": "coordinate drawings"}, {"conflict_id": "code_version_nec", "category": "note_or_spec_contradiction", "severity": "high", "confidence": "high", "location": "Codes Enforced / General Notes", "disciplines": ["General", "Electrical"], "sheets": ["G21.01", "E01.01"], "description": "There is a contradiction regarding the applicable edition of the National Electrical Code (NEC). Sheet G21.01 specifies the '2014 NFPA 70 NATIONAL ELECTRICAL CODE (NEC)', while the electrical general notes on E01.01 specify the '2023 NEC'. The correct code edition for electrical work must be clarified and made consistent across the drawing set.", "evidence": [{"discipline": "General", "sheet": "G21.01", "source_text": "2023 STATE OF TEXAS ADOPTED 2014 NFPA 70 NATIONAL ELECTRICAL CODE (NEC)", "asserted_value": "2014 NEC"}, {"discipline": "Electrical", "sheet": "E01.01", "source_text": "CONTRACTOR SHALL CONFORM TO ALL LOCAL, STATE, AND APPLICABLE CODES, 2023 NEC, 2021 IBC, 2021 IECC, NFPA, ETC....", "asserted_value": "2023 NEC"}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/8ede7f207a8db86234e40d1522309025d3f8481c6d70ab3af73d80bee42bd1d4.json b/backend/.llm_cache/8ede7f207a8db86234e40d1522309025d3f8481c6d70ab3af73d80bee42bd1d4.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/8ede7f207a8db86234e40d1522309025d3f8481c6d70ab3af73d80bee42bd1d4.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/8f28dbe53dc8042af3ee0c6d26bc19088391fae336a1db4b14c4ea7ce92de0c1.json b/backend/.llm_cache/8f28dbe53dc8042af3ee0c6d26bc19088391fae336a1db4b14c4ea7ce92de0c1.json new file mode 100644 index 0000000..d9fbad8 --- /dev/null +++ b/backend/.llm_cache/8f28dbe53dc8042af3ee0c6d26bc19088391fae336a1db4b14c4ea7ce92de0c1.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "RTU_Tagging_Ambiguity", "category": "tag_or_reference_inconsistency", "severity": "medium", "confidence": "high", "location": "Roof Area at Grid B-C / 4-5", "disciplines": ["Mechanical"], "sheets": ["M02.02", "M01.01"], "description": "The Mechanical Roof Plan on M02.02 shows two distinct new rooftop units, but both are identically tagged as 'RTU-1'. The Rooftop Unit Schedule on M01.01 defines the specifications for a unit type 'RTU-1'. While the units may be identical models, assigning the same tag to two separate physical objects creates ambiguity for contractors, installers, and commissioning agents. Each piece of equipment requires a unique identifier for clear reference.", "evidence": [{"discipline": "Mechanical", "sheet": "M02.02", "source_text": "Image on Mechanical Roof Plan showing two units, both labeled with the tag 'RTU-1'.", "asserted_value": "Both units are RTU-1"}, {"discipline": "Mechanical", "sheet": "M01.01", "source_text": "ROOFTOP UNIT SCHEDULE: MARK RTU-1", "asserted_value": "Defines a single unit type RTU-1"}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/8f2fc93050d2a508df7bc4a06f99cd2c0334b5458b4ad32a223ae820713807a2.json b/backend/.llm_cache/8f2fc93050d2a508df7bc4a06f99cd2c0334b5458b4ad32a223ae820713807a2.json new file mode 100644 index 0000000..af2efd7 --- /dev/null +++ b/backend/.llm_cache/8f2fc93050d2a508df7bc4a06f99cd2c0334b5458b4ad32a223ae820713807a2.json @@ -0,0 +1 @@ +{"sheet_number": "A23.01", "discipline": "Architectural", "sheet_title": "FINISH PLAN", "level": null, "scale": "1/4\" = 1'-0\"", "assertions": [{"subject": "Finish", "attribute": "code_compliance", "value": "Interior finishes to comply with IBC Class C or higher, Section 803.9 and Table 803.9 of 2021 IBC.", "source_text": "INTERIOR FINISHES TO COMPLY WITH IBC CLASS C OR HIGHER SECTION 803.9 AND TABLE 803.9 OF 2021 IBC.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Finish", "attribute": "material_standard", "value": "All materials for interior finish and trim shall be classified in accordance with ASTM 834.", "source_text": "ALL MATERIALS USED FOR INTERIOR FINISH AND TRIM SHALL BE CLASSIFIED IN ACCORDANCE WITH ASTM 834.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Finish", "attribute": "installation_standard", "value": "Wall tile and tile base in restrooms with GWB walls shall be thin set with adhesive in accordance with ANSI A-108.5.", "source_text": "WALL TILE AND TILE BASE IN RESTROOMS WITH GWB WALLS SHALL BE THIN SET WITH ADHESIVE ACCORDANCE WITH THE TILE COUNTIL OF AMERICA, INC. ANSI A-108.5", "confidence": "high", "location_key": {"grid": null, "room": "RESTROOMS", "level": null, "tag": "CT1"}}, {"subject": "Wall Assembly", "attribute": "fire_stopping", "value": "All partitions must be fire stopped at the ceiling.", "source_text": "ALL PARTITIONS MUST BE FIRE STOPPED AT THE CEILING.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Floor Slab", "attribute": "penetration", "value": "All locations of core drilling of the floor slab for installation of utilities to be coordinated with Landlord's structural engineer.", "source_text": "ALL LOCATIONS OF CORE DRILLING OF THE FLOOR SLAB FOR INSTALLATION OF UTILITIES TO BE COORDINATED WITH LANDLORD'S STRUCTURAL ENGINEER BEFORE PERFORMING THE WORK", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Finish", "attribute": "General Finish", "value": "Polished concrete floor PC-1 throughout, U.N.O.", "source_text": "K. POLISHED CONCRETE FLOOR PC-1 THROUGHOUT, U.N.O.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "PC-1"}}, {"subject": "Finish", "attribute": "General Finish", "value": "Walls to be painted P-1 throughout.", "source_text": "L. WALLS TO BE PAINTED P-1 THROUGHOUT.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "P-1"}}, {"subject": "Finish", "attribute": "General Finish", "value": "Vinyl base WB-1 throughout, U.N.O.", "source_text": "M. VINYL BASE WB-1 THROUGHOUT, U.N.O.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "WB-1"}}, {"subject": "Ceiling", "attribute": "General Ceiling", "value": "Ceiling throughout entire space to be AT-1 acoustic ceiling tile with C4-A ceiling grid.", "source_text": "N. CEILING THROUGHOUT ENTIRE SPACE TO BE AT-1 ACOUSTIC CEILING TILE WITH C4-A CEILING GRID.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "AT-1, C4-A"}}, {"subject": "Ceiling Finish", "attribute": "acoustic_ceiling_tile", "value": "Armstrong DUNE #1774, 24\" X 24\" X 5/8\", White, Angled Tegular 15/16\"", "source_text": "MANUF: ARMSTRONG MODEL: DUNE #1774 COLOR: WHITE SIZE: 24\" X 24\" X 5/8\" EDGE PROFILE: ANGLED TEGULAR 15/16\" LOCATION: THROUGHOUT ENTIRE SPACE", "confidence": "high", "location_key": {"grid": null, "room": "THROUGHOUT ENTIRE SPACE", "level": null, "tag": "AT1"}}, {"subject": "Ceiling Grid", "attribute": "ceiling_grid", "value": "Armstrong ULTIMA 1910, PRELUDE XL 15/16\" EXPOSED TEE IN WHITE, 15/16\" SQUARE LAY IN", "source_text": "MANUF: ARMSTRONG PRODUCT: ULTIMA 1910 ... GRID: PRELUDE XL 15/16\" EXPOSED TEE IN WHITE EDGE PROFILE: 15/16\" SQUARE LAY IN LOCATION: THROUGHOUT ENTIRE SPACE", "confidence": "high", "location_key": {"grid": null, "room": "THROUGHOUT ENTIRE SPACE", "level": null, "tag": "C4A"}}, {"subject": "Ceiling Grid", "attribute": "fire_rating", "value": "CLASS A", "source_text": "FIRE RATING CLASS A", "confidence": "high", "location_key": {"grid": null, "room": "THROUGHOUT ENTIRE SPACE", "level": null, "tag": "C4A"}}, {"subject": "Floor Finish", "attribute": "carpet_tile", "value": "Shaw NEXT GEN 2.0, VERIZON STANDARD, 24\" X 24\", ASHLAR STACK PATTERN 50% OFFSET", "source_text": "MANUF: SHAW PRODUCT: NEXT GEN 2.0, VERIZON STANDARD... SIZE: 24\" X 24\" INSTALLATION: ASHLAR STACK PATTERN 50% OFFSET LOCATION: SALES AREA, MANAGER'S OFFICE", "confidence": "high", "location_key": {"grid": null, "room": "SALES AREA, MANAGER'S OFFICE", "level": null, "tag": "CPT1"}}, {"subject": "Floor Finish", "attribute": "finish_floor", "value": "CPT1", "source_text": "CPT 1", "confidence": "high", "location_key": {"grid": null, "room": "SALES AREA", "level": null, "tag": "CPT1"}}, {"subject": "Floor Finish", "attribute": "finish_floor", "value": "CPT1", "source_text": "CPT 1", "confidence": "high", "location_key": {"grid": "A-B/4-5", "room": "MANAGER'S OFFICE", "level": null, "tag": "CPT1"}}, {"subject": "Floor Finish", "attribute": "polished_concrete", "value": "Grade 2 (Medium Exposed), with a Class 1 (Matte) Finish", "source_text": "GRADE: 2 (MEDIUMS EXPOSED), WITH A CLASS 1 (MATTE) FINISH... LOCATION: CORRIDOR, RESTROOMS, LOUNGE, INVENTORY, CLEANING SUPPLIES/STORAGE", "confidence": "high", "location_key": {"grid": null, "room": "CORRIDOR, RESTROOMS, LOUNGE, INVENTORY, CLEANING SUPPLIES/STORAGE", "level": null, "tag": "PC1"}}, {"subject": "Floor Finish", "attribute": "slip_resistance", "value": "0.50", "source_text": "SLIP RESISTANCE OF FLOOR TO BE NO LESS THAN A 0.50 STATIC COEFFICIENT OF FRICTION (SCOF)", "confidence": "high", "location_key": {"grid": null, "room": "CORRIDOR, RESTROOMS, LOUNGE, INVENTORY, CLEANING SUPPLIES/STORAGE", "level": null, "tag": "PC1"}}, {"subject": "Floor Finish", "attribute": "finish_floor", "value": "PC1", "source_text": "PC 1", "confidence": "medium", "location_key": {"grid": "A/2-4", "room": "CORRIDOR", "level": null, "tag": "PC1"}}]} \ No newline at end of file diff --git a/backend/.llm_cache/8f9f0679eca276752804638079dbe0e007c53aea1951dcf37b8bd4166f8f541c.json b/backend/.llm_cache/8f9f0679eca276752804638079dbe0e007c53aea1951dcf37b8bd4166f8f541c.json new file mode 100644 index 0000000..f5b257a --- /dev/null +++ b/backend/.llm_cache/8f9f0679eca276752804638079dbe0e007c53aea1951dcf37b8bd4166f8f541c.json @@ -0,0 +1 @@ +{"issues": [{"issue_id": "CON-001", "source_stage": "code", "category": "building_code", "severity": "critical", "confidence": "high", "location": "Codes Enforced / General Notes, throughout set", "disciplines": ["General", "Architectural", "Electrical", "Plumbing"], "sheets": ["G11.04", "G21.01", "A23.01", "E01.01", "E01.02", "P03.01"], "description": "The drawing set references multiple conflicting and incorrect building code editions. Various sheets reference the 2018 IBC, 2021 IBC, 2014 NEC, and 2023 NEC. However, a jurisdictional review indicates the project's adopted codes are the 2015 IBC and 2015 IFC. Designing to incorrect codes will lead to permit rejection and require significant redesign. This was noted in code, conflict, and constructability reviews.", "evidence": [{"discipline": "General", "sheet": "G21.01", "source_text": "2018 INTERNATIONAL BUILDING CODE (IBC) CH. 2-10 WITH HARRIS COUNTY AMENDMENTS", "asserted_value": "2018 IBC"}, {"discipline": "Architectural", "sheet": "A23.01", "source_text": "INTERIOR FINISHES TO COMPLY WITH IBC CLASS C OR HIGHER SECTION 803.9 AND TABLE 803.9 OF 2021 IBC.", "asserted_value": "2021 IBC"}, {"discipline": "General", "sheet": "G21.01", "source_text": "2023 STATE OF TEXAS ADOPTED 2014 NFPA 70 NATIONAL ELECTRICAL CODE (NEC)", "asserted_value": "2014 NEC"}, {"discipline": "Electrical", "sheet": "E01.01", "source_text": "CONTRACTOR SHALL CONFORM TO ALL LOCAL, STATE, AND APPLICABLE CODES, 2023 NEC, 2021 IBC, 2021 IECC, NFPA, ETC., AND ALL OTHER LOCAL CODES AND AMENDMENTS...", "asserted_value": "2023 NEC, 2021 IBC"}, {"discipline": "General", "sheet": "G11.04", "source_text": "AREA LIMITATION: UNLIMITED (TABLES 504.3, 504.4, 506.2 IBC 2021)", "asserted_value": "Reference to 2021 IBC"}, {"discipline": "Electrical", "sheet": "E01.02", "source_text": "1. PROVIDE LOW-VOLTAGE DRY-TYPE TRANSFORMERS THAT MEET THE MINIMUM EFFICIENCY REQUIREMENTS OF 2021 IECC TABLE C405.8.", "asserted_value": "2021 IECC"}, {"discipline": "Plumbing", "sheet": "P03.01", "source_text": "PER 2021 IBC, CHAPTER 19, SECTION 1907: POLYETHYLENE VAPOR RETARDER MINIMUM 6-MIL SHALL BE REQUIRED.", "asserted_value": "Vapor retarder detail cites 2021 IBC."}], "recommended_resolution": "Confirm the correct, single adopted code edition for each discipline (IBC, NEC, IECC, etc.) with the Authority Having Jurisdiction. Update all references throughout the entire drawing set to be consistent and accurate. Ensure the design complies with the correct adopted codes.", "code_reference": null}, {"issue_id": "CON-002", "source_stage": "constructability", "category": "other", "severity": "critical", "confidence": "high", "location": "General Notes and Project Description", "disciplines": ["General"], "sheets": ["G11.04", "G21.01"], "description": "The project scope is defined inconsistently as both a 'FIRST GENERATION RETAIL SPACE' build-out (implying an empty shell) and a 'TENANT INTERIOR REMODEL' (implying existing construction to be demolished). This major ambiguity prevents bidders from accurately determining the scope of demolition work. This was noted in conflict and constructability reviews.", "evidence": [{"discipline": "General", "sheet": "G11.04", "source_text": "PROJECT IS A TENANT INTERIOR LEASE SPACE BUILD OUT FOR A FIRST GENERATION RETAIL SPACE.", "asserted_value": "First Generation Build-out"}, {"discipline": "General", "sheet": "G21.01", "source_text": "PROJECT IS A TENANT INTERIOR REMODEL OF 3,323 SF", "asserted_value": "Remodel"}], "recommended_resolution": "Clarify if the project is a first-generation build-out or a remodel and ensure all drawing sheets consistently reflect the correct scope of work, particularly regarding demolition.", "code_reference": null}, {"issue_id": "CON-003", "source_stage": "qaqc", "category": "missing_sheet", "severity": "critical", "confidence": "high", "location": "Architectural Series (A2x.xx)", "disciplines": ["Architectural"], "sheets": [], "description": "The primary architectural floor plan, likely numbered A21.01, is missing from the set. This plan is fundamental for showing new partition layouts, overall dimensions, room tags, and wall type references. Without it, the basis for all other plans is absent, making it impossible to bid or build the project accurately.", "evidence": [{"discipline": "System", "sheet": "sheet_index", "source_text": "Logical gap in architectural plan numbering (likely A21.01) before A22.01. Page 14 extraction failed in this location. A floor plan is fundamental to a drawing set.", "asserted_value": "Missing A21.01"}], "recommended_resolution": "Include the missing architectural floor plan sheet (A21.01) in the drawing set.", "code_reference": null}, {"issue_id": "CON-004", "source_stage": "qaqc", "category": "missing_sheet", "severity": "critical", "confidence": "high", "location": "Mechanical Series (M02.xx)", "disciplines": ["Mechanical"], "sheets": [], "description": "The primary mechanical floor plan, likely numbered M02.01, is missing. The set includes a Mechanical Roof Plan (M02.02) but not the corresponding interior plan showing ductwork layout, diffusers, thermostats, and equipment locations for the tenant space. This is a critical omission for MEP coordination, bidding, and installation.", "evidence": [{"discipline": "System", "sheet": "sheet_index", "source_text": "Logical gap in mechanical plan numbering (likely M02.01) before M02.02. Page 22 extraction failed in this location. A main level mechanical plan is expected.", "asserted_value": "Missing M02.01"}], "recommended_resolution": "Include the missing mechanical floor plan sheet (M02.01) in the drawing set.", "code_reference": null}, {"issue_id": "CON-005", "source_stage": "qaqc", "category": "missing_schedule", "severity": "critical", "confidence": "high", "location": "Architectural / General Sheets", "disciplines": ["Architectural", "General"], "sheets": ["G11.01", "G31.06"], "description": "The drawing set lacks essential schedules for bidding and construction, including a Partition Type/Wall Schedule and a Door Schedule. Notes reference partition types and door hardware, but the wall assemblies and door details (sizes, types, ratings, hardware groups) are not defined anywhere.", "evidence": [{"discipline": "General", "sheet": "G11.01", "source_text": "Dimensions shown on drawings shall be to the face of sheathing of partition type as scheduled, unless otherwise noted.", "asserted_value": "A partition schedule is implied but not provided."}, {"discipline": "General", "sheet": "G31.04", "source_text": "WHERE REQUIRED, INSTALLED FRAME AND DOOR ASSEMBLY SHALL CONFORM TO A 90 MINUTE RATED CLASS C INDICATED.", "asserted_value": "Door fire ratings are specified, implying multiple door types, but no schedule indicates where they are used."}], "recommended_resolution": "Create and add a comprehensive Partition Type / Wall Schedule with details/sections and a full Door and Frame Schedule with associated hardware sets.", "code_reference": null}, {"issue_id": "CON-006", "source_stage": "qaqc", "category": "missing_information", "severity": "critical", "confidence": "high", "location": "A22.01 - REFLECTED CEILING PLAN", "disciplines": ["Architectural", "Mechanical", "Electrical", "Plumbing"], "sheets": ["A22.01", "G11.01"], "description": "No finished ceiling heights are indicated anywhere in the drawing set. A general note states that ceiling heights are indicated, but the Reflected Ceiling Plan (A22.01) does not show them. This is a critical omission that impacts all disciplines, preventing coordination of wall heights, MEP service routing, and lighting placement.", "evidence": [{"discipline": "Architectural", "sheet": "A22.01", "source_text": "CEILING THROUGHOUT ENTIRE SPACE TO BE AT-1 ACOUSTIC CEILING TILE", "asserted_value": "Ceiling material is specified, but height is not."}, {"discipline": "General", "sheet": "G11.01", "source_text": "Ceiling heights are indicated from the floor elevation to the face of the suspended ceiling system or face of finish material as scheduled.", "asserted_value": "Note states heights are indicated, but they are not present on the plan."}], "recommended_resolution": "Add ceiling height tags to all rooms or areas with suspended ceilings on the Reflected Ceiling Plan (A22.01).", "code_reference": null}, {"issue_id": "CON-007", "source_stage": "constructability", "category": "access_clearance", "severity": "critical", "confidence": "high", "location": "INVENTORY Room, West Wall", "disciplines": ["Architectural", "Plumbing"], "sheets": ["A24.01", "P02.02"], "description": "The Architectural plan shows a Network Rack System to be mounted on the west wall of the INVENTORY room, while the Plumbing plan shows the Electric Water Heater (EWH-1) mounted in the exact same location. These two pieces of equipment cannot occupy the same space, creating a direct spatial clash. This was identified in both conflict and constructability reviews.", "evidence": [{"discipline": "Architectural", "sheet": "A24.01", "source_text": "RACK SYSTEM ABOVE SAFE @ -74\" TO BOTTOM", "asserted_value": "Network Rack is located on west wall of Inventory room."}, {"discipline": "Plumbing", "sheet": "P02.02", "source_text": "EWH-1", "asserted_value": "Electric Water Heater is located on west wall of Inventory room."}], "recommended_resolution": "Coordinate the architectural, plumbing, and electrical drawings to relocate either the network rack or the water heater. It is strongly advised not to locate water-bearing equipment above or adjacent to sensitive electronic equipment.", "code_reference": null}, {"issue_id": "CON-008", "source_stage": "constructability", "category": "support_anchorage", "severity": "critical", "confidence": "high", "location": "Roof", "disciplines": ["Architectural", "Mechanical"], "sheets": ["A25.01", "M01.01", "M02.02"], "description": "The Architectural Roof Plan (A25.01) shows a location for only one new Rooftop Unit (RTU), while the Mechanical Roof Plan (M02.02) and schedule (M01.01) clearly indicate two new RTUs (RTU-1 & RTU-2). This discrepancy risks that structural support and roof curbs may only be provided for one unit.", "evidence": [{"discipline": "Architectural", "sheet": "A25.01", "source_text": "2 NEW RTU, PROVIDE NEW MECHANICAL ROOF CURBS AS NECESSARY...", "asserted_value": "Architectural roof plan shows one graphic location for 'NEW RTU'."}, {"discipline": "Mechanical", "sheet": "M02.02", "source_text": "RTU-1, RTU-2", "asserted_value": "Mechanical roof plan shows two distinct RTUs."}, {"discipline": "Mechanical", "sheet": "M01.01", "source_text": "TAG: RTU-1,2; MFR. CARRIER; MODEL 50FE-M07", "asserted_value": "Mechanical schedule lists two RTUs."}], "recommended_resolution": "The Architectural and Mechanical plans must be coordinated. The Architectural Roof Plan should be updated to show the correct quantity and locations for both RTUs to ensure proper structural and roofing provisions are made.", "code_reference": null}, {"issue_id": "CON-009", "source_stage": "qaqc", "category": "missing_sheet", "severity": "high", "confidence": "high", "location": "Structural Series (S)", "disciplines": ["Structural", "Architectural", "Mechanical", "Electrical"], "sheets": ["A25.01", "M01.01", "E05.02"], "description": "There are no Structural ('S') drawings in the set. The scope includes new rooftop units and suspended transformers, which require structural analysis of the existing structure and design of new supports. Bidding and permitting cannot proceed without structural drawings or a structural engineer's review.", "evidence": [{"discipline": "Mechanical", "sheet": "M01.01", "source_text": "DESCRIPTION ROOFTOP A/C UNIT...WEIGHT (LBS) 711", "asserted_value": "New rooftop equipment with significant weight is part of the scope."}, {"discipline": "Electrical", "sheet": "E05.02", "source_text": "VERIFY SUPPORT SIZING AND DESIGNED WITH PROJECT STRUCTURAL ENGINEER PRIOR TO ASSEMBLY.", "asserted_value": "Note explicitly requires coordination with a project structural engineer, but no structural engineer is listed and no S-drawings are provided."}], "recommended_resolution": "Engage a structural engineer and incorporate structural drawings and details for all new equipment supports, penetrations, and structural modifications.", "code_reference": null}, {"issue_id": "CON-010", "source_stage": "qaqc", "category": "permit_readiness", "severity": "high", "confidence": "high", "location": "Life Safety Systems", "disciplines": ["Fire Protection", "Electrical", "Architectural"], "sheets": ["G11.03", "A22.01", "E04.01"], "description": "The drawing set lacks dedicated Fire Sprinkler and Fire Alarm plans. While new devices are shown on architectural plans, there are no system plans showing full layouts, routing, or calculations. These plans are required for a building permit, or must be explicitly noted as a deferred submittal.", "evidence": [{"discipline": "Architectural", "sheet": "A22.01", "source_text": "INSTALL NEW SPRINKLER HEADS AND LIGHT FIXTURES AT THE CENTER OF THE ACOUSTICAL CEILING PANEL U.N.O.", "asserted_value": "New sprinkler heads are in scope."}, {"discipline": "Architectural", "sheet": "A22.01", "source_text": "ALL WALL STROBES SHALL BE LOCATED @ +80\" AFF", "asserted_value": "New fire alarm devices are in scope."}, {"discipline": "General", "sheet": "G11.03", "source_text": "TENANT IS REQUIRED TO USE LANDLORD'S FIRE ALARM MONITORING COMPANY TO CONNECT TENANT'S SYSTEM TO LANDLORD'S FIRE ALARM PANEL.", "asserted_value": "A tenant fire alarm system is required."}], "recommended_resolution": "Provide dedicated fire sprinkler and fire alarm plans, including device layouts, riser diagrams, and specifications, or add a note to the General and Life Safety sheets stating that these systems will be provided as a deferred submittal.", "code_reference": null}, {"issue_id": "CON-011", "source_stage": "constructability", "category": "detail_gap", "severity": "high", "confidence": "high", "location": "Ceilings, throughout space", "disciplines": ["Architectural", "General"], "sheets": ["A22.01", "A23.01", "G31.05"], "description": "There is a fundamental conflict in the ceiling material specified. The Reflected Ceiling Plan (A22.01) and Finish Plan (A23.01) both specify an acoustical tile ceiling (AT-1), but the Gypsum Board specification (G31.05) includes a specification for 5/8\" gypsum board on ceilings. This ambiguity affects bidding and construction sequencing.", "evidence": [{"discipline": "Architectural", "sheet": "A23.01", "source_text": "N. CEILING THROUGHOUT ENTIRE SPACE TO BE AT-1 ACOUSTIC CEILING TILE WITH C4-A CEILING GRID.", "asserted_value": "Acoustic Tile Ceiling"}, {"discipline": "General", "sheet": "G31.05", "source_text": "THICKNESS: ... B. CEILINGS: 5/8 INCH.", "asserted_value": "Gypsum Board Ceiling"}], "recommended_resolution": "Clarify the intended ceiling material. If both are used, the plans and specifications must be updated to clearly delineate the locations of each ceiling type. If only one type is intended, the conflicting information should be removed.", "code_reference": null}, {"issue_id": "CON-012", "source_stage": "constructability", "category": "access_clearance", "severity": "high", "confidence": "high", "location": "LOUNGE", "disciplines": ["Architectural", "Electrical"], "sheets": ["A24.01", "E01.02"], "description": "The Architectural plan shows a single generic 'PANEL' symbol in the Lounge. However, the Electrical Panel Schedules list two separate panels, 'H' and 'L', to be located in the Lounge. The architectural plan fails to account for the space required for two panels, creating a risk of insufficient wall space and clearance violations.", "evidence": [{"discipline": "Architectural", "sheet": "A24.01", "source_text": "PANEL", "asserted_value": "One panel symbol shown on plan"}, {"discipline": "Electrical", "sheet": "E01.02", "source_text": "PANEL NAME H, LOCATION LOUNGE... PANEL NAME L, LOCATION LOUNGE", "asserted_value": "Two panels scheduled in Lounge"}], "recommended_resolution": "Coordinate the architectural and electrical plans. Update the architectural plan to show the correct quantity, size, and location of both electrical panels 'H' and 'L' to ensure adequate space and support are provided.", "code_reference": null}, {"issue_id": "CON-013", "source_stage": "qaqc", "category": "missing_detail", "severity": "high", "confidence": "high", "location": "A24.01 / Note G", "disciplines": ["Architectural"], "sheets": ["A24.01"], "description": "Sheet A24.01 contains Note G, which directs the user to 'Refer to detail 3/A92.01 for foundation pour back detail'. Sheet A92.01 does not exist in the drawing set. This is a reference to a missing, critical construction detail.", "evidence": [{"discipline": "Architectural", "sheet": "A24.01", "source_text": "G. REFER TO DETAIL 3/A92.01 FOR FOUNDATION POUR BACK DETAIL WHERE EXISTING SLAB IS CUT.", "asserted_value": "3/A92.01"}], "recommended_resolution": "Provide sheet A92.01 with the required foundation pour back detail or correct the reference to point to an existing detail.", "code_reference": null}, {"issue_id": "CON-014", "source_stage": "constructability", "category": "dimension_closure", "severity": "high", "confidence": "high", "location": "A51.01 - Typical Restroom Details", "disciplines": ["Architectural", "Plumbing"], "sheets": ["A51.01"], "description": "Accessibility information on the restroom lavatory detail A51.01 contains a direct contradiction. Two conflicting dimensions are provided for toe clearance: '9\" MIN. TOE CLEAR' and '6\" MAX. TOE CLEAR'. It is impossible to build to these dimensions. This was identified in QAQC, code, and constructability reviews.", "evidence": [{"discipline": "Architectural", "sheet": "A51.01", "source_text": "9\" MIN. TOE CLEAR", "asserted_value": "9\" MINIMUM"}, {"discipline": "Architectural", "sheet": "A51.01", "source_text": "6\" MAX. TOE CLEAR", "asserted_value": "6\" MAXIMUM"}], "recommended_resolution": "Correct the lavatory detail on sheet A51.01 to show a single, valid, and compliant dimension for toe clearance per the applicable accessibility code (e.g., TAS or ADA).", "code_reference": "ADA 606.2"}, {"issue_id": "CON-015", "source_stage": "code", "category": "ada", "severity": "high", "confidence": "high", "location": "Men's and Women's Restrooms", "disciplines": ["Architectural"], "sheets": ["G21.01", "A51.01"], "description": "In both single-user restrooms, the entry door swings inward and obstructs the required clear floor space for the lavatory. This prevents an individual using a wheelchair from using the sink after entering and closing the door. This was flagged in multiple code reviews.", "evidence": [{"discipline": "Architectural", "sheet": "G21.01", "source_text": "MEN'S RESTROOM", "asserted_value": "The floor plan shows the door swing path covering the required clear floor space at the lavatory."}, {"discipline": "Architectural", "sheet": "A51.01", "source_text": "WOMEN'S / RESTROOM, PLAN 1/2\" = 1'-0\"", "asserted_value": "Door swings into lavatory clear floor space"}], "recommended_resolution": "Revise the restroom layout to ensure the door swing does not encroach on any fixture's required clear floor space, or verify that the required 30\"x48\" clear space exists beyond the arc of the door swing per ADA 603.2.3 Exception 2.", "code_reference": "ADA 603.2.3"}, {"issue_id": "CON-016", "source_stage": "code", "category": "fire_separation", "severity": "high", "confidence": "high", "location": "Specification Section 081113, Sheet G31.04", "disciplines": ["Architectural", "Specifications"], "sheets": ["G31.04"], "description": "The specification for fire-rated doors contains conflicting and incorrect requirements. It specifies a '90 minute rated Class C' door, which is a contradiction; Class C doors are 20-minute, while 90-minute doors are Class B. This confusion could lead to installation of improperly rated door assemblies.", "evidence": [{"discipline": "General", "sheet": "G31.04", "source_text": "WHERE REQUIRED, INSTALLED FRAME AND DOOR ASSEMBLY SHALL CONFORM TO A 90 MINUTE RATED CLASS C INDICATED.", "asserted_value": "90"}, {"discipline": "General", "sheet": "G31.04", "source_text": "INCLUDE 1-HOUR LABEL ON FIRE RATED DOOR ASSEMBLIES LOCATED AT 1 HOUR RATED EXIT CORRIDORS.", "asserted_value": "1-hour"}], "recommended_resolution": "Revise specification 081113 to align with IBC Chapter 7. Use the forthcoming Door Schedule to clearly indicate the required rating and class for each opening based on its wall assembly.", "code_reference": "IBC Chapter 7"}, {"issue_id": "CON-017", "source_stage": "code", "category": "ada", "severity": "high", "confidence": "high", "location": "Lighting Fixture Schedule / Lighting Plan", "disciplines": ["Electrical", "Architectural"], "sheets": ["E01.02", "E03.01", "A22.01"], "description": "Pendant light fixtures L-5 and L-6 are scheduled with a mounting height of 5'-5\" (65 inches) AFF. If these fixtures are located within a path of travel, they are a head-height obstruction, violating the 80-inch minimum vertical clearance requirement and presenting a hazard.", "evidence": [{"discipline": "Electrical", "sheet": "E01.02", "source_text": "TYPE: L-5, DESCRIPTION: 12\" PENDANT, MOUNTING: PENDANT, NOTES: PENDANT 5'-5\" AFF", "asserted_value": "65"}, {"discipline": "Electrical", "sheet": "E01.02", "source_text": "TYPE: L-6, DESCRIPTION: 16\" PENDANT, MOUNTING: PENDANT, NOTES: PENDANT 5'-5\" AFF", "asserted_value": "65"}, {"discipline": "Architectural", "sheet": "A22.01", "source_text": "PENDANT 5'-5\" AFF", "asserted_value": "65"}], "recommended_resolution": "Verify the locations of light fixture types L-5 and L-6. If they are over any circulation path, raise the mounting height to provide at least 80 inches of clearance from the floor to the bottom of the fixture.", "code_reference": "ADA 307.4"}, {"issue_id": "CON-018", "source_stage": "code", "category": "ada", "severity": "high", "confidence": "high", "location": "Men's and Women's Restrooms", "disciplines": ["Plumbing", "Architectural", "Electrical"], "sheets": ["P01.01", "E04.01"], "description": "The drawing set lacks dimensioned floor plans or enlarged plans of the restrooms to verify accessibility compliance. Although fixtures are specified as 'A.D.A.', there is no information to confirm required clearances for water closets, lavatories, compartment size, or door maneuvering.", "evidence": [{"discipline": "Plumbing", "sheet": "P01.01", "source_text": "WATER CLOSET (FLOOR MOUNTED) (A.D.A.)", "asserted_value": "Floor Mounted"}, {"discipline": "Plumbing", "sheet": "P01.01", "source_text": "LAVATORY (WALL MOUNTED) (A.D.A.)", "asserted_value": "true"}], "recommended_resolution": "Provide enlarged and fully dimensioned plans and elevations of the restrooms, demonstrating compliance with all applicable TAS and ADA requirements for compartment size, door maneuvering, fixture clearances, and knee/toe space.", "code_reference": "ADA 603, 604, 606"}, {"issue_id": "CON-019", "source_stage": "code", "category": "ada", "severity": "high", "confidence": "high", "location": "Women's Restroom", "disciplines": ["Plumbing", "Architectural"], "sheets": ["P02.01"], "description": "The plans indicate the only drinking fountain (EDF-1) is located inside the Women's Restroom. This denies access to drinking water for other occupants and does not provide equitable access to building amenities.", "evidence": [{"discipline": "Plumbing", "sheet": "P02.01", "source_text": "EDF-1", "asserted_value": "EDF-1 is located in WOMEN'S ROOM."}], "recommended_resolution": "Relocate the drinking fountain to a common use area accessible to all occupants, such as a corridor. If only one fountain is provided, it must be a hi-lo unit to serve both standing persons and wheelchair users.", "code_reference": "IBC 2902.3"}, {"issue_id": "CON-020", "source_stage": "constructability", "category": "support_anchorage", "severity": "high", "confidence": "high", "location": "LOUNGE and INVENTORY room ceiling space", "disciplines": ["Plumbing", "Electrical", "Structural"], "sheets": ["E02.01", "E05.02", "P02.02", "P03.01"], "description": "Heavy equipment, including a transformer and a 30-gallon water heater, is specified to be suspended from the structure. The supporting details are incomplete and defer final design to the contractor and a 'project structural engineer,' who is not identified in the set. The contractor cannot build or price this work without a complete, engineered design for anchoring these heavy point loads.", "evidence": [{"discipline": "Electrical", "sheet": "E05.02", "source_text": "VERIFY SUPPORT SIZING AND DESIGNED WITH PROJECT STRUCTURAL ENGINEER PRIOR TO ASSEMBLY.", "asserted_value": "Suspended transformer support requires external engineering."}, {"discipline": "Plumbing", "sheet": "P03.01", "source_text": "2\" UNISTRUT SUPPORT. 1/2\" ALL THREADED RODS COMPLETE WITH DOUBLE NUTS AND LOCK WASHERS.", "asserted_value": "Water heater support detail does not specify connection to primary structure."}], "recommended_resolution": "Provide complete, engineered structural details for suspending the transformer and the water heater. Details must show the connection method to the primary building structure and specify all required members, bracing, and fasteners.", "code_reference": null}, {"issue_id": "CON-021", "source_stage": "conflict", "category": "elevation_disagreement", "severity": "medium", "confidence": "high", "location": "INVENTORY Room, west wall", "disciplines": ["Architectural", "Electrical"], "sheets": ["A24.01", "E04.01"], "description": "The architectural plan specifies the network rack bottom is to be mounted at 74 inches AFF, but the special systems plan shows the corresponding data outlets terminating at 18 inches AFF on the same wall. The significant separation between the equipment and its connections is impractical. This was noted in conflict and constructability reviews.", "evidence": [{"discipline": "Architectural", "sheet": "A24.01", "source_text": "RACK SYSTEM ABOVE SAFE @ -74\" TO BOTTOM", "asserted_value": "74\" AFF"}, {"discipline": "Electrical", "sheet": "E04.01", "source_text": "(2) CAT.6/18\"", "asserted_value": "18\" AFF"}], "recommended_resolution": "Coordinate the data outlet mounting height with the network rack configuration. Relocate the data outlets to a height appropriate for termination within or immediately adjacent to the rack system.", "code_reference": null}, {"issue_id": "CON-022", "source_stage": "constructability", "category": "detail_gap", "severity": "medium", "confidence": "high", "location": "Slab Penetration Pour Back", "disciplines": ["General", "Plumbing"], "sheets": ["G11.03", "P03.01"], "description": "There are conflicting specifications for the vapor barrier at slab pour-backs. The Landlord Work Letter (G11.03) mandates a '15 Mil vapor barrier', while a Plumbing detail (P03.01) specifies a 'MINIMUM 6-MIL' vapor retarder. The contractor needs a single requirement. This was noted in conflict and constructability reviews.", "evidence": [{"discipline": "General", "sheet": "G11.03", "source_text": "b. The Tenant shall fire caulk the opening for any penetrations into the roof deck and at any penetrations. Demolising concrete slab shall be poured back complete with the following items as a minimum: ... ii. 15 Mil vapor barrier", "asserted_value": "15 Mil vapor barrier"}, {"discipline": "Plumbing", "sheet": "P03.01", "source_text": "PER 2021 IBC, CHAPTER 19, SECTION 1907: POLYETHYLENE VAPOR RETARDER MINIMUM 6-MIL SHALL BE REQUIRED.", "asserted_value": "6-mil Polyethylene vapor retarder minimum"}], "recommended_resolution": "Clarify the required vapor barrier thickness. Landlord requirements are typically governing, so the plumbing detail should be revised to match the 15 Mil requirement if correct.", "code_reference": null}, {"issue_id": "CON-023", "source_stage": "constructability", "category": "detail_gap", "severity": "medium", "confidence": "high", "location": "Fire Rated Penetrations", "disciplines": ["Electrical", "Plumbing", "General"], "sheets": ["E05.01", "P01.01", "G31.04"], "description": "An Electrical detail prescriptively calls for a '3 HOUR RATED CAULK' at penetrations. This contradicts general notes (P01.01, G31.04) which require firestopping assemblies to have a rating equal to that of the construction being penetrated. This creates ambiguity and potential for non-compliant or over-specified installations. This was noted in conflict and constructability reviews.", "evidence": [{"discipline": "Electrical", "sheet": "E05.01", "source_text": "PACK BOTH ENDS OF SLEEVE WITH 3M FIRE DAM 150 3 HOUR RATED CAULK OR APPROVED EQUAL", "asserted_value": "3 HOUR RATED CAULK"}, {"discipline": "General", "sheet": "G31.04", "source_text": "FIRESTOPPING: TESTED IN ACCORDANCE WITH ASTM E119 OR UL 263 TO MEET THE HOURLY F-RATINGS OF THE CONSTRUCTION BEING PENETRATED.", "asserted_value": "MEET THE HOURLY F-RATINGS OF THE CONSTRUCTION BEING PENETRATED"}], "recommended_resolution": "Revise the electrical detail to require a UL-listed firestop assembly with an F-rating equal to or greater than the fire-resistance rating of the assembly being penetrated, consistent with project-wide notes.", "code_reference": null}, {"issue_id": "CON-024", "source_stage": "qaqc", "category": "missing_sheet", "severity": "medium", "confidence": "high", "location": "Architectural Series (Exterior Elevations)", "disciplines": ["Architectural"], "sheets": ["A22.01", "A51.01"], "description": "The drawing set lacks exterior building elevations. A note on the RCP (A22.01) states 'PROVIDE POWER FOR BUILDING SIGN', indicating new exterior signage is part of the work. Exterior elevations are required to define the location, size, and specifications for the new sign.", "evidence": [{"discipline": "Architectural", "sheet": "A22.01", "source_text": "PROVIDE POWER FOR BUILDING SIGN", "asserted_value": "New exterior signage is in scope."}], "recommended_resolution": "Add exterior elevation sheets to the drawing set, clearly indicating the design and placement of the new building sign.", "code_reference": null}, {"issue_id": "CON-025", "source_stage": "qaqc", "category": "bid_readiness", "severity": "medium", "confidence": "high", "location": "A23.01 - FINISH PLAN", "disciplines": ["Interiors"], "sheets": ["A23.01"], "description": "The finish documentation is incomplete. While a Finish Plan with material tags is provided, a comprehensive Room Finish Schedule in a matrix format is missing. Using general notes like 'PC-1 throughout, U.N.O.' creates ambiguity and increases bidder risk.", "evidence": [{"discipline": "Interiors", "sheet": "A23.01", "source_text": "K. POLISHED CONCRETE FLOOR PC-1 THROUGHOUT, U.N.O.", "asserted_value": "A general note is used in place of specific room-by-room designation."}, {"discipline": "Interiors", "sheet": "A23.01", "source_text": "L. WALLS TO BE PAINTED P-1 THROUGHOUT.", "asserted_value": "A general note is used for all walls, which may not be accurate for wet areas or accent walls."}], "recommended_resolution": "Add a Room Finish Schedule that lists every room and clearly specifies the floor, base, wall, and ceiling finish for each.", "code_reference": null}, {"issue_id": "CON-026", "source_stage": "code", "category": "ada", "severity": "medium", "confidence": "high", "location": "Specification Section 09 30 00, Sheet G31.05 and A23.01", "disciplines": ["Architectural", "Interiors", "Specifications"], "sheets": ["G31.05", "A23.01"], "description": "The specification for tile slip resistance references ASTM C1028 for Static Coefficient of Friction (SCOF), which is an obsolete standard withdrawn in 2014. Additionally, conflicting SCOF values of 0.6 and 0.5 are specified. Using an outdated standard and conflicting values may result in non-compliant flooring.", "evidence": [{"discipline": "General", "sheet": "G31.05", "source_text": "STATIC COEFFICIENT OF FRICTION: MIN. 0.6 FOR LEVEL SURFACES, MIN. 0.42 FOR RAMPS PER ASTM C1028 OR ANSI A137.1.", "asserted_value": "min 0.6 SCOF"}, {"discipline": "Architectural", "sheet": "A23.01", "source_text": "SLIP RESISTANCE OF FLOOR TO BE NO LESS THAN A 0.50 STATIC COEFFICIENT OF FRICTION (SCOF)", "asserted_value": "0.5"}], "recommended_resolution": "Update the specification to reference the current standard, ANSI A326.3, and specify a required Dynamic Coefficient of Friction (DCOF) value (e.g., >= 0.42 for interior wet areas) to ensure compliance and resolve the internal conflict.", "code_reference": null}, {"issue_id": "CON-027", "source_stage": "code", "category": "ada_review", "severity": "medium", "confidence": "high", "location": "Lounge", "disciplines": ["Architectural"], "sheets": ["A51.01"], "description": "The employee lounge sink is shown with a standard cabinet underneath, which likely does not provide the required knee and toe clearance for a forward approach by a wheelchair user.", "evidence": [{"discipline": "Architectural", "sheet": "A51.01", "source_text": "3'-0\"", "asserted_value": "36"}], "recommended_resolution": "Revise the cabinetry detail to provide knee and toe clearance compliant with ADA 306, or confirm if a parallel approach is sufficient per code exceptions and ensure adequate clear floor space is provided.", "code_reference": "ADA 606.2"}, {"issue_id": "CON-028", "source_stage": "code", "category": "ada_review", "severity": "medium", "confidence": "high", "location": "Inventory Room", "disciplines": ["Architectural", "Electrical"], "sheets": ["A24.01"]}]} \ No newline at end of file diff --git a/backend/.llm_cache/91ee4df2c43730a64eaa48f896fad41b4cc76069244a5fb1376bf25b8e60bd0a.json b/backend/.llm_cache/91ee4df2c43730a64eaa48f896fad41b4cc76069244a5fb1376bf25b8e60bd0a.json new file mode 100644 index 0000000..7d68505 --- /dev/null +++ b/backend/.llm_cache/91ee4df2c43730a64eaa48f896fad41b4cc76069244a5fb1376bf25b8e60bd0a.json @@ -0,0 +1 @@ +[{"assertion_id": "G31.04#9", "original_value": "250", "normalized_value": "250", "normalized_unit": "g/L", "normalized_attribute": "VOC_content_max", "normalization_notes": "VOC content limit. Unit 'grams/liter' inferred from source text.", "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": "Unit 'minutes' inferred from source text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"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 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_min", "normalization_notes": "Unit 'gage' inferred from source text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#13", "original_value": "7", "normalized_value": "7", "normalized_unit": "gauge", "normalized_attribute": "hinge_reinforcement_thickness_min", "normalization_notes": "Unit 'gage' inferred from source text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#14", "original_value": "16", "normalized_value": "16", "normalized_unit": "gauge", "normalized_attribute": "lock_reinforcement_thickness_min", "normalization_notes": "Unit 'gage' inferred from source text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#15", "original_value": "14", "normalized_value": "14", "normalized_unit": "gauge", "normalized_attribute": "closer_reinforcement_thickness_min", "normalization_notes": "Unit 'gage' inferred from source text. The note also specifies a length of 20 inches.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#16", "original_value": "1-3/4", "normalized_value": "1.75", "normalized_unit": "inches", "normalized_attribute": "door_thickness", "normalization_notes": "Unit 'inch' inferred from source text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#17", "original_value": "1/8 inch at head and each jamb.", "normalized_value": "0.125", "normalized_unit": "inches", "normalized_attribute": "clearance_head", "normalization_notes": "Parsed from a value specifying clearances for multiple locations.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#17", "original_value": "1/8 inch at head and each jamb.", "normalized_value": "0.125", "normalized_unit": "inches", "normalized_attribute": "clearance_jamb", "normalization_notes": "Parsed from a value specifying clearances for multiple locations.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#18", "original_value": "3/8", "normalized_value": "0.375", "normalized_unit": "inches", "normalized_attribute": "undercut", "normalization_notes": "Unit 'inch' inferred from source text. Applies at sill where no threshold.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.05#0", "original_value": "16", "normalized_value": "16", "normalized_unit": "inches", "normalized_attribute": "stud_spacing_on_center", "normalization_notes": "Unit 'inches on center' inferred from source text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.05#1", "original_value": "Required for framed openings, wall-mounted cabinets, plumbing fixtures, wall mounted door hardware.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "blocking_requirement", "normalization_notes": "Value is a descriptive list of requirements.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.05#2", "original_value": "Not more than 30 feet apart", "normalized_value": "360", "normalized_unit": "inches", "normalized_attribute": "control_joint_spacing_max", "normalization_notes": "Converted from 30 feet.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.05#3", "original_value": "4", "normalized_value": "4", "normalized_unit": "level", "normalized_attribute": "gypsum_board_finish_level", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.05#4", "original_value": "2", "normalized_value": "2", "normalized_unit": "level", "normalized_attribute": "gypsum_board_finish_level", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.05#5", "original_value": "1", "normalized_value": "1", "normalized_unit": "level", "normalized_attribute": "gypsum_board_finish_level", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.05#6", "original_value": "1/8 in 10 ft", "normalized_value": "0.125", "normalized_unit": "inches", "normalized_attribute": "tolerance_max_variation", "normalization_notes": "Maximum variation component of the '1/8 in 10 ft' tolerance specification.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.05#6", "original_value": "1/8 in 10 ft", "normalized_value": "120", "normalized_unit": "inches", "normalized_attribute": "tolerance_measurement_length", "normalization_notes": "Measurement length component of the '1/8 in 10 ft' tolerance specification, converted from '10 ft'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.05#7", "original_value": "5/8 inch thick", "normalized_value": "0.625", "normalized_unit": "inches", "normalized_attribute": "material_thickness", "normalization_notes": "Applies to vertical surfaces.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.05#8", "original_value": "5/8", "normalized_value": "0.625", "normalized_unit": "inches", "normalized_attribute": "material_thickness", "normalization_notes": "Applies to ceilings. Unit 'inch' inferred from context.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.05#9", "original_value": "5/8", "normalized_value": "0.625", "normalized_unit": "inches", "normalized_attribute": "material_thickness", "normalization_notes": "Unit 'inch' inferred from source text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.05#10", "original_value": "min 0.6 SCOF", "normalized_value": "0.6", "normalized_unit": "SCOF", "normalized_attribute": "slip_resistance_min_level", "normalization_notes": "Minimum Static Coefficient of Friction for level surfaces.", "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_min_ramp", "normalization_notes": "Minimum Static Coefficient of Friction for ramps.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.05#12", "original_value": "1/2", "normalized_value": "0.5", "normalized_unit": "inches", "normalized_attribute": "material_thickness_min", "normalization_notes": "Unit 'inch' and 'minimum' qualifier inferred from source text for cementitious backer board.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.05#13", "original_value": "Polymer-modified sanded grout (ANSI A118.7)", "normalized_value": "Polymer-modified sanded grout", "normalized_unit": null, "normalized_attribute": "material_type", "normalization_notes": "Standard ANSI A118.7 applies.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.05#14", "original_value": "Waterproof membrane for wet areas", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "material_requirement", "normalization_notes": "Value is a descriptive requirement.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.05#15", "original_value": "1/4 in 10 ft", "normalized_value": "0.25", "normalized_unit": "inches", "normalized_attribute": "substrate_deviation_max", "normalization_notes": "Maximum deviation component of the '1/4 in 10 ft' tolerance specification.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.05#15", "original_value": "1/4 in 10 ft", "normalized_value": "120", "normalized_unit": "inches", "normalized_attribute": "substrate_deviation_measurement_length", "normalization_notes": "Measurement length component of the '1/4 in 10 ft' tolerance specification, converted from '10 ft'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.06#0", "original_value": "1, 2, 3 or 4", "normalized_value": "1, 2, 3, 4", "normalized_unit": "hours", "normalized_attribute": "wall_rating", "normalization_notes": "Represents multiple possible ratings for nonbearing walls. Unit 'Hr' inferred from source text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.06#1", "original_value": "Channel shaped, fabricated from min 25 MSG corrosion-protected steel", "normalized_value": "25", "normalized_unit": "MSG", "normalized_attribute": "material_thickness_min", "normalization_notes": "Extracted from descriptive value. MSG stands for Manufacturer's Standard Gauge.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"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": "fastener_spacing_max_on_center", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.06#3", "original_value": "24", "normalized_value": "24", "normalized_unit": "inches", "normalized_attribute": "stud_spacing_max_on_center", "normalization_notes": "Unit and qualifier 'max OC' inferred from source text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.06#4", "original_value": "cut 3/8 to 3/4 in. less than assembly height", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "stud_length", "normalization_notes": "Stud length is relative to assembly height, specified as a range: 3/8-inch to 3/4-inch less.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.06#5", "original_value": "1-5/8", "normalized_value": "1.625", "normalized_unit": "inches", "normalized_attribute": "stud_depth_min", "normalization_notes": "Unit 'inches' and 'Min' qualifier inferred from source text. Applies to 1-hour rating.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.06#6", "original_value": "1 layer, 1/2 in. thick", "normalized_value": "1", "normalized_unit": null, "normalized_attribute": "gypsum_board_layers", "normalization_notes": "Applies to 1-hour rating.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.06#6", "original_value": "1 layer, 1/2 in. thick", "normalized_value": "0.5", "normalized_unit": "inches", "normalized_attribute": "gypsum_board_thickness", "normalization_notes": "Applies to 1-hour rating.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.06#7", "original_value": "1 layer, 5/8 in. thick", "normalized_value": "1", "normalized_unit": null, "normalized_attribute": "gypsum_board_layers", "normalization_notes": "Applies to 1.5-hour rating.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.06#7", "original_value": "1 layer, 5/8 in. thick", "normalized_value": "0.625", "normalized_unit": "inches", "normalized_attribute": "gypsum_board_thickness", "normalization_notes": "Applies to 1.5-hour rating.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.06#8", "original_value": "2 layers, 1/2 in. thick", "normalized_value": "2", "normalized_unit": null, "normalized_attribute": "gypsum_board_layers", "normalization_notes": "Applies to 2-hour rating.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.06#8", "original_value": "2 layers, 1/2 in. thick", "normalized_value": "0.5", "normalized_unit": "inches", "normalized_attribute": "gypsum_board_thickness_per_layer", "normalization_notes": "Applies to 2-hour rating.", "source_text_preserved": true, "normalization_confidence": "high"}, {"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": "Standardized capitalization and punctuation.", "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": "Standardized capitalization.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"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": "Standardized capitalization. Applies to Building B.", "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": "Standardized capitalization. Applies to Building C.", "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": "Standardized capitalization. Applies to Building D.", "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": "Standardized capitalization. Applies to Building E.", "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": "Standardized capitalization. Applies to Building F.", "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": "Standardized capitalization. Applies to Building G.", "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": "Standardized capitalization. Applies to Building H.", "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": "Standardized capitalization. Applies to Building J.", "source_text_preserved": true, "normalization_confidence": "high"}] \ No newline at end of file diff --git a/backend/.llm_cache/92cee23aa60a99f9e4c45a739e9228bb087b3d36c0eeea21834e49f141dafb1d.json b/backend/.llm_cache/92cee23aa60a99f9e4c45a739e9228bb087b3d36c0eeea21834e49f141dafb1d.json new file mode 100644 index 0000000..0a9feeb --- /dev/null +++ b/backend/.llm_cache/92cee23aa60a99f9e4c45a739e9228bb087b3d36c0eeea21834e49f141dafb1d.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "a2301_001", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "Throughout Entire Space", "disciplines": ["Architectural"], "sheets": ["A23.01"], "description": "The Finish Legend specifies two contradictory ceiling tile edge conditions for the same ceiling system. The AT-1 'Acoustic Ceiling Tile' specification calls for an 'Angled Tegular' edge profile, while the C4-A 'Ceiling Tile Grid' specification calls for a 'Square Lay In' edge profile. A tile cannot have both edge conditions, and these two profiles are not interchangeable within the same grid system. This must be clarified before materials are procured.", "evidence": [{"discipline": "Architectural", "sheet": "A23.01", "source_text": "AT ACOUSTIC CEILING TILE... EDGE PROFILE: ANGLED TEGULAR 15/16\"", "asserted_value": "ANGLED TEGULAR 15/16\""}, {"discipline": "Architectural", "sheet": "A23.01", "source_text": "C4 CEILING TILE GRID... EDGE PROFILE: 15/16\" SQUARE LAY IN", "asserted_value": "15/16\" SQUARE LAY IN"}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/92f905bdcf5cc7eedc1156e45da9d54f2a7cf9a98cb7242343be0d4ee4785638.json b/backend/.llm_cache/92f905bdcf5cc7eedc1156e45da9d54f2a7cf9a98cb7242343be0d4ee4785638.json new file mode 100644 index 0000000..d5ea8b2 --- /dev/null +++ b/backend/.llm_cache/92f905bdcf5cc7eedc1156e45da9d54f2a7cf9a98cb7242343be0d4ee4785638.json @@ -0,0 +1 @@ +{"normalized_assertions": [{"assertion_id": "G01.01#0", "original_value": "VERIZON ELYSON", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G01.01#1", "original_value": "7022 ELYSON EXCHANGE WAY CYPRESS, TX 77433", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G01.01#2", "original_value": "OWNER: CK WARWICK GROUP, LLC, CHRIS WARCWICK, P: 214-906-0048", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G01.01#3", "original_value": "ARCHITECT: ESTUDIO, PROJECT MANAGER KELLY BARNETT, 1824 SPRING STREET, SUITE 100 HOUSTON, TEXAS 77007, P: 713-433-5000", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G01.01#4", "original_value": "MEP: POWERS INDUSTRY, KAMIL BEY, 5718 WESTHEIMER RD SUITE 1000 HOUSTON, TX 77057, P: 1-(713) 560-1418", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G01.01#5", "original_value": "00.000.00", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G01.01#6", "original_value": "CLIENT REVIEW", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G01.01#7", "original_value": "2026-06-18", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G01.01#8", "original_value": "verizon", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G01.01#9", "original_value": "Copyright @ eStudio Architecture 2026.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.01#0", "original_value": "7022 ELYSON EXCHANGE WAY, CYPRESS, TX 77433", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.01#1", "original_value": "BUILDING C", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.01#2", "original_value": "Through-fire-resistive walls shall conform to the authority having jurisdiction's current adopted version of the IBC and local ammendments.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.01#3", "original_value": "75", "normalized_value": "75", "normalized_unit": "'", "normalized_attribute": "max_travel_distance", "normalization_notes": "Assumed feet unit due to context of fire extinguisher travel distance.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G11.01#4", "original_value": "Indicated from the floor elevation to the face of the structural slab, unless otherwise noted", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.01#5", "original_value": "Indicated in RCP's are from finished floor elevation to face of suspended ceiling system or finish material", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.01#6", "original_value": "Dimensions are to centerline of grid/steel unless noted otherwise.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.01#7", "original_value": "Dimensions are to face of cast in place or precast concrete walls unless noted otherwise.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.01#8", "original_value": "Dimensions are to nominal face of masonry walls unless noted otherwise.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.01#9", "original_value": "NFPA STD. 13", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.01#10", "original_value": "DESIGN #U419", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.02#0", "original_value": "36", "normalized_value": "36", "normalized_unit": "\"", "normalized_attribute": "knee_clearance_width", "normalization_notes": "Assumed inches unit due to context of knee clearance.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G11.02#1", "original_value": "34", "normalized_value": "34", "normalized_unit": "\"", "normalized_attribute": "counter_height_AFF", "normalization_notes": "Assumed inches unit due to context of counter height.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G11.02#2", "original_value": "28", "normalized_value": "28", "normalized_unit": "\"", "normalized_attribute": "knee_clearance_height", "normalization_notes": "Assumed inches unit due to context of knee clearance.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G11.02#3", "original_value": "48-60", "normalized_value": "48-60", "normalized_unit": "\"", "normalized_attribute": "mounting_height_range_AFF", "normalization_notes": "Assumed inches unit due to context of mounting height.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G11.02#4", "original_value": "4", "normalized_value": "4", "normalized_unit": "\"", "normalized_attribute": "protrusion_allowance", "normalization_notes": "Assumed inches unit due to context of protrusion allowance.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G11.02#5", "original_value": "30-36", "normalized_value": "30-36", "normalized_unit": "\"", "normalized_attribute": "counter_height_range_AFF", "normalization_notes": "Assumed inches unit due to context of counter height.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G11.02#6", "original_value": "33-36", "normalized_value": "33-36", "normalized_unit": "\"", "normalized_attribute": "mounting_height_range_AFF", "normalization_notes": "Assumed inches unit due to context of mounting height.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G11.02#7", "original_value": "250", "normalized_value": "250", "normalized_unit": "lbs", "normalized_attribute": "load_requirement", "normalization_notes": "Assumed pounds unit due to context of load requirement.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G11.02#8", "original_value": "30x48", "normalized_value": "30x48", "normalized_unit": "\"", "normalized_attribute": "clear_floor_space", "normalization_notes": "Assumed inches unit for both dimensions due to context of clear floor space.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G11.02#9", "original_value": "34", "normalized_value": "34", "normalized_unit": "\"", "normalized_attribute": "rim_height_AFF", "normalization_notes": "Assumed inches unit due to context of rim height.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G11.02#10", "original_value": "Insulate exposed pipes", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.02#11", "original_value": "40", "normalized_value": "40", "normalized_unit": "\"", "normalized_attribute": "mounting_height_AFF", "normalization_notes": "Assumed inches unit due to context of mounting height.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G11.02#12", "original_value": "48", "normalized_value": "48", "normalized_unit": "\"", "normalized_attribute": "mounting_height_AFF", "normalization_notes": "Assumed inches unit due to context of mounting height.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G11.03#0", "original_value": "9PM-7AM", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#1", "original_value": "600 Amp 277/480Volt", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#2", "original_value": "1 1/2\" valved or 2\" PVC/PEX", "normalized_value": "1 1/2\" valved or 2\" PVC/PEX", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Inches unit already present in the value.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#3", "original_value": "within the building shell ceiling", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#4", "original_value": "6\" grease and 6\" sanitary", "normalized_value": "6\" grease and 6\" sanitary", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Inches unit already present in the value.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#5", "original_value": "2' or more", "normalized_value": "2' or more", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Feet unit already present in the value.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#6", "original_value": "2500-gallon", "normalized_value": "2500-gallon", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Gallon unit already present in the value.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#7", "original_value": "ALL ROOF PENETRATIONS MUST BE MADE BY LANDLORD'S ROOFING CONTRACTOR, AT TENANTS COST.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#8", "original_value": "TENANT IS REQUIRED TO USE LANDLORD'S FIRE ALARM MONITORING COMPANY TO CONNECT TENANT'S SYSTEM TO LANDLORD'S FIRE ALARM PANEL.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#9", "original_value": "R-19", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#10", "original_value": "from finished floor slab to roof deck", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#11", "original_value": "1 exterior storefront door per each occupant's space", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#12", "original_value": "15 Mil", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#13", "original_value": "#4 bars 15\" OCEW (on center each way)", "normalized_value": "#4 bars 15\" OCEW (on center each way)", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Inches unit already present in the value.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#14", "original_value": "3000PSI", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#15", "original_value": "single story", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#16", "original_value": "PBC Roof Systems - 9119 Meadow Vista Blvd, Houston, TX 77064 1. 281-469-3622, Darrel Kirtley", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#17", "original_value": "BMF Solutions - 13602 Jarvis, Cypress, TX 77429 1. 832-220-1500 Tony Murray", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": "true", "normalization_confidence": "high"}, {"assertion_id": "G11.03#18", "original_value": "Impact Fire - 1 Chisolm Trail Road, Suite 330, Round Rock, TX 78681 1. 713-263-7535, James Fish", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#19", "original_value": "ConTor Glass - 27531 Gatlin Lane, Spring, TX 77386 1. 832-283-0599, Preston Wallace", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#20", "original_value": "10 day", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.04#0", "original_value": "Lease Space Build-out (LSBO)", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.04#1", "original_value": "Single Occupancy", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.04#2", "original_value": "75", "normalized_value": "75", "normalized_unit": "'", "normalized_attribute": "height_limitation", "normalization_notes": "Assumed feet unit due to context of height limitation.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G11.04#3", "original_value": "UNLIMITED", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.04#4", "original_value": "7022 ELYSON EXCHANGE WAY CYPRESS, TX 77433", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}]} \ No newline at end of file diff --git a/backend/.llm_cache/935fbec5bb113e4b935fa7af7f5109a488a00efd281b796f449b57b40e34b4c5.json b/backend/.llm_cache/935fbec5bb113e4b935fa7af7f5109a488a00efd281b796f449b57b40e34b4c5.json new file mode 100644 index 0000000..727df22 --- /dev/null +++ b/backend/.llm_cache/935fbec5bb113e4b935fa7af7f5109a488a00efd281b796f449b57b40e34b4c5.json @@ -0,0 +1 @@ +{"sheet_number": "A25.01", "discipline": "Architectural", "sheet_title": "ROOF PLAN", "level": "Roof", "scale": "1/4\" = 1'-0\"", "assertions": [{"subject": "General Note A", "attribute": "text_content", "value": "ROOF PLAN IS FOR REFERENCE ONLY. CONTRACTORS ARE TO VERIFY EXISTING CONDITIONS (DIMENSIONS, CLEARANCES, STRUCTURE TYPE, ETC.) IN THE FIELD.", "source_text": "A. ROOF PLAN IS FOR REFERENCE ONLY. CONTRACTORS ARE TO VERIFY EXISTING CONDITIONS (DIMENSIONS, CLEARANCES, STRUCTURE TYPE, ETC.) IN THE FIELD.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": "Roof", "tag": "GENERAL NOTES"}}, {"subject": "General Note B", "attribute": "text_content", "value": "CONTRACTOR TO REFER TO MECHANICAL DRAWINGS FOR ALL ROOFTOP UNIT REQUIREMENTS, DETAILS, AND SPECIFICATIONS.", "source_text": "B. CONTRACTOR TO REFER TO MECHANICAL DRAWINGS FOR ALL ROOFTOP UNIT REQUIREMENTS, DETAILS, AND SPECIFICATIONS.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": "Roof", "tag": "GENERAL NOTES"}}, {"subject": "General Note C", "attribute": "text_content", "value": "CONTRACTORS SHALL VERIFY LOCATIONS OF EXISTING SYSTEMS AND OPENINGS; SUCH AS EXISTING RTU'S, ROOF VENTS, HVAC, ROOF ACCESS, AND OTHER PENETRATIONS. VERIFY COORDINATIONS REQUIRED BETWEEN EXISTING PENETRATIONS AND EQUIPMENT WITH NEW.", "source_text": "C. CONTRACTORS SHALL VERIFY LOCATIONS OF EXISTING SYSTEMS AND OPENINGS; SUCH AS EXISTING RTU'S, ROOF VENTS, HVAC, ROOF ACCESS, AND OTHER PENETRATIONS, VERIFY COORDINATIONS REQUIRED BETWEEN EXISTING PENETRATIONS AND EQUIPMENT WITH NEW.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": "Roof", "tag": "GENERAL NOTES"}}, {"subject": "General Note D", "attribute": "text_content", "value": "REPAIR AND SEAL ROOF IF REQUIRED AROUND ALL NEW PENETRATIONS AND EQUIPMENT, PER MANUFACTURER'S RECOMMENDATIONS.", "source_text": "D. REPAIR AND SEAL ROOF IF REQUIRED AROUND ALL NEW PENETRATIONS AND EQUIPMENT, PER MANUFACTURER'S RECOMMENDATIONS.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": "Roof", "tag": "GENERAL NOTES"}}, {"subject": "Keynote 2", "attribute": "text_content", "value": "NEW RTU, PROVIDE NEW MECHANICAL ROOF CURBS AS NECESSARY TO ACCOMODATE NEW RTU. GC TO INSTALL FLASHING PER PER ROOFING MANUFACTURING STANDARDS. GC SHALL COORDINATE ROOF WORK WITH LL REQUIREMENTS TO MAINTAIN EXISTING ROOFING WARRANTY. REFER TO MEP DRAWINGS FOR MORE INFORMATION.", "source_text": "2 NEW RTU, PROVIDE NEW MECHANICAL ROOF CURBS AS NECESSARY TO ACCOMODATE NEW RTU. GC TO INSTALL FLASHING PER PER ROOFING MANUFACTURING STANDARDS. GC SHALL COORDINATE ROOF WORK WITH LL REQUIREMENTS TO MAINTAIN EXISTING ROOFING WARRANTY. REFER TO MEP DRAWINGS FOR MORE INFORMATION.", "confidence": "high", "location_key": {"grid": "B-C/4-5", "room": null, "level": "Roof", "tag": "2"}}, {"subject": "RTU", "attribute": "new_equipment_count", "value": "2", "source_text": "2", "confidence": "high", "location_key": {"grid": "B-C/4-5", "room": null, "level": "Roof", "tag": "2"}}, {"subject": "Mechanical Zone", "attribute": "clearance_dimension", "value": "6'-9\"", "source_text": "6'-9\"", "confidence": "high", "location_key": {"grid": "B-C/5", "room": null, "level": "Roof", "tag": null}}, {"subject": "Mechanical Zone", "attribute": "clearance_dimension", "value": "3'-3 1/4\"", "source_text": "3'-3 1/4\"", "confidence": "high", "location_key": {"grid": "B/4-5", "room": null, "level": "Roof", "tag": null}}, {"subject": "Roof Curb Detail", "attribute": "detail_title", "value": "ROOF CURB DETAIL", "source_text": "ROOF CURB DETAIL", "confidence": "high", "location_key": {"grid": null, "room": null, "level": "Roof", "tag": null}}, {"subject": "Roof Curb Detail", "attribute": "detail_scale", "value": "6\" = 1'-0\"", "source_text": "6\" = 1'-0\"", "confidence": "high", "location_key": {"grid": null, "room": null, "level": "Roof", "tag": null}}, {"subject": "Roof Curb Detail", "attribute": "component", "value": "Prefabricated Metal Curb", "source_text": "PREFABRICATED METAL CURB", "confidence": "high", "location_key": {"grid": null, "room": null, "level": "Roof", "tag": null}}, {"subject": "Roof Curb Detail", "attribute": "component", "value": "2X4 WOOD NAILER", "source_text": "2X4 WOOD NAILER", "confidence": "high", "location_key": {"grid": null, "room": null, "level": "Roof", "tag": null}}, {"subject": "Roof Curb Detail", "attribute": "fastener_spacing", "value": "12", "source_text": "APPROPRIATE FASTENERS AT 12\" (304 MM) O.C.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": "Roof", "tag": null}}, {"subject": "Roof Curb Detail", "attribute": "component", "value": "TPO MEMBRANE ADHERED OR MECHANICALLY FASTENED", "source_text": "TPO MEMBRANE ADHERED OR MECHANICALLY FASTENED", "confidence": "high", "location_key": {"grid": null, "room": null, "level": "Roof", "tag": null}}, {"subject": "Roof Curb Detail", "attribute": "weld_dimension", "value": "1 1/2", "source_text": "1 1/2\" (38 MM) MIN. WELD", "confidence": "high", "location_key": {"grid": null, "room": null, "level": "Roof", "tag": null}}, {"subject": "Roof Curb Detail", "attribute": "general_note", "value": "WOOD NAILER INSTALLED TO MEET APPLICABLE BUILDING CODES", "source_text": "WOOD NAILER INSTALLED TO MEET APPLICABLE BUILDING CODES", "confidence": "high", "location_key": {"grid": null, "room": null, "level": "Roof", "tag": null}}, {"subject": "Roof Curb Detail", "attribute": "component", "value": "COUNTERFLASHING SKIRT", "source_text": "COUNTERFLASHING SKIRT", "confidence": "high", "location_key": {"grid": null, "room": null, "level": "Roof", "tag": null}}]} \ No newline at end of file diff --git a/backend/.llm_cache/940440c08c7c6ec534916cb9a9d76d304fcbde673ec617724c1820c184a66f14.json b/backend/.llm_cache/940440c08c7c6ec534916cb9a9d76d304fcbde673ec617724c1820c184a66f14.json new file mode 100644 index 0000000..0389c73 --- /dev/null +++ b/backend/.llm_cache/940440c08c7c6ec534916cb9a9d76d304fcbde673ec617724c1820c184a66f14.json @@ -0,0 +1 @@ +{"sheet_number": "P02.01", "discipline": "Plumbing", "sheet_title": "FLOOR PLAN - SANITARY WASTE & VENT", "level": null, "scale": "1/4\" = 1'-0\"", "assertions": [{"subject": "Room", "attribute": "room_name", "value": "INVENTORY", "source_text": "INVENTORY", "confidence": "high", "location_key": {"grid": null, "room": "INVENTORY", "level": null, "tag": null}}, {"subject": "Room", "attribute": "room_name", "value": "LOUNGE", "source_text": "LOUNGE", "confidence": "high", "location_key": {"grid": null, "room": "LOUNGE", "level": null, "tag": null}}, {"subject": "Room", "attribute": "room_name", "value": "MEN'S RESTROOM", "source_text": "MEN'S RESTROOM", "confidence": "high", "location_key": {"grid": null, "room": "MEN'S RESTROOM", "level": null, "tag": null}}, {"subject": "Room", "attribute": "room_name", "value": "WOMEN'S ROOM", "source_text": "WOMEN'S ROOM", "confidence": "high", "location_key": {"grid": "A/4", "room": "WOMEN'S ROOM", "level": null, "tag": null}}, {"subject": "Room", "attribute": "room_name", "value": "MANAGER'S OFFICE", "source_text": "MANAGER'S OFFICE", "confidence": "high", "location_key": {"grid": "A/B/4/5", "room": "MANAGER'S OFFICE", "level": null, "tag": null}}, {"subject": "Room", "attribute": "room_name", "value": "CLEANING SUPPLIES/STORAGE", "source_text": "CLEANING SUPPLIES/STORAGE", "confidence": "high", "location_key": {"grid": null, "room": "CLEANING SUPPLIES/STORAGE", "level": null, "tag": null}}, {"subject": "Room", "attribute": "room_name", "value": "SALES AREA", "source_text": "SALES AREA", "confidence": "high", "location_key": {"grid": null, "room": "SALES AREA", "level": null, "tag": null}}, {"subject": "Fixture", "attribute": "fixture_location", "value": "EDF-1 is located in WOMEN'S ROOM.", "source_text": "EDF-1", "confidence": "high", "location_key": {"grid": "A/4", "room": "WOMEN'S ROOM", "level": null, "tag": "EDF-1"}}, {"subject": "Fixture", "attribute": "fixture_location", "value": "WC-1 is located in WOMEN'S ROOM.", "source_text": "WC-1", "confidence": "high", "location_key": {"grid": "A/4", "room": "WOMEN'S ROOM", "level": null, "tag": "WC-1"}}, {"subject": "Fixture", "attribute": "fixture_location", "value": "FD-1 is located in WOMEN'S ROOM.", "source_text": "3\"FD-1", "confidence": "high", "location_key": {"grid": "A/4", "room": "WOMEN'S ROOM", "level": null, "tag": "FD-1"}}, {"subject": "Fixture", "attribute": "fixture_location", "value": "WC-1 is located in MEN'S RESTROOM.", "source_text": "WC-1", "confidence": "high", "location_key": {"grid": null, "room": "MEN'S RESTROOM", "level": null, "tag": "WC-1"}}, {"subject": "Fixture", "attribute": "fixture_location", "value": "L-1 is located in MEN'S RESTROOM.", "source_text": "L-1", "confidence": "high", "location_key": {"grid": null, "room": "MEN'S RESTROOM", "level": null, "tag": "L-1"}}, {"subject": "Fixture", "attribute": "fixture_location", "value": "SK-1 is located in LOUNGE.", "source_text": "SK-1", "confidence": "high", "location_key": {"grid": null, "room": "LOUNGE", "level": null, "tag": "SK-1"}}, {"subject": "Fixture", "attribute": "fixture_location", "value": "MS-1 is located in CLEANING SUPPLIES/STORAGE.", "source_text": "MS-1", "confidence": "high", "location_key": {"grid": "B/4", "room": "CLEANING SUPPLIES/STORAGE", "level": null, "tag": "MS-1"}}, {"subject": "Fixture", "attribute": "fixture_location", "value": "FD-1 is located in CLEANING SUPPLIES/STORAGE.", "source_text": "3\"FD-1", "confidence": "high", "location_key": {"grid": "B/4", "room": "CLEANING SUPPLIES/STORAGE", "level": null, "tag": "FD-1"}}, {"subject": "Fixture", "attribute": "fixture_location", "value": "FS-1 is located in CLEANING SUPPLIES/STORAGE.", "source_text": "3\"FS-1", "confidence": "high", "location_key": {"grid": "B/5", "room": "CLEANING SUPPLIES/STORAGE", "level": null, "tag": "FS-1"}}, {"subject": "Pipe", "attribute": "pipe_size", "value": "2", "source_text": "2\"SAN", "confidence": "high", "location_key": {"grid": null, "room": "LOUNGE", "level": null, "tag": "SK-1"}}, {"subject": "Pipe", "attribute": "pipe_size", "value": "2", "source_text": "2\"V", "confidence": "high", "location_key": {"grid": null, "room": "LOUNGE", "level": null, "tag": "SK-1"}}, {"subject": "Pipe", "attribute": "pipe_size", "value": "2", "source_text": "2\"SAN", "confidence": "high", "location_key": {"grid": "A/4", "room": "WOMEN'S ROOM", "level": null, "tag": "L-1"}}]} \ No newline at end of file diff --git a/backend/.llm_cache/95ecd22fcd3eacdedb9129a63a92526c4d15fae56d99ce4baf234b1c05caf481.json b/backend/.llm_cache/95ecd22fcd3eacdedb9129a63a92526c4d15fae56d99ce4baf234b1c05caf481.json new file mode 100644 index 0000000..bba317a --- /dev/null +++ b/backend/.llm_cache/95ecd22fcd3eacdedb9129a63a92526c4d15fae56d99ce4baf234b1c05caf481.json @@ -0,0 +1 @@ +{"sheet_number": "M02.02", "discipline": "Mechanical", "sheet_title": "MECHANICAL ROOF PLAN", "level": "ROOF", "scale": "1/4\" = 1'-0\"", "assertions": [{"subject": "View 1", "attribute": "scale", "value": "1/4\" = 1'-0\"", "source_text": "1 MECHANICAL ROOF PLAN 1/4\" = 1'-0\"", "confidence": "high", "location_key": {"grid": null, "room": null, "level": "ROOF", "tag": "1"}}, {"subject": "VTR", "attribute": "duct_size", "value": "8\"RD", "source_text": "VTR 8\"RD", "confidence": "high", "location_key": {"grid": "B / 4", "room": null, "level": "ROOF", "tag": "VTR 8\"RD"}}, {"subject": "VTR", "attribute": "duct_size", "value": "10\"RD", "source_text": "10\"RD VTR", "confidence": "high", "location_key": {"grid": "B / 5", "room": null, "level": "ROOF", "tag": "10\"RD VTR"}}, {"subject": "VTRs", "attribute": "keynote_assertion", "value": "Terminate exhaust duct to manufacturer provided vent cap.", "source_text": "TERMINATE EXHAUST DUCT TO MANUFACTURER PROVIDED VENT CAP.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": "ROOF", "tag": "1"}}, {"subject": "RTUs", "attribute": "keynote_assertion", "value": "Supply / return duct to transition in vertical to RTU curb opening.", "source_text": "SUPPLY / RETURN DUCT TO TRANSITION IN VERTICAL TO RTU CURB OPENING.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": "ROOF", "tag": "2"}}, {"subject": "10\"RD VTR", "attribute": "clearance_requirement", "value": "Limit of 10' radius from any outdoor air intake.", "source_text": "LIMIT OF 10' RADIUS FROM ANY OUTDOOR AIR INTAKE.", "confidence": "high", "location_key": {"grid": "B / 5", "room": null, "level": "ROOF", "tag": "3"}}, {"subject": "RTUs", "attribute": "accessory", "value": "Economizer Hood", "source_text": "ECONOMIZER HOOD.", "confidence": "medium", "location_key": {"grid": null, "room": null, "level": "ROOF", "tag": "4"}}]} \ No newline at end of file diff --git a/backend/.llm_cache/95ed99a5203bcda168abd1680714cdbec38081f38ea42c73e691c653ea099b5e.json b/backend/.llm_cache/95ed99a5203bcda168abd1680714cdbec38081f38ea42c73e691c653ea099b5e.json new file mode 100644 index 0000000..bef7051 --- /dev/null +++ b/backend/.llm_cache/95ed99a5203bcda168abd1680714cdbec38081f38ea42c73e691c653ea099b5e.json @@ -0,0 +1 @@ +{"issues": [{"issue_id": "CONS-CODE-01", "source_stage": "code", "category": "building_code", "severity": "critical", "confidence": "high", "location": "General - Code Data Sheets", "disciplines": ["General", "Architectural", "Electrical"], "sheets": ["G21.01", "A23.01", "E01.01", "G11.04", "E01.02", "E03.01"], "description": "The drawing set lists multiple conflicting versions of the applicable building, energy, and electrical codes, found during cross-discipline, code, and QAQC reviews. For example, G21.01 lists the 2018 IBC, while A23.01 and G11.04 reference the 2021 IBC. G21.01 lists a confusing '2023...2014 NEC', while E01.01 lists a '2023 NEC'. Electrical sheets reference the 2021 IBC and 2021 IECC, which may not be the adopted codes. It is impossible to perform a code compliance review or construct the project without a clearly defined and consistently applied set of codes.", "evidence": [{"discipline": "General", "sheet": "G21.01", "source_text": "2018 INTERNATIONAL BUILDING CODE (IBC) CH. 2-10 WITH HARRIS COUNTY AMENDMENTS", "asserted_value": "2018 IBC"}, {"discipline": "Architectural", "sheet": "A23.01", "source_text": "INTERIOR FINISHES TO COMPLY WITH IBC CLASS C OR HIGHER SECTION 803.9 AND TABLE 803.9 OF 2021 IBC.", "asserted_value": "2021 IBC"}, {"discipline": "Electrical", "sheet": "E01.01", "source_text": "CONTRACTOR SHALL CONFORM TO ALL LOCAL, STATE, AND APPLICABLE CODES, 2023 NEC, 2021 IBC, 2021 IECC, NFPA, ETC., AND ALL OTHER LOCAL CODES AND AMENDMENTS...", "asserted_value": "2021 IBC"}, {"discipline": "General", "sheet": "G21.01", "source_text": "2023 STATE OF TEXAS ADOPTED 2014 NFPA 70 NATIONAL ELECTRICAL CODE (NEC)", "asserted_value": "2014 NEC"}, {"discipline": "General", "sheet": "G11.04", "source_text": "AREA LIMITATION: UNLIMITED (TABLES 504.3, 504.4, 506.2 IBC 2021)", "asserted_value": "IBC 2021"}, {"discipline": "General", "sheet": "G21.01", "source_text": "2021 INTERNATIONAL FIRE CODE (IFC) WITH HARRIS COUNTY AMENDMENTS", "asserted_value": "2021 INTERNATIONAL FIRE CODE"}, {"discipline": "Electrical", "sheet": "E01.02", "source_text": "1. PROVIDE LOW-VOLTAGE DRY-TYPE TRANSFORMERS THAT MEET THE MINIMUM EFFICIENCY REQUIREMENTS OF 2021 IECC TABLE C405.8.", "asserted_value": "2021 IECC"}, {"discipline": "Electrical", "sheet": "E03.01", "source_text": "ELECTRICAL GENERAL NOTES: 3. ALL LIGHTING SYSTEMS SHALL BE TESTED TO ENSURE PROPER CALIBRATION, ADJUSTMENT, PROGRAMMING, AND OPERATION IN ACCORDANCE WITH IECC 2021 SECTION C408.3.", "asserted_value": "{\"code\": \"IECC\", \"year\": \"2021\", \"section\": \"C408.3\"}"}], "recommended_resolution": "Revise all general notes and specifications across all disciplines to consistently state the single set of applicable code editions (IBC, IECC, NEC, IFC, etc.) as adopted by the Authority Having Jurisdiction. All code analysis and design should be updated to reflect the correct codes.", "code_reference": null}, {"issue_id": "CONS-CODE-02", "source_stage": "code", "category": "building_code", "severity": "critical", "confidence": "high", "location": "General - Project Information", "disciplines": ["Architectural", "General"], "sheets": ["G11.01", "G21.01", "A11.01"], "description": "The project jurisdiction is ambiguous. The project address on sheets G11.01 and A11.01 is in 'Cypress, TX,' and the Authority Having Jurisdiction (AHJ) is listed as 'Harris County' on sheet G21.01. This conflicts with other project information listing the jurisdiction as the 'City of Katy'. These are different jurisdictions with potentially different code adoptions and local amendments. This must be clarified before design review or permitting can proceed.", "evidence": [{"discipline": "General", "sheet": "G11.01", "source_text": "7022 ELYSON EXCHANGE WAY CYPRESS, TX 77433", "asserted_value": "CYPRESS, TX"}, {"discipline": "General", "sheet": "G21.01", "source_text": "AUTHORITY HAVING JURISDICTION: HARRIS COUNTY", "asserted_value": "HARRIS COUNTY"}, {"discipline": "Architectural", "sheet": "A11.01", "source_text": "VERIZON ELYSON\n7022 ELYSON EXCHANGE WAY\nCYPRESS, TX 77433", "asserted_value": "7022 ELYSON EXCHANGE WAY, CYPRESS, TX 77433"}], "recommended_resolution": "Confirm the correct project address and governing Authority Having Jurisdiction (AHJ). Revise all project documentation, including the code information on the drawings, to reflect the requirements of the correct AHJ.", "code_reference": null}, {"issue_id": "CONS-MISSING-01", "source_stage": "qaqc", "category": "missing_sheet", "severity": "critical", "confidence": "high", "location": "Entire Drawing Set", "disciplines": ["Structural", "Electrical", "Mechanical", "General"], "sheets": ["E05.02", "M03.01", "E02.01", "G11.01"], "description": "The entire Structural (S) series of drawings is missing from the set, as identified in QAQC, code, and constructability reviews. Structural plans and details are fundamental for any scope involving new construction or modifications. Notes on other disciplines' drawings explicitly call for coordination with a structural engineer (e.g., for RTU curbs on M03.01 and a suspended transformer on E05.02), but no structural information, sheet index entry, or consultant information is provided. This improperly transfers design liability and makes the set incomplete for bidding, permitting, and construction.", "evidence": [{"discipline": "Electrical", "sheet": "E05.02", "source_text": "VERIFY SUPPORT SIZING AND DESIGNED WITH PROJECT STRUCTURAL ENGINEER PRIOR TO ASSEMBLY.", "asserted_value": "Coordination with structural engineer required"}, {"discipline": "Mechanical", "sheet": "M03.01", "source_text": "ANGLE IRON FRAME ALL AROUND ROOF OPENING RE: STRUCTURAL.", "asserted_value": "Coordination with structural drawings required"}, {"discipline": "Electrical", "sheet": "E02.01", "source_text": "7 TRANSFORMER TO BE SUSPENDED FROM STRUCTURE AT HIGH LEVEL ABOVE ACCESSIBLE CEILING.", "asserted_value": "Transformer to be suspended from structure"}, {"discipline": "General", "sheet": "G11.01", "source_text": "(Sheet Index)", "asserted_value": "No structural discipline sheets are listed in the drawing index."}], "recommended_resolution": "Provide the complete Structural drawing set (foundation plans, framing plans, details, general notes) as required for the project scope, including sealed designs for equipment supports.", "code_reference": null}, {"issue_id": "CONS-ADA-01", "source_stage": "code", "category": "ada", "severity": "high", "confidence": "high", "location": "A51.01 / TYPICAL RESTROOM LAVATORY DETAIL", "disciplines": ["Architectural", "Plumbing"], "sheets": ["A51.01"], "description": "The typical restroom lavatory detail on sheet A51.01 contains contradictory and non-compliant accessibility clearance information. One note requires '9\" MIN. TOE CLEAR' while another on the same detail requires '6\" MAX. TOE CLEAR'. These requirements are mutually exclusive, making the detail impossible to construct. Furthermore, the 6\" maximum violates the 9\" minimum toe clearance height required by ADA/TAS standards.", "evidence": [{"discipline": "Architectural", "sheet": "A51.01", "source_text": "9\" MIN. TOE CLEAR", "asserted_value": "9\" MIN"}, {"discipline": "Architectural", "sheet": "A51.01", "source_text": "6\" MAX. TOE CLEAR", "asserted_value": "6\" MAX"}], "recommended_resolution": "Revise the detail on A51.01 to show a single, valid requirement for toe clearance that complies with accessibility standards. A minimum height of 9 inches is required.", "code_reference": "ADA 606.2"}, {"issue_id": "CONS-ADA-02", "source_stage": "code", "category": "ada", "severity": "high", "confidence": "high", "location": "Sales Area", "disciplines": ["Architectural", "Electrical", "Interiors"], "sheets": ["A22.01", "E01.02"], "description": "Pendant light fixtures (Types L-5 and L-6) are specified on architectural plan A22.01 and in the electrical schedule E01.02 to be mounted at 5'-5\" (65 inches) above the finished floor. As these fixtures appear to be located within public circulation paths in the Sales Area, this mounting height creates a hazardous head-height obstruction. Accessible routes require a minimum vertical head clearance of 80 inches.", "evidence": [{"discipline": "Architectural", "sheet": "A22.01", "source_text": "PENDANT 5'-5\" AFF", "asserted_value": "65"}, {"discipline": "Electrical", "sheet": "E01.02", "source_text": "TYPE: L-5, DESCRIPTION: 12\" PENDANT, MOUNTING: PENDANT, NOTES: PENDANT 5'-5\" AFF", "asserted_value": "65"}, {"discipline": "Electrical", "sheet": "E01.02", "source_text": "TYPE: L-6, DESCRIPTION: 16\" PENDANT, MOUNTING: PENDANT, NOTES: PENDANT 5'-5\" AFF", "asserted_value": "65"}], "recommended_resolution": "Verify the location of all L-5 and L-6 pendant fixtures. Raise the mounting height of any fixtures located within circulation paths to provide at least 80 inches of vertical clearance (to the bottom of the fixture), or relocate them outside of circulation paths.", "code_reference": "ADA 307.4"}, {"issue_id": "CONS-SPATIAL-01", "source_stage": "conflict", "category": "spatial_clash", "severity": "high", "confidence": "high", "location": "INVENTORY Room, west wall", "disciplines": ["Architectural", "Plumbing"], "sheets": ["A24.01", "P02.02"], "description": "The architectural plan shows a network rack system on the west wall of the Inventory room. The plumbing plan shows an Electric Water Heater (EWH) in the same location. These two pieces of equipment cannot occupy the same space. Furthermore, locating a water heater, a potential source of leaks, directly below or adjacent to sensitive network equipment is a major operational risk and is strongly discouraged.", "evidence": [{"discipline": "Architectural", "sheet": "A24.01", "source_text": "RACK SYSTEM ABOVE SAFE @ -74\" TO BOTTOM", "asserted_value": "Network Rack System"}, {"discipline": "Plumbing", "sheet": "P02.02", "source_text": "EWH", "asserted_value": "Electric Water Heater"}], "recommended_resolution": "Coordinate between architectural and plumbing disciplines to relocate one of the clashing pieces of equipment.", "code_reference": null}, {"issue_id": "CONS-COORD-01", "source_stage": "conflict", "category": "elevation_disagreement", "severity": "medium", "confidence": "high", "location": "INVENTORY Room, west wall", "disciplines": ["Architectural", "Electrical"], "sheets": ["A24.01", "E04.01"], "description": "The architectural plan specifies the network rack bottom is to be mounted at 74 inches AFF. However, the special systems plan shows the corresponding CAT.6 data cables terminating at 18 inches AFF on the same wall. The termination height for data cabling should be coordinated with the height and configuration of the rack it serves.", "evidence": [{"discipline": "Architectural", "sheet": "A24.01", "source_text": "RACK SYSTEM ABOVE SAFE @ -74\" TO BOTTOM", "asserted_value": "74\" AFF"}, {"discipline": "Electrical", "sheet": "E04.01", "source_text": "(2) CAT.6/18\"", "asserted_value": "18\" AFF"}], "recommended_resolution": "Coordinate the electrical data outlet mounting height with the architectural rack mounting height.", "code_reference": null}, {"issue_id": "CONS-SPEC-01", "source_stage": "conflict", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "Firestopping at wall penetrations", "disciplines": ["Electrical", "Plumbing", "General"], "sheets": ["E05.01", "P01.01", "G31.04"], "description": "The electrical detail for a sleeve penetration (Detail 4/E05.01) prescriptively calls for a '3 HOUR RATED CAULK'. This contradicts the general notes on Plumbing and General sheets, which require firestopping assemblies to have a rating equal to that of the construction being penetrated. Specifying a fixed 3-hour rating may be insufficient or excessively costly and should be revised to be performance-based.", "evidence": [{"discipline": "Electrical", "sheet": "E05.01", "source_text": "PACK BOTH ENDS OF SLEEVE WITH 3M FIRE DAM 150 3 HOUR RATED CAULK OR APPROVED EQUAL", "asserted_value": "3 HOUR RATED CAULK"}, {"discipline": "Plumbing", "sheet": "P01.01", "source_text": "SEAL ALL PENETRATIONS THROUGH RATED WALLS, FLOORS AND CEILINGS WITH A UL LISTED ASSEMBLY TO PROVIDE A RATING EQUAL TO OR GREATER THAN THE RATING OF THE WALL, FLOOR OR CEILING.", "asserted_value": "RATING EQUAL TO OR GREATER THAN THE RATING OF THE WALL"}, {"discipline": "General", "sheet": "G31.04", "source_text": "FIRESTOPPING: TESTED IN ACCORDANCE WITH ASTM E119 OR UL 263 TO MEET THE HOURLY F-RATINGS OF THE CONSTRUCTION BEING PENETRATED.", "asserted_value": "MEET THE HOURLY F-RATINGS OF THE CONSTRUCTION BEING PENETRATED"}], "recommended_resolution": "Revise Detail 4/E05.01 to align with general project notes, specifying firestopping assemblies with a UL-listed rating matching the penetrated wall.", "code_reference": null}, {"issue_id": "CONS-SPEC-02", "source_stage": "conflict", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "Slab-on-Grade Penetration Pour Back", "disciplines": ["General", "Plumbing"], "sheets": ["G11.03", "P03.01"], "description": "The Landlord Work Letter (G11.03) requires a 15 mil vapor barrier for concrete pour-backs at penetrations, while the plumbing Backfill Piping Detail (P03.01) specifies a 6 mil vapor retarder. These are conflicting material specifications for the same scope of work.", "evidence": [{"discipline": "General", "sheet": "G11.03", "source_text": "b. The Tenant shall fire caulk the opening for any penetrations into the roof deck and at any penetrations. Demolising concrete slab shall be poured back complete with the following items as a minimum: ... ii. 15 Mil vapor barrier", "asserted_value": "15 Mil vapor barrier"}, {"discipline": "Plumbing", "sheet": "P03.01", "source_text": "PER 2021 IBC, CHAPTER 19, SECTION 1907: POLYETHYLENE VAPOR RETARDER MINIMUM 6-MIL SHALL BE REQUIRED.", "asserted_value": "6-mil Polyethylene vapor retarder minimum"}], "recommended_resolution": "Clarify the required vapor barrier/retarder thickness, prioritizing the landlord requirement, and make drawings consistent.", "code_reference": null}, {"issue_id": "CONS-SPEC-03", "source_stage": "conflict", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "General Ceiling System", "disciplines": ["Architectural", "General"], "sheets": ["A22.01", "A23.01", "G31.05"], "description": "The Reflected Ceiling Plan (A22.01) and Finish Plan (A23.01) explicitly call for an acoustic tile ceiling (AT-1) throughout the space. However, the specifications on sheet G31.05, under the 'GYPSUM BOARD' product section, specify a thickness for 'Ceilings', implying a gypsum board ceiling. This is a fundamental material contradiction.", "evidence": [{"discipline": "Architectural", "sheet": "A23.01", "source_text": "N. CEILING THROUGHOUT ENTIRE SPACE TO BE AT-1 ACOUSTIC CEILING TILE WITH C4-A CEILING GRID.", "asserted_value": "Acoustic Tile Ceiling (AT-1)"}, {"discipline": "General", "sheet": "G31.05", "source_text": "PART 2 - PRODUCTS / 2.01 GYPSUM BOARD / A. ACCEPTABLE MANUFACTURERS / 1. ... 2.02 GYPSUM BOARD, PANEL PRODUCTS, TRIM, AND ACCESSORIES / A. GENERAL: PROVIDE GYPSUM BOARD... / B. THICKNESS: PROVIDE GYPSUM BOARD THICKNESS AS FOLLOWS: / 1. EXTERIOR PARTITIONS: NOT USED / 2. INTERIOR PARTITIONS: 5/8 INCH / 3. CEILINGS: 5/8 INCH.", "asserted_value": "Gypsum Board Ceiling"}], "recommended_resolution": "Clarify the intended ceiling material and remove the conflicting specification.", "code_reference": null}, {"issue_id": "CONS-COORD-02", "source_stage": "conflict", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "Project Scope Description", "disciplines": ["General"], "sheets": ["G11.04", "G21.01"], "description": "The project scope is described inconsistently. Sheet G11.04 describes a 'LEASE SPACE BUILD-OUT' for a 'FIRST GENERATION RETAIL SPACE,' implying new construction in a shell. Sheet G21.01 describes a 'TENANT INTERIOR REMODEL,' which implies demolition and alteration of an existing space. This needs to be clarified as it affects the expected scope of work.", "evidence": [{"discipline": "General", "sheet": "G11.04", "source_text": "PROJECT IS A TENANT INTERIOR LEASE SPACE BUILD OUT FOR A FIRST GENERATION RETAIL SPACE.", "asserted_value": "First Generation Build-out"}, {"discipline": "General", "sheet": "G21.01", "source_text": "PROJECT IS A TENANT INTERIOR REMODEL OF 3,323 SF", "asserted_value": "Remodel"}], "recommended_resolution": "Revise the project descriptions on all sheets to be consistent and accurate.", "code_reference": null}, {"issue_id": "CONS-COORD-03", "source_stage": "conflict", "category": "schedule_vs_plan_mismatch", "severity": "medium", "confidence": "high", "location": "LOUNGE", "disciplines": ["Architectural", "Electrical"], "sheets": ["A24.01", "E01.02"], "description": "The architectural plan (A24.01) shows a single electrical panel symbol labeled 'PANEL' in the Lounge, but the electrical schedules (E01.02) list two distinct panels (H and L) to be located in the Lounge. The architectural plan must be updated to show both panels to ensure adequate wall space and backing are provided.", "evidence": [{"discipline": "Architectural", "sheet": "A24.01", "source_text": "PANEL", "asserted_value": "One electrical panel is shown on plan."}, {"discipline": "Electrical", "sheet": "E01.02", "source_text": "PANEL NAME H, LOCATION LOUNGE; PANEL NAME L, LOCATION LOUNGE", "asserted_value": "Two electrical panels (H and L) are scheduled in the Lounge."}], "recommended_resolution": "Update the architectural plan to show the correct quantity and location of electrical panels as scheduled.", "code_reference": null}, {"issue_id": "QAQC-MS-002", "source_stage": "qaqc", "category": "missing_sheet", "severity": "critical", "confidence": "high", "location": "Architectural Series", "disciplines": ["Architectural"], "sheets": [], "description": "An Architectural Floor Plan, presumed to be numbered A21.01, is missing. The sheet index jumps from General sheets to A22.01 (Reflected Ceiling Plan). A dimensioned floor plan showing partition layout is the primary drawing for a build-out and is essential for all other disciplines to coordinate with.", "evidence": [{"discipline": "Architectural", "sheet": "sheet_index", "source_text": "Missing expected sheet A21.01 based on numbering sequence before A22.01", "asserted_value": "Missing Architectural Floor Plan"}], "recommended_resolution": "Provide the missing main Architectural Floor Plan sheet (A21.01).", "code_reference": null}, {"issue_id": "QAQC-MS-003", "source_stage": "qaqc", "category": "missing_sheet", "severity": "high", "confidence": "high", "location": "Mechanical Series", "disciplines": ["Mechanical"], "sheets": ["M01.01", "M02.02"], "description": "A Mechanical floor plan, presumed to be numbered M02.01, is missing. The drawing set jumps from Mechanical schedules (M01.01) to the Mechanical Roof Plan (M02.02) without providing a plan for the interior ductwork, diffusers, and thermostats. This plan is necessary to understand the HVAC system layout within the tenant space.", "evidence": [{"discipline": "Mechanical", "sheet": "sheet_index", "source_text": "Missing expected sheet M02.01 based on numbering sequence before M02.02", "asserted_value": "Missing Mechanical Floor Plan"}], "recommended_resolution": "Provide the missing Mechanical Floor Plan sheet (M02.01) showing the HVAC layout for the tenant space.", "code_reference": null}, {"issue_id": "QAQC-MS-004", "source_stage": "qaqc", "category": "missing_sheet", "severity": "high", "confidence": "high", "location": "Life Safety", "disciplines": ["Electrical", "Fire Protection"], "sheets": ["E04.01", "A22.01"], "description": "A comprehensive Fire Alarm plan is not provided. While sheet A22.01 shows some notification appliances (strobes), the set lacks a dedicated plan showing the full system, including the Fire Alarm Control Panel (FACP), pull stations, smoke/heat detectors, and associated wiring/riser diagrams as required by NFPA 72 and landlord requirements.", "evidence": [{"discipline": "Technology / Low Voltage", "sheet": "E04.01", "source_text": "(2) CAT.6/18\"", "asserted_value": "Sheet E04.01 shows data outlets, not a complete fire alarm system."}, {"discipline": "General", "sheet": "G11.03", "source_text": "TENANT IS REQUIRED TO USE LANDLORD'S FIRE ALARM MONITORING COMPANY TO CONNECT TENANT'S SYSTEM TO LANDLORD'S FIRE ALARM PANEL.", "asserted_value": "A tenant fire alarm system is explicitly required."}], "recommended_resolution": "Provide a complete Fire Alarm plan compliant with NFPA 72 and local AHJ requirements. This may be a separate 'FA' series sheet or integrated into the Electrical 'E' sheets.", "code_reference": "NFPA 72"}, {"issue_id": "QAQC-MSCH-001", "source_stage": "qaqc", "category": "missing_schedule", "severity": "high", "confidence": "high", "location": "Architectural Series", "disciplines": ["Architectural"], "sheets": ["G11.01", "G31.06"], "description": "A Partition Type Legend or Schedule is missing. General Note 25.D on G11.01 bases dimensions 'to the face of sheathing of partition type as scheduled,' but no such schedule exists. Without it, contractors cannot determine the construction, thickness, fire-rating, or acoustic rating of the various walls.", "evidence": [{"discipline": "General", "sheet": "G11.01", "source_text": "Dimensions shown on drawings shall be to the face of sheathing of partition type as scheduled, unless otherwise noted.", "asserted_value": "Reference to a partition schedule that does not exist."}], "recommended_resolution": "Provide a Partition Type Legend/Schedule on the architectural drawings, with types clearly tagged on the floor plans. This schedule should define the full assembly and ratings for each wall type.", "code_reference": null}, {"issue_id": "QAQC-MSCH-002", "source_stage": "qaqc", "category": "missing_schedule", "severity": "critical", "confidence": "high", "location": "Architectural Series", "disciplines": ["Architectural"], "sheets": [], "description": "A Door and Hardware Schedule is missing from the drawing set. There are no door tags on the plans and no schedule defining the type, size, material, fire rating of doors/frames, and the required hardware for each opening. This information is essential for procurement, cost estimating, and ensuring life safety compliance.", "evidence": [{"discipline": "Architectural", "sheet": "sheet_index", "source_text": "No sheet titled 'Door Schedule' or similar exists.", "asserted_value": "Absence of door schedule sheet"}, {"discipline": "General", "sheet": "G31.04", "source_text": "SECTION 08 11 13 - HOLLOW METAL DOORS AND FRAMES", "asserted_value": "Specification for doors is provided, but with no schedule to indicate which doors or where."}], "recommended_resolution": "Provide a comprehensive Door and Hardware Schedule and add corresponding door tags to all openings on the floor plans.", "code_reference": null}, {"issue_id": "QAQC-INFO-001", "source_stage": "qaqc", "category": "missing_information", "severity": "high", "confidence": "high", "location": "A22.01 - REFLECTED CEILING PLAN", "disciplines": ["Architectural", "Mechanical", "Electrical", "Plumbing"], "sheets": ["A22.01", "G11.01"], "description": "Finished ceiling heights are not indicated on the Reflected Ceiling Plan (A22.01) or anywhere else in the set, despite a general note on G11.01 stating that they are. This is critical missing information required by all trades for locating overhead elements.", "evidence": [{"discipline": "General", "sheet": "G11.01", "source_text": "24. CEILING HEIGHTS ARE INDICATED FROM THE FLOOR ELEVATION TO THE FACE OF THE SUSPENDED CEILING SYSTEM OR FACE OF FINISH MATERIAL AS SCHEDULED.", "asserted_value": "Note implies ceiling heights are documented, but they are not."}, {"discipline": "Architectural", "sheet": "A22.01", "source_text": "(no source text for absence)", "asserted_value": "No ceiling height tags are present on the plan."}], "recommended_resolution": "Add ceiling height dimensions or tags (e.g., 9'-0\" AFF) for all rooms and areas on the Reflected Ceiling Plan (A22.01).", "code_reference": null}, {"issue_id": "QAQC-MD-001", "source_stage": "qaqc", "category": "missing_detail", "severity": "medium", "confidence": "high", "location": "A24.01 - FURNITURE/ POWER/ DATA FLOOR PLAN", "disciplines": ["Architectural"], "sheets": ["A24.01"], "description": "Sheet A24.01 contains a note calling out detail '3/A92.01' for a foundation pour back detail where the existing slab is cut. Sheet A92.01 is not included in the drawing set, leaving this construction detail completely undefined.", "evidence": [{"discipline": "Architectural", "sheet": "A24.01", "source_text": "G. REFER TO DETAIL 3/A92.01 FOR FOUNDATION POUR BACK DETAIL WHERE EXISTING SLAB IS CUT.", "asserted_value": "3/A92.01"}], "recommended_resolution": "Provide sheet A92.01 with the referenced detail, or re-reference the callout to an existing detail that provides the required information.", "code_reference": null}, {"issue_id": "CODE-SPEC-01", "source_stage": "code", "category": "fire_separation", "severity": "medium", "confidence": "high", "location": "Sheet G31.04 - SPEC 081113 3.B.1", "disciplines": ["Architectural", "Specifications"], "sheets": ["G31.04"], "description": "Specification 081113 3.B.1 for hollow metal doors requires a '90 MINUTE RATED CLASS C' assembly. Per standard fire protection classifications (e.g., IBC Table 716.1), a 90-minute fire door assembly is a Class B opening, typically for 2-hour rated walls. A Class C opening is typically rated 45-minutes for use in 1-hour rated walls. The specification is contradictory.", "evidence": [{"discipline": "General", "sheet": "G31.04", "source_text": "WHERE REQUIRED, INSTALLED FRAME AND DOOR ASSEMBLY SHALL CONFORM TO A 90 MINUTE RATED CLASS C INDICATED.", "asserted_value": "90"}], "recommended_resolution": "Revise specification 081113 3.B.1 to correctly align the fire-protection rating (in minutes) with the corresponding opening classification (e.g., 'Class B').", "code_reference": "IBC Table 716.1"}, {"issue_id": "CODE-ADA-03", "source_stage": "code", "category": "ada", "severity": "medium", "confidence": "high", "location": "All areas with polished concrete flooring.", "disciplines": ["Architectural", "Interiors"], "sheets": ["A23.01"], "description": "The finish notes provide conflicting and outdated specifications for floor slip resistance. General Note F requires a minimum Static Coefficient of Friction (SCOF) of 0.6, while the specification for Polished Concrete (PC-1) requires a minimum SCOF of 0.50. Furthermore, SCOF is an outdated metric; current standards use Dynamic Coefficient of Friction (DCOF), with a recommended minimum of 0.42 for level interior spaces expected to be walked on when wet.", "evidence": [{"discipline": "Architectural", "sheet": "A23.01", "source_text": "F. ALL FLOOR FINISHES SHALL HAVE A MIN. S.C.O.F. OF .6 WET OR DRY.", "asserted_value": "0.6"}, {"discipline": "Architectural", "sheet": "A23.01", "source_text": "SLIP RESISTANCE OF FLOOR TO BE NO LESS THAN A 0.50 STATIC COEFFICIENT OF FRICTION (SCOF)", "asserted_value": ">= 0.50 SCOF"}], "recommended_resolution": "Update the finish specifications to use the current DCOF standard (e.g., ANSI A326.3). Specify a single, consistent requirement for all accessible flooring surfaces, such as a minimum DCOF of 0.42."}]} \ No newline at end of file diff --git a/backend/.llm_cache/9949036110150af3de67c100a206633e67e12e27b5b1bb916546c5d63d266b20.json b/backend/.llm_cache/9949036110150af3de67c100a206633e67e12e27b5b1bb916546c5d63d266b20.json new file mode 100644 index 0000000..fee931e --- /dev/null +++ b/backend/.llm_cache/9949036110150af3de67c100a206633e67e12e27b5b1bb916546c5d63d266b20.json @@ -0,0 +1 @@ +{"sheet_number": "E03.01", "discipline": "Electrical", "sheet_title": "FLOOR PLAN - LIGHTING", "level": null, "scale": "1/4\" = 1'-0\"", "assertions": [{"assertion_id": "E03.01_0001", "subject": "General Note", "category": "note", "attribute": "general_note", "value": "Coordinate all light switch locations with architect/owner prior to rough-in.", "unit": null, "location_key": {"sheet_number": "E03.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "1", "detail_reference": null, "plan_zone": null}, "source_text": "ELECTRICAL GENERAL NOTES: 1. COORDINATE ALL LIGHT SWITCH LOCATIONS WITH ARCHITECT/OWNER PRIOR TO ROUGH-IN.", "coordination_targets": ["architectural", "owner_standard"], "conflict_potential": "medium", "code_review_relevance": "none", "confidence": "high"}, {"assertion_id": "E03.01_0002", "subject": "General Note", "category": "note", "attribute": "general_note", "value": "Connect all type 'X' emergency fixtures to nearest lighting circuit via non-switched hot leg. Provide fixtures with nickel cadmium battery.", "unit": null, "location_key": {"sheet_number": "E03.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "2", "detail_reference": null, "plan_zone": null}, "source_text": "ELECTRICAL GENERAL NOTES: 2. CONNECT ALL TYPE 'X' EMERGENCY FIXTURES TO NEAREST LIGHTING CIRCUIT VIA NON-SWITCHED HOT LEG. PROVIDE FIXTURES WITH NICKEL CADMIUM BATTERY.", "coordination_targets": ["electrical", "life_safety", "code"], "conflict_potential": "medium", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "E03.01_0003", "subject": "General Note", "category": "note", "attribute": "general_note", "value": "All lighting systems shall be tested to ensure proper calibration, adjustment, programming, and operation in accordance with IECC 2021 Section C408.3.", "unit": null, "location_key": {"sheet_number": "E03.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "3", "detail_reference": null, "plan_zone": null}, "source_text": "ELECTRICAL GENERAL NOTES: 3. ALL LIGHTING SYSTEMS SHALL BE TESTED TO ENSURE PROPER CALIBRATION, ADJUSTMENT, PROGRAMMING, AND OPERATION IN ACCORDANCE WITH IECC 2021 SECTION C408.3.", "coordination_targets": ["electrical", "code"], "conflict_potential": "low", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "E03.01_0004", "subject": "Keyed Note", "category": "note", "attribute": "keynote_assertion", "value": "Provide dimmer switch for control of sales area lighting. Coordinate final location with owner prior to rough-in.", "unit": null, "location_key": {"sheet_number": "E03.01", "grid": null, "room": null, "room_name": "SALES AREA", "level": null, "tag": "1", "detail_reference": null, "plan_zone": null}, "source_text": "ELECTRICAL KEYED NOTES: 1 PROVIDE DIMMER SWITCH FOR CONTROL OF SALES AREA LIGHTING. COORDINATE FINAL LOCATION WITH OWNER PRIOR TO ROUGH-IN.", "coordination_targets": ["architectural", "owner_standard", "electrical"], "conflict_potential": "medium", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "E03.01_0005", "subject": "Lighting Fixture", "category": "electrical", "attribute": "fixture_count", "value": "1", "unit": "count", "location_key": {"sheet_number": "E03.01", "grid": null, "room": null, "room_name": "INVENTORY", "level": null, "tag": "L-4", "detail_reference": "1", "plan_zone": null}, "source_text": "L-4", "coordination_targets": ["architectural", "electrical"], "conflict_potential": "low", "code_review_relevance": "none", "confidence": "high"}, {"assertion_id": "E03.01_0006", "subject": "Lighting Fixture", "category": "electrical", "attribute": "fixture_count", "value": "1", "unit": "count", "location_key": {"sheet_number": "E03.01", "grid": null, "room": null, "room_name": "INVENTORY", "level": null, "tag": "L-4E", "detail_reference": "1", "plan_zone": null}, "source_text": "L-4E", "coordination_targets": ["architectural", "electrical", "life_safety"], "conflict_potential": "low", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "E03.01_0007", "subject": "Lighting Fixture", "category": "electrical", "attribute": "fixture_count", "value": "2", "unit": "count", "location_key": {"sheet_number": "E03.01", "grid": null, "room": null, "room_name": "RESTROOM", "level": null, "tag": "L-4E", "detail_reference": "1", "plan_zone": null}, "source_text": "L-4E", "coordination_targets": ["architectural", "electrical", "life_safety"], "conflict_potential": "low", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "E03.01_0008", "subject": "Lighting Fixture", "category": "electrical", "attribute": "fixture_count", "value": "1", "unit": "count", "location_key": {"sheet_number": "E03.01", "grid": null, "room": null, "room_name": "MANAGER'S OFFICE", "level": null, "tag": "L-4", "detail_reference": "1", "plan_zone": null}, "source_text": "L-4", "coordination_targets": ["architectural", "electrical"], "conflict_potential": "low", "code_review_relevance": "none", "confidence": "high"}, {"assertion_id": "E03.01_0009", "subject": "Lighting Fixture", "category": "electrical", "attribute": "fixture_count", "value": "1", "unit": "count", "location_key": {"sheet_number": "E03.01", "grid": null, "room": null, "room_name": "MANAGER'S OFFICE", "level": null, "tag": "L-4E", "detail_reference": "1", "plan_zone": null}, "source_text": "L-4E", "coordination_targets": ["architectural", "electrical", "life_safety"], "conflict_potential": "low", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "E03.01_0010", "subject": "Lighting Fixture", "category": "electrical", "attribute": "fixture_count", "value": "1", "unit": "count", "location_key": {"sheet_number": "E03.01", "grid": null, "room": null, "room_name": "CLEANING SUPPLIES/STORAGE", "level": null, "tag": "L-4", "detail_reference": "1", "plan_zone": null}, "source_text": "L-4", "coordination_targets": ["architectural", "electrical"], "conflict_potential": "low", "code_review_relevance": "none", "confidence": "high"}, {"assertion_id": "E03.01_0011", "subject": "Lighting Fixture", "category": "electrical", "attribute": "fixture_count", "value": "1", "unit": "count", "location_key": {"sheet_number": "E03.01", "grid": null, "room": null, "room_name": "CLEANING SUPPLIES/STORAGE", "level": null, "tag": "L-4E", "detail_reference": "1", "plan_zone": null}, "source_text": "L-4E", "coordination_targets": ["architectural", "electrical", "life_safety"], "conflict_potential": "low", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "E03.01_0012", "subject": "Lighting Fixture", "category": "electrical", "attribute": "fixture_count", "value": "16", "unit": "count", "location_key": {"sheet_number": "E03.01", "grid": null, "room": null, "room_name": "SALES AREA", "level": null, "tag": "L-4", "detail_reference": "1", "plan_zone": null}, "source_text": "L-4", "coordination_targets": ["architectural", "electrical"], "conflict_potential": "low", "code_review_relevance": "none", "confidence": "high"}, {"assertion_id": "E03.01_0013", "subject": "Lighting Fixture", "category": "electrical", "attribute": "fixture_count", "value": "5", "unit": "count", "location_key": {"sheet_number": "E03.01", "grid": null, "room": null, "room_name": "SALES AREA", "level": null, "tag": "L-4E", "detail_reference": "1", "plan_zone": null}, "source_text": "L-4E", "coordination_targets": ["architectural", "electrical", "life_safety"], "conflict_potential": "low", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "E03.01_0014", "subject": "Lighting Fixture", "category": "electrical", "attribute": "fixture_count", "value": "6", "unit": "count", "location_key": {"sheet_number": "E03.01", "grid": null, "room": null, "room_name": "SALES AREA", "level": null}}]} \ No newline at end of file diff --git a/backend/.llm_cache/9a1cd123ace88cf0b0475c877ce89447b53f60c4eb670f2f8ab44c576adbad6a.json b/backend/.llm_cache/9a1cd123ace88cf0b0475c877ce89447b53f60c4eb670f2f8ab44c576adbad6a.json new file mode 100644 index 0000000..c3795ce --- /dev/null +++ b/backend/.llm_cache/9a1cd123ace88cf0b0475c877ce89447b53f60c4eb670f2f8ab44c576adbad6a.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "90cfb1e4-ad3d-4959-99c9-63a232f7a6f2", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "General Ceiling System", "disciplines": ["Architectural", "General"], "sheets": ["A22.01", "A23.01", "G31.05"], "description": "The Reflected Ceiling Plan and Finish Plan explicitly call for an acoustic tile ceiling (AT-1) throughout the entire space. However, the specifications on sheet G31.05, under the 'GYPSUM BOARD' product section, specify a thickness for 'Ceilings', implying a gypsum board ceiling. This is a fundamental material contradiction that affects bidding and construction.", "evidence": [{"discipline": "Architectural", "sheet": "A23.01", "source_text": "N. CEILING THROUGHOUT ENTIRE SPACE TO BE AT-1 ACOUSTIC CEILING TILE WITH C4-A CEILING GRID.", "asserted_value": "Acoustic Tile Ceiling (AT-1)"}, {"discipline": "General", "sheet": "G31.05", "source_text": "PART 2 - PRODUCTS / 2.01 GYPSUM BOARD / A. ACCEPTABLE MANUFACTURERS / 1. ... 2.02 GYPSUM BOARD, PANEL PRODUCTS, TRIM, AND ACCESSORIES / A. GENERAL: PROVIDE GYPSUM BOARD... / B. THICKNESS: PROVIDE GYPSUM BOARD THICKNESS AS FOLLOWS: / 1. EXTERIOR PARTITIONS: NOT USED / 2. INTERIOR PARTITIONS: 5/8 INCH / 3. CEILINGS: 5/8 INCH.", "asserted_value": "Gypsum Board Ceiling"}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/9a7686121676011435407f6727152b98160c944b0da455eba4344f204236bf10.json b/backend/.llm_cache/9a7686121676011435407f6727152b98160c944b0da455eba4344f204236bf10.json new file mode 100644 index 0000000..f997d59 --- /dev/null +++ b/backend/.llm_cache/9a7686121676011435407f6727152b98160c944b0da455eba4344f204236bf10.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "VaporBarrierSpec", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "Slab on grade patching requirements for penetrations.", "disciplines": ["General", "Plumbing"], "sheets": ["G11.03", "P03.01"], "description": "The Landlord Work Letter on sheet G11.03 requires a 15 mil vapor barrier for floor slab infills, while a note on a plumbing detail on sheet P03.01 specifies a minimum of 6 mil, citing the IBC. While the 15 mil requirement meets the minimum 6 mil code requirement, the discrepancy in the contract documents creates ambiguity for the bidding contractor. The more stringent Landlord requirement must be consistently applied across all relevant drawings.", "evidence": [{"discipline": "General", "sheet": "G11.03", "source_text": "10.b. For any floor opening, the Tenant is responsible for any floor preparation, cuts, or pour backs. Pour back concrete must have the following:\n...\nii. 15 Mil vapor barrier", "asserted_value": "15 Mil vapor barrier"}, {"discipline": "Plumbing", "sheet": "P03.01", "source_text": "NOTE: 1. PER 2021 IBC, CHAPTER 19, SECTION 1907: POLYETHYLENE VAPOR RETARDER MINIMUM 6-MIL SHALL BE REQUIRED.", "asserted_value": "Minimum 6-mil vapor retarder"}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/9af0116a2b0f21432c5e924d50c560e28a396f055bda307359a5cc3dbdbd74ea.json b/backend/.llm_cache/9af0116a2b0f21432c5e924d50c560e28a396f055bda307359a5cc3dbdbd74ea.json new file mode 100644 index 0000000..862ee29 --- /dev/null +++ b/backend/.llm_cache/9af0116a2b0f21432c5e924d50c560e28a396f055bda307359a5cc3dbdbd74ea.json @@ -0,0 +1 @@ +[{"assertion_id": "G01.01#0", "attribute": "project_name", "original_value": "VERIZON ELYSON", "source_text": "VERIZON ELYSON", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a proper name.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G01.01#1", "attribute": "project_address", "original_value": "7022 ELYSON EXCHANGE WAY CYPRESS, TX 77433", "source_text": "7022 ELYSON EXCHANGE WAY\nCYPRESS, TX 77433", "normalized_value": {"street": "7022 ELYSON EXCHANGE WAY", "city": "CYPRESS", "state": "TX", "zip": "77433"}, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Normalized to structured address object.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G01.01#2", "attribute": "consultant_info", "original_value": "OWNER: CK WARWICK GROUP, LLC, CHRIS WARCWICK, P: 214-906-0048", "source_text": "OWNER:\nCK WARWICK GROUP, LLC\nCHRIS WARCWICK\nP: 214-906-0048", "normalized_value": {"role": "Owner", "company": "CK WARWICK GROUP, LLC", "contact_name": "CHRIS WARCWICK", "phone": "214-906-0048"}, "normalized_unit": null, "normalized_attribute": "owner_info", "normalization_notes": "Parsed into structured data.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G01.01#3", "attribute": "consultant_info", "original_value": "ARCHITECT: ESTUDIO, PROJECT MANAGER KELLY BARNETT, 1824 SPRING STREET, SUITE 100 HOUSTON, TEXAS 77007, P: 713-433-5000", "source_text": "ARCHITECT:\nESTUDIO\nPROJECT MANAGER\nKELLY BARNETT\n1824 SPRING STREET, SUITE 100\nHOUSTON, TEXAS 77007\nP: 713-433-5000", "normalized_value": {"role": "Architect", "company": "ESTUDIO", "contact_name": "KELLY BARNETT", "contact_title": "Project Manager", "address": "1824 SPRING STREET, SUITE 100 HOUSTON, TEXAS 77007", "phone": "713-433-5000"}, "normalized_unit": null, "normalized_attribute": "architect_info", "normalization_notes": "Parsed into structured data.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G01.01#4", "attribute": "consultant_info", "original_value": "MEP: POWERS INDUSTRY, KAMIL BEY, 5718 WESTHEIMER RD SUITE 1000 HOUSTON, TX 77057, P: 1-(713) 560-1418", "source_text": "MEP:\nPOWERS INDUSTRY\nKAMIL BEY\n5718 WESTHEIMER RD\nSUITE 1000\nHOUSTON, TX 77057\nP: 1-(713) 560-1418", "normalized_value": {"role": "MEP", "company": "POWERS INDUSTRY", "contact_name": "KAMIL BEY", "address": "5718 WESTHEIMER RD SUITE 1000 HOUSTON, TX 77057", "phone": "713-560-1418"}, "normalized_unit": null, "normalized_attribute": "mep_consultant_info", "normalization_notes": "Parsed into structured data. Removed country code from phone number.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G01.01#5", "attribute": "project_number", "original_value": "00.000.00", "source_text": "Project number 00.000.00", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G01.01#6", "attribute": "issuance_status", "original_value": "CLIENT REVIEW", "source_text": "Issue Description\nCLIENT REVIEW", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G01.01#7", "attribute": "issuance_date", "original_value": "2026-06-18", "source_text": "YYYY-MM-DD\n2026-06-18", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is already in standard ISO 8601 date format.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G01.01#8", "attribute": "signage_text", "original_value": "verizon", "source_text": "verizon", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G01.01#9", "attribute": "general_note", "original_value": "Copyright @ eStudio Architecture 2026.", "source_text": "Copyright @ eStudio Architecture 2026.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.01#0", "attribute": "address", "original_value": "7022 ELYSON EXCHANGE WAY, CYPRESS, TX 77433", "source_text": "7022 ELYSON EXCHANGE WAY CYPRESS, TX 77433", "normalized_value": {"street": "7022 ELYSON EXCHANGE WAY", "city": "CYPRESS", "state": "TX", "zip": "77433"}, "normalized_unit": null, "normalized_attribute": "project_address", "normalization_notes": "Normalized to structured address object.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.01#1", "attribute": "building_identifier", "original_value": "BUILDING C", "source_text": "ELYSON TOWN CENTER - BUILDING C", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.01#2", "attribute": "code_reference", "original_value": "Through-fire-resistive walls shall conform to the authority having jurisdiction's current adopted version of the IBC and local ammendments.", "source_text": "THROUGH-FIRE-RESISTIVE WALLS SHALL CONFORM TO THE AUTHORITY HAVING JURISDICTION'S CURRENT ADOPTED VERSION OF THE IBC AND LOCAL AMMENDMENTS AS WELL AS DIRECTIVES BY THE LOCAL FIRE MARSHAL'S AUTHORITY.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.01#3", "attribute": "max_travel_distance", "original_value": "75", "source_text": "PROVIDER FOR EXTINGUISHERS WITH TRAVEL DISTANCE NOT TO EXCEED 75' IN ACCORDANCE W/ NFPA STANDARD 10", "normalized_value": "75", "normalized_unit": "feet", "normalized_attribute": null, "normalization_notes": "Unit derived from ' symbol in source text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.01#4", "attribute": "dimension_convention", "original_value": "Indicated from the floor elevation to the face of the structural slab, unless otherwise noted", "source_text": "CEILING HEIGHTS SHOWN ARE INDICATED FROM THE FLOOR ELEVATION TO THE FACE OF THE STRUCTURAL SLAB, UNLESS SPECIFICALLY OTHERWISE NOTED.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.01#5", "attribute": "dimension_convention", "original_value": "Indicated in RCP's are from finished floor elevation to face of suspended ceiling system or finish material", "source_text": "CEILING HEIGHTS INDICATED IN RCP'S ARE INDICATED FROM THE FINISHED FLOOR ELEVATION TO THE FACE OF SUSPENDED CEILING SYSTEM OR FACE OF FINISH MATERIAL AS SCHEDULED.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.01#6", "attribute": "dimension_convention", "original_value": "Dimensions are to centerline of grid/steel unless noted otherwise.", "source_text": "DIMENSIONS ARE INDICATED TO: A. THE CENTERLINE OF THE STRUCTURAL GRID AND STRUCTURAL STEEL MEMBERS.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.01#7", "attribute": "dimension_convention", "original_value": "Dimensions are to face of cast in place or precast concrete walls unless noted otherwise.", "source_text": "DIMENSIONS ARE INDICATED TO: B. THE FACE OF CAST IN PLACE OR PRECAST CONCRETE WALLS.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.01#8", "attribute": "dimension_convention", "original_value": "Dimensions are to nominal face of masonry walls unless noted otherwise.", "source_text": "DIMENSIONS ARE INDICATED TO: C. THE NOMINAL FACE OF MASONRY WALLS.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.01#9", "attribute": "code_reference", "original_value": "NFPA STD. 13", "source_text": "THE FIRE SPRINKLER CONTRACTOR...MODIFICATIONS TO THE EXISTING AUTOMATIC FIRE SPRINKLER SYSTEM SHALL CONFORM TO NFPA STD. 13.", "normalized_value": "NFPA Standard 13", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Expanded 'STD.' to 'Standard'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.01#10", "attribute": "wall_rating", "original_value": "DESIGN #U419", "source_text": "G31.06 UL RATINGS - DESIGN #U419", "normalized_value": "U419", "normalized_unit": null, "normalized_attribute": "ul_rating_design_number", "normalization_notes": "Extracted design number from value.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.02#0", "attribute": "knee_clearance_width", "original_value": "36", "source_text": "36\" MIN", "normalized_value": "36", "normalized_unit": "inches", "normalized_attribute": "min_knee_clearance_width", "normalization_notes": "Unit derived from '\"' symbol in source text. Min qualifier from 'MIN'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.02#1", "attribute": "counter_height_AFF", "original_value": "34", "source_text": "34\" MAX", "normalized_value": "34", "normalized_unit": "inches", "normalized_attribute": "max_counter_height_aff", "normalization_notes": "Unit derived from '\"' symbol in source text. Max qualifier from 'MAX'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.02#2", "attribute": "knee_clearance_height", "original_value": "28", "source_text": "28\" MIN", "normalized_value": "28", "normalized_unit": "inches", "normalized_attribute": "min_knee_clearance_height", "normalization_notes": "Unit derived from '\"' symbol in source text. Min qualifier from 'MIN'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.02#3", "attribute": "mounting_height_range_AFF", "original_value": "48-60", "source_text": "TACTILE CHARACTERS ON SIGNS SHALL BE LOCATED 48\" AFF MIN MEASURED FROM THE BASELINE OF THE LOWEST TACTILE CHARACTER AND 60\" AFF MAX MEASURED FROM THE BASELINE OF THE HIGHEST TACTILE CHARACTER.", "normalized_value": {"min": "48", "max": "60"}, "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": "Unit derived from '\"' symbol in source text. Range parsed from 'MIN' and 'MAX' values in text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.02#4", "attribute": "protrusion_allowance", "original_value": "4", "source_text": "NOTE: FIRE EXTINGUISHER CANNOT PROTRUDE MORE THAN 4\"", "normalized_value": "4", "normalized_unit": "inches", "normalized_attribute": "max_protrusion_allowance", "normalization_notes": "Unit derived from '\"' symbol in source text. Max qualifier from 'cannot protrude more than'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.02#5", "attribute": "counter_height_range_AFF", "original_value": "30-36", "source_text": "COUNTER/CREDENZA @ 30\"-36\" UNO", "normalized_value": {"min": "30", "max": "36"}, "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": "Unit derived from '\"' symbol in source text. Range parsed from '30\"-36\"'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.02#6", "attribute": "mounting_height_range_AFF", "original_value": "33-36", "source_text": "33\"-36\" AFF", "normalized_value": {"min": "33", "max": "36"}, "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": "Unit derived from '\"' symbol in source text. Range parsed from '33\"-36\"'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.02#7", "attribute": "load_requirement", "original_value": "250", "source_text": "NOTE: ALLOWABLE STRESSES SHALL NOT BE EXCEEDED FOR MATERIALS USED WHERE A VERTICAL OR HORIZONTAL FORCE OF 250 LBS. IS APPLIED AT ANY POINT ON THE GRAB BAR, FASTENER MOUNTING DEVICE OR SUPPORTING STRUCTURE.", "normalized_value": "250", "normalized_unit": "lbs", "normalized_attribute": null, "normalization_notes": "Unit derived from 'LBS.' in source text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.02#8", "attribute": "clear_floor_space", "original_value": "30x48", "source_text": "CLEAR FLOOR SPACE 30\" MIN 48\" MIN", "normalized_value": {"width": "30", "depth": "48"}, "normalized_unit": "inches", "normalized_attribute": "min_clear_floor_space", "normalization_notes": "Unit derived from '\"' symbol in source text. Parsed as width x depth. Min qualifier from 'MIN'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.02#9", "attribute": "rim_height_AFF", "original_value": "34", "source_text": "34\" MAX", "normalized_value": "34", "normalized_unit": "inches", "normalized_attribute": "max_rim_height_aff", "normalization_notes": "Unit derived from '\"' symbol in source text. Max qualifier from 'MAX'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.02#10", "attribute": "general_note", "original_value": "Insulate exposed pipes", "source_text": "INSULATE EXPOSED PIPES", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.02#11", "attribute": "mounting_height_AFF", "original_value": "40", "source_text": "40\" MAX", "normalized_value": "40", "normalized_unit": "inches", "normalized_attribute": "max_mounting_height_aff", "normalization_notes": "Unit derived from '\"' symbol in source text. Max qualifier from 'MAX'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.02#12", "attribute": "mounting_height_AFF", "original_value": "48", "source_text": "48\" MAX", "normalized_value": "48", "normalized_unit": "inches", "normalized_attribute": "max_mounting_height_aff", "normalization_notes": "Unit derived from '\"' symbol in source text. Max qualifier from 'MAX'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#0", "attribute": "quiet_hours", "original_value": "9PM-7AM", "source_text": "Quiet hours for the premises are from 9PM-7AM", "normalized_value": {"start": "21:00", "end": "07:00"}, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Normalized to 24-hour format.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#1", "attribute": "service_capacity", "original_value": "600 Amp 277/480Volt", "source_text": "Shared service to the building is to be 600 Amp 277/480Volt.", "normalized_value": {"amperage": 600, "voltage": "277/480"}, "normalized_unit": {"amperage": "A", "voltage": "V"}, "normalized_attribute": "electrical_service_capacity", "normalization_notes": "Parsed into structured electrical properties.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#2", "attribute": "pipe_size", "original_value": "1 1/2\" valved or 2\" PVC/PEX", "source_text": "Landlord to provide a single 1 1/2\" valved or 2\" PVC/PEX water service to Building shell.", "normalized_value": [{"size": 1.5, "type": "valved"}, {"size": 2, "type": "PVC/PEX"}], "normalized_unit": "inches", "normalized_attribute": "water_service_pipe_options", "normalization_notes": "Normalized fraction and parsed options. Unit 'inches' applies to both options.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G11.03#3", "attribute": "stub_location", "original_value": "within the building shell ceiling", "source_text": "Line is stubbed within the building shell ceiling.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#4", "attribute": "pipe_size", "original_value": "6\" grease and 6\" sanitary", "source_text": "Landlord shall provide a minimum 4' concrete leave out with shared 6\" grease and 6\" sanitary sewer trunk line", "normalized_value": [{"size": 6, "service": "grease"}, {"size": 6, "service": "sanitary"}], "normalized_unit": "inches", "normalized_attribute": "sewer_pipe_sizes", "normalization_notes": "Parsed into two separate pipe definitions. Unit 'inches' applies to both.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#5", "attribute": "burial_depth", "original_value": "2' or more", "source_text": "sewer trunk line buried 2' or more, stubbed to the Premises of the shell building.", "normalized_value": "2", "normalized_unit": "feet", "normalized_attribute": "min_burial_depth", "normalization_notes": "Unit derived from ' symbol in source text. Min qualifier from 'or more'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#6", "attribute": "equipment_capacity", "original_value": "2500-gallon", "source_text": "There is a shared 2500-gallon grease interceptor that is designated for this shell building's Tenants.", "normalized_value": "2500", "normalized_unit": "gallons", "normalized_attribute": "grease_interceptor_capacity", "normalization_notes": "Extracted numeric value and unit.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#7", "attribute": "general_note", "original_value": "ALL ROOF PENETRATIONS MUST BE MADE BY LANDLORD'S ROOFING CONTRACTOR, AT TENANTS COST.", "source_text": "ALL ROOF PENETRATIONS MUST BE MADE BY LANDLORD'S ROOFING CONTRACTOR, AT TENANTS COST.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#8", "attribute": "general_note", "original_value": "TENANT IS REQUIRED TO USE LANDLORD'S FIRE ALARM MONITORING COMPANY TO CONNECT TENANT'S SYSTEM TO LANDLORD'S FIRE ALARM PANEL.", "source_text": "TENANT IS REQUIRED TO USE LANDLORD'S FIRE ALARM MONITORING COMPANY TO CONNECT TENANT'S SYSTEM TO LANDLORD'S FIRE ALARM PANEL.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#9", "attribute": "insulation_rating", "original_value": "R-19", "source_text": "Demising walls must be insulated with R-19 to limit sound penetration.", "normalized_value": "19", "normalized_unit": "R-value", "normalized_attribute": null, "normalization_notes": "Value is standard insulation rating.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#10", "attribute": "construction_extent", "original_value": "from finished floor slab to roof deck", "source_text": "Tenant shall furnish and install all demising partitions from finished floor slab to roof deck.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#11", "attribute": "door_count", "original_value": "1 exterior storefront door per each occupant's space", "source_text": "Landlord shall provide 1 exterior storefront door per each occupant's space.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#12", "attribute": "vapor_barrier", "original_value": "15 Mil", "source_text": "ii. 15 Mil vapor barrier", "normalized_value": "15", "normalized_unit": "mil", "normalized_attribute": "vapor_barrier_thickness", "normalization_notes": "Extracted numeric value and unit.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#13", "attribute": "reinforcement", "original_value": "#4 bars 15\" OCEW (on center each way)", "source_text": "iv. #4 bars 15\" OCEW (on center each way)", "normalized_value": {"bar_size": "#4", "spacing": 15, "spacing_direction": "on center each way"}, "normalized_unit": {"spacing": "inches"}, "normalized_attribute": "rebar_reinforcement", "normalization_notes": "Parsed into structured rebar properties.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#14", "attribute": "compressive_strength", "original_value": "3000PSI", "source_text": "v. 3000PSI minimum concrete", "normalized_value": "3000", "normalized_unit": "psi", "normalized_attribute": "min_compressive_strength", "normalization_notes": "Min qualifier from 'minimum' in source text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#15", "attribute": "story_count", "original_value": "single story", "source_text": "c. All spaces are single story with no provision for additional floors.", "normalized_value": "1", "normalized_unit": "story", "normalized_attribute": null, "normalization_notes": "Normalized 'single' to '1'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#16", "attribute": "roofer", "original_value": "PBC Roof Systems - 9119 Meadow Vista Blvd, Houston, TX 77064 1. 281-469-3622, Darrel Kirtley", "source_text": "i. Roofer \u2014 PBC Roof Systems \u2013 9119 Meadow Vista Blvd, Houston, TX 77064\n1. 281-469-3622, Darrel Kirtley", "normalized_value": {"role": "Roofer", "company": "PBC Roof Systems", "address": "9119 Meadow Vista Blvd, Houston, TX 77064", "phone": "281-469-3622", "contact_name": "Darrel Kirtley"}, "normalized_unit": null, "normalized_attribute": "roofer_info", "normalization_notes": "Parsed into structured data.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#17", "attribute": "fire_sprinkler_contractor", "original_value": "BMF Solutions - 13602 Jarvis, Cypress, TX 77429 1. 832-220-1500 Tony Murray", "source_text": "ii. Fire Sprinkler \u2013 BMF Solutions \u2013 13602 Jarvis, Cypress, TX 77429\n1. 832-220-1500 Tony Murray", "normalized_value": {"role": "Fire Sprinkler", "company": "BMF Solutions", "address": "13602 Jarvis, Cypress, TX 77429", "phone": "832-220-1500", "contact_name": "Tony Murray"}, "normalized_unit": null, "normalized_attribute": "fire_sprinkler_contractor_info", "normalization_notes": "Parsed into structured data.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#18", "attribute": "fire_alarm_contractor", "original_value": "Impact Fire - 1 Chisolm Trail Road, Suite 330, Round Rock, TX 78681 1. 713-263-7535, James Fish", "source_text": "iii. Fire Alarm \u2013 Impact Fire \u2013 1 Chisolm Trail Road, Suite 330, Round Rock, TX 78681\n1. 713-263-7535, James Fish", "normalized_value": {"role": "Fire Alarm", "company": "Impact Fire", "address": "1 Chisolm Trail Road, Suite 330, Round Rock, TX 78681", "phone": "713-263-7535", "contact_name": "James Fish"}, "normalized_unit": null, "normalized_attribute": "fire_alarm_contractor_info", "normalization_notes": "Parsed into structured data.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#19", "attribute": "storefront_contractor", "original_value": "ConTor Glass - 27531 Gatlin Lane, Spring, TX 77386 1. 832-283-0599, Preston Wallace", "source_text": "iv. Storefront \u2013 ConTor Glass \u2013 27531 Gatlin Lane, Spring, TX 77386\n1. 832-283-0599, Preston Wallace", "normalized_value": {"role": "Storefront", "company": "ConTor Glass", "address": "27531 Gatlin Lane, Spring, TX 77386", "phone": "832-283-0599", "contact_name": "Preston Wallace"}, "normalized_unit": null, "normalized_attribute": "storefront_contractor_info", "normalization_notes": "Parsed into structured data.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#20", "attribute": "notice_period", "original_value": "10 day", "source_text": "These contractors must be given a 10 day notice to schedule the work.", "normalized_value": "10", "normalized_unit": "days", "normalized_attribute": null, "normalization_notes": "Extracted numeric value and unit.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.04#0", "attribute": "scope_of_work", "original_value": "Lease Space Build-out (LSBO)", "source_text": "X LEASE SPACE BUILD-OUT (LSBO)", "normalized_value": {"description": "Lease Space Build-out", "acronym": "LSBO"}, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Parsed description and acronym.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.04#1", "attribute": "occupancy_separation", "original_value": "Single Occupancy", "source_text": "X SINGLE OCCUPANCY", "normalized_value": null}] \ No newline at end of file diff --git a/backend/.llm_cache/9b08ddaeccc5d49ac12eb192f3f40d1ad6c878321acfe18faaa445acfbc340af.json b/backend/.llm_cache/9b08ddaeccc5d49ac12eb192f3f40d1ad6c878321acfe18faaa445acfbc340af.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/9b08ddaeccc5d49ac12eb192f3f40d1ad6c878321acfe18faaa445acfbc340af.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/9c1a39c365875208e6dd5b5a5f8f976b478206012c267bbd6d8bfb3236e74428.json b/backend/.llm_cache/9c1a39c365875208e6dd5b5a5f8f976b478206012c267bbd6d8bfb3236e74428.json new file mode 100644 index 0000000..d5a8a48 --- /dev/null +++ b/backend/.llm_cache/9c1a39c365875208e6dd5b5a5f8f976b478206012c267bbd6d8bfb3236e74428.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "SK1_vent_pipe_size", "category": "detail_vs_plan_mismatch", "severity": "medium", "confidence": "high", "location": "Lounge, Sink SK-1", "disciplines": ["Plumbing"], "sheets": ["P02.01", "P03.01"], "description": "The plumbing floor plan shows a 2-inch vent pipe for sink SK-1, while the plumbing riser diagram indicates a 1 1/2-inch vent for the fixture group that includes this sink. The pipe size needs to be consistent across all drawings to ensure correct material procurement and installation.", "evidence": [{"discipline": "Plumbing", "sheet": "P02.01", "source_text": "2\"V", "asserted_value": "2-inch vent"}, {"discipline": "Plumbing", "sheet": "P03.01", "source_text": "1 1/2\"V", "asserted_value": "1 1/2-inch vent"}], "recommended_resolution": "verify with engineer"}]} \ No newline at end of file diff --git a/backend/.llm_cache/9f43501bc4057591061d837e50ce3448cb4648248b1a1a8c9276d899644691c5.json b/backend/.llm_cache/9f43501bc4057591061d837e50ce3448cb4648248b1a1a8c9276d899644691c5.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/9f43501bc4057591061d837e50ce3448cb4648248b1a1a8c9276d899644691c5.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/a24fff72a83a6c8abcd658b1342bafcaf303d31c2402aad6cb1845bb4ac9373d.json b/backend/.llm_cache/a24fff72a83a6c8abcd658b1342bafcaf303d31c2402aad6cb1845bb4ac9373d.json new file mode 100644 index 0000000..78ff4c0 --- /dev/null +++ b/backend/.llm_cache/a24fff72a83a6c8abcd658b1342bafcaf303d31c2402aad6cb1845bb4ac9373d.json @@ -0,0 +1 @@ +{"normalized_assertions": [{"assertion_id": "A23.01#11", "original_value": "CLASS A", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A23.01#12", "original_value": "Shaw NEXT GEN 2.0, VERIZON STANDARD, 24\" X 24\", ASHLAR STACK PATTERN 50% OFFSET", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A23.01#13", "original_value": "CPT1", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A23.01#14", "original_value": "CPT1", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A23.01#15", "original_value": "Grade 2 (Medium Exposed), with a Class 1 (Matte) Finish", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A23.01#16", "original_value": "0.50", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A23.01#17", "original_value": "PC1", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#0", "original_value": "Refer to project general notes on sheet G11.01", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#1", "original_value": "Installation of all Cellular Sales / Verizon display fixtures shall be performed by a qualified Cellular Sales / Verizon vendor.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#2", "original_value": "Contractor's electrician must be available during installation to install electrical connections as needed.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#3", "original_value": "Position wall mount power transition boxes on back side of wall for accessibility, especially if transition boxes are behind wall fixtures.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#4", "original_value": "Refer to detail 3/A92.01 for foundation pour back detail where existing slab is cut.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#5", "original_value": "Coordinate with tenant for plywood backing for mounting network rack", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#6", "original_value": "Provide (3) 3\" conduits from network rack to sales ceiling plenum", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#7", "original_value": "(2) 20A, OUTLETS AT 60\" A.F.F.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#8", "original_value": "(1) 10 GAUGE GROUND BLOCK WITH GROUND WIRE CONNECTED TO THE PANEL GROUND (REQUIRED FOR WARRANTY)", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#9", "original_value": "RACK SYSTEM", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#10", "original_value": "~74", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#11", "original_value": "EXISTING FIRE RISER ROOM", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#12", "original_value": "CORRIDOR", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#13", "original_value": "INVENTORY", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#14", "original_value": "MEN'S RESTROOM", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#15", "original_value": "WOMEN'S RESTROOM", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#16", "original_value": "MANAGER'S OFFICE", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#17", "original_value": "CLEANING SUPPLIES/STORAGE", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#18", "original_value": "SALES AREA", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A24.01#19", "original_value": "14'-2 1/8\"", "normalized_value": "14' 2 1/8\"", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Normalized by removing space between feet and inches", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A25.01#0", "original_value": "ROOF PLAN IS FOR REFERENCE ONLY. CONTRACTORS ARE TO VERIFY EXISTING CONDITIONS (DIMENSIONS, CLEARANCES, STRUCTURE TYPE, ETC.) IN THE FIELD.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A25.01#1", "original_value": "CONTRACTOR TO REFER TO MECHANICAL DRAWINGS FOR ALL ROOFTOP UNIT REQUIREMENTS, DETAILS, AND SPECIFICATIONS.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A25.01#2", "original_value": "CONTRACTORS SHALL VERIFY LOCATIONS OF EXISTING SYSTEMS AND OPENINGS; SUCH AS EXISTING RTU'S, ROOF VENTS, HVAC, ROOF ACCESS, AND OTHER PENETRATIONS. VERIFY COORDINATIONS REQUIRED BETWEEN EXISTING PENETRATIONS AND EQUIPMENT WITH NEW.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A25.01#3", "original_value": "REPAIR AND SEAL ROOF IF REQUIRED AROUND ALL NEW PENETRATIONS AND EQUIPMENT, PER MANUFACTURER'S RECOMMENDATIONS.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A25.01#4", "original_value": "2 NEW RTU, PROVIDE NEW MECHANICAL ROOF CURBS AS NECESSARY TO ACCOMODATE NEW RTU. GC TO INSTALL FLASHING PER PER ROOFING MANUFACTURING STANDARDS. GC SHALL COORDINATE ROOF WORK WITH LL REQUIREMENTS TO MAINTAIN EXISTING ROOFING WARRANTY. REFER TO MEP DRAWINGS FOR MORE INFORMATION.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A25.01#5", "original_value": "2", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A25.01#6", "original_value": "6'-9\"", "normalized_value": "6' 9\"", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Normalized by removing space between feet and inches", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A25.01#7", "original_value": "3'-3 1/4\"", "normalized_value": "3' 3 1/4\"", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Normalized by removing space between feet and inches", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A25.01#8", "original_value": "ROOF CURB DETAIL", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A25.01#9", "original_value": "6\" = 1'-0\"", "normalized_value": "6\" = 1' 0\"", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Normalized by removing space between feet and inches", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A25.01#10", "original_value": "Prefabricated Metal Curb", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A25.01#11", "original_value": "2X4 WOOD NAILER", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A25.01#12", "original_value": "12", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A25.01#13", "original_value": "TPO MEMBRANE ADHERED OR MECHANICALLY FASTENED", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A25.01#14", "original_value": "1 1/2", "normalized_value": "1 1/2\"", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Normalized by adding missing inch symbol", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "A25.01#15", "original_value": "WOOD NAILER INSTALLED TO MEET APPLICABLE BUILDING CODES", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A25.01#16", "original_value": "COUNTERFLASHING SKIRT", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#0", "original_value": "MEN'S RESTROOM", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#1", "original_value": "103", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#2", "original_value": "WOMEN'S / RESTROOM", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#3", "original_value": "102", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "room_number", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#4", "original_value": "WC-1", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#5", "original_value": "WC-1", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#6", "original_value": "L-1", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#7", "original_value": "L-1", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#8", "original_value": "EDF-1", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#9", "original_value": "G11.02", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#10", "original_value": "2'-10\"", "normalized_value": "2' 10\"", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Normalized by removing space between feet and inches", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#11", "original_value": "2'-5\"", "normalized_value": "2' 5\"", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Normalized by removing space between feet and inches", "source_text_preserved": "true", "normalization_confidence": "high"}, {"assertion_id": "A51.01#12", "original_value": "6\"", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#13", "original_value": "3'-4\"", "normalized_value": "3' 4\"", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Normalized by removing space between feet and inches", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#14", "original_value": "1'-5\"", "normalized_value": "1' 5\"", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Normalized by removing space between feet and inches", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "A51.01#15", "original_value": "4'-0\"", "normalized_value": "4' 0\"", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Normalized by removing space between feet and inches", "source_text_preserved": true, "normalization_confidence": "high"}]} \ No newline at end of file diff --git a/backend/.llm_cache/a4b92db32e4a5cb1f6f9df318a0e87c05d15775169093962e56682591d27d960.json b/backend/.llm_cache/a4b92db32e4a5cb1f6f9df318a0e87c05d15775169093962e56682591d27d960.json new file mode 100644 index 0000000..493742d --- /dev/null +++ b/backend/.llm_cache/a4b92db32e4a5cb1f6f9df318a0e87c05d15775169093962e56682591d27d960.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "EWH-1_drain_size_mismatch", "category": "schedule_vs_plan_mismatch", "severity": "low", "confidence": "high", "location": "Electric Water Heater EWH-1", "disciplines": ["Plumbing"], "sheets": ["P01.01", "P02.02", "P03.01"], "description": "The Plumbing Fixture Schedule on sheet P01.01 lists a 1-1/2\" waste (W) connection for the electric water heater EWH-1. This conflicts with the plan keynote on P02.02 and the installation detail on P03.01, both of which specify 3/4\" drain lines for the temperature and pressure (T&P) relief valve and the auxiliary drain pan. The remarks column of the fixture schedule itself also refers to a 3/4\" drain, creating an internal contradiction within the schedule.", "evidence": [{"discipline": "Plumbing", "sheet": "P01.01", "source_text": "W 1 - 1/2\"", "asserted_value": "1-1/2 inch Waste Connection"}, {"discipline": "Plumbing", "sheet": "P02.02", "source_text": "ROUTE 3/4\" T&P DRAIN LINE AND 3/4\" AUXILIARY DRAIN LINES TO FLOOR SINK BELOW.", "asserted_value": "3/4 inch Drain Lines"}, {"discipline": "Plumbing", "sheet": "P01.01", "source_text": "PROVIDE AUXILIARY DRAIN PAN WITH 3/4\" DRAIN TO FLOOR SINK.", "asserted_value": "3/4 inch Drain Line"}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/a4fe1ea824fbdecec2bf34528cbf53bc0c4ff7958238f1dd0947c865f54ed0f3.json b/backend/.llm_cache/a4fe1ea824fbdecec2bf34528cbf53bc0c4ff7958238f1dd0947c865f54ed0f3.json new file mode 100644 index 0000000..b750319 --- /dev/null +++ b/backend/.llm_cache/a4fe1ea824fbdecec2bf34528cbf53bc0c4ff7958238f1dd0947c865f54ed0f3.json @@ -0,0 +1 @@ +{"sheet_number": "G11.03", "discipline": "General", "sheet_title": "LANDLORD WORK LETTER", "level": "BUILDING C", "scale": null, "assertions": [{"subject": "Work Hours", "attribute": "quiet_hours", "value": "9PM-7AM", "source_text": "Quiet hours for the premises are from 9PM-7AM", "confidence": "high", "location_key": {"grid": null, "room": "Premises", "level": "BUILDING C", "tag": null}}, {"subject": "Electrical Service", "attribute": "service_capacity", "value": "600 Amp 277/480Volt", "source_text": "Shared service to the building is to be 600 Amp 277/480Volt.", "confidence": "high", "location_key": {"grid": null, "room": "Premises", "level": "BUILDING C", "tag": null}}, {"subject": "Domestic Water Service", "attribute": "pipe_size", "value": "1 1/2\" valved or 2\" PVC/PEX", "source_text": "Landlord to provide a single 1 1/2\" valved or 2\" PVC/PEX water service to Building shell.", "confidence": "high", "location_key": {"grid": null, "room": "Building shell", "level": "BUILDING C", "tag": null}}, {"subject": "Domestic Water Service", "attribute": "stub_location", "value": "within the building shell ceiling", "source_text": "Line is stubbed within the building shell ceiling.", "confidence": "high", "location_key": {"grid": null, "room": "Building shell", "level": "BUILDING C", "tag": null}}, {"subject": "Sanitary and Grease Sewer", "attribute": "pipe_size", "value": "6\" grease and 6\" sanitary", "source_text": "Landlord shall provide a minimum 4' concrete leave out with shared 6\" grease and 6\" sanitary sewer trunk line", "confidence": "high", "location_key": {"grid": null, "room": "Premises", "level": "BUILDING C", "tag": null}}, {"subject": "Sanitary and Grease Sewer", "attribute": "burial_depth", "value": "2' or more", "source_text": "sewer trunk line buried 2' or more, stubbed to the Premises of the shell building.", "confidence": "high", "location_key": {"grid": null, "room": "Premises", "level": "BUILDING C", "tag": null}}, {"subject": "Grease Interceptor", "attribute": "equipment_capacity", "value": "2500-gallon", "source_text": "There is a shared 2500-gallon grease interceptor that is designated for this shell building's Tenants.", "confidence": "high", "location_key": {"grid": null, "room": "shell building's Tenants", "level": "BUILDING C", "tag": null}}, {"subject": "Roof Penetrations", "attribute": "general_note", "value": "ALL ROOF PENETRATIONS MUST BE MADE BY LANDLORD'S ROOFING CONTRACTOR, AT TENANTS COST.", "source_text": "ALL ROOF PENETRATIONS MUST BE MADE BY LANDLORD'S ROOFING CONTRACTOR, AT TENANTS COST.", "confidence": "high", "location_key": {"grid": null, "room": "Building", "level": "Roof", "tag": null}}, {"subject": "Fire Alarm System", "attribute": "general_note", "value": "TENANT IS REQUIRED TO USE LANDLORD'S FIRE ALARM MONITORING COMPANY TO CONNECT TENANT'S SYSTEM TO LANDLORD'S FIRE ALARM PANEL.", "source_text": "TENANT IS REQUIRED TO USE LANDLORD'S FIRE ALARM MONITORING COMPANY TO CONNECT TENANT'S SYSTEM TO LANDLORD'S FIRE ALARM PANEL.", "confidence": "high", "location_key": {"grid": null, "room": "Premises", "level": "BUILDING C", "tag": null}}, {"subject": "Demising Partition", "attribute": "insulation_rating", "value": "R-19", "source_text": "Demising walls must be insulated with R-19 to limit sound penetration.", "confidence": "high", "location_key": {"grid": null, "room": "Demising walls", "level": "BUILDING C", "tag": null}}, {"subject": "Demising Partition", "attribute": "construction_extent", "value": "from finished floor slab to roof deck", "source_text": "Tenant shall furnish and install all demising partitions from finished floor slab to roof deck.", "confidence": "high", "location_key": {"grid": null, "room": "Demising partitions", "level": "BUILDING C", "tag": null}}, {"subject": "Exterior Doors", "attribute": "door_count", "value": "1 exterior storefront door per each occupant's space", "source_text": "Landlord shall provide 1 exterior storefront door per each occupant's space.", "confidence": "high", "location_key": {"grid": null, "room": "occupant's space", "level": "BUILDING C", "tag": null}}, {"subject": "Slab on Grade Pour Back", "attribute": "vapor_barrier", "value": "15 Mil", "source_text": "ii. 15 Mil vapor barrier", "confidence": "high", "location_key": {"grid": null, "room": "Premises", "level": "BUILDING C", "tag": null}}, {"subject": "Slab on Grade Pour Back", "attribute": "reinforcement", "value": "#4 bars 15\" OCEW (on center each way)", "source_text": "iv. #4 bars 15\" OCEW (on center each way)", "confidence": "high", "location_key": {"grid": null, "room": "Premises", "level": "BUILDING C", "tag": null}}, {"subject": "Slab on Grade Pour Back", "attribute": "compressive_strength", "value": "3000PSI", "source_text": "v. 3000PSI minimum concrete", "confidence": "high", "location_key": {"grid": null, "room": "Premises", "level": "BUILDING C", "tag": null}}, {"subject": "Building Configuration", "attribute": "story_count", "value": "single story", "source_text": "c. All spaces are single story with no provision for additional floors.", "confidence": "high", "location_key": {"grid": null, "room": "All spaces", "level": "BUILDING C", "tag": null}}, {"subject": "Required Contractor", "attribute": "roofer", "value": "PBC Roof Systems - 9119 Meadow Vista Blvd, Houston, TX 77064 1. 281-469-3622, Darrel Kirtley", "source_text": "i. Roofer \u2014 PBC Roof Systems \u2013 9119 Meadow Vista Blvd, Houston, TX 77064\n1. 281-469-3622, Darrel Kirtley", "confidence": "high", "location_key": {"grid": null, "room": null, "level": "BUILDING C", "tag": "Roofer"}}, {"subject": "Required Contractor", "attribute": "fire_sprinkler_contractor", "value": "BMF Solutions - 13602 Jarvis, Cypress, TX 77429 1. 832-220-1500 Tony Murray", "source_text": "ii. Fire Sprinkler \u2013 BMF Solutions \u2013 13602 Jarvis, Cypress, TX 77429\n1. 832-220-1500 Tony Murray", "confidence": "high", "location_key": {"grid": null, "room": null, "level": "BUILDING C", "tag": "Fire Sprinkler"}}, {"subject": "Required Contractor", "attribute": "fire_alarm_contractor", "value": "Impact Fire - 1 Chisolm Trail Road, Suite 330, Round Rock, TX 78681 1. 713-263-7535, James Fish", "source_text": "iii. Fire Alarm \u2013 Impact Fire \u2013 1 Chisolm Trail Road, Suite 330, Round Rock, TX 78681\n1. 713-263-7535, James Fish", "confidence": "high", "location_key": {"grid": null, "room": null, "level": "BUILDING C", "tag": "Fire Alarm"}}, {"subject": "Required Contractor", "attribute": "storefront_contractor", "value": "ConTor Glass - 27531 Gatlin Lane, Spring, TX 77386 1. 832-283-0599, Preston Wallace", "source_text": "iv. Storefront \u2013 ConTor Glass \u2013 27531 Gatlin Lane, Spring, TX 77386\n1. 832-283-0599, Preston Wallace", "confidence": "high", "location_key": {"grid": null, "room": null, "level": "BUILDING C", "tag": "Storefront"}}, {"subject": "Contractor Notice", "attribute": "notice_period", "value": "10 day", "source_text": "These contractors must be given a 10 day notice to schedule the work.", "confidence": "medium", "location_key": {"grid": null, "room": "Premises", "level": "BUILDING C", "tag": null}}]} \ No newline at end of file diff --git a/backend/.llm_cache/a50bcda16a2086a707cd2e74e003890da217c8cf089b21fe1f50215feadc964f.json b/backend/.llm_cache/a50bcda16a2086a707cd2e74e003890da217c8cf089b21fe1f50215feadc964f.json new file mode 100644 index 0000000..d258dcf --- /dev/null +++ b/backend/.llm_cache/a50bcda16a2086a707cd2e74e003890da217c8cf089b21fe1f50215feadc964f.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "rtu_curb_height_discrepancy_01", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "Roof Curb for new RTUs at Grid B-C/4-5", "disciplines": ["Architectural", "Mechanical"], "sheets": ["M01.01", "A25.01"], "description": "The mechanical schedule on M01.01 specifies a 14-inch high roof curb for the new RTUs. The architectural roof curb detail on A25.01 contains conflicting information: one note states '14\" HIGH PER IECC & MFR'S REQ.' which is consistent, but another note in the same detail says to 'Nominate 1'0\"' (12 inches). This ambiguity will cause confusion for bidding and installation, potentially impacting waterproofing and structural coordination.", "evidence": [{"discipline": "Mechanical", "sheet": "M01.01", "source_text": "9. PROVIDE 14\" HIGH INSULATED ROOF CURB.", "asserted_value": "14 inches"}, {"discipline": "Architectural", "sheet": "A25.01", "source_text": "Nominate 1'0\" for P.Con.", "asserted_value": "12 inches"}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/a5a9777dd4d52a4fc195396224e30dd0916fd2c68db593fbef1ddc938df36dd7.json b/backend/.llm_cache/a5a9777dd4d52a4fc195396224e30dd0916fd2c68db593fbef1ddc938df36dd7.json new file mode 100644 index 0000000..9160b39 --- /dev/null +++ b/backend/.llm_cache/a5a9777dd4d52a4fc195396224e30dd0916fd2c68db593fbef1ddc938df36dd7.json @@ -0,0 +1 @@ +{"sheet_number": "A11.01", "discipline": "Architectural", "sheet_title": "SITE PLAN", "level": null, "scale": "1\" = 50'-0\"", "assertions": [{"subject": "Project", "attribute": "project_address", "value": "7022 ELYSON EXCHANGE WAY CYPRESS, TX 77433", "source_text": "VERIZON ELYSON\n7022 ELYSON EXCHANGE WAY\nCYPRESS, TX 77433", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Scope of Work", "attribute": "scope_description", "value": "INTERIOR TENANT BUILD OUT AREA OF WORK IN EXISTING BUILDING C", "source_text": "INTERIOR TENANT BUILD OUT AREA OF WORK IN EXISTING BUILDING C 7022 ELYSON EXCHANGE WAY", "confidence": "high", "location_key": {"grid": null, "room": "BUILDING C", "level": null, "tag": null}}, {"subject": "Building B", "attribute": "address", "value": "7016 ELYSON EXCHANGE WAY", "source_text": "BUILDING B\n7016 ELYSON\nEXCHANGE WAY", "confidence": "high", "location_key": {"grid": null, "room": "BUILDING B", "level": null, "tag": null}}, {"subject": "Building C", "attribute": "address", "value": "7022 ELYSON EXCHANGE WAY", "source_text": "EXISTING BUILDING C\n7022 ELYSON\nEXCHANGE WAY", "confidence": "high", "location_key": {"grid": null, "room": "BUILDING C", "level": null, "tag": null}}, {"subject": "Building D", "attribute": "address", "value": "7046 ELYSON EXCHANGE WAY", "source_text": "BUILDING D\n7046 ELYSON\nEXCHANGE WAY", "confidence": "high", "location_key": {"grid": null, "room": "BUILDING D", "level": null, "tag": null}}, {"subject": "Building E", "attribute": "address", "value": "7040 ELYSON EXCHANGE WAY", "source_text": "BUILDING E\n7040 ELYSON\nEXCHANGE WAY", "confidence": "high", "location_key": {"grid": null, "room": "BUILDING E", "level": null, "tag": null}}, {"subject": "Building F", "attribute": "address", "value": "7034 ELYSON EXCHANGE WAY", "source_text": "BUILDING F\n7034 ELYSON EXCHANGE\nWAY", "confidence": "high", "location_key": {"grid": null, "room": "BUILDING F", "level": null, "tag": null}}, {"subject": "Building G", "attribute": "address", "value": "7052 ELYSON EXCHANGE WAY", "source_text": "BUILDING G\n7052 ELYSON\nEXCHANGE WAY", "confidence": "high", "location_key": {"grid": null, "room": "BUILDING G", "level": null, "tag": null}}, {"subject": "Building H", "attribute": "address", "value": "7058 ELYSON EXCHANGE WAY", "source_text": "BUILDING H\n7058 ELYSON\nEXCHANGE WAY", "confidence": "high", "location_key": {"grid": null, "room": "BUILDING H", "level": null, "tag": null}}, {"subject": "Building J", "attribute": "address", "value": "7064 ELYSON EXCHANGE WAY", "source_text": "BUILDING J\n7064 ELYSON EXCHANGE WAY", "confidence": "high", "location_key": {"grid": null, "room": "BUILDING J", "level": null, "tag": null}}, {"subject": "Building K", "attribute": "address", "value": "7028 ELYSON EXCHANGE WAY", "source_text": "BUILDING K\n7028 ELYSON\nEXCHANGE WAY", "confidence": "high", "location_key": {"grid": null, "room": "BUILDING K", "level": null, "tag": null}}, {"subject": "Building L", "attribute": "address", "value": "7070 ELYSON EXCHANGE WAY", "source_text": "BUILDING L\n7070 ELYSON\nEXCHANGE WAY", "confidence": "high", "location_key": {"grid": null, "room": "BUILDING L", "level": null, "tag": null}}, {"subject": "Buildings A", "attribute": "scope_status", "value": "Not in scope", "source_text": "BLDGS. A\nNOT IN\nSCOPE", "confidence": "high", "location_key": {"grid": null, "room": "BLDGS. A", "level": null, "tag": null}}, {"subject": "Drive Aisle", "attribute": "overall_dim", "value": "30'-0\"", "source_text": "30' - 0\"", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}]} \ No newline at end of file diff --git a/backend/.llm_cache/a719bc8a6b9075970fe80faabd60cc89990528dd5e9523c00af6cc8fb9204f56.json b/backend/.llm_cache/a719bc8a6b9075970fe80faabd60cc89990528dd5e9523c00af6cc8fb9204f56.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/a719bc8a6b9075970fe80faabd60cc89990528dd5e9523c00af6cc8fb9204f56.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/a99c0d294d3591930adcdd6ce542ba8f06a89441bd01ba6f0ef6e19530a8b744.json b/backend/.llm_cache/a99c0d294d3591930adcdd6ce542ba8f06a89441bd01ba6f0ef6e19530a8b744.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/a99c0d294d3591930adcdd6ce542ba8f06a89441bd01ba6f0ef6e19530a8b744.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/aac50ee4570b6f5ac52ebf49729493ecf569f6cc5d5243a2c84c1d7cd08d5e37.json b/backend/.llm_cache/aac50ee4570b6f5ac52ebf49729493ecf569f6cc5d5243a2c84c1d7cd08d5e37.json new file mode 100644 index 0000000..f39e45c --- /dev/null +++ b/backend/.llm_cache/aac50ee4570b6f5ac52ebf49729493ecf569f6cc5d5243a2c84c1d7cd08d5e37.json @@ -0,0 +1 @@ +[{"assertion_id": "E01.02#9", "attribute": "mounting_height_AFF", "value": "5'-5\"", "source_text": "TYPE: L-6, DESCRIPTION: 16\" PENDANT, MOUNTING: PENDANT, NOTES: PENDANT 5'-5\" AFF", "normalized_value": "65", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#10", "attribute": "schedule_entry", "value": "Type X is a LED exit sign with Nickel Cadmium battery and self diagnostics.", "source_text": "TYPE: X, DESCRIPTION: LED EXIT SIGN WITH NICKEL CADMIUM BATTERY AND SELF DIAGNOSTICS", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text, no normalization applied.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#11", "attribute": "note", "value": "Emergency egress operation in fixtures shall provide minimum 400 lumens for minimum 90 minutes.", "source_text": "1. EMERGENCY EGRESS OPERATION IN FIXTURES SHALL PROVIDE MINIMUM 400 LUMENS FOR MINIMUM 90 MINUTES", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Note contains multiple performance requirements.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#12", "attribute": "connected_load", "value": "5", "source_text": "DESCRIPTION: WATER HEATING, CONNECTED (KVA): 5, DEMAND (KVA): 5", "normalized_value": "5", "normalized_unit": "KVA", "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#13", "attribute": "connected_load", "value": "21", "source_text": "DESCRIPTION: HVAC HEATING *, CONNECTED (KVA): 21, DEMAND (KVA): 21", "normalized_value": "21", "normalized_unit": "KVA", "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#14", "attribute": "connected_load", "value": "<17", "source_text": "DESCRIPTION: HVAC COOLING *, CONNECTED (KVA): <17, DEMAND (KVA): <17", "normalized_value": "<17", "normalized_unit": "KVA", "normalized_attribute": null, "normalization_notes": "Operator preserved from original value.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#15", "attribute": "service_size", "value": "100", "source_text": "RECOMMENDED SERVICE SIZE AT 480V 3P 4W = 100 AMPS", "normalized_value": "100", "normalized_unit": "AMPS", "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#16", "attribute": "equipment_location", "value": "LOUNGE", "source_text": "PANEL NAME H, LOCATION LOUNGE", "normalized_value": "LOUNGE", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": "Value represents a room name.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#17", "attribute": "mounting", "value": "SURFACE", "source_text": "MOUNTING SURFACE", "normalized_value": "SURFACE", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E01.02#18", "attribute": "equipment_location", "value": "LOUNGE", "source_text": "PANEL NAME L, LOCATION LOUNGE", "normalized_value": "LOUNGE", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": "Value represents a room name.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E02.01#0", "attribute": "general_note", "value": "Coordinate final receptacle/data locations with architect/owner prior to rough-in.", "source_text": "1. COORDINATE FINAL RECEPTACLE/DATA LOCATIONS WITH ARCHITECT/OWNER PRIOR TO ROUGH-IN.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text, no normalization applied.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E02.01#1", "attribute": "general_note", "value": "Coordinate final floorbox locations with architect/owner prior to rough-in.", "source_text": "2. COORDINATE FINAL FLOORBOX LOCATIONS WITH ARCHITECT/OWNER PRIOR TO ROUGH-IN.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text, no normalization applied.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E02.01#2", "attribute": "general_note", "value": "Refer to architectural drawings for dimensional locations of all outlets.", "source_text": "3. REFER TO ARCHITECTURAL DRAWINGS FOR DIMENSIONAL LOCATIONS OF ALL OUTLETS.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text, no normalization applied.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E02.01#3", "attribute": "keynote_assertion", "value": "Provide combination (power/data) Hubbell Systemone fully recessed floorbox #CFB4G25 with flush round cover (finish approved by architect).", "source_text": "1 PROVIDE COMBINATION (POWER/DATA) HUBBELL SYSTEMONE FULLY RECESSED FLOORBOX #CFB4G25 WITH FLUSH ROUND COVER (FINISH APPROVED BY ARCHITECT). PROVIDE WITH (1) DUPLEX RECEPTACLE. COORDINATE CONCRETE DEPTH REQUIREMENTS WITH G.C. COORDINATE FLOOR BOX ACCESSORIES WITH OWNER.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text, no normalization applied.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E02.01#4", "attribute": "keynote_assertion", "value": "Provide (power) Hubbell Systemone fully recessed floorbox #PFBI with flush round cover (finish approved by architect).", "source_text": "2 PROVIDE (POWER) HUBBELL SYSTEMONE FULLY RECESSED FLOORBOX #PFBI WITH FLUSH ROUND COVER (FINISH APPROVED BY ARCHITECT). PROVIDE WITH (1) DUPLEX RECEPTACLE. COORDINATE CONCRETE DEPTH REQUIREMENTS WITH G.C. COORDINATE FLOOR BOX ACCESSORIES WITH OWNER.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text, no normalization applied.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E02.01#5", "attribute": "penetration", "value": "1-1/4\"C with pullstring for data to ceiling space above rack system in inventory room.", "source_text": "3 PROVIDE 1-1/4\"C WITH PULLSTRING FOR DATA TO CEILING SPACE ABOVE RACK SYSTEM IN INVENTORY ROOM VIA NEAREST FULL HEIGHT INTERIOR WALL.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive phrase containing size and other information which cannot be separated.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E02.01#6", "attribute": "keynote_assertion", "value": "Provide power for building sign. Coordinate final location and mounting height prior to rough-in.", "source_text": "4 PROVIDE POWER FOR BUILDING SIGN. COORDINATE FINAL LOCATION AND MOUNTING HEIGHT PRIOR TO ROUGH-IN.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text, no normalization applied.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E02.01#7", "attribute": "keynote_assertion", "value": "Furnish and install #10 Cu ground with ground lug for connection to network racks.", "source_text": "5 FURNISH AND INSTALL #10 Cu GROUND WITH GROUND LUG FOR CONNECTION TO NETWORK RACKS.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text, no normalization applied.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E02.01#8", "attribute": "penetration", "value": "(3) 3\" conduit sleeves from 6\" below dropped ceiling to 6\" above dropped ceiling.", "source_text": "6 FURNISH AND INSTALL (3) 3\" CONDUIT SLEEVES FROM 6\" BELOW DROPPED CEILING TO 6\" ABOVE DROPPED CEILING FOR DATA EQUIPMENT WIRING.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive phrase containing quantity, size and location information which cannot be separated.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E02.01#9", "attribute": "keynote_assertion", "value": "Transformer to be suspended from structure at high level above accessible ceiling.", "source_text": "7 TRANSFORMER TO BE SUSPENDED FROM STRUCTURE AT HIGH LEVEL ABOVE ACCESSIBLE CEILING.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text, no normalization applied.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E02.02#0", "attribute": "scale", "value": "1/4\" = 1'-0\"", "source_text": "SCALE: 1/4\" = 1'-0\"", "normalized_value": "1:48", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E03.01#0", "attribute": "scale", "value": "1/4\" = 1'-0\"", "source_text": "SCALE: 1/4\" = 1'-0\"", "normalized_value": "1:48", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E03.01#1", "attribute": "general_note", "value": "Coordinate all light switch locations with architect/owner prior to rough-in.", "source_text": "ELECTRICAL GENERAL NOTES: 1. COORDINATE ALL LIGHT SWITCH LOCATIONS WITH ARCHITECT/OWNER PRIOR TO ROUGH-IN.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text, no normalization applied.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E03.01#2", "attribute": "general_note", "value": "Connect all type 'X' emergency fixtures to nearest lighting circuit via non-switched hot leg. Provide fixtures with nickel cadmium battery.", "source_text": "ELECTRICAL GENERAL NOTES: 2. CONNECT ALL TYPE 'X' EMERGENCY FIXTURES TO NEAREST LIGHTING CIRCUIT VIA NON-SWITCHED HOT LEG. PROVIDE FIXTURES WITH NICKEL CADMIUM BATTERY.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text, no normalization applied.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E03.01#3", "attribute": "general_note", "value": "All lighting systems shall be tested to ensure proper calibration, adjustment, programming, and operation in accordance with IECC 2021 Section C408.3.", "source_text": "ELECTRICAL GENERAL NOTES: 3. ALL LIGHTING SYSTEMS SHALL BE TESTED TO ENSURE PROPER CALIBRATION, ADJUSTMENT, PROGRAMMING, AND OPERATION IN ACCORDANCE WITH IECC 2021 SECTION C408.3.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text, no normalization applied.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E03.01#4", "attribute": "keynote_assertion", "value": "Provide dimmer switch for control of sales area lighting. Coordinate final location with owner prior to rough-in.", "source_text": "ELECTRICAL KEYED NOTES: 1 PROVIDE DIMMER SWITCH FOR CONTROL OF SALES AREA LIGHTING. COORDINATE FINAL LOCATION WITH OWNER PRIOR TO ROUGH-IN.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text, no normalization applied.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E03.01#5", "attribute": "room_name", "value": "INVENTORY", "source_text": "INVENTORY", "normalized_value": "INVENTORY", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E03.01#6", "attribute": "room_name", "value": "RESTROOM", "source_text": "RESTROOM", "normalized_value": "RESTROOM", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E03.01#7", "attribute": "room_name", "value": "MANAGER'S OFFICE", "source_text": "MANAGER'S OFFICE", "normalized_value": "MANAGER'S OFFICE", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E03.01#8", "attribute": "room_name", "value": "CLEANING SUPPLIES/STORAGE", "source_text": "CLEANING SUPPLIES/STORAGE", "normalized_value": "CLEANING SUPPLIES/STORAGE", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E03.01#9", "attribute": "room_name", "value": "SALES AREA", "source_text": "SALES AREA", "normalized_value": "SALES AREA", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E03.01#10", "attribute": "general_note", "value": "fixture locations not matching arch", "source_text": "fixture locations not matching arch", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text, no normalization applied.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#0", "attribute": "room_name", "value": "INVENTORY", "source_text": "INVENTORY", "normalized_value": "INVENTORY", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#1", "attribute": "room_name", "value": "LOUNGE", "source_text": "LOUNGE", "normalized_value": "LOUNGE", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#2", "attribute": "room_name", "value": "MEN'S RESTROOM", "source_text": "MEN'S RESTROOM", "normalized_value": "MEN'S RESTROOM", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#3", "attribute": "room_name", "value": "WOMEN'S RESTROOM", "source_text": "WOMEN'S RESTROOM", "normalized_value": "WOMEN'S RESTROOM", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#4", "attribute": "room_name", "value": "MANAGER'S OFFICE", "source_text": "MANAGER'S OFFICE", "normalized_value": "MANAGER'S OFFICE", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#5", "attribute": "room_name", "value": "CLEANING SUPPLIES/STORAGE", "source_text": "CLEANING SUPPLIES/STORAGE", "normalized_value": "CLEANING SUPPLIES/STORAGE", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#6", "attribute": "room_name", "value": "SALES AREA", "source_text": "SALES AREA", "normalized_value": "SALES AREA", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#7", "attribute": "equipment_location", "value": "2 CAT.6 cables at 18 inches AFF", "source_text": "(2) CAT.6/18\"", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive phrase containing quantity, type, and height which cannot be separated.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#8", "attribute": "equipment_location", "value": "2 CAT.6 cables at 18 inches AFF", "source_text": "(2) CAT.6/18\"", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive phrase containing quantity, type, and height which cannot be separated.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#9", "attribute": "equipment_location", "value": "2 CAT.6 cables at 18 inches AFF", "source_text": "(2) CAT.6/18\"", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive phrase containing quantity, type, and height which cannot be separated.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#10", "attribute": "equipment_location", "value": "2 CAT.6 cables at 18 inches AFF", "source_text": "(2) CAT.6/18\"", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive phrase containing quantity, type, and height which cannot be separated.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#11", "attribute": "equipment_location", "value": "2 CAT.6 cables at 18 inches AFF", "source_text": "(2) CAT.6/18\"", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive phrase containing quantity, type, and height which cannot be separated.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#12", "attribute": "equipment_location", "value": "2 CAT.6 cables at 55 inches AFF", "source_text": "(2) CAT.6/55\"/H", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive phrase containing quantity, type, and height which cannot be separated.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#13", "attribute": "equipment_location", "value": "2 CAT.6 cables at 38.5 inches AFF", "source_text": "(2) CAT.6/38.5\"/H", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive phrase containing quantity, type, and height which cannot be separated.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#0", "attribute": "grounding_requirement", "value": "For an I.G. device, the conduit shall be suitable for a ground path or an additional ground shall be pulled to ground the box", "source_text": "NEUTRAL BUS FOR AN I.G. DEVICE, THE CONDUIT SHALL BE SUITABLE FOR A GROUND PATH OR AN ADDITIONAL GROUND SHALL BE PULLED TO GROUND THE BOX.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text, no normalization applied.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#1", "attribute": "grounding_requirement", "value": "Isolated ground bar shall be insulated from enclosure or installed if not existing, when indicated", "source_text": "ISOLATED GROUND BAR (WHEN INDICATED) INSULATED FROM ENCLOSURE OR INSTALL BOTH IF NOT EXISTING", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Descriptive text, no normalization applied.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#2", "attribute": "prohibited_material", "value": "Tie wire", "source_text": "NOTE: TIE WIRE SHALL NOT BE USED AS A COMPONENT OF ANY RACEWAY HANGER SYSTEM.", "normalized_value": "Tie wire", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#3", "attribute": "future_capacity", "value": "25", "source_text": "PROVIDE SPACE & SUPPORT FOR 25% FUTURE CAPACITY", "normalized_value": "25", "normalized_unit": "%", "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#4", "attribute": "component_size", "value": "3/4\" TO 1\"", "source_text": "CONDUIT CLAMP - 3/4\" TO 1\"", "normalized_value": "0.75 to 1", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": "Value represents a range of sizes.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#5", "attribute": "component_size", "value": "1 1/4\" TO 6\"", "source_text": "UNISTRUT 2 PIECE CHANNEL PIPE STRAPS - 1 1/4\" TO 6\"", "normalized_value": "1.25 to 6", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": "Value represents a range of sizes.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#6", "attribute": "fire_rating", "value": "3 Hour", "source_text": "PACK BOTH ENDS OF SLEEVE WITH 3M FIRE DAM 150 3 HOUR RATED CAULK OR APPROVED EQUAL", "normalized_value": "3", "normalized_unit": "hours", "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#7", "attribute": "material", "value": "SCHEDULE 40 BLACK STEEL PIPE SLEEVE", "source_text": "SCHEDULE 40 BLACK STEEL PIPE SLEEVE", "normalized_value": "SCHEDULE 40 BLACK STEEL PIPE SLEEVE", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#8", "attribute": "installation_depth", "value": "1", "source_text": "MINIMUM (1\") DEEP", "normalized_value": "1", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": "Value is a minimum.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#9", "attribute": "extension_beyond_wall", "value": "6", "source_text": "EXTEND CONDUIT (6\") BEYOND WALL", "normalized_value": "6", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#10", "attribute": "size", "value": "4-11/16\" square, 2-5/8\" deep", "source_text": "4-11/16\" SQUARE, 2-5/8\" DEEP JUNCTION BOX", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Complex dimension representing width, height, and depth.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#11", "attribute": "size", "value": "1", "source_text": "1\" CONDUIT MINIMUM", "normalized_value": "1", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": "Value is a minimum.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#12", "attribute": "stub_up_height", "value": "6", "source_text": "STUB CONDUIT 6\" INTO CEILING SPACE", "normalized_value": "6", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#13", "attribute": "grid_spacing", "value": "4'-0\"", "source_text": "J-HOOKS SPACED EVERY 4'0\" TO THE ASSOCIATED TELECOMMUNICATION ROOM", "normalized_value": "48", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}] \ No newline at end of file diff --git a/backend/.llm_cache/ab3ad18d654e1246f24fb737b05aa310940252cef5487b8068a78005982106ad.json b/backend/.llm_cache/ab3ad18d654e1246f24fb737b05aa310940252cef5487b8068a78005982106ad.json new file mode 100644 index 0000000..17b9405 --- /dev/null +++ b/backend/.llm_cache/ab3ad18d654e1246f24fb737b05aa310940252cef5487b8068a78005982106ad.json @@ -0,0 +1 @@ +{"sheet_number": "E02.02", "discipline": "Electrical", "sheet_title": "ROOF PLAN - POWER", "level": "ROOF", "scale": "1/4\" = 1'-0\"", "assertions": [{"subject": "ROOF PLAN - POWER", "attribute": "scale", "value": "1/4\" = 1'-0\"", "source_text": "SCALE: 1/4\" = 1'-0\"", "confidence": "high", "location_key": {"grid": null, "room": null, "level": "ROOF", "tag": null}}]} \ No newline at end of file diff --git a/backend/.llm_cache/ac2f1c3225585197efec0a49dea7c439e56124c4f7d94dad70ce5b6524fd82e5.json b/backend/.llm_cache/ac2f1c3225585197efec0a49dea7c439e56124c4f7d94dad70ce5b6524fd82e5.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/ac2f1c3225585197efec0a49dea7c439e56124c4f7d94dad70ce5b6524fd82e5.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/ae537240e9e41f52ffd11f88642b98e20d0cb05709055d1e188b8b538765d951.json b/backend/.llm_cache/ae537240e9e41f52ffd11f88642b98e20d0cb05709055d1e188b8b538765d951.json new file mode 100644 index 0000000..359415a --- /dev/null +++ b/backend/.llm_cache/ae537240e9e41f52ffd11f88642b98e20d0cb05709055d1e188b8b538765d951.json @@ -0,0 +1 @@ +{"sheet_number": "A24.01", "discipline": "Architectural", "sheet_title": "FURNITURE/ POWER/ DATA FLOOR PLAN", "level": null, "scale": "1/4\" = 1'-0\"", "assertions": [{"assertion_id": "A24.01-GN-A", "subject": "General Notes", "category": "note", "attribute": "general_note", "value": "Refer to project general notes on sheet G11.01.", "unit": null, "location_key": {"sheet_number": "A24.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": null, "detail_reference": "G11.01", "plan_zone": null}, "source_text": "A. REFER TO PROJECT GENERAL NOTES ON SHEET G11.01.", "coordination_targets": ["architectural"], "conflict_potential": "medium", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "A24.01-GN-B", "subject": "General Notes", "category": "note", "attribute": "general_note", "value": "Installation of all Cellular Sales / Verizon display fixtures shall be performed by a qualified Cellular Sales / Verizon vendor.", "unit": null, "location_key": {"sheet_number": "A24.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "B. INSTALLATION OF ALL CELLULAR SALES / VERIZON DISPLAY FIXTURES SHALL BE PERFORMED BY A QUALIFIED CELLULAR SALES / VERIZON VENDOR.", "coordination_targets": ["specialty", "owner_standard"], "conflict_potential": "high", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "A24.01-GN-C", "subject": "General Notes", "category": "note", "attribute": "general_note", "value": "Contractor must coordinate with Cellular Sales / Verizon for installation date.", "unit": null, "location_key": {"sheet_number": "A24.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "C. CONTRACTOR MUST COORDINATE WITH CELLULAR SALES / VERIZON FOR INSTALLATION DATE.", "coordination_targets": ["specialty", "owner_standard"], "conflict_potential": "high", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "A24.01-GN-D", "subject": "General Notes", "category": "note", "attribute": "general_note", "value": "Contractor's electrician must be available during installation to install electrical connections as needed.", "unit": null, "location_key": {"sheet_number": "A24.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "D. CONTRACTOR'S ELECTRICIAN MUST BE AVAILABLE DURING INSTALLATION TO INSTALL ELECTRICAL CONNECTIONS AS NEEDED.", "coordination_targets": ["electrical", "specialty"], "conflict_potential": "high", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "A24.01-GN-G", "subject": "General Notes", "category": "note", "attribute": "detail_callout", "value": "Refer to detail 3/A92.01 for foundation pour back detail where existing slab is cut.", "unit": null, "location_key": {"sheet_number": "A24.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": null, "detail_reference": "3/A92.01", "plan_zone": null}, "source_text": "G. REFER TO DETAIL 3/A92.01 FOR FOUNDATION POUR BACK DETAIL WHERE EXISTING SLAB IS CUT.", "coordination_targets": ["structural", "architectural"], "conflict_potential": "high", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "A24.01-NOTE-1", "subject": "Primary Coordination Note", "category": "note", "attribute": "general_note", "value": "Power outlets and data ports shown on this plan is for reference and coordination purposes only. Refer to electrical drawings for all power and data outlet information.", "unit": null, "location_key": {"sheet_number": "A24.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "NOTE: POWER OUTLETS AND DATA PORTS SHOWN ON THIS PLAN IS FOR REFERENCE AND COORDINATION PURPOSES ONLY. REFER TO ELECTRICAL DRAWINGS FOR ALL POWER AND DATA OUTLET INFORMATION.", "coordination_targets": ["electrical", "technology"], "conflict_potential": "high", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "A24.01-RN-1", "subject": "Room Name", "category": "room", "attribute": "room_name", "value": "EXISTING FIRE RISER ROOM", "unit": null, "location_key": {"sheet_number": "A24.01", "grid": "A", "room": null, "room_name": "EXISTING FIRE RISER ROOM", "level": null, "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "EXISTING FIRE RISER ROOM", "coordination_targets": ["fire_protection", "life_safety", "architectural"], "conflict_potential": "medium", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "A24.01-RN-2", "subject": "Room Name", "category": "room", "attribute": "room_name", "value": "CORRIDOR", "unit": null, "location_key": {"sheet_number": "A24.01", "grid": "A", "room": null, "room_name": "CORRIDOR", "level": null, "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "CORRIDOR", "coordination_targets": ["architectural", "life_safety"], "conflict_potential": "medium", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "A24.01-RN-3", "subject": "Room Name", "category": "room", "attribute": "room_name", "value": "INVENTORY", "unit": null, "location_key": {"sheet_number": "A24.01", "grid": null, "room": null, "room_name": "INVENTORY", "level": null, "tag": null, "detail_reference": null, "plan_zone": "C"}, "source_text": "INVENTORY", "coordination_targets": ["architectural"], "conflict_potential": "medium", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "A24.01-RN-4", "subject": "Room Name", "category": "room", "attribute": "room_name", "value": "LOUNGE", "unit": null, "location_key": {"sheet_number": "A24.01", "grid": "A/B", "room": null, "room_name": "LOUNGE", "level": null, "tag": null, "detail_reference": null, "plan_zone": "C"}, "source_text": "LOUNGE", "coordination_targets": ["architectural"], "conflict_potential": "medium", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "A24.01-RN-5", "subject": "Room Name", "category": "room", "attribute": "room_name", "value": "MEN'S RESTROOM", "unit": null, "location_key": {"sheet_number": "A24.01", "grid": "A/B", "room": null, "room_name": "MEN'S RESTROOM", "level": null, "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "MEN'S RESTROOM", "coordination_targets": ["architectural", "plumbing", "ada"], "conflict_potential": "medium", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "A24.01-RN-6", "subject": "Room Name", "category": "room", "attribute": "room_name", "value": "WOMEN'S RESTROOM", "unit": null, "location_key": {"sheet_number": "A24.01", "grid": "A/B", "room": null, "room_name": "WOMEN'S RESTROOM", "level": null, "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "WOMEN'S RESTROOM", "coordination_targets": ["architectural", "plumbing", "ada"], "conflict_potential": "medium", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "A24.01-RN-7", "subject": "Room Name", "category": "room", "attribute": "room_name", "value": "MANAGER'S OFFICE", "unit": null, "location_key": {"sheet_number": "A24.01", "grid": "A/B", "room": null, "room_name": "MANAGER'S OFFICE", "level": null, "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "MANAGER'S OFFICE", "coordination_targets": ["architectural"], "conflict_potential": "medium", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "A24.01-RN-8", "subject": "Room Name", "category": "room", "attribute": "room_name", "value": "CLEANING SUPPLIES/STORAGE", "unit": null, "location_key": {"sheet_number": "A24.01", "grid": "B", "room": null, "room_name": "CLEANING SUPPLIES/STORAGE", "level": null, "tag": null, "detail_reference": null, "plan_zone": null}, "source_text": "CLEANING SUPPLIES/STORAGE", "coordination_targets": ["architectural"], "conflict_potential": "medium", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "A24.01-RN-9", "subject": "Room Name", "category": "room", "attribute": "room_name", "value": "SALES AREA", "unit": null, "location_key": {"sheet_number": "A24.01", "grid": "B/C/D", "room": null, "room_name": "SALES AREA", "level": null, "tag": null, "detail_reference": null, "plan_zone": "4/5"}, "source_text": "SALES AREA", "coordination_targets": ["architectural"], "conflict_potential": "medium", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "A24.01-EQ-1", "subject": "Network Rack Backing", "category": "note", "attribute": "keynote_assertion", "value": "Coordinate with tenant for plywood backing for mounting network rack.", "unit": null, "location_key": {"sheet_number": "A24.01", "grid": null, "room": null, "room_name": "INVENTORY", "level": null, "tag": null, "detail_reference": null, "plan_zone": "C"}, "source_text": "COORDINATE WITH TENANT FOR PLYWOOD BACKING FOR MOUNTING NETWORK RACK", "coordination_targets": ["structural", "technology", "owner_standard"], "conflict_potential": "high", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "A24.01-EQ-2", "subject": "Data Cabling Conduits", "category": "note", "attribute": "keynote_assertion", "value": "Provide (3) 3\" conduits from directly above the network rack into the sales ceiling plenum area for data cabling - field coordinate.", "unit": null, "location_key": {"sheet_number": "A24.01", "grid": null, "room": null, "room_name": "INVENTORY", "level": null, "tag": null, "detail_reference": null, "plan_zone": "C"}, "source_text": "PROVIDE (3) 3\" CONDUITS FROM DIRECTLY ABOVE THE NETWORK RACK INTO THE SALES CEILING PLENUM AREA FOR DATA CABLING - FIELD COORDINATE.", "coordination_targets": ["electrical", "technology", "mechanical", "structural"], "conflict_potential": "high", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "A24.01-EQ-3", "subject": "Outlets", "category": "note", "attribute": "keynote_assertion", "value": "(2) 20A, outlets at 60\" A.F.F.", "unit": "in", "location_key": {"sheet_number": "A24.01", "grid": null, "room": null, "room_name": "INVENTORY", "level": null, "tag": null, "detail_reference": null, "plan_zone": "C"}, "source_text": "(2) 20A, OUTLETS AT 60\" A.F.F.", "coordination_targets": ["electrical"], "conflict_potential": "high", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "A24.01-EQ-4", "subject": "Ground Block", "category": "note", "attribute": "keynote_assertion", "value": "(1) 10 gauge ground block with ground wire connected to the panel ground (required for warranty).", "unit": null, "location_key": {"sheet_number": "A24.01", "grid": null, "room": null, "room_name": "INVENTORY", "level": null, "tag": null, "detail_reference": null, "plan_zone": "C"}, "source_text": "(1) 10 GAUGE GROUND BLOCK WITH GROUND WIRE CONNECTED TO THE PANEL GROUND (REQUIRED FOR WARRANTY)", "coordination_targets": ["electrical", "technology", "owner_standard"], "conflict_potential": "high", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "A24.01-EQ-5", "subject": "Rack System", "category": "equipment", "attribute": "equipment_elev", "value": "74\" TO BOTTOM", "unit": "in", "location_key": {"sheet_number": "A24.01", "grid": null, "room": null, "room_name": "INVENTORY", "level": null, "tag": "RACK SYSTEM", "detail_reference": null, "plan_zone": "C"}, "source_text": "RACK SYSTEM ABOVE SAFE @ -74\" TO BOTTOM", "coordination_targets": ["architectural", "technology", "ada"], "conflict_potential": "high", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "A24.01-EQ-6", "subject": "PANEL", "category": "equipment", "attribute": "equipment_location", "value": "PANEL", "unit": null, "location_key": {"sheet_number": "A24.01", "grid": "A", "room": null, "room_name": "LOUNGE", "level": null, "tag": "PANEL", "detail_reference": null, "plan_zone": null}, "source_text": "PANEL", "coordination_targets": ["electrical"], "conflict_potential": "high", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "A24.01-EQ-7", "subject": "Office Desk", "category": "equipment", "attribute": "equipment_size", "value": "60", "unit": "in", "location_key": {"sheet_number": "A24.01", "grid": "B", "room": null, "room_name": "MANAGER'S OFFICE", "level": null, "tag": "60\" OFFICE DESK"}}]} \ No newline at end of file diff --git a/backend/.llm_cache/af861c954aa740cb9122c2912dd930e9bb7df000a0d17a996ce9d1e071b09d72.json b/backend/.llm_cache/af861c954aa740cb9122c2912dd930e9bb7df000a0d17a996ce9d1e071b09d72.json new file mode 100644 index 0000000..2eb2328 --- /dev/null +++ b/backend/.llm_cache/af861c954aa740cb9122c2912dd930e9bb7df000a0d17a996ce9d1e071b09d72.json @@ -0,0 +1 @@ +{"issues": []} \ No newline at end of file diff --git a/backend/.llm_cache/aff6839a20a95faf0bcb649e9a1454a1e0ffb0a168982c8f347919d426c50fce.json b/backend/.llm_cache/aff6839a20a95faf0bcb649e9a1454a1e0ffb0a168982c8f347919d426c50fce.json new file mode 100644 index 0000000..870509d --- /dev/null +++ b/backend/.llm_cache/aff6839a20a95faf0bcb649e9a1454a1e0ffb0a168982c8f347919d426c50fce.json @@ -0,0 +1 @@ +{"issues": [{"issue_id": "CODE-VERSION-CONFLICT", "source_stage": "code", "category": "building_code", "severity": "critical", "confidence": "high", "location": "General notes on sheets G11.04 and G21.01", "disciplines": ["Architectural", "General"], "sheets": ["G11.04", "G21.01"], "description": "The drawing set references multiple, conflicting, and incorrect building and fire code editions (e.g., 2018 IBC, 2021 IBC/IFC), while the project's jurisdictional profile specifies the 2015 IBC and 2015 IFC as the adopted codes. Designing to outdated or future codes that are not legally adopted by the Authority Having Jurisdiction (AHJ) will likely lead to permit rejection and require significant redesign.", "evidence": [{"discipline": "General", "sheet": "G11.04", "source_text": "AREA LIMITATION: UNLIMITED (TABLES 504.3, 504.4, 506.2 IBC 2021)", "asserted_value": "Reference to 2021 IBC"}, {"discipline": "General", "sheet": "G21.01", "source_text": "2018 INTERNATIONAL BUILDING CODE (IBC) CH. 2-10 WITH HARRIS COUNTY AMENDMENTS", "asserted_value": "Reference to 2018 IBC"}, {"discipline": "General", "sheet": "G21.01", "source_text": "2021 INTERNATIONAL FIRE CODE (IFC) WITH HARRIS COUNTY AMENDMENTS", "asserted_value": "Reference to 2021 IFC"}], "recommended_resolution": "Confirm the correct, currently adopted code editions with the Harris County Engineering Department and Fire Marshal's Office. Update all code references on all sheets to be consistent and accurate for the jurisdiction. Ensure the design complies with the correct adopted codes.", "code_reference": null}, {"issue_id": "ADA-RESTROOM-DOOR-SWING", "source_stage": "code", "category": "ada", "severity": "high", "confidence": "high", "location": "Men's Restroom and Women's Restroom", "disciplines": ["Architectural"], "sheets": ["G21.01"], "description": "In both the Men's and Women's Restrooms, the entry door swings inward and obstructs the required clear floor space for the lavatory. This prevents an individual using a wheelchair from being able to use the sink after entering the room and closing the door.", "evidence": [{"discipline": "Architectural", "sheet": "G21.01", "source_text": "MEN'S RESTROOM", "asserted_value": "The floor plan shows the door swing path covering the required clear floor space at the lavatory."}, {"discipline": "Architectural", "sheet": "G21.01", "source_text": "WOMEN'S RESTROOM", "asserted_value": "The floor plan shows the door swing path covering the required clear floor space at the lavatory."}], "recommended_resolution": "Revise the restroom layout to ensure the door swing does not encroach on the required clear floor space for any fixture. Options include reversing the door to swing out (verifying it doesn't impede the corridor's accessible route), using a sliding or pocket door, or rearranging the fixture locations.", "code_reference": "ADA 603.2.3"}]} \ No newline at end of file diff --git a/backend/.llm_cache/b072a8667cf9ee125f2b5977017b2a7794f23d948952450e10dc4f1d87293f24.json b/backend/.llm_cache/b072a8667cf9ee125f2b5977017b2a7794f23d948952450e10dc4f1d87293f24.json new file mode 100644 index 0000000..ea60a1c --- /dev/null +++ b/backend/.llm_cache/b072a8667cf9ee125f2b5977017b2a7794f23d948952450e10dc4f1d87293f24.json @@ -0,0 +1 @@ +{"sheet_number": "E05.02", "discipline": "Electrical", "sheet_title": "DETAILS", "level": null, "scale": "NOT TO SCALE", "assertions": [{"subject": "Non-dedicated receptacles and switches", "attribute": "general_note", "value": "Circuiting to all non dedicated electrical receptacles and switches are required to utilize parallel circuiting by the use of 'pig tails' to each device so that if an outlet is removed or fails electrical continuity the circuit will not be compromised.", "source_text": "NOTES:\n1. CIRCUITING TO ALL NON DEDICATED ELECTRICAL RECEPTACLES AND SWITCHES ARE REQUIRED TO UTILIZE PARALLEL CIRCUITING BY THE USE OF \"PIG TAILS\" TO EACH DEVICE SO THAT IF AN OUTLET IS REMOVED OR FAILS ELECTRICAL CONTINUITY THE CIRCUIT WILL NOT BE COMPROMISED.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Electrical wiring splicing", "attribute": "general_note", "value": "All electrical wiring must be properly spliced by twisting the wires together and use of approved and listed compression wire nuts for any wiring.", "source_text": "2. ALL ELECTRICAL WIRING MUST BE PROPERLY SPLICED BY TWISTING THE WIRES TOGETHER AND USE OF APPROVED AND LISTED COMPRESSION WIRE NUTS FOR ANY WIRING.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Emergency fixture switching", "attribute": "general_note", "value": "Confirm switching requirement with the owner.", "source_text": "CONFIRM SWITCHING REQUIREMENT WITH THE OWNER", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Emergency lights circuiting", "attribute": "general_note", "value": "Emergency lights on this circuit will receive a hot leg which is not routed via the lighting controller so that the emergency ballast has a constant hot to detect power loss.", "source_text": "EMERGENCY LIGHTS ON THIS CIRCUIT WILL RECEIVE A HOT LEG WHICH IS NOT ROUTED VIA THE LIGHTING CONTROLLER SO THAT THE EMERGENCY BALLAST HAS A CONSTANT HOT TO DETECT POWER LOSS.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Transformer grounding", "attribute": "grounding_electrode", "value": "Grounding electrode conductor to ground to 3/4\" x 10' Cu rod or building steel.", "source_text": "GROUNDING ELECTRODE CONDUCTOR TO GROUND TO 3/4' x 10 Cu ROD OR BUILDING STEEL", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Floor mounted transformers", "attribute": "housekeeping_pad", "value": "6", "source_text": "PLACE FLOOR MOUNTED TRANSFORMERS ON NEOPRENE VIBRATION ISOLATION PAD ON 6\" HOUSEKEEPING PAD...", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Housekeeping pad", "attribute": "clearance_from_equipment", "value": "3\" larger than the transformer (6\" at the rear)", "source_text": "...6\" HOUSEKEEPING PAD 3\" LARGER THAN THE TRANSFORMER (6\" AT THE REAR)...", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Floor mounted transformers", "attribute": "vibration_isolation", "value": "Neoprene vibration isolation pad", "source_text": "PLACE FLOOR MOUNTED TRANSFORMERS ON NEOPRENE VIBRATION ISOLATION PAD...", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Transformers", "attribute": "NEC_working_clearance", "value": "Provide NEC working clearance in front of transformers.", "source_text": "PROVIDE NEC WORKING CLEARANCE IN FRONT OF TRANSFORMERS ASSUMING EXAMINATION WHILE ENERGIZED.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Suspended transformer support", "attribute": "fastener_size", "value": "Min 1/4", "source_text": "THREADED ROD SIZE AS REQUIRED. MIN 1/4\"(4 REQUIRED)", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Suspended transformer support", "attribute": "fastener_count", "value": "4", "source_text": "THREADED ROD SIZE AS REQUIRED. MIN 1/4\"(4 REQUIRED)", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Suspended transformer support", "attribute": "structural_connection", "value": "Secure to bottom cord of structure. Provide (2) 1-1/2\" x 1-1/2\" x 3/16\" angled cord to top cord within 6\" of point load. (Typ. for 4).", "source_text": "SECURE TO BOTTOM CORD OF STRUCTURE. PROVIDE (2)1-1/2\" x 1-1/2\" x 3/16\" ANGLED CORD TO TOP CORD WITHIN 6\" OF POINT LOAD. (TYP.FOR 4).", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Suspended transformer support", "attribute": "vibration_isolation", "value": "4 spring vibration isolators sized for weight of transformer.", "source_text": "[4] SPRING VIBRATION ISOLATORS SIZED FOR WEIGHT OF TRANSFORMER", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Suspended transformer support", "attribute": "equipment_model", "value": "Anvil trapeze assembly model #45/#46", "source_text": "PROVIDE ANVIL TRAPEZE ASSEMBLY MODEL #45/#46 AS REQUIRED BY MANUFACTURE.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Suspended transformer support", "attribute": "general_note", "value": "Verify support sizing and designed with project structural engineer prior to assembly.", "source_text": "VERIFY SUPPORT SIZING AND DESIGNED WITH PROJECT STRUCTURAL ENGINEER PRIOR TO ASSEMBLY.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}]} \ No newline at end of file diff --git a/backend/.llm_cache/b20559ec11c1c6472bb8457c267d3f6431d3318ebe2f8db17bf52caef1278d4f.json b/backend/.llm_cache/b20559ec11c1c6472bb8457c267d3f6431d3318ebe2f8db17bf52caef1278d4f.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/b20559ec11c1c6472bb8457c267d3f6431d3318ebe2f8db17bf52caef1278d4f.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/b2b21e64c0963afcc575b6f0b7121f321e22b81870db90b6f7953191542d5ae5.json b/backend/.llm_cache/b2b21e64c0963afcc575b6f0b7121f321e22b81870db90b6f7953191542d5ae5.json new file mode 100644 index 0000000..21ae225 --- /dev/null +++ b/backend/.llm_cache/b2b21e64c0963afcc575b6f0b7121f321e22b81870db90b6f7953191542d5ae5.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "EHW1_voltage_mismatch", "category": "schedule_vs_plan_mismatch", "severity": "high", "confidence": "high", "location": "Electric Water Heater EWH-1 and Electrical Panel 'E'", "disciplines": ["Plumbing", "Electrical"], "sheets": ["P01.01", "E01.02"], "description": "The Electric Water Heater Schedule on P01.01 specifies a 480V, 3-phase unit for EWH-1. The Electrical drawings on E01.02 show the 'WATER HEATING' load connected to Panel 'E', which is a 208Y/120V panel. The specified equipment is incompatible with the provided power source, which will lead to procurement and installation failure.", "evidence": [{"discipline": "Plumbing", "sheet": "P01.01", "source_text": "EWH-1 | VOLTS 480 | PHASE 3", "asserted_value": "480V, 3-Phase"}, {"discipline": "Electrical", "sheet": "E01.02", "source_text": "PANEL NAME: E | MAINS 100.0 | VOLTS 208Y/120 | PHASE 3 WIRE 4W ... DESCRIPTION: WATER HEATING", "asserted_value": "208Y/120V"}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/b3bc1fd546ce206e1d1bea37812247437bf78f3d7f8aa034f7321ccdda30e8a6.json b/backend/.llm_cache/b3bc1fd546ce206e1d1bea37812247437bf78f3d7f8aa034f7321ccdda30e8a6.json new file mode 100644 index 0000000..b5f80db --- /dev/null +++ b/backend/.llm_cache/b3bc1fd546ce206e1d1bea37812247437bf78f3d7f8aa034f7321ccdda30e8a6.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "curb_height_discrepancy", "category": "note_or_spec_contradiction", "severity": "low", "confidence": "high", "location": "Roof / RTU Curb", "disciplines": ["Architectural", "Mechanical"], "sheets": ["A25.01", "M01.01"], "description": "The architectural roof curb detail specifies a minimum height of 12 inches, while the mechanical rooftop unit schedule note requires a specific height of 14 inches for the RTU curb. While the architectural detail notes 'UNLESS NOTED OTHERWISE', presenting two different values for the same component can cause confusion for bidders and installers. The values should be coordinated for clarity.", "evidence": [{"discipline": "Architectural", "sheet": "A25.01", "source_text": "ROOF CURB DETAIL - MINIMUM 1'-0\" [12\"] ROOF CURB HGT, UNLESS NOTED OTHERWISE", "asserted_value": "12 inches minimum"}, {"discipline": "Mechanical", "sheet": "M01.01", "source_text": "ROOFTOP UNIT SCHEDULE - REMARKS: 9. PROVIDE 14\" HIGH INSULATED ROOF CURB.", "asserted_value": "14 inches"}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/b3c5a73e6fdade7bd8ede1ab78d3d0b317e18810bbc2fda05b21f92afbe2bfe1.json b/backend/.llm_cache/b3c5a73e6fdade7bd8ede1ab78d3d0b317e18810bbc2fda05b21f92afbe2bfe1.json new file mode 100644 index 0000000..90fa9af --- /dev/null +++ b/backend/.llm_cache/b3c5a73e6fdade7bd8ede1ab78d3d0b317e18810bbc2fda05b21f92afbe2bfe1.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "code_ibc_version_discrepancy", "category": "note_or_spec_contradiction", "severity": "high", "confidence": "high", "location": "General Code Requirements", "disciplines": ["General", "Architectural", "Electrical"], "sheets": ["G21.01", "A23.01", "E01.01"], "description": "The drawing set lists conflicting versions of the International Building Code (IBC). The Code/Exiting Plan on G21.01 specifies the 2018 IBC, while the Architectural Finish Plan (A23.01) and Electrical Notes (E01.01) both reference the 2021 IBC. The entire project must be designed to a single, consistent code edition for permitting and construction.", "evidence": [{"discipline": "General", "sheet": "G21.01", "source_text": "2018 INTERNATIONAL BUILDING CODE (IBC) CH. 2-10 WITH HARRIS COUNTY AMENDMENTS", "asserted_value": "2018 IBC"}, {"discipline": "Architectural", "sheet": "A23.01", "source_text": "INTERIOR FINISHES TO COMPLY WITH IBC CLASS C OR HIGHER SECTION 803.9 AND TABLE 803.9 OF 2021 IBC.", "asserted_value": "2021 IBC"}, {"discipline": "Electrical", "sheet": "E01.01", "source_text": "CONTRACTOR SHALL CONFORM TO ALL LOCAL, STATE, AND APPLICABLE CODES, 2023 NEC, 2021 IBC...", "asserted_value": "2021 IBC"}], "recommended_resolution": "verify with architect"}, {"conflict_id": "code_nec_version_discrepancy", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "General Code Requirements", "disciplines": ["General", "Electrical"], "sheets": ["G21.01", "E01.01"], "description": "There is an inconsistency in the referenced version of the National Electrical Code (NEC). The Code/Exiting plan on G21.01 has a confusing note citing '2023 STATE OF TEXAS ADOPTED 2014 NFPA 70...', while the Electrical Notes on E01.01 clearly state '2023 NEC'. The correct and consistent code version needs to be established across the drawing set.", "evidence": [{"discipline": "General", "sheet": "G21.01", "source_text": "2023 STATE OF TEXAS ADOPTED 2014 NFPA 70 NATIONAL ELECTRICAL CODE (NEC)", "asserted_value": "2014 NEC (as adopted in 2023)"}, {"discipline": "Electrical", "sheet": "E01.01", "source_text": "CONTRACTOR SHALL CONFORM TO ALL LOCAL, STATE, AND APPLICABLE CODES, 2023 NEC...", "asserted_value": "2023 NEC"}], "recommended_resolution": "verify with engineer"}, {"conflict_id": "material_standard_typo", "category": "tag_or_reference_inconsistency", "severity": "low", "confidence": "high", "location": "Interior Finish Requirements", "disciplines": ["Architectural", "Electrical"], "sheets": ["A23.01", "E01.01"], "description": "Architectural and Electrical sheets reference different ASTM standards for the same purpose of material fire rating. The Architectural Finish Plan incorrectly cites 'ASTM 834' for finish classification, while the Electrical sheet correctly references 'ASTM E-84' for flame and smoke ratings. ASTM E-84 is the correct standard; 'ASTM 834' appears to be a typo that must be corrected.", "evidence": [{"discipline": "Architectural", "sheet": "A23.01", "source_text": "ALL MATERIALS USED FOR INTERIOR FINISH AND TRIM SHALL BE CLASSIFIED IN ACCORDANCE WITH ASTM 834.", "asserted_value": "ASTM 834"}, {"discipline": "Electrical", "sheet": "E01.01", "source_text": "ALL PRODUCTS SHALL COMPLY WITH 25/50 FLAME AND SMOKE HAZARD RATINGS PER ASTM E-84, NFPA 255 AND UL 723", "asserted_value": "ASTM E-84"}], "recommended_resolution": "verify with architect"}]} \ No newline at end of file diff --git a/backend/.llm_cache/b439dfb74ed4df4e554c07532a2276c344c81f0734997df8b599db5dc719c9e0.json b/backend/.llm_cache/b439dfb74ed4df4e554c07532a2276c344c81f0734997df8b599db5dc719c9e0.json new file mode 100644 index 0000000..4993477 --- /dev/null +++ b/backend/.llm_cache/b439dfb74ed4df4e554c07532a2276c344c81f0734997df8b599db5dc719c9e0.json @@ -0,0 +1 @@ +{"sheet_number": "A24.01", "discipline": "Architectural", "sheet_title": "FURNITURE/ POWER/ DATA FLOOR PLAN", "level": null, "scale": "1/4\" = 1'-0\"", "assertions": [{"subject": "General Note", "attribute": "general_note", "value": "Refer to project general notes on sheet G11.01", "source_text": "A. REFER TO PROJECT GENERAL NOTES ON SHEET G11.01.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "A"}}, {"subject": "General Note", "attribute": "general_note", "value": "Installation of all Cellular Sales / Verizon display fixtures shall be performed by a qualified Cellular Sales / Verizon vendor.", "source_text": "B. INSTALLATION OF ALL CELLULAR SALES / VERIZON DISPLAY FIXTURES SHALL BE PERFORMED BY A QUALIFIED CELLULAR SALES / VERIZON VENDOR.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "B"}}, {"subject": "General Note", "attribute": "general_note", "value": "Contractor's electrician must be available during installation to install electrical connections as needed.", "source_text": "D. CONTRACTOR'S ELECTRICIAN MUST BE AVAILABLE DURING INSTALLATION TO INSTALL ELECTRICAL CONNECTIONS AS NEEDED.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "D"}}, {"subject": "General Note", "attribute": "general_note", "value": "Position wall mount power transition boxes on back side of wall for accessibility, especially if transition boxes are behind wall fixtures.", "source_text": "F. WHERE POSSIBLE, POSITION WALL MOUNT POWER TRANSITION BOXES ON BACK SIDE OF WALL FOR ACCESSIBILITY, ESPECIALLY IF TRANSITION BOXES ARE BEHIND WALL FIXTURES", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "F"}}, {"subject": "General Note", "attribute": "detail_callout", "value": "Refer to detail 3/A92.01 for foundation pour back detail where existing slab is cut.", "source_text": "G. REFER TO DETAIL 3/A92.01 FOR FOUNDATION POUR BACK DETAIL WHERE EXISTING SLAB IS CUT.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "G"}}, {"subject": "Network Rack Plywood Backing", "attribute": "general_note", "value": "Coordinate with tenant for plywood backing for mounting network rack", "source_text": "COORDINATE WITH TENANT FOR PLYWOOD BACKING FOR MOUNTING NETWORK RACK", "confidence": "high", "location_key": {"grid": null, "room": "INVENTORY", "level": null, "tag": null}}, {"subject": "Network Rack Conduits", "attribute": "penetration", "value": "Provide (3) 3\" conduits from network rack to sales ceiling plenum", "source_text": "PROVIDE (3) 3\" CONDUITS FROM DIRECTLY ABOVE THE NETWORK RACK INTO THE SALES CEILING PLENUM AREA FOR DATA CABLING - FIELD COORDINATE.", "confidence": "high", "location_key": {"grid": null, "room": "INVENTORY", "level": null, "tag": null}}, {"subject": "Network Rack Outlets", "attribute": "outlet_power", "value": "(2) 20A, OUTLETS AT 60\" A.F.F.", "source_text": "(2) 20A, OUTLETS AT 60\" A.F.F.", "confidence": "high", "location_key": {"grid": null, "room": "INVENTORY", "level": null, "tag": null}}, {"subject": "Network Rack Grounding", "attribute": "grounding", "value": "(1) 10 GAUGE GROUND BLOCK WITH GROUND WIRE CONNECTED TO THE PANEL GROUND (REQUIRED FOR WARRANTY)", "source_text": "(1) 10 GAUGE GROUND BLOCK WITH GROUND WIRE CONNECTED TO THE PANEL GROUND (REQUIRED FOR WARRANTY)", "confidence": "high", "location_key": {"grid": null, "room": "INVENTORY", "level": null, "tag": null}}, {"subject": "Equipment", "attribute": "equipment_location", "value": "RACK SYSTEM", "source_text": "RACK SYSTEM ABOVE SAFE @ ~74\" TO BOTTOM", "confidence": "high", "location_key": {"grid": null, "room": "INVENTORY", "level": null, "tag": null}}, {"subject": "Equipment", "attribute": "equipment_elev", "value": "~74", "source_text": "RACK SYSTEM ABOVE SAFE @ ~74\" TO BOTTOM", "confidence": "high", "location_key": {"grid": null, "room": "INVENTORY", "level": null, "tag": "RACK SYSTEM"}}, {"subject": "Room Name", "attribute": "room_name", "value": "EXISTING FIRE RISER ROOM", "source_text": "EXISTING FIRE RISER ROOM", "confidence": "high", "location_key": {"grid": null, "room": "EXISTING FIRE RISER ROOM", "level": null, "tag": null}}, {"subject": "Room Name", "attribute": "room_name", "value": "CORRIDOR", "source_text": "CORRIDOR", "confidence": "high", "location_key": {"grid": "A", "room": "CORRIDOR", "level": null, "tag": null}}, {"subject": "Room Name", "attribute": "room_name", "value": "INVENTORY", "source_text": "INVENTORY", "confidence": "high", "location_key": {"grid": null, "room": "INVENTORY", "level": null, "tag": null}}, {"subject": "Room Name", "attribute": "room_name", "value": "MEN'S RESTROOM", "source_text": "MEN'S RESTROOM", "confidence": "high", "location_key": {"grid": null, "room": "MEN'S RESTROOM", "level": null, "tag": null}}, {"subject": "Room Name", "attribute": "room_name", "value": "WOMEN'S RESTROOM", "source_text": "WOMEN'S RESTROOM", "confidence": "high", "location_key": {"grid": null, "room": "WOMEN'S RESTROOM", "level": null, "tag": null}}, {"subject": "Room Name", "attribute": "room_name", "value": "MANAGER'S OFFICE", "source_text": "MANAGER'S OFFICE", "confidence": "high", "location_key": {"grid": null, "room": "MANAGER'S OFFICE", "level": null, "tag": null}}, {"subject": "Room Name", "attribute": "room_name", "value": "CLEANING SUPPLIES/STORAGE", "source_text": "CLEANING SUPPLIES/STORAGE", "confidence": "high", "location_key": {"grid": null, "room": "CLEANING SUPPLIES/STORAGE", "level": null, "tag": null}}, {"subject": "Room Name", "attribute": "room_name", "value": "SALES AREA", "source_text": "SALES AREA", "confidence": "high", "location_key": {"grid": null, "room": "SALES AREA", "level": null, "tag": null}}, {"subject": "Dimension", "attribute": "room_dimension", "value": "14'-2 1/8\"", "source_text": "14'-2 1/8\"", "confidence": "high", "location_key": {"grid": null, "room": "INVENTORY", "level": null, "tag": null}}]} \ No newline at end of file diff --git a/backend/.llm_cache/b69facce908657a2334828498e7dee287691d89c064407113ba4731329cd0f97.json b/backend/.llm_cache/b69facce908657a2334828498e7dee287691d89c064407113ba4731329cd0f97.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/b69facce908657a2334828498e7dee287691d89c064407113ba4731329cd0f97.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/b789ff27145f2a5bbec8e83f7f70d0225bbd9957fdc1165b35c02279ddf2ebde.json b/backend/.llm_cache/b789ff27145f2a5bbec8e83f7f70d0225bbd9957fdc1165b35c02279ddf2ebde.json new file mode 100644 index 0000000..11e81a7 --- /dev/null +++ b/backend/.llm_cache/b789ff27145f2a5bbec8e83f7f70d0225bbd9957fdc1165b35c02279ddf2ebde.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "ibc_version_discrepancy", "category": "note_or_spec_contradiction", "severity": "high", "confidence": "high", "location": "Project-wide Codes & Standards", "disciplines": ["General", "Architectural", "Electrical"], "sheets": ["G21.01", "A23.01", "E01.01"], "description": "The drawing set lists conflicting editions of the International Building Code (IBC). The Code / Exiting Plan sheet G21.01 lists the 2018 IBC as the governing code. However, the Architectural Finish Plan A23.01 references the 2021 IBC for finish compliance, and the Electrical Notes sheet E01.01 also references the 2021 IBC. The entire basis of design and permitting relies on a single, correct code edition. This must be resolved before issuance.", "evidence": [{"discipline": "General", "sheet": "G21.01", "source_text": "2018 INTERNATIONAL BUILDING CODE (IBC) CH. 2-10 WITH HARRIS COUNTY AMENDMENTS", "asserted_value": "2018 IBC"}, {"discipline": "Architectural", "sheet": "A23.01", "source_text": "INTERIOR FINISHES TO COMPLY WITH IBC CLASS C OR HIGHER SECTION 803.9 AND TABLE 803.9 OF 2021 IBC.", "asserted_value": "2021 IBC"}, {"discipline": "Electrical", "sheet": "E01.01", "source_text": "CONTRACTOR SHALL CONFORM TO ALL LOCAL, STATE, AND APPLICABLE CODES, 2023 NEC, 2021 IBC, 2021 IECC, NFPA, ETC.", "asserted_value": "2021 IBC"}], "recommended_resolution": "verify with architect"}, {"conflict_id": "nec_version_discrepancy", "category": "note_or_spec_contradiction", "severity": "high", "confidence": "high", "location": "Project-wide Codes & Standards", "disciplines": ["General", "Electrical"], "sheets": ["G21.01", "E01.01"], "description": "There is a conflicting and confusing reference to the applicable National Electrical Code (NEC). The general Code/Exiting Plan sheet G21.01 states '2023 STATE OF TEXAS ADOPTED 2014 NFPA 70 NATIONAL ELECTRICAL CODE (NEC)', while the electrical notes on sheet E01.01 simply state '2023 NEC'. This creates ambiguity as to whether the 2014 or 2023 edition of the NEC should be followed. This must be clarified and made consistent.", "evidence": [{"discipline": "General", "sheet": "G21.01", "source_text": "2023 STATE OF TEXAS ADOPTED 2014 NFPA 70 NATIONAL ELECTRICAL CODE (NEC)", "asserted_value": "2014 NEC (part of a 2023 Texas adoption)"}, {"discipline": "Electrical", "sheet": "E01.01", "source_text": "CONTRACTOR SHALL CONFORM TO ALL LOCAL, STATE, AND APPLICABLE CODES, 2023 NEC, 2021 IBC, 2021 IECC, NFPA, ETC.", "asserted_value": "2023 NEC"}], "recommended_resolution": "verify with engineer"}]} \ No newline at end of file diff --git a/backend/.llm_cache/b86714b2e29cc7d5d8ff4f1ab49970ac4e600d300da5732e5ba18613813d659c.json b/backend/.llm_cache/b86714b2e29cc7d5d8ff4f1ab49970ac4e600d300da5732e5ba18613813d659c.json new file mode 100644 index 0000000..49c35f4 --- /dev/null +++ b/backend/.llm_cache/b86714b2e29cc7d5d8ff4f1ab49970ac4e600d300da5732e5ba18613813d659c.json @@ -0,0 +1 @@ +[{"assertion_id": "E05.01#14", "original_value": "12", "normalized_value": "12", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": "Extracted from source text '12\"'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#15", "original_value": "Must be supported by wire hanger at each corner, independent of ceiling support system", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "E05.01#16", "original_value": "24", "normalized_value": "24", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": "Extracted from source text '24\"'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.02#0", "original_value": "Circuiting to all non dedicated electrical receptacles and switches are required to utilize parallel circuiting by the use of 'pig tails' to each device so that if an outlet is removed or fails electrical continuity the circuit will not be compromised.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "E05.02#1", "original_value": "All electrical wiring must be properly spliced by twisting the wires together and use of approved and listed compression wire nuts for any wiring.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "E05.02#2", "original_value": "Confirm switching requirement with the owner.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "E05.02#3", "original_value": "Emergency lights on this circuit will receive a hot leg which is not routed via the lighting controller so that the emergency ballast has a constant hot to detect power loss.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "E05.02#4", "original_value": "Grounding electrode conductor to ground to 3/4\" x 10' Cu rod or building steel.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Complex value with multiple dimensions. Source text has a likely typo '3/4'' which is '3/4\"' in the value.", "source_text_preserved": true, "normalization_confidence": "low"}, {"assertion_id": "E05.02#5", "original_value": "6", "normalized_value": "6", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": "Extracted from source text '6\"'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.02#6", "original_value": "3\" larger than the transformer (6\" at the rear)", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is conditional and contains multiple dimensions.", "source_text_preserved": true, "normalization_confidence": "low"}, {"assertion_id": "E05.02#7", "original_value": "Neoprene vibration isolation pad", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "E05.02#8", "original_value": "Provide NEC working clearance in front of transformers.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "E05.02#9", "original_value": "Min 1/4", "normalized_value": "0.25", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": "Value is a minimum. Normalized from '1/4\"' in source.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.02#10", "original_value": "4", "normalized_value": "4", "normalized_unit": "count", "normalized_attribute": null, "normalization_notes": "Value represents a quantity.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.02#11", "original_value": "Secure to bottom cord of structure. Provide (2) 1-1/2\" x 1-1/2\" x 3/16\" angled cord to top cord within 6\" of point load. (Typ. for 4).", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Complex value with multiple dimensions and counts.", "source_text_preserved": true, "normalization_confidence": "low"}, {"assertion_id": "E05.02#12", "original_value": "4 spring vibration isolators sized for weight of transformer.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive requirement, not just a quantity.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "E05.02#13", "original_value": "Anvil trapeze assembly model #45/#46", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "E05.02#14", "original_value": "Verify support sizing and designed with project structural engineer prior to assembly.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "P01.01#0", "original_value": "Seal all penetrations through rated walls, floors and ceilings with a UL listed assembly to provide a rating equal to or greater than the rating of the wall, floor or ceiling.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "P01.01#1", "original_value": "Insulate all exposed drain piping and water supply piping beneath A.D.A. compliant lavatories & sinks with fully molded closed cell vinyl insulation kit as manufactured by Truebro, Brocar or McGuire.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "P01.01#2", "original_value": "Provide UL fire rated assemblies where pipes penetrate above grade floors. Provide UL fire rated assemblies were pipes penetrate fire rated walls.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "P01.01#3", "original_value": "Sanitary Waste and Vent (Below Slab Only): Schedule 40 PVC", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "P01.01#4", "original_value": "Sanitary Waste and Vent (Above Slab Only): Cast iron pipe and fittings, ASTM A 888 or CISPI 301.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "P01.01#5", "original_value": "Domestic Water: Type 'L' copper tubing with wrought copper fittings and 95/5 (tin/antimony) solder joints.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "P01.01#6", "original_value": "480", "normalized_value": "480", "normalized_unit": "Volts", "normalized_attribute": null, "normalization_notes": "Unit from source text 'VOLTS'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#7", "original_value": "3", "normalized_value": "3", "normalized_unit": "Phase", "normalized_attribute": null, "normalization_notes": "Unit from source text 'PHASE'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#8", "original_value": "5", "normalized_value": "5", "normalized_unit": "kW", "normalized_attribute": null, "normalization_notes": "Unit from source text 'KW'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#9", "original_value": "30", "normalized_value": "30", "normalized_unit": "Gallons", "normalized_attribute": null, "normalization_notes": "Unit from source text 'GALLONS'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#10", "original_value": "Floor Mounted", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "P01.01#11", "original_value": "ADA 17\"H elongated bowl", "normalized_value": "17", "normalized_unit": "inches", "normalized_attribute": "bowl_height", "normalization_notes": "Extracted from '17\"H'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#12", "original_value": "Flush handle to be on the wide side of the stall.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "P01.01#13", "original_value": "Wall Mounted", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "P01.01#14", "original_value": "LF-170 LEONARD THERMOSTATIC MIXING VALVE WITH THE OUTLET TEMPERATURE TO BE SET AT 110F.", "normalized_value": "110", "normalized_unit": "degrees Fahrenheit", "normalized_attribute": "outlet_temperature", "normalization_notes": "Extracted from '110F'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#15", "original_value": "LAVATORY (WALL MOUNTED) (A.D.A.)", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "P01.01#16", "original_value": "Floor Mounted", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "P01.01#17", "original_value": "Wall Mount Faucet", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "P01.01#18", "original_value": "Self-rimming", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "P01.01#19", "original_value": "SINGLE BOWL SINK (A.D.A)", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "P01.01#20", "original_value": "Install automatic pressure drop activated trap primer by PPP products PR-500.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "P02.01#0", "original_value": "INVENTORY", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "P02.01#1", "original_value": "LOUNGE", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "P02.01#2", "original_value": "MEN'S RESTROOM", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "P02.01#3", "original_value": "WOMEN'S ROOM", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "P02.01#4", "original_value": "MANAGER'S OFFICE", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "P02.01#5", "original_value": "CLEANING SUPPLIES/STORAGE", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "P02.01#6", "original_value": "SALES AREA", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "P02.01#7", "original_value": "EDF-1 is located in WOMEN'S ROOM.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "P02.01#8", "original_value": "WC-1 is located in WOMEN'S ROOM.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "P02.01#9", "original_value": "FD-1 is located in WOMEN'S ROOM.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Source text '3\"FD-1' indicates a pipe size not present in the original value.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "P02.01#10", "original_value": "WC-1 is located in MEN'S RESTROOM.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "P02.01#11", "original_value": "L-1 is located in MEN'S RESTROOM.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "P02.01#12", "original_value": "SK-1 is located in LOUNGE.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "P02.01#13", "original_value": "MS-1 is located in CLEANING SUPPLIES/STORAGE.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "P02.01#14", "original_value": "FD-1 is located in CLEANING SUPPLIES/STORAGE.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Source text '3\"FD-1' indicates a pipe size not present in the original value.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "P02.01#15", "original_value": "FS-1 is located in CLEANING SUPPLIES/STORAGE.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Source text '3\"FS-1' indicates a pipe size not present in the original value.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "P02.01#16", "original_value": "2", "normalized_value": "2", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": "Unit from source text '2\"'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#17", "original_value": "2", "normalized_value": "2", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": "Unit from source text '2\"'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#18", "original_value": "2", "normalized_value": "2", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": "Unit from source text '2\"'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.02#0", "original_value": "INVENTORY", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "P02.02#1", "original_value": "LOUNGE", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": null}] \ No newline at end of file diff --git a/backend/.llm_cache/b99f73a054dfafa4912b15b06ad326a44a5c244fa1728222c0f5bd68e441ef70.json b/backend/.llm_cache/b99f73a054dfafa4912b15b06ad326a44a5c244fa1728222c0f5bd68e441ef70.json new file mode 100644 index 0000000..1c1d454 --- /dev/null +++ b/backend/.llm_cache/b99f73a054dfafa4912b15b06ad326a44a5c244fa1728222c0f5bd68e441ef70.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "bldg_c_scope_description_remodel_vs_first_gen_buildout_conflict", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "Project Scope Description, Building C", "disciplines": ["General", "General"], "sheets": ["G11.04", "G21.01"], "description": "The project scope is described inconsistently across two different sheets. Sheet G11.04 states the project is a 'build out for a first generation retail space,' which implies working in a new, empty shell building. However, sheet G21.01 describes the project as a 'tenant interior remodel,' which implies demolition and alteration of a previously finished space. This must be clarified as it significantly impacts the scope of work, demolition requirements, and bidding.", "evidence": [{"discipline": "General", "sheet": "G11.04", "source_text": "PROJECT IS A TENANT INTERIOR LEASE SPACE BUILD OUT FOR A FIRST GENERATION RETAIL SPACE. THE SCOPE OF WORK CONSISTS OF NEW CEILINGS, FLOORING, FINISHES, NONSTRUCTURAL WALLS, ELECTRICAL, MECHANICAL AND PLUMBING", "asserted_value": "FIRST GENERATION RETAIL SPACE"}, {"discipline": "General", "sheet": "G21.01", "source_text": "PROJECT IS A TENANT INTERIOR REMODEL OF 3,323 SF", "asserted_value": "TENANT INTERIOR REMODEL"}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/ba8863b173e9e76d4738a2ff423ace910eec76f0ac3550a8c1436bfa42c7e57c.json b/backend/.llm_cache/ba8863b173e9e76d4738a2ff423ace910eec76f0ac3550a8c1436bfa42c7e57c.json new file mode 100644 index 0000000..2eb2328 --- /dev/null +++ b/backend/.llm_cache/ba8863b173e9e76d4738a2ff423ace910eec76f0ac3550a8c1436bfa42c7e57c.json @@ -0,0 +1 @@ +{"issues": []} \ No newline at end of file diff --git a/backend/.llm_cache/bc31b0a3334a6b356059ff117d2642dec69690374cb45591cda6a8ff3d4ea050.json b/backend/.llm_cache/bc31b0a3334a6b356059ff117d2642dec69690374cb45591cda6a8ff3d4ea050.json new file mode 100644 index 0000000..e7accbe --- /dev/null +++ b/backend/.llm_cache/bc31b0a3334a6b356059ff117d2642dec69690374cb45591cda6a8ff3d4ea050.json @@ -0,0 +1 @@ +[{"assertion_id": "G11.01#0", "attribute": "project_name", "value": "VERIZON ELYSON", "source_text": "VERIZON ELYSON", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.01#1", "attribute": "project_address", "value": "7022 ELYSON EXCHANGE WAY CYPRESS, TX 77433", "source_text": "7022 ELYSON EXCHANGE WAY CYPRESS, TX 77433", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.01#2", "attribute": "building_name", "value": "ELYSON TOWN CENTER - BUILDING C", "source_text": "ELYSON TOWN CENTER - BUILDING C", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.01#3", "attribute": "general_note", "value": "All work of the general contractor and his subcontractors shall conform to the provisions of the federal, state, city, and county building laws, codes, ordinances, rules and regulations enforced by the authority having jurisdiction (AHJ).", "source_text": "1. ALL WORK OF THE GENERAL CONTRACTOR AND HIS SUBCONTRACTORS (HEREIN REFERRED COLLECTIVELY AS THE CONTRACTOR) SHALL CONFORM TO THE PROVISIONS OF THE FEDERAL, STATE, CITY, AND COUNTY BUILDING LAWS, CODES, ORDINANCES, RULES AND REGULATIONS ENFORCED BY THE AUTHORITY HAVING JURISDICTION (AHJ).", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.01#4", "attribute": "general_note", "value": "Contractor shall warrant all workmanship and materials for a period of 1 year from the date of final completion.", "source_text": "10. UPON OWNER'S REQUEST, THE CONTRACTOR SHALL ISSUE A DUPLICATE OF BLUE-LINE DRAWING UPON COMPLETION... CONTRACTOR SHALL WARRANT ALL WORKMANSHIP AND MATERIALS... FOR A PERIOD OF 1 YEAR FROM THE DATE OF FINAL COMPLETION.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "warranty_period", "normalization_notes": "Value is a full sentence, only normalizing attribute for searchability.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G11.01#5", "attribute": "general_note", "value": "Through-penetrations in fire-resistive walls shall conform to the Authority Having Jurisdiction's current adopted versions of the IBC and local amendments as well as directives by the Local Fire Marshal's Authority.", "source_text": "12. THROUGH-PENETRATIONS IN FIRE-RESISTIVE WALLS SHALL CONFORM TO THE AUTHORITY HAVING JURISDICTION'S CURRENT ADOPTED VERSIONS OF THE IBC AND LOCAL AMENDMENTS AS WELL AS DIRECTIVES BY THE LOCAL FIRE MARSHAL'S AUTHORITY.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.01#6", "attribute": "general_note", "value": "Owner-provided extinguishers shall travel distance not to exceed 75' in accordance w/ NFPA standard 10.", "source_text": "13. PROVIDED THAT EXTINGUISHERS SHALL TRAVEL DISTANCE NOT TO EXCEED 75' IN ACCORDANCE W/ NFPA STANDARD 10 AND AS DIRECTED BY THE FIRE MARSHAL.", "normalized_value": "75", "normalized_unit": "feet", "normalized_attribute": "max_extinguisher_travel_distance", "normalization_notes": "Extracted numerical value and unit from sentence.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G11.01#7", "attribute": "general_note", "value": "The priority for project dimensions shall be in the following order: A. Mini dimension for accessibility clearance & building code requirement. B. Large scale details. C. Small scale details. D. Enlarged views, floor plans and elevations.", "source_text": "23. ALIGNMENT OF PARTITIONS AND FINISHES AS SCHEDULED SHALL BE STRAIGHT, TRUE, & PLUMB. THE PRIORITY FOR PROJECT DIMENSIONS SHALL BE IN THE FOLLOWING ORDER: A. MINI DIMENSION FOR ACCESSIBILITY CLEARANCE & BUILDING CODE REQUIREMENT. B. LARGE SCALE DETAILS. C. SMALL SCALE DETAILS. D. ENLARGED VIEWS, FLOOR PLANS AND ELEVATIONS.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.01#8", "attribute": "general_note", "value": "Ceiling heights are indicated from the floor elevation to the face of the suspended ceiling system or face of finish material as scheduled.", "source_text": "24. CEILING HEIGHTS ARE INDICATED FROM THE FLOOR ELEVATION TO THE FACE OF THE SUSPENDED CEILING SYSTEM OR FACE OF FINISH MATERIAL AS SCHEDULED.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.01#9", "attribute": "general_note", "value": "Dimensions shown on drawings shall be to the centerline of the structural grid and structural steel members.", "source_text": "25. A. THE CENTERLINE OF THE STRUCTURAL GRID AND STRUCTURAL STEEL MEMBERS.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.01#10", "attribute": "general_note", "value": "Dimensions shown on drawings shall be to the face of cast in place precast concrete walls.", "source_text": "25. B. THE FACE OF CAST IN PLACE PRECAST CONCRETE WALLS.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.01#11", "attribute": "general_note", "value": "Dimensions shown on drawings shall be to the nominal face of masonry walls.", "source_text": "25. C. THE NOMINAL FACE OF MASONRY WALLS.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.01#12", "attribute": "general_note", "value": "Dimensions shown on drawings shall be to the face of sheathing of partition type as scheduled, unless otherwise noted.", "source_text": "25. D. THE FACE OF SHEATHING OF PARTITION TYPE AS SCHEDULED, UNLESS OTHERWISE NOTED.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.01#13", "attribute": "general_note", "value": "Dimensions shown on drawings shall be to the face of finish material for any dimensions noted as 'clear'.", "source_text": "25. E. THE FACE OF FINISH MATERIAL FOR ANY DIMENSIONS NOTED AS \"CLEAR\".", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.01#14", "attribute": "general_note", "value": "All roof penetration flashing details shall be shown on roof plan.", "source_text": "33. ...ALL ROOF PENETRATION FLASHING DETAILS... SHALL BE SHOWN ON ROOF PLAN AND RESPECTIVE FLASHING DETAILS SHALL BE DEVELOPED.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.02#0", "attribute": "max_level_change", "value": "1/4", "source_text": "1/4\" MAX", "normalized_value": "0.25", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": "Unit assumed from source text '1/4\"'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.02#1", "attribute": "max_bevel_slope", "value": "1:2", "source_text": "1/2\" MAX", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Ambiguous: original value '1:2' (a slope) contradicts source text '1/2\" MAX' (a dimension).", "source_text_preserved": true, "normalization_confidence": "low"}, {"assertion_id": "G11.02#2", "attribute": "min_knee_clearance_width", "value": "36", "source_text": "36\" MIN", "normalized_value": "36", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": "Unit assumed from source text '36\"'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#0", "attribute": "quiet_hours", "value": "9PM-7AM", "source_text": "Quiet hours for the premises are from 9PM-7AM", "normalized_value": "21:00-07:00", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Converted to 24-hour format.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#1", "attribute": "service_capacity", "value": "600 Amp 277/480Volt", "source_text": "Shared service to the building is to be 600 Amp 277/480Volt.", "normalized_value": "600 A 277/480 V", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Normalized units 'Amp' to 'A' and 'Volt' to 'V'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#2", "attribute": "pipe_size", "value": "1 1/2\" valved or 2\" PVC/PEX", "source_text": "Landlord to provide a single 1 1/2\" valved or 2\" PVC/PEX water service to Building shell.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value contains options and cannot be simply normalized.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#3", "attribute": "stub_location", "value": "within the building shell ceiling", "source_text": "Line is stubbed within the building shell ceiling.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#4", "attribute": "pipe_size", "value": "6\" grease and 6\" sanitary", "source_text": "Landlord shall provide a minimum 4' concrete leave out with shared 6\" grease and 6\" sanitary sewer trunk line", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Compound value describing two separate items.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#5", "attribute": "burial_depth", "value": "2' or more", "source_text": "sewer trunk line buried 2' or more, stubbed to the Premises of the shell building.", "normalized_value": "2", "normalized_unit": "feet", "normalized_attribute": "min_burial_depth", "normalization_notes": "Interpreted '2' or more' as a minimum value. Unit from value string.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#6", "attribute": "equipment_capacity", "value": "2500-gallon", "source_text": "There is a shared 2500-gallon grease interceptor that is designated for this shell building's Tenants.", "normalized_value": "2500", "normalized_unit": "gallons", "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#7", "attribute": "general_note", "value": "ALL ROOF PENETRATIONS MUST BE MADE BY LANDLORD'S ROOFING CONTRACTOR, AT TENANTS COST.", "source_text": "ALL ROOF PENETRATIONS MUST BE MADE BY LANDLORD'S ROOFING CONTRACTOR, AT TENANTS COST.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#8", "attribute": "general_note", "value": "TENANT IS REQUIRED TO USE LANDLORD'S FIRE ALARM MONITORING COMPANY TO CONNECT TENANT'S SYSTEM TO LANDLORD'S FIRE ALARM PANEL.", "source_text": "TENANT IS REQUIRED TO USE LANDLORD'S FIRE ALARM MONITORING COMPANY TO CONNECT TENANT'S SYSTEM TO LANDLORD'S FIRE ALARM PANEL.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#9", "attribute": "insulation_rating", "value": "R-19", "source_text": "Demising walls must be insulated with R-19 to limit sound penetration.", "normalized_value": "19", "normalized_unit": null, "normalized_attribute": "r_value", "normalization_notes": "Parsed R-value from standard notation.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#10", "attribute": "construction_extent", "value": "from finished floor slab to roof deck", "source_text": "Tenant shall furnish and install all demising partitions from finished floor slab to roof deck.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#11", "attribute": "door_count", "value": "1 exterior storefront door per each occupant's space", "source_text": "Landlord shall provide 1 exterior storefront door per each occupant's space.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a sentence, not a simple number.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#12", "attribute": "vapor_barrier", "value": "15 Mil", "source_text": "ii. 15 Mil vapor barrier", "normalized_value": "15", "normalized_unit": "mil", "normalized_attribute": "vapor_barrier_thickness", "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#13", "attribute": "reinforcement", "value": "#4 bars 15\" OCEW (on center each way)", "source_text": "iv. #4 bars 15\" OCEW (on center each way)", "normalized_value": "15", "normalized_unit": "inches", "normalized_attribute": "rebar_spacing", "normalization_notes": "Parsed spacing from compound value. Original value also contains rebar size '#4'.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "G11.03#14", "attribute": "compressive_strength", "value": "3000PSI", "source_text": "v. 3000PSI minimum concrete", "normalized_value": "3000", "normalized_unit": "psi", "normalized_attribute": null, "normalization_notes": "Normalized unit 'PSI' to 'psi'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#15", "attribute": "story_count", "value": "single story", "source_text": "c. All spaces are single story with no provision for additional floors.", "normalized_value": "1", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#16", "attribute": "roofer", "value": "PBC Roof Systems - 9119 Meadow Vista Blvd, Houston, TX 77064 1. 281-469-3622, Darrel Kirtley", "source_text": "i. Roofer \u2014 PBC Roof Systems \u2013 9119 Meadow Vista Blvd, Houston, TX 77064\n1. 281-469-3622, Darrel Kirtley", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#17", "attribute": "fire_sprinkler_contractor", "value": "BMF Solutions - 13602 Jarvis, Cypress, TX 77429 1. 832-220-1500 Tony Murray", "source_text": "ii. Fire Sprinkler \u2013 BMF Solutions \u2013 13602 Jarvis, Cypress, TX 77429\n1. 832-220-1500 Tony Murray", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#18", "attribute": "fire_alarm_contractor", "value": "Impact Fire - 1 Chisolm Trail Road, Suite 330, Round Rock, TX 78681 1. 713-263-7535, James Fish", "source_text": "iii. Fire Alarm \u2013 Impact Fire \u2013 1 Chisolm Trail Road, Suite 330, Round Rock, TX 78681\n1. 713-263-7535, James Fish", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#19", "attribute": "storefront_contractor", "value": "ConTor Glass - 27531 Gatlin Lane, Spring, TX 77386 1. 832-283-0599, Preston Wallace", "source_text": "iv. Storefront \u2013 ConTor Glass \u2013 27531 Gatlin Lane, Spring, TX 77386\n1. 832-283-0599, Preston Wallace", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.03#20", "attribute": "notice_period", "value": "10 day", "source_text": "These contractors must be given a 10 day notice to schedule the work.", "normalized_value": "10", "normalized_unit": "days", "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.04#0", "attribute": "scope_of_work", "value": "Lease Space Build-out (LSBO)", "source_text": "X LEASE SPACE BUILD-OUT (LSBO)", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.04#1", "attribute": "occupancy_separation", "value": "Single Occupancy", "source_text": "X SINGLE OCCUPANCY", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.04#2", "attribute": "height_limitation", "value": "75", "source_text": "HEIGHT LIMITATION: 75'", "normalized_value": "75", "normalized_unit": "feet", "normalized_attribute": null, "normalization_notes": "Unit inferred from source text '75''.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.04#3", "attribute": "area_limitation", "value": "UNLIMITED", "source_text": "AREA LIMITATION: UNLIMITED (TABLES 504.3, 504.4, 506.2 IBC 2021)", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.04#4", "attribute": "address", "value": "7022 ELYSON EXCHANGE WAY CYPRESS, TX 77433", "source_text": "ADDRESS: 7022 ELYSON EXCHANGE WAY CITY, ST: CYPRESS, TX ZIP CODE: 77433", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.04#5", "attribute": "number_of_floors", "value": "1", "source_text": "# OF FLOORS: 1", "normalized_value": "1", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.04#6", "attribute": "building_height", "value": "30'-0\"", "source_text": "HEIGHT: 30'-0\"", "normalized_value": "360", "normalized_unit": "inches", "normalized_attribute": null, "normalization_notes": "Converted from feet and inches.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.04#7", "attribute": "shell_building_permit_number", "value": "2402160146", "source_text": "SHELL BUILDING PERMIT #: 2402160146", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.04#8", "attribute": "civil_project_number", "value": "2311220004", "source_text": "CIVIL PROJECT #: 2311220004", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.04#9", "attribute": "project_description", "value": "PROJECT IS A TENANT INTERIOR LEASE SPACE BUILD OUT FOR A FIRST GENERATION RETAIL SPACE. THE SCOPE OF WORK CONSISTS OF NEW CEILINGS, FLOORING, FINISHES, NONSTRUCTURAL WALLS, ELECTRICAL, MECHANICAL AND PLUMBING", "source_text": "PROJECT IS A TENANT INTERIOR LEASE SPACE BUILD OUT FOR A FIRST GENERATION RETAIL SPACE. THE SCOPE OF WORK CONSISTS OF NEW CEILINGS, FLOORING, FINISHES, NONSTRUCTURAL WALLS, ELECTRICAL, MECHANICAL AND PLUMBING", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.04#10", "attribute": "schedule_entry", "value": "OCC. CLASS M, AREA SPECIFIC USE Mercantile, GROSS SF 3,323, SF PER OCC. 60, DESIGN OCC. 56", "source_text": "OCC. CLASS M, AREA SPECIFIC USE MERCANTILE, GROSS SF 3,323, SF PER OCC. 60, DESIGN OCC. 56", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Compound value from a schedule. Not normalizing to avoid creating complex objects.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.04#11", "attribute": "required_exit_count", "value": "2", "source_text": "# OF REQUIRED EXITS 2", "normalized_value": "2", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G21.01#0", "attribute": "room_name", "value": "INVENTORY", "source_text": "INVENTORY", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G21.01#1", "attribute": "room_name", "value": "LOUNGE", "source_text": "LOUNGE", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G21.01#2", "attribute": "room_name", "value": "MEN'S RESTROOM", "source_text": "MEN'S RESTROOM", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G21.01#3", "attribute": "room_name", "value": "WOMEN'S RESTROOM", "source_text": "WOMEN'S RESTROOM", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G21.01#4", "attribute": "room_name", "value": "MANAGER'S OFFICE", "source_text": "MANAGER'S OFFICE", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null}] \ No newline at end of file diff --git a/backend/.llm_cache/bd713ad5137c1c6d09f930e88f3c6934bb1701bcb1d15b21ca5d08935089f95f.json b/backend/.llm_cache/bd713ad5137c1c6d09f930e88f3c6934bb1701bcb1d15b21ca5d08935089f95f.json new file mode 100644 index 0000000..e8e077f --- /dev/null +++ b/backend/.llm_cache/bd713ad5137c1c6d09f930e88f3c6934bb1701bcb1d15b21ca5d08935089f95f.json @@ -0,0 +1 @@ +{"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"}]} \ No newline at end of file diff --git a/backend/.llm_cache/beea62c77ceee2cca4db65c8f532ba20771ecce29afc726eec9e07e08d9132fc.json b/backend/.llm_cache/beea62c77ceee2cca4db65c8f532ba20771ecce29afc726eec9e07e08d9132fc.json new file mode 100644 index 0000000..5249d95 --- /dev/null +++ b/backend/.llm_cache/beea62c77ceee2cca4db65c8f532ba20771ecce29afc726eec9e07e08d9132fc.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "room_name_inconsistency_102", "category": "tag_or_reference_inconsistency", "severity": "low", "confidence": "high", "location": "Women's Restroom 102", "disciplines": ["Architectural", "Plumbing"], "sheets": ["A24.01", "P02.01"], "description": "The plumbing sanitary plan refers to the women's restroom as 'WOMEN'S ROOM', while architectural, electrical, and domestic water plans label it 'WOMEN'S RESTROOM'. While the intent is clear, all room names should be consistent across all disciplines to avoid confusion in schedules, submittals, or RFIs.", "evidence": [{"discipline": "Architectural", "sheet": "A24.01", "source_text": "WOMEN'S RESTROOM", "asserted_value": "WOMEN'S RESTROOM"}, {"discipline": "Plumbing", "sheet": "P02.01", "source_text": "WOMEN'S ROOM", "asserted_value": "WOMEN'S ROOM"}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/c0fd1b81f83fb59d8295139915bf278dee49e4bd9c8562c6b86dd8b00907425a.json b/backend/.llm_cache/c0fd1b81f83fb59d8295139915bf278dee49e4bd9c8562c6b86dd8b00907425a.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/c0fd1b81f83fb59d8295139915bf278dee49e4bd9c8562c6b86dd8b00907425a.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/c2137b5b5701e56c94e9cd75b54c2ba0f9e6296b31537b93ef2744e83d7ab76a.json b/backend/.llm_cache/c2137b5b5701e56c94e9cd75b54c2ba0f9e6296b31537b93ef2744e83d7ab76a.json new file mode 100644 index 0000000..583c8ba --- /dev/null +++ b/backend/.llm_cache/c2137b5b5701e56c94e9cd75b54c2ba0f9e6296b31537b93ef2744e83d7ab76a.json @@ -0,0 +1 @@ +{"sheet_number": "P03.01", "discipline": "Plumbing", "sheet_title": "DETAILS & RISERS", "level": null, "scale": null, "assertions": [{"subject": "Plumbing Piping", "attribute": "general_note", "value": "Saw-cut and route proposed sanitary waste line to existing 4\" sanitary waste line or larger.", "source_text": "KEYED NOTE: 1 SAW-CUT AND ROUTE PROPOSED SANITARY WASTE LINE TO EXISTING 4\" SANITARY WASTE LINE OR LARGER APPROXIMATELY THIS POINT. FIELD VERIFY EXACT LOCATION, SIZE. DIRECTION OF FLOW AND DEPTH OF OF EXISTING PIPE.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "1"}}, {"subject": "Plumbing Piping", "attribute": "general_note", "value": "Route proposed new vent branch line to existing 4\" vent main line or larger.", "source_text": "KEYED NOTE: 2 ROUTE PROPOSED NEW VENT BRANCH LINE TO EXISTING 4\" VENT MAIN LINE OR LARGER AT APPROXIMATELY THIS POINT. FIELD VERIFY EXACT LOCATION, SIZE, & ELEVATION OF EXISTING PIPE.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "2"}}, {"subject": "TMV-1", "attribute": "equipment_model", "value": "170-LF LEONARD", "source_text": "PROVIDE MODEL 170-LF LEONARD THERMOSTATIC MIXING VALVE.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "TMV-1"}}, {"subject": "TMV-1", "attribute": "temperature", "value": "110", "source_text": "OUTLET TEMP SHALL BE 110\u00b0F.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "TMV-1"}}, {"subject": "EWH-1", "attribute": "pressure_relief_drain", "value": "Pipe discharge 3/4\" to floor sink per plans", "source_text": "A.S.M.E. RATED TEMP. AND PRESSURE RELIEF VALVE. PIPE DISCHARGE 3/4\" TO FLOOR SINK PER PLANS", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "EWH-1"}}, {"subject": "EWH-1", "attribute": "expansion_tank_model", "value": "A.O. SMITH PMC-2", "source_text": "EXPANSION TANK A.O. SMITH PMC-2", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "EWH-1"}}, {"subject": "EWH-1", "attribute": "drain_pan", "value": "4\" DEEP AUXILIARY DRAIN PAN 18 GAUGE GALVANIZED STEEL.", "source_text": "4\" DEEP AUXILIARY DRAIN PAN 18 GAUGE GALVANIZED STEEL.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "EWH-1"}}, {"subject": "EWH-1", "attribute": "drain_line", "value": "3/4\" auxiliary drain line to floor sink", "source_text": "3/4\" AUXILIARY DRAIN LINE TO FLOOR SINK PER PLANS", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "EWH-1"}}, {"subject": "EWH-1", "attribute": "support_spec", "value": "2\" Unistrut support. 1/2\" All threaded rods complete with double nuts and lock washers.", "source_text": "2\" UNISTRUT SUPPORT. 1/2\" ALL THREADED RODS COMPLETE WITH DOUBLE NUTS AND LOCK WASHERS.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "EWH-1"}}, {"subject": "Water Hammer Arrester", "attribute": "installation_note", "value": "Must be installed in an upright position.", "source_text": "1. ALWAYS INSTALL IN UPRIGHT POSITION", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Water Hammer Arrester", "attribute": "accessibility", "value": "Install at an accessible location. Provide access panel where required.", "source_text": "2. INSTALL AT AN ACCESSIBLE LOCATION. PROVIDE ACCESS PANEL WHERE REQUIRED.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Floor Slab", "attribute": "vapor_retarder", "value": "6-mil Polyethylene vapor retarder minimum", "source_text": "PER 2021 IBC, CHAPTER 19, SECTION 1907: POLYETHYLENE VAPOR RETARDER MINIMUM 6-MIL SHALL BE REQUIRED.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Piping", "attribute": "sleeve_size", "value": "2\" larger than the pipe", "source_text": "SLEEVE SHALL BE 2\" LARGER THEN THE PIPE", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Piping", "attribute": "pipe_material", "value": "Connection from PVC below slab to Cast Iron above slab with transition coupling", "source_text": "MAKE CONNECTION FROM PVC BELOW SLAB TO CAST IRON ABOVE SLAB WITH TRANSISTION COUPLING", "confidence": "high", "location_key": {"grid": null, "room": null, "level": "Floor", "tag": null}}, {"subject": "Piping", "attribute": "installation_note", "value": "No exposed PVC above slab", "source_text": "NO EXPOSED PVC ABOVE SLAB.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": "Floor", "tag": null}}, {"subject": "SK-1", "attribute": "vent_size", "value": "1 1/2", "source_text": "1 1/2\"V", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "SK-1"}}, {"subject": "SK-1", "attribute": "sanitary_size", "value": "2", "source_text": "2\"SAN", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "SK-1"}}, {"subject": "WC-1", "attribute": "vent_size", "value": "2", "source_text": "2\"V", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "WC-1"}}, {"subject": "WC-1", "attribute": "sanitary_size", "value": "3", "source_text": "3\"SAN", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "WC-1"}}, {"subject": "L-1", "attribute": "sanitary_size", "value": "2", "source_text": "2\"SAN", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "L-1"}}, {"subject": "EDF-1", "attribute": "vent_size", "value": "2", "source_text": "2\"V", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "EDF-1"}}, {"subject": "Water Hammer Arrester", "attribute": "schedule_entry", "value": "Fixture units 1-11 require J.R. SMITH FIG. NO 5005 (Symbol A), Size 3/4\", B Size 4\"", "source_text": "5005 | A | 1 - 11 | 3/4\" | 4\"", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}]} \ No newline at end of file diff --git a/backend/.llm_cache/c282405522dff62240c604c0fbc5e03159c9e25950eebcab9abb39fe49861d3f.json b/backend/.llm_cache/c282405522dff62240c604c0fbc5e03159c9e25950eebcab9abb39fe49861d3f.json new file mode 100644 index 0000000..4582357 --- /dev/null +++ b/backend/.llm_cache/c282405522dff62240c604c0fbc5e03159c9e25950eebcab9abb39fe49861d3f.json @@ -0,0 +1 @@ +{"sheet_number": "G31.02", "discipline": "General", "sheet_title": "SPECIFICATIONS", "level": null, "scale": null, "assertions": [{"subject": "General Demolition Requirements", "attribute": "owner_occupancy", "value": "Conduct selective demolition so Owner's operations are not disrupted.", "source_text": "OWNER WILL OCCUPY PORTIONS OF BUILDING IMMEDIATELY ADJACENT TO SELECTIVE DEMOLITION AREA. CONDUCT SELECTIVE DEMOLITION SO OWNER'S OPERATIONS ARE NOT DISRUPTED.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Hazardous Materials", "attribute": "notification_requirement", "value": "A report on the presence of hazardous materials is on file for review and use.", "source_text": "HAZARDOUS MATERIALS PRESENT IN BUILDINGS AND STRUCTURES TO BE SELECTIVELY DEMOLISHED. A REPORT ON THE PRESENCE OF HAZARDOUS MATERIALS IS ON FILE FOR REVIEW AND USE. EXAMINE REPORT AND BECOME AWARE OF LOCATIONS WHERE HAZARDOUS MATERIALS ARE PRESENT.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Quality Assurance", "attribute": "technician_qualification", "value": "Refrigerant Recovery Technician must be certified by an EPA-approved certification program.", "source_text": "REFRIGERANT RECOVERY TECHNICIAN QUALIFICATIONS: CERTIFIED BY AN EPA-APPROVED CERTIFICATION PROGRAM.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Fire and Life Safety", "attribute": "code_compliance", "value": "Comply with ASSE A10.6 and NFPA 241.", "source_text": "STANDARDS: COMPLY WITH ASSE A10.6 AND NFPA 241.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Utility Systems", "attribute": "system_extension", "value": "Provide extensions to existing utilities including plumbing, fire protection, electrical, and telecommunications.", "source_text": "PROVIDE EXTENSIONS TO EXISTING UTILITIES, AS REQUIRED BY PRODUCTS AND SYSTEMS TO BE INSTALLED, INCLUDING PLUMBING, FIRE PROTECTION, ELECTRICAL, AND TELECOMMUNICATIONS.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Fire-Rated Assemblies", "attribute": "firestopping_requirement", "value": "Seal voids at penetrations of fire-rated construction with fire rated material in accordance with Section 07 8400.", "source_text": "AT PENETRATIONS OF FIRE-RATED WALLS, PARTITIONS, OR FLOOR CONSTRUCTION, COMPLETELY SEAL VOIDS WITH FIRE RATED MATERIAL IN ACCORDANCE WITH SECTION 07 8400, TO FULL THICKNESS OF THE PENETRATED ELEMENT.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Project Closeout", "attribute": "related_section", "value": "01 3300", "source_text": "SECTION 01 3300 - ADMINISTRATIVE REQUIREMENTS: SUBMITTALS PROCEDURES; SHOP DRAWINGS, PRODUCT DATA, AND SAMPLES.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Project Closeout", "attribute": "related_section", "value": "01 7000", "source_text": "SECTION 01 7000 - EXECUTION AND CLOSEOUT REQUIREMENTS: CONTRACT CLOSEOUT PROCEDURES.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Record Documents", "attribute": "as-built_requirement", "value": "Record measured depths of foundations in relation to finish first floor datum.", "source_text": "MEASURED DEPTHS OF FOUNDATIONS IN RELATION TO FINISH FIRST FLOOR DATUM.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Record Documents", "attribute": "as-built_requirement", "value": "Record measured horizontal and vertical locations of underground utilities and appurtenances.", "source_text": "MEASURED HORIZONTAL AND VERTICAL LOCATIONS OF UNDERGROUND UTILITIES AND APPURTENANCES, REFERENCED TO PERMANENT SURFACE IMPROVEMENTS.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Record Documents", "attribute": "as-built_requirement", "value": "Record measured locations of internal utilities and appurtenances concealed in construction.", "source_text": "MEASURED LOCATIONS OF INTERNAL UTILITIES AND APPURTENANCES CONCEALED IN CONSTRUCTION, REFERENCED TO VISIBLE AND ACCESSIBLE FEATURES OF THE WORK.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Operation and Maintenance Manuals", "attribute": "binder_size", "value": "1-1/2 inch, 2 inch maximum", "source_text": "PROVIDE COMMERCIAL QUALITY 1-1/2 INCH, THREE D RING BINDERS WITH DURABLE PLASTIC COVERS; 2-INCH MAXIMUM RING SIZE. WHEN MULTIPLE BINDERS ARE USED, CORRELATE DATA INTO RELATED CONSISTENT GROUPINGS.", "confidence": "medium", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}]} \ No newline at end of file diff --git a/backend/.llm_cache/c30c9bdd9bcbb35c6e967b26388fbf5ad38df971b43038ec19f12f0fbc01ccd6.json b/backend/.llm_cache/c30c9bdd9bcbb35c6e967b26388fbf5ad38df971b43038ec19f12f0fbc01ccd6.json new file mode 100644 index 0000000..c905d49 --- /dev/null +++ b/backend/.llm_cache/c30c9bdd9bcbb35c6e967b26388fbf5ad38df971b43038ec19f12f0fbc01ccd6.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "c09841", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "Project-wide wall finish", "disciplines": ["Architectural", "Specifications"], "sheets": ["A23.01", "G31.05"], "description": "The finish plan specifies eggshell paint (PT-1) for general wall surfaces per General Note L. However, the gypsum board specification (09 29 00) on G31.05 only explicitly requires a Level 4 drywall finish for walls receiving semi-gloss or gloss paint. This leaves the required finish level for the project's primary wall finish ambiguous, which could lead to incorrect bidding and a finish quality lower than what is typically required for an eggshell paint, potentially resulting in post-occupancy issues or change orders.", "evidence": [{"discipline": "Architectural", "sheet": "A23.01", "source_text": "[Finish Legend, PAINT, PT-1] FINISH: EGGSHELL", "asserted_value": "Paint finish is Eggshell"}, {"discipline": "General", "sheet": "G31.05", "source_text": "[SPECIFICATIONS 09 29 00 GYPSUM BOARD, 2.06 FINISHES, A. FINISH LEVELS] 4. LEVEL 4: WALLS AND CEILINGS TO RECEIVE SEMI-GLOSS OR GLOSS PAINT OR OTHER AREAS SPECIFICALLY INDICATED.", "asserted_value": "Level 4 Drywall Finish required for Semi-Gloss or Gloss paint"}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/c3ce3cb76b69013dd53d325aa484466464ee18152ddcc7a06c013592d8437343.json b/backend/.llm_cache/c3ce3cb76b69013dd53d325aa484466464ee18152ddcc7a06c013592d8437343.json new file mode 100644 index 0000000..306ceb1 --- /dev/null +++ b/backend/.llm_cache/c3ce3cb76b69013dd53d325aa484466464ee18152ddcc7a06c013592d8437343.json @@ -0,0 +1 @@ +{"sheet_number": "A23.01", "discipline": "Architectural", "sheet_title": "FINISH PLAN", "level": null, "scale": "1/4\" = 1'-0\"", "assertions": [{"assertion_id": "A2301-N-001", "subject": "General Note", "category": "note", "attribute": "general_note", "value": "Interior finishes to comply with IBC Class C or higher; Section 803.9 and Table 803.9 of 2021 IBC.", "unit": null, "location_key": {"sheet_number": "A23.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "B", "detail_reference": null, "plan_zone": null}, "source_text": "B. INTERIOR FINISHES TO COMPLY WITH IBC CLASS C OR HIGHER SECTION 803.9 AND TABLE 803.9 OF 2021 IBC.", "coordination_targets": ["architectural", "code", "life_safety"], "conflict_potential": "medium", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "A2301-N-002", "subject": "General Note", "category": "note", "attribute": "general_note", "value": "All materials used for interior finish and trim shall be classified in accordance with ASTM 834.", "unit": null, "location_key": {"sheet_number": "A23.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "C", "detail_reference": null, "plan_zone": null}, "source_text": "C. ALL MATERIALS USED FOR INTERIOR FINISH AND TRIM SHALL BE CLASSIFIED IN ACCORDANCE WITH ASTM 834.", "coordination_targets": ["architectural", "code", "life_safety"], "conflict_potential": "high", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "A2301-N-003", "subject": "General Note", "category": "note", "attribute": "general_note", "value": "All floor finishes shall have a min. S.C.O.F. of .6 wet or dry.", "unit": null, "location_key": {"sheet_number": "A23.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "F", "detail_reference": null, "plan_zone": null}, "source_text": "F. ALL FLOOR FINISHES SHALL HAVE A MIN. S.C.O.F. OF .6 WET OR DRY.", "coordination_targets": ["architectural", "ada", "code", "life_safety"], "conflict_potential": "high", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "A2301-N-004", "subject": "General Note", "category": "note", "attribute": "general_note", "value": "All partitions must be fire stopped at the ceiling.", "unit": null, "location_key": {"sheet_number": "A23.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "G", "detail_reference": null, "plan_zone": null}, "source_text": "G. ALL PARTITIONS MUST BE FIRE STOPPED AT THE CEILING.", "coordination_targets": ["architectural", "structural", "fire_protection", "code", "life_safety"], "conflict_potential": "medium", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "A2301-N-005", "subject": "General Note", "category": "note", "attribute": "general_note", "value": "All locations of core drilling of the floor slab for installation of utilities to be coordinated with landlord's structural engineer before performing the work.", "unit": null, "location_key": {"sheet_number": "A23.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "H", "detail_reference": null, "plan_zone": null}, "source_text": "H. ALL LOCATIONS OF CORE DRILLING OF THE FLOOR SLAB FOR INSTALLATION OF UTILITIES TO BE COORDINATED WITH LANDLORD'S STRUCTURAL ENGINEER BEFORE PERFORMING THE WORK.", "coordination_targets": ["structural", "mechanical", "electrical", "plumbing"], "conflict_potential": "high", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "A2301-N-006", "subject": "General Note", "category": "note", "attribute": "general_note", "value": "Polished concrete floor PC-1 throughout, U.N.O.", "unit": null, "location_key": {"sheet_number": "A23.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "K", "detail_reference": null, "plan_zone": null}, "source_text": "K. POLISHED CONCRETE FLOOR PC-1 THROUGHOUT, U.N.O.", "coordination_targets": ["architectural"], "conflict_potential": "medium", "code_review_relevance": "none", "confidence": "high"}, {"assertion_id": "A2301-N-007", "subject": "General Note", "category": "note", "attribute": "general_note", "value": "Walls to be painted P-1 throughout.", "unit": null, "location_key": {"sheet_number": "A23.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "L", "detail_reference": null, "plan_zone": null}, "source_text": "L. WALLS TO BE PAINTED P-1 THROUGHOUT.", "coordination_targets": ["architectural"], "conflict_potential": "medium", "code_review_relevance": "none", "confidence": "high"}, {"assertion_id": "A2301-N-008", "subject": "General Note", "category": "note", "attribute": "general_note", "value": "Vinyl base WB-1 throughout, U.N.O.", "unit": null, "location_key": {"sheet_number": "A23.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "M", "detail_reference": null, "plan_zone": null}, "source_text": "M. VINYL BASE WB-1 THROUGHOUT, U.N.O.", "coordination_targets": ["architectural"], "conflict_potential": "medium", "code_review_relevance": "none", "confidence": "high"}, {"assertion_id": "A2301-N-009", "subject": "General Note", "category": "note", "attribute": "general_note", "value": "Ceiling throughout entire space to be AT-1 acoustic ceiling tile with C4-A ceiling grid.", "unit": null, "location_key": {"sheet_number": "A23.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "N", "detail_reference": null, "plan_zone": null}, "source_text": "N. CEILING THROUGHOUT ENTIRE SPACE TO BE AT-1 ACOUSTIC CEILING TILE WITH C4-A CEILING GRID.", "coordination_targets": ["architectural", "mechanical", "electrical", "fire_protection"], "conflict_potential": "medium", "code_review_relevance": "none", "confidence": "high"}, {"assertion_id": "A2301-N-010", "subject": "General Note", "category": "note", "attribute": "general_note", "value": "Refer to Plumbing Engineer sheets for plumbing fixture specification.", "unit": null, "location_key": {"sheet_number": "A23.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "O", "detail_reference": null, "plan_zone": null}, "source_text": "O. NOTE: REFER TO PLUMBING ENGINEER SHEETS FOR PLUMBING FIXTURE SPECIFICATION.", "coordination_targets": ["plumbing"], "conflict_potential": "high", "code_review_relevance": "none", "confidence": "high"}, {"assertion_id": "A2301-L-001", "subject": "Ceiling", "category": "finish", "attribute": "keynote_assertion", "value": "Acoustic Ceiling Tile AT: Armstrong DUNE #1774, 24\" X 24\" X 5/8\", Angled Tegular 15/16\"", "unit": null, "location_key": {"sheet_number": "A23.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "AT 1", "detail_reference": null, "plan_zone": "D"}, "source_text": "AT 1 ACOUSTIC CEILING TILE MANUF: ARMSTRONG MODEL: DUNE #1774 COLOR: WHITE SIZE: 24\" X 24\" X 5/8\" EDGE PROFILE: ANGLED TEGULAR 15/16\" LOCATION: THROUGHOUT ENTIRE SPACE", "coordination_targets": ["architectural", "mechanical", "electrical", "fire_protection"], "conflict_potential": "low", "code_review_relevance": "none", "confidence": "high"}, {"assertion_id": "A2301-L-002", "subject": "Ceiling Grid", "category": "finish", "attribute": "keynote_assertion", "value": "Ceiling Tile Grid C4 A: Armstrong ULTIMA 1910, 24\" X 24\" X 3/4\", Fire Rating Class A", "unit": null, "location_key": {"sheet_number": "A23.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "C4 A", "detail_reference": null, "plan_zone": "D"}, "source_text": "C4 A CEILING TILE GRID MANUF: ARMSTRONG PRODUCT: ULTIMA 1910 SURFACE: FIRE RATING CLASS A COLOR: WHITE SIZE: 24\" X 24\" X 3/4\" GRID: PRELUDE XL 15/16\" EXPOSED TEE IN WHITE EDGE PROFILE: 15/16\" SQUARE LAY IN LOCATION: THROUGHOUT ENTIRE SPACE", "coordination_targets": ["architectural", "code", "life_safety"], "conflict_potential": "medium", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "A2301-L-003", "subject": "Carpet Tile", "category": "finish", "attribute": "keynote_assertion", "value": "Carpet Tile CPT 1: Shaw NEXT GEN 2.0, 24\" X 24\", Ashlar stack pattern 50% offset", "unit": null, "location_key": {"sheet_number": "A23.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "CPT 1", "detail_reference": null, "plan_zone": "D"}, "source_text": "CPT 1 CARPET TILE MANUF: SHAW PRODUCT: NEXT GEN 2.0, VERIZON STANDARD STYLE: 42JCP SIZE: 24\" X 24\" INSTALLATION: ASHLAR STACK PATTERN 50% OFFSET", "coordination_targets": ["architectural"], "conflict_potential": "low", "code_review_relevance": "none", "confidence": "high"}, {"assertion_id": "A2301-F-001", "subject": "Carpet Tile CPT 1", "category": "finish", "attribute": "finish_floor", "value": "CPT 1", "unit": null, "location_key": {"sheet_number": "A23.01", "grid": null, "room": null, "room_name": "SALES AREA", "level": null, "tag": "CPT 1", "detail_reference": null, "plan_zone": "C"}, "source_text": "SALES AREA", "coordination_targets": ["architectural"], "conflict_potential": "low", "code_review_relevance": "none", "confidence": "high"}, {"assertion_id": "A2301-F-002", "subject": "Carpet Tile CPT 1", "category": "finish", "attribute": "finish_floor", "value": "CPT 1", "unit": null, "location_key": {"sheet_number": "A23.01", "grid": "A/B", "room": null, "room_name": "MANAGER'S OFFICE", "level": null, "tag": "CPT 1", "detail_reference": null, "plan_zone": "B"}, "source_text": "MANAGER'S OFFICE", "coordination_targets": ["architectural"], "conflict_potential": "low", "code_review_relevance": "none", "confidence": "high"}, {"assertion_id": "A2301-L-004", "subject": "Polished Concrete", "category": "finish", "attribute": "keynote_assertion", "value": "Polished Concrete PC 1: Grade 2 (Medium Exposed), with a Class 1 (Matte) Finish", "unit": null, "location_key": {"sheet_number": "A23.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "PC 1", "detail_reference": null, "plan_zone": "D"}, "source_text": "PC 1 POLISHED CONCRETE GRADE: 2 (MEDIUMS EXPOSED), WITH A CLASS 1 (MATTE) FINISH", "coordination_targets": ["architectural"], "conflict_potential": "low", "code_review_relevance": "none", "confidence": "high"}, {"assertion_id": "A2301-L-005", "subject": "Polished Concrete PC 1", "category": "finish", "attribute": "slip_resistance", "value": ">= 0.50 SCOF", "unit": "SCOF", "location_key": {"sheet_number": "A23.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "PC 1", "detail_reference": null, "plan_zone": "D"}, "source_text": "SLIP RESISTANCE OF FLOOR TO BE NO LESS THAN A 0.50 STATIC COEFFICIENT OF FRICTION (SCOF)", "coordination_targets": ["architectural", "ada", "code", "life_safety"], "conflict_potential": "high"}]} \ No newline at end of file diff --git a/backend/.llm_cache/c4f1fc27f87c34f25be0dc726d9fe3d0e282e5ba41874dd10626b9c03bf67389.json b/backend/.llm_cache/c4f1fc27f87c34f25be0dc726d9fe3d0e282e5ba41874dd10626b9c03bf67389.json new file mode 100644 index 0000000..f7d7d0b --- /dev/null +++ b/backend/.llm_cache/c4f1fc27f87c34f25be0dc726d9fe3d0e282e5ba41874dd10626b9c03bf67389.json @@ -0,0 +1 @@ +[{"rfi_id": "DEDUP-01", "issue_id": "DEDUP-01", "title": "Conflicting Building Code References", "background": "The drawing set references multiple, conflicting versions of the International Building Code (IBC). Sheet G21.01 references the 2018 IBC. Sheets E01.01, P03.01, A23.01, and G11.04 reference the 2021 IBC. It is understood that the applicable code for the jurisdiction is the 2015 IBC.", "question": "Please clarify the single, legally adopted IBC edition to be used for the project and revise all drawing sheets and design criteria for consistency.", "sheets_referenced": ["G21.01", "E01.01", "P03.01", "A23.01", "G11.04"], "disciplines_to_respond": ["General", "Electrical", "Plumbing", "Architectural"], "suggested_response_needed": "Response required prior to permit submission.", "priority": "high"}, {"rfi_id": "QAQC-002-M", "issue_id": "QAQC-002-M", "title": "Missing Structural Drawings for New Rooftop Loads", "background": "The drawing set does not include any Structural (S-series) sheets. New rooftop units (RTUs) are specified, which will impose new loads on the existing structure. Notes on sheets M03.01 ('RE: STRUCTURAL.') and E05.02 ('VERIFY SUPPORT SIZING AND DESIGNED WITH PROJECT STRUCTURAL ENGINEER') explicitly reference coordination with a structural engineer, but no structural design is provided.", "question": "Please provide the complete Structural drawing set, sealed by the engineer of record, detailing the analysis of the existing structure and the design for supporting all new equipment. Please also update the cover sheet consultant list.", "sheets_referenced": ["G01.01", "A25.01", "M03.01", "E05.02", "G11.01"], "disciplines_to_respond": ["Structural", "Architectural", "Mechanical", "Electrical"], "suggested_response_needed": "Response required immediately.", "priority": "high"}, {"rfi_id": "CBI-003", "issue_id": "CBI-003", "title": "Inadequate Structural Support Detail for Suspended Equipment", "background": "Heavy equipment, including an electrical transformer and an electric water heater (EWH-1), are shown to be suspended above the ceiling. The details improperly delegate the structural design to the field by stating 'VERIFY SUPPORT SIZING AND DESIGNED WITH PROJECT STRUCTURAL ENGINEER PRIOR TO ASSEMBLY' (Sheet E05.02 for transformer) and showing a generic, non-engineered support detail for the water heater (Detail 4/P03.01).", "question": "Please provide engineered structural details, signed and sealed by the structural engineer of record, for the suspension of the transformer and the water heater. Details must show connection to the building structure and specify all required framing, hardware, and components.", "sheets_referenced": ["E05.02", "P03.01"], "disciplines_to_respond": ["Structural", "Electrical", "Plumbing"], "suggested_response_needed": "Response required immediately due to life-safety implications.", "priority": "high"}, {"rfi_id": "QAQC-001-M", "issue_id": "QAQC-001-M", "title": "Missing Architectural and Mechanical Plan Sheets", "background": "Key plan sheets are missing from the drawing set. The sheet index indicates that pages 14 (likely Architectural Dimension/Construction Plan), 15 (Architectural Reflected Ceiling Plan), and 22 (Mechanical HVAC Plan) were not included in the set.", "question": "Please provide the missing plan sheets (A-Dimension Plan, A-Reflected Ceiling Plan, M-HVAC Plan) and update the sheet index accordingly.", "sheets_referenced": ["G11.01"], "disciplines_to_respond": ["Architectural", "Mechanical"], "suggested_response_needed": "Response required immediately as the set is incomplete for review or bidding.", "priority": "high"}, {"rfi_id": "verizon-elyson-002", "issue_id": "verizon-elyson-002", "title": "Potential ADA Compliance issue for Restroom Fixture Clearance", "background": "The plumbing fixture schedule on P01.01 specifies a 'FLOOR MOUNTED' water closet for the single-user ADA restrooms. As per ADA 604.8.1.1, this fixture selection requires a minimum clearance depth of 59 inches. The architectural dimensioned plan that would confirm this dimension appears to be missing.", "question": "Please provide the architectural dimensioned floor plan and confirm that the clear depth in both single-user restrooms meets the 59-inch minimum requirement. If not, please provide revised plans showing either an increased room size or a switch to a wall-hung fixture with a verified 56-inch clear depth.", "sheets_referenced": ["P01.01", "P02.01"], "disciplines_to_respond": ["Plumbing", "Architectural"], "suggested_response_needed": "Response required prior to permit submission.", "priority": "high"}, {"rfi_id": "QAQC-003", "issue_id": "QAQC-003", "title": "Missing Door and Window Schedules", "background": "The drawing set does not include Door or Window Schedules, nor are they listed in the sheet index on G11.01. While doors are indicated graphically on plans such as A24.01, they lack identifying tags. Information such as sizes, types, materials, hardware, and fire-ratings is undefined.", "question": "Please provide complete Door and Window Schedules and add corresponding tags to all door and window elements on the floor plans.", "sheets_referenced": ["G11.01", "A24.01"], "disciplines_to_respond": ["Architectural"], "suggested_response_needed": "Response required prior to bid submission.", "priority": "high"}, {"rfi_id": "QAQC-004", "issue_id": "QAQC-004", "title": "Missing Wall Type Legend and Partition Plan", "background": "The drawing set lacks a wall type or partition legend defining wall assemblies (e.g., stud size/gauge, insulation, STC ratings, UL design numbers, and hourly ratings). While sheet G31.06 shows a UL rated assembly (U419), no plan indicates where this or any other wall type is located.", "question": "Please provide a partition schedule with dimensioned drawings for each wall type and add partition type tags to all walls on the architectural floor plan to indicate their specified locations.", "sheets_referenced": ["G31.05", "G11.01", "G31.06"], "disciplines_to_respond": ["Architectural"], "suggested_response_needed": "Response required prior to bid submission.", "priority": "high"}, {"rfi_id": "DEDUP-02", "issue_id": "DEDUP-02", "title": "Voltage Mismatch for Electric Water Heater (EWH-1)", "background": "There is a conflict between the specified equipment and the provided power source for the electric water heater (EWH-1). The plumbing fixture schedule on P01.01 specifies a 480V, 3-phase unit. The electrical panel schedule on E01.02 indicates that the 'WATER HEATING' circuit is served from Panel 'L' at 208Y/120V.", "question": "Please coordinate the Plumbing and Electrical disciplines and revise either the water heater specification to a 208V model or revise the electrical design to provide a 480V power source for EWH-1.", "sheets_referenced": ["P01.01", "E01.02"], "disciplines_to_respond": ["Plumbing", "Electrical"], "suggested_response_needed": "Response required prior to bid submission.", "priority": "high"}, {"rfi_id": "DEDUP-04", "issue_id": "DEDUP-04", "title": "Conflicting National Electrical Code (NEC) References", "background": "The drawing set references conflicting versions of the National Electrical Code (NEC). Sheet G21.01 references the 2014 NEC. Sheet E01.01 references the 2023 NEC.", "question": "Please clarify the single, applicable NEC edition to be used for the project and revise all drawing sheets for consistency.", "sheets_referenced": ["G21.01", "E01.01"], "disciplines_to_respond": ["General", "Electrical"], "suggested_response_needed": "Response required prior to permit submission.", "priority": "high"}, {"rfi_id": "accessibility_ramp_slip_resistance_01", "issue_id": "accessibility_ramp_slip_resistance_01", "title": "Non-Compliant Slip Resistance Specification for Ramps", "background": "Specification section 09 30 00 for Tiling on sheet G31.05 requires a minimum Static Coefficient of Friction (SCOF) of 0.42 for ramp surfaces. The project is subject to the 2012 Texas Accessibility Standards (TAS), which Section 302.1 requires a minimum SCOF of 0.8 for ramp surfaces.", "question": "Please revise specification 09 30 00 on sheet G31.05 to require a minimum Static Coefficient of Friction of 0.8 for ramp surfaces to comply with 2012 TAS Section 302.1 requirements.", "sheets_referenced": ["G31.05"], "disciplines_to_respond": ["General", "Architectural"], "suggested_response_needed": "Response required prior to bid submission.", "priority": "high"}, {"rfi_id": "DEDUP-03", "issue_id": "DEDUP-03", "title": "Equipment Access Above Hard-Lid Ceiling", "background": "An electrical transformer (E02.01) and an electric water heater (P02.02) are specified to be suspended above the ceiling, with notes stating they must be accessible. However, the architectural finish plan (A23.01) indicates the Lounge, where this equipment appears to be located, has a gypsum board (hard-lid) ceiling (C1), which is not accessible for equipment replacement.", "question": "Please clarify the final location of the suspended equipment and coordinate with the ceiling plan. Please relocate the equipment to an area with an accessible ceiling or specify appropriately sized access panels in the hard-lid ceiling to allow for future service and replacement. Update all relevant discipline drawings.", "sheets_referenced": ["E02.01", "P02.02", "A23.01"], "disciplines_to_respond": ["Electrical", "Plumbing", "Architectural"], "suggested_response_needed": "Response required prior to bid submission.", "priority": "high"}, {"rfi_id": "PROJ-A5101-1", "issue_id": "PROJ-A5101-1", "title": "Restroom Door Swing Obstructs Fixture Clearance", "background": "In Detail 3 on sheet A51.01, the enlarged restroom plan shows the door swinging inward and encroaching on the required clear floor space for the water closet, which violates accessibility standards.", "question": "Please revise Detail 3/A51.01 to show the door swinging out, ensuring it does not obstruct any required clearances or accessible paths in the adjacent space. Confirm compliance with ADA 603.2.3.", "sheets_referenced": ["A51.01"], "disciplines_to_respond": ["Architectural"], "suggested_response_needed": "Response required prior to permit submission.", "priority": "high"}, {"rfi_id": "PROJ-G1102-1", "issue_id": "PROJ-G1102-1", "title": "Non-Compliant Door Hardware Mounting Height", "background": "The Door Hardware Detail on sheet G11.02 specifies a typical mounting height of 33\"-36\" AFF. ADA 404.2.7 requires operable portions of hardware to be a minimum of 34\" AFF. Installation at 33\" would be non-compliant.", "question": "Please revise the door hardware mounting height detail on sheet G11.02 to specify a compliant range of 34\" to 48\" AFF to the operable portion of the hardware.", "sheets_referenced": ["G11.02"], "disciplines_to_respond": ["Architectural", "General"], "suggested_response_needed": "Response required prior to permit submission.", "priority": "high"}, {"rfi_id": "PROJ-A5101-2", "issue_id": "PROJ-A5101-2", "title": "Non-Compliant Rear Grab Bar Installation Detail", "background": "Detail 5 on sheet A51.01 shows the restroom interior elevation with the 36-inch rear grab bar centered on the water closet. Per ADA 604.5.1, the rear grab bar must be offset from the centerline (e.g., extending 12 inches from the toilet centerline towards the side wall and 24 inches towards the open side).", "question": "Please revise the restroom plan and elevation details on sheet A51.01 to show the rear grab bar located in compliance with ADA 604.5.1 requirements.", "sheets_referenced": ["A51.01"], "disciplines_to_respond": ["Architectural"], "suggested_response_needed": "Response required prior to permit submission.", "priority": "high"}, {"rfi_id": "DEDUP-06", "issue_id": "DEDUP-06", "title": "Conflicting Responsibility for Roofing Work", "background": "There is a conflict regarding the scope of roofing work. The Landlord Work Letter on G11.03 states that 'ALL ROOF PENETRATIONS MUST BE MADE BY LANDLORD'S ROOFING CONTRACTOR.' Conversely, a keynote on the architectural roof plan A25.01 directs the 'GC TO INSTALL FLASHING.' This creates ambiguity in scope and responsibility.", "question": "Please clarify which entity is responsible for making and flashing new roof penetrations and revise all relevant notes on sheets G11.03 and A25.01 to be consistent.", "sheets_referenced": ["G11.03", "A25.01"], "disciplines_to_respond": ["General", "Architectural"], "suggested_response_needed": "Response required prior to bid submission.", "priority": "high"}, {"rfi_id": "verizon-elyson-001", "issue_id": "verizon-elyson-001", "title": "Potential ADA Clearance Issue at Lounge Sink (SK-1)", "background": "The plumbing fixture schedule on P01.01 specifies sink SK-1 as a 'self-rimming' model for an ADA application in the Lounge. A standard cabinet installation for this type of sink would obstruct the required knee and toe clearances per ADA 606.2 and 306.", "question": "Please provide an architectural detail or elevation of the SK-1 installation demonstrating compliance with ADA knee and toe clearance requirements. Confirm an open-front cabinet or cantilevered counter is intended.", "sheets_referenced": ["P01.01", "P02.01"], "disciplines_to_respond": ["Plumbing", "Architectural"], "suggested_response_needed": "Response required prior to bid submission.", "priority": "high"}, {"rfi_id": "CBI-007", "issue_id": "CBI-007", "title": "Undefined Support for Wall-Mounted Network Rack", "background": "A wall-mounted network 'RACK SYSTEM' is indicated in the Inventory Room on sheet A24.01. The note 'COORDINATE WITH TENANT FOR PLYWOOD BACKING' is insufficient for construction. The size, thickness, fire-rating, and attachment method for the backing are undefined.", "question": "Please provide a detail specifying the plywood backing requirements (dimensions, rating) and the engineered method for fastening it to the wall structure to adequately support the anticipated load.", "sheets_referenced": ["A24.01"], "disciplines_to_respond": ["Architectural", "Structural"], "suggested_response_needed": "Response required prior to construction.", "priority": "medium"}, {"rfi_id": "DEDUP-05", "issue_id": "DEDUP-05", "title": "Conflicting Restroom Floor Finish Specification", "background": "The drawings show conflicting floor finishes for the restrooms. The Finish Plan on A23.01 specifies 'PC-2 POLISHED CONCRETE' for the restrooms. The Typical Restroom Elevation (Detail 3/A51.01) clearly calls out 'TILE FLOOR'.", "question": "Please clarify the intended floor finish for the restrooms and revise all drawings (plans, elevations, schedules) for consistency.", "sheets_referenced": ["A23.01", "A51.01"], "disciplines_to_respond": ["Architectural"], "suggested_response_needed": "Response required prior to bid submission.", "priority": "high"}, {"rfi_id": "DEDUP-09", "issue_id": "DEDUP-09", "title": "Conflicting Fire Rating in Hollow Metal Door Specification", "background": "The specification for hollow metal doors on sheet G31.04 contains conflicting requirements for fire ratings. Per the description, one paragraph requires a 90-minute rating, while another specifies a 1-hour label for doors in 1-hour rated corridors.", "question": "Please clarify the required fire-ratings for hollow metal doors and revise the specification on sheet G31.04 to be consistent. This should be coordinated with the door schedule and partition types once they are provided.", "sheets_referenced": ["G31.04"], "disciplines_to_respond": ["Architectural"], "suggested_response_needed": "Response required prior to bid submission.", "priority": "high"}, {"rfi_id": "DEDUP-07", "issue_id": "DEDUP-07", "title": "Conflicting Firestopping Specifications", "background": "There are conflicting requirements for firestopping penetrations. Electrical detail 4/E05.01 prescriptively requires '3 HOUR RATED CAULK'. However, general specifications on G31.04 and plumbing notes on P01.01 correctly require UL-listed firestopping assemblies to have a rating that matches the element being penetrated.", "question": "Please revise detail 4/E05.01 to remove the prescriptive '3 HOUR RATED' requirement and instead direct the use of a UL-listed assembly with a rating matching the penetrated assembly, consistent with notes on G31.04 and P01.01.", "sheets_referenced": ["G31.04", "P01.01", "E05.01"], "disciplines_to_respond": ["General", "Plumbing", "Electrical", "Architectural"], "suggested_response_needed": "Response required prior to construction.", "priority": "medium"}, {"rfi_id": "DEDUP-08", "issue_id": "DEDUP-08", "title": "Inconsistent Project Scope Description", "background": "The project scope is described inconsistently. Sheet G11.04 describes it as a 'LEASE SPACE BUILD OUT FOR A FIRST GENERATION RETAIL SPACE.' Sheet G21.01 describes it as a 'TENANT INTERIOR REMODEL.' This affects the assumed existing conditions and demolition scope.", "question": "Please clarify if this project is a remodel of an existing space or a build-out of a first-generation shell space and revise all project descriptions for consistency.", "sheets_referenced": ["G11.04", "G21.01"], "disciplines_to_respond": ["General", "Architectural"], "suggested_response_needed": "Response required prior to bid submission.", "priority": "high"}] \ No newline at end of file diff --git a/backend/.llm_cache/c618885683a5c93e308d2ff2662e712c6e9f6e206a732c4280a7580d7f8f6cd7.json b/backend/.llm_cache/c618885683a5c93e308d2ff2662e712c6e9f6e206a732c4280a7580d7f8f6cd7.json new file mode 100644 index 0000000..9b7efb3 --- /dev/null +++ b/backend/.llm_cache/c618885683a5c93e308d2ff2662e712c6e9f6e206a732c4280a7580d7f8f6cd7.json @@ -0,0 +1 @@ +{"normalized_assertions": [{"assertion_id": "G11.04#5", "original_value": "1", "normalized_value": 1, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a numeric integer.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.04#6", "original_value": "30'-0\"", "normalized_value": 360, "normalized_unit": "in", "normalized_attribute": null, "normalization_notes": "Converted feet and inches to inches.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G11.04#7", "original_value": "2402160146", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is an identifier and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G11.04#8", "original_value": "2311220004", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is an identifier and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G11.04#9", "original_value": "PROJECT IS A TENANT INTERIOR LEASE SPACE BUILD OUT FOR A FIRST GENERATION RETAIL SPACE. THE SCOPE OF WORK CONSISTS OF NEW CEILINGS, FLOORING, FINISHES, NONSTRUCTURAL WALLS, ELECTRICAL, MECHANICAL AND PLUMBING", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive text and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G11.04#10", "original_value": "OCC. CLASS M, AREA SPECIFIC USE Mercantile, GROSS SF 3,323, SF PER OCC. 60, DESIGN OCC. 56", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Complex string with multiple distinct values; not suitable for scalar normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G11.04#11", "original_value": "2", "normalized_value": 2, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a numeric integer.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G21.01#0", "original_value": "INVENTORY", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a name and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G21.01#1", "original_value": "LOUNGE", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a name and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G21.01#2", "original_value": "MEN'S RESTROOM", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a name and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G21.01#3", "original_value": "WOMEN'S RESTROOM", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a name and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G21.01#4", "original_value": "MANAGER'S OFFICE", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a name and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G21.01#5", "original_value": "CLEANING SUPPLIES/STORAGE", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a name and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G21.01#6", "original_value": "SALES AREA", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a name and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G21.01#7", "original_value": "AUTHORITY HAVING JURISDICTION: HARRIS COUNTY", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive text and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G21.01#8", "original_value": "AUTHORITY HAVING JURISDICTION (ACCESSIBILITY): STATE OF TEXAS", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive text and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G21.01#9", "original_value": "2018 INTERNATIONAL BUILDING CODE (IBC) CH. 2-10 WITH HARRIS COUNTY AMENDMENTS", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive text and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G21.01#10", "original_value": "2021 INTERNATIONAL FIRE CODE (IFC) WITH HARRIS COUNTY AMENDMENTS", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive text and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G21.01#11", "original_value": "2021 STATE OF TEXAS ADOPTED INTERNATIONAL MECHANICAL CODE (IMC)", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive text and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G21.01#12", "original_value": "2018 STATE OF TEXAS ADOPTED INTERNATIONAL PLUMBING CODE (IPC)", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive text and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G21.01#13", "original_value": "2023 STATE OF TEXAS ADOPTED 2014 NFPA 70 NATIONAL ELECTRICAL CODE (NEC)", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive text and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G21.01#14", "original_value": "2012 TEXAS ACCESSIBILITY STANDARDS", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive text and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G21.01#15", "original_value": "PROJECT IS A TENANT INTERIOR REMODEL OF 3,323 SF", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive text and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G21.01#16", "original_value": "THE BUILDING IS FULLY SPRINKLERED", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive text and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G31.01#0", "original_value": "Ten (10) copies required for submittal.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive text and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G31.01#1", "original_value": "In case of discrepancies, the contractor shall provide the better quality or greater quantity of work at no additional cost.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive text and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G31.01#2", "original_value": "One electronic copy in PDF format required for submittal.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive text and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G31.01#3", "original_value": "Architect review time for submittals is 7 calendar days.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive text; numeric value was not extracted as a specific attribute.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G31.01#4", "original_value": "Add an additional seven (7) calendar days for sequential review by consultants or owner.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive text; numeric value was not extracted as a specific attribute.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G31.02#0", "original_value": "Conduct selective demolition so Owner's operations are not disrupted.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive text and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G31.02#1", "original_value": "A report on the presence of hazardous materials is on file for review and use.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive text and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G31.02#2", "original_value": "Refrigerant Recovery Technician must be certified by an EPA-approved certification program.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a requirement and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G31.02#3", "original_value": "Comply with ASSE A10.6 and NFPA 241.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive text and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G31.02#4", "original_value": "Provide extensions to existing utilities including plumbing, fire protection, electrical, and telecommunications.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a requirement and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G31.02#5", "original_value": "Seal voids at penetrations of fire-rated construction with fire rated material in accordance with Section 07 8400.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a requirement and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G31.02#6", "original_value": "01 3300", "normalized_value": "013300", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "CSI MasterFormat number normalized to remove space.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.02#7", "original_value": "01 7000", "normalized_value": "017000", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "CSI MasterFormat number normalized to remove space.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.02#8", "original_value": "Record measured depths of foundations in relation to finish first floor datum.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a requirement and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G31.02#9", "original_value": "Record measured horizontal and vertical locations of underground utilities and appurtenances.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a requirement and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G31.02#10", "original_value": "Record measured locations of internal utilities and appurtenances concealed in construction.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a requirement and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G31.02#11", "original_value": "1-1/2 inch, 2 inch maximum", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value contains multiple distinct dimension values; not suitable for scalar normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G31.03#0", "original_value": "Owner will occupy adjacent spaces during construction.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive text and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G31.03#1", "original_value": "Minimum of five years experience with related thin masonry installations.", "normalized_value": 5, "normalized_unit": "years", "normalized_attribute": "experience_duration", "normalization_notes": "Extracted minimum duration from descriptive text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.03#2", "original_value": "Test reports shall indicate 24-hour cold water absorption, 5-hour boil absorption, saturation coefficient, initial rate of absorption, and efflorescence.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive list and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G31.03#3", "original_value": "48\" LONG BY 48\"", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Dimension format is ambiguous for scalar normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G31.03#4", "original_value": "L/360", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is in a standard format and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G31.03#5", "original_value": "Minimum of 3 years experience in high quality non ferrous ornamental metal work.", "normalized_value": 3, "normalized_unit": "years", "normalized_attribute": "experience_duration", "normalization_notes": "Extracted minimum duration from descriptive text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.03#6", "original_value": "ASTM B221", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is an identifier and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G31.03#7", "original_value": "ASTM A1008", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is an identifier and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G31.03#8", "original_value": "Coordinate with foundation of wall panels, ceiling panels and trim specified in Section 064000.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a requirement and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G31.03#9", "original_value": "Shop applied polyester or fluoropolymer powder coat finish system with added inhibitors for exterior locations.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive text and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G31.04#0", "original_value": "North American Architectural Woodwork Standards (NAAWS), current edition", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is an identifier and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G31.04#1", "original_value": "Use fire-retardant treated MDF core for panel fabrication unless indicated otherwise.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive text and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G31.04#2", "original_value": "1/16", "normalized_value": 0.0625, "normalized_unit": "in", "normalized_attribute": null, "normalization_notes": "Converted fractional value to decimal. Unit 'inch' inferred from source text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#3", "original_value": "1/32", "normalized_value": 0.03125, "normalized_unit": "in", "normalized_attribute": null, "normalization_notes": "Converted fractional value to decimal. Unit 'inch' inferred from source text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#4", "original_value": "10", "normalized_value": 10, "normalized_unit": "years", "normalized_attribute": null, "normalization_notes": "Unit 'years' inferred from source text '10 YEAR WARRANTY'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "G31.04#5", "original_value": "1/8 inch in 10 feet, noncumulative", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Complex tolerance (ratio) is not suitable for scalar normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G31.04#6", "original_value": "plus or minus 1/16", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value includes a range ('plus or minus') and is not suitable for scalar normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G31.04#7", "original_value": "ASTM E119 or UL 263", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value lists multiple alternative standards; not suitable for scalar normalization.", "source_text_preserved": true, "normalization_confidence": null}, {"assertion_id": "G31.04#8", "original_value": "UL Assemblies", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is an identifier and does not require normalization.", "source_text_preserved": true, "normalization_confidence": null}]} \ No newline at end of file diff --git a/backend/.llm_cache/c63987fd07e93521b384fb13f6287f91046a5b063ceb70c7283e5f6f117752d4.json b/backend/.llm_cache/c63987fd07e93521b384fb13f6287f91046a5b063ceb70c7283e5f6f117752d4.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/c63987fd07e93521b384fb13f6287f91046a5b063ceb70c7283e5f6f117752d4.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/c65379485b783a7658fa67f9e4301854966b104f5adc5a6ff4708fc31d09631d.json b/backend/.llm_cache/c65379485b783a7658fa67f9e4301854966b104f5adc5a6ff4708fc31d09631d.json new file mode 100644 index 0000000..679528a --- /dev/null +++ b/backend/.llm_cache/c65379485b783a7658fa67f9e4301854966b104f5adc5a6ff4708fc31d09631d.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "piping_vent_size_discrepancy_01", "category": "dimensional_disagreement", "severity": "medium", "confidence": "high", "location": "Sink Vent Piping (SK-1, SK-2, LAV-1, UR-1)", "disciplines": ["Plumbing"], "sheets": ["P02.01", "P03.01"], "description": "The vent pipe size is shown as 2 inches on the Sanitary Waste & Vent Plan (P02.01) for the main vent branch serving the fixtures, but is shown as 1 1/2 inches on the typical piping riser diagram (P03.01). The correct size needs to be confirmed and drawings coordinated for proper material procurement and installation.", "evidence": [{"discipline": "Plumbing", "sheet": "P02.01", "source_text": "2\"V", "asserted_value": "2 inch vent"}, {"discipline": "Plumbing", "sheet": "P03.01", "source_text": "1 1/2\"V", "asserted_value": "1 1/2 inch vent"}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/c68a7d42678dfba9a9c4e87ae5f39b050c539925467f587ec73769443a1a6eef.json b/backend/.llm_cache/c68a7d42678dfba9a9c4e87ae5f39b050c539925467f587ec73769443a1a6eef.json new file mode 100644 index 0000000..eabf00e --- /dev/null +++ b/backend/.llm_cache/c68a7d42678dfba9a9c4e87ae5f39b050c539925467f587ec73769443a1a6eef.json @@ -0,0 +1 @@ +{"issues": [{"issue_id": "QAQC-MS-001", "source_stage": "qaqc", "category": "missing_sheet", "severity": "critical", "confidence": "high", "location": "Architectural Series (A2x.xx)", "disciplines": ["Architectural"], "sheets": [], "description": "The primary architectural floor plan, likely numbered A21.01, is missing from the set. This plan is fundamental for showing new partition layouts, overall dimensions, room tags, and wall type references. Without it, the basis for all other architectural and consultant plans (RCP, Finish, MEP, etc.) is absent, making it impossible to bid or build the project accurately.", "evidence": [{"discipline": "System", "sheet": "sheet_index", "source_text": "Logical gap in architectural plan numbering (likely A21.01) before A22.01. Page 14 extraction failed in this location. A floor plan is fundamental to a drawing set.", "asserted_value": "Missing A21.01"}], "recommended_resolution": "Include the missing architectural floor plan sheet (A21.01) in the drawing set.", "code_reference": null}, {"issue_id": "QAQC-MS-002", "source_stage": "qaqc", "category": "missing_sheet", "severity": "critical", "confidence": "high", "location": "Mechanical Series (M02.xx)", "disciplines": ["Mechanical"], "sheets": [], "description": "The primary mechanical floor plan, likely numbered M02.01, is missing. The set includes a Mechanical Roof Plan (M02.02) but not the corresponding interior plan showing ductwork layout, diffusers, thermostats, and equipment locations for the tenant space. This is a critical omission for MEP coordination, bidding, and installation.", "evidence": [{"discipline": "System", "sheet": "sheet_index", "source_text": "Logical gap in mechanical plan numbering (likely M02.01) before M02.02. Page 22 extraction failed in this location. A main level mechanical plan is expected.", "asserted_value": "Missing M02.01"}], "recommended_resolution": "Include the missing mechanical floor plan sheet (M02.01) in the drawing set.", "code_reference": null}, {"issue_id": "QAQC-MS-003", "source_stage": "qaqc", "category": "missing_schedule", "severity": "critical", "confidence": "high", "location": "Architectural / General Sheets", "disciplines": ["Architectural", "General"], "sheets": ["G11.01", "G31.06"], "description": "The drawing set lacks essential schedules for bidding and construction, including a Partition Type/Wall Schedule and a Door Schedule. Notes reference 'partition type as scheduled' (G11.01 Note 25D) and hardware is specified (G31.04), but wall assemblies and door details (sizes, types, ratings, hardware groups) are not defined anywhere. This makes it impossible to price or build the interior partitions and doors.", "evidence": [{"discipline": "General", "sheet": "G11.01", "source_text": "Dimensions shown on drawings shall be to the face of sheathing of partition type as scheduled, unless otherwise noted.", "asserted_value": "A partition schedule is implied but not provided."}, {"discipline": "General", "sheet": "G31.04", "source_text": "WHERE REQUIRED, INSTALLED FRAME AND DOOR ASSEMBLY SHALL CONFORM TO A 90 MINUTE RATED CLASS C INDICATED.", "asserted_value": "Door fire ratings are specified, implying multiple door types, but no schedule indicates where they are used."}], "recommended_resolution": "Create and add a comprehensive Partition Type / Wall Schedule with details/sections and a full Door and Frame Schedule with associated hardware sets.", "code_reference": null}, {"issue_id": "QAQC-MI-001", "source_stage": "qaqc", "category": "missing_information", "severity": "critical", "confidence": "high", "location": "A22.01 - REFLECTED CEILING PLAN", "disciplines": ["Architectural", "Mechanical", "Electrical", "Plumbing"], "sheets": ["A22.01", "G11.01"], "description": "No finished ceiling heights are indicated anywhere in the drawing set. General Note 24 on G11.01 states that ceiling heights are indicated, but the Reflected Ceiling Plan (A22.01) does not show them. This is a critical omission that impacts all disciplines, preventing coordination of wall heights, MEP service routing, lighting placement, and overall space volume.", "evidence": [{"discipline": "Architectural", "sheet": "A22.01", "source_text": "CEILING THROUGHOUT ENTIRE SPACE TO BE AT-1 ACOUSTIC CEILING TILE", "asserted_value": "Ceiling material is specified, but height is not."}, {"discipline": "General", "sheet": "G11.01", "source_text": "Ceiling heights are indicated from the floor elevation to the face of the suspended ceiling system or face of finish material as scheduled.", "asserted_value": "Note states heights are indicated, but they are not present on the plan."}], "recommended_resolution": "Add ceiling height tags to all rooms or areas with suspended ceilings on the Reflected Ceiling Plan (A22.01).", "code_reference": null}, {"issue_id": "QAQC-MS-004", "source_stage": "qaqc", "category": "missing_sheet", "severity": "high", "confidence": "high", "location": "Structural Series (S)", "disciplines": ["Structural", "Architectural", "Mechanical"], "sheets": ["A25.01", "M01.01", "E05.02"], "description": "There are no Structural ('S') drawings in the set. The scope includes new rooftop units (RTUs) per sheets A25.01 and M01.01, and suspended transformers per E05.02 detail. Installation of this equipment requires structural analysis of the existing roof/structure, and design of new curbs, dunnage, and/or structural supports. Bidding and permitting cannot proceed without structural drawings or, at a minimum, a structural engineer's review letter and details.", "evidence": [{"discipline": "Mechanical", "sheet": "M01.01", "source_text": "DESCRIPTION ROOFTOP A/C UNIT...WEIGHT (LBS) 711", "asserted_value": "New rooftop equipment with significant weight is part of the scope."}, {"discipline": "Architectural", "sheet": "A25.01", "source_text": "NEW RTU, PROVIDE NEW MECHANICAL ROOF CURBS AS NECESSARY TO ACCOMODATE NEW RTU.", "asserted_value": "New roof curbs require structural coordination."}, {"discipline": "Electrical", "sheet": "E05.02", "source_text": "VERIFY SUPPORT SIZING AND DESIGNED WITH PROJECT STRUCTURAL ENGINEER PRIOR TO ASSEMBLY.", "asserted_value": "Note explicitly requires coordination with a project structural engineer, but no structural engineer is listed and no S-drawings are provided."}], "recommended_resolution": "Engage a structural engineer and incorporate structural drawings and details for all new equipment supports, penetrations, and structural modifications. Add the structural discipline to the sheet index.", "code_reference": null}, {"issue_id": "QAQC-PR-001", "source_stage": "qaqc", "category": "permit_readiness", "severity": "high", "confidence": "high", "location": "Life Safety Systems", "disciplines": ["Fire Protection", "Electrical"], "sheets": ["G11.03", "A22.01", "E04.01"], "description": "The drawing set lacks dedicated Fire Sprinkler and Fire Alarm plans. New sprinkler heads and fire alarm strobes are shown on the architectural RCP (A22.01), but there are no system plans showing full device layouts, pipe/wire routing, specifications, or calculations. These plans are almost universally required for obtaining a building permit. The set should either include these plans or explicitly state that they are a deferred submittal to be provided by the respective licensed contractors.", "evidence": [{"discipline": "Architectural", "sheet": "A22.01", "source_text": "INSTALL NEW SPRINKLER HEADS AND LIGHT FIXTURES AT THE CENTER OF THE ACOUSTICAL CEILING PANEL U.N.O.", "asserted_value": "New sprinkler heads are in scope."}, {"discipline": "Architectural", "sheet": "A22.01", "source_text": "ALL WALL STROBES SHALL BE LOCATED @ +80\" AFF", "asserted_value": "New fire alarm devices are in scope."}, {"discipline": "General", "sheet": "G11.03", "source_text": "TENANT IS REQUIRED TO USE LANDLORD'S FIRE ALARM MONITORING COMPANY TO CONNECT TENANT'S SYSTEM TO LANDLORD'S FIRE ALARM PANEL.", "asserted_value": "A tenant fire alarm system is required."}], "recommended_resolution": "Provide dedicated fire sprinkler and fire alarm plans, including device layouts, riser diagrams, and specifications, or add a note to the General and Life Safety sheets stating that these systems will be provided as deferred submittals.", "code_reference": null}, {"issue_id": "QAQC-MD-001", "source_stage": "qaqc", "category": "missing_detail", "severity": "high", "confidence": "high", "location": "A24.01 / Note G", "disciplines": ["Architectural"], "sheets": ["A24.01"], "description": "Sheet A24.01 (Furniture/Power/Data Plan) contains Note G, which directs the user to 'Refer to detail 3/A92.01 for foundation pour back detail'. Sheet A92.01 does not exist in the drawing set. This is a reference to a missing, critical construction detail required for any slab-on-grade trenching and patching.", "evidence": [{"discipline": "Architectural", "sheet": "A24.01", "source_text": "G. REFER TO DETAIL 3/A92.01 FOR FOUNDATION POUR BACK DETAIL WHERE EXISTING SLAB IS CUT.", "asserted_value": "3/A92.01"}], "recommended_resolution": "Provide sheet A92.01 with the required foundation pour back detail or correct the reference to point to an existing detail.", "code_reference": null}, {"issue_id": "QAQC-CL-001", "source_stage": "qaqc", "category": "clarity", "severity": "high", "confidence": "high", "location": "A51.01 - Typical Restroom Details", "disciplines": ["Architectural", "Plumbing"], "sheets": ["A51.01"], "description": "Accessibility information shown on the enlarged restroom details on A51.01 contains a direct contradiction. In the lavatory (L-1) detail, two conflicting dimensions are provided for toe clearance: '9\" MIN. TOE CLEAR' and '6\" MAX. TOE CLEAR'. This makes it impossible for the contractor to build a compliant condition and poses a significant permit and inspection risk.", "evidence": [{"discipline": "Architectural", "sheet": "A51.01", "source_text": "9\" MIN. TOE CLEAR", "asserted_value": "9\" MINIMUM"}, {"discipline": "Architectural", "sheet": "A51.01", "source_text": "6\" MAX. TOE CLEAR", "asserted_value": "6\" MAXIMUM"}], "recommended_resolution": "Correct the lavatory detail on sheet A51.01 to show a single, compliant dimension range for toe clearance per the applicable accessibility code (2012 TAS).", "code_reference": null}, {"issue_id": "QAQC-MS-005", "source_stage": "qaqc", "category": "missing_sheet", "severity": "medium", "confidence": "high", "location": "Architectural Series (Exterior Elevations)", "disciplines": ["Architectural"], "sheets": ["A22.01", "A51.01"], "description": "The drawing set lacks exterior building elevations. While this might be acceptable for a purely interior scope, a note on the RCP (A22.01) states 'PROVIDE POWER FOR BUILDING SIGN', indicating new exterior signage is part of the work. Exterior elevations are required to define the location, size, materials, and mounting specifications for the new sign to ensure landlord and permitting authority approval.", "evidence": [{"discipline": "Architectural", "sheet": "A22.01", "source_text": "PROVIDE POWER FOR BUILDING SIGN", "asserted_value": "New exterior signage is in scope."}, {"discipline": "Architectural", "sheet": "A51.01", "source_text": "ELEVATIONS, ENLARGED PLANS, & DETAILS", "asserted_value": "Sheet is titled 'ELEVATIONS' but contains only interior details, not building elevations."}], "recommended_resolution": "Add exterior elevation sheets to the drawing set, clearly indicating the design and placement of the new building sign.", "code_reference": null}, {"issue_id": "QAQC-BR-001", "source_stage": "qaqc", "category": "bid_readiness", "severity": "medium", "confidence": "high", "location": "A23.01 - FINISH PLAN", "disciplines": ["Interiors"], "sheets": ["A23.01"], "description": "The finish documentation is incomplete. While a Finish Plan with material tags is provided, a comprehensive Room Finish Schedule in a matrix format is missing. Notes like 'PC-1 throughout, U.N.O.' create ambiguity for rooms like restrooms which typically have different finishes. A room-by-room schedule is standard practice to eliminate guesswork, reduce bidder risk, and prevent change orders.", "evidence": [{"discipline": "Interiors", "sheet": "A23.01", "source_text": "K. POLISHED CONCRETE FLOOR PC-1 THROUGHOUT, U.N.O.", "asserted_value": "A general note is used in place of specific room-by-room designation."}, {"discipline": "Interiors", "sheet": "A23.01", "source_text": "L. WALLS TO BE PAINTED P-1 THROUGHOUT.", "asserted_value": "A general note is used for all walls, which may not be accurate for wet areas or accent walls."}], "recommended_resolution": "Add a Room Finish Schedule that lists every room number and name, and clearly specifies the floor, base, wall (with different specifications for each wall if needed), and ceiling finish for each.", "code_reference": null}]} \ No newline at end of file diff --git a/backend/.llm_cache/c7981f8456cb858d2140ba96dd46cb7bee60645df18228f4e8225620c4c08b99.json b/backend/.llm_cache/c7981f8456cb858d2140ba96dd46cb7bee60645df18228f4e8225620c4c08b99.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/c7981f8456cb858d2140ba96dd46cb7bee60645df18228f4e8225620c4c08b99.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/c832a3bb30429d839326e47a32b30f097bf9a4eb46db8cfbf015a125201e6811.json b/backend/.llm_cache/c832a3bb30429d839326e47a32b30f097bf9a4eb46db8cfbf015a125201e6811.json new file mode 100644 index 0000000..2627f99 --- /dev/null +++ b/backend/.llm_cache/c832a3bb30429d839326e47a32b30f097bf9a4eb46db8cfbf015a125201e6811.json @@ -0,0 +1 @@ +{"sheet_number": "G11.04", "discipline": "General", "sheet_title": "FIRE CODE DESIGN AND COMPLIANCE REVIEW", "level": null, "scale": null, "assertions": [{"subject": "Project", "attribute": "scope_of_work", "value": "Lease Space Build-out (LSBO)", "source_text": "X LEASE SPACE BUILD-OUT (LSBO)", "confidence": "high", "location_key": {"grid": null, "room": "1 BUILDING PLANNING & DESCRIPTION", "level": null, "tag": null}}, {"subject": "Building", "attribute": "occupancy_separation", "value": "Single Occupancy", "source_text": "X SINGLE OCCUPANCY", "confidence": "high", "location_key": {"grid": null, "room": "1 BUILDING PLANNING & DESCRIPTION", "level": null, "tag": null}}, {"subject": "Building", "attribute": "height_limitation", "value": "75", "source_text": "HEIGHT LIMITATION: 75'", "confidence": "high", "location_key": {"grid": null, "room": "1 BUILDING PLANNING & DESCRIPTION", "level": null, "tag": null}}, {"subject": "Building", "attribute": "area_limitation", "value": "UNLIMITED", "source_text": "AREA LIMITATION: UNLIMITED (TABLES 504.3, 504.4, 506.2 IBC 2021)", "confidence": "high", "location_key": {"grid": null, "room": "1 BUILDING PLANNING & DESCRIPTION", "level": null, "tag": null}}, {"subject": "Project", "attribute": "address", "value": "7022 ELYSON EXCHANGE WAY CYPRESS, TX 77433", "source_text": "ADDRESS: 7022 ELYSON EXCHANGE WAY CITY, ST: CYPRESS, TX ZIP CODE: 77433", "confidence": "high", "location_key": {"grid": null, "room": "1 BUILDING PLANNING & DESCRIPTION", "level": null, "tag": null}}, {"subject": "Building", "attribute": "number_of_floors", "value": "1", "source_text": "# OF FLOORS: 1", "confidence": "high", "location_key": {"grid": null, "room": "1 BUILDING PLANNING & DESCRIPTION", "level": null, "tag": null}}, {"subject": "Building", "attribute": "building_height", "value": "30'-0\"", "source_text": "HEIGHT: 30'-0\"", "confidence": "high", "location_key": {"grid": null, "room": "1 BUILDING PLANNING & DESCRIPTION", "level": null, "tag": null}}, {"subject": "Project", "attribute": "shell_building_permit_number", "value": "2402160146", "source_text": "SHELL BUILDING PERMIT #: 2402160146", "confidence": "high", "location_key": {"grid": null, "room": "1 BUILDING PLANNING & DESCRIPTION", "level": null, "tag": null}}, {"subject": "Project", "attribute": "civil_project_number", "value": "2311220004", "source_text": "CIVIL PROJECT #: 2311220004", "confidence": "high", "location_key": {"grid": null, "room": "1 BUILDING PLANNING & DESCRIPTION", "level": null, "tag": null}}, {"subject": "Project", "attribute": "project_description", "value": "PROJECT IS A TENANT INTERIOR LEASE SPACE BUILD OUT FOR A FIRST GENERATION RETAIL SPACE. THE SCOPE OF WORK CONSISTS OF NEW CEILINGS, FLOORING, FINISHES, NONSTRUCTURAL WALLS, ELECTRICAL, MECHANICAL AND PLUMBING", "source_text": "PROJECT IS A TENANT INTERIOR LEASE SPACE BUILD OUT FOR A FIRST GENERATION RETAIL SPACE. THE SCOPE OF WORK CONSISTS OF NEW CEILINGS, FLOORING, FINISHES, NONSTRUCTURAL WALLS, ELECTRICAL, MECHANICAL AND PLUMBING", "confidence": "high", "location_key": {"grid": null, "room": "1 BUILDING PLANNING & DESCRIPTION", "level": null, "tag": null}}, {"subject": "Occupancy Load Calculation", "attribute": "schedule_entry", "value": "OCC. CLASS M, AREA SPECIFIC USE Mercantile, GROSS SF 3,323, SF PER OCC. 60, DESIGN OCC. 56", "source_text": "OCC. CLASS M, AREA SPECIFIC USE MERCANTILE, GROSS SF 3,323, SF PER OCC. 60, DESIGN OCC. 56", "confidence": "high", "location_key": {"grid": null, "room": "2 OCCUPANCY TYPE AND LOAD", "level": null, "tag": null}}, {"subject": "Egress", "attribute": "required_exit_count", "value": "2", "source_text": "# OF REQUIRED EXITS 2", "confidence": "high", "location_key": {"grid": null, "room": "3 MEANS OF EGRESS", "level": null, "tag": null}}]} \ No newline at end of file diff --git a/backend/.llm_cache/c9b8c40b6adedaf1c65583b0b41d70cd567b84277b847564f971fb77f2edb2f2.json b/backend/.llm_cache/c9b8c40b6adedaf1c65583b0b41d70cd567b84277b847564f971fb77f2edb2f2.json new file mode 100644 index 0000000..52718a1 --- /dev/null +++ b/backend/.llm_cache/c9b8c40b6adedaf1c65583b0b41d70cd567b84277b847564f971fb77f2edb2f2.json @@ -0,0 +1 @@ +{"issues": [{"issue_id": "Verizon-Elyson-ADA-001", "source_stage": "code", "category": "ada", "severity": "medium", "confidence": "high", "location": "INVENTORY room", "disciplines": ["Architectural", "Electrical"], "sheets": ["A24.01"], "description": "Outlets in the Inventory room are specified at 60 inches above the finished floor. The maximum forward reach height for operable parts, including electrical outlets, on accessible routes is 48 inches. While this space may be considered an \"Employee Work Area\" which has some exemptions under ADA 203.9, mounting controls outside standard reach ranges can create barriers for employees with disabilities and may require future modification as a reasonable accommodation.", "evidence": [{"discipline": "Architectural", "sheet": "A24.01", "source_text": "(2) 20A, OUTLETS AT 60\" A.F.F.", "asserted_value": "60"}], "recommended_resolution": "Revise outlet mounting height to a maximum of 48 inches above finished floor to comply with standard accessible design practices (ADA Section 308) and avoid potential future accommodation issues.", "code_reference": "ADA 205.1"}, {"issue_id": "Verizon-Elyson-ADA-002", "source_stage": "code", "category": "ada", "severity": "medium", "confidence": "high", "location": "SALES AREA, MANAGER'S OFFICE", "disciplines": ["Architectural"], "sheets": ["A23.01"], "description": "The finish specification for carpet tile (CPT1) on sheet A23.01 does not specify the pile height. To be compliant with accessibility standards for floor surfaces, the carpet pile height must not exceed 1/2 inch.", "evidence": [{"discipline": "Architectural", "sheet": "A23.01", "source_text": "MANUF: SHAW PRODUCT: NEXT GEN 2.0, VERIZON STANDARD... SIZE: 24\" X 24\" INSTALLATION: ASHLAR STACK PATTERN 50% OFFSET LOCATION: SALES AREA, MANAGER'S OFFICE", "asserted_value": "CPT1"}], "recommended_resolution": "Update the CPT1 specification on the drawings to include a maximum pile height of 1/2 inch to comply with accessibility requirements.", "code_reference": "ADA 302.2"}, {"issue_id": "Verizon-Elyson-CODE-001", "source_stage": "code", "category": "building_code", "severity": "low", "confidence": "high", "location": "Sheet A23.01 General Notes", "disciplines": ["Architectural"], "sheets": ["A23.01"], "description": "A note on the Finish Plan references the 2021 International Building Code (IBC) for interior finish requirements. However, the project's adopted code, as per the project profile, is the 2015 IBC. All code references should be consistent with the jurisdiction's adopted codes.", "evidence": [{"discipline": "Architectural", "sheet": "A23.01", "source_text": "INTERIOR FINISHES TO COMPLY WITH IBC CLASS C OR HIGHER SECTION 803.9 AND TABLE 803.9 OF 2021 IBC.", "asserted_value": "2021 IBC"}], "recommended_resolution": "Revise the note to reference the applicable sections of the 2015 IBC.", "code_reference": null}, {"issue_id": "Verizon-Elyson-CODE-002", "source_stage": "code", "category": "building_code", "severity": "low", "confidence": "high", "location": "Sheet A23.01 General Notes", "disciplines": ["Architectural"], "sheets": ["A23.01"], "description": "A note on the Finish Plan references \"ASTM 834\" for the classification of interior finish and trim materials. The correct standard for testing surface burning characteristics is ASTM E84. Using an incorrect standard reference could lead to improper material selection or submittals.", "evidence": [{"discipline": "Architectural", "sheet": "A23.01", "source_text": "ALL MATERIALS USED FOR INTERIOR FINISH AND TRIM SHALL BE CLASSIFIED IN ACCORDANCE WITH ASTM 834.", "asserted_value": "ASTM 834"}], "recommended_resolution": "Revise the note to reference the correct standard, ASTM E84.", "code_reference": null}, {"issue_id": "Verizon-Elyson-ADA-003", "source_stage": "code", "category": "ada", "severity": "medium", "confidence": "high", "location": "All areas with polished concrete (PC1), including CORRIDOR and RESTROOMS", "disciplines": ["Architectural"], "sheets": ["A23.01"], "description": "The specification for polished concrete (PC1) requires a minimum Static Coefficient of Friction (SCOF) of 0.50. This is an outdated standard for measuring slip resistance. Current ADA guidelines require accessible routes to be slip-resistant. The current industry standard is ANSI A326.3, which measures Dynamic Coefficient of Friction (DCOF) and is more appropriate for ensuring safety, especially in areas like restrooms that can become wet.", "evidence": [{"discipline": "Architectural", "sheet": "A23.01", "source_text": "SLIP RESISTANCE OF FLOOR TO BE NO LESS THAN A 0.50 STATIC COEFFICIENT OF FRICTION (SCOF)", "asserted_value": "0.50"}], "recommended_resolution": "Revise the floor finish specification to require compliance with current slip resistance standards, such as requiring a DCOF of 0.42 or greater per ANSI A326.3 for level interior spaces expected to be walked upon when wet.", "code_reference": null}, {"issue_id": "Verizon-Elyson-ADA-004", "source_stage": "code", "category": "ada", "severity": "low", "confidence": "high", "location": "INVENTORY room", "disciplines": ["Architectural"], "sheets": ["A24.01"], "description": "The network rack system in the Inventory room is noted to be mounted with its bottom at approximately 74 inches above the floor. While this is in an employee work area subject to exceptions under ADA 203.9, mounting equipment that requires employee operation at this height may pose a barrier for individuals with disabilities and could trigger future reasonable accommodation requirements.", "evidence": [{"discipline": "Architectural", "sheet": "A24.01", "source_text": "RACK SYSTEM ABOVE SAFE @ ~74\" TO BOTTOM", "asserted_value": "74"}], "recommended_resolution": "Review the operational requirements of the rack system. If regular access by general employees is needed, consider lowering the rack system so that operable parts are within accessible reach ranges (generally not exceeding 48 inches AFF).", "code_reference": "ADA 203.9"}]} \ No newline at end of file diff --git a/backend/.llm_cache/cb9c0fab25d4b49368412b625ab9d8c633f2190c988ea8dd0556ec37738a5442.json b/backend/.llm_cache/cb9c0fab25d4b49368412b625ab9d8c633f2190c988ea8dd0556ec37738a5442.json new file mode 100644 index 0000000..01c914c --- /dev/null +++ b/backend/.llm_cache/cb9c0fab25d4b49368412b625ab9d8c633f2190c988ea8dd0556ec37738a5442.json @@ -0,0 +1 @@ +[{"assertion_id": "A23.01#11", "attribute": "keynote_assertion", "value": "Ceiling Tile Grid C4 A: Armstrong ULTIMA 1910, 24\" X 24\" X 3/4\", Fire Rating Class A", "source_text": "C4 A CEILING TILE GRID MANUF: ARMSTRONG PRODUCT: ULTIMA 1910 SURFACE: FIRE RATING CLASS A COLOR: WHITE SIZE: 24\" X 24\" X 3/4\" GRID: PRELUDE XL 15/16\" EXPOSED TEE IN WHITE EDGE PROFILE: 15/16\" SQUARE LAY IN LOCATION: THROUGHOUT ENTIRE SPACE", "normalized_value": {"manufacturer": "ARMSTRONG", "product": "ULTIMA 1910", "size": {"width": 24, "length": 24, "thickness": 0.75}, "fire_rating": "Class A"}, "normalized_unit": {"size": "inches"}, "normalized_attribute": "product_specification", "normalization_notes": "Parsed from keynote text. Size converted from string to separate dimensions. 3/4\" converted to 0.75.", "normalization_confidence": "high"}, {"assertion_id": "A23.01#12", "attribute": "keynote_assertion", "value": "Carpet Tile CPT 1: Shaw NEXT GEN 2.0, 24\" X 24\", Ashlar stack pattern 50% offset", "source_text": "CPT 1 CARPET TILE MANUF: SHAW PRODUCT: NEXT GEN 2.0, VERIZON STANDARD STYLE: 42JCP SIZE: 24\" X 24\" INSTALLATION: ASHLAR STACK PATTERN 50% OFFSET", "normalized_value": {"manufacturer": "SHAW", "product": "NEXT GEN 2.0", "size": {"width": 24, "length": 24}, "installation": "ASHLAR STACK PATTERN 50% OFFSET"}, "normalized_unit": {"size": "inches"}, "normalized_attribute": "product_specification", "normalization_notes": "Parsed from keynote text. Size converted from string to separate dimensions.", "normalization_confidence": "high"}, {"assertion_id": "A23.01#15", "attribute": "keynote_assertion", "value": "Polished Concrete PC 1: Grade 2 (Medium Exposed), with a Class 1 (Matte) Finish", "source_text": "PC 1 POLISHED CONCRETE GRADE: 2 (MEDIUMS EXPOSED), WITH A CLASS 1 (MATTE) FINISH", "normalized_value": {"grade": "2 (MEDIUMS EXPOSED)", "finish": "Class 1 (Matte)"}, "normalized_unit": null, "normalized_attribute": "finish_properties", "normalization_notes": "Parsed from keynote text.", "normalization_confidence": "high"}, {"assertion_id": "A23.01#16", "attribute": "slip_resistance", "value": ">= 0.50 SCOF", "source_text": "SLIP RESISTANCE OF FLOOR TO BE NO LESS THAN A 0.50 STATIC COEFFICIENT OF FRICTION (SCOF)", "normalized_value": {"operator": ">=", "value": 0.5}, "normalized_unit": "SCOF", "normalized_attribute": "slip_resistance", "normalization_notes": "Parsed from inequality string a structured object.", "normalization_confidence": "high"}, {"assertion_id": "A24.01#0", "attribute": "general_note", "value": "Refer to project general notes on sheet G11.01.", "source_text": "A. REFER TO PROJECT GENERAL NOTES ON SHEET G11.01.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Textual note, no normalization applied.", "normalization_confidence": "high"}, {"assertion_id": "A24.01#1", "attribute": "general_note", "value": "Installation of all Cellular Sales / Verizon display fixtures shall be performed by a qualified Cellular Sales / Verizon vendor.", "source_text": "B. INSTALLATION OF ALL CELLULAR SALES / VERIZON DISPLAY FIXTURES SHALL BE PERFORMED BY A QUALIFIED CELLULAR SALES / VERIZON VENDOR.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Textual note, no normalization applied.", "normalization_confidence": "high"}, {"assertion_id": "A24.01#2", "attribute": "general_note", "value": "Contractor must coordinate with Cellular Sales / Verizon for installation date.", "source_text": "C. CONTRACTOR MUST COORDINATE WITH CELLULAR SALES / VERIZON FOR INSTALLATION DATE.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Textual note, no normalization applied.", "normalization_confidence": "high"}, {"assertion_id": "A24.01#3", "attribute": "general_note", "value": "Contractor's electrician must be available during installation to install electrical connections as needed.", "source_text": "D. CONTRACTOR'S ELECTRICIAN MUST BE AVAILABLE DURING INSTALLATION TO INSTALL ELECTRICAL CONNECTIONS AS NEEDED.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Textual note, no normalization applied.", "normalization_confidence": "high"}, {"assertion_id": "A24.01#4", "attribute": "detail_callout", "value": "Refer to detail 3/A92.01 for foundation pour back detail where existing slab is cut.", "source_text": "G. REFER TO DETAIL 3/A92.01 FOR FOUNDATION POUR BACK DETAIL WHERE EXISTING SLAB IS CUT.", "normalized_value": {"detail_number": "3", "sheet_number": "A92.01"}, "normalized_unit": null, "normalized_attribute": "detail_callout", "normalization_notes": "Parsed from reference text.", "normalization_confidence": "high"}, {"assertion_id": "A24.01#5", "attribute": "general_note", "value": "Power outlets and data ports shown on this plan is for reference and coordination purposes only. Refer to electrical drawings for all power and data outlet information.", "source_text": "NOTE: POWER OUTLETS AND DATA PORTS SHOWN ON THIS PLAN IS FOR REFERENCE AND COORDINATION PURPOSES ONLY. REFER TO ELECTRICAL DRAWINGS FOR ALL POWER AND DATA OUTLET INFORMATION.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Textual note, no normalization applied.", "normalization_confidence": "high"}, {"assertion_id": "A24.01#6", "attribute": "room_name", "value": "EXISTING FIRE RISER ROOM", "source_text": "EXISTING FIRE RISER ROOM", "normalized_value": "EXISTING FIRE RISER ROOM", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "normalization_confidence": "high"}, {"assertion_id": "A24.01#7", "attribute": "room_name", "value": "CORRIDOR", "source_text": "CORRIDOR", "normalized_value": "CORRIDOR", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "normalization_confidence": "high"}, {"assertion_id": "A24.01#8", "attribute": "room_name", "value": "INVENTORY", "source_text": "INVENTORY", "normalized_value": "INVENTORY", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "normalization_confidence": "high"}, {"assertion_id": "A24.01#9", "attribute": "room_name", "value": "LOUNGE", "source_text": "LOUNGE", "normalized_value": "LOUNGE", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "normalization_confidence": "high"}, {"assertion_id": "A24.01#10", "attribute": "room_name", "value": "MEN'S RESTROOM", "source_text": "MEN'S RESTROOM", "normalized_value": "MEN'S RESTROOM", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "normalization_confidence": "high"}, {"assertion_id": "A24.01#11", "attribute": "room_name", "value": "WOMEN'S RESTROOM", "source_text": "WOMEN'S RESTROOM", "normalized_value": "WOMEN'S RESTROOM", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "normalization_confidence": "high"}, {"assertion_id": "A24.01#12", "attribute": "room_name", "value": "MANAGER'S OFFICE", "source_text": "MANAGER'S OFFICE", "normalized_value": "MANAGER'S OFFICE", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "normalization_confidence": "high"}, {"assertion_id": "A24.01#13", "attribute": "room_name", "value": "CLEANING SUPPLIES/STORAGE", "source_text": "CLEANING SUPPLIES/STORAGE", "normalized_value": "CLEANING SUPPLIES/STORAGE", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "normalization_confidence": "high"}, {"assertion_id": "A24.01#14", "attribute": "room_name", "value": "SALES AREA", "source_text": "SALES AREA", "normalized_value": "SALES AREA", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "normalization_confidence": "high"}, {"assertion_id": "A24.01#15", "attribute": "keynote_assertion", "value": "Coordinate with tenant for plywood backing for mounting network rack.", "source_text": "COORDINATE WITH TENANT FOR PLYWOOD BACKING FOR MOUNTING NETWORK RACK", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Textual note, no normalization applied.", "normalization_confidence": "high"}, {"assertion_id": "A24.01#16", "attribute": "keynote_assertion", "value": "Provide (3) 3\" conduits from directly above the network rack into the sales ceiling plenum area for data cabling - field coordinate.", "source_text": "PROVIDE (3) 3\" CONDUITS FROM DIRECTLY ABOVE THE NETWORK RACK INTO THE SALES CEILING PLENUM AREA FOR DATA CABLING - FIELD COORDINATE.", "normalized_value": {"quantity": 3, "diameter": 3}, "normalized_unit": "inches", "normalized_attribute": "conduit_properties", "normalization_notes": "Parsed from keynote text.", "normalization_confidence": "high"}, {"assertion_id": "A24.01#17", "attribute": "keynote_assertion", "value": "(2) 20A, outlets at 60\" A.F.F.", "source_text": "(2) 20A, OUTLETS AT 60\" A.F.F.", "normalized_value": {"quantity": 2, "amperage": 20, "mounting_height": 60}, "normalized_unit": {"amperage": "A", "mounting_height": "inches"}, "normalized_attribute": "outlet_properties", "normalization_notes": "Parsed from keynote text. Height is Above Finished Floor (A.F.F.).", "normalization_confidence": "high"}, {"assertion_id": "A24.01#18", "attribute": "keynote_assertion", "value": "(1) 10 gauge ground block with ground wire connected to the panel ground (required for warranty).", "source_text": "(1) 10 GAUGE GROUND BLOCK WITH GROUND WIRE CONNECTED TO THE PANEL GROUND (REQUIRED FOR WARRANTY)", "normalized_value": {"quantity": 1, "gauge": 10}, "normalized_unit": "gauge", "normalized_attribute": "ground_block_properties", "normalization_notes": "Parsed from keynote text.", "normalization_confidence": "high"}, {"assertion_id": "A24.01#19", "attribute": "equipment_elev", "value": "74\" TO BOTTOM", "source_text": "RACK SYSTEM ABOVE SAFE @ -74\" TO BOTTOM", "normalized_value": 74, "normalized_unit": "inches", "normalized_attribute": "mounting_height_to_bottom", "normalization_notes": "Distance is to the bottom of the equipment.", "normalization_confidence": "high"}, {"assertion_id": "A24.01#20", "attribute": "equipment_location", "value": "PANEL", "source_text": "PANEL", "normalized_value": "PANEL", "normalized_unit": null, "normalized_attribute": "equipment_location", "normalization_notes": null, "normalization_confidence": "high"}, {"assertion_id": "A25.01#0", "attribute": "scale", "value": "1/4\" = 1'-0\"", "source_text": "ROOF PLAN\n1/4\" = 1'-0\"", "normalized_value": "1:48", "normalized_unit": null, "normalized_attribute": "scale", "normalization_notes": "Normalized from 1/4 inch = 1 foot (12 inches).", "normalization_confidence": "high"}, {"assertion_id": "A25.01#1", "attribute": "coordination_instruction", "value": "CONTRACTOR TO REFER TO MECHANICAL DRAWINGS FOR ALL ROOFTOP UNIT REQUIREMENTS, DETAILS, AND SPECIFICATIONS.", "source_text": "B. CONTRACTOR TO REFER TO MECHANICAL DRAWINGS FOR ALL ROOFTOP UNIT REQUIREMENTS, DETAILS, AND SPECIFICATIONS.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Textual note, no normalization applied.", "normalization_confidence": "high"}, {"assertion_id": "A25.01#2", "attribute": "coordination_instruction", "value": "CONTRACTORS SHALL VERIFY LOCATIONS OF EXISTING SYSTEMS AND OPENINGS; SUCH AS EXISTING RTU'S, ROOF VENTS, HVAC, ROOF ACCESS, AND OTHER PENETRATIONS, VERIFY COORDINATIONS REQUIRED BETWEEN EXISTING PENETRATIONS AND EQUIPMENT WITH NEW.", "source_text": "C. CONTRACTORS SHALL VERIFY LOCATIONS OF EXISTING SYSTEMS AND OPENINGS; SUCH AS EXISTING RTU'S, ROOF VENTS, HVAC, ROOF ACCESS, AND OTHER PENETRATIONS, VERIFY COORDINATIONS REQUIRED BETWEEN EXISTING PENETRATIONS AND EQUIPMENT WITH NEW.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Textual note, no normalization applied.", "normalization_confidence": "high"}, {"assertion_id": "A25.01#3", "attribute": "roofing_requirement", "value": "REPAIR AND SEAL ROOF IF REQUIRED AROUND ALL NEW PENETRATIONS AND EQUIPMENT, PER MANUFACTURER'S RECOMMENDATIONS.", "source_text": "D. REPAIR AND SEAL ROOF IF REQUIRED AROUND ALL NEW PENETRATIONS AND EQUIPMENT, PER MANUFACTURER'S RECOMMENDATIONS.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Textual note, no normalization applied.", "normalization_confidence": "high"}, {"assertion_id": "A25.01#4", "attribute": "coordination_instruction", "value": "NEW RTU, PROVIDE NEW MECHANICAL ROOF CURBS AS NECESSARY TO ACCOMODATE NEW RTU. GC TO INSTALL FLASHING PER PER ROOFING MANUFACTURING STANDARDS, GC SHALL COORDINATE ROOF WORK WITH LL REQUIREMENTS TO MAINTAIN EXISTING ROOFING WARRANTY. REFER TO MEP DRAWINGS FOR MORE INFORMATION.", "source_text": "2 NEW RTU, PROVIDE NEW MECHANICAL ROOF CURBS AS NECESSARY TO ACCOMODATE NEW RTU. GC TO INSTALL FLASHING PER PER ROOFING MANUFACTURING STANDARDS, GC SHALL COORDINATE ROOF WORK WITH LL REQUIREMENTS TO MAINTAIN EXISTING ROOFING WARRANTY. REFER TO MEP DRAWINGS FOR MORE INFORMATION.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Textual note, no normalization applied.", "normalization_confidence": "high"}, {"assertion_id": "A25.01#5", "attribute": "clearance", "value": "6'-9\"", "source_text": "6'-9\"", "normalized_value": 81, "normalized_unit": "inches", "normalized_attribute": "clearance", "normalization_notes": "6 feet * 12 inches/foot + 9 inches = 81 inches", "normalization_confidence": "high"}, {"assertion_id": "A25.01#6", "attribute": "clearance", "value": "3'-3 1/4\"", "source_text": "3'-3 1/4\"", "normalized_value": 39.25, "normalized_unit": "inches", "normalized_attribute": "clearance", "normalization_notes": "3 feet * 12 inches/foot + 3 + 1/4 inches = 39.25 inches", "normalization_confidence": "high"}, {"assertion_id": "A25.01#7", "attribute": "scale", "value": "6\" = 1'-0\"", "source_text": "ROOF CURB DETAIL\n6\" = 1'-0\"", "normalized_value": "1:2", "normalized_unit": null, "normalized_attribute": "scale", "normalization_notes": "Normalized from 6 inches = 1 foot (12 inches).", "normalization_confidence": "high"}, {"assertion_id": "A51.01#0", "attribute": "room_name", "value": "MEN'S RESTROOM", "source_text": "MEN'S RESTROOM", "normalized_value": "MEN'S RESTROOM", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": null, "normalization_confidence": "high"}, {"assertion_id": "A51.01#1", "attribute": "room_number", "value": "103", "source_text": "103", "normalized_value": "103", "normalized_unit": null, "normalized_attribute": "room_number", "normalization_notes": null, "normalization_confidence": "high"}, {"assertion_id": "A51.01#2", "attribute": "room_name", "value": "WOMEN'S / RESTROOM", "source_text": "WOMEN'S / RESTROOM", "normalized_value": "WOMEN'S RESTROOM", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": "Removed slash from room name.", "normalization_confidence": "high"}, {"assertion_id": "A51.01#3", "attribute": "room_number", "value": "102", "source_text": "102", "normalized_value": "102", "normalized_unit": null, "normalized_attribute": "room_number", "normalization_notes": null, "normalization_confidence": "high"}, {"assertion_id": "A51.01#5", "attribute": "fixture_location", "value": "Restrooms contain WC-1", "source_text": "WC-1", "normalized_value": "WC-1", "normalized_unit": null, "normalized_attribute": "fixture_tag", "normalization_notes": "Extracted fixture tag from value.", "normalization_confidence": "high"}, {"assertion_id": "A51.01#6", "attribute": "fixture_location", "value": "Restrooms contain L-1", "source_text": "L-1", "normalized_value": "L-1", "normalized_unit": null, "normalized_attribute": "fixture_tag", "normalization_notes": "Extracted fixture tag from value.", "normalization_confidence": "high"}, {"assertion_id": "A51.01#7", "attribute": "detail_callout", "value": "SEE G11.02", "source_text": "HANDICAPPED RESTROOM SIGNAGE (SEE G11.02)", "normalized_value": "G11.02", "normalized_unit": null, "normalized_attribute": "sheet_reference", "normalization_notes": "Extracted sheet reference from value.", "normalization_confidence": "high"}, {"assertion_id": "A51.01#8", "attribute": "clearance", "value": "9", "source_text": "9\" MIN. TOE CLEAR", "normalized_value": {"min": 9}, "normalized_unit": "inches", "normalized_attribute": "toe_clearance", "normalization_notes": "Qualifier 'MIN.' from source text applied.", "normalization_confidence": "high"}, {"assertion_id": "A51.01#9", "attribute": "clearance", "value": "6", "source_text": "6\" MAX. TOE CLEAR", "normalized_value": {"max": 6}, "normalized_unit": "inches", "normalized_attribute": "toe_clearance", "normalization_notes": "Qualifier 'MAX.' from source text applied.", "normalization_confidence": "high"}, {"assertion_id": "A51.01#10", "attribute": "mounting_height", "value": "2'-5\" MIN.", "source_text": "2'-5\" MIN.", "normalized_value": {"min": 29}, "normalized_unit": "inches", "normalized_attribute": "mounting_height", "normalization_notes": "2 feet * 12 inches/foot + 5 inches = 29 inches. Specified as minimum.", "normalization_confidence": "high"}, {"assertion_id": "A51.01#11", "attribute": "mounting_height", "value": "2'-10\" MAX.", "source_text": "2'-10\" MAX.", "normalized_value": {"max": 34}, "normalized_unit": "inches", "normalized_attribute": "mounting_height", "normalization_notes": "2 feet * 12 inches/foot + 10 inches = 34 inches. Specified as maximum.", "normalization_confidence": "high"}, {"assertion_id": "A51.01#12", "attribute": "mounting_height", "value": "17\"-19\"", "source_text": "17\"-19\"", "normalized_value": {"min": 17, "max": 19}, "normalized_unit": "inches", "normalized_attribute": "mounting_height", "normalization_notes": "Parsed from dimensional range.", "normalization_confidence": "high"}, {"assertion_id": "A51.01#13", "attribute": "mounting_height", "value": "33\"-36\"", "source_text": "33\"-36\"", "normalized_value": {"min": 33, "max": 36}, "normalized_unit": "inches", "normalized_attribute": "mounting_height", "normalization_notes": "Parsed from dimensional range.", "normalization_confidence": "high"}, {"assertion_id": "A51.01#14", "attribute": "length", "value": "3'-6\" MIN.", "source_text": "3'-6\" MIN.", "normalized_value": {"min": 42}, "normalized_unit": "inches", "normalized_attribute": "length", "normalization_notes": "3 feet * 12 inches/foot + 6 inches = 42 inches. Specified as minimum.", "normalization_confidence": "high"}, {"assertion_id": "A51.01#15", "attribute": "length", "value": "3'-4\"", "source_text": "3'-4\"", "normalized_value": 40, "normalized_unit": "inches", "normalized_attribute": "length", "normalization_notes": "3 feet * 12 inches/foot + 4 inches = 40 inches.", "normalization_confidence": "high"}, {"assertion_id": "A51.01#16", "attribute": "location", "value": "7\"-9\"", "source_text": "7\"-9\"", "normalized_value": {"min": 7, "max": 9}, "normalized_unit": "inches", "normalized_attribute": "location", "normalization_notes": "Parsed from dimensional range.", "normalization_confidence": "high"}, {"assertion_id": "A51.01#17", "attribute": "overall_dim", "value": "3'-0\"", "source_text": "3'-0\"", "normalized_value": 36, "normalized_unit": "inches", "normalized_attribute": "overall_dim", "normalization_notes": "3 feet * 12 inches/foot = 36 inches.", "normalization_confidence": "high"}, {"assertion_id": "M01.01#0", "attribute": "equipment_type", "value": "ROOFTOP A/C UNIT", "source_text": "DESCRIPTION ROOFTOP A/C UNIT", "normalized_value": "ROOFTOP A/C UNIT", "normalized_unit": null, "normalized_attribute": "equipment_type", "normalization_notes": null, "normalization_confidence": "high"}, {"assertion_id": "M01.01#1", "attribute": "manufacturer", "value": "CARRIER", "source_text": "MFR. CARRIER", "normalized_value": "CARRIER", "normalized_unit": null, "normalized_attribute": "manufacturer", "normalization_notes": null, "normalization_confidence": "high"}, {"assertion_id": "M01.01#2", "attribute": "model_number", "value": "50FE-M07", "source_text": "MODEL 50FE-M07", "normalized_value": "50FE-M07", "normalized_unit": null, "normalized_attribute": "model_number", "normalization_notes": null, "normalization_confidence": "high"}, {"assertion_id": "M01.01#3", "attribute": "weight", "value": "711", "source_text": "WEIGHT (LBS) 711", "normalized_value": 711, "normalized_unit": "lbs", "normalized_attribute": "weight", "normalization_notes": "Unit 'lbs' derived from source text.", "normalization_confidence": "high"}, {"assertion_id": "M01.01#4", "attribute": "supply_airflow", "value": "2100", "source_text": "CFM 2100", "normalized_value": 2100, "normalized_unit": "CFM", "normalized_attribute": "supply_airflow", "normalization_notes": "Unit 'CFM' derived from source text.", "normalization_confidence": "high"}, {"assertion_id": "M01.01#5", "attribute": "fan_horsepower", "value": "3.0", "source_text": "HP 3.0", "normalized_value": 3.0, "normalized_unit": "HP", "normalized_attribute": "fan_horsepower", "normalization_notes": "Unit 'HP' derived from source text.", "normalization_confidence": "high"}, {"assertion_id": "M01.01#6", "attribute": "cooling_capacity_nominal", "value": "6.0", "source_text": "NOM TONS 6.0", "normalized_value": 6.0, "normalized_unit": "Tons", "normalized_attribute": "cooling_capacity_nominal", "normalization_notes": "Unit 'Tons' derived from source text.", "normalization_confidence": "high"}, {"assertion_id": "M01.01#7", "attribute": "heating_capacity", "value": "10.6", "source_text": "ELEC KW 10.6", "normalized_value": 10.6, "normalized_unit": "kW", "normalized_attribute": "heating_capacity", "normalization_notes": "Unit 'kW' derived from source text.", "normalization_confidence": "high"}, {"assertion_id": "M01.01#8", "attribute": "voltage", "value": "460", "source_text": "VOLT 460", "normalized_value": 460, "normalized_unit": "V", "normalized_attribute": "voltage", "normalization_notes": "Unit 'V' normalized from 'VOLT' in source text.", "normalization_confidence": "high"}, {"assertion_id": "M01.01#9", "attribute": "phase", "value": "3", "source_text": "PH 3", "normalized_value": 3, "normalized_unit": "phase", "normalized_attribute": "phase", "normalization_notes": "Unit 'phase' derived from 'PH' in source text.", "normalization_confidence": "high"}] \ No newline at end of file diff --git a/backend/.llm_cache/ccc7fb4ba807df3626666003b9495094116506f5d2e9fa573e4cf5b3b83ec479.json b/backend/.llm_cache/ccc7fb4ba807df3626666003b9495094116506f5d2e9fa573e4cf5b3b83ec479.json new file mode 100644 index 0000000..d6d4112 --- /dev/null +++ b/backend/.llm_cache/ccc7fb4ba807df3626666003b9495094116506f5d2e9fa573e4cf5b3b83ec479.json @@ -0,0 +1 @@ +{"issues": [{"issue_id": "84a7e94e-2f5a-4e6f-9e79-880b2a9539d0", "source_stage": "code", "category": "ada", "severity": "high", "confidence": "high", "location": "Sales Area", "disciplines": ["Architectural", "Interiors"], "sheets": ["A22.01"], "description": "A pendant light fixture (L-6) in the Sales Area is specified to be mounted at 5'-5\" (65 inches) above the finished floor. Accessible routes require a minimum vertical head clearance of 80 inches. A fixture at this height in a public circulation area poses a significant hazard to all individuals, particularly those with visual impairments.", "evidence": [{"discipline": "Architectural", "sheet": "A22.01", "source_text": "PENDANT 5'-5\" AFF", "asserted_value": "65"}], "recommended_resolution": "Verify the location of the L-6 pendant. If it is located within a circulation path, raise the mounting height to provide at least 80 inches of clear headroom, or relocate the fixture out of the circulation path.", "code_reference": null}, {"issue_id": "c0b115e2-6d2c-4f7f-859a-14d18fa8d30e", "source_stage": "code", "category": "ada", "severity": "medium", "confidence": "high", "location": "All areas with polished concrete flooring.", "disciplines": ["Architectural", "Interiors"], "sheets": ["A23.01"], "description": "The finish notes provide conflicting and outdated specifications for floor slip resistance. General Note F requires a minimum Static Coefficient of Friction (SCOF) of 0.6, while the specification for Polished Concrete (PC-1) requires a minimum SCOF of 0.50. Furthermore, SCOF is an outdated metric; current standards referenced by the ADA (via ANSI) recommend a minimum Dynamic Coefficient of Friction (DCOF) of 0.42 for level interior spaces expected to be walked on when wet. Using contradictory and obsolete specifications can lead to an unsafe flooring surface.", "evidence": [{"discipline": "Architectural", "sheet": "A23.01", "source_text": "F. ALL FLOOR FINISHES SHALL HAVE A MIN. S.C.O.F. OF .6 WET OR DRY.", "asserted_value": "0.6"}, {"discipline": "Architectural", "sheet": "A23.01", "source_text": "SLIP RESISTANCE OF FLOOR TO BE NO LESS THAN A 0.50 STATIC COEFFICIENT OF FRICTION (SCOF)", "asserted_value": ">= 0.50 SCOF"}], "recommended_resolution": "Update the finish specifications to use the current DCOF standard (e.g., ANSI A326.3). Specify a single, consistent requirement for all accessible flooring surfaces, such as a minimum DCOF of 0.42.", "code_reference": null}, {"issue_id": "ab6f2cc8-8314-41d3-a62c-6238b975d6e2", "source_stage": "code", "category": "ada", "severity": "low", "confidence": "high", "location": "Finish schedule / Areas specified with carpet tile CPT-1", "disciplines": ["Architectural", "Interiors"], "sheets": ["A23.01"], "description": "The specification for carpet tile CPT-1 does not include the pile height. To ensure the floor surface is accessible for people using wheelchairs or other mobility aids, carpet pile height must not exceed 1/2 inch.", "evidence": [{"discipline": "Architectural", "sheet": "A23.01", "source_text": "CPT 1 CARPET TILE MANUF: SHAW PRODUCT: NEXT GEN 2.0, VERIZON STANDARD STYLE: 42JCP SIZE: 24\" X 24\" INSTALLATION: ASHLAR STACK PATTERN 50% OFFSET", "asserted_value": "Shaw NEXT GEN 2.0"}], "recommended_resolution": "Update the specification for CPT-1 to include the pile height and confirm it is 1/2 inch or less to comply with ADA 302.2.", "code_reference": "ADA 302.2"}, {"issue_id": "f51a2d5e-a9b0-4fb5-9c86-cb82ab9180f1", "source_stage": "code", "category": "ada", "severity": "high", "confidence": "high", "location": "Men's Restroom 103 and Women's Restroom 102", "disciplines": ["Architectural", "Plumbing"], "sheets": ["A51.01"], "description": "The typical restroom detail shows a maximum toe clearance height of 6 inches under the lavatory cabinet. Accessible lavatories require knee and toe clearance to allow for a forward approach. The ADA requires a minimum toe clearance height of 9 inches from the floor.", "evidence": [{"discipline": "Architectural", "sheet": "A51.01", "source_text": "6\" MAX. TOE CLEAR", "asserted_value": "{\"max\": 6}"}], "recommended_resolution": "Revise the restroom lavatory and cabinet detail to provide a toe clearance height of at least 9 inches above the finished floor, extending for a required depth.", "code_reference": "ADA 606.2"}, {"issue_id": "18fdd9c8-d8f9-4bdf-b59a-f4c54a991465", "source_stage": "code", "category": "ada", "severity": "high", "confidence": "medium", "location": "Men's Restroom 103 and Women's Restroom 102", "disciplines": ["Architectural"], "sheets": ["A51.01"], "description": "The restroom plan shows the door swinging into the restroom, encroaching on the clear floor space required at the lavatory. For a single-user restroom, this is only permitted if a 30-inch by 48-inch clear floor space is provided beyond the arc of the door swing. The plans do not contain sufficient dimensions to verify this clearance exists, and the layout appears tight.", "evidence": [{"discipline": "Architectural", "sheet": "A51.01", "source_text": "WOMEN'S / RESTROOM", "asserted_value": "WOMEN'S RESTROOM"}, {"discipline": "Architectural", "sheet": "A51.01", "source_text": "MEN'S RESTROOM", "asserted_value": "MEN'S RESTROOM"}], "recommended_resolution": "Verify and dimension the restroom plans to confirm that a 30-inch by 48-inch clear floor space exists completely outside the arc of the door swing. If it does not, the door swing must be reversed or the room layout must be adjusted.", "code_reference": "ADA 603.2.3"}]} \ No newline at end of file diff --git a/backend/.llm_cache/ce8122630efd6d8724770fc8baed83aa53c94c6cf9d319148fef24a3e6cefa5b.json b/backend/.llm_cache/ce8122630efd6d8724770fc8baed83aa53c94c6cf9d319148fef24a3e6cefa5b.json new file mode 100644 index 0000000..4043799 --- /dev/null +++ b/backend/.llm_cache/ce8122630efd6d8724770fc8baed83aa53c94c6cf9d319148fef24a3e6cefa5b.json @@ -0,0 +1 @@ +[{"cluster_id": "Project_Information", "cluster_type": "general", "primary_location_key": {"room": null, "room_name": null, "level": null, "grid": null, "tag": null, "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General", "Architectural"], "disciplines_expected": [], "assertion_ids": ["G01.01#0", "G01.01#1", "G01.01#2", "G01.01#3", "G01.01#4", "G01.01#5", "G01.01#6", "G01.01#7", "G01.01#9", "G11.01#0", "G21.01#7", "G21.01#8", "G11.04#4", "A11.01#0"], "possible_relationships": [], "review_focus": ["coordination"], "confidence": "high"}, {"cluster_id": "Building_C_Requirements", "cluster_type": "general", "primary_location_key": {"room": null, "room_name": null, "level": "BUILDING C", "grid": null, "tag": null, "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General", "Architectural"], "disciplines_expected": ["Electrical", "Mechanical", "Plumbing", "Structural"], "assertion_ids": ["G11.01#1", "G11.03#0", "G11.03#1", "G11.03#2", "G11.03#3", "G11.03#4", "G11.03#5", "G11.03#6", "G11.03#8", "G11.03#9", "G11.03#10", "G11.03#11", "G11.03#12", "G11.03#13", "G11.03#14", "G11.03#15", "G11.03#20", "A11.01#1", "A11.01#3"], "possible_relationships": [], "review_focus": ["coordination", "constructability", "owner_standard"], "confidence": "high"}, {"cluster_id": "Project_Scope_And_Code_Summary", "cluster_type": "code_item", "primary_location_key": {"room": null, "room_name": null, "level": null, "grid": null, "tag": null, "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General"], "disciplines_expected": ["Architectural"], "assertion_ids": ["G11.04#0", "G11.04#1", "G11.04#2", "G11.04#3", "G11.04#5", "G11.04#6", "G11.04#7", "G11.04#8", "G11.04#9", "G11.04#10", "G11.04#11", "G21.01#15", "G21.01#16"], "possible_relationships": [], "review_focus": ["code", "coordination"], "confidence": "high"}, {"cluster_id": "Applicable_Codes_And_Standards", "cluster_type": "code_item", "primary_location_key": {"room": null, "room_name": null, "level": null, "grid": null, "tag": null, "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General", "Architectural", "Electrical"], "disciplines_expected": ["Mechanical", "Plumbing", "Structural"], "assertion_ids": ["G11.01#2", "G11.01#9", "G21.01#9", "G21.01#10", "G21.01#11", "G21.01#12", "G21.01#13", "G21.01#14", "G31.02#3", "A23.01#0", "A23.01#1", "E01.01#0"], "possible_relationships": [], "review_focus": ["code"], "confidence": "high"}, {"cluster_id": "Site_Context_Other_Buildings", "cluster_type": "general", "primary_location_key": {"room": null, "room_name": null, "level": null, "grid": null, "tag": null, "detail_reference": "A11.01", "plan_zone": null}, "disciplines_present": ["Architectural"], "disciplines_expected": [], "assertion_ids": ["A11.01#2", "A11.01#4", "A11.01#5", "A11.01#6", "A11.01#7", "A11.01#8", "A11.01#9", "A11.01#10", "A11.01#11", "A11.01#12"], "possible_relationships": [], "review_focus": ["coordination"], "confidence": "high"}, {"cluster_id": "General_Project_Notes", "cluster_type": "general", "primary_location_key": {"room": null, "room_name": "PROJECT GENERAL NOTES", "level": null, "grid": null, "tag": null, "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General"], "disciplines_expected": [], "assertion_ids": ["G11.01#3"], "possible_relationships": [], "review_focus": ["coordination"], "confidence": "high"}, {"cluster_id": "Dimensioning_Conventions", "cluster_type": "general", "primary_location_key": {"room": null, "room_name": "PROJECT GENERAL NOTES", "level": null, "grid": null, "tag": null, "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General"], "disciplines_expected": ["Architectural", "Structural"], "assertion_ids": ["G11.01#4", "G11.01#5", "G11.01#6", "G11.01#7", "G11.01#8"], "possible_relationships": [], "review_focus": ["coordination", "constructability"], "confidence": "high"}, {"cluster_id": "Administrative_Submittal_Requirements", "cluster_type": "general", "primary_location_key": {"room": null, "room_name": null, "level": null, "grid": null, "tag": null, "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General"], "disciplines_expected": [], "assertion_ids": ["G31.01#0", "G31.01#1", "G31.01#2", "G31.01#3", "G31.01#4", "G31.02#6"], "possible_relationships": [], "review_focus": ["coordination"], "confidence": "high"}, {"cluster_id": "As_Built_Closeout_Requirements", "cluster_type": "general", "primary_location_key": {"room": null, "room_name": null, "level": null, "grid": null, "tag": null, "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General", "Electrical"], "disciplines_expected": [], "assertion_ids": ["G31.02#7", "G31.02#8", "G31.02#9", "G31.02#10", "G31.02#11", "E01.02#5"], "possible_relationships": [], "review_focus": ["coordination"], "confidence": "high"}, {"cluster_id": "Demolition_And_Existing_Conditions", "cluster_type": "general", "primary_location_key": {"room": null, "room_name": null, "level": null, "grid": null, "tag": null, "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General"], "disciplines_expected": [], "assertion_ids": ["G31.02#0", "G31.02#1", "G31.02#2", "G31.03#0"], "possible_relationships": [], "review_focus": ["constructability", "coordination"], "confidence": "high"}, {"cluster_id": "ACCESSIBILITY_REQUIREMENTS", "cluster_type": "code_item", "primary_location_key": {"room": null, "room_name": null, "level": null, "grid": null, "tag": null, "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General", "Architectural", "Plumbing"], "disciplines_expected": ["Electrical"], "assertion_ids": ["G11.02#0", "G11.02#1", "G11.02#2", "G11.02#3", "G11.02#4", "G11.02#5", "G11.02#6", "G11.02#7", "G11.02#8", "G11.02#9", "G11.02#10", "G11.02#11", "G11.02#12", "A51.01#9", "A51.01#10", "A51.01#11", "A51.01#12", "A51.01#13", "A51.01#14", "A51.01#16", "A51.01#17", "A51.01#18", "P01.01#1"], "possible_relationships": [], "review_focus": ["ada", "code", "coordination"], "confidence": "high"}, {"cluster_id": "Landlord_Required_Contractors", "cluster_type": "general", "primary_location_key": {"room": null, "room_name": null, "level": "BUILDING C", "grid": null, "tag": null, "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General"], "disciplines_expected": [], "assertion_ids": ["G11.03#16", "G11.03#17", "G11.03#18", "G11.03#19"], "possible_relationships": [], "review_focus": ["owner_standard", "coordination"], "confidence": "high"}, {"cluster_id": "Exterior_Signage_Verizon", "cluster_type": "fixture", "primary_location_key": {"room": "Exterior", "room_name": null, "level": null, "grid": null, "tag": null, "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General", "Electrical"], "disciplines_expected": ["Architectural", "Structural"], "assertion_ids": ["G01.01#8", "E02.01#6"], "possible_relationships": [], "review_focus": ["coordination", "owner_standard"], "confidence": "high"}, {"cluster_id": "System_Roof", "cluster_type": "general", "primary_location_key": {"room": null, "room_name": null, "level": "Roof", "grid": null, "tag": null, "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General", "Architectural", "Mechanical", "Electrical"], "disciplines_expected": ["Structural"], "assertion_ids": ["G11.03#7", "A25.01#0", "A25.01#1", "A25.01#2", "A25.01#3", "M02.02#0", "M02.02#3", "M03.01#9", "M03.01#10", "M03.01#11", "M03.01#12", "M03.01#13", "M03.01#14", "M03.01#15", "M03.01#16", "E02.02#0"], "possible_relationships": [], "review_focus": ["coordination", "constructability"], "confidence": "high"}, {"cluster_id": "Detail_Roof_Curb", "cluster_type": "detail", "primary_location_key": {"room": null, "room_name": null, "level": "Roof", "grid": null, "tag": null, "detail_reference": "1/A25.01", "plan_zone": null}, "disciplines_present": ["Architectural"], "disciplines_expected": ["Mechanical", "Structural"], "assertion_ids": ["A25.01#8", "A25.01#9", "A25.01#10", "A25.01#11", "A25.01#12", "A25.01#13", "A25.01#14", "A25.01#15", "A25.01#16"], "possible_relationships": [], "review_focus": ["constructability", "coordination"], "confidence": "high"}, {"cluster_id": "Penetrations_And_Firestopping", "cluster_type": "code_item", "primary_location_key": {"room": null, "room_name": null, "level": null, "grid": null, "tag": null, "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General", "Architectural", "Electrical", "Plumbing"], "disciplines_expected": ["Mechanical"], "assertion_ids": ["A23.01#3", "A23.01#4", "G31.02#5", "E01.01#2", "E05.01#6", "E05.01#7", "E05.01#8", "P01.01#0", "P01.01#2", "P03.01#12", "G31.04#7", "G31.04#8"], "possible_relationships": [], "review_focus": ["coordination", "code", "constructability"], "confidence": "high"}, {"cluster_id": "Interior_Finish_Requirements", "cluster_type": "finish", "primary_location_key": {"room": null, "room_name": null, "level": null, "grid": null, "tag": null, "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General", "Architectural"], "disciplines_expected": [], "assertion_ids": ["G31.05#3", "G31.05#4", "G31.05#5", "G31.05#6", "A23.01#6", "A23.01#7"], "possible_relationships": [], "review_focus": ["coordination", "constructability"], "confidence": "high"}, {"cluster_id": "System_Ceiling_AT1_C4A", "cluster_type": "ceiling", "primary_location_key": {"room": null, "room_name": "Throughout entire space", "level": null, "grid": null, "tag": "AT-1", "detail_reference": null, "plan_zone": null}, "disciplines_present": ["Architectural"], "disciplines_expected": ["Mechanical", "Electrical", "Plumbing"], "assertion_ids": ["A23.01#8", "A23.01#9", "A23.01#10", "A23.01#11"], "possible_relationships": [], "review_focus": ["coordination", "constructability"], "confidence": "high"}, {"cluster_id": "Finish_CPT1_Carpet_Tile", "cluster_type": "finish", "primary_location_key": {"room": null, "room_name": "SALES AREA, MANAGER'S OFFICE", "level": null, "grid": null, "tag": "CPT-1", "detail_reference": null, "plan_zone": null}, "disciplines_present": ["Architectural"], "disciplines_expected": [], "assertion_ids": ["A23.01#12", "A23.01#13", "A23.01#14"], "possible_relationships": [], "review_focus": ["coordination", "owner_standard"], "confidence": "high"}, {"cluster_id": "Finish_PC1_Polished_Concrete", "cluster_type": "finish", "primary_location_key": {"room": null, "room_name": "CORRIDOR, RESTROOMS, LOUNGE, INVENTORY, CLEANING SUPPLIES/STORAGE", "level": null, "grid": null, "tag": "PC-1", "detail_reference": null, "plan_zone": null}, "disciplines_present": ["Architectural", "General"], "disciplines_expected": [], "assertion_ids": ["A23.01#5", "A23.01#15", "A23.01#16", "A23.01#17", "G31.05#10", "G31.05#11"], "possible_relationships": [], "review_focus": ["coordination", "code", "ada"], "confidence": "high"}, {"cluster_id": "Detail_Foundation_Pour_Back", "cluster_type": "detail", "primary_location_key": {"room": null, "room_name": null, "level": null, "grid": null, "tag": null, "detail_reference": "3/A92.01", "plan_zone": null}, "disciplines_present": ["Architectural"], "disciplines_expected": ["Structural"], "assertion_ids": ["A24.01#4"], "possible_relationships": [], "review_focus": ["coordination", "constructability"], "confidence": "high"}, {"cluster_id": "Room_SALES_AREA", "cluster_type": "room", "primary_location_key": {"room": null, "room_name": "SALES AREA", "level": "1", "grid": null, "tag": null, "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General", "Architectural", "Electrical", "Plumbing"], "disciplines_expected": ["Mechanical"], "assertion_ids": ["G21.01#6", "A24.01#18", "E03.01#9", "E03.01#4", "E03.01#10", "E04.01#6", "E04.01#12", "E04.01#13", "P02.01#6", "P02.02#6"], "possible_relationships": [], "review_focus": ["coordination"], "confidence": "high"}, {"cluster_id": "Room_INVENTORY", "cluster_type": "room", "primary_location_key": {"room": null, "room_name": "INVENTORY", "level": "1", "grid": null, "tag": null, "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General", "Architectural", "Electrical", "Plumbing"], "disciplines_expected": ["Mechanical"], "assertion_ids": ["G21.01#0", "A24.01#13", "A24.01#19", "A24.01#5", "A24.01#6", "A24.01#7", "A24.01#8", "A24.01#9", "A24.01#10", "E02.01#5", "E02.01#7", "E02.01#8", "E03.01#5", "E04.01#0", "E04.01#7", "P02.01#0", "P02.02#0", "P02.02#10"], "possible_relationships": [], "review_focus": ["coordination", "owner_standard"], "confidence": "high"}, {"cluster_id": "Room_LOUNGE", "cluster_type": "room", "primary_location_key": {"room": null, "room_name": "LOUNGE", "level": "1", "grid": null, "tag": null, "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General", "Electrical", "Plumbing"], "disciplines_expected": ["Architectural", "Mechanical"], "assertion_ids": ["G21.01#1", "E01.02#16", "E01.02#18", "E02.01#9", "E04.01#1", "E04.01#8", "P02.01#1", "P02.02#1", "P02.02#11", "P02.02#12"], "possible_relationships": [], "review_focus": ["coordination"], "confidence": "high"}, {"cluster_id": "Room_103_MENS_RESTROOM", "cluster_type": "room", "primary_location_key": {"room": "103", "room_name": "MEN'S RESTROOM", "level": "1", "grid": null, "tag": null, "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General", "Architectural", "Electrical", "Plumbing"], "disciplines_expected": ["Mechanical"], "assertion_ids": ["G21.01#2", "A24.01#14", "A51.01#0", "A51.01#1", "E03.01#6", "E04.01#2", "P02.01#2", "P02.02#2"], "possible_relationships": [], "review_focus": ["coordination", "ada"], "confidence": "high"}, {"cluster_id": "Room_102_WOMENS_RESTROOM", "cluster_type": "room", "primary_location_key": {"room": "102", "room_name": "WOMEN'S RESTROOM", "level": "1", "grid": null, "tag": null, "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General", "Architectural", "Electrical", "Plumbing"], "disciplines_expected": ["Mechanical"], "assertion_ids": ["G21.01#3", "A24.01#15", "A51.01#2", "A51.01#3", "E04.01#3", "P02.01#3", "P02.01#7", "P02.01#8", "P02.01#9", "P02.02#3"], "possible_relationships": [], "review_focus": ["coordination", "ada"], "confidence": "high"}, {"cluster_id": "Room_MANAGERS_OFFICE", "cluster_type": "room", "primary_location_key": {"room": null, "room_name": "MANAGER'S OFFICE", "level": "1", "grid": null, "tag": null, "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General", "Architectural", "Electrical", "Plumbing"], "disciplines_expected": ["Mechanical"], "assertion_ids": ["G21.01#4", "A24.01#16", "E03.01#7", "E04.01#4", "E04.01#11", "P02.01#4", "P02.02#5"], "possible_relationships": [], "review_focus": ["coordination"], "confidence": "high"}, {"cluster_id": "Room_CLEANING_SUPPLIES_STORAGE", "cluster_type": "room", "primary_location_key": {"room": null, "room_name": "CLEANING SUPPLIES/STORAGE", "level": "1", "grid": null, "tag": null, "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General", "Architectural", "Electrical", "Plumbing"], "disciplines_expected": ["Mechanical"], "assertion_ids": ["G21.01#5", "A24.01#17", "E03.01#8", "E04.01#5", "E04.01#9", "E04.01#10", "P02.01#5", "P02.02#4"], "possible_relationships": [], "review_focus": ["coordination"], "confidence": "high"}, {"cluster_id": "Room_CORRIDOR", "cluster_type": "room", "primary_location_key": {"room": null, "room_name": "CORRIDOR", "level": "1", "grid": null, "tag": null, "detail_reference": null, "plan_zone": null}, "disciplines_present": ["Architectural"], "disciplines_expected": ["Mechanical", "Electrical", "Plumbing"], "assertion_ids": ["A24.01#12"], "possible_relationships": [], "review_focus": ["coordination"], "confidence": "high"}, {"cluster_id": "Room_EXISTING_FIRE_RISER_ROOM", "cluster_type": "room", "primary_location_key": {"room": null, "room_name": "EXISTING FIRE RISER ROOM", "level": "1", "grid": null, "tag": null, "detail_reference": null, "plan_zone": null}, "disciplines_present": ["Architectural"], "disciplines_expected": ["Plumbing", "Fire Protection"], "assertion_ids": ["A24.01#11"], "possible_relationships": [], "review_focus": ["coordination"], "confidence": "high"}, {"cluster_id": "Equipment_RTU-1_RTU-2", "cluster_type": "equipment", "primary_location_key": {"room": null, "room_name": null, "level": "Roof", "grid": "B-C/4-5", "tag": "RTU-1,2", "detail_reference": null, "plan_zone": null}, "disciplines_present": ["Mechanical", "Architectural"], "disciplines_expected": ["Electrical", "Structural"], "assertion_ids": ["M01.01#0", "M01.01#1", "M01.01#2", "M01.01#3", "M01.01#4", "M01.01#5", "M01.01#6", "M01.01#7", "M01.01#8", "M01.01#9", "M01.01#10", "M01.01#11", "M01.01#12", "M01.01#13", "M01.01#14", "M01.01#15", "M01.01#16", "M01.01#17", "A25.01#4", "A25.01#5", "A25.01#6", "A25.01#7", "M02.02#4", "M02.02#6"], "possible_relationships": [], "review_focus": ["coordination", "constructability"], "confidence": "high"}, {"cluster_id": "Equipment_EWH-1", "cluster_type": "equipment", "primary_location_key": {"room": null, "room_name": "Above Ceiling", "level": "1", "grid": null, "tag": "EWH-1", "detail_reference": null, "plan_zone": null}, "disciplines_present": ["Plumbing"], "disciplines_expected": ["Electrical", "Structural"], "assertion_ids": ["P01.01#6", "P01.01#7", "P01.01#8", "P01.01#9", "P02.02#7", "P02.02#8", "P02.02#9", "P03.01#4", "P03.01#5", "P03.01#6", "P03.01#7", "P03.01#8"], "possible_relationships": [], "review_focus": ["coordination", "constructability"], "confidence": "high"}, {"cluster_id": "Fixture_WC-1", "cluster_type": "fixture", "primary_location_key": {"room": "102, 103", "room_name": "RESTROOMS", "level": "1", "grid": null, "tag": "WC-1", "detail_reference": null, "plan_zone": null}, "disciplines_present": ["Architectural", "Plumbing"], "disciplines_expected": [], "assertion_ids": ["A51.01#4", "A51.01#5", "A51.01#17", "P01.01#10", "P01.01#11", "P01.01#12", "P02.01#8", "P02.01#10", "P03.01#17", "P03.01#18"], "possible_relationships": [], "review_focus": ["coordination", "ada"], "confidence": "high"}, {"cluster_id": "Fixture_L-1", "cluster_type": "fixture", "primary_location_key": {"room": "102, 103", "room_name": "RESTROOMS", "level": "1", "grid": null, "tag": "L-1", "detail_reference": null, "plan_zone": null}, "disciplines_present": ["Architectural", "Plumbing"], "disciplines_expected": [], "assertion_ids": ["A51.01#6", "A51.01#7", "P01.01#13", "P01.01#14", "P01.01#15", "P02.01#11", "P02.02#12"], "possible_relationships": [], "review_focus": ["coordination", "ada"], "confidence": "high"}, {"cluster_id": "Fixture_SK-1", "cluster_type": "fixture", "primary_location_key": {"room": null, "room_name": "LOUNGE", "level": "1", "grid": null, "tag": "SK-1", "detail_reference": null, "plan_zone": null}, "disciplines_present": ["Plumbing"], "disciplines_expected": ["Architectural"], "assertion_ids": ["P01.01#18", "P01.01#19", "P02.01#12", "P02.01#16", "P02.01#17", "P03.01#15", "P03.01#16"], "possible_relationships": [], "review_focus": ["coordination", "ada"], "confidence": "high"}, {"cluster_id": "Fixture_MS-1", "cluster_type": "fixture", "primary_location_key": {"room": null, "room_name": "CLEANING SUPPLIES/STORAGE", "level": "1", "grid": null, "tag": "MS-1", "detail_reference": null, "plan_zone": null}, "disciplines_present": ["Plumbing"], "disciplines_expected": ["Architectural"], "assertion_ids": ["P01.01#16", "P01.01#17", "P02.01#13"]}] \ No newline at end of file diff --git a/backend/.llm_cache/ceedc254cfc972101dbfb1d78b8af11771f0bc3eef7ae44fda7ef12b867f91fb.json b/backend/.llm_cache/ceedc254cfc972101dbfb1d78b8af11771f0bc3eef7ae44fda7ef12b867f91fb.json new file mode 100644 index 0000000..7331738 --- /dev/null +++ b/backend/.llm_cache/ceedc254cfc972101dbfb1d78b8af11771f0bc3eef7ae44fda7ef12b867f91fb.json @@ -0,0 +1 @@ +[{"cluster_id": "cluster_01", "cluster_type": "general", "primary_location_key": {"room": null, "room_name": null, "level": null, "grid": null, "tag": "Project Identification", "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General", "Architectural"], "disciplines_expected": [], "assertion_ids": ["G11.01#0", "G11.01#1", "G11.01#2", "G11.04#4", "A11.01#0"], "possible_relationships": [], "review_focus": ["coordination"], "confidence": "high"}, {"cluster_id": "cluster_02", "cluster_type": "general", "primary_location_key": {"room": null, "room_name": null, "level": "BUILDING C", "grid": null, "tag": null, "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General", "Architectural"], "disciplines_expected": [], "assertion_ids": ["G11.03#0", "G11.03#15", "G11.04#2", "G11.04#3", "G11.04#5", "G11.04#6", "G11.04#7", "G11.04#8", "A11.01#1", "A11.01#3", "A11.01#13"], "possible_relationships": [], "review_focus": ["coordination", "code"], "confidence": "high"}, {"cluster_id": "cluster_03", "cluster_type": "code_item", "primary_location_key": {"room": null, "room_name": null, "level": null, "grid": null, "tag": "Applicable Codes and Authorities", "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General", "Architectural", "Electrical"], "disciplines_expected": ["Mechanical", "Plumbing", "Structural", "Fire Protection"], "assertion_ids": ["G11.01#3", "G21.01#7", "G21.01#8", "G21.01#9", "G21.01#10", "G21.01#11", "G21.01#12", "G21.01#13", "G21.01#14", "G31.02#3", "A23.01#0", "A23.01#1", "E01.01#0", "E03.01#2"], "possible_relationships": [], "review_focus": ["code"], "confidence": "high"}, {"cluster_id": "cluster_04", "cluster_type": "general", "primary_location_key": {"room": null, "room_name": null, "level": null, "grid": null, "tag": "Project Scope", "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General"], "disciplines_expected": [], "assertion_ids": ["G11.04#0", "G11.04#9", "G21.01#15"], "possible_relationships": [], "review_focus": ["coordination"], "confidence": "high"}, {"cluster_id": "cluster_05", "cluster_type": "code_item", "primary_location_key": {"room": null, "room_name": null, "level": null, "grid": null, "tag": "Firestopping / SPEC 078400", "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General", "Electrical", "Plumbing", "Architectural"], "disciplines_expected": ["Mechanical", "Structural"], "assertion_ids": ["G11.01#5", "G31.02#5", "G31.04#7", "G31.04#8", "A23.01#3", "E05.01#6", "E05.01#7", "E05.01#8", "P01.01#0", "P01.01#2", "E05.01#16"], "possible_relationships": [], "review_focus": ["code", "coordination"], "confidence": "high"}, {"cluster_id": "cluster_06", "cluster_type": "general", "primary_location_key": {"room": null, "room_name": null, "level": null, "grid": null, "tag": "Dimensioning Conventions", "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General"], "disciplines_expected": [], "assertion_ids": ["G11.01#7", "G11.01#9", "G11.01#10", "G11.01#11", "G11.01#12", "G11.01#13"], "possible_relationships": [], "review_focus": ["constructability"], "confidence": "high"}, {"cluster_id": "cluster_07", "cluster_type": "ceiling", "primary_location_key": {"room": null, "room_name": null, "level": null, "grid": null, "tag": "General Ceiling System", "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General", "Architectural"], "disciplines_expected": ["Mechanical", "Electrical", "Plumbing"], "assertion_ids": ["G11.01#8", "A22.01#5", "A22.01#6", "A23.01#8", "A23.01#10", "G31.05#8"], "possible_relationships": [{"related_cluster_or_assertion_id": "A23.01#11", "reason": "Assertion A23.01#11 describes the ceiling grid C4-A also mentioned in this cluster.", "confidence": "high"}], "review_focus": ["coordination"], "confidence": "high"}, {"cluster_id": "cluster_08", "cluster_type": "fixture", "primary_location_key": {"room": null, "room_name": null, "level": null, "grid": null, "tag": "C4 A", "detail_reference": null, "plan_zone": null}, "disciplines_present": ["Architectural"], "disciplines_expected": [], "assertion_ids": ["A23.01#11"], "possible_relationships": [{"related_cluster_or_assertion_id": "cluster_07", "reason": "This is the specification for the ceiling grid used generally throughout the project.", "confidence": "high"}], "review_focus": ["coordination"], "confidence": "high"}, {"cluster_id": "cluster_09", "cluster_type": "ceiling", "primary_location_key": {"room": null, "room_name": null, "level": null, "grid": null, "tag": "Ceiling Device Coordination", "detail_reference": null, "plan_zone": null}, "disciplines_present": ["Architectural", "Electrical"], "disciplines_expected": ["Mechanical", "Fire Protection"], "assertion_ids": ["A22.01#1", "A22.01#3", "A22.01#4", "E05.01#15"], "possible_relationships": [], "review_focus": ["coordination", "constructability"], "confidence": "high"}, {"cluster_id": "cluster_10", "cluster_type": "general", "primary_location_key": {"room": null, "room_name": null, "level": "ROOF", "grid": null, "tag": null, "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General", "Architectural", "Mechanical"], "disciplines_expected": ["Structural", "Electrical"], "assertion_ids": ["G11.01#14", "G11.03#7", "A25.01#0", "A25.01#2", "A25.01#3", "M03.01#14", "M03.01#15", "M03.01#16", "E02.02#0"], "possible_relationships": [], "review_focus": ["coordination", "constructability"], "confidence": "high"}, {"cluster_id": "cluster_11", "cluster_type": "general", "primary_location_key": {"room": null, "room_name": null, "level": null, "grid": null, "tag": "Landlord Required Contractors", "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General"], "disciplines_expected": [], "assertion_ids": ["G11.03#16", "G11.03#17", "G11.03#18", "G11.03#19", "G11.03#20"], "possible_relationships": [], "review_focus": ["constructability", "owner_standard"], "confidence": "high"}, {"cluster_id": "cluster_12", "cluster_type": "general", "primary_location_key": {"room": null, "room_name": null, "level": null, "grid": null, "tag": "Slab-on-Grade", "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General", "Architectural", "Plumbing"], "disciplines_expected": ["Structural"], "assertion_ids": ["G11.03#12", "G11.03#13", "G11.03#14", "A23.01#4", "A24.01#4", "P03.01#11", "P03.01#12", "P03.01#13", "P03.01#14"], "possible_relationships": [], "review_focus": ["coordination", "constructability"], "confidence": "high"}, {"cluster_id": "cluster_13", "cluster_type": "wall", "primary_location_key": {"room": null, "room_name": "Demising walls", "level": "BUILDING C", "grid": null, "tag": null, "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General"], "disciplines_expected": ["Architectural"], "assertion_ids": ["G11.03#9", "G11.03#10"], "possible_relationships": [], "review_focus": ["coordination", "constructability", "owner_standard"], "confidence": "high"}, {"cluster_id": "cluster_14", "cluster_type": "code_item", "primary_location_key": {"room": null, "room_name": null, "level": null, "grid": null, "tag": "Occupancy & Egress", "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General"], "disciplines_expected": ["Architectural"], "assertion_ids": ["G11.04#1", "G11.04#10", "G11.04#11"], "possible_relationships": [], "review_focus": ["code"], "confidence": "high"}, {"cluster_id": "cluster_15", "cluster_type": "room", "primary_location_key": {"room": null, "room_name": "SALES AREA", "level": null, "grid": null, "tag": null, "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General", "Architectural", "Electrical", "Plumbing"], "disciplines_expected": ["Mechanical"], "assertion_ids": ["G21.01#6", "A22.01#16", "A24.01#14", "E03.01#3", "E04.01#6", "E04.01#12", "E04.01#13", "P02.01#6", "P02.02#6"], "possible_relationships": [], "review_focus": ["coordination"], "confidence": "high"}, {"cluster_id": "cluster_16", "cluster_type": "room", "primary_location_key": {"room": null, "room_name": "INVENTORY", "level": null, "grid": null, "tag": null, "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General", "Architectural", "Electrical", "Plumbing"], "disciplines_expected": ["Mechanical"], "assertion_ids": ["G21.01#0", "A24.01#8", "A24.01#15", "A24.01#17", "A24.01#18", "A24.01#19", "E04.01#0", "E04.01#7", "P02.01#0", "P02.02#0", "P02.02#10"], "possible_relationships": [], "review_focus": ["coordination"], "confidence": "high"}, {"cluster_id": "cluster_17", "cluster_type": "room", "primary_location_key": {"room": null, "room_name": "LOUNGE", "level": null, "grid": null, "tag": null, "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General", "Architectural", "Electrical", "Plumbing"], "disciplines_expected": ["Mechanical"], "assertion_ids": ["G21.01#1", "A24.01#9", "A24.01#20", "A51.01#17", "E01.02#16", "E01.02#17", "E01.02#18", "E04.01#1", "E04.01#8", "P02.01#1", "P02.02#1", "P02.02#11", "P02.02#12"], "possible_relationships": [], "review_focus": ["coordination"], "confidence": "high"}, {"cluster_id": "cluster_18", "cluster_type": "room", "primary_location_key": {"room": "103", "room_name": "MEN'S RESTROOM", "level": null, "grid": null, "tag": null, "detail_reference": null, "plan_zone": null}, "disciplines_present": ["General", "Architectural", "Electrical", "Plumbing"], "disciplines_expected": ["Mechanical"], "assertion_ids": ["G21.01#2"]}] \ No newline at end of file diff --git a/backend/.llm_cache/cf1fe0cb89126765ff1b34ce95bb289ceb714365d9537b8df2912833c166ae7b.json b/backend/.llm_cache/cf1fe0cb89126765ff1b34ce95bb289ceb714365d9537b8df2912833c166ae7b.json new file mode 100644 index 0000000..2659067 --- /dev/null +++ b/backend/.llm_cache/cf1fe0cb89126765ff1b34ce95bb289ceb714365d9537b8df2912833c166ae7b.json @@ -0,0 +1 @@ +{"project_code_profile": {"project_name": "Verizon Elyson", "project_address": "Elysin Parkway", "jurisdiction": {"city": "Katy", "county": "Harris County", "state": "Texas", "country": "USA", "authority_having_jurisdiction": ["City of Katy Planning & Development Department", "Harris County Fire Marshal's Office"], "fire_marshal": "Harris County Fire Marshal", "building_department": "City of Katy Planning & Development Department", "accessibility_reviewer": "Texas Department of Licensing and Regulation (TDLR)"}, "project_classification": {"project_type": "Commercial", "work_type": "remodel", "occupancy": "Business (B) / Mercantile (M)", "construction_type": "unknown", "sprinklered": "unknown", "public_project": "false", "healthcare_project": "false", "food_service_project": "false", "airport_project": "false", "school_project": "false"}, "adopted_codes": {"building_code": "2018 IBC with local amendments", "existing_building_code": "2018 IEBC with local amendments", "fire_code": "2018 IFC with local amendments", "mechanical_code": "2018 IMC with local amendments", "plumbing_code": "2018 IPC with local amendments", "electrical_code": "2020 NEC with local amendments", "energy_code": "2018 IECC with local amendments", "accessibility_code": "2010 ADA Standards, Texas Accessibility Standards (TAS)"}, "review_paths": {"ibc_review": true, "iebc_review": true, "fire_code_review": true, "ada_review": true, "tas_tdlr_review": true, "municode_review": true, "health_department_review": false, "owner_standard_review": false}, "local_amendment_sources": [{"source_name": "Municode", "jurisdiction": "City of Katy, Texas", "source_url": "https://library.municode.com/tx/katy/codes/code_of_ordinances", "status": "needs_lookup"}], "missing_information": ["Complete project address (street number, city, state, zip code) to confirm jurisdiction.", "Specific occupancy classification (e.g., Business Group B, Mercantile Group M).", "Construction type.", "Sprinkler status.", "Confirmation of adopted code editions and local amendments.", "Requirement for Owner Standards review (e.g., Verizon corporate standards)."], "assumptions": ["Project is located within the city limits of Katy, Texas, in Harris County, based on the street name 'Elyson Parkway'.", "Project is subject to City of Katy building department and Harris County Fire Marshal review.", "The project requires plan review and inspection under the Texas Accessibility Standards (TAS) program administered by TDLR.", "The work type 'Remodel' triggers review under the International Existing Building Code (IEBC)."], "human_confirmation_required": true}} \ No newline at end of file diff --git a/backend/.llm_cache/d125eb17f6b30bc790531b63b358daaa50a49bcf15badbe940cc58fe09dd53ab.json b/backend/.llm_cache/d125eb17f6b30bc790531b63b358daaa50a49bcf15badbe940cc58fe09dd53ab.json new file mode 100644 index 0000000..7a824e6 --- /dev/null +++ b/backend/.llm_cache/d125eb17f6b30bc790531b63b358daaa50a49bcf15badbe940cc58fe09dd53ab.json @@ -0,0 +1 @@ +{"issues": [{"issue_id": "JURISDICTION-CONFLICT-01", "source_stage": "code", "category": "building_code", "severity": "critical", "confidence": "high", "location": "Project Profile vs. Sheet A11.01", "disciplines": ["Architectural", "General"], "sheets": ["A11.01"], "description": "The project address is identified as '7022 ELYSON EXCHANGE WAY CYPRESS, TX 77433' on the site plan, which is in unincorporated Harris County. This conflicts with the project profile, which lists the jurisdiction as the 'City of Katy'. The City of Katy is not the Authority Having Jurisdiction (AHJ) for unincorporated Harris County. This discrepancy must be resolved as it affects which building department is responsible for review and which local code amendments apply.", "evidence": [{"discipline": "Architectural", "sheet": "A11.01", "source_text": "VERIZON ELYSON\n7022 ELYSON EXCHANGE WAY\nCYPRESS, TX 77433", "asserted_value": "7022 ELYSON EXCHANGE WAY, CYPRESS, TX 77433"}], "recommended_resolution": "Confirm the correct project jurisdiction with the client. Update the project documentation to reflect the correct Authority Having Jurisdiction (AHJ), which is likely Harris County Engineering Department for building permits and Harris County Fire Marshal for fire code, and review the project against all applicable Harris County amendments.", "code_reference": null}, {"issue_id": "SPEC-FIRE-DOOR-RATING-01", "source_stage": "code", "category": "fire_separation", "severity": "medium", "confidence": "high", "location": "Sheet G31.04 - SPEC 081113 3.B.1", "disciplines": ["Architectural", "Specifications"], "sheets": ["G31.04"], "description": "Specification 081113 3.B.1 for hollow metal doors requires a '90 MINUTE RATED CLASS C' assembly. Per standard fire protection classifications (e.g., IBC Table 716.1), a 90-minute fire door assembly is a Class B opening, typically for 2-hour rated walls. A Class C opening is typically rated 45-minutes for use in 1-hour rated walls. The specification is contradictory and could lead to ordering incorrect materials.", "evidence": [{"discipline": "General", "sheet": "G31.04", "source_text": "WHERE REQUIRED, INSTALLED FRAME AND DOOR ASSEMBLY SHALL CONFORM TO A 90 MINUTE RATED CLASS C INDICATED.", "asserted_value": "90"}], "recommended_resolution": "Revise specification 081113 3.B.1 to correctly align the fire-protection rating (in minutes) with the corresponding opening classification (e.g., 'Class B') based on the fire-resistance rating of the wall in which the assembly is installed.", "code_reference": null}]} \ No newline at end of file diff --git a/backend/.llm_cache/d2e21880bc98c83f8ded0b4eb8169706944fb52cd37254891c169dcca4271c99.json b/backend/.llm_cache/d2e21880bc98c83f8ded0b4eb8169706944fb52cd37254891c169dcca4271c99.json new file mode 100644 index 0000000..e39d217 --- /dev/null +++ b/backend/.llm_cache/d2e21880bc98c83f8ded0b4eb8169706944fb52cd37254891c169dcca4271c99.json @@ -0,0 +1 @@ +{"issues": [{"issue_id": "QAQC-001", "source_stage": "qaqc", "category": "missing_sheet", "severity": "critical", "confidence": "high", "location": "Drawing Set", "disciplines": ["Architectural", "Mechanical"], "sheets": ["G11.01"], "description": "Critical architectural and mechanical plan sheets are missing from the drawing set. The sheet index indicates pages 14, 15, and 22 failed extraction. Based on standard set organization, these are likely the Architectural Dimension/Construction Plan, the Architectural Reflected Ceiling Plan, and the Mechanical HVAC Plan. The drawing set is incomplete and cannot be bid, permitted, or built without these essential plans.", "evidence": [{"discipline": "System", "sheet": "sheet_index", "source_text": "Page 14 (extraction failed), Architectural, floor_plan", "asserted_value": "Missing Architectural Construction/Dimension Plan"}, {"discipline": "System", "sheet": "sheet_index", "source_text": "Page 15 (extraction failed), Architectural, reflected_ceiling_plan", "asserted_value": "Missing Architectural Reflected Ceiling Plan"}, {"discipline": "System", "sheet": "sheet_index", "source_text": "Page 22 (extraction failed), Mechanical, mep_plan", "asserted_value": "Missing Mechanical Floor Plan"}], "recommended_resolution": "Incorporate the missing plan sheets (A-Dimension Plan, A-Reflected Ceiling Plan, M-HVAC Plan) into the drawing set and update the sheet index.", "code_reference": null}, {"issue_id": "QAQC-002", "source_stage": "qaqc", "category": "missing_sheet", "severity": "critical", "confidence": "high", "location": "Drawing Set", "disciplines": ["Structural", "Architectural", "Mechanical", "Electrical"], "sheets": ["G01.01", "A25.01", "M03.01", "E05.02"], "description": "The drawing set has no Structural discipline sheets (S-series). This is a critical omission, as new rooftop units (RTUs) are specified, which impose new loads on the existing roof structure. Notes on Mechanical, Electrical and Architectural sheets explicitly require coordination with a structural engineer, yet no structural engineer is listed on the cover sheet (G01.01) and no structural drawings are provided to detail the required support or verify the capacity of the existing structure.", "evidence": [{"discipline": "System", "sheet": "sheet_index", "source_text": "Missing Expected Sheet: Structural Discipline", "asserted_value": "No S-sheets are present"}, {"discipline": "Mechanical", "sheet": "M03.01", "source_text": "ANGLE IRON FRAME ALL AROUND ROOF OPENING RE: STRUCTURAL.", "asserted_value": "Reference to Structural"}, {"discipline": "Electrical", "sheet": "E05.02", "source_text": "VERIFY SUPPORT SIZING AND DESIGNED WITH PROJECT STRUCTURAL ENGINEER PRIOR TO ASSEMBLY.", "asserted_value": "Requires verification with Structural Engineer"}, {"discipline": "Architectural", "sheet": "A23.01", "source_text": "ALL LOCATIONS OF CORE DRILLING OF THE FLOOR SLAB FOR INSTALLATION OF UTILITIES TO BE COORDINATED WITH LANDLORD'S STRUCTURAL ENGINEER BEFORE PERFORMING THE WORK", "asserted_value": "Requires coordination with Structural Engineer"}], "recommended_resolution": "Engage a structural engineer to review the existing structure, design support for new equipment, and produce the necessary structural drawings (S-series). Add the structural engineer to the consultant list on the cover sheet.", "code_reference": null}, {"issue_id": "QAQC-003", "source_stage": "qaqc", "category": "missing_schedule", "severity": "critical", "confidence": "high", "location": "Drawing Set", "disciplines": ["Architectural"], "sheets": [], "description": "The drawing set lacks Door and Window Schedules. Doors are shown on plans but are not tagged. Without schedules, essential information such as door/window sizes, types, materials, hardware groups, and fire-ratings are completely undefined. This information is critical for cost estimating, procurement, and code compliance for permitting.", "evidence": [{"discipline": "Architectural", "sheet": "G11.01", "source_text": "Sheet Index", "asserted_value": "No Door Schedule or Window Schedule sheet is listed."}, {"discipline": "Architectural", "sheet": "A24.01", "source_text": "Architectural Floor Plan", "asserted_value": "Doors are graphically indicated but have no identifying tags."}], "recommended_resolution": "Create and add Door and Window Schedules to the drawing set. Add corresponding tags to all doors and windows on the floor plans.", "code_reference": null}, {"issue_id": "QAQC-004", "source_stage": "qaqc", "category": "missing_detail", "severity": "high", "confidence": "high", "location": "Architectural Drawings", "disciplines": ["Architectural"], "sheets": ["G31.05", "G21.01"], "description": "There are no wall type definitions or a partition legend in the drawing set. While specifications on G31.05 mention gypsum board and G11.03 mentions R-19 insulation for demising walls, there is no comprehensive drawing that defines the full assemblies (stud size/gauge, spacing, insulation, STC ratings, and hourly ratings). Furthermore, the locations of any required fire-rated partitions are not shown on any plan. This makes it impossible to accurately bid or construct the partitions as required by code.", "evidence": [{"discipline": "Architectural", "sheet": "G11.01", "source_text": "Sheet Index", "asserted_value": "No sheet titled 'Wall Types' or 'Partition Legend' is listed."}, {"discipline": "General", "sheet": "G31.06", "source_text": "UL RATINGS - DESIGN #U419", "asserted_value": "A rated wall assembly is provided, but no plan indicates where it is to be used."}], "recommended_resolution": "Create a partition schedule/legend with dimensioned graphics for each wall type used in the project, including non-rated and rated assemblies. On the architectural floor plan, tag all walls with their corresponding partition type.", "code_reference": null}, {"issue_id": "QAQC-005", "source_stage": "qaqc", "category": "missing_information", "severity": "high", "confidence": "high", "location": "Architectural Drawings", "disciplines": ["Architectural", "Mechanical", "Electrical", "Plumbing"], "sheets": ["G11.01"], "description": "Ceiling heights are not defined anywhere in the drawing set. This is most likely due to the missing Reflected Ceiling Plan (likely page 15). Defined ceiling heights are critical for the installation of partitions, doors, MEP devices (lights, diffusers, sprinklers), and for overall code compliance (e.g., minimum headroom).", "evidence": [{"discipline": "System", "sheet": "sheet_index", "source_text": "Page 15 (extraction failed)", "asserted_value": "Missing Architectural Reflected Ceiling Plan"}, {"discipline": "General", "sheet": "G11.01", "source_text": "CEILING HEIGHTS INDICATED IN RCP'S ARE INDICATED FROM THE FINISHED FLOOR ELEVATION...", "asserted_value": "The convention for dimensioning ceiling heights is given, but the actual heights are not present."}], "recommended_resolution": "Provide the Reflected Ceiling Plan, clearly indicating the height of all ceiling types and conditions (e.g., ACT, GWB, soffits, open-to-structure).", "code_reference": null}, {"issue_id": "QAQC-006", "source_stage": "qaqc", "category": "missing_information", "severity": "medium", "confidence": "high", "location": "A23.01 - FINISH PLAN", "disciplines": ["Architectural"], "sheets": ["A23.01"], "description": "The Finish Legend on sheet A23.01 is incomplete. General notes refer to paint 'P-1' and wall base 'WB-1' being used throughout the space, but there are no corresponding entries in the legend to specify the manufacturer, product, color, and sheen/size for these finishes. This information is required for accurate bidding and procurement.", "evidence": [{"discipline": "Architectural", "sheet": "A23.01", "source_text": "L. WALLS TO BE PAINTED P-1 THROUGHOUT.", "asserted_value": "P-1 called out in general notes."}, {"discipline": "Architectural", "sheet": "A23.01", "source_text": "M. VINYL BASE WB-1 THROUGHOUT, U.N.O.", "asserted_value": "WB-1 called out in general notes."}, {"discipline": "Architectural", "sheet": "A23.01", "source_text": "FINISH LEGEND", "asserted_value": "The legend does not contain entries or specifications for P-1 or WB-1."}], "recommended_resolution": "Add entries for P-1 and WB-1 to the Finish Legend on sheet A23.01, including all necessary specification data (manufacturer, product name/number, color, etc.).", "code_reference": null}, {"issue_id": "QAQC-007", "source_stage": "qaqc", "category": "missing_detail", "severity": "medium", "confidence": "high", "location": "A24.01 - FURNITURE/ POWER/ DATA FLOOR PLAN", "disciplines": ["Architectural"], "sheets": ["A24.01", "G11.01"], "description": "A keynote on sheet A24.01 refers to detail '3/A92.01' for a foundation pour back detail. No sheet numbered A92.01 exists in the sheet index. This is a dead-end reference, making it impossible to locate the required detail.", "evidence": [{"discipline": "Architectural", "sheet": "A24.01", "source_text": "G. REFER TO DETAIL 3/A92.01 FOR FOUNDATION POUR BACK DETAIL WHERE EXISTING SLAB IS CUT.", "asserted_value": "3/A92.01"}, {"discipline": "General", "sheet": "G11.01", "source_text": "SHEET INDEX", "asserted_value": "No sheet A92.01 is listed in the set."}], "recommended_resolution": "Correct the detail reference to point to the correct sheet and detail number, or add the missing detail sheet A92.01 to the set.", "code_reference": null}, {"issue_id": "QAQC-008", "source_stage": "qaqc", "category": "clarity", "severity": "low", "confidence": "high", "location": "G01.01 - COVER SHEET", "disciplines": ["General"], "sheets": ["G01.01"], "description": "The project number on the cover sheet is listed as a placeholder '00.000.00'. For proper project tracking, archiving, and agency review, this should be updated to the correct, unique project number before the set is issued for bid, permit, or construction.", "evidence": [{"discipline": "General", "sheet": "G01.01", "source_text": "Project number 00.000.00", "asserted_value": "00.000.00"}], "recommended_resolution": "Update the project number on the cover sheet and all other relevant title block locations to the correct project number.", "code_reference": null}]} \ No newline at end of file diff --git a/backend/.llm_cache/d552cc34ae9cf59ec9a04acb4872546b1b644d9dfbfca30267453d1cfb7e3cc4.json b/backend/.llm_cache/d552cc34ae9cf59ec9a04acb4872546b1b644d9dfbfca30267453d1cfb7e3cc4.json new file mode 100644 index 0000000..517e555 --- /dev/null +++ b/backend/.llm_cache/d552cc34ae9cf59ec9a04acb4872546b1b644d9dfbfca30267453d1cfb7e3cc4.json @@ -0,0 +1 @@ +{"sheet_number": "E02.01", "discipline": "Electrical", "sheet_title": "FLOOR PLAN - POWER", "level": null, "scale": "1/4\" = 1'-0\"", "assertions": [{"subject": "General Note", "attribute": "general_note", "value": "Coordinate final receptacle/data locations with architect/owner prior to rough-in.", "source_text": "1. COORDINATE FINAL RECEPTACLE/DATA LOCATIONS WITH ARCHITECT/OWNER PRIOR TO ROUGH-IN.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "1"}}, {"subject": "General Note", "attribute": "general_note", "value": "Coordinate final floorbox locations with architect/owner prior to rough-in.", "source_text": "2. COORDINATE FINAL FLOORBOX LOCATIONS WITH ARCHITECT/OWNER PRIOR TO ROUGH-IN.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "2"}}, {"subject": "General Note", "attribute": "general_note", "value": "Refer to architectural drawings for dimensional locations of all outlets.", "source_text": "3. REFER TO ARCHITECTURAL DRAWINGS FOR DIMENSIONAL LOCATIONS OF ALL OUTLETS.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "3"}}, {"subject": "Floor Box", "attribute": "keynote_assertion", "value": "Provide combination (power/data) Hubbell Systemone fully recessed floorbox #CFB4G25 with flush round cover (finish approved by architect).", "source_text": "1 PROVIDE COMBINATION (POWER/DATA) HUBBELL SYSTEMONE FULLY RECESSED FLOORBOX #CFB4G25 WITH FLUSH ROUND COVER (FINISH APPROVED BY ARCHITECT). PROVIDE WITH (1) DUPLEX RECEPTACLE. COORDINATE CONCRETE DEPTH REQUIREMENTS WITH G.C. COORDINATE FLOOR BOX ACCESSORIES WITH OWNER.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "1"}}, {"subject": "Floor Box", "attribute": "keynote_assertion", "value": "Provide (power) Hubbell Systemone fully recessed floorbox #PFBI with flush round cover (finish approved by architect).", "source_text": "2 PROVIDE (POWER) HUBBELL SYSTEMONE FULLY RECESSED FLOORBOX #PFBI WITH FLUSH ROUND COVER (FINISH APPROVED BY ARCHITECT). PROVIDE WITH (1) DUPLEX RECEPTACLE. COORDINATE CONCRETE DEPTH REQUIREMENTS WITH G.C. COORDINATE FLOOR BOX ACCESSORIES WITH OWNER.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "2"}}, {"subject": "Data Conduit", "attribute": "penetration", "value": "1-1/4\"C with pullstring for data to ceiling space above rack system in inventory room.", "source_text": "3 PROVIDE 1-1/4\"C WITH PULLSTRING FOR DATA TO CEILING SPACE ABOVE RACK SYSTEM IN INVENTORY ROOM VIA NEAREST FULL HEIGHT INTERIOR WALL.", "confidence": "high", "location_key": {"grid": null, "room": "INVENTORY", "level": null, "tag": "3"}}, {"subject": "Building Sign", "attribute": "keynote_assertion", "value": "Provide power for building sign. Coordinate final location and mounting height prior to rough-in.", "source_text": "4 PROVIDE POWER FOR BUILDING SIGN. COORDINATE FINAL LOCATION AND MOUNTING HEIGHT PRIOR TO ROUGH-IN.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "4"}}, {"subject": "Network Racks", "attribute": "keynote_assertion", "value": "Furnish and install #10 Cu ground with ground lug for connection to network racks.", "source_text": "5 FURNISH AND INSTALL #10 Cu GROUND WITH GROUND LUG FOR CONNECTION TO NETWORK RACKS.", "confidence": "high", "location_key": {"grid": null, "room": "INVENTORY", "level": null, "tag": "5"}}, {"subject": "Data Equipment Wiring", "attribute": "penetration", "value": "(3) 3\" conduit sleeves from 6\" below dropped ceiling to 6\" above dropped ceiling.", "source_text": "6 FURNISH AND INSTALL (3) 3\" CONDUIT SLEEVES FROM 6\" BELOW DROPPED CEILING TO 6\" ABOVE DROPPED CEILING FOR DATA EQUIPMENT WIRING.", "confidence": "high", "location_key": {"grid": null, "room": "INVENTORY", "level": null, "tag": "6"}}, {"subject": "Transformer", "attribute": "keynote_assertion", "value": "Transformer to be suspended from structure at high level above accessible ceiling.", "source_text": "7 TRANSFORMER TO BE SUSPENDED FROM STRUCTURE AT HIGH LEVEL ABOVE ACCESSIBLE CEILING.", "confidence": "high", "location_key": {"grid": null, "room": "LOUNGE", "level": null, "tag": "7"}}]} \ No newline at end of file diff --git a/backend/.llm_cache/d997d581ba7c64e723d87f9fa0a6ec86b7e2eba3a8f8e818875debaa7db571bd.json b/backend/.llm_cache/d997d581ba7c64e723d87f9fa0a6ec86b7e2eba3a8f8e818875debaa7db571bd.json new file mode 100644 index 0000000..a620b70 --- /dev/null +++ b/backend/.llm_cache/d997d581ba7c64e723d87f9fa0a6ec86b7e2eba3a8f8e818875debaa7db571bd.json @@ -0,0 +1 @@ +{"sheet_number": "E01.02", "discipline": "Electrical", "sheet_title": "ONE LINE DIAGRAM AND SCHEDULES", "level": null, "scale": "NTS", "assertions": [{"subject": "System Parameter", "attribute": "Base Voltage", "value": "480", "source_text": "Parameter: Base Voltage, Symbol: VB=, Value: 480, Units: V", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "System Parameter", "attribute": "Phases", "value": "3", "source_text": "Parameter: Phases, Symbol: P=, Value: .3, Units: phi", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "System Parameter", "attribute": "Utility Fault", "value": "35400", "source_text": "Parameter: Utility Fault, Symbol: ISC=, Value: 35400, Units: A", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "System Parameter", "attribute": "Base Total Power", "value": "500", "source_text": "Parameter: Base Total Power, Symbol: SB=, Value: 500, Units: KVA", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "general_note", "attribute": "general_note", "value": "Provide low-voltage dry-type transformers that meet the minimum efficiency requirements of 2021 IECC table C405.8.", "source_text": "1. PROVIDE LOW-VOLTAGE DRY-TYPE TRANSFORMERS THAT MEET THE MINIMUM EFFICIENCY REQUIREMENTS OF 2021 IECC TABLE C405.8.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "1"}}, {"subject": "general_note", "attribute": "general_note", "value": "Provide as-built drawings for electrical power systems to the building owner.", "source_text": "4. CONTRACTOR SHALL PROVIDE AS-BUILT DRAWINGS FOR ELECTRICAL POWER SYSTEMS TO THE BUILDING OWNER.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "4"}}, {"subject": "Luminaire", "attribute": "schedule_entry", "value": "Type L-4 is a 2'x2' recessed indirect light fixture.", "source_text": "TYPE: L-4, MANUFACTURER: LITHONIA, CATALOG NUMBER: 2BLT2-33L-ADSM-EZ1-LP840, DESCRIPTION: 2'x2' RECESSED INDIRECT, 4000K, 90+CRI, ACRYLIC SHIELDING, WHITE FINISH, MOUNTING: RECESSED", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "L-4"}}, {"subject": "Luminaire", "attribute": "schedule_entry", "value": "Type L-4E is same as L-4 and includes an emergency battery backup.", "source_text": "TYPE: L-4E, CATALOG NUMBER: 2BLT2-33L-ADSM-EZ1-LP840-E10WLCP, NOTES: TYPE L-4E SAME EXCEPT PROVIDE WITH EMERGENCY BATTERY BACKUP.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "L-4E"}}, {"subject": "Luminaire", "attribute": "mounting_height_AFF", "value": "5'-5\"", "source_text": "TYPE: L-5, DESCRIPTION: 12\" PENDANT, MOUNTING: PENDANT, NOTES: PENDANT 5'-5\" AFF", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "L-5"}}, {"subject": "Luminaire", "attribute": "mounting_height_AFF", "value": "5'-5\"", "source_text": "TYPE: L-6, DESCRIPTION: 16\" PENDANT, MOUNTING: PENDANT, NOTES: PENDANT 5'-5\" AFF", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "L-6"}}, {"subject": "Luminaire", "attribute": "schedule_entry", "value": "Type X is a LED exit sign with Nickel Cadmium battery and self diagnostics.", "source_text": "TYPE: X, DESCRIPTION: LED EXIT SIGN WITH NICKEL CADMIUM BATTERY AND SELF DIAGNOSTICS", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "X"}}, {"subject": "Luminaire", "attribute": "note", "value": "Emergency egress operation in fixtures shall provide minimum 400 lumens for minimum 90 minutes.", "source_text": "1. EMERGENCY EGRESS OPERATION IN FIXTURES SHALL PROVIDE MINIMUM 400 LUMENS FOR MINIMUM 90 MINUTES", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "1"}}, {"subject": "Electrical Load", "attribute": "connected_load", "value": "5", "source_text": "DESCRIPTION: WATER HEATING, CONNECTED (KVA): 5, DEMAND (KVA): 5", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Electrical Load", "attribute": "connected_load", "value": "21", "source_text": "DESCRIPTION: HVAC HEATING *, CONNECTED (KVA): 21, DEMAND (KVA): 21", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Electrical Load", "attribute": "connected_load", "value": "<17", "source_text": "DESCRIPTION: HVAC COOLING *, CONNECTED (KVA): <17, DEMAND (KVA): <17", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Electrical Service", "attribute": "service_size", "value": "100", "source_text": "RECOMMENDED SERVICE SIZE AT 480V 3P 4W = 100 AMPS", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Panel H", "attribute": "equipment_location", "value": "LOUNGE", "source_text": "PANEL NAME H, LOCATION LOUNGE", "confidence": "high", "location_key": {"grid": null, "room": "LOUNGE", "level": null, "tag": "H"}}, {"subject": "Panel H", "attribute": "mounting", "value": "SURFACE", "source_text": "MOUNTING SURFACE", "confidence": "high", "location_key": {"grid": null, "room": "LOUNGE", "level": null, "tag": "H"}}, {"subject": "Panel L", "attribute": "equipment_location", "value": "LOUNGE", "source_text": "PANEL NAME L, LOCATION LOUNGE", "confidence": "high", "location_key": {"grid": null, "room": "LOUNGE", "level": null, "tag": "L"}}]} \ No newline at end of file diff --git a/backend/.llm_cache/db4080e6c546d27627d8cca92f3121a107e14ffc424521bd8312624eea1dc1ca.json b/backend/.llm_cache/db4080e6c546d27627d8cca92f3121a107e14ffc424521bd8312624eea1dc1ca.json new file mode 100644 index 0000000..246a086 --- /dev/null +++ b/backend/.llm_cache/db4080e6c546d27627d8cca92f3121a107e14ffc424521bd8312624eea1dc1ca.json @@ -0,0 +1 @@ +{"sheet_number": null, "discipline": "Unknown", "sheet_title": "Page 15 (extraction failed)", "level": null, "scale": null, "assertions": []} \ No newline at end of file diff --git a/backend/.llm_cache/db59b33ffbe19f17b5959e0cac43bcf9eb9715f1f3ceba6352603f7973d05a96.json b/backend/.llm_cache/db59b33ffbe19f17b5959e0cac43bcf9eb9715f1f3ceba6352603f7973d05a96.json new file mode 100644 index 0000000..379038f --- /dev/null +++ b/backend/.llm_cache/db59b33ffbe19f17b5959e0cac43bcf9eb9715f1f3ceba6352603f7973d05a96.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "scope_description_buildout_vs_remodel", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "Project Scope Description", "disciplines": ["General"], "sheets": ["G11.04", "G21.01"], "description": "The project scope is described inconsistently across sheets. Sheet G11.04 describes the project as a 'LEASE SPACE BUILD-OUT' for a 'FIRST GENERATION RETAIL SPACE', implying construction in a new, unfinished shell space. Sheet G21.01 describes the project as a 'TENANT INTERIOR REMODEL', which implies demolition and alteration of an existing, previously finished space. This needs to be clarified as it affects the expected scope of work, particularly regarding demolition.", "evidence": [{"discipline": "General", "sheet": "G11.04", "source_text": "PROJECT IS A TENANT INTERIOR LEASE SPACE BUILD OUT FOR A FIRST GENERATION RETAIL SPACE.", "asserted_value": "First Generation Build-out"}, {"discipline": "General", "sheet": "G21.01", "source_text": "PROJECT IS A TENANT INTERIOR REMODEL OF 3,323 SF", "asserted_value": "Remodel"}], "recommended_resolution": "verify with architect"}]} \ No newline at end of file diff --git a/backend/.llm_cache/dcdc25abbcf4f3f1456299222d78e198ed7b5612d1d1fb9dfe86a45e1194fa8f.json b/backend/.llm_cache/dcdc25abbcf4f3f1456299222d78e198ed7b5612d1d1fb9dfe86a45e1194fa8f.json new file mode 100644 index 0000000..ebbbdc5 --- /dev/null +++ b/backend/.llm_cache/dcdc25abbcf4f3f1456299222d78e198ed7b5612d1d1fb9dfe86a45e1194fa8f.json @@ -0,0 +1 @@ +[{"assertion_id": "P01.01#4", "attribute": "pipe_material_above_slab", "original_value": "Sanitary Waste and Vent (Above Slab Only): Cast iron pipe and fittings, ASTM A 888 or CISPI 301.", "source_text": "2. SANITARY WASTE AND VENT: (ABOVE SLAB ONLY). PIPE: CAST IRON PIPE AND FITTINGS, ASTM A 888 OR CISPI 301.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive text with multiple specifications, no simple normalization possible.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#5", "attribute": "pipe_material_domestic_water", "original_value": "Domestic Water: Type 'L' copper tubing with wrought copper fittings and 95/5 (tin/antimony) solder joints.", "source_text": "3. DOMESTIC WATER: TYPE 'L' COPPER TUBING WITH WROUGHT COPPER FITTINGS AND 95/5 (TIN/ANTIMONY) SOLDER JOINTS.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive text with multiple specifications, no simple normalization possible.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#6", "attribute": "voltage", "original_value": "480", "source_text": "VOLTS 480", "normalized_value": "480", "normalized_unit": "V", "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#7", "attribute": "phase", "original_value": "3", "source_text": "PHASE 3", "normalized_value": "3", "normalized_unit": "phase", "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#8", "attribute": "power_kW", "original_value": "5", "source_text": "KW 5", "normalized_value": "5", "normalized_unit": "kW", "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#9", "attribute": "tank_capacity", "original_value": "30", "source_text": "TANK CAPACITY GALLONS 30", "normalized_value": "30", "normalized_unit": "gal", "normalized_attribute": null, "normalization_notes": "Unit 'gallons' inferred from source text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#10", "attribute": "mounting_type", "original_value": "Floor Mounted", "source_text": "WATER CLOSET (FLOOR MOUNTED) (A.D.A.)", "normalized_value": "Floor Mounted", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#11", "attribute": "ada_compliant_height", "original_value": "ADA 17\"H elongated bowl", "source_text": "AMERICAN STANDARD \"ULTIMA VORMAX\", ADA 17\"H ELONGATED BOWL", "normalized_value": "17", "normalized_unit": "in", "normalized_attribute": "height", "normalization_notes": "Extracted height from descriptive text. 'H' and '\"' indicate height in inches.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#12", "attribute": "flush_handle_location", "original_value": "Flush handle to be on the wide side of the stall.", "source_text": "FLUSH HANDLE TO BE ON THE WIDE SIDE OF THE STALL.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive instruction.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#13", "attribute": "mounting_type", "original_value": "Wall Mounted", "source_text": "LAVATORY (WALL MOUNTED) (A.D.A.)", "normalized_value": "Wall Mounted", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#14", "attribute": "thermostatic_mixing_valve", "original_value": "LF-170 LEONARD THERMOSTATIC MIXING VALVE WITH THE OUTLET TEMPERATURE TO BE SET AT 110F.", "source_text": "LF-170 LEONARD THERMOSTATIC MIXING VALVE WITH THE OUTLET TEMPERATURE TO BE SET AT 110F.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Compound statement includes model and a temperature setting requirement. No simple normalization without losing meaning.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#15", "attribute": "ada_compliant_fixture", "original_value": "LAVATORY (WALL MOUNTED) (A.D.A.)", "source_text": "LAVATORY (WALL MOUNTED) (A.D.A.)", "normalized_value": "true", "normalized_unit": null, "normalized_attribute": "is_ada_compliant", "normalization_notes": "Inferred boolean 'true' from '(A.D.A.)' tag in the text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#16", "attribute": "mounting_type", "original_value": "Floor Mounted", "source_text": "63M HUSTEE ... 8\" HIGH FLOOR MOUNTED", "normalized_value": "Floor Mounted", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#17", "attribute": "mounting_type", "original_value": "Wall Mount Faucet", "source_text": "PROVIDE WITH MOEN #8230 WITH CHROME PLATED, CAST BRASS, WALL MOUNT, TWO HANDLE SERVICE SINK FAUCET WITH VACUUM BREAKER...", "normalized_value": "Wall Mounted", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Normalized 'Wall Mount Faucet' to standard term 'Wall Mounted'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#18", "attribute": "mounting_type", "original_value": "Self-rimming", "source_text": "LBAO221965PDC ELKAY, 18 GAUGE TYPE 304 STAINLESS STEEL SINK, SELF-RIMMING, 22\"X19\"X6.5\" NOM. DIMENSIONS...", "normalized_value": "Self-rimming", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#19", "attribute": "ada_compliant_fixture", "original_value": "SINGLE BOWL SINK (A.D.A)", "source_text": "SINGLE BOWL SINK (A.D.A)", "normalized_value": "true", "normalized_unit": null, "normalized_attribute": "is_ada_compliant", "normalization_notes": "Inferred boolean 'true' from '(A.D.A)' tag in the text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#20", "attribute": "trap_primer", "original_value": "Install automatic pressure drop activated trap primer by PPP products PR-500.", "source_text": "INSTALL AUTOMATIC PRESSURE DROP ACTIVATED TRAP PRIMER BY PPP PRODUCTS PR-500.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is an instruction. Extracting only the model number would change the meaning from an action to an identification.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#0", "attribute": "room_name", "original_value": "INVENTORY", "source_text": "INVENTORY", "normalized_value": "INVENTORY", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#1", "attribute": "room_name", "original_value": "LOUNGE", "source_text": "LOUNGE", "normalized_value": "LOUNGE", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#2", "attribute": "room_name", "original_value": "MEN'S RESTROOM", "source_text": "MEN'S RESTROOM", "normalized_value": "MEN'S RESTROOM", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#3", "attribute": "room_name", "original_value": "WOMEN'S ROOM", "source_text": "WOMEN'S ROOM", "normalized_value": "WOMEN'S RESTROOM", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Normalized to 'WOMEN'S RESTROOM' for consistency with other labels (e.g., P02.02#3).", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "P02.01#4", "attribute": "room_name", "original_value": "MANAGER'S OFFICE", "source_text": "MANAGER'S OFFICE", "normalized_value": "MANAGER'S OFFICE", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#5", "attribute": "room_name", "original_value": "CLEANING SUPPLIES/STORAGE", "source_text": "CLEANING SUPPLIES/STORAGE", "normalized_value": "CLEANING SUPPLIES/STORAGE", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#6", "attribute": "room_name", "original_value": "SALES AREA", "source_text": "SALES AREA", "normalized_value": "SALES AREA", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#7", "attribute": "fixture_location", "original_value": "EDF-1 is located in WOMEN'S ROOM.", "source_text": "EDF-1", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a relational statement.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#8", "attribute": "fixture_location", "original_value": "WC-1 is located in WOMEN'S ROOM.", "source_text": "WC-1", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a relational statement.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#9", "attribute": "fixture_location", "original_value": "FD-1 is located in WOMEN'S ROOM.", "source_text": "3\"FD-1", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a relational statement.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#10", "attribute": "fixture_location", "original_value": "WC-1 is located in MEN'S RESTROOM.", "source_text": "WC-1", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a relational statement.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#11", "attribute": "fixture_location", "original_value": "L-1 is located in MEN'S RESTROOM.", "source_text": "L-1", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a relational statement.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#12", "attribute": "fixture_location", "original_value": "SK-1 is located in LOUNGE.", "source_text": "SK-1", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a relational statement.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#13", "attribute": "fixture_location", "original_value": "MS-1 is located in CLEANING SUPPLIES/STORAGE.", "source_text": "MS-1", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a relational statement.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#14", "attribute": "fixture_location", "original_value": "FD-1 is located in CLEANING SUPPLIES/STORAGE.", "source_text": "3\"FD-1", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a relational statement.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#15", "attribute": "fixture_location", "original_value": "FS-1 is located in CLEANING SUPPLIES/STORAGE.", "source_text": "3\"FS-1", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a relational statement.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#16", "attribute": "pipe_size", "original_value": "2", "source_text": "2\"SAN", "normalized_value": "2", "normalized_unit": "in", "normalized_attribute": null, "normalization_notes": "Unit 'in' for inches inferred from '\"' symbol.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#17", "attribute": "pipe_size", "original_value": "2", "source_text": "2\"V", "normalized_value": "2", "normalized_unit": "in", "normalized_attribute": null, "normalization_notes": "Unit 'in' for inches inferred from '\"' symbol.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.01#18", "attribute": "pipe_size", "original_value": "2", "source_text": "2\"SAN", "normalized_value": "2", "normalized_unit": "in", "normalized_attribute": null, "normalization_notes": "Unit 'in' for inches inferred from '\"' symbol.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.02#0", "attribute": "room_name", "original_value": "INVENTORY", "source_text": "INVENTORY", "normalized_value": "INVENTORY", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.02#1", "attribute": "room_name", "original_value": "LOUNGE", "source_text": "LOUNGE", "normalized_value": "LOUNGE", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.02#2", "attribute": "room_name", "original_value": "MEN'S RESTROOM", "source_text": "MEN'S RESTROOM", "normalized_value": "MEN'S RESTROOM", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.02#3", "attribute": "room_name", "original_value": "WOMEN'S RESTROOM", "source_text": "WOMEN'S RESTROOM", "normalized_value": "WOMEN'S RESTROOM", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.02#4", "attribute": "room_name", "original_value": "CLEANING SUPPLIES/STORAGE", "source_text": "CLEANING SUPPLIES/STORAGE", "normalized_value": "CLEANING SUPPLIES/STORAGE", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.02#5", "attribute": "room_name", "original_value": "MANAGER'S OFFICE", "source_text": "MANAGER'S OFFICE", "normalized_value": "MANAGER'S OFFICE", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.02#6", "attribute": "room_name", "original_value": "SALES AREA", "source_text": "SALES AREA", "normalized_value": "SALES AREA", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.02#7", "attribute": "keynote_assertion", "original_value": "EWH-1 is located above ceiling, suspended as high as possible in ceiling plenum and requires an auxiliary drain pan.", "source_text": "KEYED NOTE: 1 EWH-1 ABOVE CEILING SUSPENDED AS HIGH AS POSSIBLE IN CEILING PLENUM. PROVIDE AUXILIARY DRAIN PAN BELOW WATER HEATER...", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is a descriptive text.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.02#8", "attribute": "Drain Routing", "original_value": "Route 3/4\" T&P drain line and 3/4\" auxiliary drain lines to floor sink below.", "source_text": "ROUTE 3/4\" T&P DRAIN LINE AND 3/4\" AUXILIARY DRAIN LINES TO FLOOR SINK BELOW.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is an instruction. No simple normalization possible.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.02#9", "attribute": "Support Requirement", "original_value": "Provide adequate supports to prevent any movement of T&P and aux. drain lines.", "source_text": "PROVIDE ADEQUATE SUPPORTS TO PREVENT ANY MOVEMENT OF T&P AND AUX. DRAIN LINES.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is an instruction. No simple normalization possible.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.02#10", "attribute": "keynote_assertion", "original_value": "Route proposed 1-1/4\" CW line to existing 2\" water main line.", "source_text": "KEYED NOTE: 2 ROUTE PROPOSED 1-1/4\" CW LINE TO EXISTING 2\" WATER MAIN LINE AT THIS APPROXIMATE LOCATION. FIELD VERIFY EXACT LOCATION AND SIZE OF EXISTING PIPE.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is an instruction. No simple normalization possible.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.02#11", "attribute": "keynote_assertion", "original_value": "Route 1/2\" cold and hot water down.", "source_text": "KEYED NOTE: 3 ROUTE 1/2\" COLD AND HOT WATER DOWN.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is an instruction. No simple normalization possible.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.02#12", "attribute": "keynote_assertion", "original_value": "Route 1/2\" cold water down to recessed valve box. Confirm exact location with owner/architect.", "source_text": "KEYED NOTE: 4 ROUTE 1/2\" COLD WATER DOWN TO RECESSED VALVE BOX. CONFIRM EXACT LOCATION WITH OWNER/ARCHITECT.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is an instruction. No simple normalization possible.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P02.02#13", "attribute": "pipe_size", "original_value": "2", "source_text": "(E)2\"CW", "normalized_value": "2", "normalized_unit": "in", "normalized_attribute": null, "normalization_notes": "Unit 'in' for inches inferred from '\"' symbol.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#0", "attribute": "general_note", "original_value": "Saw-cut and route proposed sanitary waste line to existing 4\" sanitary waste line or larger.", "source_text": "KEYED NOTE: 1 SAW-CUT AND ROUTE PROPOSED SANITARY WASTE LINE TO EXISTING 4\" SANITARY WASTE LINE OR LARGER APPROXIMATELY THIS POINT. FIELD VERIFY EXACT LOCATION, SIZE. DIRECTION OF FLOW AND DEPTH OF OF EXISTING PIPE.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is an instruction. No simple normalization possible.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#1", "attribute": "general_note", "original_value": "Route proposed new vent branch line to existing 4\" vent main line or larger.", "source_text": "KEYED NOTE: 2 ROUTE PROPOSED NEW VENT BRANCH LINE TO EXISTING 4\" VENT MAIN LINE OR LARGER AT APPROXIMATELY THIS POINT. FIELD VERIFY EXACT LOCATION, SIZE, & ELEVATION OF EXISTING PIPE.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is an instruction. No simple normalization possible.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#2", "attribute": "equipment_model", "original_value": "170-LF LEONARD", "source_text": "PROVIDE MODEL 170-LF LEONARD THERMOSTATIC MIXING VALVE.", "normalized_value": "LEONARD 170-LF", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Standardized format to 'MANUFACTURER MODEL'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#3", "attribute": "temperature", "original_value": "110", "source_text": "OUTLET TEMP SHALL BE 110\u00b0F.", "normalized_value": "110", "normalized_unit": "F", "normalized_attribute": null, "normalization_notes": "Unit 'F' for Fahrenheit inferred from 'F.' and context.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#4", "attribute": "pressure_relief_drain", "original_value": "Pipe discharge 3/4\" to floor sink per plans", "source_text": "A.S.M.E. RATED TEMP. AND PRESSURE RELIEF VALVE. PIPE DISCHARGE 3/4\" TO FLOOR SINK PER PLANS", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is an instruction for routing. No simple normalization possible.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#5", "attribute": "expansion_tank_model", "original_value": "A.O. SMITH PMC-2", "source_text": "EXPANSION TANK A.O. SMITH PMC-2", "normalized_value": "A.O. SMITH PMC-2", "normalized_unit": null, "normalized_attribute": null, "normalization_notes": null, "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#6", "attribute": "drain_pan", "original_value": "4\" DEEP AUXILIARY DRAIN PAN 18 GAUGE GALVANIZED STEEL.", "source_text": "4\" DEEP AUXILIARY DRAIN PAN 18 GAUGE GALVANIZED STEEL.", "normalized_value": "4", "normalized_unit": "in", "normalized_attribute": "depth", "normalization_notes": "Depth extracted from a compound description. Other attributes (gauge, material) are not included.", "source_text_preserved": true, "normalization_confidence": "medium"}, {"assertion_id": "P03.01#7", "attribute": "drain_line", "original_value": "3/4\" auxiliary drain line to floor sink", "source_text": "3/4\" AUXILIARY DRAIN LINE TO FLOOR SINK PER PLANS", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is an instruction for routing. No simple normalization possible.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#8", "attribute": "support_spec", "original_value": "2\" Unistrut support. 1/2\" All threaded rods complete with double nuts and lock washers.", "source_text": "2\" UNISTRUT SUPPORT. 1/2\" ALL THREADED RODS COMPLETE WITH DOUBLE NUTS AND LOCK WASHERS.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Compound statement with multiple dimensions and components. No simple normalization possible.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#9", "attribute": "installation_note", "original_value": "Must be installed in an upright position.", "source_text": "1. ALWAYS INSTALL IN UPRIGHT POSITION", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Value is an instruction.", "source_text_preserved": true, "normalization_confidence": "high"}] \ No newline at end of file diff --git a/backend/.llm_cache/de48415a0659bc6ea80a4b221d60c319912b74f7dcd329d73195baf0451bcd89.json b/backend/.llm_cache/de48415a0659bc6ea80a4b221d60c319912b74f7dcd329d73195baf0451bcd89.json new file mode 100644 index 0000000..ff96c9d --- /dev/null +++ b/backend/.llm_cache/de48415a0659bc6ea80a4b221d60c319912b74f7dcd329d73195baf0451bcd89.json @@ -0,0 +1 @@ +[{"rfi_id": "CONS-CODE-01", "issue_id": "CONS-CODE-01", "title": "Conflicting Applicable Building Codes", "question": "Please clarify the single, correct set of governing codes (IBC, IECC, NEC, IFC, etc.) and their editions for this project and revise all sheets to reflect this information consistently.", "background": "The drawing set references multiple conflicting editions of the applicable building, energy, and electrical codes. For example, G21.01 lists the 2018 IBC, while A23.01, G11.04, and E01.01 reference the 2021 IBC. G21.01 lists the '2023 State of Texas Adopted 2014 NFPA 70 National Electrical Code (NEC)', while E01.01 lists the '2023 NEC'. Electrical sheets also reference the 2021 IBC and 2021 IECC. Consistency is required for code review, permitting, and construction.", "sheets_referenced": ["G21.01", "A23.01", "E01.01", "G11.04", "E01.02", "E03.01"], "disciplines_to_respond": ["Architectural", "Electrical"], "suggested_response_needed": "Within 7 calendar days.", "priority": "high"}, {"rfi_id": "CONS-CODE-02", "issue_id": "CONS-CODE-02", "title": "Ambiguous Project Jurisdiction", "question": "Please confirm the correct project address and the governing Authority Having Jurisdiction (AHJ). Please update all project documentation and code information on the drawings to reflect the requirements of the correct AHJ.", "background": "The project documents contain conflicting information regarding the Authority Having Jurisdiction (AHJ). The project address on sheets G11.01 and A11.01 is 'Cypress, TX'. Sheet G21.01 lists the AHJ as 'Harris County'. Other project information has referenced the 'City of Katy'. As these are different jurisdictions with potentially different code adoptions, clarification is required.", "sheets_referenced": ["G11.01", "G21.01", "A11.01"], "disciplines_to_respond": ["Architectural"], "suggested_response_needed": "Within 7 calendar days.", "priority": "high"}, {"rfi_id": "CONS-MISSING-01", "issue_id": "CONS-MISSING-01", "title": "Missing Structural Drawing Set", "question": "Please provide the complete Structural drawing set (plans, details, general notes) required for the project scope. If no structural drawings are intended, please clarify how structural elements, such as equipment supports, are to be designed and coordinated.", "background": "The entire Structural (S) discipline drawing set appears to be missing. No structural sheets are listed in the drawing index on G11.01. Other drawings reference coordination with a structural engineer, such as for the RTU curb detail on M03.01 and for the suspended transformer support on E05.02. Without structural drawings, the set is incomplete for bidding, permitting, and construction.", "sheets_referenced": ["E05.02", "M03.01", "E02.01", "G11.01"], "disciplines_to_respond": ["Structural", "Electrical", "Mechanical", "Architectural"], "suggested_response_needed": "Within 7 calendar days.", "priority": "high"}, {"rfi_id": "QAQC-MS-002", "issue_id": "QAQC-MS-002", "title": "Missing Architectural Floor Plan", "question": "Please provide the missing Architectural Floor Plan sheet, presumed to be A21.01.", "background": "An Architectural Floor Plan, presumed to be numbered A21.01, appears to be missing from the drawing set. The sheet index proceeds from the General series directly to A22.01 (Reflected Ceiling Plan). A dimensioned floor plan is a primary drawing essential for all disciplines.", "sheets_referenced": ["G11.01"], "disciplines_to_respond": ["Architectural"], "suggested_response_needed": "Within 7 calendar days.", "priority": "high"}, {"rfi_id": "QAQC-MSCH-002", "issue_id": "QAQC-MSCH-002", "title": "Missing Door and Hardware Schedule", "question": "Please provide a comprehensive Door and Hardware Schedule and add corresponding door tags to all openings on the floor plans.", "background": "A Door and Hardware Schedule is not included in the drawing set. No door tags are present on plans, and no schedule is provided to define door types, sizes, ratings, and hardware. This information is referenced in the specifications (e.g., G31.04, Section 08 11 13) and is needed for procurement and life safety compliance.", "sheets_referenced": ["G31.04"], "disciplines_to_respond": ["Architectural"], "suggested_response_needed": "Within 7 calendar days.", "priority": "high"}, {"rfi_id": "CONS-ADA-01", "issue_id": "CONS-ADA-01", "title": "Contradictory Restroom Lavatory Clearance Dimensions", "question": "Please revise the detail on A51.01 to remove the contradiction and provide a single, compliant dimension for toe clearance.", "background": "The typical restroom lavatory detail on sheet A51.01 provides conflicting requirements for toe clearance. One note calls for '9\" MIN. TOE CLEAR' while another on the same detail specifies '6\" MAX. TOE CLEAR'. These requirements are mutually exclusive.", "sheets_referenced": ["A51.01"], "disciplines_to_respond": ["Architectural", "Plumbing"], "suggested_response_needed": "Within 7 calendar days.", "priority": "high"}, {"rfi_id": "CONS-ADA-02", "issue_id": "CONS-ADA-02", "title": "Potential Head-Height Obstruction from Pendant Lights", "question": "Please confirm the locations of pendant fixture types L-5 and L-6 relative to circulation paths. Please adjust the mounting height or relocate any fixtures as needed to provide a minimum vertical clearance of 80 inches AFF to the bottom of the fixture in all circulation paths.", "background": "On sheet A22.01 and fixture schedule E01.02, pendant light fixtures (Types L-5 and L-6) are specified to be mounted at 5'-5\" (65 inches) AFF. If these fixtures are located within circulation paths, this mounting height is below the typically required minimum vertical clearance of 80 inches for accessible routes.", "sheets_referenced": ["A22.01", "E01.02"], "disciplines_to_respond": ["Architectural", "Electrical", "Interiors"], "suggested_response_needed": "Within 7 calendar days.", "priority": "high"}, {"rfi_id": "CONS-SPATIAL-01", "issue_id": "CONS-SPATIAL-01", "title": "Equipment Conflict in Inventory Room", "question": "Please coordinate between Architectural and Plumbing disciplines to resolve the spatial conflict and clarify the final location for the network rack and the electric water heater.", "background": "A spatial conflict exists on the west wall of the Inventory Room. Architectural sheet A24.01 indicates a network rack system in this location, while Plumbing sheet P02.02 shows an Electric Water Heater (EWH) in the same location. The two items cannot occupy the same space.", "sheets_referenced": ["A24.01", "P02.02"], "disciplines_to_respond": ["Architectural", "Plumbing"], "suggested_response_needed": "Within 7 calendar days.", "priority": "high"}, {"rfi_id": "QAQC-MS-003", "issue_id": "QAQC-MS-003", "title": "Missing Mechanical Floor Plan", "question": "Please provide the missing Mechanical Floor Plan sheet, presumed to be M02.01.", "background": "A Mechanical floor plan, presumed to be numbered M02.01, appears to be missing. The drawing set jumps from Mechanical schedules on M01.01 to the Mechanical Roof Plan on M02.02, with no plan showing the interior tenant space ductwork and equipment layout.", "sheets_referenced": ["M01.01", "M02.02"], "disciplines_to_respond": ["Mechanical"], "suggested_response_needed": "Within 7 calendar days.", "priority": "high"}, {"rfi_id": "QAQC-MS-004", "issue_id": "QAQC-MS-004", "title": "Missing Fire Alarm Plan", "question": "Please provide a complete Fire Alarm plan showing all required devices, wiring, FACP, and a riser diagram in compliance with project and jurisdictional requirements.", "background": "The drawing set does not include a comprehensive Fire Alarm plan. While sheet A22.01 shows some notification appliances, a dedicated plan showing the FACP, pull stations, detectors, and riser diagram is absent. A general note on G11.03 indicates a tenant system is required to connect to the landlord's panel.", "sheets_referenced": ["E04.01", "A22.01", "G11.03"], "disciplines_to_respond": ["Electrical", "Fire Protection"], "suggested_response_needed": "Within 7 calendar days.", "priority": "high"}, {"rfi_id": "QAQC-MSCH-001", "issue_id": "QAQC-MSCH-001", "title": "Missing Partition Type Legend/Schedule", "question": "Please provide a Partition Type Legend/Schedule and add corresponding partition type tags on the floor plans.", "background": "General Note 25.D on G11.01 states that dimensions are to the face of sheathing 'of partition type as scheduled.' However, no partition type schedule or legend is provided in the drawing set. Without this, wall construction, thickness, and ratings are undefined.", "sheets_referenced": ["G11.01"], "disciplines_to_respond": ["Architectural"], "suggested_response_needed": "Within 7 calendar days.", "priority": "high"}, {"rfi_id": "QAQC-INFO-001", "issue_id": "QAQC-INFO-001", "title": "Missing Finished Ceiling Heights", "question": "Please add finished ceiling height tags (e.g., 9'-0\" AFF) for all rooms and areas on the Reflected Ceiling Plan A22.01.", "background": "Finished ceiling heights are not indicated on Reflected Ceiling Plan A22.01 or elsewhere in the set. This conflicts with General Note 24 on sheet G11.01, which states that ceiling heights are indicated. This information is required for coordination by all overhead trades.", "sheets_referenced": ["A22.01", "G11.01"], "disciplines_to_respond": ["Architectural", "Mechanical", "Electrical", "Plumbing"], "suggested_response_needed": "Within 7 calendar days.", "priority": "high"}, {"rfi_id": "CONS-COORD-01", "issue_id": "CONS-COORD-01", "title": "Conflicting Mounting Heights for Network Rack and Data Outlets", "question": "Please coordinate the mounting height of the data outlets on E04.01 with the specified network rack height on A24.01 and revise the drawings for consistency.", "background": "In the Inventory Room, the architectural plan A24.01 specifies the bottom of the network rack to be mounted at 74\" AFF. The special systems plan E04.01 shows the corresponding data outlets terminating at 18\" AFF on the same wall.", "sheets_referenced": ["A24.01", "E04.01"], "disciplines_to_respond": ["Architectural", "Electrical"], "suggested_response_needed": "Within 7 calendar days.", "priority": "medium"}, {"rfi_id": "CONS-SPEC-01", "issue_id": "CONS-SPEC-01", "title": "Conflicting Firestopping Requirements", "question": "Please revise the prescriptive note in detail 4/E05.01 to align with the performance-based requirements on other sheets, specifying that firestopping systems shall have a rating equal to the assembly being penetrated.", "background": "Electrical detail 4/E05.01 specifies a prescriptive '3 HOUR RATED CAULK' for sleeve penetrations. This contradicts performance-based notes on sheets P01.01 and G31.04, which require firestopping assemblies to be rated equal to the construction being penetrated. A fixed 3-hour rating may be inappropriate for penetrations through 1-hour or 2-hour rated walls.", "sheets_referenced": ["E05.01", "P01.01", "G31.04"], "disciplines_to_respond": ["Electrical", "Plumbing", "Architectural"], "suggested_response_needed": "Within 7 calendar days.", "priority": "medium"}, {"rfi_id": "CONS-SPEC-02", "issue_id": "CONS-SPEC-02", "title": "Conflicting Vapor Barrier Specifications for Slab Pour-Back", "question": "Please clarify the required thickness for the vapor barrier/retarder at slab penetrations and revise drawings for consistency.", "background": "The Landlord Work Letter on G11.03 requires a 15 mil vapor barrier for concrete pour-backs. In contrast, the plumbing detail on P03.01 specifies a minimum 6 mil vapor retarder for the same application.", "sheets_referenced": ["G11.03", "P03.01"], "disciplines_to_respond": ["Architectural", "Plumbing"], "suggested_response_needed": "Within 7 calendar days.", "priority": "medium"}, {"rfi_id": "CONS-SPEC-03", "issue_id": "CONS-SPEC-03", "title": "Conflicting Ceiling Material Specifications", "question": "Please clarify the intended ceiling material for the project (acoustic tile or gypsum board) and revise the drawing plans or specifications to remove the contradiction.", "background": "The Architectural plans (A22.01, A23.01) indicate an acoustic tile ceiling (AT-1) throughout the space. This is contradicted by the specifications on G31.05, which list a thickness for 'Ceilings' under the 'GYPSUM BOARD' product section, implying a gypsum board ceiling.", "sheets_referenced": ["A22.01", "A23.01", "G31.05"], "disciplines_to_respond": ["Architectural"], "suggested_response_needed": "Within 7 calendar days.", "priority": "medium"}, {"rfi_id": "CONS-COORD-02", "issue_id": "CONS-COORD-02", "title": "Inconsistent Project Scope Description", "question": "Please clarify whether the scope is a first-generation build-out or a remodel of an existing space and revise the project descriptions for consistency.", "background": "The project scope is described inconsistently across the General sheets. Sheet G11.04 states the project is a 'LEASE SPACE BUILD-OUT' for a 'FIRST GENERATION RETAIL SPACE.' Sheet G21.01 describes it as a 'TENANT INTERIOR REMODEL.'", "sheets_referenced": ["G11.04", "G21.01"], "disciplines_to_respond": ["Architectural"], "suggested_response_needed": "Within 7 calendar days.", "priority": "medium"}, {"rfi_id": "CONS-COORD-03", "issue_id": "CONS-COORD-03", "title": "Electrical Panel Mismatch Between Plan and Schedule", "question": "Please revise the architectural plan A24.01 to show the correct quantity and location of the electrical panels scheduled on E01.02.", "background": "Architectural plan A24.01 shows a single symbol for 'PANEL' in the Lounge. The electrical panel schedules on E01.02 list two distinct panels, H and L, to be located in the Lounge.", "sheets_referenced": ["A24.01", "E01.02"], "disciplines_to_respond": ["Architectural", "Electrical"], "suggested_response_needed": "Within 7 calendar days.", "priority": "medium"}, {"rfi_id": "QAQC-MD-001", "issue_id": "QAQC-MD-001", "title": "Missing Detail Referenced on A24.01", "question": "Please provide sheet A92.01 with the referenced detail or update the callout to refer to a correct, existing detail.", "background": "A note on sheet A24.01 references detail '3/A92.01' for a foundation pour-back detail. The referenced sheet A92.01 is not included in the drawing set.", "sheets_referenced": ["A24.01"], "disciplines_to_respond": ["Architectural"], "suggested_response_needed": "Within 7 calendar days.", "priority": "medium"}, {"rfi_id": "CODE-SPEC-01", "issue_id": "CODE-SPEC-01", "title": "Contradictory Fire Door Rating and Class Specification", "question": "Please revise Specification 081113 3.B.1 to correctly align the fire-protection rating (in minutes) with the corresponding fire door assembly classification (e.g., Class B).", "background": "On sheet G31.04, Specification 081113 3.B.1 for hollow metal doors calls for a '90 MINUTE RATED CLASS C' assembly. A 90-minute rating corresponds to a Class B opening, not Class C. A Class C opening typically has a 45-minute rating.", "sheets_referenced": ["G31.04"], "disciplines_to_respond": ["Architectural", "Specifications"], "suggested_response_needed": "Within 7 calendar days.", "priority": "medium"}, {"rfi_id": "CODE-ADA-03", "issue_id": "CODE-ADA-03", "title": "Conflicting and Outdated Floor Slip Resistance Specifications", "question": "Please update the specifications on A23.01 to use the current DCOF standard and provide a single, consistent requirement for all accessible flooring surfaces.", "background": "The finish notes on sheet A23.01 contain conflicting and outdated requirements for slip resistance. Note F requires a Static Coefficient of Friction (SCOF) of 0.6, while the Polished Concrete (PC-1) spec requires a SCOF of 0.50. The current standard is Dynamic Coefficient of Friction (DCOF).", "sheets_referenced": ["A23.01"], "disciplines_to_respond": ["Architectural", "Interiors"], "suggested_response_needed": "Within 7 calendar days.", "priority": "medium"}] \ No newline at end of file diff --git a/backend/.llm_cache/e07522bcda164582ba135fc543fb6909ce54e06f340b826de877e70f75aac810.json b/backend/.llm_cache/e07522bcda164582ba135fc543fb6909ce54e06f340b826de877e70f75aac810.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/e07522bcda164582ba135fc543fb6909ce54e06f340b826de877e70f75aac810.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/e3632a26d5166da7939adb265b9143f66f419fafca252e009a97d5177b59f85b.json b/backend/.llm_cache/e3632a26d5166da7939adb265b9143f66f419fafca252e009a97d5177b59f85b.json new file mode 100644 index 0000000..c1023c5 --- /dev/null +++ b/backend/.llm_cache/e3632a26d5166da7939adb265b9143f66f419fafca252e009a97d5177b59f85b.json @@ -0,0 +1 @@ +[{"assertion_id": "E02.01#5", "original_value": "1-1/4\"C with pullstring for data to ceiling space above rack system in inventory room.", "normalized_value": "1.25", "normalized_unit": "inches", "normalized_attribute": "conduit_size", "normalization_notes": "Normalized 1-1/4\" conduit size. 'C' denotes conduit.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E02.01#6", "original_value": "Provide power for building sign. Coordinate final location and mounting height prior to rough-in.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Instructional text with no quantifiable values to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E02.01#7", "original_value": "Furnish and install #10 Cu ground with ground lug for connection to network racks.", "normalized_value": "10", "normalized_unit": "AWG", "normalized_attribute": "wire_gauge", "normalization_notes": "Normalized #10 to 10 AWG (American Wire Gauge). 'Cu' indicates Copper material.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E02.01#8", "original_value": "(3) 3\" conduit sleeves from 6\" below dropped ceiling to 6\" above dropped ceiling.", "normalized_value": "3", "normalized_unit": "inches", "normalized_attribute": "conduit_size", "normalization_notes": "Normalized the 3\" sleeve diameter. The assertion also specifies a quantity of 3 and placement 6\" below and 6\" above the dropped ceiling.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E02.01#9", "original_value": "Transformer to be suspended from structure at high level above accessible ceiling.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Instructional text with no quantifiable values to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E02.02#0", "original_value": "1/4\" = 1'-0\"", "normalized_value": "1:48", "normalized_unit": null, "normalized_attribute": "scale_ratio", "normalization_notes": "Converted architectural scale to a dimensionless ratio (1'-0\" = 12 inches; 12 / 0.25 = 48).", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E03.01#0", "original_value": "Coordinate all light switch locations with architect/owner prior to rough-in.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Instructional text with no quantifiable values to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E03.01#1", "original_value": "Connect all type 'X' emergency fixtures to nearest lighting circuit via non-switched hot leg. Provide fixtures with nickel cadmium battery.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Instructional text with no quantifiable values to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E03.01#2", "original_value": "All lighting systems shall be tested to ensure proper calibration, adjustment, programming, and operation in accordance with IECC 2021 Section C408.3.", "normalized_value": "{\"code\": \"IECC\", \"year\": \"2021\", \"section\": \"C408.3\"}", "normalized_unit": null, "normalized_attribute": "code_reference", "normalization_notes": "Structured the code reference into components.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E03.01#3", "original_value": "Provide dimmer switch for control of sales area lighting. Coordinate final location with owner prior to rough-in.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Instructional text with no quantifiable values to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#0", "original_value": "INVENTORY", "normalized_value": "INVENTORY", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": "Value is already in a standard format.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#1", "original_value": "LOUNGE", "normalized_value": "LOUNGE", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": "Value is already in a standard format.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#2", "original_value": "MEN'S RESTROOM", "normalized_value": "MEN'S RESTROOM", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": "Value is already in a standard format.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#3", "original_value": "WOMEN'S RESTROOM", "normalized_value": "WOMEN'S RESTROOM", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": "Value is already in a standard format.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#4", "original_value": "MANAGER'S OFFICE", "normalized_value": "MANAGER'S OFFICE", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": "Value is already in a standard format.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#5", "original_value": "CLEANING SUPPLIES/STORAGE", "normalized_value": "CLEANING SUPPLIES/STORAGE", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": "Value is already in a standard format.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#6", "original_value": "SALES AREA", "normalized_value": "SALES AREA", "normalized_unit": null, "normalized_attribute": "room_name", "normalization_notes": "Value is already in a standard format.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#7", "original_value": "2 CAT.6 cables at 18 inches AFF", "normalized_value": "18", "normalized_unit": "inches", "normalized_attribute": "mounting_height", "normalization_notes": "Height is specified as Above Finished Floor (AFF). Quantity is 2.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#8", "original_value": "2 CAT.6 cables at 18 inches AFF", "normalized_value": "18", "normalized_unit": "inches", "normalized_attribute": "mounting_height", "normalization_notes": "Height is specified as Above Finished Floor (AFF). Quantity is 2.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#9", "original_value": "2 CAT.6 cables at 18 inches AFF", "normalized_value": "18", "normalized_unit": "inches", "normalized_attribute": "mounting_height", "normalization_notes": "Height is specified as Above Finished Floor (AFF). Quantity is 2.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#10", "original_value": "2 CAT.6 cables at 18 inches AFF", "normalized_value": "18", "normalized_unit": "inches", "normalized_attribute": "mounting_height", "normalization_notes": "Height is specified as Above Finished Floor (AFF). Quantity is 2.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#11", "original_value": "2 CAT.6 cables at 18 inches AFF", "normalized_value": "18", "normalized_unit": "inches", "normalized_attribute": "mounting_height", "normalization_notes": "Height is specified as Above Finished Floor (AFF). Quantity is 2.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#12", "original_value": "2 CAT.6 cables at 55 inches AFF", "normalized_value": "55", "normalized_unit": "inches", "normalized_attribute": "mounting_height", "normalization_notes": "Height is specified as Above Finished Floor (AFF). Quantity is 2. The '/H' from the source text may denote a specific type of outlet or orientation.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E04.01#13", "original_value": "2 CAT.6 cables at 38.5 inches AFF", "normalized_value": "38.5", "normalized_unit": "inches", "normalized_attribute": "mounting_height", "normalization_notes": "Height is specified as Above Finished Floor (AFF). Quantity is 2. The '/H' from the source text may denote a specific type of outlet or orientation.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#0", "original_value": "For an I.G. device, the conduit shall be suitable for a ground path or an additional ground shall be pulled to ground the box", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Instructional text describing grounding requirements for an Isolated Ground (I.G.) device.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#1", "original_value": "Isolated ground bar shall be insulated from enclosure or installed if not existing, when indicated", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Instructional text with no quantifiable values to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#2", "original_value": "Tie wire", "normalized_value": "Tie wire", "normalized_unit": null, "normalized_attribute": "prohibited_material", "normalization_notes": "Value is a specific material name.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#3", "original_value": "25", "normalized_value": "0.25", "normalized_unit": null, "normalized_attribute": "future_capacity_ratio", "normalization_notes": "Converted percentage (25%) to a decimal ratio.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#4", "original_value": "3/4\" TO 1\"", "normalized_value": "0.75-1", "normalized_unit": "inches", "normalized_attribute": "size_range", "normalization_notes": "Normalized fractional inch range to decimal.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#5", "original_value": "1 1/4\" TO 6\"", "normalized_value": "1.25-6", "normalized_unit": "inches", "normalized_attribute": "size_range", "normalization_notes": "Normalized fractional inch range to decimal.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#6", "original_value": "3 Hour", "normalized_value": "3", "normalized_unit": "hours", "normalized_attribute": "fire_rating_duration", "normalization_notes": "Normalized fire rating duration value.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#7", "original_value": "SCHEDULE 40 BLACK STEEL PIPE SLEEVE", "normalized_value": "Sch 40", "normalized_unit": null, "normalized_attribute": "pipe_schedule", "normalization_notes": "Normalized 'SCHEDULE 40' to 'Sch 40'. The full value also specifies material (black steel pipe).", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#8", "original_value": "1", "normalized_value": "1", "normalized_unit": "inches", "normalized_attribute": "depth_min", "normalization_notes": "Unit 'inches' and attribute 'minimum depth' inferred from source text 'MINIMUM (1\") DEEP'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#9", "original_value": "6", "normalized_value": "6", "normalized_unit": "inches", "normalized_attribute": "extension_length", "normalization_notes": "Unit 'inches' inferred from source text 'EXTEND CONDUIT (6\") BEYOND WALL'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#10", "original_value": "4-11/16\" square, 2-5/8\" deep", "normalized_value": "{\"width\": 4.6875, \"height\": 4.6875, \"depth\": 2.625}", "normalized_unit": "inches", "normalized_attribute": "dimensions", "normalization_notes": "Normalized fractional dimensions to decimal and structured as a JSON object. 4-11/16 = 4.6875, 2-5/8 = 2.625.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#11", "original_value": "1", "normalized_value": "1", "normalized_unit": "inches", "normalized_attribute": "conduit_size_min", "normalization_notes": "Unit 'inches' and attribute 'minimum size' inferred from source text '1\" CONDUIT MINIMUM'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#12", "original_value": "6", "normalized_value": "6", "normalized_unit": "inches", "normalized_attribute": "stub_up_height", "normalization_notes": "Unit 'inches' inferred from source text 'STUB CONDUIT 6\" INTO CEILING SPACE'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#13", "original_value": "4'-0\"", "normalized_value": "48", "normalized_unit": "inches", "normalized_attribute": "spacing", "normalization_notes": "Converted feet and inches to inches (4' = 48\").", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#14", "original_value": "12", "normalized_value": "12", "normalized_unit": "inches", "normalized_attribute": "service_loop_min", "normalization_notes": "Unit 'inches' and attribute 'minimum' inferred from source text '...COIL A MINIMUM 12\" IN THE BACK BOX'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#15", "original_value": "Must be supported by wire hanger at each corner, independent of ceiling support system", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Instructional text with no quantifiable values to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.01#16", "original_value": "24", "normalized_value": "24", "normalized_unit": "inches", "normalized_attribute": "separation_distance_min", "normalization_notes": "Unit 'inches' and attribute 'minimum' inferred from source text '...MUST BE SEPARATED BY A MIN. OF 24\" HORIZONTAL DISTANCE.'", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.02#0", "original_value": "Circuiting to all non dedicated electrical receptacles and switches are required to utilize parallel circuiting by the use of 'pig tails' to each device so that if an outlet is removed or fails electrical continuity the circuit will not be compromised.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Instructional text with no quantifiable values to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.02#1", "original_value": "All electrical wiring must be properly spliced by twisting the wires together and use of approved and listed compression wire nuts for any wiring.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Instructional text with no quantifiable values to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.02#2", "original_value": "Confirm switching requirement with the owner.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Instructional text with no quantifiable values to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.02#3", "original_value": "Emergency lights on this circuit will receive a hot leg which is not routed via the lighting controller so that the emergency ballast has a constant hot to detect power loss.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Instructional text with no quantifiable values to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.02#4", "original_value": "Grounding electrode conductor to ground to 3/4\" x 10' Cu rod or building steel.", "normalized_value": "{\"diameter\": 0.75, \"length\": 120}", "normalized_unit": "inches", "normalized_attribute": "dimensions", "normalization_notes": "Normalized ground rod dimensions to inches (3/4\" = 0.75\", 10' = 120\"). Material is Copper (Cu). Assumed 3/4\" diameter and 10' length, a standard size.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.02#5", "original_value": "6", "normalized_value": "6", "normalized_unit": "inches", "normalized_attribute": "pad_thickness", "normalization_notes": "Unit 'inches' inferred from source text '...ON 6\" HOUSEKEEPING PAD'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.02#6", "original_value": "3\" larger than the transformer (6\" at the rear)", "normalized_value": "{\"default\": 3, \"rear\": 6}", "normalized_unit": "inches", "normalized_attribute": "clearance", "normalization_notes": "Structured clearance values. Default clearance is 3 inches, rear clearance is 6 inches.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.02#7", "original_value": "Neoprene vibration isolation pad", "normalized_value": "Neoprene vibration isolation pad", "normalized_unit": null, "normalized_attribute": "vibration_isolation_material", "normalization_notes": "Value is a specific material/component name.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.02#8", "original_value": "Provide NEC working clearance in front of transformers.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Refers to a standard (National Electrical Code) without specifying a value.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.02#9", "original_value": "Min 1/4", "normalized_value": "0.25", "normalized_unit": "inches", "normalized_attribute": "fastener_size_min", "normalization_notes": "Normalized 1/4\" to 0.25 inches. Unit inferred from source text 'MIN 1/4\"'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.02#10", "original_value": "4", "normalized_value": "4", "normalized_unit": null, "normalized_attribute": "fastener_quantity", "normalization_notes": "Value is a quantity. Context from source text: '(4 REQUIRED)'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.02#11", "original_value": "Secure to bottom cord of structure. Provide (2) 1-1/2\" x 1-1/2\" x 3/16\" angled cord to top cord within 6\" of point load. (Typ. for 4).", "normalized_value": "{\"width\": 1.5, \"height\": 1.5, \"thickness\": 0.1875}", "normalized_unit": "inches", "normalized_attribute": "angle_dimensions", "normalization_notes": "Normalized angle dimensions to decimal (1-1/2\"=1.5, 3/16\"=0.1875). Note indicates quantity of 2, placement within 6\" of load, and is typical for 4 locations.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.02#12", "original_value": "4 spring vibration isolators sized for weight of transformer.", "normalized_value": "4", "normalized_unit": null, "normalized_attribute": "quantity", "normalization_notes": "Value is a quantity.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.02#13", "original_value": "Anvil trapeze assembly model #45/#46", "normalized_value": "Anvil 45, Anvil 46", "normalized_unit": null, "normalized_attribute": "equipment_model_number", "normalization_notes": "Normalized model numbers into a comma-separated list.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "E05.02#14", "original_value": "Verify support sizing and designed with project structural engineer prior to assembly.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Instructional text with no quantifiable values to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#0", "original_value": "Seal all penetrations through rated walls, floors and ceilings with a UL listed assembly to provide a rating equal to or greater than the rating of the wall, floor or ceiling.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Instructional text with no quantifiable values to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#1", "original_value": "Insulate all exposed drain piping and water supply piping beneath A.D.A. compliant lavatories & sinks with fully molded closed cell vinyl insulation kit as manufactured by Truebro, Brocar or McGuire.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Instructional text referencing ADA standards and specific manufacturers, but no quantifiable values.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#2", "original_value": "Provide UL fire rated assemblies where pipes penetrate above grade floors. Provide UL fire rated assemblies were pipes penetrate fire rated walls.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": null, "normalization_notes": "Instructional text with no quantifiable values to normalize. 'UL fire rated' is qualitative.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P01.01#3", "original_value": "Sanitary Waste and Vent (Below Slab Only): Schedule 40 PVC", "normalized_value": "Sch 40", "normalized_unit": null, "normalized_attribute": "pipe_schedule", "normalization_notes": "Normalized 'Schedule 40' to 'Sch 40'. Material is PVC for below-slab sanitary waste and vent.", "source_text_preserved": true, "normalization_confidence": "high"}] \ No newline at end of file diff --git a/backend/.llm_cache/e67cf9a52b829e8c4f078e8cf154efcd13c8284f4a1f6603502674cb4c100c28.json b/backend/.llm_cache/e67cf9a52b829e8c4f078e8cf154efcd13c8284f4a1f6603502674cb4c100c28.json new file mode 100644 index 0000000..0f7d1b6 --- /dev/null +++ b/backend/.llm_cache/e67cf9a52b829e8c4f078e8cf154efcd13c8284f4a1f6603502674cb4c100c28.json @@ -0,0 +1 @@ +{"sheet_number": "P01.01", "discipline": "Plumbing", "sheet_title": "NOTES AND LEGEND", "level": null, "scale": null, "assertions": [{"subject": "Penetration Sealing", "attribute": "wall_rating", "value": "Seal all penetrations through rated walls, floors and ceilings with a UL listed assembly to provide a rating equal to or greater than the rating of the wall, floor or ceiling.", "source_text": "7. SEAL ALL PENETRATIONS THROUGH RATED WALLS, FLOORS AND CEILINGS WITH A UL LISTED ASSEMBLY TO PROVIDE A RATING EQUAL TO OR GREATER THAN THE RATING OF THE WALL, FLOOR OR CEILING.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "ADA Pipe Insulation", "attribute": "pipe_insulation", "value": "Insulate all exposed drain piping and water supply piping beneath A.D.A. compliant lavatories & sinks with fully molded closed cell vinyl insulation kit as manufactured by Truebro, Brocar or McGuire.", "source_text": "A.D.A. ACCESSIBLE LAVATORIES AND SINKS: INSULATE ALL EXPOSED DRAIN PIPING AND WATER SUPPLY PIPING BENEATH A.D.A. COMPLIANT LAVATORIES & SINKS WITH FULLY MOLDED CLOSED CELL VINYL INSULATION KIT AS MANUFACTURED BY TRUEBRO, BROCAR OR MCGUIRE.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Pipe Penetrations", "attribute": "fire_rating_assembly", "value": "Provide UL fire rated assemblies where pipes penetrate above grade floors. Provide UL fire rated assemblies were pipes penetrate fire rated walls.", "source_text": "FLOORS: PROVIDE UL FIRE RATED ASSEMBLIES WHERE PIPES PENETRATE ABOVE GRADE FLOORS. WALLS: PROVIDE UL FIRE RATED ASSEMBLIES WERE PIPES PENETRATE FIRE RATED WALLS.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Piping Material", "attribute": "pipe_material_below_slab", "value": "Sanitary Waste and Vent (Below Slab Only): Schedule 40 PVC", "source_text": "1. SANITARY WASTE AND VENT: (BELOW SLAB ONLY). SCHEDULE 40 PVC ACCORDING TO ASTM D 1784 FOR SOIL AND WASTE VENT PIPING. FITTINGS SHALL BE COMPATIBLE MATERIAL WITH SOLVENT CEMENT TYPE JOINTS.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Piping Material", "attribute": "pipe_material_above_slab", "value": "Sanitary Waste and Vent (Above Slab Only): Cast iron pipe and fittings, ASTM A 888 or CISPI 301.", "source_text": "2. SANITARY WASTE AND VENT: (ABOVE SLAB ONLY). PIPE: CAST IRON PIPE AND FITTINGS, ASTM A 888 OR CISPI 301.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "Piping Material", "attribute": "pipe_material_domestic_water", "value": "Domestic Water: Type 'L' copper tubing with wrought copper fittings and 95/5 (tin/antimony) solder joints.", "source_text": "3. DOMESTIC WATER: TYPE 'L' COPPER TUBING WITH WROUGHT COPPER FITTINGS AND 95/5 (TIN/ANTIMONY) SOLDER JOINTS.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": null}}, {"subject": "EHW-1", "attribute": "voltage", "value": "480", "source_text": "VOLTS 480", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "EHW-1"}}, {"subject": "EHW-1", "attribute": "phase", "value": "3", "source_text": "PHASE 3", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "EHW-1"}}, {"subject": "EHW-1", "attribute": "power_kW", "value": "5", "source_text": "KW 5", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "EHW-1"}}, {"subject": "EHW-1", "attribute": "tank_capacity", "value": "30", "source_text": "TANK CAPACITY GALLONS 30", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "EHW-1"}}, {"subject": "WC-1", "attribute": "mounting_type", "value": "Floor Mounted", "source_text": "WATER CLOSET (FLOOR MOUNTED) (A.D.A.)", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "WC-1"}}, {"subject": "WC-1", "attribute": "ada_compliant_height", "value": "ADA 17\"H elongated bowl", "source_text": "AMERICAN STANDARD \"ULTIMA VORMAX\", ADA 17\"H ELONGATED BOWL", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "WC-1"}}, {"subject": "WC-1", "attribute": "flush_handle_location", "value": "Flush handle to be on the wide side of the stall.", "source_text": "FLUSH HANDLE TO BE ON THE WIDE SIDE OF THE STALL.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "WC-1"}}, {"subject": "L-1", "attribute": "mounting_type", "value": "Wall Mounted", "source_text": "LAVATORY (WALL MOUNTED) (A.D.A.)", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "L-1"}}, {"subject": "L-1", "attribute": "thermostatic_mixing_valve", "value": "LF-170 LEONARD THERMOSTATIC MIXING VALVE WITH THE OUTLET TEMPERATURE TO BE SET AT 110F.", "source_text": "LF-170 LEONARD THERMOSTATIC MIXING VALVE WITH THE OUTLET TEMPERATURE TO BE SET AT 110F.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "L-1"}}, {"subject": "L-1", "attribute": "ada_compliant_fixture", "value": "LAVATORY (WALL MOUNTED) (A.D.A.)", "source_text": "LAVATORY (WALL MOUNTED) (A.D.A.)", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "L-1"}}, {"subject": "MS-1", "attribute": "mounting_type", "value": "Floor Mounted", "source_text": "63M HUSTEE ... 8\" HIGH FLOOR MOUNTED", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "MS-1"}}, {"subject": "MS-1", "attribute": "mounting_type", "value": "Wall Mount Faucet", "source_text": "PROVIDE WITH MOEN #8230 WITH CHROME PLATED, CAST BRASS, WALL MOUNT, TWO HANDLE SERVICE SINK FAUCET WITH VACUUM BREAKER...", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "MS-1"}}, {"subject": "SK-1", "attribute": "mounting_type", "value": "Self-rimming", "source_text": "LBAO221965PDC ELKAY, 18 GAUGE TYPE 304 STAINLESS STEEL SINK, SELF-RIMMING, 22\"X19\"X6.5\" NOM. DIMENSIONS...", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "SK-1"}}, {"subject": "SK-1", "attribute": "ada_compliant_fixture", "value": "SINGLE BOWL SINK (A.D.A)", "source_text": "SINGLE BOWL SINK (A.D.A)", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "SK-1"}}, {"subject": "FS-1", "attribute": "trap_primer", "value": "Install automatic pressure drop activated trap primer by PPP products PR-500.", "source_text": "INSTALL AUTOMATIC PRESSURE DROP ACTIVATED TRAP PRIMER BY PPP PRODUCTS PR-500.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "FS-1"}}]} \ No newline at end of file diff --git a/backend/.llm_cache/e7f2a1a79b8192ca3d391f792dc54460cfcaca91b3104ce59b17b9825b987415.json b/backend/.llm_cache/e7f2a1a79b8192ca3d391f792dc54460cfcaca91b3104ce59b17b9825b987415.json new file mode 100644 index 0000000..e875a09 --- /dev/null +++ b/backend/.llm_cache/e7f2a1a79b8192ca3d391f792dc54460cfcaca91b3104ce59b17b9825b987415.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "L1_TMV_CONFLICT_01", "category": "missing_element", "severity": "medium", "confidence": "high", "location": "Men's Restroom / Lavatory L-1", "disciplines": ["Plumbing", "Architectural"], "sheets": ["P01.01", "A51.01"], "description": "The plumbing fixture schedule for lavatory L-1 explicitly requires a thermostatic mixing valve (TMV). However, the architectural elevations detailing the under-sink conditions (Details 2, 3, and 6) do not show this valve. Instead, they depict hot and cold supply lines connecting directly to the faucet. The TMV must be shown on architectural drawings to coordinate space, clearances, and insulated wrap requirements, particularly for ADA compliance.", "evidence": [{"discipline": "Plumbing", "sheet": "P01.01", "source_text": "FIXTURE SCHEDULE, L-1, TRIM: ...LF-170 LEONARD THERMOSTATIC MIXING VALVE WITH THE OUTLET TEMPERATURE TO BE SET AT 110F.", "asserted_value": "Thermostatic mixing valve is required"}, {"discipline": "Architectural", "sheet": "A51.01", "source_text": "TYPICAL RESTROOM ELEVATIONS (Details 2, 3, 6)", "asserted_value": "No thermostatic mixing valve is shown under the lavatory"}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/ea5299dcfedb8e03b06e0dc40ecc5a0a71d5577f192d96fda7fd8120a4e34ab3.json b/backend/.llm_cache/ea5299dcfedb8e03b06e0dc40ecc5a0a71d5577f192d96fda7fd8120a4e34ab3.json new file mode 100644 index 0000000..1847920 --- /dev/null +++ b/backend/.llm_cache/ea5299dcfedb8e03b06e0dc40ecc5a0a71d5577f192d96fda7fd8120a4e34ab3.json @@ -0,0 +1 @@ +{"issues": [{"issue_id": "CBI-001", "source_stage": "constructability", "category": "other", "severity": "critical", "confidence": "high", "location": "Electrical Panel 'L' and Water Heater EWH-1", "disciplines": ["Plumbing", "Electrical"], "sheets": ["P01.01", "E01.02"], "description": "The plumbing fixture schedule specifies a 480V, 3-phase electric water heater (EWH-1). The electrical one-line diagram and schedules show the 'WATER HEATING' load is served from Panel 'L', which is fed by Panel 'H', with a voltage of 208Y/120V. The specified equipment is incompatible with the provided power source. This will result in ordering the wrong equipment or requiring significant electrical redesign and rework.", "evidence": [{"discipline": "Plumbing", "sheet": "P01.01", "source_text": "EHW-1 ... VOLTS 480 PHASE 3", "asserted_value": "480V, 3-Phase"}, {"discipline": "Electrical", "sheet": "E01.02", "source_text": "PANEL SCHEDULE 'H', VOLTS: 208Y/120... CKT 1,2,3 DESCRIPTION: PNL 'L'", "asserted_value": "Panel L is 208Y/120V"}, {"discipline": "Electrical", "sheet": "E01.02", "source_text": "PANEL SCHEDULE 'L', VOLTS: 208Y/120... CKT 1,2,3 DESCRIPTION: WATER HEATING", "asserted_value": "Water Heater is on a 208Y/120V panel"}], "recommended_resolution": "Coordinate electrical and plumbing drawings to ensure the specified water heater voltage matches the provided power circuit voltage.", "code_reference": null}, {"issue_id": "CBI-002", "source_stage": "constructability", "category": "access_clearance", "severity": "critical", "confidence": "high", "location": "Above ceiling in Lounge and Corridor", "disciplines": ["Electrical", "Plumbing", "Architectural"], "sheets": ["E02.01", "P02.02", "A23.01"], "description": "Both the electrical Transformer (Keynote 7, E02.01) and the 30-gallon water heater (EWH-1, Keynote 1, P02.02) are specified to be suspended above the ceiling. The notes require access (e.g., 'ABOVE ACCESSIBLE CEILING' for the transformer). However, the architectural finish plan (A23.01) shows a hard-lid gypsum board ceiling (C1) in the Lounge area where these units may be located. Installing heavy equipment above a non-accessible hard-lid ceiling makes future service or replacement impossible without demolishing the ceiling.", "evidence": [{"discipline": "Electrical", "sheet": "E02.01", "source_text": "7 TRANSFORMER TO BE SUSPENDED FROM STRUCTURE AT HIGH LEVEL ABOVE ACCESSIBLE CEILING.", "asserted_value": "Transformer requires accessible ceiling"}, {"discipline": "Plumbing", "sheet": "P02.02", "source_text": "KEYED NOTE: 1 EWH-1 ABOVE CEILING SUSPENDED AS HIGH AS POSSIBLE IN CEILING PLENUM.", "asserted_value": "Water heater suspended above ceiling"}, {"discipline": "Architectural", "sheet": "A23.01", "source_text": "FINISH LEGEND: CEILING TYPES: C1, FINISH: GYPSUM BOARD CEILING... LOCATION: ...LOUNGE", "asserted_value": "Lounge has a GWB hard-lid ceiling"}], "recommended_resolution": "Relocate suspended equipment to be above an accessible ceiling (e.g., acoustic tile in corridor/restrooms) or specify access panels in the hard-lid ceiling of sufficient size for equipment replacement. Confirm locations on all disciplined drawings.", "code_reference": null}, {"issue_id": "CBI-003", "source_stage": "constructability", "category": "support_anchorage", "severity": "critical", "confidence": "high", "location": "Above ceiling in Lounge area", "disciplines": ["Electrical", "Plumbing"], "sheets": ["E05.02", "P03.01"], "description": "Details for suspending the electrical transformer and water heater delegate the structural design of the supports. The electrical detail (5/E05.02) states 'Verify support sizing and designed with project structural engineer prior to assembly.' The plumbing detail (4/P03.01) simply shows unistrut and threaded rods. The structural design for supporting heavy, suspended equipment cannot be delegated to the field. This poses a significant life-safety and buildability risk. The drawings must include a fully engineered support design, including member sizes, connections to the building structure, and load calculations, coordinated with the structural engineer of record.", "evidence": [{"discipline": "Electrical", "sheet": "E05.02", "source_text": "VERIFY SUPPORT SIZING AND DESIGNED WITH PROJECT STRUCTURAL ENGINEER PRIOR TO ASSEMBLY.", "asserted_value": "Delegation of structural support design for transformer"}, {"discipline": "Plumbing", "sheet": "P03.01", "source_text": "DETAIL 4 - EWH-1 ABOVE CEILING DETAIL: 2\" UNISTRUT SUPPORT. 1/2\" ALL THREADED RODS...", "asserted_value": "Generic, non-engineered support shown for water heater"}], "recommended_resolution": "Provide engineered structural details for the suspension of the transformer and water heater, signed and sealed by the structural engineer. Details must show connection to the building structure and specify all components.", "code_reference": null}, {"issue_id": "CBI-004", "source_stage": "constructability", "category": "detail_gap", "severity": "high", "confidence": "high", "location": "Restrooms", "disciplines": ["Architectural"], "sheets": ["A23.01", "A51.01"], "description": "The finish plan (A23.01) specifies Polished Concrete (PC-1) for the restroom floors. The typical restroom elevation detail (3/A51.01) explicitly calls out for 'TILE FLOOR'. These are mutually exclusive finishes requiring different slab preparation, sequencing, and installation methods. This conflicting information makes it impossible to bid or build as drawn.", "evidence": [{"discipline": "Architectural", "sheet": "A23.01", "source_text": "FINISH LEGEND PC1 ... LOCATION: CORRIDOR, RESTROOMS, LOUNGE...", "asserted_value": "Restroom floor is Polished Concrete"}, {"discipline": "Architectural", "sheet": "A51.01", "source_text": "TYPICAL RESTROOM FLOOR PLAN - DETAIL 3 - TILE FLOOR (SEE A-101)", "asserted_value": "Restroom floor is Tile"}], "recommended_resolution": "Clarify the intended floor finish for the restrooms and ensure all plans, elevations, and details are consistent.", "code_reference": null}, {"issue_id": "CBI-005", "source_stage": "constructability", "category": "routing", "severity": "high", "confidence": "high", "location": "Sales Area Ceiling", "disciplines": ["Architectural", "Electrical"], "sheets": ["E03.01", "A23.01"], "description": "The electrical lighting plan (E03.01) shows a simple grid of fixtures for the sales area, but a handwritten note on the plan states 'fixture locations not matching arch'. The architectural reflected ceiling plan, based on the ceiling grid spec C4-A from A23.01, would typically define the final layout. This conflict will cause confusion during layout and installation, potentially leading to installing fixtures in the wrong locations and requiring rework.", "evidence": [{"discipline": "Electrical", "sheet": "E03.01", "source_text": "fixture locations not matching arch", "asserted_value": "Explicit note indicates a conflict between electrical and architectural layouts."}, {"discipline": "Electrical", "sheet": "E03.01", "source_text": "FLOOR PLAN - LIGHTING (layout in Sales Area)", "asserted_value": "Shows a simple rectangular grid of fixtures."}], "recommended_resolution": "Reconcile the electrical lighting plan with the architectural reflected ceiling plan. The electrical drawing should be updated to reflect the final, coordinated lighting layout.", "code_reference": null}, {"issue_id": "CBI-006", "source_stage": "constructability", "category": "sequencing", "severity": "high", "confidence": "high", "location": "Roof", "disciplines": ["General", "Architectural"], "sheets": ["G11.03", "A25.01"], "description": "There is a contractual and sequencing conflict regarding roofing work. The Landlord Work Letter (G11.03) mandates that ALL roof penetrations be performed by the Landlord's designated roofing contractor. However, the architectural roof plan (A25.01) directs the General Contractor (GC) to install flashing for the new RTUs. This ambiguity over responsibility for roof work will cause bidding confusion, delays, and potential warranty voidance for the existing roof.", "evidence": [{"discipline": "General", "sheet": "G11.03", "source_text": "ALL ROOF PENETRATIONS MUST BE MADE BY LANDLORD'S ROOFING CONTRACTOR, AT TENANTS COST.", "asserted_value": "Landlord's roofer performs work."}, {"discipline": "Architectural", "sheet": "A25.01", "source_text": "2 NEW RTU... GC TO INSTALL FLASHING PER PER ROOFING MANUFACTURING STANDARDS...", "asserted_value": "GC performs work."}], "recommended_resolution": "Clarify which entity is responsible for making and flashing roof penetrations and update the drawings consistently. If the Landlord's roofer must be used, provide their contact info and coordination requirements.", "code_reference": null}, {"issue_id": "CBI-007", "source_stage": "constructability", "category": "support_anchorage", "severity": "high", "confidence": "high", "location": "Inventory Room", "disciplines": ["Architectural"], "sheets": ["A24.01"], "description": "A wall-mounted network 'RACK SYSTEM' is shown in the Inventory room. A note instructs to 'COORDINATE WITH TENANT FOR PLYWOOD BACKING FOR MOUNTING NETWORK RACK.' This is insufficient for construction. The drawings must specify the size, thickness, and fire-rating of the plywood backing, and more importantly, the method of attachment to the wall structure (e.g., fasteners, gauge of metal studs, additional blocking) to safely support the full weight of the rack and its equipment.", "evidence": [{"discipline": "Architectural", "sheet": "A24.01", "source_text": "RACK SYSTEM ABOVE SAFE @ ~74\" TO BOTTOM", "asserted_value": "Heavy equipment is wall mounted."}, {"discipline": "Architectural", "sheet": "A24.01", "source_text": "COORDINATE WITH TENANT FOR PLYWOOD BACKING FOR MOUNTING NETWORK RACK", "asserted_value": "Support design is undefined and delegated."}], "recommended_resolution": "Provide a detail specifying the plywood backing dimensions, fire-treatment requirements, and engineered fastening to the wall structure adequate for the anticipated load of the fully-populated network rack.", "code_reference": null}, {"issue_id": "CBI-008", "source_stage": "constructability", "category": "detail_gap", "severity": "medium", "confidence": "high", "location": "Project Wide", "disciplines": ["General", "Electrical"], "sheets": ["G21.01", "E01.01"], "description": "The drawing set specifies conflicting versions of the governing codes, creating ambiguity for bidding and construction. Sheet G21.01 lists the 2018 IBC and 2014 NEC. Sheet E01.01 lists the 2021 IBC and 2023 NEC. The contractor cannot determine which set of rules to follow without clarification, which poses a significant risk for inspection failures and rework.", "evidence": [{"discipline": "General", "sheet": "G21.01", "source_text": "2018 INTERNATIONAL BUILDING CODE (IBC)", "asserted_value": "2018 IBC"}, {"discipline": "General", "sheet": "G21.01", "source_text": "2023 STATE OF TEXAS ADOPTED 2014 NFPA 70 NATIONAL ELECTRICAL CODE (NEC)", "asserted_value": "2014 NEC"}, {"discipline": "Electrical", "sheet": "E01.01", "source_text": "CONTRACTOR SHALL CONFORM TO ALL LOCAL, STATE, AND APPLICABLE CODES, 2023 NEC, 2021 IBC...", "asserted_value": "2023 NEC, 2021 IBC"}], "recommended_resolution": "Verify the applicable code editions with the Authority Having Jurisdiction and update all references throughout the drawing set to be consistent.", "code_reference": null}, {"issue_id": "CBI-009", "source_stage": "constructability", "category": "tolerance_fit", "severity": "medium", "confidence": "high", "location": "Throughout Space", "disciplines": ["Architectural"], "sheets": ["A23.01"], "description": "The ceiling specifications on the Finish Plan (A23.01) are contradictory. The acoustic tile (AT-1) is specified with an 'Angled Tegular' edge profile, while the grid (C4-A) is specified for a 'Square Lay In' edge profile. These two profiles are incompatible. Tegular tiles drop below the face of the grid, while lay-in tiles sit flush within the grid opening. The wrong combination will not fit together.", "evidence": [{"discipline": "Architectural", "sheet": "A23.01", "source_text": "AT-1 MANUF: ARMSTRONG MODEL: DUNE #1774 ... EDGE PROFILE: ANGLED TEGULAR 15/16\"", "asserted_value": "Tile has a Tegular edge"}, {"discipline": "Architectural", "sheet": "A23.01", "source_text": "C4-A MANUF: ARMSTRONG PRODUCT: ULTIMA 1910 ... GRID: PRELUDE XL 15/16\" EXPOSED TEE IN WHITE EDGE PROFILE: 15/16\" SQUARE LAY IN", "asserted_value": "Grid is for a Square Lay-in tile"}], "recommended_resolution": "Clarify the intended ceiling tile edge profile (Tegular or Square Lay-in) and ensure both the tile and grid specifications are coordinated to match.", "code_reference": null}, {"issue_id": "CBI-010", "source_stage": "constructability", "category": "sequencing", "severity": "medium", "confidence": "high", "location": "CLEANING SUPPLIES/STORAGE Room", "disciplines": ["Plumbing", "Architectural"], "sheets": ["P02.01", "A24.01"], "description": "The Plumbing plan (P02.01) shows a mop sink (MS-1), floor drain (FD-1) and floor sink (FS-1) in the 'CLEANING SUPPLIES/STORAGE' room. These fixed pieces of equipment are not indicated on the Architectural plans (e.g., A24.01). The omission from architectural plans creates a risk of conflict with finishes, casework, or other wall-mounted items, and raises questions about required wall backing for the faucet and sink.", "evidence": [{"discipline": "Plumbing", "sheet": "P02.01", "source_text": "MS-1", "asserted_value": "Plumbing plan shows Mop Sink MS-1"}, {"discipline": "Architectural", "sheet": "A24.01", "source_text": "CLEANING SUPPLIES/STORAGE", "asserted_value": "Architectural plan shows an empty room with no mop sink."}], "recommended_resolution": "Add the mop sink and other fixed plumbing equipment to the architectural floor plans to ensure proper spatial coordination, and add blocking details as required.", "code_reference": null}, {"issue_id": "CBI-011", "source_stage": "constructability", "category": "dimension_closure", "severity": "low", "confidence": "high", "location": "Restrooms", "disciplines": ["Architectural"], "sheets": ["A51.01"], "description": "There is a dimensional conflict for the side grab bar in the typical restroom. The elevation (2/A51.01) dimensions the grab bar as 3'-4\" long. However, the associated blocking detail (6/A51.01) calls for a minimum length of 3'-6\". The elevation shows a bar that does not meet the minimum length required by the blocking detail. This could lead to ordering the wrong size bar or failing inspection.", "evidence": [{"discipline": "Architectural", "sheet": "A51.01", "source_text": "2/A51.01 (showing grab bar dimension) 3'-4\"", "asserted_value": "3'-4\" grab bar length"}, {"discipline": "Architectural", "sheet": "A51.01", "source_text": "6/A51.01 (showing blocking for grab bar) 3'-6\" MIN.", "asserted_value": "3'-6\" minimum grab bar length"}], "recommended_resolution": "Coordinate the grab bar length shown in elevation with the minimum length specified in the blocking detail. Adjust one of the details to be consistent.", "code_reference": null}]} \ No newline at end of file diff --git a/backend/.llm_cache/eb4cf699fd7f62aea50dd06dbc61381afc4fc877dcdd0420ba0e6df69c29db3c.json b/backend/.llm_cache/eb4cf699fd7f62aea50dd06dbc61381afc4fc877dcdd0420ba0e6df69c29db3c.json new file mode 100644 index 0000000..42a1b18 --- /dev/null +++ b/backend/.llm_cache/eb4cf699fd7f62aea50dd06dbc61381afc4fc877dcdd0420ba0e6df69c29db3c.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "TPD_Height_Contradiction_G11.02", "category": "note_or_spec_contradiction", "severity": "medium", "confidence": "high", "location": "Restroom Toilet Paper Dispenser", "disciplines": ["Architectural", "General"], "sheets": ["G11.02"], "description": "The 'Typical Device & Sign Mounting Heights' diagram indicates a mounting height zone for a 'Toilet Paper Dispenser' between 36\" and 48\" AFF. However, the specific 'Standard TAS Toilet at Heights and Clearances' detail, also on sheet G11.02, clearly dimensions the centerline of the toilet paper dispenser at a minimum of 19\" AFF. These two mounting height standards are mutually exclusive and will cause confusion for the installer.", "evidence": [{"discipline": "General", "sheet": "G11.02", "source_text": "TOILET PAPER DISPENSER", "asserted_value": "36\"- 48\" AFF"}, {"discipline": "Architectural", "sheet": "G11.02", "source_text": "19\" MIN AFF", "asserted_value": "19\" MIN AFF"}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/ebdf8dc9f95cd8850ef34124dd506cb4273e9045499244021f6997f4bce4114c.json b/backend/.llm_cache/ebdf8dc9f95cd8850ef34124dd506cb4273e9045499244021f6997f4bce4114c.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/ebdf8dc9f95cd8850ef34124dd506cb4273e9045499244021f6997f4bce4114c.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/eeaee351768a4fc7d395283a98e04fb00a4199db99c26e848d26e47d65fd351e.json b/backend/.llm_cache/eeaee351768a4fc7d395283a98e04fb00a4199db99c26e848d26e47d65fd351e.json new file mode 100644 index 0000000..873dcd4 --- /dev/null +++ b/backend/.llm_cache/eeaee351768a4fc7d395283a98e04fb00a4199db99c26e848d26e47d65fd351e.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "sales-area-lighting-layout", "category": "location_mismatch", "severity": "high", "confidence": "high", "location": "SALES AREA Ceiling", "disciplines": ["Architectural", "Electrical"], "sheets": ["E03.01"], "description": "The electrical lighting plan on sheet E03.01 shows a specific layout for light fixtures, while an architectural reflected ceiling plan inset on the same sheet shows a completely different, denser grid layout. A handwritten note on the drawing explicitly calls out this discrepancy, stating 'fixture locations not matching arch'. This must be resolved to avoid building the wrong lighting scheme in the primary retail space, which would result in significant rework.", "evidence": [{"discipline": "Electrical", "sheet": "E03.01", "source_text": "fixture locations not matching arch", "asserted_value": "The main electrical lighting plan shows a linear arrangement of fixtures."}, {"discipline": "Architectural", "sheet": "E03.01", "source_text": "[Inset image of architectural reflected ceiling plan]", "asserted_value": "The architectural plan inset shows a dense grid of light fixtures."}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/.llm_cache/ef1fd2f8aec9dd163d5ad1158794252bd2d624325ca6d6e738d5451b22fa66ef.json b/backend/.llm_cache/ef1fd2f8aec9dd163d5ad1158794252bd2d624325ca6d6e738d5451b22fa66ef.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/ef1fd2f8aec9dd163d5ad1158794252bd2d624325ca6d6e738d5451b22fa66ef.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/f464819404af683b85c709c08aa85d49a5010d546606b2c6c777500a255ee16e.json b/backend/.llm_cache/f464819404af683b85c709c08aa85d49a5010d546606b2c6c777500a255ee16e.json new file mode 100644 index 0000000..258d4c2 --- /dev/null +++ b/backend/.llm_cache/f464819404af683b85c709c08aa85d49a5010d546606b2c6c777500a255ee16e.json @@ -0,0 +1 @@ +{"issues": [{"issue_id": "CBI-001", "source_stage": "constructability", "category": "dimension_closure", "severity": "high", "confidence": "high", "location": "A51.01, Typical Restroom Elevation Details for Lavatory L-1", "disciplines": ["Architectural"], "sheets": ["A51.01"], "description": "The typical restroom elevation detail for the lavatory shows conflicting dimensional requirements for the toe clearance. One note calls for a '9\" MIN. TOE CLEAR' while another note on the same detail calls for a '6\" MAX. TOE CLEAR'. These two requirements are mutually exclusive and cannot be constructed as drawn.", "evidence": [{"discipline": "Architectural", "sheet": "A51.01", "source_text": "9\" MIN. TOE CLEAR", "asserted_value": "{'min': 9}"}, {"discipline": "Architectural", "sheet": "A51.01", "source_text": "6\" MAX. TOE CLEAR", "asserted_value": "{'max': 6}"}], "recommended_resolution": "Clarify the required accessible toe clearance dimension for the lavatory and remove the conflicting note to provide a single, buildable requirement.", "code_reference": null}, {"issue_id": "CBI-002", "source_stage": "constructability", "category": "support_anchorage", "severity": "high", "confidence": "high", "location": "Lounge ceiling space", "disciplines": ["Electrical", "Structural"], "sheets": ["E02.01", "E05.02", "G11.01"], "description": "Electrical drawings specify a transformer to be suspended from the existing structure, with a detail on E05.02 that requires the contractor to 'VERIFY SUPPORT SIZING AND DESIGNED WITH PROJECT STRUCTURAL ENGINEER'. However, the drawing index on G11.01 does not include a structural engineer or any S-series drawings for this tenant improvement project. This improperly transfers design liability to the contractor and creates a significant risk that the support cannot be built as detailed or that the existing structure cannot safely carry the unspecified load. Construction cannot proceed without a verified support design from a qualified engineer.", "evidence": [{"discipline": "Electrical", "sheet": "E02.01", "source_text": "7 TRANSFORMER TO BE SUSPENDED FROM STRUCTURE AT HIGH LEVEL ABOVE ACCESSIBLE CEILING.", "asserted_value": "Transformer to be suspended from structure"}, {"discipline": "Electrical", "sheet": "E05.02", "source_text": "VERIFY SUPPORT SIZING AND DESIGNED WITH PROJECT STRUCTURAL ENGINEER PRIOR TO ASSEMBLY.", "asserted_value": "Contractor must verify design with structural engineer"}, {"discipline": "General", "sheet": "G11.01", "source_text": "(Sheet Index)", "asserted_value": "No structural discipline sheets are listed in the drawing index."}], "recommended_resolution": "The base building structural engineer of record (or a newly engaged one) must provide a signed and sealed detail for the transformer support, confirming the capacity of the existing structure and specifying all connection components.", "code_reference": null}, {"issue_id": "CBI-003", "source_stage": "constructability", "category": "routing", "severity": "medium", "confidence": "high", "location": "Roof and ceiling plenum", "disciplines": ["Mechanical", "Plumbing"], "sheets": ["M02.01", "M03.01", "P02.01"], "description": "Mechanical plans M02.01 and M03.01 show condensate lines originating from RTU-1 and RTU-2 with a requirement to terminate to the sanitary sewer. However, the drawings do not show the routing for these lines from the roof into the building, nor do they indicate a specific, coordinated termination point on the plumbing plans. This missing information will require an RFI and field routing, creating risks of conflicts with other MEP systems and structure, and potential improper connection to the sanitary system without a detailed air gap.", "evidence": [{"discipline": "Mechanical", "sheet": "M02.01", "source_text": "(Graphic of condensate lines from RTU-1 and RTU-2)", "asserted_value": "Condensate lines shown at RTUs."}, {"discipline": "Mechanical", "sheet": "M03.01", "source_text": "NOTE: CONDENSATE DRAIN TO TERMINATE TO SANITARY SEWER.", "asserted_value": "Termination specified to sanitary sewer."}, {"discipline": "Plumbing", "sheet": "P02.01", "source_text": "(Plumbing Plan)", "asserted_value": "No connection from RTU condensate shown at any plumbing fixture or drain."}], "recommended_resolution": "Provide a coordinated routing plan showing the path of the condensate lines from the RTUs on the roof to a specific, detailed termination point (e.g., a dedicated floor sink) on the plumbing plans.", "code_reference": null}, {"issue_id": "CBI-004", "source_stage": "constructability", "category": "tolerance_fit", "severity": "medium", "confidence": "high", "location": "Sales Area floor", "disciplines": ["Electrical", "Architectural"], "sheets": ["E02.01", "A23.01"], "description": "The plans specify recessed power/data floor boxes to be installed flush within a polished concrete floor finish. This is a very difficult installation requiring extremely tight tolerances to avoid finish damage. The drawings do not provide a specific detail for the installation, including blockout dimensions, protection of the cover during grinding/polishing, and the critical transition between the metal box and the surrounding concrete. This lack of detail creates a high risk for an aesthetically poor finish, cracked concrete at the box edge, and costly rework.", "evidence": [{"discipline": "Electrical", "sheet": "E02.01", "source_text": "1 PROVIDE COMBINATION (POWER/DATA) HUBBELL SYSTEMONE FULLY RECESSED FLOORBOX #CFB4G25 WITH FLUSH ROUND COVER (FINISH APPROVED BY ARCHITECT).", "asserted_value": "Recessed floor box with flush cover"}, {"discipline": "Architectural", "sheet": "A23.01", "source_text": "PC 1 POLISHED CONCRETE GRADE: 2 (MEDIUMS EXPOSED), WITH A CLASS 1 (MATTE) FINISH", "asserted_value": "Polished concrete floor"}], "recommended_resolution": "Provide a large-scale detail for the installation of floor boxes in the polished concrete slab, specifying blockout requirements, tolerances, protection methods, and the joint treatment at the interface between the concrete and floor box cover.", "code_reference": null}]} \ No newline at end of file diff --git a/backend/.llm_cache/f5675517c4bbe2c364ea71c2e265cba450a5d8c69ffb9f600ca46d0632ffdf70.json b/backend/.llm_cache/f5675517c4bbe2c364ea71c2e265cba450a5d8c69ffb9f600ca46d0632ffdf70.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/f5675517c4bbe2c364ea71c2e265cba450a5d8c69ffb9f600ca46d0632ffdf70.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/f74322804e799d75ffa83cdac0ac43c8fd7045af0280374d44f4e39e1120f739.json b/backend/.llm_cache/f74322804e799d75ffa83cdac0ac43c8fd7045af0280374d44f4e39e1120f739.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/f74322804e799d75ffa83cdac0ac43c8fd7045af0280374d44f4e39e1120f739.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/f829bd526260778715ade9e37817c07a7b040a681b95a5aef821d6511031ecb0.json b/backend/.llm_cache/f829bd526260778715ade9e37817c07a7b040a681b95a5aef821d6511031ecb0.json new file mode 100644 index 0000000..72db62c --- /dev/null +++ b/backend/.llm_cache/f829bd526260778715ade9e37817c07a7b040a681b95a5aef821d6511031ecb0.json @@ -0,0 +1 @@ +{"issues": [{"issue_id": "qaqc-0001", "source_stage": "qaqc", "category": "missing_sheet", "severity": "critical", "confidence": "high", "location": "Entire Project", "disciplines": ["Structural", "Architectural", "Mechanical", "Electrical"], "sheets": ["M03.01", "E05.02", "A25.01"], "description": "The drawing set is entirely missing the Structural discipline (S-series sheets). Structural drawings are required to specify support for new rooftop units (RTUs), suspended transformers, framing for roof openings, and requirements for any slab penetrations. Multiple notes on Architectural, Mechanical and Electrical sheets refer to coordination with a structural engineer, but no drawings are provided. This is critical for bidding, permitting, and construction.", "evidence": [{"discipline": "System", "sheet": "sheet_index", "source_text": "No sheets with the 'S' discipline prefix are present in the sheet index.", "asserted_value": "Missing Structural Drawings"}, {"discipline": "Electrical", "sheet": "E05.02", "source_text": "VERIFY SUPPORT SIZING AND DESIGNED WITH PROJECT STRUCTURAL ENGINEER PRIOR TO ASSEMBLY.", "asserted_value": "Reference to project structural engineer"}, {"discipline": "Mechanical", "sheet": "M03.01", "source_text": "ANGLE IRON FRAME ALL AROUND ROOF OPENING RE: STRUCTURAL.", "asserted_value": "Reference to structural drawings"}], "recommended_resolution": "Provide a complete set of structural drawings, including foundation plans, framing plans, and all necessary details for the new scope of work. Ensure MEP and Architectural drawings are coordinated with the new structural information.", "code_reference": null}, {"issue_id": "qaqc-0002", "source_stage": "qaqc", "category": "missing_sheet", "severity": "critical", "confidence": "high", "location": "pages 14, 15", "disciplines": ["Architectural", "Mechanical", "Electrical", "Plumbing"], "sheets": [], "description": "Critical architectural plans appear to be missing from the set, corresponding to pages 14 and 15 where file extraction failed. These are expected to be the primary Architectural Dimension/Construction Plan and the Reflected Ceiling Plan (RCP). Without a dimensioned plan, construction layout is impossible. Without an RCP, coordination of lighting, HVAC diffusers, and sprinkler heads is impossible and ceiling heights are undefined.", "evidence": [{"discipline": "Architectural", "sheet": "page-14", "source_text": "Page 14 (extraction failed)", "asserted_value": "Expected to be the Dimension/Construction Plan"}, {"discipline": "Architectural", "sheet": "page-15", "source_text": "Page 15 (extraction failed)", "asserted_value": "Expected to be the Reflected Ceiling Plan"}], "recommended_resolution": "Provide the missing Architectural Dimension Plan and Reflected Ceiling Plan. Ensure all disciplines are coordinated with these new sheets.", "code_reference": null}, {"issue_id": "qaqc-0003", "source_stage": "qaqc", "category": "missing_sheet", "severity": "critical", "confidence": "high", "location": "page 22", "disciplines": ["Mechanical", "Architectural"], "sheets": [], "description": "The Mechanical HVAC floor plan, expected as M02.01, is missing from the set, corresponding to page 22 where extraction failed. The sheet index jumps from Mechanical notes (M01.01) to the Mechanical Roof Plan (M02.02). Without the floor plan showing ductwork layout, diffuser locations, and thermostat locations, the HVAC system cannot be bid, permitted, or constructed.", "evidence": [{"discipline": "Mechanical", "sheet": "page-22", "source_text": "Page 22 (extraction failed)", "asserted_value": "Expected to be the Mechanical Floor Plan"}], "recommended_resolution": "Provide the missing Mechanical Floor Plan M02.01 and ensure it is coordinated with the architectural RCP and lighting plan.", "code_reference": null}, {"issue_id": "qaqc-0004", "source_stage": "qaqc", "category": "missing_schedule", "severity": "critical", "confidence": "high", "location": "Architectural Sheets", "disciplines": ["Architectural"], "sheets": ["G31.04"], "description": "The drawing set lacks a Door and Frame Schedule. Floor plans show new doors, but there is no schedule to define their type, size, material, fire rating, hardware group, or other essential attributes. This information is critical for procurement, accurate bidding, and code compliance.", "evidence": [{"discipline": "System", "sheet": "sheet_index", "source_text": "No sheet with a door schedule is present in the sheet index.", "asserted_value": "Missing Door Schedule"}, {"discipline": "General", "sheet": "G31.04", "source_text": "ANSI A250.8, SEAMLESS, MINIMUM 18 GAGE FACE SHEETS.", "asserted_value": "Specification for hollow metal doors exists, but no schedule applies it to specific locations."}], "recommended_resolution": "Create and issue a complete Door and Frame Schedule, including a hardware schedule/sets. Key all doors on the floor plans to this schedule.", "code_reference": null}, {"issue_id": "qaqc-0005", "source_stage": "qaqc", "category": "missing_information", "severity": "critical", "confidence": "high", "location": "Architectural Plans", "disciplines": ["Architectural"], "sheets": ["G11.03", "G31.06"], "description": "The set lacks a partition type legend and a plan showing where different wall types are to be constructed. Notes on G11.03 require demising partitions to be insulated and extend to the roof deck, and G31.06 provides a UL detail for rated walls, but there is no drawing that defines, typifies, and locates these different wall constructions. This is essential for bidding, material ordering, and correct construction.", "evidence": [{"discipline": "System", "sheet": "sheet_index", "source_text": "No sheet contains a partition type legend.", "asserted_value": "Missing Partition Type Legend"}, {"discipline": "General", "sheet": "G11.03", "source_text": "Tenant shall furnish and install all demising partitions from finished floor slab to roof deck.", "asserted_value": "Requirement for a specific wall type exists with no corresponding visual definition or location plan."}], "recommended_resolution": "Provide a Partition Type Legend detailing all wall assemblies used in the project. Use partition type tags on the dimensioned floor plan to indicate the location of each wall type.", "code_reference": null}, {"issue_id": "qaqc-0006", "source_stage": "qaqc", "category": "missing_information", "severity": "high", "confidence": "high", "location": "A23.01", "disciplines": ["Architectural"], "sheets": ["A23.01", "A51.01"], "description": "The finish information provided on sheet A23.01 is incomplete. The legend is missing specifications (manufacturer, product name, color, etc.) for Paint Tag 'P-1', Wall Base Tag 'WB-1', and Wall Tile Tag 'CT-1'. A full interior finish schedule is typically required. This missing information prevents accurate pricing and procurement.", "evidence": [{"discipline": "Architectural", "sheet": "A23.01", "source_text": "L. WALLS TO BE PAINTED P-1 THROUGHOUT.", "asserted_value": "P-1 is not defined."}, {"discipline": "Architectural", "sheet": "A23.01", "source_text": "M. VINYL BASE WB-1 THROUGHOUT, U.N.O.", "asserted_value": "WB-1 is not defined."}, {"discipline": "Architectural", "sheet": "A51.01", "source_text": "CT-1 TILE WAINSCOT", "asserted_value": "CT-1 is shown on elevations but not defined in any schedule or legend."}], "recommended_resolution": "Complete the Finish Legend or provide a separate tabular Interior Finish Schedule with all required information for all finish tags used on the plans.", "code_reference": null}, {"issue_id": "qaqc-0007", "source_stage": "qaqc", "category": "missing_detail", "severity": "high", "confidence": "high", "location": "A24.01", "disciplines": ["Architectural", "Structural"], "sheets": ["A24.01"], "description": "General Note G on the Furniture/Power/Data Plan (A24.01) refers to detail '3/A92.01' for a 'foundation pour back detail where existing slab is cut'. Sheet A92.01 does not exist in the drawing set. This detail is critical for any work involving slab cuts, such as for under-slab plumbing or electrical, and is necessary for both structural integrity and proper finishing.", "evidence": [{"discipline": "Architectural", "sheet": "A24.01", "source_text": "G. REFER TO DETAIL 3/A92.01 FOR FOUNDATION POUR BACK DETAIL WHERE EXISTING SLAB IS CUT.", "asserted_value": "A non-existent detail is referenced."}], "recommended_resolution": "Provide the referenced detail sheet A92.01 or add the detail to an existing detail sheet and correct the reference on A24.01.", "code_reference": null}, {"issue_id": "qaqc-0008", "source_stage": "qaqc", "category": "missing_detail", "severity": "medium", "confidence": "high", "location": "Architectural Sheets", "disciplines": ["Architectural", "Mechanical", "Electrical"], "sheets": [], "description": "The drawing set lacks comprehensive building sections or full-height wall sections. These are necessary to illustrate the relationship between new partitions, existing structure, ceilings, and the roof deck. This is particularly important for demising walls which are required to extend to the deck and for coordinating vertical MEP runs.", "evidence": [{"discipline": "System", "sheet": "sheet_index", "source_text": "No sheets in the A3x or A4x series, typically used for sections, are present in the sheet index.", "asserted_value": "Missing wall/building section sheets."}], "recommended_resolution": "Provide typical full-height wall sections for standard interior partitions and for demising/rated partitions to clarify construction requirements and facilitate MEP coordination.", "code_reference": null}, {"issue_id": "qaqc-0009", "source_stage": "qaqc", "category": "bid_readiness", "severity": "medium", "confidence": "high", "location": "G01.01", "disciplines": ["General"], "sheets": ["G01.01"], "description": "The cover sheet G01.01 contains placeholder information, including project number '00.000.00', a future issuance date of '2026-06-18', and an issuance status of 'CLIENT REVIEW'. This indicates the set is preliminary and not ready for formal issuance for bid, permit, or construction.", "evidence": [{"discipline": "General", "sheet": "G01.01", "source_text": "Project number 00.000.00", "asserted_value": "00.000.00"}, {"discipline": "General", "sheet": "G01.01", "source_text": "YYYY-MM-DD\n2026-06-18", "asserted_value": "2026-06-18"}], "recommended_resolution": "Update all placeholder information with final, correct data before issuing the drawing set for any formal purpose.", "code_reference": null}, {"issue_id": "qaqc-0010", "source_stage": "qaqc", "category": "missing_sheet", "severity": "medium", "confidence": "medium", "location": "Entire Project", "disciplines": ["Fire Protection", "Architectural", "Mechanical", "Electrical"], "sheets": ["G21.01"], "description": "Although sheet G21.01 states the building is 'fully sprinklered' and G11.03 names a required sprinkler contractor, there are no Fire Protection (FP) plans in the set. While these can be a deferred submittal, a basic coordination plan showing existing and new/relocated head locations is typically required to coordinate with the new ceiling layout and lighting. Its absence creates a coordination risk and ambiguity for bidders.", "evidence": [{"discipline": "System", "sheet": "sheet_index", "source_text": "No sheets with an 'FP' designator are listed in the sheet index.", "asserted_value": "Missing Fire Protection sheets"}], "recommended_resolution": "Clarify if sprinkler drawings are to be design-build/deferred submittal and add a note to the drawings to that effect. If not, or for better coordination, provide at least a basic sprinkler layout plan coordinated with the new reflected ceiling plan.", "code_reference": null}]} \ No newline at end of file diff --git a/backend/.llm_cache/f88d744fc451bc19f503774c8efe82228ff885c4c30055e05c6de169756903e2.json b/backend/.llm_cache/f88d744fc451bc19f503774c8efe82228ff885c4c30055e05c6de169756903e2.json new file mode 100644 index 0000000..5563d76 --- /dev/null +++ b/backend/.llm_cache/f88d744fc451bc19f503774c8efe82228ff885c4c30055e05c6de169756903e2.json @@ -0,0 +1 @@ +{"conflicts": []} \ No newline at end of file diff --git a/backend/.llm_cache/f9c1aec361df42d5f7219b5230510f2cc3182bec79338a80b4077924732333bf.json b/backend/.llm_cache/f9c1aec361df42d5f7219b5230510f2cc3182bec79338a80b4077924732333bf.json new file mode 100644 index 0000000..59a9f36 --- /dev/null +++ b/backend/.llm_cache/f9c1aec361df42d5f7219b5230510f2cc3182bec79338a80b4077924732333bf.json @@ -0,0 +1 @@ +{"sheet_number": "G31.05", "discipline": "General", "sheet_title": "SPECIFICATIONS", "level": null, "scale": null, "assertions": [{"subject": "Gypsum board wall studs", "attribute": "stud_spacing", "value": "16", "source_text": "STUDS: SPACE STUDS AT 16 INCHES ON CENTER.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "SPEC 092900 3.03.A.1"}}, {"subject": "Wood blocking", "attribute": "blocking_requirement", "value": "Required for framed openings, wall-mounted cabinets, plumbing fixtures, wall mounted door hardware.", "source_text": "BLOCKING: INSTALL WOOD BLOCKING FOR SUPPORT OF: 1. FRAMED OPENINGS. 2. WALL-MOUNTED CABINETS. 3. PLUMBING FIXTURES. 4. WALL MOUNTED DOOR HARDWARE.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "SPEC 092900 3.03.C.1"}}, {"subject": "Gypsum board control joint", "attribute": "control_joint_spacing", "value": "Not more than 30 feet apart", "source_text": "CONTROL JOINTS: PLACE CONTROL JOINTS CONSISTENT WITH LINES OF BUILDING SPACES AND AS INDICATED. 1. NOT MORE THAN 30 FEET APART ON WALLS AND CEILINGS OVER 50 FEET LONG.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "SPEC 092900 3.04.A.1"}}, {"subject": "Gypsum board finish", "attribute": "finish_level", "value": "4", "source_text": "LEVEL 4: WALLS AND CEILINGS TO RECEIVE SEMI-GLOSS OR GLOSS PAINT OR OTHER AREAS SPECIFICALLY INDICATED.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "SPEC 092900 3.05.A.1"}}, {"subject": "Gypsum board finish", "attribute": "finish_level", "value": "2", "source_text": "LEVEL 2: WALLS IN UTILITY AREAS, BEHIND CABINETRY, AND ON BACKING BOARD.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "SPEC 092900 3.05.A.4"}}, {"subject": "Gypsum board finish", "attribute": "finish_level", "value": "1", "source_text": "LEVEL 1: FIRE RATED WALL AREAS ABOVE FINISHED CEILINGS, WHETHER OR NOT ACCESSIBLE IN THE COMPLETED CONSTRUCTION.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "SPEC 092900 3.05.A.5"}}, {"subject": "Gypsum board flatness tolerance", "attribute": "tolerance", "value": "1/8 in 10 ft", "source_text": "TOLERANCES: A. MAXIMUM VARIATION OF FINISHED GYPSUM BOARD SURFACE FROM A TRUE PLANE IS 1/8 INCH IN 10 FEET IN ANY DIRECTION.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "SPEC 092900 3.06"}}, {"subject": "Gypsum wallboard", "attribute": "wall_type", "value": "5/8 inch thick", "source_text": "THICKNESS: A. VERTICAL SURFACES: 5/8 INCH, UNLESS NOTED OTHERWISE ON DRAWINGS.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "SPEC 092900 2.03.B.2.a"}}, {"subject": "Gypsum ceiling board", "attribute": "material_thickness", "value": "5/8", "source_text": "THICKNESS: ... B. CEILINGS: 5/8 INCH.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "SPEC 092900 2.03.B.2.b"}}, {"subject": "Cement board", "attribute": "material_thickness", "value": "5/8", "source_text": "THICKNESS: 5/8 INCH UNLESS NOTED OTHERWISE ON DRAWINGS.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "SPEC 092900 2.03.C.2"}}, {"subject": "Level surfaces", "attribute": "slip_resistance", "value": "min 0.6 SCOF", "source_text": "STATIC COEFFICIENT OF FRICTION: MIN. 0.6 FOR LEVEL SURFACES, MIN. 0.42 FOR RAMPS PER ASTM C1028 OR ANSI A137.1.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "SPEC 09 30 00 1.3.A"}}, {"subject": "Ramps", "attribute": "slip_resistance", "value": "min 0.42 SCOF", "source_text": "STATIC COEFFICIENT OF FRICTION: MIN. 0.6 FOR LEVEL SURFACES, MIN. 0.42 FOR RAMPS PER ASTM C1028 OR ANSI A137.1.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "SPEC 09 30 00 1.3.A"}}, {"subject": "Cementitious backer board", "attribute": "material_thickness", "value": "1/2", "source_text": "CEMENTITIOUS BACKER BOARD: A. 1/2 INCH (13 MM) THICKNESS MINIMUM", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "SPEC 09 30 00 2.2"}}, {"subject": "Tile grout", "attribute": "material_type", "value": "Polymer-modified sanded grout (ANSI A118.7)", "source_text": "GROUT: A. POLYMER-MODIFIED SANDED GROUT (ANSI A118.7).", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "SPEC 09 30 00 2.4"}}, {"subject": "Waterproofing", "attribute": "material_requirement", "value": "Waterproof membrane for wet areas", "source_text": "WATERPROOF MEMBRANE FOR WET AREAS.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "SPEC 09 30 00 2.5.A"}}, {"subject": "Tile Substrate Tolerance", "attribute": "tolerance", "value": "1/4 in 10 ft", "source_text": "ENSURE SUBSTRATE DEVIATION DOES NOT EXCEED 1/4 INCH IN 10 FEET.", "confidence": "high", "location_key": {"grid": null, "room": null, "level": null, "tag": "SPEC 09 30 00 3.2.A"}}]} \ No newline at end of file diff --git a/backend/.llm_cache/fb328cfa3356ab561febe9615a8dc7525e3a51eeaae0cb267e9f89974e4376d3.json b/backend/.llm_cache/fb328cfa3356ab561febe9615a8dc7525e3a51eeaae0cb267e9f89974e4376d3.json new file mode 100644 index 0000000..dc72856 --- /dev/null +++ b/backend/.llm_cache/fb328cfa3356ab561febe9615a8dc7525e3a51eeaae0cb267e9f89974e4376d3.json @@ -0,0 +1 @@ +[{"assertion_id": "P03.01#10", "original_value": "Install at an accessible location. Provide access panel where required.", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "accessibility_requirement", "normalization_notes": "Qualitative requirement, no numerical value to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#11", "original_value": "6-mil Polyethylene vapor retarder minimum", "normalized_value": "6", "normalized_unit": "mil", "normalized_attribute": "thickness", "normalization_notes": "Normalized thickness from '6-mil'. The value is a minimum requirement.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#12", "original_value": "2\" larger than the pipe", "normalized_value": "2", "normalized_unit": "inch", "normalized_attribute": "clearance", "normalization_notes": "Normalized from '2\"'. Value is a relative dimension representing the required clearance between pipe and sleeve.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#13", "original_value": "Connection from PVC below slab to Cast Iron above slab with transition coupling", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "pipe_connection_detail", "normalization_notes": "Descriptive text about material transition. No numerical value to normalize.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#14", "original_value": "No exposed PVC above slab", "normalized_value": null, "normalized_unit": null, "normalized_attribute": "installation_note", "normalization_notes": "Qualitative installation requirement.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#15", "original_value": "1 1/2", "normalized_value": "1.5", "normalized_unit": "inch", "normalized_attribute": "vent_pipe_diameter", "normalization_notes": "Normalized from '1 1/2'. Unit inferred from source text '1 1/2\"V'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#16", "original_value": "2", "normalized_value": "2", "normalized_unit": "inch", "normalized_attribute": "sanitary_pipe_diameter", "normalization_notes": "Unit inferred from source text '2\"SAN'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#17", "original_value": "2", "normalized_value": "2", "normalized_unit": "inch", "normalized_attribute": "vent_pipe_diameter", "normalization_notes": "Unit inferred from source text '2\"V'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#18", "original_value": "3", "normalized_value": "3", "normalized_unit": "inch", "normalized_attribute": "sanitary_pipe_diameter", "normalization_notes": "Unit inferred from source text '3\"SAN'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#19", "original_value": "2", "normalized_value": "2", "normalized_unit": "inch", "normalized_attribute": "sanitary_pipe_diameter", "normalization_notes": "Unit inferred from source text '2\"SAN'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#20", "original_value": "2", "normalized_value": "2", "normalized_unit": "inch", "normalized_attribute": "vent_pipe_diameter", "normalization_notes": "Unit inferred from source text '2\"V'.", "source_text_preserved": true, "normalization_confidence": "high"}, {"assertion_id": "P03.01#21", "original_value": "Fixture units 1-11 require J.R. SMITH FIG. NO 5005 (Symbol A), Size 3/4\", B Size 4\"", "normalized_value": "manufacturer=J.R. SMITH; model_number=5005; symbol=A; fixture_unit_range=1-11; size_A=0.75; size_B=4", "normalized_unit": "inch", "normalized_attribute": "floor_drain_schedule_entry", "normalization_notes": "Normalized multiple attributes from a schedule entry into a semicolon-separated string. The 'inch' unit applies to size_A and size_B.", "source_text_preserved": true, "normalization_confidence": "high"}] \ No newline at end of file diff --git a/backend/.llm_cache/fcad1ea68b8363538ca944bc11167a31e09746af3e3772ba2beafb601ef2b171.json b/backend/.llm_cache/fcad1ea68b8363538ca944bc11167a31e09746af3e3772ba2beafb601ef2b171.json new file mode 100644 index 0000000..a355345 --- /dev/null +++ b/backend/.llm_cache/fcad1ea68b8363538ca944bc11167a31e09746af3e3772ba2beafb601ef2b171.json @@ -0,0 +1 @@ +{"sheet_number": "G11.01", "discipline": "General", "sheet_title": "VICINITY PLAN, ABBREVIATIONS, PROJECT GENERAL NOTES & SHEET INDEX", "level": null, "scale": null, "assertions": [{"assertion_id": "G11.01-001", "subject": "Project Information", "category": "general", "attribute": "project_name", "value": "VERIZON ELYSON", "unit": null, "location_key": {"sheet_number": "G11.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "Title Block", "detail_reference": null, "plan_zone": "A"}, "source_text": "VERIZON ELYSON", "coordination_targets": ["architectural", "civil", "structural", "mechanical", "electrical", "plumbing"], "conflict_potential": "low", "code_review_relevance": "none", "confidence": "high"}, {"assertion_id": "G11.01-002", "subject": "Project Information", "category": "general", "attribute": "project_address", "value": "7022 ELYSON EXCHANGE WAY CYPRESS, TX 77433", "unit": null, "location_key": {"sheet_number": "G11.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "Title Block", "detail_reference": null, "plan_zone": "A"}, "source_text": "7022 ELYSON EXCHANGE WAY CYPRESS, TX 77433", "coordination_targets": ["civil"], "conflict_potential": "medium", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "G11.01-003", "subject": "Project Information", "category": "general", "attribute": "building_name", "value": "ELYSON TOWN CENTER - BUILDING C", "unit": null, "location_key": {"sheet_number": "G11.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "Vicinity Map", "detail_reference": null, "plan_zone": "A"}, "source_text": "ELYSON TOWN CENTER - BUILDING C", "coordination_targets": ["civil"], "conflict_potential": "low", "code_review_relevance": "none", "confidence": "high"}, {"assertion_id": "G11.01-004", "subject": "Project General Note 1", "category": "life_safety", "attribute": "general_note", "value": "All work of the general contractor and his subcontractors shall conform to the provisions of the federal, state, city, and county building laws, codes, ordinances, rules and regulations enforced by the authority having jurisdiction (AHJ).", "unit": null, "location_key": {"sheet_number": "G11.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "Note 1", "detail_reference": null, "plan_zone": "PROJECT GENERAL NOTES"}, "source_text": "1. ALL WORK OF THE GENERAL CONTRACTOR AND HIS SUBCONTRACTORS (HEREIN REFERRED COLLECTIVELY AS THE CONTRACTOR) SHALL CONFORM TO THE PROVISIONS OF THE FEDERAL, STATE, CITY, AND COUNTY BUILDING LAWS, CODES, ORDINANCES, RULES AND REGULATIONS ENFORCED BY THE AUTHORITY HAVING JURISDICTION (AHJ).", "coordination_targets": ["code"], "conflict_potential": "high", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "G11.01-005", "subject": "Project General Note 10", "category": "general", "attribute": "general_note", "value": "Contractor shall warrant all workmanship and materials for a period of 1 year from the date of final completion.", "unit": null, "location_key": {"sheet_number": "G11.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "Note 10", "detail_reference": null, "plan_zone": "PROJECT GENERAL NOTES"}, "source_text": "10. UPON OWNER'S REQUEST, THE CONTRACTOR SHALL ISSUE A DUPLICATE OF BLUE-LINE DRAWING UPON COMPLETION... CONTRACTOR SHALL WARRANT ALL WORKMANSHIP AND MATERIALS... FOR A PERIOD OF 1 YEAR FROM THE DATE OF FINAL COMPLETION.", "coordination_targets": ["owner_standard", "specialty"], "conflict_potential": "medium", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "G11.01-006", "subject": "Project General Note 12", "category": "life_safety", "attribute": "general_note", "value": "Through-penetrations in fire-resistive walls shall conform to the Authority Having Jurisdiction's current adopted versions of the IBC and local amendments as well as directives by the Local Fire Marshal's Authority.", "unit": null, "location_key": {"sheet_number": "G11.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "Note 12", "detail_reference": null, "plan_zone": "PROJECT GENERAL NOTES"}, "source_text": "12. THROUGH-PENETRATIONS IN FIRE-RESISTIVE WALLS SHALL CONFORM TO THE AUTHORITY HAVING JURISDICTION'S CURRENT ADOPTED VERSIONS OF THE IBC AND LOCAL AMENDMENTS AS WELL AS DIRECTIVES BY THE LOCAL FIRE MARSHAL'S AUTHORITY.", "coordination_targets": ["architectural", "structural", "mechanical", "electrical", "plumbing", "fire_protection", "code"], "conflict_potential": "high", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "G11.01-007", "subject": "Project General Note 13", "category": "life_safety", "attribute": "general_note", "value": "Owner-provided extinguishers shall travel distance not to exceed 75' in accordance w/ NFPA standard 10.", "unit": null, "location_key": {"sheet_number": "G11.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "Note 13", "detail_reference": null, "plan_zone": "PROJECT GENERAL NOTES"}, "source_text": "13. PROVIDED THAT EXTINGUISHERS SHALL TRAVEL DISTANCE NOT TO EXCEED 75' IN ACCORDANCE W/ NFPA STANDARD 10 AND AS DIRECTED BY THE FIRE MARSHAL.", "coordination_targets": ["architectural", "owner_standard", "code"], "conflict_potential": "high", "code_review_relevance": "high", "confidence": "high"}, {"assertion_id": "G11.01-008", "subject": "Project General Note 23", "category": "general", "attribute": "general_note", "value": "The priority for project dimensions shall be in the following order: A. Mini dimension for accessibility clearance & building code requirement. B. Large scale details. C. Small scale details. D. Enlarged views, floor plans and elevations.", "unit": null, "location_key": {"sheet_number": "G11.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "Note 23", "detail_reference": null, "plan_zone": "PROJECT GENERAL NOTES"}, "source_text": "23. ALIGNMENT OF PARTITIONS AND FINISHES AS SCHEDULED SHALL BE STRAIGHT, TRUE, & PLUMB. THE PRIORITY FOR PROJECT DIMENSIONS SHALL BE IN THE FOLLOWING ORDER: A. MINI DIMENSION FOR ACCESSIBILITY CLEARANCE & BUILDING CODE REQUIREMENT. B. LARGE SCALE DETAILS. C. SMALL SCALE DETAILS. D. ENLARGED VIEWS, FLOOR PLANS AND ELEVATIONS.", "coordination_targets": ["architectural", "structural", "mechanical", "electrical", "plumbing", "ada", "code"], "conflict_potential": "high", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "G11.01-009", "subject": "Project General Note 24", "category": "architectural", "attribute": "general_note", "value": "Ceiling heights are indicated from the floor elevation to the face of the suspended ceiling system or face of finish material as scheduled.", "unit": null, "location_key": {"sheet_number": "G11.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "Note 24", "detail_reference": null, "plan_zone": "PROJECT GENERAL NOTES"}, "source_text": "24. CEILING HEIGHTS ARE INDICATED FROM THE FLOOR ELEVATION TO THE FACE OF THE SUSPENDED CEILING SYSTEM OR FACE OF FINISH MATERIAL AS SCHEDULED.", "coordination_targets": ["architectural", "mechanical"], "conflict_potential": "medium", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "G11.01-010", "subject": "Project General Note 25A", "category": "general", "attribute": "general_note", "value": "Dimensions shown on drawings shall be to the centerline of the structural grid and structural steel members.", "unit": null, "location_key": {"sheet_number": "G11.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "Note 25A", "detail_reference": null, "plan_zone": "PROJECT GENERAL NOTES"}, "source_text": "25. A. THE CENTERLINE OF THE STRUCTURAL GRID AND STRUCTURAL STEEL MEMBERS.", "coordination_targets": ["architectural", "structural"], "conflict_potential": "high", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "G11.01-011", "subject": "Project General Note 25B", "category": "general", "attribute": "general_note", "value": "Dimensions shown on drawings shall be to the face of cast in place precast concrete walls.", "unit": null, "location_key": {"sheet_number": "G11.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "Note 25B", "detail_reference": null, "plan_zone": "PROJECT GENERAL NOTES"}, "source_text": "25. B. THE FACE OF CAST IN PLACE PRECAST CONCRETE WALLS.", "coordination_targets": ["architectural", "structural"], "conflict_potential": "high", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "G11.01-012", "subject": "Project General Note 25C", "category": "general", "attribute": "general_note", "value": "Dimensions shown on drawings shall be to the nominal face of masonry walls.", "unit": null, "location_key": {"sheet_number": "G11.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "Note 25C", "detail_reference": null, "plan_zone": "PROJECT GENERAL NOTES"}, "source_text": "25. C. THE NOMINAL FACE OF MASONRY WALLS.", "coordination_targets": ["architectural", "structural"], "conflict_potential": "high", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "G11.01-013", "subject": "Project General Note 25D", "category": "general", "attribute": "general_note", "value": "Dimensions shown on drawings shall be to the face of sheathing of partition type as scheduled, unless otherwise noted.", "unit": null, "location_key": {"sheet_number": "G11.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "Note 25D", "detail_reference": null, "plan_zone": "PROJECT GENERAL NOTES"}, "source_text": "25. D. THE FACE OF SHEATHING OF PARTITION TYPE AS SCHEDULED, UNLESS OTHERWISE NOTED.", "coordination_targets": ["architectural"], "conflict_potential": "high", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "G11.01-014", "subject": "Project General Note 25E", "category": "general", "attribute": "general_note", "value": "Dimensions shown on drawings shall be to the face of finish material for any dimensions noted as 'clear'.", "unit": null, "location_key": {"sheet_number": "G11.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "Note 25E", "detail_reference": null, "plan_zone": "PROJECT GENERAL NOTES"}, "source_text": "25. E. THE FACE OF FINISH MATERIAL FOR ANY DIMENSIONS NOTED AS \"CLEAR\".", "coordination_targets": ["architectural"], "conflict_potential": "high", "code_review_relevance": "low", "confidence": "high"}, {"assertion_id": "G11.01-015", "subject": "Project General Note 33", "category": "opening_penetration", "attribute": "general_note", "value": "All roof penetration flashing details shall be shown on roof plan.", "unit": null, "location_key": {"sheet_number": "G11.01", "grid": null, "room": null, "room_name": null, "level": null, "tag": "Note 33", "detail_reference": null, "plan_zone": "PROJECT GENERAL NOTES"}, "source_text": "33. ...ALL ROOF PENETRATION FLASHING DETAILS... SHALL BE SHOWN ON ROOF PLAN AND RESPECTIVE FLASHING DETAILS SHALL BE DEVELOPED.", "coordination_targets": ["architectural", "structural", "mechanical", "plumbing"], "conflict_potential": "high", "code_review_relevance": "medium", "confidence": "high"}, {"assertion_id": "G11.01-016", "subject": "Project General Note 34", "category": "fire_protection", "attribute": "general_note", "value": "The existing automatic fire sprinkler system shall conform to NFPA 513.", "unit": null, "location_key": {"sheet_number": "G11.01"}}]} \ No newline at end of file diff --git a/backend/.llm_cache/fce44924bd91dcce5d1d613eba4280a9db5cbcbd94ebd0fc9916a78c23718dad.json b/backend/.llm_cache/fce44924bd91dcce5d1d613eba4280a9db5cbcbd94ebd0fc9916a78c23718dad.json new file mode 100644 index 0000000..012bc03 --- /dev/null +++ b/backend/.llm_cache/fce44924bd91dcce5d1d613eba4280a9db5cbcbd94ebd0fc9916a78c23718dad.json @@ -0,0 +1 @@ +{"conflicts": [{"conflict_id": "sales_area_lighting_layout_mismatch", "category": "location_mismatch", "severity": "medium", "confidence": "high", "location": "SALES AREA Ceiling", "disciplines": ["Architectural", "Electrical"], "sheets": ["E03.01"], "description": "The electrical lighting plan layout for the Sales Area does not match the architectural reflected ceiling plan layout. A handwritten note on sheet E03.01 explicitly points out this discrepancy. The electrical drawing shows one grid of fixtures, while a snippet of the architectural plan on the same sheet shows a different, more complex layout. This must be reconciled to ensure the correct fixtures are installed in the correct locations.", "evidence": [{"discipline": "Electrical", "sheet": "E03.01", "source_text": "fixture locations not matching arch", "asserted_value": "The electrical drawing shows a simple grid of recessed lights."}, {"discipline": "Architectural", "sheet": "E03.01", "source_text": "(Architectural underlay snippet on E03.01)", "asserted_value": "The architectural RCP snippet shows a more complex, patterned layout of light fixtures."}], "recommended_resolution": "coordinate drawings"}]} \ No newline at end of file diff --git a/backend/__init__.py b/backend/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/code_corpus/README.md b/backend/code_corpus/README.md new file mode 100644 index 0000000..c24cf87 --- /dev/null +++ b/backend/code_corpus/README.md @@ -0,0 +1,43 @@ +# Code / standard reference corpus (Stage 7) + +Drop plain-text `.txt` files here. Stage 7 (`code_review.py`) retrieves the most +relevant excerpts and lets the model cite section numbers **only** when they +appear in a retrieved excerpt. An empty corpus is valid — Stage 7 then runs +reasoning-only and cites nothing. + +## File naming → standard + +The standard is inferred from the filename prefix: + +| prefix | standard | +|-----------------|----------| +| `ada*.txt` | ADA | +| `tas*.txt` | TAS | +| `ibc*.txt` | IBC | +| `ifc*.txt` | IFC | +| `iebc*.txt` | IEBC | +| `energy*.txt` | ENERGY | + +(Only `.txt` files are loaded; this `README.md` is ignored.) + +## Format + +Plain text, chunks separated by a blank line. If a chunk begins with a section +number (e.g. `404.2.3 Doors ...`), that number is captured as its section id and +is what the model may cite. + +``` +404.2.3 Door and Gate Opening Force +Fire doors shall have a minimum opening force allowable by the appropriate +administrative authority. The force for pushing or pulling open ... + +405.2 Slope +Ramp runs shall have a running slope not steeper than 1:12. +``` + +## Licensing note + +- **ADA 2010 Standards** and **Texas Accessibility Standards (TAS)** are + government documents and can be included here. +- **IBC / IFC / IECC** are ICC copyrighted works — do **not** paste their text + unless you have a license. Provide your own licensed copy if needed. diff --git a/backend/code_corpus/ada_2010.txt b/backend/code_corpus/ada_2010.txt new file mode 100644 index 0000000..747dd50 --- /dev/null +++ b/backend/code_corpus/ada_2010.txt @@ -0,0 +1,3585 @@ +201.1 Scope +All areas of newly designed and newly constructed buildings and facilities and altered portions of existing buildings and facilities shall comply with these requirements. +Advisory 201.1 Scope. These requirements are to be applied to all areas of a facility unless exempted, or where scoping limits the number of multiple elements required to be accessible. For example, not all medical care patient rooms are required to be accessible; those that are not required to be accessible are not required to comply with these requirements. However, common use and public use spaces such as recovery rooms, examination rooms, and cafeterias are not exempt from these requirements and must be accessible. + +201.2 Application Based on Building or Facility Use +Where a site, building, facility, room, or space contains more than one use, each portion shall comply with the applicable requirements for that use. + +201.3 Temporary and Permanent Structures +These requirements shall apply to temporary and permanent buildings and facilities. +Advisory 201.3 Temporary and Permanent Structures. Temporary buildings or facilities covered by these requirements include, but are not limited to, reviewing stands, temporary classrooms, bleacher areas, stages, platforms and daises, fixed furniture systems, wall systems, and exhibit areas, temporary banking facilities, and temporary health screening facilities. Structures and equipment directly associated with the actual processes of construction are not required to be accessible as permitted in 203.2. + +202.1 General +Additions and alterations to existing buildings or facilities shall comply with 202. + +202.2 Additions +Each addition to an existing building or facility shall comply with the requirements for new construction. Each addition that affects or could affect the usability of or access to an area containing a primary function shall comply with 202.4. + +202.3 Alterations +Where existing elements or spaces are altered, each altered element or space shall comply with the applicable requirements of Chapter 2. +EXCEPTIONS: 1. Unless required by 202.4, where elements or spaces are altered and the circulation path to the altered element or space is not altered, an accessible route shall not be required. +2. In alterations, where compliance with applicable requirements is technically infeasible, the alteration shall comply with the requirements to the maximum extent feasible. +3. Residential dwelling units not required to be accessible in compliance with a standard issued pursuant to the Americans with Disabilities Act or Section 504 of the Rehabilitation Act of 1973, as amended, shall not be required to comply with 202.3. +Advisory 202.3 Alterations. Although covered entities are permitted to limit the scope of an alteration to individual elements, the alteration of multiple elements within a room or space may provide a cost-effective opportunity to make the entire room or space accessible. Any elements or spaces of the building or facility that are required to comply with these requirements must be made accessible within the scope of the alteration, to the maximum extent feasible. If providing accessibility in compliance with these requirements for people with one type of disability (e.g., people who use wheelchairs) is not feasible, accessibility must still be provided in compliance with the requirements for people with other types of disabilities (e.g., people who have hearing impairments or who have vision impairments) to the extent that such accessibility is feasible. + +202.3.1 Prohibited Reduction in Access +An alteration that decreases or has the effect of decreasing the accessibility of a building or facility below the requirements for new construction at the time of the alteration is prohibited. + +202.3.2 Extent of Application +An alteration of an existing element, space, or area of a building or facility shall not impose a requirement for accessibility greater than required for new construction. + +202.4 Alterations Affecting Primary Function Areas +In addition to the requirements of 202.3, an alteration that affects or could affect the usability of or access to an area containing a primary function shall be made so as to ensure that, to the maximum extent feasible, the path of travel to the altered area, including the rest rooms, telephones, and drinking fountains serving the altered area, are readily accessible to and usable by individuals with disabilities, unless such alterations are disproportionate to the overall alterations in terms of cost and scope as determined under criteria established by the Attorney General. In existing transportation facilities, an area of primary function shall be as defined under regulations published by the Secretary of the Department of Transportation or the Attorney General. +EXCEPTION: Residential dwelling units shall not be required to comply with 202.4. + +202.5 Alterations to Qualified Historic Buildings and Facilities +Alterations to a qualified historic building or facility shall comply with 202.3 and 202.4. +EXCEPTION: Where the State Historic Preservation Officer or Advisory Council on Historic Preservation determines that compliance with the requirements for accessible routes, entrances, or toilet facilities would threaten or destroy the historic significance of the building or facility, the exceptions for alterations to qualified historic buildings or facilities for that element shall be permitted to apply. + +203.1 General +Sites, buildings, facilities, and elements are exempt from these requirements to the extent specified by 203. + +203.2 Construction Sites +Structures and sites directly associated with the actual processes of construction, including but not limited to, scaffolding, bridging, materials hoists, materials storage, and construction trailers shall not be required to comply with these requirements or to be on an accessible route. Portable toilet units provided for use exclusively by construction personnel on a construction site shall not be required to comply with 213 or to be on an accessible route. + +203.3 Raised Areas +Areas raised primarily for purposes of security, life safety, or fire safety, including but not limited to, observation or lookout galleries, prison guard towers, fire towers, or life guard stands shall not be required to comply with these requirements or to be on an accessible route. + +203.4 Limited Access Spaces +Spaces accessed only by ladders, catwalks, crawl spaces, or very narrow passageways shall not be required to comply with these requirements or to be on an accessible route. + +203.5 Machinery Spaces +Spaces frequented only by service personnel for maintenance, repair, or occasional monitoring of equipment shall not be required to comply with these requirements or to be on an accessible route. Machinery spaces include, but are not limited to, elevator pits or elevator penthouses; mechanical, electrical or communications equipment rooms; piping or equipment catwalks; water or sewage treatment pump rooms and stations; electric substations and transformer vaults; and highway and tunnel utility facilities. + +203.6 Single Occupant Structures +Single occupant structures accessed only by passageways below grade or elevated above standard curb height, including but not limited to, toll booths that are accessed only by underground tunnels, shall not be required to comply with these requirements or to be on an accessible route. + +203.7 Detention and Correctional Facilities +In detention and correctional facilities, common use areas that are used only by inmates or detainees and security personnel and that do not serve holding cells or housing cells required to comply with 232, shall not be required to comply with these requirements or to be on an accessible route. + +203.8 Residential Facilities +In residential facilities, common use areas that do not serve residential dwelling units required to provide mobility features complying with 809.2 through 809.4 shall not be required to comply with these requirements or to be on an accessible route. + +203.9 Employee Work Areas +Spaces and elements within employee work areas shall only be required to comply with 206.2.8, 207.1, and 215.3 and shall be designed and constructed so that individuals with disabilities can approach, enter, and exit the employee work area. Employee work areas, or portions of employee work areas, other than raised courtroom stations, that are less than 300 square feet (28 square meters) and elevated 7 inches (180 mm) or more above the finish floor or ground where the elevation is essential to the function of the space shall not be required to comply with these requirements or to be on an accessible route. +Advisory 203.9 Employee Work Areas. Although areas used exclusively by employees for work are not required to be fully accessible, consider designing such areas to include non-required turning spaces, and provide accessible elements whenever possible. Under the ADA, employees with disabilities are entitled to reasonable accommodations in the workplace; accommodations can include alterations to spaces within the facility. Designing employee work areas to be more accessible at the outset will avoid more costly retrofits when current employees become temporarily or permanently disabled, or when new employees with disabilities are hired. Contact the Equal Employment Opportunity Commission (EEOC) at www.eeoc.gov for information about title I of the ADA prohibiting discrimination against people with disabilities in the workplace. + +203.10 Raised Refereeing, Judging, and Scoring Areas +Raised structures used solely for refereeing, judging, or scoring a sport shall not be required to comply with these requirements or to be on an accessible route. + +203.11 Water Slides +Water slides shall not be required to comply with these requirements or to be on an accessible route. + +203.12 Animal Containment Areas +Animal containment areas that are not for public use shall not be required to comply with these requirements or to be on an accessible route. +Advisory 203.12 Animal Containment Areas. Public circulation routes where animals may travel, such as in petting zoos and passageways alongside animal pens in State fairs, are not eligible for the exception. + +203.13 Raised Boxing or Wrestling Rings +Raised boxing or wrestling rings shall not be required to comply with these requirements or to be on an accessible route. + +203.14 Raised Diving Boards and Diving Platforms +Raised diving boards and diving platforms shall not be required to comply with these requirements or to be on an accessible route. + +204.1 General +Protruding objects on circulation paths shall comply with 307. +EXCEPTIONS: 1. Within areas of sport activity, protruding objects on circulation paths shall not be required to comply with 307. +2. Within play areas, protruding objects on circulation paths shall not be required to comply with 307 provided that ground level accessible routes provide vertical clearance in compliance with 1008.2. + +205.1 General +Operable parts on accessible elements, accessible routes, and in accessible rooms and spaces shall comply with 309. +EXCEPTIONS: 1. Operable parts that are intended for use only by service or maintenance personnel shall not be required to comply with 309. +2. Electrical or communication receptacles serving a dedicated use shall not be required to comply with 309. +3. Where two or more outlets are provided in a kitchen above a length of counter top that is uninterrupted by a sink or appliance, one outlet shall not be required to comply with 309. +4. Floor electrical receptacles shall not be required to comply with 309. +5. HVAC diffusers shall not be required to comply with 309. +6. Except for light switches, where redundant controls are provided for a single element, one control in each space shall not be required to comply with 309. +7. Cleats and other boat securement devices shall not be required to comply with 309.3. +8. Exercise machines and exercise equipment shall not be required to comply with 309. +Advisory 205.1 General. Controls covered by 205.1 include, but are not limited to, light switches, circuit breakers, duplexes and other convenience receptacles, environmental and appliance controls, plumbing fixture controls, and security and intercom systems. + +206.1 General +Accessible routes shall be provided in accordance with 206 and shall comply with Chapter 4. + +206.2 Where Required +Accessible routes shall be provided where required by 206.2. + +206.2.1 Site Arrival Points +At least one accessible route shall be provided within the site from accessible parking spaces and accessible passenger loading zones; public streets and sidewalks; and public transportation stops to the accessible building or facility entrance they serve. +EXCEPTIONS: 1. Where exceptions for alterations to qualified historic buildings or facilities are permitted by 202.5, no more than one accessible route from a site arrival point to an accessible entrance shall be required. +2. An accessible route shall not be required between site arrival points and the building or facility entrance if the only means of access between them is a vehicular way not providing pedestrian access. + +206.2.2 Within a Site +At least one accessible route shall connect accessible buildings, accessible facilities, accessible elements, and accessible spaces that are on the same site. +EXCEPTION: An accessible route shall not be required between accessible buildings, accessible facilities, accessible elements, and accessible spaces if the only means of access between them is a vehicular way not providing pedestrian access. +Advisory 206.2.2 Within a Site. An accessible route is required to connect to the boundary of each area of sport activity. Examples of areas of sport activity include: soccer fields, basketball courts, baseball fields, running tracks, skating rinks, and the area surrounding a piece of gymnastic equipment. While the size of an area of sport activity may vary from sport to sport, each includes only the space needed to play. Where multiple sports fields or courts are provided, an accessible route is required to each field or area of sport activity. + +206.2.3 Multi-Story Buildings and Facilities +At least one accessible route shall connect each story and mezzanine in multi-story buildings and facilities. +EXCEPTIONS: 1. In private buildings or facilities that are less than three stories or that have less than 3000 square feet (279 square meters) per story, an accessible route shall not be required to connect stories provided that the building or facility is not a shopping center, a shopping mall, the professional office of a health care provider, a terminal, depot or other station used for specified public transportation, an airport passenger terminal, or another type of facility as determined by the Attorney General. +2. Where a two story public building or facility has one story with an occupant load of five or fewer persons that does not contain public use space, that story shall not be required to be connected to the story above or below. +3. In detention and correctional facilities, an accessible route shall not be required to connect stories where cells with mobility features required to comply with 807.2, all common use areas serving cells with mobility features required to comply with 807.2, and all public use areas are on an accessible route. +4. In residential facilities, an accessible route shall not be required to connect stories where residential dwelling units with mobility features required to comply with 809.2 through 809.4, all common use areas serving residential dwelling units with mobility features required to comply with 809.2 through 809.4, and public use areas serving residential dwelling units are on an accessible route. +5. Within multi-story transient lodging guest rooms with mobility features required to comply with 806.2, an accessible route shall not be required to connect stories provided that spaces complying with 806.2 are on an accessible route and sleeping accommodations for two persons minimum are provided on a story served by an accessible route. +6. In air traffic control towers, an accessible route shall not be required to serve the cab and the floor immediately below the cab. +7. Where exceptions for alterations to qualified historic buildings or facilities are permitted by 202.5, an accessible route shall not be required to stories located above or below the accessible story. + +206.2.3.1 Stairs and Escalators in Existing Buildings +In alterations and additions, where an escalator or stair is provided where none existed previously and major structural modifications are necessary for the installation, an accessible route shall be provided between the levels served by the escalator or stair unless exempted by 206.2.3 Exceptions 1 through 7. + +206.2.4 Spaces and Elements +At least one accessible route shall connect accessible building or facility entrances with all accessible spaces and elements within the building or facility which are otherwise connected by a circulation path unless exempted by 206.2.3 Exceptions 1 through 7. +EXCEPTIONS: 1. Raised courtroom stations, including judges’ benches, clerks’ stations, bailiffs’ stations, deputy clerks’ stations, and court reporters’ stations shall not be required to provide vertical access provided that the required clear floor space, maneuvering space, and, if appropriate, electrical service are installed at the time of initial construction to allow future installation of a means of vertical access complying with 405, 407, 408, or 410 without requiring substantial reconstruction of the space. +2. In assembly areas with fixed seating required to comply with 221, an accessible route shall not be required to serve fixed seating where wheelchair spaces required to be on an accessible route are not provided. +3. Accessible routes shall not be required to connect mezzanines where buildings or facilities have no more than one story. In addition, accessible routes shall not be required to connect stories or mezzanines where multi-story buildings or facilities are exempted by 206.2.3 Exceptions 1 through 7. + +206.2.5 Restaurants and Cafeterias +In restaurants and cafeterias, an accessible route shall be provided to all dining areas, including raised or sunken dining areas, and outdoor dining areas. +EXCEPTIONS: 1. In buildings or facilities not required to provide an accessible route between stories, an accessible route shall not be required to a mezzanine dining area where the mezzanine contains less than 25 percent of the total combined area for seating and dining and where the same decor and services are provided in the accessible area. +2. In alterations, an accessible route shall not be required to existing raised or sunken dining areas, or to all parts of existing outdoor dining areas where the same services and decor are provided in an accessible space usable by the public and not restricted to use by people with disabilities. +3. In sports facilities, tiered dining areas providing seating required to comply with 221 shall be required to have accessible routes serving at least 25 percent of the dining area provided that accessible routes serve seating complying with 221 and each tier is provided with the same services. +Advisory 206.2.5 Restaurants and Cafeterias Exception 2. Examples of “same services” include, but are not limited to, bar service, rooms having smoking and non-smoking sections, lotto and other table games, carry-out, and buffet service. Examples of “same decor” include, but are not limited to, seating at or near windows and railings with views, areas designed with a certain theme, party and banquet rooms, and rooms where entertainment is provided. + +206.2.6 Performance Areas +Where a circulation path directly connects a performance area to an assembly seating area, an accessible route shall directly connect the assembly seating area with the performance area. An accessible route shall be provided from performance areas to ancillary areas or facilities used by performers unless exempted by 206.2.3 Exceptions 1 through 7. + +206.2.7 Press Boxes +Press boxes in assembly areas shall be on an accessible route. +EXCEPTIONS: 1. An accessible route shall not be required to press boxes in bleachers that have points of entry at only one level provided that the aggregate area of all press boxes is 500 square feet (46 square meters) maximum. +2. An accessible route shall not be required to free-standing press boxes that are elevated above grade 12 feet (3660 mm) minimum provided that the aggregate area of all press boxes is 500 square feet (46 square meters) maximum. +Advisory 206.2.7 Press Boxes Exception 2. Where a facility contains multiple assembly areas, the aggregate area of the press boxes in each assembly area is to be calculated separately. For example, if a university has a soccer stadium with three press boxes elevated 12 feet (3660 mm) or more above grade and each press box is 150 square feet (14 square meters), then the aggregate area of the soccer stadium press boxes is less than 500 square feet (46 square meters) and Exception 2 applies to the soccer stadium. If that same university also has a football stadium with two press boxes elevated 12 feet (3660 mm) or more above grade and one press box is 250 square feet (23 square meters), and the second is 275 square feet (26 square meters), then the aggregate area of the football stadium press boxes is more than 500 square feet (46 square meters) and Exception 2 does not apply to the football stadium. + +206.2.8 Employee Work Areas +Common use circulation paths within employee work areas shall comply with 402. +EXCEPTIONS: 1. Common use circulation paths located within employee work areas that are less than 1000 square feet (93 square meters) and defined by permanently installed partitions, counters, casework, or furnishings shall not be required to comply with 402. +2. Common use circulation paths located within employee work areas that are an integral component of work area equipment shall not be required to comply with 402. +3. Common use circulation paths located within exterior employee work areas that are fully exposed to the weather shall not be required to comply with 402. + +206.2.9 Amusement Rides +Amusement rides required to comply with 234 shall provide accessible routes in accordance with 206.2.9. accessible routes serving amusement rides shall comply with Chapter 4 except as modified by 1002.2. + +206.2.9.1 Load and Unload Areas +Load and unload areas shall be on an accessible route. Where load and unload areas have more than one loading or unloading position, at least one loading and unloading position shall be on an accessible route. + +206.2.9.2 Wheelchair Spaces, Ride Seats Designed for Transfer, and Transfer Devices +When amusement rides are in the load and unload position, wheelchair spaces complying with 1002.4, amusement ride seats designed for transfer complying with 1002.5, and transfer devices complying with 1002.6 shall be on an accessible route. + +206.2.10 Recreational Boating Facilities +Boat slips required to comply with 235.2 and boarding piers at boat launch ramps required to comply with 235.3 shall be on an accessible route. accessible routes serving recreational boating facilities shall comply with Chapter 4, except as modified by 1003.2. + +206.2.11 Bowling Lanes +Where bowling lanes are provided, at least 5 percent, but no fewer than one of each type of bowling lane, shall be on an accessible route. + +206.2.12 Court Sports +In court sports, at least one accessible route shall directly connect both sides of the court. + +206.2.13 Exercise Machines and Equipment +Exercise machines and equipment required to comply with 236 shall be on an accessible route. + +206.2.14 Fishing Piers and Platforms +Fishing piers and platforms shall be on an accessible route. accessible routes serving fishing piers and platforms shall comply with Chapter 4 except as modified by 1005.1. + +206.2.15 Golf Facilities +At least one accessible route shall connect accessible elements and spaces within the boundary of the golf course. In addition, accessible routes serving golf car rental areas; bag drop areas; course weather shelters complying with 238.2.3; course toilet rooms; and practice putting greens, practice teeing grounds, and teeing stations at driving ranges complying with 238.3 shall comply with Chapter 4 except as modified by 1006.2. +EXCEPTION: Golf car passages complying with 1006.3 shall be permitted to be used for all or part of accessible routes required by 206.2.15. + +206.2.16 Miniature Golf Facilities +Holes required to comply with 239.2, including the start of play, shall be on an accessible route. accessible routes serving miniature golf facilities shall comply with Chapter 4 except as modified by 1007.2. + +206.2.17 Play Areas +Play areas shall provide accessible routes in accordance with 206.2.17. accessible routes serving play areas shall comply with Chapter 4 except as modified by 1008.2. + +206.2.17.1 Ground Level and Elevated Play Components +At least one accessible route shall be provided within the play area. The accessible route shall connect ground level play components required to comply with 240.2.1 and elevated play components required to comply with 240.2.2, including entry and exit points of the play components. + +206.2.17.2 Soft Contained Play Structures +Where three or fewer entry points are provided for soft contained play structures, at least one entry point shall be on an accessible route. Where four or more entry points are provided for soft contained play structures, at least two entry points shall be on an accessible route. + +206.3 Location +Accessible routes shall coincide with or be located in the same area as general circulation paths. +Where circulation paths are interior, required accessible routes shall also be interior. +Note to Reader:  The Department of Transportation’s ADA standards include additional requirements for the location of accessible routes: +206.3 Location.  Accessible routes shall coincide with, or be located in the same area as general circulation paths. Where circulation paths are interior, required accessible routes shall also be interior. Elements such as ramps, elevators, or other circulation devices, fare vending or other ticketing areas, and fare collection areas shall be placed to minimize the distance which wheelchair users and other persons who cannot negotiate steps may have to travel compared to the general public. +Advisory 206.3 Location. The accessible route must be in the same area as the general circulation path. This means that circulation paths, such as vehicular ways designed for pedestrian traffic, walks, and unpaved paths that are designed to be routinely used by pedestrians must be accessible or have an accessible route nearby. Additionally, accessible vertical interior circulation must be in the same area as stairs and escalators, not isolated in the back of the facility. + +206.4 Entrances +Entrances shall be provided in accordance with 206.4. Entrance doors, doorways, and gates shall comply with 404 and shall be on an accessible route complying with 402. +EXCEPTIONS: 1. Where an alteration includes alterations to an entrance, and the building or facility has another entrance complying with 404 that is on an accessible route, the altered entrance shall not be required to comply with 206.4 unless required by 202.4. +2. Where exceptions for alterations to qualified historic buildings or facilities are permitted by 202.5, no more than one public entrance shall be required to comply with 206.4. Where no public entrance can comply with 206.4 under criteria established in 202.5 Exception, then either an unlocked entrance not used by the public shall comply with 206.4; or a locked entrance complying with 206.4 with a notification system or remote monitoring shall be provided. + +206.4.1 Public Entrances +In addition to entrances required by 206.4.2 through 206.4.9, at least 60 percent of all public entrances shall comply with 404. + +206.4.2 Parking Structure Entrances +Where direct access is provided for pedestrians from a parking structure to a building or facility entrance, each direct access to the building or facility entrance shall comply with 404. + +206.4.3 Entrances from Tunnels or Elevated Walkways +Where direct access is provided for pedestrians from a pedestrian tunnel or elevated walkway to a building or facility, at least one direct entrance to the building or facility from each tunnel or walkway shall comply with 404. + +206.4.4 Transportation Facilities +In addition to the requirements of 206.4.2, 206.4.3, and 206.4.5 through 206.4.9, transportation facilities shall provide entrances in accordance with 206.4.4. + +206.4.4.1 Location +In transportation facilities, where different entrances serve different transportation fixed routes or groups of fixed routes, at least one public entrance serving each fixed route or group of fixed routes shall comply with 404. +EXCEPTION: Entrances to key stations and existing intercity rail stations retrofitted in accordance with 49 CFR 37.49 or 49 CFR 37.51 shall not be required to comply with 206.4.4.1. + +206.4.4.2 Direct Connections +Direct connections to other facilities shall provide an accessible route complying with 404 from the point of connection to boarding platforms and all transportation system elements required to be accessible. Any elements provided to facilitate future direct connections shall be on an accessible route connecting boarding platforms and all transportation system elements required to be accessible. +EXCEPTION: In key stations and existing intercity rail stations, existing direct connections shall not be required to comply with 404. + +206.4.4.3 Key Stations and Intercity Rail Stations +Key stations and existing intercity rail stations required by Subpart C of 49 CFR part 37 to be altered, shall have at least one entrance complying with 404. + +206.4.5 Tenant Spaces +At least one accessible entrance to each tenancy in a facility shall comply with 404. +EXCEPTION: Self-service storage facilities not required to comply with 225.3 shall not be required to be on an accessible route. + +206.4.6 Residential Dwelling Unit Primary Entrance +In residential dwelling units, at least one primary entrance shall comply with 404. The primary entrance to a residential dwelling unit shall not be to a bedroom. + +206.4.7 Restricted Entrances +Where restricted entrances are provided to a building or facility, at least one restricted entrance to the building or facility shall comply with 404. + +206.4.8 Service Entrances +If a service entrance is the only entrance to a building or to a tenancy in a facility, that entrance shall comply with 404. + +206.4.9 Entrances for Inmates or Detainees +Where entrances used only by inmates or detainees and security personnel are provided at judicial facilities, detention facilities, or correctional facilities, at least one such entrance shall comply with 404. + +206.5 Doors, Doorways, and Gates +Doors, doorways, and gates providing user passage shall be provided in accordance with 206.5. + +206.5.1 Entrances +Each entrance to a building or facility required to comply with 206.4 shall have at least one door, doorway, or gate complying with 404. + +206.5.2 Rooms and Spaces +Within a building or facility, at least one door, doorway, or gate serving each room or space complying with these requirements shall comply with 404. + +206.5.3 Transient Lodging Facilities +In transient lodging facilities, entrances, doors, and doorways providing user passage into and within guest rooms that are not required to provide mobility features complying with 806.2 shall comply with 404.2.3. +EXCEPTION: Shower and sauna doors in guest rooms that are not required to provide mobility features complying with 806.2 shall not be required to comply with 404.2.3. + +206.5.4 Residential Dwelling Units +In residential dwelling units required to provide mobility features complying with 809.2 through 809.4, all doors and doorways providing user passage shall comply with 404. + +206.6 Elevators +Elevators provided for passengers shall comply with 407. Where multiple elevators are provided, each elevator shall comply with 407. +EXCEPTIONS: 1. In a building or facility permitted to use the exceptions to 206.2.3 or permitted by 206.7 to use a platform lift, elevators complying with 408 shall be permitted. +2. Elevators complying with 408 or 409 shall be permitted in multi-story residential dwelling units. + +206.6.1 Existing Elevators +Where elements of existing elevators are altered, the same element shall also be altered in all elevators that are programmed to respond to the same hall call control as the altered elevator and shall comply with the requirements of 407 for the altered element. + +206.7 Platform Lifts +Platform lifts shall comply with 410. Platform lifts shall be permitted as a component of an accessible route in new construction in accordance with 206.7. Platform lifts shall be permitted as a component of an accessible route in an existing building or facility. + +206.7.1 Performance Areas and Speakers’ Platforms +Platform lifts shall be permitted to provide accessible routes to performance areas and speakers’ platforms. + +206.7.2 Wheelchair Spaces +Platform lifts shall be permitted to provide an accessible route to comply with the wheelchair space dispersion and line-of-sight requirements of 221 and 802. + +206.7.3 Incidental Spaces +Platform lifts shall be permitted to provide an accessible route to incidental spaces which are not public use spaces and which are occupied by five persons maximum. + +206.7.4 Judicial Spaces +Platform lifts shall be permitted to provide an accessible route to: jury boxes and witness stands; raised courtroom stations including, judges’ benches, clerks’ stations, bailiffs’ stations, deputy clerks’ stations, and court reporters’ stations; and to depressed areas such as the well of a court. + +206.7.5 Existing Site Constraints +Platform lifts shall be permitted where existing exterior site constraints make use of a ramp or elevator infeasible. +Advisory 206.7.5 Existing Site Constraints. This exception applies where topography or other similar existing site constraints necessitate the use of a platform lift as the only feasible alternative. While the site constraint must reflect exterior conditions, the lift can be installed in the interior of a building. For example, a new building constructed between and connected to two existing buildings may have insufficient space to coordinate floor levels and also to provide ramped entry from the public way. In this example, an exterior or interior platform lift could be used to provide an accessible entrance or to coordinate one or more interior floor levels. + +206.7.6 Guest Rooms and Residential Dwelling Units +Platform lifts shall be permitted to connect levels within transient lodging guest rooms required to provide mobility features complying with 806.2 or residential dwelling units required to provide mobility features complying with 809.2 through 809.4. + +206.7.7 Amusement Rides +Platform lifts shall be permitted to provide accessible routes to load and unload areas serving amusement rides. + +206.7.8 Play Areas +Platform lifts shall be permitted to provide accessible routes to play components or soft contained play structures. + +206.7.9 Team or Player Seating +Platform lifts shall be permitted to provide accessible routes to team or player seating areas serving areas of sport activity. +Advisory 206.7.9 Team or Player Seating. While the use of platform lifts is allowed, ramps are recommended to provide access to player seating areas serving an area of sport activity. + +206.7.10 Recreational Boating Facilities and Fishing Piers and Platforms +Platform lifts shall be permitted to be used instead of gangways that are part of accessible routes serving recreational boating facilities and fishing piers and platforms. + +206.8 Security Barriers +Security barriers, including but not limited to, security bollards and security check points, shall not obstruct a required accessible route or accessible means of egress. +EXCEPTION: Where security barriers incorporate elements that cannot comply with these requirements such as certain metal detectors, fluoroscopes, or other similar devices, the accessible route shall be permitted to be located adjacent to security screening devices. The accessible route shall permit persons with disabilities passing around security barriers to maintain visual contact with their personal items to the same extent provided others passing through the security barrier. + +207.1 General +Means of egress shall comply with section 1003.2.13 of the International Building Code (2000 edition and 2001 Supplement) or section 1007 of the International Building Code (2003 edition) (incorporated by reference, see “Referenced Standards” in Chapter 1). +EXCEPTIONS: 1. Where means of egress are permitted by local building or life safety codes to share a common path of egress travel, accessible means of egress shall be permitted to share a common path of egress travel. +2. Areas of refuge shall not be required in detention and correctional facilities. + +207.2 Platform Lifts +Standby power shall be provided for platform lifts permitted by section 1003.2.13.4 of the International Building Code (2000 edition and 2001 Supplement) or section 1007.5 of the International Building Code (2003 edition) (incorporated by reference, see “Referenced Standards” in Chapter 1) to serve as a part of an accessible means of egress. + +208.1 General +Where parking spaces are provided, parking spaces shall be provided in accordance with 208. +EXCEPTION: Parking spaces used exclusively for buses, trucks, other delivery vehicles, law enforcement vehicles, or vehicular impound shall not be required to comply with 208 provided that lots accessed by the public are provided with a passenger loading zone complying with 503. + +208.2 Minimum Number +Parking spaces complying with 502 shall be provided in accordance with Table 208.2 except as required by 208.2.1, 208.2.2, and 208.2.3. Where more than one parking facility is provided on a site, the number of accessible spaces provided on the site shall be calculated according to the number of spaces required for each parking facility. +Advisory 208.2 Minimum Number. The term “parking facility” is used Section 208.2 instead of the term “parking lot” so that it is clear that both parking lots and parking structures are required to comply with this section. The number of parking spaces required to be accessible is to be calculated separately for each parking facility; the required number is not to be based on the total number of parking spaces provided in all of the parking facilities provided on the site. + +208.2.1 Hospital Outpatient Facilities +Ten percent of patient and visitor parking spaces provided to serve hospital outpatient facilities shall comply with 502. +Advisory 208.2.1 Hospital Outpatient Facilities. The term “outpatient facility” is not defined in this document but is intended to cover facilities or units that are located in hospitals and that provide regular and continuing medical treatment without an overnight stay. Doctors’ offices, independent clinics, or other facilities not located in hospitals are not considered hospital outpatient facilities for purposes of this document. + +208.2.2 Rehabilitation Facilities and Outpatient Physical Therapy Facilities +Twenty percent of patient and visitor parking spaces provided to serve rehabilitation facilities specializing in treating conditions that affect mobility and outpatient physical therapy facilities shall comply with 502. +Advisory 208.2.2 Rehabilitation Facilities and Outpatient Physical Therapy Facilities. Conditions that affect mobility include conditions requiring the use or assistance of a brace, cane, crutch, prosthetic device, wheelchair, or powered mobility aid; arthritic, neurological, or orthopedic conditions that severely limit one’s ability to walk; respiratory diseases and other conditions which may require the use of portable oxygen; and cardiac conditions that impose significant functional limitations. + +208.2.3 Residential Facilities +Parking spaces provided to serve residential facilities shall comply with 208.2.3. + +208.2.3.1 Parking for Residents +Where at least one parking space is provided for each residential dwelling unit, at least one parking space complying with 502 shall be provided for each residential dwelling unit required to provide mobility features complying with 809.2 through 809.4. + +208.2.3.2 Additional Parking Spaces for Residents +Where the total number of parking spaces provided for each residential dwelling unit exceeds one parking space per residential dwelling unit, 2 percent, but no fewer than one space, of all the parking spaces not covered by 208.2.3.1 shall comply with 502. + +208.2.3.3 Parking for Guests, Employees, and Other Non-Residents +Where parking spaces are provided for persons other than residents, parking shall be provided in accordance with Table 208.2. + +208.2.4 Van Parking Spaces +For every six or fraction of six parking spaces required by 208.2 to comply with 502, at least one shall be a van parking space complying with 502. + +208.3 Location +Parking facilities shall comply with 208.3 + +208.3.1 General +Parking spaces complying with 502 that serve a particular building or facility shall be located on the shortest accessible route from parking to an entrance complying with 206.4. Where parking serves more than one accessible entrance, parking spaces complying with 502 shall be dispersed and located on the shortest accessible route to the accessible entrances. In parking facilities that do not serve a particular building or facility, parking spaces complying with 502 shall be located on the shortest accessible route to an accessible pedestrian entrance of the parking facility. +EXCEPTIONS: 1. All van parking spaces shall be permitted to be grouped on one level within a multi-story parking facility. +2. Parking spaces shall be permitted to be located in different parking facilities if substantially equivalent or greater accessibility is provided in terms of distance from an accessible entrance or entrances, parking fee, and user convenience. +Advisory 208.3.1 General Exception 2. Factors that could affect “user convenience” include, but are not limited to, protection from the weather, security, lighting, and comparative maintenance of the alternative parking site. + +208.3.2 Residential Facilities +In residential facilities containing residential dwelling units required to provide mobility features complying with 809.2 through 809.4, parking spaces provided in accordance with 208.2.3.1 shall be located on the shortest accessible route to the residential dwelling unit entrance they serve. Spaces provided in accordance with 208.2.3.2 shall be dispersed throughout all types of parking provided for the residential dwelling units. +EXCEPTION: Parking spaces provided in accordance with 208.2.3.2 shall not be required to be dispersed throughout all types of parking if substantially equivalent or greater accessibility is provided in terms of distance from an accessible entrance, parking fee, and user convenience. +Advisory 208.3.2 Residential Facilities Exception. Factors that could affect “user convenience” include, but are not limited to, protection from the weather, security, lighting, and comparative maintenance of the alternative parking site. + +209.1 General +Passenger loading zones shall be provided in accordance with 209. + +209.2 Type +Where provided, passenger loading zones shall comply with 209.2. + +209.2.1 Passenger Loading Zones +Passenger loading zones, except those required to comply with 209.2.2 and 209.2.3, shall provide at least one passenger loading zone complying with 503 in every continuous 100 linear feet (30 m) of loading zone space, or fraction thereof. + +209.2.2 Bus Loading Zones +In bus loading zones restricted to use by designated or specified public transportation vehicles, each bus bay, bus stop, or other area designated for lift or ramp deployment shall comply with 810.2. +Advisory 209.2.2 Bus Loading Zones. The terms “designated public transportation” and “specified public transportation” are defined by the Department of Transportation at 49 CFR 37.3 in regulations implementing the Americans with Disabilities Act. These terms refer to public transportation services provided by public or private entities, respectively. For example, designated public transportation vehicles include buses and vans operated by public transit agencies, while specified public transportation vehicles include tour and charter buses, taxis and limousines, and hotel shuttles operated by private entities. + +209.2.3 On-Street Bus Stops +On-street bus stops shall comply with 810.2 to the maximum extent practicable. + +209.3 Medical Care and Long-Term Care Facilities +At least one passenger loading zone complying with 503 shall be provided at an accessible entrance to licensed medical care and licensed long-term care facilities where the period of stay exceeds twenty-four hours. + +209.4 Valet Parking +Parking facilities that provide valet parking services shall provide at least one passenger loading zone complying with 503. + +209.5 Mechanical Access Parking Garages +Mechanical access parking garages shall provide at least one passenger loading zone complying with 503 at vehicle drop-off and vehicle pick-up areas. + +210.1 General +Interior and exterior stairs that are part of a means of egress shall comply with 504. +EXCEPTIONS: 1. In detention and correctional facilities, stairs that are not located in public use areas shall not be required to comply with 504. +2. In alterations, stairs between levels that are connected by an accessible route shall not be required to comply with 504, except that handrails complying with 505 shall be provided when the stairs are altered. +3. In assembly areas, aisle stairs shall not be required to comply with 504. +4. Stairs that connect play components shall not be required to comply with 504. +Advisory 210.1 General. Although these requirements do not mandate handrails on stairs that are not part of a means of egress, State or local building codes may require handrails or guards. + +211.1 General +Where drinking fountains are provided on an exterior site, on a floor, or within a secured area they shall be provided in accordance with 211. +EXCEPTION: In detention or correctional facilities, drinking fountains only serving holding or housing cells not required to comply with 232 shall not be required to comply with 211. + +211.2 Minimum Number +No fewer than two drinking fountains shall be provided. One drinking fountain shall comply with 602.1 through 602.6 and one drinking fountain shall comply with 602.7. +EXCEPTION: Where a single drinking fountain complies with 602.1 through 602.6 and 602.7, it shall be permitted to be substituted for two separate drinking fountains. + +211.3 More Than Minimum Number +Where more than the minimum number of drinking fountains specified in 211.2 are provided, 50 percent of the total number of drinking fountains provided shall comply with 602.1 through 602.6, and 50 percent of the total number of drinking fountains provided shall comply with 602.7. +EXCEPTION: Where 50 percent of the drinking fountains yields a fraction, 50 percent shall be permitted to be rounded up or down provided that the total number of drinking fountains complying with 211 equals 100 percent of drinking fountains. + +212.1 General +Where provided, kitchens, kitchenettes, and sinks shall comply with 212. + +212.2 Kitchens and Kitchenettes +Kitchens and kitchenettes shall comply with 804. + +212.3 Sinks +Where sinks are provided, at least 5 percent, but no fewer than one, of each type provided in each accessible room or space shall comply with 606. +EXCEPTION: Mop or service sinks shall not be required to comply with 212.3. + +213.1 General +Where toilet facilities and bathing facilities are provided, they shall comply with 213. Where toilet facilities and bathing facilities are provided in facilities permitted by 206.2.3 Exceptions 1 and 2 not to connect stories by an accessible route, toilet facilities and bathing facilities shall be provided on a story connected by an accessible route to an accessible entrance. + +213.2 Toilet Rooms and Bathing Rooms +Where toilet rooms are provided, each toilet room shall comply with 603. Where bathing rooms are provided, each bathing room shall comply with 603. +EXCEPTIONS: 1. In alterations where it is technically infeasible to comply with 603, altering existing toilet or bathing rooms shall not be required where a single unisex toilet room or bathing room complying with 213.2.1 is provided and located in the same area and on the same floor as existing inaccessible toilet or bathing rooms. +2. Where exceptions for alterations to qualified historic buildings or facilities are permitted by 202.5, no fewer than one toilet room for each sex complying with 603 or one unisex toilet room complying with 213.2.1 shall be provided. +3. Where multiple single user portable toilet or bathing units are clustered at a single location, no more than 5 percent of the toilet units and bathing units at each cluster shall be required to comply with 603. Portable toilet units and bathing units complying with 603 shall be identified by the International Symbol of Accessibility complying with 703.7.2.1. +4. Where multiple single user toilet rooms are clustered at a single location, no more than 50 percent of the single user toilet rooms for each use at each cluster shall be required to comply with 603. + +213.2.1 Unisex (Single-Use or Family) Toilet and Unisex Bathing Rooms +Unisex toilet rooms shall contain not more than one lavatory, and two water closets without urinals or one water closet and one urinal. Unisex bathing rooms shall contain one shower or one shower and one bathtub, one lavatory, and one water closet. Doors to unisex toilet rooms and unisex bathing rooms shall have privacy latches. + +213.3 Plumbing Fixtures and Accessories +Plumbing fixtures and accessories provided in a toilet room or bathing room required to comply with 213.2 shall comply with 213.3. + +213.3.1 Toilet Compartments +Where toilet compartments are provided, at least one toilet compartment shall comply with 604.8.1. In addition to the compartment required to comply with 604.8.1, at least one compartment shall comply with 604.8.2 where six or more toilet compartments are provided, or where the combination of urinals and water closets totals six or more fixtures. +Advisory 213.3.1 Toilet Compartments. A toilet compartment is a partitioned space that is located within a toilet room, and that normally contains no more than one water closet. A toilet compartment may also contain a lavatory. A lavatory is a sink provided for hand washing. Full-height partitions and door assemblies can comprise toilet compartments where the minimum required spaces are provided within the compartment. + +213.3.2 Water Closets +Where water closets are provided, at least one shall comply with 604. + +213.3.3 Urinals +Where more than one urinal is provided, at least one shall comply with 605. + +213.3.4 Lavatories +Where lavatories are provided, at least one shall comply with 606 and shall not be located in a toilet compartment. + +213.3.5 Mirrors +Where mirrors are provided, at least one shall comply with 603.3. + +213.3.6 Bathing Facilities +Where bathtubs or showers are provided, at least one bathtub complying with 607 or at least one shower complying with 608 shall be provided. + +213.3.7 Coat Hooks and Shelves +Where coat hooks or shelves are provided in toilet rooms without toilet compartments, at least one of each type shall comply with 603.4. Where coat hooks or shelves are provided in toilet compartments, at least one of each type complying with 604.8.3 shall be provided in toilet compartments required to comply with 213.3.1. Where coat hooks or shelves are provided in bathing facilities, at least one of each type complying with 603.4 shall serve fixtures required to comply with 213.3.6. + +214.1 General +Where provided, washing machines and clothes dryers shall comply with 214. + +214.2 Washing Machines +Where three or fewer washing machines are provided, at least one shall comply with 611. Where more than three washing machines are provided, at least two shall comply with 611. + +214.3 Clothes Dryers +Where three or fewer clothes dryers are provided, at least one shall comply with 611. Where more than three clothes dryers are provided, at least two shall comply with 611. + +215.1 General +Where fire alarm systems provide audible alarm coverage, alarms shall comply with 215. +EXCEPTION: In existing facilities, visible alarms shall not be required except where an existing fire alarm system is upgraded or replaced, or a new fire alarm system is installed. +Advisory 215.1 General. Unlike audible alarms, visible alarms must be located within the space they serve so that the signal is visible. Facility alarm systems (other than fire alarm systems) such as those used for tornado warnings and other emergencies are not required to comply with the technical criteria for alarms in Section 702. Every effort should be made to ensure that such alarms can be differentiated in their signal from fire alarms systems and that people who need to be notified of emergencies are adequately safeguarded. Consult local fire departments and prepare evacuation plans taking into consideration the needs of every building occupant, including people with disabilities. + +215.2 Public and Common Use Areas +Alarms in public use areas and common use areas shall comply with 702. + +215.3 Employee Work Areas +Where employee work areas have audible alarm coverage, the wiring system shall be designed so that visible alarms complying with 702 can be integrated into the alarm system. + +215.4 Transient Lodging +Guest rooms required to comply with 224.4 shall provide alarms complying with 702. + +215.5 Residential Facilities +Where provided in residential dwelling units required to comply with 809.5, alarms shall comply with 702. + +216.1 General +Signs shall be provided in accordance with 216 and shall comply with 703. +EXCEPTIONS: 1. Building directories, menus, seat and row designations in assembly areas, occupant names, building addresses, and company names and logos shall not be required to comply with 216. +2. In parking facilities, signs shall not be required to comply with 216.2, 216.3, and 216.6 through 216.12. +3. Temporary, 7 days or less, signs shall not be required to comply with 216. +4. In detention and correctional facilities, signs not located in public use areas shall not be required to comply with 216. + +216.2 Designations +Interior and exterior signs identifying permanent rooms and spaces shall comply with 703.1, 703.2, and 703.5. Where pictograms are provided as designations of permanent interior rooms and spaces, the pictograms shall comply with 703.6 and shall have text descriptors complying with 703.2 and 703.5. +EXCEPTION: Exterior signs that are not located at the door to the space they serve shall not be required to comply with 703.2. +Advisory 216.2 Designations. Section 216.2 applies to signs that provide designations, labels, or names for interior rooms or spaces where the sign is not likely to change over time. Examples include interior signs labeling restrooms, room and floor numbers or letters, and room names. Tactile text descriptors are required for pictograms that are provided to label or identify a permanent room or space. Pictograms that provide information about a room or space, such as “no smoking,” occupant logos, and the International Symbol of Accessibility, are not required to have text descriptors. + +216.3 Directional and Informational Signs +Signs that provide direction to or information about interior spaces and facilities of the site shall comply with 703.5. +Advisory 216.3 Directional and Informational Signs. Information about interior spaces and facilities includes rules of conduct, occupant load, and similar signs. Signs providing direction to rooms or spaces include those that identify egress routes. + +216.4 Means of Egress +Signs for means of egress shall comply with 216.4. + +216.4.1 Exit Doors +Doors at exit passageways, exit discharge, and exit stairways shall be identified by tactile signs complying with 703.1, 703.2, and 703.5. +Advisory 216.4.1 Exit Doors. An exit passageway is a horizontal exit component that is separated from the interior spaces of the building by fire-resistance-rated construction and that leads to the exit discharge or public way. The exit discharge is that portion of an egress system between the termination of an exit and a public way. + +216.4.2 Areas of Refuge +Signs required by section 1003.2.13.5.4 of the International Building Code (2000 edition) or section 1007.6.4 of the International Building Code (2003 edition) (incorporated by reference, see “Referenced Standards” in Chapter 1) to provide instructions in areas of refuge shall comply with 703.5. + +216.4.3 Directional Signs +Signs required by section 1003.2.13.6 of the International Building Code (2000 edition) or section 1007.7 of the International Building Code (2003 edition) (incorporated by reference, see “Referenced Standards” in Chapter 1) to provide directions to accessible means of egress shall comply with 703.5. + +216.5 Parking +Parking spaces complying with 502 shall be identified by signs complying with 502.6. +EXCEPTIONS: 1. Where a total of four or fewer parking spaces, including accessible parking spaces, are provided on a site, identification of accessible parking spaces shall not be required. +2. In residential facilities, where parking spaces are assigned to specific residential dwelling units, identification of accessible parking spaces shall not be required. + +216.6 Entrances +Where not all entrances comply with 404, entrances complying with 404 shall be identified by the International Symbol of Accessibility complying with 703.7.2.1. Directional signs complying with 703.5 that indicate the location of the nearest entrance complying with 404 shall be provided at entrances that do not comply with 404. +Advisory 216.6 Entrances. Where a directional sign is required, it should be located to minimize backtracking. In some cases, this could mean locating a sign at the beginning of a route, not just at the inaccessible entrances to a building. + +216.7 Elevators +Where existing elevators do not comply with 407, elevators complying with 407 shall be clearly identified with the International Symbol of Accessibility complying with 703.7.2.1. + +216.8 Toilet Rooms and Bathing Rooms +Where existing toilet rooms or bathing rooms do not comply with 603, directional signs indicating the location of the nearest toilet room or bathing room complying with 603 within the facility shall be provided. Signs shall comply with 703.5 and shall include the International Symbol of Accessibility complying with 703.7.2.1. Where existing toilet rooms or bathing rooms do not comply with 603, the toilet rooms or bathing rooms complying with 603 shall be identified by the International Symbol of Accessibility complying with 703.7.2.1. Where clustered single user toilet rooms or bathing facilities are permitted to use exceptions to 213.2, toilet rooms or bathing facilities complying with 603 shall be identified by the International Symbol of Accessibility complying with 703.7.2.1 unless all toilet rooms and bathing facilities comply with 603. + +216.9 TTYs +Identification and directional signs for public TTYs shall be provided in accordance with 216.9. + +216.9.1 Identification Signs +Public TTYs shall be identified by the International Symbol of TTY complying with 703.7.2.2. + +216.9.2 Directional Signs +Directional signs indicating the location of the nearest public TTY shall be provided at all banks of public pay telephones not containing a public TTY. In addition, where signs provide direction to public pay telephones, they shall also provide direction to public TTYs. Directional signs shall comply with 703.5 and shall include the International Symbol of TTY complying with 703.7.2.2. + +216.10 Assistive Listening Systems +Each assembly area required by 219 to provide assistive listening systems shall provide signs informing patrons of the availability of the assistive listening system. Assistive listening signs shall comply with 703.5 and shall include the International Symbol of Access for Hearing Loss complying with 703.7.2.4. +EXCEPTION: Where ticket offices or windows are provided, signs shall not be required at each assembly area provided that signs are displayed at each ticket office or window informing patrons of the availability of assistive listening systems. + +216.11 Check-Out Aisles +Where more than one check-out aisle is provided, check-out aisles complying with 904.3 shall be identified by the International Symbol of Accessibility complying with 703.7.2.1. Where check-out aisles are identified by numbers, letters, or functions, signs identifying check-out aisles complying with 904.3 shall be located in the same location as the check-out aisle identification. +EXCEPTION: Where all check-out aisles serving a single function comply with 904.3, signs complying with 703.7.2.1 shall not be required. + +216.12 Amusement Rides +Signs identifying the type of access provided on amusement rides shall be provided at entries to queues and waiting lines. In addition, where accessible unload areas also serve as accessible load areas, signs indicating the location of the accessible load and unload areas shall be provided at entries to queues and waiting lines. +Advisory 216.12 Amusement Rides. Amusement rides designed primarily for children, amusement rides that are controlled or operated by the rider, and amusement rides without seats, are not required to provide wheelchair spaces, transfer seats, or transfer systems, and need not meet the sign requirements in 216.12. The load and unload areas of these rides must, however, be on an accessible route and must provide turning space. + +217.1 General +Where coin-operated public pay telephones, coinless public pay telephones, public closed-circuit telephones, public courtesy phones, or other types of public telephones are provided, public telephones shall be provided in accordance with 217 for each type of public telephone provided. For purposes of this section, a bank of telephones shall be considered to be two or more adjacent telephones. +Advisory 217.1 General. These requirements apply to all types of public telephones including courtesy phones at airports and rail stations that provide a free direct connection to hotels, transportation services, and tourist attractions. + +217.2 Wheelchair accessible Telephones +Where public telephones are provided, wheelchair accessible telephones complying with 704.2 shall be provided in accordance with Table 217.2. +EXCEPTION: Drive-up only public telephones shall not be required to comply with 217.2. + +217.3 Volume Controls +All public telephones shall have volume controls complying with 704.3. + +217.4 TTYs +TTYs complying with 704.4 shall be provided in accordance with 217.4. +Advisory 217.4 TTYs. Separate requirements are provided based on the number of public pay telephones provided at a bank of telephones, within a floor, a building, or on a site. In some instances one TTY can be used to satisfy more than one of these requirements. For example, a TTY required for a bank can satisfy the requirements for a building. However, the requirement for at least one TTY on an exterior site cannot be met by installing a TTY in a bank inside a building. Consideration should be given to phone systems that can accommodate both digital and analog transmissions for compatibility with digital and analog TTYs. + +217.4.1 Bank Requirement +Where four or more public pay telephones are provided at a bank of telephones, at least one public TTY complying with 704.4 shall be provided at that bank. +EXCEPTION: TTYs shall not be required at banks of telephones located within 200 feet (61 m) of, and on the same floor as, a bank containing a public TTY. + +217.4.2 Floor Requirement +TTYs in public buildings shall be provided in accordance with 217.4.2.1. TTYs in private buildings shall be provided in accordance with 217.4.2.2. + +217.4.2.1 Public Buildings +Where at least one public pay telephone is provided on a floor of a public building, at least one public TTY shall be provided on that floor. + +217.4.2.2 Private Buildings +Where four or more public pay telephones are provided on a floor of a private building, at least one public TTY shall be provided on that floor. + +217.4.3 Building Requirement +TTYs in public buildings shall be provided in accordance with 217.4.3.1. TTYs in private buildings shall be provided in accordance with 217.4.3.2. + +217.4.3.1 Public Buildings +Where at least one public pay telephone is provided in a public building, at least one public TTY shall be provided in the building. Where at least one public pay telephone is provided in a public use area of a public building, at least one public TTY shall be provided in the public building in a public use area. + +217.4.3.2 Private Buildings +Where four or more public pay telephones are provided in a private building, at least one public TTY shall be provided in the building. + +217.4.4 Exterior Site Requirement +Where four or more public pay telephones are provided on an exterior site, at least one public TTY shall be provided on the site. + +217.4.5 Rest Stops, Emergency Roadside Stops, and Service Plazas +Where at least one public pay telephone is provided at a public rest stop, emergency roadside stop, or service plaza, at least one public TTY shall be provided. + +217.4.6 Hospitals +Where at least one public pay telephone is provided serving a hospital emergency room, hospital recovery room, or hospital waiting room, at least one public TTY shall be provided at each location. + +217.4.7 Transportation Facilities +In transportation facilities, in addition to the requirements of 217.4.1 through 217.4.4, where at least one public pay telephone serves a particular entrance to a bus or rail facility, at least one public TTY shall be provided to serve that entrance. In airports, in addition to the requirements of 217.4.1 through 217.4.4, where four or more public pay telephones are located in a terminal outside the security areas, a concourse within the security areas, or a baggage claim area in a terminal, at least one public TTY shall be provided in each location. + +217.4.8 Detention and Correctional Facilities +In detention and correctional facilities, where at least one pay telephone is provided in a secured area used only by detainees or inmates and security personnel, at least one TTY shall be provided in at least one secured area. + +217.5 Shelves for Portable TTYs +Where a bank of telephones in the interior of a building consists of three or more public pay telephones, at least one public pay telephone at the bank shall be provided with a shelf and an electrical outlet in accordance with 704.5. +EXCEPTIONS: 1. Secured areas of detention and correctional facilities where shelves and outlets are prohibited for purposes of security or safety shall not be required to comply with 217.5. +2. The shelf and electrical outlet shall not be required at a bank of telephones with a TTY. + +218.1 General +Transportation facilities shall comply with 218. + +218.2 New and Altered Fixed Guideway Stations +New and altered stations in rapid rail, light rail, commuter rail, intercity rail, high speed rail, and other fixed guideway systems shall comply with 810.5 through 810.10. + +218.3 Key Stations and Existing Intercity Rail Stations +Key stations and existing intercity rail stations shall comply with 810.5 through 810.10. + +218.4 Bus Shelters +Where provided, bus shelters shall comply with 810.3. + +218.5 Other Transportation Facilities +In other transportation facilities, public address systems shall comply with 810.7 and clocks shall comply with 810.8. + +219.1 General +Assistive listening systems shall be provided in accordance with 219 and shall comply with 706. + +219.2 Required Systems +In each assembly area where audible communication is integral to the use of the space, an assistive listening system shall be provided. +EXCEPTION: Other than in courtrooms, assistive listening systems shall not be required where audio amplification is not provided. + +219.3 Receivers +Receivers complying with 706.2 shall be provided for assistive listening systems in each assembly area in accordance with Table 219.3. Twenty-five percent minimum of receivers provided, but no fewer than two, shall be hearing-aid compatible in accordance with 706.3. +EXCEPTIONS: 1. Where a building contains more than one assembly area and the assembly areas required to provide assistive listening systems are under one management, the total number of required receivers shall be permitted to be calculated according to the total number of seats in the assembly areas in the building provided that all receivers are usable with all systems. +2. Where all seats in an assembly area are served by an induction loop assistive listening system, the minimum number of receivers required by Table 219.3 to be hearing-aid compatible shall not be required to be provided. +Table Legend: 1. Or fraction thereof + +220.1 General +Where automatic teller machines or self-service fare vending, collection, or adjustment machines are provided, at least one of each type provided at each location shall comply with 707. Where bins are provided for envelopes, waste paper, or other purposes, at least one of each type shall comply with 811. +Advisory 220.1 General. If a bank provides both interior and exterior ATMs, each such installation is considered a separate location. accessible ATMs, including those with speech and those that are within reach of people who use wheelchairs, must provide all the functions provided to customers at that location at all times. For example, it is unacceptable for the accessible ATM only to provide cash withdrawals while inaccessible ATMs also sell theater tickets. + +221.1 General +Assembly areas shall provide wheelchair spaces, companion seats, and designated aisle seats complying with 221 and 802. In addition, lawn seating shall comply with 221.5. + +221.2 Wheelchair Spaces +Wheelchair spaces complying with 221.2 shall be provided in assembly areas with fixed seating. + +221.2.1 Number and Location +Wheelchair spaces shall be provided complying with 221.2.1. + +221.2.1.1 General Seating +Wheelchair spaces complying with 802.1 shall be provided in accordance with Table 221.2.1.1. + +221.2.1.2 Luxury Boxes, Club Boxes, and Suites in Arenas, Stadiums, and Grandstands +In each luxury box, club box, and suite within arenas, stadiums, and grandstands, wheelchair spaces complying with 802.1 shall be provided in accordance with Table 221.2.1.1. +Advisory 221.2.1.2 Luxury Boxes, Club Boxes, and Suites in Arenas, Stadiums, and Grandstands. The number of wheelchair spaces required in luxury boxes, club boxes, and suites within an arena, stadium, or grandstand is to be calculated box by box and suite by suite. + +221.2.1.3 Other Boxes +In boxes other than those required to comply with 221.2.1.2, the total number of wheelchair spaces required shall be determined in accordance with Table 221.2.1.1. Wheelchair spaces shall be located in not less than 20 percent of all boxes provided. Wheelchair spaces shall comply with 802.1. +Advisory 221.2.1.3 Other Boxes. The provision for seating in “other boxes” includes box seating provided in facilities such as performing arts auditoria where tiered boxes are designed for spatial and acoustical purposes. The number of wheelchair spaces required in boxes covered by 221.2.1.3 is calculated based on the total number of seats provided in these other boxes. The resulting number of wheelchair spaces must be located in no fewer than 20% of the boxes covered by this section. For example, a concert hall has 20 boxes, each of which contains 10 seats, totaling 200 seats. In this example, 5 wheelchair spaces would be required, and they must be placed in at least 4 of the boxes. Additionally, because the wheelchair spaces must also meet the dispersion requirements of 221.2.3, the boxes containing these wheelchair spaces cannot all be located in one area unless an exception to the dispersion requirements applies. + +221.2.1.4 Team or Player Seating +At least one wheelchair space complying with 802.1 shall be provided in team or player seating areas serving areas of sport activity. +EXCEPTION: Wheelchair spaces shall not be required in team or player seating areas serving bowling lanes not required to comply with 206.2.11. + +221.2.2 Integration +Wheelchair spaces shall be an integral part of the seating plan. +Advisory 221.2.2 Integration. The requirement that wheelchair spaces be an “integral part of the seating plan” means that wheelchair spaces must be placed within the footprint of the seating area. Wheelchair spaces cannot be segregated from seating areas. For example, it would be unacceptable to place only the wheelchair spaces, or only the wheelchair spaces and their associated companion seats, outside the seating areas defined by risers in an assembly area. + +221.2.3 Lines of Sight and Dispersion +Wheelchair spaces shall provide lines of sight complying with 802.2 and shall comply with 221.2.3. In providing lines of sight, wheelchair spaces shall be dispersed. Wheelchair spaces shall provide spectators with choices of seating locations and viewing angles that are substantially equivalent to, or better than, the choices of seating locations and viewing angles available to all other spectators. When the number of wheelchair spaces required by 221.2.1 has been met, further dispersion shall not be required. +EXCEPTION: Wheelchair spaces in team or player seating areas serving areas of sport activity shall not be required to comply with 221.2.3. +Advisory 221.2.3 Lines of Sight and Dispersion. Consistent with the overall intent of the ADA, individuals who use wheelchairs must be provided equal access so that their experience is substantially equivalent to that of other members of the audience. Thus, while individuals who use wheelchairs need not be provided with the best seats in the house, neither may they be relegated to the worst. + +221.2.3.1 Horizontal Dispersion +Wheelchair spaces shall be dispersed horizontally. +EXCEPTIONS: 1. Horizontal dispersion shall not be required in assembly areas with 300 or fewer seats if the companion seats required by 221.3 and wheelchair spaces are located within the 2nd or 3rd quartile of the total row length. Intermediate aisles shall be included in determining the total row length. If the row length in the 2nd and 3rd quartile of a row is insufficient to accommodate the required number of companion seats and wheelchair spaces, the additional companion seats and wheelchair spaces shall be permitted to be located in the 1st and 4th quartile of the row. +2. In row seating, two wheelchair spaces shall be permitted to be located side-by-side. +Advisory 221.2.3.1 Horizontal Dispersion. Horizontal dispersion of wheelchair spaces is the placement of spaces in an assembly facility seating area from side-to-side or, in the case of an arena or stadium, around the field of play or performance area. + +221.2.3.2 Vertical Dispersion +Wheelchair spaces shall be dispersed vertically at varying distances from the screen, performance area, or playing field. In addition, wheelchair spaces shall be located in each balcony or mezzanine that is located on an accessible route. +EXCEPTIONS: 1. Vertical dispersion shall not be required in assembly areas with 300 or fewer seats if the wheelchair spaces provide viewing angles that are equivalent to, or better than, the average viewing angle provided in the facility. +2. In bleachers, wheelchair spaces shall not be required to be provided in rows other than rows at points of entry to bleacher seating. +Note to Reader: The Department of Justice’s ADA standards also require the following: +Assembly areas. Assembly areas that are subject to this part [of the title III regulation or to this section of the title II regulation] shall comply with the provisions of the 2010 Standards applicable to assembly areas, including, but not limited to, sections 221 and 802. In addition, assembly areas shall ensure that — +(1) In stadiums, arenas, and grandstands, wheelchair spaces and companion seats are dispersed to all levels that include seating served by an accessible route; +(2) Assembly areas that are required to horizontally disperse wheelchair spaces and companion seats by section 221.2.3.1 of the 2010 Standards and have seating encircling, in whole or in part, a field of play or performance area shall disperse wheelchair spaces and companion seats around that field of play or performance area; +(3) Wheelchair spaces and companion seats are not located on (or obstructed by) temporary platforms or other movable structures, except that when an entire seating section is placed on temporary platforms or other movable structures in an area where fixed seating is not provided, in order to increase seating for an event, wheelchair spaces and companion seats may be placed in that section. When wheelchair spaces and companion seats are not required to accommodate persons eligible for those spaces and seats, individual, removable seats may be placed in those spaces and seats; +(4) Stadium-style movie theaters shall locate wheelchair spaces and companion seats on a riser or cross-aisle in the stadium section that satisfies at least one of the following criteria — +(i) It is located within the rear 60% of the seats provided in an auditorium; or +(ii) It is located within the area of an auditorium in which the vertical viewing angles (as measured to the top of the screen) are from the 40th to the 100th percentile of vertical viewing angles for all seats as ranked from the seats in the first row (1st percentile) to seats in the back row (100th percentile). + +221.3 Companion Seats +At least one companion seat complying with 802.3 shall be provided for each wheelchair space required by 221.2.1. + +221.4 Designated Aisle Seats +At least 5 percent of the total number of aisle seats provided shall comply with 802.4 and shall be the aisle seats located closest to accessible routes. +EXCEPTION: Team or player seating areas serving areas of sport activity shall not be required to comply with 221.4. +Advisory 221.4 Designated Aisle Seats. When selecting which aisle seats will meet the requirements of 802.4, those aisle seats which are closest to, not necessarily on, accessible routes must be selected first. For example, an assembly area has two aisles (A and B) serving seating areas with an accessible route connecting to the top and bottom of Aisle A only. The aisle seats chosen to meet 802.4 must be those at the top and bottom of Aisle A, working toward the middle. Only when all seats on Aisle A would not meet the five percent minimum would seats on Aisle B be designated. + +221.5 Lawn Seating +Lawn seating areas and exterior overflow seating areas, where fixed seats are not provided, shall connect to an accessible route. + +222.1 General +Where dressing rooms, fitting rooms, or locker rooms are provided, at least 5 percent, but no fewer than one, of each type of use in each cluster provided shall comply with 803. +EXCEPTION: In alterations, where it is technically infeasible to provide rooms in accordance with 222.1, one room for each sex on each level shall comply with 803. Where only unisex rooms are provided, unisex rooms shall be permitted. +Advisory 222.1 General. A “cluster” is a group of rooms proximate to one another. Generally, rooms in a cluster are within sight of, or adjacent to, one another. Different styles of design provide users varying levels of privacy and convenience. Some designs include private changing facilities that are close to core areas of the facility, while other designs use space more economically and provide only group dressing facilities. Regardless of the type of facility, dressing, fitting, and locker rooms should provide people with disabilities rooms that are equally private and convenient to those provided others. For example, in a physician’s office, if people without disabilities must traverse the full length of the office suite in clothing other than their street clothes, it is acceptable for people with disabilities to be asked to do the same. + +222.2 Coat Hooks and Shelves +Where coat hooks or shelves are provided in dressing, fitting or locker rooms without individual compartments, at least one of each type shall comply with 803.5. Where coat hooks or shelves are provided in individual compartments at least one of each type complying with 803.5 shall be provided in individual compartments in dressing, fitting, or locker rooms required to comply with 222.1. + +223.1 General +In licensed medical care facilities and licensed long-term care facilities where the period of stay exceeds twenty-four hours, patient or resident sleeping rooms shall be provided in accordance with 223. +EXCEPTION: Toilet rooms that are part of critical or intensive care patient sleeping rooms shall not be required to comply with 603. +Note to Reader: The Department of Justice’s ADA standards exceed the following advisory note (Advisory 223.1) and require accessible patient bedrooms to be dispersed proportionately by medical specialty in medical care facilities that do not specialize in the treatment of conditions that affect mobility (see 223.2.1 below). +Advisory 223.1 General. Because medical facilities frequently reconfigure spaces to reflect changes in medical specialties, Section 223.1 does not include a provision for dispersion of accessible patient or resident sleeping rooms. The lack of a design requirement does not mean that covered entities are not required to provide services to people with disabilities where accessible rooms are not dispersed in specialty areas. Locate accessible rooms near core areas that are less likely to change over time. While dispersion is not required, the flexibility it provides can be a critical factor in ensuring cost effective compliance with applicable civil rights laws, including titles II and III of the ADA and Section 504 of the Rehabilitation Act of 1973, as amended. Additionally, all types of features and amenities should be dispersed among accessible sleeping rooms to ensure equal access to and a variety of choices for all patients and residents. + +223.1.1 Alterations +Where sleeping rooms are altered or added, the requirements of 223 shall apply only to the sleeping rooms being altered or added until the number of sleeping rooms complies with the minimum number required for new construction. +Advisory 223.1.1 Alterations. In alterations and additions, the minimum required number is based on the total number of sleeping rooms altered or added instead of on the total number of sleeping rooms provided in a facility. As a facility is altered over time, every effort should be made to disperse accessible sleeping rooms among patient care areas such as pediatrics, cardiac care, maternity, and other units. In this way, people with disabilities can have access to the full-range of services provided by a medical care facility. + +223.2 Hospitals, Rehabilitation Facilities, Psychiatric Facilities and Detoxification Facilities. +Hospitals, rehabilitation facilities, psychiatric facilities and detoxification facilities shall comply with 223.2. + +223.2.1 Facilities Not Specializing in Treating Conditions That Affect Mobility +In facilities not specializing in treating conditions that affect mobility, at least 10 percent, but no fewer than one, of the patient sleeping rooms shall provide mobility features complying with 805. +Note to Reader: The Department of Justice’s ADA standards also require the following: +Medical care facilities. Medical care facilities that are subject to this part [of the title III regulation or to this section of the title II regulation] shall comply with the provisions of the 2010 Standards applicable to medical care facilities, including, but not limited to, sections 223 and 805. In addition, medical care facilities that do not specialize in the treatment of conditions that affect mobility shall disperse the accessible patient bedrooms required by section 223.2.1 of the 2010 Standards in a manner that is proportionate by type of medical specialty. + +223.2.2 Facilities Specializing in Treating Conditions That Affect Mobility +In facilities specializing in treating conditions that affect mobility, 100 percent of the patient sleeping rooms shall provide mobility features complying with 805. +Advisory 223.2.2 Facilities Specializing in Treating Conditions That Affect Mobility. Conditions that affect mobility include conditions requiring the use or assistance of a brace, cane, crutch, prosthetic device, wheelchair, or powered mobility aid; arthritic, neurological, or orthopedic conditions that severely limit one’s ability to walk; respiratory diseases and other conditions which may require the use of portable oxygen; and cardiac conditions that impose significant functional limitations. Facilities that may provide treatment for, but that do not specialize in treatment of such conditions, such as general rehabilitation hospitals, are not subject to this requirement but are subject to Section 223.2.1. + +223.3 Long-Term Care Facilities +In licensed long-term care facilities, at least 50 percent, but no fewer than one, of each type of resident sleeping room shall provide mobility features complying with 805. + +224.1 General +Transient lodging facilities shall provide guest rooms in accordance with 224. +Advisory 224.1 General. Certain facilities used for transient lodging, including time shares, dormitories, and town homes may be covered by both these requirements and the Fair Housing Amendments Act. The Fair Housing Amendments Act requires that certain residential structures having four or more multi-family dwelling units, regardless of whether they are privately owned or federally assisted, include certain features of accessible and adaptable design according to guidelines established by the U.S. Department of Housing and Urban Development (HUD). This law and the appropriate regulations should be consulted before proceeding with the design and construction of residential housing. + +224.1.1 Alterations +Where guest rooms are altered or added, the requirements of 224 shall apply only to the guest rooms being altered or added until the number of guest rooms complies with the minimum number required for new construction. +Advisory 224.1.1 Alterations. In alterations and additions, the minimum required number of accessible guest rooms is based on the total number of guest rooms altered or added instead of the total number of guest rooms provided in a facility. Typically, each alteration of a facility is limited to a particular portion of the facility. When accessible guest rooms are added as a result of subsequent alterations, compliance with 224.5 (Dispersion) is more likely to be achieved if all of the accessible guest rooms are not provided in the same area of the facility. + +224.1.2 Guest Room Doors and Doorways +Entrances, doors, and doorways providing user passage into and within guest rooms that are not required to provide mobility features complying with 806.2 shall comply with 404.2.3. +EXCEPTION: Shower and sauna doors in guest rooms that are not required to provide mobility features complying with 806.2 shall not be required to comply with 404.2.3. +Advisory 224.1.2 Guest Room Doors and Doorways. Because of the social interaction that often occurs in lodging facilities, an accessible clear opening width is required for doors and doorways to and within all guest rooms, including those not required to be accessible. This applies to all doors, including bathroom doors, that allow full user passage. Other requirements for doors and doorways in Section 404 do not apply to guest rooms not required to provide mobility features. + +224.2 Guest Rooms with Mobility Features +In transient lodging facilities, guest rooms with mobility features complying with 806.2 shall be provided in accordance with Table 224.2. + +224.3 Beds +In guest rooms having more than 25 beds, 5 percent minimum of the beds shall have clear floor space complying with 806.2.3. + +224.4 Guest Rooms with Communication Features +In transient lodging facilities, guest rooms with communication features complying with 806.3 shall be provided in accordance with Table 224.4. + +224.5 Dispersion +Guest rooms required to provide mobility features complying with 806.2 and guest rooms required to provide communication features complying with 806.3 shall be dispersed among the various classes of guest rooms, and shall provide choices of types of guest rooms, number of beds, and other amenities comparable to the choices provided to other guests. Where the minimum number of guest rooms required to comply with 806 is not sufficient to allow for complete dispersion, guest rooms shall be dispersed in the following priority: guest room type, number of beds, and amenities. At least one guest room required to provide mobility features complying with 806.2 shall also provide communication features complying with 806.3. Not more than 10 percent of guest rooms required to provide mobility features complying with 806.2 shall be used to satisfy the minimum number of guest rooms required to provide communication features complying with 806.3. +Advisory 224.5 Dispersion. Factors to be considered in providing an equivalent range of options may include, but are not limited to, room size, bed size, cost, view, bathroom fixtures such as hot tubs and spas, smoking and nonsmoking, and the number of rooms provided. +Note to Reader: The Department of Justice’s ADA standards also require the following: +Places of lodging. Places of lodging subject to this part [of the title III regulation] shall comply with the provisions of the 2010 Standards applicable to transient lodging, including, but not limited to, the requirements for transient lodging guest rooms in sections 224 and 806. +(1) Guest rooms. Guest rooms with mobility features in places of lodging subject to the transient lodging requirements of 2010 Standards shall be provided as follows-- +(i) Facilities that are subject to the same permit application on a common site that each have 50 or fewer guest rooms may be combined for the purposes of determining the required number of accessible rooms and type of accessible bathing facility in accordance with table 224.2 to section 224.2 of the 2010 Standards. +(ii) Facilities with more than 50 guest rooms shall be treated separately for the purposes of determining the required number of accessible rooms and type of accessible bathing facility in accordance with table 224.2 to section 224.2 of the 2010 Standards. +(2) Exception. Alterations to guest rooms in places of lodging where the guest rooms are not owned or substantially controlled by the entity that owns, leases, or operates the overall facility and the physical features of the guest room interiors are controlled by their individual owners are not required to comply with § 36.402 or the alterations requirements in section 224.1.1 of the 2010 Standards. +(3) Facilities with residential units and transient lodging units. Residential dwelling units that are designed and constructed for residential use exclusively are not subject to the transient lodging standards. +The Department of Justice’s ADA standards also require the following: +Housing at a place of education. Housing at a place of education that is subject to this part [of the title III regulation or to this section of the title II regulation] shall comply with the provisions of the 2010 Standards applicable to transient lodging, including, but not limited to, the requirements for transient lodging guest rooms in sections 224 and 806, subject to the following exceptions. For the purposes of the application of this section, the term “sleeping room” is intended to be used interchangeably with the term “guest room” as it is used in the transient lodging standards. +(1) Kitchens within housing units containing accessible sleeping rooms with mobility features (including suites and clustered sleeping rooms) or on floors containing accessible sleeping rooms with mobility features shall provide turning spaces that comply with section 809.2.2 of the 2010 Standards and kitchen work surfaces that comply with section 804.3 of the 2010 Standards. +(2) Multi-bedroom housing units containing accessible sleeping rooms with mobility features shall have an accessible route throughout the unit in accordance with section 809.2 of the 2010 Standards. +(3) Apartments or townhouse facilities that are provided by or on behalf of a place of education, which are leased on a year-round basis exclusively to graduate students or faculty and do not contain any public use or common use areas available for educational programming, are not subject to the transient lodging standards and shall comply with the requirements for residential facilities in sections 233 and 809 of the 2010 Standards. +The Department of Justice’s title II and title III regulations include requirements for social service center establishments which are noted in section 233 (Residential Facilities). + +225.1 General +Storage facilities shall comply with 225. + +225.2 Storage +Where storage is provided in accessible spaces, at least one of each type shall comply with 811. +Advisory 225.2 Storage. Types of storage include, but are not limited to, closets, cabinets, shelves, clothes rods, hooks, and drawers. Where provided, at least one of each type of storage must be within the reach ranges specified in 308; however, it is permissible to install additional storage outside the reach ranges. + +225.2.1 Lockers +Where lockers are provided, at least 5 percent, but no fewer than one of each type, shall comply with 811. +Advisory 225.2.1 Lockers. Different types of lockers may include full-size and half-size lockers, as well as those specifically designed for storage of various sports equipment. + +225.2.2 Self-Service Shelving +Self-service shelves shall be located on an accessible route complying with 402. Self-service shelving shall not be required to comply with 308. +Advisory 225.2.2 Self-Service Shelving. Self-service shelves include, but are not limited to, library, store, or post office shelves. + +225.3 Self-Service Storage Facilities +Self-service storage facilities shall provide individual self-service storage spaces complying with these requirements in accordance with Table 225.3. +Advisory 225.3 Self-Service Storage Facilities. Although there are no technical requirements that are unique to self-service storage facilities, elements and spaces provided in facilities containing self-service storage spaces required to comply with these requirements must comply with this document where applicable. For example: the number of storage spaces required to comply with these requirements must provide accessible Routes complying with Section 206; accessible means of egress complying with Section 207; Parking Spaces complying with Section 208; and, where provided, other public use or common use elements and facilities such as toilet rooms, drinking fountains, and telephones must comply with the applicable requirements of this document. + +225.3.1 Dispersion +Individual self-service storage spaces shall be dispersed throughout the various classes of spaces provided. Where more classes of spaces are provided than the number required to be accessible, the number of spaces shall not be required to exceed that required by Table 225.3. Self-service storage spaces complying with Table 225.3 shall not be required to be dispersed among buildings in a multi-building facility. + +226.1 General +Where dining surfaces are provided for the consumption of food or drink, at least 5 percent of the seating spaces and standing spaces at the dining surfaces shall comply with 902. In addition, where work surfaces are provided for use by other than employees, at least 5 percent shall comply with 902. +EXCEPTIONS: 1. Sales counters and service counters shall not be required to comply with 902. +2. Check writing surfaces provided at check-out aisles not required to comply with 904.3 shall not be required to comply with 902. +Advisory 226.1 General. In facilities covered by the ADA, this requirement does not apply to work surfaces used only by employees. However, the ADA and, where applicable, Section 504 of the Rehabilitation Act of 1973, as amended, provide that employees are entitled to “reasonable accommodations.” With respect to work surfaces, this means that employers may need to procure or adjust work stations such as desks, laboratory and work benches, fume hoods, reception counters, teller windows, study carrels, commercial kitchen counters, and conference tables to accommodate the individual needs of employees with disabilities on an “as needed” basis. Consider work surfaces that are flexible and permit installation at variable heights and clearances. + +226.2 Dispersion +Dining surfaces and work surfaces required to comply with 902 shall be dispersed throughout the space or facility containing dining surfaces and work surfaces. + +227.1 General +Where provided, check-out aisles, sales counters, service counters, food service lines, queues, and waiting lines shall comply with 227 and 904. + +227.2 Check-Out Aisles +Where check-out aisles are provided, check-out aisles complying with 904.3 shall be provided in accordance with Table 227.2. Where check-out aisles serve different functions, check-out aisles complying with 904.3 shall be provided in accordance with Table 227.2 for each function. Where check-out aisles are dispersed throughout the building or facility, check-out aisles complying with 904.3 shall be dispersed. +EXCEPTION: Where the selling space is under 5000 square feet (465 square meters) no more than one check-out aisle complying with 904.3 shall be required. + +227.2.1 Altered Check-Out Aisles +Where check-out aisles are altered, at least one of each check-out aisle serving each function shall comply with 904.3 until the number of check-out aisles complies with 227.2. + +227.3 Counters +Where provided, at least one of each type of sales counter and service counter shall comply with 904.4. Where counters are dispersed throughout the building or facility, counters complying with 904.4 also shall be dispersed. +Advisory 227.3 Counters. Types of counters that provide different services in the same facility include, but are not limited to, order, pick-up, express, and returns. One continuous counter can be used to provide different types of service. For example, order and pick-up are different services. It would not be acceptable to provide access only to the part of the counter where orders are taken when orders are picked-up at a different location on the same counter. Both the order and pick-up section of the counter must be accessible. + +227.4 Food Service Lines +Food service lines shall comply with 904.5. Where self-service shelves are provided, at least 50 percent, but no fewer than one, of each type provided shall comply with 308. + +227.5 Queues and Waiting Lines +Queues and waiting lines servicing counters or check-out aisles required to comply with 904.3 or 904.4 shall comply with 403. + +228.1 General +Where provided, at least one of each type of depository, vending machine, change machine, and fuel dispenser shall comply with 309. +EXCEPTION: Drive-up only depositories shall not be required to comply with 309. +Advisory 228.1 General. Depositories include, but are not limited to, night receptacles in banks, post offices, video stores, and libraries. + +228.2 Mail Boxes +Where mail boxes are provided in an interior location, at least 5 percent, but no fewer than one, of each type shall comply with 309. In residential facilities, where mail boxes are provided for each residential dwelling unit, mail boxes complying with 309 shall be provided for each residential dwelling unit required to provide mobility features complying with 809.2 through 809.4. + +229.1 General +Where glazed openings are provided in accessible rooms or spaces for operation by occupants, at least one opening shall comply with 309. Each glazed opening required by an administrative authority to be operable shall comply with 309. +EXCEPTION: 1. Glazed openings in residential dwelling units required to comply with 809 shall not be required to comply with 229. +2. Glazed openings in guest rooms required to provide communication features and in guest rooms required to comply with 206.5.3 shall not be required to comply with 229. + +230.1 General +Where a two-way communication system is provided to gain admittance to a building or facility or to restricted areas within a building or facility, the system shall comply with 708. +Advisory 230.1 General. This requirement applies to facilities such as office buildings, courthouses, and other facilities where admittance to the building or restricted spaces is dependent on two-way communication systems. + +231.1 General +Judicial facilities shall comply with 231. + +231.2 Courtrooms +Each courtroom shall comply with 808. + +231.3 Holding Cells +Where provided, central holding cells and court-floor holding cells shall comply with 231.3. + +231.3.1 Central Holding Cells +Where separate central holding cells are provided for adult male, juvenile male, adult female, or juvenile female, one of each type shall comply with 807.2. Where central holding cells are provided and are not separated by age or sex, at least one cell complying with 807.2 shall be provided. + +231.3.2 Court-Floor Holding Cells +Where separate court-floor holding cells are provided for adult male, juvenile male, adult female, or juvenile female, each courtroom shall be served by one cell of each type complying with 807.2. Where court-floor holding cells are provided and are not separated by age or sex, courtrooms shall be served by at least one cell complying with 807.2. Cells may serve more than one courtroom. + +231.4 Visiting Areas +Visiting areas shall comply with 231.4. + +231.4.1 Cubicles and Counters +At least 5 percent, but no fewer than one, of cubicles shall comply with 902 on both the visitor and detainee sides. Where counters are provided, at least one shall comply with 904.4.2 on both the visitor and detainee sides. +EXCEPTION: The detainee side of cubicles or counters at non-contact visiting areas not serving holding cells required to comply with 231 shall not be required to comply with 902 or 904.4.2. + +231.4.2 Partitions +Where solid partitions or security glazing separate visitors from detainees at least one of each type of cubicle or counter partition shall comply with 904.6. + +232.1 General +Buildings, facilities, or portions thereof, in which people are detained for penal or correction purposes, or in which the liberty of the inmates is restricted for security reasons shall comply with 232. +Advisory 232.1 General. Detention facilities include, but are not limited to, jails, detention centers, and holding cells in police stations. Correctional facilities include, but are not limited to, prisons, reformatories, and correctional centers. +Note to Reader: The Department of Justice’s ADA standards also require the following: +Detention and correctional facilities. (1) New construction of jails, prisons, and other detention and correctional facilities shall comply with the 2010 Standards except that public entities shall provide accessible mobility features complying with section 807.2 of the 2010 Standards for a minimum of 3%, but no fewer than one, of the total number of cells in a facility. Cells with mobility features shall be provided in each classification level. +(2) Alterations to detention and correctional facilities. Alterations to jails, prisons, and other detention and correctional facilities shall comply with the 2010 Standards except that public entities shall provide accessible mobility features complying with section 807.2 of the 2010 Standards for a minimum of 3%, but no fewer than one, of the total number of cells being altered until at least 3%, but no fewer than one, of the total number of cells in a facility shall provide mobility features complying with section 807.2. Altered cells with mobility features shall be provided in each classification level. However, when alterations are made to specific cells, detention and correctional facility operators may satisfy their obligation to provide the required number of cells with mobility features by providing the required mobility features in substitute cells (cells other than those where alterations are originally planned), provided that each substitute cell— +(i) Is located within the same prison site; +(ii) Is integrated with other cells to the maximum extent feasible; +(iii) Has, at a minimum, equal physical access as the altered cells to areas used by inmates or detainees for visitation, dining, recreation, educational programs, medical services, work programs, religious services, and participation in other programs that the facility offers to inmates or detainees; and, +(iv) If it is technically infeasible to locate a substitute cell within the same prison site, a substitute cell must be provided at another prison site within the corrections system. +(3) With respect to medical and long-term care facilities in jails, prisons, and other detention and correctional facilities, public entities shall apply the 2010 Standards technical and scoping requirements for those facilities irrespective of whether those facilities are licensed. + +232.2 General Holding Cells and General Housing Cells +General holding cells and general housing cells shall be provided in accordance with 232.2. +EXCEPTION: Alterations to cells shall not be required to comply except to the extent determined by the Attorney General. + +232.2.1 Cells with Mobility Features +At least 2 percent, but no fewer than one, of the total number of cells in a facility shall provide mobility features complying with 807.2. + +232.2.1.1 Beds +In cells having more than 25 beds, at least 5 percent of the beds shall have clear floor space complying with 807.2.3. + +232.2.2 Cells with Communication Features +At least 2 percent, but no fewer than one, of the total number of general holding cells and general housing cells equipped with audible emergency alarm systems and permanently installed telephones within the cell shall provide communication features complying with 807.3. + +232.3 Special Holding Cells and Special Housing Cells +Where special holding cells or special housing cells are provided, at least one cell serving each purpose shall provide mobility features complying with 807.2. Cells subject to this requirement include, but are not limited to, those used for purposes of orientation, protective custody, administrative or disciplinary detention or segregation, detoxification, and medical isolation. +EXCEPTION: Alterations to cells shall not be required to comply except to the extent determined by the Attorney General. + +232.4 Medical Care Facilities +Patient bedrooms or cells required to comply with 223 shall be provided in addition to any medical isolation cells required to comply with 232.3. + +232.5 Visiting Areas +Visiting areas shall comply with 232.5. + +232.5.1 Cubicles and Counters +At least 5 percent, but no fewer than one, of cubicles shall comply with 902 on both the visitor and detainee sides. Where counters are provided, at least one shall comply with 904.4.2 on both the visitor and detainee or inmate sides. +EXCEPTION: The inmate or detainee side of cubicles or counters at non-contact visiting areas not serving holding cells or housing cells required to comply with 232 shall not be required to comply with 902 or 904.4.2. + +232.5.2 Partitions +Where solid partitions or security glazing separate visitors from detainees or inmates at least one of each type of cubicle or counter partition shall comply with 904.6. + +233.1 General +Facilities with residential dwelling units shall comply with 233. + +233.2 Residential Dwelling Units Provided by Entities Subject to HUD Section 504 Regulations +Where facilities with residential dwelling units are provided by entities subject to regulations issued by the Department of Housing and Urban Development (HUD) under Section 504 of the Rehabilitation Act of 1973, as amended, such entities shall provide residential dwelling units with mobility features complying with 809.2 through 809.4 in a number required by the applicable HUD regulations. Residential dwelling units required to provide mobility features complying with 809.2 through 809.4 shall be on an accessible route as required by 206. In addition, such entities shall provide residential dwelling units with communication features complying with 809.5 in a number required by the applicable HUD regulations. Entities subject to 233.2 shall not be required to comply with 233.3. +Advisory 233.2 Residential Dwelling Units Provided by Entities Subject to HUD Section 504 Regulations. Section 233.2 requires that entities subject to HUD’s regulations implementing Section 504 of the Rehabilitation Act of 1973, as amended, provide residential dwelling units containing mobility features and residential dwelling units containing communication features complying with these regulations in a number specified in HUD’s Section 504 regulations. Further, the residential dwelling units provided must be dispersed according to HUD’s Section 504 criteria. In addition, Section 233.2 defers to HUD the specification of criteria by which the technical requirements of this document will apply to alterations of existing facilities subject to HUD’s Section 504 regulations. + +233.3 Residential Dwelling Units Provided by Entities Not Subject to HUD Section 504 Regulations +Facilities with residential dwelling units provided by entities not subject to regulations issued by the Department of Housing and Urban Development (HUD) under Section 504 of the Rehabilitation Act of 1973, as amended, shall comply with 233.3. + +233.3.1 Minimum Number: New Construction +Newly constructed facilities with residential dwelling units shall comply with 233.3.1. +EXCEPTION: Where facilities contain 15 or fewer residential dwelling units, the requirements of 233.3.1.1 and 233.3.1.2 shall apply to the total number of residential dwelling units that are constructed under a single contract, or are developed as a whole, whether or not located on a common site. + +233.3.1.1 Residential Dwelling Units with Mobility Features +In facilities with residential dwelling units, at least 5 percent, but no fewer than one unit, of the total number of residential dwelling units shall provide mobility features complying with 809.2 through 809.4 and shall be on an accessible route as required by 206. + +233.3.1.2 Residential Dwelling Units with Communication Features +In facilities with residential dwelling units, at least 2 percent, but no fewer than one unit, of the total number of residential dwelling units shall provide communication features complying with 809.5. + +233.3.2 Residential Dwelling Units for Sale +Residential dwelling units offered for sale shall provide accessible features to the extent required by regulations issued by Federal agencies under the Americans with Disabilities Act or Section 504 of the Rehabilitation Act of 1973, as amended. +Advisory 233.3.2 Residential Dwelling Units for Sale. A public entity that conducts a program to build housing for purchase by individual home buyers must provide access according to the requirements of the ADA regulations and a program receiving Federal financial assistance must comply with the applicable Section 504 regulation. +Note to Reader: The Department of Justice’s ADA standards also require the following: +Facilities with residential dwelling units for sale to individual owners. +(1) Residential dwelling units designed and constructed or altered by public entities that will be offered for sale to individuals shall comply with the requirements for residential facilities in the 2010 Standards including sections 233 and 809. +(2) The requirements of paragraph (1) also apply to housing programs that are operated by public entities where design and construction of particular residential dwelling units takes place only after a specific buyer has been identified. In such programs, the covered entity must provide the units that comply with the requirements for accessible features to those pre-identified buyers with disabilities who have requested such a unit. + +233.3.3 Additions +Where an addition to an existing building results in an increase in the number of residential dwelling units, the requirements of 233.3.1 shall apply only to the residential dwelling units that are added until the total number of residential dwelling units complies with the minimum number required by 233.3.1. Residential dwelling units required to comply with 233.3.1.1 shall be on an accessible route as required by 206. + +233.3.4 Alterations +Alterations shall comply with 233.3.4. +EXCEPTION: Where compliance with 809.2, 809.3, or 809.4 is technically infeasible, or where it is technically infeasible to provide an accessible route to a residential dwelling unit, the entity shall be permitted to alter or construct a comparable residential dwelling unit to comply with 809.2 through 809.4 provided that the minimum number of residential dwelling units required by 233.3.1.1 and 233.3.1.2, as applicable, is satisfied. +Advisory 233.3.4 Alterations Exception. A substituted dwelling unit must be comparable to the dwelling unit that is not made accessible. Factors to be considered in comparing one dwelling unit to another should include the number of bedrooms; amenities provided within the dwelling unit; types of common spaces provided within the facility; and location with respect to community resources and services, such as public transportation and civic, recreational, and mercantile facilities. + +233.3.4.1 Alterations to Vacated Buildings +Where a building is vacated for the purposes of alteration, and the altered building contains more than 15 residential dwelling units, at least 5 percent of the residential dwelling units shall comply with 809.2 through 809.4 and shall be on an accessible route as required by 206. In addition, at least 2 percent of the residential dwelling units shall comply with 809.5. +Advisory 233.3.4.1 Alterations to Vacated Buildings. This provision is intended to apply where a building is vacated with the intent to alter the building. Buildings that are vacated solely for pest control or asbestos removal are not subject to the requirements to provide residential dwelling units with mobility features or communication features. + +233.3.4.2 Alterations to Individual Residential Dwelling Units +In individual residential dwelling units, where a bathroom or a kitchen is substantially altered, and at least one other room is altered, the requirements of 233.3.1 shall apply to the altered residential dwelling units until the total number of residential dwelling units complies with the minimum number required by 233.3.1.1 and 233.3.1.2. Residential dwelling units required to comply with 233.3.1.1 shall be on an accessible route as required by 206. +EXCEPTION: Where facilities contain 15 or fewer residential dwelling units, the requirements of 233.3.1.1 and 233.3.1.2 shall apply to the total number of residential dwelling units that are altered under a single contract, or are developed as a whole, whether or not located on a common site. +Advisory 233.3.4.2 Alterations to Individual Residential Dwelling Units. Section 233.3.4.2 uses the terms “substantially altered” and “altered.” A substantial alteration to a kitchen or bathroom includes, but is not limited to, alterations that are changes to or rearrangements in the plan configuration, or replacement of cabinetry. Substantial alterations do not include normal maintenance or appliance and fixture replacement, unless such maintenance or replacement requires changes to or rearrangements in the plan configuration, or replacement of cabinetry. The term “alteration” is defined both in Section 106 of these requirements and in the Department of Justice ADA regulations. + +233.3.5 Dispersion +Residential dwelling units required to provide mobility features complying with 809.2 through 809.4 and residential dwelling units required to provide communication features complying with 809.5 shall be dispersed among the various types of residential dwelling units in the facility and shall provide choices of residential dwelling units comparable to, and integrated with, those available to other residents. +EXCEPTION: Where multi-story residential dwelling units are one of the types of residential dwelling units provided, one-story residential dwelling units shall be permitted as a substitute for multi-story residential dwelling units where equivalent spaces and amenities are provided in the one-story residential dwelling unit. +Note to Reader: The Department of Justice’s ADA standards also require the following: +Social service center establishments. Group homes, halfway houses, shelters, or similar social service center establishments that provide either temporary sleeping accommodations or residential dwelling units that are subject to this part [of the title III regulation or to this section of the title II regulation] shall comply with the provisions of the 2010 Standards applicable to residential facilities, including, but not limited to, the provisions in sections 233 and 809. +(1) In sleeping rooms with more than 25 beds covered by this part [of the title III regulation or to this section of the title II regulation], a minimum of 5% of the beds shall have clear floor space complying with section 806.2.3 of the 2010 Standards. +(2) Facilities with more than 50 beds covered by this part [of the title III regulation or to this section of the title II regulation] that provide common use bathing facilities shall provide at least one roll-in shower with a seat that complies with the relevant provisions of section 608 of the 2010 Standards. Transfer-type showers are not permitted in lieu of a roll-in shower with a seat, and the exceptions in sections 608.3 and 608.4 for residential dwelling units are not permitted. When separate shower facilities are provided for men and for women, at least one roll-in shower shall be provided for each group. +The Department of Justice’s ADA standards also require the following: +Housing at a place of education. Housing at a place of education that is subject to this part [of the title III regulation or to this section of the title II regulation] shall comply with the provisions of the 2010 Standards applicable to transient lodging, including, but not limited to, the requirements for transient lodging guest rooms in sections 224 and 806, subject to the following exceptions. For the purposes of the application of this section, the term “sleeping room” is intended to be used interchangeably with the term “guest room” as it is used in the transient lodging standards. +(1) Kitchens within housing units containing accessible sleeping rooms with mobility features (including suites and clustered sleeping rooms) or on floors containing accessible sleeping rooms with mobility features shall provide turning spaces that comply with section 809.2.2 of the 2010 Standards and kitchen work surfaces that comply with section 804.3 of the 2010 Standards. +(2) Multi-bedroom housing units containing accessible sleeping rooms with mobility features shall have an accessible route throughout the unit in accordance with section 809.2 of the 2010 Standards. +(3) Apartments or townhouse facilities that are provided by or on behalf of a place of education, which are leased on a year-round basis exclusively to graduate students or faculty and do not contain any public use or common use areas available for educational programming, are not subject to the transient lodging standards and shall comply with the requirements for residential facilities in sections 233 and 809 of the 2010 Standards. + +234.1 General +Amusement rides shall comply with 234. +EXCEPTION: Mobile or portable amusement rides shall not be required to comply with 234. + +234.2 Load and Unload Areas +Load and unload areas serving amusement rides shall comply with 1002.3. + +234.3 Minimum Number +Amusement rides shall provide at least one wheelchair space complying with 1002.4, or at least one amusement ride seat designed for transfer complying with 1002.5, or at least one transfer device complying with 1002.6. +EXCEPTIONS: 1. Amusement rides that are controlled or operated by the rider shall not be required to comply with 234.3. +2. Amusement rides designed primarily for children, where children are assisted on and off the ride by an adult, shall not be required to comply with 234.3. +3. Amusement rides that do not provide amusement ride seats shall not be required to comply with 234.3. + +234.4 Existing Amusement Rides +Where existing amusement rides are altered, the alteration shall comply with 234.4. +Advisory 234.4 Existing Amusement Rides. Routine maintenance, painting, and changing of theme boards are examples of activities that do not constitute an alteration subject to this section. + +234.4.1 Load and Unload Areas +Where load and unload areas serving existing amusement rides are newly designed and constructed, the load and unload areas shall comply with 1002.3. + +234.4.2 Minimum Number +Where the structural or operational characteristics of an amusement ride are altered to the extent that the amusement ride’s performance differs from that specified by the manufacturer or the original design, the amusement ride shall comply with 234.3. + +235.1 General +Recreational boating facilities shall comply with 235. + +235.2 Boat Slips +Boat slips complying with 1003.3.1 shall be provided in accordance with Table 235.2. Where the number of boat slips is not identified, each 40 feet (12 m) of boat slip edge provided along the perimeter of the pier shall be counted as one boat slip for the purpose of this section. +Advisory 235.2 Boat Slips. The requirement for boat slips also applies to piers where boat slips are not demarcated. For example, a single pier 25 feet (7620 mm) long and 5 feet (1525 mm) wide (the minimum width specified by Section 1003.3) allows boats to moor on three sides. Because the number of boat slips is not demarcated, the total length of boat slip edge (55 feet, 17 m) must be used to determine the number of boat slips provided (two). This number is based on the specification in Section 235.2 that each 40 feet (12 m) of boat slip edge, or fraction thereof, counts as one boat slip. In this example, Table 235.2 would require one boat slip to be accessible. + +235.2.1 Dispersion +Boat slips complying with 1003.3.1 shall be dispersed throughout the various types of boat slips provided. Where the minimum number of boat slips required to comply with 1003.3.1 has been met, no further dispersion shall be required. +Advisory 235.2.1 Dispersion. Types of boat slips are based on the size of the boat slips; whether single berths or double berths, shallow water or deep water, transient or longer-term lease, covered or uncovered; and whether slips are equipped with features such as telephone, water, electricity or cable connections. The term “boat slip” is intended to cover any pier area other than launch ramp boarding piers where recreational boats are moored for purposes of berthing, embarking, or disembarking. For example, a fuel pier may contain boat slips, and this type of short term slip would be included in determining compliance with 235.2. + +235.3 Boarding Piers at Boat Launch Ramps +Where boarding piers are provided at boat launch ramps, at least 5 percent, but no fewer than one, of the boarding piers shall comply with 1003.3.2. + +236.1 General +At least one of each type of exercise machine and equipment shall comply with 1004. + +237.1 General +Fishing piers and platforms shall comply with 1005. + +238.1 General +Golf facilities shall comply with 238. + +238.2 Golf Courses +Golf courses shall comply with 238.2. + +238.2.1 Teeing Grounds +Where one teeing ground is provided for a hole, the teeing ground shall be designed and constructed so that a golf car can enter and exit the teeing ground. Where two teeing grounds are provided for a hole, the forward teeing ground shall be designed and constructed so that a golf car can enter and exit the teeing ground. Where three or more teeing grounds are provided for a hole, at least two teeing grounds, including the forward teeing ground, shall be designed and constructed so that a golf car can enter and exit each teeing ground. +EXCEPTION: In existing golf courses, the forward teeing ground shall not be required to be one of the teeing grounds on a hole designed and constructed so that a golf car can enter and exit the teeing ground where compliance is not feasible due to terrain. + +238.2.2 Putting Greens +Putting greens shall be designed and constructed so that a golf car can enter and exit the putting green. + +238.2.3 Weather Shelters +Where provided, weather shelters shall be designed and constructed so that a golf car can enter and exit the weather shelter and shall comply with 1006.4. + +238.3 Practice Putting Greens, Practice Teeing Grounds, and Teeing Stations at Driving Ranges +At least 5 percent, but no fewer than one, of practice putting greens, practice teeing grounds, and teeing stations at driving ranges shall be designed and constructed so that a golf car can enter and exit the practice putting greens, practice teeing grounds, and teeing stations at driving ranges. + +239.1 General +Miniature golf facilities shall comply with 239. + +239.2 Minimum Number +At least 50 percent of holes on miniature golf courses shall comply with 1007.3. +Advisory 239.2 Minimum Number. Where possible, providing access to all holes on a miniature golf course is recommended. If a course is designed with the minimum 50 percent accessible holes, designers or operators are encouraged to select holes which provide for an equivalent experience to the maximum extent possible. + +239.3 Miniature Golf Course Configuration +Miniature golf courses shall be configured so that the holes complying with 1007.3 are consecutive. Miniature golf courses shall provide an accessible route from the last hole complying with 1007.3 to the course entrance or exit without requiring travel through any other holes on the course. +EXCEPTION: One break in the sequence of consecutive holes shall be permitted provided that the last hole on the miniature golf course is the last hole in the sequence. +Advisory 239.3 Miniature Golf Course Configuration. Where only the minimum 50 percent of the holes are accessible, an accessible route from the last accessible hole to the course exit or entrance must not require travel back through other holes. In some cases, this may require an additional accessible route. Other options include increasing the number of accessible holes in a way that limits the distance needed to connect the last accessible hole with the course exit or entrance. + +240.1 General +Play areas for children ages 2 and over shall comply with 240. Where separate play areas are provided within a site for specific age groups, each play area shall comply with 240. +EXCEPTIONS: 1. Play areas located in family child care facilities where the proprietor actually resides shall not be required to comply with 240. +2. In existing play areas, where play components are relocated for the purposes of creating safe use zones and the ground surface is not altered or extended for more than one use zone, the play area shall not be required to comply with 240. +3. Amusement attractions shall not be required to comply with 240. +4. Where play components are altered and the ground surface is not altered, the ground surface shall not be required to comply with 1008.2.6 unless required by 202.4. +Advisory 240.1 General. Play areas may be located on exterior sites or within a building. Where separate play areas are provided within a site for children in specified age groups (e.g., preschool (ages 2 to 5) and school age (ages 5 to 12)), each play area must comply with this section. Where play areas are provided for the same age group on a site but are geographically separated (e.g., one is located next to a picnic area and another is located next to a softball field), they are considered separate play areas and each play area must comply with this section. + +240.1.1 Additions +Where play areas are designed and constructed in phases, the requirements of 240 shall apply to each successive addition so that when the addition is completed, the entire play area complies with all the applicable requirements of 240. +Advisory 240.1.1 Additions. These requirements are to be applied so that when each successive addition is completed, the entire play area complies with all applicable provisions. For example, a play area is built in two phases. In the first phase, there are 10 elevated play components and 10 elevated play components are added in the second phase for a total of 20 elevated play components in the play area. When the first phase was completed, at least 5 elevated play components, including at least 3 different types, were to be provided on an accessible route. When the second phase is completed, at least 10 elevated play components must be located on an accessible route, and at least 7 ground level play components, including 4 different types, must be provided on an accessible route. At the time the second phase is complete, ramps must be used to connect at least 5 of the elevated play components and transfer systems are permitted to be used to connect the rest of the elevated play components required to be located on an accessible route. + +240.2 Play Components +Where provided, play components shall comply with 240.2. + +240.2.1 Ground Level Play Components +Ground level play components shall be provided in the number and types required by 240.2.1. Ground level play components that are provided to comply with 240.2.1.1 shall be permitted to satisfy the additional number required by 240.2.1.2 if the minimum required types of play components are satisfied. Where two or more required ground level play components are provided, they shall be dispersed throughout the play area and integrated with other play components. + +240.2.1.1 Minimum Number and Types +Where ground level play components are provided, at least one of each type shall be on an accessible route and shall comply with 1008.4. + +240.2.1.2 Additional Number and Types +Where elevated play components are provided, ground level play components shall be provided in accordance with Table 240.2.1.2 and shall comply with 1008.4. +EXCEPTION: If at least 50 percent of the elevated play components are connected by a ramp and at least 3 of the elevated play components connected by the ramp are different types of play components, the play area shall not be required to comply with 240.2.1.2. +Advisory 240.2.1.2 Additional Number and Types. Where a large play area includes two or more composite play structures designed for the same age group, the total number of elevated play components on all the composite play structures must be added to determine the additional number and types of ground level play components that must be provided on an accessible route. + +240.2.2 Elevated Play Components +Where elevated play components are provided, at least 50 percent shall be on an accessible route and shall comply with 1008.4. + +241 Saunas and Steam Rooms +241 General. Where provided, saunas and steam rooms shall comply with 612. +EXCEPTION: Where saunas or steam rooms are clustered at a single location, no more than 5 percent of the saunas and steam rooms, but no fewer than one, of each type in each cluster shall be required to comply with 612. + +242.1 General +Swimming pools, wading pools, and spas shall comply with 242. + +242.2 Swimming Pools +At least two accessible means of entry shall be provided for swimming pools. Accessible means of entry shall be swimming pool lifts complying with 1009.2; sloped entries complying with 1009.3; transfer walls complying with 1009.4; transfer systems complying with 1009.5; and pool stairs complying with 1009.6. At least one accessible means of entry provided shall comply with 1009.2 or 1009.3. +EXCEPTIONS: 1. Where a swimming pool has less than 300 linear feet (91 m) of swimming pool wall, no more than one accessible means of entry shall be required provided that the accessible means of entry is a swimming pool lift complying with 1009.2 or sloped entry complying with 1009.3. +2. Wave action pools, leisure rivers, sand bottom pools, and other pools where user access is limited to one area shall not be required to provide more than one accessible means of entry provided that the accessible means of entry is a swimming pool lift complying with 1009.2, a sloped entry complying with 1009.3, or a transfer system complying with 1009.5. +3. Catch pools shall not be required to provide an accessible means of entry provided that the catch pool edge is on an accessible route. + +242.3 Wading Pools +At least one accessible means of entry shall be provided for wading pools. Accessible means of entry shall comply with sloped entries complying with 1009.3. + +242.4 Spas +At least one accessible means of entry shall be provided for spas. Accessible means of entry shall comply with swimming pool lifts complying with 1009.2; transfer walls complying with 1009.4; or transfer systems complying with 1009.5. +EXCEPTION: Where spas are provided in a cluster, no more than 5 percent, but no fewer than one, spa in each cluster shall be required to comply with 242.4. + +243.1 General +Where shooting facilities with firing positions are designed and constructed at a site, at least 5 percent, but no fewer than one, of each type of firing position shall comply with 1010. + +301.1 Scope +The provisions of Chapter 3 shall apply where required by Chapter 2 or where referenced by a requirement in this document. + +302.1 General +Floor and ground surfaces shall be stable, firm, and slip resistant and shall comply with 302. +EXCEPTIONS: 1. Within animal containment areas, floor and ground surfaces shall not be required to be stable, firm, and slip resistant. +2. Areas of sport activity shall not be required to comply with 302. +Advisory 302.1 General. A stable surface is one that remains unchanged by contaminants or applied force, so that when the contaminant or force is removed, the surface returns to its original condition. A firm surface resists deformation by either indentations or particles moving on its surface. A slip-resistant surface provides sufficient frictional counterforce to the forces exerted in walking to permit safe ambulation. + +302.2 Carpet +Carpet or carpet tile shall be securely attached and shall have a firm cushion, pad, or backing or no cushion or pad. Carpet or carpet tile shall have a level loop, textured loop, level cut pile, or level cut/uncut pile texture. Pile height shall be ½ inch (13 mm) maximum. Exposed edges of carpet shall be fastened to floor surfaces and shall have trim on the entire length of the exposed edge. Carpet edge trim shall comply with 303. +Advisory 302.2 Carpet. Carpets and permanently affixed mats can significantly increase the amount of force (roll resistance) needed to propel a wheelchair over a surface. The firmer the carpeting and backing, the lower the roll resistance. A pile thickness up to ½ inch (13 mm) (measured to the backing, cushion, or pad) is allowed, although a lower pile provides easier wheelchair maneuvering. If a backing, cushion or pad is used, it must be firm. Preferably, carpet pad should not be used because the soft padding increases roll resistance. + +302.3 Openings +Openings in floor or ground surfaces shall not allow passage of a sphere more than ½ inch (13 mm) diameter except as allowed in 407.4.3, 409.4.3, 410.4, 810.5.3 and 810.10. Elongated openings shall be placed so that the long dimension is perpendicular to the dominant direction of travel. + +303.1 General +Where changes in level are permitted in floor or ground surfaces, they shall comply with 303. +EXCEPTIONS: 1. Animal containment areas shall not be required to comply with 303. +2. Areas of sport activity shall not be required to comply with 303. + +303.2 Vertical +Changes in level of ¼ inch (6.4 mm) high maximum shall be permitted to be vertical. + +303.3 Beveled +Changes in level between ¼ inch (6.4 mm) high minimum and ½ inch (13 mm) high maximum shall be beveled with a slope not steeper than 1:2. +Advisory 303.3 Beveled. A change in level of ½ inch (13 mm) is permitted to be ¼ inch (6.4 mm) vertical plus ¼ inch (6.4 mm) beveled. However, in no case may the combined change in level exceed ½ inch (13 mm). Changes in level exceeding ½ inch (13 mm) must comply with 405 (Ramps) or 406 (Curb Ramps). + +303.4 Ramps +Changes in level greater than ½ inch (13 mm) high shall be ramped, and shall comply with 405 or 406. + +304.1 General +Turning space shall comply with 304. + +304.2 Floor or Ground Surfaces +Floor or ground surfaces of a turning space shall comply with 302. Changes in level are not permitted. +EXCEPTION: Slopes not steeper than 1:48 shall be permitted. +Advisory 304.2 Floor or Ground Surface Exception. As used in this section, the phrase “changes in level” refers to surfaces with slopes and to surfaces with abrupt rise exceeding that permitted in Section 303.3. Such changes in level are prohibited in required clear floor and ground spaces, turning spaces, and in similar spaces where people using wheelchairs and other mobility devices must park their mobility aids such as in wheelchair spaces, or maneuver to use elements such as at doors, fixtures, and telephones. The exception permits slopes not steeper than 1:48. + +304.3 Size +Turning space shall comply with 304.3.1 or 304.3.2. + +304.3.1 Circular Space +The turning space shall be a space of 60 inches (1525 mm) diameter minimum. The space shall be permitted to include knee and toe clearance complying with 306. + +304.3.2 T-Shaped Space +The turning space shall be a T-shaped space within a 60 inch (1525 mm) square minimum with arms and base 36 inches (915 mm) wide minimum. Each arm of the T shall be clear of obstructions 12 inches (305 mm) minimum in each direction and the base shall be clear of obstructions 24 inches (610 mm) minimum. The space shall be permitted to include knee and toe clearance complying with 306 only at the end of either the base or one arm. + +304.4 Door Swing +Doors shall be permitted to swing into turning spaces. + +305.1 General +Clear floor or ground space shall comply with 305. + +305.2 Floor or Ground Surfaces +Floor or ground surfaces of a clear floor or ground space shall comply with 302. Changes in level are not permitted. +EXCEPTION: Slopes not steeper than 1:48 shall be permitted. + +305.3 Size +The clear floor or ground space shall be 30 inches (760 mm) minimum by 48 inches (1220 mm) minimum. + +305.4 Knee and Toe Clearance +Unless otherwise specified, clear floor or ground space shall be permitted to include knee and toe clearance complying with 306. + +305.5 Position +Unless otherwise specified, clear floor or ground space shall be positioned for either forward or parallel approach to an element. + +305.6 Approach +One full unobstructed side of the clear floor or ground space shall adjoin an accessible route or adjoin another clear floor or ground space. + +305.7 Maneuvering Clearance +Where a clear floor or ground space is located in an alcove or otherwise confined on all or part of three sides, additional maneuvering clearance shall be provided in accordance with 305.7.1 and 305.7.2. + +305.7.1 Forward Approach +Alcoves shall be 36 inches (915 mm)wide minimum where the depth exceeds 24 inches (610 mm). + +305.7.2 Parallel Approach +Alcoves shall be 60 inches (1525 mm) wide minimum where the depth exceeds 15 inches (380 mm). + +306.1 General +Where space beneath an element is included as part of clear floor or ground space or turning space, the space shall comply with 306. Additional space shall not be prohibited beneath an element but shall not be considered as part of the clear floor or ground space or turning space. +Advisory 306.1 General. Clearances are measured in relation to the usable clear floor space, not necessarily to the vertical support for an element. When determining clearance under an object for required turning or maneuvering space, care should be taken to ensure the space is clear of any obstructions. + +306.2.1 General +Space under an element between the finish floor or ground and 9 inches (230 mm) above the finish floor or ground shall be considered toe clearance and shall comply with 306.2. + +306.2.2 Maximum Depth +Toe clearance shall extend 25 inches (635 mm) maximum under an element. + +306.2.3 Minimum Required Depth +Where toe clearance is required at an element as part of a clear floor space, the toe clearance shall extend 17 inches (430 mm) minimum under the element. + +306.2.4 Additional Clearance +Space extending greater than 6 inches (150 mm) beyond the available knee clearance at 9 inches (230 mm) above the finish floor or ground shall not be considered toe clearance. + +306.2.5 Width +Toe clearance shall be 30 inches (760 mm) wide minimum. + +306.3.1 General +Space under an element between 9 inches (230 mm) and 27 inches (685 mm) above the finish floor or ground shall be considered knee clearance and shall comply with 306.3. + +306.3.2 Maximum Depth +Knee clearance shall extend 25 inches (635 mm) maximum under an element at 9 inches (230 mm) above the finish floor or ground. + +306.3.3 Minimum Required Depth +Where knee clearance is required under an element as part of a clear floor space, the knee clearance shall be 11 inches (280 mm) deep minimum at 9 inches (230 mm) above the finish floor or ground, and 8 inches (205 mm) deep minimum at 27 inches (685 mm) above the finish floor or ground. + +306.3.4 Clearance Reduction +Between 9 inches (230 mm) and 27 inches (685 mm) above the finish floor or ground, the knee clearance shall be permitted to reduce at a rate of 1 inch (25 mm) in depth for each 6 inches (150 mm) in height. + +306.3.5 Width +Knee clearance shall be 30 inches (760 mm) wide minimum. + +307.1 General +Protruding objects shall comply with 307. + +307.2 Protrusion Limits +Objects with leading edges more than 27 inches (685 mm) and not more than 80 inches (2030 mm) above the finish floor or ground shall protrude 4 inches (100 mm) maximum horizontally into the circulation path. +EXCEPTION: Handrails shall be permitted to protrude 4½ inches (115 mm) maximum. +Advisory 307.2 Protrusion Limits. When a cane is used and the element is in the detectable range, it gives a person sufficient time to detect the element with the cane before there is body contact. Elements located on circulation paths, including operable elements, must comply with requirements for protruding objects. For example, awnings and their supporting structures cannot reduce the minimum required vertical clearance. Similarly, casement windows, when open, cannot encroach more than 4 inches (100 mm) into circulation paths above 27 inches (685 mm). + +307.3 Post-Mounted Objects +Free-standing objects mounted on posts or pylons shall overhang circulation paths 12 inches (305 mm) maximum when located 27 inches (685 mm) minimum and 80 inches (2030 mm) maximum above the finish floor or ground. Where a sign or other obstruction is mounted between posts or pylons and the clear distance between the posts or pylons is greater than 12 inches (305 mm), the lowest edge of such sign or obstruction shall be 27 inches (685 mm) maximum or 80 inches (2030 mm) minimum above the finish floor or ground. +EXCEPTION: The sloping portions of handrails serving stairs and ramps shall not be required to comply with 307.3. + +307.4 Vertical Clearance +Vertical clearance shall be 80 inches (2030 mm) high minimum. Guardrails or other barriers shall be provided where the vertical clearance is less than 80 inches (2030 mm) high. The leading edge of such guardrail or barrier shall be located 27 inches (685 mm) maximum above the finish floor or ground. +EXCEPTION: Door closers and door stops shall be permitted to be 78 inches (1980 mm) minimum above the finish floor or ground. + +307.5 Required Clear Width +Protruding objects shall not reduce the clear width required for accessible routes. + +308.1 General +Reach ranges shall comply with 308. + +308.2.1 Unobstructed +Where a forward reach is unobstructed, the high forward reach shall be 48 inches (1220 mm) maximum and the low forward reach shall be 15 inches (380 mm) minimum above the finish floor or ground. + +308.2.2 Obstructed High Reach +Where a high forward reach is over an obstruction, the clear floor space shall extend beneath the element for a distance not less than the required reach depth over the obstruction. The high forward reach shall be 48 inches (1220 mm) maximum where the reach depth is 20 inches (510 mm) maximum. Where the reach depth exceeds 20 inches (510 mm), the high forward reach shall be 44 inches (1120 mm) maximum and the reach depth shall be 25 inches (635 mm) maximum. + +308.3.1 Unobstructed +Where a clear floor or ground space allows a parallel approach to an element and the side reach is unobstructed, the high side reach shall be 48 inches (1220 mm) maximum and the low side reach shall be 15 inches (380 mm) minimum above the finish floor or ground. +EXCEPTIONS: 1. An obstruction shall be permitted between the clear floor or ground space and the element where the depth of the obstruction is 10 inches (255 mm) maximum. +2. Operable parts of fuel dispensers shall be permitted to be 54 inches (1370 mm) maximum measured from the surface of the vehicular way where fuel dispensers are installed on existing curbs. + +308.3.2 Obstructed High Reach +Where a clear floor or ground space allows a parallel approach to an element and the high side reach is over an obstruction, the height of the obstruction shall be 34 inches (865 mm) maximum and the depth of the obstruction shall be 24 inches (610 mm) maximum. The high side reach shall be 48 inches (1220 mm) maximum for a reach depth of 10 inches (255 mm) maximum. Where the reach depth exceeds 10 inches (255 mm), the high side reach shall be 46 inches (1170 mm) maximum for a reach depth of 24 inches (610 mm) maximum. +EXCEPTIONS: 1. The top of washing machines and clothes dryers shall be permitted to be 36 inches (915 mm) maximum above the finish floor. +2. Operable parts of fuel dispensers shall be permitted to be 54 inches (1370 mm) maximum measured from the surface of the vehicular way where fuel dispensers are installed on existing curbs. + +309.1 General +Operable parts shall comply with 309. + +309.2 Clear Floor Space +A clear floor or ground space complying with 305 shall be provided. + +309.3 Height +Operable parts shall be placed within one or more of the reach ranges specified in 308. + +309.4 Operation +Operable parts shall be operable with one hand and shall not require tight grasping, pinching, or twisting of the wrist. The force required to activate operable parts shall be 5 pounds (22.2 N) maximum. +EXCEPTION: Gas pump nozzles shall not be required to provide operable parts that have an activating force of 5 pounds (22.2 N) maximum. + +401.1 Scope +The provisions of Chapter 4 shall apply where required by Chapter 2 or where referenced by a requirement in this document. + +402.1 General +Accessible routes shall comply with 402. + +402.2 Components +Accessible routes shall consist of one or more of the following components: walking surfaces with a running slope not steeper than 1:20, doorways, ramps, curb ramps excluding the flared sides, elevators, and platform lifts. All components of an accessible route shall comply with the applicable requirements of Chapter 4. +Advisory 402.2 Components. Walking surfaces must have running slopes not steeper than 1:20, see 403.3. Other components of accessible routes, such as ramps (405) and curb ramps (406), are permitted to be more steeply sloped. + +403.1 General +Walking surfaces that are a part of an accessible route shall comply with 403. + +403.2 Floor or Ground Surface +Floor or ground surfaces shall comply with 302. + +403.3 Slope +The running slope of walking surfaces shall not be steeper than 1:20. The cross slope of walking surfaces shall not be steeper than 1:48. + +403.4 Changes in Level +Changes in level shall comply with 303. + +403.5 Clearances +Walking surfaces shall provide clearances complying with 403.5. +EXCEPTION: Within employee work areas, clearances on common use circulation paths shall be permitted to be decreased by work area equipment provided that the decrease is essential to the function of the work being performed. + +403.5.1 Clear Width +Except as provided in 403.5.2 and 403.5.3, the clear width of walking surfaces shall be 36 inches (915 mm) minimum. +EXCEPTION: The clear width shall be permitted to be reduced to 32 inches (815 mm) minimum for a length of 24 inches (610 mm) maximum provided that reduced width segments are separated by segments that are 48 inches (1220 mm) long minimum and 36 inches (915 mm) wide minimum. + +403.5.2 Clear Width at Turn +Where the accessible route makes a 180 degree turn around an element which is less than 48 inches (1220 mm) wide, clear width shall be 42 inches (1065 mm) minimum approaching the turn, 48 inches (1220 mm) minimum at the turn and 42 inches (1065 mm) minimum leaving the turn. +EXCEPTION: Where the clear width at the turn is 60 inches (1525 mm) minimum compliance with 403.5.2 shall not be required. + +403.5.3 Passing Spaces +An accessible route with a clear width less than 60 inches (1525 mm) shall provide passing spaces at intervals of 200 feet (61 m) maximum. Passing spaces shall be either: a space 60 inches (1525 mm) minimum by 60 inches (1525 mm) minimum; or, an intersection of two walking surfaces providing a T-shaped space complying with 304.3.2 where the base and arms of the T-shaped space extend 48 inches (1220 mm) minimum beyond the intersection. + +403.6 Handrails +Where handrails are provided along walking surfaces with running slopes not steeper than 1:20 they shall comply with 505. +Advisory 403.6 Handrails. Handrails provided in elevator cabs and platform lifts are not required to comply with the requirements for handrails on walking surfaces. + +404.1 General +Doors, doorways, and gates that are part of an accessible route shall comply with 404. +EXCEPTION: Doors, doorways, and gates designed to be operated only by security personnel shall not be required to comply with 404.2.7, 404.2.8, 404.2.9, 404.3.2 and 404.3.4 through 404.3.7. +Advisory 404.1 General Exception. Security personnel must have sole control of doors that are eligible for the Exception at 404.1. It would not be acceptable for security personnel to operate the doors for people with disabilities while allowing others to have independent access. + +404.2 Manual Doors, Doorways, and Manual Gates +Manual doors and doorways and manual gates intended for user passage shall comply with 404.2. + +404.2.1 Revolving Doors, Gates, and Turnstiles +Revolving doors, revolving gates, and turnstiles shall not be part of an accessible route. + +404.2.2 Double-Leaf Doors and Gates +At least one of the active leaves of doorways with two leaves shall comply with 404.2.3 and 404.2.4. + +404.2.3 Clear Width +Door openings shall provide a clear width of 32 inches (815 mm) minimum. Clear openings of doorways with swinging doors shall be measured between the face of the door and the stop, with the door open 90 degrees. Openings more than 24 inches (610 mm) deep shall provide a clear opening of 36 inches (915 mm) minimum. There shall be no projections into the required clear opening width lower than 34 inches (865 mm) above the finish floor or ground. Projections into the clear opening width between 34 inches (865 mm) and 80 inches (2030 mm) above the finish floor or ground shall not exceed 4 inches (100 mm). +EXCEPTIONS: 1. In alterations, a projection of 5/8 inch (16 mm) maximum into the required clear width shall be permitted for the latch side stop. +2. Door closers and door stops shall be permitted to be 78 inches (1980 mm) minimum above the finish floor or ground. + +404.2.4 Maneuvering Clearances +Minimum maneuvering clearances at doors and gates shall comply with 404.2.4. Maneuvering clearances shall extend the full width of the doorway and the required latch side or hinge side clearance. +EXCEPTION: Entry doors to hospital patient rooms shall not be required to provide the clearance beyond the latch side of the door. + +404.2.4.1 Swinging Doors and Gates +Swinging doors and gates shall have maneuvering clearances complying with Table 404.2.4.1. +Table Legend: +Add 12 inches (305 mm) if closer and latch are provided. +Add 6 inches (150 mm) if closer and latch are provided. +Beyond hinge side. +Add 6 inches (150 mm) if closer is provided. + +404.2.4.2 Doorways without Doors or Gates, Sliding Doors, and Folding Doors +Doorways less than 36 inches (915 mm) wide without doors or gates, sliding doors, or folding doors shall have maneuvering clearances complying with Table 404.2.4.2. +Table legend: +Doorway with no door only. +Beyond pocket/hinge side. + +404.2.4.3 Recessed Doors and Gates +Maneuvering clearances for forward approach shall be provided when any obstruction within 18 inches (455 mm) of the latch side of a doorway projects more than 8 inches (205 mm) beyond the face of the door, measured perpendicular to the face of the door or gate. +Advisory 404.2.4.3 Recessed Doors and Gates. A door can be recessed due to wall thickness or because of the placement of casework and other fixed elements adjacent to the doorway. This provision must be applied wherever doors are recessed. + +404.2.4.4 Floor or Ground Surface +Floor or ground surface within required maneuvering clearances shall comply with 302. Changes in level are not permitted. +EXCEPTIONS: 1. Slopes not steeper than 1:48 shall be permitted. +2. Changes in level at thresholds complying with 404.2.5 shall be permitted. + +404.2.5 Thresholds +Thresholds, if provided at doorways, shall be 1/2 inch (13 mm) high maximum. Raised thresholds and changes in level at doorways shall comply with 302 and 303. +EXCEPTION: Existing or altered thresholds 3/4 inch (19 mm) high maximum that have a beveled edge on each side with a slope not steeper than 1:2 shall not be required to comply with 404.2.5. + +404.2.6 Doors in Series and Gates in Series +The distance between two hinged or pivoted doors in series and gates in series shall be 48 inches (1220 mm) minimum plus the width of doors or gates swinging into the space. + +404.2.7 Door and Gate Hardware +Handles, pulls, latches, locks, and other operable parts on doors and gates shall comply with 309.4. Operable parts of such hardware shall be 34 inches (865 mm) minimum and 48 inches (1220 mm) maximum above the finish floor or ground. Where sliding doors are in the fully open position, operating hardware shall be exposed and usable from both sides. +EXCEPTIONS: 1. Existing locks shall be permitted in any location at existing glazed doors without stiles, existing overhead rolling doors or grilles, and similar existing doors or grilles that are designed with locks that are activated only at the top or bottom rail. +2. Access gates in barrier walls and fences protecting pools, spas, and hot tubs shall be permitted to have operable parts of the release of latch on self-latching devices at 54 inches (1370 mm) maximum above the finish floor or ground provided the self-latching devices are not also self-locking devices and operated by means of a key, electronic opener, or integral combination lock. +Advisory 404.2.7 Door and Gate Hardware. Door hardware that can be operated with a closed fist or a loose grip accommodates the greatest range of users. Hardware that requires simultaneous hand and finger movements require greater dexterity and coordination, and is not recommended. + +404.2.8 Closing Speed +Door and gate closing speed shall comply with 404.2.8. + +404.2.8.1 Door Closers and Gate Closers +Door closers and gate closers shall be adjusted so that from an open position of 90 degrees, the time required to move the door to a position of 12 degrees from the latch is 5 seconds minimum. + +404.2.8.2 Spring Hinges +Door and gate spring hinges shall be adjusted so that from the open position of 70 degrees, the door or gate shall move to the closed position in 1.5 seconds minimum. + +404.2.9 Door and Gate Opening Force +Fire doors shall have a minimum opening force allowable by the appropriate administrative authority. The force for pushing or pulling open a door or gate other than fire doors shall be as follows: +Interior hinged doors and gates: 5 pounds (22.2 N) maximum. +Sliding or folding doors: 5 pounds (22.2 N) maximum. +These forces do not apply to the force required to retract latch bolts or disengage other devices that hold the door or gate in a closed position. +Advisory 404.2.9 Door and Gate Opening Force. The maximum force pertains to the continuous application of force necessary to fully open a door, not the initial force needed to overcome the inertia of the door. It does not apply to the force required to retract bolts or to disengage other devices used to keep the door in a closed position. + +404.2.10 Door and Gate Surfaces +Swinging door and gate surfaces within 10 inches (255 mm) of the finish floor or ground measured vertically shall have a smooth surface on the push side extending the full width of the door or gate. Parts creating horizontal or vertical joints in these surfaces shall be within 1/16 inch (1.6 mm) of the same plane as the other. Cavities created by added kick plates shall be capped. +EXCEPTIONS: 1. Sliding doors shall not be required to comply with 404.2.10. +2. Tempered glass doors without stiles and having a bottom rail or shoe with the top leading edge tapered at 60 degrees minimum from the horizontal shall not be required to meet the 10 inch (255 mm) bottom smooth surface height requirement. +3. Doors and gates that do not extend to within 10 inches (255 mm) of the finish floor or ground shall not be required to comply with 404.2.10. +4. Existing doors and gates without smooth surfaces within 10 inches (255 mm) of the finish floor or ground shall not be required to provide smooth surfaces complying with 404.2.10 provided that if added kick plates are installed, cavities created by such kick plates are capped. + +404.2.11 Vision Lights +Doors, gates, and side lights adjacent to doors or gates, containing one or more glazing panels that permit viewing through the panels shall have the bottom of at least one glazed panel located 43 inches (1090 mm) maximum above the finish floor. +EXCEPTION: Vision lights with the lowest part more than 66 inches (1675 mm) from the finish floor or ground shall not be required to comply with 404.2.11. + +404.3 Automatic and Power-Assisted Doors and Gates +Automatic doors and automatic gates shall comply with 404.3. Full-powered automatic doors shall comply with ANSI/BHMA A156.10 (incorporated by reference, see “Referenced Standards” in Chapter 1). Low-energy and power-assisted doors shall comply with ANSI/BHMA A156.19 (1997 or 2002 edition) (incorporated by reference, see “Referenced Standards” in Chapter 1). + +404.3.1 Clear Width +Doorways shall provide a clear opening of 32 inches (815 mm) minimum in power-on and power-off mode. The minimum clear width for automatic door systems in a doorway shall be based on the clear opening provided by all leaves in the open position. + +404.3.2 Maneuvering Clearance +Clearances at power-assisted doors and gates shall comply with 404.2.4. Clearances at automatic doors and gates without standby power and serving an accessible means of egress shall comply with 404.2.4. +EXCEPTION: Where automatic doors and gates remain open in the power-off condition, compliance with 404.2.4 shall not be required. + +404.3.3 Thresholds +Thresholds and changes in level at doorways shall comply with 404.2.5. + +404.3.4 Doors in Series and Gates in Series +Doors in series and gates in series shall comply with 404.2.6. + +404.3.5 Controls +Manually operated controls shall comply with 309. The clear floor space adjacent to the control shall be located beyond the arc of the door swing. + +404.3.6 Break Out Opening +Where doors and gates without standby power are a part of a means of egress, the clear break out opening at swinging or sliding doors and gates shall be 32 inches (815 mm) minimum when operated in emergency mode. +EXCEPTION: Where manual swinging doors and gates comply with 404.2 and serve the same means of egress compliance with 404.3.6 shall not be required. + +404.3.7 Revolving Doors, Revolving Gates, and Turnstiles +Revolving doors, revolving gates, and turnstiles shall not be part of an accessible route. + +405.1 General +Ramps on accessible routes shall comply with 405. +EXCEPTION: In assembly areas, aisle ramps adjacent to seating and not serving elements required to be on an accessible route shall not be required to comply with 405. + +405.2 Slope +Ramp runs shall have a running slope not steeper than 1:12. +EXCEPTION: In existing sites, buildings, and facilities, ramps shall be permitted to have running slopes steeper than 1:12 complying with Table 405.2 where such slopes are necessary due to space limitations. +Table Legend: 1. A slope steeper than 1:8 is prohibited. +Advisory 405.2 Slope. To accommodate the widest range of users, provide ramps with the least possible running slope and, wherever possible, accompany ramps with stairs for use by those individuals for whom distance presents a greater barrier than steps, e.g., people with heart disease or limited stamina. + +405.3 Cross Slope +Cross slope of ramp runs shall not be steeper than 1:48. +Advisory 405.3 Cross Slope. Cross slope is the slope of the surface perpendicular to the direction of travel. Cross slope is measured the same way as slope is measured (i.e., the rise over the run). + +405.4 Floor or Ground Surfaces +Floor or ground surfaces of ramp runs shall comply with 302. Changes in level other than the running slope and cross slope are not permitted on ramp runs. + +405.5 Clear Width +The clear width of a ramp run and, where handrails are provided, the clear width between handrails shall be 36 inches (915 mm) minimum. +EXCEPTION: Within employee work areas, the required clear width of ramps that are a part of common use circulation paths shall be permitted to be decreased by work area equipment provided that the decrease is essential to the function of the work being performed. + +405.6 Rise +The rise for any ramp run shall be 30 inches (760 mm) maximum. + +405.7 Landings +Ramps shall have landings at the top and the bottom of each ramp run. Landings shall comply with 405.7. +Advisory 405.7 Landings. Ramps that do not have level landings at changes in direction can create a compound slope that will not meet the requirements of this document. Circular or curved ramps continually change direction. Curvilinear ramps with small radii also can create compound cross slopes and cannot, by their nature, meet the requirements for accessible routes. A level landing is needed at the accessible door to permit maneuvering and simultaneously door operation. + +405.7.1 Slope +Landings shall comply with 302. Changes in level are not permitted. +EXCEPTION: Slopes not steeper than 1:48 shall be permitted. + +405.7.2 Width +The landing clear width shall be at least as wide as the widest ramp run leading to the landing. + +405.7.3 Length +The landing clear length shall be 60 inches (1525 mm) long minimum. + +405.7.4 Change in Direction +Ramps that change direction between runs at landings shall have a clear landing 60 inches (1525 mm) minimum by 60 inches (1525 mm) minimum. + +405.7.5 Doorways +Where doorways are located adjacent to a ramp landing, maneuvering clearances required by 404.2.4 and 404.3.2 shall be permitted to overlap the required landing area. + +405.8 Handrails +Ramp runs with a rise greater than 6 inches (150 mm) shall have handrails complying with 505. +EXCEPTION: Within employee work areas, handrails shall not be required where ramps that are part of common use circulation paths are designed to permit the installation of handrails complying with 505. Ramps not subject to the exception to 405.5 shall be designed to maintain a 36 inch (915 mm) minimum clear width when handrails are installed. + +405.9 Edge Protection +Edge protection complying with 405.9.1 or 405.9.2 shall be provided on each side of ramp runs and at each side of ramp landings. +EXCEPTIONS: 1. Edge protection shall not be required on ramps that are not required to have handrails and have sides complying with 406.3. +2. Edge protection shall not be required on the sides of ramp landings serving an adjoining ramp run or stairway. +3. Edge protection shall not be required on the sides of ramp landings having a vertical drop-off of 1/2 inch (13 mm) maximum within 10 inches (255 mm) horizontally of the minimum landing area specified in 405.7. + +405.9.1 Extended Floor or Ground Surface +The floor or ground surface of the ramp run or landing shall extend 12 inches (305 mm) minimum beyond the inside face of a handrail complying with 505. +Advisory 405.9.1 Extended Floor or Ground Surface. The extended surface prevents wheelchair casters and crutch tips from slipping off the ramp surface. + +405.9.2 Curb or Barrier +A curb or barrier shall be provided that prevents the passage of a 4 inch (100 mm) diameter sphere, where any portion of the sphere is within 4 inches (100 mm) of the finish floor or ground surface. + +405.10 Wet Conditions +Landings subject to wet conditions shall be designed to prevent the accumulation of water. + +406.1 General +Curb ramps on accessible routes shall comply with 406, 405.2 through 405.5, and 405.10. + +406.2 Counter Slope +Counter slopes of adjoining gutters and road surfaces immediately adjacent to the curb ramp shall not be steeper than 1:20. The adjacent surfaces at transitions at curb ramps to walks, gutters, and streets shall be at the same level. + +406.3 Sides of Curb Ramps +Where provided, curb ramp flares shall not be steeper than 1:10. + +406.4 Landings +Landings shall be provided at the tops of curb ramps. The landing clear length shall be 36 inches (915 mm) minimum. The landing clear width shall be at least as wide as the curb ramp, excluding flared sides, leading to the landing. +EXCEPTION: In alterations, where there is no landing at the top of curb ramps, curb ramp flares shall be provided and shall not be steeper than 1:12. + +406.5 Location +Curb ramps and the flared sides of curb ramps shall be located so that they do not project into vehicular traffic lanes, parking spaces, or parking access aisles. Curb ramps at marked crossings shall be wholly contained within the markings, excluding any flared sides. + +406.6 Diagonal Curb Ramps +Diagonal or corner type curb ramps with returned curbs or other well-defined edges shall have the edges parallel to the direction of pedestrian flow. The bottom of diagonal curb ramps shall have a clear space 48 inches (1220 mm) minimum outside active traffic lanes of the roadway. Diagonal curb ramps provided at marked crossings shall provide the 48 inches (1220 mm) minimum clear space within the markings. Diagonal curb ramps with flared sides shall have a segment of curb 24 inches (610 mm) long minimum located on each side of the curb ramp and within the marked crossing. + +406.7 Islands +Raised islands in crossings shall be cut through level with the street or have curb ramps at both sides. Each curb ramp shall have a level area 48 inches (1220 mm) long minimum by 36 inches (915 mm) wide minimum at the top of the curb ramp in the part of the island intersected by the crossings. Each 48 inch (1220 mm) minimum by 36 inch (915 mm) minimum area shall be oriented so that the 48 inch (1220 mm) minimum length is in the direction of the running slope of the curb ramp it serves. The 48 inch (1220 mm) minimum by 36 inch (915 mm) minimum areas and the accessible route shall be permitted to overlap. + +406.8 Detectable Warnings. +Note to Reader:  The Department of Transportation’s ADA standards require detectable warnings on curb ramps: +A curb ramp shall have a detectable warning complying with 705. +The detectable warning shall extend the full width of the curb ramp (exclusive of flared sides) and shall extend either the full depth of the curb ramp or 24 inches (610 mm) deep minimum measured from the back of the curb on the ramp surface. + +407.1 General +Elevators shall comply with 407 and with ASME A17.1 (incorporated by reference, see “Referenced Standards” in Chapter 1). They shall be passenger elevators as classified by ASME A17.1. Elevator operation shall be automatic. +Advisory 407.1 General. The ADA and other Federal civil rights laws require that accessible features be maintained in working order so that they are accessible to and usable by those people they are intended to benefit. Building owners should note that the ASME Safety Code for Elevators and Escalators requires routine maintenance and inspections. Isolated or temporary interruptions in service due to maintenance or repairs may be unavoidable; however, failure to take prompt action to effect repairs could constitute a violation of Federal laws and these requirements. + +407.2 Elevator Landing Requirements +Elevator landings shall comply with 407.2. + +407.2.1 Call Controls +Where elevator call buttons or keypads are provided, they shall comply with 407.2.1 and 309.4. Call buttons shall be raised or flush. +EXCEPTION: Existing elevators shall be permitted to have recessed call buttons. + +407.2.1.1 Height +Call buttons and keypads shall be located within one of the reach ranges specified in 308, measured to the centerline of the highest operable part. +EXCEPTION: Existing call buttons and existing keypads shall be permitted to be located at 54 inches (1370 mm) maximum above the finish floor, measured to the centerline of the highest operable part. + +407.2.1.2 Size +Call buttons shall be 3/4 inch (19 mm) minimum in the smallest dimension. +EXCEPTION: Existing elevator call buttons shall not be required to comply with 407.2.1.2. + +407.2.1.3 Clear Floor or Ground Space +A clear floor or ground space complying with 305 shall be provided at call controls. +Advisory 407.2.1.3 Clear Floor or Ground Space. The clear floor or ground space required at elevator call buttons must remain free of obstructions including ashtrays, plants, and other decorative elements that prevent wheelchair users and others from reaching the call buttons. The height of the clear floor or ground space is considered to be a volume from the floor to 80 inches (2030 mm) above the floor. Recessed ashtrays should not be placed near elevator call buttons so that persons who are blind or visually impaired do not inadvertently contact them or their contents as they reach for the call buttons. + +407.2.1.4 Location +The call button that designates the up direction shall be located above the call button that designates the down direction. +EXCEPTION: Destination-oriented elevators shall not be required to comply with 407.2.1.4. +Advisory 407.2.1.4 Location Exception. A destination-oriented elevator system provides lobby controls enabling passengers to select floor stops, lobby indicators designating which elevator to use, and a car indicator designating the floors at which the car will stop. Responding cars are programmed for maximum efficiency by reducing the number of stops any passenger experiences. + +407.2.1.5 Signals +Call buttons shall have visible signals to indicate when each call is registered and when each call is answered. +EXCEPTIONS: 1. Destination-oriented elevators shall not be required to comply with 407.2.1.5 provided that visible and audible signals complying with 407.2.2 indicating which elevator car to enter are provided. +2. Existing elevators shall not be required to comply with 407.2.1.5. + +407.2.1.6 Keypads +Where keypads are provided, keypads shall be in a standard telephone keypad arrangement and shall comply with 407.4.7.2. + +407.2.2 Hall Signals +Hall signals, including in-car signals, shall comply with 407.2.2. + +407.2.2.1 Visible and Audible Signals +A visible and audible signal shall be provided at each hoistway entrance to indicate which car is answering a call and the car’s direction of travel. Where in-car signals are provided, they shall be visible from the floor area adjacent to the hall call buttons. +EXCEPTIONS: 1. Visible and audible signals shall not be required at each destination-oriented elevator where a visible and audible signal complying with 407.2.2 is provided indicating the elevator car designation information. +2. In existing elevators, a signal indicating the direction of car travel shall not be required. + +407.2.2.2 Visible Signals +Visible signal fixtures shall be centered at 72 inches (1830 mm) minimum above the finish floor or ground. The visible signal elements shall be 2 1/2 inches (64 mm) minimum measured along the vertical centerline of the element. Signals shall be visible from the floor area adjacent to the hall call button. +EXCEPTIONS: 1. Destination-oriented elevators shall be permitted to have signals visible from the floor area adjacent to the hoistway entrance. +2. Existing elevators shall not be required to comply with 407.2.2.2. + +407.2.2.3 Audible Signals +Audible signals shall sound once for the up direction and twice for the down direction, or shall have verbal annunciators that indicate the direction of elevator car travel. Audible signals shall have a frequency of 1500 Hz maximum. Verbal annunciators shall have a frequency of 300 Hz minimum and 3000 Hz maximum. The audible signal and verbal annunciator shall be 10 dB minimum above ambient, but shall not exceed 80 dB, measured at the hall call button. +EXCEPTIONS: 1. Destination-oriented elevators shall not be required to comply with 407.2.2.3 provided that the audible tone and verbal announcement is the same as those given at the call button or call button keypad. +2. Existing elevators shall not be required to comply with the requirements for frequency and dB range of audible signals. + +407.2.2.4 Differentiation +Each destination-oriented elevator in a bank of elevators shall have audible and visible means for differentiation. + +407.2.3 Hoistway Signs +Signs at elevator hoistways shall comply with 407.2.3. + +407.2.3.1 Floor Designation +Floor designations complying with 703.2 and 703.4.1 shall be provided on both jambs of elevator hoistway entrances. Floor designations shall be provided in both tactile characters and braille. Tactile characters shall be 2 inches (51 mm) high minimum. A tactile star shall be provided on both jambs at the main entry level. + +407.2.3.2 Car Designations +Destination-oriented elevators shall provide tactile car identification complying with 703.2 on both jambs of the hoistway immediately below the floor designation. Car designations shall be provided in both tactile characters and braille. Tactile characters shall be 2 inches (51 mm) high minimum. + +407.3 Elevator Door Requirements +Hoistway and car doors shall comply with 407.3. + +407.3.1 Type +Elevator doors shall be the horizontal sliding type. Car gates shall be prohibited. + +407.3.2 Operation +Elevator hoistway and car doors shall open and close automatically. +EXCEPTION: Existing manually operated hoistway swing doors shall be permitted provided that they comply with 404.2.3 and 404.2.9. Car door closing shall not be initiated until the hoistway door is closed. + +407.3.3 Reopening Device +Elevator doors shall be provided with a reopening device complying with 407.3.3 that shall stop and reopen a car door and hoistway door automatically if the door becomes obstructed by an object or person. +EXCEPTION: Existing elevators with manually operated doors shall not be required to comply with 407.3.3. + +407.3.3.1 Height +The device shall be activated by sensing an obstruction passing through the opening at 5 inches (125 mm) nominal and 29 inches (735 mm) nominal above the finish floor. + +407.3.3.2 Contact +The device shall not require physical contact to be activated, although contact is permitted to occur before the door reverses. + +407.3.3.3 Duration +Door reopening devices shall remain effective for 20 seconds minimum. + +407.3.4 Door and Signal Timing +The minimum acceptable time from notification that a car is answering a call or notification of the car assigned at the means for the entry of destination information until the doors of that car start to close shall be calculated from the following equation: +T = D/(1.5 ft/s) or T = D/(455 mm/s) = 5 seconds minimum where T equals the total time in seconds and D equals the distance (in feet or millimeters) from the point in the lobby or corridor 60 inches (1525 mm) directly in front of the farthest call button controlling that car to the centerline of its hoistway door. +EXCEPTIONS: 1. For cars with in-car lanterns, T shall be permitted to begin when the signal is visible from the point 60 inches (1525 mm) directly in front of the farthest hall call button and the audible signal is sounded. +2. Destination-oriented elevators shall not be required to comply with 407.3.4. + +407.3.5 Door Delay +Elevator doors shall remain fully open in response to a car call for 3 seconds minimum. + +407.3.6 Width +The width of elevator doors shall comply with Table 407.4.1. +EXCEPTION: In existing elevators, a power-operated car door complying with 404.2.3 shall be permitted. + +407.4 Elevator Car Requirements +Elevator cars shall comply with 407.4. + +407.4.1 Car Dimensions +Inside dimensions of elevator cars and clear width of elevator doors shall comply with Table 407.4.1. +EXCEPTION: Existing elevator car configurations that provide a clear floor area of 16 square feet (1.5 square meters) minimum and also provide an inside clear depth 54 inches (1370 mm) minimum and a clear width 36 inches (915 mm) minimum shall be permitted. +Table legend: +A tolerance of minus 5/8 inch (16 mm) is permitted. +Other car configurations that provide a turning space complying with 304 with the door closed shall be permitted. + +407.4.2 Floor Surfaces +Floor surfaces in elevator cars shall comply with 302 and 303. + +407.4.3 Platform to Hoistway Clearance +The clearance between the car platform sill and the edge of any hoistway landing shall be 1 1/4 inch (32 mm) maximum. + +407.4.4 Leveling +Each car shall be equipped with a self-leveling feature that will automatically bring and maintain the car at floor landings within a tolerance of 1/2 inch (13 mm) under rated loading to zero loading conditions. + +407.4.5 Illumination +The level of illumination at the car controls, platform, car threshold and car landing sill shall be 5 foot candles (54 lux) minimum. + +407.4.6 Elevator Car Controls +Where provided, elevator car controls shall comply with 407.4.6 and 309.4. +EXCEPTION: In existing elevators, where a new car operating panel complying with 407.4.6 is provided, existing car operating panels shall not be required to comply with 407.4.6. + +407.4.6.1 Location +Controls shall be located within one of the reach ranges specified in 308. +EXCEPTIONS: 1. Where the elevator panel serves more than 16 openings and a parallel approach is provided, buttons with floor designations shall be permitted to be 54 inches (1370 mm) maximum above the finish floor. +2. In existing elevators, car control buttons with floor designations shall be permitted to be located 54 inches (1370 mm) maximum above the finish floor where a parallel approach is provided. + +407.4.6.2 Buttons +Car control buttons with floor designations shall comply with 407.4.6.2 and shall be raised or flush. +EXCEPTION: In existing elevators, buttons shall be permitted to be recessed. + +407.4.6.2.1 Size. +Buttons shall be 3/4 inch (19 mm) minimum in their smallest dimension. + +407.4.6.2.2 Arrangement. +Buttons shall be arranged with numbers in ascending order. When two or more columns of buttons are provided they shall read from left to right. + +407.4.6.3 Keypads +Car control keypads shall be in a standard telephone keypad arrangement and shall comply with 407.4.7.2. + +407.4.6.4 Emergency Controls +Emergency controls shall comply with 407.4.6.4. + +407.4.6.4.1 Height. +Emergency control buttons shall have their centerlines 35 inches (890 mm) minimum above the finish floor. + +407.4.6.4.2 Location. +Emergency controls, including the emergency alarm, shall be grouped at the bottom of the panel. + +407.4.7 Designations and Indicators of Car Controls +Designations and indicators of car controls shall comply with 407.4.7. +EXCEPTION: In existing elevators, where a new car operating panel complying with 407.4.7 is provided, existing car operating panels shall not be required to comply with 407.4.7. + +407.4.7.1 Buttons +Car control buttons shall comply with 407.4.7.1. + +407.4.7.1.1 Type. +Control buttons shall be identified by tactile characters complying with 703.2. + +407.4.7.1.2 Location. +Raised character and braille designations shall be placed immediately to the left of the control button to which the designations apply. +EXCEPTION: Where space on an existing car operating panel precludes tactile markings to the left of the controls, markings shall be placed as near to the control as possible. + +407.4.7.1.3 Symbols. +The control button for the emergency stop, alarm, door open, door close, main entry floor, and phone, shall be identified with tactile symbols as shown in Table 407.4.7.1.3. + +407.4.7.1.4 Visible Indicators. +Buttons with floor designations shall be provided with visible indicators to show that a call has been registered. The visible indication shall extinguish when the car arrives at the designated floor. + +407.4.7.2 Keypads +Keypads shall be identified by characters complying with 703.5 and shall be centered on the corresponding keypad button. The number five key shall have a single raised dot. The dot shall be 0.118 inch (3 mm) to 0.120 inch (3.05 mm) base diameter and in other aspects comply with Table 703.3.1. + +407.4.8 Car Position Indicators +Audible and visible car position indicators shall be provided in elevator cars. + +407.4.8.1 Visible Indicators +Visible indicators shall comply with 407.4.8.1. + +407.4.8.1.1 Size. +Characters shall be 1/2 inch (13 mm) high minimum. + +407.4.8.1.2 Location. +Indicators shall be located above the car control panel or above the door. + +407.4.8.1.3 Floor Arrival. +As the car passes a floor and when a car stops at a floor served by the elevator, the corresponding character shall illuminate. +EXCEPTION: Destination-oriented elevators shall not be required to comply with 407.4.8.1.3 provided that the visible indicators extinguish when the call has been answered. + +407.4.8.1.4 Destination Indicator. +In destination-oriented elevators, a display shall be provided in the car with visible indicators to show car destinations. + +407.4.8.2 Audible Indicators +Audible indicators shall comply with 407.4.8.2. + +407.4.8.2.1 Signal Type. +The signal shall be an automatic verbal annunciator which announces the floor at which the car is about to stop. +EXCEPTION: For elevators other than destination-oriented elevators that have a rated speed of 200 feet per minute (1 m/s) or less, a non-verbal audible signal with a frequency of 1500 Hz maximum which sounds as the car passes or is about to stop at a floor served by the elevator shall be permitted. + +407.4.8.2.2 Signal Level. +The verbal annunciator shall be 10 dB minimum above ambient, but shall not exceed 80 dB, measured at the annunciator. + +407.4.8.2.3 Frequency. +The verbal annunciator shall have a frequency of 300 Hz minimum to 3000 Hz maximum. + +407.4.9 Emergency Communication +Emergency two-way communication systems shall comply with 308. Tactile symbols and characters shall be provided adjacent to the device and shall comply with 703.2. + +408.1 General +Limited-use/limited-application elevators shall comply with 408 and with ASME A17.1 (incorporated by reference, see “Referenced Standards” in Chapter 1). They shall be passenger elevators as classified by ASME A17.1. Elevator operation shall be automatic. + +408.2 Elevator Landings +Landings serving limited-use/limited-application elevators shall comply with 408.2. + +408.2.1 Call Buttons +Elevator call buttons and keypads shall comply with 407.2.1. + +408.2.2 Hall Signals +Hall signals shall comply with 407.2.2. + +408.2.3 Hoistway Signs +Signs at elevator hoistways shall comply with 407.2.3.1. + +408.3 Elevator Doors +Elevator hoistway doors shall comply with 408.3. + +408.3.1 Sliding Doors +Sliding hoistway and car doors shall comply with 407.3.1 through 407.3.3 and 408.4.1. + +408.3.2 Swinging Doors +Swinging hoistway doors shall open and close automatically and shall comply with 404, 407.3.2 and 408.3.2. + +408.3.2.1 Power Operation +Swinging doors shall be power-operated and shall comply with ANSI/BHMA A156.19 (1997 or 2002 edition) (incorporated by reference, see “Referenced Standards” in Chapter 1). + +408.3.2.2 Duration +Power-operated swinging doors shall remain open for 20 seconds minimum when activated. + +408.4 Elevator Cars +Elevator cars shall comply with 408.4. + +408.4.1 Car Dimensions and Doors +Elevator cars shall provide a clear width 42 inches (1065 mm) minimum and a clear depth 54 inches (1370 mm) minimum. Car doors shall be positioned at the narrow ends of cars and shall provide 32 inches (815 mm) minimum clear width. +EXCEPTIONS: 1. Cars that provide a clear width 51 inches (1295 mm) minimum shall be permitted to provide a clear depth 51 inches (1295 mm) minimum provided that car doors provide a clear opening 36 inches (915 mm) wide minimum. +2. Existing elevator cars shall be permitted to provide a clear width 36 inches (915 mm) minimum, clear depth 54 inches (1370 mm) minimum, and a net clear platform area 15 square feet (1.4 square meters) minimum. + +408.4.2 Floor Surfaces +Floor surfaces in elevator cars shall comply with 302 and 303. + +408.4.3 Platform to Hoistway Clearance +The platform to hoistway clearance shall comply with 407.4.3. + +408.4.4 Leveling +Elevator car leveling shall comply with 407.4.4. + +408.4.5 Illumination +Elevator car illumination shall comply with 407.4.5. + +408.4.6 Car Controls +Elevator car controls shall comply with 407.4.6. Control panels shall be centered on a side wall. + +408.4.7 Designations and Indicators of Car Controls +Designations and indicators of car controls shall comply with 407.4.7. + +408.4.8 Emergency Communications +Car emergency signaling devices complying with 407.4.9 shall be provided. + +409.1 General +Private residence elevators that are provided within a residential dwelling unit required to provide mobility features complying with 809.2 through 809.4 shall comply with 409 and with ASME A17.1 (incorporated by reference, see “Referenced Standards” in Chapter 1). They shall be passenger elevators as classified by ASME A17.1. Elevator operation shall be automatic. + +409.2 Call Buttons +Call buttons shall be 3/4 inch (19 mm) minimum in the smallest dimension and shall comply with 309. + +409.3 Elevator Doors +Hoistway doors, car doors, and car gates shall comply with 409.3 and 404. +EXCEPTION: Doors shall not be required to comply with the maneuvering clearance requirements in 404.2.4.1 for approaches to the push side of swinging doors. + +409.3.1 Power Operation +Elevator car and hoistway doors and gates shall be power operated and shall comply with ANSI/BHMA A156.19 (1997 or 2002 edition) (incorporated by reference, see “Referenced Standards” in Chapter 1). Power operated doors and gates shall remain open for 20 seconds minimum when activated. +EXCEPTION: In elevator cars with more than one opening, hoistway doors and gates shall be permitted to be of the manual-open, self-close type. + +409.3.2 Location +Elevator car doors or gates shall be positioned at the narrow end of the clear floor spaces required by 409.4.1. + +409.4 Elevator Cars +Private residence elevator cars shall comply with 409.4. + +409.4.1 Inside Dimensions of Elevator Cars +Elevator cars shall provide a clear floor space of 36 inches (915 mm) minimum by 48 inches (1220 mm) minimum and shall comply with 305. + +409.4.2 Floor Surfaces +Floor surfaces in elevator cars shall comply with 302 and 303. + +409.4.3 Platform to Hoistway Clearance +The clearance between the car platform and the edge of any landing sill shall be 1 1/2 inch (38 mm) maximum. + +409.4.4 Leveling +Each car shall automatically stop at a floor landing within a tolerance of 1/2 inch (13 mm) under rated loading to zero loading conditions. + +409.4.5 Illumination Levels +Elevator car illumination shall comply with 407.4.5. + +409.4.6 Car Controls +Elevator car control buttons shall comply with 409.4.6, 309.3, 309.4, and shall be raised or flush. + +409.4.6.1 Size +Control buttons shall be 3/4 inch (19 mm) minimum in their smallest dimension. + +409.4.6.2 Location +Control panels shall be on a side wall, 12 inches (305 mm) minimum from any adjacent wall. + +409.4.7 Emergency Communications +Emergency two-way communication systems shall comply with 409.4.7. + +409.4.7.1 Type +A telephone and emergency signal device shall be provided in the car. + +409.4.7.2 Operable Parts +The telephone and emergency signaling device shall comply with 309.3 and 309.4. + +409.4.7.3 Compartment +If the telephone or device is in a closed compartment, the compartment door hardware shall comply with 309. + +409.4.7.4 Cord +The telephone cord shall be 29 inches (735 mm) long minimum. + +410.1 General +Platform lifts shall comply with ASME A18.1 (1999 edition or 2003 edition) (incorporated by reference, see “Referenced Standards” in Chapter 1). Platform lifts shall not be attendant-operated and shall provide unassisted entry and exit from the lift. + +410.2 Floor Surfaces +Floor surfaces in platform lifts shall comply with 302 and 303. + +410.3 Clear Floor Space +Clear floor space in platform lifts shall comply with 305. + +410.4 Platform to Runway Clearance +The clearance between the platform sill and the edge of any runway landing shall be 1 1/4 inch (32 mm) maximum. + +410.5 Operable Parts +Controls for platform lifts shall comply with 309. + +410.6 Doors and Gates +Platform lifts shall have low-energy power-operated doors or gates complying with 404.3. Doors shall remain open for 20 seconds minimum. End doors and gates shall provide a clear width 32 inches (815 mm) minimum. Side doors and gates shall provide a clear width 42 inches (1065 mm) minimum. +EXCEPTION: Platform lifts serving two landings maximum and having doors or gates on opposite sides shall be permitted to have self-closing manual doors or gates. + +501.1 Scope +The provisions of Chapter 5 shall apply where required by Chapter 2 or where referenced by a requirement in this document. + +502.1 General +Car and van parking spaces shall comply with 502. Where parking spaces are marked with lines, width measurements of parking spaces and access aisles shall be made from the centerline of the markings. +EXCEPTION: Where parking spaces or access aisles are not adjacent to another parking space or access aisle, measurements shall be permitted to include the full width of the line defining the parking space or access aisle. + +502.2 Vehicle Spaces +Car parking spaces shall be 96 inches (2440 mm) wide minimum and van parking spaces shall be 132 inches (3350 mm) wide minimum, shall be marked to define the width, and shall have an adjacent access aisle complying with 502.3. +EXCEPTION: Van parking spaces shall be permitted to be 96 inches (2440 mm) wide minimum where the access aisle is 96 inches (2440 mm) wide minimum. + +502.3 Access Aisle +Access aisles serving parking spaces shall comply with 502.3. Access aisles shall adjoin an accessible route. Two parking spaces shall be permitted to share a common access aisle. +Advisory 502.3 Access Aisle. Accessible routes must connect parking spaces to accessible entrances. In parking facilities where the accessible route must cross vehicular traffic lanes, marked crossings enhance pedestrian safety, particularly for people using wheelchairs and other mobility aids. Where possible, it is preferable that the accessible route not pass behind parked vehicles. + +502.3.1 Width +Access aisles serving car and van parking spaces shall be 60 inches (1525 mm) wide minimum. + +502.3.2 Length +Access aisles shall extend the full length of the parking spaces they serve. + +502.3.3 Marking +Access aisles shall be marked so as to discourage parking in them. +Advisory 502.3.3 Marking. The method and color of marking are not specified by these requirements but may be addressed by State or local laws or regulations. Because these requirements permit the van access aisle to be as wide as a parking space, it is important that the aisle be clearly marked. + +502.3.4 Location +Access aisles shall not overlap the vehicular way. Access aisles shall be permitted to be placed on either side of the parking space except for angled van parking spaces which shall have access aisles located on the passenger side of the parking spaces. +Advisory 502.3.4 Location. Wheelchair lifts typically are installed on the passenger side of vans. Many drivers, especially those who operate vans, find it more difficult to back into parking spaces than to back out into comparatively unrestricted vehicular lanes. For this reason, where a van and car share an access aisle, consider locating the van space so that the access aisle is on the passenger side of the van space. + +502.4 Floor or Ground Surfaces +Parking spaces and access aisles serving them shall comply with 302. Access aisles shall be at the same level as the parking spaces they serve. Changes in level are not permitted. +EXCEPTION: Slopes not steeper than 1:48 shall be permitted. +Advisory 502.4 Floor or Ground Surfaces. Access aisles are required to be nearly level in all directions to provide a surface for wheelchair transfer to and from vehicles. The exception allows sufficient slope for drainage. Built-up curb ramps are not permitted to project into access aisles and parking spaces because they would create slopes greater than 1:48. + +502.5 Vertical Clearance +Parking spaces for vans and access aisles and vehicular routes serving them shall provide a vertical clearance of 98 inches (2490 mm) minimum. +Advisory 502.5 Vertical Clearance. Signs provided at entrances to parking facilities informing drivers of clearances and the location of van accessible parking spaces can provide useful customer assistance. + +502.6 Identification +Parking space identification signs shall include the International Symbol of Accessibility complying with 703.7.2.1. Signs identifying van parking spaces shall contain the designation “van accessible.” Signs shall be 60 inches (1525 mm) minimum above the finish floor or ground surface measured to the bottom of the sign. +Advisory 502.6 Identification. The required “van accessible” designation is intended to be informative, not restrictive, in identifying those spaces that are better suited for van use. Enforcement of motor vehicle laws, including parking privileges, is a local matter. + +502.7 Relationship to Accessible Routes +Parking spaces and access aisles shall be designed so that cars and vans, when parked, cannot obstruct the required clear width of adjacent accessible routes. +Advisory 502.7 Relationship to Accessible Routes. Wheel stops are an effective way to prevent vehicle overhangs from reducing the clear width of accessible routes. + +503.1 General +Passenger loading zones shall comply with 503. + +503.2 Vehicle Pull-Up Space +Passenger loading zones shall provide a vehicular pull-up space 96 inches (2440 mm) wide minimum and 20 feet (6100 mm) long minimum. + +503.3 Access Aisle +Passenger loading zones shall provide access aisles complying with 503 adjacent to the vehicle pull-up space. Access aisles shall adjoin an accessible route and shall not overlap the vehicular way. + +503.3.1 Width +Access aisles serving vehicle pull-up spaces shall be 60 inches (1525 mm) wide minimum. + +503.3.2 Length +Access aisles shall extend the full length of the vehicle pull-up spaces they serve. + +503.3.3 Marking +Access aisles shall be marked so as to discourage parking in them. + +503.4 Floor and Ground Surfaces +Vehicle pull-up spaces and access aisles serving them shall comply with 302. Access aisles shall be at the same level as the vehicle pull-up space they serve. Changes in level are not permitted. +EXCEPTION: Slopes not steeper than 1:48 shall be permitted. + +503.5 Vertical Clearance +Vehicle pull-up spaces, access aisles serving them, and a vehicular route from an entrance to the passenger loading zone, and from the passenger loading zone to a vehicular exit shall provide a vertical clearance of 114 inches (2895 mm) minimum. + +504.1 General +Stairs shall comply with 504. + +504.2 Treads and Risers +All steps on a flight of stairs shall have uniform riser heights and uniform tread depths. Risers shall be 4 inches (100 mm) high minimum and 7 inches (180 mm) high maximum. Treads shall be 11 inches (280 mm) deep minimum. + +504.3 Open Risers +Open risers are not permitted. + +504.4 Tread Surface +Stair treads shall comply with 302. Changes in level are not permitted. +EXCEPTION: Treads shall be permitted to have a slope not steeper than 1:48. +Advisory 504.4 Tread Surface. Consider providing visual contrast on tread nosings, or at the leading edges of treads without nosings, so that stair treads are more visible for people with low vision. + +504.5 Nosings +The radius of curvature at the leading edge of the tread shall be ½ inch (13 mm) maximum. Nosings that project beyond risers shall have the underside of the leading edge curved or beveled. Risers shall be permitted to slope under the tread at an angle of 30 degrees maximum from vertical. The permitted projection of the nosing shall extend 1½ (38 mm) maximum over the tread below. + +504.6 Handrails +Stairs shall have handrails complying with 505. + +504.7 Wet Conditions +Stair treads and landings subject to wet conditions shall be designed to prevent the accumulation of water. + +505.1 General +Handrails provided along walking surfaces complying with 403, required at ramps complying with 405, and required at stairs complying with 504 shall comply with 505. +Advisory 505.1 General. Handrails are required on ramp runs with a rise greater than 6 inches (150 mm) (see 405.8) and on certain stairways (see 504). Handrails are not required on walking surfaces with running slopes less than 1:20. However, handrails are required to comply with 505 when they are provided on walking surfaces with running slopes less than 1:20 (see 403.6). Sections 505.2, 505.3, and 505.10 do not apply to handrails provided on walking surfaces with running slopes less than 1:20 as these sections only reference requirements for ramps and stairs. + +505.2 Where Required +Handrails shall be provided on both sides of stairs and ramps. +EXCEPTION: In assembly areas, handrails shall not be required on both sides of aisle ramps where a handrail is provided at either side or within the aisle width. + +505.3 Continuity +Handrails shall be continuous within the full length of each stair flight or ramp run. Inside handrails on switchback or dogleg stairs and ramps shall be continuous between flights or runs. +EXCEPTION: In assembly areas, handrails on ramps shall not be required to be continuous in aisles serving seating. + +505.4 Height +Top of gripping surfaces of handrails shall be 34 inches (865 mm) minimum and 38 inches (965 mm) maximum vertically above walking surfaces, stair nosings, and ramp surfaces. Handrails shall be at a consistent height above walking surfaces, stair nosings, and ramp surfaces. +Advisory 505.4 Height. The requirements for stair and ramp handrails in this document are for adults. When children are the principal users in a building or facility (e.g., elementary schools), a second set of handrails at an appropriate height can assist them and aid in preventing accidents. A maximum height of 28 inches (710 mm) measured to the top of the gripping surface from the ramp surface or stair nosing is recommended for handrails designed for children. Sufficient vertical clearance between upper and lower handrails, 9 inches (230 mm) minimum, should be provided to help prevent entrapment. + +505.5 Clearance +Clearance between handrail gripping surfaces and adjacent surfaces shall be 1½ inches (38 mm) minimum. + +505.6 Gripping Surface +Handrail gripping surfaces shall be continuous along their length and shall not be obstructed along their tops or sides. The bottoms of handrail gripping surfaces shall not be obstructed for more than 20 percent of their length. Where provided, horizontal projections shall occur 1½ (38 mm) minimum below the bottom of the handrail gripping surface. +EXCEPTIONS: 1. Where handrails are provided along walking surfaces with slopes not steeper than 1:20, the bottoms of handrail gripping surfaces shall be permitted to be obstructed along their entire length where they are integral to crash rails or bumper guards. +2. The distance between horizontal projections and the bottom of the gripping surface shall be permitted to be reduced by 1/8 inch (3.2 mm) for each ½ inch (13 mm) of additional handrail perimeter dimension that exceeds 4 inches (100 mm). +Advisory 505.6 Gripping Surface. People with disabilities, older people, and others benefit from continuous gripping surfaces that permit users to reach the fingers outward or downward to grasp the handrail, particularly as the user senses a loss of equilibrium or begins to fall. + +505.7 Cross Section +Handrail gripping surfaces shall have a cross section complying with 505.7.1 or 505.7.2. + +505.7.1 Circular Cross Section +Handrail gripping surfaces with a circular cross section shall have an outside diameter of 1¼ inches (32 mm) minimum and 2 inches (51 mm) maximum. + +505.7.2 Non-Circular Cross Sections +Handrail gripping surfaces with a non-circular cross section shall have a perimeter dimension of 4 inches (100 mm) minimum and 6¼ inches (160 mm) maximum, and a cross-section dimension of 2¼ inches (57 mm) maximum. + +505.8 Surfaces +Handrail gripping surfaces and any surfaces adjacent to them shall be free of sharp or abrasive elements and shall have rounded edges. + +505.9 Fittings +Handrails shall not rotate within their fittings. + +505.10 Handrail Extensions +Handrail gripping surfaces shall extend beyond and in the same direction of stair flights and ramp runs in accordance with 505.10. +EXCEPTIONS: 1. Extensions shall not be required for continuous handrails at the inside turn of switchback or dogleg stairs and ramps. +2. In assembly areas, extensions shall not be required for ramp handrails in aisles serving seating where the handrails are discontinuous to provide access to seating and to permit crossovers within aisles. +3. In alterations, full extensions of handrails shall not be required where such extensions would be hazardous due to plan configuration. + +505.10.1 Top and Bottom Extension at Ramps +Ramp handrails shall extend horizontally above the landing for 12 inches (305 mm) minimum beyond the top and bottom of ramp runs. Extensions shall return to a wall, guard, or the landing surface, or shall be continuous to the handrail of an adjacent ramp run. + +505.10.2 Top Extension at Stairs +At the top of a stair flight, handrails shall extend horizontally above the landing for 12 inches (305 mm) minimum beginning directly above the first riser nosing. Extensions shall return to a wall, guard, or the landing surface, or shall be continuous to the handrail of an adjacent stair flight. + +505.10.3 Bottom Extension at Stairs +At the bottom of a stair flight, handrails shall extend at the slope of the stair flight for a horizontal distance at least equal to one tread depth beyond the last riser nosing. Extension shall return to a wall, guard, or the landing surface, or shall be continuous to the handrail of an adjacent stair flight. + +601.1 Scope +The provisions of Chapter 6 shall apply where required by Chapter 2 or where referenced by a requirement in this document. + +602.1 General +Drinking fountains shall comply with 307 and 602. + +602.2 Clear Floor Space +Units shall have a clear floor or ground space complying with 305 positioned for a forward approach and centered on the unit. Knee and toe clearance complying with 306 shall be provided. +EXCEPTION: A parallel approach complying with 305 shall be permitted at units for children’s use where the spout is 30 inches (760 mm) maximum above the finish floor or ground and is 3½ inches (90 mm) maximum from the front edge of the unit, including bumpers. + +602.3 Operable Parts +Operable parts shall comply with 309. + +602.4 Spout Height +Spout outlets shall be 36 inches (915 mm) maximum above the finish floor or ground. + +602.5 Spout Location +The spout shall be located 15 inches (380 mm) minimum from the vertical support and 5 inches (125 mm) maximum from the front edge of the unit, including bumpers. + +602.6 Water Flow +The spout shall provide a flow of water 4 inches (100 mm) high minimum and shall be located 5 inches (125 mm) maximum from the front of the unit. The angle of the water stream shall be measured horizontally relative to the front face of the unit. Where spouts are located less than 3 inches (75 mm) of the front of the unit, the angle of the water stream shall be 30 degrees maximum. Where spouts are located between 3 inches (75 mm) and 5 inches (125 mm) maximum from the front of the unit, the angle of the water stream shall be 15 degrees maximum. +Advisory 602.6 Water Flow. The purpose of requiring the drinking fountain spout to produce a flow of water 4 inches (100 mm) high minimum is so that a cup can be inserted under the flow of water to provide a drink of water for an individual who, because of a disability, would otherwise be incapable of using the drinking fountain. + +602.7 Drinking Fountains for Standing Persons +Spout outlets of drinking fountains for standing persons shall be 38 inches (965 mm) minimum and 43 inches (1090 mm) maximum above the finish floor or ground. + +603.1 General +Toilet and bathing rooms shall comply with 603. + +603.2 Clearances +Clearances shall comply with 603.2. + +603.2.1 Turning Space +Turning space complying with 304 shall be provided within the room. + +603.2.2 Overlap +Required clear floor spaces, clearance at fixtures, and turning space shall be permitted to overlap. + +603.2.3 Door Swing +Doors shall not swing into the clear floor space or clearance required for any fixture. Doors shall be permitted to swing into the required turning space. +EXCEPTIONS: 1. Doors to a toilet room or bathing room for a single occupant accessed only through a private office and not for common use or public use shall be permitted to swing into the clear floor space or clearance provided the swing of the door can be reversed to comply with 603.2.3. +2. Where the toilet room or bathing room is for individual use and a clear floor space complying with 305.3 is provided within the room beyond the arc of the door swing, doors shall be permitted to swing into the clear floor space or clearance required for any fixture. +Advisory 603.2.3 Door Swing Exception 1. At the time the door is installed, and if the door swing is reversed in the future, the door must meet all the requirements specified in 404. Additionally, the door swing cannot reduce the required width of an accessible route. Also, avoid violating other building or life safety codes when the door swing is reversed. + +603.3 Mirrors +Mirrors located above lavatories or countertops shall be installed with the bottom edge of the reflecting surface 40 inches (1015 mm) maximum above the finish floor or ground. Mirrors not located above lavatories or countertops shall be installed with the bottom edge of the reflecting surface 35 inches (890 mm) maximum above the finish floor or ground. +Advisory 603.3 Mirrors. A single full-length mirror can accommodate a greater number of people, including children. In order for mirrors to be usable by people who are ambulatory and people who use wheelchairs, the top edge of mirrors should be 74 inches (1880 mm) minimum from the floor or ground. + +603.4 Coat Hooks and Shelves +Coat hooks shall be located within one of the reach ranges specified in 308. Shelves shall be located 40 inches (1015 mm) minimum and 48 inches (1220 mm) maximum above the finish floor. + +604.1 General +Water closets and toilet compartments shall comply with 604.2 through 604.8. +EXCEPTION: Water closets and toilet compartments for children’s use shall be permitted to comply with 604.9. + +604.2 Location +The water closet shall be positioned with a wall or partition to the rear and to one side. The centerline of the water closet shall be 16 inches (405 mm) minimum to 18 inches (455 mm) maximum from the side wall or partition, except that the water closet shall be 17 inches (430 mm) minimum and 19 inches (485 mm) maximum from the side wall or partition in the ambulatory accessible toilet compartment specified in 604.8.2. Water closets shall be arranged for a left-hand or right-hand approach. + +604.3 Clearance +Clearances around water closets and in toilet compartments shall comply with 604.3. + +604.3.1 Size +Clearance around a water closet shall be 60 inches (1525 mm) minimum measured perpendicular from the side wall and 56 inches (1420 mm) minimum measured perpendicular from the rear wall. + +604.3.2 Overlap +The required clearance around the water closet shall be permitted to overlap the water closet, associated grab bars, dispensers, sanitary napkin disposal units, coat hooks, shelves, accessible routes, clear floor space and clearances required at other fixtures, and the turning space. No other fixtures or obstructions shall be located within the required water closet clearance. +EXCEPTION: In residential dwelling units, a lavatory complying with 606 shall be permitted on the rear wall 18 inches (455 mm) minimum from the water closet centerline where the clearance at the water closet is 66 inches (1675 mm) minimum measured perpendicular from the rear wall. +Advisory 604.3.2 Overlap. When the door to the toilet room is placed directly in front of the water closet, the water closet cannot overlap the required maneuvering clearance for the door inside the room. + +604.4 Seats +The seat height of a water closet above the finish floor shall be 17 inches (430 mm) minimum and 19 inches (485 mm) maximum measured to the top of the seat. Seats shall not be sprung to return to a lifted position. +EXCEPTIONS: 1. A water closet in a toilet room for a single occupant accessed only through a private office and not for common use or public use shall not be required to comply with 604.4. +2. In residential dwelling units, the height of water closets shall be permitted to be 15 inches (380 mm) minimum and 19 inches (485 mm) maximum above the finish floor measured to the top of the seat. + +604.5 Grab Bars +Grab bars for water closets shall comply with 609. Grab bars shall be provided on the side wall closest to the water closet and on the rear wall. +EXCEPTIONS: 1. Grab bars shall not be required to be installed in a toilet room for a single occupant accessed only through a private office and not for common use or public use provided that reinforcement has been installed in walls and located so as to permit the installation of grab bars complying with 604.5. +2. In residential dwelling units, grab bars shall not be required to be installed in toilet or bathrooms provided that reinforcement has been installed in walls and located so as to permit the installation of grab bars complying with 604.5. +3. In detention or correction facilities, grab bars shall not be required to be installed in housing or holding cells that are specially designed without protrusions for purposes of suicide prevention. +Advisory 604.5 Grab Bars Exception 2. Reinforcement must be sufficient to permit the installation of rear and side wall grab bars that fully meet all accessibility requirements including, but not limited to, required length, installation height, and structural strength. + +604.5.1 Side Wall +The side wall grab bar shall be 42 inches (1065 mm) long minimum, located 12 inches (305 mm) maximum from the rear wall and extending 54 inches (1370 mm) minimum from the rear wall. + +604.5.2 Rear Wall +The rear wall grab bar shall be 36 inches (915 mm) long minimum and extend from the centerline of the water closet 12 inches (305 mm) minimum on one side and 24 inches (610 mm) minimum on the other side. +EXCEPTIONS: 1. The rear grab bar shall be permitted to be 24 inches (610 mm) long minimum, centered on the water closet, where wall space does not permit a length of 36 inches (915 mm) minimum due to the location of a recessed fixture adjacent to the water closet. +2. Where an administrative authority requires flush controls for flush valves to be located in a position that conflicts with the location of the rear grab bar, then the rear grab bar shall be permitted to be split or shifted to the open side of the toilet area. + +604.6 Flush Controls +Flush controls shall be hand operated or automatic. Hand operated flush controls shall comply with 309. Flush controls shall be located on the open side of the water closet except in ambulatory accessible compartments complying with 604.8.2. +Advisory 604.6 Flush Controls. If plumbing valves are located directly behind the toilet seat, flush valves and related plumbing can cause injury or imbalance when a person leans back against them. To prevent causing injury or imbalance, the plumbing can be located behind walls or to the side of the toilet; or if approved by the local authority having jurisdiction, provide a toilet seat lid. + +604.7 Dispensers +Toilet paper dispensers shall comply with 309.4 and shall be 7 inches (180 mm) minimum and 9 inches (230 mm) maximum in front of the water closet measured to the centerline of the dispenser. The outlet of the dispenser shall be 15 inches (380 mm) minimum and 48 inches (1220 mm) maximum above the finish floor and shall not be located behind grab bars. Dispensers shall not be of a type that controls delivery or that does not allow continuous paper flow. +Advisory 604.7 Dispensers. If toilet paper dispensers are installed above the side wall grab bar, the outlet of the toilet paper dispenser must be 48 inches (1220 mm) maximum above the finish floor and the top of the gripping surface of the grab bar must be 33 inches (840 mm) minimum and 36 inches (915 mm) maximum above the finish floor. + +604.8 Toilet Compartments +Wheelchair accessible toilet compartments shall meet the requirements of 604.8.1 and 604.8.3. Compartments containing more than one plumbing fixture shall comply with 603. Ambulatory accessible compartments shall comply with 604.8.2 and 604.8.3. + +604.8.1 Wheelchair Accessible Compartments +Wheelchair accessible compartments shall comply with 604.8.1. + +604.8.1.1 Size +Wheelchair accessible compartments shall be 60 inches (1525 mm) wide minimum measured perpendicular to the side wall, and 56 inches (1420 mm) deep minimum for wall hung water closets and 59 inches (1500 mm) deep minimum for floor mounted water closets measured perpendicular to the rear wall. Wheelchair accessible compartments for children’s use shall be 60 inches (1525 mm) wide minimum measured perpendicular to the side wall, and 59 inches (1500 mm) deep minimum for wall hung and floor mounted water closets measured perpendicular to the rear wall. +Advisory 604.8.1.1 Size. The minimum space required in toilet compartments is provided so that a person using a wheelchair can maneuver into position at the water closet. This space cannot be obstructed by baby changing tables or other fixtures or conveniences, except as specified at 604.3.2 (Overlap). If toilet compartments are to be used to house fixtures other than those associated with the water closet, they must be designed to exceed the minimum space requirements. Convenience fixtures such as baby changing tables must also be accessible to people with disabilities as well as to other users. Toilet compartments that are designed to meet, and not exceed, the minimum space requirements may not provide adequate space for maneuvering into position at a baby changing table. + +604.8.1.2 Doors +Toilet compartment doors, including door hardware, shall comply with 404 except that if the approach is to the latch side of the compartment door, clearance between the door side of the compartment and any obstruction shall be 42 inches (1065 mm) minimum. Doors shall be located in the front partition or in the side wall or partition farthest from the water closet. Where located in the front partition, the door opening shall be 4 inches (100 mm) maximum from the side wall or partition farthest from the water closet. Where located in the side wall or partition, the door opening shall be 4 inches (100 mm) maximum from the front partition. The door shall be self-closing. A door pull complying with 404.2.7 shall be placed on both sides of the door near the latch. Toilet compartment doors shall not swing into the minimum required compartment area. + +604.8.1.3 Approach +Compartments shall be arranged for left-hand or right-hand approach to the water closet. + +604.8.1.4 Toe Clearance +The front partition and at least one side partition shall provide a toe clearance of 9 inches (230 mm) minimum above the finish floor and 6 inches (150 mm) deep minimum beyond the compartment-side face of the partition, exclusive of partition support members. Compartments for children’s use shall provide a toe clearance of 12 inches (305 mm) minimum above the finish floor. +EXCEPTION: Toe clearance at the front partition is not required in a compartment greater than 62 inches (1575 mm) deep with a wall-hung water closet or 65 inches (1650 mm) deep with a floor-mounted water closet. Toe clearance at the side partition is not required in a compartment greater than 66 inches (1675 mm) wide. Toe clearance at the front partition is not required in a compartment for children’s use that is greater than 65 inches (1650 mm) deep. + +604.8.1.5 Grab Bars +Grab bars shall comply with 609. A side-wall grab bar complying with 604.5.1 shall be provided and shall be located on the wall closest to the water closet. In addition, a rear-wall grab bar complying with 604.5.2 shall be provided. + +604.8.2 Ambulatory Accessible Compartments +Ambulatory accessible compartments shall comply with 604.8.2. + +604.8.2.1 Size +Ambulatory accessible compartments shall have a depth of 60 inches (1525 mm) minimum and a width of 35 inches (890 mm) minimum and 37 inches (940 mm) maximum. + +604.8.2.2 Doors +Toilet compartment doors, including door hardware, shall comply with 404, except that if the approach is to the latch side of the compartment door, clearance between the door side of the compartment and any obstruction shall be 42 inches (1065 mm) minimum. The door shall be self-closing. A door pull complying with 404.2.7 shall be placed on both sides of the door near the latch. Toilet compartment doors shall not swing into the minimum required compartment area. + +604.8.2.3 Grab Bars +Grab bars shall comply with 609. A side-wall grab bar complying with 604.5.1 shall be provided on both sides of the compartment. + +604.8.3 Coat Hooks and Shelves +Coat hooks shall be located within one of the reach ranges specified in 308. Shelves shall be located 40 inches (1015 mm) minimum and 48 inches (1220 mm) maximum above the finish floor. + +604.9 Water Closets and Toilet Compartments for Children’s Use +Water closets and toilet compartments for children’s use shall comply with 604.9. + +604.9.1 Location +The water closet shall be located with a wall or partition to the rear and to one side. The centerline of the water closet shall be 12 inches (305 mm) minimum and 18 inches (455 mm) maximum from the side wall or partition, except that the water closet shall be 17 inches (430 mm) minimum and 19 inches (485 mm) maximum from the side wall or partition in the ambulatory accessible toilet compartment specified in 604.8.2. Compartments shall be arranged for left-hand or right-hand approach to the water closet. + +604.9.2 Clearance +Clearance around a water closet shall comply with 604.3. + +604.9.3 Height +The height of water closets shall be 11 inches (280 mm) minimum and 17 inches (430 mm) maximum measured to the top of the seat. Seats shall not be sprung to return to a lifted position. + +604.9.4 Grab Bars +Grab bars for water closets shall comply with 604.5. + +604.9.5 Flush Controls +Flush controls shall be hand operated or automatic. Hand operated flush controls shall comply with 309.2 and 309.4 and shall be installed 36 inches (915 mm) maximum above the finish floor. Flush controls shall be located on the open side of the water closet except in ambulatory accessible compartments complying with 604.8.2. + +604.9.6 Dispensers +Toilet paper dispensers shall comply with 309.4 and shall be 7 inches (180 mm) minimum and 9 inches (230 mm) maximum in front of the water closet measured to the centerline of the dispenser. The outlet of the dispenser shall be 14 inches (355 mm) minimum and 19 inches (485 mm) maximum above the finish floor. There shall be a clearance of 1½ inches (38 mm) minimum below the grab bar. Dispensers shall not be of a type that controls delivery or that does not allow continuous paper flow. + +604.9.7 Toilet Compartments +Toilet compartments shall comply with 604.8. + +605.1 General +Urinals shall comply with 605. +Advisory 605.1 General. Stall-type urinals provide greater accessibility for a broader range of persons, including people of short stature. + +605.2 Height and Depth +Urinals shall be the stall-type or the wall-hung type with the rim 17 inches (430 mm) maximum above the finish floor or ground. Urinals shall be 13½ inches (345 mm) deep minimum measured from the outer face of the urinal rim to the back of the fixture. + +605.3 Clear Floor Space +A clear floor or ground space complying with 305 positioned for forward approach shall be provided. + +605.4 Flush Controls +Flush controls shall be hand operated or automatic. Hand operated flush controls shall comply with 309. + +606.1 General +Lavatories and sinks shall comply with 606. +Advisory 606.1 General. If soap and towel dispensers are provided, they must be located within the reach ranges specified in 308. Locate soap and towel dispensers so that they are conveniently usable by a person at the accessible lavatory. + +606.2 Clear Floor Space +A clear floor space complying with 305, positioned for a forward approach, and knee and toe clearance complying with 306 shall be provided. +EXCEPTIONS: 1. A parallel approach complying with 305 shall be permitted to a kitchen sink in a space where a cook top or conventional range is not provided and to wet bars. +2. A lavatory in a toilet room or bathing facility for a single occupant accessed only through a private office and not for common use or public use shall not be required to provide knee and toe clearance complying with 306. +3. In residential dwelling units, cabinetry shall be permitted under lavatories and kitchen sinks provided that all of the following conditions are met: +the cabinetry can be removed without removal or replacement of the fixture; +the finish floor extends under the cabinetry; and +the walls behind and surrounding the cabinetry are finished. +4. A knee clearance of 24 inches (610 mm) minimum above the finish floor or ground shall be permitted at lavatories and sinks used primarily by children 6 through 12 years where the rim or counter surface is 31 inches (785 mm) maximum above the finish floor or ground. +5. A parallel approach complying with 305 shall be permitted to lavatories and sinks used primarily by children 5 years and younger. +6. The dip of the overflow shall not be considered in determining knee and toe clearances. +7. No more than one bowl of a multi-bowl sink shall be required to provide knee and toe clearance complying with 306. + +606.3 Height +Lavatories and sinks shall be installed with the front of the higher of the rim or counter surface 34 inches (865 mm) maximum above the finish floor or ground. +EXCEPTIONS: 1. A lavatory in a toilet or bathing facility for a single occupant accessed only through a private office and not for common use or public use shall not be required to comply with 606.3. +2. In residential dwelling unit kitchens, sinks that are adjustable to variable heights, 29 inches (735 mm) minimum and 36 inches (915 mm) maximum, shall be permitted where rough-in plumbing permits connections of supply and drain pipes for sinks mounted at the height of 29 inches (735 mm). + +606.4 Faucets +Controls for faucets shall comply with 309. Hand-operated metering faucets shall remain open for 10 seconds minimum. + +606.5 Exposed Pipes and Surfaces +Water supply and drain pipes under lavatories and sinks shall be insulated or otherwise configured to protect against contact. There shall be no sharp or abrasive surfaces under lavatories and sinks. + +607.1 General +Bathtubs shall comply with 607. + +607.2 Clearance +Clearance in front of bathtubs shall extend the length of the bathtub and shall be 30 inches (760 mm) wide minimum. A lavatory complying with 606 shall be permitted at the control end of the clearance. Where a permanent seat is provided at the head end of the bathtub, the clearance shall extend 12 inches (305 mm) minimum beyond the wall at the head end of the bathtub. + +607.3 Seat +A permanent seat at the head end of the bathtub or a removable in-tub seat shall be provided. Seats shall comply with 610. + +607.4 Grab Bars +Grab bars for bathtubs shall comply with 609 and shall be provided in accordance with 607.4.1 or 607.4.2. +EXCEPTIONS: 1. Grab bars shall not be required to be installed in a bathtub located in a bathing facility for a single occupant accessed only through a private office and not for common use or public use provided that reinforcement has been installed in walls and located so as to permit the installation of grab bars complying with 607.4. +2. In residential dwelling units, grab bars shall not be required to be installed in bathtubs located in bathing facilities provided that reinforcement has been installed in walls and located so as to permit the installation of grab bars complying with 607.4. + +607.4.1 Bathtubs With Permanent Seats +For bathtubs with permanent seats, grab bars shall be provided in accordance with 607.4.1. + +607.4.1.1 Back Wall +Two grab bars shall be installed on the back wall, one located in accordance with 609.4 and the other located 8 inches (205 mm) minimum and 10 inches (255 mm) maximum above the rim of the bathtub. Each grab bar shall be installed 15 inches (380 mm) maximum from the head end wall and 12 inches (305 mm) maximum from the control end wall. + +607.4.1.2 Control End Wall +A grab bar 24 inches (610 mm) long minimum shall be installed on the control end wall at the front edge of the bathtub. + +607.4.2 Bathtubs Without Permanent Seats +For bathtubs without permanent seats, grab bars shall comply with 607.4.2. + +607.4.2.1 Back Wall +Two grab bars shall be installed on the back wall, one located in accordance with 609.4 and other located 8 inches (205 mm) minimum and 10 inches (255 mm) maximum above the rim of the bathtub. Each grab bar shall be 24 inches (610 mm) long minimum and shall be installed 24 inches (610 mm) maximum from the head end wall and 12 inches (305 mm) maximum from the control end wall. + +607.4.2.2 Control End Wall +A grab bar 24 inches (610 mm) long minimum shall be installed on the control end wall at the front edge of the bathtub. + +607.4.2.3 Head End Wall +A grab bar 12 inches (305 mm) long minimum shall be installed on the head end wall at the front edge of the bathtub. + +607.5 Controls +Controls, other than drain stoppers, shall be located on an end wall. Controls shall be between the bathtub rim and grab bar, and between the open side of the bathtub and the centerline of the width of the bathtub. Controls shall comply with 309.4. + +607.6 Shower Spray Unit and Water +A shower spray unit with a hose 59 inches (1500 mm) long minimum that can be used both as a fixed-position shower head and as a hand-held shower shall be provided. The shower spray unit shall have an on/off control with a non-positive shut-off. If an adjustable-height shower head on a vertical bar is used, the bar shall be installed so as not to obstruct the use of grab bars. Bathtub shower spray units shall deliver water that is 120°F (49°C) maximum. +Advisory 607.6 Shower Spray Unit and Water. Ensure that hand-held shower spray units are capable of delivering water pressure substantially equivalent to fixed shower heads. + +607.7 Bathtub Enclosures +Enclosures for bathtubs shall not obstruct controls, faucets, shower and spray units or obstruct transfer from wheelchairs onto bathtub seats or into bathtubs. Enclosures on bathtubs shall not have tracks installed on the rim of the open face of the bathtub. + +608.1 General +Shower compartments shall comply with 608. +Advisory 608.1 General. Shower stalls that are 60 inches (1525 mm) wide and have no curb may increase the usability of a bathroom because the shower area provides additional maneuvering space. + +608.2 Size and Clearances for Shower Compartments +Shower compartments shall have sizes and clearances complying with 608.2. + +608.2.1 Transfer Type Shower Compartments +Transfer type shower compartments shall be 36 inches (915 mm) by 36 inches (915 mm) clear inside dimensions measured at the center points of opposing sides and shall have a 36 inch (915 mm) wide minimum entry on the face of the shower compartment. Clearance of 36 inches (915 mm) wide minimum by 48 inches (1220 mm) long minimum measured from the control wall shall be provided. + +608.2.2 Standard Roll-In Type Shower Compartments +Standard roll-in type shower compartments shall be 30 inches (760 mm) wide minimum by 60 inches (1525 mm) deep minimum clear inside dimensions measured at center points of opposing sides and shall have a 60 inches (1525 mm) wide minimum entry on the face of the shower compartment. + +608.2.2.1 Clearance +A 30 inch (760 mm) wide minimum by 60 inch (1525 mm) long minimum clearance shall be provided adjacent to the open face of the shower compartment. +EXCEPTION: A lavatory complying with 606 shall be permitted on one 30 inch (760 mm) wide minimum side of the clearance provided that it is not on the side of the clearance adjacent to the controls or, where provided, not on the side of the clearance adjacent to the shower seat. + +608.2.3 Alternate Roll-In Type Shower Compartments +Alternate roll-in type shower compartments shall be 36 inches (915 mm) wide and 60 inches (1525 mm) deep minimum clear inside dimensions measured at center points of opposing sides. A 36 inch (915 mm) wide minimum entry shall be provided at one end of the long side of the compartment. + +608.3 Grab Bars +Grab bars shall comply with 609 and shall be provided in accordance with 608.3. Where multiple grab bars are used, required horizontal grab bars shall be installed at the same height above the finish floor. +EXCEPTIONS: 1. Grab bars shall not be required to be installed in a shower located in a bathing facility for a single occupant accessed only through a private office, and not for common use or public use provided that reinforcement has been installed in walls and located so as to permit the installation of grab bars complying with 608.3. +2. In residential dwelling units, grab bars shall not be required to be installed in showers located in bathing facilities provided that reinforcement has been installed in walls and located so as to permit the installation of grab bars complying with 608.3. + +608.3.1 Transfer Type Shower Compartments +In transfer type compartments, grab bars shall be provided across the control wall and back wall to a point 18 inches (455 mm) from the control wall. + +608.3.2 Standard Roll-In Type Shower Compartments +Where a seat is provided in standard roll-in type shower compartments, grab bars shall be provided on the back wall and the side wall opposite the seat. Grab bars shall not be provided above the seat. Where a seat is not provided in standard roll-in type shower compartments, grab bars shall be provided on three walls. Grab bars shall be installed 6 inches (150 mm) maximum from adjacent walls. + +608.3.3 Alternate Roll-In Type Shower Compartments +In alternate roll-in type shower compartments, grab bars shall be provided on the back wall and the side wall farthest from the compartment entry. Grab bars shall not be provided above the seat. Grab bars shall be installed 6 inches (150 mm) maximum from adjacent walls. + +608.4 Seats +A folding or non-folding seat shall be provided in transfer type shower compartments. A folding seat shall be provided in roll-in type showers required in transient lodging guest rooms with mobility features complying with 806.2. Seats shall comply with 610. +EXCEPTION: In residential dwelling units, seats shall not be required in transfer type shower compartments provided that reinforcement has been installed in walls so as to permit the installation of seats complying with 608.4. + +608.5 Controls +Controls, faucets, and shower spray units shall comply with 309.4. + +608.5.1 Transfer Type Shower Compartments +In transfer type shower compartments, the controls, faucets, and shower spray unit shall be installed on the side wall opposite the seat 38 inches (965 mm) minimum and 48 inches (1220 mm) maximum above the shower floor and shall be located on the control wall 15 inches (380 mm) maximum from the centerline of the seat toward the shower opening. + +608.5.2 Standard Roll-In Type Shower Compartments +In standard roll-in type shower compartments, the controls, faucets, and shower spray unit shall be located above the grab bar, but no higher than 48 inches (1220 mm) above the shower floor. Where a seat is provided, the controls, faucets, and shower spray unit shall be installed on the back wall adjacent to the seat wall and shall be located 27 inches (685 mm) maximum from the seat wall. +Advisory 608.5.2 Standard Roll-In Type Shower Compartments. In standard roll-in type showers without seats, the shower head and operable parts can be located on any of the three walls of the shower without adversely affecting accessibility. + +608.5.3 Alternate Roll-In Type Shower Compartments +In alternate roll-in type shower compartments, the controls, faucets, and shower spray unit shall be located above the grab bar, but no higher than 48 inches (1220 mm) above the shower floor. Where a seat is provided, the controls, faucets, and shower spray unit shall be located on the side wall adjacent to the seat 27 inches (685 mm) maximum from the side wall behind the seat or shall be located on the back wall opposite the seat 15 inches (380 mm) maximum, left or right, of the centerline of the seat. Where a seat is not provided, the controls, faucets, and shower spray unit shall be installed on the side wall farthest from the compartment entry. + +608.6 Shower Spray Unit and Water +A shower spray unit with a hose 59 inches (1500 mm) long minimum that can be used both as a fixed-position shower head and as a hand-held shower shall be provided. The shower spray unit shall have an on/off control with a non-positive shut-off. If an adjustable-height shower head on a vertical bar is used, the bar shall be installed so as not to obstruct the use of grab bars. Shower spray units shall deliver water that is 120°F (49°C) maximum. +EXCEPTION: A fixed shower head located at 48 inches (1220 mm) maximum above the shower finish floor shall be permitted instead of a hand-held spray unit in facilities that are not medical care facilities, long-term care facilities, transient lodging guest rooms, or residential dwelling units. +Advisory 608.6 Shower Spray Unit and Water. Ensure that hand-held shower spray units are capable of delivering water pressure substantially equivalent to fixed shower heads. + +608.7 Thresholds +Thresholds in roll-in type shower compartments shall be ½ inch (13 mm) high maximum in accordance with 303. In transfer type shower compartments, thresholds ½ inch (13 mm) high maximum shall be beveled, rounded, or vertical. +EXCEPTION: A threshold 2 inches (51 mm) high maximum shall be permitted in transfer type shower compartments in existing facilities where provision of a ½ inch (13 mm) high threshold would disturb the structural reinforcement of the floor slab. + +608.8 Shower Enclosures +Enclosures for shower compartments shall not obstruct controls, faucets, and shower spray units or obstruct transfer from wheelchairs onto shower seats. + +609.1 General +Grab bars in toilet facilities and bathing facilities shall comply with 609. + +609.2 Cross Section +Grab bars shall have a cross section complying with 609.2.1 or 609.2.2. + +609.2.1 Circular Cross Section +Grab bars with circular cross sections shall have an outside diameter of 1¼ inches (32 mm) minimum and 2 inches (51 mm) maximum. + +609.2.2 Non-Circular Cross Section +Grab bars with non-circular cross sections shall have a cross-section dimension of 2 inches (51 mm) maximum and a perimeter dimension of 4 inches (100 mm) minimum and 4.8 inches (120 mm) maximum. + +609.3 Spacing +The space between the wall and the grab bar shall be 1½ inches (38 mm). The space between the grab bar and projecting objects below and at the ends shall be 1½ inches (38 mm) minimum. The space between the grab bar and projecting objects above shall be 12 inches (305 mm) minimum. +EXCEPTION: The space between the grab bars and shower controls, shower fittings, and other grab bars above shall be permitted to be 1½ inches (38 mm) minimum. + +609.4 Position of Grab Bars +Grab bars shall be installed in a horizontal position, 33 inches (840 mm) minimum and 36 inches (915 mm) maximum above the finish floor measured to the top of the gripping surface, except that at water closets for children’s use complying with 604.9, grab bars shall be installed in a horizontal position 18 inches (455 mm) minimum and 27 inches (685 mm) maximum above the finish floor measured to the top of the gripping surface. The height of the lower grab bar on the back wall of a bathtub shall comply with 607.4.1.1 or 607.4.2.1. + +609.5 Surface Hazards +Grab bars and any wall or other surfaces adjacent to grab bars shall be free of sharp or abrasive elements and shall have rounded edges. + +609.6 Fittings +Grab bars shall not rotate within their fittings. + +609.7 Installation +Grab bars shall be installed in any manner that provides a gripping surface at the specified locations and that does not obstruct the required clear floor space. + +609.8 Structural Strength +Allowable stresses shall not be exceeded for materials used when a vertical or horizontal force of 250 pounds (1112 N) is applied at any point on the grab bar, fastener, mounting device, or supporting structure. + +610.1 General +Seats in bathtubs and shower compartments shall comply with 610. + +610.2 Bathtub Seats +The top of bathtub seats shall be 17 inches (430 mm) minimum and 19 inches (485 mm) maximum above the bathroom finish floor. The depth of a removable in-tub seat shall be 15 inches (380 mm) minimum and 16 inches (405 mm) maximum. The seat shall be capable of secure placement. Permanent seats at the head end of the bathtub shall be 15 inches (380 mm) deep minimum and shall extend from the back wall to or beyond the outer edge of the bathtub. + +610.3 Shower Compartment Seats +Where a seat is provided in a standard roll-in shower compartment, it shall be a folding type, shall be installed on the side wall adjacent to the controls, and shall extend from the back wall to a point within 3 inches (75 mm) of the compartment entry. Where a seat is provided in an alternate roll-in type shower compartment, it shall be a folding type, shall be installed on the front wall opposite the back wall, and shall extend from the adjacent side wall to a point within 3 inches (75 mm) of the compartment entry. In transfer-type showers, the seat shall extend from the back wall to a point within 3 inches (75 mm) of the compartment entry. The top of the seat shall be 17 inches (430 mm) minimum and 19 inches (485 mm) maximum above the bathroom finish floor. Seats shall comply with 610.3.1 or 610.3.2. + +610.3.1 Rectangular Seats +The rear edge of a rectangular seat shall be 2½ inches (64 mm) maximum and the front edge 15 inches (380 mm) minimum and 16 inches (405 mm) maximum from the seat wall. The side edge of the seat shall be 1½ inches (38 mm) maximum from the adjacent wall. + +610.3.2 L-Shaped Seats +The rear edge of an L-shaped seat shall be 2½ inches (64 mm) maximum and the front edge 15 inches (380 mm) minimum and 16 inches (405 mm) maximum from the seat wall. The rear edge of the “L” portion of the seat shall be 1½ inches (38 mm) maximum from the wall and the front edge shall be 14 inches (355 mm) minimum and 15 inches (380 mm) maximum from the wall. The end of the “L” shall be 22 inches (560 mm) minimum and 23 inches maximum (585 mm) from the main seat wall. + +610.4 Structural Strength +Allowable stresses shall not be exceeded for materials used when a vertical or horizontal force of 250 pounds (1112 N) is applied at any point on the seat, fastener, mounting device, or supporting structure. + +611.1 General +Washing machines and clothes dryers shall comply with 611. + +611.2 Clear Floor Space +A clear floor or ground space complying with 305 positioned for parallel approach shall be provided. The clear floor or ground space shall be centered on the appliance. + +611.3 Operable Parts +Operable parts, including doors, lint screens, and detergent and bleach compartments shall comply with 309. + +611.4 Height +Top loading machines shall have the door to the laundry compartment located 36 inches (915 mm) maximum above the finish floor. Front loading machines shall have the bottom of the opening to the laundry compartment located 15 inches (380 mm) minimum and 36 inches (915 mm) maximum above the finish floor. + +612.1 General +Saunas and steam rooms shall comply with 612. + +612.2 Bench +Where seating is provided in saunas and steam rooms, at least one bench shall comply with 903. Doors shall not swing into the clear floor space required by 903.2. +EXCEPTION: A readily removable bench shall be permitted to obstruct the turning space required by 612.3 and the clear floor or ground space required by 903.2. + +612.3 Turning Space +A turning space complying with 304 shall be provided within saunas and steam rooms. + +701.1 Scope +The provisions of Chapter 7 shall apply where required by Chapter 2 or where referenced by a requirement in this document. + +702.1 General +Fire alarm systems shall have permanently installed audible and visible alarms complying with NFPA 72 (1999 or 2002 edition) (incorporated by reference, see “Referenced Standards” in Chapter 1), except that the maximum allowable sound level of audible notification appliances complying with section 4-3.2.1 of NFPA 72 (1999 edition) shall have a sound level no more than 110 dB at the minimum hearing distance from the audible appliance. In addition, alarms in guest rooms required to provide communication features shall comply with sections 4-3 and 4-4 of NFPA 72 (1999 edition) or sections 7.4 and 7.5 of NFPA 72 (2002 edition). +EXCEPTION: Fire alarm systems in medical care facilities shall be permitted to be provided in accordance with industry practice. + +703.1 General +Signs shall comply with 703. Where both visual and tactile characters are required, either one sign with both visual and tactile characters, or two separate signs, one with visual, and one with tactile characters, shall be provided. + +703.2 Raised Characters +Raised characters shall comply with 703.2 and shall be duplicated in braille complying with 703.3. Raised characters shall be installed in accordance with 703.4. +Advisory 703.2 Raised Characters. Signs that are designed to be read by touch should not have sharp or abrasive edges. + +703.2.1 Depth +Raised characters shall be 1/32 inch (0.8 mm) minimum above their background. + +703.2.2 Case +Characters shall be uppercase. + +703.2.3 Style +Characters shall be sans serif. Characters shall not be italic, oblique, script, highly decorative, or of other unusual forms. + +703.2.4 Character Proportions +Characters shall be selected from fonts where the width of the uppercase letter “O” is 55 percent minimum and 110 percent maximum of the height of the uppercase letter “I”. + +703.2.5 Character Height +Character height measured vertically from the baseline of the character shall be 5/8 inch (16 mm) minimum and 2 inches (51 mm) maximum based on the height of the uppercase letter “I”. +EXCEPTION: Where separate raised and visual characters with the same information are provided, raised character height shall be permitted to be ½ inch (13 mm) minimum. + +703.2.6 Stroke Thickness +Stroke thickness of the uppercase letter “I” shall be 15 percent maximum of the height of the character. + +703.2.7 Character Spacing +Character spacing shall be measured between the two closest points of adjacent raised characters within a message, excluding word spaces. Where characters have rectangular cross sections, spacing between individual raised characters shall be 1/8 inch (3.2 mm) minimum and 4 times the raised character stroke width maximum. Where characters have other cross sections, spacing between individual raised characters shall be 1/16 inch (1.6 mm) minimum and 4 times the raised character stroke width maximum at the base of the cross sections, and 1/8 inch (3.2 mm) minimum and 4 times the raised character stroke width maximum at the top of the cross sections. Characters shall be separated from raised borders and decorative elements 3/8 inch (9.5 mm) minimum. + +703.2.8 Line Spacing +Spacing between the baselines of separate lines of raised characters within a message shall be 135 percent minimum and 170 percent maximum of the raised character height. + +703.3 Braille +Braille shall be contracted (Grade 2) and shall comply with 703.3 and 703.4. + +703.3.1 Dimensions and Capitalization +Braille dots shall have a domed or rounded shape and shall comply with Table 703.3.1. The indication of an uppercase letter or letters shall only be used before the first word of sentences, proper nouns and names, individual letters of the alphabet, initials, and acronyms. +Table Legend: 1. Measured center to center. + +703.3.2 Position +Braille shall be positioned below the corresponding text. If text is multi-lined, braille shall be placed below the entire text. Braille shall be separated 3/8 inch (9.5 mm) minimum from any other tactile characters and 3/8 inch (9.5 mm) minimum from raised borders and decorative elements. +EXCEPTION: Braille provided on elevator car controls shall be separated 3/16 inch (4.8 mm) minimum and shall be located either directly below or adjacent to the corresponding raised characters or symbols. + +703.4 Installation Height and Location +Signs with tactile characters shall comply with 703.4. + +703.4.1 Height Above Finish Floor or Ground +Tactile characters on signs shall be located 48 inches (1220 mm) minimum above the finish floor or ground surface, measured from the baseline of the lowest tactile character and 60 inches (1525 mm) maximum above the finish floor or ground surface, measured from the baseline of the highest tactile character. +EXCEPTION: Tactile characters for elevator car controls shall not be required to comply with 703.4.1. + +703.4.2 Location +Where a tactile sign is provided at a door, the sign shall be located alongside the door at the latch side. Where a tactile sign is provided at double doors with one active leaf, the sign shall be located on the inactive leaf. Where a tactile sign is provided at double doors with two active leafs, the sign shall be located to the right of the right hand door. Where there is no wall space at the latch side of a single door or at the right side of double doors, signs shall be located on the nearest adjacent wall. Signs containing tactile characters shall be located so that a clear floor space of 18 inches (455 mm) minimum by 18 inches (455 mm) minimum, centered on the tactile characters, is provided beyond the arc of any door swing between the closed position and 45 degree open position. +EXCEPTION: Signs with tactile characters shall be permitted on the push side of doors with closers and without hold-open devices. + +703.5 Visual Characters +Visual characters shall comply with 703.5. +EXCEPTION: Where visual characters comply with 703.2 and are accompanied by braille complying with 703.3, they shall not be required to comply with 703.5.2 through 703.5.9. + +703.5.1 Finish and Contrast +Characters and their background shall have a non-glare finish. Characters shall contrast with their background with either light characters on a dark background or dark characters on a light background. +Advisory 703.5.1 Finish and Contrast. Signs are more legible for persons with low vision when characters contrast as much as possible with their background. Additional factors affecting the ease with which the text can be distinguished from its background include shadows cast by lighting sources, surface glare, and the uniformity of the text and its background colors and textures. + +703.5.2 Case +Characters shall be uppercase or lowercase or a combination of both. + +703.5.3 Style +Characters shall be conventional in form. Characters shall not be italic, oblique, script, highly decorative, or of other unusual forms. + +703.5.4 Character Proportions +Characters shall be selected from fonts where the width of the uppercase letter “O” is 55 percent minimum and 110 percent maximum of the height of the uppercase letter “I”. + +703.5.5 Character Height +Minimum character height shall comply with Table 703.5.5. Viewing distance shall be measured as the horizontal distance between the character and an obstruction preventing further approach towards the sign. Character height shall be based on the uppercase letter “I”. + +703.5.6 Height From Finish Floor or Ground +Visual characters shall be 40 inches (1015 mm) minimum above the finish floor or ground. +EXCEPTION: Visual characters indicating elevator car controls shall not be required to comply with 703.5.6. + +703.5.7 Stroke Thickness +Stroke thickness of the uppercase letter “I” shall be 10 percent minimum and 30 percent maximum of the height of the character. + +703.5.8 Character Spacing +Character spacing shall be measured between the two closest points of adjacent characters, excluding word spaces. Spacing between individual characters shall be 10 percent minimum and 35 percent maximum of character height. + +703.5.9 Line Spacing +Spacing between the baselines of separate lines of characters within a message shall be 135 percent minimum and 170 percent maximum of the character height. + +703.6 Pictograms +Pictograms shall comply with 703.6. + +703.6.1 Pictogram Field +Pictograms shall have a field height of 6 inches (150 mm) minimum. Characters and braille shall not be located in the pictogram field. + +703.6.2 Finish and Contrast +Pictograms and their field shall have a non-glare finish. Pictograms shall contrast with their field with either a light pictogram on a dark field or a dark pictogram on a light field. +Advisory 703.6.2 Finish and Contrast. Signs are more legible for persons with low vision when characters contrast as much as possible with their background. Additional factors affecting the ease with which the text can be distinguished from its background include shadows cast by lighting sources, surface glare, and the uniformity of the text and background colors and textures. + +703.6.3 Text Descriptors +Pictograms shall have text descriptors located directly below the pictogram field. Text descriptors shall comply with 703.2, 703.3 and 703.4. + +703.7 Symbols of Accessibility +Symbols of accessibility shall comply with 703.7. + +703.7.1 Finish and Contrast +Symbols of accessibility and their background shall have a non-glare finish. Symbols of accessibility shall contrast with their background with either a light symbol on a dark background or a dark symbol on a light background. +Advisory 703.7.1 Finish and Contrast. Signs are more legible for persons with low vision when characters contrast as much as possible with their background. Additional factors affecting the ease with which the text can be distinguished from its background include shadows cast by lighting sources, surface glare, and the uniformity of the text and background colors and textures. + +703.7.2.1 International Symbol of Accessibility +The International Symbol of Accessibility shall comply with Figure 703.7.2.1. + +703.7.2.2 International Symbol of TTY +The International Symbol of TTY shall comply with Figure 703.7.2.2. + +703.7.2.3 Volume Control Telephones +Telephones with a volume control shall be identified by a pictogram of a telephone handset with radiating sound waves on a square field such as shown in Figure 703.7.2.3. + +703.7.2.4 Assistive Listening Systems +Assistive listening systems shall be identified by the International Symbol of Access for Hearing Loss complying with Figure 703.7.2.4. + +704.1 General +Public telephones shall comply with 704. + +704.2 Wheelchair Accessible Telephones +Wheelchair accessible telephones shall comply with 704.2. + +704.2.1 Clear Floor or Ground Space +A clear floor or ground space complying with 305 shall be provided. The clear floor or ground space shall not be obstructed by bases, enclosures, or seats. +Advisory 704.2.1 Clear Floor or Ground Space. Because clear floor and ground space is required to be unobstructed, telephones, enclosures and related telephone book storage cannot encroach on the required clear floor or ground space and must comply with the provisions for protruding objects. (See Section 307). + +704.2.1.1 Parallel Approach +Where a parallel approach is provided, the distance from the edge of the telephone enclosure to the face of the telephone unit shall be 10 inches (255 mm) maximum. + +704.2.1.2 Forward Approach +Where a forward approach is provided, the distance from the front edge of a counter within the telephone enclosure to the face of the telephone unit shall be 20 inches (510 mm) maximum. + +704.2.2 Operable Parts +Operable parts shall comply with 309. Telephones shall have push-button controls where such service is available. + +704.2.3 Telephone Directories +Telephone directories, where provided, shall be located in accordance with 309. + +704.2.4 Cord Length +The cord from the telephone to the handset shall be 29 inches (735 mm) long minimum. + +704.3 Volume Control Telephones +Public telephones required to have volume controls shall be equipped with a receive volume control that provides a gain adjustable up to 20 dB minimum. For incremental volume control, provide at least one intermediate step of 12 dB of gain minimum. An automatic reset shall be provided. +Advisory 704.3 Volume Control Telephones. Amplifiers on pay phones are located in the base or the handset or are built into the telephone. Most are operated by pressing a button or key. If the microphone in the handset is not being used, a mute button that temporarily turns off the microphone can also reduce the amount of background noise which the person hears in the earpiece. If a volume adjustment is provided that allows the user to set the level anywhere from the base volume to the upper requirement of 20 dB, there is no need to specify a lower limit. If a stepped volume control is provided, one of the intermediate levels must provide 12 dB of gain. Consider compatibility issues when matching an amplified handset with a phone or phone system. Amplified handsets that can be switched with pay telephone handsets are available. Portable and in-line amplifiers can be used with some phones but are not practical at most public phones covered by these requirements. + +704.4 TTYs +TTYs required at a public pay telephone shall be permanently affixed within, or adjacent to, the telephone enclosure. Where an acoustic coupler is used, the telephone cord shall be sufficiently long to allow connection of the TTY and the telephone receiver. +Advisory 704.4 TTYs. Ensure that sufficient electrical service is available where TTYs are to be installed. + +704.4.1 Height +When in use, the touch surface of TTY keypads shall be 34 inches (865 mm) minimum above the finish floor. +EXCEPTION: Where seats are provided, TTYs shall not be required to comply with 704.4.1. + +704.5 TTY Shelf +Public pay telephones required to accommodate portable TTYs shall be equipped with a shelf and an electrical outlet within or adjacent to the telephone enclosure. The telephone handset shall be capable of being placed flush on the surface of the shelf. The shelf shall be capable of accommodating a TTY and shall have 6 inches (150 mm) minimum vertical clearance above the area where the TTY is to be placed. + +705.1 General +Detectable warnings shall consist of a surface of truncated domes and shall comply with 705. + +705.1.1 Dome Size +Truncated domes in a detectable warning surface shall have a base diameter of 0.9 inch (23 mm) minimum and 1.4 inches (36 mm) maximum, a top diameter of 50 percent of the base diameter minimum to 65 percent of the base diameter maximum, and a height of 0.2 inch (5.1 mm). + +705.1.2 Dome Spacing +Truncated domes in a detectable warning surface shall have a center-to-center spacing of 1.6 inches (41 mm) minimum and 2.4 inches (61 mm) maximum, and a base-to-base spacing of 0.65 inch (17 mm) minimum, measured between the most adjacent domes on a square grid. + +705.1.3 Contrast +Detectable warning surfaces shall contrast visually with adjacent walking surfaces either light-on-dark, or dark-on-light. + +705.2 Platform Edges +Detectable warning surfaces at platform boarding edges shall be 24 inches (610 mm) wide and shall extend the full length of the public use areas of the platform. + +706.1 General +Assistive listening systems required in assembly areas shall comply with 706. + +706.2 Receiver Jacks +Receivers required for use with an assistive listening system shall include a 1/8 inch (3.2 mm) standard mono jack. + +706.3 Receiver Hearing-Aid Compatibility +Receivers required to be hearing-aid compatible shall interface with telecoils in hearing aids through the provision of neckloops. +Advisory 706.3 Receiver Hearing-Aid Compatibility. Neckloops and headsets that can be worn as neckloops are compatible with hearing aids. Receivers that are not compatible include earbuds, which may require removal of hearing aids, earphones, and headsets that must be worn over the ear, which can create disruptive interference in the transmission and can be uncomfortable for people wearing hearing aids. + +706.4 Sound Pressure Level +Assistive listening systems shall be capable of providing a sound pressure level of 110 dB minimum and 118 dB maximum with a dynamic range on the volume control of 50 dB. + +706.5 Signal-to-Noise Ratio +The signal-to-noise ratio for internally generated noise in assistive listening systems shall be 18 dB minimum. + +706.6 Peak Clipping Level +Peak clipping shall not exceed 18 dB of clipping relative to the peaks of speech. + +707 Automatic Teller Machines and Fare Machines +Advisory 707 Automatic Teller Machines and Fare Machines. Interactive transaction machines (ITMs), other than ATMs, are not covered by Section 707. However, for entities covered by the ADA, the Department of Justice regulations that implement the ADA provide additional guidance regarding the relationship between these requirements and elements that are not directly addressed by these requirements. Federal procurement law requires that ITMs purchased by the Federal government comply with standards issued by the Access Board under Section 508 of the Rehabilitation Act of 1973, as amended. This law covers a variety of products, including computer hardware and software, websites, phone systems, fax machines, copiers, and similar technologies. For more information on Section 508 consult the Access Board’s website at www.access-board.gov. + +707.1 General +Automatic teller machines and fare machines shall comply with 707. +Advisory 707.1 General. If farecards have one tactually distinctive corner they can be inserted with greater accuracy. Token collection devices that are designed to accommodate tokens which are perforated can allow a person to distinguish more readily between tokens and common coins. Place accessible gates and fare vending machines in close proximity to other accessible elements when feasible so the facility is easier to use. + +707.2 Clear Floor or Ground Space +A clear floor or ground space complying with 305 shall be provided. +EXCEPTION: Clear floor or ground space shall not be required at drive-up only automatic teller machines and fare machines. + +707.3 Operable Parts +Operable parts shall comply with 309. Unless a clear or correct key is provided, each operable part shall be able to be differentiated by sound or touch, without activation. +EXCEPTION: Drive-up only automatic teller machines and fare machines shall not be required to comply with 309.2 and 309.3. + +707.4 Privacy +Automatic teller machines shall provide the opportunity for the same degree of privacy of input and output available to all individuals. +Advisory 707.4 Privacy. In addition to people who are blind or visually impaired, people with limited reach who use wheelchairs or have short stature, who cannot effectively block the ATM screen with their bodies, may prefer to use speech output. Speech output users can benefit from an option to render the visible screen blank, thereby affording them greater personal security and privacy. + +707.5 Speech Output +Machines shall be speech enabled. Operating instructions and orientation, visible transaction prompts, user input verification, error messages, and all displayed information for full use shall be accessible to and independently usable by individuals with vision impairments. Speech shall be delivered through a mechanism that is readily available to all users, including but not limited to, an industry standard connector or a telephone handset. Speech shall be recorded or digitized human, or synthesized. +EXCEPTIONS: 1. Audible tones shall be permitted instead of speech for visible output that is not displayed for security purposes, including but not limited to, asterisks representing personal identification numbers. +2. Advertisements and other similar information shall not be required to be audible unless they convey information that can be used in the transaction being conducted. +3. Where speech synthesis cannot be supported, dynamic alphabetic output shall not be required to be audible. +Advisory 707.5 Speech Output. If an ATM provides additional functions such as dispensing coupons, selling theater tickets, or providing copies of monthly statements, all such functions must be available to customers using speech output. To avoid confusion at the ATM, the method of initiating the speech mode should be easily discoverable and should not require specialized training. For example, if a telephone handset is provided, lifting the handset can initiate the speech mode. + +707.5.1 User Control +Speech shall be capable of being repeated or interrupted. Volume control shall be provided for the speech function. +EXCEPTION: Speech output for any single function shall be permitted to be automatically interrupted when a transaction is selected. + +707.5.2 Receipts +Where receipts are provided, speech output devices shall provide audible balance inquiry information, error messages, and all other information on the printed receipt necessary to complete or verify the transaction. +EXCEPTIONS: 1. Machine location, date and time of transaction, customer account number, and the machine identifier shall not be required to be audible. +2. Information on printed receipts that duplicates information available on-screen shall not be required to be presented in the form of an audible receipt. +3. Printed copies of bank statements and checks shall not be required to be audible. + +707.6 Input +Input devices shall comply with 707.6. + +707.6.1 Input Controls +At least one tactilely discernible input control shall be provided for each function. Where provided, key surfaces not on active areas of display screens, shall be raised above surrounding surfaces. Where membrane keys are the only method of input, each shall be tactilely discernable from surrounding surfaces and adjacent keys. + +707.6.2 Numeric Keys +Numeric keys shall be arranged in a 12-key ascending or descending telephone keypad layout. The number five key shall be tactilely distinct from the other keys. +Advisory 707.6.2 Numeric Keys. Telephone keypads and computer keyboards differ in one significant feature, ascending versus descending numerical order. Both types of keypads are acceptable, provided the computer-style keypad is organized similarly to the number pad located at the right on most computer keyboards, and does not resemble the line of numbers located above the computer keys. + +707.6.3 Function Keys +Function keys shall comply with 707.6.3. + +707.6.3.1 Contrast +Function keys shall contrast visually from background surfaces. Characters and symbols on key surfaces shall contrast visually from key surfaces. Visual contrast shall be either light-on-dark or dark-on-light. +EXCEPTION: Tactile symbols required by 707.6.3.2 shall not be required to comply with 707.6.3.1. + +707.6.3.2 Tactile Symbols +Function key surfaces shall have tactile symbols as follows: Enter or Proceed key: raised circle; Clear or Correct key: raised left arrow; Cancel key: raised letter ex; Add Value key: raised plus sign; Decrease Value key: raised minus sign. + +707.7 Display Screen +The display screen shall comply with 707.7. +EXCEPTION: Drive-up only automatic teller machines and fare machines shall not be required to comply with 707.7.1. + +707.7.1 Visibility +The display screen shall be visible from a point located 40 inches (1015 mm) above the center of the clear floor space in front of the machine. + +707.7.2 Characters +Characters displayed on the screen shall be in a sans serif font. Characters shall be 3/16 inch (4.8 mm) high minimum based on the uppercase letter “I”. Characters shall contrast with their background with either light characters on a dark background or dark characters on a light background. + +707.8 Braille Instructions +Braille instructions for initiating the speech mode shall be provided. Braille shall comply with 703.3. + +708.1 General +Two-way communication systems shall comply with 708. +Advisory 708.1 General. Devices that do not require handsets are easier to use by people who have a limited reach. + +708.2 Audible and Visual Indicators +The system shall provide both audible and visual signals. +Advisory 708.2 Audible and Visual Indicators. A light can be used to indicate visually that assistance is on the way. Signs indicating the meaning of visual signals should be provided. + +708.3 Handsets +Handset cords, if provided, shall be 29 inches (735 mm) long minimum. + +708.4 Residential Dwelling Unit Communication Systems +Communications systems between a residential dwelling unit and a site, building, or floor entrance shall comply with 708.4. + +708.4.1 Common Use or Public Use System Interface +The common use or public use system interface shall include the capability of supporting voice and TTY communication with the residential dwelling unit interface. + +708.4.2 Residential Dwelling Unit Interface +The residential dwelling unit system interface shall include a telephone jack capable of supporting voice and TTY communication with the common use or public use system interface. + +801.1 Scope +The provisions of Chapter 8 shall apply where required by Chapter 2 or where referenced by a requirement in this document. +Advisory 801.1 Scope. Facilities covered by these requirements are also subject to the requirements of the other chapters. For example, 806 addresses guest rooms in transient lodging facilities while 902 contains the technical specifications for dining surfaces. If a transient lodging facility contains a restaurant, the restaurant must comply with requirements in other chapters such as those applicable to certain dining surfaces. + +802.1 Wheelchair Spaces +Wheelchair spaces shall comply with 802.1. + +802.1.1 Floor or Ground Surface +The floor or ground surface of wheelchair spaces shall comply with 302. Changes in level are not permitted. +EXCEPTION: Slopes not steeper than 1:48 shall be permitted. + +802.1.2 Width +A single wheelchair space shall be 36 inches (915 mm) wide minimum Where two adjacent wheelchair spaces are provided, each wheelchair space shall be 33 inches (840 mm) wide minimum. + +802.1.3 Depth +Where a wheelchair space can be entered from the front or rear, the wheelchair space shall be 48 inches (1220 mm) deep minimum. Where a wheelchair space can be entered only from the side, the wheelchair space shall be 60 inches (1525 mm) deep minimum. + +802.1.4 Approach +Wheelchair spaces shall adjoin accessible routes. Accessible routes shall not overlap wheelchair spaces. +Advisory 802.1.4 Approach. Because accessible routes serving wheelchair spaces are not permitted to overlap the clear floor space at wheelchair spaces, access to any wheelchair space cannot be through another wheelchair space. + +802.1.5 Overlap +Wheelchair spaces shall not overlap circulation paths. +Advisory 802.1.5 Overlap. The term “circulation paths” used in Section 802.1.5 means aisle width required by applicable building or life safety codes for the specific assembly occupancy. Where the circulation path provided is wider than the required aisle width, the wheelchair space may intrude into that portion of the circulation path that is provided in excess of the required aisle width. + +802.2 Lines of Sight +Lines of sight to the screen, performance area, or playing field for spectators in wheelchair spaces shall comply with 802.2. + +802.2.1 Lines of Sight Over Seated Spectators +Where spectators are expected to remain seated during events, spectators in wheelchair spaces shall be afforded lines of sight complying with 802.2.1. + +802.2.1.1 Lines of Sight Over Heads +Where spectators are provided lines of sight over the heads of spectators seated in the first row in front of their seats, spectators seated in wheelchair spaces shall be afforded lines of sight over the heads of seated spectators in the first row in front of wheelchair spaces. + +802.2.1.2 Lines of Sight Between Heads +Where spectators are provided lines of sight over the shoulders and between the heads of spectators seated in the first row in front of their seats, spectators seated in wheelchair spaces shall be afforded lines of sight over the shoulders and between the heads of seated spectators in the first row in front of wheelchair spaces. + +802.2.2 Lines of Sight Over Standing Spectators +Where spectators are expected to stand during events, spectators in wheelchair spaces shall be afforded lines of sight complying with 802.2.2. + +802.2.2.1 Lines of Sight Over Heads +Where standing spectators are provided lines of sight over the heads of spectators standing in the first row in front of their seats, spectators seated in wheelchair spaces shall be afforded lines of sight over the heads of standing spectators in the first row in front of wheelchair spaces. + +802.2.2.2 Lines of Sight Between Heads +Where standing spectators are provided lines of sight over the shoulders and between the heads of spectators standing in the first row in front of their seats, spectators seated in wheelchair spaces shall be afforded lines of sight over the shoulders and between the heads of standing spectators in the first row in front of wheelchair spaces. + +802.3 Companion Seats +Companion seats shall comply with 802.3. + +802.3.1 Alignment +In row seating, companion seats shall be located to provide shoulder alignment with adjacent wheelchair spaces. The shoulder alignment point of the wheelchair space shall be measured 36 inches (915 mm) from the front of the wheelchair space. The floor surface of the companion seat shall be at the same elevation as the floor surface of the wheelchair space. + +802.3.2 Type +Companion seats shall be equivalent in size, quality, comfort, and amenities to the seating in the immediate area. Companion seats shall be permitted to be movable. + +802.4 Designated Aisle Seats +Designated aisle seats shall comply with 802.4. + +802.4.1 Armrests +Where armrests are provided on the seating in the immediate area, folding or retractable armrests shall be provided on the aisle side of the seat. + +802.4.2 Identification +Each designated aisle seat shall be identified by a sign or marker. +Advisory 802.4.2 Identification. Seats with folding or retractable armrests are intended for use by individuals who have difficulty walking. Consider identifying such seats with signs that contrast (light-on-dark or dark-on-light) and that are also photo luminescent. + +803.1 General +Dressing, fitting, and locker rooms shall comply with 803. +Advisory 803.1 General. Partitions and doors should be designed to ensure people using accessible dressing and fitting rooms privacy equivalent to that afforded other users of the facility. Section 903.5 requires dressing room bench seats to be installed so that they are at the same height as a typical wheelchair seat, 17 inches (430 mm) to 19 inches (485 mm). However, wheelchair seats can be lower than dressing room benches for people of short stature or children using wheelchairs. + +803.2 Turning Space +Turning space complying with 304 shall be provided within the room. + +803.3 Door Swing +Doors shall not swing into the room unless a clear floor or ground space complying with 305.3 is provided beyond the arc of the door swing. + +803.4 Benches +A bench complying with 903 shall be provided within the room. + +803.5 Coat Hooks and Shelves +Coat hooks provided within the room shall be located within one of the reach ranges specified in 308. Shelves shall be 40 inches (1015 mm) minimum and 48 inches (1220 mm) maximum above the finish floor or ground. + +804.1 General +Kitchens and kitchenettes shall comply with 804. + +804.2 Clearance +Where a pass through kitchen is provided, clearances shall comply with 804.2.1. Where a U-shaped kitchen is provided, clearances shall comply with 804.2.2. +EXCEPTION: Spaces that do not provide a cooktop or conventional range shall not be required to comply with 804.2. +Advisory 804.2 Clearance. Clearances are measured from the furthest projecting face of all opposing base cabinets, counter tops, appliances, or walls, excluding hardware. + +804.2.1 Pass Through Kitchen +In pass through kitchens where counters, appliances or cabinets are on two opposing sides, or where counters, appliances or cabinets are opposite a parallel wall, clearance between all opposing base cabinets, counter tops, appliances, or walls within kitchen work areas shall be 40 inches (1015 mm) minimum. Pass through kitchens shall have two entries. + +804.2.2 U-Shaped +In U-shaped kitchens enclosed on three contiguous sides, clearance between all opposing base cabinets, counter tops, appliances, or walls within kitchen work areas shall be 60 inches (1525 mm) minimum. + +804.3 Kitchen Work Surface +In residential dwelling units required to comply with 809, at least one 30 inches (760 mm) wide minimum section of counter shall provide a kitchen work surface that complies with 804.3. + +804.3.1 Clear Floor or Ground Space +A clear floor space complying with 305 positioned for a forward approach shall be provided. The clear floor or ground space shall be centered on the kitchen work surface and shall provide knee and toe clearance complying with 306. +EXCEPTION: Cabinetry shall be permitted under the kitchen work surface provided that all of the following conditions are met: +the cabinetry can be removed without removal or replacement of the kitchen work surface; +the finish floor extends under the cabinetry; and +the walls behind and surrounding the cabinetry are finished. + +804.3.2 Height +The kitchen work surface shall be 34 inches (865 mm) maximum above the finish floor or ground. +EXCEPTION: A counter that is adjustable to provide a kitchen work surface at variable heights, 29 inches (735 mm) minimum and 36 inches (915 mm) maximum, shall be permitted. + +804.3.3 Exposed Surfaces +There shall be no sharp or abrasive surfaces under the work surface counters. + +804.4 Sinks +Sinks shall comply with 606. + +804.5 Storage +At least 50 percent of shelf space in storage facilities shall comply with 811. + +804.6 Appliances +Where provided, kitchen appliances shall comply with 804.6. + +804.6.1 Clear Floor or Ground Space +A clear floor or ground space complying with 305 shall be provided at each kitchen appliance. Clear floor or ground spaces shall be permitted to overlap. + +804.6.2 Operable Parts +All appliance controls shall comply with 309. +EXCEPTIONS: 1. Appliance doors and door latching devices shall not be required to comply with 309.4. +2. Bottom-hinged appliance doors, when in the open position, shall not be required to comply with 309.3. + +804.6.3 Dishwasher +Clear floor or ground space shall be positioned adjacent to the dishwasher door. The dishwasher door, in the open position, shall not obstruct the clear floor or ground space for the dishwasher or the sink. + +804.6.4 Range or Cooktop +Where a forward approach is provided, the clear floor or ground space shall provide knee and toe clearance complying with 306. Where knee and toe space is provided, the underside of the range or cooktop shall be insulated or otherwise configured to prevent burns, abrasions, or electrical shock. The location of controls shall not require reaching across burners. + +804.6.5 Oven +Ovens shall comply with 804.6.5. + +804.6.5.1 Side-Hinged Door Ovens +Side-hinged door ovens shall have the work surface required by 804.3 positioned adjacent to the latch side of the oven door. + +804.6.5.2 Bottom-Hinged Door Ovens +Bottom-hinged door ovens shall have the work surface required by 804.3 positioned adjacent to one side of the door. + +804.6.5.3 Controls +Ovens shall have controls on front panels. + +804.6.6 Refrigerator/Freezer +Combination refrigerators and freezers shall have at least 50 percent of the freezer space 54 inches (1370 mm) maximum above the finish floor or ground. The clear floor or ground space shall be positioned for a parallel approach to the space dedicated to a refrigerator/freezer with the centerline of the clear floor or ground space offset 24 inches (610 mm) maximum from the centerline of the dedicated space. + +805.1 General +Medical care facility and long-term care facility patient or resident sleeping rooms required to provide mobility features shall comply with 805. + +805.2 Turning Space +Turning space complying with 304 shall be provided within the room. + +805.3 Clear Floor or Ground Space +A clear floor space complying with 305 shall be provided on each side of the bed. The clear floor space shall be positioned for parallel approach to the side of the bed. + +805.4 Toilet and Bathing Rooms +Toilet and bathing rooms that are provided as part of a patient or resident sleeping room shall comply with 603. Where provided, no fewer than one water closet, one lavatory, and one bathtub or shower shall comply with the applicable requirements of 603 through 610. + +806.1 General +Transient lodging guest rooms shall comply with 806. Guest rooms required to provide mobility features shall comply with 806.2. Guest rooms required to provide communication features shall comply with 806.3. + +806.2 Guest Rooms with Mobility Features +Guest rooms required to provide mobility features shall comply with 806.2. +Advisory 806.2 Guest Rooms. The requirements in Section 806.2 do not include requirements that are common to all accessible spaces. For example, closets in guest rooms must comply with the applicable provisions for storage specified in scoping. + +806.2.1 Living and Dining Areas +Living and dining areas shall be accessible. + +806.2.2 Exterior Spaces +Exterior spaces, including patios, terraces and balconies, that serve the guest room shall be accessible. + +806.2.3 Sleeping Areas +At least one sleeping area shall provide a clear floor space complying with 305 on both sides of a bed. The clear floor space shall be positioned for parallel approach to the side of the bed. +EXCEPTION: Where a single clear floor space complying with 305 positioned for parallel approach is provided between two beds, a clear floor or ground space shall not be required on both sides of a bed. + +806.2.4 Toilet and Bathing Facilities +At least one bathroom that is provided as part of a guest room shall comply with 603. No fewer than one water closet, one lavatory, and one bathtub or shower shall comply with applicable requirements of 603 through 610. In addition, required roll-in shower compartments shall comply with 608.2.2 or 608.2.3. Toilet and bathing fixtures required to comply with 603 through 610 shall be permitted to be located in more than one toilet or bathing area, provided that travel between fixtures does not require travel between other parts of the guest room. + +806.2.4.1 Vanity Counter Top Space +If vanity counter top space is provided in non-accessible guest toilet or bathing rooms, comparable vanity counter top space, in terms of size and proximity to the lavatory, shall also be provided in accessible guest toilet or bathing rooms. +Advisory 806.2.4.1 Vanity Counter Top Space. This provision is intended to ensure that accessible guest rooms are provided with comparable vanity counter top space. + +806.2.5 Kitchens and Kitchenettes +Kitchens and kitchenettes shall comply with 804. + +806.2.6 Turning Space +Turning space complying with 304 shall be provided within the guest room. + +806.3 Guest Rooms with Communication Features +Guest rooms required to provide communication features shall comply with 806.3. +Advisory 806.3 Guest Rooms with Communication Features. In guest rooms required to have accessible communication features, consider ensuring compatibility with adaptive equipment used by people with hearing impairments. To ensure communication within the facility, as well as on commercial lines, provide telephone interface jacks that are compatible with both digital and analog signal use. If an audio headphone jack is provided on a speaker phone, a cutoff switch can be included in the jack so that insertion of the jack cuts off the speaker. If a telephone-like handset is used, the external speakers can be turned off when the handset is removed from the cradle. For headset or external amplification system compatibility, a standard subminiature jack installed in the telephone will provide the most flexibility. + +806.3.1 Alarms +Where emergency warning systems are provided, alarms complying with 702 shall be provided. + +806.3.2 Notification Devices +Visible notification devices shall be provided to alert room occupants of incoming telephone calls and a door knock or bell. Notification devices shall not be connected to visible alarm signal appliances. Telephones shall have volume controls compatible with the telephone system and shall comply with 704.3. Telephones shall be served by an electrical outlet complying with 309 located within 48 inches (1220 mm) of the telephone to facilitate the use of a TTY. + +807.1 General +Holding cells and housing cells shall comply with 807. + +807.2 Cells with Mobility Features +Cells required to provide mobility features shall comply with 807.2. + +807.2.1 Turning Space +Turning space complying with 304 shall be provided within the cell. + +807.2.2 Benches +Where benches are provided, at least one bench shall comply with 903. + +807.2.3 Beds +Where beds are provided, clear floor space complying with 305 shall be provided on at least one side of the bed. The clear floor space shall be positioned for parallel approach to the side of the bed. + +807.2.4 Toilet and Bathing Facilities +Toilet facilities or bathing facilities that are provided as part of a cell shall comply with 603. Where provided, no fewer than one water closet, one lavatory, and one bathtub or shower shall comply with the applicable requirements of 603 through 610. +Advisory 807.2.4 Toilet and Bathing Facilities. In holding cells, housing cells, or rooms required to be accessible, these requirements do not require a separate toilet room. + +807.3 Cells with Communication Features +Cells required to provide communication features shall comply with 807.3. + +807.3.1 Alarms +Where audible emergency alarm systems are provided to serve the occupants of cells, visible alarms complying with 702 shall be provided. +EXCEPTION: Visible alarms shall not be required where inmates or detainees are not allowed independent means of egress. + +807.3.2 Telephones +Telephones, where provided within cells, shall have volume controls complying with 704.3. + +808.1 General +Courtrooms shall comply with 808. + +808.2 Turning Space +Where provided, areas that are raised or depressed and accessed by ramps or platform lifts with entry ramps shall provide unobstructed turning space complying with 304. + +808.3 Clear Floor Space +Each jury box and witness stand shall have, within its defined area, clear floor space complying with 305. +EXCEPTION: In alterations, wheelchair spaces are not required to be located within the defined area of raised jury boxes or witness stands and shall be permitted to be located outside these spaces where ramp or platform lift access poses a hazard by restricting or projecting into a means of egress required by the appropriate administrative authority. + +808.4 Judges’ Benches and Courtroom Stations +Judges’ benches, clerks’ stations, bailiffs’ stations, deputy clerks’ stations, court reporters’ stations and litigants’ and counsel stations shall comply with 902. + +809.1 General +Residential dwelling units shall comply with 809. Residential dwelling units required to provide mobility features shall comply with 809.2 through 809.4. Residential dwelling units required to provide communication features shall comply with 809.5. + +809.2 Accessible Routes +Accessible routes complying with Chapter 4 shall be provided within residential dwelling units in accordance with 809.2. +EXCEPTION: Accessible routes shall not be required to or within unfinished attics or unfinished basements. + +809.2.1 Location +At least one accessible route shall connect all spaces and elements which are a part of the residential dwelling unit. Where only one accessible route is provided, it shall not pass through bathrooms, closets, or similar spaces. + +809.2.2 Turning Space +All rooms served by an accessible route shall provide a turning space complying with 304. +EXCEPTION: Turning space shall not be required in exterior spaces 30 inches (760 mm) maximum in depth or width. +Advisory 809.2.2 Turning Space. It is generally acceptable to use required clearances to provide wheelchair turning space. For example, in kitchens, 804.3.1 requires at least one work surface with clear floor space complying with 306 to be centered beneath. If designers elect to provide clear floor space that is at least 36 inches (915 mm) wide, as opposed to the required 30 inches (760 mm) wide, that clearance can be part of a T-turn, thereby maximizing efficient use of the kitchen area. However, the overlap of turning space must be limited to one segment of the T-turn so that back-up maneuvering is not restricted. It would, therefore, be unacceptable to use both the clearances under the work surface and the sink as part of a T-turn. See Section 304.3.2 regarding T-turns. + +809.3 Kitchen +Where a kitchen is provided, it shall comply with 804. + +809.4 Toilet Facilities and Bathing Facilities +At least one bathroom shall comply with 603. No fewer than one of each type of fixture provided shall comply with applicable requirements of 603 through 610. Toilet and bathing fixtures required to comply with 603 through 610 shall be located in the same toilet and bathing area, such that travel between fixtures does not require travel between other parts of the residential dwelling unit. +Advisory 809.4 Toilet Facilities and Bathing Facilities. In an effort to promote space efficiency, vanity counter top space in accessible residential dwelling units is often omitted. This omission does not promote equal access or equal enjoyment of the unit. Where comparable units have vanity counter tops, accessible units should also have vanity counter tops located as close as possible to the lavatory for convenient access to toiletries. + +809.5 Residential Dwelling Units with Communication Features +Residential dwelling units required to provide communication features shall comply with 809.5. + +809.5.1 Building Fire Alarm System +Where a building fire alarm system is provided, the system wiring shall be extended to a point within the residential dwelling unit in the vicinity of the residential dwelling unit smoke detection system. + +809.5.1.1 Alarm Appliances +Where alarm appliances are provided within a residential dwelling unit as part of the building fire alarm system, they shall comply with 702. + +809.5.1.2 Activation +All visible alarm appliances provided within the residential dwelling unit for building fire alarm notification shall be activated upon activation of the building fire alarm in the portion of the building containing the residential dwelling unit. + +809.5.2 Residential Dwelling Unit Smoke Detection System +Residential dwelling unit smoke detection systems shall comply with NFPA 72 (1999 or 2002 edition) (incorporated by reference, see “Referenced Standards” in Chapter 1). + +809.5.2.1 Activation +All visible alarm appliances provided within the residential dwelling unit for smoke detection notification shall be activated upon smoke detection. + +809.5.3 Interconnection +The same visible alarm appliances shall be permitted to provide notification of residential dwelling unit smoke detection and building fire alarm activation. + +809.5.4 Prohibited Use +Visible alarm appliances used to indicate residential dwelling unit smoke detection or building fire alarm activation shall not be used for any other purpose within the residential dwelling unit. + +809.5.5 Residential Dwelling Unit Primary Entrance +Communication features shall be provided at the residential dwelling unit primary entrance complying with 809.5.5. + +809.5.5.1 Notification +A hard-wired electric doorbell shall be provided. A button or switch shall be provided outside the residential dwelling unit primary entrance. Activation of the button or switch shall initiate an audible tone and visible signal within the residential dwelling unit. Where visible doorbell signals are located in sleeping areas, they shall have controls to deactivate the signal. + +809.5.5.2 Identification +A means for visually identifying a visitor without opening the residential dwelling unit entry door shall be provided and shall allow for a minimum 180 degree range of view. +Advisory 809.5.5.2 Identification. In doors, peepholes that include prisms clarify the image and should offer a wide-angle view of the hallway or exterior for both standing persons and wheelchair users. Such peepholes can be placed at a standard height and permit a view from several feet from the door. + +809.5.6 Site, Building, or Floor Entrance +Where a system, including a closed-circuit system, permitting voice communication between a visitor and the occupant of the residential dwelling unit is provided, the system shall comply with 708.4. + +810.1 General +Transportation facilities shall comply with 810. + +810.2 Bus Boarding and Alighting Areas +Bus boarding and alighting areas shall comply with 810.2. +Advisory 810.2 Bus Boarding and Alighting Areas. At bus stops where a shelter is provided, the bus stop pad can be located either within or outside of the shelter. + +810.2.1 Surface +Bus stop boarding and alighting areas shall have a firm, stable surface. + +810.2.2 Dimensions +Bus stop boarding and alighting areas shall provide a clear length of 96 inches (2440 mm) minimum, measured perpendicular to the curb or vehicle roadway edge, and a clear width of 60 inches (1525 mm) minimum, measured parallel to the vehicle roadway. +Note to Reader: The Department of Transportation’s ADA standards indicate that compliance is required to the extent construction specifications are within a public entity’s control: +810.2.2 Dimensions. Bus boarding and alighting areas shall provide a clear length of 96 inches (2440 mm), measured perpendicular to the curb or vehicle roadway edge, and a clear width of 60 inches (1525 mm), measured parallel to the vehicle roadway. Public entities shall ensure that the construction of bus boarding and alighting areas comply with 810.2.2, to the extent the construction specifications are within their control. + +810.2.3 Connection +Bus stop boarding and alighting areas shall be connected to streets, sidewalks, or pedestrian paths by an accessible route complying with 402. + +810.2.4 Slope +Parallel to the roadway, the slope of the bus stop boarding and alighting area shall be the same as the roadway, to the maximum extent practicable. Perpendicular to the roadway, the slope of the bus stop boarding and alighting area shall not be steeper than1:48. + +810.3 Bus Shelters +Bus shelters shall provide a minimum clear floor or ground space complying with 305 entirely within the shelter. Bus shelters shall be connected by an accessible route complying with 402 to a boarding and alighting area complying with 810.2. + +810.4 Bus Signs +Bus route identification signs shall comply with 703.5.1 through 703.5.4, and 703.5.7 and 703.5.8. In addition, to the maximum extent practicable, bus route identification signs shall comply with 703.5.5. +EXCEPTION: Bus schedules, timetables and maps that are posted at the bus stop or bus bay shall not be required to comply. + +810.5 Rail Platforms +Rail platforms shall comply with 810.5. + +810.5.1 Slope +Rail platforms shall not exceed a slope of 1:48 in all directions. +EXCEPTION: Where platforms serve vehicles operating on existing track or track laid in existing roadway, the slope of the platform parallel to the track shall be permitted to be equal to the slope (grade) of the roadway or existing track. + +810.5.2 Detectable Warnings +Platform boarding edges not protected by platform screens or guards shall have detectable warnings complying with 705 along the full length of the public use area of the platform. + +810.5.3 Platform and Vehicle Floor Coordination +Station platforms shall be positioned to coordinate with vehicles in accordance with the applicable requirements of 36 CFR Part 1192. Low-level platforms shall be 8 inches (205 mm) minimum above top of rail. +EXCEPTION: Where vehicles are boarded from sidewalks or street-level, low-level platforms shall be permitted to be less than 8 inches (205 mm). +Note to Reader: The Department of Transportation’s ADA standards note permitted alternatives where compliance is not operationally or structurally feasible in light rail, commuter rail, or intercity rail systems: +810.5.3 Platform and Vehicle Floor Coordination. Station platforms shall be positioned to coordinate with vehicles in accordance with the applicable requirements of 36 CFR part 1192. Low-level platforms shall be 8 inches (205 mm) minimum above top of rail. In light rail, commuter rail, and intercity rail systems where it is not operationally or structurally feasible to meet the horizontal gap or vertical difference requirements of part 1192 or 49 CFR part 38, mini-high platforms, car-borne or platform-mounted lifts, ramps or bridge plates or similarly manually deployed devices, meeting the requirements of 49 CFR part 38, shall suffice. +EXCEPTION: Where vehicles are boarded from sidewalks or street- level, low-level platforms shall be permitted to be less than 8 inches (205 mm). +Advisory 810.5.3 Platform and Vehicle Floor Coordination. The height and position of a platform must be coordinated with the floor of the vehicles it serves to minimize the vertical and horizontal gaps, in accordance with the ADA Accessibility Guidelines for Transportation Vehicles (36 CFR Part 1192). The vehicle guidelines, divided by bus, van, light rail, rapid rail, commuter rail, intercity rail, are available at www.access-board.gov. The preferred alignment is a high platform, level with the vehicle floor. In some cases, the vehicle guidelines permit use of a low platform in conjunction with a lift or ramp. Most such low platforms must have a minimum height of eight inches above the top of the rail. Some vehicles are designed to be boarded from a street or the sidewalk along the street and the exception permits such boarding areas to be less than eight inches high. + +810.6 Rail Station Signs +Rail station signs shall comply with 810.6. +EXCEPTION. Signs shall not be required to comply with 810.6.1 and 810.6.2 where audible signs are remotely transmitted to hand-held receivers, or are user- or proximity-actuated. +Advisory 810.6 Rail Station Signs Exception. Emerging technologies such as an audible sign systems using infrared transmitters and receivers may provide greater accessibility in the transit environment than traditional Braille and raised letter signs. The transmitters are placed on or next to print signs and transmit their information to an infrared receiver that is held by a person. By scanning an area, the person will hear the sign. This means that signs can be placed well out of reach of Braille readers, even on parapet walls and on walls beyond barriers. Additionally, such signs can be used to provide wayfinding information that cannot be efficiently conveyed on Braille signs. + +810.6.1 Entrances +Where signs identify a station or its entrance, at least one sign at each entrance shall comply with 703.2 and shall be placed in uniform locations to the maximum extent practicable. Where signs identify a station that has no defined entrance, at least one sign shall comply with 703.2 and shall be placed in a central location. + +810.6.2 Routes and Destinations +Lists of stations, routes and destinations served by the station which are located on boarding areas, platforms, or mezzanines shall comply with 703.5. At least one tactile sign identifying the specific station and complying with 703.2 shall be provided on each platform or boarding area. Signs covered by this requirement shall, to the maximum extent practicable, be placed in uniform locations within the system. +EXCEPTION: Where sign space is limited, characters shall not be required to exceed 3 inches (75 mm). +Advisory 810.6.2 Routes and Destinations. Route maps are not required to comply with the informational sign requirements in this document. + +810.6.3 Station Names +Stations covered by this section shall have identification signs complying with 703.5. Signs shall be clearly visible and within the sight lines of standing and sitting passengers from within the vehicle on both sides when not obstructed by another vehicle. +Advisory 810.6.3 Station Names. It is also important to place signs at intervals in the station where passengers in the vehicle will be able to see a sign when the vehicle is either stopped at the station or about to come to a stop in the station. The number of signs necessary may be directly related to the size of the lettering displayed on the sign. + +810.7 Public Address Systems +Where public address systems convey audible information to the public, the same or equivalent information shall be provided in a visual format. + +810.8 Clocks +Where clocks are provided for use by the public, the clock face shall be uncluttered so that its elements are clearly visible. Hands, numerals and digits shall contrast with the background either light-on-dark or dark-on-light. Where clocks are installed overhead, numerals and digits shall comply with 703.5. + +810.9 Escalators +Where provided, escalators shall comply with the sections 6.1.3.5.6 and 6.1.3.6.5 of ASME A17.1 (incorporated by reference, see “Referenced Standards” in Chapter 1) and shall have a clear width of 32 inches (815 mm) minimum. +EXCEPTION: Existing escalators in key stations shall not be required to comply with 810.9. + +810.10 Track Crossings +Where a circulation path serving boarding platforms crosses tracks, it shall comply with 402. +EXCEPTION: Openings for wheel flanges shall be permitted to be 2½ inches (64 mm) maximum. + +811.1 General +Storage shall comply with 811. + +811.2 Clear Floor or Ground Space +A clear floor or ground space complying with 305 shall be provided. + +811.3 Height +Storage elements shall comply with at least one of the reach ranges specified in 308. + +811.4 Operable Parts +Operable parts shall comply with 309. + +901.1 Scope +The provisions of Chapter 9 shall apply where required by Chapter 2 or where referenced by a requirement in this document. + +902.1 General +Dining surfaces and work surfaces shall comply with 902.2 and 902.3. +EXCEPTION: Dining surfaces and work surfaces for children’s use shall be permitted to comply with 902.4. +Advisory 902.1 General. Dining surfaces include, but are not limited to, bars, tables, lunch counters, and booths. Examples of work surfaces include writing surfaces, study carrels, student laboratory stations, baby changing and other tables or fixtures for personal grooming, coupon counters, and where covered by the ABA scoping provisions, employee work stations. + +902.2 Clear Floor or Ground Space +A clear floor space complying with 305 positioned for a forward approach shall be provided. Knee and toe clearance complying with 306 shall be provided. + +902.3 Height +The tops of dining surfaces and work surfaces shall be 28 inches (710 mm) minimum and 34 inches (865 mm) maximum above the finish floor or ground. + +902.4 Dining Surfaces and Work Surfaces for Children’s Use +Accessible dining surfaces and work surfaces for children’s use shall comply with 902.4. +EXCEPTION: Dining surfaces and work surfaces that are used primarily by children 5 years and younger shall not be required to comply with 902.4 where a clear floor or ground space complying with 305 positioned for a parallel approach is provided. + +902.4.1 Clear Floor or Ground Space +A clear floor space complying with 305 positioned for forward approach shall be provided. Knee and toe clearance complying with 306 shall be provided, except that knee clearance 24 inches (610 mm) minimum above the finish floor or ground shall be permitted. + +902.4.2 Height +The tops of tables and counters shall be 26 inches (660 mm) minimum and 30 inches (760 mm) maximum above the finish floor or ground. + +903.1 General +Benches shall comply with 903. + +903.2 Clear Floor or Ground Space +Clear floor or ground space complying with 305 shall be provided and shall be positioned at the end of the bench seat and parallel to the short axis of the bench. + +903.3 Size +Benches shall have seats that are 42 inches (1065 mm) long minimum and 20 inches (510 mm) deep minimum and 24 inches (610 mm) deep maximum. + +903.4 Back Support +The bench shall provide for back support or shall be affixed to a wall. Back support shall be 42 inches (1065 mm) long minimum and shall extend from a point 2 inches (51 mm) maximum above the seat surface to a point 18 inches (455 mm) minimum above the seat surface. Back support shall be 2½ inches (64 mm) maximum from the rear edge of the seat measured horizontally. +Advisory 903.4 Back Support. To assist in transferring to the bench, consider providing grab bars on a wall adjacent to the bench, but not on the seat back. If provided, grab bars cannot obstruct transfer to the bench. + +903.5 Height +The top of the bench seat surface shall be 17 inches (430 mm) minimum and 19 inches (485 mm) maximum above the finish floor or ground. + +903.6 Structural Strength +Allowable stresses shall not be exceeded for materials used when a vertical or horizontal force of 250 pounds (1112 N) is applied at any point on the seat, fastener, mounting device, or supporting structure. + +903.7 Wet Locations +Where installed in wet locations, the surface of the seat shall be slip resistant and shall not accumulate water. + +904.1 General +Check-out aisles and sales and service counters shall comply with the applicable requirements of 904. + +904.2 Approach +All portions of counters required to comply with 904 shall be located adjacent to a walking surface complying with 403. +Advisory 904.2 Approach. If a cash register is provided at the sales or service counter, locate the accessible counter close to the cash register so that a person using a wheelchair is visible to sales or service personnel and to minimize the reach for a person with a disability. + +904.3 Check-Out Aisles +Check-out aisles shall comply with 904.3. + +904.3.1 Aisle +Aisles shall comply with 403. + +904.3.2 Counter +The counter surface height shall be 38 inches (965 mm) maximum above the finish floor or ground. The top of the counter edge protection shall be 2 inches (51 mm) maximum above the top of the counter surface on the aisle side of the check-out counter. + +904.3.3 Check Writing Surfaces +Where provided, check writing surfaces shall comply with 902.3. + +904.4 Sales and Service Counters +Sales counters and service counters shall comply with 904.4.1 or 904.4.2. The accessible portion of the counter top shall extend the same depth as the sales or service counter top. +EXCEPTION: In alterations, when the provision of a counter complying with 904.4 would result in a reduction of the number of existing counters at work stations or a reduction of the number of existing mail boxes, the counter shall be permitted to have a portion which is 24 inches (610 mm) long minimum complying with 904.4.1 provided that the required clear floor or ground space is centered on the accessible length of the counter. + +904.4.1 Parallel Approach +A portion of the counter surface that is 36 inches (915 mm) long minimum and 36 inches (915 mm) high maximum above the finish floor shall be provided. A clear floor or ground space complying with 305 shall be positioned for a parallel approach adjacent to the 36 inch (915 mm) minimum length of counter. +EXCEPTION: Where the provided counter surface is less than 36 inches (915 mm) long, the entire counter surface shall be 36 inches (915 mm) high maximum above the finish floor. + +904.4.2 Forward Approach +A portion of the counter surface that is 30 inches (760 mm) long minimum and 36 inches (915 mm) high maximum shall be provided. Knee and toe space complying with 306 shall be provided under the counter. A clear floor or ground space complying with 305 shall be positioned for a forward approach to the counter. + +904.5 Food Service Lines +Counters in food service lines shall comply with 904.5. + +904.5.1 Self-Service Shelves and Dispensing Devices +Self-service shelves and dispensing devices for tableware, dishware, condiments, food and beverages shall comply with 308. + +904.5.2 Tray Slides +The tops of tray slides shall be 28 inches (710 mm) minimum and 34 inches (865 mm) maximum above the finish floor or ground. + +904.6 Security Glazing +Where counters or teller windows have security glazing to separate personnel from the public, a method to facilitate voice communication shall be provided. Telephone handset devices, if provided, shall comply with 704.3. +Advisory 904.6 Security Glazing. Assistive listening devices complying with 706 can facilitate voice communication at counters or teller windows where there is security glazing which promotes distortion in audible information. Where assistive listening devices are installed, place signs complying with 703.7.2.4 to identify those facilities which are so equipped. Other voice communication methods include, but are not limited to, grilles, slats, talk-through baffles, intercoms, or telephone handset devices. + +1001.1 Scope +The provisions of Chapter 10 shall apply where required by Chapter 2 or where referenced by a requirement in this document. +Advisory 1001.1 Scope. Unless otherwise modified or specifically addressed in Chapter 10, all other ADAAG provisions apply to the design and construction of recreation facilities and elements. The provisions in Section 1001.1 apply wherever these elements are provided. For example, office buildings may contain a room with exercise equipment to which these sections would apply. + +1002.1 General +Amusement rides shall comply with 1002. + +1002.2 Accessible Routes +Accessible routes serving amusement rides shall comply with Chapter 4. +EXCEPTIONS: 1. In load or unload areas and on amusement rides, where compliance with 405.2 is not structurally or operationally feasible, ramp slope shall be permitted to be 1:8 maximum. +2. In load or unload areas and on amusement rides, handrails provided along walking surfaces complying with 403 and required on ramps complying with 405 shall not be required to comply with 505 where compliance is not structurally or operationally feasible. +Advisory 1002.2 Accessible Routes Exception 1. Steeper slopes are permitted on accessible routes connecting the amusement ride in the load and unload position where it is “structurally or operationally infeasible.” In most cases, this will be limited to areas where the accessible route leads directly to the amusement ride and where there are space limitations on the ride, not the queue line. Where possible, the least possible slope should be used on the accessible route that serves the amusement ride. + +1002.3 Load and Unload Areas +A turning space complying with 304.2 and 304.3 shall be provided in load and unload areas. + +1002.4 Wheelchair Spaces in Amusement Rides +Wheelchair spaces in amusement rides shall comply with 1002.4. + +1002.4.1 Floor or Ground Surface +The floor or ground surface of wheelchair spaces shall be stable and firm. + +1002.4.2 Slope +The floor or ground surface of wheelchair spaces shall have a slope not steeper than 1:48 when in the load and unload position. + +1002.4.3 Gaps +Floors of amusement rides with wheelchair spaces and floors of load and unload areas shall be coordinated so that, when amusement rides are at rest in the load and unload position, the vertical difference between the floors shall be within plus or minus 5/8 inches (16 mm) and the horizontal gap shall be 3 inches (75 mm) maximum under normal passenger load conditions. +EXCEPTION: Where compliance is not operationally or structurally feasible, ramps, bridge plates, or similar devices complying with the applicable requirements of 36 CFR 1192.83(c) shall be provided. +Advisory 1002.4.3 Gaps Exception. 36 CFR 1192.83© ADA Accessibility Guidelines for Transportation Vehicles – Light Rail Vehicles and Systems – Mobility Aid Accessibility is available at www.access-board.gov. It includes provisions for bridge plates and ramps that can be used at gaps between wheelchair spaces and floors of load and unload areas. + +1002.4.4 Clearances +Clearances for wheelchair spaces shall comply with 1002.4.4. +EXCEPTIONS: 1. Where provided, securement devices shall be permitted to overlap required clearances. +2. Wheelchair spaces shall be permitted to be mechanically or manually repositioned. +3. Wheelchair spaces shall not be required to comply with 307.4. +Advisory 1002.4.4 Clearances Exception 3. This exception for protruding objects applies to the ride devices, not to circulation areas or accessible routes in the queue lines or the load and unload areas. + +1002.4.4.1 Width and Length. +Wheelchair spaces shall provide a clear width of 30 inches (760 mm) minimum and a clear length of 48 inches (1220 mm) minimum measured to 9 inches (230 mm) minimum above the floor surface. + +1002.4.4.2 Side Entry. +Where wheelchair spaces are entered only from the side, amusement rides shall be designed to permit sufficient maneuvering clearance for individuals using a wheelchair or mobility aid to enter and exit the ride. +Advisory 1002.4.4.2 Side Entry. The amount of clear space needed within the ride, and the size and position of the opening are interrelated. A 32 inch (815 mm) clear opening will not provide sufficient width when entered through a turn into an amusement ride. Additional space for maneuvering and a wider door will be needed where a side opening is centered on the ride. For example, where a 42 inch (1065 mm) opening is provided, a minimum clear space of 60 inches (1525 mm) in length and 36 inches (915mm) in depth is needed to ensure adequate space for maneuvering. + +1002.4.4.3 Permitted Protrusions in Wheelchair Spaces. +Objects are permitted to protrude a distance of 6 inches (150 mm) maximum along the front of the wheelchair space, where located 9 inches (230 mm) minimum and 27 inches (685 mm) maximum above the floor or ground surface of the wheelchair space. Objects are permitted to protrude a distance of 25 inches (635 mm) maximum along the front of the wheelchair space, where located more than 27 inches (685 mm) above the floor or ground surface of the wheelchair space. + +1002.4.5 Ride Entry +Openings providing entry to wheelchair spaces on amusement rides shall be 32 inches (815 mm) minimum clear. + +1002.4.6 Approach +One side of the wheelchair space shall adjoin an accessible route when in the load and unload position. + +1002.4.7 Companion Seats +Where the interior width of the amusement ride is greater than 53 inches (1345 mm), seating is provided for more than one rider, and the wheelchair is not required to be centered within the amusement ride, a companion seat shall be provided for each wheelchair space. + +1002.4.7.1 Shoulder-to-Shoulder Seating. +Where an amusement ride provides shoulder-to-shoulder seating, companion seats shall be shoulder-to-shoulder with the adjacent wheelchair space. +EXCEPTION: Where shoulder-to-shoulder companion seating is not operationally or structurally feasible, compliance with this requirement shall be required to the maximum extent practicable. + +1002.5 Amusement Ride Seats Designed for Transfer +Amusement ride seats designed for transfer shall comply with 1002.5 when positioned for loading and unloading. +Advisory 1002.5 Amusement Ride Seats Designed for Transfer. The proximity of the clear floor or ground space next to an element and the height of the element one is transferring to are both critical for a safe and independent transfer. Providing additional clear floor or ground space both in front of and diagonal to the element will provide flexibility and will increase usability for a more diverse population of individuals with disabilities. Ride seats designed for transfer should involve only one transfer. Where possible, designers are encouraged to locate the ride seat no higher than 17 to 19 inches (430 to 485 mm) above the load and unload surface. Where greater distances are required for transfers, providing gripping surfaces, seat padding, and avoiding sharp objects in the path of transfer will facilitate the transfer. + +1002.5.1 Clear Floor or Ground Space +A clear floor or ground space complying with 305 shall be provided in the load and unload area adjacent to the amusement ride seats designed for transfer. + +1002.5.2 Transfer Height +The height of amusement ride seats designed for transfer shall be 14 inches (355 mm) minimum and 24 inches (610 mm) maximum measured from the surface of the load and unload area. + +1002.5.3 Transfer Entry +Where openings are provided for transfer to amusement ride seats, the openings shall provide clearance for transfer from a wheelchair or mobility aid to the amusement ride seat. + +1002.5.4 Wheelchair Storage Space +Wheelchair storage spaces complying with 305 shall be provided in or adjacent to unload areas for each required amusement ride seat designed for transfer and shall not overlap any required means of egress or accessible route. + +1002.6 Transfer Devices for Use with Amusement Rides +Transfer devices for use with amusement rides shall comply with 1002.6 when positioned for loading and unloading. + +1002.6.1 Clear Floor or Ground Space +A clear floor or ground space complying with 305 shall be provided in the load and unload area adjacent to the transfer device. + +1002.6.2 Transfer Height +The height of transfer device seats shall be 14 inches (355 mm) minimum and 24 inches (610 mm) maximum measured from the load and unload surface. + +1002.6.3 Wheelchair Storage Space +Wheelchair storage spaces complying with 305 shall be provided in or adjacent to unload areas for each required transfer device and shall not overlap any required means of egress or accessible route. + +1003.1 General +Recreational boating facilities shall comply with 1003. + +1003.2 Accessible Routes +Accessible routes serving recreational boating facilities, including gangways and floating piers, shall comply with Chapter 4 except as modified by the exceptions in 1003.2. + +1003.2.1 Boat Slips +Accessible routes serving boat slips shall be permitted to use the exceptions in 1003.2.1. +EXCEPTIONS: 1. Where an existing gangway or series of gangways is replaced or altered, an increase in the length of the gangway shall not be required to comply with 1003.2 unless required by 202.4. +2. Gangways shall not be required to comply with the maximum rise specified in 405.6. +3. Where the total length of a gangway or series of gangways serving as part of a required accessible route is 80 feet (24 m) minimum, gangways shall not be required to comply with 405.2. +4. Where facilities contain fewer than 25 boat slips and the total length of the gangway or series of gangways serving as part of a required accessible route is 30 feet (9145 mm) minimum, gangways shall not be required to comply with 405.2. +5. Where gangways connect to transition plates, landings specified by 405.7 shall not be required. +6. Where gangways and transition plates connect and are required to have handrails, handrail extensions shall not be required. Where handrail extensions are provided on gangways or transition plates, the handrail extensions shall not be required to be parallel with the ground or floor surface. +7. The cross slope specified in 403.3 and 405.3 for gangways, transition plates, and floating piers that are part of accessible routes shall be measured in the static position. +8. Changes in level complying with 303.3 and 303.4 shall be permitted on the surfaces of gangways and boat launch ramps. +Advisory 1003.2.1 Boat Slips Exception 3. The following example shows how exception 3 would be applied: A gangway is provided to a floating pier which is required to be on an accessible route. The vertical distance is 10 feet (3050 mm) between the elevation where the gangway departs the landside connection and the elevation of the pier surface at the lowest water level. Exception 3 permits the gangway to be 80 feet (24 m) long. Another design solution would be to have two 40 foot (12 m) plus continuous gangways joined together at a float, where the float (as the water level falls) will stop dropping at an elevation five feet below the landside connection. The length of transition plates would not be included in determining if the gangway(s) meet the requirements of the exception. + +1003.2.2 Boarding Piers at Boat Launch Ramps +Accessible routes serving boarding piers at boat launch ramps shall be permitted to use the exceptions in 1003.2.2. +EXCEPTIONS: 1. Accessible routes serving floating boarding piers shall be permitted to use Exceptions 1, 2, 5, 6, 7 and 8 in 1003.2.1. +2. Where the total length of the gangway or series of gangways serving as part of a required accessible route is 30 feet (9145 mm) minimum, gangways shall not be required to comply with 405.2. +3. Where the accessible route serving a floating boarding pier or skid pier is located within a boat launch ramp, the portion of the accessible route located within the boat launch ramp shall not be required to comply with 405. + +1003.3 Clearances +Clearances at boat slips and on boarding piers at boat launch ramps shall comply with 1003.3. +Advisory 1003.3 Clearances. Although the minimum width of the clear pier space is 60 inches (1525 mm), it is recommended that piers be wider than 60 inches (1525 mm) to improve the safety for persons with disabilities, particularly on floating piers. + +1003.3.1 Boat Slip Clearance +Boat slips shall provide clear pier space 60 inches (1525 mm) wide minimum and at least as long as the boat slips. Each 10 feet (3050 mm) maximum of linear pier edge serving boat slips shall contain at least one continuous clear opening 60 inches (1525 mm) wide minimum. +EXCEPTIONS: 1. Clear pier space shall be permitted to be 36 inches (915 mm) wide minimum for a length of 24 inches (610 mm) maximum, provided that multiple 36 inch (915 mm) wide segments are separated by segments that are 60 inches (1525 mm) wide minimum and 60 inches (1525 mm) long minimum. +2. Edge protection shall be permitted at the continuous clear openings, provided that it is 4 inches (100 mm) high maximum and 2 inches (51 mm) wide maximum. +3. In existing piers, clear pier space shall be permitted to be located perpendicular to the boat slip and shall extend the width of the boat slip, where the facility has at least one boat slip complying with 1003.3, and further compliance with 1003.3 would result in a reduction in the number of boat slips available or result in a reduction of the widths of existing slips. +Advisory 1003.3.1 Boat Slip Clearance Exception 3. Where the conditions in exception 3 are satisfied, existing facilities are only required to have one accessible boat slip with a pier clearance which runs the length of the slip. All other accessible slips are allowed to have the required pier clearance at the head of the slip. Under this exception, at piers with perpendicular boat slips, the width of most “finger piers” will remain unchanged. However, where mooring systems for floating piers are replaced as part of pier alteration projects, an opportunity may exist for increasing accessibility. Piers may be reconfigured to allow an increase in the number of wider finger piers, and serve as accessible boat slips. + +1003.3.2 Boarding Pier Clearances +Boarding piers at boat launch ramps shall provide clear pier space 60 inches (1525 mm) wide minimum and shall extend the full length of the boarding pier. Every 10 feet (3050 mm) maximum of linear pier edge shall contain at least one continuous clear opening 60 inches (1525 mm) wide minimum. +EXCEPTIONS: 1. The clear pier space shall be permitted to be 36 inches (915 mm) wide minimum for a length of 24 inches (610 mm) maximum provided that multiple 36 inch (915 mm) wide segments are separated by segments that are 60 inches (1525 mm) wide minimum and 60 inches (1525 mm) long minimum. +2. Edge protection shall be permitted at the continuous clear openings provided that it is 4 inches (100 mm) high maximum and 2 inches (51 mm) wide maximum. + +1004.1 Clear Floor Space +Exercise machines and equipment shall have a clear floor space complying with 305 positioned for transfer or for use by an individual seated in a wheelchair. Clear floor or ground spaces required at exercise machines and equipment shall be permitted to overlap. +Advisory 1004.1 Clear Floor Space. One clear floor or ground space is permitted to be shared between two pieces of exercise equipment. To optimize space use, designers should carefully consider layout options such as connecting ends of the row and center aisle spaces. The position of the clear floor space may vary greatly depending on the use of the equipment or machine. For example, to provide access to a shoulder press machine, clear floor space next to the seat would be appropriate to allow for transfer. Clear floor space for a bench press machine designed for use by an individual seated in a wheelchair, however, will most likely be centered on the operating mechanisms. + +1005.1 Accessible Routes +Accessible routes serving fishing piers and platforms, including gangways and floating piers, shall comply with Chapter 4. +EXCEPTIONS: 1. Accessible routes serving floating fishing piers and platforms shall be permitted to use Exceptions 1, 2, 5, 6, 7 and 8 in 1003.2.1. +2. Where the total length of the gangway or series of gangways serving as part of a required accessible route is 30 feet (9145 mm) minimum, gangways shall not be required to comply with 405.2. + +1005.2 Railings +Where provided, railings, guards, or handrails shall comply with 1005.2. + +1005.2.1 Height +At least 25 percent of the railings, guards, or handrails shall be 34 inches (865 mm) maximum above the ground or deck surface. +EXCEPTION: Where a guard complying with sections 1003.2.12.1 and 1003.2.12.2 of the International Building Code (2000 edition) or sections 1012.2 and 1012.3 of the International Building Code (2003 edition) (incorporated by reference, see “Referenced Standards” in Chapter 1) is provided, the guard shall not be required to comply with 1005.2.1. + +1005.2.1.1 Dispersion. +Railings, guards, or handrails required to comply with 1005.2.1 shall be dispersed throughout the fishing pier or platform. +Advisory 1005.2.1.1 Dispersion. Portions of the railings that are lowered to provide fishing opportunities for persons with disabilities must be located in a variety of locations on the fishing pier or platform to give people a variety of locations to fish. Different fishing locations may provide varying water depths, shade (at certain times of the day), vegetation, and proximity to the shoreline or bank. + +1005.3 Edge Protection +Where railings, guards, or handrails complying with 1005.2 are provided, edge protection complying with 1005.3.1 or 1005.3.2 shall be provided. +Advisory 1005.3 Edge Protection. Edge protection is required only where railings, guards, or handrails are provided on a fishing pier or platform. Edge protection will prevent wheelchairs or other mobility devices from slipping off the fishing pier or platform. Extending the deck of the fishing pier or platform 12 inches (305 mm) where the 34 inch (865 mm) high railing is provided is an alternative design, permitting individuals using wheelchairs or other mobility devices to pull into a clear space and move beyond the face of the railing. In such a design, curbs or barriers are not required. + +1005.3.1 Curb or Barrier +Curbs or barriers shall extend 2 inches (51 mm) minimum above the surface of the fishing pier or platform. + +1005.3.2 Extended Ground or Deck Surface +The ground or deck surface shall extend 12 inches (305 mm) minimum beyond the inside face of the railing. Toe clearance shall be provided and shall be 30 inches (760 mm) wide minimum and 9 inches (230 mm) minimum above the ground or deck surface beyond the railing. + +1005.4 Clear Floor or Ground Space +At each location where there are railings, guards, or handrails complying with 1005.2.1, a clear floor or ground space complying with 305 shall be provided. Where there are no railings, guards, or handrails, at least one clear floor or ground space complying with 305 shall be provided on the fishing pier or platform. + +1005.5 Turning Space +At least one turning space complying with 304.3 shall be provided on fishing piers and platforms. + +1006.1 General +Golf facilities shall comply with 1006. + +1006.2 Accessible Routes +Accessible routes serving teeing grounds, practice teeing grounds, putting greens, practice putting greens, teeing stations at driving ranges, course weather shelters, golf car rental areas, bag drop areas, and course toilet rooms shall comply with Chapter 4 and shall be 48 inches (1220 mm) wide minimum. Where handrails are provided, accessible routes shall be 60 inches (1525 mm) wide minimum. +EXCEPTION: Handrails shall not be required on golf courses. Where handrails are provided on golf courses, the handrails shall not be required to comply with 505. + +1006.3 Golf Car Passages +Golf car passages shall comply with 1006.3. + +1006.3.1 Clear Width +The clear width of golf car passages shall be 48 inches (1220 mm) minimum. + +1006.3.2 Barriers +Where curbs or other constructed barriers prevent golf cars from entering a fairway, openings 60 inches (1525 mm) wide minimum shall be provided at intervals not to exceed 75 yards (69 m). + +1006.4 Weather Shelters +A clear floor or ground space 60 inches (1525 mm) minimum by 96 inches (2440 mm) minimum shall be provided within weather shelters. + +1007.1 General +Miniature golf facilities shall comply with 1007. + +1007.2 Accessible Routes +Accessible routes serving holes on miniature golf courses shall comply with Chapter 4. Accessible routes located on playing surfaces of miniature golf holes shall be permitted to use the exceptions in 1007.2. +EXCEPTIONS: 1. Playing surfaces shall not be required to comply with 302.2. +2. Where accessible routes intersect playing surfaces of holes, a 1 inch (25 mm) maximum curb shall be permitted for a width of 32 inches (815 mm) minimum. +3. A slope not steeper than 1:4 for a 4 inch (100 mm) maximum rise shall be permitted. +4. Ramp landing slopes specified by 405.7.1 shall be permitted to be 1:20 maximum. +5. Ramp landing length specified by 405.7.3 shall be permitted to be 48 inches (1220 mm) long minimum. +6. Ramp landing size specified by 405.7.4 shall be permitted to be 48 inches (1220 mm) minimum by 60 inches (1525 mm) minimum. +7. Handrails shall not be required on holes. Where handrails are provided on holes, the handrails shall not be required to comply with 505. + +1007.3 Miniature Golf Holes +Miniature golf holes shall comply with 1007.3. + +1007.3.1 Start of Play +A clear floor or ground space 48 inches (1220 mm) minimum by 60 inches (1525 mm) minimum with slopes not steeper than 1:48 shall be provided at the start of play. + +1007.3.2 Golf Club Reach Range Area +All areas within holes where golf balls rest shall be within 36 inches (915 mm) maximum of a clear floor or ground space 36 inches (915 mm) wide minimum and 48 inches (1220 mm) long minimum having a running slope not steeper than 1:20. The clear floor or ground space shall be served by an accessible route. +Advisory 1007.3.2 Golf Club Reach Range Area. The golf club reach range applies to all holes required to be accessible. This includes accessible routes provided adjacent to or, where provided, on the playing surface of the hole. + +1008.1 General +Play areas shall comply with 1008. + +1008.2 Accessible Routes +Accessible routes serving play areas shall comply with Chapter 4 and 1008.2 and shall be permitted to use the exceptions in 1008.2.1 through 1008.2.3. Where accessible routes serve ground level play components, the vertical clearance shall be 80 inches high (2030 mm) minimum. + +1008.2.1 Ground Level and Elevated Play Components +Accessible routes serving ground level play components and elevated play components shall be permitted to use the exceptions in 1008.2.1. +EXCEPTIONS: 1. Transfer systems complying with 1008.3 shall be permitted to connect elevated play components except where 20 or more elevated play components are provided no more than 25 percent of the elevated play components shall be permitted to be connected by transfer systems. +2. Where transfer systems are provided, an elevated play component shall be permitted to connect to another elevated play component as part of an accessible route. + +1008.2.2 Soft Contained Play Structures +Accessible routes serving soft contained play structures shall be permitted to use the exception in 1008.2.2. +EXCEPTION: Transfer systems complying with 1008.3 shall be permitted to be used as part of an accessible route. + +1008.2.3 Water Play Components +Accessible routes serving water play components shall be permitted to use the exceptions in 1008.2.3. +EXCEPTIONS: 1. Where the surface of the accessible route, clear floor or ground spaces, or turning spaces serving water play components is submerged, compliance with 302, 403.3, 405.2, 405.3, and 1008.2.6 shall not be required. +2. Transfer systems complying with 1008.3 shall be permitted to connect elevated play components in water. +Advisory 1008.2.3 Water Play Components. Personal wheelchairs and mobility devices may not be appropriate for submerging in water when using play components in water. Some may have batteries, motors, and electrical systems that when submerged in water may cause damage to the personal mobility device or wheelchair or may contaminate the water. Providing an aquatic wheelchair made of non-corrosive materials and designed for access into the water will protect the water from contamination and avoid damage to personal wheelchairs. + +1008.2.4 Clear Width +Accessible routes connecting play components shall provide a clear width complying with 1008.2.4. + +1008.2.4.1 Ground Level. +At ground level, the clear width of accessible routes shall be 60 inches (1525 mm) minimum. +EXCEPTIONS: 1. In play areas less than 1000 square feet (93 square meters), the clear width of accessible routes shall be permitted to be 44 inches (1120 mm) minimum, if at least one turning space complying with 304.3 is provided where the restricted accessible route exceeds 30 feet (9145 mm) in length. +2. The clear width of accessible routes shall be permitted to be 36 inches (915 mm) minimum for a distance of 60 inches (1525 mm) maximum provided that multiple reduced width segments are separated by segments that are 60 inches (1525 mm) wide minimum and 60 inches (1525 mm) long minimum. + +1008.2.4.2 Elevated. +The clear width of accessible routes connecting elevated play components shall be 36 inches (915 mm) minimum. +EXCEPTIONS: 1. The clear width of accessible routes connecting elevated play components shall be permitted to be reduced to 32 inches (815 mm) minimum for a distance of 24 inches (610 mm) maximum provided that reduced width segments are separated by segments that are 48 inches (1220 mm) long minimum and 36 inches (915 mm) wide minimum. +2. The clear width of transfer systems connecting elevated play components shall be permitted to be 24 inches (610 mm) minimum. + +1008.2.5 Ramps +Within play areas, ramps connecting ground level play components and ramps connecting elevated play components shall comply with 1008.2.5. + +1008.2.5.1 Ground Level. +Ramp runs connecting ground level play components shall have a running slope not steeper than 1:16. + +1008.2.5.2 Elevated. +The rise for any ramp run connecting elevated play components shall be 12 inches (305 mm) maximum. + +1008.2.5.3 Handrails. +Where required on ramps serving play components, the handrails shall comply with 505 except as modified by 1008.2.5.3. +EXCEPTIONS: 1. Handrails shall not be required on ramps located within ground level use zones. +2. Handrail extensions shall not be required. + +1008.2.5.3.1 Handrail Gripping Surfaces. +Handrail gripping surfaces with a circular cross section shall have an outside diameter of 0.95 inch (24 mm) minimum and 1.55 inches (39 mm) maximum. Where the shape of the gripping surface is non-circular, the handrail shall provide an equivalent gripping surface. + +1008.2.5.3.2 Handrail Height. +The top of handrail gripping surfaces shall be 20 inches (510 mm) minimum and 28 inches (710 mm) maximum above the ramp surface. + +1008.2.6 Ground Surfaces +Ground surfaces on accessible routes, clear floor or ground spaces, and turning spaces shall comply with 1008.2.6. +Advisory 1008.2.6 Ground Surfaces. Ground surfaces must be inspected and maintained regularly to ensure continued compliance with the ASTM F 1951 standard. The type of surface material selected and play area use levels will determine the frequency of inspection and maintenance activities. + +1008.2.6.1 Accessibility. +Ground surfaces shall comply with ASTM F 1951 (incorporated by reference, see “Referenced Standards” in Chapter 1). Ground surfaces shall be inspected and maintained regularly and frequently to ensure continued compliance with ASTM F 1951. + +1008.2.6.2 Use Zones. +Ground surfaces located within use zones shall comply with ASTM F 1292 (1999 edition or 2004 edition) (incorporated by reference, see “Referenced Standards” in Chapter 1). + +1008.3 Transfer Systems +Where transfer systems are provided to connect to elevated play components, transfer systems shall comply with 1008.3. +Advisory 1008.3 Transfer Systems. Where transfer systems are provided, consideration should be given to the distance between the transfer system and the elevated play components. Moving between a transfer platform and a series of transfer steps requires extensive exertion for some children. Designers should minimize the distance between the points where a child transfers from a wheelchair or mobility device and where the elevated play components are located. Where elevated play components are used to connect to another elevated play component instead of an accessible route, careful consideration should be used in the selection of the play components used for this purpose. + +1008.3.1 Transfer Platforms +Transfer platforms shall be provided where transfer is intended from wheelchairs or other mobility aids. Transfer platforms shall comply with 1008.3.1. + +1008.3.1.1 Size. +Transfer platforms shall have level surfaces 14 inches (355 mm) deep minimum and 24 inches (610 mm) wide minimum. + +1008.3.1.2 Height. +The height of transfer platforms shall be 11 inches (280 mm) minimum and 18 inches (455 mm) maximum measured to the top of the surface from the ground or floor surface. + +1008.3.1.3 Transfer Space. +A transfer space complying with 305.2 and 305.3 shall be provided adjacent to the transfer platform. The 48 inch (1220 mm) long minimum dimension of the transfer space shall be centered on and parallel to the 24 inch (610 mm) long minimum side of the transfer platform. The side of the transfer platform serving the transfer space shall be unobstructed. + +1008.3.1.4 Transfer Supports. +At least one means of support for transferring shall be provided. + +1008.3.2 Transfer Steps +Transfer steps shall be provided where movement is intended from transfer platforms to levels with elevated play components required to be on accessible routes. Transfer steps shall comply with 1008.3.2. + +1008.3.2.1 Size. +Transfer steps shall have level surfaces 14 inches (355 mm) deep minimum and 24 inches (610 mm) wide minimum. + +1008.3.2.2 Height. +Each transfer step shall be 8 inches (205 mm) high maximum. + +1008.3.2.3 Transfer Supports. +At least one means of support for transferring shall be provided. +Advisory 1008.3.2.3 Transfer Supports. Transfer supports are required on transfer platforms and transfer steps to assist children when transferring. Some examples of supports include a rope loop, a loop type handle, a slot in the edge of a flat horizontal or vertical member, poles or bars, or D rings on the corner posts. + +1008.4 Play Components +Ground level play components on accessible routes and elevated play components connected by ramps shall comply with 1008.4. + +1008.4.1 Turning Space +At least one turning space complying with 304 shall be provided on the same level as play components. Where swings are provided, the turning space shall be located immediately adjacent to the swing. + +1008.4.2 Clear Floor or Ground Space +Clear floor or ground space complying with 305.2 and 305.3 shall be provided at play components. + +1008.4.3 Play Tables +Where play tables are provided, knee clearance 24 inches (610 mm) high minimum, 17 inches deep (430 mm) minimum, and 30 inches (760 mm) wide minimum shall be provided. The tops of rims, curbs, or other obstructions shall be 31 inches (785 mm) high maximum. +EXCEPTION: Play tables designed and constructed primarily for children 5 years and younger shall not be required to provide knee clearance where the clear floor or ground space required by 1008.4.2 is arranged for a parallel approach. + +1008.4.4 Entry Points and Seats +Where play components require transfer to entry points or seats, the entry points or seats shall be 11 inches (280 mm) minimum and 24 inches (610 mm) maximum from the clear floor or ground space. +EXCEPTION: Entry points of slides shall not be required to comply with 1008.4.4. + +1008.4.5 Transfer Supports +Where play components require transfer to entry points or seats, at least one means of support for transferring shall be provided. + +1009.1 General +Where provided, pool lifts, sloped entries, transfer walls, transfer systems, and pool stairs shall comply with 1009. + +1009.2 Pool Lifts +Pool lifts shall comply with 1009.2. +Advisory 1009.2 Pool Lifts. There are a variety of seats available on pool lifts ranging from sling seats to those that are preformed or molded. Pool lift seats with backs will enable a larger population of persons with disabilities to use the lift. Pool lift seats that consist of materials that resist corrosion and provide a firm base to transfer will be usable by a wider range of people with disabilities. Additional options such as armrests, head rests, seat belts, and leg support will enhance accessibility and better accommodate people with a wide range of disabilities. + +1009.2.1 Pool Lift Location +Pool lifts shall be located where the water level does not exceed 48 inches (1220 mm). +EXCEPTIONS: 1. Where the entire pool depth is greater than 48 inches (1220 mm), compliance with 1009.2.1 shall not be required. +2. Where multiple pool lift locations are provided, no more than one pool lift shall be required to be located in an area where the water level is 48 inches (1220 mm) maximum. + +1009.2.2 Seat Location +In the raised position, the centerline of the seat shall be located over the deck and 16 inches (405 mm) minimum from the edge of the pool. The deck surface between the centerline of the seat and the pool edge shall have a slope not steeper than 1:48. + +1009.2.3 Clear Deck Space +On the side of the seat opposite the water, a clear deck space shall be provided parallel with the seat. The space shall be 36 inches (915 mm) wide minimum and shall extend forward 48 inches (1220 mm) minimum from a line located 12 inches (305 mm) behind the rear edge of the seat. The clear deck space shall have a slope not steeper than 1:48. + +1009.2.4 Seat Height +The height of the lift seat shall be designed to allow a stop at 16 inches (405 mm) minimum to 19 inches (485 mm) maximum measured from the deck to the top of the seat surface when in the raised (load) position. + +1009.2.5 Seat Width +The seat shall be 16 inches (405 mm) wide minimum. + +1009.2.6 Footrests and Armrests +Footrests shall be provided and shall move with the seat. If provided, the armrest positioned opposite the water shall be removable or shall fold clear of the seat when the seat is in the raised (load) position. +EXCEPTION: Footrests shall not be required on pool lifts provided in spas. + +1009.2.7 Operation +The lift shall be capable of unassisted operation from both the deck and water levels. Controls and operating mechanisms shall be unobstructed when the lift is in use and shall comply with 309.4. +Advisory 1009.2.7 Operation. Pool lifts must be capable of unassisted operation from both the deck and water levels. This will permit a person to call the pool lift when the pool lift is in the opposite position. It is extremely important for a person who is swimming alone to be able to call the pool lift when it is in the up position so he or she will not be stranded in the water for extended periods of time awaiting assistance. The requirement for a pool lift to be independently operable does not preclude assistance from being provided. + +1009.2.8 Submerged Depth +The lift shall be designed so that the seat will submerge to a water depth of 18 inches (455 mm) minimum below the stationary water level. + +1009.2.9 Lifting Capacity +Single person pool lifts shall have a weight capacity of 300 pounds. (136 kg) minimum and be capable of sustaining a static load of at least one and a half times the rated load. +Advisory 1009.2.9 Lifting Capacity. Single person pool lifts must be capable of supporting a minimum weight of 300 pounds (136 kg) and sustaining a static load of at least one and a half times the rated load. Pool lifts should be provided that meet the needs of the population they serve. Providing a pool lift with a weight capacity greater than 300 pounds (136 kg) may be advisable. + +1009.3 Sloped Entries +Sloped entries shall comply with 1009.3. +Advisory 1009.3 Sloped Entries. Personal wheelchairs and mobility devices may not be appropriate for submerging in water. Some may have batteries, motors, and electrical systems that when submerged in water may cause damage to the personal mobility device or wheelchair or may contaminate the pool water. Providing an aquatic wheelchair made of non-corrosive materials and designed for access into the water will protect the water from contamination and avoid damage to personal wheelchairs or other mobility aids. + +1009.3.1 Sloped Entries +Sloped entries shall comply with Chapter 4 except as modified in 1009.3.1 through 1009.3.3. +EXCEPTION: Where sloped entries are provided, the surfaces shall not be required to be slip resistant. + +1009.3.2 Submerged Depth +Sloped entries shall extend to a depth of 24 inches (610 mm) minimum and 30 inches (760 mm) maximum below the stationary water level. Where landings are required by 405.7, at least one landing shall be located 24 inches (610 mm) minimum and 30 inches (760 mm) maximum below the stationary water level. +EXCEPTION: In wading pools, the sloped entry and landings, if provided, shall extend to the deepest part of the wading pool. + +1009.3.3 Handrails +At least two handrails complying with 505 shall be provided on the sloped entry. The clear width between required handrails shall be 33 inches (840 mm) minimum and 38 inches (965 mm) maximum. +EXCEPTIONS: 1. Handrail extensions specified by 505.10.1 shall not be required at the bottom landing serving a sloped entry. +2. Where a sloped entry is provided for wave action pools, leisure rivers, sand bottom pools, and other pools where user access is limited to one area, the handrails shall not be required to comply with the clear width requirements of 1009.3.3. +3. Sloped entries in wading pools shall not be required to provide handrails complying with 1009.3.3. If provided, handrails on sloped entries in wading pools shall not be required to comply with 505. + +1009.4 Transfer Walls +Transfer walls shall comply with 1009.4. + +1009.4.1 Clear Deck Space +A clear deck space of 60 inches (1525 mm) minimum by 60 inches (1525 mm) minimum with a slope not steeper than 1:48 shall be provided at the base of the transfer wall. Where one grab bar is provided, the clear deck space shall be centered on the grab bar. Where two grab bars are provided, the clear deck space shall be centered on the clearance between the grab bars. + +1009.4.2 Height +The height of the transfer wall shall be 16 inches (405 mm) minimum and 19 inches (485 mm) maximum measured from the deck. + +1009.4.3 Wall Depth and Length +The depth of the transfer wall shall be 12 inches (305 mm) minimum and 16 inches (405 mm) maximum. The length of the transfer wall shall be 60 inches (1525 mm) minimum and shall be centered on the clear deck space. + +1009.4.4 Surface +Surfaces of transfer walls shall not be sharp and shall have rounded edges. + +1009.4.5 Grab Bars +At least one grab bar complying with 609 shall be provided on the transfer wall. Grab bars shall be perpendicular to the pool wall and shall extend the full depth of the transfer wall. The top of the gripping surface shall be 4 inches (100 mm) minimum and 6 inches (150 mm) maximum above transfer walls. Where one grab bar is provided, clearance shall be 24 inches (610 mm) minimum on both sides of the grab bar. Where two grab bars are provided, clearance between grab bars shall be 24 inches (610 mm) minimum. +EXCEPTION: Grab bars on transfer walls shall not be required to comply with 609.4. + +1009.5 Transfer Systems +Transfer systems shall comply with 1009.5. + +1009.5.1 Transfer Platform +A transfer platform shall be provided at the head of each transfer system. Transfer platforms shall provide 19 inches (485 mm) minimum clear depth and 24 inches (610 mm) minimum clear width. + +1009.5.2 Transfer Space +A transfer space of 60 inches (1525 mm) minimum by 60 inches (1525 mm) minimum with a slope not steeper than 1:48 shall be provided at the base of the transfer platform surface and shall be centered along a 24 inch (610 mm) minimum side of the transfer platform. The side of the transfer platform serving the transfer space shall be unobstructed. + +1009.5.3 Height +The height of the transfer platform shall comply with 1009.4.2. + +1009.5.4 Transfer Steps +Transfer step height shall be 8 inches (205 mm) maximum. The surface of the bottom tread shall extend to a water depth of 18 inches (455 mm) minimum below the stationary water level. +Advisory 1009.5.4 Transfer Steps. Where possible, the height of the transfer step should be minimized to decrease the distance an individual is required to lift up or move down to reach the next step to gain access. + +1009.5.5 Surface +The surface of the transfer system shall not be sharp and shall have rounded edges. + +1009.5.6 Size +Each transfer step shall have a tread clear depth of 14 inches (355 mm) minimum and 17 inches (430 mm) maximum and shall have a tread clear width of 24 inches (610 mm) minimum. + +1009.5.7 Grab Bars +At least one grab bar on each transfer step and the transfer platform or a continuous grab bar serving each transfer step and the transfer platform shall be provided. Where a grab bar is provided on each step, the tops of gripping surfaces shall be 4 inches (100 mm) minimum and 6 inches (150 mm) maximum above each step and transfer platform. Where a continuous grab bar is provided, the top of the gripping surface shall be 4 inches (100 mm) minimum and 6 inches (150 mm) maximum above the step nosing and transfer platform. Grab bars shall comply with 609 and be located on at least one side of the transfer system. The grab bar located at the transfer platform shall not obstruct transfer. +EXCEPTION: Grab bars on transfer systems shall not be required to comply with 609.4. + +1009.6 Pool Stairs +Pool stairs shall comply with 1009.6. + +1009.6.1 Pool Stairs +Pool stairs shall comply with 504. +EXCEPTION: Pool step riser heights shall not be required to be 4 inches (100 mm) high minimum and 7 inches (180 mm) high maximum provided that riser heights are uniform. + +1009.6.2 Handrails +The width between handrails shall be 20 inches (510 mm) minimum and 24 inches (610 mm) maximum. Handrail extensions required by 505.10.3 shall not be required on pool stairs. + +1010.1 Turning Space +A circular turning space 60 inches (1525 mm) diameter minimum with slopes not steeper than 1:48 shall be provided at shooting facilities with firing positions. +202-272-0080 (voice) +ta@access-board.gov + diff --git a/backend/config.py b/backend/config.py new file mode 100644 index 0000000..5d7009d --- /dev/null +++ b/backend/config.py @@ -0,0 +1,101 @@ +""" +config.py - Environment-driven configuration for the Conflict Checker. + +All knobs come from backend/.env (see .env.example). Paths are derived from this +file's location so the app runs regardless of the current working directory. +""" + +import os +from dotenv import load_dotenv + +load_dotenv(os.path.join(os.path.dirname(os.path.abspath(__file__)), ".env")) + +_BASE_DIR = os.path.dirname(os.path.abspath(__file__)) + +# -- AI Backend (OpenRouter) ---------------------------------------- +# One multimodal model does both extraction (Stage 1) and conflict +# reasoning (Stage 3). Override MODEL per-stage if you ever split them. +AI_BASE_URL = os.getenv("AI_BASE_URL", "https://openrouter.ai/api/v1") +AI_API_KEY = os.getenv("AI_API_KEY", "") +MODEL = os.getenv("MODEL", "google/gemini-2.5-pro") +# Text model when text stages run on OpenRouter (non-hybrid). Falls back to +# MODEL when unset. +TEXT_MODEL = os.getenv("TEXT_MODEL", "") or MODEL + +# -- Hybrid (local text LLM) ---------------------------------------- +# Optional OpenAI-compatible local endpoint (e.g. a vLLM box) for the text-only +# QAQC stages. Vision stages ALWAYS use OpenRouter. The user picks hybrid per +# job in the UI; these say WHERE local is + the toggle's default state. Empty +# LOCAL_BASE_URL = hybrid disabled (falls back to OpenRouter). +LOCAL_BASE_URL = os.getenv("LOCAL_BASE_URL", "") +LOCAL_API_KEY = os.getenv("LOCAL_API_KEY", "local") +LOCAL_TEXT_MODEL = os.getenv("LOCAL_TEXT_MODEL", "") +HYBRID_DEFAULT = os.getenv("HYBRID_DEFAULT", "false").strip().lower() in ("1", "true", "yes") + +# -- Pipeline ------------------------------------------------------- +PDF_DPI = int(os.getenv("PDF_DPI", "100")) +MAX_PAGES = int(os.getenv("MAX_PAGES", "60")) +MAX_DIMENSION = int(os.getenv("MAX_DIMENSION", "2400")) # px cap on the long edge +LLM_TIMEOUT = int(os.getenv("LLM_TIMEOUT", "180")) # seconds per call +EXTRACT_MAX_TOKENS = int(os.getenv("EXTRACT_MAX_TOKENS", "16384")) +REASON_MAX_TOKENS = int(os.getenv("REASON_MAX_TOKENS", "4096")) + +# -- QAQC stage knobs (Stages 0-1, 3, 6-11) ------------------------- +# Token caps per stage. Most are single whole-set calls, so they need more +# headroom than a per-cluster reason call. +JURISDICTION_MAX_TOKENS = int(os.getenv("JURISDICTION_MAX_TOKENS", "4096")) +SHEET_INDEX_MAX_TOKENS = int(os.getenv("SHEET_INDEX_MAX_TOKENS", "16384")) +NORMALIZE_MAX_TOKENS = int(os.getenv("NORMALIZE_MAX_TOKENS", "16384")) +QAQC_MAX_TOKENS = int(os.getenv("QAQC_MAX_TOKENS", "16384")) +CODE_MAX_TOKENS = int(os.getenv("CODE_MAX_TOKENS", "16384")) +CONSTRUCT_MAX_TOKENS = int(os.getenv("CONSTRUCT_MAX_TOKENS", "16384")) +VALIDATE_MAX_TOKENS = int(os.getenv("VALIDATE_MAX_TOKENS", "16384")) +RISK_MAX_TOKENS = int(os.getenv("RISK_MAX_TOKENS", "16384")) +RFI_MAX_TOKENS = int(os.getenv("RFI_MAX_TOKENS", "16384")) + +# Stage 4 clustering engine: "llm" (semantic, fuzzy matches + catches more) or +# "deterministic" (clusterer.py, free/reproducible). Swap via env to A/B. +CLUSTERER = os.getenv("CLUSTERER", "llm").strip().lower() +CLUSTER_MAX_TOKENS = int(os.getenv("CLUSTER_MAX_TOKENS", "16384")) +CLUSTER_MAX = int(os.getenv("CLUSTER_MAX", "120")) + +# Disk-backed LLM response cache for the testing loop. When on, identical calls +# (same model/prompt/images/params) replay the saved response at zero API cost, +# so re-running a set only pays for stages whose input actually changed. Off by +# default so production never serves stale results. Clear: rm -rf the dir. +LLM_CACHE = os.getenv("LLM_CACHE", "false").strip().lower() in ("1", "true", "yes") +LLM_CACHE_DIR = os.getenv("LLM_CACHE_DIR", os.path.join(_BASE_DIR, ".llm_cache")) + +# Parallelism (ThreadPoolExecutor workers) +EXTRACT_CONCURRENCY = int(os.getenv("EXTRACT_CONCURRENCY", "4")) +REASON_CONCURRENCY = int(os.getenv("REASON_CONCURRENCY", "4")) +# Batched stages (normalization, per-sheet code/constructability) reuse this. +NORMALIZE_CONCURRENCY = int(os.getenv("NORMALIZE_CONCURRENCY", "4")) +CODE_CONCURRENCY = int(os.getenv("CODE_CONCURRENCY", "4")) +# Max assertions per code-review call. Code review batches sheets to keep each +# call small (avoids the truncation that zeroed out a whole-set call). +CODE_BATCH_SIZE = int(os.getenv("CODE_BATCH_SIZE", "80")) +CONSTRUCT_CONCURRENCY = int(os.getenv("CONSTRUCT_CONCURRENCY", "4")) +# Assertions per batch for the normalization stage. +NORMALIZE_BATCH_SIZE = int(os.getenv("NORMALIZE_BATCH_SIZE", "60")) + +# -- App ------------------------------------------------------------ +UPLOAD_DIR = os.path.join(_BASE_DIR, "uploads") +OUTPUT_DIR = os.path.join(_BASE_DIR, "outputs") +APP_TITLE = "Conflict Checker" +APP_VERSION = "0.1.0" +# Public base URL used to build the "view results" link in notification +# emails. Set to whatever address users reach this server on (e.g. the +# Tailscale/LAN URL) so the link in the email actually resolves. +APP_BASE_URL = os.getenv("APP_BASE_URL", "http://localhost:8099") + +# -- Email / SMTP (optional notification on completion) ------------- +# If unset, the app still works; it just logs "SMTP not configured" and +# skips the email. Mirrors IronBid's graceful behavior. +SMTP_HOST = os.getenv("SMTP_HOST", "") +SMTP_PORT = int(os.getenv("SMTP_PORT", "587")) +SMTP_USER = os.getenv("SMTP_USER", "") +SMTP_PASSWORD = os.getenv("SMTP_PASSWORD", "") +SMTP_FROM = os.getenv("SMTP_FROM", "") +SMTP_USE_TLS = os.getenv("SMTP_USE_TLS", "true").lower() == "true" +SMTP_USE_SSL = os.getenv("SMTP_USE_SSL", "false").lower() == "true" diff --git a/backend/email_sender.py b/backend/email_sender.py new file mode 100644 index 0000000..4dfb36b --- /dev/null +++ b/backend/email_sender.py @@ -0,0 +1,123 @@ +""" +email_sender.py - Sends a completion notification for a conflict check. + +Plain stdlib smtplib, all config from env (see config.py). Mirrors IronBid's +graceful behavior: if SMTP is not configured, or a send fails, it logs and +returns without ever crashing the pipeline. +""" + +import os +import ssl +import smtplib +from email.message import EmailMessage +from typing import Dict, List, Optional + +from backend import config + + +def _smtp_ready() -> bool: + return bool(config.SMTP_HOST and config.SMTP_USER and config.SMTP_PASSWORD) + + +def _send(msg: EmailMessage) -> bool: + try: + if config.SMTP_USE_SSL: + ctx = ssl.create_default_context() + with smtplib.SMTP_SSL(config.SMTP_HOST, config.SMTP_PORT, context=ctx) as s: + s.login(config.SMTP_USER, config.SMTP_PASSWORD) + s.send_message(msg) + else: + with smtplib.SMTP(config.SMTP_HOST, config.SMTP_PORT) as s: + if config.SMTP_USE_TLS: + s.starttls(context=ssl.create_default_context()) + s.login(config.SMTP_USER, config.SMTP_PASSWORD) + s.send_message(msg) + return True + except Exception as e: + print(f"[Email] Failed to send: {e}") + return False + + +def send_conflict_report( + recipient_email: str, + report: Dict, + results_url: str = "", + attachments: Optional[List[str]] = None, +) -> bool: + """ + Email the conflict-check summary to recipient_email, with the report files + attached. Returns True if sent, False if skipped/failed. + """ + if not recipient_email: + return False + if not _smtp_ready(): + print(f"[Email] SMTP not configured - skipping notification to {recipient_email}") + return False + + s = report.get("summary", {}) + source = report.get("source", "drawing set") + sev = s.get("by_severity", {}) + found = s.get("conflicts_found", 0) + + msg = EmailMessage() + msg["Subject"] = f"Conflict Checker - {source} - {found} conflict(s) found" + msg["From"] = config.SMTP_FROM or config.SMTP_USER + msg["To"] = recipient_email + + lines = [ + "Your conflict check is complete.", + "", + f"Drawing set: {source}", + f"Sheets: {s.get('sheets_analyzed', 0)} ({', '.join(s.get('disciplines', [])) or 'none'})", + f"Facts checked: {s.get('assertions_extracted', 0)} across {s.get('clusters_checked', 0)} location clusters", + "", + "RESULT", + f" Conflicts found: {found}", + f" High: {sev.get('high', 0)}", + f" Medium: {sev.get('medium', 0)}", + f" Low: {sev.get('low', 0)}", + ] + by_stage = s.get("by_stage") + if by_stage: + lines += [ + "", + "QAQC REVIEW", + f" Full-set QAQC issues: {by_stage.get('qaqc', 0)}", + f" Code / ADA issues: {by_stage.get('code', 0)}", + f" Constructability: {by_stage.get('constructability', 0)}", + f" Consolidated issues: {by_stage.get('validated', 0)}", + f" RFIs drafted: {by_stage.get('rfis', 0)}", + ] + if s.get("cost_usd") is not None: + lines += ["", f"LLM cost: ${s['cost_usd']:.4f} over {s.get('llm_calls', 0)} calls"] + mu = s.get("models_used", {}) + if mu: + lines += ["", "AI MODELS"] + if mu.get("vision"): + lines += [f" Vision: {', '.join(mu['vision'])}"] + if mu.get("text_local"): + lines += [f" Text local: {', '.join(mu['text_local'])}"] + if mu.get("text_cloud"): + label = "Text cloud" if not mu.get("text_local") else "Text cloud (fallback)" + lines += [f" {label}: {', '.join(mu['text_cloud'])}"] + if mu.get("fallback_count"): + lines += [f" Local->cloud fallbacks: {mu['fallback_count']}"] + if results_url: + lines += ["", "VIEW FULL REPORT", f" {results_url}"] + lines += ["", "Generated by Conflict Checker"] + msg.set_content("\n".join(lines)) + + for path in attachments or []: + if not path or not os.path.isfile(path): + continue + with open(path, "rb") as f: + data = f.read() + name = os.path.basename(path) + subtype = "json" if name.endswith(".json") else "plain" + maintype = "application" if name.endswith(".json") else "text" + msg.add_attachment(data, maintype=maintype, subtype=subtype, filename=name) + + if _send(msg): + print(f"[Email] Sent conflict report to {recipient_email}") + return True + return False diff --git a/backend/jobs.py b/backend/jobs.py new file mode 100644 index 0000000..b02fbe0 --- /dev/null +++ b/backend/jobs.py @@ -0,0 +1,166 @@ +""" +jobs.py - Lightweight async job registry for conflict checks. + +A conflict check takes minutes, so the HTTP request must not block on it. Each +upload becomes a job that runs on a background thread; the client gets a job_id +immediately and can either poll GET /jobs/{id} or just close the page and wait +for the completion email. + +State is in-memory (fine for a single-user tool); the report is also persisted +to outputs// so results survive a restart even though live status does +not. No external queue/DB. +""" + +import os +import time +import uuid +import shutil +import threading +from typing import Dict, Optional + +from backend import config +from backend.pipeline.runner import run_pipeline +from backend.email_sender import send_conflict_report + +_jobs: Dict[str, Dict] = {} +_lock = threading.Lock() + + +def _set(job_id: str, **fields) -> None: + with _lock: + _jobs[job_id].update(fields) + + +def create_job(pdf_path: str, source_filename: str, email: Optional[str] = None, + project_input: Optional[Dict] = None, text_local: bool = False) -> str: + """Register a job and kick off its background thread. Returns the job_id.""" + job_id = uuid.uuid4().hex[:12] + with _lock: + _jobs[job_id] = { + "job_id": job_id, + "status": "queued", # queued -> running -> done | error + "source": source_filename, + "email": email or None, + "project_input": project_input or {}, + "text_local": text_local, + "stage": None, + "created_at": time.time(), + "finished_at": None, + "report": None, + "error": None, + } + threading.Thread(target=_run, args=(job_id, pdf_path, project_input, text_local), + daemon=True).start() + return job_id + + +def _run(job_id: str, pdf_path: str, project_input: Optional[Dict] = None, + text_local: bool = False) -> None: + out_dir = os.path.join(config.OUTPUT_DIR, job_id) + try: + _set(job_id, status="running") + # Keep a copy of the source PDF so its sheets can be viewed later. + os.makedirs(out_dir, exist_ok=True) + shutil.copy2(pdf_path, os.path.join(out_dir, "source.pdf")) + report = run_pipeline( + pdf_path, + out_dir=out_dir, + on_stage=lambda name: _set(job_id, stage=name), + project_input=project_input, + source_name=_jobs[job_id].get("source"), + text_local=text_local, + ) + _set(job_id, status="done", report=report, finished_at=time.time(), stage=None) + _notify(job_id, report, out_dir) + except Exception as e: + print(f"[Jobs] Job {job_id} failed: {e}") + _set(job_id, status="error", error=str(e), finished_at=time.time()) + _notify_error(job_id) + finally: + try: + os.remove(pdf_path) + except OSError: + pass + + +def _notify(job_id: str, report: Dict, out_dir: str) -> None: + email = _jobs[job_id].get("email") + if not email: + return + results_url = f"{config.APP_BASE_URL.rstrip('/')}/?job={job_id}" + attachments = [ + os.path.join(out_dir, "report.md"), + os.path.join(out_dir, "conflicts.json"), + os.path.join(out_dir, "validated_issues.json"), + os.path.join(out_dir, "rfis.json"), + ] + send_conflict_report(email, report, results_url=results_url, attachments=attachments) + + +def _notify_error(job_id: str) -> None: + job = _jobs[job_id] + email = job.get("email") + if not email: + return + # Reuse the report mailer with a minimal error-shaped payload. + err_report = { + "source": job.get("source", ""), + "summary": {"conflicts_found": 0, "by_severity": {}, "disciplines": []}, + } + try: + from backend.email_sender import _smtp_ready, _send + from email.message import EmailMessage + if not _smtp_ready(): + print(f"[Email] SMTP not configured - skipping error notice to {email}") + return + msg = EmailMessage() + msg["Subject"] = f"Conflict Checker - {job.get('source','')} - run FAILED" + msg["From"] = config.SMTP_FROM or config.SMTP_USER + msg["To"] = email + msg.set_content( + "Your conflict check did not complete.\n\n" + f"Drawing set: {job.get('source','')}\n" + f"Error: {job.get('error','unknown')}\n\n" + "Generated by Conflict Checker" + ) + _send(msg) + except Exception as e: + print(f"[Email] Failed to send error notice: {e}") + + +def get_job(job_id: str) -> Optional[Dict]: + """Public job view. Includes the full report only when done. + + Falls back to the on-disk conflicts.json when the job isn't in the + in-memory registry (e.g. after a server restart). + """ + with _lock: + job = _jobs.get(job_id) + if job: + return dict(job) + + # Try loading from disk + report_path = os.path.join(config.OUTPUT_DIR, job_id, "conflicts.json") + if not os.path.isfile(report_path): + return None + try: + import json + with open(report_path, encoding="utf-8") as f: + report = json.load(f) + source_pdf = os.path.join(config.OUTPUT_DIR, job_id, "source.pdf") + return { + "job_id": job_id, + "status": "done", + "source": report.get("source", os.path.basename(report_path)), + "email": None, + "project_input": report.get("project_input", {}), + "text_local": report.get("summary", {}).get("text_backend") == "local", + "stage": None, + "created_at": os.path.getmtime(source_pdf) if os.path.isfile(source_pdf) else None, + "finished_at": os.path.getmtime(report_path), + "report": report, + "error": None, + } + except Exception as e: + print(f"[Jobs] Failed to load job {job_id} from disk: {e}") + return None diff --git a/backend/llm.py b/backend/llm.py new file mode 100644 index 0000000..83ff9b3 --- /dev/null +++ b/backend/llm.py @@ -0,0 +1,351 @@ +""" +llm.py - Thin OpenRouter client + a JSON-returning chat helper. + +Mirrors the call pattern proven in the IronBid pipeline: OpenAI SDK pointed at +OpenRouter, base64 image data URLs, markdown-fence stripping, and a single +retry on JSON parse failure. One helper serves both the extraction (Stage 1, +with an image) and conflict-reasoning (Stage 3, with images) calls. +""" + +import os +import json +import hashlib +import threading +from typing import List, Optional, Dict, Any + +from openai import OpenAI + +from backend import config + +_clients: Dict[str, OpenAI] = {} + +# Per-run text backend choice (hybrid). Set by the runner at job start; read by +# call_json when routing a no-image (text) call. Module-global mirrors the +# set_stage/cost pattern (single-user tool). +_text_local = False + + +def set_text_backend(local: bool) -> None: + """Choose whether text (no-image) calls go to the local endpoint this run.""" + global _text_local + _text_local = bool(local) + +# --- per-job cost accounting ------------------------------------------------- +# OpenRouter returns the real USD cost of each call when we request usage +# accounting. We accumulate it in a module-level counter; the runner resets it +# at the start of a job and reads it at the end. (Single-user tool: overlapping +# jobs would share this counter, which is acceptable here.) +_cost_lock = threading.Lock() +_cost = {"usd": 0.0, "calls": 0, "cached": 0} +_by_stage: Dict[str, Dict[str, Any]] = {} +_current_stage = "?" + +# Model usage tracking - records which models were actually called this run. +_models: Dict[str, Any] = { + "vision": set(), # models used for vision (image) calls + "text_local": set(), # local model names attempted + "text_cloud": set(), # cloud text model names used + "fallback_count": 0, # times local fell back to cloud +} + + +def set_stage(name: str) -> None: + """Label subsequent calls so cost can be attributed per pipeline stage.""" + global _current_stage + _current_stage = name + + +def reset_cost() -> None: + with _cost_lock: + _cost["usd"] = 0.0 + _cost["calls"] = 0 + _cost["cached"] = 0 + _by_stage.clear() + _models["vision"] = set() + _models["text_local"] = set() + _models["text_cloud"] = set() + _models["fallback_count"] = 0 + + +def get_cost() -> Dict[str, Any]: + with _cost_lock: + out = dict(_cost) + out["by_stage"] = {k: dict(v) for k, v in _by_stage.items()} + out["models"] = { + "vision": sorted(_models["vision"]), + "text_local": sorted(_models["text_local"]), + "text_cloud": sorted(_models["text_cloud"]), + "fallback_count": _models["fallback_count"], + } + return out + + +def _record_model(be: Dict[str, Any], has_images: bool, fell_back: bool) -> None: + """Thread-safe recording of which model was actually used for a call.""" + model = be["model"] + with _cost_lock: + if has_images: + _models["vision"].add(model) + elif fell_back or not be.get("local"): + _models["text_cloud"].add(model) + else: + _models["text_local"].add(model) + + +def _stage_bucket() -> Dict[str, Any]: + return _by_stage.setdefault(_current_stage, {"usd": 0.0, "calls": 0, "cached": 0}) + + +def _add_cost(usd: float) -> None: + with _cost_lock: + _cost["usd"] += usd + _cost["calls"] += 1 + b = _stage_bucket() + b["usd"] += usd + b["calls"] += 1 + + +def _add_cached() -> None: + with _cost_lock: + _cost["cached"] += 1 + _stage_bucket()["cached"] += 1 + + +# --- disk-backed response cache (testing loop; opt-in via config.LLM_CACHE) --- + +def _cache_key(model: str, system_prompt: str, user_text: str, + images_b64: Optional[List[str]], max_tokens: int, + json_mode: bool) -> str: + h = hashlib.sha256() + parts = [model, str(max_tokens), str(json_mode), system_prompt, user_text] + for b in (images_b64 or []): + parts.append(b) + for p in parts: + h.update(b"\x00") + h.update(p.encode("utf-8", "ignore")) + return h.hexdigest() + + +def _cache_get(key: str) -> Optional[Dict[str, Any]]: + path = os.path.join(config.LLM_CACHE_DIR, key + ".json") + try: + with open(path, encoding="utf-8") as f: + return json.load(f) + except (OSError, json.JSONDecodeError): + return None + + +def _cache_set(key: str, value: Dict[str, Any]) -> None: + try: + os.makedirs(config.LLM_CACHE_DIR, exist_ok=True) + path = os.path.join(config.LLM_CACHE_DIR, key + ".json") + tmp = f"{path}.{os.getpid()}.{threading.get_ident()}.tmp" + with open(tmp, "w", encoding="utf-8") as f: + json.dump(value, f) + os.replace(tmp, path) # atomic so thread-pooled stages can't tear it + except OSError as e: + print(f"[LLM] cache write failed: {e}") + + +def get_client(base_url: str, api_key: str) -> OpenAI: + """Lazily build + cache one OpenAI-compatible client per endpoint.""" + client = _clients.get(base_url) + if client is None: + client = OpenAI(base_url=base_url, api_key=api_key) + _clients[base_url] = client + return client + + +def _resolve_backend(has_images: bool, model_override: Optional[str]) -> Dict[str, Any]: + """ + Pick (base_url, api_key, model, usage) for this call. + + Vision (has_images) always uses OpenRouter. Text (no images) uses the local + endpoint when the run chose hybrid AND it's configured; otherwise OpenRouter. + """ + if not has_images and _text_local and config.LOCAL_BASE_URL: + return { + "base_url": config.LOCAL_BASE_URL, + "api_key": config.LOCAL_API_KEY, + "model": model_override or config.LOCAL_TEXT_MODEL or config.TEXT_MODEL, + "usage": False, # local has no OpenRouter usage accounting + "local": True, + } + # Vision, or text-on-OpenRouter (default / fallback). + default_model = config.MODEL if has_images else config.TEXT_MODEL + return { + "base_url": config.AI_BASE_URL, + "api_key": config.AI_API_KEY, + "model": model_override or default_model, + "usage": True, + "local": False, + } + + +def _strip_fences(raw: str) -> str: + raw = raw.strip() + if raw.startswith("```"): + # ```json ... ``` or ``` ... ``` + raw = raw.split("```")[1] + if raw.startswith("json"): + raw = raw[4:] + raw = raw.strip() + return raw + + +def _repair_truncated(raw: str) -> Optional[Dict[str, Any]]: + """ + Best-effort recovery of a truncated JSON object/array. + + Walks the text tracking bracket depth and string state, finds the last + point where we can safely cut (after a complete element), drops the partial + trailing element, and closes the still-open brackets. Lets a response that + got cut off by max_tokens still yield its complete leading items instead of + nothing. Returns None if nothing salvageable. + """ + stack: List[str] = [] + in_str = esc = False + cut = None # (index_exclusive, stack_snapshot) of a safe truncation point + for i, ch in enumerate(raw): + if in_str: + if esc: + esc = False + elif ch == "\\": + esc = True + elif ch == '"': + in_str = False + continue + if ch == '"': + in_str = True + elif ch in "{[": + stack.append("}" if ch == "{" else "]") + elif ch in "}]": + if stack: + stack.pop() + cut = (i + 1, list(stack)) # after a complete sub-structure + elif ch == ",": + cut = (i, list(stack)) # before an (incomplete) next element + + if not cut: + return None + idx, open_brackets = cut + candidate = raw[:idx].rstrip().rstrip(",") + candidate += "".join(reversed(open_brackets)) + try: + return json.loads(candidate) + except json.JSONDecodeError: + return None + + +def _record_cost(response) -> None: + """Pull OpenRouter's per-call USD cost out of the usage object, if present.""" + try: + dump = response.model_dump() + except Exception: + return + usage = dump.get("usage") or {} + cost = usage.get("cost") + if cost is None: + cost = (usage.get("cost_details") or {}).get("upstream_inference_cost") + if isinstance(cost, (int, float)): + _add_cost(float(cost)) + + +def _parse(raw: str) -> Optional[Dict[str, Any]]: + """Parse model JSON, falling back to truncation repair.""" + try: + return json.loads(raw) + except json.JSONDecodeError: + repaired = _repair_truncated(raw) + if repaired is not None: + print("[LLM] recovered truncated JSON (dropped partial trailing item)") + return repaired + + +def call_json( + system_prompt: str, + user_text: str, + images_b64: Optional[List[str]] = None, + max_tokens: int = 4096, + model: Optional[str] = None, +) -> Optional[Dict[str, Any]]: + """ + Send one chat completion expecting a JSON object back. + + Uses the provider's JSON mode (response_format) so the model returns a bare + JSON object instead of prose/empty text, and recovers from max_tokens + truncation. images_b64: optional base64 JPEGs attached as high-detail image + parts. Returns the parsed dict, or None on a hard failure (caller degrades). + """ + has_images = bool(images_b64) + be = _resolve_backend(has_images, model) + + cache_key = None + if config.LLM_CACHE: + cache_key = _cache_key(be["model"], system_prompt, user_text, + images_b64, max_tokens, json_mode=True) + hit = _cache_get(cache_key) + if hit is not None: + _add_cached() + return hit + + content: List[Dict[str, Any]] = [] + for b64 in images_b64 or []: + content.append({ + "type": "image_url", + "image_url": {"url": f"data:image/jpeg;base64,{b64}", "detail": "high"}, + }) + content.append({"type": "text", "text": user_text}) + + messages = [ + {"role": "system", "content": system_prompt}, + {"role": "user", "content": content}, + ] + + use_json_mode = True + fell_back = False + for attempt in range(2): + try: + client = get_client(be["base_url"], be["api_key"]) + kwargs = dict(model=be["model"], messages=messages, + max_tokens=max_tokens, timeout=config.LLM_TIMEOUT) + if be["usage"]: + kwargs["extra_body"] = {"usage": {"include": True}} + if use_json_mode: + kwargs["response_format"] = {"type": "json_object"} + response = client.chat.completions.create(**kwargs) + _record_cost(response) + raw = _strip_fences(response.choices[0].message.content or "") + parsed = _parse(raw) + if parsed is not None: + _record_model(be, has_images, fell_back) + if cache_key: + _cache_set(cache_key, parsed) + return parsed + if attempt == 0: + print("[LLM] JSON parse error (retrying)") + continue + print(f"[LLM] JSON parse error (giving up); raw head: {raw[:300]}") + return None + except Exception as e: + # Some models reject response_format -> drop it and retry once. + if use_json_mode and "response_format" in str(e).lower(): + print("[LLM] model rejected JSON mode; retrying without it") + use_json_mode = False + continue + # Local endpoint unreachable -> fall back to OpenRouter text backend once. + if be["local"] and not fell_back: + print(f"[LLM] local endpoint failed ({e}); falling back to OpenRouter") + with _cost_lock: + _models["text_local"].add(be["model"]) + _models["fallback_count"] += 1 + be = {"base_url": config.AI_BASE_URL, "api_key": config.AI_API_KEY, + "model": config.TEXT_MODEL, "usage": True, "local": False} + cache_key = None # don't cache fallback under the local-model key + fell_back = True + continue + print(f"[LLM] call error: {e}") + if attempt == 0: + continue + return None + return None diff --git a/backend/main.py b/backend/main.py new file mode 100644 index 0000000..3c52e11 --- /dev/null +++ b/backend/main.py @@ -0,0 +1,112 @@ +""" +main.py - Thin FastAPI app: upload a PDF, run the pipeline, return the report. + +Run from the project root: + uvicorn backend.main:app --reload + +The pipeline is synchronous and can take minutes on a large set; for a single +architect checking one set at a time that's fine. Move to a job queue if this +ever needs concurrency. +""" + +import os +import tempfile +from typing import Optional + +from fastapi import FastAPI, UploadFile, File, Form, HTTPException +from fastapi.responses import HTMLResponse, JSONResponse, Response +from fastapi.staticfiles import StaticFiles + +from backend import config +from backend.jobs import create_job, get_job +from backend.pipeline.pdf_processor import render_page_jpeg + +app = FastAPI(title=config.APP_TITLE, version=config.APP_VERSION) + +_FRONTEND_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "frontend") + + +@app.get("/health") +def health(): + return {"status": "ok", "model": config.MODEL, + "key_configured": bool(config.AI_API_KEY), + "email_configured": bool(config.SMTP_HOST and config.SMTP_USER and config.SMTP_PASSWORD)} + + +@app.post("/check") +async def check( + file: UploadFile = File(...), + notification_email: Optional[str] = Form(None), + project_name: Optional[str] = Form(None), + address: Optional[str] = Form(None), + occupancy: Optional[str] = Form(None), + work_type: Optional[str] = Form(None), + text_local: bool = Form(False), +): + """ + Accept a PDF, start a background conflict check, and return a job_id + immediately. The client can poll GET /jobs/{id} or just wait for the email. + + Optional intake fields (project_name/address/occupancy/work_type) feed the + Stage 0 jurisdiction profile; anything left blank is derived from the cover + sheet. + """ + if not file.filename.lower().endswith(".pdf"): + raise HTTPException(status_code=400, detail="Please upload a PDF.") + + os.makedirs(config.UPLOAD_DIR, exist_ok=True) + suffix = "_" + os.path.basename(file.filename) + fd, tmp_path = tempfile.mkstemp(suffix=suffix, dir=config.UPLOAD_DIR) + with os.fdopen(fd, "wb") as f: + f.write(await file.read()) + + email = (notification_email or "").strip() or None + project_input = { + k: v.strip() + for k, v in { + "project_name": project_name, "address": address, + "occupancy": occupancy, "work_type": work_type, + }.items() + if v and v.strip() + } + job_id = create_job(tmp_path, source_filename=file.filename, email=email, + project_input=project_input, text_local=text_local) + return JSONResponse({"job_id": job_id, "status": "queued", "email": email}) + + +@app.get("/jobs/{job_id}") +def job_status(job_id: str): + job = get_job(job_id) + if not job: + raise HTTPException(status_code=404, detail="Job not found") + return JSONResponse(job) + + +@app.get("/jobs/{job_id}/sheet-image/{page}") +def sheet_image(job_id: str, page: int): + """Render one page of a completed job's source PDF as JPEG (sheet viewer).""" + pdf = os.path.join(config.OUTPUT_DIR, job_id, "source.pdf") + if not os.path.isfile(pdf): + raise HTTPException(status_code=404, detail="Source PDF not found for this job") + try: + data = render_page_jpeg(pdf, page) + except IndexError: + raise HTTPException(status_code=404, detail=f"Page {page} out of range") + except Exception as e: + raise HTTPException(status_code=500, detail=f"Could not render page: {e}") + return Response(content=data, media_type="image/jpeg", + headers={"Cache-Control": "max-age=3600"}) + + +@app.get("/", response_class=HTMLResponse) +def index(): + index_path = os.path.join(_FRONTEND_DIR, "index.html") + if os.path.isfile(index_path): + with open(index_path) as f: + return f.read() + return "

Conflict Checker

frontend/index.html not found.

" + + +# Serve any other static assets (none required for the single-file UI). +if os.path.isdir(_FRONTEND_DIR): + app.mount("/static", StaticFiles(directory=_FRONTEND_DIR), name="static") diff --git a/backend/pipeline/__init__.py b/backend/pipeline/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/pipeline/_serialize.py b/backend/pipeline/_serialize.py new file mode 100644 index 0000000..815ad41 --- /dev/null +++ b/backend/pipeline/_serialize.py @@ -0,0 +1,64 @@ +""" +_serialize.py - Compact JSON views of pipeline state for the text QAQC stages. + +The full sheet/cluster objects carry base64 images and bookkeeping that would +blow up prompt token counts. These helpers strip them to the fields the +reasoning prompts actually need. +""" + +import json +from typing import Dict, List + + +def slim_assertion(a: Dict) -> Dict: + out = { + "sheet_number": a.get("sheet_number"), + "discipline": a.get("discipline"), + "attribute": a.get("attribute"), + "value": a.get("value"), + "source_text": a.get("source_text"), + "location_key": a.get("location_key"), + } + if a.get("normalized_value") is not None: + out["normalized_value"] = a["normalized_value"] + return {k: v for k, v in out.items() if v is not None} + + +def slim_sheets(sheets: List[Dict]) -> List[Dict]: + return [ + { + "sheet_number": s.get("sheet_number"), + "discipline": s.get("discipline"), + "sheet_title": s.get("sheet_title"), + "level": s.get("level"), + "assertions": [ + { + "attribute": a.get("attribute"), + "value": a.get("value"), + "source_text": a.get("source_text"), + "location_key": a.get("location_key"), + **({"normalized_value": a["normalized_value"]} + if a.get("normalized_value") is not None else {}), + } + for a in s.get("assertions", []) + ], + } + for s in sheets + ] + + +def slim_clusters(clusters: List[Dict]) -> List[Dict]: + return [ + { + "key": c.get("key"), + "location": c.get("location"), + "disciplines": c.get("disciplines"), + "kind": c.get("kind"), + "assertions": [slim_assertion(a) for a in c.get("assertions", [])], + } + for c in clusters + ] + + +def dumps(obj) -> str: + return json.dumps(obj, ensure_ascii=True) diff --git a/backend/pipeline/_stage.py b/backend/pipeline/_stage.py new file mode 100644 index 0000000..ef0d77b --- /dev/null +++ b/backend/pipeline/_stage.py @@ -0,0 +1,125 @@ +""" +_stage.py - Shared helpers for the LLM QAQC stages (Stages 0-11). + +Every LLM stage follows the same shape: + 1. render a user instruction by replacing {placeholders} + (str.replace, NOT str.format -- the prompts carry literal JSON braces), + 2. call the multimodal model via llm.call_json, + 3. validate / coerce the result so malformed model output degrades + gracefully (drop the item) instead of crashing the pipeline. + +This module factors that out so each stage module stays thin, and defines the +canonical "issue" schema shared by Stages 6-9 (qaqc / code / constructability / +dedup-validate). Mirrors the proven shape of conflict_checker._valid_conflict. +""" + +from typing import Any, Callable, Dict, List, Optional + +from backend.llm import call_json + +_SEVERITY = ("critical", "high", "medium", "low") +_CONFIDENCE = ("high", "medium", "low") + + +def render(instruction: str, subs: Dict[str, str]) -> str: + """Substitute {key} placeholders via str.replace (brace-safe for JSON prompts).""" + out = instruction + for k, v in (subs or {}).items(): + out = out.replace("{" + k + "}", "" if v is None else str(v)) + return out + + +def call_stage( + system_prompt: str, + user_instruction: str, + subs: Optional[Dict[str, str]] = None, + images_b64: Optional[List[str]] = None, + max_tokens: int = 4096, + model: Optional[str] = None, +) -> Optional[Dict[str, Any]]: + """Run one LLM call for a stage; returns the parsed JSON dict or None.""" + user_text = render(user_instruction, subs or {}) + return call_json( + system_prompt=system_prompt, + user_text=user_text, + images_b64=images_b64, + max_tokens=max_tokens, + model=model, + ) + + +def collect_list( + parsed: Optional[Any], + key: str, + validate: Optional[Callable[[Dict], Optional[Dict]]] = None, +) -> List[Dict]: + """ + Pull a list of items out of a model response, optionally validating each. + + Tolerant of shape drift: the model may return {key: [...]} or a bare [...]. + """ + if isinstance(parsed, list): + items = parsed + elif isinstance(parsed, dict): + items = parsed.get(key) or [] + else: + return [] + if not isinstance(items, list): + return [] + out: List[Dict] = [] + for it in items: + if not isinstance(it, dict): + continue + v = validate(it) if validate else it + if v: + out.append(v) + return out + + +def validate_issue(c: Dict, source_stage: str = "") -> Optional[Dict]: + """ + Coerce + validate one canonical QAQC issue; drop if it has no description. + + Tolerant of schema drift between prompts: accepts evidence[].sheet or + evidence[].sheet_number, and recommended_resolution or recommended_next_step. + """ + if not isinstance(c, dict): + return None + description = (c.get("description") or c.get("summary") or "").strip() + if not description: + return None # an issue with no description is noise + + severity = (c.get("severity") or "medium").strip().lower() + if severity not in _SEVERITY: + severity = "medium" + confidence = (c.get("confidence") or "medium").strip().lower() + if confidence not in _CONFIDENCE: + confidence = "medium" + + evidence: List[Dict] = [] + for ev in (c.get("evidence") or []): + if isinstance(ev, dict): + evidence.append({ + "discipline": ev.get("discipline") or "?", + "sheet": ev.get("sheet") or ev.get("sheet_number") or "?", + "source_text": ev.get("source_text") or "", + "asserted_value": ev.get("asserted_value") or "", + }) + + return { + "issue_id": (c.get("issue_id") or "").strip(), + "source_stage": (c.get("source_stage") or source_stage).strip(), + "category": (c.get("category") or c.get("issue_type") or "uncategorized").strip(), + "severity": severity, + "confidence": confidence, + "location": (c.get("location") or "").strip(), + "disciplines": c.get("disciplines") or c.get("disciplines_involved") or [], + "sheets": c.get("sheets") or [], + "description": description, + "evidence": evidence, + "recommended_resolution": ( + c.get("recommended_resolution") or c.get("recommended_next_step") or "" + ).strip(), + "code_reference": c.get("code_reference"), + "risk_score": c.get("risk_score"), + } diff --git a/backend/pipeline/clusterer.py b/backend/pipeline/clusterer.py new file mode 100644 index 0000000..5815c06 --- /dev/null +++ b/backend/pipeline/clusterer.py @@ -0,0 +1,172 @@ +""" +clusterer.py - Stage 2: deterministic co-location clustering (no LLM). + +Collapses the N-by-N sheet-comparison explosion into a handful of clusters +where assertions from different disciplines (or a schedule vs a plan within one +discipline) refer to the SAME place or element. Only clusters worth reasoning +about reach Stage 3, which keeps each reasoning call small and cheap. + +A cluster is emitted when, for a shared normalized location key, either: + - assertions come from >= 2 distinct disciplines (cross-discipline), or + - one discipline mixes a schedule/count fact with a plan/location/dimension + fact for the same element (schedule-vs-plan). + +Limitation (v1): a location that appears in only ONE discipline never forms a +cluster, so pure "missing element" gaps are not caught deterministically. +Stage 3 still catches missing counterparts whenever the location is co-located. +""" + +import re +from typing import List, Dict, Tuple, Optional + +# Caps to keep Stage 3 token usage bounded. +MAX_CLUSTERS = 120 +MAX_ASSERTIONS_PER_CLUSTER = 24 + +_SCHEDULE_HINTS = ("count", "schedule", "_entry") +_PLAN_HINTS = ("location", "dim", "elev") + + +# --------------------------------------------------------------------------- +# Location-key normalization +# --------------------------------------------------------------------------- + +def _norm_grid(v: str) -> Optional[str]: + """'A/3', '3-A', 'A.3' -> canonical sorted 'token/token'.""" + toks = [t for t in re.split(r"[^A-Za-z0-9]+", v.upper()) if t] + if not toks: + return None + return "/".join(sorted(toks)) + + +def _norm_room(v: str) -> Optional[str]: + v = re.sub(r"(?i)\b(room|rm|space)\b", "", v).strip() + v = re.sub(r"\s+", " ", v).upper() + return v or None + + +def _norm_tag(v: str) -> Optional[str]: + toks = [t for t in re.split(r"[^A-Za-z0-9]+", v.upper()) if t] + if not toks: + return None + return "-".join(toks) + + +def cluster_keys_for(assertion: Dict) -> List[Tuple[str, str]]: + """All (key_type, normalized_value) keys this assertion participates in.""" + lk = assertion.get("location_key") or {} + keys: List[Tuple[str, str]] = [] + if lk.get("grid"): + g = _norm_grid(str(lk["grid"])) + if g: + keys.append(("grid", g)) + if lk.get("room"): + r = _norm_room(str(lk["room"])) + if r: + keys.append(("room", r)) + if lk.get("tag"): + t = _norm_tag(str(lk["tag"])) + if t: + keys.append(("tag", t)) + return keys + + +# --------------------------------------------------------------------------- +# Clustering +# --------------------------------------------------------------------------- + +def _is_schedule(attr: str) -> bool: + a = (attr or "").lower() + return any(h in a for h in _SCHEDULE_HINTS) + + +def _is_plan(attr: str) -> bool: + a = (attr or "").lower() + return any(h in a for h in _PLAN_HINTS) + + +def _flatten(sheets: List[Dict]) -> List[Dict]: + """Attach sheet-level context onto each assertion for clustering/evidence.""" + flat: List[Dict] = [] + for sheet in sheets: + for a in sheet.get("assertions", []): + flat.append({ + **a, + "discipline": sheet.get("discipline", "Unknown"), + "sheet_number": sheet.get("sheet_number"), + "page_number": sheet.get("page_number"), + }) + return flat + + +def _human_location(key_type: str, value: str, members: List[Dict]) -> str: + label = {"room": "Room", "grid": "Grid", "tag": "Tag"}.get(key_type, key_type) + levels = {m["location_key"].get("level") for m in members if m.get("location_key")} + levels.discard(None) + lvl = f" / {sorted(levels)[0]}" if len(levels) == 1 else "" + return f"{label} {value}{lvl}" + + +def cluster_by_location(sheets: List[Dict]) -> List[Dict]: + """ + Build co-location clusters from per-sheet extractions. + + Returns a list of clusters: + { + "key": "room:204", + "location": "Room 204 / Level 2", + "disciplines": ["Architectural", "Mechanical"], + "page_numbers": [3, 14], + "sheets": ["A2.1", "M2.1"], + "assertions": [ {discipline, sheet_number, attribute, value, source_text, ...}, ... ] + } + """ + flat = _flatten(sheets) + + buckets: Dict[Tuple[str, str], List[Dict]] = {} + for a in flat: + for key in cluster_keys_for(a): + buckets.setdefault(key, []).append(a) + + clusters: List[Dict] = [] + for (key_type, value), members in buckets.items(): + disciplines = {m["discipline"] for m in members} + cross_discipline = len(disciplines) >= 2 + schedule_vs_plan = ( + len(disciplines) == 1 + and any(_is_schedule(m["attribute"]) for m in members) + and any(_is_plan(m["attribute"]) for m in members) + ) + if not (cross_discipline or schedule_vs_plan): + continue + + # Rank members so the cap keeps the most informative ones (high + # confidence first), but always keep at least one per discipline. + members = sorted( + members, + key=lambda m: {"high": 0, "medium": 1, "low": 2}.get(m.get("confidence"), 1), + )[:MAX_ASSERTIONS_PER_CLUSTER] + + pages = sorted({m["page_number"] for m in members if m.get("page_number")}) + sheet_nums = sorted({m["sheet_number"] for m in members if m.get("sheet_number")}) + + clusters.append({ + "key": f"{key_type}:{value}", + "location": _human_location(key_type, value, members), + "disciplines": sorted(disciplines), + "page_numbers": pages, + "sheets": sheet_nums, + "assertions": members, + "kind": "cross_discipline" if cross_discipline else "schedule_vs_plan", + }) + + # Most disciplines / most assertions first; deterministic tie-break by key. + clusters.sort(key=lambda c: (-len(c["disciplines"]), -len(c["assertions"]), c["key"])) + if len(clusters) > MAX_CLUSTERS: + print(f"[Cluster] Capping {len(clusters)} clusters to {MAX_CLUSTERS}") + clusters = clusters[:MAX_CLUSTERS] + + print(f"[Cluster] {len(clusters)} candidate clusters " + f"({sum(1 for c in clusters if c['kind']=='cross_discipline')} cross-discipline, " + f"{sum(1 for c in clusters if c['kind']=='schedule_vs_plan')} schedule-vs-plan)") + return clusters diff --git a/backend/pipeline/code_refs.py b/backend/pipeline/code_refs.py new file mode 100644 index 0000000..66bd47a --- /dev/null +++ b/backend/pipeline/code_refs.py @@ -0,0 +1,118 @@ +""" +code_refs.py - Pluggable code/standard reference retriever for Stage 7. + +Loads a local corpus of code/standard text and returns the excerpts most +relevant to the active review paths and the drawing's subject matter. Kept +dependency-free (keyword scoring, no embeddings) so it ships today; the +retrieve() interface is the seam to swap in a vector store later. + +Corpus layout: drop plain-text files in backend/code_corpus/. The standard is +inferred from the filename prefix (ada*.txt -> ADA, tas*.txt -> TAS, +ibc*.txt -> IBC, ifc*.txt -> IFC, iebc*.txt -> IEBC, energy*.txt -> ENERGY). +Each file is chunked on blank lines; a leading " ..." token on a chunk +is captured as its section id. An empty corpus is fine -- Stage 7 then runs +reasoning-only and cites nothing. +""" + +import os +import re +from typing import Dict, List + +_CORPUS_DIR = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), + "code_corpus") + +# review_paths flag -> standard tag the corpus uses. +PATH_TO_STANDARD = { + "ada_review": "ADA", + "tas_tdlr_review": "TAS", + "ibc_review": "IBC", + "iebc_review": "IEBC", + "fire_code_review": "IFC", + "energy_review": "ENERGY", +} + +_FILE_PREFIX_TO_STANDARD = [ + ("ada", "ADA"), ("tas", "TAS"), ("iebc", "IEBC"), + ("ibc", "IBC"), ("ifc", "IFC"), ("energy", "ENERGY"), +] + +_SECTION_RE = re.compile(r"^\s*(\d+[\d.]*\b)") +_WORD_RE = re.compile(r"[a-z]{4,}") + +_corpus_cache: List[Dict] = None # type: ignore + + +def _standard_for_file(name: str) -> str: + stem = name.lower() + for prefix, std in _FILE_PREFIX_TO_STANDARD: + if stem.startswith(prefix): + return std + return stem.split("_")[0].split(".")[0].upper() + + +def load_corpus() -> List[Dict]: + """Load and chunk the corpus once. Each chunk: {standard, section, text}.""" + global _corpus_cache + if _corpus_cache is not None: + return _corpus_cache + chunks: List[Dict] = [] + if os.path.isdir(_CORPUS_DIR): + for fname in sorted(os.listdir(_CORPUS_DIR)): + if not fname.lower().endswith(".txt"): + continue + std = _standard_for_file(fname) + with open(os.path.join(_CORPUS_DIR, fname), encoding="utf-8") as f: + raw = f.read() + for para in re.split(r"\n\s*\n", raw): + text = para.strip() + if len(text) < 20: + continue + m = _SECTION_RE.match(text) + chunks.append({ + "standard": std, + "section": m.group(1) if m else None, + "text": text, + }) + _corpus_cache = chunks + return chunks + + +def _query_terms(assertions: List[Dict]) -> set: + blob = " ".join( + f"{a.get('attribute','')} {a.get('value','')} {a.get('source_text','')}" + for a in assertions + ).lower() + return set(_WORD_RE.findall(blob)) + + +def retrieve(review_paths: Dict, assertions: List[Dict], k: int = 24) -> List[Dict]: + """Top-k corpus chunks for the active standards, scored by term overlap.""" + corpus = load_corpus() + if not corpus: + return [] + active = {std for flag, std in PATH_TO_STANDARD.items() if (review_paths or {}).get(flag)} + # If the profile is empty/unknown, fall back to accessibility standards. + pool = [c for c in corpus if not active or c["standard"] in active] + if not pool: + pool = corpus + + terms = _query_terms(assertions) + scored = [] + for c in pool: + ctext = c["text"].lower() + score = sum(1 for t in terms if t in ctext) + if score: + scored.append((score, c)) + scored.sort(key=lambda sc: sc[0], reverse=True) + return [c for _, c in scored[:k]] + + +def format_excerpts(excerpts: List[Dict]) -> str: + """Render retrieved excerpts for the prompt.""" + if not excerpts: + return "(no code excerpts available; do not cite section numbers)" + out = [] + for e in excerpts: + sec = f" {e['section']}" if e.get("section") else "" + out.append(f"[{e['standard']}{sec}] {e['text']}") + return "\n\n".join(out) diff --git a/backend/pipeline/code_review.py b/backend/pipeline/code_review.py new file mode 100644 index 0000000..3f7cd5a --- /dev/null +++ b/backend/pipeline/code_review.py @@ -0,0 +1,72 @@ +""" +code_review.py - Stage 7: code / ADA / TDLR / Municode review (LLM + retrieval). + +Flags likely code and accessibility issues, grounded in BOTH the drawing +evidence and retrieved excerpts of the applicable standards (see code_refs.py). +The model may only cite section numbers that appear in the retrieved excerpts; +with an empty corpus it runs reasoning-only and cites nothing. + +Sheets are processed in batches (bounded assertion count per call) so a single +oversized whole-set call can't truncate and zero out the whole stage. Each batch +retrieves excerpts targeted to its own assertions. Emits the canonical issue +schema; returns [] on failure. +""" + +from concurrent.futures import ThreadPoolExecutor +from typing import Dict, List + +from backend import config +from backend.pipeline import code_refs +from backend.pipeline.jurisdiction import active_review_paths +from backend.pipeline._serialize import dumps, slim_sheets +from backend.pipeline._stage import call_stage, collect_list, validate_issue +from backend.prompts import CODE_REVIEW_SYSTEM_PROMPT, CODE_REVIEW_USER_INSTRUCTION + + +def _sheet_batches(sheets: List[Dict], max_assertions: int) -> List[List[Dict]]: + """Group whole sheets so each batch holds <= max_assertions facts.""" + batches: List[List[Dict]] = [] + cur: List[Dict] = [] + n = 0 + for s in sheets: + a = len(s.get("assertions", [])) + if cur and n + a > max_assertions: + batches.append(cur) + cur, n = [], 0 + cur.append(s) + n += a + if cur: + batches.append(cur) + return batches + + +def _review_batch(batch: List[Dict], jurisdiction: Dict, sheet_index: Dict, + paths: Dict) -> List[Dict]: + assertions = [a for s in batch for a in s.get("assertions", [])] + excerpts = code_refs.retrieve(paths, assertions) + parsed = call_stage( + CODE_REVIEW_SYSTEM_PROMPT, + CODE_REVIEW_USER_INSTRUCTION, + subs={ + "jurisdiction": dumps(jurisdiction or {}), + "sheet_index": dumps(sheet_index or {}), + "assertions": dumps(slim_sheets(batch)), + "code_references": code_refs.format_excerpts(excerpts), + }, + max_tokens=config.CODE_MAX_TOKENS, + ) + return collect_list(parsed, "issues", lambda c: validate_issue(c, "code")) + + +def code_review(jurisdiction: Dict, sheets: List[Dict], sheet_index: Dict) -> List[Dict]: + paths = active_review_paths(jurisdiction) + if not code_refs.load_corpus(): + print("[Code] no corpus -> reasoning-only (no citations)") + batches = _sheet_batches(sheets, config.CODE_BATCH_SIZE) + + issues: List[Dict] = [] + with ThreadPoolExecutor(max_workers=config.CODE_CONCURRENCY) as pool: + for res in pool.map(lambda b: _review_batch(b, jurisdiction, sheet_index, paths), batches): + issues.extend(res) + print(f"[Code] {len(issues)} code/accessibility issue(s) across {len(batches)} batch(es)") + return issues diff --git a/backend/pipeline/conflict_checker.py b/backend/pipeline/conflict_checker.py new file mode 100644 index 0000000..fc0bdde --- /dev/null +++ b/backend/pipeline/conflict_checker.py @@ -0,0 +1,136 @@ +""" +conflict_checker.py - Stage 3: cross-discipline conflict reasoning. + +One reasoning call per co-located cluster (batch-size-1 per the IronBid +token-budget lesson: small, focused calls don't truncate). Each call gets the +cluster's assertions as evidence plus the relevant sheet images, and returns +zero or more validated conflicts. Calls run in parallel. +""" + +import threading +from concurrent.futures import ThreadPoolExecutor, as_completed +from typing import List, Dict, Optional + +from backend import config +from backend.llm import call_json +from backend.prompts import ( + CONFLICT_SYSTEM_PROMPT, + CONFLICT_USER_INSTRUCTION, + CONFLICT_CATEGORIES, +) + +# Cap images per cluster to bound tokens/cost. Most clusters touch 2-4 sheets. +MAX_IMAGES_PER_CLUSTER = 6 + + +def _evidence_block(cluster: Dict) -> str: + lines = [] + for a in cluster["assertions"]: + sheet = a.get("sheet_number") or "?" + lines.append( + f"- [{a.get('discipline','Unknown')}] {sheet} | " + f"{a.get('attribute','')} = {a.get('value','')} | " + f"\"{a.get('source_text','')}\"" + ) + return "\n".join(lines) + + +def _images_for(cluster: Dict, page_to_b64: Dict[int, str]) -> List[str]: + imgs = [] + for pn in cluster.get("page_numbers", [])[:MAX_IMAGES_PER_CLUSTER]: + b64 = page_to_b64.get(pn) + if b64: + imgs.append(b64) + return imgs + + +def _valid_conflict(c: Dict, cluster: Dict) -> Optional[Dict]: + """Coerce + validate one model-returned conflict; drop if malformed.""" + if not isinstance(c, dict): + return None + category = (c.get("category") or "").strip() + if category not in CONFLICT_CATEGORIES: + # Unknown category -> keep but mark, so tuning can see what the model wanted. + category = category or "uncategorized" + severity = (c.get("severity") or "medium").strip().lower() + if severity not in ("high", "medium", "low"): + severity = "medium" + description = (c.get("description") or "").strip() + if not description: + return None # a conflict with no description is noise + return { + "category": category, + "severity": severity, + "disciplines": c.get("disciplines") or cluster.get("disciplines", []), + "location": c.get("location") or cluster.get("location", ""), + "sheets": c.get("sheets") or cluster.get("sheets", []), + "description": description, + "evidence": c.get("evidence") or [], + "recommended_resolution": (c.get("recommended_resolution") or "").strip(), + "confidence": (c.get("confidence") or "medium").strip().lower(), + "cluster_key": cluster.get("key"), + } + + +def _check_one(cluster: Dict, page_to_b64: Dict[int, str]) -> List[Dict]: + user_text = ( + CONFLICT_USER_INSTRUCTION + .replace("{location}", cluster.get("location", "")) + .replace("{evidence}", _evidence_block(cluster)) + ) + parsed = call_json( + system_prompt=CONFLICT_SYSTEM_PROMPT, + user_text=user_text, + images_b64=_images_for(cluster, page_to_b64), + max_tokens=config.REASON_MAX_TOKENS, + ) + if isinstance(parsed, list): + candidates = parsed + elif isinstance(parsed, dict): + candidates = parsed.get("conflicts") or [] + else: + return [] + out = [] + for c in candidates: + v = _valid_conflict(c, cluster) + if v: + out.append(v) + return out + + +def check_conflicts(clusters: List[Dict], pages: List[Dict]) -> List[Dict]: + """ + Reason over every cluster and return a flat list of validated conflicts. + + pages: the Stage-0 page dicts (need 'page_number' and 'base64') so each + cluster can be shown its own sheets. + """ + page_to_b64 = {p["page_number"]: p["base64"] for p in pages} + print(f"[Conflicts] Reasoning over {len(clusters)} clusters...") + + conflicts: List[Dict] = [] + completed = 0 + lock = threading.Lock() + + def work(cluster: Dict) -> List[Dict]: + nonlocal completed + found = _check_one(cluster, page_to_b64) + with lock: + completed += 1 + if completed % 10 == 0 or completed == len(clusters): + print(f"[Conflicts] {completed}/{len(clusters)} clusters checked") + return found + + with ThreadPoolExecutor(max_workers=config.REASON_CONCURRENCY) as ex: + futures = [ex.submit(work, c) for c in clusters] + for fut in as_completed(futures): + try: + conflicts.extend(fut.result()) + except Exception as e: + print(f"[Conflicts] cluster error: {e}") + + # Sort by severity then category for a stable, readable report. + sev_rank = {"high": 0, "medium": 1, "low": 2} + conflicts.sort(key=lambda c: (sev_rank.get(c["severity"], 1), c["category"])) + print(f"[Conflicts] Found {len(conflicts)} conflict(s)") + return conflicts diff --git a/backend/pipeline/constructability.py b/backend/pipeline/constructability.py new file mode 100644 index 0000000..ed1c735 --- /dev/null +++ b/backend/pipeline/constructability.py @@ -0,0 +1,35 @@ +""" +constructability.py - Stage 8: constructability review (LLM). + +One whole-set reasoning pass flagging things that are drawn but hard, ambiguous, +or impossible to build as shown (access/clearance, sequencing, support, routing, +tolerance, dimension closure, detail gaps). Emits the canonical issue schema. +Returns [] on failure. +""" + +from typing import Dict, List + +from backend import config +from backend.pipeline._serialize import dumps, slim_clusters, slim_sheets +from backend.pipeline._stage import call_stage, collect_list, validate_issue +from backend.prompts import ( + CONSTRUCTABILITY_SYSTEM_PROMPT, + CONSTRUCTABILITY_USER_INSTRUCTION, +) + + +def constructability_review(sheets: List[Dict], clusters: List[Dict], + conflicts: List[Dict]) -> List[Dict]: + parsed = call_stage( + CONSTRUCTABILITY_SYSTEM_PROMPT, + CONSTRUCTABILITY_USER_INSTRUCTION, + subs={ + "assertions": dumps(slim_sheets(sheets)), + "clusters": dumps(slim_clusters(clusters)), + "conflicts": dumps(conflicts), + }, + max_tokens=config.CONSTRUCT_MAX_TOKENS, + ) + issues = collect_list(parsed, "issues", lambda c: validate_issue(c, "constructability")) + print(f"[Constructability] {len(issues)} constructability issue(s)") + return issues diff --git a/backend/pipeline/extractor.py b/backend/pipeline/extractor.py new file mode 100644 index 0000000..f75dac8 --- /dev/null +++ b/backend/pipeline/extractor.py @@ -0,0 +1,287 @@ +""" +extractor.py - Stage 2: per-sheet construction object extraction. + +One vision call per page produces a "sheet object manifest": the discipline +plus a list of typed, grounded construction objects (each with verbatim +source_text and a location_key). Output feeds Stage 3 normalization and +Stage 4 clustering. + +Grounding guard (anti-hallucination): an object is dropped if its primary +value contains numeric claims not present in its source_text. Graphical +objects (graphical_basis set, no source_text) are allowed through. +""" + +import re +import threading +from concurrent.futures import ThreadPoolExecutor, as_completed +from typing import List, Dict, Optional + +from backend import config +from backend.llm import call_json +from backend.prompts import ( + EXTRACTOR_SYSTEM_PROMPT, + EXTRACTOR_USER_INSTRUCTION, + DISCIPLINE_PREFIXES, + ATTRIBUTE_VOCAB, +) + +# prefix (upper) -> discipline, longest-prefix-first for greedy matching +_PREFIX_TO_DISCIPLINE = sorted( + ((p.upper(), disc) for disc, ps in DISCIPLINE_PREFIXES.items() for p in ps), + key=lambda kv: -len(kv[0]), +) + +_LETTERS_RE = re.compile(r"^[A-Za-z]+") +_DIGITS_RE = re.compile(r"\d+") +# "Room 124", "RM 124A", "SPACE 12" -> "124" / "124A" / "12". Conservative: an +# explicit room/rm/space keyword followed by a 2-4 digit number (+ optional letter). +_ROOM_RE = re.compile(r"(?i)\b(?:room|rm|space)\s*#?\s*(\d{2,4}[A-Za-z]?)\b") + + +def _room_from_text(text: Optional[str]) -> Optional[str]: + """Best-effort room id from free text when location_key.room is missing.""" + if not text: + return None + m = _ROOM_RE.search(str(text)) + return m.group(1) if m else None + + +def discipline_from_sheet_number(sheet_number: Optional[str]) -> Optional[str]: + """Deterministic discipline from the sheet-number letter prefix, or None.""" + if not sheet_number: + return None + m = _LETTERS_RE.match(sheet_number.strip()) + if not m: + return None + prefix = m.group(0).upper() + for cand, disc in _PREFIX_TO_DISCIPLINE: # longest prefix wins + if prefix == cand: + return disc + # Fall back to the single leading letter (e.g. "A2" -> "A") + for cand, disc in _PREFIX_TO_DISCIPLINE: + if prefix.startswith(cand) and len(cand) == 1: + return disc + return None + + +def _is_grounded(value: str, source_text: str, graphical_basis: str = "") -> bool: + """ + Keep an object only if its primary value is supported by its source_text, + OR it is a graphical object (has graphical_basis with no text to quote). + + - If graphical_basis is set and source_text is absent, the object is valid. + - If the value contains digits, every distinct digit-run must appear in + source_text (catches invented dimensions/counts/elevations). + - If the value has no digits, require some alphabetic-token overlap. + """ + # Graphical objects (no readable text on sheet) are always allowed through. + if graphical_basis and not source_text: + return True + if not value or not source_text: + return False + value = str(value) + src_low = source_text.lower() + + val_digits = set(_DIGITS_RE.findall(value)) + if val_digits: + src_digits = set(_DIGITS_RE.findall(source_text)) + return val_digits.issubset(src_digits) + + # No digits: text-based grounding. + val_norm = re.sub(r"[^a-z0-9]+", " ", value.lower()).strip() + if val_norm and val_norm in src_low: + return True + val_tokens = {t for t in val_norm.split() if len(t) > 2} + src_tokens = set(re.sub(r"[^a-z0-9]+", " ", src_low).split()) + return bool(val_tokens & src_tokens) + + +def _primary_value(obj: Dict) -> str: + """Extract a single string 'value' from an object for grounding checks. + + Handles both the new 'attributes' dict schema and the legacy 'value' field. + """ + attrs = obj.get("attributes") + if isinstance(attrs, dict) and attrs: + return str(next(iter(attrs.values()))) + # Legacy assertion schema has a top-level 'value' field + return (obj.get("value") or obj.get("description") + or obj.get("name") or obj.get("tag") or "") + + +def _normalize_sheet(parsed: Dict, page_number: int) -> Dict: + """ + Validate + clean one parsed sheet result, attaching page_number and ids. + + The LLM now returns a 'sheet' header + 'objects' array (Stage 2 schema). + We map each object to an enriched assertion dict that is backward-compatible + with all downstream stages (clusterer, conflict_checker, etc.) while also + carrying the new typed-object fields. + """ + # Support both new schema {sheet:{...}, objects:[...]} and old {sheet_number, assertions:[...]} + sheet_meta = parsed.get("sheet") or {} + sheet_number = sheet_meta.get("sheet_number") or parsed.get("sheet_number") + sheet_title = sheet_meta.get("sheet_title") or parsed.get("sheet_title") + level = sheet_meta.get("level") or parsed.get("level") + scale = sheet_meta.get("scale") or parsed.get("scale") + drawing_type = sheet_meta.get("drawing_type") + + raw_discipline = sheet_meta.get("discipline") or parsed.get("discipline") + discipline = raw_discipline or discipline_from_sheet_number(sheet_number) + if not discipline or discipline == "General": + deduced = discipline_from_sheet_number(sheet_number) + if deduced: + discipline = deduced + discipline = discipline or "Unknown" + + # Accept both new 'objects' and legacy 'assertions' keys + raw_objects = parsed.get("objects") or parsed.get("assertions") or [] + clean: List[Dict] = [] + dropped = 0 + + for idx, obj in enumerate(raw_objects): + if not isinstance(obj, dict): + continue + + source_text = obj.get("source_text") or "" + graphical_basis = obj.get("graphical_basis") or "" + + # Derive a primary value for the grounding check + primary_val = _primary_value(obj) + + if not _is_grounded(primary_val, source_text, graphical_basis): + dropped += 1 + continue + + # --- location_key: new schema is richer; map to legacy shape + extras --- + lk = obj.get("location_key") + if not isinstance(lk, dict): + lk = {} + + # Room recovery: try new keys first, then fall back to text scan + room = (lk.get("room") or lk.get("room_number") + or _room_from_text(obj.get("name")) or _room_from_text(source_text)) + room_name = lk.get("room_name") + + assertion_id = (obj.get("object_id") or obj.get("assertion_id") + or f"{sheet_number or 'p' + str(page_number)}#{idx}") + + # Map object's attributes dict to legacy subject/attribute/value + attrs = obj.get("attributes") or {} + if isinstance(attrs, dict) and attrs: + first_attr_key = next(iter(attrs)) + first_attr_val = str(attrs[first_attr_key]) + else: + first_attr_key = obj.get("object_type") or "unspecified" + first_attr_val = primary_val + + clean.append({ + # --- legacy fields (backward-compat with clusterer, conflict_checker, etc.) --- + "id": assertion_id, + "subject": (obj.get("name") or obj.get("tag") or obj.get("object_type") + or obj.get("subject") or ""), + "attribute": first_attr_key, + "value": first_attr_val, + "location_key": { + "grid": lk.get("grid"), + "room": room, + "room_name": room_name, + "level": lk.get("level") or level, + "tag": lk.get("tag") or obj.get("tag"), + "detail_reference": lk.get("detail_reference"), + "plan_zone": lk.get("plan_zone"), + "elevation_reference": lk.get("elevation_reference"), + }, + "source_text": source_text, + "confidence": obj.get("confidence") or "medium", + # --- new typed-object fields --- + "object_type": obj.get("object_type"), + "category": obj.get("category"), + "object_tag": obj.get("tag"), + "object_name": obj.get("name"), + "object_description": obj.get("description"), + "object_attributes": attrs, + "graphical_basis": graphical_basis or None, + "review_uses": obj.get("review_uses") or [], + }) + + if dropped: + print(f"[Extract] Page {page_number} ({sheet_number}): dropped {dropped} ungrounded object(s)") + + unresolved = parsed.get("unresolved_items") or [] + + return { + "page_number": page_number, + "sheet_number": sheet_number, + "discipline": discipline, + "sheet_title": sheet_title, + "drawing_type": drawing_type, + "level": level, + "scale": scale, + "assertions": clean, # downstream stages read this key + "unresolved_items": unresolved, + } + + +def _extract_one(page: Dict, sheet_hint: str = "") -> Dict: + user_text = EXTRACTOR_USER_INSTRUCTION.replace("{sheet_hint}", sheet_hint) + parsed = call_json( + system_prompt=EXTRACTOR_SYSTEM_PROMPT, + user_text=user_text, + images_b64=[page["base64"]], + max_tokens=config.EXTRACT_MAX_TOKENS, + ) + if not isinstance(parsed, dict): + return { + "page_number": page["page_number"], + "sheet_number": None, + "discipline": "Unknown", + "sheet_title": f"Page {page['page_number']} (extraction failed)", + "level": None, + "scale": None, + "assertions": [], + } + return _normalize_sheet(parsed, page["page_number"]) + + +def extract_assertions(pages: List[Dict], on_progress=None) -> List[Dict]: + """ + Run Stage 2 over all pages. Returns a list of per-sheet object dicts, + ordered by page_number. The 'assertions' key on each sheet holds the + enriched construction objects (backward-compatible with downstream stages). + """ + print(f"[Extract] Extracting construction objects from {len(pages)} pages...") + results: List[Dict] = [] + completed = 0 + lock = threading.Lock() + + def work(page: Dict) -> Dict: + nonlocal completed + out = _extract_one(page) + with lock: + completed += 1 + n = len(out["assertions"]) + u = len(out.get("unresolved_items") or []) + print(f"[Extract] Page {page['page_number']} -> {out['discipline']} " + f"({out.get('sheet_number')}), {n} objects" + + (f", {u} unresolved" if u else "") + + f" [{completed}/{len(pages)}]") + if on_progress: + on_progress(completed, len(pages)) + return out + + with ThreadPoolExecutor(max_workers=config.EXTRACT_CONCURRENCY) as ex: + futures = {ex.submit(work, p): p for p in pages} + for fut in as_completed(futures): + try: + results.append(fut.result()) + except Exception as e: + p = futures[fut] + print(f"[Extract] Page {p['page_number']} unexpected error: {e}") + + results.sort(key=lambda s: s["page_number"]) + total = sum(len(s["assertions"]) for s in results) + total_unresolved = sum(len(s.get("unresolved_items") or []) for s in results) + print(f"[Extract] Done - {total} grounded objects across {len(results)} sheets" + + (f" ({total_unresolved} unresolved items)" if total_unresolved else "")) + return results diff --git a/backend/pipeline/jurisdiction.py b/backend/pipeline/jurisdiction.py new file mode 100644 index 0000000..4e698cd --- /dev/null +++ b/backend/pipeline/jurisdiction.py @@ -0,0 +1,37 @@ +""" +jurisdiction.py - Stage 0: project intake and jurisdiction / code profile (LLM). + +Turns whatever project metadata we have (intake form fields and/or values +derived from the cover sheet) into a code profile that tells Stage 7 which +review paths apply (IBC, ADA, TAS/TDLR, etc.). Returns {} on failure so the +rest of the pipeline degrades gracefully. +""" + +import json +from typing import Dict, Optional + +from backend import config +from backend.pipeline._stage import call_stage +from backend.prompts import JURISDICTION_SYSTEM_PROMPT, JURISDICTION_USER_INSTRUCTION + + +def run_jurisdiction(project_input: Optional[Dict]) -> Dict: + """Build the project code profile from available project metadata.""" + project_input = project_input or {} + parsed = call_stage( + JURISDICTION_SYSTEM_PROMPT, + JURISDICTION_USER_INSTRUCTION, + subs={"project_input": json.dumps(project_input, ensure_ascii=True)}, + max_tokens=config.JURISDICTION_MAX_TOKENS, + ) + if not isinstance(parsed, dict): + print("[Jurisdiction] no profile produced; code review will be limited") + return {} + # The prompt wraps the result in "project_code_profile"; unwrap when present. + profile = parsed.get("project_code_profile") + return profile if isinstance(profile, dict) else parsed + + +def active_review_paths(profile: Dict) -> Dict: + """The review_paths sub-dict (which code checks are on), or {} if absent.""" + return (profile or {}).get("review_paths") or {} diff --git a/backend/pipeline/llm_clusterer.py b/backend/pipeline/llm_clusterer.py new file mode 100644 index 0000000..dcec971 --- /dev/null +++ b/backend/pipeline/llm_clusterer.py @@ -0,0 +1,97 @@ +""" +llm_clusterer.py - Stage 4 (LLM variant): semantic co-location clustering. + +An alternative to the deterministic clusterer.py. Sends the flattened +assertions (each with a stable id) to the model, which groups ones that refer +to the same real-world room/door/grid/tag/equipment -- catching fuzzy matches +the exact-key clusterer misses ("Room 124" vs "Mgr Office 124"). The returned +assertion_ids are resolved back to full assertions and emitted in the SAME +internal cluster shape conflict_checker/report consume, so it is a drop-in swap. + +Selected via config.CLUSTERER == "llm". On failure returns []. Keeps clusters +with >= 2 member assertions (a single-assertion cluster gives the reasoner +nothing to compare). +""" + +import json +from typing import Dict, List + +from backend import config +from backend.pipeline._stage import call_stage, collect_list +from backend.prompts import CLUSTER_SYSTEM_PROMPT, CLUSTER_USER_INSTRUCTION + +MAX_ASSERTIONS_PER_CLUSTER = 24 + + +def _flatten(sheets: List[Dict]) -> List[Dict]: + flat: List[Dict] = [] + for s in sheets: + for a in s.get("assertions", []): + flat.append({**a, + "discipline": s.get("discipline", "Unknown"), + "sheet_number": s.get("sheet_number"), + "page_number": s.get("page_number")}) + return flat + + +def _payload(flat: List[Dict]) -> List[Dict]: + return [{ + "assertion_id": a["id"], + "discipline": a["discipline"], + "sheet_number": a.get("sheet_number"), + "attribute": a.get("attribute"), + "value": a.get("value"), + "location_key": a.get("location_key"), + "source_text": a.get("source_text"), + } for a in flat] + + +def _location(pk) -> str: + if not isinstance(pk, dict): + return "Unspecified" + lvl = f" / {pk['level']}" if pk.get("level") else "" + for key, label in (("room", "Room"), ("grid", "Grid"), ("tag", "Tag")): + if pk.get(key): + return f"{label} {pk[key]}{lvl}" + return pk.get("plan_zone") or pk.get("room_name") or "Unspecified" + + +def cluster_by_location_llm(sheets: List[Dict]) -> List[Dict]: + flat = _flatten(sheets) + if not flat: + return [] + by_id = {a["id"]: a for a in flat} + + parsed = call_stage( + CLUSTER_SYSTEM_PROMPT, + CLUSTER_USER_INSTRUCTION, + subs={"normalized_assertions": json.dumps(_payload(flat), ensure_ascii=True)}, + max_tokens=config.CLUSTER_MAX_TOKENS, + ) + raw = collect_list(parsed, "clusters") + + clusters: List[Dict] = [] + for c in raw: + member_ids = [i for i in (c.get("assertion_ids") or []) if i in by_id] + members = [by_id[i] for i in member_ids] + disciplines = sorted({m["discipline"] for m in members}) + # Need at least two facts to compare (cross-discipline, or schedule vs plan). + if len(members) < 2: + continue + members = members[:MAX_ASSERTIONS_PER_CLUSTER] + clusters.append({ + "key": str(c.get("cluster_id") or _location(c.get("primary_location_key"))), + "location": _location(c.get("primary_location_key")), + "disciplines": disciplines, + "page_numbers": sorted({m["page_number"] for m in members if m.get("page_number")}), + "sheets": sorted({m["sheet_number"] for m in members if m.get("sheet_number")}), + "assertions": members, + "kind": "llm", + }) + + clusters.sort(key=lambda c: (-len(c["disciplines"]), -len(c["assertions"]), c["key"])) + if len(clusters) > config.CLUSTER_MAX: + print(f"[Cluster/LLM] capping {len(clusters)} -> {config.CLUSTER_MAX}") + clusters = clusters[:config.CLUSTER_MAX] + print(f"[Cluster/LLM] {len(clusters)} clusters (from {len(raw)} returned)") + return clusters diff --git a/backend/pipeline/normalizer.py b/backend/pipeline/normalizer.py new file mode 100644 index 0000000..742ba8d --- /dev/null +++ b/backend/pipeline/normalizer.py @@ -0,0 +1,184 @@ +""" +normalizer.py - Stage 3: construction object normalization + project intelligence. + +Stage 3a: normalize_assertions — adds normalized values (e.g. 9'-0" -> 108 in) +and normalized tags/room identifiers to extracted objects. Additive; originals +are always preserved. Processed in batches across a thread pool. + +Stage 3b: build_project_intelligence — cross-sheet merging pass that assigns +Global Object IDs (GOIDs) and builds relationships between objects that +represent the same physical element across multiple drawings/schedules. +Batched by object_type so each call stays within the token budget. +""" + +import json +from collections import defaultdict +from concurrent.futures import ThreadPoolExecutor +from typing import Dict, List + +from backend import config +from backend.pipeline._stage import call_stage +from backend.prompts import ( + NORMALIZATION_SYSTEM_PROMPT, + NORMALIZATION_USER_INSTRUCTION, + PROJECT_INTELLIGENCE_SYSTEM_PROMPT, + PROJECT_INTELLIGENCE_USER_INSTRUCTION, +) + + +def _batches(items: List[Dict], size: int) -> List[List[Dict]]: + return [items[i:i + size] for i in range(0, len(items), size)] + + +def _normalize_batch(batch: List[Dict]) -> Dict[str, Dict]: + """Return {assertion_id: normalization fields} for one batch.""" + payload = [ + { + "assertion_id": a["id"], + "attribute": a.get("attribute"), + "value": a.get("value"), + "object_type": a.get("object_type"), + "object_tag": a.get("object_tag"), + "source_text": a.get("source_text"), + } + for a in batch + ] + parsed = call_stage( + NORMALIZATION_SYSTEM_PROMPT, + NORMALIZATION_USER_INSTRUCTION, + subs={"assertions": json.dumps(payload, ensure_ascii=True)}, + max_tokens=config.NORMALIZE_MAX_TOKENS, + ) + if isinstance(parsed, list): + rows = parsed + elif isinstance(parsed, dict): + rows = parsed.get("normalized_assertions") or [] + else: + rows = [] + out: Dict[str, Dict] = {} + for n in rows: + if isinstance(n, dict) and n.get("assertion_id"): + out[n["assertion_id"]] = { + "normalized_value": n.get("normalized_value"), + "normalized_unit": n.get("normalized_unit"), + "normalized_tag": n.get("normalized_tag"), + "normalized_room": n.get("normalized_room"), + } + return out + + +def normalize_assertions(sheets: List[Dict]) -> List[Dict]: + """Annotate each assertion in-place with normalized fields.""" + all_assertions = [a for s in sheets for a in s.get("assertions", [])] + if not all_assertions: + return sheets + + batches = _batches(all_assertions, config.NORMALIZE_BATCH_SIZE) + merged: Dict[str, Dict] = {} + with ThreadPoolExecutor(max_workers=config.NORMALIZE_CONCURRENCY) as pool: + for result in pool.map(_normalize_batch, batches): + merged.update(result) + + applied = 0 + for a in all_assertions: + norm = merged.get(a["id"]) + if norm: + if norm.get("normalized_value") is not None: + a["normalized_value"] = norm["normalized_value"] + a["normalized_unit"] = norm.get("normalized_unit") + applied += 1 + if norm.get("normalized_tag"): + a["normalized_tag"] = norm["normalized_tag"] + if norm.get("normalized_room"): + a["normalized_room"] = norm["normalized_room"] + # Also push into location_key so clusterer picks it up + if isinstance(a.get("location_key"), dict) and not a["location_key"].get("room"): + a["location_key"]["room"] = norm["normalized_room"] + + print(f"[Normalize] normalized {applied}/{len(all_assertions)} objects") + return sheets + + +# --------------------------------------------------------------------------- +# Stage 3b - project intelligence: GOIDs + relationships +# --------------------------------------------------------------------------- + +# Max objects of one type to send in a single intelligence call. +_INTEL_BATCH_SIZE = 60 + + +def _intel_batch(object_type: str, objects: List[Dict]) -> Dict: + """Run the project intelligence pass for one object_type batch.""" + payload = [] + for obj in objects: + payload.append({ + "object_id": obj.get("id"), + "object_type": obj.get("object_type") or object_type, + "tag": obj.get("object_tag"), + "name": obj.get("object_name"), + "attributes": obj.get("object_attributes") or {}, + "location_key": obj.get("location_key") or {}, + "source_text": obj.get("source_text") or "", + "source_sheet": (obj.get("location_key") or {}).get("sheet_number"), + }) + parsed = call_stage( + PROJECT_INTELLIGENCE_SYSTEM_PROMPT, + PROJECT_INTELLIGENCE_USER_INSTRUCTION, + subs={ + "object_type": object_type, + "objects": json.dumps(payload, ensure_ascii=True), + }, + max_tokens=config.NORMALIZE_MAX_TOKENS, + ) + if not isinstance(parsed, dict): + return {} + return { + "project_objects": parsed.get("project_objects") or [], + "unresolved_relationships": parsed.get("unresolved_relationships") or [], + } + + +def build_project_intelligence(sheets: List[Dict]) -> Dict: + """ + Stage 3b: cross-sheet GOID assignment and relationship building. + + Groups all extracted objects by object_type, then calls the Project + Intelligence LLM once per type (batched) to assign GOIDs and link + objects that represent the same physical element across sheets. + + Returns {"project_objects": [...], "unresolved_relationships": [...]}. + On any failure, returns an empty dict (graceful degradation). + """ + all_assertions = [a for s in sheets for a in s.get("assertions", [])] + if not all_assertions: + return {} + + # Group by object_type; unknown/graphical go under "general" + by_type: Dict[str, List[Dict]] = defaultdict(list) + for a in all_assertions: + otype = a.get("object_type") or "general" + by_type[otype].append(a) + + all_project_objects: List[Dict] = [] + all_unresolved: List[Dict] = [] + + # Process each type in batches; high-count types (e.g. dimensions) are + # less useful for GOID merging so we skip types with only 1 object. + for otype, objs in sorted(by_type.items()): + if len(objs) < 2: + continue + batches = _batches(objs, _INTEL_BATCH_SIZE) + for batch in batches: + try: + result = _intel_batch(otype, batch) + all_project_objects.extend(result.get("project_objects") or []) + all_unresolved.extend(result.get("unresolved_relationships") or []) + except Exception as e: + print(f"[ProjectIntel] {otype} batch failed: {e}") + + print(f"[ProjectIntel] {len(all_project_objects)} project objects, " + f"{len(all_unresolved)} unresolved relationships") + return { + "project_objects": all_project_objects, + "unresolved_relationships": all_unresolved, + } diff --git a/backend/pipeline/pdf_processor.py b/backend/pipeline/pdf_processor.py new file mode 100644 index 0000000..81d7f1e --- /dev/null +++ b/backend/pipeline/pdf_processor.py @@ -0,0 +1,88 @@ +""" +pdf_processor.py - Converts an uploaded PDF drawing set into page images. + +Each page becomes a base64-encoded JPEG that the vision model can read. +Higher DPI = better accuracy but slower/heavier requests. Adapted from the +IronBid pipeline (AI_Takeoffs); behavior is intentionally identical so the +two projects stay comparable. +""" + +import base64 +from io import BytesIO +from typing import List, Dict + +from pdf2image import convert_from_path +from PIL import Image + +from backend import config + + +def convert_pdf_to_images(pdf_path: str) -> List[Dict]: + """ + Convert each page of a PDF into a base64-encoded JPEG. + + Returns a list of dicts: + { "page_number": int, "base64": str, "width": int, "height": int } + """ + print(f"[PDF] Converting {pdf_path} at {config.PDF_DPI} DPI...") + + pages = convert_from_path( + pdf_path, + dpi=config.PDF_DPI, + fmt="jpeg", + thread_count=4, + use_pdftocairo=True, + ) + + results: List[Dict] = [] + total = min(len(pages), config.MAX_PAGES) + + for i, page in enumerate(pages[:total]): + # 2400px gives ~100px/inch on a 24x36 sheet, the minimum needed to + # read 8pt room annotations and dimension strings. + page = _resize_if_needed(page, max_dimension=config.MAX_DIMENSION) + + buffer = BytesIO() + page.save(buffer, format="JPEG", quality=85) + b64 = base64.b64encode(buffer.getvalue()).decode("utf-8") + + results.append({ + "page_number": i + 1, + "base64": b64, + "width": page.width, + "height": page.height, + }) + print(f"[PDF] Page {i+1}/{total} encoded ({page.width}x{page.height})") + + print(f"[PDF] Done - {len(results)} pages ready for analysis") + return results + + +def render_page_jpeg(pdf_path: str, page: int, dpi: int = 150, + max_dimension: int = 3000) -> bytes: + """ + Render a single 1-based page of a PDF to JPEG bytes, for the sheet viewer. + + Higher DPI than the analysis pass (default 150) so text is legible on + screen. Raises IndexError if the page is out of range. + """ + if page < 1: + raise IndexError(f"page {page} out of range") + pages = convert_from_path(pdf_path, dpi=dpi, fmt="jpeg", + first_page=page, last_page=page, use_pdftocairo=True) + if not pages: + raise IndexError(f"page {page} out of range") + img = _resize_if_needed(pages[0], max_dimension=max_dimension) + buffer = BytesIO() + img.save(buffer, format="JPEG", quality=85) + return buffer.getvalue() + + +def _resize_if_needed(image: Image.Image, max_dimension: int = 2400) -> Image.Image: + """Resize image proportionally if either dimension exceeds max_dimension.""" + w, h = image.size + if w <= max_dimension and h <= max_dimension: + return image + ratio = min(max_dimension / w, max_dimension / h) + new_size = (int(w * ratio), int(h * ratio)) + return image.resize(new_size, Image.LANCZOS) diff --git a/backend/pipeline/qaqc_review.py b/backend/pipeline/qaqc_review.py new file mode 100644 index 0000000..7788bce --- /dev/null +++ b/backend/pipeline/qaqc_review.py @@ -0,0 +1,34 @@ +""" +qaqc_review.py - Stage 6: senior architect full-set QAQC review (LLM). + +One whole-set reasoning pass that surfaces QAQC issues BEYOND the direct +cross-discipline conflicts already found in Stage 5 -- missing sheets/schedules/ +details, incomplete information, bid/permit-readiness gaps. Text-based over the +already-extracted assertions, clusters, and conflicts; emits the canonical issue +schema. Returns [] on failure. +""" + +from typing import Dict, List + +from backend import config +from backend.pipeline._serialize import dumps, slim_clusters, slim_sheets +from backend.pipeline._stage import call_stage, collect_list, validate_issue +from backend.prompts import SENIOR_QAQC_SYSTEM_PROMPT, SENIOR_QAQC_USER_INSTRUCTION + + +def senior_review(sheets: List[Dict], clusters: List[Dict], + conflicts: List[Dict], sheet_index: Dict) -> List[Dict]: + parsed = call_stage( + SENIOR_QAQC_SYSTEM_PROMPT, + SENIOR_QAQC_USER_INSTRUCTION, + subs={ + "sheet_index": dumps(sheet_index or {}), + "assertions": dumps(slim_sheets(sheets)), + "clusters": dumps(slim_clusters(clusters)), + "conflicts": dumps(conflicts), + }, + max_tokens=config.QAQC_MAX_TOKENS, + ) + issues = collect_list(parsed, "issues", lambda c: validate_issue(c, "qaqc")) + print(f"[QAQC] {len(issues)} full-set QAQC issue(s)") + return issues diff --git a/backend/pipeline/report.py b/backend/pipeline/report.py new file mode 100644 index 0000000..6f4e698 --- /dev/null +++ b/backend/pipeline/report.py @@ -0,0 +1,88 @@ +""" +report.py - Stage 4: assemble the final report. + +Produces a single JSON object (also the web API payload) and a human-readable +Markdown summary grouped by severity. +""" + +from typing import List, Dict +from datetime import datetime, timezone + + +def build_report(conflicts: List[Dict], sheets: List[Dict], clusters: List[Dict], + source: str = "") -> Dict: + """Assemble the structured report object.""" + by_sev = {"high": 0, "medium": 0, "low": 0} + by_cat: Dict[str, int] = {} + for c in conflicts: + by_sev[c["severity"]] = by_sev.get(c["severity"], 0) + 1 + by_cat[c["category"]] = by_cat.get(c["category"], 0) + 1 + + disciplines = sorted({s["discipline"] for s in sheets if s.get("discipline")}) + return { + "source": source, + "generated_at": datetime.now(timezone.utc).isoformat(), + "summary": { + "sheets_analyzed": len(sheets), + "disciplines": disciplines, + "assertions_extracted": sum(len(s.get("assertions", [])) for s in sheets), + "clusters_checked": len(clusters), + "conflicts_found": len(conflicts), + "by_severity": by_sev, + "by_category": by_cat, + }, + "conflicts": conflicts, + "sheets": [ + { + "page_number": s.get("page_number"), + "sheet_number": s.get("sheet_number"), + "discipline": s.get("discipline"), + "sheet_title": s.get("sheet_title"), + "assertion_count": len(s.get("assertions", [])), + } + for s in sheets + ], + } + + +def to_markdown(report: Dict) -> str: + s = report["summary"] + lines = [ + f"# Conflict Check Report", + "", + f"- Source: `{report.get('source','')}`", + f"- Generated: {report.get('generated_at','')}", + f"- Sheets analyzed: {s['sheets_analyzed']} ({', '.join(s['disciplines']) or 'none'})", + f"- Assertions extracted: {s['assertions_extracted']}", + f"- Clusters checked: {s['clusters_checked']}", + f"- **Conflicts found: {s['conflicts_found']}** " + f"(high {s['by_severity']['high']}, medium {s['by_severity']['medium']}, low {s['by_severity']['low']})", + "", + ] + + if not report["conflicts"]: + lines += ["No cross-discipline conflicts detected.", ""] + return "\n".join(lines) + + for sev in ("high", "medium", "low"): + group = [c for c in report["conflicts"] if c["severity"] == sev] + if not group: + continue + lines += [f"## {sev.capitalize()} severity ({len(group)})", ""] + for i, c in enumerate(group, 1): + lines += [ + f"### {i}. [{c['category']}] {c['location']}", + f"- Disciplines: {', '.join(c.get('disciplines', []))}", + f"- Sheets: {', '.join(c.get('sheets', []))}", + f"- {c['description']}", + ] + for ev in c.get("evidence", []): + lines.append( + f" - {ev.get('discipline','?')} ({ev.get('sheet','?')}): " + f"\"{ev.get('source_text','')}\"" + ) + if c.get("recommended_resolution"): + lines.append(f"- Resolution: {c['recommended_resolution']}") + lines.append(f"- Confidence: {c.get('confidence','')}") + lines.append("") + return "\n".join(lines) diff --git a/backend/pipeline/rfi.py b/backend/pipeline/rfi.py new file mode 100644 index 0000000..0698f7a --- /dev/null +++ b/backend/pipeline/rfi.py @@ -0,0 +1,46 @@ +""" +rfi.py - Stage 11: RFI / QAQC comment generation (LLM, text-only). + +Drafts professional, evidence-based RFI / QAQC comments from the prioritized +issue list. Uses TEXT_MODEL (defaults to MODEL). Returns [] on failure. +""" + +from typing import Dict, List + +from backend import config +from backend.pipeline._serialize import dumps +from backend.pipeline._stage import call_stage, collect_list +from backend.prompts import RFI_SYSTEM_PROMPT, RFI_USER_INSTRUCTION + + +def _valid_rfi(r: Dict) -> Dict: + """Keep an RFI only if it has a question or title; coerce list fields.""" + if not isinstance(r, dict): + return None + if not (r.get("question") or r.get("title")): + return None + return { + "rfi_id": r.get("rfi_id") or "", + "issue_id": r.get("issue_id") or "", + "title": (r.get("title") or "").strip(), + "question": (r.get("question") or "").strip(), + "background": (r.get("background") or "").strip(), + "sheets_referenced": r.get("sheets_referenced") or [], + "disciplines_to_respond": r.get("disciplines_to_respond") or [], + "suggested_response_needed": (r.get("suggested_response_needed") or "").strip(), + "priority": (r.get("priority") or "medium").strip().lower(), + } + + +def generate_rfis(prioritized: List[Dict]) -> List[Dict]: + if not prioritized: + return [] + parsed = call_stage( + RFI_SYSTEM_PROMPT, + RFI_USER_INSTRUCTION, + subs={"prioritized_issues": dumps(prioritized)}, + max_tokens=config.RFI_MAX_TOKENS, + ) + rfis = collect_list(parsed, "rfi_comments", _valid_rfi) + print(f"[RFI] drafted {len(rfis)} RFI/QAQC comment(s)") + return rfis diff --git a/backend/pipeline/risk.py b/backend/pipeline/risk.py new file mode 100644 index 0000000..1a897ee --- /dev/null +++ b/backend/pipeline/risk.py @@ -0,0 +1,63 @@ +""" +risk.py - Stage 10: risk scoring and prioritization (LLM, text-only). + +Scores each validated issue 1-100, annotates it with risk_score, +recommended_priority and risk_drivers, and returns the list sorted +highest-risk first. Uses TEXT_MODEL (defaults to MODEL). On failure it falls +back to a deterministic severity-based ordering so the pipeline still produces +a prioritized list. +""" + +from typing import Dict, List + +from backend import config +from backend.pipeline._serialize import dumps +from backend.pipeline._stage import call_stage +from backend.prompts import RISK_SYSTEM_PROMPT, RISK_USER_INSTRUCTION + +_SEV_RANK = {"critical": 90, "high": 70, "medium": 40, "low": 15} + + +def _ensure_ids(issues: List[Dict]) -> None: + for i, issue in enumerate(issues, 1): + if not issue.get("issue_id"): + issue["issue_id"] = f"ISSUE-{i:03d}" + + +def score_and_prioritize(validated: List[Dict]) -> List[Dict]: + if not validated: + return [] + _ensure_ids(validated) + + parsed = call_stage( + RISK_SYSTEM_PROMPT, + RISK_USER_INSTRUCTION, + subs={"validated_issues": dumps(validated)}, + max_tokens=config.RISK_MAX_TOKENS, + ) + + if isinstance(parsed, list): + rows = parsed + elif isinstance(parsed, dict): + rows = parsed.get("prioritized_issues") or [] + else: + rows = [] + scores: Dict[str, Dict] = {} + for p in rows: + if isinstance(p, dict) and p.get("issue_id"): + scores[p["issue_id"]] = p + + for issue in validated: + p = scores.get(issue["issue_id"]) + if p and isinstance(p.get("overall_risk_score"), (int, float)): + issue["risk_score"] = int(p["overall_risk_score"]) + issue["recommended_priority"] = p.get("recommended_priority") + issue["risk_drivers"] = p.get("risk_drivers") or [] + else: + # Deterministic fallback from severity. + issue["risk_score"] = _SEV_RANK.get(issue.get("severity"), 40) + + validated.sort(key=lambda i: i.get("risk_score", 0), reverse=True) + print(f"[Risk] scored {len(validated)} issue(s)" + f" ({len(scores)} from model, rest by severity)") + return validated diff --git a/backend/pipeline/runner.py b/backend/pipeline/runner.py new file mode 100644 index 0000000..ae8035e --- /dev/null +++ b/backend/pipeline/runner.py @@ -0,0 +1,185 @@ +""" +runner.py - End-to-end pipeline orchestration (full senior-architect QAQC). + +Single entry point shared by the CLI and the web API so both run identical +logic. Optionally dumps intermediate artifacts for debugging/tuning. + +Stage map (display label -> prompt stage): + images -> Stage 0 (pdf_processor) + extract -> Stage 2 (extractor, LLM) + sheet index -> Stage 1 (sheet_index, LLM) + jurisdiction -> Stage 0 (jurisdiction, LLM; runs after we have cover data) + normalize -> Stage 3 (normalizer, LLM) + cluster -> Stage 4 (clusterer, deterministic) + conflicts -> Stage 5 (conflict_checker, LLM) + qaqc -> Stage 6 (qaqc_review, LLM) + code -> Stage 7 (code_review, LLM + retrieval) + constructab. -> Stage 8 (constructability, LLM) + validate -> Stage 9 (validator, LLM) + risk -> Stage 10 (risk, LLM text-only) + rfis -> Stage 11 (rfi, LLM text-only) + report -> Stage 12 (report, deterministic) +""" + +import os +import json +from typing import Dict, Optional, Callable + +from backend.pipeline.pdf_processor import convert_pdf_to_images +from backend.pipeline.extractor import extract_assertions +from backend.pipeline.sheet_index import classify_sheets, derive_project_meta_from_cover +from backend.pipeline.jurisdiction import run_jurisdiction +from backend.pipeline.normalizer import normalize_assertions, build_project_intelligence +from backend.pipeline.clusterer import cluster_by_location +from backend.pipeline.llm_clusterer import cluster_by_location_llm +from backend import config +from backend.pipeline.conflict_checker import check_conflicts +from backend.pipeline.qaqc_review import senior_review +from backend.pipeline.code_review import code_review +from backend.pipeline.constructability import constructability_review +from backend.pipeline.validator import dedup_validate +from backend.pipeline.risk import score_and_prioritize +from backend.pipeline.rfi import generate_rfis +from backend.pipeline.report import build_report, to_markdown +from backend.pipeline._stage import validate_issue +from backend.llm import reset_cost, get_cost, set_stage, set_text_backend + + +def run_pipeline( + pdf_path: str, + out_dir: Optional[str] = None, + on_stage: Optional[Callable[[str], None]] = None, + project_input: Optional[Dict] = None, + source_name: Optional[str] = None, + text_local: bool = False, +) -> Dict: + """ + Run the full QAQC pipeline on one PDF and return the report dict. + + project_input: optional intake fields (project_name, address, occupancy, + work_type). Cover-sheet-derived values fill any gaps; intake fields win. + + If out_dir is given, writes conflicts.json, report.md, and the intermediate + artifacts (assertions.json, clusters.json, and one json per QAQC stage). + """ + def stage(name: str): + print(f"\n=== {name} ===") + set_stage(name) + if on_stage: + on_stage(name) + + reset_cost() + set_text_backend(text_local) + + stage("PDF -> images") + pages = convert_pdf_to_images(pdf_path) + + stage("Extract assertions") + sheets = extract_assertions(pages) + + stage("Classify sheet index") + sheet_index = classify_sheets(sheets) + + stage("Jurisdiction profile") + cover_meta = derive_project_meta_from_cover(sheets, source_name or os.path.basename(pdf_path)) + merged_input = {**cover_meta, **(project_input or {})} + jurisdiction = run_jurisdiction(merged_input) + + stage("Normalize assertions") + sheets = normalize_assertions(sheets) + + stage("Build project intelligence (GOIDs + relationships)") + project_intel = build_project_intelligence(sheets) + + stage(f"Cluster by location ({config.CLUSTERER})") + if config.CLUSTERER == "llm": + clusters = cluster_by_location_llm(sheets) + if not clusters: # LLM failed -> fall back, don't lose the run + print("[Cluster] LLM clustering empty; falling back to deterministic") + clusters = cluster_by_location(sheets) + else: + clusters = cluster_by_location(sheets) + + stage("Reason over clusters (conflicts)") + conflicts = check_conflicts(clusters, pages) + + stage("Full-set QAQC review") + qaqc_issues = senior_review(sheets, clusters, conflicts, sheet_index) + + stage("Code / ADA review") + code_issues = code_review(jurisdiction, sheets, sheet_index) + + stage("Constructability review") + construct_issues = constructability_review(sheets, clusters, conflicts) + + stage("Validate & deduplicate") + conflict_issues = [v for v in (validate_issue(c, "conflict") for c in conflicts) if v] + all_issues = conflict_issues + qaqc_issues + code_issues + construct_issues + validated = dedup_validate(all_issues) + + stage("Risk scoring & prioritization") + prioritized = score_and_prioritize(validated) + + stage("RFI / QAQC comments") + rfis = generate_rfis(prioritized) + + stage("Build report") + report = build_report(conflicts, sheets, clusters, source=os.path.basename(pdf_path)) + # Extend the deterministic report with the new QAQC stage outputs. + report["project_input"] = merged_input + report["jurisdiction"] = jurisdiction + report["sheet_index"] = sheet_index + report["project_intelligence"] = project_intel + report["validated_issues"] = prioritized + report["rfis"] = rfis + report["summary"]["by_stage"] = { + "conflicts": len(conflicts), + "qaqc": len(qaqc_issues), + "code": len(code_issues), + "constructability": len(construct_issues), + "validated": len(validated), + "rfis": len(rfis), + } + cost = get_cost() + report["summary"]["cost_usd"] = round(cost["usd"], 4) + report["summary"]["llm_calls"] = cost["calls"] + report["summary"]["cached_calls"] = cost.get("cached", 0) + report["summary"]["cost_by_stage"] = cost.get("by_stage", {}) + report["summary"]["text_backend"] = "local" if text_local else "openrouter" + report["summary"]["models_used"] = cost.get("models", {}) + print(f"[Runner] LLM cost: ${cost['usd']:.4f} over {cost['calls']} live calls" + f" ({cost.get('cached', 0)} cached)") + + if out_dir: + os.makedirs(out_dir, exist_ok=True) + _dump(out_dir, "assertions.json", sheets) + _dump(out_dir, "clusters.json", [_cluster_slim(c) for c in clusters]) + _dump(out_dir, "sheet_index.json", sheet_index) + _dump(out_dir, "jurisdiction.json", jurisdiction) + _dump(out_dir, "project_intelligence.json", project_intel) + _dump(out_dir, "qaqc_issues.json", qaqc_issues) + _dump(out_dir, "code_issues.json", code_issues) + _dump(out_dir, "constructability.json", construct_issues) + _dump(out_dir, "validated_issues.json", prioritized) + _dump(out_dir, "rfis.json", rfis) + _dump(out_dir, "conflicts.json", report) + with open(os.path.join(out_dir, "report.md"), "w") as f: + f.write(to_markdown(report)) + print(f"\n[Runner] Wrote artifacts to {out_dir}") + + return report + + +def _cluster_slim(c: Dict) -> Dict: + """Clusters without base64 noise, for artifact dumps.""" + return {k: v for k, v in c.items() if k != "assertions"} | { + "assertions": [ + {kk: vv for kk, vv in a.items() if kk != "base64"} + for a in c.get("assertions", []) + ] + } + + +def _dump(out_dir: str, name: str, obj) -> None: + with open(os.path.join(out_dir, name), "w") as f: + json.dump(obj, f, indent=2) diff --git a/backend/pipeline/sheet_index.py b/backend/pipeline/sheet_index.py new file mode 100644 index 0000000..e51a8bf --- /dev/null +++ b/backend/pipeline/sheet_index.py @@ -0,0 +1,117 @@ +""" +sheet_index.py - Stage 1: sheet index and drawing classification (LLM). + +Classifies the set's sheets (discipline, drawing type, level, QAQC relevance) +and flags missing expected sheets, reusing the title-block data the extractor +already produced -- no extra image calls. Also exposes a cheap, no-LLM helper +that scrapes best-effort project metadata off the cover sheet so Stage 0 +(jurisdiction) has something to work with when the intake form is blank. +""" + +import json +import re +from typing import Dict, List, Optional + +from backend import config +from backend.pipeline._stage import call_stage +from backend.prompts import SHEET_INDEX_SYSTEM_PROMPT, SHEET_INDEX_USER_INSTRUCTION + + +def _index_input(sheets: List[Dict]) -> List[Dict]: + """Compact per-sheet records for the classification call.""" + return [ + { + "sheet_id": s.get("sheet_number") or f"page-{s.get('page_number')}", + "sheet_number": s.get("sheet_number"), + "sheet_title": s.get("sheet_title"), + "discipline": s.get("discipline"), + "level": s.get("level"), + "page_number": s.get("page_number"), + } + for s in sheets + ] + + +def classify_sheets(sheets: List[Dict]) -> Dict: + """Return the classified sheet index, or {} on failure.""" + parsed = call_stage( + SHEET_INDEX_SYSTEM_PROMPT, + SHEET_INDEX_USER_INSTRUCTION, + subs={"sheet_index_input": json.dumps(_index_input(sheets), ensure_ascii=True)}, + max_tokens=config.SHEET_INDEX_MAX_TOKENS, + ) + if isinstance(parsed, dict): + return parsed + if isinstance(parsed, list): + # Model returned a bare array of sheet entries -> wrap it. + return {"sheet_index": parsed, "missing_expected_sheets": []} + return {} + + +# --- cover-sheet metadata (no LLM) ----------------------------------------- + +_ADDR_RE = re.compile(r"\d{1,6}\s+\w[\w .]*\b(?:st|street|ave|avenue|rd|road|blvd|" + r"boulevard|dr|drive|ln|lane|way|hwy|highway|ct|court)\b", + re.IGNORECASE) + + +def _is_cover(sheet: Dict) -> bool: + title = (sheet.get("sheet_title") or "").lower() + num = (sheet.get("sheet_number") or "").upper() + return ("cover" in title or "title sheet" in title + or num in ("G000", "G-000", "G0.0", "T0.0", "G001", "G-001") + or sheet.get("page_number") == 1) + + +# Words that, alone, never make up a real project name (so a title built only +# from these is "generic" and should not be used as the project name). +_GENERIC_WORDS = {"cover", "sheet", "title", "index", "general", "notes", + "drawing", "drawings", "of", "the", "and"} +_FILE_NOISE_RE = re.compile( + r"(?i)(?:\d{2,3}%|\breview set\b|\bpermit set\b|\bbid set\b|" + r"\bconstruction set\b|\bdrawings?\b|\bset\b|\bissued for \w+\b|" + r"\bifc\b|\bifp\b)") +_TMP_PREFIX_RE = re.compile(r"^tmp\w+?_") +_DATE_RE = re.compile(r"\b\d{6,8}\b") + + +def _is_generic_title(title: str) -> bool: + t = re.sub(r"[^a-z ]", "", (title or "").lower()).strip() + return (not t) or all(w in _GENERIC_WORDS for w in t.split()) + + +def _name_from_filename(source_name: Optional[str]) -> Optional[str]: + """'tmpXXXX_20260618_Verizon Elyson_100% Review Set.pdf' -> 'Verizon Elyson'.""" + if not source_name: + return None + stem = re.sub(r"\.pdf$", "", source_name, flags=re.IGNORECASE) + stem = _TMP_PREFIX_RE.sub("", stem) + stem = stem.replace("_", " ") # spaces first so dates get boundaries + stem = _DATE_RE.sub(" ", stem) + stem = _FILE_NOISE_RE.sub(" ", stem) + stem = re.sub(r"\s+", " ", stem).strip(" -") + return stem or None + + +def derive_project_meta_from_cover(sheets: List[Dict], + source_name: Optional[str] = None) -> Dict: + """Best-effort {project_name, address} from cover-sheet assertions + filename.""" + meta: Dict[str, str] = {} + covers = [s for s in sheets if _is_cover(s)] or sheets[:1] + for s in covers: + for a in s.get("assertions", []): + text = (a.get("source_text") or a.get("value") or "").strip() + if text and "address" not in meta: + m = _ADDR_RE.search(text) + if m: + meta["address"] = m.group(0).strip() + # Use the cover title as the name only if it isn't a generic label. + title = (s.get("sheet_title") or "").strip() + if "project_name" not in meta and title and not _is_generic_title(title): + meta["project_name"] = title + # Filename is the most reliable name for retail/prototype sets. + if "project_name" not in meta: + fn = _name_from_filename(source_name) + if fn: + meta["project_name"] = fn + return meta diff --git a/backend/pipeline/validator.py b/backend/pipeline/validator.py new file mode 100644 index 0000000..5c59d7b --- /dev/null +++ b/backend/pipeline/validator.py @@ -0,0 +1,36 @@ +""" +validator.py - Stage 9: issue deduplication and validation (LLM). + +Consolidates findings from Stages 5-8 (conflicts, full-set QAQC, code, and +constructability) into one clean, deduplicated canonical-issue list, dropping +unsupported or vague items. On failure it returns the input unchanged so no +findings are lost. +""" + +from typing import Dict, List + +from backend import config +from backend.pipeline._serialize import dumps +from backend.pipeline._stage import call_stage, collect_list, validate_issue +from backend.prompts import ( + DEDUP_VALIDATE_SYSTEM_PROMPT, + DEDUP_VALIDATE_USER_INSTRUCTION, +) + + +def dedup_validate(all_issues: List[Dict]) -> List[Dict]: + if not all_issues: + return [] + parsed = call_stage( + DEDUP_VALIDATE_SYSTEM_PROMPT, + DEDUP_VALIDATE_USER_INSTRUCTION, + subs={"issues": dumps(all_issues)}, + max_tokens=config.VALIDATE_MAX_TOKENS, + ) + validated = collect_list(parsed, "issues", validate_issue) + if not validated: + # Model failed or returned nothing usable -- keep the raw findings. + print(f"[Validate] dedup produced no list; keeping {len(all_issues)} raw issue(s)") + return all_issues + print(f"[Validate] {len(all_issues)} raw -> {len(validated)} consolidated issue(s)") + return validated diff --git a/backend/prompts.py b/backend/prompts.py new file mode 100644 index 0000000..f4f5c5d --- /dev/null +++ b/backend/prompts.py @@ -0,0 +1,690 @@ +""" +IronBid QAQC Module - Senior Architect Drawing Review Pipeline. + +This module holds the prompts for reviewing a full construction drawing set +from the perspective of a Senior Architect performing QAQC before bid, permit, +or construction. Each prompt has exactly one job. + +Full design pipeline (aspirational): + Stage 0 - Project intake and jurisdiction engine + Stage 1 - Sheet index and drawing classification + Stage 2 - Per-sheet assertion extraction + Stage 3 - Assertion normalization + Stage 4 - Location / element clustering + Stage 5 - Cross-discipline conflict reasoning + Stage 6 - Senior architect full-set QAQC review + Stage 7 - Code / ADA / TDLR / Municode review + Stage 8 - Constructability review + Stage 9 - Issue deduplication and validation + Stage 10 - Risk scoring and prioritization + Stage 11 - RFI / QAQC comment generation + Stage 12 - Final QAQC report generation + +WIRED INTO THE RUNNING PIPELINE TODAY (see backend/pipeline/): + extractor.py -> EXTRACTOR_SYSTEM_PROMPT, EXTRACTOR_USER_INSTRUCTION, + DISCIPLINE_PREFIXES + clusterer.py -> deterministic, no LLM + conflict_checker -> CONFLICT_SYSTEM_PROMPT, CONFLICT_USER_INSTRUCTION, + CONFLICT_CATEGORIES + +The other stage prompts (jurisdiction, sheet index, normalization, cluster, +senior QAQC, risk, RFI, report) are NOT yet called by any code. They are kept +here as ready-to-wire constants. NOTE: if you later feed any *_USER_INSTRUCTION +through code, substitute placeholders with str.replace(), NOT str.format() -- +these strings contain literal JSON braces that would break .format(). +""" + +# --------------------------------------------------------------------------- +# Shared reference data +# --------------------------------------------------------------------------- + +# Sheet-number letter prefix -> discipline. Used by extractor.py for a +# deterministic discipline guess (longest prefix wins). +DISCIPLINE_PREFIXES = { + "Architectural": ["A", "AD", "AE", "AI", "AS"], + "Structural": ["S", "SD", "SF", "SS"], + "Mechanical": ["M", "MP", "MH", "HVAC", "H"], + "Plumbing": ["P", "PL", "PP"], + "Electrical": ["E", "ED", "EL", "EP", "ES"], + "Fire Protection": ["FP", "F"], + "Fire Alarm": ["FA"], + "Civil": ["C", "CV", "CG", "CU", "CD"], + "Landscape": ["L", "LA", "LP", "LI"], + "Low Voltage": ["T", "TC", "TD", "LV", "TV", "SC"], + "Life Safety": ["LS", "CS"], + "General": ["G", "GN", "TS"], +} + +# Controlled attribute vocabulary the extractor should prefer. +ATTRIBUTE_VOCAB = [ + "grid_spacing", "overall_dim", "room_dimension", "finish_floor_elev", + "ceiling_height_AFF", "roof_elev", "datum_elev", "door_location", + "door_count", "window_location", "window_count", "wall_location", + "wall_rating", "wall_type", "column_location", "beam_size", + "beam_location", "slab_edge", "slab_opening", "equipment_location", + "equipment_elev", "penetration", "chase_shaft", "room_name", + "room_number", "fixture_count", "fixture_location", "keynote_assertion", + "general_note", "detail_callout", "schedule_entry", +] + +# Allowed conflict categories. conflict_checker._valid_conflict checks against +# this list; anything not here is kept but tagged "uncategorized". +CONFLICT_CATEGORIES = [ + "dimensional_disagreement", + "elevation_disagreement", + "location_mismatch", + "missing_element", + "schedule_vs_plan_mismatch", + "detail_vs_plan_mismatch", + "tag_or_reference_inconsistency", + "spatial_clash", + "note_or_spec_contradiction", + "demolition_new_work_conflict", + "clearance_conflict", + "penetration_conflict", +] + + +def _prefix_lines() -> str: + """Render DISCIPLINE_PREFIXES as an aligned 'PREFIXES -> Discipline' block.""" + lines = [] + for disc, prefixes in DISCIPLINE_PREFIXES.items(): + joined = ", ".join(prefixes) + lines.append(f" {joined:<28}-> {disc}") + return "\n".join(lines) + + +# --------------------------------------------------------------------------- +# Stage 0 - project intake and jurisdiction engine (NOT WIRED YET) +# --------------------------------------------------------------------------- + +JURISDICTION_SYSTEM_PROMPT = """You are a Senior Architect setting up the project jurisdiction and code profile before a drawing QAQC review. +Your job is to determine which code-review paths should apply based on project location, project type, work type, occupancy, and jurisdiction. +You are NOT determining final code compliance. You are NOT issuing a legal code opinion. You are NOT guessing adopted codes. You are identifying the authorities, likely adopted codes, local amendments, state accessibility rules, and missing information needed before code review. +Review for: +- City jurisdiction +- County jurisdiction +- State requirements +- Authority Having Jurisdiction +- Fire Marshal +- Building department +- Health department if applicable +- Airport authority if applicable +- Healthcare authority if applicable +- School authority if applicable +- IBC / IEBC +- IFC +- IPC +- IMC +- NEC +- IECC +- ADA +- State accessibility standards +- Texas TAS / TDLR if Texas +- Municode local amendments +- Owner standards +Rules: +- If jurisdiction is incomplete, flag missing_information. +- If adopted codes are not provided or verified, mark human_confirmation_required true. +- If project is in Texas, activate TAS / TDLR review path. +- If project involves food service, activate health department review path. +- If project involves healthcare, activate healthcare regulatory review path. +- If project is airport-related, activate airport authority / owner standards review path. +- Do not invent code section numbers. +- Do not state that something violates code at this stage. +Respond only with valid JSON.""" + +JURISDICTION_USER_INSTRUCTION = """Create the project jurisdiction and code profile. +Respond ONLY with a valid JSON object - no markdown fences, no explanation: +{ "project_code_profile": { "project_name": "string or null", "project_address": "string or null", +"jurisdiction": { "city": "string or null", "county": "string or null", "state": "string or null", +"country": "string or null", "authority_having_jurisdiction": ["string"], "fire_marshal": "string or null", "building_department": "string or null", "accessibility_reviewer": "string or null" }, +"project_classification": { "project_type": "string or null", "work_type": "new_building | remodel | tenant_improvement | addition | change_of_use | existing_building | unknown", +"occupancy": "string or null", "construction_type": "string or null", "sprinklered": "true | false | unknown", "public_project": "true | false | unknown", "healthcare_project": "true | false | unknown", "food_service_project": "true | false | unknown", "airport_project": "true | false | unknown", "school_project": "true | false | unknown" }, +"adopted_codes": { "building_code": "string or null", "existing_building_code": "string or null", "fire_code": "string or null", "mechanical_code": "string or null", "plumbing_code": "string or null", "electrical_code": "string or null", "energy_code": "string or null", "accessibility_code": "string or null" }, +"review_paths": { "ibc_review": true, "iebc_review": false, "fire_code_review": true, "ada_review": true, "tas_tdlr_review": false, "municode_review": true, "health_department_review": false, "owner_standard_review": false }, +"local_amendment_sources": [ { "source_name": "Municode", "jurisdiction": "string", "source_url": "string or null", "status": "provided | needs_lookup | not_applicable" } ], +"missing_information": ["string"], "assumptions": ["string"], "human_confirmation_required": true } } +Project input: {project_input}""" + + +# --------------------------------------------------------------------------- +# Stage 1 - sheet index and drawing classification (NOT WIRED YET) +# --------------------------------------------------------------------------- + +SHEET_INDEX_SYSTEM_PROMPT = """You are a Senior Architect reviewing the sheet index of a construction drawing set. +Your job is to identify, classify, and organize every sheet in the drawing set before detailed QAQC begins. +You are NOT finding conflicts yet. You are NOT extracting every drawing fact yet. You are classifying sheets by discipline, drawing type, level, and QAQC relevance. +Rules: +- Use sheet number and sheet title verbatim. +- Determine discipline from the sheet-number prefix when possible. +- If the prefix is ambiguous, use the sheet title. +- If still ambiguous, set discipline to unknown. +- Identify missing expected sheets when the drawing set appears incomplete. +- Do not assume a sheet exists if it is not listed. +- Use plain ASCII only. +Common disciplines: +- Architectural +- Architectural Demo +- Interiors +- Civil +- Landscape +- Structural +- Mechanical +- Plumbing +- Electrical +- Fire Protection +- Fire Alarm +- Technology / Low Voltage +- Security +- Food Service +- Equipment +- Specialty +- Specifications +- Unknown +Common drawing types: +- cover +- sheet_index +- code_life_safety +- site_plan +- civil_utility +- grading +- floor_plan +- demo_plan +- reflected_ceiling_plan +- roof_plan +- enlarged_plan +- interior_elevation +- building_elevation +- section +- detail +- schedule +- structural_plan +- mep_plan +- riser_diagram +- one_line +- notes +- specifications +Respond only with valid JSON.""" + +SHEET_INDEX_USER_INSTRUCTION = """Classify the drawing set sheet index. +Respond ONLY with valid JSON: +{ "sheet_index": [ { "sheet_id": "string", "sheet_number": "string or null", "sheet_title": "string or null", "discipline": "string or null", "drawing_type": "string or null", "level": "string or null", "page_number": "integer or null", "qaqc_relevance": "high | medium | low", "code_review_relevance": "high | medium | low | none", "confidence": "high | medium | low" } ], +"missing_expected_sheets": [ { "expected_sheet_type": "string", "reason": "string", "confidence": "high | medium | low" } ] } +Sheet index / extracted title block data: {sheet_index_input}""" + + +# --------------------------------------------------------------------------- +# Stage 2 - per-sheet construction object extraction (WIRED: extractor.py) +# --------------------------------------------------------------------------- + +_EXTRACTOR_SYSTEM_TEMPLATE = """You are a Senior Architect and multidisciplinary construction document reviewer. +You are reviewing ONE drawing sheet from a construction drawing set. +Your job is to convert this sheet into structured construction objects that can later be compared against other sheets, schedules, specifications, codes, ADA/TAS requirements, local amendments, and owner standards. +You are NOT finding conflicts yet. You are NOT estimating. You are NOT performing final code review. You are NOT guessing design intent. +Rules you must never break: +- Extract only what is visible or written on THIS sheet. +- Do not infer from other sheets. +- Do not complete missing information. +- Do not assume typical dimensions, typical code requirements, or typical assemblies. +- Every object must include source_text copied verbatim from the sheet whenever text is available. +- If the object is graphical and has no text, describe it visually and mark confidence low or medium. +- Preserve tags, marks, room numbers, sheet numbers, detail references, and abbreviations exactly as shown. +- Use null when information is not determinable. +- Keep objects atomic. +- Use plain ASCII only. +- Escape literal quotes inside JSON strings. +SHEET NUMBER PREFIX -> DISCIPLINE: +{prefix_table} +Object categories to extract (use object_type exactly as listed): +room, door, window, wall, wall_type, finish, ceiling, dimension, grid, +elevation_marker, section_marker, detail_marker, callout, keynote, +general_note, equipment, plumbing_fixture, mechanical_equipment, air_device, +electrical_device, lighting_fixture, panel, fire_alarm_device, +fire_protection_element, structural_element, civil_element, +accessibility_clearance, roof_element, stair, ramp, elevator, casework, +specialty_equipment, schedule_reference, symbol, abbreviation +Extract all objects relevant to: +- Architectural QAQC: rooms, walls, doors, windows, finishes, ceiling heights, stairs, ramps, + elevators, casework, dimensions, grids, elevation/section/detail markers, keynotes, notes +- MEP coordination: mechanical equipment (AHU/RTU/FCU/fans/diffusers/grilles/ducts/dampers), + plumbing fixtures (sinks/toilets/urinals/lavatories/floor drains/cleanouts/water heaters/piping), + electrical (panels/transformers/disconnects/receptacles/lighting/exit signs/emergency lights) +- Structural coordination: columns, beams, joists, footings, slabs, slab edges/openings, + embeds, anchor bolts, base plates, CMU/concrete walls, reinforcing notes, roof framing +- Civil coordination: property lines, easements, utilities, manholes, fire hydrants, fire lanes, + accessible routes, curb ramps, parking, grading, spot elevations, finished floor elevations +- Schedule rows: door/window/room finish/wall type/hardware/equipment/lighting/MEP schedules +- Code, ADA/TAS: accessibility clearances, ramp slopes, door widths, maneuvering clearances, + rated walls, smoke partitions, fire barriers, chases, shafts +For each object: +- Identify the object type from the list above. +- Identify the tag/mark if shown. +- Identify the location using grid, room, level, plan zone, detail reference. +- Identify attributes as a key-value dict (e.g. width, height, rating, size, type, finish). +- Include verbatim source text or a visual description for graphical objects. +- List which downstream reviews should use this object. +Confidence: high = clearly labeled/scheduled; medium = visible but partially unclear; low = graphical, obscured, or uncertain. +Stage 2 does NOT say "this is wrong" or "this conflicts." Stage 2 only records: this object exists, this tag exists, this dimension is shown. +Respond only with valid JSON.""" + +EXTRACTOR_SYSTEM_PROMPT = ( + _EXTRACTOR_SYSTEM_TEMPLATE + .replace("{prefix_table}", _prefix_lines()) +) + +EXTRACTOR_USER_INSTRUCTION = """Analyze this drawing sheet and extract structured construction objects. +Respond ONLY with a valid JSON object - no markdown fences, no explanation: +{ "sheet": { "sheet_number": "string or null", "sheet_title": "string or null", "discipline": "string or null", "drawing_type": "string or null", "level": "string or null", "scale": "string or null" }, "objects": [ { "object_id": "string", "object_type": "room | door | window | wall | wall_type | finish | ceiling | dimension | grid | elevation_marker | section_marker | detail_marker | callout | keynote | general_note | equipment | plumbing_fixture | mechanical_equipment | air_device | electrical_device | lighting_fixture | panel | fire_alarm_device | fire_protection_element | structural_element | civil_element | accessibility_clearance | roof_element | stair | ramp | elevator | casework | specialty_equipment | schedule_reference | symbol | abbreviation", "category": "architectural | civil | structural | mechanical | electrical | plumbing | fire_protection | fire_alarm | technology | specialty | code | accessibility | general", "tag": "string or null", "name": "string or null", "description": "string or null", "attributes": { "attribute_name": "attribute_value" }, "location_key": { "sheet_number": "string or null", "level": "string or null", "room_number": "string or null", "room_name": "string or null", "grid": "string or null", "plan_zone": "string or null", "tag": "string or null", "detail_reference": "string or null", "elevation_reference": "string or null" }, "source_text": "verbatim text from sheet or null", "graphical_basis": "short visual description if object is graphical or null", "review_uses": [ "schedule_comparison", "plan_elevation_comparison", "cross_discipline_coordination", "code_review", "ada_tas_review", "constructability_review", "rfi_generation" ], "confidence": "high | medium | low" } ], "unresolved_items": [ { "item_id": "string", "item_type": "unreadable_text | unclear_tag | ambiguous_symbol | partial_dimension | unresolved_reference | unclear_object", "location_key": {}, "source_text": "string or null", "reason": "string", "confidence": "low" } ] } +If the sheet has no extractable objects, return an empty objects array. +Optional sheet hint: {sheet_hint}""" + + +# --------------------------------------------------------------------------- +# Stage 3a - assertion normalization (WIRED: normalizer.py) +# --------------------------------------------------------------------------- + +NORMALIZATION_SYSTEM_PROMPT = """You are a Senior Architect organizing extracted construction objects for comparison. +Your job is to normalize object values and tags without changing their meaning. +You are NOT finding conflicts. You are NOT correcting the drawings. You are NOT inferring missing data. +Rules: +- Preserve original source_text exactly. +- Preserve original value exactly. +- Add normalized values only when safe. +- Normalize units only when the conversion is obvious. +- Normalize tag variants: "RTU-1", "RTU 1", "RTU1" -> normalized_tag "RTU-1". +- Normalize room identifiers: "RM 101", "Room 101", "Rm. 101" -> normalized_room "101". +- Do not normalize ambiguous dimensions or uncertain identifiers. +- Do not assume level, grid, or room if missing. +- Do not merge unrelated items. +- Use plain ASCII only. +Examples: +- 9'-0" may normalize to 108 inches. +- 24 FT may normalize to 24'-0". +- 3'-0" x 7'-0" may normalize to width 36 inches and height 84 inches. +- Room 101 and RM 101 may be treated as same room only if context supports it. +- RTU-1 and RTU 1 may be treated as same tag only if context supports it. +Respond only with valid JSON.""" + +NORMALIZATION_USER_INSTRUCTION = """Normalize these extracted construction objects. +Respond ONLY with valid JSON: +{ "normalized_assertions": [ { "assertion_id": "string", "original_value": "string", "normalized_value": "string or null", "normalized_unit": "string or null", "normalized_attribute": "string or null", "normalized_tag": "string or null", "normalized_room": "string or null", "normalization_notes": "string or null", "source_text_preserved": true, "normalization_confidence": "high | medium | low" } ] } +Assertions: {assertions}""" + + +# --------------------------------------------------------------------------- +# Stage 3b - project intelligence model (GOIDs + relationships) (WIRED: normalizer.py) +# --------------------------------------------------------------------------- + +PROJECT_INTELLIGENCE_SYSTEM_PROMPT = """You are the ConflictChecker Project Intelligence Engine. +Your job is to organize, normalize, merge, and relate all construction objects previously extracted from the drawing set. +The input is a set of construction objects extracted from one or more sheets, all of the same object_type. +Your responsibility is to determine which objects represent the same physical element and build relationships between them. +Examples: +- Door on floor plan + Door in door schedule + Door in elevation = One Project Object with GOID ARCH-DOOR-000001. +- Room on architectural plan + Room finish schedule + Lighting layout + Mechanical diffusers = One Room Object. +- Wall tag + Wall type schedule + Wall section + Rated wall legend = One Wall Object. +Never determine whether something is correct or incorrect. +Never report conflicts. +Never perform code review. +Only build the project intelligence model. +Rules: +- Preserve original extracted values. +- Create normalized values (normalized_name, normalized_tag). +- Assign one Global Object ID (GOID) to every distinct physical object using the format: + ARCH-ROOM-000001, ARCH-DOOR-000145, ARCH-WALL-000092, ARCH-WINDOW-000044, + ARCH-CEIL-000020, ARCH-FINISH-000118, MECH-RTU-000003, MECH-DUCT-000552, + PLBG-FIX-000082, ELEC-LTG-000271, ELEC-PNL-000014, STR-COL-000045, + STR-BEAM-000091, CIV-UTIL-000034, FP-SPR-000223, FA-DEV-000044. +- Record aliases (all tag/name variants seen in the drawing set for this object). +- Link related objects via the relationships array. +- Preserve source_sheets and source_object_ids. +- Never merge objects unless evidence strongly supports they are the same physical element. +- When uncertain, create separate objects and flag in unresolved_relationships. +- Use plain ASCII only. +Respond only with valid JSON.""" + +PROJECT_INTELLIGENCE_USER_INSTRUCTION = """Build the project intelligence model for these {object_type} objects. +Normalize and merge objects that represent the same physical element. Assign GOIDs. +Respond ONLY with valid JSON: +{ "project_objects": [ { "goid": "string", "object_type": "string", "discipline": "string", "normalized_name": "string or null", "normalized_tag": "string or null", "aliases": ["string"], "relationships": [ { "relationship": "located_in_room | hosted_by_wall | scheduled_in | shown_on_elevation | shown_on_section | served_by | connects_to | supports | penetrates | adjacent_to", "target_goid": "string or null", "target_description": "string or null" } ], "locations": { "level": "string or null", "room": "string or null", "grid": "string or null" }, "source_object_ids": ["string"], "source_sheets": ["string"], "confidence": "high | medium | low" } ], "unresolved_relationships": [ { "object_id": "string", "reason": "string", "confidence": "low" } ] } +Objects ({object_type}): {objects}""" + + +# --------------------------------------------------------------------------- +# Stage 4 - location and element clustering (NOT WIRED -- clusterer.py is deterministic) +# --------------------------------------------------------------------------- + +CLUSTER_SYSTEM_PROMPT = """You are a Senior Architect grouping drawing assertions into coordination clusters. +Your job is to group assertions that appear to refer to the same real-world room, door, wall, grid, ceiling, equipment tag, fixture, utility, opening, detail, or system. +You are NOT finding conflicts yet. You are NOT deciding code compliance. You are NOT rewriting facts. You are organizing the data so another reviewer can compare it. +Rules: +- Cluster by exact room number, room name, level, grid, equipment tag, door number, wall type, detail reference, or utility tag when available. +- Do not force unrelated facts into a cluster. +- Use null when location data is missing. +- If two items may be related but evidence is weak, create separate clusters and mark possible_relationship. +- Identify disciplines_present. +- Identify disciplines_expected only when reasonable for the cluster type. +- Preserve all assertion IDs. +- Use plain ASCII only. +Examples: +- Door 124A on plan and Door 124A in door schedule should be clustered. +- Room 124 on architectural, mechanical, electrical, and plumbing sheets should be clustered. +- RTU-1 on mechanical roof plan, structural roof framing, and electrical power plan should be clustered. +- Floor drain FD-1 should be clustered with plumbing, architectural floor plan, slab slope, and structural slab information where available. +Respond only with valid JSON.""" + +CLUSTER_USER_INSTRUCTION = """Cluster the normalized assertions. +Respond ONLY with valid JSON: +{ "clusters": [ { "cluster_id": "string", "cluster_type": "room | door | wall | equipment | structural_grid | opening | ceiling | finish | utility | fixture | code_item | detail | general", "primary_location_key": { "room": "string or null", "room_name": "string or null", "level": "string or null", "grid": "string or null", "tag": "string or null", "detail_reference": "string or null", "plan_zone": "string or null" }, "disciplines_present": ["string"], "disciplines_expected": ["string"], "assertion_ids": ["string"], "possible_relationships": [ { "related_cluster_or_assertion_id": "string", "reason": "string", "confidence": "high | medium | low" } ], "review_focus": [ "coordination", "constructability", "code", "ada", "owner_standard" ], "confidence": "high | medium | low" } ] } +Normalized assertions: {normalized_assertions}""" + + +# --------------------------------------------------------------------------- +# Stage 5 - cross-discipline conflict reasoning (WIRED: conflict_checker.py) +# --------------------------------------------------------------------------- + +CONFLICT_SYSTEM_PROMPT = """You are a Senior Architect and construction-drawing coordination reviewer doing a back-check of a drawing set BEFORE it is issued for bid, permit, or construction. +You are given clustered facts that multiple disciplines have asserted about the same location or element. +Decide whether these disciplines GENUINELY CONTRADICT each other - the kind of issue a human coordinator would issue as a QAQC comment or RFI before the set goes out. +You are NOT performing code review in this stage. You are NOT checking ADA in this stage. You are NOT estimating cost or scope. You are NOT rewriting the drawings. +What IS a conflict: +- Two disciplines state different values for the same physical quantity at the same place. +- An element is shown in different locations by different disciplines. +- A schedule disagrees with what is drawn on the plan. +- A detail disagrees with the plan. +- A keynote disagrees with a schedule, plan, or detail. +- An element required by one discipline has no counterpart where another discipline should show it. +- A duct, pipe, conduit, or piece of equipment conflicts with structure, ceiling height, rated wall, or required clearance. +- Equipment shown by one discipline lacks required power, plumbing, ventilation, access, or support in another discipline. +- Demolition drawings remove something that new work drawings keep without explanation. +- A callout, keynote, or tag references something that does not exist. +- The same room, door, equipment, wall, or utility is labeled inconsistently across sheets. +What is NOT a conflict: +- Two disciplines describing different, compatible aspects of the same place. +- A value shown on one discipline and simply not repeated on another, unless that discipline is expected to show it. +- Rounding or representation differences that resolve to the same real value. +- A possible code issue. +- A design preference. +- A cost concern. +- Anything not supported with drawing evidence. +Be conservative: +- Only flag genuine disagreements. +- A clean cluster with no contradiction must return an empty conflicts array. +- missing_element requires evidence that another discipline would reasonably be expected to show the missing item. +For each conflict: +- Classify it using exactly one conflict category. +- Assign severity. +- Quote source_text from each side as evidence. +- Assign confidence. +- Write a short senior architect explanation in the description. +- Recommend the next step. +Conflict categories: +- dimensional_disagreement +- elevation_disagreement +- location_mismatch +- missing_element +- schedule_vs_plan_mismatch +- detail_vs_plan_mismatch +- tag_or_reference_inconsistency +- spatial_clash +- note_or_spec_contradiction +- demolition_new_work_conflict +- clearance_conflict +- penetration_conflict +Severity (use exactly one of high, medium, low): +- high = life-safety, accessibility, structural, permit-critical, or major constructability / rework impact +- medium = real coordination issue needing clarification +- low = minor inconsistency or clarification item +Respond only with valid JSON.""" + +CONFLICT_USER_INSTRUCTION = """Review these clustered assertions for genuine cross-discipline conflicts. +Respond ONLY with a valid JSON object - no markdown fences, no explanation: +{ "conflicts": [ { "conflict_id": "string", "category": "dimensional_disagreement | elevation_disagreement | location_mismatch | missing_element | schedule_vs_plan_mismatch | detail_vs_plan_mismatch | tag_or_reference_inconsistency | spatial_clash | note_or_spec_contradiction | demolition_new_work_conflict | clearance_conflict | penetration_conflict", "severity": "high | medium | low", "confidence": "high | medium | low", "location": "human-readable location string, e.g. 'Room 124 / Grid B-3 / Level 1'", "disciplines": ["string"], "sheets": ["string"], "description": "senior architect explanation of the contradiction and why it matters", "evidence": [ { "discipline": "string", "sheet": "string", "source_text": "verbatim source text", "asserted_value": "string" } ], "recommended_resolution": "coordinate drawings | issue RFI | verify with architect | verify with engineer | verify in field | owner decision required" } ] } +If no genuine conflicts exist, return: { "conflicts": [] } +Location: {location} +Clustered assertions (evidence): +{evidence}""" + + +# --------------------------------------------------------------------------- +# Stage 6 - senior architect full-set QAQC review (NOT WIRED YET) +# --------------------------------------------------------------------------- + +SENIOR_QAQC_SYSTEM_PROMPT = """You are a Senior Architect performing a full-set QAQC review before drawings are issued for bid, permit, or construction. +You are reviewing the full drawing set for completeness, coordination, clarity, constructability, permit readiness, and bid readiness. +You are given: +- Sheet index +- Extracted assertions +- Normalized assertions +- Clusters +- Cross-discipline conflicts +- Sheet images where available +Your job is to identify drawing-set QAQC issues beyond direct conflicts. +You are NOT estimating. You are NOT performing final legal code review. You are NOT inventing missing requirements. You are NOT making design decisions. +Review for: +- Missing sheets +- Missing schedules +- Missing details +- Missing enlarged plans +- Missing wall types +- Missing partition legends +- Missing door/window schedule data +- Missing finish schedule information +- Missing ceiling heights +- Missing life-safety plans +- Missing accessibility information +Use plain ASCII only. +Respond only with valid JSON.""" + +# Canonical issue schema shared by Stages 6, 7, 8, 9. Validated by +# _stage.validate_issue. Each finding-producing stage emits this shape under +# the top-level "issues" key. +SENIOR_QAQC_USER_INSTRUCTION = """Review the full drawing set and report QAQC issues beyond the direct cross-discipline conflicts already found. +Respond ONLY with a valid JSON object - no markdown fences, no explanation: +{ "issues": [ { "issue_id": "string", "source_stage": "qaqc", "category": "missing_sheet | missing_schedule | missing_detail | missing_information | incomplete_dimension | coordination_gap | clarity | bid_readiness | permit_readiness | other", "severity": "critical | high | medium | low", "confidence": "high | medium | low", "location": "human-readable location or sheet, e.g. 'A-101 / Room 124'", "disciplines": ["string"], "sheets": ["string"], "description": "senior architect explanation of the issue and why it matters", "evidence": [ { "discipline": "string", "sheet": "string", "source_text": "verbatim text if available", "asserted_value": "string" } ], "recommended_resolution": "string", "code_reference": null } ] } +If the set has no QAQC issues beyond the conflicts already found, return: { "issues": [] } +Sheet index: {sheet_index} +Extracted assertions: {assertions} +Clusters: {clusters} +Cross-discipline conflicts already found: {conflicts}""" + + +# --------------------------------------------------------------------------- +# Stage 7 - code / ADA / TDLR / Municode review (WIRED: code_review.py) +# --------------------------------------------------------------------------- + +CODE_REVIEW_SYSTEM_PROMPT = """You are a Senior Architect and accessibility/code reviewer checking a construction drawing set against the applicable building, fire, accessibility, and energy codes for the project jurisdiction. +You are given the project code profile (jurisdiction and active review paths), the extracted drawing assertions, the sheet index, relevant sheet images, and EXCERPTS of the applicable code/standard text retrieved for this project. +Your job is to flag likely code, ADA, and state-accessibility (e.g. Texas TAS / TDLR) issues that a reviewer should resolve before permit or construction. +Rules you must never break: +- Base every finding on the drawing evidence AND, where a specific requirement applies, the retrieved code text provided to you. +- Cite the specific code/standard section ONLY when it appears in the retrieved code excerpts. Put it in code_reference. +- NEVER invent, guess, or paraphrase a code section number that is not in the retrieved excerpts. If no excerpt supports a number, set code_reference to null and describe the concern in plain language. +- Do not issue a final legal code opinion; flag issues for human confirmation. +- Honor the active review_paths in the project profile (skip paths that are off). +- Only flag issues supported by drawing evidence. +- Use plain ASCII only. +Focus on: +- accessible routes, clearances, maneuvering space, reach ranges +- accessible restrooms, fixtures, grab bars, mounting heights +- door clear width, maneuvering clearance, hardware +- ramps, slopes, landings, handrails, guardrails +- stairs, egress width, exit count, travel distance, common path +- occupancy load, fire separation, rated assemblies +- mounting heights and signage where accessibility-relevant +- energy code envelope/equipment items only when clearly shown +Respond only with valid JSON.""" + +CODE_REVIEW_USER_INSTRUCTION = """Review this drawing evidence against the retrieved code/standard excerpts for the active review paths. +Respond ONLY with a valid JSON object - no markdown fences, no explanation: +{ "issues": [ { "issue_id": "string", "source_stage": "code", "category": "ada | tas_tdlr | egress | fire_separation | occupancy | energy | building_code | other", "severity": "critical | high | medium | low", "confidence": "high | medium | low", "location": "human-readable location or sheet", "disciplines": ["string"], "sheets": ["string"], "description": "the potential code/accessibility issue and why it matters", "evidence": [ { "discipline": "string", "sheet": "string", "source_text": "verbatim drawing text", "asserted_value": "string" } ], "recommended_resolution": "string", "code_reference": "exact section from the retrieved excerpts, or null" } ] } +If no supported code issues are found, return: { "issues": [] } +Project code profile: {jurisdiction} +Sheet index: {sheet_index} +Extracted assertions: {assertions} +Retrieved code / standard excerpts: {code_references}""" + + +# --------------------------------------------------------------------------- +# Stage 8 - constructability review (WIRED: constructability.py) +# --------------------------------------------------------------------------- + +CONSTRUCTABILITY_SYSTEM_PROMPT = """You are a Senior Architect and construction-phase reviewer back-checking a drawing set for constructability before it goes out for bid. +Your job is to flag things that are drawn but would be difficult, impossible, ambiguous, or costly to actually build as shown. +You are NOT estimating cost. You are NOT redesigning. You are NOT performing code review. You are flagging buildability and sequencing risks supported by drawing evidence. +Flag: +- access and clearance problems (equipment that cannot be installed, removed, or serviced in the space shown) +- sequencing conflicts (an element that cannot be installed in a feasible order) +- missing or impossible support, blocking, or anchorage +- tolerances or fits that cannot be achieved as drawn +- routing conflicts for duct, pipe, conduit through limited plenum or structure +- waterproofing, flashing, or transition details that are incomplete or unbuildable +- dimensions that do not close or that conflict with field conditions +- details that reference conditions not present elsewhere in the set +Rules: +- Only flag issues supported by drawing evidence. +- Be specific about the location and why it is a constructability risk. +- Use plain ASCII only. +Respond only with valid JSON.""" + +CONSTRUCTABILITY_USER_INSTRUCTION = """Review this drawing evidence for constructability and sequencing risks. +Respond ONLY with a valid JSON object - no markdown fences, no explanation: +{ "issues": [ { "issue_id": "string", "source_stage": "constructability", "category": "access_clearance | sequencing | support_anchorage | routing | tolerance_fit | waterproofing | dimension_closure | detail_gap | other", "severity": "critical | high | medium | low", "confidence": "high | medium | low", "location": "human-readable location or sheet", "disciplines": ["string"], "sheets": ["string"], "description": "the constructability risk and why it matters", "evidence": [ { "discipline": "string", "sheet": "string", "source_text": "verbatim drawing text", "asserted_value": "string" } ], "recommended_resolution": "string", "code_reference": null } ] } +If no constructability issues are found, return: { "issues": [] } +Extracted assertions: {assertions} +Clusters: {clusters} +Cross-discipline conflicts already found: {conflicts}""" + + +# --------------------------------------------------------------------------- +# Stage 9 - issue deduplication and validation (WIRED: validator.py) +# --------------------------------------------------------------------------- + +DEDUP_VALIDATE_SYSTEM_PROMPT = """You are a Senior Architect consolidating QAQC findings from several review passes (cross-discipline conflicts, full-set QAQC, code/accessibility, and constructability) into one clean, deduplicated issue list. +Your job: +- Merge findings that describe the same underlying issue at the same location into a single issue, keeping the highest severity and combining the evidence. +- Drop findings that are not supported by any drawing evidence or retrieved code reference. +- Drop pure restatements and vague items with no actionable content. +- Preserve source_stage provenance; when merging, keep the most specific source and note the others in the description. +- Do not invent new issues. Do not change evidence text. +- Do not escalate severity beyond what the evidence supports. +- Use plain ASCII only. +Respond only with valid JSON.""" + +DEDUP_VALIDATE_USER_INSTRUCTION = """Consolidate and validate these QAQC findings into one deduplicated issue list. +Respond ONLY with a valid JSON object - no markdown fences, no explanation: +{ "issues": [ { "issue_id": "string", "source_stage": "conflict | qaqc | code | constructability", "category": "string", "severity": "critical | high | medium | low", "confidence": "high | medium | low", "location": "human-readable location or sheet", "disciplines": ["string"], "sheets": ["string"], "description": "the consolidated issue", "evidence": [ { "discipline": "string", "sheet": "string", "source_text": "verbatim text", "asserted_value": "string" } ], "recommended_resolution": "string", "code_reference": "string or null" } ] } +If there are no valid issues, return: { "issues": [] } +All findings to consolidate: {issues}""" + + +# --------------------------------------------------------------------------- +# Stage 10 - risk scoring and prioritization (NOT WIRED YET) +# --------------------------------------------------------------------------- + +RISK_SYSTEM_PROMPT = """You are a Senior Architect prioritizing QAQC issues before a drawing set is issued. +You are given validated QAQC issues. +Your job is to score each issue based on project risk. +Consider: +- Life safety +- Accessibility +- Permit risk +- Structural impact +- MEP coordination +- Constructability +- Cost exposure +- Schedule impact +- Bid ambiguity +- Owner decision impact +- Change order risk +- Likelihood of RFI +- Likelihood of field rework +Rules: +- Do not change the evidence. +- Do not create new issues. +- Prioritize based on impact, not quantity of text. +- Critical issues should require immediate attention. +- Low issues should be clarification or tracking items. +- Use plain ASCII only. +Respond only with valid JSON.""" + +RISK_USER_INSTRUCTION = """Score and prioritize the validated QAQC issues. +Respond ONLY with valid JSON: +{ "prioritized_issues": [ { "issue_id": "string", "overall_risk_score": "integer from 1 to 100", "severity": "critical | high | medium | low", "risk_drivers": [ "life_safety", "accessibility", "permit_risk", "structural", "mep_coordination", "constructability", "cost_exposure", "schedule_impact", "bid_ambiguity", "owner_decision", "change_order_risk" ], "recommended_priority": "immediate | before_bid | before_permit | before_construction | track_only", "senior_architect_summary": "string" } ] } +Inputs: {validated_issues}""" + + +# --------------------------------------------------------------------------- +# Stage 11 - RFI / QAQC comment generation (NOT WIRED YET) +# --------------------------------------------------------------------------- + +RFI_SYSTEM_PROMPT = """You are a Senior Architect drafting professional QAQC comments and RFIs from validated drawing issues. +Your job is to write clear, neutral, evidence-based comments suitable for the design team. +Do not accuse. Do not exaggerate. Do not state legal conclusions. Do not say something violates code unless the issue was classified as confirmed_code_issue. Do not include unsupported assumptions. +Each comment should: +- Identify the location. +- Identify the sheets involved. +- State the issue clearly. +- Reference evidence. +- Ask for a specific clarification or correction. +- Identify impacted disciplines. +- Be suitable for sending to the architect, engineer, consultant, or owner. +Tone: +- Professional +- Direct +- Neutral +- Construction-document focused +Respond only with valid JSON.""" + +RFI_USER_INSTRUCTION = """Draft QAQC comments / RFIs for these prioritized issues. +Respond ONLY with valid JSON: +{ "rfi_comments": [ { "rfi_id": "string", "issue_id": "string", "title": "string", "question": "string", "background": "string", "sheets_referenced": ["string"], "disciplines_to_respond": ["string"], "suggested_response_needed": "string", "priority": "high | medium | low" } ] } +Inputs: {prioritized_issues}""" + + +# --------------------------------------------------------------------------- +# Stage 12 - final QAQC report generation (NOT WIRED YET) +# --------------------------------------------------------------------------- + +REPORT_SYSTEM_PROMPT = """You are a Senior Architect preparing a final QAQC report for a construction drawing review. +Your job is to summarize validated issues in a professional report format. +The report should be useful to: +- Owner +- Architect +- Engineers +- General Contractor +- Estimator +- Project Manager +Rules: +- Do not introduce new findings. +- Use only validated issues. +- Keep tone professional and neutral. +- Separate confirmed issues from possible issues. +- Separate code risks from drawing coordination conflicts. +- Include high-risk items first. +- Include evidence references. +- Use plain ASCII only. +Respond only with valid JSON.""" + +REPORT_USER_INSTRUCTION = """Generate the final QAQC report. +Respond ONLY with valid JSON: +{ "qaqc_report": { "executive_summary": "string", "drawing_set_reviewed": { "project_name": "string or null", "drawing_date": "string or null", "sheets_reviewed_count": "integer or null" }, "issue_summary": { "critical_count": "integer", "high_count": "integer", "medium_count": "integer", "low_count": "integer" }, "sections": { "high_risk_issues": [], "code_ada_jurisdiction_risks": [], "cross_discipline_conflicts": [], "missing_information": [], "constructability_issues": [], "recommended_rfis": [], "discipline_responsibility_matrix": [] }, "appendix": { "evidence_by_sheet": [] } } } +Inputs: {final_report_context}""" + + +# --------------------------------------------------------------------------- +# Core QAQC rule for every stage +# --------------------------------------------------------------------------- + +CORE_QAQC_RULE = """No issue should be reported unless it is supported by: +1. drawing evidence, +2. code/reference evidence, or +3. a clearly identified missing-information condition. +Every issue must answer: +- What is the issue? +- Where is it? +- Which sheets support it? +- Which disciplines are involved? +- Why does it matter? +- What should be clarified or corrected?""" diff --git a/backend/prompts.py.v1 b/backend/prompts.py.v1 new file mode 100644 index 0000000..19f4be6 --- /dev/null +++ b/backend/prompts.py.v1 @@ -0,0 +1,183 @@ +""" +prompts.py - THE TUNING SURFACE. + +Everything that shapes detection quality lives here: the two system prompts, +the controlled vocabularies, the conflict taxonomy, and the JSON-schema +instructions. Iterate here first; the pipeline code rarely needs to change. + +Two LLM stages: + Stage 1 (extractor) : one vision call per sheet -> grounded assertions. + Stage 3 (conflict_checker) : one reasoning call per co-located cluster -> conflicts. +""" + +# =========================================================================== +# Controlled vocabularies +# =========================================================================== + +# Discipline routing by sheet-number prefix. Reused from IronBid's +# sheet_analyzer; edit if a firm uses different prefixes. +DISCIPLINE_PREFIXES = { + "Architectural": ["A", "AD", "AE", "AI", "AS"], + "Structural": ["S", "SD", "SF", "SS"], + "Mechanical": ["M", "MP", "MH", "HVAC", "H"], + "Plumbing": ["P", "PL", "PP"], + "Electrical": ["E", "ED", "EL", "EP", "ES"], + "Fire Protection": ["FP", "F"], + "Fire Alarm": ["FA"], + "Civil": ["C", "CV", "CG", "CU", "CD"], + "Landscape": ["L", "LA", "LP", "LI"], + "Low Voltage": ["T", "TC", "TD", "LV", "TV", "SC"], + "Life Safety": ["LS", "CS"], + "General": ["G", "GN", "TS"], +} + +# Preferred attribute names so Stage 2 can line facts up across disciplines. +# Free-text attributes are allowed when none of these fit. +ATTRIBUTE_VOCAB = [ + "grid_spacing", "overall_dim", "room_dimension", + "finish_floor_elev", "ceiling_height_AFF", "roof_elev", "datum_elev", + "door_location", "door_count", "window_location", "window_count", + "wall_location", "wall_rating", "wall_type", + "column_location", "beam_size", "beam_location", "slab_edge", "slab_opening", + "equipment_location", "equipment_elev", "penetration", "chase_shaft", + "room_name", "room_number", "fixture_count", "fixture_location", + "keynote_assertion", "general_note", "detail_callout", "schedule_entry", +] + +# The ONLY categories Stage 3 may emit. Keep in sync with the prompt below. +CONFLICT_CATEGORIES = [ + "dimensional_disagreement", + "elevation_disagreement", + "location_mismatch", + "missing_element", + "schedule_vs_plan_mismatch", + "tag_or_reference_inconsistency", + "spatial_clash", + "note_or_spec_contradiction", +] + + +def _prefix_lines() -> str: + return "\n".join( + f" {', '.join(prefixes):<28} -> {disc}" + for disc, prefixes in DISCIPLINE_PREFIXES.items() + ) + + +# =========================================================================== +# Stage 1 - per-sheet assertion extraction +# =========================================================================== + +EXTRACTOR_SYSTEM_PROMPT = f"""You are a senior architectural/MEP coordination reviewer reading a SINGLE sheet from a construction drawing set produced in Revit or AutoCAD. + +Your ONLY job on this sheet is to extract discrete, checkable FACTS that another discipline might contradict - the raw material for a cross-discipline coordination review. You are NOT estimating cost or scope. + +Rules you must never break: +- Identify the discipline from the sheet-number prefix in the title block (usually bottom-right). If the prefix is ambiguous, use the sheet title. +- Extract only what is actually drawn or written on THIS sheet. Never infer a value from another sheet, never guess, never "complete" a partial dimension. +- Every assertion MUST include source_text copied VERBATIM from the sheet (the dimension string, schedule cell, keynote, callout, or label). If you cannot quote it verbatim, do not emit the assertion. +- Tag every assertion with a location_key (grid, room, level, and/or equipment tag) so it can be matched to other disciplines. Use the sheet's grid bubbles and room numbers EXACTLY as shown. If a field is not determinable, set it to null - but still record the value. +- Prefer the controlled attribute vocabulary; use a short free-text attribute only when none fits. +- Use plain ASCII only. Escape any literal quotes inside JSON strings. + +SHEET NUMBER PREFIX -> DISCIPLINE: +{_prefix_lines()} + +Focus on the facts disciplines most often disagree on: +- column-grid spacing and overall building dimensions +- finish-floor, roof, and datum elevations +- ceiling heights (RCP) vs equipment / duct / pipe elevations +- door, window, wall, and column locations; rated-wall locations +- slab edges, openings, penetrations, chases and shafts +- schedule counts and types (doors, windows, fixtures, equipment) +- equipment locations and tags (RTU, AHU, panels, fixtures) +- any general note or keynote that asserts a coordination-relevant fact""" + + +# Appended to the user message after the image. {sheet_hint} is optional context. +EXTRACTOR_USER_INSTRUCTION = """Analyze this drawing sheet and extract every checkable coordination fact. + +Respond ONLY with a valid JSON object - no markdown fences, no explanation: +{{ + "sheet_number": "string or null (verbatim from title block, e.g. A2.1)", + "discipline": "one of the disciplines listed in the system prompt", + "sheet_title": "string or null (verbatim)", + "level": "string or null (e.g. 'Level 2', 'Roof', 'Site')", + "scale": "string or null (verbatim, e.g. 1/8\\"=1'-0\\")", + "assertions": [ + {{ + "subject": "the thing the fact is about (e.g. 'Room 204 ceiling', 'Grid A-B', 'RTU-1')", + "attribute": "controlled-vocab name or short free text", + "value": "the value as a clean string (e.g. \\"9'-0\\\\\\"\\", \\"24'-0\\\\\\"\\", \\"12\\")", + "location_key": {{"grid": "string or null", "room": "string or null", "level": "string or null", "tag": "string or null"}}, + "source_text": "VERBATIM text copied from the sheet that states this fact", + "confidence": "high | medium | low" + }} + ] +}} + +If the sheet has no coordination-relevant facts (e.g. a cover sheet), return an empty assertions array. +{sheet_hint}""" + + +# =========================================================================== +# Stage 3 - cross-discipline conflict reasoning (THE MAKE-OR-BREAK PROMPT) +# =========================================================================== + +CONFLICT_SYSTEM_PROMPT = """You are a construction-drawing coordination reviewer doing a back-check of a drawing set BEFORE it is issued for bid. You are given facts that multiple disciplines (Architectural, Structural, Mechanical, Electrical, Plumbing, Fire Protection, etc.) have each asserted about the SAME location or element, plus the relevant sheet images. + +Decide whether these disciplines GENUINELY CONTRADICT each other - the kind of issue a human coordinator would issue as a coordination comment or RFI before the set goes out. + +What IS a conflict: +- Two disciplines state different values for the same physical quantity at the same place (a dimension, a grid spacing, an elevation, a ceiling height, a count). +- An element is shown in different locations by different disciplines. +- An element required by one discipline has no counterpart where another discipline should show it. +- A schedule disagrees with what is drawn on the plan. +- A physical interference: a duct, pipe, or piece of equipment routed through a structural member or a rated wall, or equipment that does not fit the space shown. +- A callout, keynote, or tag that references something that does not exist, or that is labeled inconsistently across sheets. + +What is NOT a conflict (do not flag these): +- Two disciplines describing DIFFERENT, compatible aspects of the same place. +- A value shown on one discipline and simply not repeated on another. Silence is not contradiction. +- Rounding or representation differences that resolve to the same real value (e.g. 9'-0" vs 108", or 24'-0" vs 24 FT). +- Anything you cannot support with verbatim evidence from at least TWO different disciplines (the only exception is missing_element, where the evidence is one discipline's element plus the documented absence in the discipline that should mirror it). + +Be conservative: only flag genuine disagreements. A clean cluster with no contradiction must return an empty conflicts array. + +For each real conflict: +- Classify it using EXACTLY ONE category from: dimensional_disagreement, elevation_disagreement, location_mismatch, missing_element, schedule_vs_plan_mismatch, tag_or_reference_inconsistency, spatial_clash, note_or_spec_contradiction. +- Assign severity: high = constructability / life-safety / structural impact; medium = real rework risk; low = needs clarification. +- Quote the conflicting source_text from EACH side as evidence. +- Assign your own confidence (high/medium/low) in the finding. + +Use plain ASCII only. Escape any literal quotes inside JSON strings.""" + + +# Appended to the user message after the cluster's images. +CONFLICT_USER_INSTRUCTION = """These assertions all refer to the same location/element ({location}). Each line shows which discipline asserted it, the sheet, and the verbatim source text. + +{evidence} + +Decide whether any GENUINE cross-discipline contradiction exists here. + +Respond ONLY with valid JSON - no markdown fences, no explanation: +{{ + "conflicts": [ + {{ + "category": "one of the allowed categories", + "severity": "high | medium | low", + "disciplines": ["Discipline A", "Discipline B"], + "location": "human-readable location (e.g. 'Room 204 / Level 2')", + "sheets": ["A2.1", "M2.1"], + "description": "one or two sentences naming the contradiction concretely", + "evidence": [ + {{"discipline": "Discipline A", "sheet": "A2.1", "source_text": "verbatim"}}, + {{"discipline": "Discipline B", "sheet": "M2.1", "source_text": "verbatim"}} + ], + "recommended_resolution": "what the design team should coordinate or resolve", + "confidence": "high | medium | low" + }} + ] +}} + +If there is no genuine contradiction, return {{"conflicts": []}}.""" diff --git a/cli/run_check.py b/cli/run_check.py new file mode 100644 index 0000000..8bd7644 --- /dev/null +++ b/cli/run_check.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python3 +""" +run_check.py - CLI entry point for the conflict checker (the tuning loop). + +Usage: + python cli/run_check.py path/to/set.pdf [--out out_dir] + +Run from the project root so `backend` is importable. +""" + +import os +import sys +import argparse + +# Make the project root importable when run as a script. +_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +if _ROOT not in sys.path: + sys.path.insert(0, _ROOT) + +from backend.pipeline.runner import run_pipeline # noqa: E402 + + +def main() -> int: + parser = argparse.ArgumentParser(description="Cross-discipline drawing conflict checker") + parser.add_argument("pdf", help="Path to the PDF drawing set") + parser.add_argument("--out", default=None, + help="Directory for artifacts (default: out/)") + parser.add_argument("--project-name", default=None) + parser.add_argument("--address", default=None) + parser.add_argument("--occupancy", default=None) + parser.add_argument("--work-type", default=None, + help="new_building | remodel | tenant_improvement | addition | ...") + args = parser.parse_args() + + if not os.path.isfile(args.pdf): + print(f"Error: file not found: {args.pdf}") + return 1 + + project_input = { + k: v for k, v in { + "project_name": args.project_name, "address": args.address, + "occupancy": args.occupancy, "work_type": args.work_type, + }.items() if v + } + out_dir = args.out or os.path.join("out", os.path.splitext(os.path.basename(args.pdf))[0]) + report = run_pipeline(args.pdf, out_dir=out_dir, project_input=project_input or None) + + s = report["summary"] + print("\n" + "=" * 60) + print(f" Conflicts found: {s['conflicts_found']} " + f"(high {s['by_severity']['high']}, " + f"medium {s['by_severity']['medium']}, " + f"low {s['by_severity']['low']})") + print(f" Report: {os.path.join(out_dir, 'report.md')}") + print("=" * 60) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..87249bf --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,300 @@ + + + + + +Conflict Checker + + + +
+

Conflict Checker

+
Cross-discipline design contradiction review for construction drawing sets
+
+
+
+ +
Drop a PDF drawing set here, or click to choose
+
+ + + + +
+
+
+
+
+ + + + + + +
+
sheet
+
+ + + diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..56d0a38 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,9 @@ +fastapi==0.115.0 +uvicorn[standard]==0.30.6 +python-multipart==0.0.12 +pdf2image==1.17.0 +Pillow==10.4.0 +openai==1.51.0 +httpx==0.27.2 # openai 1.51 passes proxies= to httpx; >=0.28 dropped it +python-dotenv==1.0.1 +# System dependency (not pip): poppler-utils -> sudo apt install poppler-utils diff --git a/samples/.gitkeep b/samples/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/scripts/setup_vllm.sh b/scripts/setup_vllm.sh new file mode 100644 index 0000000..a26fa11 --- /dev/null +++ b/scripts/setup_vllm.sh @@ -0,0 +1,153 @@ +#!/usr/bin/env bash +# ============================================================================= +# setup_vllm.sh — Install & run vLLM on Ubuntu 26 for ConflictChecker hybrid mode +# +# Target box: 2x RTX 3080 (12GB each, 24GB total, Ampere sm_86, NO NVLink). +# Serves an OpenAI-compatible endpoint for the TEXT stages; ConflictChecker +# points LOCAL_BASE_URL at it. Vision stays on OpenRouter. +# +# Usage: +# chmod +x setup_vllm.sh +# ./setup_vllm.sh install # one-time: drivers (if needed), uv, venv, vllm +# ./setup_vllm.sh serve # launch the server (foreground) +# ./setup_vllm.sh service # install + start a systemd service (persistent) +# ./setup_vllm.sh test # smoke-test the running endpoint +# +# Tested against vLLM v0.23 on 2x3080. Fixes baked in: +# - no --disable-log-requests (removed in newer vLLM) +# - NCCL_P2P_DISABLE=1 (3080s have no working GPU P2P) +# - --disable-custom-all-reduce (same reason; silences the P2P warning) +# - VLLM_USE_FLASHINFER_SAMPLER=0 (FlashInfer JIT sampler crashes w/o CUDA toolkit) +# - ENFORCE_EAGER=1 default (less VRAM + faster startup on the tight 24GB) +# ============================================================================= +set -euo pipefail + +# ---- Config (override via env) ---------------------------------------------- +VENV_DIR="${VENV_DIR:-$HOME/vllm-env}" +PY_VERSION="${PY_VERSION:-3.12}" # vLLM-supported Python +MODEL="${MODEL:-Qwen/Qwen3-14B-AWQ}" # 14B-AWQ ~9GB; fits 24GB w/ TP2 +TP_SIZE="${TP_SIZE:-2}" # 2 = shard across both 3080s +MAX_LEN="${MAX_LEN:-32768}" # context cap (KV-cache bound) +PORT="${PORT:-8000}" +HOST="${HOST:-0.0.0.0}" # 0.0.0.0 so the app host can reach it +GPU_UTIL="${GPU_UTIL:-0.90}" # fraction of VRAM vLLM may use +QUANT="${QUANT:-awq_marlin}" # AWQ Int4 (Ampere has no FP8) +DTYPE="${DTYPE:-float16}" # Ampere: fp16 +ENFORCE_EAGER="${ENFORCE_EAGER:-1}" # 1 = skip CUDA-graph capture +# Accuracy alternative (both cards): MODEL=Qwen/Qwen3-32B-AWQ MAX_LEN=16384 ./setup_vllm.sh serve +# Simplicity alternative (one card): CUDA_VISIBLE_DEVICES=0 TP_SIZE=1 MAX_LEN=8192 ./setup_vllm.sh serve +# If it OOMs: MAX_LEN=16384 (or 8192) and/or GPU_UTIL=0.85 +# ----------------------------------------------------------------------------- + +log(){ printf '\n\033[1;36m== %s ==\033[0m\n' "$*"; } + +# Env that makes vLLM behave on no-NVLink Ampere + no CUDA toolkit. +export_runtime_env() { + export NCCL_P2P_DISABLE="${NCCL_P2P_DISABLE:-1}" + export NCCL_SHM_DISABLE="${NCCL_SHM_DISABLE:-0}" + export VLLM_USE_FLASHINFER_SAMPLER="${VLLM_USE_FLASHINFER_SAMPLER:-0}" +} + +install_system() { + log "System packages" + sudo apt-get update -y + sudo apt-get install -y build-essential git curl ca-certificates + + log "NVIDIA driver" + if command -v nvidia-smi >/dev/null 2>&1 && nvidia-smi >/dev/null 2>&1; then + nvidia-smi --query-gpu=name,memory.total,driver_version --format=csv + else + echo "Installing recommended NVIDIA driver (reboot required afterwards)..." + sudo apt-get install -y ubuntu-drivers-common + sudo ubuntu-drivers autoinstall + echo "!! Reboot now, then re-run: ./setup_vllm.sh install" + exit 0 + fi +} + +install_uv() { + if ! command -v uv >/dev/null 2>&1; then + log "Installing uv (Python/venv manager)" + curl -LsSf https://astral.sh/uv/install.sh | sh + export PATH="$HOME/.local/bin:$PATH" + fi +} + +install_vllm() { + log "Creating venv ($VENV_DIR, Python $PY_VERSION)" + uv venv "$VENV_DIR" --python "$PY_VERSION" + log "Installing vLLM (pulls matching CUDA torch wheels)" + uv pip install --python "$VENV_DIR/bin/python" --upgrade pip + uv pip install --python "$VENV_DIR/bin/python" vllm + "$VENV_DIR/bin/python" -c "import vllm, torch; print('vLLM', vllm.__version__, '| CUDA avail', torch.cuda.is_available(), torch.version.cuda)" +} + +build_args() { + ARGS=( serve "$MODEL" + --host "$HOST" --port "$PORT" + --tensor-parallel-size "$TP_SIZE" + --quantization "$QUANT" + --dtype "$DTYPE" + --max-model-len "$MAX_LEN" + --gpu-memory-utilization "$GPU_UTIL" + --served-model-name "$MODEL" ) + [ "$TP_SIZE" -gt 1 ] && ARGS+=(--disable-custom-all-reduce) + [ "$ENFORCE_EAGER" = "1" ] && ARGS+=(--enforce-eager) +} + +serve() { + export_runtime_env + build_args + log "Serving $MODEL (TP=$TP_SIZE, max_len=$MAX_LEN, eager=$ENFORCE_EAGER, port=$PORT)" + exec "$VENV_DIR/bin/vllm" "${ARGS[@]}" +} + +install_service() { + export_runtime_env + build_args + log "Installing systemd service (vllm.service)" + # Render the resolved arg list into the unit. + local exec_args=""; for a in "${ARGS[@]}"; do exec_args+=" $a"; done + sudo tee /etc/systemd/system/vllm.service >/dev/null <