tiki/workflows/bug-tracker/workflow.yaml
2026-04-18 09:51:36 -04:00

233 lines
8.6 KiB
YAML

description: |
Bug tracker for triaging and resolving customer-reported issues.
Six statuses (Open → Triaged → In Progress → In Review → Verified, plus Won't Fix),
three task types (Bug, Regression, Incident), and custom fields for severity,
environment, reporter, foundIn version, due date, regression flag, and escalation count.
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"