Skip to main content

incident-brief-pdf

Build the downloadable incident brief PDF — cover + KPI strip + OEE chart + downtime timeline + root-cause narrative + supplier/material signals + recommended actions + sign-off, per SOP §7.1. Renders via the inline HTML template + Playwright.

Jump to install

Source facts

Repository
aiappsgbb/kratos-agent
Last source activity
June 9, 2026 at 14:53
Detected SKILL.md language
English
Stars
24
Forks
22

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

File Explorer
3 files

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
incident-brief-pdf
description
Build the downloadable incident brief PDF — cover + KPI strip + OEE chart + downtime timeline + root-cause narrative + supplier/material signals + recommended actions + sign-off, per SOP §7.1. Renders via the inline HTML template + Playwright.
enabled
true
## Instructions Use this skill when Frank asks for "the brief", "the PDF", "send it to Wes", or any variation. This is the **deliverable** the persona exists to produce, and per SOP §7 it is **required** for any §4.3-or-above escalation. ### Workflow 1. **Gather the data** by chaining other skills first: - OEE 7-day trend via `iot_get_oee` (plant, line, date_from=7d-ago) - Downtime events via `iot_list_downtime_events` (plant, line, since=7d-ago) - Device twin via `iot_get_device` (the equipment in the headline) - Telemetry window via `iot_get_telemetry` (the spindle, last 72h) - Production order via `sap_get_production_order` (the `related_po_id` from downtime) - Vendor via `sap_get_vendor` (the supplier blamed in the PO, with `blocked_for_posting` flag) - Supervisor + manager via `workday_get_employee` (Frank + Wes, for sign-off block) 2. **Read the policy** via the **plant-policy-reference** skill — §7.1 defines the contents and order; do not deviate. 3. **Read the chart** that **oee-analysis** already generated at `/tmp/oee-trend-<plant>-line-<N>-<date>.png`. If it doesn't exist yet, generate it before continuing. 4. **Render** by invoking `scripts/render_incident_brief.py` via `code_interpreter`. Pass the gathered data as a single JSON blob: ```bash python /app/use-cases/plant-floor-supervisor/skills/incident-brief-pdf/scripts/render_incident_brief.py \ --plant-id P-CLE \ --line "Line 3 — Precision" \ --date 2026-06-09 \ --data-json '<JSON with headline, kpis, downtime, narrative, supplier, recommendations, signoff>' \ --chart-path /tmp/oee-trend-p-cle-line-3-2026-06-09.png \ --out /tmp/line-3-incident-brief-2026-06-09.pdf ``` 5. **Confirm in chat:** "Incident brief saved to `/tmp/line-3-incident-brief-2026-06-09.pdf` — N pages, includes OEE chart, M downtime events, root-cause narrative, K recommended actions." Reference the path so **file-sharing** picks it up. 6. **Offer the natural next step:** "Want me to log the maintenance work order against DEV-3001 and draft Wes the cover email?" — handoff to **servicenow** (work order) + **m365-graph** (email). Do NOT auto-start writes. ### Assets - `assets/incident-brief.html` — HTML template, navy/gold Olympus theme. Self-contained CSS, embeds the chart as base64 PNG, generates the §7 sections in order. ### data-json shape (what `render_incident_brief.py` expects) ```json { "headline": "Line 3 Precision Spindle — vibration alarm + 4 micro-stops", "kpis": { "oee_pct": 49, "target_oee_pct": 80, "vs_target_pct": -31, "wow_delta_pp": -10, "downtime_minutes_period": 142 }, "downtime": [ {"id": "DT-3004", "started_at": "...", "duration_minutes": 28, "cause_code": "VIB_ALARM", "lot_id": null, "related_po_id": "PO-9003"}, "..." ], "device": { "id": "DEV-3001", "display_name": "CLE-L3-SPINDLE-01", "vendor": "Siemens", "model": "SINAMICS S210", "status": "Warning", "status_note": "...", "latest_vibration_mm_s": 5.4, "vibration_threshold_mm_s": 4.5 }, "production_order": { "id": "PO-9003", "material": "MAT-201 — Model A", "qty_produced": 120, "qty_ordered": 150, "qty_scrap": 30, "scrap_pct": 20.0, "status": "Issue", "issue": "..." }, "supplier": { "id": "V-1201", "name": "Northbridge", "blocked_for_posting": true, "block_reason": "Quality hold pending QA dispute (May 2026)", "rejected_lots": ["Q-NB-44193", "Q-NB-44197"] }, "narrative": "Two-paragraph free-text narrative …", "recommendations": [ "Log P2 maintenance work order against CI-DEV-3001 with Plant Maintenance", "Quarantine remaining Northbridge lots on the floor (per SOP §5.3)", "Reassign Devon to Line 1 backfill until spindle is inspected", "Escalate to QA Cleveland lead (cc on brief, per §4.3)" ], "signoff": { "supervisor_name": "Frank Delgado", "supervisor_email": "frank.delgado@…", "manager_name": "Wesley Park", "manager_email": "wesley.park@…" } } ``` ### Constraints - **Always include all §7.1 sections in order.** If a section has nothing to report (e.g. no supplier signal), print "None this period" — do not skip the heading. - The chart must be the one **oee-analysis** generated, not a re-render — keeps the PDF consistent with what Frank already saw in chat. - File size budget: < 2 MB. If the chart pushes over, drop to 100 DPI. - **Do not auto-send.** Building the PDF is allowed; emailing it is a write and must go through **m365-graph** (email section). ### When NOT to use - For a verbal summary of what's happening on the floor — answer inline, don't render a PDF. - For interim numbers (line still running, no §4.3 trigger) — answer inline. - Per SOP §7 a brief is only required for §4.3 or above — don't generate one for a 5-minute stop.
View on GitHub