bug-report-writer — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited bug-report-writer (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.
Turn rough notes, one-liners, console errors, or casual descriptions into professional, structured bug reports — exported as a formatted Excel (.xlsx) file ready for Excel, Google Sheets, Jira, or Azure DevOps.
For each bug, extract or infer:
| Field | What to extract |
|---|---|
| Title | Short summary in format: [Module] Brief description |
| Environment | OS, browser, device, app version if mentioned |
| Steps to Reproduce | Numbered sequence; infer reasonable steps if not given |
| Expected Result | What should have happened |
| Actual Result | What actually happened (include error messages verbatim) |
| Severity | See severity guide below |
| Priority | See priority guide below |
| Module / Feature | Which part of the app is affected |
| Reporter | Use name if provided; default to QA Tester |
If details are missing, make smart assumptions based on context and mark them with [Assumed]. Never leave a field blank — use Not specified only as a last resort.
Severity (impact on the system):
| Level | Criteria |
|---|---|
| 🔴 Critical | App crash, data loss, security breach, complete feature failure |
| 🟠 High | Major feature broken, no workaround available |
| 🟡 Medium | Feature partially broken, workaround exists |
| 🟢 Low | Cosmetic issue, typo, minor UI misalignment |
Priority (how soon it must be fixed):
| Level | Criteria |
|---|---|
| P1 | Must fix before release / hotfix needed immediately |
| P2 | Fix in current sprint |
| P3 | Fix in next sprint |
| P4 | Fix when time permits |
QA Rule: Severity drives priority by default, but business context can override. Example: a Low severity typo on a payment page may be P2 due to trust impact.
Print each bug in clean text format for immediate review before generating the file. Use this exact structure:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
BUG-001 · [Module] Brief title here
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Severity: 🟠 High Priority: P2
Module: Authentication
Reported: QA Tester · 2025-01-15 Status: Open
Environment:
OS: Windows 11 · Browser: Chrome 122 · Device: Desktop [Assumed]
Steps to Reproduce:
1. Navigate to /login
2. Enter valid email and any password
3. Click "Login"
Expected: User is authenticated and redirected to dashboard
Actual: Page shows blank screen; console error: "TypeError: Cannot read properties of undefined"
Attachments needed: [ ] Screenshot [ ] Console logs [ ] Network logs
Notes: Occurs consistently on Chrome; not tested on other browsers [Assumed]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━For multiple bugs, print each one separated by the divider line above.
Create a .xlsx file with 2 sheets using the Python template below.
#### Sheet 1: Bug Reports
Columns: Bug ID | Title | Module | Severity | Priority | Environment | Steps to Reproduce | Expected Result | Actual Result | Status | Reported By | Date | Notes
Formatting rules:
#C00000), frozen at row 2#FFFFFF)#F4CCCC, High→#FCE5CD, Medium→#FFF2CC, Low→#D9EAD3#F4CCCC, P2→#FCE5CD, P3→#FFF2CC, P4→#D9EAD3#EEEEEE, left blank for the team to fill in#### Sheet 2: Bug Summary
#808080#### File name: bug-report-YYYY-MM-DD.xlsx
/mnt/user-data/outputs/bug-report-YYYY-MM-DD.xlsxpresent_files to deliver the download link✅ X bug(s) exported · Severities: [list] · File: bug-report-YYYY-MM-DD.xlsx
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
from openpyxl.utils import get_column_letter
from datetime import date
from collections import Counter
wb = Workbook()
# --- Styles ---
HEADER_FILL = PatternFill("solid", fgColor="C00000")
HEADER_FONT = Font(bold=True, color="FFFFFF", name="Arial", size=10)
DATA_FONT = Font(name="Arial", size=10)
WHITE_FILL = PatternFill("solid", fgColor="FFFFFF")
GREY_FILL = PatternFill("solid", fgColor="EEEEEE")
THIN = Side(style="thin")
BORDER = Border(left=THIN, right=THIN, top=THIN, bottom=THIN)
SEV_FILLS = {"Critical": "F4CCCC", "High": "FCE5CD", "Medium": "FFF2CC", "Low": "D9EAD3"}
PRI_FILLS = {"P1": "F4CCCC", "P2": "FCE5CD", "P3": "FFF2CC", "P4": "D9EAD3"}
# Column indices (1-based)
COL_SEVERITY = 4
COL_PRIORITY = 5
COL_STATUS = 10
WRAP_COLS = {7, 8, 9} # Steps to Reproduce, Expected Result, Actual Result
# --- Sheet 1: Bug Reports ---
ws = wb.active
ws.title = "Bug Reports"
ws.sheet_properties.tabColor = "C00000"
HEADERS = ["Bug ID", "Title", "Module", "Severity", "Priority", "Environment",
"Steps to Reproduce", "Expected Result", "Actual Result", "Status",
"Reported By", "Date", "Notes"]
WIDTHS = [10, 38, 16, 12, 10, 22, 45, 35, 35, 14, 16, 13, 30]
for col, (h, w) in enumerate(zip(HEADERS, WIDTHS), 1):
c = ws.cell(row=1, column=col, value=h)
c.font = HEADER_FONT
c.fill = HEADER_FILL
c.border = BORDER
c.alignment = Alignment(horizontal="center", vertical="center", wrap_text=True)
ws.column_dimensions[get_column_letter(col)].width = w
ws.freeze_panes = "A2"
ws.row_dimensions[1].height = 28
# bugs = list of dicts — populate with extracted bug data before running
bugs = [] # REPLACE WITH ACTUAL BUG DATA
for r, bug in enumerate(bugs, 2):
sev = bug.get("severity", "Medium")
pri = bug.get("priority", "P3")
row_data = [
bug.get("bug_id", ""),
bug.get("title", ""),
bug.get("module", ""),
sev,
pri,
bug.get("environment", ""),
bug.get("steps", ""),
bug.get("expected", ""),
bug.get("actual", ""),
"", # Status — left blank for the team
bug.get("reported_by", "QA Tester"),
bug.get("date", str(date.today())),
bug.get("notes", ""),
]
ws.row_dimensions[r].height = 60
for col, val in enumerate(row_data, 1):
c = ws.cell(row=r, column=col, value=val)
c.font = DATA_FONT
c.border = BORDER
c.alignment = Alignment(
vertical="top",
wrap_text=(col in WRAP_COLS),
horizontal="center" if col == COL_PRIORITY else "left"
)
# Color only the Severity, Priority, and Status columns
if col == COL_SEVERITY:
c.fill = PatternFill("solid", fgColor=SEV_FILLS.get(sev, "FFFFFF"))
elif col == COL_PRIORITY:
c.fill = PatternFill("solid", fgColor=PRI_FILLS.get(pri, "FFFFFF"))
elif col == COL_STATUS:
c.fill = GREY_FILL
else:
c.fill = WHITE_FILL # All other columns stay clean white
# --- Sheet 2: Bug Summary ---
ws2 = wb.create_sheet("Bug Summary")
ws2.sheet_properties.tabColor = "808080"
today_str = date.today().strftime("%Y-%m-%d")
def pct(n, total):
return f"{round(100 * n / total)}%" if total else "0%"
total = len(bugs)
dates = sorted(b.get("date", today_str) for b in bugs if b.get("date"))
modules = Counter(b.get("module", "Unknown") for b in bugs)
summary_rows = [
("Report Date", today_str),
("Total Bugs", total),
("", ""),
("── By Severity ──", "Count / %"),
]
for s in ["Critical", "High", "Medium", "Low"]:
n = sum(1 for b in bugs if b.get("severity") == s)
summary_rows.append((f" {s}", f"{n} ({pct(n, total)})"))
summary_rows += [("", ""), ("── By Priority ──", "Count / %")]
for p in ["P1", "P2", "P3", "P4"]:
n = sum(1 for b in bugs if b.get("priority") == p)
summary_rows.append((f" {p}", f"{n} ({pct(n, total)})"))
summary_rows += [("", ""), ("── By Module ──", "Count")]
for mod, n in modules.most_common():
summary_rows.append((f" {mod}", n))
summary_rows += [
("", ""),
("Date Range", f"{dates[0]} → {dates[-1]}" if dates else "N/A"),
]
BOLD_LABELS = {"Report Date", "Total Bugs", "── By Severity ──",
"── By Priority ──", "── By Module ──", "Date Range"}
for r, (label, val) in enumerate(summary_rows, 1):
ws2.cell(row=r, column=1, value=label).font = Font(
bold=(label in BOLD_LABELS), name="Arial", size=10)
ws2.cell(row=r, column=2, value=val).font = Font(name="Arial", size=10)
ws2.column_dimensions["A"].width = 22
ws2.column_dimensions["B"].width = 16
output_path = f"bug-report-{today_str}.xlsx"
wb.save(output_path)
print(f"Saved: {output_path}")~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.