predict — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited predict (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 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.
Check if the create_simulation MCP tool exists and is callable.
If tools ARE available: Skip to Step 1.
If tools are NOT available (MCP disconnected):
Say only this (short, one block):
DeepMiro simulates how real personas react to a scenario. Not set up yet — paste your API key (get one at https://deepmiro.org) or say "install it" for setup instructions.
Then wait. Do NOT explain what the simulation would contain, do NOT offer a "quick take", do NOT describe the stakeholders. Keep it under 40 words.
If they provide an API key (starts with `dm_`):
The DeepMiro plugin's MCP config uses ${DEEPMIRO_API_KEY} — a shell env var interpolation. You need to set that env var in a place Claude Code will pick up on its next start. The cleanest place is ~/.claude/settings.json under the env field.
Steps:
~/.claude/settings.json using the Read toolenv field: "env": {
"DEEPMIRO_API_KEY": "<their_key>"
}(preserve any existing env entries — merge, don't overwrite)
"API key saved to your Claude Code settings. Restart Claude Code now — exit and run claude again. After restart, the DeepMiro tools will be available."If they don't have the plugin installed yet, tell them:
Run this once to install the plugin: ``bash claude plugin marketplace add kakarot-dev/deepmiro claude plugin install deepmiro@deepmiro-marketplace `` Then I'll save your API key to settings and you restart Claude Code.If they say self-hosted:
Ask for their engine URL (default: http://localhost:5001). Read ~/.claude/settings.json, update the env field:
"env": {
"MIROFISH_URL": "<their_url>"
}Self-hosters don't need an API key.
If they don't know / want help:
Walk them through it:
"Done — API key saved. Please restart Claude Code (exit and run claude again) so the DeepMiro plugin can pick up your key. Then say 'predict [your scenario]'."Important: Do NOT try to call the MCP tools in this same session — they won't work until Claude Code restarts and respawns the plugin's MCP server with the new env var.
Call list_simulations with limit: 1.
If a file path is in $ARGUMENTS or the user referenced a file:
"That file is too large (max 10MB). Try a smaller document, or extract the key sections into a text file."
"DeepMiro accepts PDF, Markdown, or plain text files. Can you convert it?"
upload_document MCP tool with the absolute file pathdocument_iddocument_id to create_simulation in the next stepNo file? Skip to Step 3.
If large document uploaded, suggest deep: "This is a detailed document — running deep simulation with 50+ personas."
Call create_simulation with prompt, document_id (optional), preset.
After calling create_simulation, immediately schedule a background check-in using CronCreate:
CronCreate(
cron: "*/2 * * * *", // every 2 minutes
recurring: true,
prompt: "Check simulation_status for <sim_id>. If still running, share any new interesting agent activity briefly. If completed, call get_report and present it. If failed, tell the user what went wrong. Delete this cron job once the simulation is complete or failed."
)Then tell the user something short, and always surface the `dashboard_url` from the tool response so they can watch live:
"Started your prediction. You can watch it live in your browser: <dashboard_url>. I'll also check in every couple minutes and narrate what the personas are doing."
Do NOT:
sim_xxxxx or pending_proj_xxxxx to the user (the dashboard_url already embeds the ID — share the URL, not the raw ID)The user only needs to see what the personas are doing/saying, not how the backend is running.
On each check-in (triggered by the scheduled cron), call simulation_status and share only what's interesting — what the personas are saying or doing.
While still setting up: say nothing at all. Skip this check-in. Wait for the next one.
While simulating: narrate real agent activity from recent_actions. Quote them naturally:
"Prof. Zhang just posted: 'Our research output this semester shows remarkable growth...' Meanwhile Li Wei is liking every Chongqing Upstream News post."
Use actual names and post content. Do NOT mention:
Make it feel like a story unfolding — the kind of thing you'd read in a live-blog, not a server log.
completed: Call CronDelete with the cron job ID to stop the check-ins, then move to Step 6 — call get_report and present the report.
failed: Call CronDelete to stop check-ins, tell the user what went wrong in one sentence, offer to retry.
There's also a hook (hooks/check-predictions.sh — UserPromptSubmit) that fires on every user message and injects a notification when a prediction completes. It's a safety net — if the cron gets lost (session restart, crash), the hook will still alert Claude on the next user prompt.
If the hook injects a "prediction X completed" message but you've already handled it via the cron, just acknowledge briefly and don't re-present the report.
While still setting up (phase = building_graph or generating_profiles): Say nothing, or at most one short line like:
"Still setting up..."
Don't announce "building graph" or "generating personas" or percentages. That's internal noise.
While simulating (phase = simulating): Narrate real agent activity from recent_actions. Quote them:
"Prof. Zhang just posted: 'Our research output this semester shows remarkable growth...' Meanwhile Li Wei is liking every Chongqing Upstream News post."
Use actual names and content. Make it feel like you're watching a story unfold, not reading logs.
completed: Move to Step 6.
If over 15 minutes: "Still running — I'll let you know when it's done."
Call get_report. Present the full analysis to the user.
Always end the report response by reminding them of the dashboard URL (from the most recent simulation_status response's dashboard_url):
"You can also explore the full simulation — agents, posts, interactions — in your browser: <dashboard_url>"
Then offer next steps:
"You can: - Interview a persona — 'ask Li Wei why he liked that post' - Run another scenario — 'predict [new scenario]' - Search past sims — 'show my past predictions'"
If user wants to talk to a persona:
agent_id — call simulation_data withdata_type: "profiles" and pick the persona by name; the user_id field is the 0-indexed agent_id you pass to interview_agent. Do NOT guess an id or use the graph-node id.
interview_agent with simulation_id, the numeric agent_id,and the user's question as message. Omit platform to get both Twitter and Reddit responses (useful for comparing voices); pass platform: "twitter" or "reddit" for a single response.
directly. Don't preface with "the agent says".
agent's context from persisted data when the sim has terminated, so you don't need to gate on simulation state.
If the user wants more depth, call interview_agent again with a follow-up. Each call is one question; the persona remembers prior turns in the same sim.
upload_document MCP tool first, pass the returned document_id to create_simulation. Never base64 encode files in prompts.cancel_simulation. Partial action log is preserved.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.