Build AI teams, not just agents. Hard rails, soft power, shared mission.
This report presents the forensic synthetic code analysis of zts212653/clowder-ai, a TypeScript project with 2,332 GitHub stars. SynthScan v2.0 examined 1,204,176 lines of code across 5086 source files, recording 3473 pattern matches distributed across 17 syntactic categories. The overall adjusted score of 5.9 places this repository in the Low AI signal 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 3473 distinct pattern matches across 17 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 |
|---|---|---|---|---|
| MEDIUM | cat-cafe-skills/manifest.yaml | 10 | # ─── 开发流程链 ───────────────────────────────────────── | COMMENT |
| MEDIUM | cat-cafe-skills/manifest.yaml | 1279 | # ─── 降级为 refs/(不再是独立 skill) ───────────────── | COMMENT |
| MEDIUM | cat-cafe-skills/manifest.yaml | 1322 | # ─── 三条铁律(仅此三条) ────────────────────────────── | COMMENT |
| MEDIUM | cat-cafe-skills/manifest.yaml | 1331 | # ─── lint 规则 ────────────────────────────────────────── | COMMENT |
| MEDIUM | desktop/scripts/build-mac.sh | 30 | # ─── Args ─────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | desktop/scripts/build-mac.sh | 47 | # ─── Paths + helpers ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | desktop/scripts/build-mac.sh | 64 | # ─── Step 1: Build web app ────────────────────────────────────────────── | COMMENT |
| MEDIUM | desktop/scripts/build-mac.sh | 78 | # ─── Step 2: pnpm deploy runtime packages ────────────────────────────── | COMMENT |
| MEDIUM | desktop/scripts/build-mac.sh | 108 | # ─── Step 3: Bundle Node.js portable (both archs) ────────────────────── | COMMENT |
| MEDIUM | desktop/scripts/build-mac.sh | 151 | # ─── Step 4: Build Redis portable (both archs) ───────────────────────── | COMMENT |
| MEDIUM | desktop/scripts/build-mac.sh | 199 | # ─── Step 5: (macOS skips CLI tarball bundling) ────────────────────────── | COMMENT |
| MEDIUM | desktop/scripts/build-mac.sh | 207 | # ─── Step 6a: Generate icon.icns from icon.png (one-time) ────────────── | COMMENT |
| MEDIUM | desktop/scripts/build-mac.sh | 227 | # ─── Step 6b: electron-builder + hdiutil — produces DMG per arch ────── | COMMENT |
| MEDIUM | docs/architecture/2026-05-05-architecture-views.md | 774 | ┌─ D. 构建冷启动包(Session #2+ 专用)─▼────────────────────────┐ | CODE |
| MEDIUM | scripts/setup.sh | 3 | # ============================================================ | COMMENT |
| MEDIUM | scripts/setup.sh | 8 | # ============================================================ | COMMENT |
| MEDIUM | scripts/setup.sh | 58 | # ── Step 1: Check prerequisites ───────────────────────────── | COMMENT |
| MEDIUM | scripts/setup.sh | 120 | # ── Step 2: Install packages ──────────────────────────────── | COMMENT |
| MEDIUM | scripts/setup.sh | 132 | # ── Step 3: Choose optional features ──────────────────────── | COMMENT |
| MEDIUM | scripts/setup.sh | 329 | # ── Step 4: Generate .env ─────────────────────────────────── | COMMENT |
| MEDIUM⚡ | scripts/setup.sh | 346 | # ── Core 核心 ──────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | scripts/setup.sh | 353 | # ── API Gateway Proxy 反向代理 ─────────────────────────────── | COMMENT |
| MEDIUM⚡ | scripts/setup.sh | 361 | # ── Voice Input (ASR) 语音输入 ─────────────────────────────── | COMMENT |
| MEDIUM⚡ | scripts/setup.sh | 370 | # ── Voice Input (ASR) 语音输入 ─────────────────────────────── | COMMENT |
| MEDIUM⚡ | scripts/setup.sh | 378 | # ── Voice Output (TTS) 语音输出 ────────────────────────────── | COMMENT |
| MEDIUM⚡ | scripts/setup.sh | 386 | # ── Voice Output (TTS) 语音输出 ────────────────────────────── | COMMENT |
| MEDIUM⚡ | scripts/setup.sh | 394 | # ── Speech Correction 语音纠正 ─────────────────────────────── | COMMENT |
| MEDIUM⚡ | scripts/setup.sh | 401 | # ── Speech Correction 语音纠正 ─────────────────────────────── | COMMENT |
| MEDIUM⚡ | scripts/setup.sh | 409 | # ── Semantic Retrieval 语义检索(Embedding)──────────────── | COMMENT |
| MEDIUM⚡ | scripts/setup.sh | 417 | # ── Semantic Retrieval 语义检索(Embedding)──────────────── | COMMENT |
| MEDIUM⚡ | scripts/setup.sh | 426 | # ── Step 4b: Install sidecar venvs (--install-missing) ────── | COMMENT |
| MEDIUM | scripts/setup.sh | 492 | # ── Step 5: Summary ───────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/logs-health.sh | 6 | # ─── Config ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/logs-health.sh | 32 | # ─── Helpers ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/logs-health.sh | 95 | # ─── Error rate ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/logs-health.sh | 128 | # ─── Main ──────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/logs-health.sh | 146 | # ─── Config summary ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/install.sh | 134 | # ── Interactive arrow-key selectors (single-select & multi-select) ──────── | COMMENT |
| MEDIUM | scripts/install.sh | 651 | # ── [1/8] Environment detection ──────────────────────────── | COMMENT |
| MEDIUM | scripts/install.sh | 768 | # ── [2/8] Install system dependencies ────────────────────── | COMMENT |
| MEDIUM | scripts/install.sh | 833 | # ── [3/8] Install Node.js 24+ ──────────────────────────── | COMMENT |
| MEDIUM | scripts/install.sh | 914 | # ── [4/8] Install pnpm + Redis ───────────────────────────── | COMMENT |
| MEDIUM | scripts/install.sh | 973 | # ── [5/8] Build checked-out project ──────────────────────── | COMMENT |
| MEDIUM | scripts/install.sh | 986 | # ── [6/8] Install AI agent CLI tools ───────────────────── | COMMENT |
| MEDIUM | scripts/install.sh | 1143 | # ── [7/8] Generate .env with all collected config ───────── | COMMENT |
| MEDIUM | scripts/install.sh | 1172 | # ── [8/8] Done ────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/services/recommendation-matrix.yaml | 1 | # ============================================================ | COMMENT |
| MEDIUM | scripts/services/recommendation-matrix.yaml | 3 | # ============================================================ | COMMENT |
| MEDIUM⚡ | scripts/services/recommendation-matrix.yaml | 44 | # ============================================================ | COMMENT |
| MEDIUM⚡ | scripts/services/recommendation-matrix.yaml | 47 | # ------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | scripts/services/recommendation-matrix.yaml | 49 | # ------------------------------------------------------------ | COMMENT |
| MEDIUM | scripts/services/recommendation-matrix.yaml | 245 | # ------------------------------------------------------------ | COMMENT |
| MEDIUM | scripts/services/recommendation-matrix.yaml | 247 | # ------------------------------------------------------------ | COMMENT |
| MEDIUM | scripts/services/recommendation-matrix.yaml | 408 | # ------------------------------------------------------------ | COMMENT |
| MEDIUM | scripts/services/recommendation-matrix.yaml | 410 | # ------------------------------------------------------------ | COMMENT |
| MEDIUM | scripts/services/recommendation-matrix.yaml | 580 | # ------------------------------------------------------------ | COMMENT |
| MEDIUM | scripts/services/recommendation-matrix.yaml | 582 | # ------------------------------------------------------------ | COMMENT |
| MEDIUM | scripts/services/llm-postprocess-api.py | 184 | # ─── Model loading ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/services/tts-api.py | 73 | # ─── TTS Adapter ABC ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/services/tts-api.py | 111 | # ─── MLX-Audio Adapter ──────────────────────────────────────────────── | COMMENT |
| 1326 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | desktop/project-root.js | 12 | function resolveProjectRootFromDir(startDir) { | CODE |
| LOW | desktop/main.js | 31 | function ensureValidMacInstallLocation() { | CODE |
| LOW | desktop/service-manager.test.js | 64 | fs.symlinkSync = function symlinkSyncWithProbeCount(src, dst, type) { | CODE |
| LOW | desktop/service-manager.test.js | 68 | fs.readFileSync = function readFileSyncWithOnePluginProbeFailure(filePath, ...args) { | CODE |
| LOW | scripts/intake-from-opensource.sh | 608 | function isDeclaredInDecisionTable(file) { | CODE |
| LOW | scripts/services/embed-api.py | 91 | def _allow_sentence_transformers_fallback() -> bool: | CODE |
| LOW | scripts/services/embed-api.py | 357 | def _try_sentence_transformers() -> bool: | CODE |
| LOW | scripts/services/install-template.sh | 304 | def resolve_faster_whisper_repo_id(model_id): | CODE |
| LOW | packages/web/next.config.js | 29 | function buildContentSecurityPolicy() { | CODE |
| LOW | packages/web/src/stores/callbackAuthStore.ts | 231 | export function useCallbackAuthSnapshotProvider(options?: { enabled?: boolean; pollIntervalMs?: number }): void { | CODE |
| LOW | packages/web/src/stores/callbackAuthStore.ts | 245 | export function CallbackAuthSnapshotMount(props: { enabled?: boolean; pollIntervalMs?: number } = {}): null { | CODE |
| LOW | packages/web/src/stores/callbackAuthStore.ts | 266 | export function useCallbackAuthMarkViewed(): () => Promise<void> { | CODE |
| LOW | packages/web/src/stores/callbackAuthStore.ts | 281 | export function useCallbackAuthRawSnapshot(): CallbackAuthSnapshot | null { | CODE |
| LOW | packages/web/src/stores/bubble-projection-diagnostic.ts | 49 | export function buildProjectionDiagnostic({ records }: DiagnosticInput): ProjectionDiagnosticRow[] { | CODE |
| LOW | packages/web/src/stores/bubble-invariants.ts | 35 | function isUiCompatStreamingAssistantContainer(msg: ChatMessage, invocationId: string | undefined): boolean { | CODE |
| LOW | packages/web/src/stores/bubble-invariants.ts | 63 | export function deriveBubbleKindFromMessage(msg: ChatMessage): BubbleKind { | CODE |
| LOW | packages/web/src/stores/bubble-invariants.ts | 107 | export function deriveBubbleStableIdentity(msg: ChatMessage, threadId: string): BubbleStableIdentity | undefined { | CODE |
| LOW | packages/web/src/stores/bubble-invariants.ts | 141 | export function findBubbleStoreInvariantViolations( | CODE |
| LOW | packages/web/src/stores/bubble-invariants.ts | 178 | export function validateIncomingBubbleEvent( | CODE |
| LOW | packages/web/src/stores/bubble-invariants.ts | 209 | export function assertNoBubbleInvariantViolations(messages: ChatMessage[], context: BubbleInvariantContext): void { | CODE |
| LOW | packages/web/src/stores/bubble-projection.ts | 121 | function buildStreamSegmentsByBaseKey( | CODE |
| LOW | packages/web/src/stores/chatStore.ts | 158 | function mirrorActiveToThreadStates( | CODE |
| LOW | packages/web/src/stores/chatStore.ts | 246 | function loadUiThinkingExpandedByDefault(): boolean { | CODE |
| LOW | packages/web/src/stores/chatStore.ts | 255 | function persistUiThinkingExpandedByDefault(next: boolean) { | CODE |
| LOW | packages/web/src/stores/chatStore.ts | 369 | function forwardStoreInvariantViolationsStrict(messages: ChatMessage[], threadId: string | null): void { | CODE |
| LOW | packages/web/src/stores/chatStore.ts | 460 | function fireOwnerMentionNotification(msg: ChatMessage) { | CODE |
| LOW | packages/web/src/stores/bubble-reducer.ts | 67 | export function buildStreamExtraFromEvent( | CODE |
| LOW | packages/web/src/stores/bubble-reducer.ts | 240 | function findUpgradableLocalPlaceholders( | CODE |
| LOW | packages/web/src/stores/bubble-reducer.ts | 261 | function findUpgradableLocalPlaceholder( | CODE |
| LOW | packages/web/src/stores/bubble-reducer.ts | 410 | function dropLocalOnlyStreamSiblings(messages: ChatMessage[], event: BubbleEvent): ChatMessage[] { | CODE |
| LOW | packages/web/src/stores/bubble-reducer.ts | 579 | function findUpgradableCallbackPlaceholder( | CODE |
| LOW | packages/web/src/utils/scrollRecomputeSignal.ts | 9 | export function computeScrollRecomputeSignal( | CODE |
| LOW | packages/web/src/utils/push-notification-policy.ts | 16 | export function isPushTestNotificationTag(tag: string | undefined): boolean { | CODE |
| LOW | packages/web/src/utils/push-notification-policy.ts | 29 | export function shouldForceSystemNotification(payload: PushNotificationPayload): boolean { | CODE |
| LOW | packages/web/src/utils/push-notification-policy.ts | 41 | export function shouldShowSystemNotification(payload: PushNotificationPayload, hasFocusedClient: boolean): boolean { | CODE |
| LOW | packages/web/src/utils/push-notification-policy.ts | 65 | export function shouldSuppressDuplicateNotification( | CODE |
| LOW | packages/web/src/utils/push-notification-policy.ts | 87 | export async function resetPushTestNotification( | CODE |
| LOW | packages/web/src/utils/cli-diagnostics-dedup.ts | 48 | export function computeCliDiagnosticsDedup( | CODE |
| LOW | packages/web/src/utils/worktree-id-alias.ts | 68 | export function resolveNavigateTargetWorktreeId( | CODE |
| LOW | packages/web/src/utils/worktree-id-alias.ts | 79 | export function getNavigateWorktreeRoomIds( | CODE |
| LOW | packages/web/src/utils/crosspost-scroll-target.ts | 27 | export function findCrossPostTargetMessageId( | CODE |
| LOW⚡ | packages/web/src/utils/crosspost-scroll-target.ts | 61 | export function setPendingCrossPostScroll(target: PendingCrossPostScroll): void { | CODE |
| LOW⚡ | packages/web/src/utils/crosspost-scroll-target.ts | 69 | export function consumePendingCrossPostScroll(threadId: string): PendingCrossPostScroll | null { | CODE |
| LOW⚡ | packages/web/src/utils/crosspost-scroll-target.ts | 79 | export function peekPendingCrossPostScroll(threadId: string): PendingCrossPostScroll | null { | CODE |
| LOW | packages/web/src/utils/crosspost-scroll-target.ts | 101 | export function resolveCrossPostScrollTarget( | CODE |
| LOW | packages/web/src/utils/signals-view.ts | 48 | export function groupSignalSourcesByTierAndCategory(sources: readonly SignalSource[]): readonly SignalSourceGroup[] { | CODE |
| LOW | packages/web/src/utils/batch-apply-labels.ts | 20 | export function extractPendingLabelSuggestions( | CODE |
| LOW | packages/web/src/utils/teleport.ts | 119 | export function shouldLoadOlderForTeleport(params: { | CODE |
| LOW | packages/web/src/utils/transcription-corrector.ts | 52 | function buildSpeechMentionPattern(aliases: string[]): RegExp { | CODE |
| LOW | packages/web/src/components/hub-cat-editor.sections.tsx | 29 | function acpDefaultsForClientSwitch( | CODE |
| LOW | packages/web/src/components/hub-cat-editor.model.ts | 160 | export function getCliEffortOptionsForClient(client: ClientValue): readonly CliEffortValue[] | null { | CODE |
| LOW | packages/web/src/components/hub-cat-editor.model.ts | 177 | export function deriveModelMentionPattern(model: string): string { | CODE |
| LOW | packages/web/src/components/hub-cat-editor.model.ts | 189 | export function withDefaultModelMentionPattern(form: HubCatEditorFormState): HubCatEditorFormState { | CODE |
| LOW⚡ | packages/web/src/components/hub-cat-editor.model.ts | 296 | function isAllowedGoogleGatewayProfile(profile: ProfileItem): boolean { | CODE |
| LOW⚡ | packages/web/src/components/hub-cat-editor.model.ts | 302 | function resolveBuiltinClientFamily(client: ClientId): BuiltinAccountClient | null { | CODE |
| LOW⚡ | packages/web/src/components/hub-cat-editor.model.ts | 311 | export function builtinAccountIdForClient(client: ClientId): string | null { | CODE |
| LOW | packages/web/src/components/status-helpers.ts | 24 | export function collectSnapshotActiveCats( | CODE |
| LOW | packages/web/src/components/AgentHookHealthNotice.tsx | 76 | export function shouldRenderAgentHookHealthNotice({ health, error, syncing, synced }: RenderProbe): boolean { | CODE |
| LOW | packages/web/src/components/hub-cat-editor.acp.ts | 29 | export function defaultAcpCommandForClient(client: string): string { | CODE |
| LOW | packages/web/src/components/hub-cat-editor.acp.ts | 47 | export function defaultAcpStartupArgsForClient(client: string, transport: 'stdio' | 'httpstream' = 'stdio'): string { | CODE |
| 1247 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | cat-cafe-skills/feat-lifecycle/SKILL.md | 47 | ### Step 0: 关联检测(内部 + 社区 issue 都必须做)🔴 | COMMENT |
| LOW | cat-cafe-skills/vision-rescue/SKILL.md | 48 | ### Step 1: 识别——我在绝境里吗? | COMMENT |
| LOW | cat-cafe-skills/vision-rescue/SKILL.md | 57 | ### Step 2: 回到第一真相源 | COMMENT |
| LOW⚡ | cat-cafe-skills/vision-rescue/SKILL.md | 71 | ### Step 3: 找外部声音 | COMMENT |
| LOW⚡ | cat-cafe-skills/vision-rescue/SKILL.md | 81 | ### Step 4: 喊伙伴 | COMMENT |
| LOW⚡ | cat-cafe-skills/vision-rescue/SKILL.md | 91 | ### Step 5: 拒绝投降(除非 operator signoff) | COMMENT |
| LOW | cat-cafe-skills/worktree/SKILL.md | 50 | # Step 1: 检查是否有未提交的文档变更 | COMMENT |
| LOW | cat-cafe-skills/worktree/SKILL.md | 54 | # Step 2: 检查 main 与 remote 双向同步 | COMMENT |
| LOW | cat-cafe-skills/thread-orchestration/SKILL.md | 43 | ### Step 1: 拆解 — 识别独立可交付单元 | COMMENT |
| LOW | cat-cafe-skills/thread-orchestration/SKILL.md | 52 | ### Step 2: 提议 Thread — 每个子任务一个提议(用户审批后才创建) | COMMENT |
| LOW | cat-cafe-skills/thread-orchestration/SKILL.md | 108 | ### Step 3: 选猫 — 按任务性质匹配能力 | COMMENT |
| LOW | cat-cafe-skills/thread-orchestration/SKILL.md | 133 | ### Step 4: 并行执行 — Worktree 隔离 | COMMENT |
| LOW | cat-cafe-skills/thread-orchestration/SKILL.md | 145 | ### Step 5: 汇聚 — 确认门禁 + 串行推进 | COMMENT |
| LOW | cat-cafe-skills/guide-authoring/SKILL.md | 44 | ### Step 1: 场景识别 | COMMENT |
| LOW | cat-cafe-skills/guide-authoring/SKILL.md | 65 | ### Step 2: 步骤拆分 + YAML 编排 | COMMENT |
| LOW | cat-cafe-skills/guide-authoring/SKILL.md | 107 | ### Step 3: 元素标签标注 | COMMENT |
| LOW | cat-cafe-skills/guide-authoring/SKILL.md | 131 | ### Step 4: 注册到 Guide Registry | COMMENT |
| LOW | cat-cafe-skills/guide-authoring/SKILL.md | 150 | ### Step 5: CI 契约测试 | COMMENT |
| LOW | cat-cafe-skills/guide-authoring/SKILL.md | 157 | ### Step 6: 端到端验证 | COMMENT |
| LOW | cat-cafe-skills/refs/chatgpt-browser-automation.md | 25 | ### Step 1: 注入文本 | COMMENT |
| LOW | cat-cafe-skills/refs/chatgpt-browser-automation.md | 38 | ### Step 2: 发送 | COMMENT |
| LOW | cat-cafe-skills/refs/chatgpt-browser-automation.md | 49 | ### Step 3: 等待回复完成 | COMMENT |
| LOW | cat-cafe-skills/refs/chatgpt-browser-automation.md | 66 | ### Step 4: 复制回复 | COMMENT |
| LOW | cat-cafe-skills/refs/chatgpt-browser-automation.md | 77 | ### Step 5: 读取剪贴板 | COMMENT |
| LOW | cat-cafe-skills/refs/repo-inbox.md | 35 | ### Step 1: Read — 读原始对象 | COMMENT |
| LOW⚡ | cat-cafe-skills/refs/repo-inbox.md | 107 | ### Step 2: Ground — 基础合法性 | COMMENT |
| LOW⚡ | cat-cafe-skills/refs/repo-inbox.md | 117 | ### Step 3: Gate — 主人翁五问 | COMMENT |
| LOW⚡ | cat-cafe-skills/refs/repo-inbox.md | 123 | ### Step 4: Route — 按 Verdict 路由 | COMMENT |
| LOW | cat-cafe-skills/refs/repo-inbox.md | 209 | ### Step 5: Record — 收口 | COMMENT |
| LOW | cat-cafe-skills/refs/claude-ai-browser-automation.md | 17 | ### Step 1: 打开新对话或已有对话 | COMMENT |
| LOW | cat-cafe-skills/refs/claude-ai-browser-automation.md | 23 | ### Step 2: 激活 Research 模式 | COMMENT |
| LOW | cat-cafe-skills/refs/claude-ai-browser-automation.md | 36 | ### Step 3: 填写提示词 & 发送 | COMMENT |
| LOW | cat-cafe-skills/refs/claude-ai-browser-automation.md | 48 | ### Step 4: 等待 Research 完成 | COMMENT |
| LOW | cat-cafe-skills/refs/claude-ai-browser-automation.md | 62 | ### Step 5: 打开报告文章 | COMMENT |
| LOW | cat-cafe-skills/refs/claude-ai-browser-automation.md | 69 | ### Step 6: 下载报告(关键步骤!✅ 超级简单) | COMMENT |
| LOW | cat-cafe-skills/cross-thread-sync/SKILL.md | 30 | ## Step 1: 发现(谁在平行工作?) | COMMENT |
| LOW | cat-cafe-skills/cross-thread-sync/SKILL.md | 75 | ## Step 2: 通知(3+2 升级制) | COMMENT |
| LOW | cat-cafe-skills/cross-thread-sync/SKILL.md | 118 | ## Step 3: 争用协调(共享文件冲突预防) | COMMENT |
| LOW | cat-cafe-skills/cross-thread-sync/SKILL.md | 151 | ## Step 4: 确认 | COMMENT |
| LOW | cat-cafe-skills/pencil-design/SKILL.md | 37 | ### Step 1: 分析现有 UI | COMMENT |
| LOW | cat-cafe-skills/pencil-design/SKILL.md | 49 | ### Step 2: 判断设计类型 | COMMENT |
| LOW | cat-cafe-skills/pencil-design/SKILL.md | 57 | ### Step 3: 风格验证 | COMMENT |
| LOW⚡ | docs/features/F040-backlog-reorganization.md | 420 | ### Step 1: 创建 `feat-completion` skill(P1,~30min) | COMMENT |
| LOW⚡ | docs/features/F040-backlog-reorganization.md | 426 | ### Step 2: 沉淀 ADR(P2,~20min) | COMMENT |
| LOW⚡ | docs/features/F040-backlog-reorganization.md | 434 | ### Step 3: 更新 lessons-learned(P2,~10min) | COMMENT |
| LOW⚡ | docs/features/F040-backlog-reorganization.md | 440 | ### Step 4: 同步三猫指引(P2,~15min) | COMMENT |
| LOW⚡ | docs/features/F040-backlog-reorganization.md | 447 | ### Step 5: 验收(P3,可延后) | COMMENT |
| LOW⚡ | …/web/src/stores/__tests__/chatStore-multi-slot.test.ts | 87 | // Step 1: Parent intent_mode registers all cats | COMMENT |
| LOW⚡ | …/web/src/stores/__tests__/chatStore-multi-slot.test.ts | 93 | // Step 2: Callback intent_mode for gemini with new invocationId. | COMMENT |
| LOW | …/web/src/stores/__tests__/chatStore-multi-slot.test.ts | 111 | // Step 3: Gemini finishes — removing inv-B leaves no gemini orphan | COMMENT |
| LOW⚡ | …ckages/web/src/stores/__tests__/bubble-reducer.test.ts | 2135 | // Step 1: A inv-A1 stream + content | COMMENT |
| LOW⚡ | …ckages/web/src/stores/__tests__/bubble-reducer.test.ts | 2144 | // Step 2: B inv-B1 stream + content | COMMENT |
| LOW⚡ | …ckages/web/src/stores/__tests__/bubble-reducer.test.ts | 2153 | // Step 3: A inv-A2 (NEW invocation) stream + content | COMMENT |
| LOW | …ckages/web/src/stores/__tests__/bubble-reducer.test.ts | 2347 | // Step 1: stream_started — reducer 创建 canonical `msg-T1R-codex-assistant_text` | COMMENT |
| LOW | …ckages/web/src/stores/__tests__/bubble-reducer.test.ts | 2364 | // Step 2: tool_event — 应该 append 到 step 1 的 bubble (assistant_text container) | COMMENT |
| LOW | …ckages/web/src/stores/__tests__/bubble-reducer.test.ts | 2383 | // Step 3: stream_chunk — 应该 append content 到同一 bubble,不触发 canonical-split | COMMENT |
| LOW | …tores/__tests__/bubble-projection-alpha-replay.test.ts | 44 | // Step 1: stream record exists in store | COMMENT |
| LOW | …tores/__tests__/bubble-projection-alpha-replay.test.ts | 56 | // Step 2: callback_final event with exact-key match would normally overwrite stream content | COMMENT |
| LOW | …components/memory/__tests__/CollectionCatalog.test.tsx | 78 | // Step 1: click header → detail appears | COMMENT |
| LOW⚡ | …components/memory/__tests__/CollectionCatalog.test.tsx | 92 | // Step 2: click inside detail area → detail stays (no collapse) | COMMENT |
| 193 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | …/web/src/stores/__tests__/chatStore-multi-slot.test.ts | 87 | // Step 1: Parent intent_mode registers all cats | COMMENT |
| LOW⚡ | …/web/src/stores/__tests__/chatStore-multi-slot.test.ts | 93 | // Step 2: Callback intent_mode for gemini with new invocationId. | COMMENT |
| LOW | …/web/src/stores/__tests__/chatStore-multi-slot.test.ts | 111 | // Step 3: Gemini finishes — removing inv-B leaves no gemini orphan | COMMENT |
| LOW⚡ | …ckages/web/src/stores/__tests__/bubble-reducer.test.ts | 2135 | // Step 1: A inv-A1 stream + content | COMMENT |
| LOW⚡ | …ckages/web/src/stores/__tests__/bubble-reducer.test.ts | 2144 | // Step 2: B inv-B1 stream + content | COMMENT |
| LOW⚡ | …ckages/web/src/stores/__tests__/bubble-reducer.test.ts | 2153 | // Step 3: A inv-A2 (NEW invocation) stream + content | COMMENT |
| LOW | …ckages/web/src/stores/__tests__/bubble-reducer.test.ts | 2347 | // Step 1: stream_started — reducer 创建 canonical `msg-T1R-codex-assistant_text` | COMMENT |
| LOW | …ckages/web/src/stores/__tests__/bubble-reducer.test.ts | 2364 | // Step 2: tool_event — 应该 append 到 step 1 的 bubble (assistant_text container) | COMMENT |
| LOW | …ckages/web/src/stores/__tests__/bubble-reducer.test.ts | 2383 | // Step 3: stream_chunk — 应该 append content 到同一 bubble,不触发 canonical-split | COMMENT |
| LOW | …tores/__tests__/bubble-projection-alpha-replay.test.ts | 44 | // Step 1: stream record exists in store | COMMENT |
| LOW | …tores/__tests__/bubble-projection-alpha-replay.test.ts | 56 | // Step 2: callback_final event with exact-key match would normally overwrite stream content | COMMENT |
| LOW | …components/memory/__tests__/CollectionCatalog.test.tsx | 78 | // Step 1: click header → detail appears | COMMENT |
| LOW⚡ | …components/memory/__tests__/CollectionCatalog.test.tsx | 92 | // Step 2: click inside detail area → detail stays (no collapse) | COMMENT |
| LOW⚡ | …components/memory/__tests__/CollectionCatalog.test.tsx | 101 | // Step 3: click header again → collapse | COMMENT |
| LOW⚡ | …ents/concierge/__tests__/concierge-components.test.tsx | 554 | // Step 1: help → bubble with prefilled draft | COMMENT |
| LOW⚡ | …ents/concierge/__tests__/concierge-components.test.tsx | 564 | // Step 2: Escape → back to toolbar | COMMENT |
| LOW⚡ | …ents/concierge/__tests__/concierge-components.test.tsx | 571 | // Step 3: chat → bubble must open with *empty* input (not the old draft) | COMMENT |
| LOW⚡ | …onents/__tests__/thread-sidebar-reconcile-race.test.ts | 64 | // Step 1: User pins thread → fires PATCH (fetchQueue[0]) | COMMENT |
| LOW⚡ | …onents/__tests__/thread-sidebar-reconcile-race.test.ts | 71 | // Step 2: User unpins → fires new PATCH (fetchQueue[2]), seq increments to 2 | COMMENT |
| LOW⚡ | …onents/__tests__/thread-sidebar-reconcile-race.test.ts | 74 | // Step 3: Reconcile GET from step 1 returns { pinned: true } | COMMENT |
| LOW⚡ | …onents/__tests__/thread-sidebar-reconcile-race.test.ts | 82 | // Step 4: Second PATCH succeeds | COMMENT |
| LOW⚡ | …nents/__tests__/HubObservabilityTab-deep-link.test.tsx | 73 | // Step 1: first deep-link. | COMMENT |
| LOW⚡ | …nents/__tests__/HubObservabilityTab-deep-link.test.tsx | 79 | // Step 2: simulate the user clicking the '总览' subtab button so internal | COMMENT |
| LOW⚡ | …nents/__tests__/HubObservabilityTab-deep-link.test.tsx | 89 | // Step 3: second deep-link with SAME initialSubTab value but new nonce. | COMMENT |
| LOW⚡ | …omponents/__tests__/chat-input-game-send-guard.test.ts | 79 | // Step 1: render with idle upload — menu can open | COMMENT |
| LOW⚡ | …omponents/__tests__/chat-input-game-send-guard.test.ts | 84 | // Step 2: open game menu | COMMENT |
| LOW⚡ | …omponents/__tests__/chat-input-game-send-guard.test.ts | 91 | // Step 3: drill into modes (layer 1 → layer 2) | COMMENT |
| LOW⚡ | …omponents/__tests__/chat-input-game-send-guard.test.ts | 98 | // Step 4: re-render with uploading status (menu stays open, upload started) | COMMENT |
| LOW⚡ | …omponents/__tests__/chat-input-game-send-guard.test.ts | 103 | // Step 5: click a mode — should NOT call onSend because upload is blocking | COMMENT |
| LOW | …c/components/__tests__/first-run-quest-wizard.test.tsx | 203 | // Step 1: select template | COMMENT |
| LOW⚡ | …c/components/__tests__/first-run-quest-wizard.test.tsx | 214 | // Step 2: select client | COMMENT |
| LOW⚡ | …c/components/__tests__/first-run-quest-wizard.test.tsx | 222 | // Step 3: profile auto-selected, select model, test, then create | COMMENT |
| LOW⚡ | …nents/__tests__/workspace-panel-md-add-to-chat.test.ts | 284 | // Step 1: Verify markdown rendered mode — MarkdownContent is mounted | COMMENT |
| LOW⚡ | …nents/__tests__/workspace-panel-md-add-to-chat.test.ts | 294 | // Step 2: Click "编辑" button → enters editMode (unmounts MarkdownContent, mounts CodeViewer) | COMMENT |
| LOW | …nents/__tests__/workspace-panel-md-add-to-chat.test.ts | 306 | // Step 3: Click "退出编辑" → back to rendered mode (re-mounts MarkdownContent with NEW DOM) | COMMENT |
| LOW⚡ | …nents/__tests__/workspace-panel-md-add-to-chat.test.ts | 317 | // Step 4: Verify NEW MarkdownContent container is mounted | COMMENT |
| LOW⚡ | …nents/__tests__/workspace-panel-md-add-to-chat.test.ts | 321 | // Step 5: Selection on the NEW container should still trigger Add to Chat | COMMENT |
| LOW | …es/web/src/components/rich/CommunityIssueDraftCard.tsx | 106 | // Step 1: Create draft (server-side idempotent — returns existing if retry) | COMMENT |
| LOW | …es/web/src/components/rich/CommunityIssueDraftCard.tsx | 147 | // Step 2: Publish | COMMENT |
| LOW⚡ | …ges/web/src/__tests__/game-thread-loading-race.test.ts | 34 | // Step 1: /game sent → loading set on source thread (currently active = flat state) | COMMENT |
| LOW⚡ | …ges/web/src/__tests__/game-thread-loading-race.test.ts | 39 | // Step 2: game:thread_created arrives → navigate to game thread | COMMENT |
| LOW⚡ | …ges/web/src/__tests__/game-thread-loading-race.test.ts | 48 | // Step 3: HTTP response arrives → cleanup uses thread-scoped API | COMMENT |
| LOW | …sts__/useAgentMessages-sequential-slot-cleanup.test.ts | 193 | // Step 1: Codex finishes (non-final) | COMMENT |
| LOW | …sts__/useAgentMessages-sequential-slot-cleanup.test.ts | 208 | // Step 2: Opus finishes (final) | COMMENT |
| LOW | …/hooks/__tests__/useAgentMessages-bubble-merge.test.ts | 890 | // Step 1: stream chunk creates the bubble bound to inv-done. | COMMENT |
| LOW | …/hooks/__tests__/useAgentMessages-bubble-merge.test.ts | 907 | // Step 2: done event finalizes the bubble and populates finalizedStreamRef. | COMMENT |
| LOW | …/hooks/__tests__/useAgentMessages-bubble-merge.test.ts | 920 | // Step 3: stale tool_use arrives for the completed invocation (reordered / retry). | COMMENT |
| LOW | …s/__tests__/useAgentMessages-thinking-metadata.test.ts | 50 | // Step 1: thinking creates placeholder (metadata may be present if msg carries it; | COMMENT |
| LOW | …s/__tests__/useAgentMessages-thinking-metadata.test.ts | 68 | // Step 2: text chunk arrives with metadata → merge onto placeholder | COMMENT |
| LOW | …s/__tests__/useAgentMessages-thinking-metadata.test.ts | 79 | // Step 3: invocation_usage arrives → setMessageUsage should succeed (not no-op) | COMMENT |
| LOW | …/__tests__/useAgentMessages-catchup-ref-desync.test.ts | 231 | // Step 1: Create active stream → activeRefs + sawStreamDataRef populated | COMMENT |
| LOW⚡ | …/__tests__/useAgentMessages-catchup-ref-desync.test.ts | 255 | // Step 2: done → finalizedStreamRef populated | COMMENT |
| LOW⚡ | …/__tests__/useAgentMessages-catchup-ref-desync.test.ts | 264 | // Step 3: resetRefs (simulates what thread switch or catch-up cleanup would do) | COMMENT |
| LOW⚡ | …/__tests__/useAgentMessages-catchup-ref-desync.test.ts | 271 | // Step 4: Wipe store messages (simulates fetchHistory replace) + start new invocation | COMMENT |
| LOW | …/__tests__/useAgentMessages-catchup-ref-desync.test.ts | 304 | // Step 1: Stream + done → finalizedStreamRef set | COMMENT |
| LOW⚡ | …/__tests__/useAgentMessages-catchup-ref-desync.test.ts | 333 | // Step 2: resetRefs clears finalizedStreamRef | COMMENT |
| LOW⚡ | …/__tests__/useAgentMessages-catchup-ref-desync.test.ts | 340 | // Step 3: A callback arrives for a NEW invocation. | COMMENT |
| LOW | packages/mcp-server/test/callback-tools.test.js | 735 | // Step 1: enqueue by forcing transient failures. | COMMENT |
| LOW | packages/mcp-server/test/callback-tools.test.js | 747 | // Step 2: recover network and verify replay + current post both sent. | COMMENT |
| LOW⚡ | packages/api/test/plugin-schedule-activate.test.js | 380 | // Step 1: enable plugin with a schedule resource | COMMENT |
| 147 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | packages/api/test/messages-delivery-mode.test.js | 345 | const failedUpdate = deps.invocationRecordStore.update.mock.calls.find( | CODE |
| CRITICAL | packages/api/test/messages-delivery-mode.test.js | 350 | const completion = deps.queueProcessor.onInvocationComplete.mock.calls.find( | CODE |
| CRITICAL | packages/api/test/messages-delivery-mode.test.js | 455 | const spawnStarted = deps.socketManager.broadcastToRoom.mock.calls.find((c) => c.arguments[1] === 'spawn_started'); | CODE |
| CRITICAL | packages/api/test/queue-processor.test.js | 270 | const pausedCall = deps.socketManager.emitToUser.mock.calls.find((c) => c.arguments[1] === 'queue_paused'); | CODE |
| CRITICAL | packages/api/test/queue-processor.test.js | 283 | const pausedCall = deps.socketManager.emitToUser.mock.calls.find((c) => c.arguments[1] === 'queue_paused'); | CODE |
| CRITICAL | packages/api/test/queue-processor.test.js | 320 | const pausedCall = deps.socketManager.emitToUser.mock.calls.find((c) => c.arguments[1] === 'queue_paused'); | CODE |
| CRITICAL | packages/api/test/queue-processor.test.js | 399 | const broadcasts = deps.socketManager.broadcastAgentMessage.mock.calls.map((call) => call.arguments[0]); | CODE |
| CRITICAL | packages/api/test/queue-processor.test.js | 415 | const canceledUpdate = deps.invocationRecordStore.update.mock.calls.find( | CODE |
| CRITICAL | packages/api/test/queue-processor.test.js | 518 | const intentCall = deps.socketManager.broadcastToRoom.mock.calls.find((c) => c.arguments[1] === 'intent_mode'); | CODE |
| CRITICAL⚡ | packages/api/test/queue-processor.test.js | 545 | const spawnCall = deps.socketManager.broadcastToRoom.mock.calls.find((c) => c.arguments[1] === 'spawn_started'); | CODE |
| CRITICAL⚡ | packages/api/test/queue-processor.test.js | 553 | const earlyIntentCall = deps.socketManager.broadcastToRoom.mock.calls.find((c) => c.arguments[1] === 'intent_mode'); | CODE |
| CRITICAL⚡ | packages/api/test/queue-processor.test.js | 559 | const intentCall = deps.socketManager.broadcastToRoom.mock.calls.find((c) => c.arguments[1] === 'intent_mode'); | CODE |
| CRITICAL | packages/api/test/queue-processor.test.js | 1549 | const intentCall = failDeps.socketManager.broadcastToRoom.mock.calls.find((c) => c.arguments[1] === 'intent_mode'); | CODE |
| CRITICAL | packages/api/test/queue-processor.test.js | 1560 | const intentCall = deps.socketManager.broadcastToRoom.mock.calls.find((c) => c.arguments[1] === 'intent_mode'); | CODE |
| CRITICAL | packages/api/test/queue-processor.test.js | 1581 | const intentCall = emptyDeps.socketManager.broadcastToRoom.mock.calls.find((c) => c.arguments[1] === 'intent_mode'); | CODE |
| CRITICAL | packages/api/test/queue-processor.test.js | 1750 | const succeededUpdate = deps.invocationRecordStore.update.mock.calls.find( | CODE |
| CRITICAL | packages/api/test/queue-processor.test.js | 2376 | deps.invocationRecordStore.update.mock.calls.some((c) => c.arguments[1]?.status === 'succeeded'), | CODE |
| CRITICAL | packages/api/test/queue-processor.test.js | 2874 | const deliveredIds = deps.messageStore.markDelivered.mock.calls.map((c) => c.arguments[0]); | CODE |
| CRITICAL | packages/api/test/opencode-agent-service.test.js | 760 | e.metadata.cliDiagnostics.debugRef.command.includes('opencode'), | CODE |
| CRITICAL | packages/api/test/f236-cc-anchor-hook.test.js | 508 | assert.ok(result.hookSpecificOutput.updatedToolOutput.file.content.includes('3 lines')); | CODE |
| CRITICAL | packages/api/test/a2a-routing-persist.test.js | 227 | deps.socketManager.broadcastAgentMessage.mock.calls.some((c) => c.arguments[0]?.type === 'a2a_handoff'), | CODE |
| CRITICAL | packages/api/test/a2a-routing-persist.test.js | 270 | deps.socketManager.broadcastAgentMessage.mock.calls.some((c) => c.arguments[0]?.type === 'a2a_handoff'), | CODE |
| CRITICAL | packages/api/test/queue-api.test.js | 647 | const del = deps.socketManager.emitToUser.mock.calls.find((c) => c.arguments[1] === 'message_deleted'); | CODE |
| CRITICAL | packages/api/test/queue-api.test.js | 732 | const doneCalls = deps.socketManager.broadcastAgentMessage.mock.calls.filter((c) => c.arguments[0].type === 'done'); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | CONTRIBUTING.md | 21 | COMMENT | |
| LOW | cat-cafe-skills/manifest.yaml | 1 | # Clowder AI Skills Manifest — 路由单一真相源 | COMMENT |
| LOW | cat-cafe-skills/hyperfocus-brake/sanitizer.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | cat-cafe-skills/merge-gate/SKILL.md | 201 | gh pr create --title "feat(xxx): ..." --body "$(cat <<'EOF' | COMMENT |
| LOW | cat-cafe-skills/merge-gate/SKILL.md | 221 | # 之后再翻 merge **不会补发唤醒**。所以:若翻 intent 时 CI **已经绿了**,别等回调,直接 | COMMENT |
| LOW | cat-cafe-skills/merge-gate/SKILL.md | 261 | # - EYES == 0 → 云端没接到 → 允许 re-trigger(进 6.2),可以 hold_ball 轮询等 EYES | COMMENT |
| LOW | cat-cafe-skills/merge-gate/SKILL.md | 341 | # E4: verdict !== "blocked" | COMMENT |
| LOW | desktop/main.js | 1 | // Clowder AI Desktop — Electron main process | COMMENT |
| LOW | desktop/scripts/build-mac.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | desktop/scripts/build-mac.sh | 341 | file.write(png) | COMMENT |
| LOW | desktop/scripts/build-mac.sh | 421 | die "hdiutil attach failed for ${arch} (mountpoint=${mount_point})" | COMMENT |
| LOW | docs/harness-feedback/eval-domains/eval-sop.yaml | 1 | --- | COMMENT |
| LOW | …arness-feedback/eval-domains/eval-capability-tips.yaml | 1 | --- | COMMENT |
| LOW | scripts/setup.sh | 281 | echo -e " ${GREEN}✓${NC} API proxy enabled" | COMMENT |
| LOW | scripts/intake-from-opensource.sh | 921 | if [ "$SKIP_ABSORBED_GUARD" = true ] && [ -z "$ABSORB_PR" ]; then | COMMENT |
| LOW | scripts/sync-skills.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | scripts/sync-skills.sh | 261 | ;; | COMMENT |
| LOW | scripts/user-redis.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | scripts/install.sh | 81 | fi | COMMENT |
| LOW | scripts/start-dev.sh | 1 | #!/bin/bash | COMMENT |
| LOW | scripts/start-dev.sh | 21 | # ./scripts/start-dev.sh -- --npm-registry=URL --pip-index-url=URL --hf-endpoint=URL | COMMENT |
| LOW | scripts/preflight-shared-state.sh | 1 | #!/bin/bash | COMMENT |
| LOW | scripts/clean-stale-skill-links.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | scripts/pre-merge-check.sh | 1 | #!/bin/bash | COMMENT |
| LOW | scripts/lib/intake-gh-retry.sh | 1 | # shellcheck shell=bash | COMMENT |
| LOW | scripts/lib/quickstart-freshness.sh | 1 | # shellcheck shell=bash | COMMENT |
| LOW | scripts/services/recommendation-matrix.yaml | 1 | # ============================================================ | COMMENT |
| LOW | scripts/services/recommendation-matrix.yaml | 21 | # - name: <model-id> | COMMENT |
| LOW | scripts/services/recommendation-matrix.yaml | 721 | requirement: 'HuggingFace 上的 CausalLM 因果语言模型(纯 CPU 推理,建议 ≤3B)' | COMMENT |
| LOW | scripts/services/prereq-check.sh | 361 | # (user feedback): forcing pip to tunnel through clash verge's | COMMENT |
| LOW | scripts/services/prereq-check.sh | 381 | # Windows tooling has no OS-level fallback -- that asymmetry is | COMMENT |
| LOW | scripts/services/prereq-check.sh | 401 | # Single source of truth: prereq-check decides, downstream just | COMMENT |
| LOW | scripts/services/tts-server.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | scripts/services/embed-server.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | scripts/services/python-resolve.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | scripts/services/python-resolve.sh | 21 | # 2. uv (if user already has it) -- uv python find 3.12 reuses uv-managed | COMMENT |
| LOW | scripts/services/python-resolve.sh | 41 | COMMENT | |
| LOW | scripts/services/python-resolve.sh | 181 | _try_legacy_project_python() { | COMMENT |
| LOW | scripts/services/whisper-server.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | scripts/services/install-python.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | scripts/services/install-template.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | scripts/services/install-template.sh | 21 | # VENV_NAME (required) -- venv dir name under | COMMENT |
| LOW | scripts/services/llm-postprocess-server.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | packages/web/next-env.d.ts | 1 | /// <reference types="next" /> | COMMENT |
| LOW | packages/web/src/stores/callbackAuthStore.ts | 161 | // seen (snapshot 30s lag). But this was over-engineered against the | COMMENT |
| LOW | packages/web/src/stores/callbackAuthStore.ts | 181 | }); | COMMENT |
| LOW | packages/web/src/stores/bubble-invariants.ts | 41 | // Active path `ensureActiveAssistantMessage` creates the canonical | COMMENT |
| LOW | packages/web/src/stores/chatStore.ts | 1741 | }, | COMMENT |
| LOW | packages/web/src/stores/bubble-reducer.ts | 181 | function findExistingByStableKey( | COMMENT |
| LOW | packages/web/src/stores/bubble-reducer.ts | 341 | // ADR-033 设计 tool_or_cli 为独立 kind bubble,但当前 UI 把 tool events 当 | COMMENT |
| LOW | packages/web/src/stores/bubble-reducer.ts | 441 | // | COMMENT |
| LOW | …ckages/web/src/stores/__tests__/bubble-reducer.test.ts | 1721 | currentMessages, | COMMENT |
| LOW | packages/web/src/components/ChatMessage.tsx | 261 | // F212 Phase B routing precedence (砚砚 P1-1 + 云端 codex P2-3, 2026-05-27): | COMMENT |
| LOW | …nents/__tests__/HubObservabilityTab-deep-link.test.tsx | 61 | // FAIL. Sequence: | COMMENT |
| LOW | packages/web/src/hooks/useChatHistory.ts | 1281 | // a previous thread's aborted fetch never leaks to the new thread. | COMMENT |
| LOW | packages/web/src/hooks/useChatHistory.ts | 1361 | }, [threadId, cancelPendingRestore, clearMessages, fetchHistory, fetchQueue, fetchTaskProgress, fetchTasks]); // eslin | COMMENT |
| LOW | packages/web/src/hooks/useChatHistory.ts | 1381 | // Cloud R3 P1 fix (2026-05-02): retry on skipped/failed fetch with exponential | COMMENT |
| LOW | packages/web/src/hooks/useSocket.ts | 381 | const joinedRoomsRef = useRef<Set<string>>(new Set()); | COMMENT |
| LOW | packages/web/src/hooks/useSocket.ts | 521 | // Reconnect reconciliation: verify invocation state against server truth. | COMMENT |
| LOW | packages/web/src/hooks/useAgentMessages.ts | 701 | // the work-log bubble before invocation_created stamped the per-cat-turn id) is the | COMMENT |
| 135 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docs/features/F124-apple-ecosystem-voice-interaction.md | 173 | - [Xcode 26.3 unlocks the power of agentic coding — Apple Newsroom](https://www.apple.com/newsroom/2026/02/xcode-26-poin | CODE |
| MEDIUM | docs/features/F124-apple-ecosystem-voice-interaction.md | 174 | - [Apple releases Xcode 26.3 — 9to5Mac](https://9to5mac.com/2026/02/26/apple-releases-xcode-26-3-with-support-for-agenti | CODE |
| MEDIUM | docs/features/F213-stale-mcp-config-cleanup.md | 274 | PR #1894 (5-round P1 chain) 保留 close 状态作为 "lookup-based scaffolding antipattern" 教学案例,commits `b7d618436` → `878bb144d` | CODE |
| MEDIUM | docs/features/F044-channel-activity-system.md | 252 | 私密频道消息的 token 算谁的?Ragdoll在 `#ragdoll-hq` 发了 20 条策略讨论,进不进公开频道的 context window? | CODE |
| MEDIUM | docs/features/F129-pack-system-multi-agent-mod.md | 25 | ### 核心洞察:shared-rules 是 multi-agent 的分水岭 | COMMENT |
| MEDIUM | docs/decisions/021-f129-pack-system-architecture.md | 26 | ### 关键洞察:shared-rules 是 multi-agent 的分水岭 | COMMENT |
| MEDIUM | scripts/intake-from-opensource.sh | 165 | # These files often carry route wiring, dependency injection, auth/callback, | COMMENT |
| MEDIUM | packages/shared/src/types/pack.ts | 41 | // ─── Guardrails (guardrails.yaml) ──────────────────────────────────── | COMMENT |
| MEDIUM | packages/shared/src/schemas/pack.ts | 53 | // ─── Guardrails (guardrails.yaml) ──────────────────────────────────── | COMMENT |
| MEDIUM | packages/api/test/api-fetcher.test.js | 74 | url: 'https://example.com/agentic-workflows', | CODE |
| MEDIUM | packages/api/test/api-fetcher.test.js | 93 | assert.equal(result.articles[0].url, 'https://example.com/agentic-workflows'); | CODE |
| MEDIUM | packages/api/test/invoke-single-cat.test.js | 1794 | // step_finish event (per LLM call inside opencode agentic loop) carries | COMMENT |
| MEDIUM | packages/api/test/system-prompt-builder.test.js | 1946 | // Core governance (L0 家规) must come before pack guardrails | COMMENT |
| MEDIUM | packages/api/test/memory/embed-eval.test.js | 31 | // This is expected — the scaffold validates the test infra is wired | COMMENT |
| MEDIUM | packages/api/test/memory/embed-eval.test.js | 38 | // For now, the scaffold proves the test runner picks up the file. | COMMENT |
| MEDIUM | packages/api/test/memory/event-memory-store.test.js | 316 | ins.run('evt_legacy_2', 'dup'); // same (thread_a, msg_1, scaffold) — a legacy duplicate | CODE |
| MEDIUM | packages/api/src/domains/packs/PackSecurityGuard.ts | 95 | // 3. Validate guardrails.yaml | COMMENT |
| MEDIUM | packages/api/src/domains/packs/PackSecurityGuard.ts | 113 | // 9. Scan guardrails for relaxation attempts | COMMENT |
| MEDIUM | packages/api/src/domains/packs/PackSecurityGuard.ts | 243 | // No guardrails — ok | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | cat-cafe-skills/hyperfocus-brake/sanitizer.test.sh | 51 | result=$(sanitize "user@example.com") | CODE |
| LOW | …ckages/web/src/stores/__tests__/bubble-reducer.test.ts | 1081 | it('uses local-only id when canonicalInvocationId missing, not "placeholder" magic (P2)', () => { | CODE |
| LOW | …ckages/web/src/stores/__tests__/bubble-reducer.test.ts | 1096 | expect(id).not.toContain('placeholder'); | CODE |
| LOW | …web/src/components/__tests__/vote-config-modal.test.ts | 20 | expect(html).toContain('placeholder'); | CODE |
| LOW | …es/web/src/components/__tests__/task-composer.test.tsx | 12 | expect(html).toContain('placeholder'); | CODE |
| LOW | packages/api/test/callback-start-vote.test.js | 176 | headers: { 'x-invocation-id': 'fake-id', 'x-callback-token': 'fake-token' }, | CODE |
| LOW | packages/api/test/telegram-adapter.test.js | 393 | const msgId = await adapter.sendPlaceholder('2002', 'placeholder'); | CODE |
| LOW | packages/api/test/adapter-send-media.test.js | 11 | const adapter = new TelegramAdapter('fake-token', { | CODE |
| LOW | packages/api/test/adapter-send-media.test.js | 52 | const adapter = new TelegramAdapter('fake-token', { | CODE |
| LOW | packages/api/test/adapter-send-media.test.js | 84 | const adapter = new TelegramAdapter('fake-token', { | CODE |
| LOW | packages/api/test/adapter-send-media.test.js | 117 | const adapter = new TelegramAdapter('fake-token', { | CODE |
| LOW | packages/api/test/adapter-send-media.test.js | 153 | const adapter = new TelegramAdapter('fake-token', { | CODE |
| LOW | packages/api/test/streaming-outbound-hook.test.js | 102 | assert.ok(!text.includes('placeholder'), `Receipt should not be a raw placeholder, got: ${text}`); | CODE |
| LOW | packages/api/test/callback-bootcamp-env-check.test.js | 56 | callbackToken: 'fake-token', | CODE |
| LOW | …ckages/api/test/connector-phase-b4-integration.test.js | 59 | sent.push({ chatId, text, type: 'placeholder', msgId }); | CODE |
| LOW | …ckages/api/test/connector-phase-b4-integration.test.js | 198 | assert.equal(adapter.sent[0].type, 'placeholder'); | CODE |
| LOW | packages/api/test/invoke-single-cat-preflight.test.js | 55 | execSync('git config user.email "test@test.com"', { cwd: dir, stdio: 'ignore' }); | CODE |
| LOW | packages/api/test/bg-carrier-streaming.test.js | 563 | const finalAnswer = 'The file contains 42 lines of Lorem ipsum.'; | CODE |
| LOW | …kages/api/test/feat-trajectory-real-git-runner.test.js | 200 | assert.strictEqual(extractCatHandle('user@example.com'), null); | CODE |
| LOW | packages/api/test/callback-bootcamp-state.test.js | 68 | headers: { 'x-invocation-id': 'fake-id', 'x-callback-token': 'fake-token' }, | CODE |
| LOW | packages/api/test/shared-state-preflight.test.js | 31 | execSync('git config user.email "test@test.com"', { cwd: dir, stdio: 'ignore' }); | CODE |
| LOW | packages/api/test/feishu-adapter.test.js | 916 | const messageId = await adapter.sendPlaceholder('oc_chat', 'placeholder'); | CODE |
| LOW | packages/api/test/feishu-adapter.test.js | 1175 | assert.ok(bodyEl.content.includes('user@example.com'), 'email-like @-token must NOT be replaced'); | CODE |
| LOW | packages/api/test/gate-keeping-cross-store.test.js | 227 | const waitSourceRef = { kind: 'reporter_handle', value: 'user@example.com' }; | CODE |
| LOW | packages/api/test/integration/mcp-prompt-e2e.test.js | 182 | callbackToken: 'fake-token', | CODE |
| LOW | packages/api/src/routes/quota.ts | 116 | sourceKind: 'cli' | 'browser' | 'placeholder'; | CODE |
| LOW | packages/api/src/routes/quota.ts | 345 | sourceKind: 'placeholder', | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …s/harness-feedback/eval-domains/eval-anchor-first.yaml | 25 | # Findings route to F236 owner (opus-47 as the registered harness-eval cell owner). | COMMENT |
| MEDIUM | docs/harness-feedback/eval-domains/eval-friction.yaml | 25 | # Actionable friction findings route to the harness-eval owner (Phase D wires | COMMENT |
| MEDIUM | docs/harness-feedback/eval-domains/eval-friction.yaml | 29 | # would be an unwakeable handoff. Use opus-47 — registered + the harness-eval cell | COMMENT |
| MEDIUM | docs/harness-feedback/eval-domains/eval-sop.yaml | 14 | # See: docs/features/F192-socio-technical-harness-eval.md (sunset/re-enable journal) | COMMENT |
| MEDIUM | …-domains/community-fixtures/custom-domain-example.yaml | 10 | # See: packages/api/src/infrastructure/harness-eval/community-eval-domain.ts | COMMENT |
| MEDIUM | packages/mcp-server/test/callback-retry.test.js | 56 | // robust if a future caller passes a plain AbortController signal. | COMMENT |
| MEDIUM | packages/api/test/staging-content.test.js | 234 | sourceOnlyTest('Cloud R5 P2 #2239: ADR-031 harness 三层反射 rendered (disentangled from F218 trim)', () => { | CODE |
| MEDIUM | packages/api/test/b1c-2-build-delta-payload.test.js | 272 | // contract precisely when the receiver needs robust parsing most. | COMMENT |
| MEDIUM | …ains/cats/services/cloud-bridge/build-delta-payload.ts | 98 | // the cloud cat side, exactly when the receiver needs robust parsing most.) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/check-skills-mount.sh | 44 | except Exception: | CODE |
| LOW | scripts/services/llm-postprocess-api.py | 170 | except Exception as exc: | CODE |
| LOW | scripts/services/llm-postprocess-api.py | 199 | except Exception: | CODE |
| LOW | scripts/services/llm-postprocess-api.py | 210 | except Exception: | CODE |
| LOW | scripts/services/llm-postprocess-api.py | 241 | except Exception: | CODE |
| LOW | scripts/services/tts-api.py | 533 | except Exception as exc: | CODE |
| LOW | scripts/services/tts-api.py | 573 | except Exception as exc: | CODE |
| LOW | scripts/services/tts-api.py | 617 | except Exception: | CODE |
| LOW | scripts/services/whisper-api.py | 174 | except Exception as exc: | CODE |
| LOW | scripts/services/whisper-api.py | 207 | except Exception: | CODE |
| LOW | scripts/services/whisper-api.py | 224 | except Exception: | CODE |
| LOW | scripts/services/whisper-api.py | 232 | except Exception as e: | CODE |
| LOW | scripts/services/whisper-api.py | 262 | except Exception: | CODE |
| LOW | scripts/services/embed-api.py | 301 | except Exception as e: | CODE |
| LOW | scripts/services/embed-api.py | 353 | except Exception as e: | CODE |
| LOW | scripts/services/embed-api.py | 398 | except Exception: | CODE |
| LOW | scripts/services/install-template.sh | 236 | except Exception: | CODE |
| LOW | scripts/services/install-template.sh | 245 | except Exception as e: | CODE |
| LOW | scripts/services/install-template.sh | 266 | except Exception: | CODE |
| LOW | scripts/services/install-template.sh | 334 | except Exception as e: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | desktop/scripts/build-mac.sh | 14 | # Usage: | COMMENT |
| LOW | scripts/thread-exports-autosave.sh | 6 | # Usage: | COMMENT |
| LOW | scripts/thread-exports-sync.sh | 8 | # Usage: | COMMENT |
| LOW | scripts/user-redis.sh | 6 | # Usage: | COMMENT |
| LOW | scripts/install-git-guards.sh | 7 | # Usage: | COMMENT |
| LOW | scripts/user-redis-autobackup.sh | 6 | # Usage: | COMMENT |
| LOW | scripts/find-redis-dumps.sh | 7 | # Usage: | COMMENT |
| LOW | scripts/pre-merge-check.sh | 7 | # Usage: | COMMENT |
| LOW | scripts/services/tts-server.sh | 5 | # Usage: | COMMENT |
| LOW | scripts/services/embed-server.sh | 5 | # Usage: | COMMENT |
| LOW | scripts/services/whisper-server.sh | 6 | # Usage: | COMMENT |
| LOW | scripts/services/llm-postprocess-server.sh | 7 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | packages/api/test/start-dev-script.test.js | 936 | elif compgen -G "${backupDir}/stale-aof-test-6399-*" >/dev/null; then | CODE |
| HIGH | packages/api/test/start-dev-script.test.js | 1010 | elif compgen -G "${backupDir}/stale-aof-test-6399-*" >/dev/null; then | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | cat-cafe-skills/hyperfocus-brake/state.test.sh | 232 | # Create a symlink pointing to a sensitive file | COMMENT |
| MEDIUM | assets/brand-dictionary.yaml | 3 | # This file is the machine-readable truth source for F238. It defines | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | docs/features/F127-cat-instance-management.md | 39 | | `api_key` — Claude | apiKey + baseUrl + 可选 modelOverride | `<your-api-key>` + `https://api.anthropic.com` | | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/services/llm-postprocess-api.py | 8 | CODE | |
| LOW | scripts/services/tts-api.py | 26 | CODE | |
| LOW | scripts/services/whisper-api.py | 12 | CODE | |
| LOW | scripts/services/embed-api.py | 9 | CODE | |
| LOW | scripts/services/embed-api.py | 197 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/intake-from-opensource.sh | 1079 | # Check if this landed mainline commit is covered by an entries[] record | COMMENT |
| LOW | scripts/preflight-shared-state.sh | 33 | # Check if any commits on this branch touch shared state | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/services/embed-api.py | 251 | CODE | |
| LOW | scripts/services/embed-api.py | 357 | CODE |