rfi-drafter — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited rfi-drafter (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Two responsibilities: (1) draft formal RFIs from identified issues, and (2) manage the issue detection registry where potential problems surface during other skill workflows. Detection is ambient. Drafting is user- triggered. No RFI is ever created without explicit user instruction.
Design: RIGID output format and quality checks. GUIDED research sequence before drafting. FLEXIBLE across any trade, CSI division, or document conflict type.
Does NOT: autonomously discover issues and write RFIs, send RFIs without user review, or determine whether an issue is actually an error vs. intentional design.
| Script | Location | Purpose |
|---|---|---|
rfi_export.py | ${CLAUDE_SKILL_DIR}/scripts/rfi_export.py | Populate firm's .docx template or generate generic RFI |
issue_manager.py | ${CLAUDE_SKILL_DIR}/../../scripts/issue_manager.py | CRUD for issue registry (.construction/issues/) |
generate_rfi_pdf.py | ${CLAUDE_SKILL_DIR}/../../scripts/rfi/generate_rfi_pdf.py | Generate PDF RFI (alternative format) |
rasterize_page.py | ${CLAUDE_SKILL_DIR}/../../scripts/pdf/rasterize_page.py | Rasterize drawing pages for vision reading |
crop_region.py | ${CLAUDE_SKILL_DIR}/../../scripts/pdf/crop_region.py | Crop regions for targeted reading |
Do NOT create custom scripts during execution. All output goes through the scripts above.
The user identifies an issue and instructs Claude to draft an RFI. This is the primary workflow — a 30-minute task compressed to minutes.
Before the first RFI, ask the user for their firm's RFI form template. Construction teams have a branded template they use for all official RFIs — the output MUST match their format exactly.
If .docx template provided:
placeholders like [PROJECT NAME], content controls)
location in the template
.construction/rfi_template_map.jsonIf PDF template provided:
.construction/rfi_template_map.jsonIf no template available: Fall back to the generic format built into rfi_export.py. Inform the user that providing their template is recommended for production RFIs.
On subsequent RFIs, reuse the stored mapping. If the template file hash differs from the stored hash, re-map.
Gather from the user (or from an issue registry record if escalating):
structural, drawing vs spec, etc.)
If the user's description is vague, ask clarifying questions. Never draft from ambiguous input — an RFI that doesn't clearly state the problem wastes everyone's time.
Before drafting, systematically gather evidence. Read references/research-checklist.md for the full checklist.
Minimum research before any RFI:
If AgentCM data is available (.construction/ exists), query the database for cross-references to the affected area. See references/research-checklist.md for concrete query examples.
If research reveals the issue is already resolved (by addendum, ASI, or existing RFI response), inform the user — no RFI needed.
Use the format in references/rfi-format.md. Every RFI must include:
Read references/rfi-format.md for the full template, field-by-field guidance, and an example RFI.
Before presenting to user, verify against the checklist in references/quality-checks.md. Key gates:
Present the draft RFI to the user in conversation. The user may:
On export, write the RFI data to a JSON file, then invoke:
# Template mode (preferred — matches firm's format):
python ${CLAUDE_SKILL_DIR}/scripts/rfi_export.py \
--template path/to/firm_rfi_form.docx \
--mapping .construction/rfi_template_map.json \
--data rfi_draft.json \
--output RFI-026.docx
# Generic mode (fallback — no template):
python ${CLAUDE_SKILL_DIR}/scripts/rfi_export.py \
--data rfi_draft.json \
--output RFI-026.docxOutput is always .docx so the user can make final edits before sending. The script uses safe_output_path() — never overwrites existing files.
Other skills (tag-audit-and-takeoff, pe-review, spec-parser, etc.) surface potential issues during their normal work. These issues accumulate in .construction/issues/ as JSON records, NOT as RFIs.
Any skill can write an issue record. Read references/issue-schema.md for the full schema. An issue record contains:
Critical rule: no skill writes an RFI directly. Skills write issue records. The user reviews the queue. The user decides which issues become RFIs.
When the user asks to review issues ("check the issues list", "what issues have been found", "any problems detected"):
.construction/issues/by confidence (high > medium > low)
affected sheets, confidence
drafting with the issue record as input context
# List all open issues (sorted by severity, then confidence)
python ${CLAUDE_SKILL_DIR}/../../scripts/issue_manager.py list
# List with human-readable table format
python ${CLAUDE_SKILL_DIR}/../../scripts/issue_manager.py list --table
# Filter by severity or source skill
python ${CLAUDE_SKILL_DIR}/../../scripts/issue_manager.py list --severity conflict
python ${CLAUDE_SKILL_DIR}/../../scripts/issue_manager.py list --source-skill "pe-review"
# Get a specific issue
python ${CLAUDE_SKILL_DIR}/../../scripts/issue_manager.py get --id ISS-2026-0001
# Escalate an issue to RFI
python ${CLAUDE_SKILL_DIR}/../../scripts/issue_manager.py update \
--id ISS-2026-0001 --status escalated --rfi-number RFI-026
# Summary statistics
python ${CLAUDE_SKILL_DIR}/../../scripts/issue_manager.py statsIf you are running a skill OTHER than rfi-drafter and you notice a potential issue (schedule conflict, missing reference, spec/drawing mismatch), write it to the registry:
python ${CLAUDE_SKILL_DIR}/../../scripts/issue_manager.py add \
--source-skill "tag-audit-and-takeoff" \
--severity "warning" \
--description "Door D-142 references HW set 7, not found in 08 71 00" \
--sheets "A3.1" \
--spec-sections "08 71 00" \
--confidence "medium"Do NOT interrupt the current workflow to draft an RFI. Log and continue.
See references/common-issue-types.md for the pattern vocabulary of what to watch for across skills.
RFI documents are produced as Word (.docx) via scripts/rfi_export.py. Two modes:
populates fields per the stored mapping. Output matches the firm's branded format exactly.
when no template is available.
Output is always .docx — the user must be able to edit before sending. Read references/rfi-format.md for field-by-field content guidance.
Template mapping is stored at .construction/rfi_template_map.json. Created on first RFI, reused for all subsequent RFIs in the project.
Issue records are JSON files in .construction/issues/. Managed via ../../scripts/issue_manager.py.
Allowed scripts — exhaustive list. Only execute these scripts during this skill:
scripts/rfi_export.py — export RFI to .docx using a firm template or generic format../../scripts/issue_manager.py — manage the ambient issue registry (read/write/escalate)../../scripts/rfi/generate_rfi_pdf.py — generate RFI PDF output../../scripts/pdf/rasterize_page.py — rasterize a drawing PDF page for issue context../../scripts/pdf/crop_region.py — crop a region from a rasterized sheet for issue context~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.