Orchestrate Claude, Codex and Grok in one app. Open-source (MIT), reuses the subscriptions you already pay for.
This report summarizes scanner evidence for slopus/happy, a Swift project with 24,433 GitHub stars. SynthScan examined 730,108 lines of code across 3575 source files, recording 1027 pattern matches distributed across 17 syntactic categories. The legacy adjusted pattern signal is 2.3 (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? 802 finding(s).
Are imports declared and package/API names verified? 98 finding(s).
Are wrappers, guards, and repeated structures necessary? 482 finding(s).
Which changes need focused human review? 1027 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 1027 distinct pattern matches across 17 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 | .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-wire/src/controlMessages.ts | 4 | function leadingTaskNotificationEnd(text: string): number | null { | CODE |
| LOW | packages/happy-wire/src/controlMessages.ts | 38 | export function stripLeadingTaskNotificationWrappers(text: string): 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 | …/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 | …-server/sources/app/monitoring/productionLogSummary.ts | 146 | export function startProductionLogSummary(): () => void { | CODE |
| LOW | packages/happy-server/sources/app/events/eventRouter.ts | 574 | export function buildSessionActivityEphemeral(sessionId: string, active: boolean, activeAt: number, thinking?: boolean): | CODE |
| LOW | packages/happy-server/sources/app/events/eventRouter.ts | 584 | export function buildMachineActivityEphemeral(machineId: string, active: boolean, activeAt: number): EphemeralPayload { | CODE |
| LOW | packages/happy-server/sources/app/events/eventRouter.ts | 604 | export function buildMachineStatusEphemeral(machineId: string, online: boolean): EphemeralPayload { | CODE |
| LOW | packages/happy-server/sources/app/events/eventRouter.ts | 618 | export function buildSessionEventEphemeral(sessionId: string, kind: 'done' | 'permission' | 'question', title: string, b | CODE |
| LOW | packages/happy-server/sources/app/events/eventRouter.ts | 659 | export function buildUpdateArtifactUpdate(artifactId: string, updateSeq: number, updateId: string, header?: { value: str | CODE |
| LOW | packages/happy-server/sources/app/events/eventRouter.ts | 673 | export function buildDeleteArtifactUpdate(artifactId: string, updateSeq: number, updateId: string): UpdatePayload { | CODE |
| LOW | packages/happy-server/sources/app/events/eventRouter.ts | 685 | 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 | 95 | export function trackVoicePermissionResponse(allowed: boolean) { | CODE |
| LOW | packages/happy-app/sources/track/index.ts | 102 | export function trackPaywallButtonClicked(flow?: string) { | CODE |
| LOW | packages/happy-app/sources/track/index.ts | 137 | export function trackReviewPromptResponse(likesApp: boolean) { | CODE |
| LOW | packages/happy-app/sources/track/index.ts | 145 | export function trackReviewRetryScheduled(daysUntilRetry: number) { | CODE |
| LOW | …kages/happy-app/sources/track/messageSentProperties.ts | 60 | export function messageSentSessionProperties( | CODE |
| LOW | packages/happy-app/sources/app/_layout.tsx | 96 | function HorizontalSafeAreaWrapper({ children }: { children: React.ReactNode }) { | CODE |
| LOW | packages/happy-app/sources/app/_layout.tsx | 112 | function stringifyNotificationPayload(value: unknown): string { | CODE |
| LOW | packages/happy-app/sources/app/_layout.tsx | 196 | function assertLoopbackHarnessServer(): void { | CODE |
| LOW | packages/happy-app/sources/app/_layout.tsx | 210 | function getDevEnvironmentCredentials(): AuthCredentials | null { | CODE |
| LOW | packages/happy-app/sources/app/_layout.tsx | 231 | 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 | packages/happy-app/sources/app/(app)/new/index.tsx | 184 | function trimTrailingPathSeparator(path: string): string { | CODE |
| LOW | packages/happy-app/sources/app/(app)/new/index.tsx | 191 | function normalizePathForComparison(path: string | null | undefined, homeDir?: string): string | null { | CODE |
| LOW | packages/happy-app/sources/app/(app)/new/index.tsx | 471 | function ComposerSettingsPickerContent({ | 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 | 67 | 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 |
| 293 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | …ndroid/research/f4-window/RelayWindowDeviceTest.kt.txt | 81 | check(graph.accountStore.registry.value.entries.isEmpty()) { "Fixture requires empty app data" } | CODE |
| CRITICAL | …lin/com/slopus/happy/fixture/ConversationDeviceTest.kt | 280 | ?.getInsets(androidx.core.view.WindowInsetsCompat.Type.ime()) | CODE |
| CRITICAL | …lin/com/slopus/happy/fixture/ConversationDeviceTest.kt | 293 | ?.isVisible(androidx.core.view.WindowInsetsCompat.Type.ime()) == true | CODE |
| CRITICAL | …/test/kotlin/com/slopus/happy/ui/OnboardingFlowTest.kt | 147 | assertTrue(graph.accountStore.registry.value.entries.isEmpty()) | CODE |
| CRITICAL | …rc/test/kotlin/com/slopus/happy/ui/RestoreRetryTest.kt | 73 | private fun androidx.compose.ui.test.junit4.ComposeContentTestRule.isShowing(key: String): Boolean = runCatching { | CODE |
| CRITICAL | …/test/kotlin/com/slopus/happy/ui/home/WorktreesTest.kt | 78 | val other = com.slopus.happy.model.HomeModelFixtures.session("s2", com.slopus.happy.model.HomeModelFixtures.meta | CODE |
| CRITICAL | …test/kotlin/com/slopus/happy/ui/home/HomeLayoutTest.kt | 231 | private fun androidx.compose.ui.unit.DpRect.height() = bottom - top | CODE |
| CRITICAL | …pus/happy/ui/tablet/HomeListAcrossTheBreakpointTest.kt | 83 | val key = graph.accountStore.registry.value.activeId.orEmpty() | CODE |
| CRITICAL | …test/kotlin/com/slopus/happy/ui/chat/ChatLayoutTest.kt | 384 | private fun androidx.compose.ui.test.junit4.ComposeContentTestRule.onAllNodesWithText(text: String) = | CODE |
| CRITICAL | …tlin/com/slopus/happy/ui/chat/ChatRecompositionTest.kt | 180 | private fun androidx.compose.ui.test.SemanticsNodeInteraction.isDisplayedSafe() = | CODE |
| CRITICAL | …/com/slopus/happy/ui/connection/AgentHomeLayoutTest.kt | 188 | surface = com.slopus.happy.ui.theme.HappyTheme.colors.surface.toArgb() | CODE |
| CRITICAL | …/kotlin/com/slopus/happy/ui/diff/DiffViewLayoutTest.kt | 216 | runBlocking { for (hunk in com.slopus.happy.diff.syntax.DiffSyntax.plan(f, body.rows)) service.highlight(hunk.in | CODE |
| CRITICAL | …slopus/happy/ui/components/ThumbHashPlaceholderTest.kt | 100 | private fun androidx.compose.ui.test.SemanticsNodeInteraction.isDisplayedSafely(): Boolean = | CODE |
| CRITICAL | …slopus/happy/ui/conversation/ConversationLayoutTest.kt | 295 | com.slopus.happy.ui.theme.HappyTheme(preference = if (dark) com.slopus.happy.ui.theme.ThemePreference.Dark e | CODE |
| CRITICAL | …tlin/com/slopus/happy/accounts/MultipleAccountsTest.kt | 83 | val entry = graph.accountStore.registry.value.entries.single() | CODE |
| CRITICAL | …tlin/com/slopus/happy/accounts/MultipleAccountsTest.kt | 97 | assertFalse(graph.accountStore.registry.value.entries.single().serverConfirmed) | CODE |
| CRITICAL | …tlin/com/slopus/happy/accounts/MultipleAccountsTest.kt | 139 | assertTrue(graph.accountStore.registry.value.entries.isEmpty()) | CODE |
| CRITICAL | …kotlin/com/slopus/happy/model/NewSessionOptionsTest.kt | 173 | val auto = com.slopus.happy.model.settings.ModeOption("auto", "Auto", sinceCliVersion = "1.2.1-beta.2") | CODE |
| CRITICAL | …c/test/kotlin/com/slopus/happy/sync/LiveUpdatesTest.kt | 280 | eventually { store.messages("s1").isNotEmpty() && h.account.presence.sessions.value.containsKey("s1") } | CODE |
| CRITICAL | …src/main/kotlin/com/slopus/happy/ui/home/HomeScreen.kt | 174 | com.slopus.happy.ui.voice.VoiceStatusBar() | CODE |
| CRITICAL | …ain/kotlin/com/slopus/happy/ui/tablet/TabletSidebar.kt | 238 | com.slopus.happy.ui.voice.VoiceStatusBar(sidebar = true) | CODE |
| CRITICAL | …src/main/kotlin/com/slopus/happy/ui/chat/ChatScreen.kt | 260 | if (!tablet) com.slopus.happy.ui.voice.VoiceStatusBar() | CODE |
| CRITICAL | …c/main/kotlin/com/slopus/happy/ui/chat/ChatComposer.kt | 331 | colorFilter = androidx.compose.ui.graphics.ColorFilter.tint(colors.text), | CODE |
| CRITICAL | …/slopus/happy/ui/connection/AgentConnectionSettings.kt | 237 | val next = graph.accountStore.registry.value.ordered.firstOrNull()?.id | CODE |
| CRITICAL | …main/kotlin/com/slopus/happy/ui/start/GrainGradient.kt | 140 | private fun androidx.compose.ui.graphics.drawscope.DrawScope.drawFallback(palette: GrainPalette) { | CODE |
| CRITICAL | …n/kotlin/com/slopus/happy/conversation/Conversation.kt | 753 | rows += ConversationRow.User("${send.id}:user", send.id, send.text, com.slopus.happy.chat.markdown.parseMark | CODE |
| CRITICAL | …pp/sources/components/diff/syntax/factory.generated.ts | 36 | */var ie=(function(e){var t=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,r=0,u={},i={manual:e.Prism&&e.Prism.manual,disabl | COMMENT |
| CRITICAL | packages/happy-app/sources/sync/typesRaw.ts | 453 | data.content.data.message.content = data.content.data.message.content.map(normalizeContent); | CODE |
| CRITICAL | packages/happy-app/sources/sync/typesRaw.ts | 459 | data.content.data.message.content = data.content.data.message.content.map(normalizeContent); | CODE |
| CRITICAL | …ages/happy-app/sources/sync/firstSendComposers.test.ts | 76 | expect(scope.sync.sendMessage.mock.calls.map(call => call[0])).toEqual(['created', 'created']); | CODE |
| CRITICAL | packages/happy-cli/src/agent/acp/runAcp.test.ts | 260 | const envelopeTypes = mocks.mockSession.sendSessionProtocolMessage.mock.calls.map(([envelope]) => envelope.ev.t); | CODE |
| CRITICAL | packages/happy-cli/src/agent/acp/runAcp.test.ts | 531 | const metadataHandlers = mocks.mockSession.updateMetadata.mock.calls.map((call) => call[0]); | CODE |
| 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-android/tools/fileicons/generate-file-icons.py | 81 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | …s/happy-android/tools/fileicons/generate-file-icons.py | 309 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | …s/happy-android/tools/fileicons/generate-file-icons.py | 427 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | packages/happy-android/tools/prism/corpus/sample.ts | 80 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/happy-android/tools/prism/corpus/sample.ts | 82 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/happy-android/tools/prism/corpus/sample.ts | 138 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/happy-android/tools/prism/corpus/sample.ts | 140 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …droid/app/src/test/resources/diff/prism-reference.json | 1 | [{"lang":"typescript","file":"sample.ts","text":"/**\n * Turns raw patches into render-ready `DiffDocument`s.\n *\n * Al | CODE |
| MEDIUM | …p/src/main/kotlin/com/slopus/happy/ui/diff/DiffRows.kt | 150 | // ─── Wrap layout ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …p/src/main/kotlin/com/slopus/happy/ui/diff/DiffRows.kt | 205 | // ─── Split layout ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …p/src/main/kotlin/com/slopus/happy/ui/diff/DiffRows.kt | 241 | // ─── Spans ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …c/main/kotlin/com/slopus/happy/ui/diff/DiffFileView.kt | 221 | // ─── Scroll layout ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/happy-app/sources/app/(app)/dev/diff-bench.tsx | 258 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/happy-app/sources/app/(app)/dev/diff-bench.tsx | 260 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ges/happy-app/sources/components/diff/DiffFileView.tsx | 193 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ges/happy-app/sources/components/diff/DiffFileView.tsx | 195 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ges/happy-app/sources/components/diff/DiffFileView.tsx | 277 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ges/happy-app/sources/components/diff/DiffFileView.tsx | 279 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ges/happy-app/sources/components/diff/DiffFileView.tsx | 471 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ges/happy-app/sources/components/diff/DiffFileView.tsx | 473 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …/happy-app/sources/components/diff/engine/buildDiff.ts | 80 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …/happy-app/sources/components/diff/engine/buildDiff.ts | 82 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …/happy-app/sources/components/diff/engine/buildDiff.ts | 138 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …/happy-app/sources/components/diff/engine/buildDiff.ts | 140 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …/happy-app/sources/components/diff/engine/buildDiff.ts | 351 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …/happy-app/sources/components/diff/engine/buildDiff.ts | 353 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/happy-ios/scripts/generate-file-icons.py | 85 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | packages/happy-ios/scripts/generate-file-icons.py | 313 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | packages/happy-ios/scripts/generate-file-icons.py | 431 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | packages/happy-ios/scripts/generate-icons.py | 132 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | packages/happy-ios/scripts/generate-icons.py | 365 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | packages/happy-ios/scripts/generate-icons.py | 409 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | packages/happy-ios/scripts/generate-icons.py | 836 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | …ages/happy-ios/Sources/HappyLayout/ItemRowLayout.swift | 13 | /// ───────────────── divider, inset 15 + (icon ? 60 : 16) ─────────────────── | COMMENT |
| MEDIUM | …s/happy-ios/Sources/HappyLayout/NewSessionLayout.swift | 192 | /// ╰──────────────────────────────────────────────╯ 98 at least | COMMENT |
| MEDIUM | …ckages/happy-ios/Sources/HappyLayout/UsageLayout.swift | 12 | /// ╭─ 16 from every edge, 8 padding ─────────────────────────────╮ | COMMENT |
| MEDIUM | …ckages/happy-ios/Sources/HappyLayout/UsageLayout.swift | 14 | /// ╰─────────────────────────────────────────────────────────────╯ | COMMENT |
| MEDIUM | …/happy-ios/Sources/HappyLayout/SessionListLayout.swift | 11 | /// ──────────── hairline from x 88 to the right edge ──────────── | COMMENT |
| MEDIUM | …ppy-ios/Sources/HappyLayout/LegacySettingsLayout.swift | 10 | /// ╭──────────── card, 16 from the edges, 16 from the top ────────────╮ | COMMENT |
| MEDIUM | …ppy-ios/Sources/HappyLayout/LegacySettingsLayout.swift | 18 | /// ╰──────────────────────────────────────────────────────────────────╯ | COMMENT |
| MEDIUM | …urces/HappyLayout/Tablet/TabletGroupedListLayout.swift | 37 | /// |32| ───────── |6| 🖥 |6| name |4| ───────── |32| | COMMENT |
| MEDIUM | …ios/Sources/HappyLayout/Chat/QuestionSheetLayout.swift | 11 | /// ─ hairline ───────────────────────────────────── | COMMENT |
| MEDIUM | …ios/Sources/HappyLayout/Chat/QuestionSheetLayout.swift | 19 | /// ─ hairline ───────────────────────────────────── | COMMENT |
| MEDIUM | …/Sources/HappyLayout/Chat/LegacyChatHeaderLayout.swift | 10 | /// ┌ 14 ─────── title (one line) ─────── 14 ┐ 44 | COMMENT |
| MEDIUM | …/Sources/HappyLayout/Chat/LegacyChatHeaderLayout.swift | 12 | /// └────────────────────────────────────────┘ | COMMENT |
| MEDIUM | …/Sources/HappyLayout/Chat/WorktreeTabStripLayout.swift | 11 | /// └ 40 tall, round ──────────────────────────┴──────────┴───────┘ | COMMENT |
| MEDIUM | …py-ios/Sources/HappyLayout/Chat/ChatScreenLayout.swift | 248 | /// └ 10 above and below the text ────────────────────────────────────────┘ | COMMENT |
| MEDIUM | …py-ios/Sources/HappyLayout/Chat/ChatScreenLayout.swift | 297 | /// └ 10 above and below ─────────────────────────────────────────────────────────────────┘ | COMMENT |
| MEDIUM⚡ | …appy-ios/Sources/HappyLayout/Chat/ToolRowLayouts.swift | 22 | /// ┌ header (surfaceHighest), 12 padding ──────────────────────┐ | COMMENT |
| MEDIUM⚡ | …appy-ios/Sources/HappyLayout/Chat/ToolRowLayouts.swift | 25 | /// ├ body: 12 in from the sides, 8 below the header ───────────┤ | COMMENT |
| MEDIUM⚡ | …appy-ios/Sources/HappyLayout/Chat/ToolRowLayouts.swift | 26 | /// ├ permission footer ────────────────────────────────────────┤ | COMMENT |
| MEDIUM⚡ | …appy-ios/Sources/HappyLayout/Chat/ToolRowLayouts.swift | 27 | /// └ radius 8, surfaceHigh ─────────────────────────────────────┘ | COMMENT |
| 38 more matches not shown… | ||||
| 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 | …s/happy-android/tools/fileicons/generate-file-icons.py | 541 | # | COMMENT |
| LOW | packages/happy-android/tools/prism/corpus/sample.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | packages/happy-android/tools/prism/corpus/sample.c | 1 | // Observe macOS system capability changes for the Happy CLI. | COMMENT |
| LOW | …appy-android/app/src/main/resources/fileicons/seti.txt | 1 | # Generated by tools/fileicons/generate-file-icons.py from @peoplesgrocers/seti-ui-file-icons | COMMENT |
| LOW | …appy-android/app/src/main/resources/fileicons/seti.txt | 21 | # | COMMENT |
| LOW | …android/app/src/main/resources/diff/prism-grammars.txt | 1 | # Generated by tools/prism/generate-grammars.cjs from prismjs 1.30.0. Do not edit. | COMMENT |
| LOW | …p/src/main/kotlin/com/slopus/happy/chat/ChatReducer.kt | 1 | package com.slopus.happy.chat | 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 | packages/happy-server/sources/app/api/socketConfig.ts | 21 | connectTimeout: 20000, | COMMENT |
| LOW | …s/happy-server/sources/app/api/routes/sessionRoutes.ts | 41 | active: true, | 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-server/sources/utils/log.ts | 41 | // IMPORTANT: do NOT use pino's `transport` option here. | 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 | // const handleSuccess = async (tokens: ClaudeAuthTokens) => { | COMMENT |
| LOW | packages/happy-app/sources/-session/SessionView.tsx | 661 | }; | COMMENT |
| LOW | …ckages/happy-app/sources/components/MultiTextInput.tsx | 301 | COMMENT | |
| LOW | packages/happy-app/sources/components/AgentInput.tsx | 1141 | }, []); | COMMENT |
| LOW | packages/happy-app/sources/components/MessageView.tsx | 181 | const bubblePalette = resolveUserMessageBubbleColor(userMessageBubbleColor, theme.dark); | COMMENT |
| LOW | packages/happy-app/sources/components/ChatList.tsx | 461 | expanded.add(group.id); | COMMENT |
| LOW | packages/happy-app/sources/components/ChatList.tsx | 641 | // list opens on the newest message with no scroll at all — which is the | COMMENT |
| LOW | packages/happy-app/sources/components/ChatList.tsx | 661 | // History is inserted at the far end of an inverted list — beyond the | COMMENT |
| LOW | …/happy-app/sources/components/HorizontalScrollView.tsx | 1 | import * as React from 'react'; | COMMENT |
| LOW | …/happy-app/sources/components/HorizontalScrollView.tsx | 21 | // | COMMENT |
| LOW | …appy-app/sources/components/NativeSettingsMenu.ios.tsx | 141 | style={styles.host} | COMMENT |
| LOW | …kages/happy-app/sources/components/modelModeOptions.ts | 101 | description: option.description ?? null, | COMMENT |
| LOW | …kages/happy-app/sources/components/modelModeOptions.ts | 161 | // Keys are full model IDs rather than the short aliases, because the aliases | COMMENT |
| LOW | …kages/happy-app/sources/components/modelModeOptions.ts | 241 | // runOpenClaw never reads permissionMode, so neither of these changes what | COMMENT |
| LOW | …kages/happy-app/sources/components/modelModeOptions.ts | 541 | } | COMMENT |
| LOW | …es/happy-app/sources/hooks/useStartSessionFromDraft.ts | 521 | // Stop returns the composer on the next tick, prompt still in it, no | COMMENT |
| LOW | packages/happy-app/sources/sync/storage.ts | 741 | // Process new AgentState through reducer | COMMENT |
| LOW | packages/happy-app/sources/sync/sync.ts | 2281 | COMMENT | |
| LOW | packages/happy-app/sources/sync/sync.ts | 2321 | } | 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-ios/Package.swift | 1 | // swift-tools-version: 6.2 | COMMENT |
| LOW | …kages/happy-ios/Tests/HappyDirectUITests/UITests.swift | 21 | return replaced | COMMENT |
| LOW | …-ios/Tests/HappyDirectUITests/ScrollPerfGymTests.swift | 21 | }() | COMMENT |
| LOW | …ios/Tests/HappyUIKitTests/AgentIdentityViewTests.swift | 41 | #endif | COMMENT |
| LOW | …ios/Tests/HappyUIKitTests/ComposerEditorGeometry.swift | 1 | #if canImport(UIKit) | COMMENT |
| LOW | …HappyUIKitHostedTests/HostedHomeScrollTraceTests.swift | 41 | /// - at rest, around one update: the row's window position before and | COMMENT |
| LOW | …s/HappyUIKitHostedTests/HostedSidebarBounceTests.swift | 81 | #endif | COMMENT |
| LOW | …ts/HappyUIKitHostedTests/HostedShimmerLabelTests.swift | 41 | #endif | COMMENT |
| LOW | …appy-ios/Tests/HappyChatUITests/ChatUltraQATests.swift | 1 | import XCTest | COMMENT |
| LOW | …appy-ios/Tests/HappyChatUITests/ChatUltraQATests.swift | 1341 | COMMENT | |
| LOW | …ppy-ios/Tests/HappyChatUITests/ChatScrollUITests.swift | 121 | let content = number(touch["offsetTravelWithKeyboard"]) | COMMENT |
| LOW | packages/happy-ios/Harness/WhatsNewHarness.swift | 1 | #if canImport(UIKit) | COMMENT |
| LOW | packages/happy-ios/Harness/StoriesHarness.swift | 1 | #if canImport(UIKit) && (DEBUG || HAPPY_FIXTURES) | COMMENT |
| 248 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | .agents/skills/sessions/scripts/extract-errors.py | 111 | except (json.JSONDecodeError, KeyError): | CODE |
| HIGH | .agents/skills/sessions/scripts/extract-errors.py | 80 | except (IndexError, ValueError): | CODE |
| HIGH | .agents/skills/sessions/scripts/extract-skeleton.py | 342 | except (json.JSONDecodeError, KeyError): | CODE |
| HIGH | .agents/skills/sessions/scripts/extract-skeleton.py | 250 | except (IndexError, ValueError): | CODE |
| HIGH | .agents/skills/sessions/scripts/extract-metadata.py | 94 | except (OSError, IOError): | CODE |
| HIGH | .agents/skills/sessions/scripts/extract-metadata.py | 171 | except (OSError, IOError): | CODE |
| HIGH | .agents/skills/sessions/scripts/extract-metadata.py | 33 | except (json.JSONDecodeError, KeyError): | CODE |
| HIGH | .agents/skills/sessions/scripts/extract-metadata.py | 55 | except (json.JSONDecodeError, KeyError): | CODE |
| HIGH | .agents/skills/sessions/scripts/extract-metadata.py | 68 | except (json.JSONDecodeError, KeyError): | CODE |
| HIGH | .agents/skills/sessions/scripts/extract-metadata.py | 92 | except (json.JSONDecodeError, KeyError): | CODE |
| HIGH | packages/happy-android/tools/prism/corpus/sample.py | 111 | except (json.JSONDecodeError, KeyError): | CODE |
| HIGH | packages/happy-android/tools/prism/corpus/sample.py | 80 | except (IndexError, ValueError): | CODE |
| HIGH | packages/happy-ios/scripts/perf-gym/gym.py | 410 | except Exception: | CODE |
| HIGH | packages/happy-ios/scripts/perf-gym/gym.py | 315 | except RuntimeError: | CODE |
| HIGH | packages/happy-ios/scripts/perf-gym/fakellm.py | 122 | except (BrokenPipeError, ConnectionResetError): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .agents/skills/release/SKILL.md | 15 | ## Step 0: Where you release from (never skipped) | COMMENT |
| LOW | .agents/skills/release/SKILL.md | 81 | ## Step 1: Pick a target | COMMENT |
| LOW | .agents/skills/release/SKILL.md | 116 | ### Step 2: Gather state | COMMENT |
| LOW | .agents/skills/release/SKILL.md | 134 | ### Step 3: Pick channel and version | COMMENT |
| LOW | .agents/skills/release/SKILL.md | 144 | ### Step 4: Version bump | COMMENT |
| LOW | .agents/skills/release/SKILL.md | 215 | ### Step 5: Build | COMMENT |
| LOW | .agents/skills/release/SKILL.md | 259 | ### Step 6: Test (unit only) | COMMENT |
| LOW | .agents/skills/release/SKILL.md | 271 | ### Step 7: Publish | COMMENT |
| LOW | .agents/skills/release/SKILL.md | 305 | ### Step 8: Verify | COMMENT |
| LOW | .agents/skills/release/SKILL.md | 330 | ### Step 9: Read back the release and installed-package verification | 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 | 1230 | // Step 1: Create pending permission | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 1249 | // Step 2: Approve permission | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 1269 | // Step 3: Tool call arrives | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 1295 | // Step 4: Tool result arrives | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2141 | // Step 1: Load tool message first (without AgentState) - simulates messages loaded before sessions | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2170 | // Step 2: AgentState arrives with both pending and approved (sessions loaded) | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2206 | // Step 1: Load tool message first | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2227 | // Step 2: AgentState arrives with denied permission | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2265 | // Step 1: Load tool message first | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2286 | // Step 2: AgentState arrives with canceled permission | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2405 | // Step 1: Load tool message that's already completed | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2450 | // Step 2: AgentState arrives with approved permission | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2483 | // Step 1: Load completed tool | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2523 | // Step 2: AgentState with denied permission (too late!) | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2557 | // Step 1: Load tool that errored | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2598 | // Step 2: AgentState with approved permission (too late to help) | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2623 | // Step 1: Load tool that errored | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2659 | // Step 2: AgentState with denied permission | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2687 | // Step 1: Tool call | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2707 | // Step 2: Tool result arrives | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2731 | // Step 3: AgentState arrives later with permission info | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2814 | // Step 1: Process tool messages WITHOUT AgentState (simulating messages loading before session) | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2847 | // Step 2: Later, AgentState arrives with permission for this tool | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2887 | // Step 1: Messages load WITHOUT AgentState (session hasn't arrived yet) | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2951 | // Step 2: Session arrives with AgentState containing permission info | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2975 | // 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 | .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 | …uperpowers/plans/2026-06-10-codex-image-attachments.md | 1248 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | …slopus/happy/ui/components/ThumbHashPlaceholderTest.kt | 62 | assertBox("placeholder", rule.node(RemoteImageTags.PLACEHOLDER).getUnclippedBoundsInRoot(), 0.dp, 0.dp, 48.dp, 4 | 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 | …happy-ios/Tests/HappyUIKitTests/ChatOpeningTests.swift | 22 | XCTAssertTrue(ChatOpening.shows(missing: ["rows", "placeholder"], elapsed: 0.2)) | CODE |
| LOW | …/Tests/HappyCoreTests/ComposerKeystrokeCostTests.swift | 34 | let opening = String(repeating: "lorem ipsum ", count: length / 12 + 1).prefix(length) | CODE |
| LOW | …ests/HappyCoreTests/ComposerActiveWordUnitsTests.swift | 79 | let content = String(repeating: "Lorem ipsum dolor sit amet. ", count: 4_000) + "see @Sources/Happy" | CODE |
| LOW | …ests/HappyCoreTests/ComposerActiveWordUnitsTests.swift | 79 | let content = String(repeating: "Lorem ipsum dolor sit amet. ", count: 4_000) + "see @Sources/Happy" | CODE |
| LOW | …appy-ios/Tests/HappyChatUITests/ChatUltraQATests.swift | 1670 | shown = s["placeholder"] as? String ?? "none" | CODE |
| LOW | …appy-ios/Tests/HappyChatUITests/ChatUltraQATests.swift | 1717 | guard (state()["listInWindow"] as? Bool) == true || (state()["placeholder"] as? String ?? "none") != "none" else | CODE |
| LOW | packages/happy-ios/Harness/ChatUltraQAProbe.swift | 868 | away["placeholder"] = placeholderKind(in: window) | CODE |
| LOW | packages/happy-ios/Harness/ChatUltraQAProbe.swift | 888 | value["placeholder"] = placeholderKind(in: window) | CODE |
| LOW | …os/Sources/HappyUI/Chat/LegacyChatViewController.swift | 572 | if !placeholder.isHidden, !placeholder.measure.isSettled { missing.append("placeholder") } | CODE |
| LOW | …kages/happy-ios/Sources/HappyUI/Chat/ChatOpening.swift | 12 | static let mayComeLate: Set<String> = ["rows", "placeholder"] | 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 | 190 | new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 202 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 221 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 236 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 257 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 280 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 305 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 351 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 399 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 425 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 468 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 579 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 636 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 673 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 711 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 752 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 792 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 825 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 869 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 926 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 946 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 997 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 1048 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 1088 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 1107 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 1129 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 1157 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 1187 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 1207 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 1248 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 1265 | new ApiSessionClient('fake-token', session); | CODE |
| LOW | packages/happy-cli/src/api/apiSession.test.ts | 1283 | const client = new ApiSessionClient('fake-token', session); | CODE |
| LOW | …es/happy-cli/src/api/apiMachine.resumeFallback.test.ts | 73 | const client = new ApiMachineClient('fake-token', makeMachine()); | CODE |
| LOW | packages/happy-cli/src/api/apiMachine.test.ts | 133 | 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/apiMachine.test.ts | 173 | const client = new ApiMachineClient('fake-token', makeMachine()); | CODE |
| LOW | packages/happy-cli/src/api/apiMachine.test.ts | 201 | const client = new ApiMachineClient('fake-token', makeMachine()); | CODE |
| LOW | packages/happy-cli/src/api/apiMachine.test.ts | 226 | const client = new ApiMachineClient('fake-token', makeMachine()); | CODE |
| LOW | packages/happy-cli/src/api/apiMachine.test.ts | 244 | const client = new ApiMachineClient('fake-token', machine); | CODE |
| 1 more matches not shown… | ||||
| 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 | 1230 | // Step 1: Create pending permission | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 1249 | // Step 2: Approve permission | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 1269 | // Step 3: Tool call arrives | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 1295 | // Step 4: Tool result arrives | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2141 | // Step 1: Load tool message first (without AgentState) - simulates messages loaded before sessions | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2170 | // Step 2: AgentState arrives with both pending and approved (sessions loaded) | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2206 | // Step 1: Load tool message first | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2227 | // Step 2: AgentState arrives with denied permission | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2265 | // Step 1: Load tool message first | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2286 | // Step 2: AgentState arrives with canceled permission | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2405 | // Step 1: Load tool message that's already completed | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2450 | // Step 2: AgentState arrives with approved permission | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2483 | // Step 1: Load completed tool | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2523 | // Step 2: AgentState with denied permission (too late!) | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2557 | // Step 1: Load tool that errored | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2598 | // Step 2: AgentState with approved permission (too late to help) | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2623 | // Step 1: Load tool that errored | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2659 | // Step 2: AgentState with denied permission | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2687 | // Step 1: Tool call | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2707 | // Step 2: Tool result arrives | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2731 | // Step 3: AgentState arrives later with permission info | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2814 | // Step 1: Process tool messages WITHOUT AgentState (simulating messages loading before session) | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2847 | // Step 2: Later, AgentState arrives with permission for this tool | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2887 | // Step 1: Messages load WITHOUT AgentState (session hasn't arrived yet) | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2951 | // Step 2: Session arrives with AgentState containing permission info | COMMENT |
| LOW | packages/happy-app/sources/sync/reducer/reducer.spec.ts | 2975 | // 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 |
|---|---|---|---|---|
| HIGH | …/kotlin/com/slopus/happy/ui/tablet/TabletLayoutTest.kt | 0 | {"path":"/home/me/app","host":"devbox","homedir":"/home/me","os":"linux","summary":{"text":"fix the login","updatedat":1 | STRING |
| HIGH | …test/kotlin/com/slopus/happy/ui/chat/ChatLayoutTest.kt | 0 | {"path":"/home/me/app","host":"devbox","homedir":"/home/me","os":"linux","summary":{"text":"fix the login","updatedat":1 | STRING |
| HIGH | …tlin/com/slopus/happy/ui/layout/FontScaleLayoutTest.kt | 0 | {"path":"/home/me/app","host":"devbox","homedir":"/home/me","os":"linux","summary":{"text":"fix the login","updatedat":1 | STRING |
| HIGH | …/kotlin/com/slopus/happy/ui/chat/ChatWorkGroupsTest.kt | 0 | {"path":"/repo","host":"devbox","summary":{"text":"chat","updatedat":1}} | STRING |
| HIGH | …/kotlin/com/slopus/happy/ui/chat/ChatOlderInsetTest.kt | 0 | {"path":"/repo","host":"devbox","summary":{"text":"chat","updatedat":1}} | STRING |
| HIGH | …tlin/com/slopus/happy/ui/chat/ChatRecompositionTest.kt | 0 | {"path":"/repo","host":"devbox","summary":{"text":"chat","updatedat":1}} | STRING |
| HIGH | …/kotlin/com/slopus/happy/ui/chat/ChatDockLayoutTest.kt | 0 | {"path":"/repo","host":"devbox","summary":{"text":"chat","updatedat":1}} | STRING |
| HIGH | …test/kotlin/com/slopus/happy/ui/chat/ToolLayoutTest.kt | 0 | {"file_path":"/repo/a.kt","old_string":"a","new_string":"b"} | STRING |
| HIGH | …tlin/com/slopus/happy/ui/chat/ChatRecompositionTest.kt | 0 | {"file_path":"/repo/a.kt","old_string":"a","new_string":"b"} | STRING |
| HIGH | …st/kotlin/com/slopus/happy/ui/files/FilesLayoutTest.kt | 0 | {"file_path":"/repo/a.kt","old_string":"a","new_string":"b"} | STRING |
| 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 | …droid/app/src/test/resources/diff/prism-reference.json | 1 | [{"lang":"typescript","file":"sample.ts","text":"/**\n * Turns raw patches into render-ready `DiffDocument`s.\n *\n * Al | CODE |
| MEDIUM | packages/happy-app/sources/components/HomeDock.tsx | 495 | // dot and one line saying what is happening now. Absolutely placed in the | 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 |
| MEDIUM⚡ | …urces/HappyCore/Localization/TranslationCatalogs.swift | 7 | ("en", ####"{"agentInput.agent.claude":"Claude","agentInput.agent.codex":"Codex","agentInput.agent.gemini":"Gemi | CODE |
| MEDIUM⚡ | …urces/HappyCore/Localization/TranslationCatalogs.swift | 8 | ("ru", ####"{"agentInput.agent.claude":"Claude","agentInput.agent.codex":"Codex","agentInput.agent.gemini":"Gemi | CODE |
| MEDIUM⚡ | …urces/HappyCore/Localization/TranslationCatalogs.swift | 10 | ("es", ####"{"agentInput.agent.claude":"Claude","agentInput.agent.codex":"Codex","agentInput.agent.gemini":"Gemi | CODE |
| MEDIUM⚡ | …urces/HappyCore/Localization/TranslationCatalogs.swift | 11 | ("it", ####"{"agentInput.agent.claude":"Claude","agentInput.agent.codex":"Codex","agentInput.agent.gemini":"Gemi | CODE |
| MEDIUM⚡ | …urces/HappyCore/Localization/TranslationCatalogs.swift | 12 | ("pt", ####"{"agentInput.agent.claude":"Claude","agentInput.agent.codex":"Codex","agentInput.agent.gemini":"Gemi | CODE |
| MEDIUM⚡ | …urces/HappyCore/Localization/TranslationCatalogs.swift | 14 | ("zh-Hans", ####"{"agentInput.agent.claude":"Claude","agentInput.agent.codex":"Codex","agentInput.agent.gemini": | CODE |
| MEDIUM⚡ | …urces/HappyCore/Localization/TranslationCatalogs.swift | 15 | ("zh-Hant", ####"{"agentInput.agent.claude":"Claude","agentInput.agent.codex":"Codex","agentInput.agent.gemini": | CODE |
| 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 | |
| LOW | …s/happy-android/tools/fileicons/generate-file-icons.py | 101 | CODE | |
| LOW | …s/happy-android/tools/fileicons/generate-file-icons.py | 157 | CODE | |
| LOW | packages/happy-android/tools/prism/corpus/sample.py | 51 | CODE | |
| LOW | packages/happy-android/tools/prism/corpus/sample.py | 64 | CODE | |
| LOW | packages/happy-ios/scripts/generate-file-icons.py | 105 | CODE | |
| LOW | packages/happy-ios/scripts/generate-file-icons.py | 161 | CODE | |
| LOW | packages/happy-ios/scripts/generate-icons.py | 430 | CODE | |
| LOW | packages/happy-ios/scripts/generate-icons.py | 456 | CODE | |
| LOW | packages/happy-ios/scripts/generate-icons.py | 478 | CODE | |
| LOW | packages/happy-ios/scripts/generate-icons.py | 507 | CODE | |
| LOW | packages/happy-ios/scripts/generate-icons.py | 598 | CODE | |
| LOW | packages/happy-ios/scripts/generate-icons.py | 682 | CODE | |
| LOW | packages/happy-ios/scripts/generate-icons.py | 206 | CODE | |
| LOW | …kages/happy-ios/scripts/generate-test-sticker-packs.py | 45 | CODE | |
| LOW | packages/happy-ios/scripts/perf-gym/gym.py | 86 | CODE | |
| LOW | packages/happy-ios/scripts/perf-gym/gym.py | 144 | CODE | |
| LOW | packages/happy-ios/scripts/perf-gym/gym.py | 282 | CODE | |
| LOW | packages/happy-ios/scripts/perf-gym/gym.py | 471 | CODE | |
| LOW | packages/happy-ios/scripts/perf-gym/gym.py | 659 | CODE | |
| LOW | packages/happy-ios/scripts/perf-gym/gym.py | 759 | CODE | |
| LOW | packages/happy-ios/scripts/perf-gym/gym.py | 157 | 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 | packages/happy-ios/scripts/perf-gym/gym.py | 335 | except Exception: | CODE |
| LOW | packages/happy-ios/scripts/perf-gym/gym.py | 410 | except Exception: | CODE |
| MEDIUM | packages/happy-ios/scripts/perf-gym/gym.py | 332 | def healthy(): | CODE |
| MEDIUM | packages/happy-ios/scripts/perf-gym/gym.py | 406 | def start_fake(): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …s/happy-android/tools/fileicons/generate-file-icons.py | 29 | CODE | |
| LOW | packages/happy-ios/scripts/generate-file-icons.py | 33 | CODE | |
| LOW | packages/happy-ios/scripts/generate-icons.py | 26 | CODE | |
| LOW | packages/happy-ios/scripts/generate-icons.py | 31 | CODE | |
| LOW | packages/happy-ios/scripts/generate-bot-faces.py | 30 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …s/happy-android/tools/fileicons/generate-file-icons.py | 258 | CODE | |
| LOW | packages/happy-ios/scripts/generate-file-icons.py | 262 | 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 |