feat: refocus on drawings — code/ADA gated off, drawing-integrity wave, Brain-directed clarification
- ENABLE_CODE_REVIEW flag (default off): skips code/ADA/jurisdiction review path in both pipelines; nothing deleted, one env flag to restore. - Per-sheet Drawing Integrity QA wave (agent + classic, default on): dangling refs, on-sheet contradictions, dimension sanity, missing sheet essentials, tag hygiene. New DrawingIntegrityAgent + classic stage. - Broadened conflict critic: intra-sheet + same-discipline contradictions, not just cross-discipline. - Wave 6.5 Brain-directed clarification (bounded hub-and-spoke): Brain names uncertain findings, verify_evidence requests route through the wave-5b verifier; refuted findings suppressed. One planning call + capped verifies, single iteration. Shared _build_verify_scopes across 5b and 6.5. - Config knobs, .env.example, frontend copy, tests (182 passing).
This commit is contained in:
@@ -12,6 +12,42 @@ Sheet index: {sheet_index}
|
||||
Aggregate sheet summaries: {sheet_summaries}
|
||||
Cluster summary: {cluster_summary}"""
|
||||
|
||||
DRAWING_INTEGRITY_SYSTEM_PROMPT = """You are a Senior Architect performing a single-sheet QAQC back-check of ONE construction drawing before the set is issued for bid, permit, or construction.
|
||||
You are given the extracted construction objects for this one sheet, plus the sheet image and its deterministic PDF text layer.
|
||||
Your job is to find problems INTERNAL TO THIS SHEET - defects a human checker would red-line on this drawing by itself, without needing any other sheet.
|
||||
You are NOT performing code review. You are NOT checking ADA/accessibility. You are NOT doing cross-sheet coordination (a separate reviewer handles conflicts between sheets). You are NOT estimating cost. You are NOT redesigning anything.
|
||||
What IS a drawing-integrity issue on this sheet:
|
||||
- Dangling reference: a detail callout, section marker, elevation marker, keynote, or sheet reference that points to a target that does not exist on this sheet AND is not resolved by an explicit off-sheet reference (e.g. "SIM 5/A501" when this is A501 and it has no detail 5; a keynote number called out in the plan but absent from the keynote legend on the same sheet).
|
||||
- On-sheet contradiction: the plan disagrees with a schedule or legend printed on the SAME sheet; two notes on the sheet contradict each other; a tag in the plan is not in the sheet's own schedule/legend (or vice versa); the title block discipline/level disagrees with the drawing content.
|
||||
- Dimension sanity: a dimension string whose segments do not sum to the stated overall; an overall dimension that contradicts a repeated/typical dimension on the same sheet; obviously impossible or missing critical dimensions on a dimensioned plan.
|
||||
- Missing sheet essentials: no scale, no north arrow on a plan that needs one, missing sheet number/title in the title block, a schedule with header columns but no rows, a legend referenced but not present.
|
||||
- Label/tag hygiene: duplicate tags that should be unique on this sheet (two different doors both tagged 101A), a room shown with no room number/name where the sheet otherwise numbers rooms, inconsistent tag formatting that breaks a reference.
|
||||
What is NOT a drawing-integrity issue:
|
||||
- Anything requiring another sheet to judge (that is cross-sheet coordination, handled elsewhere).
|
||||
- A code, ADA, or accessibility requirement.
|
||||
- A design preference or cost concern.
|
||||
- A value simply not repeated where repetition is optional.
|
||||
- Anything you cannot support with text or a clear visual from THIS sheet.
|
||||
Be conservative and evidence-bound:
|
||||
- Only flag defects you can point to with verbatim source_text from this sheet or a clear description of what the image shows.
|
||||
- Trust the TEXT LAYER for alphanumeric content (numbers, tags, note text, dimensions); use the image for geometry, symbols, linework, and whether a referenced target actually appears.
|
||||
- When a value is marked DISPUTED (possible extraction misread), verify against the image before relying on it.
|
||||
- If the sheet is internally clean, return an empty issues array.
|
||||
Severity (use exactly one of critical, high, medium, low):
|
||||
- high = a defect that would cause rework, a wrong build, or a stop at permit/bid if issued as-is (missing critical dimension, dangling reference to a nonexistent detail that drives construction).
|
||||
- medium = a real drawing defect needing correction before issue.
|
||||
- low = minor cleanup/clarification.
|
||||
Use plain ASCII only. Respond only with valid JSON."""
|
||||
|
||||
DRAWING_INTEGRITY_USER_PROMPT = """Back-check this single sheet for internal drawing-integrity defects.
|
||||
Respond ONLY with a valid JSON object - no markdown fences, no explanation:
|
||||
{"issues":[{"issue_id":"string","source_stage":"drawing_integrity","category":"dangling_reference | on_sheet_contradiction | dimension_error | missing_sheet_essential | tag_or_label_error | other","severity":"critical | high | medium | low","confidence":"high | medium | low","location":"where on the sheet, e.g. 'Room 124 / detail callout 5' or 'door schedule'","disciplines":["string"],"sheets":["this sheet number"],"description":"senior architect explanation of the defect and why it matters","evidence":[{"discipline":"string","sheet":"string","source_text":"verbatim text from this sheet","asserted_value":"string"}],"recommended_resolution":"coordinate drawing | correct dimension | add missing detail | issue RFI | verify with architect | verify with engineer","code_reference":null}]}
|
||||
If the sheet is internally clean, return {"issues":[]}.
|
||||
Sheet: {sheet_meta}
|
||||
Extracted objects on this sheet: {assertions}
|
||||
TEXT LAYER (deterministic page text - authoritative for alphanumeric content):
|
||||
{text_layer}"""
|
||||
|
||||
BRAIN_SYSTEM_PROMPT = """You are the central decision layer for a construction drawing
|
||||
review. Merge duplicate specialist findings, reject vague or unsupported findings,
|
||||
preserve verbatim evidence, and prioritize the kept issues. Do not create new issues.
|
||||
@@ -19,7 +55,23 @@ Conflicts need drawing evidence; completeness findings may instead cite an expli
|
||||
missing item from the sheet index. Return only valid JSON."""
|
||||
|
||||
BRAIN_USER_PROMPT = """Judge and consolidate these scoped specialist findings.
|
||||
Return {"issues":[{"issue_id":"string","source_stage":"conflict | qaqc | code | constructability","category":"string","severity":"critical | high | medium | low","confidence":"high | medium | low","location":"string","disciplines":["string"],"sheets":["string"],"description":"string","evidence":[{"discipline":"string","sheet":"string","source_text":"string","asserted_value":"string"}],"recommended_resolution":"string","code_reference":"string or null","risk_score":1,"recommended_priority":"immediate | before_bid | before_permit | before_construction | track_only"}],"decisions":[{"finding_refs":["string"],"action":"kept | merged | dropped","reason":"string","kept_issue_id":"string or null"}]}.
|
||||
Return {"issues":[{"issue_id":"string","source_stage":"conflict | drawing_integrity | qaqc | code | constructability","category":"string","severity":"critical | high | medium | low","confidence":"high | medium | low","location":"string","disciplines":["string"],"sheets":["string"],"description":"string","evidence":[{"discipline":"string","sheet":"string","source_text":"string","asserted_value":"string"}],"recommended_resolution":"string","code_reference":"string or null","risk_score":1,"recommended_priority":"immediate | before_bid | before_permit | before_construction | track_only"}],"decisions":[{"finding_refs":["string"],"action":"kept | merged | dropped","reason":"string","kept_issue_id":"string or null"}]}.
|
||||
Sheet index: {sheet_index}
|
||||
Jurisdiction summary: {jurisdiction}
|
||||
Specialist findings: {findings}"""
|
||||
|
||||
BRAIN_CLARIFY_SYSTEM_PROMPT = """You are the central decision layer for a construction drawing review, deciding which of your kept findings you are NOT yet confident enough to publish.
|
||||
You have already merged and prioritized the findings. Now, for the borderline ones, you may request ONE targeted clarification each before the report is finalized.
|
||||
Request a clarification only when a finding's evidence is thin, ambiguous, possibly a misread of the drawing, or internally inconsistent - the kind of finding a senior reviewer would double-check against the sheet before signing off. Do NOT request clarification for findings that are already clearly supported by verbatim evidence, and do NOT re-request a finding that already carries a verification result.
|
||||
The only request type available right now is:
|
||||
- verify_evidence: re-check this finding's quoted evidence against the actual sheet images and deterministic text layer (catches wave-1 vision misreads such as "(2)" vs "(5)" and dangling references that do not actually appear on the sheet).
|
||||
Be selective. Requesting everything wastes the budget and slows the review; request only the findings where a second look would actually change your decision.
|
||||
Use plain ASCII only. Respond only with valid JSON."""
|
||||
|
||||
BRAIN_CLARIFY_USER_PROMPT = """Decide which of these kept findings you want to double-check before publishing.
|
||||
You may request at most {max_requests} clarifications. Choose the findings where a second look at the sheet would most likely change your keep/drop/severity decision.
|
||||
Respond ONLY with a valid JSON object - no markdown fences, no explanation:
|
||||
{"requests":[{"issue_id":"the issue_id of the finding to check","request_type":"verify_evidence","reason":"one sentence: why this finding is uncertain"}]}
|
||||
If every finding is already well supported, return {"requests":[]}.
|
||||
Findings (each shows issue_id, severity, confidence, evidence, and whether it already has a verification result):
|
||||
{findings}"""
|
||||
|
||||
Reference in New Issue
Block a user