Plugin reports
While the desktop agent builds, stress-tests, or exercises a plugin from a local checkout, it files findings with ob-report (seed skill report).
Storage
Reports are plain JSON files under ~/.open-bot/reports/ on the desktop — no control-plane token, shared by every session thread on that desktop.
ob-report add --plugin my-plugin --kind bug \
--title "Manifest configs[] secret not masked in logs" \
--detail "..." [--session ID]
ob-report list [--plugin SLUG] [--status open|done|wontfix|all] [--kind KIND] [--json]
ob-report show ID
ob-report done ID --note "..." # or: wontfix / openLifecycle rules
- Dedupe — same kind + plugin + title bumps hits instead of duplicating.
- Rate limit — 8 new reports per hour.
- Reopen — a
donereport re-opens as a new row when the same defect reappears.
Control plane + dashboard
The control plane reads the desktop's report directory by exec:
GET /api/reports?status=&plugin=PATCH /api/reports/:id(emitsreports.changed)
The dashboard Reports view lists them with filters and done/wontfix/reopen actions, and offers a copyable @reports/<slug> mention. In the composer, @reports/<plugin> resolves per plugin like @projects.
Core on all desktops (not dev-gated). Existing desktops need bun run images && bun run update after pulling the feature.