AI coworker with memory and collaboration
This report summarizes scanner evidence for rowboatlabs/rowboat, a TypeScript project with 18,102 GitHub stars. SynthScan examined 388,413 lines of code across 1671 source files, recording 492 pattern matches distributed across 11 syntactic categories. The legacy adjusted pattern signal is 1.7 (Low 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.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 430 finding(s).
Are imports declared and package/API names verified? 32 finding(s).
Are wrappers, guards, and repeated structures necessary? 213 finding(s).
Which changes need focused human review? 492 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 492 distinct pattern matches across 11 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 | apps/harbor/packages/server/src/policy.ts | 369 | export function canCancelQueuedInvocation(actor: { memberId: string }, invocation: Invocation): Decision { | CODE |
| LOW | apps/harbor/packages/server/src/auth.ts | 149 | export function protectedResourceMetadata( | CODE |
| LOW | apps/x/packages/core/src/home/command-center.ts | 40 | export async function getCommandCenterSessionId(): Promise<string | null> { | CODE |
| LOW | apps/x/packages/core/src/home/command-center.ts | 51 | export async function ensureCommandCenterSession(sessions: ISessions): Promise<string> { | CODE |
| LOW | apps/x/packages/core/src/home/command-center.ts | 106 | export async function repairCommandCenterSession(): Promise<void> { | CODE |
| LOW⚡ | apps/x/packages/core/src/di/container.ts | 200 | export function registerBrowserControlService(service: IBrowserControlService): void { | CODE |
| LOW⚡ | apps/x/packages/core/src/di/container.ts | 206 | export function registerNotificationService(service: INotificationService): void { | CODE |
| LOW⚡ | apps/x/packages/core/src/di/container.ts | 212 | export function registerScreenPointerService(service: IScreenPointerService): void { | CODE |
| LOW⚡ | apps/x/packages/core/src/di/container.ts | 218 | export function registerTextInsertService(service: ITextInsertService): void { | CODE |
| LOW | apps/x/packages/core/src/config/strictness_analyzer.ts | 316 | export function analyzeEmailsAndRecommend(): AnalysisResult { | CODE |
| LOW | apps/x/packages/core/src/config/strictness_analyzer.ts | 436 | export function autoConfigureStrictnessIfNeeded(): boolean { | CODE |
| LOW | apps/x/packages/core/src/config/notification_config.ts | 50 | export function isNotificationCategoryEnabled(category: NotificationCategory): boolean { | CODE |
| LOW | apps/x/packages/core/src/config/security.ts | 261 | export function resetSecurityAllowListCache() { | CODE |
| LOW | apps/x/packages/core/src/config/note_creation_config.ts | 53 | export function getNoteCreationStrictness(): NoteCreationStrictness { | CODE |
| LOW | apps/x/packages/core/src/config/note_creation_config.ts | 61 | export function setNoteCreationStrictness(strictness: NoteCreationStrictness): void { | CODE |
| LOW | apps/x/packages/core/src/config/note_creation_config.ts | 86 | export function setStrictnessAndMarkConfigured(strictness: NoteCreationStrictness): void { | CODE |
| LOW | apps/x/packages/core/src/config/note_creation_config.ts | 96 | export function getNoteCreationAgentSuffix(): string { | CODE |
| LOW | apps/x/packages/core/src/auth/google-backend-oauth.ts | 117 | export async function claimPickedFilesViaBackend( | CODE |
| LOW | apps/x/packages/core/src/auth/oauth-flows.ts | 136 | function getClientRegistrationRepo(): IClientRegistrationRepo { | CODE |
| LOW | apps/x/packages/core/src/auth/oauth-flows.ts | 646 | export async function completeRowboatGoogleConnect(state: string): Promise<void> { | CODE |
| LOW | apps/x/packages/core/src/auth/oauth-flows.ts | 756 | export async function disconnectGoogleIfScopesStale(): Promise<void> { | CODE |
| LOW⚡ | apps/x/packages/core/src/auth/provider-client-id.ts | 5 | export function setProviderClientIdOverride(provider: string, clientId: string): void { | CODE |
| LOW⚡ | apps/x/packages/core/src/auth/provider-client-id.ts | 13 | export function getProviderClientIdOverride(provider: string): string | undefined { | CODE |
| LOW⚡ | apps/x/packages/core/src/auth/provider-client-id.ts | 17 | export function hasProviderClientIdOverride(provider: string): boolean { | CODE |
| LOW⚡ | apps/x/packages/core/src/auth/provider-client-id.ts | 21 | export function clearProviderClientIdOverride(provider: string): void { | CODE |
| LOW | apps/x/packages/core/src/auth/oauth-client.ts | 69 | export function createStaticConfiguration( | CODE |
| LOW | apps/x/packages/core/src/workspace/workspace.ts | 67 | function isKnowledgeMarkdownRelPath(relPath: string): boolean { | CODE |
| LOW | apps/x/packages/core/src/workspace/wiki-link-rewrite.ts | 43 | function rewriteWikiLinksInMarkdown( | CODE |
| LOW | apps/x/packages/core/src/workspace/wiki-link-rewrite.ts | 94 | async function collectKnowledgeMarkdownFiles(workspaceRoot: string): Promise<string[]> { | CODE |
| LOW | apps/x/packages/core/src/workspace/wiki-link-rewrite.ts | 130 | export async function rewriteWikiLinksForRenamedKnowledgeFile( | CODE |
| LOW | apps/x/packages/core/src/runtime/tools/domains/image.ts | 182 | async function suggestOpenRouterImageModels(requestedId: string): Promise<string[] | null> { | CODE |
| LOW | …ages/core/src/runtime/assembly/compose-instructions.ts | 54 | export function composeSystemInstructions({ | CODE |
| LOW | …packages/core/src/runtime/assembly/message-encoding.ts | 11 | function formatUserMessageContextForLlm(userMessageContext: z.infer<typeof UserMessageContext>): string { | CODE |
| LOW | …s/x/packages/core/src/runtime/assembly/headless-app.ts | 31 | async function waitForChatIdleIfConfigured(): Promise<void> { | CODE |
| LOW | …kages/core/src/runtime/assembly/permission-metadata.ts | 93 | export async function getToolPermissionMetadata( | CODE |
| LOW | …ps/x/packages/core/src/runtime/assembly/spawn-agent.ts | 287 | function defaultWorkerInstructions(name: string): string { | CODE |
| LOW | …ages/core/src/runtime/assembly/copilot/instructions.ts | 429 | export function invalidateCopilotInstructionsCache(): void { | CODE |
| LOW | …s/x/packages/core/src/runtime/assembly/skills/index.ts | 318 | export async function buildAvailableSkillCatalog(): Promise<string> { | CODE |
| LOW | …s/x/packages/core/src/runtime/assembly/skills/index.ts | 499 | export function setBuiltinToolsSkillTools(names: string[]): void { | CODE |
| LOW | apps/x/packages/core/src/runtime/legacy/engine.ts | 46 | function toUserMessageContextMiddlePane(middlePaneContext: MiddlePaneContext | null): z.infer<typeof UserMessageContext> | CODE |
| LOW | …s/x/packages/core/src/runtime/turns/context-elision.ts | 160 | export function elideHistoricMiddlePaneContent( | CODE |
| LOW | apps/x/packages/core/src/spaces/oauth.ts | 403 | export function invalidateManagedOrgsSync(): void { | CODE |
| LOW | apps/x/packages/core/src/spaces/orgs.ts | 294 | export function orgForSpacesMcpServerName(serverName: string): OrgRecord | null { | CODE |
| LOW | apps/x/packages/core/src/spaces/whiteboard.ts | 112 | export function serializeWhiteboardSnapshot(elements: readonly WbElement[]): string { | CODE |
| LOW | apps/x/packages/core/src/terminal/terminal.ts | 52 | function ensureSpawnHelperExecutable(): void { | CODE |
| LOW | apps/x/packages/core/src/filesystem/files.ts | 112 | async function getCanonicalWorkspaceRoot(): Promise<string> { | CODE |
| LOW | apps/x/packages/core/src/filesystem/files.ts | 122 | async function canonicalizePathForPermission(resolvedPath: string): Promise<string> { | CODE |
| LOW | apps/x/packages/core/src/filesystem/files.ts | 144 | export async function resolveFilePathForPermission(inputPath: string): Promise<CanonicalFilePath> { | CODE |
| LOW | apps/x/packages/core/src/filesystem/files.ts | 190 | function scheduleKnowledgeCommitIfNeeded(resolved: ResolvedFilePath): void { | CODE |
| LOW | apps/x/packages/core/src/models/rowboat-selection.ts | 33 | export async function applyRowboatInitialSelection(): Promise<void> { | CODE |
| LOW | apps/x/packages/core/src/models/chatgpt-selection.ts | 21 | export async function applyCodexInitialSelection(): Promise<void> { | CODE |
| LOW | …ps/x/packages/core/src/models/recommendation-update.ts | 151 | export async function checkRecommendationUpdate(): Promise<RecommendationUpdateCheck> { | CODE |
| LOW | …ps/x/packages/core/src/models/recommendation-update.ts | 176 | export async function resolveRecommendationUpdate(args: { | CODE |
| LOW | apps/x/packages/core/src/models/reasoning.ts | 37 | export async function directCallReasoningOptions( | CODE |
| LOW | apps/x/packages/core/src/models/defaults.ts | 28 | export async function getDefaultModelAndProvider(): Promise<ModelSelection> { | CODE |
| LOW | apps/x/packages/core/src/models/defaults.ts | 63 | export async function shouldDeferBackgroundTasks(): Promise<boolean> { | CODE |
| LOW | apps/x/packages/core/src/models/defaults.ts | 125 | export async function getAutoPermissionDecisionModel(): Promise<ModelSelection> { | CODE |
| LOW | apps/x/packages/core/src/models/defaults.ts | 140 | export async function getBackgroundTaskAgentModel(): Promise<ModelSelection> { | CODE |
| LOW | apps/x/packages/core/src/models/models.ts | 333 | export async function listImageModelsForProvider( | CODE |
| LOW | apps/x/packages/core/src/code-mode/status.ts | 53 | function isClaudeCredentialSignedIn(raw: string): boolean { | CODE |
| 123 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | apps/harbor/packages/server/src/consent.ts | 1 | // The login/consent page (spec §4, spike-verified 2026-08-18): the one human | COMMENT |
| LOW | apps/harbor/packages/server/src/blobs.ts | 1 | import { createHash } from 'node:crypto'; | COMMENT |
| LOW | apps/harbor/packages/server/src/migrations.ts | 1 | import type { SqlDb } from './sql.js'; | COMMENT |
| LOW | apps/harbor/packages/server/src/migrations.ts | 301 | // and the stored message event are rewritten in place (see editMessage). | COMMENT |
| LOW | apps/harbor/packages/server/src/migrations.ts | 421 | statements: [ | COMMENT |
| LOW | apps/harbor/packages/server/src/migrations.ts | 661 | statements: [ | COMMENT |
| LOW | apps/harbor/packages/server/src/notify.ts | 1 | import { mentionsAsText, type Message, type NotifyReason, type Space } from '@rowboat/spaces-protocol'; | COMMENT |
| LOW | apps/harbor/packages/server/src/session.ts | 1 | // The web app's session (2026-10-12): the same bearer every client sends, | COMMENT |
| LOW | apps/harbor/packages/server/src/merge.ts | 1 | import { diffArrays } from 'diff'; | COMMENT |
| LOW | apps/harbor/packages/server/src/auth.ts | 1 | import type { Member } from '@rowboat/spaces-protocol'; | COMMENT |
| LOW | …r/packages/server/src/connectors/maritime/connector.ts | 1 | import type { ConnectorCapabilities, Invocation, InvocationUpdate, Message, ServerFrame } from '@rowboat/spaces-protocol | COMMENT |
| LOW | …or/packages/server/src/connectors/maritime/runtimes.ts | 1 | import type { InvocationOption } from '@rowboat/spaces-protocol'; | COMMENT |
| LOW | …or/packages/server/src/connectors/maritime/runtimes.ts | 121 | ].filter(Boolean).join(' '); | COMMENT |
| LOW | …r/packages/server/src/connectors/replicas/connector.ts | 1 | import type { ConnectorCapabilities, Invocation, InvocationOption, InvocationUpdate, Message, ServerFrame } from '@rowbo | COMMENT |
| LOW | …r/packages/server/src/connectors/replicas/connector.ts | 21 | // Two limits, on purpose: | COMMENT |
| LOW | …arbor/packages/server/src/connectors/agent37/prompt.ts | 1 | import { instructionsSection, mentionToken, relabelMentions, type Invocation, type Message } from '@rowboat/spaces-proto | COMMENT |
| LOW | …or/packages/server/src/connectors/agent37/connector.ts | 1 | import { createHash } from 'node:crypto'; | COMMENT |
| LOW | …or/packages/server/src/connectors/agent37/connector.ts | 21 | // `POST /v1/responses` streamed over SSE; `response.completed` or | COMMENT |
| LOW | …harbor/packages/server/src/connectors/common/prompt.ts | 1 | // The message a coding-agent connector sends into a thread's workspace (spec | COMMENT |
| LOW | …/packages/server/src/connectors/common/agent-events.ts | 1 | // Reading a coding agent's own events (spec §8 Connectors: mirror, then | COMMENT |
| LOW | …harbor/packages/server/src/connectors/jev/connector.ts | 1 | import { mentionsAsText, mentionToken, type Invocation, type Member, type Message, type ServerFrame } from '@rowboat/spa | COMMENT |
| LOW | apps/harbor/packages/server/src/connectors/jev/api.ts | 1 | // TypeSafe's System One API, whose model is Jev (https://docs.typesafe.ai/api), | COMMENT |
| LOW | …/packages/server/src/connectors/conductor/connector.ts | 1 | import { randomUUID } from 'node:crypto'; | COMMENT |
| LOW | …rbor/packages/server/src/connectors/conductor/turns.ts | 1 | import { activityOf, answerOf, failureOf, type AgentEvent } from '../common/agent-events.js'; | COMMENT |
| LOW | apps/harbor/packages/server/src/core/hosting.ts | 21 | import { HarborError } from '../errors.js'; | COMMENT |
| LOW | apps/harbor/packages/server/src/core/hosting.ts | 41 | // Rowboat's trial credit, the platform's funded LLM under the cap the | COMMENT |
| LOW | apps/harbor/packages/protocol/src/mentions.ts | 1 | // Mentions (2026-09-10). One grammar, one parser, shared by the org and every | COMMENT |
| LOW | apps/harbor/packages/protocol/src/search.ts | 1 | import { z } from 'zod'; | COMMENT |
| LOW | apps/harbor/packages/protocol/src/agent-prompt.ts | 101 | COMMENT | |
| LOW | apps/harbor/packages/protocol/src/mcp.ts | 21 | // operations; the MCP server attributes every call as the token's member with | COMMENT |
| LOW | apps/harbor/packages/protocol/src/invite.ts | 1 | import { z } from 'zod'; | COMMENT |
| LOW | apps/harbor/packages/protocol/src/invite.ts | 21 | // browser open; orgs restricting them accept visible re-login instead of | COMMENT |
| LOW | apps/harbor/packages/protocol/src/invite.ts | 41 | // only; content plane stays role-flat). Deferred until human mentions ship: | COMMENT |
| LOW | apps/x/scripts/install-arch.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | apps/x/packages/spaces-client/src/live.ts | 1 | import { ServerFrame, type PresenceState } from '@rowboat/spaces-protocol'; | COMMENT |
| LOW | apps/x/packages/core/src/home/threads.ts | 21 | COMMENT | |
| LOW | apps/x/packages/core/src/background-tasks/runner.ts | 141 | } catch (err) { | COMMENT |
| LOW | apps/x/packages/core/src/di/lazy-resolve.ts | 1 | // Lazily import the DI container and resolve one token. Use this instead of | COMMENT |
| LOW | apps/x/packages/core/src/spreadsheet/spreadsheet.ts | 1 | // Shared spreadsheet read/modify/write logic. Consumed by the builtin | COMMENT |
| LOW | apps/x/packages/core/src/auth/tokens.ts | 1 | import container from '../di/container.js'; | COMMENT |
| LOW | apps/x/packages/core/src/auth/chatgpt-constants.ts | 1 | // OAuth constants for "Sign in with ChatGPT" (ChatGPT subscription auth). | COMMENT |
| LOW | apps/x/packages/core/src/auth/loopback-server.ts | 281 | ); | COMMENT |
| LOW | apps/x/packages/core/src/runtime/tools/types.ts | 1 | // The builtin-tool catalog schema: every entry is {description, inputSchema, | COMMENT |
| LOW | …ps/x/packages/core/src/runtime/tools/domains/spaces.ts | 1 | // Builtin tools: the spaces family. Three groups, one catalog slot: | COMMENT |
| LOW | apps/x/packages/core/src/runtime/tools/domains/code.ts | 101 | if (defaultProject) candidate = path.resolve(defaultProject.path); | COMMENT |
| LOW | apps/x/packages/core/src/runtime/tools/domains/code.ts | 161 | // The composer chip is the source of truth for the agent outside a Code | COMMENT |
| LOW | apps/x/packages/core/src/runtime/tools/domains/code.ts | 221 | // Live rendering, two transports: the CodeRunFeed side-channel | COMMENT |
| LOW | apps/x/packages/core/src/runtime/tools/domains/shell.ts | 21 | }), | COMMENT |
| LOW | …/packages/core/src/runtime/tools/domains/whiteboard.ts | 1 | // Builtin tools: whiteboards — an agent's face of the shared Excalidraw boards | COMMENT |
| LOW | apps/x/packages/core/src/runtime/assembly/traits.ts | 1 | // Built-in agent traits: static metadata with deliberately zero imports. | COMMENT |
| LOW | …ckages/core/src/runtime/assembly/capabilities/types.ts | 1 | // The capability record: the unit of agent assembly. A capability owns what | COMMENT |
| LOW | …ckages/core/src/runtime/assembly/capabilities/types.ts | 21 | // are structurally bundled-only powers. A model-activated skill's prose | COMMENT |
| LOW | …ckages/core/src/runtime/assembly/copilot/base-tools.ts | 1 | // The copilot's always-attached toolset. Everything else is skill-scoped: | COMMENT |
| LOW | apps/x/packages/core/src/runtime/sessions/retention.ts | 1 | import fs from "node:fs/promises"; | COMMENT |
| LOW | apps/x/packages/core/src/runtime/turns/live-status.ts | 1 | import type { TurnBusEvent } from "@x/shared/dist/turns.js"; | COMMENT |
| LOW | apps/x/packages/core/src/runtime/turns/inspect-cli.ts | 1 | // Runtime storage inspector. Works on turns AND sessions (auto-detected): | COMMENT |
| LOW | …/x/packages/core/src/runtime/turns/context-resolver.ts | 21 | // path. A missing or corrupt referenced turn is an infrastructure error. | COMMENT |
| LOW | …s/x/packages/core/src/runtime/turns/context-elision.ts | 21 | // - Tool results: large tool outputs from earlier turns (skill loads, file | COMMENT |
| LOW | …/core/src/runtime/turns/bridges/real-agent-resolver.ts | 101 | // source of truth in capabilities/types.ts — defaults make the parse output | COMMENT |
| LOW | …/core/src/runtime/turns/bridges/real-model-registry.ts | 181 | // reasoning-delta, redacted thinking on reasoning-start; Gemini | COMMENT |
| 106 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | apps/x/packages/core/src/runtime/sessions/retention.ts | 58 | // ── 1. Old chats (chatDays null = never delete chats) ───────── | COMMENT |
| MEDIUM | apps/x/packages/core/src/runtime/sessions/retention.ts | 73 | // ── 2. Old unreferenced turn files ──────────────────────────── | COMMENT |
| MEDIUM | apps/x/packages/core/src/knowledge/note_system.ts | 12 | // ── Default definitions (used to seed WorkDir/config/notes.json) ───────────── | COMMENT |
| MEDIUM | apps/x/packages/core/src/knowledge/note_system.ts | 177 | // ── Disk-backed config with mtime caching ────────────────────────────────── | COMMENT |
| MEDIUM | apps/x/packages/core/src/knowledge/note_system.ts | 212 | // ── Render helper ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | apps/x/packages/core/src/knowledge/tag_system.ts | 29 | // ── Default definitions (used to seed WorkDir/config/tags.json) ───────────── | COMMENT |
| MEDIUM | apps/x/packages/core/src/knowledge/tag_system.ts | 32 | // ── Relationship — who is this from/about (all create) ──────────────── | COMMENT |
| MEDIUM | apps/x/packages/core/src/knowledge/tag_system.ts | 46 | // ── Relationship Sub-Tags — role metadata (notes only, all none) ────── | COMMENT |
| MEDIUM | apps/x/packages/core/src/knowledge/tag_system.ts | 56 | // ── Topic — what the email is about (all create) ────────────────────── | COMMENT |
| MEDIUM | apps/x/packages/core/src/knowledge/tag_system.ts | 69 | // ── Email Type — high-signal email formats (all create) ─────────────── | COMMENT |
| MEDIUM | apps/x/packages/core/src/knowledge/tag_system.ts | 73 | // ── Noise — all skip signals in one place ───────────────────────────── | COMMENT |
| MEDIUM⚡ | apps/x/packages/core/src/knowledge/tag_system.ts | 92 | // ── Action — urgency signals (all create) ───────────────────────────── | COMMENT |
| MEDIUM⚡ | apps/x/packages/core/src/knowledge/tag_system.ts | 97 | // ── Status — workflow state (all none) ──────────────────────────────── | COMMENT |
| MEDIUM⚡ | apps/x/packages/core/src/knowledge/tag_system.ts | 105 | // ── Source — origin metadata (notes only, all none) ─────────────────── | COMMENT |
| MEDIUM⚡ | apps/x/packages/core/src/knowledge/tag_system.ts | 114 | // ── Disk-backed config with mtime caching ────────────────────────────────── | COMMENT |
| MEDIUM | apps/x/packages/core/src/knowledge/tag_system.ts | 149 | // ── Render helpers ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | apps/x/packages/core/src/knowledge/build_graph.ts | 877 | // ── Curation ("gardener") pass ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | apps/x/packages/shared/src/ipc.ts | 684 | // ── New runtime: sessions + turns (session-design.md) ──────────────────── | COMMENT |
| MEDIUM | apps/x/packages/shared/src/ipc.ts | 861 | // ── Home thread registry (the Deck) ────────────────────────────────────── | COMMENT |
| MEDIUM | apps/x/packages/shared/src/ipc.ts | 2090 | // ── Mobile channels (WhatsApp / Telegram bridge) ───────────── | COMMENT |
| MEDIUM | apps/x/apps/renderer/src/components/email-view.tsx | 1487 | // ── Draft autosave ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | apps/x/apps/renderer/src/components/email-view.tsx | 3410 | // ── Keyboard shortcuts (Superhuman-style) ─────────────────────────────────── | COMMENT |
| MEDIUM | apps/x/apps/renderer/src/components/email-view.tsx | 3472 | // ── Smooth list scrolling ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | apps/x/apps/renderer/src/components/coding-run.tsx | 27 | // ── Timeline reduction ────────────────────────────────────────────── | COMMENT |
| MEDIUM | apps/x/apps/renderer/src/components/coding-run.tsx | 226 | // ── In-run permission card ────────────────────────────────────────── | COMMENT |
| MEDIUM | apps/x/apps/renderer/src/lib/session-chat/store.ts | 295 | // ── Actions ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | apps/x/apps/renderer/src/lib/session-chat/store.ts | 358 | // ── Derivation ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | apps/x/apps/server/src/core-deps.ts | 1039 | // ── New runtime: sessions + turns ───────────────────────── | COMMENT |
| MEDIUM | apps/x/apps/main/src/ipc.ts | 1427 | // ── New runtime: sessions + turns ───────────────────────── | COMMENT |
| MEDIUM | apps/x/apps/main/src/ipc.ts | 1940 | // ── Mobile channels (WhatsApp / Telegram bridge) ───────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | …core/src/runtime/assembly/skills/draft-emails/skill.ts | 68 | ### Step 1: Load State | COMMENT |
| LOW⚡ | …core/src/runtime/assembly/skills/draft-emails/skill.ts | 75 | ### Step 2: Scan for New Emails | COMMENT |
| LOW⚡ | …core/src/runtime/assembly/skills/draft-emails/skill.ts | 84 | ### Step 3: Parse Email | COMMENT |
| LOW | …core/src/runtime/assembly/skills/draft-emails/skill.ts | 109 | ### Step 4: Classify Email | COMMENT |
| LOW | …core/src/runtime/assembly/skills/draft-emails/skill.ts | 127 | ### Step 5: Gather Context | COMMENT |
| LOW | …core/src/runtime/assembly/skills/draft-emails/skill.ts | 165 | ### Step 6: Create Draft | COMMENT |
| LOW | …core/src/runtime/assembly/skills/draft-emails/skill.ts | 214 | ### Step 7: Update State | COMMENT |
| LOW | …s/core/src/runtime/assembly/skills/doc-collab/skill.ts | 50 | ### Step 1: Find the Document | COMMENT |
| LOW | …s/core/src/runtime/assembly/skills/doc-collab/skill.ts | 102 | ### Step 2: Understand the Request | COMMENT |
| LOW | …s/core/src/runtime/assembly/skills/doc-collab/skill.ts | 123 | ### Step 3: Execute Changes | COMMENT |
| LOW | …s/core/src/runtime/assembly/skills/doc-collab/skill.ts | 146 | ### Step 4: Confirm and Continue | COMMENT |
| LOW | …core/src/runtime/assembly/skills/meeting-prep/skill.ts | 46 | ### Step 1: Identify the Meeting | COMMENT |
| LOW⚡ | …core/src/runtime/assembly/skills/meeting-prep/skill.ts | 57 | ### Step 2: Parse Calendar Event | COMMENT |
| LOW⚡ | …core/src/runtime/assembly/skills/meeting-prep/skill.ts | 65 | ### Step 3: Gather Context from Knowledge Base | COMMENT |
| LOW | …core/src/runtime/assembly/skills/meeting-prep/skill.ts | 98 | ### Step 4: Create Meeting Brief | COMMENT |
| LOW | apps/x/packages/core/src/pre_built/meeting-prep.md | 49 | ### Step 1: Load State | COMMENT |
| LOW | apps/x/packages/core/src/pre_built/meeting-prep.md | 55 | ### Step 2: Scan for Upcoming Meetings | COMMENT |
| LOW | apps/x/packages/core/src/pre_built/meeting-prep.md | 68 | ### Step 3: Parse Calendar Event | COMMENT |
| LOW | apps/x/packages/core/src/pre_built/meeting-prep.md | 91 | ### Step 4: Gather Context from Notes | COMMENT |
| LOW | apps/x/packages/core/src/pre_built/meeting-prep.md | 128 | ### Step 5: Create Meeting Brief | COMMENT |
| LOW | apps/x/packages/core/src/pre_built/meeting-prep.md | 180 | ### Step 6: Update State | COMMENT |
| LOW⚡ | apps/x/packages/core/src/pre_built/email-draft.md | 50 | ### Step 1: Load State | COMMENT |
| LOW⚡ | apps/x/packages/core/src/pre_built/email-draft.md | 57 | ### Step 2: Scan for New Emails | COMMENT |
| LOW⚡ | apps/x/packages/core/src/pre_built/email-draft.md | 66 | ### Step 3: Parse Email | COMMENT |
| LOW | apps/x/packages/core/src/pre_built/email-draft.md | 91 | ### Step 4: Classify Email | COMMENT |
| LOW | apps/x/packages/core/src/pre_built/email-draft.md | 109 | ### Step 5: Gather Context | COMMENT |
| LOW | apps/x/packages/core/src/pre_built/email-draft.md | 130 | ### Step 6: Create Draft | COMMENT |
| LOW | apps/x/packages/core/src/pre_built/email-draft.md | 176 | ### Step 7: Update State | COMMENT |
| LOW | apps/x/packages/core/src/knowledge/sync_fireflies.ts | 423 | // Step 1: Get list of transcripts with rate limiting | COMMENT |
| LOW | apps/x/packages/core/src/knowledge/sync_fireflies.ts | 490 | // Step 2: Fetch and save each transcript | COMMENT |
| LOW⚡ | apps/x/packages/core/src/knowledge/note_creation.ts | 399 | # Step 3: Look Up Existing Notes in Index | COMMENT |
| LOW | apps/x/packages/core/src/knowledge/note_creation.ts | 205 | # Step 0: Determine Source Type | COMMENT |
| LOW | apps/x/packages/core/src/knowledge/note_creation.ts | 284 | # Step 1: Source Filtering | COMMENT |
| LOW | apps/x/packages/core/src/knowledge/note_creation.ts | 338 | # Step 2: Read and Parse Source File | COMMENT |
| LOW | apps/x/packages/core/src/knowledge/note_creation.ts | 483 | # Step 4: Resolve Entities to Canonical Names | COMMENT |
| LOW | apps/x/packages/core/src/knowledge/note_creation.ts | 587 | # Step 5: Identify New Entities | COMMENT |
| LOW | apps/x/packages/core/src/knowledge/note_creation.ts | 879 | # Step 6: Extract Content | COMMENT |
| LOW | apps/x/packages/core/src/knowledge/note_creation.ts | 1096 | # Step 7: Detect State Changes | COMMENT |
| LOW | apps/x/packages/core/src/knowledge/note_creation.ts | 1170 | # Step 8: Check for Duplicates and Conflicts | COMMENT |
| LOW | apps/x/packages/core/src/knowledge/note_creation.ts | 1200 | # Step 9: Write Updates | COMMENT |
| LOW | apps/x/packages/core/src/knowledge/note_creation.ts | 1267 | # Step 10: Ensure Bidirectional Links | COMMENT |
| LOW | apps/x/packages/core/src/apps/installer.ts | 442 | // Step 8: warn when locally-modified release-managed files would be lost. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | …core/src/runtime/assembly/skills/draft-emails/skill.ts | 68 | ### Step 1: Load State | COMMENT |
| LOW⚡ | …core/src/runtime/assembly/skills/draft-emails/skill.ts | 75 | ### Step 2: Scan for New Emails | COMMENT |
| LOW⚡ | …core/src/runtime/assembly/skills/draft-emails/skill.ts | 84 | ### Step 3: Parse Email | COMMENT |
| LOW | …core/src/runtime/assembly/skills/draft-emails/skill.ts | 109 | ### Step 4: Classify Email | COMMENT |
| LOW | …core/src/runtime/assembly/skills/draft-emails/skill.ts | 127 | ### Step 5: Gather Context | COMMENT |
| LOW | …core/src/runtime/assembly/skills/draft-emails/skill.ts | 165 | ### Step 6: Create Draft | COMMENT |
| LOW | …core/src/runtime/assembly/skills/draft-emails/skill.ts | 214 | ### Step 7: Update State | COMMENT |
| LOW | …s/core/src/runtime/assembly/skills/doc-collab/skill.ts | 50 | ### Step 1: Find the Document | COMMENT |
| LOW | …s/core/src/runtime/assembly/skills/doc-collab/skill.ts | 102 | ### Step 2: Understand the Request | COMMENT |
| LOW | …s/core/src/runtime/assembly/skills/doc-collab/skill.ts | 123 | ### Step 3: Execute Changes | COMMENT |
| LOW | …s/core/src/runtime/assembly/skills/doc-collab/skill.ts | 146 | ### Step 4: Confirm and Continue | COMMENT |
| LOW | …core/src/runtime/assembly/skills/meeting-prep/skill.ts | 46 | ### Step 1: Identify the Meeting | COMMENT |
| LOW⚡ | …core/src/runtime/assembly/skills/meeting-prep/skill.ts | 57 | ### Step 2: Parse Calendar Event | COMMENT |
| LOW⚡ | …core/src/runtime/assembly/skills/meeting-prep/skill.ts | 65 | ### Step 3: Gather Context from Knowledge Base | COMMENT |
| LOW | …core/src/runtime/assembly/skills/meeting-prep/skill.ts | 98 | ### Step 4: Create Meeting Brief | COMMENT |
| LOW | apps/x/packages/core/src/knowledge/sync_fireflies.ts | 423 | // Step 1: Get list of transcripts with rate limiting | COMMENT |
| LOW | apps/x/packages/core/src/knowledge/sync_fireflies.ts | 490 | // Step 2: Fetch and save each transcript | COMMENT |
| LOW⚡ | apps/x/packages/core/src/knowledge/note_creation.ts | 399 | # Step 3: Look Up Existing Notes in Index | COMMENT |
| LOW | apps/x/packages/core/src/knowledge/note_creation.ts | 205 | # Step 0: Determine Source Type | COMMENT |
| LOW | apps/x/packages/core/src/knowledge/note_creation.ts | 284 | # Step 1: Source Filtering | COMMENT |
| LOW | apps/x/packages/core/src/knowledge/note_creation.ts | 338 | # Step 2: Read and Parse Source File | COMMENT |
| LOW | apps/x/packages/core/src/knowledge/note_creation.ts | 483 | # Step 4: Resolve Entities to Canonical Names | COMMENT |
| LOW | apps/x/packages/core/src/knowledge/note_creation.ts | 587 | # Step 5: Identify New Entities | COMMENT |
| LOW | apps/x/packages/core/src/knowledge/note_creation.ts | 879 | # Step 6: Extract Content | COMMENT |
| LOW | apps/x/packages/core/src/knowledge/note_creation.ts | 1096 | # Step 7: Detect State Changes | COMMENT |
| LOW | apps/x/packages/core/src/knowledge/note_creation.ts | 1170 | # Step 8: Check for Duplicates and Conflicts | COMMENT |
| LOW | apps/x/packages/core/src/knowledge/note_creation.ts | 1200 | # Step 9: Write Updates | COMMENT |
| LOW | apps/x/packages/core/src/knowledge/note_creation.ts | 1267 | # Step 10: Ensure Bidirectional Links | COMMENT |
| LOW | apps/x/packages/core/src/apps/installer.ts | 442 | // Step 8: warn when locally-modified release-managed files would be lost. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …s/harbor/packages/server/test/attio-connection.test.ts | 529 | 'jane@acme.com', 'Jane Doe', 'Enterprise', 'In progress', 'USD 499.00', `companies: ${company().id.record_id}`]) e | CODE |
| LOW | apps/harbor/packages/server/test/integrations.test.ts | 221 | expect(booked.body).toEqual({ eventTypeId: 10, start: '2026-10-05T19:00:00.000Z', attendee: { name: 'Jane Doe', emai | CODE |
| LOW | apps/x/packages/core/src/auth/chatgpt-auth.test.ts | 44 | email: 'user@example.com', | CODE |
| LOW | apps/x/packages/core/src/auth/chatgpt-auth.test.ts | 118 | expect(identity).toEqual({ accountId: 'acct_123', email: 'user@example.com' }); | CODE |
| LOW | apps/x/packages/core/src/auth/chatgpt-auth.test.ts | 132 | email: 'user@example.com', | CODE |
| LOW | apps/x/packages/core/src/auth/chatgpt-auth.test.ts | 185 | email: 'user@example.com', | CODE |
| LOW | apps/x/packages/core/src/knowledge/build_graph.ts | 331 | // `'Jane Doe' via Founders <founders@user-domain.com>`. Such a From is an | COMMENT |
| LOW⚡ | apps/x/packages/core/src/knowledge/note_creation.ts | 393 | - Organizations: "Acme Corp", "Acme", "@acme.com" | CODE |
| LOW⚡ | apps/x/packages/core/src/knowledge/note_creation.ts | 459 | | Email domain "@acme.com" | Organization "Acme Corp" | Domain matches org | | CODE |
| LOW⚡ | apps/x/packages/core/src/knowledge/note_creation.ts | 468 | | "Acme" | "Acme Corp" | Substring match | | CODE |
| LOW⚡ | apps/x/packages/core/src/knowledge/note_creation.ts | 469 | | "Acme Corporation" | "Acme Corp" | Same root name | | CODE |
| LOW⚡ | apps/x/packages/core/src/knowledge/note_creation.ts | 510 | - "Acme" → "Acme Corp" (existing note) | CODE |
| LOW⚡ | apps/x/packages/core/src/knowledge/note_creation.ts | 511 | - "Acme Corporation" → "Acme Corp" (alias match) | CODE |
| LOW⚡ | apps/x/packages/core/src/knowledge/note_creation.ts | 512 | - "@acme.com" → "Acme Corp" (domain match) | CODE |
| LOW | apps/x/packages/core/src/knowledge/note_creation.ts | 115 | **Mailing-list rewrites are NOT teammates:** a From like \`'Jane Doe' via Founders <founders@owner-domain.com>\` is a | CODE |
| LOW | apps/x/packages/core/src/knowledge/note_creation.ts | 174 | file-grep({ pattern: "Acme Corp", searchPath: "knowledge", fileGlob: "*.md" }) | CODE |
| LOW | apps/x/packages/core/src/knowledge/note_creation.ts | 419 | - "Acme Corp" → Check Organizations table for matching name | CODE |
| LOW | apps/x/packages/core/src/knowledge/note_creation.ts | 571 | - "Acme", "Acme Corp", "@acme.com" → [[Organizations/Acme Corp]] | CODE |
| LOW | apps/x/packages/core/src/analytics/posthog.test.ts | 142 | identify('user_123', { email: 'user@example.com' }); | CODE |
| LOW | apps/x/packages/shared/src/pptx/parse.ts | 877 | return { ...base, type: 'placeholder', kind: 'video' } satisfies PlaceholderShape | CODE |
| LOW | apps/x/packages/shared/src/pptx/parse.ts | 885 | return { ...base, type: 'placeholder', kind: 'unknown' } satisfies PlaceholderShape | CODE |
| LOW | apps/x/packages/shared/src/pptx/parse.ts | 903 | return { ...base, type: 'placeholder', kind: graphicFrameKind(node) } satisfies PlaceholderShape | CODE |
| LOW | apps/x/packages/shared/src/pptx/parse.test.ts | 121 | expect(slide.shapes.map((s) => s.type)).toEqual(['text', 'image', 'placeholder']) | CODE |
| LOW | apps/x/packages/shared/src/pptx/types.ts | 226 | type: 'placeholder' | CODE |
| LOW | apps/x/apps/renderer/src/components/pptx-editor.tsx | 833 | if (shape.type === 'placeholder' && shape.kind !== 'video') return | CODE |
| LOW | apps/x/apps/renderer/src/components/pptx/canvas.tsx | 324 | if (shape.type === 'placeholder') { | CODE |
| LOW | apps/x/apps/renderer/src/lib/email-quotes.test.ts | 61 | expect(visible(prepared.html)).toContain('Jane Doe') | CODE |
| LOW | apps/x/apps/main/src/browser/page-scripts.ts | 121 | const placeholder = truncateText(element.getAttribute('placeholder') ?? '', 120); | CODE |
| LOW | apps/x/apps/main/src/browser/page-scripts.ts | 309 | placeholder: truncateText(candidate.getAttribute('placeholder') ?? '', 120) || null, | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | apps/harbor/packages/server/test/api.test.ts | 1093 | expect(padded.body.message.poll.answers.map((a: any) => a.text)).toEqual(['x'.repeat(55), 'b']); | CODE |
| CRITICAL | …/harbor/packages/server/src/connectors/attio/client.ts | 103 | if (!result.success || result.data.data.id.record_id.toLowerCase() !== recordId.toLowerCase()) { | CODE |
| CRITICAL | …renderer/src/components/spaces/composer-editor.test.ts | 172 | const nodeNames = (e: Editor) => e.state.doc.content.content.map((n) => n.type.name) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | apps/x/apps/renderer/src/components/email-view.tsx | 403 | // Convert AI-generated plain text into the simple paragraph HTML the Tiptap | COMMENT |
| HIGH | apps/x/apps/renderer/src/components/email-view.tsx | 1212 | // Gmail-side draft (user's own work) wins over the AI-generated draft. | COMMENT |
| HIGH | apps/x/apps/renderer/src/components/email-view.tsx | 1296 | // The signed-in account's display name, used to sign off AI-generated emails. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | apps/x/packages/core/docs/turn-runtime-design.md | 1346 | ## 15. TurnRuntime API and dependency injection | COMMENT |
| MEDIUM | …/x/packages/core/src/background-tasks/code-sessions.ts | 51 | // Wrap the agent-authored task body in a robust autonomous-coding scaffold so | COMMENT |
| MEDIUM | …/x/packages/core/src/background-tasks/code-sessions.ts | 195 | // (the autonomous scaffold tells the agent to commit, so working-tree status | COMMENT |
| MEDIUM | …ackages/core/src/runtime/assembly/skills/index.test.ts | 423 | // Content guardrails surface in the pattern docs… | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …/x/packages/core/src/background-tasks/code-sessions.ts | 51 | // Wrap the agent-authored task body in a robust autonomous-coding scaffold so | COMMENT |
| MEDIUM | apps/x/packages/core/src/voice/voice.ts | 177 | // Local key: Deepgram's pre-recorded REST API (most robust for files). | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .github/workflows/electron-build.yml | 61 | # Create a temporary keychain | COMMENT |