--- name: demo-contractor-corrections description: "Local demo: Contractor corrections analysis and response — two-phase flow with a human-in-the-loop pause. Phase 1 reads the corrections letter, researches codes, views plan sheets, and generates questions for the contractor. The agent STOPS and presents questions to the user. After the user provides answers, Phase 2 generates the full response package (response letter, professional scope, corrections report, sheet annotations). Triggers on: 'Analyze these corrections' or 'Run the contractor flow on [path]'." --- # Demo: Contractor Corrections Flow Run the contractor-side corrections analysis and response locally. You are helping a contractor understand and respond to a city corrections letter on their ADU permit. **This is a two-phase flow with a pause in the middle.** Phase 1 produces questions. You STOP and present them. The user answers. Then Phase 2 generates deliverables. ## How to Invoke The user provides: 1. **Corrections letter** — PNG images or a PDF of the corrections letter (typically 1-3 pages) 2. **Plan binder** — either a PDF path or a directory of pre-extracted PNGs 3. (Optional) **City name** and **project address** — auto-detected from the corrections letter if not provided Example invocations: - "Analyze these corrections for my Placentia ADU project. Corrections: `test-assets/corrections/`. Plans: `test-assets/01-extract-test/pages-png/`" - "Run the contractor flow. Corrections letter: `path/to/corrections-p1.png` and `path/to/corrections-p2.png`. Plan binder: `path/to/plans.pdf`" - "I got corrections back from the city. Here they are: [paths]" ## Input Resolution **Corrections letter:** - If PNG files: use directly with vision - If a directory: find all PNGs in it, sort by name, read each as a page - If PDF: extract to PNGs first (same as plan binder extraction below) **Plan binder:** - If a directory of PNGs: use directly. Check for pre-existing `sheet-manifest.json` and `title-blocks/`. - If a PDF: extract with `pdftoppm -png -r 200 "" "/pages-png/page"` ## Output Directory Create `demo-output/contractor--/` in the workspace root. All output files go here. --- ## PHASE 1: Analysis ### Step 1.1: Parse Corrections Letter (~30 sec) Read the corrections letter pages visually. Extract: - **Project info**: address, city, jurisdiction number, job description, date, reviewer name - **Each correction item** as a structured object: - Item number (preserve original numbering, including sub-items like 3a, 3b, 3c) - Original text (exact wording) - Code references (CRC, CBC, ASCE, CPC, B&P Code, municipal code) - Plan sheet references (Sheet A1, Detail 2/A3, etc.) - Review round (1st review outstanding vs. 2nd review new) - Bold/emphasis flags Write `corrections_parsed.json` to output directory. ### Step 1.2: Build Sheet Manifest (~30-90 sec) Run concurrently with Step 1.1. Follow the `adu-targeted-page-viewer` skill workflow: 1. Read page 1 (cover sheet) visually for the sheet index 2. Match sheet IDs to page numbers (title block reading if count mismatch) 3. Write `sheet-manifest.json` ### Step 1.3: Parallel Research (~60-90 sec) After Steps 1.1 and 1.2 complete, launch three concurrent subagents: **Subagent A — State Law Researcher:** - Load `adu-skill-development/skill/california-adu/references/` - Look up every code section cited in the corrections (CRC, CBC, ASCE, CPC, B&P Code) - For each: what does the code require? What are the thresholds? ADU exceptions? - Write findings (will be merged in Step 1.4) **Subagent B — City Research:** - Check if `adu-skill-development/skill/-adu/` exists - **If yes**: Load city skill references (offline, fast) - **If no**: Run `adu-city-research` — WebSearch for URLs, then WebFetch to extract content - Focus on: municipal code amendments, standard details referenced in corrections, Information Bulletins - Write findings (will be merged in Step 1.4) **Subagent C — Sheet Viewer:** - Using the sheet manifest, read only the plan sheets referenced by correction items - For each referenced sheet, describe what is currently drawn in the area relevant to the correction - Write `sheet_observations.json` ### Step 1.4: Categorize + Generate Questions (~2 min) Merge all research and categorize each correction item: | Category | Meaning | |----------|---------| | `AUTO_FIXABLE` | Drafter fixes: labels, notes, formatting, checklists | | `NEEDS_CONTRACTOR_INPUT` | Requires specific facts from the contractor (pipe sizes, elevations, materials) | | `NEEDS_PROFESSIONAL` | Requires licensed professional work (structural calcs, fire-rated details, stamps) | For each item, document: - Category assignment with justification - Research context (what the code requires, what the city adds) - What's currently on the plan (from sheet observations) - What needs to change Write `corrections_categorized.json`. For `NEEDS_CONTRACTOR_INPUT` items, generate specific questions: - Each question includes research_context explaining why it's being asked - Question types: choice, text, number, measurement, multi_choice - Questions are informed by the code research — they ask for specific data, not vague descriptions Write `contractor_questions.json`. Also write `state_law_findings.json` (from Subagent A) and any city research files. --- ## ⛔ STOP HERE — Present Questions to the User **After Phase 1 completes, you MUST stop and wait for the user.** Present the results in this format: --- ### Phase 1 Complete — Corrections Analysis **Project:** [address], [city] — [permit number] **Corrections:** [N] items parsed from [review round] **Breakdown:** [X] auto-fixable, [Y] need your input, [Z] need professional work #### Questions for You For each question group (organized by correction item): > **Item [#] — [summary]** > [research context — why this matters, what the code says] > > 1. [question text] > - Options: [if choice type] > 2. [question text] > ... #### Auto-Fixable Items (no input needed) - Item [#]: [summary] — [what will be done] - ... #### Professional Items (scoped for your design team) - Item [#]: [summary] — needs [professional role] - ... **Answer the questions above and I'll generate your response package.** You can also say: - "Use the mock answers" (loads `test-assets/mock-session/contractor_answers.json`) - "Skip the questions, just generate with what you have" (Phase 2 runs with TODO placeholders) --- **Wait for the user's response before proceeding to Phase 2.** --- ## PHASE 2: Generate Response Package Triggered when the user provides answers. Three ways this happens: 1. **User answers inline** — Parse their answers from the conversation. Map to question IDs. 2. **User says "use mock answers"** — Load `test-assets/mock-session/contractor_answers.json` 3. **User says "skip" or "generate with what you have"** — Proceed with empty answers; TODO placeholders in outputs. Write `contractor_answers.json` to the output directory (even if loaded from mock). ### Step 2.1: Load Phase 1 Context Read all Phase 1 outputs from the output directory: 1. `corrections_categorized.json` — the backbone, read first 2. `contractor_answers.json` — map answers to items 3. `sheet-manifest.json` — for sheet references 4. `corrections_parsed.json` — for original wording ### Step 2.2: Generate Four Deliverables Follow the `adu-corrections-complete` skill specification. Generate all four: **1. `response_letter.md`** — Professional letter to the building department - Address EVERY item, even procedural ones - Preserve original correction wording - Incorporate contractor answers with code justification - Reference specific sheets from manifest - End with a sheet revisions summary table **2. `professional_scope.md`** — Work breakdown by professional - Group by role: Designer, Structural Engineer, HERS Rater - Include Key Specifications section with contractor-provided details - Ready-to-use notes for the design team (DFU justification, grade table, dimensions) - Status per item: READY, PENDING, FINAL STEP **3. `corrections_report.md`** — Status dashboard / checklist - Summary table by category - Key findings from contractor answers (capacity conclusions, drainage assessment) - Action items checklist with checkboxes - Critical path (what blocks what, what can run in parallel) **4. `sheet_annotations.json`** — Per-sheet markup instructions - Every annotation references a valid sheet from the manifest - Revision notes ready for a revision table - Specifications from contractor answers mapped to sheet locations ### Step 2.3: Present Results After generating all deliverables, present to the user: - Summary: what was generated, where files are saved - The full `response_letter.md` content (this is the main deliverable they care about) - Highlights from the professional scope (who needs to do what) - Link to the corrections report for the full status view --- ## Test Data Ready-to-use test data for the Placentia demo project: | Asset | Path | |-------|------| | Corrections letter (2 pages) | `test-assets/corrections/1232-n-jefferson-corrections-p1.png` and `p2.png` | | Plan pages (15 PNGs) | `test-assets/01-extract-test/pages-png/` | | Mock session data | `test-assets/mock-session/` (all Phase 1 outputs pre-built) | | Mock contractor answers | `test-assets/mock-session/contractor_answers.json` | | Real agent output (comparison) | `test-assets/correction-01/` | **Quick demo path** (skips Phase 1, tests Phase 2 only): - "Generate the response package using the mock session data at `test-assets/mock-session/`" - This loads pre-built Phase 1 artifacts + mock answers and jumps straight to Phase 2 deliverables. ## Sub-Skills Referenced | Skill | Location | Role | |-------|----------|------| | `adu-targeted-page-viewer` | `adu-skill-development/skill/adu-targeted-page-viewer/` | PDF extraction + sheet manifest | | `california-adu` | `adu-skill-development/skill/california-adu/` | State law (28 reference files) | | `adu-city-research` | `.claude/skills/adu-city-research/` | Web research for non-onboarded cities | | `adu-corrections-complete` | `adu-skill-development/skill/adu-corrections-complete/` | Phase 2 output spec | | `placentia-adu` | `adu-skill-development/skill/placentia-adu/` | Placentia-specific rules | | `buena-park-adu` | `adu-skill-development/skill/buena-park-adu/` | Buena Park-specific rules |