Pod

Yes, this is on purpose. Pod is built for agents, so the default page is plain HTML.
Human? View the normal website.
Agent? You probably prefer /mcp/dbtrail/issues.md or /mcp/dbtrail/issues.json, or Pod over MCP.

Reported issues for dbtrail

Pod holds 23 of 73 problems reported by people outside the maintainer team. Issues filed by the project's own owners, members and collaborators are excluded entirely — a maintainer's release checklist is not a warning to a prospective user.

Back to dbtrail.

Most discussed

mcptools: the query/recover tools bypass fetchMerged, so archive short-circuits never apply

internal/mcptools builds its own live+archive merge loop instead of going through query.FetchMerged*, so none of the short-circuits in fetchMerged.go apply to it.

Both data-serving tools do the same thing:

internal/query/fetchmerged.go has (as of #1403)

Read the thread · 2026-08-21 · open · 1 comment

go.mod: drop two orphaned AWS SDK direct dependencies (cloudwatchlogs, rds)

go.mod lists two AWS SDK service clients as direct requirements that no package in the module imports any more:

github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.63.2
github.com/aws/aws-sdk-go-v2/service/rds           v1.116.1

Verification

Not just a gopls hint — go mod why is unambiguous:

$ go mod why github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs
(main module does not need package github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs)

$ go mod why github.com

[Read the thread](https://github.com/dbtrail/dbtrail/issues/1104) · 2026-07-25 · closed · 1 comment

### mcp: list_schema_changes omits snapshot_id — uncovered DDLs cannot be identified from the MCP surface

## Summary

The MCP `list_schema_changes` tool does not return `snapshot_id` (or any coverage indicator), so it is impossible to tell **which** DDLs lack a schema snapshot from the MCP surface — even though `status` (also exposed via MCP) reports the aggregate count of uncovered DDLs and warns that recovery across them may require a manual snapshot.

## Current behavior

`MakeSchemaChangesTool` (`internal/mcptools/mcptools.go`) selects:

```sql
SELECT id, detected_at, schema_name, table_name, dd

[Read the thread](https://github.com/dbtrail/dbtrail/issues/1050) · 2026-07-18 · closed · 1 comment

### Epic: connector-grade MCP for self-hosted deployments — console /mcp + one-click .mcpb bundle

## Goal

Connecting an AI client (Claude Desktop, claude.ai custom connectors, Cursor, …) to a self-hosted bintrail deployment should be **connector-grade simple**: the operator opens their console, and everything they need is on screen — a URL, a token, and a one-click installable bundle. No hand-edited JSON, no DSNs, no SSH tunnels as a prerequisite.

Today the pieces exist but the UX doesn't compose:

- `bintrail-mcp` ships in every release (stdio + `--http`), but configuring it means editing

[Read the thread](https://github.com/dbtrail/dbtrail/issues/1038) · 2026-07-17 · closed · 1 comment

### cliapp: export console/mcp/pg app entrypoints (mirror cliapp.Main) so embedding builds can wrap all binaries; remove dead ext.Record calls

The only exported entrypoint is `cliapp.Main` (cliapp/root.go:62). `cmd/bintrail-console`, `cmd/bintrail-mcp`, `cmd/bintrail-pg` are each `package main` with unexported `main()`, so an embedding distribution can only wrap the core CLI.

Consequence today: cmd/bintrail-mcp/main.go:427,534 call `ext.Record`, but `ext/audit.go`'s sink is nil unless a build installs one — and no shipping build can install a sink into the MCP binary, so those calls are dead code. The flagship default deploy (docker-c

[Read the thread](https://github.com/dbtrail/dbtrail/issues/943) · 2026-07-10 · closed · 1 comment

### [forensics] MCP tools: forensics_capabilities, who_changed, user_activity, connection_history

Part of #701. Depends on #706.

Expose the forensics engine through `bintrail-mcp` (stdio + Streamable HTTP), mirroring the SaaS MCP contract (`backend/app/mcp/handlers/forensics.py` + schemas in `routes/mcp.py:500-630`, SaaS repo nethalo/dbtrail).

## Scope

- New tools: `forensics_capabilities`, `who_changed`, `user_activity`, `connection_history` — input schemas mirroring the SaaS shapes. Keep `pk` **optional** on `who_changed` (the SaaS MCP schema mandates it while its own REST/service layer

[Read the thread](https://github.com/dbtrail/dbtrail/issues/707) · 2026-07-02 · closed · 1 comment

### Data-consistency guarantee: provable Parquet↔MySQL fidelity (epic)

## Problem

bintrail's whole value proposition is that the Parquet files (baseline snapshot + binlog stream) **faithfully represent what is, or was, in the MySQL table**. Today that is an *assumption*, not a *guarantee*. A multi-agent sweep of all three paths (baseline write, live binlog→Parquet, and the reconstruct/read-back side) found **no affirmative mechanism that proves the Parquet matches the source**:

- **Baseline write** — `internal/baseline/`: GTID/binlog position is captured (`metada

[Read the thread](https://github.com/dbtrail/dbtrail/issues/631) · 2026-06-27 · closed · 1 comment

### [BUG P1] BYOS WS protocol mismatch: SaaS sends {command,request_id,...} but agent expects {type,id,data}

## Summary

Every SaaS-side command sent to a BYOS agent via the WebSocket channel (`wss://api.dbtrail.com/v1/agent`) is rejected by the agent with `unknown command type ""` because the field names in the JSON message don't match the agent's `Command` struct. The agent replies with an error, but the response has no `id` to correlate with the SaaS's `request_id`, so the SaaS's `agent_registry.send_command` waits the full 60s timeout and surfaces a misleading `"Agent did not respond within 60 seco

[Read the thread](https://github.com/dbtrail/dbtrail/issues/338) · 2026-05-24 · closed · 1 comment

## Most recent

### The managed MCP token file has no path override, so the shipped compose stores it outside the volume

`Config.MCPTokenPath` has no non-test assignment anywhere in `consoleapp/`, so
`internal/console/server.go:374-376` always falls through to
`DefaultMCPTokenPath()`. There is no flag, no environment variable and no
compose setting to redirect it.

## Why that matters in the shipped stack

`docker-compose.yml` redirects the registry and the auth file into the
persisted volume (`:249`, `:310`, mounted at `:319`). The MCP token file is not
redirected, so it resolves to `$HOME/.config/bintrail/consol

[Read the thread](https://github.com/dbtrail/dbtrail/issues/1493) · 2026-08-28 · closed · 0 comments

### console: show the time-travel SQL port on the Connect page

The embedded time-travel SQL port (`--flashback-listen`) serves the `_flashback` / `_diff` / `_snapshot` schemas for every monitored server, routed by username, authenticated with the console token. The console UI never mentions it: nothing shows whether it is enabled, where it listens, or how to connect, and enabling it requires knowing the flag exists.

Connect AI is the precedent: the console tells you your MCP URL and how to wire each client. Time-travel SQL deserves the same treatment.

Pro

[Read the thread](https://github.com/dbtrail/dbtrail/issues/1446) · 2026-08-23 · closed · 0 comments

### console: author access profiles (flags/profiles/access) from the UI

Access profiles (the `flag` / `profile` / `access` machinery) are consumed by the console (profiles are applied per session where configured, and `GET /api/profiles` feeds pickers) but can only be authored from the CLI. Anyone setting up redaction rules has to leave the browser for the one step that defines what the browser will enforce.

Proposal: a settings surface to author them from the console:

- list / add / remove flags on tables and columns;
- list / create / delete profiles;
- edit a p

[Read the thread](https://github.com/dbtrail/dbtrail/issues/1445) · 2026-08-23 · closed · 0 comments

### console: schema-change (DDL) history surface

The index records DDL (`schema_changes`), the MCP surface serves it (`list_schema_changes`), and the CLI can query it (`bintrail query --event-type ddl`). The console has no surface for it: the Events view's type filter offers only INSERT / UPDATE / DELETE, so "what ALTERs ran last week?" is answerable from every surface except the browser.

Proposal: a schema-changes surface in the console. Either of:

- a DDL option in the Events view type filter that switches the result table to the schema_ch

[Read the thread](https://github.com/dbtrail/dbtrail/issues/1443) · 2026-08-23 · closed · 0 comments

### query: no PK range filters; pk_min/pk_max over single-column numeric PKs, with matching MySQL and DuckDB cast semantics

The `query` MCP tool (and the engine under it) supports only exact PK matching: `pk` for one value, `pks` for a list — both compiled to `pk_hash = SHA2(?, 256) AND pk_values = ?` equality pairs. "Every event whose PK is greater than N" (a burst of inserted ids, an autoincrement range around an incident, everything after a known cutoff row) cannot be asked; the client must enumerate candidate ids one by one into `pks`, guessing where the range ends.

**Why this is not just adding `>` to the WHERE

[Read the thread](https://github.com/dbtrail/dbtrail/issues/1440) · 2026-08-23 · closed · 0 comments

### query MCP tool: no order argument, so "the last N events" cannot be asked; expose the engine's existing DESC support

The `query` MCP tool has no `order` argument: results always come back ascending, and `limit` therefore keeps the OLDEST prefix of whatever matches. "Show me the last N events" — the single most common question during an incident — forces the client to guess a `since` window tight enough that the oldest-prefix trim happens to contain the newest rows, then count backwards. Guess too wide and the newest events fall off the end with only the truncation warning to hint at it; too narrow and they are

[Read the thread](https://github.com/dbtrail/dbtrail/issues/1439) · 2026-08-23 · open · 0 comments

### recover_cascade MCP: the whole reversal script rides one JSON field and outgrows client result limits; split summary from script and chunk the SQL

The `recover_cascade` MCP tool returns the entire reversal script inside the single `sql` field of its JSON payload (`recoverCascadeResult` in `internal/mcptools/recover_cascade.go`). Observed live: 69 parent events produced a ~64 KB single-field response; MCP clients cap tool-result size, so a real incident (a cascade touching thousands of child rows) hands the client a payload it refuses or truncates, and the operator loses exactly the artifact the tool exists to produce. The sibling `recover`

[Read the thread](https://github.com/dbtrail/dbtrail/issues/1438) · 2026-08-23 · open · 0 comments

### schema_changes: unqualified DDL records an empty schema_name; resolve it from the QUERY_EVENT's default database

An unqualified DDL statement is recorded with an empty `schema_name`, so the `schema` filter on the `list_schema_changes` MCP tool (and any direct query against `schema_changes` filtering by schema) finds nothing for it. Example: a session does `USE wordpress` and then

```sql
TRUNCATE TABLE dbt_burst_referrers;

The row lands in schema_changes with schema_name = '', and list_schema_changes with schema: "wordpress" never returns it. The unqualified form is what people and ORMs actual

Read the thread · 2026-08-23 · open · 0 comments

console MCP: reach every registered server over one connection (optional server argument on tools)

The console MCP endpoint binds each session to one server: /mcp is the default selection and /mcp/{id-or-name} a named registry entry. A console monitoring several servers therefore needs one MCP connection per server, and an AI client that should see the whole fleet has to be configured N times. The Connect AI page hands out per-server URLs, which makes the limitation visible to every multi-server operator.

Feature: one connection that can reach every registered server.

Two shapes worth w

Read the thread · 2026-08-23 · open · 0 comments

console: Undo identifies the clicked change by second, not by event — same-second pairs invert the outcome

The console's "Undo" bridge carries the clicked event to Recover as a time, not as an identity: pendingRecover.time is second-granular (consoleTSFormat) and becomes until, which the server applies as event_timestamp <= ?. Since #1404 the request also carries limit_per_pk = 1, so the reversal targets the single newest event at or before the end of that second.

Within one second that is not necessarily the event the operator clicked, and on one shape the outcome inverts:

Read the thread · 2026-08-21 · closed · 0 comments

merge: index/archive divergence is logged but never reaches the console or MCP response warnings

Surfaced by review of #1319, which added a slog.Warn when two copies of one event_id disagree between the index and a Parquet archive.

slog.Warn is the only output, and for two of the three surfaces that call MergeResults the operator can never see it:

Read the thread · 2026-08-13 · closed · 0 comments

ext: settings-surface provider seam + a registry instead of a single view slot

The console can host exactly one extension view, and it can only be a data view. That is enough for Forensics and nothing else. An embedding distribution that wants to add an administration surface — the concrete case is per-user roles, but any settings-shaped extension has the same problem — has nowhere to put it.

What blocks it today

  1. One slot. ext/consoleview.go stores var consoleView ConsoleViewProvider and SetConsoleView overwrites it. A second provider silently repla

Read the thread · 2026-08-09 · closed · 0 comments

reconstruct: boundary-probe error leaks the --at CLI flag to MCP clients

Found during PR #1283 review (pre-existing, confirmed identical on main).

internal/reconstruct/boundary.go:~100 returns fmt.Errorf("check whether transaction %s continues past --at: ..."), and the MCP reconstruct tool hands that straight to ErrorResult (internal/mcptools/reconstruct.go fetch path) — a CLI flag name (--at) reaching an MCP client, the class the "errors must never leak a CLI flag to an MCP client" rule exists to prevent (the tool parameter is at).

Fix direction: the

Read the thread · 2026-08-08 · closed · 0 comments

mcp: query/recover tools skip failed archive sources with no warning in the result

Found during PR #1283 review (pre-existing, outside that diff). Fourth surface of the #1281 class.

The MCP query and recover tools skip a failed archive source with only slog.Warn("archive query failed, skipping", ...) and continue (internal/mcptools/mcptools.go:~642 and ~763). An MCP client sees only the JSON result — a response missing every event held by that source reads as complete. This is exactly the blind spot #1281 closed for the reconstruct tool (which now reports `archi

Read the thread · 2026-08-08 · closed · 0 comments

mcp: reconstruct GapError hint offers only allow_gaps, omitting the archive-reconcile remedy

Follow-up to #961 (fixed for the CLI surface in PR #1268).

internal/mcptools/reconstruct.go (~459-464): on a planner *query.GapError the tool error offers an agent only allow_gaps: true — the lossy remedy — while the sibling SourceEmptyError branch (~466) already names bintrail archive reconcile as the non-lossy fix. The rebuilt-index case (empty archive_state, hours rotated out of MySQL) lands on the gap branch, so an agent is steered toward a possibly incomplete reconstruction whe

Read the thread · 2026-08-07 · closed · 0 comments

The remaining reports are on the project's issue tracker.