ワンクリックで
roof-rfp-extract
Use when the user asks to parse, extract, or normalize an owner's roof replacement RFP or tender document PDF into a structured schema. Works on Ontario commercial (OBC Part 3) and residential (OBC Part 9) roof projects.
メニュー
Use when the user asks to parse, extract, or normalize an owner's roof replacement RFP or tender document PDF into a structured schema. Works on Ontario commercial (OBC Part 3) and residential (OBC Part 9) roof projects.
This skill should be used when the user asks to "abstract a lease", "extract lease terms", "summarize a commercial lease", "analyze a CRE lease", "review lease provisions", "identify lease risks", "extract critical dates from a lease", "generate a critical dates calendar", "create an ICS file from a lease", "export lease dates to CSV", or needs to apply REIXS methodology, the 258-field Domain Data Dictionary, or REIXS-LA-NA-001 extraction standards to a commercial real estate lease document.
Use when the user asks to run a competitive positioning analysis, rank a subject property against market comparables using MCDA, determine how competitive a listing is, calculate what rent reduction is needed to achieve Top 3 positioning, analyze a CoStar or broker package for competitive ranking, or generate a relative valuation report. Trigger phrases include: "relative valuation", "competitive positioning", "rank this property", "how competitive is this listing", "run relative valuation", "/mcda-lease-comparison".
Use when evaluating a roofing contractor bid's mandatory pass/fail gates — WSIB clearance, CGL insurance, bonding, working-at-heights training, addenda, references, years in business. Populates `mandatory_gates` and contributes qualification-related red flags and sub-scores.
Use when evaluating a roofing bid's technical content against the RFP and Ontario codes — materials adequacy, warranty validity, OBC compliance, manufacturer system compatibility, wind uplift, insulation R-value compliance, and cover-board presence. Produces raw sub-scores and technical red flags.
Create a markdown index of property photos with AI-generated descriptions. Use when you have a folder of site photos that need cataloging.
Use when the user asks to parse, extract, or normalize a roofing contractor's bid or tender submission PDF against a previously-parsed RFP. Captures pricing, scope response, materials, warranty, qualifications, schedule, and technical approach, with page-level evidence citations.
| name | roof-rfp-extract |
| description | Use when the user asks to parse, extract, or normalize an owner's roof replacement RFP or tender document PDF into a structured schema. Works on Ontario commercial (OBC Part 3) and residential (OBC Part 9) roof projects. |
You are parsing an owner's roof replacement RFP into the normalized schema at
templates/bid_schema.json (§project and §rfp sections). Your output drives
every downstream skill in this plugin — extraction accuracy is the foundation.
Before extracting, be aware of the fixtures you must cite for classification decisions:
fixtures/domain_knowledge/01_ontario_roofing_codes.md — OBC Part 3 vs Part 9 triggers, SB-10/SB-12 applicability, WAH and environmental requirementsfixtures/domain_knowledge/02_roofing_materials_warranties.md — membrane/shingle system categories, thickness conventionsfixtures/domain_knowledge/03_tender_evaluation_methodology.md — default MCDA weighting, price scoring methods, mandatory gate conventionsClassify the project. Determine building_classification:
obc_part_3 if: >3 storeys, >600 m² footprint, or occupancy is assembly/institutional/business/mercantile/industrial/high-hazardobc_part_9 if: houses, duplexes, small residential, or buildings ≤3 storeys AND ≤600 m²obc_part_3) and flag in extraction_notes.Classify the roof type. low_slope_commercial (<2:12), steep_slope_residential, steep_slope_commercial, or mixed.
Extract scope. From the tender's scope of work section:
Extract warranty requirements. Minimum years, warranty type (material-only vs NDL — see fixture 02 §1 for taxonomy), manufacturer certification requirement.
Extract mandatory requirements. Each gate in §rfp.mandatory_requirements — set to actual value if specified in RFP, otherwise leave default. Important: only set a mandatory-requirements field when the RFP actually invokes it. Do not fabricate bid_bond_percent, addenda_acknowledgment_required, or similar from "standard tender template" assumptions — those values drive gate applicability in scripts/gate_applicability.py, and setting them falsely will disqualify bidders for requirements the RFP never stated. When the RFP is silent, leave the field absent.
5a. Extract submission requirements verbatim. The RFP's "Required Content" / "Submission Requirements" block (typically §6.2 in public-sector tenders; may be any section in private tenders) enumerates what bidders must submit. Copy each enumerated item as a single string into rfp.submission_requirements[], preserving the RFP's wording. This list is consulted by the gate-applicability check: a gate is applicable if either mandatory_requirements.<field> is populated OR the item appears verbatim here. Do not paraphrase — the literal text is what future reviewers will diff against. If the RFP has no enumerated submission requirements block, write an empty array and note this in extraction_notes.
Extract evaluation criteria weighting. If the RFP states weights, use them. If not, apply defaults from fixture 03 §3 adjusted for project context:
Record extraction provenance. For each non-default value, record the RFP page/section where you found it in _provenance (sidecar structure keyed by JSON path).
Write the manifest to <rfp-dir>/roof-review-output/manifests/rfp.json, conforming to the project and rfp portions of the schema. Include:
{
"project": { ... },
"rfp": {
"...": "...",
"submission_requirements": [
"Form of Tender signed in ink by an authorized signing officer",
"WSIB Clearance Certificate (current validity)",
"Certificate of Insurance — CGL minimum $5,000,000 naming owner as additional insured"
],
"mandatory_requirements": { "...": "..." }
},
"_provenance": {
"rfp.scope_of_work.membrane_system_specified.category": "page 12, §3.2",
"rfp.warranty_requirements.warranty_type_required": "page 18, §5.1",
"rfp.submission_requirements": "page 22, §6.2"
},
"extraction_notes": ["classified as obc_part_3 due to 4-storey occupied office"]
}
owner_type: infer from owner name (condo/municipal/school board/hospital obvious; else private_commercial or private_residential based on building classification)evaluation_criteria.weighting: apply defaults (Price 45 / Technical 15 / Experience 15 / Warranty 10 / Schedule 5 / Qualifications 10) — note in extraction_notes that defaults were usedmandatory_requirements.cgl_minimum_cad: 5000000 for OBC Part 3, 2000000 for OBC Part 9warranty_requirements.warranty_type_required: total_system_ndl for Part 3, labour_and_material for Part 9If the RFP itself is deficient, record these in extraction_notes so the owner can fix before receiving bids:
When done, tell the user: