Agentic AI Atlasby a5c.ai
OverviewWikiGraphFor AgentsEdgesSearchWorkspace
/
GitHubDocsDiscord
i.2Wiki
Agentic AI Atlas · Evil Fallbacks
docs/evil-fallbacksa5c.ai
Search the atlas/
Wiki · linked records

Article and nearby pages

I.Current articlepp. 1 - 1
adapters docsAgent-Adapter ↔ Babysitter IntegrationAgent Layer Gaps — Full Agent StackContributor ReferenceArticlesHarness Assimilation
I.
Wiki article

docs/evil-fallbacks

Reading · 16 min

Evil Fallbacks reference

Silent fallback mechanisms that hide real problems, introduce unexpected degraded behavior, or make debugging impossible. Ordered by severity within each section.

Page nodewiki/docs/evil-fallbacks.mdNearby pages · 35Documents · 0

Continue reading

Nearby pages in the same section.

adapters docsAgent-Adapter ↔ Babysitter IntegrationAgent Layer Gaps — Full Agent StackContributor ReferenceArticlesHarness AssimilationAtlas Catalog UnificationAtlas Graph ↔ Library Gap ReportBabysitter BlueprintsBabysitter Plugins → Blueprints RenameBabysitter CLI & SDK Examplesa5c Development DocumentationGenty Features Backlog: Adversarial Gap Analysisgenty Stack RenamesUsing the Babysitter GitHub ActionUsing Babysitter with Claude Code GitHub ActionsUsing Babysitter with Codex GitHub ActionsUsing Babysitter with Gemini CLI GitHub ActionsHardcoded Harness/Target Gaps — Should Be Derived from Atlas GraphHarness Features Backlog: Gap Analysis (Restructured)Here Be Dragons — Babysitter MonorepoHermes Agent Deep ResearchPackage and Plugin Docs MapAgent PluginsReferenceReference ReposContinuous Release PipelineRepositories Using BabysitterBabysitter Run History InsightsSupermemory Deep ResearchTesting StrategyBabysitter User GuideBabysitter v6: The Orchestration Platform Goes Universala5c.ai V6 Spec And RoadmapWorkspace Validation Map

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

PatternWhy It's EvilWhat To Do Instead
catch { /* */ }Error completely invisiblecatch (e) { logger.warn('...', e.message); }
catch { /* best effort */ }Sounds intentional, still invisibleLog it. "Best effort" means "we chose to be blind"
`\\` for defaults
catch { return []; }"No results" = "detection failed"Return { results: [], error?: string }
`A \\B \
catch { continue; }Loop silently skips corrupted itemsCollect errors, report count at end
.catch(() => undefined)Promise chain silently absorbs rejections.catch(e => { log(e); return undefined; })
void asyncFn()Promise rejection suppressedasyncFn().catch(e => log(e))
Retry N times silently"Slow" and "broken" look identicalLog first retry and final outcome
status: 'pending' as 'passed'Type system lies about realityUse a proper union type with pending state

Trail

Wiki
Babysitter Docs

Evil Fallbacks

Continue reading

adapters docs
Agent-Adapter ↔ Babysitter Integration
Agent Layer Gaps — Full Agent Stack
Contributor Reference
Articles
Harness Assimilation
Atlas Catalog Unification
Atlas Graph ↔ Library Gap Report

Page record

Open node ledger

wiki/docs/evil-fallbacks.md

Documents

No documented graph nodes on this page.