[ai.gateway] recipe "google" declares an embedding touchpoint without max_batch_tokens; recursion is the only safety net for batch caps.
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42710",
message: "extension \"vector\" already exists, skipping",
file: "extension.c",
line: "2120",
routine: "CreateExtension",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42710",
message: "extension \"pg_trgm\" already exists, skipping",
file: "extension.c",
line: "2120",
routine: "CreateExtension",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42710",
message: "extension \"pgcrypto\" already exists, skipping",
file: "extension.c",
line: "2120",
routine: "CreateExtension",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"sources\" already exists, skipping",
file: "parse_utilcmd.c",
line: "211",
routine: "transformCreateStmt",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"pages\" already exists, skipping",
file: "parse_utilcmd.c",
line: "211",
routine: "transformCreateStmt",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"idx_pages_type\" already exists, skipping",
file: "index.c",
line: "894",
routine: "index_create",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"idx_pages_frontmatter\" already exists, skipping",
file: "index.c",
line: "894",
routine: "index_create",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"idx_pages_trgm\" already exists, skipping",
file: "index.c",
line: "894",
routine: "index_create",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"idx_pages_updated_at_desc\" already exists, skipping",
file: "index.c",
line: "894",
routine: "index_create",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"idx_pages_source_id\" already exists, skipping",
file: "index.c",
line: "894",
routine: "index_create",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"pages_deleted_at_purge_idx\" already exists, skipping",
file: "index.c",
line: "894",
routine: "index_create",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"pages_coalesce_date_idx\" already exists, skipping",
file: "index.c",
line: "894",
routine: "index_create",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"content_chunks\" already exists, skipping",
file: "parse_utilcmd.c",
line: "211",
routine: "transformCreateStmt",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"idx_chunks_page_index\" already exists, skipping",
file: "index.c",
line: "894",
routine: "index_create",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"idx_chunks_page\" already exists, skipping",
file: "index.c",
line: "894",
routine: "index_create",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"idx_chunks_embedding\" already exists, skipping",
file: "index.c",
line: "894",
routine: "index_create",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"idx_chunks_symbol_name\" already exists, skipping",
file: "index.c",
line: "894",
routine: "index_create",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"idx_chunks_language\" already exists, skipping",
file: "index.c",
line: "894",
routine: "index_create",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"idx_chunks_embedding_image\" already exists, skipping",
file: "index.c",
line: "894",
routine: "index_create",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"idx_chunks_search_vector\" already exists, skipping",
file: "index.c",
line: "894",
routine: "index_create",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"idx_chunks_symbol_qualified\" already exists, skipping",
file: "index.c",
line: "894",
routine: "index_create",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"code_edges_chunk\" already exists, skipping",
file: "parse_utilcmd.c",
line: "211",
routine: "transformCreateStmt",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"idx_code_edges_chunk_from\" already exists, skipping",
file: "index.c",
line: "894",
routine: "index_create",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"idx_code_edges_chunk_to\" already exists, skipping",
file: "index.c",
line: "894",
routine: "index_create",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"idx_code_edges_chunk_to_symbol\" already exists, skipping",
file: "index.c",
line: "894",
routine: "index_create",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"code_edges_symbol\" already exists, skipping",
file: "parse_utilcmd.c",
line: "211",
routine: "transformCreateStmt",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"idx_code_edges_symbol_from\" already exists, skipping",
file: "index.c",
line: "894",
routine: "index_create",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"idx_code_edges_symbol_to\" already exists, skipping",
file: "index.c",
line: "894",
routine: "index_create",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"links\" already exists, skipping",
file: "parse_utilcmd.c",
line: "211",
routine: "transformCreateStmt",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"idx_links_from\" already exists, skipping",
file: "index.c",
line: "894",
routine: "index_create",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"idx_links_to\" already exists, skipping",
file: "index.c",
line: "894",
routine: "index_create",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"idx_links_source\" already exists, skipping",
file: "index.c",
line: "894",
routine: "index_create",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"idx_links_origin\" already exists, skipping",
file: "index.c",
line: "894",
routine: "index_create",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"tags\" already exists, skipping",
file: "parse_utilcmd.c",
line: "211",
routine: "transformCreateStmt",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"idx_tags_tag\" already exists, skipping",
file: "index.c",
line: "894",
routine: "index_create",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"idx_tags_page_id\" already exists, skipping",
file: "index.c",
line: "894",
routine: "index_create",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"raw_data\" already exists, skipping",
file: "parse_utilcmd.c",
line: "211",
routine: "transformCreateStmt",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"idx_raw_data_page\" already exists, skipping",
file: "index.c",
line: "894",
routine: "index_create",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"timeline_entries\" already exists, skipping",
file: "parse_utilcmd.c",
line: "211",
routine: "transformCreateStmt",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"idx_timeline_page\" already exists, skipping",
file: "index.c",
line: "894",
routine: "index_create",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"idx_timeline_date\" already exists, skipping",
file: "index.c",
line: "894",
routine: "index_create",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"idx_timeline_dedup\" already exists, skipping",
file: "index.c",
line: "894",
routine: "index_create",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"page_versions\" already exists, skipping",
file: "parse_utilcmd.c",
line: "211",
routine: "transformCreateStmt",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"idx_versions_page\" already exists, skipping",
file: "index.c",
line: "894",
routine: "index_create",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"ingest_log\" already exists, skipping",
file: "parse_utilcmd.c",
line: "211",
routine: "transformCreateStmt",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"idx_ingest_log_source_type_created\" already exists, skipping",
file: "index.c",
line: "894",
routine: "index_create",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"config\" already exists, skipping",
file: "parse_utilcmd.c",
line: "211",
routine: "transformCreateStmt",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"access_tokens\" already exists, skipping",
file: "parse_utilcmd.c",
line: "211",
routine: "transformCreateStmt",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"idx_access_tokens_hash\" already exists, skipping",
file: "index.c",
line: "894",
routine: "index_create",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"mcp_request_log\" already exists, skipping",
file: "parse_utilcmd.c",
line: "211",
routine: "transformCreateStmt",
}
{
severity_local: "NOTICE",
severity: "NOTICE",
code: "42P07",
message: "relation \"oauth_clients\" already exists, skipping",
file: "parse_utilcmd.c",
line: "211",
routine: "transformCreateStmt",
}
Schema probe/migrate failed: column "source_id" does not exist
Try: gbrain init --migrate-only
[doctor.db_checks] done
{"schema_version":2,"status":"unhealthy","health_score":10,"checks":[{"name":"resolver_health","status":"ok","message":"42 skills, all reachable"},{"name":"skill_conformance","status":"ok","message":"42/42 skills pass"},{"name":"minions_migration","status":"fail","message":"WEDGED MIGRATION(s): 0.32.2 (>=3 consecutive partials). Run: gbrain apply-migrations --force-retry 0.32.2"},{"name":"upgrade_errors","status":"warn","message":"Post-upgrade failure on 2026-05-15 (0.34.4.0 → 0.35.0.0, phase: post-upgrade). Recovery: Run: gbrain apply-migrations --yes"},{"name":"sync_failures","status":"warn","message":"1 unacknowledged sync failure(s) [UNKNOWN=1]. people/will-vanish.md (file vanished mid-sync (working tree drifted from headCommit). Fix the file(s) and re-run 'gbrain sync', or use 'gbrain sync --skip-failed' to acknowledge."},{"name":"slug_fallback_audit","status":"ok","message":"info: 2 slug fallbacks in the last 7 days (SLUG_FALLBACK_FRONTMATTER)."},{"name":"multi_source_drift","status":"warn","message":"337 page slug(s) appear at 'default' but NOT at the intended source (e.g., resolver (intended=brain), personal/readme (intended=brain), civic/readme (intended=brain), inbox/readme (intended=brain), archive/readme (intended=brain)). Two possible causes: (1) pre-v0.30.3 putPage misroutes; (2) source X never completed initial sync and the default page is unrelated. Verify with 'gbrain sources status', then either re-sync with 'gbrain sync --source <id> --full' or 'gbrain delete <slug>' if the default-source row is the misroute. (A 'gbrain sources rehome' cleanup command is tracked for v0.32.0.)"},{"name":"connection","status":"ok","message":"Connected, 337 pages"},{"name":"pgvector","status":"ok","message":"Extension installed"},{"name":"rls","status":"ok","message":"RLS enabled on 36/36 public tables"},{"name":"schema_version","status":"warn","message":"Version 50, latest is 66. Fix: gbrain apply-migrations --yes"},{"name":"rls_event_trigger","status":"ok","message":"Auto-RLS event trigger installed"},{"name":"embeddings","status":"ok","message":"100% coverage, 0 missing"},{"name":"embedding_provider","status":"ok","message":"openai:text-embedding-3-large ✓ 1601ms, 1536 dims, DB aligned"},{"name":"graph_coverage","status":"warn","message":"Entity link coverage 0%, timeline 0% (2 entity pages). Run: gbrain extract all"},{"name":"brain_score","status":"warn","message":"Brain score 45/100 (embed 35/35, links 0/25, timeline 0/15, orphans 0/15, dead-links 10/10)"},{"name":"integrity","status":"warn","message":"Sampled 337 pages; 1 bare-tweet phrase(s), 89 external link(s). Run: gbrain integrity check (or integrity auto to repair)."},{"name":"jsonb_integrity","status":"ok","message":"All JSONB columns store objects/arrays"},{"name":"takes_weight_grid","status":"ok","message":"No takes yet"},{"name":"whoknows_health","status":"warn","message":"whoknows eval fixture missing at test/fixtures/whoknows-eval.jsonl. Fix: hand-label 10 queries you'd actually run, format {query, expected_top_3_slugs, notes}."},{"name":"markdown_body_completeness","status":"ok","message":"No truncated bodies detected"},{"name":"frontmatter_integrity","status":"warn","message":"314 frontmatter issue(s) across 2 source(s). aicortex: 313 (MISSING_OPEN=313); brain: 1 (MISSING_OPEN=1). Fix: gbrain frontmatter validate <source-path> --fix"},{"name":"eval_capture","status":"ok","message":"No capture failures in the last 24h"},{"name":"contradictions","status":"ok","message":"Skipped (eval_contradictions_runs table unavailable — apply migrations to enable)"},{"name":"facts_extraction_health","status":"ok","message":"No facts:absorb failures in the last 24h."},{"name":"effective_date_health","status":"ok","message":"Sample of last 1000 pages clean (no fallback-with-parseable-fm-date, no future-dated, no pre-1990)"},{"name":"salience_health","status":"ok","message":"Skipped (no pages have emotional_weight > 0; either fresh install or recompute hasn't run yet)"},{"name":"queue_health","status":"ok","message":"No stalled-forever jobs; no queue over depth 10."},{"name":"subagent_provider","status":"ok","message":"Subagent tier resolves to Anthropic"},{"name":"facts_health","status":"ok","message":"facts_health(default): 0 active, 0 today, 0 this week, 0 consolidated, top entities —"},{"name":"image_assets","status":"ok","message":"No image assets indexed yet"},{"name":"ocr_health","status":"ok","message":"OCR not in use (or no images ingested with OCR opt-in)"},{"name":"sync_freshness","status":"fail","message":"Source 'brain' (Local Brain) last synced 3d ago — brain search is stale!; Source 'aicortex' (AI Cortex Documents) last synced 3d ago — brain search is stale!. Run `gbrain sync --source <id>` for each stale source"},{"name":"search_mode","status":"ok","message":"search.mode is unset (using balanced fallback). Run `gbrain search modes` to see what is running and pick a mode explicitly."},{"name":"eval_drift","status":"ok","message":"No retrieval-affecting files changed in working tree."},{"name":"reranker_health","status":"warn","message":"2 reranker auth failure(s) in last 7 days. Fix: verify ZEROENTROPY_API_KEY and run `gbrain models doctor`."}]}
What happened?
gbrain upgradecorrectly detects thebuninstall method but then shells out tobun update gbrainwithout settingcwd. The child process inherits the user's shell cwd (typically~), which has nopackage.json, so bun silently no-ops withNo package.json, so nothing to updateand gbrain reports the upgrade as failed against a perfectly working install.The closest existing issue is #656, which added a
bun-linkcode path but left the barebun(global-install) case unchanged. #658 is adjacent (npm name collision) but distinct.Manual Workaround
What did you expect?
successful upgrade
Steps to reproduce
Output:
Pasting the suggested manual command from
~reproduces the same no-op.Fix
Detect the install root (the directory above
node_modules/gbrainthat has bothpackage.jsonand anode_modules/subdir) and pass it ascwdtoexecFileSync('bun', ['update', 'gbrain'], { cwd, ... }). When detection fails, the error message now prints a paste-ready manual recovery command instead of the misleading "Upgrade failed" line.PR with the fix + unit tests: #1030
Environment
gbrain doctor --jsonoutput