Stateful agents that are like people, with memory, identity, and the ability to learn and adapt
This report summarizes scanner evidence for letta-ai/letta-code, a TypeScript project with 3,574 GitHub stars. SynthScan examined 645,365 lines of code across 2497 source files, recording 2910 pattern matches distributed across 15 syntactic categories. The legacy adjusted pattern signal is 5.8 (Moderate pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 2568 finding(s).
Are imports declared and package/API names verified? 21 finding(s).
Are wrappers, guards, and repeated structures necessary? 2809 finding(s).
Which changes need focused human review? 2910 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 2910 distinct pattern matches across 15 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | build.js | 47 | function rewriteDeclarationAliases(typesRoot) { | CODE |
| LOW | docs/examples/mods/memory-citations.ts | 65 | function looksLikeMemoryRelativePath(value: string): boolean { | CODE |
| LOW | docs/examples/mods/memory-citations.ts | 122 | function extractBashMemoryReferences( | CODE |
| LOW | docs/examples/mods/memory-citations.ts | 193 | function createCitationInstruction(): string { | CODE |
| LOW | hooks/memory_logger.py | 58 | def get_api_key_from_keychain() -> Optional[str]: | CODE |
| LOW | scripts/check-skill-frontmatter.js | 53 | function checkSkillFrontmatterName(content) { | CODE |
| LOW | scripts/codex-watch/tracker.ts | 90 | export function validateLegacyCodexAuditCursor( | CODE |
| LOW | scripts/codex-watch/tracker.ts | 362 | function isAuditCursorSupportEntry( | CODE |
| LOW | scripts/codex-watch/release-analysis.ts | 290 | export function findLatestStableReleaseAfter( | CODE |
| LOW | scripts/claude-watch/state-branch.ts | 61 | export function loadStateSnapshotAtCommit( | CODE |
| LOW | scripts/claude-watch/runtime-probe.ts | 106 | export function isClaudeProbeContractCurrent( | CODE |
| LOW | scripts/claude-watch/runtime-probe.ts | 166 | export function createClaudeRuntimeCommandPlan( | CODE |
| LOW | scripts/claude-watch/release-analysis.ts | 117 | export function rebuildClaudeAnalysisFromState( | CODE |
| LOW | scripts/claude-watch/release-source.ts | 54 | export function normalizeGitHubReleaseTag(tag: string): string { | CODE |
| LOW | scripts/claude-watch/release-source.ts | 77 | function compareTimestampsThenVersions( | CODE |
| LOW | scripts/claude-watch/release-source.ts | 88 | export function parseClaudeGitHubReleases( | CODE |
| LOW | scripts/claude-watch/release-source.ts | 204 | export function selectClaudeReleaseCandidate( | CODE |
| LOW | scripts/claude-watch/release-source.ts | 376 | export async function fetchClaudeGitHubReleases( | CODE |
| LOW | scripts/pi-ai-watch/release-analysis.ts | 206 | export function findLatestStableReleaseAfter( | CODE |
| LOW | scripts/pi-ai-watch/release-analysis.ts | 245 | function findPreviousStableRelease( | CODE |
| LOW | scripts/builtin-skills-watch/reconcile-results.ts | 157 | export function selectCanonicalPullRequest( | CODE |
| LOW | scripts/builtin-skills-watch/reconcile-results.ts | 180 | function findCandidatePullRequests( | CODE |
| LOW | scripts/builtin-skills-watch/reconcile-results.ts | 210 | function closeDuplicatePullRequest( | CODE |
| LOW | scripts/builtin-skills-watch/tracker.ts | 211 | function terminalOutcomeForCandidate( | CODE |
| LOW | scripts/builtin-skills-watch/update-tracker.ts | 407 | export function verifyReconciledPullRequest( | CODE |
| LOW | scripts/builtin-skills-watch/update-tracker.ts | 424 | function verifyPullRequestIdentity(expectedGithubLogin: string): void { | CODE |
| LOW | scripts/builtin-skills-watch/update-tracker.ts | 451 | function verifyPullRequestAncestry( | CODE |
| LOW | scripts/builtin-skills-watch/update-tracker.ts | 483 | export function validateReconciledPullRequestView( | CODE |
| LOW | scripts/builtin-skills-watch/aggregate-results.ts | 235 | export function buildEvidenceCommentBatches( | CODE |
| LOW | scripts/builtin-skills-watch/analysis.ts | 44 | export function listBuiltinSkillsAtCommit(commit: string): string[] { | CODE |
| LOW | scripts/builtin-skills-watch/analysis.ts | 62 | export function collectSkillFilesAtCommit( | CODE |
| LOW | src/headless-listener-launch.ts | 99 | export async function cancelAcceptedListenerInput( | CODE |
| LOW | src/headless-listener-launch.ts | 144 | export async function launchListenerConversation( | CODE |
| LOW | src/runtime-version.ts | 6 | export function assertSupportedBunRuntime( | CODE |
| LOW | src/memory-confinement.ts | 22 | export function createMemoryConfinementLauncher( | CODE |
| LOW | src/mcp-oauth-identity.ts | 15 | function hashMcpOAuthCredentialKey( | CODE |
| LOW | src/mcp-oauth-identity.ts | 40 | export function legacyMcpOAuthCredentialKeys( | CODE |
| LOW | src/headless-message-sender.ts | 5 | export function buildHeadlessSenderReminder( | CODE |
| LOW | src/headless-response-state.ts | 9 | export function createHeadlessResponseState() { | CODE |
| LOW | src/headless-backend-lifecycle.test.ts | 13 | function expectManagedPromptUpdatesViaBackend(source: string): void { | CODE |
| LOW | src/mcp-oauth.ts | 164 | export async function createMcpOAuthSessionWithStorage( | CODE |
| LOW | src/mcp-oauth.ts | 757 | function retainCredentialCoordinator(coordinationKey: string): void { | CODE |
| LOW | src/mcp-oauth.ts | 761 | async function releaseCredentialCoordinator( | CODE |
| LOW | src/mcp-oauth.ts | 850 | export async function migrateLegacyMcpOAuthCredentials( | CODE |
| LOW | src/managed-cloud-runtime.ts | 10 | export function markManagedCloudRuntimeFromListenerIdentity( | CODE |
| LOW | src/headless-reflection-settings.ts | 14 | export async function applyHeadlessReflectionOverrides( | CODE |
| LOW | src/mcp-oauth-public.ts | 79 | export async function authorizeMcpServerWithStorage( | CODE |
| LOW | src/headless-memfs-policy.ts | 14 | export function resolveHeadlessMemfsPolicy( | CODE |
| LOW | src/startup-auto-update.ts | 7 | export function startStartupAutoUpdateCheck( | CODE |
| LOW | src/settings-manager.ts | 202 | export function shouldPersistSessionState(): boolean { | CODE |
| LOW | src/settings-manager.ts | 223 | function getLocalBackendSettingsKey(): string { | CODE |
| LOW | src/settings-manager.ts | 231 | function isAgentIdCompatibleWithServerKey( | CODE |
| LOW | src/settings-manager.ts | 243 | function isSessionCompatibleWithServerKey( | CODE |
| LOW | src/settings-manager.ts | 257 | function shouldSkipLegacyLocalBackendSessionFallback(): boolean { | CODE |
| LOW | src/memory-frontmatter.ts | 18 | export function validateMemoryFileFrontmatter({ | CODE |
| LOW | src/maintainability-checks.test.ts | 143 | "export function resolveSlackAccountDisplayName(): string { return 'Slack'; }\n", | CODE |
| LOW | src/headless-environment-response.ts | 45 | export function buildEnvironmentResponseMetadata(params: { | CODE |
| LOW | src/headless-environment-response.ts | 65 | export function buildEnvironmentLaunchResult( | CODE |
| LOW | src/headless-environment-response.ts | 106 | export function isCloudEnvironmentSelector( | CODE |
| LOW | src/headless-environment-response.ts | 114 | export function getEnvironmentRoutedMessagingUnsupportedReason( | CODE |
| 2428 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | hooks/memory_logger.py | 160 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | hooks/memory_logger.py | 162 | # ============================================================================= | COMMENT |
| MEDIUM | hooks/memory_logger.py | 32 | # ============================================================================= | COMMENT |
| MEDIUM | hooks/memory_logger.py | 34 | # ============================================================================= | COMMENT |
| MEDIUM | hooks/memory_logger.py | 110 | # ============================================================================= | COMMENT |
| MEDIUM | hooks/memory_logger.py | 112 | # ============================================================================= | COMMENT |
| MEDIUM | hooks/memory_logger.py | 249 | # ============================================================================= | COMMENT |
| MEDIUM | hooks/memory_logger.py | 251 | # ============================================================================= | COMMENT |
| MEDIUM | hooks/memory_logger.py | 313 | # ============================================================================= | COMMENT |
| MEDIUM | hooks/memory_logger.py | 315 | # ============================================================================= | COMMENT |
| MEDIUM | hooks/memory_logger.py | 371 | # ============================================================================= | COMMENT |
| MEDIUM | hooks/memory_logger.py | 373 | # ============================================================================= | COMMENT |
| MEDIUM | hooks/memory_logger.py | 584 | # ============================================================================= | COMMENT |
| MEDIUM | hooks/memory_logger.py | 586 | # ============================================================================= | COMMENT |
| MEDIUM | src/discord-debounce.test.ts | 8 | // ── resolveDiscordInboundDebounceMs ─────────────────────────────────── | COMMENT |
| MEDIUM | src/discord-debounce.test.ts | 130 | // ── buildDiscordDebounceKey ─────────────────────────────────────────── | COMMENT |
| MEDIUM | src/headless-queue-lifecycle.test.ts | 26 | // ── Helpers mirroring production logic ─────────────────────────── | COMMENT |
| MEDIUM | src/headless-queue-lifecycle.test.ts | 72 | // ── Shared queue builder ────────────────────────────────────────── | COMMENT |
| MEDIUM | src/headless-queue-lifecycle.test.ts | 145 | // ── Tests ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/headless.ts | 3462 | // ── Queue lifecycle tracking (stream-json only) ──────────────── | COMMENT |
| MEDIUM | src/websocket/app-server-openai-tools.ts | 45 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/websocket/app-server-openai-tools.ts | 47 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/websocket/app-server-openai-tools.ts | 99 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/websocket/app-server-openai-tools.ts | 101 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/websocket/app-server-openai-tools.ts | 113 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/websocket/app-server-openai-tools.ts | 115 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/websocket/app-server-openai-tools.ts | 290 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/websocket/app-server-openai-tools.ts | 292 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/websocket/app-server-openai-tools.test.ts | 10 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/websocket/app-server-openai-tools.test.ts | 12 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/websocket/app-server-openai-tools.test.ts | 126 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/websocket/app-server-openai-tools.test.ts | 128 | // ───────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/websocket/listen-queue-events.test.ts | 26 | // ── Helpers ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/websocket/listen-queue-events.test.ts | 121 | // ── Tests ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/websocket/terminal-handler.ts | 122 | // ── Bun spawn ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/websocket/terminal-handler.ts | 201 | // ── node-pty spawn (Node.js / Electron) ─────────────────────────────────── | COMMENT |
| MEDIUM | src/websocket/terminal-handler.ts | 269 | // ── Public API ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/websocket/listener/worktree-watcher.ts | 112 | // ─── Internal ──────────────────────────────────────────── | COMMENT |
| MEDIUM | src/websocket/listener/grep-in-files.ts | 20 | // ── Ripgrep binary resolution ────────────────────────────────────── | COMMENT |
| MEDIUM | src/websocket/listener/grep-in-files.ts | 36 | // ── Ripgrep JSON stream shapes ───────────────────────────────────── | COMMENT |
| MEDIUM | src/websocket/listener/grep-in-files.ts | 84 | // ── Public API ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/websocket/listener/grep-in-files.ts | 157 | // ── Execution ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/websocket/listener/grep-in-files.ts | 191 | // ── Parsing ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/websocket/listener/grep-in-files.ts | 338 | // ── Helpers ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/websocket/listener/commands/memory.ts | 436 | // ── Enable memfs command ──────────────────────────────────────────── | COMMENT |
| MEDIUM | src/websocket/listener/commands/memory.ts | 487 | // ── Memory history (git log for a specific file) ───────────────── | COMMENT |
| MEDIUM | src/websocket/listener/commands/memory.ts | 541 | // ── Memory file at ref (git show for content at a commit) ──────── | COMMENT |
| MEDIUM | src/websocket/listener/commands/memory.ts | 594 | // ── Memory commit diff (git show for full commit patch) ──────────── | COMMENT |
| MEDIUM | src/websocket/listener/commands/memory.ts | 645 | // ── Read a file from the MemFS working tree ─────────────────────── | COMMENT |
| MEDIUM | src/websocket/listener/commands/memory.ts | 749 | // ── Write a file into MemFS (durable agent memory write + commit) ─────── | COMMENT |
| MEDIUM | src/websocket/listener/commands/memory.ts | 781 | // ── Validate relative path ───────────────────────────────────── | COMMENT |
| MEDIUM | src/websocket/listener/commands/memory.ts | 803 | // ── Ensure MemFS is enabled and checked out ─────────────────── | COMMENT |
| MEDIUM | src/websocket/listener/commands/memory.ts | 821 | // ── Decode + write bytes (binary-safe for base64) ────────────── | COMMENT |
| MEDIUM | src/websocket/listener/commands/memory.ts | 836 | // ── Resolve agent identity for the commit author ─────────────── | COMMENT |
| MEDIUM | src/websocket/listener/commands/memory.ts | 882 | // ── Notify UI so the memory view auto-refreshes ──────────────── | COMMENT |
| MEDIUM | src/websocket/listener/commands/memory.ts | 927 | // ── Delete a file from MemFS (durable agent memory delete + commit) ────── | COMMENT |
| MEDIUM | src/websocket/listener/commands/memory.ts | 959 | // ── Validate relative path ───────────────────────────────────── | COMMENT |
| MEDIUM | src/websocket/listener/commands/memory.ts | 981 | // ── Ensure MemFS is enabled and checked out ─────────────────── | COMMENT |
| MEDIUM | src/websocket/listener/commands/memory.ts | 1001 | // ── Idempotent delete: missing file is a no-op success ───────── | COMMENT |
| MEDIUM | src/websocket/listener/commands/memory.ts | 1032 | // ── Resolve agent identity for the commit author ─────────────── | COMMENT |
| 247 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .skills/adding-models/SKILL.md | 20 | ### Step 1: Find Valid Model Handles | COMMENT |
| LOW | .skills/adding-models/SKILL.md | 60 | ### Step 2: Update the Owning Catalog | COMMENT |
| LOW | .skills/adding-models/SKILL.md | 73 | ### Step 3: Test the Model | COMMENT |
| LOW | .skills/adding-models/SKILL.md | 86 | ### Step 4: Add to CI Test Matrix (Optional) | COMMENT |
| LOW⚡ | src/integration-tests/lazy-approval-recovery.test.ts | 199 | // Step 1: Wait for init, then send bash trigger prompt | COMMENT |
| LOW⚡ | src/integration-tests/lazy-approval-recovery.test.ts | 206 | // Step 2: A tool_call_message signals a tool was invoked. Approval-flow | COMMENT |
| LOW | src/agent/resolve-startup-agent.ts | 83 | // Step 1: Resume the last agent used in this project. Project continuity | COMMENT |
| LOW⚡ | src/agent/resolve-startup-agent.ts | 94 | // Step 2: Pinned agent | COMMENT |
| LOW⚡ | src/agent/resolve-startup-agent.ts | 102 | // Step 3: Multiple existing pins should ask instead of picking implicitly. | COMMENT |
| LOW⚡ | src/agent/resolve-startup-agent.ts | 108 | // Step 4: Global LRU (directory-switching fallback) | COMMENT |
| LOW⚡ | src/agent/resolve-startup-agent.ts | 127 | // Step 5: Custom API model picker | COMMENT |
| LOW⚡ | src/agent/resolve-startup-agent.ts | 132 | // Step 6: Show selector if any pinned agents exist | COMMENT |
| LOW⚡ | src/agent/resolve-startup-agent.ts | 137 | // Step 7: True fresh user — create default agent | COMMENT |
| LOW | src/skills/builtin/creating-skills/SKILL.md | 214 | ### Step 1: Understanding the Skill with Concrete Examples | COMMENT |
| LOW | src/skills/builtin/creating-skills/SKILL.md | 231 | ### Step 2: Planning the Reusable Skill Contents | COMMENT |
| LOW | src/skills/builtin/creating-skills/SKILL.md | 255 | ### Step 3: Initializing the Skill | COMMENT |
| LOW | src/skills/builtin/creating-skills/SKILL.md | 279 | ### Step 4: Edit the Skill | COMMENT |
| LOW | src/skills/builtin/creating-skills/SKILL.md | 334 | ### Step 5: Packaging a Skill | COMMENT |
| LOW | src/skills/builtin/creating-skills/SKILL.md | 361 | ### Step 6: Iterate | COMMENT |
| LOW | src/skills/builtin/migrating-memory/SKILL.md | 64 | ### Step 1: Identify Source Agent | COMMENT |
| LOW⚡ | src/channels/telegram/setup.ts | 34 | // Step 1: Get token | COMMENT |
| LOW⚡ | src/channels/telegram/setup.ts | 41 | // Step 2: Validate token | COMMENT |
| LOW | src/channels/telegram/setup.ts | 55 | // Step 3: Choose DM policy | COMMENT |
| LOW | src/channels/telegram/setup.ts | 80 | // Step 4: Allowlist if needed | COMMENT |
| LOW | src/channels/telegram/setup.ts | 114 | // Step 5: Write account | COMMENT |
| LOW⚡ | src/channels/whatsapp/reactions-adapter.test.ts | 744 | // Step 1: send outbound text — populates sentMessageIds + messageStore. | COMMENT |
| LOW⚡ | src/channels/whatsapp/reactions-adapter.test.ts | 752 | // Step 2: emit outbound upsert echo — sentMessageIds entry consumed, | COMMENT |
| LOW | src/channels/whatsapp/reactions-adapter.test.ts | 766 | // Step 3: emit real-shape LID reaction with target.fromMe: false. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | src/web/memory-viewer-template.txt | 964 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?def | CODE |
| CRITICAL | src/channels/slack/status-lifecycle.test.ts | 61 | getSlackWriteClient().assistant.threads.setStatus.mock.calls.map( | CODE |
| CRITICAL | src/channels/slack/status-lifecycle.test.ts | 127 | const last = slack.assistant.threads.setStatus.mock.calls.at(-1)?.[0]; | CODE |
| CRITICAL | src/channels/slack/status-lifecycle.test.ts | 133 | expect(slack.assistant.threads.setStatus.mock.calls.at(-1)?.[0]).toEqual( | CODE |
| CRITICAL | src/channels/slack/adapter-test-harness.ts | 403 | instance.client.assistant.threads.setStatus.mockClear(); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | hooks/memory_logger.py | 53 | except (json.JSONDecodeError, IOError): | CODE |
| HIGH | hooks/memory_logger.py | 76 | except (subprocess.TimeoutExpired, FileNotFoundError, OSError): | CODE |
| HIGH | hooks/memory_logger.py | 260 | except (json.JSONDecodeError, IOError): | CODE |
| HIGH | hooks/memory_logger.py | 307 | except (json.JSONDecodeError, IOError): | CODE |
| HIGH | hooks/memory_logger.py | 401 | except (json.JSONDecodeError, IOError): | CODE |
| HIGH | hooks/memory_logger.py | 597 | except (json.JSONDecodeError, IOError): | CODE |
| HIGH | hooks/memory_logger.py | 147 | except Exception: | CODE |
| HIGH | …s/builtin/self-configuration/scripts/add_permission.py | 78 | except OSError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | src/integration-tests/lazy-approval-recovery.test.ts | 199 | // Step 1: Wait for init, then send bash trigger prompt | COMMENT |
| LOW⚡ | src/integration-tests/lazy-approval-recovery.test.ts | 206 | // Step 2: A tool_call_message signals a tool was invoked. Approval-flow | COMMENT |
| LOW | src/agent/resolve-startup-agent.ts | 83 | // Step 1: Resume the last agent used in this project. Project continuity | COMMENT |
| LOW⚡ | src/agent/resolve-startup-agent.ts | 94 | // Step 2: Pinned agent | COMMENT |
| LOW⚡ | src/agent/resolve-startup-agent.ts | 102 | // Step 3: Multiple existing pins should ask instead of picking implicitly. | COMMENT |
| LOW⚡ | src/agent/resolve-startup-agent.ts | 108 | // Step 4: Global LRU (directory-switching fallback) | COMMENT |
| LOW⚡ | src/agent/resolve-startup-agent.ts | 127 | // Step 5: Custom API model picker | COMMENT |
| LOW⚡ | src/agent/resolve-startup-agent.ts | 132 | // Step 6: Show selector if any pinned agents exist | COMMENT |
| LOW⚡ | src/agent/resolve-startup-agent.ts | 137 | // Step 7: True fresh user — create default agent | COMMENT |
| LOW⚡ | src/channels/telegram/setup.ts | 34 | // Step 1: Get token | COMMENT |
| LOW⚡ | src/channels/telegram/setup.ts | 41 | // Step 2: Validate token | COMMENT |
| LOW | src/channels/telegram/setup.ts | 55 | // Step 3: Choose DM policy | COMMENT |
| LOW | src/channels/telegram/setup.ts | 80 | // Step 4: Allowlist if needed | COMMENT |
| LOW | src/channels/telegram/setup.ts | 114 | // Step 5: Write account | COMMENT |
| LOW⚡ | src/channels/whatsapp/reactions-adapter.test.ts | 744 | // Step 1: send outbound text — populates sentMessageIds + messageStore. | COMMENT |
| LOW⚡ | src/channels/whatsapp/reactions-adapter.test.ts | 752 | // Step 2: emit outbound upsert echo — sentMessageIds entry consumed, | COMMENT |
| LOW | src/channels/whatsapp/reactions-adapter.test.ts | 766 | // Step 3: emit real-shape LID reaction with target.fromMe: false. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/postinstall-patches.js | 221 | // region always fits on screen, then take the normal log-update path: | COMMENT |
| LOW | src/websocket/listen-client-concurrency.test.ts | 221 | const realAgentMessageModule = await import("@/agent/message"); | COMMENT |
| LOW | src/websocket/listener/constants.ts | 1 | export const MAX_RETRY_DURATION_MS = 5 * 60 * 1000; // 5 minutes | COMMENT |
| LOW | src/backend/local/local-context-estimate.ts | 1 | import type { Usage } from "@earendil-works/pi-ai"; | COMMENT |
| LOW | src/backend/api/mcp-servers.ts | 1 | // Server-side MCP servers are registered on the Letta server (via the ADE or | COMMENT |
| LOW | src/backend/dev/pi-image-elision.ts | 1 | import type { LocalMessage } from "@/backend/local/local-message"; | COMMENT |
| LOW | src/agent/memory-filesystem.test.ts | 761 | }, | COMMENT |
| LOW | src/agent/memory-filesystem.test.ts | 801 | // The new SyncState uses blockHashes/fileHashes instead of | COMMENT |
| LOW | src/cli/hooks/use-token-smoothing.ts | 1 | // React hook that returns a smoothed version of a monotonic count. | COMMENT |
| LOW | src/cli/helpers/stream-processor.ts | 161 | COMMENT | |
| LOW | src/cli/helpers/stream.ts | 361 | ); | COMMENT |
| LOW | src/permissions/cross-agent-guard.ts | 1 | // src/permissions/cross-agent-guard.ts | COMMENT |
| LOW | src/sandbox/bwrap.ts | 41 | // Root view: read-only for write-scoped profiles, writable for cross-agent. | COMMENT |
| LOW | src/sandbox/bwrap.ts | 61 | // masks, and bwrap is last-mount-wins for overlapping paths. A carve-out must | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/agent/memory-worktree.test.ts | 26 | GIT_AUTHOR_EMAIL: "test@test.com", | CODE |
| LOW | src/agent/memory-worktree.test.ts | 28 | GIT_COMMITTER_EMAIL: "test@test.com", | CODE |
| LOW | src/agent/memory-git.signing.test.ts | 73 | GIT_AUTHOR_EMAIL: "test@test.com", | CODE |
| LOW | src/agent/memory-git.signing.test.ts | 75 | GIT_COMMITTER_EMAIL: "test@test.com", | CODE |
| LOW | src/agent/memory-git.postcommit.test.ts | 38 | GIT_AUTHOR_EMAIL: "test@test.com", | CODE |
| LOW | src/agent/memory-git.postcommit.test.ts | 40 | GIT_COMMITTER_EMAIL: "test@test.com", | CODE |
| LOW | src/agent/memory-git.precommit.test.ts | 22 | GIT_AUTHOR_EMAIL: "test@test.com", | CODE |
| LOW | src/agent/memory-git.precommit.test.ts | 24 | GIT_COMMITTER_EMAIL: "test@test.com", | CODE |
| LOW | src/cli/reflection-worktree-completion.test.ts | 33 | GIT_AUTHOR_EMAIL: "test@test.com", | CODE |
| LOW | src/cli/reflection-worktree-completion.test.ts | 35 | GIT_COMMITTER_EMAIL: "test@test.com", | CODE |
| LOW | src/cli/helpers/reflection-launcher.test.ts | 59 | GIT_AUTHOR_EMAIL: "test@test.com", | CODE |
| LOW | src/cli/helpers/reflection-launcher.test.ts | 61 | GIT_COMMITTER_EMAIL: "test@test.com", | CODE |
| LOW | src/cli/helpers/reflection-arena.test.ts | 21 | GIT_AUTHOR_EMAIL: "test@test.com", | CODE |
| LOW | src/cli/helpers/reflection-arena.test.ts | 23 | GIT_COMMITTER_EMAIL: "test@test.com", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | scripts/postinstall-patches.js | 41 | // Resolve root of installed ink package; add robust fallbacks for Bun | COMMENT |
| MEDIUM | .github/workflows/review.yml | 287 | # channel, so this asks Amelia's Cloud harness to post through its existing | COMMENT |
| MEDIUM | src/agent/memory-git.ts | 729 | // Primary config: normalized origin key (most robust for git's credential lookup) | COMMENT |
| MEDIUM | src/agent/memory-git-hooks.ts | 261 | # Reflection and other harness worktrees commit on temporary branches; only the | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …in/self-configuration/references/api-patch-examples.md | 16 | # Agent context window | COMMENT |
| MEDIUM | …in/self-configuration/references/api-patch-examples.md | 22 | # Conversation context window | COMMENT |
| MEDIUM | src/channels/AGENTS.md | 53 | ## Adapters are orchestration entrypoints | COMMENT |
| MEDIUM | src/channels/protocol-account-commands.ts | 165 | // scaffold per-app plugin folders/channel IDs here. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | scripts/smoke-pypi.py | 55 | assert.equal(resized.status, 0, resized.stderr.toString()); | CODE |
| HIGH | scripts/smoke-pypi.py | 57 | assert.ok(image.width > 0 && image.width < 3000, JSON.stringify(image)); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | hooks/memory_logger.py | 184 | CODE | |
| LOW | hooks/memory_logger.py | 297 | CODE | |
| LOW | hooks/memory_logger.py | 476 | CODE | |
| LOW | hooks/memory_logger.py | 588 | CODE | |
| LOW | hooks/memory_logger.py | 520 | CODE | |
| LOW | scripts/build-pypi.py | 62 | CODE | |
| LOW | scripts/smoke-pypi.py | 78 | CODE | |
| LOW | …ills/builtin/self-configuration/scripts/show_config.py | 170 | CODE | |
| LOW | …ills/builtin/self-configuration/scripts/show_config.py | 259 | CODE | |
| LOW | …s/builtin/self-configuration/scripts/add_permission.py | 106 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | hooks/memory_logger.py | 428 | print(f"Error reading block: {e}") | CODE |
| MEDIUM | hooks/memory_logger.py | 489 | print(f"Error reading block: {e}") | CODE |
| LOW⚡ | hooks/memory_logger.py | 147 | except Exception: | CODE |
| LOW⚡ | hooks/memory_logger.py | 154 | except Exception as e: | CODE |
| LOW | …s/builtin/self-configuration/scripts/add_permission.py | 74 | except Exception: | CODE |
| LOW | …s/builtin/self-configuration/scripts/add_permission.py | 122 | except Exception as e: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | hooks/typecheck-on-changes.sh | 5 | # Check if there are any uncommitted changes (staged or unstaged) | COMMENT |
| LOW | hooks/fix-on-changes.sh | 5 | # Check if there are any uncommitted changes (staged or unstaged) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/channels/core-stream.ts | 185 | async function processData(data: string): Promise<void> { | CODE |