Use when producing a weighted MCDA scoring matrix across multiple roofing bids after mandatory gates and technical review are complete. Invokes the Python scoring engine, populates scores and rank, and renders the scoring matrix markdown.
How this skill is triggered — by the user, by Claude, or both
Slash command
/roof-replacement-review:roof-score-matrixThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are producing the cross-bid scoring matrix after the qualification-check and technical-review skills have populated sub-scores and gate results. This skill is deterministic — it delegates the math to `scripts/score.py`.
You are producing the cross-bid scoring matrix after the qualification-check and technical-review skills have populated sub-scores and gate results. This skill is deterministic — it delegates the math to scripts/score.py.
fixtures/domain_knowledge/03_tender_evaluation_methodology.md §3 — MCDA weighting patterns, price scoring formulas, 5-point rubric anchorsVerify preconditions. The manifest must have:
rfp.evaluation_criteria.weighting populatedmandatory_gates populated (from qualification-check)scores.technical_approach, scores.warranty_materials, scores.experience_references, scores.qualifications_certifications, scores.schedulepricing.base_bid_cadIf any missing, run the upstream skill or stop and tell the user what's missing.
Invoke the scoring engine. If the user supplied an evaluation_config.yaml (via config=<path> argument to the command), pass it with --config:
python3 "$CLAUDE_PLUGIN_ROOT/scripts/score.py" --manifest <tender_manifest.json> [--config <evaluation_config.yaml>]
Config overrides the RFP's weighting and/or price_scoring_method — useful when the owner wants to reweight for project type (occupied, heritage, BPS) without editing the parsed RFP. The engine validates that weights sum to 100 and records the source in manifest.rfp.evaluation_criteria.weighting_source for audit.
This:
(lowest/this) × 100)comparison.price_low_cad, price_high_cad, price_spread_percent, compliant_bidders_count, recommended_bidder_id back to the manifestProduce scoring rationale. For each ranked bid, write to bid.scoring_rationale:
strengths: top 2-3 sub-scores with brief justificationweaknesses: weakest 1-2 sub-scores with brief justificationdifferentiator: the single factor that most separates this bid from its neighbour in the rankingRender the matrix. Prefer the deterministic path:
python3 "$CLAUDE_PLUGIN_ROOT/scripts/render_matrix.py" \
--manifest <tender_manifest.json> \
--out <manifest-dir>/../scoring_matrix.md
If scoring_matrix.md already exists (the /roof-review command typically produces it in step 5), read it and refine only if the mechanical output reads awkwardly. Do not regenerate from scratch. Leave numbers and structure alone — they are authoritative. Only touch rationale prose if the pulled scoring_rationale text reads poorly.
Before running the engine, verify sum(weighting.values()) == 100. If not, raise an error and tell the user which criterion to adjust.
If price_spread_percent > 15, flag to the owner in the matrix rendering that:
Scope divergence or low-bid risk is likely. Recommend reviewing the red flag report cross-bid section before award.
(Per fixture 03 §4 — 15% threshold is the CCA industry heuristic for bid outliers.)
scoring_matrix.md rendered from templatenpx claudepluginhub reggiechan74/021-cre-150 --plugin roof-replacement-reviewProvides 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.