BatonBot v3.4 — "Design Partner / Trust Hardening"
Headline: BatonBot now accepts ingress from anything. File a bug in Jira → BatonBot picks it up, fixes it, and comments the result back on the ticket — with the safety guards that make it trustworthy against a real team's project.
🎫 Jira Channel
- Polling-based Jira ingress (
modules/jira-adapter.js): BatonBot polls Jira Cloud's REST API on an interval — outbound HTTPS only, no webhook, no public URL, no tunnel. Works from any laptop behind any firewall. - Label routing:
fix-now(or priority Highest) → QUEUE + auto-run;queue→ QUEUE waiting for ▶; everything else → PENDING for triage. - Per-project settings UI in the project editor drawer, with Test Connection and Sync Now buttons.
- Setup guide:
docs/jira-setup.md(~15 minutes).
🛡 Trust Hardening
- Assignee guard (on by default) — tickets assigned to a human are never imported. Only unassigned tickets, or tickets assigned to the configured Bot Account Email (the assign-to-bot workflow), become cards.
- Autostart cap — at most 3 fire-and-forget runs per poll cycle (configurable). A bulk-filed batch of
fix-nowtickets can't spin up unbounded agent runs; extras queue for a human ▶. - First-run watermark — only tickets created after you enable the channel are imported. Flipping the toggle on a mature Jira project won't flood the board with years of backlog.
🔁 Closing the Loop
- Full lifecycle comments back to Jira: pickup 🤖, queue moves 📋, completion ✅ (with summary), failure ❌ (with reason). Idempotent — exactly one result comment per run; reset + re-run comments again.
- Clear failure reasons on cards:
task.erroris now rendered on the card and in the detail drawer. The most common local-model failure gets a friendly translation: "❌ Failed: Couldn't reach the LLM at http://localhost:1234/v1. Is LM Studio running?" - Delete → reimport escape hatch: deleting a Jira-sourced card removes its key from the dedup list so the still-open ticket re-imports on the next sync.
- Auto-transition to Done (v3.4.1): when a task completes, its Jira ticket transitions to the workflow's Done status (matched by status category, so it works with any workflow naming). Default ON via
jiraConfig.transitionOnDone; failed tickets never move.
📋 Known Limitations (documented in docs/jira-setup.md)
Deliberate v3.4 scope cuts: no re-sync of edited tickets, plaintext token in prompts.json, only the Done transition is automated (no In-Progress transition on pickup), no poller backoff, single-instance dedup, exact/case-sensitive label matching, one-way channel (board-created tasks aren't mirrored to Jira).
New/changed config (project.jiraConfig)
| Key | Default | Purpose |
|---|---|---|
onlyUnassigned |
true |
Assignee guard |
botAccountEmail |
"" |
Assign-to-bot workflow |
maxAutostartPerPoll |
3 |
Autostart cap |
enabledAt |
stamped on enable | First-run watermark |
transitionOnDone |
true |
Auto-move ticket to Done on task success |
New endpoints
POST /api/projects/:id/jira/forget-key— delete→reimport escape hatchPOST /api/projects/:id/jira/task-event— queue-move visibility comments