pir-action-tracker — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited pir-action-tracker (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.
Automates the maintenance of Post-Incident Review (PIR) pages in Confluence by syncing action item status from Jira, flagging overdue items, and marking completed PIRs with a visible closure panel.
Before running, set these variables in your prompt or environment:
| Variable | Example | Description |
|---|---|---|
CONFLUENCE_SITE | your-org.atlassian.net | Confluence site hostname |
CONFLUENCE_SPACE | MYSPACE | Space key to scan for PIR pages |
PIR_SEARCH_TERM | PIR | Title keyword used to find PIR pages (default: "PIR") |
JIRA_SITE | your-org.atlassian.net | Primary Jira site for ticket lookups |
TICKET_PREFIX_MAP | See below | Map ticket prefixes to Jira sites |
If your PIRs reference tickets across multiple Jira sites, provide a prefix-to-site map:
CMON, SAM → hello.atlassian.net
PIRA → opsj.atlassian.net
MEP → experimentation-platform.atlassian.netTickets on inaccessible external sites are flagged in the report but not updated.
search_confluence_using_cql(
site_url="{CONFLUENCE_SITE}",
cql='space = "{CONFLUENCE_SPACE}" AND title ~ "{PIR_SEARCH_TERM}" AND type = page ORDER BY lastModified DESC',
limit=50
)For each result, note the page ID, title, URL, and last modified date.
Initial skip rules:
Index, Landing, or similar navigation-only wording.PIR in the title should be maintained.For each candidate page:
get_confluence_page(page_url=..., output_file="tmp_pir_{page_id}.html")<table> elements containing:Ticket, Issue, JiraStatus, Current StatusAction, Work to Be Done, Action item summaryDue date, Target date, Est. Completion, Completion date<a href> or cell text<span data-type="status"> or plain text in the status cell<time datetime="YYYY-MM-DD"> or plain textImportant scope rule:
#### Common Table Formats
| Format A | Format B | |||||||
|---|---|---|---|---|---|---|---|---|
| Ticket \ | Work to Be Done \ | Est. Completion \ | Current Status | Ticket \ | Action summary \ | Status \ | Target date \ | Notes |
| Dates as plain text ("May 31, 2026") | Dates as <time datetime="YYYY-MM-DD"> | |||||||
Status as <span data-type="status"> | Status as <span data-type="status"> |
For each ticket:
JIRA_SITE)get_jira_issue(issue_url=..., extra_fields=["duedate", "status", "resolutiondate"])| Jira Status | Lozenge Text | Color |
|---|---|---|
| Done / Resolved / Closed / Won't Do | Done | green |
| In Progress / In Review / Dev Complete | In Progress | blue |
| To Do / Open / Backlog | To Do | neutral |
| Blocked | Blocked | red |
| On Hold / Deferred | On Hold | yellow |
duedate field → fall back to resolutiondate (if Done) → fall back to existing page valueIf a ticket is inaccessible (external Jira, no auth), skip gracefully — keep the existing page value and note it in the report.
For each page with at least one changed value:
<!-- Status update -->
<span data-type="status" data-color="blue">In Progress</span>
→ <span data-type="status" data-color="green">Done</span>
<!-- Date update (Format B) -->
<time datetime="2026-05-11">May 11, 2026</time>
→ <time datetime="2026-06-15">June 15, 2026</time>update_confluence_page(
page_url=...,
content="tmp_pir_{page_id}.html",
version_message="PIR Action Tracker: synced status from Jira — {YYYY-MM-DD}"
)Safety rules:
A PIR is eligible to be marked Closed when:
For each eligible page, prepend a green success panel to the top of the page:
<div data-type="panel-success">
<h2>✅ All Post-Incident Actions Complete — This PIR is Closed</h2>
<p>All engineering follow-up actions from this incident have been completed
and verified. No further action is required from Atlassian on this
incident.</p>
<p><strong>{N} completed actions:</strong></p>
<ul>
<li><p>{Plain-English description of action 1}</p></li>
<li><p>{Plain-English description of action 2}</p></li>
...
</ul>
<p><em>Closed: {date} · {team name}</em></p>
</div>Guidelines for the action list:
<h2>✅ This PIR is Closed — No Tracked Action Items</h2>
<p>This post-incident review was completed without formal tracked action items.
The findings and recommendations are documented below for reference.</p>Do not add the closure panel if any action items are still open.
Flag any action item where:
⚠️ PIR ACTION ITEM STATUS REPORT
════════════════════════════════════
Generated: {date} | Pages scanned: {N} | Pages updated: {N}
🔴 OVERDUE — Past Due Date, Not Done
──────────────────────────────────────
PIR: {page title} → {page URL}
• {ticket} — {action summary}
Due: {date} ({N} days overdue) | Status: {current status}
→ Recommended: {suggested follow-up}
🟡 TBD — No Due Date, Incident > 90 Days Old
──────────────────────────────────────────────
PIR: {page title} → {page URL}
• {ticket} — {action summary}
→ Recommended: Request a target date from the engineering team
⚪ STATUS UNVERIFIABLE — External Ticket
──────────────────────────────────────────
PIR: {page title} → {page URL}
• {ticket} — {action summary}
→ Manually verify at: {ticket URL}
✅ ALL CLEAR
─────────────
{N} pages updated · {N} action items synced · {N} already current · {N} PIRs closedAfter the report, offer:
| Trigger | When |
|---|---|
| Weekly sweep | Monday morning, alongside account health checks |
| New PIR published | Run immediately to initialize action items |
| On demand | Any time you need a current status snapshot |
# Weekly sweep
"Update the PIR tracker for all open PIRs in the <SPACE_KEY> space"
# Check for overdue items only
"Any overdue PIR actions this week?"
# Close completed PIRs
"Mark any completed PIRs as closed"
# After a new PIR is published
"New PIR just published — sync it with the tracker"lastModified > now("-180d") in the CQL query to skip very old PIRs that are unlikely to have open items.PIR in the title should still be skipped unless it contains a qualifying internal-action table.version_message so the page history shows what changed and why.Part of the Perseus skill library. Compatible with Rovo Dev CLI, Claude Code, and any MCP-enabled assistant. See: https://github.com/Perseus-Computing-LLC/perseus
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.