{"slug":"rfi-drafter","title":"rfi-drafter","summary":"Draft RFIs and manage the ambient issue registry. Reviews issues surfaced by other skills, escalates to formal RFIs. Triggers: 'draft RFI', 'write RFI', 'drawing conflict', 'review issues', 'issue queue'.","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-10-19T21:17:03.154973Z","repo":{"url":"https://github.com/dleerdefi/claude-code-construction","stars":44,"forks":13,"license":"MIT","updatedAt":"2026-10-18T06:12:41Z"},"bodyHtml":"<hr>\n<h2>name: rfi-drafter\ndescription: &gt;\nDraft RFIs and manage the ambient issue registry. Reviews issues surfaced\nby other skills, escalates to formal RFIs. Triggers: 'draft RFI', 'write\nRFI', 'drawing conflict', 'review issues', 'issue queue'.\nargument-hint: \"[issue id or description of the conflict]\"\ndisable-model-invocation: true</h2>\n<h1>RFI Drafter</h1>\n<h2>Purpose</h2>\n<p>Two responsibilities: (1) draft formal RFIs from identified issues, and\n(2) manage the issue detection registry where potential problems surface\nduring other skill workflows. Detection is ambient. Drafting is user-\ntriggered. No RFI is ever created without explicit user instruction.</p>\n<p><strong>Design</strong>: RIGID output format and quality checks. GUIDED research\nsequence before drafting. FLEXIBLE across any trade, CSI division, or\ndocument conflict type.</p>\n<p>Does NOT: autonomously discover issues and write RFIs, send RFIs\nwithout user review, or determine whether an issue is actually an\nerror vs. intentional design.</p>\n<h2>Permitted Scripts</h2>\n<table>\n<thead>\n<tr>\n<th>Script</th>\n<th>Location</th>\n<th>Purpose</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>rfi_export.py</code></td>\n<td><code>${CLAUDE_SKILL_DIR}/scripts/rfi_export.py</code></td>\n<td>Populate firm's .docx template or generate generic RFI</td>\n</tr>\n<tr>\n<td><code>issue_manager.py</code></td>\n<td><code>${CLAUDE_PLUGIN_ROOT}/scripts/issue_manager.py</code></td>\n<td>CRUD for issue registry (.construction/skills/issues/)</td>\n</tr>\n<tr>\n<td><code>generate_rfi_pdf.py</code></td>\n<td><code>${CLAUDE_PLUGIN_ROOT}/scripts/rfi/generate_rfi_pdf.py</code></td>\n<td>Generate PDF RFI (alternative format)</td>\n</tr>\n<tr>\n<td><code>rasterize_page.py</code></td>\n<td><code>${CLAUDE_PLUGIN_ROOT}/scripts/pdf/rasterize_page.py</code></td>\n<td>Rasterize drawing pages for vision reading</td>\n</tr>\n<tr>\n<td><code>crop_region.py</code></td>\n<td><code>${CLAUDE_PLUGIN_ROOT}/scripts/pdf/crop_region.py</code></td>\n<td>Crop regions for targeted reading</td>\n</tr>\n</tbody>\n</table>\n<p>Run every script through <code>${CLAUDE_PLUGIN_ROOT}/bin/construction-python</code>, which\nselects the toolkit's Python on Windows, macOS and Linux. Never call bare <code>python</code>.</p>\n<p>Do NOT create custom scripts during execution. All output goes through the scripts above.</p>\n<hr>\n<h2>Mode 1: User-Initiated RFI Drafting</h2>\n<p>The user identifies an issue and instructs Claude to draft an RFI.\nThis is the primary workflow — a 30-minute task compressed to minutes.</p>\n<h3>Step 0: Gather RFI Template (first RFI per project)</h3>\n<p>Before the first RFI, ask the user for their firm's RFI form template.\nConstruction teams have a branded template they use for all official\nRFIs — the output MUST match their format exactly.</p>\n<p><strong>If .docx template provided:</strong></p>\n<ol>\n<li>Read with python-docx to identify field locations (table cells,\nplaceholders like <code>[PROJECT NAME]</code>, content controls)</li>\n<li>Build a field mapping JSON linking each RFI data field to its\nlocation in the template</li>\n<li>Store mapping at <code>.construction/skills/rfi-drafter/rfi_template_map.json</code></li>\n<li>Store a SHA-256 hash of the template for change detection</li>\n</ol>\n<p><strong>If PDF template provided:</strong></p>\n<ol>\n<li>Rasterize each page at 200 DPI</li>\n<li>Read with vision to understand field layout and structure</li>\n<li>Build the mapping JSON from visual analysis</li>\n<li>Store at <code>.construction/skills/rfi-drafter/rfi_template_map.json</code></li>\n</ol>\n<p><strong>If no template available:</strong>\nFall back to the generic format built into <code>rfi_export.py</code>. Inform\nthe user that providing their template is recommended for production\nRFIs.</p>\n<p>On subsequent RFIs, reuse the stored mapping. If the template file\nhash differs from the stored hash, re-map.</p>\n<h3>Step 1: Understand the Issue</h3>\n<p>Gather from the user (or from an issue registry record if escalating):</p>\n<ul>\n<li><strong>What</strong>: the conflict, ambiguity, or missing information</li>\n<li><strong>Where</strong>: sheet number(s), grid location, room/area, detail ref</li>\n<li><strong>Between what</strong>: which documents disagree (plan vs detail, arch vs\nstructural, drawing vs spec, etc.)</li>\n</ul>\n<p>If the user's description is vague, ask clarifying questions. Never\ndraft from ambiguous input — an RFI that doesn't clearly state the\nproblem wastes everyone's time.</p>\n<h3>Step 2: Research Context</h3>\n<p>Before drafting, systematically gather evidence. Read\n<code>references/research-checklist.md</code> for the full checklist.</p>\n<p><strong>Minimum research before any RFI:</strong></p>\n<ol>\n<li>Read the specific area on the source sheet(s)</li>\n<li>Check related details/sections for the same condition</li>\n<li>Check the relevant spec section for requirements</li>\n<li>Check if general notes address the condition</li>\n<li>Check addenda and ASIs for superseding changes</li>\n<li>Check existing RFI log for duplicates (if available)</li>\n</ol>\n<p>Read the sheet by rasterizing it and cropping to the conflict zone (the\n<code>${CLAUDE_PLUGIN_ROOT}</code> paths below are substituted only here in SKILL.md,\nnot in the reference files):</p>\n<pre><code>mkdir -p \".construction/skills/rfi-drafter/pages\"\n\"${CLAUDE_PLUGIN_ROOT}/bin/construction-python\" \"${CLAUDE_PLUGIN_ROOT}/scripts/pdf/rasterize_page.py\" \"{pdf}\" {page} --dpi 200 --output \".construction/skills/rfi-drafter/pages/page.png\"\n\"${CLAUDE_PLUGIN_ROOT}/bin/construction-python\" \"${CLAUDE_PLUGIN_ROOT}/scripts/pdf/crop_region.py\" \".construction/skills/rfi-drafter/pages/page.png\" --box x1,y1,x2,y2 --normalized --output \".construction/skills/rfi-drafter/pages/conflict_area.png\"\n</code></pre>\n<p>Page images are working data: run these from the project folder and keep them under <code>.construction/skills/rfi-drafter/pages/</code>, never in the project root, never in <code>/tmp</code> or any other folder outside the project.</p>\n<p><code>{page}</code> is 1-based: <code>1</code> for a split sheet PDF, <code>page_index + 1</code> for a page in a\nbound set (sheet_index.yaml counts <code>page_index</code> from 0). The box is 0–1\nfractions of the page.</p>\n<p>First read <code>.construction/project.yaml</code>: present and readable means AgentCM\nmanages the folder. A listing that shows the file does not decide it: read it.\nIn AgentCM mode, read its files for cross-references to the affected area. See\n<code>references/research-checklist.md</code> for which files, and follow\n<code>${CLAUDE_PLUGIN_ROOT}/reference/agentcm-mode.md</code> (which source wins, missing files,\ndrawings through <code>crop.sh</code>, corrections of AgentCM's data).</p>\n<p>If research reveals the issue is already resolved (by addendum, ASI,\nor existing RFI response), inform the user — no RFI needed.</p>\n<h3>Step 3: Draft the RFI</h3>\n<p>Use the format in <code>references/rfi-format.md</code>. Every RFI must include:</p>\n<ul>\n<li>Project identification (name, number, RFI number)</li>\n<li>Addressee (the design professional who owns the document)</li>\n<li>Specific drawing/spec references with grid locations</li>\n<li>Clear description of the issue</li>\n<li>Suggested resolution (always — accelerates response)</li>\n<li>Schedule impact statement</li>\n<li>Attachment list</li>\n</ul>\n<p>Read <code>references/rfi-format.md</code> for the full template, field-by-field\nguidance, and an example RFI.</p>\n<h3>Step 4: Quality Check</h3>\n<p>Before presenting to user, verify against the checklist in\n<code>references/quality-checks.md</code>. Key gates:</p>\n<ul>\n<li>Specific sheet numbers and grid locations cited (never \"the plan\")</li>\n<li>Issue clearly described (a stranger could understand it)</li>\n<li>Suggested resolution provided</li>\n<li>Schedule impact stated with a needed-by date</li>\n<li>Spec section referenced if applicable</li>\n<li>No duplicate of an existing RFI</li>\n<li>Addressee is the correct design professional for this scope</li>\n</ul>\n<h3>Step 5: Present for Review</h3>\n<p>Present the draft RFI to the user in conversation. The user may:</p>\n<ul>\n<li><strong>Approve and export</strong> — populate their template and generate .docx</li>\n<li><strong>Edit and refine</strong> — iterate on language, add context</li>\n<li><strong>Reject</strong> — issue isn't actually an issue</li>\n<li><strong>Defer</strong> — log it back to the issue registry for later</li>\n</ul>\n<p><strong>On export</strong>, write the RFI data with the Write tool to <code>.construction/skills/rfi-drafter/rfi_draft.json</code> (working data, never the project root), then invoke from the project folder; the .docx is the deliverable and goes in the project root (or the folder the PE names), never under <code>.construction/</code>:</p>\n<pre><code># Template mode (preferred — matches firm's format):\n\"${CLAUDE_PLUGIN_ROOT}/bin/construction-python\" \"${CLAUDE_SKILL_DIR}/scripts/rfi_export.py\" \\\n  --template \"path/to/firm_rfi_form.docx\" \\\n  --mapping .construction/skills/rfi-drafter/rfi_template_map.json \\\n  --data .construction/skills/rfi-drafter/rfi_draft.json \\\n  --output RFI-026.docx\n\n# Generic mode (fallback — no template):\n\"${CLAUDE_PLUGIN_ROOT}/bin/construction-python\" \"${CLAUDE_SKILL_DIR}/scripts/rfi_export.py\" \\\n  --data .construction/skills/rfi-drafter/rfi_draft.json \\\n  --output RFI-026.docx\n</code></pre>\n<p>Output is always .docx so the user can make final edits before sending.\nThe script uses <code>safe_output_path()</code> — never overwrites existing files.</p>\n<hr>\n<h2>Mode 2: Issue Detection Registry</h2>\n<p>Other skills (tag-audit-and-takeoff, pe-review, submittal-review, etc.)\nsurface potential issues during their normal work. These issues\naccumulate in <code>.construction/skills/issues/</code> as JSON records, NOT as RFIs.</p>\n<h3>How Issues Get Created</h3>\n<p>Any skill can write an issue record. Read <code>references/issue-schema.md</code>\nfor the full schema. An issue record contains:</p>\n<ul>\n<li>Source skill that found it</li>\n<li>Severity (info / warning / conflict / safety)</li>\n<li>Description of what was observed</li>\n<li>Affected sheets, spec sections, elements</li>\n<li>Confidence level</li>\n<li>Timestamp</li>\n</ul>\n<p><strong>Critical rule: no skill writes an RFI directly.</strong> Skills write\nissue records. The user reviews the queue. The user decides which\nissues become RFIs.</p>\n<h3>Reviewing the Issue Queue</h3>\n<p>When the user asks to review issues (\"check the issues list\", \"what\nissues have been found\", \"any problems detected\"):</p>\n<ol>\n<li>Load issues from <code>.construction/skills/issues/</code></li>\n<li>Sort by severity (safety &gt; conflict &gt; warning &gt; info), then\nby confidence (high &gt; medium &gt; low)</li>\n<li>Present a summary table: severity, source skill, description,\naffected sheets, confidence</li>\n<li>For each issue the user wants to escalate: switch to Mode 1\ndrafting with the issue record as input context</li>\n</ol>\n<pre><code># List all open issues (sorted by severity, then confidence)\n\"${CLAUDE_PLUGIN_ROOT}/bin/construction-python\" \"${CLAUDE_PLUGIN_ROOT}/scripts/issue_manager.py\" list\n\n# List with human-readable table format\n\"${CLAUDE_PLUGIN_ROOT}/bin/construction-python\" \"${CLAUDE_PLUGIN_ROOT}/scripts/issue_manager.py\" list --table\n\n# Filter by severity or source skill\n\"${CLAUDE_PLUGIN_ROOT}/bin/construction-python\" \"${CLAUDE_PLUGIN_ROOT}/scripts/issue_manager.py\" list --severity conflict\n\"${CLAUDE_PLUGIN_ROOT}/bin/construction-python\" \"${CLAUDE_PLUGIN_ROOT}/scripts/issue_manager.py\" list --source-skill \"pe-review\"\n\n# Get a specific issue\n\"${CLAUDE_PLUGIN_ROOT}/bin/construction-python\" \"${CLAUDE_PLUGIN_ROOT}/scripts/issue_manager.py\" get --id ISS-2026-0001\n\n# Escalate an issue to RFI\n\"${CLAUDE_PLUGIN_ROOT}/bin/construction-python\" \"${CLAUDE_PLUGIN_ROOT}/scripts/issue_manager.py\" update \\\n  --id ISS-2026-0001 --status escalated --rfi-number RFI-026\n\n# Summary statistics\n\"${CLAUDE_PLUGIN_ROOT}/bin/construction-python\" \"${CLAUDE_PLUGIN_ROOT}/scripts/issue_manager.py\" stats\n</code></pre>\n<h3>Writing Issues from Other Skills</h3>\n<p>Other skills log issues without loading this skill: the <code>issue_manager.py add</code>\ncommand, the severity mapping and the pattern vocabulary are in\nconstruction-guide's Issue Registry paragraph. This skill only reads the\nregistry and escalates.</p>\n<hr>\n<h2>Output</h2>\n<p><strong>RFI documents</strong> are produced as Word (.docx) via <code>scripts/rfi_export.py</code>.\nTwo modes:</p>\n<ul>\n<li><strong>Template mode</strong> (default): Clones the firm's .docx template and\npopulates fields per the stored mapping. Output matches the firm's\nbranded format exactly.</li>\n<li><strong>Generic mode</strong> (fallback): Builds a standard RFI from scratch\nwhen no template is available.</li>\n</ul>\n<p>Output is always .docx — the user must be able to edit before sending.\nRead <code>references/rfi-format.md</code> for field-by-field content guidance.</p>\n<p><strong>Template mapping</strong> is stored at <code>.construction/skills/rfi-drafter/rfi_template_map.json</code>.\nCreated on first RFI, reused for all subsequent RFIs in the project.</p>\n<p><strong>Issue records</strong> are JSON files in <code>.construction/skills/issues/</code>.\nManaged via <code>${CLAUDE_PLUGIN_ROOT}/scripts/issue_manager.py</code>.</p>\n<hr>\n<h2>Allowed Scripts</h2>\n<p><strong>Allowed scripts — exhaustive list.</strong> Only execute these scripts during this skill:</p>\n<ul>\n<li><code>scripts/rfi_export.py</code> — export RFI to .docx using a firm template or generic format</li>\n<li><code>${CLAUDE_PLUGIN_ROOT}/scripts/issue_manager.py</code> — manage the ambient issue registry (read/write/escalate)</li>\n<li><code>${CLAUDE_PLUGIN_ROOT}/scripts/rfi/generate_rfi_pdf.py</code> — generate RFI PDF output</li>\n<li><code>${CLAUDE_PLUGIN_ROOT}/scripts/pdf/rasterize_page.py</code> — rasterize a drawing PDF page for issue context</li>\n<li><code>${CLAUDE_PLUGIN_ROOT}/scripts/pdf/crop_region.py</code> — crop a region from a rasterized sheet for issue context</li>\n<li><code>${CLAUDE_PLUGIN_ROOT}/scripts/corrections_append.py</code> — AgentCM mode: record a correction of AgentCM's data (<code>reference/agentcm-mode.md</code>)</li>\n</ul>\n","files":[{"path":"agents/openai.yaml","sizeBytes":260,"isText":true},{"path":"references/issue-record.schema.json","sizeBytes":3557,"isText":true},{"path":"references/issue-schema.md","sizeBytes":4077,"isText":true},{"path":"references/quality-checks.md","sizeBytes":3400,"isText":true},{"path":"references/research-checklist.md","sizeBytes":5633,"isText":true},{"path":"references/rfi-format.md","sizeBytes":5922,"isText":true},{"path":"scripts/rfi_export.py","sizeBytes":13710,"isText":true},{"path":"scripts/shared.py","sizeBytes":554,"isText":true},{"path":"SKILL.md","sizeBytes":12445,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-10-19T21:17:13.650227Z","sha256":"DC3FBD07AD8E1EDF51ED8D39421F780A5BA6757C8FB5005282DDE36CC5C7F3BC","sizeBytes":19791},"review":null,"source":{"repositoryUrl":"https://github.com/dleerdefi/claude-code-construction","path":"skills/rfi-drafter","license":"MIT","commit":"5c46e16c67cdc82ee8bcbb0fdd8ba316d792d4ec","subtreeSha":"95304DE5526FF8A84F60DCA69034287BE3BBBCFA0E257A848536DE8E69EE52D5","lastSyncedAt":"2026-10-19T21:17:01.926806Z"},"reviewedAt":"2026-10-19T21:17:40.258867Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/dleerdefi/claude-code-construction/tree/main/skills/rfi-drafter"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install dleerdefi-claude-code-construction@llmmart"},{"target":"git","command":"git clone https://github.com/dleerdefi/claude-code-construction.git"}]}