skill-pm-stakeholder-juggle — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited skill-pm-stakeholder-juggle (Agent Skill) and scored it 92/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 2 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 2 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
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.
Three flows a product manager actually does in a week: see the political shape of a feature (who proposed it, who is blocking it, who is endorsing it), audit the decisions already made on a project so you can stop re-litigating them, and shape a verdict-first exec summary that fits inside the word budget the exec actually gave you. Trigger phrases are PM-specific by design — they do not collide with skill-eng-manager-1on1's prep my 1:1 with or any general planning skill.
This is not a stakeholder-manipulation planner. It does not score stakeholders, rank their influence, or coach the user on how to "win them over". Stakeholder messiness is the job — the skill helps you see the shape of it, not pretend it isn't there. It is also not a performance tool: it never rates a stakeholder, never produces a "trust score", never feeds anything into HR.
Activate when the user's message contains one of the trigger phrases verbatim. The trigger phrase determines which of the three flows runs:
who cares about <feature> / stakeholder map for <feature> → Flow A: stakeholder map.audit my decisions on <project> / audit decisions on <project> / decision audit for <project> → Flow B: decision audit.exec summary for <topic>, max <N> words / executive summary for <topic>, max <N> words → Flow C: exec summary.Do not activate on partial matches (I care about this, the exec wants a summary), past tense (I already audited that), or third-person reports about meetings the user is not running. Do not activate if a separate skill — for example audhd-context-recovery, adhd-daily-planner, or skill-eng-manager-1on1 — is already running its flow in this turn; let the more general skill finish.
The user says who cares about <feature> or stakeholder map for <feature>. Goal: a map of which people proposed, blocked, or endorsed the feature, with verbatim quotes from prior facts and dates.
about (or after for) is the feature reference. Trim. Treat the parsed string verbatim — do not normalise capitalisation, do not expand abbreviations.recall_entity({ "name_or_alias": "<parsed feature>" }).resolution.method is alias, fuzzy, or embedding, surface the resolved entity name and the resolution score before continuing. Ask one question: I read "<parsed feature>" as the entity "<resolved>" (<method> match, score <score>). Continue? Wait for confirmation. Do not assume.No entity in the graph matches "<parsed feature>". I can still help you map stakeholders — who do you already know is involved? Stop and wait for the user.facts[] and partition into three buckets based on the predicate and the subject/object types:proposed, requested, or originated_in, with a person subject. Quote object.literal verbatim if present.blocked_by, blocked, or contains an object.literal starting with blocking:. Quote object.literal verbatim.endorsed, approved, signed_off_on, or supports. Quote object.literal verbatim.If a fact does not match any bucket, place it under Other context. Do not invent buckets.
related_entities[] entry with type == "person" that is not already in a bucket gets surfaced under Recent context, with the relationship inferred from the predicate of the first fact linking them.The user says audit my decisions on <project> (or one of the equivalent triggers). Goal: a temporally ordered list of decisions already made on the project, ending with an explicit anti-rumination closing line that names the decisions as closed.
This flow exists for the OCD-prone PM who re-litigates already-made decisions in their head. The skill surfaces the closed calls; the closing line names them as closed. The user is the authority and can reopen any decision — the skill names that path too.
on (or after for) is the project reference. Trim verbatim.recall_decisions({ "project": "<parsed project>" }). No since filter — the audit is over the full project history.project field is null, say so plainly: No project in the graph matches "<parsed project>". I cannot audit decisions on a project the graph does not know about. Stop.Project "<resolved project>" exists in the graph, but no decisions are recorded against it. There is nothing to audit. Stop. Do not add the anti-rumination closing line — there are no decisions to close. These decisions are closed. To reopen, open a new question.No paraphrase. No softening adjectives. No "but if you want to revisit". This line is the load-bearing piece of Flow B.
The user says exec summary for <topic>, max <N> words (or the executive summary for variant). Goal: a verdict-first, 4-bullet exec summary that respects the word budget the user named.
, max . Everything before is the topic, the integer after is the word budget. If the user does not specify a word budget, default to 150 words and surface that default explicitly: Defaulting to a 150-word budget. Override with "max <N> words" if you want a different cap. Then continue.The exec summary budget should be 40–400 words. Restate with a budget in that range. Stop.goal and pass a time_budget that maps to a single working block: decompose({ "goal": "exec summary for <topic>: produce 4 atomic bullets in the order Why now / What changed / Decision needed / Risk if delayed", "time_budget": "PT30M" }). The decompose call shapes the 4-bullet structure; the word budget is applied at render-time, not by the tool.The topic "<topic>" did not decompose into a 4-section exec summary. Try a more specific topic, or write it freehand. Stop.Stakeholder map — <feature name>.
### Proposed by
- <person name>: "<verbatim fact>" (<recorded date>)
### Blocked by
- <person name>: "<verbatim fact>" (<recorded date>)
### Endorsed by
- <person name>: "<verbatim fact>" (<recorded date>)
### Recent context
- <person name> (<relationship>)
### Other context
- "<verbatim fact>" (<recorded date>)
This map shows the political shape of the feature as the graph remembers it. Stakeholder messiness is the job, not a failure.Rules:
### Endorsed by\n(none).(<M> further facts in the graph; ask for them if you want the full list.).recall_entity's facts[].object.literal. No paraphrase.Empty-graph fallback (used when the entity is null):
No stakeholder map — <feature name>. No prior context in the graph.
I can still help. Who do you already know is involved? If you'd like me to capture anything for next time, say "record this" once we're done.Decision audit — <project name>. <N> decisions on file.
1. <decision name> — decided <decided_on>. <attribution line>. <source line if non-null>.
2. <decision name> — decided <decided_on>. <attribution line>. <source line if non-null>.
3. ...
These decisions are closed. To reopen, open a new question.Where:
<attribution line> is Decided by <decided_by[*].name comma-separated> if decided_by is non-empty, else Attribution: unattributed.<source line> is Source: <source verbatim> if source is non-null, else the line is omitted.Rules:
These decisions are closed. To reopen, open a new question. is verbatim and mandatory when at least one decision is rendered.truncated == true, append one line before the closing line: (More than 200 decisions on file; older entries truncated. Ask for a date range to narrow.)Verdict: <one-sentence punchline, verdict-first, no preamble>.
- **Why now.** <Bullet 1 content, one to three sentences.>
- **What changed.** <Bullet 2 content, one to three sentences.>
- **Decision needed.** <Bullet 3 content, one sentence, ends with a question mark or imperative.>
- **Risk if delayed.** <Bullet 4 content, one to three sentences.>
Word count: <actual>/<budget>.Rules:
**Why now.**), not as headers — exec summaries fit on one screen.Why now / What changed / Decision needed / Risk if delayed. Do not reorder.If the user's invoking message contains phrases like I'm furious, <name> is screwing me over, this person is the problem, the skill MUST acknowledge the feeling but MUST NOT shift the flow toward naming a stakeholder as the cause of anything. One sentence: Understood. The stakeholder map still surfaces facts from the graph, not judgements. We can route the interpersonal conversation separately if you want. Then continue with the requested flow as defined.
synergy, rockstar, 10x, ninja, growth mindset, stretch goal, should have known, aligned, north star, circle back, actionable insights.recall_entity or decisions returned by recall_decisions — quote the literal text.These decisions are closed. To reopen, open a new question. is verbatim or it does not appear.record_fact in any flow without explicit user opt-in. The cognitive graph is the user's notebook, not the skill's logbook.See tests/:
tests/01-stakeholder-map.md — Flow A with proposers, blockers, endorsers, and one related person.tests/02-decision-audit.md — Flow B with three closed decisions and the verbatim anti-rumination closing line.tests/03-exec-summary.md — Flow C with an explicit word budget enforced at render-time.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.