Mobile and Web client for Codex and Claude Code, with realtime voice, encryption and fully featured
This report presents the forensic synthetic code analysis of slopus/happy, a TypeScript project with 22,621 GitHub stars. SynthScan v2.0 examined 258,428 lines of code across 1265 source files, recording 475 pattern matches distributed across 12 syntactic categories. The overall adjusted score of 2.4 places this repository in the Likely human-written band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 475 distinct pattern matches across 12 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. 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 diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | environments/environments.ts | 139 | function ensureLabRatProjectTemplate() { | CODE |
| LOW | .agents/skills/sessions/scripts/extract-metadata.py | 99 | def _extract_user_assistant_text(filepath): | CODE |
| LOW | …uperpowers/plans/2026-06-10-codex-image-attachments.md | 157 | export function supportsImageAttachmentsForFlavor(flavor: ImageAttachmentFlavor): boolean { | CODE |
| LOW | …uperpowers/plans/2026-06-10-codex-image-attachments.md | 161 | export function getImageAttachmentSendPlan(opts: { | CODE |
| LOW | …uperpowers/plans/2026-06-10-codex-image-attachments.md | 916 | export function resolveCodexImageCacheDir(opts: { | CODE |
| LOW | …uperpowers/plans/2026-06-10-codex-image-attachments.md | 923 | export async function prepareCodexImageInputItems( | CODE |
| LOW | …uperpowers/plans/2026-06-10-codex-image-attachments.md | 1099 | export async function downloadCodexFileEventAttachment( | CODE |
| LOW | …uperpowers/plans/2026-06-10-codex-image-attachments.md | 1394 | export function mapCodexThreadItemToSessionEnvelopes( | CODE |
| LOW | …uperpowers/plans/2026-06-10-codex-image-attachments.md | 1733 | async function localImagePathToAttachment(path: string, index: number): Promise<{ data: Uint8Array; mimeType: string; na | CODE |
| LOW | …uperpowers/plans/2026-06-10-codex-image-attachments.md | 1752 | export async function buildCodexThreadBackfillEnvelopes(opts: { | CODE |
| LOW | …erpowers/plans/2026-05-20-new-session-right-sidebar.md | 115 | export function getNewSessionSidebarLayout(input: NewSessionSidebarLayoutInput) { | CODE |
| LOW | …ers/plans/2026-06-10-attachment-storage-diagnostics.md | 244 | export function sanitizeAttachmentUrlHost(url: string | null | undefined): string | undefined { | CODE |
| LOW | …ers/plans/2026-06-10-attachment-storage-diagnostics.md | 254 | export function classifyAttachmentTransferTarget( | CODE |
| LOW | …ers/plans/2026-06-10-attachment-storage-diagnostics.md | 271 | export function createAttachmentDiagnostic(input: CreateAttachmentDiagnosticInput): AttachmentDiagnostic { | CODE |
| LOW | …ers/plans/2026-06-10-attachment-storage-diagnostics.md | 289 | export function createAttachmentDiagnosticError( | CODE |
| LOW | …ers/plans/2026-06-10-attachment-storage-diagnostics.md | 303 | export function formatAttachmentDiagnosticForLog( | CODE |
| LOW | …ers/plans/2026-06-10-attachment-storage-diagnostics.md | 973 | function warnAttachmentImageDiagnostic(reason: string, message?: string) { | CODE |
| LOW | packages/happy-agent/src/cli-smoke.test.ts | 67 | function makeRawSessionWithDataKey( | CODE |
| LOW | packages/happy-agent/src/encryption.ts | 183 | export function libsodiumEncryptForPublicKey(data: Uint8Array, recipientPublicKey: Uint8Array): Uint8Array { | CODE |
| LOW | packages/happy-agent/src/api.test.ts | 73 | function makeRawSessionWithDataKey( | CODE |
| LOW | packages/codium/sources/boot/main/index.ts | 309 | async function resolveProjectWorkspaceName(args: { | CODE |
| LOW | …ckages/codium/sources/boot/main/happy-worker/worker.ts | 287 | function libsodiumBoxSecretKeyFromSeed(seed: Uint8Array): Uint8Array { | CODE |
| LOW | …/happy-server/sources/app/social/friendNotification.ts | 36 | export async function sendFriendRequestNotification( | CODE |
| LOW | …/happy-server/sources/app/social/friendNotification.ts | 88 | export async function sendFriendshipEstablishedNotification( | CODE |
| LOW | …ckages/happy-server/sources/app/monitoring/metrics2.ts | 29 | export function getMetricsLabelsFromSocket(socket: Socket): ClientLabels { | CODE |
| LOW | …ckages/happy-server/sources/app/monitoring/metrics2.ts | 37 | export function getMetricsLabelsFromRequest(request: { headers: Record<string, string | string[] | undefined> }): Client | CODE |
| LOW | …ckages/happy-server/sources/app/monitoring/metrics2.ts | 137 | export function startDatabaseMetricsUpdater(): void { | CODE |
| LOW | packages/happy-server/sources/app/events/eventRouter.ts | 499 | export function buildSessionActivityEphemeral(sessionId: string, active: boolean, activeAt: number, thinking?: boolean): | CODE |
| LOW | packages/happy-server/sources/app/events/eventRouter.ts | 509 | export function buildMachineActivityEphemeral(machineId: string, active: boolean, activeAt: number): EphemeralPayload { | CODE |
| LOW | packages/happy-server/sources/app/events/eventRouter.ts | 529 | export function buildMachineStatusEphemeral(machineId: string, online: boolean): EphemeralPayload { | CODE |
| LOW | packages/happy-server/sources/app/events/eventRouter.ts | 543 | export function buildSessionEventEphemeral(sessionId: string, kind: 'done' | 'permission' | 'question', title: string, b | CODE |
| LOW | packages/happy-server/sources/app/events/eventRouter.ts | 584 | export function buildUpdateArtifactUpdate(artifactId: string, updateSeq: number, updateId: string, header?: { value: str | CODE |
| LOW | packages/happy-server/sources/app/events/eventRouter.ts | 598 | export function buildDeleteArtifactUpdate(artifactId: string, updateSeq: number, updateId: string): UpdatePayload { | CODE |
| LOW | packages/happy-server/sources/app/events/eventRouter.ts | 610 | export function buildRelationshipUpdatedEvent( | CODE |
| LOW | packages/happy-server/sources/utils/backoff.ts | 5 | function exponentialRandomizedBackoffDelay(failureCount: number, minDelay: number, maxDelay: number, factor = 0.5) { | CODE |
| LOW | packages/happy-app/sources/track/index.ts | 73 | export function trackVoicePermissionResponse(allowed: boolean) { | CODE |
| LOW | packages/happy-app/sources/track/index.ts | 80 | export function trackPaywallButtonClicked(flow?: string) { | CODE |
| LOW | packages/happy-app/sources/track/index.ts | 115 | export function trackReviewPromptResponse(likesApp: boolean) { | CODE |
| LOW | packages/happy-app/sources/track/index.ts | 123 | export function trackReviewRetryScheduled(daysUntilRetry: number) { | CODE |
| LOW | packages/happy-app/sources/app/_layout.tsx | 88 | function HorizontalSafeAreaWrapper({ children }: { children: React.ReactNode }) { | CODE |
| LOW | packages/happy-app/sources/app/_layout.tsx | 104 | function stringifyNotificationPayload(value: unknown): string { | CODE |
| LOW | packages/happy-app/sources/app/_layout.tsx | 177 | function getDevEnvironmentCredentials(): AuthCredentials | null { | CODE |
| LOW | packages/happy-app/sources/app/_layout.tsx | 191 | function getDevWebQueryCredentials(): AuthCredentials | null { | CODE |
| LOW | …kages/happy-app/sources/app/(app)/settings/account.tsx | 36 | function formatPushPermissionLabel(permission: PushPermissionInfo | null): string { | CODE |
| LOW | …kages/happy-app/sources/app/(app)/settings/account.tsx | 52 | function formatPushPermissionSubtitle(permission: PushPermissionInfo | null): string { | CODE |
| LOW | …kages/happy-app/sources/app/(app)/settings/account.tsx | 68 | function formatPushTokenFingerprint(token: string): string { | CODE |
| LOW | …ckages/happy-app/sources/app/(app)/settings/agents.tsx | 52 | export default function AgentDefaultsSettingsScreen() { | CODE |
| LOW | …es/happy-app/sources/app/(app)/settings/appearance.tsx | 109 | function StatusDisplayDropdownValue(props: { | CODE |
| LOW | packages/happy-app/sources/app/(app)/new/index.tsx | 112 | function trimTrailingPathSeparator(path: string): string { | CODE |
| LOW | packages/happy-app/sources/app/(app)/new/index.tsx | 119 | function normalizePathForComparison(path: string | null | undefined, homeDir?: string): string | null { | CODE |
| LOW | …/happy-app/sources/app/(app)/dev/messages-demo-data.ts | 98 | export async function processUserDataWithValidationAndTransformation( | CODE |
| LOW | …ages/happy-app/sources/app/(app)/session/[id]/info.tsx | 102 | function formatDangerouslySkipPermissionsMetadata( | CODE |
| LOW | …ages/happy-app/sources/navigation/browserNavigation.ts | 49 | export function applyRouteHistoryPathname( | CODE |
| LOW | …ages/happy-app/sources/navigation/browserNavigation.ts | 87 | export function getKeyboardNavigationDirection(event: KeyboardNavigationEvent): BrowserNavigationDirection | null { | CODE |
| LOW | …ages/happy-app/sources/navigation/browserNavigation.ts | 94 | export function getMouseNavigationDirection(event: MouseNavigationEvent): BrowserNavigationDirection | null { | CODE |
| LOW | …kages/happy-app/sources/utils/microphonePermissions.ts | 16 | export async function requestMicrophonePermission(): Promise<MicrophonePermissionResult> { | CODE |
| LOW | …kages/happy-app/sources/utils/microphonePermissions.ts | 55 | export async function checkMicrophonePermission(): Promise<MicrophonePermissionResult> { | CODE |
| LOW | …kages/happy-app/sources/utils/microphonePermissions.ts | 84 | export function showMicrophonePermissionDeniedAlert(canAskAgain: boolean = false) { | CODE |
| LOW | packages/happy-app/sources/utils/deviceCalculations.ts | 5 | export function calculateDeviceDimensions(params: { | CODE |
| LOW | …py-app/sources/utils/copySessionMetadataToClipboard.ts | 7 | export async function copySessionMetadataToClipboard(session: Session): Promise<boolean> { | CODE |
| 186 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docs/plans/provider-envelope-redesign.md | 117 | // ── User Message ────────────────────────────────────────── | COMMENT |
| MEDIUM | docs/plans/provider-envelope-redesign.md | 139 | // ── Assistant Message ───────────────────────────────────── | COMMENT |
| MEDIUM | docs/competition/opencode/trace-opencode.sh | 26 | # ── Config ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | docs/competition/opencode/trace-opencode.sh | 43 | # ── Helpers ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | docs/competition/opencode/trace-opencode.sh | 172 | # ── Setup ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | docs/competition/opencode/trace-opencode.sh | 210 | # ── Start server ──────────────────────────────────────────── | COMMENT |
| MEDIUM | docs/competition/opencode/trace-opencode.sh | 235 | # ── Parse flow arguments ──────────────────────────────────── | COMMENT |
| MEDIUM | docs/competition/opencode/trace-opencode.sh | 388 | # ── Run flows ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | …s/happy-app/sources/components/diff/PierreDiffView.tsx | 32 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …s/happy-app/sources/components/diff/PierreDiffView.tsx | 36 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …s/happy-app/sources/components/diff/PierreDiffView.tsx | 75 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …s/happy-app/sources/components/diff/PierreDiffView.tsx | 77 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …s/happy-app/sources/components/diff/PierreDiffView.tsx | 172 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …s/happy-app/sources/components/diff/PierreDiffView.tsx | 176 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/happy-cli/experiments/codex-reject.ts | 33 | // ── Config ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/happy-cli/experiments/codex-reject.ts | 39 | // ── Helpers ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/happy-cli/experiments/codex-reject.ts | 64 | // ── Main ──────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/happy-cli/experiments/codex-reject.ts | 162 | // ── Results ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/happy-cli/experiments/codex.ts | 25 | // ── Config ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/happy-cli/experiments/codex.ts | 35 | // ── Helpers ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/happy-cli/experiments/codex.ts | 67 | // ── Main ──────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/happy-cli/src/openclaw/OpenClawSocket.ts | 236 | // ─── Private ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | …es/happy-cli/src/openclaw/openclaw.integration.test.ts | 36 | // ── Shared helpers ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …es/happy-cli/src/openclaw/openclaw.integration.test.ts | 100 | // ── 1. OpenClawSocket ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …es/happy-cli/src/openclaw/openclaw.integration.test.ts | 232 | // ── 2. OpenClawBackend ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …es/happy-cli/src/openclaw/openclaw.integration.test.ts | 290 | // ── 3. Full message pipeline ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | …es/happy-cli/src/openclaw/openclaw.integration.test.ts | 387 | // ── 4. Daemon lifecycle ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/happy-cli/src/codex/codexAppServerClient.ts | 593 | // ─── Lifecycle ────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/happy-cli/src/codex/codexAppServerClient.ts | 787 | // ─── Thread management ────────────────────────────────────── | COMMENT |
| MEDIUM | packages/happy-cli/src/codex/codexAppServerClient.ts | 977 | // ─── Turn management ──────────────────────────────────────── | COMMENT |
| MEDIUM | packages/happy-cli/src/codex/codexAppServerClient.ts | 1220 | // ─── State queries ────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/happy-cli/src/codex/codexAppServerClient.ts | 1239 | // ─── JSON-RPC transport ───────────────────────────────────── | COMMENT |
| MEDIUM | packages/happy-cli/src/codex/codex.integration.test.ts | 22 | // ── Helpers ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/happy-cli/src/codex/codex.integration.test.ts | 52 | // ── CodexDriver ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/happy-cli/src/codex/codex.integration.test.ts | 207 | // ── Tests ──────────────────────────────────────────────────────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .agents/skills/release/SKILL.md | 15 | ## Step 1: Pick a target | COMMENT |
| LOW | .agents/skills/release/SKILL.md | 42 | ### Step 2: Gather state | COMMENT |
| LOW⚡ | .agents/skills/release/SKILL.md | 60 | ### Step 3: Pick channel and version | COMMENT |
| LOW⚡ | .agents/skills/release/SKILL.md | 70 | ### Step 4: Version bump | COMMENT |
| LOW⚡ | .agents/skills/release/SKILL.md | 76 | ### Step 5: Build | COMMENT |
| LOW | .agents/skills/release/SKILL.md | 113 | ### Step 6: Test (unit only) | COMMENT |
| LOW | .agents/skills/release/SKILL.md | 125 | ### Step 7: Publish | COMMENT |
| LOW | .agents/skills/release/SKILL.md | 177 | ### Step 8: Verify | COMMENT |
| LOW | .agents/skills/release/SKILL.md | 199 | ### Step 9: Git tag + commit (latest only) | COMMENT |
| LOW | .agents/skills/release/SKILL.md | 218 | ### Step 10: GitHub Release (latest only) | COMMENT |
| LOW | .agents/skills/release/SKILL.md | 225 | ### Step 11: Install + verify locally | COMMENT |
| LOW | …es/happy-server/sources/app/github/githubDisconnect.ts | 21 | // Step 1: Check if user has GitHub connection | COMMENT |
| LOW | …es/happy-server/sources/app/github/githubDisconnect.ts | 36 | // Step 2: Transaction for atomic database operations | COMMENT |
| LOW | …es/happy-server/sources/app/github/githubDisconnect.ts | 53 | // Step 3: Send update via socket (after transaction completes) | COMMENT |
| LOW⚡ | …kages/happy-server/sources/app/github/githubConnect.ts | 34 | // Step 1: Check if user is already connected to this exact GitHub account | COMMENT |
| LOW⚡ | …kages/happy-server/sources/app/github/githubConnect.ts | 43 | // Step 2: Check if GitHub account is connected to another user | COMMENT |
| LOW⚡ | …kages/happy-server/sources/app/github/githubConnect.ts | 55 | // Step 3: Upload avatar to S3 (outside transaction for performance) | COMMENT |
| LOW⚡ | …kages/happy-server/sources/app/github/githubConnect.ts | 63 | // Step 4: Start transaction for atomic database operations | COMMENT |
| LOW | …kages/happy-server/sources/app/github/githubConnect.ts | 93 | // Step 5: Send update via socket (after transaction completes) | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 1228 | // Step 1: Create pending permission | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 1247 | // Step 2: Approve permission | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 1267 | // Step 3: Tool call arrives | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 1293 | // Step 4: Tool result arrives | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2139 | // Step 1: Load tool message first (without AgentState) - simulates messages loaded before sessions | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2168 | // Step 2: AgentState arrives with both pending and approved (sessions loaded) | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2204 | // Step 1: Load tool message first | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2225 | // Step 2: AgentState arrives with denied permission | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2263 | // Step 1: Load tool message first | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2284 | // Step 2: AgentState arrives with canceled permission | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2403 | // Step 1: Load tool message that's already completed | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2448 | // Step 2: AgentState arrives with approved permission | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2481 | // Step 1: Load completed tool | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2521 | // Step 2: AgentState with denied permission (too late!) | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2555 | // Step 1: Load tool that errored | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2596 | // Step 2: AgentState with approved permission (too late to help) | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2621 | // Step 1: Load tool that errored | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2657 | // Step 2: AgentState with denied permission | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2685 | // Step 1: Tool call | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2705 | // Step 2: Tool result arrives | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2729 | // Step 3: AgentState arrives later with permission info | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2812 | // Step 1: Process tool messages WITHOUT AgentState (simulating messages loading before session) | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2845 | // Step 2: Later, AgentState arrives with permission for this tool | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2885 | // Step 1: Messages load WITHOUT AgentState (session hasn't arrived yet) | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2949 | // Step 2: Session arrives with AgentState containing permission info | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2973 | // Step 3: User sends a new message, triggering a new reducer call | COMMENT |
| LOW | …happy-app/sources/sync/reducer/phase0-skipping.spec.ts | 152 | // Step 1: Process tools without AgentState | COMMENT |
| LOW | …happy-app/sources/sync/reducer/phase0-skipping.spec.ts | 181 | // Step 2: AgentState arrives later with permission | COMMENT |
| LOW⚡ | packages/happy-cli/src/ui/auth.ts | 259 | // Step 1: Handle authentication | COMMENT |
| LOW⚡ | packages/happy-cli/src/utils/serverConnectionErrors.ts | 185 | // Step 1: Health check - verify server is reachable | COMMENT |
| LOW⚡ | packages/happy-cli/src/utils/serverConnectionErrors.ts | 191 | // Step 2: Server available - perform reconnection callback | COMMENT |
| LOW⚡ | packages/happy-cli/src/utils/serverConnectionErrors.ts | 199 | // Step 3: Mark success and notify user | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …es/happy-server/sources/app/github/githubDisconnect.ts | 21 | // Step 1: Check if user has GitHub connection | COMMENT |
| LOW | …es/happy-server/sources/app/github/githubDisconnect.ts | 36 | // Step 2: Transaction for atomic database operations | COMMENT |
| LOW | …es/happy-server/sources/app/github/githubDisconnect.ts | 53 | // Step 3: Send update via socket (after transaction completes) | COMMENT |
| LOW⚡ | …kages/happy-server/sources/app/github/githubConnect.ts | 34 | // Step 1: Check if user is already connected to this exact GitHub account | COMMENT |
| LOW⚡ | …kages/happy-server/sources/app/github/githubConnect.ts | 43 | // Step 2: Check if GitHub account is connected to another user | COMMENT |
| LOW⚡ | …kages/happy-server/sources/app/github/githubConnect.ts | 55 | // Step 3: Upload avatar to S3 (outside transaction for performance) | COMMENT |
| LOW⚡ | …kages/happy-server/sources/app/github/githubConnect.ts | 63 | // Step 4: Start transaction for atomic database operations | COMMENT |
| LOW | …kages/happy-server/sources/app/github/githubConnect.ts | 93 | // Step 5: Send update via socket (after transaction completes) | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 1228 | // Step 1: Create pending permission | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 1247 | // Step 2: Approve permission | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 1267 | // Step 3: Tool call arrives | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 1293 | // Step 4: Tool result arrives | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2139 | // Step 1: Load tool message first (without AgentState) - simulates messages loaded before sessions | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2168 | // Step 2: AgentState arrives with both pending and approved (sessions loaded) | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2204 | // Step 1: Load tool message first | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2225 | // Step 2: AgentState arrives with denied permission | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2263 | // Step 1: Load tool message first | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2284 | // Step 2: AgentState arrives with canceled permission | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2403 | // Step 1: Load tool message that's already completed | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2448 | // Step 2: AgentState arrives with approved permission | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2481 | // Step 1: Load completed tool | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2521 | // Step 2: AgentState with denied permission (too late!) | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2555 | // Step 1: Load tool that errored | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2596 | // Step 2: AgentState with approved permission (too late to help) | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2621 | // Step 1: Load tool that errored | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2657 | // Step 2: AgentState with denied permission | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2685 | // Step 1: Tool call | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2705 | // Step 2: Tool result arrives | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2729 | // Step 3: AgentState arrives later with permission info | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2812 | // Step 1: Process tool messages WITHOUT AgentState (simulating messages loading before session) | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2845 | // Step 2: Later, AgentState arrives with permission for this tool | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2885 | // Step 1: Messages load WITHOUT AgentState (session hasn't arrived yet) | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2949 | // Step 2: Session arrives with AgentState containing permission info | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2973 | // Step 3: User sends a new message, triggering a new reducer call | COMMENT |
| LOW | …happy-app/sources/sync/reducer/phase0-skipping.spec.ts | 152 | // Step 1: Process tools without AgentState | COMMENT |
| LOW | …happy-app/sources/sync/reducer/phase0-skipping.spec.ts | 181 | // Step 2: AgentState arrives later with permission | COMMENT |
| LOW⚡ | packages/happy-cli/src/ui/auth.ts | 259 | // Step 1: Handle authentication | COMMENT |
| LOW⚡ | packages/happy-cli/src/utils/serverConnectionErrors.ts | 185 | // Step 1: Health check - verify server is reachable | COMMENT |
| LOW⚡ | packages/happy-cli/src/utils/serverConnectionErrors.ts | 191 | // Step 2: Server available - perform reconnection callback | COMMENT |
| LOW⚡ | packages/happy-cli/src/utils/serverConnectionErrors.ts | 199 | // Step 3: Mark success and notify user | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | packages/happy-app/sources/sync/typesRaw.ts | 408 | data.content.data.message.content = data.content.data.message.content.map(normalizeContent); | CODE |
| CRITICAL | packages/happy-app/sources/sync/typesRaw.ts | 414 | data.content.data.message.content = data.content.data.message.content.map(normalizeContent); | CODE |
| CRITICAL | packages/happy-cli/src/agent/acp/runAcp.test.ts | 255 | const envelopeTypes = mocks.mockSession.sendSessionProtocolMessage.mock.calls.map(([envelope]) => envelope.ev.t); | CODE |
| CRITICAL | packages/happy-cli/src/agent/acp/runAcp.test.ts | 494 | const metadataHandlers = mocks.mockSession.updateMetadata.mock.calls.map((call) => call[0]); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .agents/skills/agent-browser/SKILL.md | 23 | agent-browser fill @e1 "user@example.com" | CODE |
| LOW | .agents/skills/agent-browser/SKILL.md | 39 | agent-browser fill @e1 "user@example.com" && agent-browser fill @e2 "password123" && agent-browser click @e3 | CODE |
| LOW | .agents/skills/agent-browser/SKILL.md | 110 | agent-browser fill @e1 "Jane Doe" | CODE |
| LOW | .agents/skills/office-hours/SKILL.md | 433 | - Include realistic placeholder content (not "Lorem ipsum" — use content that matches the actual use case) | CODE |
| LOW | .claude/skills/agent-browser/SKILL.md | 23 | agent-browser fill @e1 "user@example.com" | CODE |
| LOW | .claude/skills/agent-browser/SKILL.md | 39 | agent-browser fill @e1 "user@example.com" && agent-browser fill @e2 "password123" && agent-browser click @e3 | CODE |
| LOW | .claude/skills/agent-browser/SKILL.md | 110 | agent-browser fill @e1 "Jane Doe" | CODE |
| LOW | …uperpowers/plans/2026-06-10-codex-image-attachments.md | 1248 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | …ckages/happy-server/sources/utils/separateName.spec.ts | 6 | const result = separateName('John Doe'); | CODE |
| LOW | packages/happy-app/sources/app/(app)/dev/tools2.tsx | 135 | command: 'git log --pretty=format:"%h - %an, %ar : %s" --graph --since=2.weeks --author="John Doe" --gre | CODE |
| LOW | …s/happy-app/sources/sync/attachmentDiagnostics.test.ts | 231 | expect(serialized).not.toContain('user@example.com'); | CODE |
| LOW | …ages/happy-cli/docs/bug-fix-plan-2025-01-15-athundt.md | 233 | new ApiSessionClient('fake-token', { id: 'test' } as any); | CODE |
| LOW | …ages/happy-cli/docs/bug-fix-plan-2025-01-15-athundt.md | 262 | const api = new Api('fake-key'); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 188 | new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 200 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 216 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 261 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 309 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 335 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 378 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 489 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 546 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 583 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 621 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 662 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 702 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 735 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 779 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 836 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 856 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 907 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 958 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 998 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 1017 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 1039 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 1067 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 1094 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 1123 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 1140 | new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 1158 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiMachine.test.ts | 131 | const client = new ApiMachineClient('fake-token', makeMachine()); | CODE |
| LOW | packages/happy-cli/src/api/apiMachine.test.ts | 154 | const client = new ApiMachineClient('fake-token', makeMachine()); | CODE |
| LOW | packages/happy-cli/src/api/api.test.ts | 74 | token: 'fake-token', | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .agents/skills/sessions/scripts/discover-sessions.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | docs/competition/opencode/trace-opencode.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | packages/happy-server/tsconfig.json | 1 | { | COMMENT |
| LOW | packages/happy-server/tsconfig.json | 21 | // "removeComments": true, /* Do not emit comments to output. */ | COMMENT |
| LOW | packages/happy-server/tsconfig.json | 41 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ | COMMENT |
| LOW | …ages/happy-server/sources/app/api/socket/rpcHandler.ts | 201 | callback?.({ ok: false, error: 'Cannot call RPC on the same socket' }); | COMMENT |
| LOW | packages/happy-app/nativewind-env.d.ts | 1 | /// <reference types="nativewind/types" /> | COMMENT |
| LOW | …appy-app/sources/app/(app)/settings/connect/claude.tsx | 21 | // try { | COMMENT |
| LOW | packages/happy-app/sources/components/AgentInput.tsx | 721 | const handleInputStateChange = React.useCallback((newState: TextInputState) => { | COMMENT |
| LOW | …/happy-app/sources/components/HorizontalScrollView.tsx | 1 | import * as React from 'react'; | COMMENT |
| LOW | packages/happy-app/sources/sync/sync.ts | 1321 | seq: number; | COMMENT |
| LOW | packages/happy-app/sources/sync/sync.ts | 1881 | // through loadOlderMessages() when the user scrolls up — and | COMMENT |
| LOW | packages/happy-app/sources/sync/sync.ts | 1901 | if (isInitialLoad) { | COMMENT |
| LOW | …happy-app/sources/sync/encryption/encryptor.appspec.ts | 301 | // it('should encrypt and decrypt multiple Uint8Arrays', async () => { | COMMENT |
| LOW | …happy-app/sources/sync/encryption/encryptor.appspec.ts | 321 | COMMENT | |
| LOW | …happy-app/sources/sync/encryption/encryptor.appspec.ts | 341 | // const decrypted1 = await encryptor.decrypt(encrypted1); | COMMENT |
| LOW | …happy-app/sources/sync/encryption/encryptor.appspec.ts | 361 | COMMENT | |
| LOW | …happy-app/sources/sync/encryption/encryptor.appspec.ts | 381 | // const encryptor = new AES256Encryption(secretKey); | COMMENT |
| LOW | …happy-app/sources/sync/encryption/encryptor.appspec.ts | 401 | // } | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 1 | import { describe, it, expect } from 'vitest'; | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 21 | // if (rawParsed[i].role === 'agent' && ((rawParsed[i] as any).content.data.type === 'system' || (rawPar | COMMENT |
| LOW | …ckages/happy-app/sources/sync/reducer/reducerTracer.ts | 1 | // ============================================================================ | COMMENT |
| LOW | …ckages/happy-app/sources/sync/reducer/reducerTracer.ts | 21 | // - A parentUUID: Reference to its parent message (for nested responses) | COMMENT |
| LOW | …ckages/happy-app/sources/sync/reducer/reducerTracer.ts | 41 | // 5. Propagation: Once a sidechain root is identified, all its descendants | COMMENT |
| LOW | packages/happy-cli/src/gemini/runGemini.ts | 601 | } | COMMENT |
| LOW | packages/happy-cli/src/claude/runClaude.ts | 281 | session.suppressNextArchiveSignal(); | COMMENT |
| LOW | packages/happy-cli/src/claude/runClaude.ts | 321 | } | COMMENT |
| LOW | packages/happy-cli/src/claude/runClaude.ts | 461 | COMMENT | |
| LOW | packages/happy-cli/src/claude/runClaude.ts | 821 | // | COMMENT |
| LOW | packages/happy-cli/src/claude/claudeRemoteLauncher.ts | 101 | COMMENT | |
| LOW | packages/happy-cli/src/claude/claudeLocal.ts | 61 | // Determine if we have an existing session to resume | COMMENT |
| LOW | …ages/happy-cli/src/claude/utils/sessionScanner.test.ts | 261 | return; | COMMENT |
| LOW | …ages/happy-cli/src/claude/utils/sessionScanner.test.ts | 281 | // expect(collectedMessages[0].type).toBe('user') | COMMENT |
| LOW | …ages/happy-cli/src/claude/utils/sessionScanner.test.ts | 301 | COMMENT | |
| LOW | packages/happy-cli/src/agent/transport/index.ts | 21 | // Agent-specific handlers | COMMENT |
| LOW | packages/happy-cli/src/daemon/controlClient.ts | 201 | // field baked into `dist/` at build time via `import packageJson from '../package.json'`. | COMMENT |
| LOW | …s/happy-cli/src/commands/connect/authenticateClaude.ts | 101 | }); | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .agents/skills/sessions/scripts/extract-errors.py | 51 | CODE | |
| LOW | .agents/skills/sessions/scripts/extract-errors.py | 64 | CODE | |
| LOW | .agents/skills/sessions/scripts/extract-skeleton.py | 72 | CODE | |
| LOW | .agents/skills/sessions/scripts/extract-skeleton.py | 154 | CODE | |
| LOW | .agents/skills/sessions/scripts/extract-skeleton.py | 221 | CODE | |
| LOW | .agents/skills/sessions/scripts/extract-skeleton.py | 271 | CODE | |
| LOW | .agents/skills/sessions/scripts/extract-metadata.py | 38 | CODE | |
| LOW | .agents/skills/sessions/scripts/extract-metadata.py | 80 | CODE | |
| LOW | .agents/skills/sessions/scripts/extract-metadata.py | 99 | CODE | |
| LOW | .agents/skills/sessions/scripts/extract-metadata.py | 188 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docs/competition/opencode/trace-opencode.sh | 3 | # trace-opencode.sh — reusable harness for tracing OpenCode's protocol | COMMENT |
| MEDIUM | …kages/happy-app/sources/sync/__testdata__/trace_0.json | 907 | "text": "## Summary of API Module Structure\n\nBased on the header comments and | CODE |
| MEDIUM | …kages/happy-app/sources/sync/__testdata__/trace_0.json | 919 | "text": "## Summary of API Module Structure\n\nBased on the header comments and file con | CODE |
| MEDIUM | …kages/happy-app/sources/sync/__testdata__/trace_0.json | 1005 | "text": "## Summary of API Module Structure\n\nBased on the header comments and file con | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docs/experimental/roadmap.md | 28 | ## P0. Happy-agent orchestration and task fan-out | COMMENT |
| MEDIUM | docs/plans/happy-agent.md | 37 | ### Task 1: Package scaffolding and build setup | COMMENT |
| MEDIUM | docs/plans/session-protocol-v2.md | 825 | - [Linux Foundation AAIF](https://www.linuxfoundation.org/press/linux-foundation-announces-the-formation-of-the-agentic- | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docs/competition/opencode/trace-opencode.sh | 8 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …/happy-app/sources/app/(app)/dev/messages-demo-data.ts | 360 | content: `/src/App.tsx:15: // TODO: Add error boundary | CODE |