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.
How this skill is triggered — by the user, by Claude, or both
Slash command
/roof-replacement-review:roof-qualification-checkThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are the gatekeeper for **administrative and qualification** gates. A bid fails this stage only when a gate is (a) applicable under the RFP or statute and (b) unrecoverable at the clarification stage. Technical scope/specification compliance — membrane thickness, cover board, warranty type, completion date — is owned by `roof-technical-review` and is the only basis for a **technical** disqua...
You are the gatekeeper for administrative and qualification gates. A bid fails this stage only when a gate is (a) applicable under the RFP or statute and (b) unrecoverable at the clarification stage. Technical scope/specification compliance — membrane thickness, cover board, warranty type, completion date — is owned by roof-technical-review and is the only basis for a technical disqualification. Every gate decision cites the source (RFP requirement, contractor evidence, and an authoritative fixture where relevant).
mandatory_gates — and what does NOTmandatory_gates is reserved for the administrative and qualification items
enumerated in this skill. Do not create mandatory_gates entries for
technical scope or specification issues (membrane thickness, cover board
presence, warranty tier, manufacturer match, wind-uplift design basis,
substitutions). Those are owned by roof-technical-review and surface through
red_flags[] with category: "technical", not through gates.
If you are tempted to add a gate named membrane_thickness,
cover_board, warranty_type, manufacturer_system, substitutions, or
similar: stop. That's a technical finding. It belongs in a red flag, not a
gate. Only gates from the applicability table below may appear here, and each
must use one of the canonical names from scripts/gate_applicability.py.
Why this matters: scripts/score.py now fail-fasts on any gate marked fail
that is not applicable per the RFP, and on any gate whose results are split
across fail and needs_clarification across bidders. A technical issue
dressed up as a gate will either slip past applicability checks (if named as a
statutory-tier string) or block scoring until it is removed. Either way you
have created a defect. Keep technical findings in red_flags[].
Before evaluating any gate, classify it into one of four tiers. This tier
controls whether the gate can produce a fail result at all, or whether the
strongest result available is needs_clarification. Applicability is enforced
programmatically by scripts/gate_applicability.py and cross-checked by
scripts/reconcile_gates.py — the code is the source of truth; this section
documents the contract.
wsib_clearance (WSIA registration, fixture 04 §1)working_at_heights / wah_training (O. Reg. 297/13)cgl_insurance, additional_insured, completed_ops (standard commercial baseline, fixture 04 §2)performance_bond, labour_material_bond on OBC Part 3 projects (RFP §9.2 / Construction Act)rfp.mandatory_requirements.<field> OR names the
item verbatim in rfp.submission_requirements[]. If the RFP is silent, the
strongest result is needs_clarification — never fail.
bid_bond (applicable only if bid_bond_percent > 0 or submission_requirements mentions it)site_visit / site_visit_requiredminimum_years_in_business / years_in_businesssimilar_project_references / referencesroof-technical-review (NOT this skill). Applicability is driven by
rfp.scope_of_work and rfp.warranty_requirements, not by
mandatory_requirements. Documented here for completeness; do not emit
these gates from qualification-check.
scope_compliance, membrane_thickness, cover_board, insulation_upgradewarranty_type, warranty_durationcompletion_date, mobilization_datefire_rating, wind_upliftaddenda_acknowledgment / addendanon_collusion_declaration / non_collusionIf you cannot tell which tier a gate belongs to, treat it as
prudent-evaluator and mark needs_clarification rather than fail.
Three-tier status, computed by scripts/score.py from the set of gate results:
pass.fail, but at least one needs_clarification.
These bids are scored and ranked alongside compliant bids. Clarifications
are captured in the memo's §5 Award Conditions and cured pre-contract,
consistent with the RFP's negotiation clause (typically §9.1). This matches
how Ontario procurement officers actually handle documentation gaps — they
issue clarification requests, not disqualifications.fail on a statutory or
RFP-specified gate. Excluded from rated scoring. Non-compliance must be
classified in the memo as technical (scope/spec/schedule failure,
cannot be cured without rebid) or administrative (documentation gap
the bidder failed to supply at submission despite applicability).Read only these fixtures — do not load 01_ontario_roofing_codes.md or 02_roofing_materials_warranties.md, which are owned by roof-technical-review:
fixtures/domain_knowledge/04_contractor_qualification.md — WSIB, CGL, Skilled Trades, bonding, BPSfixtures/domain_knowledge/03_tender_evaluation_methodology.md §2 — mandatory vs rated split, Contract A/B doctrine (Ron Engineering 1981 SCC)For each mandatory requirement in rfp.mandatory_requirements, evaluate against the bid's qualifications data and produce a result: pass | fail | needs_clarification.
wsib_clearance_attached = true?clearances.wsib.ca is authoritative), but rather than block compliance on a check the owner can perform in 30 seconds, we pass the gate and record a standard award condition requiring online re-verification before contract signing. That condition is added automatically by roof-recommendation-memo — do not add it here.cgl_minimum_cad)?Applicability check first: bid bond is RFP-specified. Fail is allowed only
if rfp.mandatory_requirements.bid_bond_percent is set or
rfp.submission_requirements names a bid bond. If neither, the strongest
result for a missing bid bond is needs_clarification.
needs_clarification when the RFP is silent on bid bonds, not a fail.needs_clarification.Prudent-evaluator tier. Never fail. If missing, mark needs_clarification
so the owner can request a signed acknowledgment before contract execution.
rfp.mandatory_requirements.addenda_acknowledgment_required
is explicitly true AND the bid contradicts or refuses addenda terms.Prudent-evaluator tier. Never fail. A missing declaration is clarifiable; a declaration present but contradicted by evidence of collusion is a separate matter (escalate to the owner's counsel).
rfp.mandatory_requirements.non_collusion_declaration_required
is explicitly true AND the declaration is not signed after clarification.A reference is comparable to this project if ALL three hold:
Write your results to a sidecar JSON file so the technical-review skill can run in parallel without clobbering your writes:
Path: <rfp-dir>/roof-review-output/manifests/bid_<slug>.qual.json
Shape:
{
"bidder_id": "<same as base bid manifest>",
"mandatory_gates": { "<gate_name>": { "result": "...", "evidence": "...", "notes": "..." } },
"scores": {
"experience_references": <0-100>,
"qualifications_certifications": <0-100>,
"schedule": <0-100>
},
"scoring_rationale": {
"experience_references": { "sub_factors": { "...": <points> } },
"qualifications_certifications": { "sub_factors": { "...": <points> } },
"schedule": { "sub_factors": { "...": <points> } }
},
"red_flags": [
{ "severity": "...", "category": "qualifications", "description": "...", ... }
]
}
Do NOT touch the base bid_<slug>.json — the technical-review skill is
writing bid_<slug>.tech.json concurrently and scripts/normalize.py will
merge all three files. A write to bid_<slug>.json from this skill is a bug.
Keys this sidecar MAY contain: bidder_id, mandatory_gates, scores,
scoring_rationale, red_flags (only category: "qualifications").
Keys this sidecar MUST NOT contain: scores.technical_approach,
scores.warranty_materials, any mandatory_gates entry from the technical
table in roof-technical-review (scope_compliance, membrane_thickness,
cover_board, insulation_upgrade, warranty_type, warranty_duration,
completion_date, mobilization_date, fire_rating, wind_uplift), or any
red_flags with a category other than qualifications.
Write each gate result into the sidecar file's mandatory_gates.<gate_name>:
{
"result": "pass|fail|needs_clarification",
"evidence": "page reference + what was found or missing",
"notes": "any calibration comments"
}
This skill owns exactly one red_flags.category value: qualifications. Everything warranty/materials/safety/scope/substitutions belongs to roof-technical-review — do not write those categories here even if you notice the issue. If a single problem has two aspects (e.g., a lapsed certification that also affects warranty eligibility), record the qualifications aspect here and let technical-review record the warranty aspect.
In addition to gate results, append qualitative flags to bid.red_flags[] with category: "qualifications" for issues that don't rise to a fail but warrant owner attention:
Produce raw sub-scores (0-100) for the three rated criteria this skill owns. Each is computed as the sum of sub-factor points, not a single anchor match. Record the per-sub-factor points in bid.scoring_rationale.<sub_score>.sub_factors so the audit trail shows the math.
experience_references (sum of three sub-factors, max 100)| Sub-factor | Points | Criterion |
|---|---|---|
| Count of comparable references (Gate 8 definition) | 0 | zero comparable |
| 20 | 1-2 comparable | |
| 40 | 3-4 comparable | |
| 60 | 5+ comparable | |
| Recency of most-recent comparable reference | 0 | >5 yrs or none |
| 10 | 3-5 yrs | |
| 20 | 1-2 yrs | |
| 25 | <1 yr | |
| Verifiability (named contact, value, date, photo/contact for site) | 0 | missing most fields |
| 8 | partial (contact only, or value only) | |
| 15 | complete on every reference |
If experience_references = 0 and RFP minimum reference count is unmet, the bid fails Gate 8 (handled there, not here).
qualifications_certifications (sum of four sub-factors, max 100)| Sub-factor | Points | Criterion |
|---|---|---|
Years in business (from qualifications.years_in_business) | 0 | <5 yrs |
| 15 | 5-9 yrs | |
| 25 | 10-14 yrs | |
| 35 | 15+ yrs | |
| Manufacturer certification at or above warranty tier claimed | 0 | none |
| 15 | certified at required tier with one manufacturer | |
| 25 | multiple manufacturer certifications | |
| 30 | top-tier program (e.g., GAF Master Elite, Soprema PAQ+S, Firestone Platinum Master Contractor) | |
| Skilled Trades C of Q crew | 0 | none identified |
| 10 | foreman only | |
| 15 | majority of crew | |
| 20 | full crew | |
| Industry membership | 0 | none |
| 8 | regional/provincial association | |
| 15 | CRCA member |
schedule (sum of four sub-factors, max 100)| Sub-factor | Points | Criterion |
|---|---|---|
| Timeline realism vs scope | 0 | unrealistic or absent |
| 15 | aggressive with thin justification | |
| 30 | realistic duration | |
| 40 | detailed phase sequencing + milestones | |
| Crew adequacy | 0 | crew size not stated |
| 15 | minimum crew for scope | |
| 20 | adequate + named foreman | |
| 25 | multiple crews / surge capacity for occupied buildings | |
| Mobilization and completion dates vs RFP | 0 | misses RFP dates |
| 10 | meets substantial completion only | |
| 20 | meets both mobilization and completion | |
| Occupied-building accommodation (auto-15 if building is vacant — do not penalize) | 0 | not addressed |
| 8 | generic after-hours / dust commitments | |
| 15 | named tenant-coordination plan + communication protocol |
The three-tier model (compliant / conditional / non_compliant) is
computed in scripts/score.py::compliance_status(). Do not reimplement
compliance logic here — emit gate results and let the scoring pipeline
assemble the tier. Cross-bid uniformity and applicability are audited by
scripts/reconcile_gates.py after scoring.
Provides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
npx claudepluginhub reggiechan74/021-cre-150 --plugin roof-replacement-review