An Open Source implementation of Notebook LM with more flexibility and features
This report presents the forensic synthetic code analysis of lfnovo/open-notebook, a TypeScript project with 37,837 GitHub stars. SynthScan v2.0 examined 115,153 lines of code across 510 source files, recording 1298 pattern matches distributed across 18 syntactic categories. The overall adjusted score of 16.5 places this repository in the Moderate 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 1298 distinct pattern matches across 18 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …nsformations/components/TransformationEditorDialog.tsx | 51 | export function TransformationEditorDialog({ open, onOpenChange, transformation }: TransformationEditorDialogProps) { | CODE |
| LOW | …src/components/settings/EmbeddingModelChangeDialog.tsx | 27 | export function EmbeddingModelChangeDialog({ | CODE |
| LOW | …/src/components/podcasts/generate-podcast-selection.ts | 53 | export function selectionsToContextConfigs( | CODE |
| LOW | frontend/src/lib/credential-update-payload.ts | 23 | export function buildCredentialUpdatePayload( | CODE |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 179 | export function convertReferencesToMarkdownLinks(text: string): string { | CODE |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 348 | export function convertReferencesToCompactMarkdown(text: string, referencesLabel: string = 'References'): string { | CODE |
| LOW | frontend/src/lib/utils/source-references.tsx | 275 | export function createReferenceLinkComponent( | CODE |
| LOW | frontend/src/lib/utils/source-references.tsx | 440 | export function createCompactReferenceLinkComponent( | CODE |
| LOW | frontend/src/lib/utils/source-references.tsx | 491 | export function convertSourceReferencesLegacy(text: string): React.ReactNode { | CODE |
| LOW | frontend/src/lib/hooks/use-podcasts.ts | 234 | export function useDuplicateEpisodeProfile() { | CODE |
| LOW | frontend/src/lib/hooks/use-podcasts.ts | 366 | export function useDuplicateSpeakerProfile() { | CODE |
| LOW | frontend/src/lib/hooks/use-sources.ts | 352 | export function useRemoveSourceFromNotebook() { | CODE |
| LOW | frontend/src/lib/hooks/use-credentials.ts | 338 | export function useMigrateFromProviderConfig() { | CODE |
| LOW⚡ | open_notebook/utils/runtime_capabilities.py | 57 | def _default_playwright_cache() -> str | None: | CODE |
| LOW⚡ | open_notebook/utils/runtime_capabilities.py | 67 | def _chromium_browser_present() -> bool: | CODE |
| LOW | open_notebook/utils/version_utils.py | 14 | async def get_version_from_github_async(repo_url: str, branch: str = "main") -> str: | CODE |
| LOW | open_notebook/utils/chunking.py | 173 | def detect_content_type_from_extension( | CODE |
| LOW | open_notebook/utils/chunking.py | 195 | def detect_content_type_from_heuristics(text: str) -> Tuple[ContentType, float]: | CODE |
| LOW | open_notebook/utils/chunking.py | 266 | def _calculate_markdown_score(text: str) -> float: | CODE |
| LOW | open_notebook/utils/chunking.py | 398 | def _apply_secondary_chunking(chunks: List[str]) -> List[str]: | CODE |
| LOW | open_notebook/utils/encryption.py | 62 | def _get_or_create_encryption_key() -> str: | CODE |
| LOW | open_notebook/utils/embedding.py | 24 | def _get_embedding_batch_size() -> int: | CODE |
| LOW | open_notebook/utils/context_builder.py | 79 | def _rendered_source_context_tokens( | CODE |
| LOW | open_notebook/utils/context_builder.py | 104 | def _truncate_source_to_token_budget( | CODE |
| LOW | open_notebook/utils/url_validation.py | 111 | async def prepare_pinned_http_target(url: str, provider: str) -> PinnedHttpTarget: | CODE |
| LOW | open_notebook/utils/graph_utils.py | 7 | async def get_session_message_count(graph, session_id: str) -> int: | CODE |
| LOW | open_notebook/podcasts/audio_paths.py | 63 | def resolve_contained_audio_path(audio_file: Optional[str]) -> Optional[Path]: | CODE |
| LOW | open_notebook/podcasts/models.py | 107 | async def resolve_transcript_config(self) -> Tuple[str, str, dict]: | CODE |
| LOW | open_notebook/podcasts/models.py | 285 | async def get_job_details_for_commands( | CODE |
| LOW | open_notebook/ai/connection_tester.py | 28 | def _is_vertex_credentials_file_error(exc: Exception) -> bool: | CODE |
| LOW | open_notebook/ai/connection_tester.py | 74 | def normalize_anthropic_compatible_base_url(base_url: str) -> str: | CODE |
| LOW | open_notebook/ai/connection_tester.py | 198 | async def _test_openai_compatible_connection(base_url: str, api_key: Optional[str] = None) -> Tuple[bool, str]: | CODE |
| LOW | open_notebook/ai/connection_tester.py | 249 | async def _test_anthropic_compatible_connection( | CODE |
| LOW | open_notebook/ai/connection_tester.py | 371 | def _connection_failure_reason(error_msg: str) -> Optional[str]: | CODE |
| LOW | open_notebook/ai/connection_tester.py | 453 | def classify_provider_test_error(error_msg: str) -> Tuple[bool, str]: | CODE |
| LOW | open_notebook/ai/key_provider.py | 128 | async def _provision_simple_provider(provider: str) -> bool: | CODE |
| LOW | open_notebook/ai/key_provider.py | 236 | async def _provision_url_key_compatible(provider: str, env_prefix: str) -> bool: | CODE |
| LOW | open_notebook/ai/key_provider.py | 261 | async def _provision_openai_compatible() -> bool: | CODE |
| LOW | open_notebook/ai/key_provider.py | 266 | async def _provision_anthropic_compatible() -> bool: | CODE |
| LOW | open_notebook/ai/provision.py | 10 | async def provision_langchain_model( | CODE |
| LOW⚡ | open_notebook/ai/model_discovery.py | 349 | async def fetch_anthropic_model_ids(api_key: str) -> List[str]: | CODE |
| LOW | open_notebook/ai/model_discovery.py | 278 | async def discover_openai_compatible_provider(provider: str) -> List[DiscoveredModel]: | CODE |
| LOW | open_notebook/ai/model_discovery.py | 321 | def _make_openai_compat_discoverer( | CODE |
| LOW | open_notebook/ai/model_discovery.py | 383 | async def discover_anthropic_models() -> List[DiscoveredModel]: | CODE |
| LOW | open_notebook/ai/model_discovery.py | 489 | async def discover_openrouter_models() -> List[DiscoveredModel]: | CODE |
| LOW | open_notebook/ai/model_discovery.py | 544 | async def discover_elevenlabs_models() -> List[DiscoveredModel]: | CODE |
| LOW | open_notebook/ai/model_discovery.py | 659 | async def discover_openai_compatible_models() -> List[DiscoveredModel]: | CODE |
| LOW | open_notebook/ai/model_discovery.py | 727 | async def discover_anthropic_compatible_models() -> List[DiscoveredModel]: | CODE |
| LOW | open_notebook/graphs/source_chat.py | 36 | def _source_content_is_available( | CODE |
| LOW | open_notebook/graphs/source_chat.py | 48 | def call_model_with_source_context( | CODE |
| LOW | open_notebook/graphs/source_chat.py | 69 | def _call_model_with_source_context_inner( | CODE |
| LOW | open_notebook/domain/notebook.py | 691 | def content_must_not_be_empty(cls, v): | CODE |
| LOW | tests/test_model_discovery.py | 49 | def test_table_covers_all_openai_compatible_providers(self): | CODE |
| LOW | tests/test_model_discovery.py | 63 | def test_provider_discovery_functions_keys_unchanged(self): | CODE |
| LOW | tests/test_model_discovery.py | 92 | def test_module_level_names_preserved(self): | CODE |
| LOW | tests/test_model_discovery.py | 101 | async def test_discovery_uses_spec_url_and_bearer_key(self, monkeypatch): | CODE |
| LOW | tests/test_model_discovery.py | 130 | async def test_missing_env_key_returns_empty(self, monkeypatch): | CODE |
| LOW | tests/test_model_discovery.py | 135 | async def test_http_error_returns_empty(self, monkeypatch): | CODE |
| LOW | tests/test_model_discovery.py | 147 | async def test_mistral_capabilities_quirk(self, monkeypatch): | CODE |
| LOW | tests/test_model_discovery.py | 173 | async def test_openrouter_quirk_language_and_description(self, monkeypatch): | CODE |
| 526 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .pre-commit-config.yaml | 9 | # ── Basic hygiene ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | .pre-commit-config.yaml | 21 | # ── Ruff: Python lint & format (mirrors CI backend-lint job) ────── | COMMENT |
| MEDIUM | open_notebook/ai/key_provider.py | 22 | # ============================================================================= | COMMENT |
| MEDIUM | open_notebook/ai/key_provider.py | 24 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | open_notebook/ai/model_discovery.py | 344 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | open_notebook/ai/model_discovery.py | 346 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | open_notebook/ai/model_discovery.py | 853 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | open_notebook/ai/model_discovery.py | 855 | # ============================================================================= | COMMENT |
| MEDIUM | open_notebook/ai/model_discovery.py | 40 | # ============================================================================= | COMMENT |
| MEDIUM | open_notebook/ai/model_discovery.py | 42 | # ============================================================================= | COMMENT |
| MEDIUM | open_notebook/ai/model_discovery.py | 225 | # ============================================================================= | COMMENT |
| MEDIUM | open_notebook/ai/model_discovery.py | 227 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/test_utils.py | 143 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_utils.py | 145 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_utils.py | 190 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_utils.py | 192 | # ============================================================================ | COMMENT |
| MEDIUM | tests/test_utils.py | 33 | # ============================================================================ | COMMENT |
| MEDIUM | tests/test_utils.py | 35 | # ============================================================================ | COMMENT |
| MEDIUM | tests/test_utils.py | 260 | # ============================================================================ | COMMENT |
| MEDIUM | tests/test_utils.py | 262 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_graphs.py | 26 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_graphs.py | 28 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_graphs.py | 73 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_graphs.py | 75 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_graphs.py | 101 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_graphs.py | 103 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_graphs.py | 158 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_graphs.py | 160 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_graphs.py | 277 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_graphs.py | 279 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_graphs.py | 530 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_graphs.py | 532 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_chunking.py | 45 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_chunking.py | 47 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_chunking.py | 99 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_chunking.py | 101 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_chunking.py | 189 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_chunking.py | 191 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_chunking.py | 231 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_chunking.py | 233 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_embedding.py | 25 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_embedding.py | 27 | # ============================================================================ | COMMENT |
| MEDIUM | tests/test_embedding.py | 110 | # ============================================================================ | COMMENT |
| MEDIUM | tests/test_embedding.py | 112 | # ============================================================================ | COMMENT |
| MEDIUM | tests/test_embedding.py | 157 | # ============================================================================ | COMMENT |
| MEDIUM | tests/test_embedding.py | 159 | # ============================================================================ | COMMENT |
| MEDIUM | tests/test_embedding.py | 327 | # ============================================================================ | COMMENT |
| MEDIUM | tests/test_embedding.py | 329 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_domain.py | 32 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_domain.py | 34 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_domain.py | 63 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_domain.py | 65 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_domain.py | 81 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_domain.py | 83 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_domain.py | 264 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_domain.py | 266 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_domain.py | 402 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_domain.py | 404 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_domain.py | 442 | # ============================================================================ | COMMENT |
| MEDIUM⚡ | tests/test_domain.py | 444 | # ============================================================================ | COMMENT |
| 52 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | open_notebook/AGENTS.md | 34 | except Exception as e: | CODE |
| LOW | open_notebook/database/async_migrate.py | 47 | except Exception as e: | CODE |
| LOW | open_notebook/database/async_migrate.py | 253 | except Exception as e: | CODE |
| LOW | open_notebook/database/async_migrate.py | 268 | except Exception: | CODE |
| LOW | open_notebook/database/async_migrate.py | 278 | except Exception: | CODE |
| LOW | open_notebook/database/repository.py | 116 | except Exception as e: | CODE |
| LOW | open_notebook/database/repository.py | 137 | except Exception as e: | CODE |
| LOW | open_notebook/database/repository.py | 204 | except Exception as e: | CODE |
| LOW | open_notebook/database/repository.py | 214 | except Exception as e: | CODE |
| LOW | open_notebook/database/repository.py | 240 | except Exception as e: | CODE |
| LOW | open_notebook/utils/runtime_capabilities.py | 34 | except Exception: | CODE |
| LOW⚡ | open_notebook/utils/runtime_capabilities.py | 50 | except Exception: | CODE |
| LOW | open_notebook/utils/chunking.py | 191 | except Exception: | CODE |
| LOW | open_notebook/utils/encryption.py | 55 | except Exception as e: | CODE |
| LOW | open_notebook/utils/encryption.py | 163 | except Exception: | CODE |
| LOW | open_notebook/utils/encryption.py | 196 | except Exception as e: | CODE |
| LOW | open_notebook/utils/embedding.py | 179 | except Exception as e: | CODE |
| LOW | open_notebook/utils/context_builder.py | 295 | except Exception: | CODE |
| LOW | open_notebook/utils/context_builder.py | 306 | except Exception as e: | CODE |
| LOW | open_notebook/utils/context_builder.py | 324 | except Exception as e: | CODE |
| LOW | open_notebook/utils/context_builder.py | 334 | except Exception as e: | CODE |
| LOW | open_notebook/utils/context_builder.py | 347 | except Exception as e: | CODE |
| LOW | open_notebook/utils/context_builder.py | 357 | except Exception as e: | CODE |
| LOW | open_notebook/utils/context_builder.py | 509 | except Exception as e: | CODE |
| LOW | open_notebook/utils/url_validation.py | 107 | except Exception: | CODE |
| LOW | open_notebook/utils/graph_utils.py | 21 | except Exception as e: | CODE |
| LOW | open_notebook/podcasts/models.py | 263 | except Exception: | CODE |
| LOW | open_notebook/podcasts/models.py | 281 | except Exception: | CODE |
| LOW | open_notebook/podcasts/models.py | 314 | except Exception as e: | CODE |
| LOW | open_notebook/ai/models.py | 99 | except Exception as e: | CODE |
| LOW | open_notebook/ai/models.py | 132 | except Exception: | CODE |
| LOW | open_notebook/ai/models.py | 184 | except Exception: | CODE |
| LOW | open_notebook/ai/connection_tester.py | 149 | except Exception as e: | CODE |
| LOW | open_notebook/ai/connection_tester.py | 194 | except Exception as e: | CODE |
| LOW | open_notebook/ai/connection_tester.py | 245 | except Exception as e: | CODE |
| LOW | open_notebook/ai/connection_tester.py | 298 | except Exception as e: | CODE |
| LOW | open_notebook/ai/connection_tester.py | 529 | except Exception: | CODE |
| LOW | open_notebook/ai/connection_tester.py | 561 | except Exception as e: | CODE |
| LOW | open_notebook/ai/key_provider.py | 97 | except Exception as e: | CODE |
| LOW⚡ | open_notebook/ai/model_discovery.py | 847 | except Exception as e: | CODE |
| LOW⚡ | open_notebook/ai/model_discovery.py | 943 | except Exception as e: | CODE |
| LOW | open_notebook/ai/model_discovery.py | 315 | except Exception as e: | CODE |
| LOW | open_notebook/ai/model_discovery.py | 391 | except Exception as e: | CODE |
| LOW | open_notebook/ai/model_discovery.py | 443 | except Exception as e: | CODE |
| LOW | open_notebook/ai/model_discovery.py | 483 | except Exception as e: | CODE |
| LOW | open_notebook/ai/model_discovery.py | 639 | except Exception as e: | CODE |
| LOW | open_notebook/ai/model_discovery.py | 675 | except Exception as e: | CODE |
| LOW | open_notebook/ai/model_discovery.py | 721 | except Exception as e: | CODE |
| LOW | open_notebook/ai/model_discovery.py | 738 | except Exception as e: | CODE |
| LOW | open_notebook/ai/model_discovery.py | 782 | except Exception as e: | CODE |
| LOW | open_notebook/ai/model_discovery.py | 809 | except Exception as e: | CODE |
| LOW | open_notebook/ai/model_discovery.py | 965 | except Exception as e: | CODE |
| LOW | open_notebook/graphs/transformation.py | 68 | except Exception as e: | CODE |
| LOW | open_notebook/graphs/ask.py | 80 | except Exception as e: | CODE |
| LOW | open_notebook/graphs/ask.py | 124 | except Exception as e: | CODE |
| LOW | open_notebook/graphs/ask.py | 143 | except Exception as e: | CODE |
| LOW | open_notebook/graphs/source_chat.py | 64 | except Exception as e: | CODE |
| LOW | open_notebook/graphs/chat.py | 83 | except Exception as e: | CODE |
| LOW | open_notebook/graphs/source.py | 104 | except Exception as e: | CODE |
| LOW | open_notebook/graphs/source.py | 122 | except Exception as e: | CODE |
| 214 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | README.md | 105 | ### Step 1: Get docker-compose.yml | COMMENT |
| LOW⚡ | README.md | 167 | ### Step 2: Set Your Encryption Key | COMMENT |
| LOW⚡ | README.md | 174 | ### Step 3: Start Services | COMMENT |
| LOW⚡ | README.md | 181 | ### Step 4: Configure AI Provider | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 180 | // Step 1: Find ALL references using simple greedy pattern. | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 210 | // Step 2: Process references from end to start (to preserve indices) | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 218 | // Step 3: Analyze context around the reference | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 258 | // Step 4: Build the markdown link | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 262 | // Step 5: Replace in the result string | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 349 | // Step 1: Parse all references using existing function | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 352 | // Step 2: If no references found, return original text | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 357 | // Step 3: Build reference map (deduplicate and assign numbers) | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 408 | // Step 5: Build reference list | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 417 | // Step 6: Append reference list to result | COMMENT |
| LOW | frontend/src/lib/utils/source-references.tsx | 372 | // Step 4: Replace references with numbered citations (process from end to start) | COMMENT |
| LOW | docs/7-DEVELOPMENT/development-setup.md | 16 | ## Step 1: Clone and Initial Setup | COMMENT |
| LOW | docs/7-DEVELOPMENT/development-setup.md | 27 | ## Step 2: Install Python Dependencies | COMMENT |
| LOW | docs/7-DEVELOPMENT/development-setup.md | 37 | ## Step 3: Environment Variables | COMMENT |
| LOW | docs/7-DEVELOPMENT/development-setup.md | 86 | ## Step 4: Start SurrealDB | COMMENT |
| LOW | docs/7-DEVELOPMENT/development-setup.md | 125 | ## Step 5: Run Database Migrations | COMMENT |
| LOW | docs/7-DEVELOPMENT/development-setup.md | 144 | ## Step 6: Start the API Server | COMMENT |
| LOW | docs/7-DEVELOPMENT/development-setup.md | 172 | ## Step 7: Start the Frontend (Optional) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-local.md | 17 | ## Step 1: Choose Your Setup (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-local.md | 27 | ## Step 2: Create Configuration (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-local.md | 93 | ## Step 3: Start Services (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-local.md | 105 | ## Step 4: Download a Model (2-3 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-local.md | 124 | ## Step 5: Access Open Notebook (instant) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-local.md | 135 | ## Step 6: Configure Ollama Provider (1 min) | COMMENT |
| LOW⚡ | docs/0-START-HERE/quick-start-local.md | 148 | ## Step 7: Configure Local Model (1 min) | COMMENT |
| LOW⚡ | docs/0-START-HERE/quick-start-local.md | 158 | ## Step 8: Create Your First Notebook (1 min) | COMMENT |
| LOW⚡ | docs/0-START-HERE/quick-start-local.md | 166 | ## Step 9: Add Local Content (1 min) | COMMENT |
| LOW⚡ | docs/0-START-HERE/quick-start-local.md | 175 | ## Step 10: Chat With Your Content (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-cloud.md | 20 | ## Step 1: Create Configuration (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-cloud.md | 65 | ## Step 2: Start Services (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-cloud.md | 77 | ## Step 3: Access Open Notebook (instant) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-cloud.md | 88 | ## Step 4: Configure Your AI Provider (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-cloud.md | 104 | ## Step 5: Configure Your Model (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-cloud.md | 122 | ## Step 6: Create Your First Notebook (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-cloud.md | 130 | ## Step 7: Add Content & Chat (2 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-openai.md | 17 | ## Step 1: Create Configuration (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-openai.md | 63 | ## Step 2: Start Services (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-openai.md | 75 | ## Step 3: Access Open Notebook (instant) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-openai.md | 86 | ## Step 4: Configure Your OpenAI Provider (1 min) | COMMENT |
| LOW⚡ | docs/0-START-HERE/quick-start-openai.md | 101 | ## Step 5: Create Your First Notebook (1 min) | COMMENT |
| LOW⚡ | docs/0-START-HERE/quick-start-openai.md | 109 | ## Step 6: Add a Source (1 min) | COMMENT |
| LOW⚡ | docs/0-START-HERE/quick-start-openai.md | 119 | ## Step 7: Chat With Your Content (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-external-ollama.md | 22 | ## Step 1: Start Ollama (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-external-ollama.md | 40 | ## Step 2: Create Configuration (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-external-ollama.md | 86 | ## Step 3: Connect Open Notebook to Host Ollama (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-external-ollama.md | 98 | ## Step 4: Start Open Notebook (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-external-ollama.md | 110 | ## Step 5: Configure Ollama Provider (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-external-ollama.md | 125 | ## Step 6: Configure Models (1 min) | COMMENT |
| LOW | docs/0-START-HERE/quick-start-external-ollama.md | 135 | ## Step 7: Access Open Notebook (instant) | COMMENT |
| LOW | docs/1-INSTALLATION/docker-compose.md | 13 | ## Step 1: Get docker-compose.yml (1 min) | COMMENT |
| LOW | docs/1-INSTALLATION/docker-compose.md | 88 | ## Step 2: Start Services (2 min) | COMMENT |
| LOW | docs/1-INSTALLATION/docker-compose.md | 109 | ## Step 3: Verify Installation (1 min) | COMMENT |
| LOW | docs/1-INSTALLATION/docker-compose.md | 127 | ## Step 4: Configure AI Provider (2 min) | COMMENT |
| LOW | docs/1-INSTALLATION/docker-compose.md | 147 | ## Step 5: First Notebook (2 min) | COMMENT |
| LOW | docs/5-CONFIGURATION/local-tts.md | 28 | ### Step 1: Create Docker Compose File | COMMENT |
| LOW | docs/5-CONFIGURATION/local-tts.md | 47 | ### Step 2: Start and Download Model | COMMENT |
| 64 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | open_notebook/utils/version_utils.py | 60 | Fetch and parse the version from pyproject.toml in a public GitHub repository. Args: repo_url (str): U | STRING |
| HIGH | open_notebook/utils/version_utils.py | 114 | Get the version of an installed package. Args: package_name (str): Name of the installed package | STRING |
| HIGH | open_notebook/utils/encryption.py | 129 | Encrypt a string value using Fernet symmetric encryption. Args: value: The plain text string to encryp | STRING |
| HIGH | open_notebook/utils/encryption.py | 168 | Decrypt a Fernet-encrypted string value. Handles graceful fallback for legacy unencrypted data. Args: | STRING |
| HIGH | open_notebook/utils/embedding.py | 51 | Combine multiple embeddings into a single embedding using mean pooling. Algorithm: 1. Normalize each embed | STRING |
| HIGH | open_notebook/utils/embedding.py | 109 | Generate embeddings for multiple texts with automatic batching and retry. Texts are split into batches of EMBE | STRING |
| HIGH | open_notebook/utils/embedding.py | 210 | Generate a single embedding for text, handling large content via chunking and mean pooling. For short text (<= | STRING |
| HIGH | open_notebook/domain/notebook.py | 579 | Submit insight creation as an async command (fire-and-forget). Submits a create_insight command that h | STRING |
| HIGH | docs/7-DEVELOPMENT/code-standards.md | 79 | Perform vector search across embedded content. Args: query: Search query string limit: Maximum numb | STRING |
| HIGH | docs/7-DEVELOPMENT/code-standards.md | 131 | Create a new notebook with validation. Args: name: The notebook name (required, non-empty) descript | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | open_notebook/domain/notebook.py | 793 | # Both search paths failed (e.g. no embedding model configured). | COMMENT |
| MEDIUM | open_notebook/domain/credential.py | 79 | # Ollama-only: overrides the context window (num_ctx). Esperanto defaults to | COMMENT |
| MEDIUM | open_notebook/domain/credential.py | 80 | # 8192; raise this if your hardware can handle a larger context window. | COMMENT |
| MEDIUM | tests/test_crud_404.py | 125 | mock_embed_model.return_value = MagicMock() # an embedding model is configured | CODE |
| MEDIUM | docs/2-CORE-CONCEPTS/index.md | 14 | ### 2. [AI Context & RAG](ai-context-rag.md) | COMMENT |
| MEDIUM | docs/2-CORE-CONCEPTS/ai-context-rag.md | 1 | # AI Context & RAG - How Open Notebook Uses Your Research | COMMENT |
| MEDIUM | docs/2-CORE-CONCEPTS/ai-context-rag.md | 40 | ## How RAG Works: Three Stages | COMMENT |
| MEDIUM | docs/2-CORE-CONCEPTS/ai-context-rag.md | 272 | ### Chat: Full-Content Context (NO RAG) | COMMENT |
| MEDIUM | docs/2-CORE-CONCEPTS/ai-context-rag.md | 311 | ### Ask: RAG - Automatic Retrieval | COMMENT |
| MEDIUM | docs/2-CORE-CONCEPTS/ai-context-rag.md | 437 | ### Ask (RAG) | COMMENT |
| MEDIUM | docs/5-CONFIGURATION/ollama.md | 36 | ollama pull mxbai-embed-large # Best embedding model for Ollama | CODE |
| MEDIUM | api/routers/embedding.py | 20 | # Check if embedding model is available | COMMENT |
| MEDIUM | api/routers/search.py | 26 | # Check if embedding model is available for vector search | COMMENT |
| MEDIUM | api/routers/search.py | 148 | # Check if embedding model is available | COMMENT |
| MEDIUM | api/routers/search.py | 202 | # Check if embedding model is available | COMMENT |
| MEDIUM | commands/embedding_commands.py | 635 | # Check embedding model availability (fail fast) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 180 | // Step 1: Find ALL references using simple greedy pattern. | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 210 | // Step 2: Process references from end to start (to preserve indices) | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 218 | // Step 3: Analyze context around the reference | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 258 | // Step 4: Build the markdown link | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 262 | // Step 5: Replace in the result string | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 349 | // Step 1: Parse all references using existing function | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 352 | // Step 2: If no references found, return original text | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 357 | // Step 3: Build reference map (deduplicate and assign numbers) | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 408 | // Step 5: Build reference list | COMMENT |
| LOW⚡ | frontend/src/lib/utils/source-references.tsx | 417 | // Step 6: Append reference list to result | COMMENT |
| LOW | frontend/src/lib/utils/source-references.tsx | 372 | // Step 4: Replace references with numbered citations (process from end to start) | COMMENT |
| LOW | .codex/agents/harness-qa.toml | 24 | ## Step 0: Static Checks Gate (MANDATORY) | COMMENT |
| LOW⚡ | .codex/agents/harness-qa.toml | 36 | ## Step 1: Understand What to Test | COMMENT |
| LOW⚡ | .codex/agents/harness-qa.toml | 46 | ## Step 2: Choose the Right Testing Approach | COMMENT |
| LOW⚡ | .codex/agents/harness-qa.toml | 112 | ## Step 3: Write Your Verdict | COMMENT |
| LOW⚡ | .codex/agents/harness-qa.toml | 129 | ## Step 4: Update .harness/feature_list.json | COMMENT |
| LOW⚡ | .codex/agents/harness-qa.toml | 135 | ## Step 5: Summary | COMMENT |
| LOW⚡ | .codex/agents/smoke-e2e.toml | 205 | # Step 1: Create session | COMMENT |
| LOW⚡ | .codex/agents/smoke-e2e.toml | 214 | # Step 2: Build context for the notebook | COMMENT |
| LOW⚡ | .codex/agents/smoke-e2e.toml | 223 | # Step 3: Send message with context | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | open_notebook/utils/encryption.py | 29 | CODE | |
| LOW | open_notebook/utils/text_utils.py | 122 | CODE | |
| LOW | open_notebook/utils/embedding.py | 106 | CODE | |
| LOW | open_notebook/utils/context_builder.py | 42 | CODE | |
| LOW | open_notebook/utils/context_builder.py | 264 | CODE | |
| LOW | open_notebook/utils/context_builder.py | 364 | CODE | |
| LOW | open_notebook/ai/models.py | 177 | CODE | |
| LOW | open_notebook/ai/models.py | 330 | CODE | |
| LOW | open_notebook/ai/connection_tester.py | 86 | CODE | |
| LOW | open_notebook/ai/connection_tester.py | 153 | CODE | |
| LOW | open_notebook/ai/connection_tester.py | 198 | CODE | |
| LOW | open_notebook/ai/connection_tester.py | 249 | CODE | |
| LOW | open_notebook/ai/connection_tester.py | 479 | CODE | |
| LOW | open_notebook/ai/key_provider.py | 273 | CODE | |
| LOW | open_notebook/ai/model_discovery.py | 407 | CODE | |
| LOW | open_notebook/domain/provider_config.py | 198 | CODE | |
| LOW | open_notebook/domain/notebook.py | 70 | CODE | |
| LOW | open_notebook/domain/notebook.py | 211 | CODE | |
| LOW | open_notebook/domain/credential.py | 176 | CODE | |
| LOW | open_notebook/domain/base.py | 40 | CODE | |
| LOW | open_notebook/domain/base.py | 148 | CODE | |
| LOW | open_notebook/domain/base.py | 284 | CODE | |
| LOW | tests/test_max_body_size_middleware.py | 86 | CODE | |
| LOW | api/credentials_service.py | 119 | CODE | |
| LOW | api/credentials_service.py | 242 | CODE | |
| LOW | api/credentials_service.py | 380 | CODE | |
| LOW | api/credentials_service.py | 753 | CODE | |
| LOW | api/credentials_service.py | 861 | CODE | |
| LOW | api/routers/models.py | 388 | CODE | |
| LOW | api/routers/models.py | 707 | CODE | |
| LOW | api/routers/transformations.py | 210 | CODE | |
| LOW | api/routers/embedding.py | 17 | CODE | |
| LOW | api/routers/credentials.py | 306 | CODE | |
| LOW | api/routers/podcasts.py | 178 | CODE | |
| LOW | api/routers/source_chat.py | 130 | CODE | |
| LOW | api/routers/source_chat.py | 332 | CODE | |
| LOW | api/routers/sources.py | 258 | CODE | |
| LOW | api/routers/sources.py | 427 | CODE | |
| LOW | api/routers/sources.py | 844 | CODE | |
| LOW | api/routers/sources.py | 935 | CODE | |
| LOW | api/routers/embedding_rebuild.py | 20 | CODE | |
| LOW | api/routers/search.py | 69 | CODE | |
| LOW | api/routers/notebooks.py | 62 | CODE | |
| LOW | api/routers/languages.py | 38 | CODE | |
| LOW | api/routers/commands.py | 142 | CODE | |
| LOW | commands/podcast_commands.py | 66 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_search_api.py | 0 | create test client after environment variables have been cleared by conftest. | STRING |
| HIGH | tests/test_recently_viewed_api.py | 0 | create test client after environment variables have been cleared by conftest. | STRING |
| HIGH | tests/test_sources_api.py | 0 | create test client after environment variables have been cleared by conftest. | STRING |
| HIGH | tests/test_models_api.py | 0 | create test client after environment variables have been cleared by conftest. | STRING |
| HIGH | tests/test_credentials_api.py | 0 | create test client after environment variables have been cleared by conftest. | STRING |
| HIGH | tests/test_notes_api.py | 0 | create test client after environment variables have been cleared by conftest. | STRING |
| HIGH | tests/test_insight_timestamps.py | 0 | create test client after environment variables have been cleared by conftest. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | open_notebook/utils/context_builder.py | 17 | CODE | |
| LOW | open_notebook/utils/__init__.py | 12 | CODE | |
| LOW | open_notebook/utils/__init__.py | 12 | CODE | |
| LOW | open_notebook/utils/__init__.py | 12 | CODE | |
| LOW | open_notebook/utils/__init__.py | 12 | CODE | |
| LOW | open_notebook/utils/__init__.py | 12 | CODE | |
| LOW | open_notebook/utils/__init__.py | 12 | CODE | |
| LOW | open_notebook/utils/__init__.py | 20 | CODE | |
| LOW | open_notebook/utils/__init__.py | 20 | CODE | |
| LOW | open_notebook/utils/__init__.py | 20 | CODE | |
| LOW | open_notebook/utils/__init__.py | 25 | CODE | |
| LOW | open_notebook/utils/__init__.py | 25 | CODE | |
| LOW | open_notebook/utils/__init__.py | 29 | CODE | |
| LOW | open_notebook/utils/__init__.py | 30 | CODE | |
| LOW | open_notebook/utils/__init__.py | 30 | CODE | |
| LOW | open_notebook/utils/__init__.py | 30 | CODE | |
| LOW | open_notebook/utils/__init__.py | 30 | CODE | |
| LOW | open_notebook/utils/__init__.py | 36 | CODE | |
| LOW | open_notebook/utils/__init__.py | 36 | CODE | |
| LOW | open_notebook/utils/__init__.py | 37 | CODE | |
| LOW | open_notebook/utils/__init__.py | 37 | CODE | |
| LOW | open_notebook/utils/__init__.py | 37 | CODE | |
| LOW | tests/test_podcast_legacy_field_removal.py | 109 | CODE | |
| LOW | api/command_service.py | 22 | CODE | |
| LOW | api/credentials_service.py | 31 | CODE | |
| LOW | api/podcast_service.py | 91 | CODE | |
| LOW | api/routers/embedding.py | 43 | CODE | |
| LOW | api/routers/sources.py | 511 | CODE | |
| LOW | api/routers/sources.py | 576 | CODE | |
| LOW | api/routers/sources.py | 1000 | CODE | |
| LOW | api/routers/embedding_rebuild.py | 35 | CODE | |
| LOW | commands/__init__.py | 11 | CODE | |
| LOW | commands/__init__.py | 11 | CODE | |
| LOW | commands/__init__.py | 11 | CODE | |
| LOW | commands/__init__.py | 11 | CODE | |
| LOW | commands/__init__.py | 17 | CODE | |
| LOW | commands/__init__.py | 18 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | cubic.yaml | 1 | # yaml-language-server: $schema=https://cubic.dev/schema/cubic-repository-config.schema.json | COMMENT |
| LOW | .pre-commit-config.yaml | 21 | # ── Ruff: Python lint & format (mirrors CI backend-lint job) ────── | COMMENT |
| LOW | docker-compose.yml | 1 | services: | COMMENT |
| LOW | frontend/src/components/ui/markdown-editor.tsx | 21 | // (e.g. pasted content, or an AI-generated note echoing an indirect prompt | COMMENT |
| LOW | frontend/src/components/sources/SourceCard.tsx | 121 | onContextModeChange | COMMENT |
| LOW | open_notebook/config.py | 21 | # TIKTOKEN CACHE FOLDER | COMMENT |
| LOW | open_notebook/podcasts/__init__.py | 1 | # Podcasts module | COMMENT |
| LOW | open_notebook/ai/__init__.py | 1 | # AI infrastructure module | COMMENT |
| LOW | tests/test_podcast_audio_paths.py | 141 | # Percent-encoded file:// URIs cannot be URL-decoded in SurrealQL and | COMMENT |
| LOW | .agents/skills/release/runbook.md | 21 | ``` | COMMENT |
| LOW | docs/6-TROUBLESHOOTING/connection-issues.md | 61 | COMMENT | |
| LOW | docs/6-TROUBLESHOOTING/quick-fixes.md | 121 | **Solution (1 minute):** | COMMENT |
| LOW | docs/6-TROUBLESHOOTING/quick-fixes.md | 181 | **Solution (1 minute):** | COMMENT |
| LOW | examples/docker-compose-speaches.yml | 1 | # Docker Compose with Speaches (Local TTS/STT) | COMMENT |
| LOW | examples/docker-compose-speaches.yml | 81 | # For TTS (Text-to-Speech): | COMMENT |
| LOW | examples/docker-compose-speaches.yml | 101 | # 6. Add TTS Model: | COMMENT |
| LOW | examples/docker-compose-speaches.yml | 121 | # Test STT: | COMMENT |
| LOW | examples/docker-compose-ollama.yml | 1 | # Docker Compose with Ollama (Free Local AI) | COMMENT |
| LOW | examples/docker-compose-full-local.yml | 1 | # Docker Compose - 100% Local AI Setup | COMMENT |
| LOW | examples/docker-compose-full-local.yml | 101 | hf-hub-cache: | COMMENT |
| LOW | examples/docker-compose-full-local.yml | 121 | # | COMMENT |
| LOW | examples/docker-compose-full-local.yml | 141 | # 3. Discover Speech Models: | COMMENT |
| LOW | examples/docker-compose-full-local.yml | 161 | # For TTS: | COMMENT |
| LOW | examples/docker-compose-full-local.yml | 181 | # - 50 GB disk space | COMMENT |
| LOW | examples/docker-compose-single.yml | 21 | # Access: | COMMENT |
| LOW | scripts/docker-entrypoint.sh | 1 | #!/bin/sh | COMMENT |
| LOW | scripts/release-test/rc-stack.sh | 1 | #!/bin/bash | COMMENT |
| LOW | scripts/release-test/release-image-test.sh | 1 | #!/bin/bash | COMMENT |
| LOW | api/main.py | 261 | # | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | open_notebook/utils/embedding.py | 240 | # Check if chunking is needed | COMMENT |
| LOW⚡ | open_notebook/ai/model_discovery.py | 950 | # Check if model already exists using pre-fetched data | COMMENT |
| LOW | .github/workflows/build-dev.yml | 66 | # Check if this is a push to main (not a PR) | COMMENT |
| LOW | api/credentials_service.py | 779 | # Check if a credential already exists for this provider with same name | COMMENT |
| LOW⚡ | api/podcast_service.py | 167 | # Check if profiles already exist | COMMENT |
| LOW⚡ | api/podcast_service.py | 188 | # Check if profiles already exist | COMMENT |
| LOW | api/routers/config.py | 53 | # Check if cache is still valid (within TTL) | COMMENT |
| LOW | api/routers/embedding.py | 20 | # Check if embedding model is available | COMMENT |
| LOW | api/routers/sources.py | 852 | # Check if this is a legacy source (no command) | COMMENT |
| LOW | api/routers/sources.py | 943 | # Check if source already has a running command | COMMENT |
| LOW | api/routers/sources.py | 990 | # Check if it's a text source by trying to get full_text | COMMENT |
| LOW | api/routers/search.py | 26 | # Check if embedding model is available for vector search | COMMENT |
| LOW | api/routers/search.py | 148 | # Check if embedding model is available | COMMENT |
| LOW | api/routers/search.py | 202 | # Check if embedding model is available | COMMENT |
| LOW | api/routers/notebooks.py | 354 | # Check if reference already exists (idempotency) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | open_notebook/ai/model_discovery.py | 939 | # Create a set of (name, type) tuples for O(1) lookup | COMMENT |
| MEDIUM | open_notebook/graphs/source_chat.py | 221 | # Create the StateGraph | COMMENT |
| MEDIUM | open_notebook/graphs/source.py | 284 | # Define the graph edges | COMMENT |
| MEDIUM | open_notebook/domain/credential.py | 193 | # Create a minimal credential with error info from raw DB fields | COMMENT |
| MEDIUM | tests/test_domain.py | 290 | # Create a temporary file | COMMENT |
| MEDIUM | commands/podcast_commands.py | 257 | # Create the record for the episode and associate with the ongoing command | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | frontend/src/components/ui/markdown-editor.tsx | 21 | // (e.g. pasted content, or an AI-generated note echoing an indirect prompt | COMMENT |
| HIGH | frontend/src/components/ui/markdown-editor.test.tsx | 9 | // default). Notes can hold AI-generated content that echoes an indirect | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | frontend/src/lib/api/source-chat.ts | 54 | // Use relative URL to leverage Next.js rewrites | COMMENT |
| MEDIUM | frontend/src/lib/api/search.ts | 17 | // Use relative URL to leverage Next.js rewrites | COMMENT |
| MEDIUM⚡ | .codex/agents/harness-qa.toml | 119 | ## Feature: "[description from .harness/feature_list.json]" | COMMENT |
| MEDIUM⚡ | .codex/agents/harness-qa.toml | 129 | ## Step 4: Update .harness/feature_list.json | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | examples/docker-compose-speaches.yml | 13 | # Usage: | COMMENT |
| LOW | examples/docker-compose-ollama.yml | 6 | # Usage: | COMMENT |
| LOW | examples/docker-compose-full-local.yml | 16 | # Usage: | COMMENT |
| LOW | scripts/release-test/rc-stack.sh | 6 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | open_notebook/utils/__init__.py | 43 | __all__ = [ | CODE |
| LOW | scripts/export_docs.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | commands/__init__.py | 20 | __all__ = [ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | open_notebook/domain/provider_config.py | 51 | CODE | |
| LOW | api/auth.py | 82 | CODE | |
| LOW | api/routers/sources.py | 186 | CODE |