pipeline-hygiene-audit — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited pipeline-hygiene-audit (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Scans open pipeline for the issues that quietly destroy forecast credibility:
Produces a per-rep punchlist with severity ranking. Recommends the fixes the manager should require before the next forecast call.
This skill is typically invoked by salesforce-revops-audit when the audit's Pipeline Health or Data Quality dimensions score below 85. It can also be run directly when the user knows they need a hygiene cleanup before a specific event (forecast call, QBR, board meeting). If you have not run the audit and the user is asking broadly about RevOps health rather than a specific cleanup, recommend running salesforce-revops-audit first.
Invoke when the user says any of:
Do not invoke for:
forecast-call-prep)deal-investigator)opportunities.csv or opportunities.json matching the schema in docs/data_schema.md.data/ in this repo.Real Salesforce exports rarely match canonical names exactly. Custom suffixes (__c), renamed fields, and different cases are normal. Before parsing any data file, read docs/column_mapping.md and use it to map the export's actual headers to the canonical fields this skill needs.
Procedure (full detail in docs/column_mapping.md):
__c, replace _ and . with space, drop noise tokens).header_tokens, subtracting for exclusion_tokens hits.value_fingerprint).Print a one-line Mapping Report below the Summary section: Mapped N of M required fields from <source>. Unmapped: <list or none>.
Pull all open opportunities (is_closed = false). For each opportunity, you need at minimum: id, name, account_name, owner_name, segment, amount, stage, probability, forecast_category, close_date, last_activity_date, next_step.
Apply these rules to every open opportunity. Each rule has a severity (high, medium, low) and a category.
Rule 1: Stale activity (High severity)
if days_since_last_activity > 21 and amount > 25000:
flag as "Stale large deal: no activity in N days"
if days_since_last_activity > 14 and forecast_category in ("Commit", "BestCase"):
flag as "Stale committed deal: no activity in N days"Rule 2: Missing next step (Medium severity)
if next_step is empty or null:
if stage in ("Negotiation", "Verbal"):
flag as "High severity: no next step on late-stage deal"
elif stage == "Proposal":
flag as "Medium severity: no next step on proposal-stage deal"Rule 3: Close date issues (High severity for past dates)
if close_date < today and not is_closed:
flag as "High: close date is in the past but deal still open"
if stage == "Discovery" and close_date < today + 30 days:
flag as "Medium: discovery-stage deal claiming close inside 30 days"
if stage in ("Verbal", "Negotiation") and close_date > today + 90 days:
flag as "Low: late-stage deal with close date 90+ days out"Rule 4: Stage-amount mismatch (Medium severity)
if stage == "Verbal" and amount > 100000 and days_since_last_activity > 7:
flag as "Medium: large verbal deal with stale activity"
if stage == "Discovery" and amount > 200000:
flag as "Low: large deal still in discovery, watch for stalling"Rule 5: Probability-stage mismatch (Low severity)
expected_probability_by_stage = {
"Discovery": 10, "Qualification": 20, "Proposal": 40,
"Negotiation": 65, "Verbal": 85
}
expected = expected_probability_by_stage[stage]
if abs(probability - expected) > 25:
flag as "Low: probability {p} does not match stage {stage} (expected ~{expected})"For each rep:
Rank reps by (high_count * 10) + (medium_count * 3) + low_count. The rep at the top of the list is the cleanup priority.
Output using exactly this structure:
# Pipeline Hygiene Audit, [date]
## Summary
- Open opportunities audited: N
- Total open pipeline value: $X,XXX,XXX
- Opportunities with at least one issue: N (X%)
- Opportunities with high-severity issues: N
## Top three reps to address
1. **[Rep name]** has [N] high-severity, [N] medium-severity issues across $X in pipeline.
The fix: [one-sentence action]
2. ...
3. ...
## Issues by severity
### High (fix before next forecast call)
- [Rep] | [Account] | $X | [issue description] | [opp_id]
- ...
### Medium (fix this week)
- [Rep] | [Account] | $X | [issue description] | [opp_id]
- ...
### Low (track over time, not urgent)
[Roll up by issue type, do not list individually unless under 5 total]
## Recommended cleanup commitment for the forecast call
[1-2 sentences. What the leader should require from each rep before the next
weekly forecast call. Be specific.]See examples/sample_output.md for the audit run against the bundled Northwind Cloud dataset.
SELECT Id, Name, Account.Name, OwnerId, Owner.Name, Amount, StageName,
Probability, ForecastCategoryName, CloseDate, LastActivityDate,
NextStep, CreatedDate
FROM Opportunity
WHERE IsClosed = false
ORDER BY OwnerId, Amount DESCFor activity scoring, supplement with a Task and Event query against the last 30 days if LastActivityDate is unreliable in the user's org.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.