Answers you can read at a glance: cards, tables, charts, diagrams.
Bandicot agents answer with structured cards instead of walls of text, with issue cards, lists, charts, tables, diagrams and approval prompts, painted identically here, in the desktop app, and in the terminal.
Bounded by design
title 256B · summary 4096B · rows 12 · cells 300B · cols 16 · items 64 · series 16 · nodes 64 · edges 128 · data points 256
Every answer is structured and size-capped, so it stays fast and readable everywhere. This page is a live gallery: the same cards your agents produce in the app, painted right here.
IssueCard
Focused issue · status header, linked title, metadata grid, optional summary and labels. Status is glyph + color together.
Flaky CI on main — 20% failure on migration index step
The CI pipeline flakes ~20% of runs on the main branch at the users.session_expires_at index migration. Backfill job raced the DDL before the column was made nullable.
Raw JSON envelope
{
"kind": "issue_card",
"schema": "bandicot.knowledge-render-issue-card",
"payload": {
"issue_card": {
"schema": "bandicot.knowledge-render-issue-card",
"version": 1,
"item": {
"identifier": "ENG-42",
"title": "Flaky CI on main — 20% failure on migration index step",
"status": "open",
"priority": "high",
"assignee": "alice",
"url": "https://linear.app/bandicot/issue/ENG-42",
"meta": "ENG-42 · opened 3d ago · @alice · Platform"
},
"summary": "The CI pipeline flakes ~20% of runs on the main branch at the users.session_expires_at index migration. Backfill job raced the DDL before the column was made nullable.",
"labels": [
"ci",
"flaky",
"migrations"
]
}
}
}IssueList
Compact rows · status dot + identifier + title + meta. Bounded 64 items, 256-char titles.
Open sprint issues
5 items · max 64
- ENG-41Onboarding checklist — first-run tourENG-41 · Linear · started 2d agohigh
- ENG-42Flaky CI on mainENG-42 · opened 3d ago · @alicehigh
- ENG-43Terminal knowledge gallery — all four themesENG-43 · unassigned · backlogmedium
- ENG-44Desktop knowledge pane — live refreshENG-44 · blocked by ENG-41medium
- ENG-45Docs: ADR 0020 acceptedENG-45 · closed yesterdaylow
Shows all 5 status variants: open, in_progress, blocked, closed. Priority pill only when non-none.
PageList
Page search results · title, snippet, source. One row per Notion/wiki hit.
Relevant docs
3 pages
Semantic ink, raised surfaces, and glyph+color status together. Knowledge painters use drawing primitives, never images.
https://notion.so/bandicot-tui-knowledge
Two-step migration: nullable column → backfill job → NOT NULL. Canary 5% for 15m, then full rollout.
https://notion.so/runbook-backfill
Cards, tables, charts and diagrams share one typed format — the same structured answer on every device.
https://notion.so/bandicot-answer-cards
IncidentCard
Focused operational incident · identifier, severity, summary, and a 12-row field table.
p99 latency spiked to 4.2s at 14:00 UTC on api-gateway. Auto-scaler lagged by ~90s. Mitigated by pinning two extra shards; root cause under review.
- Affected
- api-gateway · us-east-1
- Started
- 2026-08-20 14:00 UTC
- Duration
- 18 minutes
- Severity
- high · customer-visible
- Owner
- @oncall-platform
- Status
- mitigated · review pending
Table
Bordered grid with header row and emphasis columns. Long cells elide on grapheme boundaries at paint time in the terminal.
Sprint status by team
5 cols · 4 rows · bounded 12×16 / 300-char cells
| Team | Open | In progress | Closed | Velocity |
|---|---|---|---|---|
| Platform | 5 | 3 | 12 | 18 pts |
| Design | 2 | 1 | 8 | 11 pts |
| Growth | 4 | 2 | 6 | 9 pts |
| Total | 11 | 6 | 26 | 38 pts |
Chart
Bar, line, area · drawing primitives honoring the theme palette. No chart library. Bounded 16 series × 256 points.
Weekly throughput — opened vs closed
bar · 2 series · 5 points · max 10
CSS/div bars · no chart library · bounded 2×5 points
MTTR (hours) — rolling 5d
line · 1 series · 5 points · max 8.2
CSS/div SVG line/area · no chart library · bounded 1×5 points
Diagram
Box-and-arrow · nodes and directed edges. Reuses the same layout engine as the terminal; wraps gracefully on small screens.
Deployment flow — Bandicot publish
6 nodes · 5 edges · bounded 64/128
Box-and-arrow · wraps on small screens · kind drives border tone.
ConfirmWrite
Approval gate · mirrors the confirm_write interrupt: action, bounded field table, attempt + previous_error. Approve/decline resumes with {confirmed: bool}. Survives “approve 20 minutes later”.
Create Linear issue
bandicot.knowledge-render-confirm-write · 12 rows / 300-char cells · mirrored from confirm_write interrupt
- Title
- Fix flaky CI — make index migration nullable
- Team
- Platform · ENG
- Priority
- High
- Assignee
- @alice
- Labels
- ci, flaky
This will create ENG-46 in Linear under Platform. The issue will be visible to the team and will trigger triage notifications.
Keyboard: y = approve · n = decline · Esc = close
Update Notion page — Runbook
bandicot.knowledge-render-confirm-write · 12 rows / 300-char cells · mirrored from confirm_write interrupt
- Page
- Runbook — session backfill
- Section
- Mitigation steps
- Change
- Add canary rollback procedure
Updates the shared runbook page in Notion. The page has 4 watchers.
Previous attempt failed
Notion rejected the request (page not found — check that the integration has access)
Keyboard: y = approve · n = decline · Esc = close
In the terminal this renders as a focused overlay (y/n + remembered choice, Esc closes). Desktop renders an in-app card that marks resolved in place when declined. Both read the same DTO.
One envelope, every surface
Every answer travels in a tagged envelope; every device paints the same payload. The format is stable, so a card saved today still renders tomorrow.
type RenderKind = "issue_card" | "issue_list" | "page_list" | "incident_card" | "table" | "chart" | "diagram" | "confirm_write";
type RenderRecord = {
kind: RenderKind; // what kind of answer
schema: string; // versioned format
payload: RenderPayload; // the content itself
};