From saber-skills
Set up native scoring — create a profile, translate signal templates into rules, and bulk-assign a list so fit and urgency scores compute automatically. Bridges the weighted model from generate-signals into the platform.
How this skill is triggered — by the user, by Claude, or both
Slash command
/saber-skills:configure-scoringThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Use this skill once per ICP / use case to wire up native scoring. After this runs, every assigned company or contact will have **fit** and **urgency** scores that auto-recompute when signals fire.
Use this skill once per ICP / use case to wire up native scoring. After this runs, every assigned company or contact will have fit and urgency scores that auto-recompute when signals fire.
For concept definitions (dimensions, profiles, rules, assignments, point-value shapes, auto-trigger behaviour), see _shared/scoring.md.
Run saber --help. If the CLI isn't installed, scoring requires it — point the user to saber.app and stop. The platform doesn't expose a non-CLI fallback for scoring configuration.
Scoring is typed: a profile scores either companies (keyed by domain) or contacts (keyed by LinkedIn profile URL). You'll need a separate profile per type.
Ask:
"Are we scoring companies, contacts, or both? Each needs its own profile."
For the rest of the flow, do one type end-to-end before starting the next.
saber scoring profile create --type company --name "<descriptive name>" \
[--description "<optional context>"]
Naming guidance: include the use case (e.g. New business — EMEA mid-market, Expansion — existing customers, Enterprise outbound). Profile type cannot be changed later; a typo means deleting and recreating.
Capture the returned profileId for the next steps.
Before writing rules, collect:
signal-discovery then create-company-signals / create-contact-signals first.extract-signal-templates first to consolidate ad-hoc executions into reusable templates. Without this, historical signal data won't contribute to scores.generate-signals (categories + weights), or whatever the user has informally.For each signal template in scope, decide:
Dimension — fit or urgency. Default mapping from generate-signals categories:
generate-signals category | Default dimension |
|---|---|
icp_fit | fit |
buying_signal | urgency |
urgency | urgency |
Override if the user has a strong opinion. Disqualifiers (e.g. "is a competitor") usually go in fit with strongly negative false points.
Answer type — must match the signal template's answer type exactly. Pulling the wrong shape returns 422 INVALID_POINT_VALUES.
Point values — translate weight (1–3) into points. Default scaling is points = weight × 10:
| Answer type | CLI |
|---|---|
boolean | --true 20 --false 0 (disqualifier: --false -100) |
number / percentage / currency | --range "0:500:5" --range "500:5000:15" (max exclusive, repeatable) |
list | --choice "Salesforce:10" --choice "HubSpot:8" (repeatable) |
Then upsert each rule:
saber scoring rule upsert <profileId> \
--signal-template <signalTemplateId> \
--dimension fit \
--answer-type boolean \
--true 20 --false 0
For complex shapes you can pass JSON instead:
saber scoring rule upsert <profileId> \
--signal-template <id> --dimension urgency --answer-type number \
--points-file ranges.json
Repeat per signal template. Show the user the running list of rules as you go and confirm before assignments.
Pick one company / contact you can sanity-check (an existing customer is ideal). Assign the profile to just that one object first:
saber scoring assignment create --profile <profileId> --type company --object <domain>
The assignment triggers compute. Read the result with contributions:
saber scoring scores --type company --object <domain> --detailed
Walk through with the user: are the contributing signals what you expected? Any rule firing the wrong way? If a rule is wrong, rule upsert again — every upsert recomputes.
Once the rules look right, bulk-assign the rest of the target list:
saber list company companies <listId>
# extract domains, then:
saber scoring assignment bulk --profile <profileId> --type company \
--object <domain1> --object <domain2> ...
For contact profiles, use LinkedIn profile URLs as object IDs:
saber scoring assignment bulk --profile <profileId> --type contact \
--object https://linkedin.com/in/jane --object https://linkedin.com/in/bob
Bulk assign is idempotent — duplicates are skipped silently.
Show a summary:
Tell the user:
saber scoring scores --type ... --object ....compute manually.score-accounts — rank the assigned list by current fit + urgencymanage-scoring — tune rules, add or remove assignments laterqualify-inbound — qualify a new inbound lead against this profileINVALID_POINT_VALUES — the --answer-type doesn't match the shape you provided. Fix the shape and retry the upsert.signalCoverage vs. totalRules from --detailed output.npx claudepluginhub saberapp/saber-marketplace --plugin saber-skillsCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.