II.
Page overview
Reference · livepage:docs-evil-fallbacks
Evil Fallbacks overview
Inspect the raw attributes, linked wiki pages, and inbound or outbound graph edges for page:docs-evil-fallbacks.
Attributes
nodeKind
Page
sourcePath
docs/evil-fallbacks.md
sourceKind
repo-docs
title
Evil Fallbacks
displayName
Evil Fallbacks
slug
docs/evil-fallbacks
articlePath
wiki/docs/evil-fallbacks.md
article
# Evil Fallbacks
Silent fallback mechanisms that hide real problems, introduce unexpected degraded behavior, or make debugging impossible. Ordered by severity within each section.
**Legend:** ~~strikethrough~~ = fixed/removed, **(logged)** = diagnostic logging added, **(hardened)** = fallback behavior changed
---
## SDK & Runtime (packages/babysitter-sdk, packages/genty/runtime)
### Critical
**Journal append queue swallows previous errors** — `packages/babysitter-sdk/src/storage/journal.ts:19-27` **(logged)**
`.catch(() => undefined)` on the previous operation means ALL prior journal write failures are silently swallowed. The journal — the system's audit trail and replay foundation — can silently lose events. Queue must continue (can't block future writes), so error is now logged to stderr.
~~**Atomic write silently downgrades to non-atomic**~~ — `packages/babysitter-sdk/src/storage/atomic.ts:30-47` **(hardened)**
On `ENOENT`, the atomic rename used to fall back to `fs.writeFile` (non-atomic). Now throws an error instead.
### High
~~**Cost computation silent failure**~~ — `packages/babysitter-sdk/src/runtime/orchestrateIteration.ts:135-136` **(hardened)**
Three operations in one `try/catch`. Error now captured as `costError` field in the RUN_COMPLETED event instead of silently vanishing.
**Stray effect detection is a heuristic guess** — `packages/babysitter-sdk/src/runtime/orchestrateIteration.ts:94-107`
Un-awaited `ctx.task()` detected via `setImmediate` loops + 250ms delay. Timing-dependent — effects can be silently lost.
**Policy decision reporting — best effort** — `packages/babysitter-sdk/src/runtime/intrinsics/task.ts:132-133` **(logged)**
Compliance decisions now log failures to stderr. Audit trail gaps are visible.
### Medium
**Lock acquisition retries 41 times silently** — `packages/babysitter-sdk/src/storage/lock.ts:68-79` **(logged)**
Now logs on first retry attempt when contention is detected.
**ESM → CJS module loading fallback chain** — `orchestrateIteration.ts:197-202`, `runSupport.ts:314-329`, `validation.ts:125-138`
Try ESM `import()`, if fail try `require()`, swallow ESM error. Original failure reason lost. Three locations.
**Require cache clear failures ignored** — `packages/babysitter-sdk/src/runtime/orchestrateIteration.ts:200` **(logged)**
Now logs the failure with resolved path.
**Breakpoint auto-approval — non-critical** — `packages/babysitter-sdk/src/runtime/intrinsics/task.ts:141-154` **(logged)**
Now logs when auto-approval evaluation fails.
**Process library resolution — fall through** — `packages/babysitter-sdk/src/processLibrary/active.ts:196-203` **(logged)**
Now logs when falling through to default.
**Git marketplace — nested fallback** — `packages/babysitter-sdk/src/plugins/marketplace.ts:134-139` **(logged)**
Stash errors now logged before force-checkout.
**Session marker cleanup — ignore errors** — `packages/babysitter-sdk/src/utils/sessionMarker.ts:79,101`
Stale markers accumulate on disk over time.
**Daemon lifecycle cleanup — `.catch(() => {})`** — `packages/genty/runtime/src/daemon/lifecycle.ts:68-70,174-178,243`
PID file deletion and log writes are best-effort. Stale PID files cause "daemon already running" false positives.
**Webhook trigger setup — silent skip** — `packages/genty/runtime/src/daemon/loop.ts:132-142`
Port in use or permission denied → trigger silently never fires. No indication to user.
**Resource warning callbacks swallowed** — `packages/genty/runtime/src/resources/manager.ts:141-155`
Subscriber errors silently discarded.
---
## genty Core (packages/genty/core)
### Critical
**Endpoint resolution fallback chain** — `packages/genty/core/src/session.ts:38-89` **(logged)**
9 env vars checked in priority order. Model defaults to "gpt-4o" now warns when no model specified. Anthropic path now logs model conversion.
### High
**Tool error wrapping loses everything** — `packages/genty/core/src/agenticTools/shared/results.ts:37-58` **(logged)**
Now logs full error including stack trace to stderr before converting to errorResult.
**Subagent invocation — message only** — `packages/genty/core/src/subagent/invoker.ts:65-76,116-118` **(logged)**
Now logs full stack trace in `buildErrorResult` before returning message-only result.
### Medium
**AST-grep → ripgrep silent fallback** — `packages/genty/core/src/agenticTools/tools/code.ts:100-130` **(logged)**
Now logs exit code when falling back from `sg` to `rg`.
**Mermaid rendering — "mmdc not available"** — `packages/genty/core/src/agenticTools/tools/code.ts:216-239` **(logged)**
Now logs the error reason. Temp file cleanup failures also logged.
**Puppeteer import — misleading message** — `packages/genty/core/src/agenticTools/browser/tool.ts:42-49` **(hardened)**
Error message now includes actual import error, not just "not installed."
**JSON parse fallback changes types** — `packages/genty/core/src/agenticTools/tools/programmaticToolCalling.ts:137-142`
`JSON.parse()` fails → returns raw string instead. Callers expecting object get string. Type mismatch propagates.
**Web search URL decode fallback** — `packages/genty/core/src/agenticTools/web/searchHelpers.ts:18-23`
`decodeURIComponent` fails → uses raw DuckDuckGo-encoded URL. Broken URLs passed downstream.
~~**Session abort is a no-op**~~ — `packages/genty/core/src/session.ts` **(hardened)**
`abort()` now cancels the active provider request through the request `AbortController`; abort after completion is harmless and aborted prompts do not append partial history.
**Directory walk silent failure** — `packages/genty/core/src/agenticTools/shared/paths.ts:61-65` **(logged)**
Now logs the directory path and error before returning.
**Spawn error — message only** — `packages/genty/core/src/agenticTools/shared/process.ts:94-99` **(hardened)**
Now includes `ErrnoException.code` (ENOENT, EACCES, etc.) in error message.
---
## Agent Platform (packages/genty/platform)
### Critical
**Process module load retry — 3 silent attempts** — `packages/genty/platform/src/harness/internal/createRun/orchestration/effects.ts:632-678` **(logged)**
Now logs each retry attempt unconditionally, not just in verbose mode.
### High
**Session recovery — 3-layer fallback chain** — `packages/genty/platform/src/harness/internal/createRun/planProcess/phase.ts:166-464`
If agent fails → recover from outputs → recovery prompt → host-side recovery. Three levels of silent degradation before final error. Invisible without verbose mode.
~~**Process definition extraction — wrong code blocks**~~ — `packages/genty/platform/src/harness/internal/createRun/planProcess/recovery.ts:33-106` **(hardened)**
Non-process code blocks are now rejected (returns `null`) instead of being extracted and executed.
**Journal scan silent stop** — `packages/genty/platform/src/storage/journalWatcher.ts:83-139` **(logged)**
readdir error now logged with directory path and error message.
**MCP reconnection — error status not exception** — `packages/genty/platform/src/mcp/client/manager.ts:242-271` **(logged)**
Connection failures now logged after exhausting retries.
### Medium
**CLI orchestration fallback** — `packages/genty/platform/src/harness/internal/createRun/orchestration/index.ts:42-44`
No Pi backend → silently falls back to subprocess CLI mode. Undocumented user-facing behavior change.
**Prompt retry — no history** — `packages/genty/platform/src/harness/internal/createRun/agent-core-loop.ts:118-164` **(logged)**
First retry now always logged to stderr.
**Effect execution retry — count swallowed** — `packages/genty/platform/src/harness/internal/createRun/orchestration/effects.ts:521-630` **(logged)**
Now logs effect ID, attempt number, and error before each retry.
**Harness name resolution — no validation** — `packages/genty/platform/src/harness/internal/createRun/agent-core-loop.ts:250-262`
Unknown harness names returned as-is. Typos only caught at runtime execution.
**MCP config file — corrupt = empty** — `packages/genty/platform/src/mcp/client/config.ts:33-52` **(logged)**
Non-ENOENT read errors and JSON parse errors now logged distinctly.
**Session state parsing — silent defaults** — `packages/genty/platform/src/session/parse.ts:78-120`
Malformed values silently revert to defaults. Invalid iteration counts become defaults without indication.
**MCP tool execution — exception → result object** — `packages/genty/platform/src/mcp/client/executor.ts:38-59` **(logged)**
Now logs tool name and error message before converting to result object.
---
## Agent Adapter Family (packages/adapters, agent-launch-adapter, triggers-adapter, tools-adapter)
### High
**Provider resolution — 5-level model fallback** — `packages/adapters/core/src/provider-resolver.ts:94-96` **(logged)**
Now logs which source was selected (input/ADAPTER_MODEL/profile/defaults-file/provider-default) at debug level.
**Credential cascade — silent switching** — `packages/adapters/core/src/provider-resolver.ts:34-49`
API key resolved from: direct input → ADAPTER_API_KEY → GOOGLE_API_KEY → GEMINI_API_KEY → provider envKey. No indication which credential is active.
**Region resolution — 6+ env vars** — `packages/adapters/core/src/provider-resolver.ts:113-114`
`ADAPTER_REGION ?? GOOGLE_CLOUD_LOCATION ?? VERTEXAI_LOCATION ?? AWS_REGION ?? AWS_REGION_NAME ?? params.region`. Wrong region = wrong datacenter, no log.
~~**Auth detection — `void e;` suppression**~~ **(logged)** — `packages/adapters/cli/src/commands/doctor.ts:63-69`
Auth detection errors become `{ status: 'unauthenticated' }`. `void e;` explicitly suppresses the error.
~~**GitHub API failures — empty result**~~ **(logged)** — `packages/triggers-adapter/src/enrich.ts:61-96`
Missing token, rate limits, HTTP errors all return `[]`. No distinction from "no changes."
### Medium
**Google → Vertex silent upgrade** — `packages/adapters/core/src/provider-resolver.ts:124-126` **(logged)**
Now always logs the upgrade with reason (project name or env var value).
**Profile precedence hidden** — `packages/adapters/core/src/provider-profiles.ts:135-170`
Project-level file silently shadows global-level. No indication which is active.
**Unknown provider → 'custom'** — `packages/adapters/core/src/provider-resolver.ts:25`
Unknown provider IDs silently become 'custom' with no warning.
**Trigger backend detection → 'github'** — `packages/triggers-adapter/src/enrich.ts:9-12`
Unknown backends silently default to 'github'.
**Adapter registration — skip on error** — `packages/adapters/cli/src/bootstrap.ts:73-85`
Failed adapters silently skipped during startup. Only stderr log, not captured by logging system.
**Plugin capability detection — catch all** — `packages/adapters/cli/src/lib/agent-capabilities.ts:58-71`
Command execution timeout/error → `{ supportsPlugins: false }`. No distinction from "not installed."
**Gateway shutdown — void suppression** — `packages/adapters/cli/src/commands/gateway/serve.ts:75-76`
`process.once('SIGINT', () => void finish())`. Shutdown errors completely suppressed. Could leave zombie processes.
**Git enrichment — empty changes** — `packages/triggers-adapter/src/enrich.ts:30-42`
Git command failures return `[]`. "No changes" indistinguishable from "git failed."
---
## Live-Stack Test Infrastructure
### High
~~**Silent model substitution**~~ — `.github/workflows/live-stack.yml:230-233` **(hardened)**
Now throws instead of silently substituting. If mini isn't supported, the matrix entry fails at generation time.
~~**Missing model config → foundry-gpt55**~~ — `.github/workflows/live-stack.yml:231` **(hardened)**
Now throws `Error('Unknown model ...')` instead of silently defaulting. Typos fail fast.
~~**Unknown agent → synthetic config**~~ — `.github/workflows/live-stack.yml:235-236` **(hardened)**
Now throws `Error('Unknown agent ...')` instead of inventing a config.
~~**Unknown mode → non-interactive**~~ — `.github/workflows/live-stack.yml:251` **(hardened)**
Now throws `Error('Unknown mode ...')`.
~~**Unknown install → vanilla**~~ — `.github/workflows/live-stack.yml:252` **(hardened)**
Now throws `Error('Unknown install mode ...')`.
~~**Hooks "pending" cast to "passed"**~~ — `packages/adapters/cli/tests/live-stack/primary-live-runner.ts:889-909` **(hardened)**
Removed `'pending' as 'passed'` type lie. Deferred hooks now start as `'failed'` with explicit upgrade path.
**Non-zero exit tolerated** — `packages/adapters/cli/tests/live-stack/primary-live-runner.ts:306-326`
Exit code 1 acceptable if artifact file exists. Crashes after partial output still pass.
### Medium
~~**3-event journal = "completed"**~~ — `packages/adapters/cli/tests/live-stack/primary-live-runner.ts:919-930` **(hardened)**
`MIN_JOURNAL_EVENTS` raised from 3 to 5. Journal events alone no longer count as completion proof.
**Odyssey validation is weak** — `packages/adapters/cli/tests/live-stack/primary-live-runner.ts:1025-1031`
Only checks: >500 bytes, no error strings, has Greek chars, has markdown headers, mentions "Odyssey." Easily gamed.
**JSON parse errors → `2>/dev/null`** — `.github/workflows/live-stack.yml:578,595-597`
Malformed artifacts silently produce empty strings. Report shows "—" with no error indication.
**grep count errors → zero** — `.github/workflows/live-stack.yml:585-586`
`grep -c '✗' 2>/dev/null || true`. Grep errors become "0 failures." Unreadable reports appear clean.
**Native package install — continue on failure** — `.github/workflows/live-stack.yml:81-83`
`npm install --no-save $NATIVE_PKGS || echo "some native deps failed to install"`. Build continues with missing deps.
**genty startup check — non-fatal** — `.github/workflows/live-stack.yml:454-456`
genty binary can't start → test proceeds anyway. Later failures attributed to test logic.
**Run evidence files — silent skip** — `packages/adapters/cli/tests/live-stack/primary-live-runner.ts:630-635`
Missing run metadata files silently skipped. Incomplete trace ID evidence.
**Task directory errors → empty** — `packages/adapters/cli/tests/live-stack/primary-live-runner.ts:649-655`
Missing tasks directory returns `[]`. Failed runs look like "no tasks created."
---
## Atlas & Graph (packages/atlas)
### Medium
**YAML schema parse errors silently skipped** — `packages/atlas/src/indexer.ts:250-264,273-283`
`catch { }` in `loadNodeKinds()` and `loadEdgeKinds()`. Bad schema files silently skip, parseErrors counter incremented but never reported to user. Graph definition may be incomplete.
**Parse error counter never surfaced** — `packages/atlas/src/indexer.ts:417-419`
Parse errors are counted internally but the count is not returned or logged. Caller has no way to know how many files failed.
---
## Harness Discovery & Config (packages/babysitter-sdk/src/harness, packages/babysitter-sdk/src/config)
### Critical
**Graph catalog resolution silently falls back to hardcoded metadata** — `packages/babysitter-sdk/src/harness/adapterFallbackMetadata.ts:179-220` **(logged)**
`buildStaticFallbackMetadata()` catches ALL errors and returns `LOCAL_FALLBACK_METADATA`. If catalog loading fails or returns all-false capabilities (schema mismatch), silently uses hardcoded local fallback. No indication which metadata is active.
### High
**Harness discovery falls back to legacy probing silently** — `packages/babysitter-sdk/src/harness/discovery.ts:144-151` **(logged)**
`discoverHarnesses()` tries adapters discovery first, any error falls back to legacy direct probing. User never knows which path was taken. Degraded behavior (slower, less capable) is invisible.
**Config resolution — 10+ `??` chains without logging** — `packages/babysitter-sdk/src/config/configValidation.ts:49-86`
`overrides?.field ?? parseEnvVar(..., DEFAULTS.field)` repeated for every config key. No logging of which source (override, env var, default) was selected. Effective config is unauditable.
**Boolean parsing treats everything non-true as false** — `packages/babysitter-sdk/src/config/configValidation.ts:18-21`
`parseEnvBoolean()` returns `false` for undefined, empty string, or any non-"1"/"true" value. `false` is indistinguishable from "user explicitly set to false."
**Log level parsing — invalid becomes default** — `packages/babysitter-sdk/src/config/configValidation.ts:37-43`
Invalid log level silently reverts to fallback. User thinks they set "debug" but gets "info."
### Medium
**Legacy session directory remapping** — `packages/babysitter-sdk/src/harness/adapterFallbackMetadata.ts:8-11`
`resolveFallbackSessionDir()` silently remaps `LEGACY_REPO_RUNS_DIR` to default. Users with old config don't know they're using a different path.
**Host signal map — empty on error** — `packages/babysitter-sdk/src/harness/adapterFallbackMetadata.ts:189-191`
If `hostSignalMap[name]` is undefined, silently falls back to empty array. Harness detection becomes impossible.
---
## Agent Platform Internals (packages/genty/platform — additional)
### High
**Azure OpenAI URL parse fallback** — `packages/genty/platform/src/harness/piWrapper/moduleSupport.ts:119-122`
`normalizeAzureOpenAiBaseUrl()` catches URL.parse errors and returns raw untrimmed value. Malformed URLs passed downstream without indication.
**Azure model synthesis returns undefined silently** — `packages/genty/platform/src/harness/piWrapper/moduleSupport.ts:146-175`
`synthesizeAzureModelEntry()` returns `undefined` at multiple points without logging. Model resolution fails silently.
**Non-JSON stdin lines silently discarded** — `packages/genty/platform/src/harness/adapters/adapterStdinReader.ts:64-66`
`catch { continue; }` on JSON.parse. Invalid interaction events vanish. Downstream code may wait forever for a response that was malformed and discarded.
**Pi module import — generic error hides real cause** — `packages/genty/platform/src/harness/piWrapper/moduleSupport.ts:86-96`
Catch wraps error with "is the package installed?" but original error lost. Could be version mismatch, init error, or actual missing package.
### Medium
**Inline `.catch(() => undefined)` pattern** — Multiple files:
- `packages/genty/platform/src/api/breakpoints.ts` — task definition read
- `packages/genty/platform/src/harness/piSecureSandbox.ts:245` — `void session.abort().catch(() => undefined)`
- `packages/genty/platform/src/harness/piWrapper.ts:245` — same pattern
All errors from these operations are completely invisible.
---
## Transport, Tasks, Extension, Cloud (packages/transport-adapter, tasks-adapter, extensions-adapter, cloud)
### Critical
~~**Tool call arguments JSON parse → empty object**~~ — `packages/transport-adapter/src/server.ts:1304` **(hardened)**
`try { input = JSON.parse(tc.arguments); } catch { input = {}; }`. Malformed tool call arguments silently become `{}` — tool executes with garbage input.
~~**Hook bash execution → `{}\n`**~~ — `packages/extensions-adapter/src/transformHelpers.ts:110,123-125` **(hardened)**
Shell script execution catch returns `{}\n`. Caller thinks hook succeeded with empty result. Completely masks bash failures.
**Gemini CLI spawn errors → "not found"** — `packages/extensions-adapter/src/transformHelpers.ts:272-275` **(logged)**
Any spawn error (permissions, system issues) treated same as "CLI not found." Wrong fallback message.
**Extension uninstall — double empty catch with destructive fallback** — `packages/extensions-adapter/src/transformHelpers.ts:290,295` **(logged)**
Uninstall failures fall through to `fs.rmSync({ recursive: true, force: true })` without verification.
**Breakpoint answer poller — fabricated "expired" result** — `packages/tasks-adapter/src/client/answer-poller.ts:220` **(logged)**
Any error fetching final breakpoint state → returns hardcoded minimal "expired" result. Misleads consumers.
**Response body nested catch** — `packages/tasks-adapter/src/backends/server.ts:244` **(logged)**
If response isn't JSON AND reading text fails, body becomes `undefined`. Error reporting becomes lossy.
### High
~~**Hook execution best-effort**~~ — `packages/extensions-adapter/src/transformHelpers.ts:247-254` **(hardened)**
`try { execFileSync("bash", [...]); } catch { /* best-effort */ }`. Hook failures completely invisible.
**File overwrite on read error** — `packages/extensions-adapter/src/installSharedGenerator.ts:77-84` **(logged)**
Read errors (permissions, corrupt file) treated as "doesn't exist." May overwrite with wrong content.
**chmod failure ignored** — `packages/extensions-adapter/src/installSharedGenerator.ts:131-133`, `packages/cloud/src/sdk/providers.ts:128-130` **(logged)**
File permission changes fail silently. Scripts won't be executable; provider secrets may be world-readable.
**Cloud agent spawn — JSON/raw conflation** — `packages/cloud/src/sdk/agents.ts:96-110` **(logged)**
JSON parse failure converts structured output into "raw output" mode. Caller can't distinguish.
**Kubernetes resource parse → empty array** — `packages/cloud/src/sdk/deploy.ts:103-107` **(logged)**
Invalid K8s response → `[]`. "No resources" indistinguishable from "API returned garbage."
**Response body read → undefined** — `packages/tasks-adapter/src/client/server-client.ts:329`
`.catch(() => undefined)` on response text. Error details lost in ServerError constructor.
### Medium
**Atlas catalog readdir/stat → empty/undefined** — `packages/atlas/src/catalog/discovery.ts:190-202`
`readdirSync` catch returns `[]`, `statSync` catch returns `undefined`. Permission errors = "nothing here."
**Atlas catalog frontmatter parse → empty** — `packages/atlas/src/catalog/discovery.ts:267-275`
YAML parse errors → `{ frontmatter: {}, content }`. Missing metadata without indication.
**Tasks-adapter config → undefined** — `packages/tasks-adapter/src/config.ts:115-124`
File read, JSON parse, and validation errors all collapse to `undefined`. Missing config silently accepted.
**Proxy auth token → random UUID** — `packages/transport-adapter/src/bin/adapters-proxy.ts:27`
`process.env.ADAPTERS_PROXY_AUTH_TOKEN || randomUUID()`. Silent fallback to random token if env not set.
**Extension env var cascades** — `packages/extensions-adapter/src/transformHelpers.ts:108,117-118`
`process.env.${pluginRootEnvVar} || process.env.PLUGIN_ROOT || path.resolve(...)`. No log of which path taken.
---
## Agent Adapter Subpackages (adapters, gateway, launch, core, config, tui, ui, webui, mobile)
### Critical
**Config write serialization — previous error swallowed** — `packages/adapters/core/src/config-manager.ts:161` **(logged)**
`prev.catch(() => undefined).then(fn)`. Previous write error swallowed, next write proceeds. Race conditions possible.
### High
**PTY/subprocess kill failures — 8+ locations** — `packages/adapters/core/src/spawn-runner.ts:163`, `packages/adapters/launch/src/launch.ts` (multiple) **(logged — spawn-runner)**
`try { ptyProcess.kill(sig); } catch { /* */ }`. Failed process termination = zombie processes remain alive.
**stdin write failures — input lost** — `packages/adapters/core/src/spawn-runner.ts:337,355,365`
User input and interaction responses silently discarded on write failure.
**Connection/server cleanup — resource leaks** — `packages/adapters/adapters/src/remote-adapter-base.ts:136,141` **(logged)**
`connection.close().catch(() => {})`, `stopServer?.().catch(() => {})`. Connections and servers leak.
**Ephemeral config cleanup** — `packages/adapters/adapters/src/claude-code/runtime-hooks/ephemeral-config.ts:112,117,130` **(logged)**
Three `fs.rm().catch(() => {})` calls. Filesystem leaks accumulate.
**Hook event chain failure** — `packages/adapters/core/src/spawn-runtime-hooks.ts:145` **(logged)**
`await eventChain.catch(() => {})`. Hook dispatch failures silently ignored.
**Adapter installation detection → null** — `packages/adapters/core/src/adapter-registry.ts:160`, `packages/adapters/core/src/spawn-runner-utils.ts:66` **(logged — adapter-registry)**
`.catch(() => null)`. Detection error indistinguishable from "not installed."
**Keytar import failure → null** — `packages/adapters/adapters/src/auth-config.ts:179`
`.catch(() => null)`. Password store access disabled silently.
**Gateway JSON parse → empty object** — `packages/adapters/gateway/src/kanban/routes.ts:1494` **(logged)**
`.catch(() => ({}))`. API response parse failure → empty object.
### Medium
**Auth detection → 'unknown'** — `packages/adapters/core/src/adapter-registry.ts:155-157` **(logged)**
Auth detection failure now logged with agent name before marking 'unknown'.
**Remote agent fallback → 'claude'** — `packages/adapters/adapters/src/adapters-remote-adapter.ts:112`
`env['ADAPTER_REMOTE_AGENT'] ?? process.env['ADAPTER_REMOTE_AGENT'] ?? 'claude'`. Silent default.
**Binary resolution fallbacks** — `packages/adapters/launch/src/bridge-hooks.ts:41-46`
`env['BABYSITTER_BIN'] || 'babysitter'`, `env['HOOKS_MUX_BIN'] || 'a5c-hooks-adapter'`. Wrong tool version possible.
**Bridge hook .cmd shim parsing** — `packages/adapters/launch/src/bridge-hooks.ts:109,121`
`catch { /* not found */ }` × 2. Falls back to `shell: true` which changes execution semantics.
**Mobile connection failure — void** — `packages/adapters/mobile-ios-app/src/providers/GatewayProvider.tsx:107`, `mobile-android-app` same
`void client.connect().catch(() => undefined)`. Connection failure invisible to user.
**Cost/token extraction → 0** — `packages/adapters/adapters/src/base-adapter-helpers.ts:32-38`
`extractNumber(...) ?? 0`. Missing cost data zeroed out instead of flagged.
**WebUI fetch parse → null** — Multiple webui components (automations, workspaces, dashboard)
`.catch(() => null)` on `.json()` calls. API response loss.
**K8s cleanup best-effort** — `packages/adapters/core/src/spawn-invocation.ts:177,180`
Pod cleanup spawn error and catch block both silenced.
---
## Kradle Web & Observer (packages/kradle/web, packages/observer-dashboard, packages/genty/tui-plugins)
### Critical
~~**RBAC deletion — orphaned role bindings**~~ **(logged)** — `packages/kradle/web/app/components/settings-rbac.jsx:34-36`
`fetch('/api/orgs/.../rolebindings', { method: 'DELETE' }).catch(() => {})`. Deletion failure = orphaned permissions. Security boundary violation.
~~**SSE stream endpoint — triple null return**~~ **(logged)** — `packages/kradle/web/app/api/orgs/[org]/agents/events/stream/route.js:15,23,26`
Missing env var → `null`. Upstream error → `null`. Parse error → `null`. Client waits forever.
### High
~~**Cache invalidation silently fails**~~ **(logged)** — `packages/kradle/web/app/lib/api-errors.js:9`
`fetch('.../cache/invalidate', { method: 'POST' }).catch(() => {})`. Stale data circulates indefinitely.
~~**Multiple component fetch `.catch(() => {})`**~~ **(logged)** — `curated-model-catalog.jsx:117`, `runner-pool-manager.jsx:278,292`, `kanban-enhanced.jsx:423`, `stack-builder-graph.jsx:436,533`
Model deployments, runner scaling, status updates — all fire-and-forget. UI optimistically updates; backend silently fails.
~~**Journal entry skipping**~~ **(logged)** — `packages/genty/tui-plugins/src/data.ts:69,128,277`, `status-plugin.tsx:104`
`catch { // skip malformed journal entries }`. Run data silently lost. Audit trail gaps.
### Medium
**Session cookie parsing → null** — `packages/kradle/web/app/lib/kradle-ui.jsx:262-263`
Crypto failures, format errors → `null` → logged out. No audit trail.
**Clipboard copy silent failure** — Multiple components: `assistant-chat.jsx:201`, `assistant-generate.jsx:117`, `inference-helpers.jsx:167`
`navigator.clipboard.writeText(text).catch(() => {})`. User thinks copy worked.
**Theme script empty catch** — `packages/kradle/web/app/layout.jsx:6`, `packages/observer-dashboard/src/app/layout.tsx:15`
localStorage/matchMedia errors → empty catch. Theme preference not persisted.
**Observer components — null on missing data** — `packages/observer-dashboard/src/app/runs/[runId]/page.tsx:107` and others
Components disappear instead of showing error state.
---
## CI/CD & Build Configs
### Critical
~~**Gateway tsconfig — `noImplicitAny: false` + `useUnknownInCatchVariables: false`**~~ **(hardened)** — `packages/adapters/gateway/tsconfig.json:9-10`
Catch handlers receive `any` type. No compile-time validation of error handling. Wrong error properties accessed at runtime.
~~**E2E tests continue-on-error on non-main**~~ **(hardened)** — `.github/workflows/publish.yml:343`
`continue-on-error: ${{ github.ref_name != 'main' }}`. Broken code ships on staging.
### High
**Native deps — `2>/dev/null || true` × 15+ locations** — `.github/workflows/ci.yml:34,73,264,345`, `generate-plugins.yml:42`, `sync-external-plugins.yml:48`, `staging-sync-plugin-commands.yml:42`, `live-stack.yml:82`, `live-stack-published.yml:216,220`
Build succeeds with degraded native binaries. Rollup/SWC/Tailwind run in slow JS fallback. No CI signal.
~~**Token generation continue-on-error**~~ **(hardened)** — `.github/workflows/qa-daily.yml:43`
GitHub App token generation fails → falls back to `github.token`. Tests run with wrong permissions/quotas.
### Medium
**Root tsconfig — `skipLibCheck: true`** — `tsconfig.json:12`
Skips type checking for all declaration files. Dependency type incompatibilities invisible.
**Label creation — `2>/dev/null || true`** — `.github/workflows/agent-review-dispatch.yml:111`
GitHub API errors, rate limits silently absorbed.
**Version checks — non-fatal** — `.github/workflows/live-stack.yml:456` and others
Tool startup failures echo but don't fail CI. Tests proceed with missing tools.
---
## Anti-Patterns Reference
| Pattern | Why It's Evil | What To Do Instead |
|---------|--------------|-------------------|
| `catch { /* */ }` | Error completely invisible | `catch (e) { logger.warn('...', e.message); }` |
| `catch { /* best effort */ }` | Sounds intentional, still invisible | Log it. "Best effort" means "we chose to be blind" |
| `\|\|` for defaults | Treats 0, "", false as missing | Use `??` for nullish-only coalescing |
| `catch { return []; }` | "No results" = "detection failed" | Return `{ results: [], error?: string }` |
| `A \|\| B \|\| C` env chains | No audit of which value won | Log the resolution: `using ${source} for ${key}` |
| `catch { continue; }` | Loop silently skips corrupted items | Collect errors, report count at end |
| `.catch(() => undefined)` | Promise chain silently absorbs rejections | `.catch(e => { log(e); return undefined; })` |
| `void asyncFn()` | Promise rejection suppressed | `asyncFn().catch(e => log(e))` |
| Retry N times silently | "Slow" and "broken" look identical | Log first retry and final outcome |
| `status: 'pending' as 'passed'` | Type system lies about reality | Use a proper union type with pending state |
documents
[]
Outgoing edges
None.
Incoming edges
contains_page1
- page:docs·PageBabysitter Docs