RFP Fit Assessment (Go / No-Go)
Step 2 in the RFP Agent Swarm. After rfp-intake has parsed the RFP into
structured metadata and a classified task list, this skill runs a transparent,
weighted qualification scorecard and assembles a one-page Go/No-Go memo so a
human owner can make an informed bid decision fast.
When to Use
Invoke this skill when any of the following are true:
- A new RFP has just completed
rfp-intake and a bid/no-bid decision is
required before proposal work begins.
- An Account Executive (AE) or Proposal Lead asks for a "fit score",
"qualification", or "should we bid" analysis on a specific opportunity.
- Leadership needs a standardised one-page memo to approve or decline pursuit.
- The answer-bank match rate needs to be estimated BEFORE committing SME hours.
- The team wants a reusable scorecard artefact to attach to CRM opportunity
records for audit and retrospective analysis.
When NOT to Use
| Situation |
Use instead |
| Raw PDF / DOCX still needs parsing |
rfp-intake |
| Drafts need answers generated |
rfp-respond |
| Drafts need quality / compliance checks |
rfp-gates |
| Human reviewer feedback to capture |
rfp-review |
| Assembling the final submission doc |
rfp-assemble |
| Maintaining reusable Q/A library |
rfp-answer-bank |
| Autonomous bid/no-bid decision with no human |
NOT SUPPORTED — this skill is advisory only |
Quick Start (Worked Example)
Scenario: rfp-intake has just produced working/rfp_metadata.json and
working/task_list.json for "Acme HealthCo — Patient Portal Modernisation RFP,
deadline 2026-05-20, 142 questions".
User: "Run fit assessment on the Acme HealthCo RFP"
Claude:
1. Load working/rfp_metadata.json + working/task_list.json (from rfp-intake)
2. Pull bank_stats.json from rfp-answer-bank (historical match rates)
3. python scripts/kb_match_estimator.py
--task-list working/task_list.json
--bank-stats working/bank_stats.json
--output working/kb_match_estimate.json
=> overall_estimate_pct: 68, confidence: MEDIUM
4. Prompt human / AE for dimension scores 0-5 (technical, commercial,
competitive, strategic, resource, deadline) — store in scorecard.json
5. python scripts/compute_fit_score.py
--scorecard working/scorecard.json
--output working/fit_result.json
=> weighted total 71.5 -> band: CONDITIONAL
6. python scripts/generate_go_no_go_memo.py
--fit working/fit_result.json
--kb working/kb_match_estimate.json
--metadata working/rfp_metadata.json
--template assets/go-no-go-memo-template.md
--output working/go_no_go_memo.md
7. Render Adaptive Card via render-ui (KPI row + risk donut + recommendation)
8. (Optional) Hand working/go_no_go_memo.md to docx skill -> exec Word memo
9. (Optional) Hand working/fit_result.json to xlsx skill -> detailed
scorecard workbook with per-dimension evidence
Human decision owner (default: VP Sales) signs the memo. Only after sign-off
does rfp-respond begin.
Core Instructions / Workflow
Step-by-Step
- Ingest intake outputs. Read
rfp_metadata.json and task_list.json
produced by rfp-intake. If missing, STOP and route the user back to
rfp-intake.
- Estimate KB match rate. Run
scripts/kb_match_estimator.py against the
task list and answer-bank historical stats. Record overall_estimate_pct
and confidence.
- Gather dimension scores (0-5) from the AE / Proposal Lead. Use the
rubric in
references/fit-scoring-rubric.md. KB-match dimension is
pre-filled from step 2; the remaining six are human-supplied but rubric-
anchored.
- Run the kill-criteria check. See
references/fit-scoring-rubric.md
section "Kill Criteria". If ANY fire, flag on the memo — human still
confirms.
- Compute weighted score. Run
scripts/compute_fit_score.py. Output
band: Go (>=75), Conditional (50-74), No-Go (<50) — ADVISORY ONLY.
- Identify top risks & mitigations. Pull from the dimension evidence
fields; cross-reference
references/competitive-positioning-playbook.md.
- Generate memo. Run
scripts/generate_go_no_go_memo.py with
assets/go-no-go-memo-template.md.
- Render summary card via
render-ui (built-in) for quick review.
- Produce exec artefacts (optional): one-page Word memo via
docx;
detailed workbook via xlsx.
- Route for human sign-off. Named owner per
references/go-no-go-decision-criteria.md RACI table.
Scorecard Dimensions & Weights
| Dimension |
Weight |
Source |
Rubric anchor |
| KB Match Rate (estimated) |
25% |
kb_match_estimator.py + rfp-answer-bank |
references/fit-scoring-rubric.md §1 |
| Technical Fit |
20% |
Product / SE input |
§2 |
| Commercial Fit |
15% |
AE / Deal Desk |
§3 |
| Competitive Positioning |
10% |
AE + competitive-positioning-playbook.md |
§4 |
| Strategic Alignment |
10% |
Sales leadership |
§5 |
| Resource Availability |
10% |
Proposal Ops |
§6 |
| Deadline Feasibility |
10% |
Task list hours vs runway |
§7 |
| Total |
100% |
— |
— |
Weights MUST sum to 100; compute_fit_score.py enforces this.
Recommendation Bands
| Score |
Band |
Default action |
Human override? |
| >=75 |
Go |
Proceed to rfp-respond |
Yes — strategic No-Go still allowed |
| 50-74 |
Conditional |
AE clarifies open questions, re-score |
Yes — logo value can lift to Go |
| <50 |
No-Go |
Decline politely; log lessons |
Yes — exec override requires written justification |
Kill Criteria (Auto-Flag, Still Human-Confirmed)
See full table in references/fit-scoring-rubric.md. Examples:
- Mandatory certification we do not hold (e.g. FedRAMP High).
- Onsite / in-country data residency we cannot provide.
- Deal value below the commercial floor defined in Deal Desk policy.
- Exclusive incumbent relationship with a hard-locked renewal.
Built-In Skills Used
| Cowork Skill |
How this skill uses it |
| Adaptive Cards |
Scorecard dashboard: KPI row (weighted_total, recommendation badge, confidence), radar/bar chart across 7 dimensions, FactSet of top strengths/risks, decision action buttons |
| Word |
One-page Go/No-Go memo for exec sign-off (rendered from working/go_no_go_memo.md) |
| Excel |
Detailed scoring workbook (per-dimension scores, weights, evidence, kill-criteria flags); also used to append rows to the shared audit-log.xlsx and to read KB exports for match estimation |
| Enterprise Search |
Retrieve prior deal notes, competitor intel, past RFP outcomes with same buyer |
| Deep Research |
Public buyer signals (press, filings, announcements, deep competitive analysis) to inform strategic alignment and competitive positioning scores |
| Email |
Route finished memo + card to the named decision owner and AE |
| Calendar Management |
Book the Go/No-Go decision meeting if score is in the Conditional band |
| Communications |
Brief the AE / Proposal Lead in-channel with the recommendation summary |
No other built-ins are required. Do NOT invoke PDF, PowerPoint, Meetings,
Scheduling, Daily Briefing, or M365 Search for this step unless explicitly asked.
Audit Log
This skill appends events to the shared RFP audit log at
output/rfp-<rfp_id>/audit-log.xlsx. Rows are appended via the Excel
built-in skill; the schema itself is owned by rfp-answer-bank.
| Event Type |
When |
Actor |
Key fields |
FIT_ASSESSMENT_STARTED |
Skill invoked |
AI |
rfp_id |
SCORECARD_COMPUTED |
Scores computed across 7 dimensions |
AI |
kb_match, tech_fit, commercial_fit, competitive, strategic, resource, deadline, weighted_total |
GO_NO_GO_RECOMMENDED |
Recommendation generated |
AI |
recommendation (Go/No-Go), rationale |
HUMAN_DECISION_LOGGED |
Human makes final call |
human |
decision (Go/No-Go/Deferred), decision_maker, decision_rationale |
- Schema reference:
audit-log-schema.md
- Append helper (owned by
rfp-answer-bank): append_audit.py
- Note: rows are appended via the Excel built-in; the schema and helper
script are owned by
rfp-answer-bank — do not fork or duplicate the schema
here.
Adaptive Card Dashboard
After compute_fit_score.py produces working/fit_result.json, this skill
renders a scorecard dashboard via the Adaptive Cards built-in. The card
is the primary human-facing review surface before sign-off.
Card layout:
- KPI row —
weighted_total score, recommendation badge (Go / No-Go /
Conditional), confidence label from the KB-match estimator.
- Radar / bar chart — all 7 dimensions plotted with their 0-5 scores:
KB Match, Technical Fit, Commercial Fit, Competitive Positioning, Strategic
Alignment, Resource Availability, Deadline Feasibility.
- FactSet — top 3 strengths (dimensions scoring >=4 with evidence) and
top 3 risks (dimensions scoring <=2, or any kill-criterion flag).
- Action buttons —
Approve — proceed to drafting (unlocks rfp-respond)
Decline
Defer for exec review
After the human clicks an action button, this skill writes a
HUMAN_DECISION_LOGGED event to output/rfp-<rfp_id>/audit-log.xlsx with
the decision, decision_maker, and decision_rationale captured from the
card submission.
Output Deliverables
| Output |
Format |
Producer |
Consumer |
working/kb_match_estimate.json |
JSON |
scripts/kb_match_estimator.py |
memo generator; card |
working/fit_result.json |
JSON |
scripts/compute_fit_score.py |
memo generator; xlsx |
working/go_no_go_memo.md |
Markdown |
scripts/generate_go_no_go_memo.py (+ assets/go-no-go-memo-template.md) |
Word built-in; human |
| Adaptive Card |
JSON payload |
Adaptive Cards built-in |
Human reviewer in chat |
working/go_no_go_memo.docx |
Word |
Word built-in |
Exec decision owner |
working/fit_scorecard.xlsx |
Excel |
Excel built-in |
Proposal Ops archive / CRM |
output/rfp-<rfp_id>/audit-log.xlsx |
Excel (append) |
Excel built-in via append_audit.py |
Shared audit trail (all RFP skills) |
Guardrails
- The system does not decide. Ever. Every output surfaces a named human
decision owner. The score is a recommendation band, not an instruction.
- No freeform AI memo content.
generate_go_no_go_memo.py performs
PURE template substitution on assets/go-no-go-memo-template.md. Do not
rewrite, embellish, or omit placeholders.
- KB match is an ESTIMATE. Always label it "estimated" on the memo and
card. True match rate is only known after
rfp-respond runs.
- Weights must sum to 100.
compute_fit_score.py validates and exits
non-zero on mismatch. Do not silently normalise.
- Kill criteria are flags, not auto-declines. Flag prominently on the
memo; the human still signs.
- No external API calls from scripts. Python 3 stdlib only. Any retrieval
happens via built-in
Enterprise Search / Deep Research in the agent
loop, not inside scripts.
- Evidence required. Any dimension score below 2 or above 4 MUST include
an evidence string (1-2 sentences) referenced in the memo.
- Audit trail. Persist
working/scorecard.json and fit_result.json
alongside the memo. The xlsx artefact is the archival record.
Common Issues
| Symptom |
Likely cause |
Resolution |
compute_fit_score.py exits with "weights do not sum to 100" |
Manually edited weight in scorecard.json |
Restore defaults from rubric table; re-run |
KB match estimate flagged confidence: LOW |
Fewer than 20 historical analogues in bank_stats.json |
Proceed but mark estimate as provisional; re-check after rfp-respond |
Memo has literal [PLACEHOLDER] tokens left |
Missing field in fit_result.json or rfp_metadata.json |
Re-run upstream step; do NOT hand-edit the memo |
| Score lands at 74 (just under Go) |
Conditional band; score is sensitive to one dimension |
Re-examine that dimension's evidence; do not round up |
| Kill criterion fires but AE wants to proceed |
Strategic override by exec |
Document written justification in memo Risks & Mitigations; require VP+ sign-off |
| Adaptive Card shows empty risk donut |
No risks populated in fit_result.json.risks[] |
Confirm dimensions <3 have evidence strings; risks auto-derive from those |
| Two reviewers produce very different scores on same dimension |
Rubric anchor not applied |
Use worked example in references/fit-scoring-rubric.md §"Calibration" |
| Deadline feasibility score inconsistent with task list hours |
Task list stale |
Re-run rfp-intake parse; recompute runway in hours |
Related Skills
| Skill |
Relationship |
rfp-intake |
Upstream. Produces rfp_metadata.json + task_list.json consumed here. |
rfp-answer-bank |
Upstream substrate. Provides historical match statistics used by kb_match_estimator.py; owns the audit-log schema. |
rfp-respond |
Downstream. Only runs AFTER a Go decision here. |
rfp-gates |
Downstream of respond. Quality/compliance gates on drafts. |
rfp-review |
Downstream. Captures human reviewer corrections. |
rfp-assemble |
Downstream. Builds the final submission document. |
RFP chain
rfp-intake -> rfp-fit-assessment (THIS SKILL) -> rfp-respond -> rfp-gates -> rfp-review -> rfp-assemble
|
+-- rfp-answer-bank (substrate across all steps: KB, audit log, match stats)
- This skill consumes
rfp-intake's task list (working/task_list.json)
and rfp-answer-bank's KB match-rate estimate (bank_stats.json +
kb_match_estimator.py).
- Its approval unlocks
rfp-respond — no drafting begins until the
human signs the Go/No-Go memo and HUMAN_DECISION_LOGGED is written with
decision = Go.
rfp-answer-bank is the shared substrate: it owns the knowledge base, the
audit-log schema, and the append_audit.py helper consumed by every step
in the chain.
Cowork built-ins leveraged
| Built-in |
How this skill leverages it |
| Excel |
Append rows to audit-log.xlsx; read KB exports from rfp-answer-bank for match-rate estimation; emit detailed fit_scorecard.xlsx for archive/CRM |
| Adaptive Cards |
Scorecard dashboard (KPI row, 7-dimension chart, strengths/risks FactSet, decision action buttons) |
| Enterprise Search |
Competitive context, prior-deal notes, buyer history |
| Deep Research |
Deep competitive analysis and public buyer signals feeding the strategic + competitive dimensions |
| Word |
One-page Go/No-Go memo output for exec sign-off |
| Communications |
Brief the AE / Proposal Lead in-channel with the recommendation summary |
References
references/fit-scoring-rubric.md
— dimension-by-dimension 0-5 anchors, weighting formula, worked example,
kill criteria.
references/go-no-go-decision-criteria.md
— decision matrix, stakeholder RACI, escalation timing, common patterns,
AE question templates.
references/competitive-positioning-playbook.md
— incumbent/competitor inference, win-theme mapping, enrichment via
Enterprise Search & Deep Research.
Scripts
scripts/compute_fit_score.py
— weighted scorecard computation; emits band + per-dimension contributions.
scripts/kb_match_estimator.py
— estimates % of questions answerable from the answer bank.
scripts/generate_go_no_go_memo.py
— deterministic template substitution to produce the Go/No-Go memo.
Assets
assets/go-no-go-memo-template.md
— exec-brief one-page memo template with [PLACEHOLDER] tokens.
Source: ITSpecialist111/Copilot-Cowork-Skills — distributed by TomeVault.
1---2name: itspecialist111-copilot-cowork-skills-copilot-cowork-skills3description: RFP Fit Assessment (Go / No-Go)4---56# RFP Fit Assessment (Go / No-Go)78Step 2 in the RFP Agent Swarm. After `rfp-intake` has parsed the RFP into9structured metadata and a classified task list, this skill runs a transparent,10weighted qualification scorecard and assembles a one-page Go/No-Go memo so a11human owner can make an informed bid decision fast.1213---1415## When to Use1617Invoke this skill when any of the following are true:1819- A new RFP has just completed `rfp-intake` and a bid/no-bid decision is20 required before proposal work begins.21- An Account Executive (AE) or Proposal Lead asks for a "fit score",22 "qualification", or "should we bid" analysis on a specific opportunity.23- Leadership needs a standardised one-page memo to approve or decline pursuit.24- The answer-bank match rate needs to be estimated BEFORE committing SME hours.25- The team wants a reusable scorecard artefact to attach to CRM opportunity26 records for audit and retrospective analysis.2728## When NOT to Use2930| Situation | Use instead |31|---|---|32| Raw PDF / DOCX still needs parsing | `rfp-intake` |33| Drafts need answers generated | `rfp-respond` |34| Drafts need quality / compliance checks | `rfp-gates` |35| Human reviewer feedback to capture | `rfp-review` |36| Assembling the final submission doc | `rfp-assemble` |37| Maintaining reusable Q/A library | `rfp-answer-bank` |38| Autonomous bid/no-bid decision with no human | NOT SUPPORTED — this skill is advisory only |3940---4142## Quick Start (Worked Example)4344Scenario: `rfp-intake` has just produced `working/rfp_metadata.json` and45`working/task_list.json` for "Acme HealthCo — Patient Portal Modernisation RFP,46deadline 2026-05-20, 142 questions".4748```text49User: "Run fit assessment on the Acme HealthCo RFP"5051Claude:52 1. Load working/rfp_metadata.json + working/task_list.json (from rfp-intake)53 2. Pull bank_stats.json from rfp-answer-bank (historical match rates)54 3. python scripts/kb_match_estimator.py55 --task-list working/task_list.json56 --bank-stats working/bank_stats.json57 --output working/kb_match_estimate.json58 => overall_estimate_pct: 68, confidence: MEDIUM59 4. Prompt human / AE for dimension scores 0-5 (technical, commercial,60 competitive, strategic, resource, deadline) — store in scorecard.json61 5. python scripts/compute_fit_score.py62 --scorecard working/scorecard.json63 --output working/fit_result.json64 => weighted total 71.5 -> band: CONDITIONAL65 6. python scripts/generate_go_no_go_memo.py66 --fit working/fit_result.json67 --kb working/kb_match_estimate.json68 --metadata working/rfp_metadata.json69 --template assets/go-no-go-memo-template.md70 --output working/go_no_go_memo.md71 7. Render Adaptive Card via render-ui (KPI row + risk donut + recommendation)72 8. (Optional) Hand working/go_no_go_memo.md to docx skill -> exec Word memo73 9. (Optional) Hand working/fit_result.json to xlsx skill -> detailed74 scorecard workbook with per-dimension evidence75```7677Human decision owner (default: VP Sales) signs the memo. Only after sign-off78does `rfp-respond` begin.7980---8182## Core Instructions / Workflow8384### Step-by-Step85861. **Ingest intake outputs.** Read `rfp_metadata.json` and `task_list.json`87 produced by `rfp-intake`. If missing, STOP and route the user back to88 `rfp-intake`.892. **Estimate KB match rate.** Run `scripts/kb_match_estimator.py` against the90 task list and answer-bank historical stats. Record `overall_estimate_pct`91 and `confidence`.923. **Gather dimension scores (0-5) from the AE / Proposal Lead.** Use the93 rubric in `references/fit-scoring-rubric.md`. KB-match dimension is94 pre-filled from step 2; the remaining six are human-supplied but rubric-95 anchored.964. **Run the kill-criteria check.** See `references/fit-scoring-rubric.md`97 section "Kill Criteria". If ANY fire, flag on the memo — human still98 confirms.995. **Compute weighted score.** Run `scripts/compute_fit_score.py`. Output100 band: Go (>=75), Conditional (50-74), No-Go (<50) — ADVISORY ONLY.1016. **Identify top risks & mitigations.** Pull from the dimension evidence102 fields; cross-reference `references/competitive-positioning-playbook.md`.1037. **Generate memo.** Run `scripts/generate_go_no_go_memo.py` with104 `assets/go-no-go-memo-template.md`.1058. **Render summary card** via `render-ui` (built-in) for quick review.1069. **Produce exec artefacts** (optional): one-page Word memo via `docx`;107 detailed workbook via `xlsx`.10810. **Route for human sign-off.** Named owner per109 `references/go-no-go-decision-criteria.md` RACI table.110111### Scorecard Dimensions & Weights112113| Dimension | Weight | Source | Rubric anchor |114|---|---|---|---|115| KB Match Rate (estimated) | 25% | `kb_match_estimator.py` + `rfp-answer-bank` | `references/fit-scoring-rubric.md` §1 |116| Technical Fit | 20% | Product / SE input | §2 |117| Commercial Fit | 15% | AE / Deal Desk | §3 |118| Competitive Positioning | 10% | AE + `competitive-positioning-playbook.md` | §4 |119| Strategic Alignment | 10% | Sales leadership | §5 |120| Resource Availability | 10% | Proposal Ops | §6 |121| Deadline Feasibility | 10% | Task list hours vs runway | §7 |122| **Total** | **100%** | — | — |123124Weights MUST sum to 100; `compute_fit_score.py` enforces this.125126### Recommendation Bands127128| Score | Band | Default action | Human override? |129|---|---|---|---|130| >=75 | **Go** | Proceed to `rfp-respond` | Yes — strategic No-Go still allowed |131| 50-74 | **Conditional** | AE clarifies open questions, re-score | Yes — logo value can lift to Go |132| <50 | **No-Go** | Decline politely; log lessons | Yes — exec override requires written justification |133134### Kill Criteria (Auto-Flag, Still Human-Confirmed)135136See full table in `references/fit-scoring-rubric.md`. Examples:137138- Mandatory certification we do not hold (e.g. FedRAMP High).139- Onsite / in-country data residency we cannot provide.140- Deal value below the commercial floor defined in Deal Desk policy.141- Exclusive incumbent relationship with a hard-locked renewal.142143---144145## Built-In Skills Used146147| Cowork Skill | How this skill uses it |148|---|---|149| Adaptive Cards | Scorecard dashboard: KPI row (weighted_total, recommendation badge, confidence), radar/bar chart across 7 dimensions, FactSet of top strengths/risks, decision action buttons |150| Word | One-page Go/No-Go memo for exec sign-off (rendered from `working/go_no_go_memo.md`) |151| Excel | Detailed scoring workbook (per-dimension scores, weights, evidence, kill-criteria flags); also used to append rows to the shared `audit-log.xlsx` and to read KB exports for match estimation |152| Enterprise Search | Retrieve prior deal notes, competitor intel, past RFP outcomes with same buyer |153| Deep Research | Public buyer signals (press, filings, announcements, deep competitive analysis) to inform strategic alignment and competitive positioning scores |154| Email | Route finished memo + card to the named decision owner and AE |155| Calendar Management | Book the Go/No-Go decision meeting if score is in the Conditional band |156| Communications | Brief the AE / Proposal Lead in-channel with the recommendation summary |157158No other built-ins are required. Do NOT invoke `PDF`, `PowerPoint`, `Meetings`,159`Scheduling`, `Daily Briefing`, or `M365 Search` for this step unless explicitly asked.160161---162163## Audit Log164165This skill appends events to the shared RFP audit log at166`output/rfp-<rfp_id>/audit-log.xlsx`. Rows are appended via the **Excel**167built-in skill; the schema itself is owned by `rfp-answer-bank`.168169| Event Type | When | Actor | Key fields |170|---|---|---|---|171| `FIT_ASSESSMENT_STARTED` | Skill invoked | AI | `rfp_id` |172| `SCORECARD_COMPUTED` | Scores computed across 7 dimensions | AI | `kb_match`, `tech_fit`, `commercial_fit`, `competitive`, `strategic`, `resource`, `deadline`, `weighted_total` |173| `GO_NO_GO_RECOMMENDED` | Recommendation generated | AI | `recommendation` (Go/No-Go), `rationale` |174| `HUMAN_DECISION_LOGGED` | Human makes final call | human | `decision` (Go/No-Go/Deferred), `decision_maker`, `decision_rationale` |175176- Schema reference: [`audit-log-schema.md`](../rfp-answer-bank/references/audit-log-schema.md)177- Append helper (owned by `rfp-answer-bank`): [`append_audit.py`](../rfp-answer-bank/scripts/append_audit.py)178- Note: rows are appended via the **Excel** built-in; the schema and helper179 script are owned by `rfp-answer-bank` — do not fork or duplicate the schema180 here.181182---183184## Adaptive Card Dashboard185186After `compute_fit_score.py` produces `working/fit_result.json`, this skill187renders a scorecard dashboard via the **Adaptive Cards** built-in. The card188is the primary human-facing review surface before sign-off.189190Card layout:191192- **KPI row** — `weighted_total` score, recommendation badge (Go / No-Go /193 Conditional), confidence label from the KB-match estimator.194- **Radar / bar chart** — all 7 dimensions plotted with their 0-5 scores:195 KB Match, Technical Fit, Commercial Fit, Competitive Positioning, Strategic196 Alignment, Resource Availability, Deadline Feasibility.197- **FactSet** — top 3 strengths (dimensions scoring >=4 with evidence) and198 top 3 risks (dimensions scoring <=2, or any kill-criterion flag).199- **Action buttons** —200 - `Approve — proceed to drafting` (unlocks `rfp-respond`)201 - `Decline`202 - `Defer for exec review`203204After the human clicks an action button, this skill writes a205`HUMAN_DECISION_LOGGED` event to `output/rfp-<rfp_id>/audit-log.xlsx` with206the `decision`, `decision_maker`, and `decision_rationale` captured from the207card submission.208209---210211## Output Deliverables212213| Output | Format | Producer | Consumer |214|---|---|---|---|215| `working/kb_match_estimate.json` | JSON | `scripts/kb_match_estimator.py` | memo generator; card |216| `working/fit_result.json` | JSON | `scripts/compute_fit_score.py` | memo generator; xlsx |217| `working/go_no_go_memo.md` | Markdown | `scripts/generate_go_no_go_memo.py` (+ `assets/go-no-go-memo-template.md`) | Word built-in; human |218| Adaptive Card | JSON payload | Adaptive Cards built-in | Human reviewer in chat |219| `working/go_no_go_memo.docx` | Word | Word built-in | Exec decision owner |220| `working/fit_scorecard.xlsx` | Excel | Excel built-in | Proposal Ops archive / CRM |221| `output/rfp-<rfp_id>/audit-log.xlsx` | Excel (append) | Excel built-in via `append_audit.py` | Shared audit trail (all RFP skills) |222223---224225## Guardrails2262271. **The system does not decide. Ever.** Every output surfaces a named human228 decision owner. The score is a recommendation band, not an instruction.2292. **No freeform AI memo content.** `generate_go_no_go_memo.py` performs230 PURE template substitution on `assets/go-no-go-memo-template.md`. Do not231 rewrite, embellish, or omit placeholders.2323. **KB match is an ESTIMATE.** Always label it "estimated" on the memo and233 card. True match rate is only known after `rfp-respond` runs.2344. **Weights must sum to 100.** `compute_fit_score.py` validates and exits235 non-zero on mismatch. Do not silently normalise.2365. **Kill criteria are flags, not auto-declines.** Flag prominently on the237 memo; the human still signs.2386. **No external API calls from scripts.** Python 3 stdlib only. Any retrieval239 happens via built-in `Enterprise Search` / `Deep Research` in the agent240 loop, not inside scripts.2417. **Evidence required.** Any dimension score below 2 or above 4 MUST include242 an evidence string (1-2 sentences) referenced in the memo.2438. **Audit trail.** Persist `working/scorecard.json` and `fit_result.json`244 alongside the memo. The xlsx artefact is the archival record.245246---247248## Common Issues249250| Symptom | Likely cause | Resolution |251|---|---|---|252| `compute_fit_score.py` exits with "weights do not sum to 100" | Manually edited weight in `scorecard.json` | Restore defaults from rubric table; re-run |253| KB match estimate flagged `confidence: LOW` | Fewer than 20 historical analogues in `bank_stats.json` | Proceed but mark estimate as provisional; re-check after `rfp-respond` |254| Memo has literal `[PLACEHOLDER]` tokens left | Missing field in `fit_result.json` or `rfp_metadata.json` | Re-run upstream step; do NOT hand-edit the memo |255| Score lands at 74 (just under Go) | Conditional band; score is sensitive to one dimension | Re-examine that dimension's evidence; do not round up |256| Kill criterion fires but AE wants to proceed | Strategic override by exec | Document written justification in memo `Risks & Mitigations`; require VP+ sign-off |257| Adaptive Card shows empty risk donut | No risks populated in `fit_result.json.risks[]` | Confirm dimensions <3 have evidence strings; risks auto-derive from those |258| Two reviewers produce very different scores on same dimension | Rubric anchor not applied | Use worked example in `references/fit-scoring-rubric.md` §"Calibration" |259| Deadline feasibility score inconsistent with task list hours | Task list stale | Re-run `rfp-intake` parse; recompute runway in hours |260261---262263## Related Skills264265| Skill | Relationship |266|---|---|267| `rfp-intake` | **Upstream.** Produces `rfp_metadata.json` + `task_list.json` consumed here. |268| `rfp-answer-bank` | **Upstream substrate.** Provides historical match statistics used by `kb_match_estimator.py`; owns the audit-log schema. |269| `rfp-respond` | **Downstream.** Only runs AFTER a Go decision here. |270| `rfp-gates` | **Downstream of respond.** Quality/compliance gates on drafts. |271| `rfp-review` | **Downstream.** Captures human reviewer corrections. |272| `rfp-assemble` | **Downstream.** Builds the final submission document. |273274### RFP chain275276```277rfp-intake -> rfp-fit-assessment (THIS SKILL) -> rfp-respond -> rfp-gates -> rfp-review -> rfp-assemble278 |279 +-- rfp-answer-bank (substrate across all steps: KB, audit log, match stats)280```281282- This skill **consumes** `rfp-intake`'s task list (`working/task_list.json`)283 and `rfp-answer-bank`'s KB match-rate estimate (`bank_stats.json` +284 `kb_match_estimator.py`).285- Its **approval unlocks `rfp-respond`** — no drafting begins until the286 human signs the Go/No-Go memo and `HUMAN_DECISION_LOGGED` is written with287 `decision = Go`.288- `rfp-answer-bank` is the shared substrate: it owns the knowledge base, the289 audit-log schema, and the `append_audit.py` helper consumed by every step290 in the chain.291292### Cowork built-ins leveraged293294| Built-in | How this skill leverages it |295|---|---|296| Excel | Append rows to `audit-log.xlsx`; read KB exports from `rfp-answer-bank` for match-rate estimation; emit detailed `fit_scorecard.xlsx` for archive/CRM |297| Adaptive Cards | Scorecard dashboard (KPI row, 7-dimension chart, strengths/risks FactSet, decision action buttons) |298| Enterprise Search | Competitive context, prior-deal notes, buyer history |299| Deep Research | Deep competitive analysis and public buyer signals feeding the strategic + competitive dimensions |300| Word | One-page Go/No-Go memo output for exec sign-off |301| Communications | Brief the AE / Proposal Lead in-channel with the recommendation summary |302303---304305## References306307- [`references/fit-scoring-rubric.md`](references/fit-scoring-rubric.md)308 — dimension-by-dimension 0-5 anchors, weighting formula, worked example,309 kill criteria.310- [`references/go-no-go-decision-criteria.md`](references/go-no-go-decision-criteria.md)311 — decision matrix, stakeholder RACI, escalation timing, common patterns,312 AE question templates.313- [`references/competitive-positioning-playbook.md`](references/competitive-positioning-playbook.md)314 — incumbent/competitor inference, win-theme mapping, enrichment via315 Enterprise Search & Deep Research.316317## Scripts318319- [`scripts/compute_fit_score.py`](scripts/compute_fit_score.py)320 — weighted scorecard computation; emits band + per-dimension contributions.321- [`scripts/kb_match_estimator.py`](scripts/kb_match_estimator.py)322 — estimates % of questions answerable from the answer bank.323- [`scripts/generate_go_no_go_memo.py`](scripts/generate_go_no_go_memo.py)324 — deterministic template substitution to produce the Go/No-Go memo.325326## Assets327328- [`assets/go-no-go-memo-template.md`](assets/go-no-go-memo-template.md)329 — exec-brief one-page memo template with `[PLACEHOLDER]` tokens.330331---332> Source: [ITSpecialist111/Copilot-Cowork-Skills](https://github.com/ITSpecialist111/Copilot-Cowork-Skills) — distributed by [TomeVault](https://tomevault.io).333<!-- tomevault:4.0:skill_md:2026-06-23 -->