diff --git a/workflows/bug-tracker/new.md b/workflows/bug-tracker/new.md new file mode 100644 index 0000000..2d3c4e3 --- /dev/null +++ b/workflows/bug-tracker/new.md @@ -0,0 +1,21 @@ +--- +title: +type: bug +priority: 3 +severity: medium +environment: +reportedBy: +foundIn: +dueBy: +regression: false +escalations: 0 +--- + +## Steps to reproduce + +1. + +## Expected + +## Actual + diff --git a/workflows/bug-tracker/workflow.yaml b/workflows/bug-tracker/workflow.yaml new file mode 100644 index 0000000..d30994c --- /dev/null +++ b/workflows/bug-tracker/workflow.yaml @@ -0,0 +1,228 @@ +fields: + - name: severity + type: enum + values: [critical, high, medium, low] + - name: environment + type: enum + values: [prod, staging, dev] + - name: reportedBy + type: text + - name: foundIn + type: text + - name: dueBy + type: datetime + - name: regression + type: boolean + - name: escalations + type: integer + +statuses: + - key: open + label: Open + emoji: "\U0001F195" + default: true + - key: triaged + label: Triaged + emoji: "\U0001F4CB" + active: true + - key: inProgress + label: "In Progress" + emoji: "\u2699\uFE0F" + active: true + - key: inReview + label: "In Review" + emoji: "\U0001F440" + active: true + - key: verified + label: Verified + emoji: "\u2705" + done: true + - key: wontFix + label: "Won't Fix" + emoji: "\U0001F6AB" + +types: + - key: bug + label: Bug + emoji: "\U0001F41B" + - key: regression + label: Regression + emoji: "\U0001F501" + - key: incident + label: Incident + emoji: "\U0001F525" + +views: + actions: + - key: "a" + label: "Assign to me" + action: update where id = id() set assignee=user() + - key: "y" + label: "Copy ID" + action: select id where id = id() | clipboard() + - key: "Y" + label: "Copy content" + action: select title, description where id = id() | clipboard() + - key: "R" + label: "Mark regression" + action: update where id = id() set regression=true + - key: "r" + label: "Clear regression" + action: update where id = id() set regression=false + - key: "E" + label: "Escalate" + action: update where id = id() set escalations=escalations + 1 + plugins: + - name: Triage + description: "Bug triage board — move bugs through the resolution pipeline" + default: true + key: "F1" + lanes: + - name: Open + filter: select where status = "open" order by priority, createdAt + action: update where id = id() set status="open" + - name: Triaged + filter: select where status = "triaged" order by priority, createdAt + action: update where id = id() set status="triaged" + - name: In Progress + filter: select where status = "inProgress" order by priority, createdAt + action: update where id = id() set status="inProgress" + - name: In Review + filter: select where status = "inReview" order by priority, createdAt + action: update where id = id() set status="inReview" + - name: Verified + filter: select where status = "verified" order by priority, createdAt + action: update where id = id() set status="verified" + actions: + - key: "w" + label: "Won't fix" + action: update where id = id() set status="wontFix" + - name: Severity + description: "Bugs grouped by severity level" + key: "F2" + lanes: + - name: Critical + columns: 2 + width: 40 + filter: select where severity = "critical" and status != "verified" and status != "wontFix" order by priority, createdAt + action: update where id = id() set severity="critical" + - name: High + filter: select where severity = "high" and status != "verified" and status != "wontFix" order by priority, createdAt + action: update where id = id() set severity="high" + - name: Medium + filter: select where severity = "medium" and status != "verified" and status != "wontFix" order by priority, createdAt + action: update where id = id() set severity="medium" + - name: Low + filter: select where severity = "low" and status != "verified" and status != "wontFix" order by priority, createdAt + action: update where id = id() set severity="low" + actions: + - key: "c" + label: "Clear severity" + action: update where id = id() set severity=empty + - name: Environments + description: "Bugs grouped by environment — prod, staging, dev" + key: "F3" + lanes: + - name: Prod + columns: 1 + filter: select where environment = "prod" and status != "verified" and status != "wontFix" order by priority, createdAt + action: update where id = id() set environment="prod" + - name: Staging + columns: 1 + filter: select where environment = "staging" and status != "verified" and status != "wontFix" order by priority, createdAt + action: update where id = id() set environment="staging" + - name: Dev + columns: 1 + filter: select where environment = "dev" and status != "verified" and status != "wontFix" order by priority, createdAt + action: update where id = id() set environment="dev" + - name: Unspecified + columns: 1 + filter: select where environment is empty and status != "verified" and status != "wontFix" order by priority, createdAt + - name: SLA Watch + description: "Deadline tracking — overdue, due today, this week, and unscheduled" + key: "F4" + view: expanded + lanes: + - name: Overdue + filter: select where dueBy is not empty and dueBy < now() and status != "verified" and status != "wontFix" order by dueBy + - name: Due Today + filter: select where dueBy >= now() and dueBy < now() + 1day order by priority + - name: This Week + filter: select where dueBy >= now() + 1day and dueBy < now() + 7day order by dueBy + - name: No SLA + filter: select where dueBy is empty and status != "verified" and status != "wontFix" order by priority + actions: + - key: "d" + label: "Clear deadline" + action: update where id = id() set dueBy=empty + - key: "D" + label: "Bump one week" + action: update where id = id() set dueBy=now() + 7day + - name: Help + description: "Keyboard shortcuts, navigation, and usage guide" + type: doki + fetcher: internal + text: "Help" + key: "?" + - name: Docs + description: "Project notes and documentation files" + type: doki + fetcher: file + url: "index.md" + key: "F5" + +triggers: + - description: critical bugs must specify environment + ruki: > + before create + where new.severity = "critical" and new.environment is empty + deny "critical bugs require environment" + - description: bugs must pass through review before verification + ruki: > + before update + where new.status = "verified" and old.status != "inReview" + deny "bugs must pass through review before verification" + - description: per-assignee WIP limit of 3 in-progress bugs + ruki: > + before update + where new.status = "inProgress" + and count(select where assignee = new.assignee and status = "inProgress") > 2 + deny "assignee already at WIP limit (3 in-progress bugs)" + - description: cannot delete an active bug + ruki: > + before delete + where old.status = "inProgress" or old.status = "inReview" + deny "cannot delete an active bug — move to wontFix or verified first" + - description: auto-prioritize critical bugs and set 24h SLA + ruki: > + after create + where new.severity = "critical" + update where id = new.id set priority=1 dueBy=now() + 1day + - description: tag and bump priority when regression is flagged + ruki: > + after update + where new.regression = true and old.regression = false + update where id = new.id set tags=tags + ["regression"] priority=1 + - description: clear SLA on closure + ruki: > + after update + where new.status = "verified" or new.status = "wontFix" + update where id = new.id set dueBy=empty + - description: remove deleted task from dependency lists + ruki: > + after delete + update where old.id in dependsOn set dependsOn=dependsOn - [old.id] + - description: auto-escalate overdue critical bugs every hour + ruki: > + every 1hour + update where severity = "critical" and dueBy < now() and status != "verified" and status != "wontFix" + set escalations=escalations + 1 + - description: purge closed bugs older than 30 days + ruki: > + every 1day + delete where (status = "verified" or status = "wontFix") and updatedAt < now() - 30day + - description: demote stale in-progress bugs back to triaged + ruki: > + every 1day + update where status = "inProgress" and updatedAt < now() - 7day + set status="triaged"