Agentic AI Atlasby a5c.ai
OverviewWikiGraphFor AgentsEdgesSearchWorkspace
/
GitHubDocsDiscord
iiRecord
Agentic AI Atlas · Evil Fallbacks
page:docs-evil-fallbacksa5c.ai
Search record views/
Record · tabs

Available views

II.Record viewspp. 1 - 1
overviewarticlejsongraph
II.
Page JSON

page:docs-evil-fallbacks

Structured · live

Evil Fallbacks json

Inspect the normalized record payload exactly as the atlas UI reads it.

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

Shortcuts

Back to overview
Open graph tab