ai-research-output-publisher — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited ai-research-output-publisher (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.
Use this skill after a Deep Research, Agent, or long AI workflow has finished and you need a polished result message plus optional Notion sync.
It does not run the browser workflow itself. It consumes a result JSON file from ai-research-browser, Oracle harvest output, or another orchestrator and produces:
Render a message and Notion payload without external writes:
python3 skills/productivity/ai-research-output-publisher/scripts/ai_research_output_publisher.py render \
--input /tmp/research-results.json \
--message-output /tmp/research-message.md \
--payload-output /tmp/research-notion-payload.jsonThe chat message includes summary text by default. Add --chat-summary off when only links and metrics should be shown. Secret-like values are redacted by default (--privacy redacted), including emails, obvious API tokens, bearer headers, proxy credentials, and URL query strings. Use --privacy full only for private/local artifacts that must preserve exact text.
Try the bundled public-safe example:
python3 skills/productivity/ai-research-output-publisher/scripts/ai_research_output_publisher.py render \
--input skills/productivity/ai-research-output-publisher/examples/research-results.example.jsonExpected message shape: examples/research-message.example.md.
{
"job_id": "research-batch-001",
"title": "Weekly AI research",
"results": [
{
"title": "Obsidian AI plugins",
"provider": "gemini",
"mode": "deep-research",
"status": "completed",
"deep_research_url": "https://example.com/research",
"pspin_url": "https://example.com/pin",
"summary": "Short summary shown in chat and at the top of Notion.",
"text": "Full research report.",
"research_duration_seconds": 720,
"total_duration_seconds": 900
}
]
}The script accepts research_url, deep_research_url, chat_url, or source_url for the main research link.
Live Notion writes require explicit opt-in:
NOTION_API_KEY="secret-token" \
python3 skills/productivity/ai-research-output-publisher/scripts/ai_research_output_publisher.py publish-notion \
--input /tmp/research-results.json \
--parent-page-id "<notion-parent-page-id>" \
--allow-external-writeWithout --allow-external-write, the command writes only the planned Notion payload. Live writes still use redacted mode by default; pass --privacy full only when the destination workspace is allowed to receive the exact captured text.
Prepare a chat/webhook notification without sending:
python3 skills/productivity/ai-research-output-publisher/scripts/ai_research_output_publisher.py send-chat \
--input /tmp/research-results.json \
--channel webhook \
--webhook-url "https://example.invalid/research-webhook"Live delivery requires explicit opt-in:
python3 skills/productivity/ai-research-output-publisher/scripts/ai_research_output_publisher.py send-chat \
--input /tmp/research-results.json \
--channel discord \
--webhook-url "<discord-webhook-url>" \
--allow-external-writeSupported channels are webhook, discord, and telegram. Tokens and destinations must come from local environment variables or CLI arguments and must never be committed.
Each notification includes:
chat_delivery status when sent through the gated send-chat command.Run the deterministic local E2E test:
python3 -m unittest discover -s skills/productivity/ai-research-output-publisher/tests -p 'test_*.py'The tests use fake input and a local fake Notion endpoint. They do not write to a real workspace.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.