| name | icp-grading |
| description | Self-grades the full ICP refinement output against a 100-point rubric covering data foundation, pattern discovery, filter runnability, buyer voice, and decision readiness. Identifies the two weakest dimensions and triggers targeted re-runs of the matching steps. Use after pocket packaging or when iterating an existing ICP output toward A+. |
ICP grading + iteration
Run by the icp-grader subagent (independent grader — see agents/icp-grader.md). The orchestrator should not grade its own work.
Inputs
./icp-output/ICP.md
./icp-output/pockets/*.md
./icp-output/personas/*.md
./icp-output/triggers/distribution.md
./icp-output/enrichment/company-attributes.md
./icp-output/priority-matrix.md
./icp-output/anti-icp.md
- A sample of
./icp-output/calls/ — to verify provenance of quotes
Grading
Use the rubric in rubric.md. 100 total points across 5 sections. Save the report to ./icp-output/grades/<ISO-timestamp>.md with this structure:
# ICP grade — <timestamp>
**Composite: <score>/100 — <letter grade>**
Iteration: <n>
## Section scores
- A. Data Foundation: <score>/20
- B. Pattern Discovery: <score>/25
- C. Filter Runnability: <score>/20
- D. Buyer Voice: <score>/15
- E. Decision Readiness: <score>/20
## What's working
<bullets>
## Weakest two dimensions
1. **<dimension name>** (<score>/<max>) — <specific evidence: file path + line reference + the issue>. Recommended fix: <specific>.
2. **<dimension name>** — same.
## Recommended re-runs
- <skill name> with <specific guidance>
- ...
## Provenance spot checks (5 random)
- Quote in `pockets/<x>.md` line <n>: traced to `calls/<id>.md` ✓
- ...
## Stop / continue
- If composite ≥ 95 → STOP. Output is A+.
- If composite < 95 and iteration < 3 → re-run weakest dimensions.
- If composite < 95 and iteration ≥ 3 and no improvement vs. previous grade → SURFACE BLOCKER. Likely missing data, not method.
Iteration logic (orchestrator's job, not the grader's)
After a grade lands, the orchestrator decides:
- A+ (≥95): Done. Exit.
- A (90–94): Optionally do one more round on the weakest dimension only. Don't loop forever.
- B (80–89) or below: Mandatory re-run of the two weakest dimensions. Re-grade.
- Plateau (no improvement vs. previous grade ± 2 pts): Surface the blocker to the user. Common blockers:
- Insufficient call volume (extend window or accept lower confidence)
- No enrichment access (recommend Clay or Apollo trial)
- No CRM data (priority matrix loses ACV signal)
Mapping from rubric dimension to skill
| Weak dimension | Re-run skill | Specific action |
|---|
| Per-call extraction completeness | call-mining | Re-extract failing call subset with tighter prompt |
| Verbatim quote preservation | call-mining | Re-extract; explicitly forbid paraphrase |
| Persona distinctiveness | persona-clustering | Re-cluster; force split on triggers |
| Trigger specificity | trigger-analysis | Re-tag with stricter event-not-want rule |
| Hidden pocket discovery | persona-clustering + trigger-analysis | Look at low-frequency clusters explicitly |
| Title precision | enrichment | Add exclusions; tighten seniority |
| Firmographic combinations | enrichment | Test 2-attribute → 4-attribute combinations explicitly |
| Tech / behavioral signal | enrichment | Pull tech stack + hiring data, not just firmographic |
| Value prop authenticity | pocket-packaging | Replace any synthesized hook with verbatim quote |
| Named example density | pocket-packaging | Pull more calls/ files; require ≥3 per pocket |
| Priority matrix | priority-matrix | Re-score with CRM data joined |
| Action implications | priority-matrix | Add archetype per pocket |
| Anti-ICP / disqualifiers | pocket-packaging + priority-matrix | Mine stalled/lost calls explicitly |
Provenance check (every iteration)
Spot-check 5 random quotes in pocket files. For each, open the referenced calls/<id>.md and verify the quote is there verbatim. If any fail: penalize Buyer Voice by 5 points and re-run pocket-packaging with strict provenance.
State update
{
"step": "grading",
"step_status": "completed",
"iteration": <n>,
"last_grade": <score>,
"letter": "A+|A|B|C|D",
"weakest_dims": ["...", "..."]
}