AI conversations that actually remember. Never re-explain your project to your AI again. Join our Discord: https://discord.gg/tyvKNccgqN
This report summarizes scanner evidence for basicmachines-co/basic-memory, a Python project with 4,132 GitHub stars. SynthScan examined 461,120 lines of code across 1652 source files, recording 11485 pattern matches distributed across 24 syntactic categories. The legacy adjusted pattern signal is 28.1 (Elevated pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 9690 finding(s).
Are imports declared and package/API names verified? 1036 finding(s).
Are wrappers, guards, and repeated structures necessary? 9652 finding(s).
Which changes need focused human review? 11485 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 11485 distinct pattern matches across 24 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | plugins/claude-code/hooks/test_claude_session_start.py | 61 | def test_bm_bin_launcher_receives_verb_and_stdin( | CODE |
| LOW | plugins/claude-code/hooks/test_claude_session_start.py | 78 | def test_project_dir_env_plumbs_through(recorder: tuple[str, Path]) -> None: | CODE |
| LOW⚡ | plugins/claude-code/hooks/test_claude_session_start.py | 102 | def test_unresolvable_bm_bin_fails_open(tmp_path: Path) -> None: | CODE |
| LOW⚡ | plugins/claude-code/hooks/test_claude_session_start.py | 108 | def test_in_process_cli_fails_open_with_empty_home(tmp_path: Path) -> None: | CODE |
| LOW⚡ | plugins/claude-code/hooks/test_claude_session_start.py | 118 | def test_dependency_floor_matches_package_version() -> None: | CODE |
| LOW⚡ | plugins/claude-code/hooks/test_claude_session_start.py | 127 | def test_metadata_block_shape() -> None: | CODE |
| LOW | plugins/claude-code/hooks/test_claude_pre_compact.py | 61 | def test_bm_bin_launcher_receives_verb_and_stdin( | CODE |
| LOW | plugins/claude-code/hooks/test_claude_pre_compact.py | 78 | def test_project_dir_env_plumbs_through(recorder: tuple[str, Path]) -> None: | CODE |
| LOW⚡ | plugins/claude-code/hooks/test_claude_pre_compact.py | 102 | def test_unresolvable_bm_bin_fails_open(tmp_path: Path) -> None: | CODE |
| LOW⚡ | plugins/claude-code/hooks/test_claude_pre_compact.py | 108 | def test_in_process_cli_fails_open_with_empty_home(tmp_path: Path) -> None: | CODE |
| LOW⚡ | plugins/claude-code/hooks/test_claude_pre_compact.py | 118 | def test_dependency_floor_matches_package_version() -> None: | CODE |
| LOW⚡ | plugins/claude-code/hooks/test_claude_pre_compact.py | 127 | def test_metadata_block_shape() -> None: | CODE |
| LOW | plugins/codex/hooks/test_codex_pre_compact.py | 17 | def test_script_fails_open_with_empty_home(tmp_path: Path) -> None: | CODE |
| LOW | plugins/codex/hooks/test_codex_pre_compact.py | 34 | def test_dependency_is_pinned_to_a_basic_memory_git_ref() -> None: | CODE |
| LOW | plugins/codex/hooks/test_codex_pre_compact.py | 40 | def test_metadata_and_command_shape() -> None: | CODE |
| LOW | plugins/codex/hooks/test_codex_session_start.py | 17 | def test_script_fails_open_with_empty_home(tmp_path: Path) -> None: | CODE |
| LOW | plugins/codex/hooks/test_codex_session_start.py | 34 | def test_dependency_is_pinned_to_a_basic_memory_git_ref() -> None: | CODE |
| LOW | plugins/codex/hooks/test_codex_session_start.py | 40 | def test_metadata_and_command_shape() -> None: | CODE |
| LOW | tests/test_config_load_side_effects.py | 13 | def test_existing_config_load_does_not_create_default_project_directory( | CODE |
| LOW | tests/test_config_load_side_effects.py | 55 | def test_existing_config_load_keeps_environment_precedence( | CODE |
| LOW⚡ | tests/test_coerce.py | 15 | def test_native_list_passthrough(self): | CODE |
| LOW⚡ | tests/test_coerce.py | 21 | def test_single_string_wrapped(self): | CODE |
| LOW⚡ | tests/test_coerce.py | 24 | def test_non_json_string_wrapped(self): | CODE |
| LOW⚡ | tests/test_coerce.py | 27 | def test_json_object_string_wrapped(self): | CODE |
| LOW⚡ | tests/test_coerce.py | 39 | def test_none_parses_to_empty_list(self): | CODE |
| LOW⚡ | tests/test_coerce.py | 45 | def test_list_with_comma_element_splits(self): | CODE |
| LOW⚡ | tests/test_coerce.py | 48 | def test_plain_list_passthrough(self): | CODE |
| LOW⚡ | tests/test_coerce.py | 54 | def test_int_passthrough_for_pydantic_rejection(self): | CODE |
| LOW⚡ | tests/test_coerce.py | 58 | def test_dict_passthrough_for_pydantic_rejection(self): | CODE |
| LOW⚡ | tests/test_coerce.py | 62 | def test_int_list_passthrough_for_pydantic_rejection(self): | CODE |
| LOW⚡ | tests/test_coerce.py | 67 | def test_dict_list_passthrough_for_pydantic_rejection(self): | CODE |
| LOW⚡ | tests/test_coerce.py | 71 | def test_mixed_list_passthrough_for_pydantic_rejection(self): | CODE |
| LOW⚡ | tests/test_coerce.py | 76 | def test_json_array_string_with_int_passthrough_for_pydantic_rejection(self): | CODE |
| LOW⚡ | tests/test_coerce.py | 81 | def test_json_array_string_with_dict_passthrough_for_pydantic_rejection(self): | CODE |
| LOW⚡ | tests/test_coerce.py | 85 | def test_json_array_string_mixed_passthrough_for_pydantic_rejection(self): | CODE |
| LOW⚡ | tests/test_coerce.py | 90 | def test_json_array_string_all_strings_still_parses(self): | CODE |
| LOW⚡ | tests/test_coerce.py | 100 | def test_native_dict_passthrough(self): | CODE |
| LOW⚡ | tests/test_coerce.py | 106 | def test_non_json_string_passthrough(self): | CODE |
| LOW⚡ | tests/test_coerce.py | 110 | def test_json_array_string_passthrough(self): | CODE |
| LOW⚡ | tests/test_coerce.py | 123 | def test_none_returns_empty_list(self): | CODE |
| LOW⚡ | tests/test_coerce.py | 128 | def test_single_string_wraps_as_one_element(self): | CODE |
| LOW⚡ | tests/test_coerce.py | 135 | def test_comma_string_with_spaces_strips(self): | CODE |
| LOW⚡ | tests/test_coerce.py | 143 | def test_json_array_string_single_element(self): | CODE |
| LOW⚡ | tests/test_coerce.py | 146 | def test_json_array_string_with_comma_elements(self): | CODE |
| LOW⚡ | tests/test_coerce.py | 152 | def test_plain_list_passthrough(self): | CODE |
| LOW⚡ | tests/test_coerce.py | 155 | def test_list_with_comma_element_splits(self): | CODE |
| LOW⚡ | tests/test_coerce.py | 159 | def test_list_with_multiple_comma_elements(self): | CODE |
| LOW⚡ | tests/test_coerce.py | 164 | def test_hash_prefix_preserved(self): | CODE |
| LOW⚡ | tests/test_coerce.py | 168 | def test_hash_prefix_in_comma_string_preserved(self): | CODE |
| LOW⚡ | tests/test_coerce.py | 173 | def test_int_passthrough_for_pydantic_rejection(self): | CODE |
| LOW⚡ | tests/test_coerce.py | 176 | def test_dict_passthrough_for_pydantic_rejection(self): | CODE |
| LOW⚡ | tests/test_coerce.py | 182 | def test_int_list_passthrough_for_pydantic_rejection(self): | CODE |
| LOW⚡ | tests/test_coerce.py | 187 | def test_mixed_list_passthrough_for_pydantic_rejection(self): | CODE |
| LOW⚡ | tests/test_coerce.py | 192 | def test_dict_list_passthrough_for_pydantic_rejection(self): | CODE |
| LOW | tests/conftest.py | 110 | def _configured_postgres_sync_url() -> str | None: | CODE |
| LOW | tests/conftest.py | 151 | def _resolve_postgres_sync_url(postgres_container) -> str: | CODE |
| LOW | tests/conftest.py | 160 | async def _reset_postgres_test_schema(engine: AsyncEngine, async_url: str) -> None: | CODE |
| LOW | tests/conftest.py | 235 | def suppress_logfire_no_config_warning(monkeypatch) -> None: | CODE |
| LOW | tests/conftest.py | 262 | async def cleanup_global_db_after_test() -> AsyncGenerator[None, None]: | CODE |
| LOW | tests/test_claude_issue_triage.py | 123 | def test_git_bash_candidates_include_launcher_for_mingw_git() -> None: | CODE |
| 8783 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_man_pages.py | 3 | CODE | |
| LOW | tests/test_rclone_commands.py | 3 | CODE | |
| LOW | tests/test_update_versions.py | 1 | CODE | |
| LOW | tests/test_semantic_vector_index_migration.py | 3 | CODE | |
| LOW | tests/test_telemetry.py | 3 | CODE | |
| LOW | tests/test_read_load_bench.py | 1 | CODE | |
| LOW | tests/repository/test_pgvector_index.py | 3 | CODE | |
| LOW | tests/repository/test_project_partition_repository.py | 3 | CODE | |
| LOW | …epository/test_vector_manifest_generation_ownership.py | 3 | CODE | |
| LOW | tests/repository/test_milvus_index.py | 3 | CODE | |
| LOW | tests/repository/test_milvus_repository.py | 3 | CODE | |
| LOW | tests/repository/test_semantic_vector_index.py | 3 | CODE | |
| LOW | tests/repository/test_milvus_config.py | 3 | CODE | |
| LOW | tests/runtime/test_note_move_destination.py | 1 | CODE | |
| LOW | tests/runtime/test_note_content_read_planning.py | 1 | CODE | |
| LOW | tests/runtime/test_accepted_note_write_guards.py | 1 | CODE | |
| LOW | tests/runtime/test_pending_note_materialization.py | 1 | CODE | |
| LOW | tests/runtime/test_deleted_note_file_checksum.py | 1 | CODE | |
| LOW | tests/runtime/test_project_partition.py | 3 | CODE | |
| LOW | tests/runtime/test_deleted_note_response.py | 1 | CODE | |
| LOW | tests/document_ingestion/test_markitdown_worker.py | 3 | CODE | |
| LOW | tests/document_ingestion/test_csv_extractor.py | 3 | CODE | |
| LOW | tests/document_ingestion/test_raw_document.py | 3 | CODE | |
| LOW | tests/document_ingestion/test_pdf_inspector_worker.py | 3 | CODE | |
| LOW | tests/document_ingestion/office_fixtures.py | 8 | CODE | |
| LOW | tests/document_ingestion/test_local_runtime.py | 3 | CODE | |
| LOW | tests/document_ingestion/test_markitdown_extractor.py | 3 | CODE | |
| LOW | tests/document_ingestion/test_legacy_sidecars.py | 9 | CODE | |
| LOW | tests/document_ingestion/test_pdf_inspector.py | 3 | CODE | |
| LOW | tests/document_ingestion/test_document_extractors.py | 3 | CODE | |
| LOW | tests/document_ingestion/process_fakes.py | 3 | CODE | |
| LOW | tests/mcp/test_client_info.py | 3 | CODE | |
| LOW | tests/mcp/test_project_context.py | 7 | CODE | |
| LOW | tests/mcp/test_project_context_telemetry.py | 3 | CODE | |
| LOW | tests/mcp/test_note_resources.py | 3 | CODE | |
| LOW | tests/mcp/test_tool_telemetry.py | 3 | CODE | |
| LOW | tests/mcp/test_server_telemetry.py | 3 | CODE | |
| LOW | tests/mcp/test_client_telemetry.py | 3 | CODE | |
| LOW | tests/mcp/test_async_client_telemetry.py | 3 | CODE | |
| LOW | tests/mcp/test_tool_read_content.py | 7 | CODE | |
| LOW | tests/mcp/test_tool_json_output_modes.py | 3 | CODE | |
| LOW | tests/mcp/test_man_resources.py | 3 | CODE | |
| LOW | tests/cli/test_workspace_stub.py | 13 | CODE | |
| LOW | tests/cli/test_workspace_commands.py | 15 | CODE | |
| LOW | tests/cli/test_project_set_cloud_local.py | 11 | CODE | |
| LOW | tests/cli/test_db_reset_zombie_check.py | 3 | CODE | |
| LOW | tests/cli/test_auto_update.py | 3 | CODE | |
| LOW | tests/cli/test_cloud_status.py | 3 | CODE | |
| LOW | tests/cli/test_cli_telemetry.py | 3 | CODE | |
| LOW | tests/cli/test_cloud_authentication.py | 3 | CODE | |
| LOW | tests/cli/test_import_chatgpt.py | 10 | CODE | |
| LOW | tests/cli/test_import_document.py | 3 | CODE | |
| LOW | tests/cli/test_import_claude_conversations.py | 9 | CODE | |
| LOW | tests/cli/test_import_claude_projects.py | 9 | CODE | |
| LOW | tests/cli/test_orphans_command.py | 13 | CODE | |
| LOW | tests/cloud/test_note_content_read_service.py | 1 | CODE | |
| LOW | tests/cloud/test_project_deletes.py | 1 | CODE | |
| LOW | tests/cloud/test_cloud_services.py | 1 | CODE | |
| LOW | tests/cloud/test_note_content_materialization.py | 3 | CODE | |
| LOW | tests/api/v2/test_memory_hydration.py | 7 | CODE | |
| 898 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/conftest.py | 61 | # ============================================================================= | COMMENT |
| MEDIUM | tests/conftest.py | 63 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/repository/test_relation_repository.py | 456 | # ------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/repository/test_relation_repository.py | 458 | # ------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/repository/test_entity_repository.py | 969 | # ------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/repository/test_entity_repository.py | 971 | # ------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/utils/test_file_utils.py | 339 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/utils/test_file_utils.py | 341 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/utils/test_file_utils.py | 547 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/utils/test_file_utils.py | 549 | # ============================================================================= | COMMENT |
| MEDIUM | tests/utils/test_file_utils.py | 627 | # ============================================================================= | COMMENT |
| MEDIUM | tests/utils/test_file_utils.py | 629 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/mcp/test_tool_basic_memory_diagnostics.py | 24 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/mcp/test_tool_basic_memory_diagnostics.py | 26 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/mcp/test_tool_basic_memory_diagnostics.py | 141 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/mcp/test_tool_basic_memory_diagnostics.py | 143 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/mcp/test_tool_basic_memory_diagnostics.py | 396 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/mcp/test_tool_basic_memory_diagnostics.py | 398 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/mcp/test_tool_basic_memory_diagnostics.py | 471 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/mcp/test_tool_basic_memory_diagnostics.py | 473 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/mcp/test_tool_basic_memory_diagnostics.py | 506 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/mcp/test_tool_basic_memory_diagnostics.py | 508 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/mcp/test_tool_basic_memory_diagnostics.py | 550 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/mcp/test_tool_basic_memory_diagnostics.py | 552 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/mcp/test_tool_write_note_kebab_filenames.py | 22 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/mcp/test_tool_write_note_kebab_filenames.py | 24 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/mcp/test_tool_write_note_kebab_filenames.py | 91 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/mcp/test_tool_write_note_kebab_filenames.py | 93 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/mcp/test_tool_write_note_kebab_filenames.py | 132 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/mcp/test_tool_write_note_kebab_filenames.py | 134 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/mcp/test_tool_write_note_kebab_filenames.py | 185 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/mcp/test_tool_write_note_kebab_filenames.py | 187 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/mcp/test_tool_write_note_kebab_filenames.py | 223 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/mcp/test_tool_write_note_kebab_filenames.py | 225 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/mcp/test_tool_write_note_kebab_filenames.py | 260 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/mcp/test_tool_write_note_kebab_filenames.py | 262 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/mcp/test_tool_write_note_kebab_filenames.py | 298 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/mcp/test_tool_write_note_kebab_filenames.py | 300 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/mcp/test_tool_write_note_kebab_filenames.py | 353 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/mcp/test_tool_write_note_kebab_filenames.py | 355 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/mcp/test_tool_write_note.py | 33 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/mcp/test_tool_write_note.py | 35 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/mcp/test_tool_write_note.py | 1704 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/mcp/test_tool_write_note.py | 1706 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/cli/test_config_command.py | 54 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/cli/test_config_command.py | 56 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/cli/test_config_command.py | 77 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/cli/test_config_command.py | 79 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/cli/test_config_command.py | 153 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/cli/test_config_command.py | 155 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/cli/test_config_command.py | 262 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/cli/test_config_command.py | 264 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/cli/test_config_command.py | 288 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/cli/test_config_command.py | 290 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/cli/test_config_command.py | 462 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/cli/test_config_command.py | 464 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/cli/test_cli_posix_verbs.py | 371 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/cli/test_cli_posix_verbs.py | 373 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/cli/test_cli_posix_verbs.py | 407 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/cli/test_cli_posix_verbs.py | 409 | # --------------------------------------------------------------------------- | COMMENT |
| 145 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/conftest.py | 329 | # Create a new ConfigManager that uses the test home directory | COMMENT |
| MEDIUM | tests/test_config.py | 544 | # Create a test ConfigManager instance | COMMENT |
| MEDIUM | tests/test_config.py | 1057 | # Create a project path | COMMENT |
| MEDIUM | tests/repository/test_search_repository.py | 584 | # Create a search index row with project_id | COMMENT |
| MEDIUM | tests/repository/test_observation_repository.py | 400 | # Create a test observation | COMMENT |
| MEDIUM⚡ | tests/repository/test_project_info_repository.py | 14 | # Create a ProjectInfoRepository | COMMENT |
| MEDIUM⚡ | tests/repository/test_project_info_repository.py | 26 | # Create a ProjectInfoRepository | COMMENT |
| MEDIUM | tests/repository/test_project_repository.py | 241 | # Create a non-default project | COMMENT |
| MEDIUM | tests/repository/test_entity_repository_upsert.py | 217 | # Create an entity first | COMMENT |
| MEDIUM | tests/repository/test_search_repository_edit_bug_fix.py | 52 | # Create a separate in-memory database for this test | COMMENT |
| MEDIUM | tests/repository/test_search_repository_edit_bug_fix.py | 56 | # Create the database schema | COMMENT |
| MEDIUM⚡ | tests/repository/test_search_repository_edit_bug_fix.py | 191 | # Create a separate in-memory database for this test | COMMENT |
| MEDIUM⚡ | tests/repository/test_search_repository_edit_bug_fix.py | 195 | # Create the database schema | COMMENT |
| MEDIUM | tests/repository/test_entity_repository.py | 203 | # Create a target entity and relation | COMMENT |
| MEDIUM | tests/repository/test_entity_repository.py | 941 | # Create a second project | COMMENT |
| MEDIUM | tests/repository/test_entity_repository.py | 1007 | # Create a second project with same permalink | COMMENT |
| MEDIUM | tests/importers/test_importer_base.py | 14 | # Create a concrete implementation of the abstract class for testing | COMMENT |
| MEDIUM | tests/markdown/test_entity_parser_error_handling.py | 17 | # Create a file with malformed YAML frontmatter | COMMENT |
| MEDIUM | tests/markdown/test_entity_parser_error_handling.py | 53 | # Create a file with completely broken YAML | COMMENT |
| MEDIUM | tests/markdown/test_entity_parser_error_handling.py | 89 | # Create a file without note_type in frontmatter | COMMENT |
| MEDIUM | tests/markdown/test_entity_parser_error_handling.py | 116 | # Create a file with empty frontmatter | COMMENT |
| MEDIUM | tests/markdown/test_entity_parser_error_handling.py | 142 | # Create a file with no frontmatter at all | COMMENT |
| MEDIUM | tests/markdown/test_entity_parser_error_handling.py | 167 | # Create a file with null/None note_type | COMMENT |
| MEDIUM | tests/markdown/test_entity_parser_error_handling.py | 193 | # Create a file with null title | COMMENT |
| MEDIUM | tests/markdown/test_entity_parser_error_handling.py | 219 | # Create a file with empty title | COMMENT |
| MEDIUM | tests/markdown/test_entity_parser_error_handling.py | 245 | # Create a file with string "None" as title (common in templates) | COMMENT |
| MEDIUM | tests/markdown/test_entity_parser_error_handling.py | 271 | # Create a valid file | COMMENT |
| MEDIUM | tests/markdown/test_entity_parser_error_handling.py | 312 | # Create a file with completely broken YAML that will trigger the fallback path | COMMENT |
| MEDIUM | tests/markdown/test_entity_parser_error_handling.py | 354 | # Create a file with user's custom frontmatter (like the bug report) | COMMENT |
| MEDIUM | tests/markdown/test_entity_parser.py | 241 | # Create a test file in the project directory | STRING |
| MEDIUM⚡ | tests/utils/test_validate_project_path.py | 443 | # Create a more complex directory structure | COMMENT |
| MEDIUM⚡ | tests/utils/test_validate_project_path.py | 452 | # Create a sensitive file in the sibling directory | COMMENT |
| MEDIUM | tests/utils/test_validate_project_path.py | 275 | # Create a very long but legitimate path | COMMENT |
| MEDIUM | tests/utils/test_validate_project_path.py | 343 | # Create a directory outside the project | COMMENT |
| MEDIUM | tests/utils/test_utf8_handling.py | 16 | # Create a test file with various UTF-8 characters | COMMENT |
| MEDIUM | tests/utils/test_utf8_handling.py | 65 | # Create a test file with frontmatter containing UTF-8 | COMMENT |
| MEDIUM | tests/utils/test_utf8_handling.py | 120 | # Create a test file with UTF-8 characters | COMMENT |
| MEDIUM | tests/mcp/test_tool_schema.py | 290 | # Create a person note but no schema note | COMMENT |
| MEDIUM | tests/mcp/test_tool_schema.py | 344 | # Create a person with an extra "hobby" field not in the schema | COMMENT |
| MEDIUM | tests/mcp/test_obsidian_yaml_formatting.py | 11 | # Create a note with tags using write_note | COMMENT |
| MEDIUM | tests/mcp/test_tool_resource.py | 137 | # Create a text file via notes | COMMENT |
| MEDIUM | tests/mcp/test_tool_resource.py | 173 | # Create a test image | COMMENT |
| MEDIUM | tests/mcp/test_tool_delete_note.py | 142 | # Create a note to delete | COMMENT |
| MEDIUM | tests/mcp/test_tool_search.py | 27 | # Create a test note | COMMENT |
| MEDIUM | tests/mcp/test_tool_search.py | 61 | # Create a test note | COMMENT |
| MEDIUM | tests/mcp/test_tool_search.py | 92 | # Create a test note | COMMENT |
| MEDIUM | tests/mcp/test_tool_search.py | 126 | # Create a test note | COMMENT |
| MEDIUM | tests/mcp/test_tool_search.py | 291 | # Create a test note | COMMENT |
| MEDIUM | tests/mcp/test_tool_view_note.py | 195 | # Create a note with no clear title structure | COMMENT |
| MEDIUM | tests/mcp/test_tool_edit_note.py | 489 | # Create the note first | COMMENT |
| MEDIUM | tests/mcp/test_tool_edit_note.py | 514 | # Create a note first | COMMENT |
| MEDIUM | tests/mcp/test_tool_edit_note.py | 536 | # Create a note first | COMMENT |
| MEDIUM | tests/mcp/test_tool_edit_note.py | 558 | # Create a note first | COMMENT |
| MEDIUM | tests/mcp/test_tool_edit_note.py | 638 | # Create a note | COMMENT |
| MEDIUM | tests/mcp/test_tool_edit_note.py | 1044 | # Create a note first | COMMENT |
| MEDIUM | tests/mcp/test_tool_move_note.py | 829 | # Create a note to test different identifier formats | COMMENT |
| MEDIUM | tests/mcp/test_tool_write_note.py | 356 | # Create a note with custom permalink in frontmatter | COMMENT |
| MEDIUM | tests/mcp/test_tool_write_note.py | 1259 | # Create a note with all features to ensure security validation doesn't interfere | COMMENT |
| MEDIUM | tests/mcp/test_tool_write_note.py | 1330 | # Create a very long path traversal attack | COMMENT |
| MEDIUM⚡ | tests/mcp/test_tool_project_management.py | 120 | # Create a project through the tool (exercises POST + response formatting). | COMMENT |
| 116 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/basic_memory/utils.py | 23 | Normalize project path by stripping mount point prefix. In cloud deployments, the S3 bucket is mounted at /app/data | STRING |
| HIGH | src/basic_memory/utils.py | 80 | Generate a stable permalink from a file path. Args: file_path: Original file path (str, Path, or PathLike) | STRING |
| HIGH | src/basic_memory/file_utils.py | 59 | Compute SHA-256 checksum of content. Args: content: Content to hash (either text string or bytes) | STRING |
| HIGH | src/basic_memory/file_utils.py | 431 | Parse YAML frontmatter from content. Args: content: Content with YAML frontmatter Returns: | STRING |
| HIGH | src/basic_memory/file_utils.py | 472 | Remove YAML frontmatter from content. Args: content: Content with frontmatter strip: When True | STRING |
| HIGH | src/basic_memory/markdown/markdown_processor.py | 65 | Write EntityMarkdown schema back to file. This is step 3 of our read->modify->write pattern. The entire | STRING |
| HIGH | src/basic_memory/markdown/utils.py | 24 | Convert markdown entity to model. Does not include relations. Args: file_path: Path to the markdown fi | STRING |
| HIGH | src/basic_memory/mcp/project_context.py | 730 | Get and validate project, setting it in context if available. Args: client: HTTP client for API calls | STRING |
| HIGH | src/basic_memory/mcp/project_context.py | 809 | Resolve project and normalized path for memory:// identifiers. Args: strict_project_routing: Reject a memor | STRING |
| HIGH | src/basic_memory/mcp/project_context.py | 1813 | Resolve project, create correctly-routed client, and validate project. Solves the bootstrap problem: we need to kno | STRING |
| HIGH | src/basic_memory/mcp/clients/memory.py | 58 | Build context from a memory path. Args: path: The path to build context for (without memory:// pref | STRING |
| HIGH | src/basic_memory/mcp/clients/memory.py | 114 | Get recent activity. Args: timeframe: Time filter (e.g., "7d", "1 week", "2 days ago") | STRING |
| HIGH | src/basic_memory/mcp/clients/resource.py | 43 | Read a resource by entity ID. Args: entity_id: Entity external_id (UUID) Returns: | STRING |
| HIGH | src/basic_memory/mcp/clients/search.py | 121 | Search across all content in the knowledge base. Args: query: Search query dict (from SearchQuery.m | STRING |
| HIGH | src/basic_memory/mcp/clients/directory.py | 56 | List directory contents. Args: dir_name: Directory path to list (default: root) depth: | STRING |
| HIGH | src/basic_memory/mcp/clients/knowledge.py | 90 | Create a new entity. Args: entity_data: Entity data including title, content, folder, etc. | STRING |
| HIGH | src/basic_memory/mcp/clients/knowledge.py | 127 | Update an existing entity (full replacement). Args: entity_id: Entity external_id (UUID) | STRING |
| HIGH | src/basic_memory/mcp/clients/knowledge.py | 165 | Get an entity by ID, optionally sliced server-side. Args: entity_id: Entity external_id (UUID) | STRING |
| HIGH | src/basic_memory/mcp/clients/knowledge.py | 237 | Partially update an entity. Args: entity_id: Entity external_id (UUID) patch_data: Part | STRING |
| HIGH | src/basic_memory/mcp/clients/knowledge.py | 275 | Delete an entity. Args: entity_id: Entity external_id (UUID) Returns: DeleteEn | STRING |
| HIGH | src/basic_memory/mcp/clients/knowledge.py | 303 | Move an entity to a new location. Args: entity_id: Entity external_id (UUID) destinatio | STRING |
| HIGH | src/basic_memory/mcp/clients/knowledge.py | 335 | Move all entities in a directory to a new location. Args: source_directory: Source directory path ( | STRING |
| HIGH | src/basic_memory/mcp/clients/knowledge.py | 368 | Delete all entities in a directory. Args: directory: Directory path to delete (relative to project | STRING |
| HIGH | src/basic_memory/mcp/clients/knowledge.py | 399 | Index a markdown file that exists on disk but is not indexed yet. Args: file_path: Markdown file pa | STRING |
| HIGH | src/basic_memory/mcp/clients/knowledge.py | 480 | Resolve an identifier while preserving owning-project metadata. Args: identifier: The identifier to | STRING |
| HIGH | src/basic_memory/mcp/clients/project.py | 61 | Create a new project. Args: project_data: Project creation data (name, path, set_default) | STRING |
| HIGH | src/basic_memory/mcp/clients/project.py | 91 | Delete a project by its external ID. Args: project_external_id: Project external ID (UUID) | STRING |
| HIGH | src/basic_memory/mcp/clients/project.py | 115 | Resolve a project name/permalink to its full project record. Args: identifier: Project name or perm | STRING |
| HIGH | src/basic_memory/mcp/clients/project.py | 136 | Set a project as the default. Args: project_external_id: Project external ID (UUID) Return | STRING |
| HIGH | src/basic_memory/mcp/clients/project.py | 158 | Update a project's configuration (e.g. path). Args: project_external_id: Project external ID (UUID) | STRING |
| HIGH | src/basic_memory/mcp/clients/project.py | 185 | Trigger a project indexing operation. Args: project_external_id: Project external ID (UUID) | STRING |
| HIGH | src/basic_memory/mcp/clients/project.py | 213 | Get the current project-index observation for a project. Args: project_external_id: Project externa | STRING |
| HIGH | src/basic_memory/mcp/clients/project.py | 233 | Get detailed project information and statistics. Args: project_external_id: Project external ID (UU | STRING |
| HIGH | src/basic_memory/mcp/clients/schema.py | 49 | Validate notes against their resolved schemas. Args: note_type: Optional note type to batch-validat | STRING |
| HIGH | src/basic_memory/mcp/clients/schema.py | 82 | Infer a schema from existing notes of a given type. Args: note_type: The note type to analyze | STRING |
| HIGH | src/basic_memory/mcp/clients/schema.py | 104 | Show drift between schema definition and actual usage. Args: note_type: The note type to check for | STRING |
| HIGH | src/basic_memory/mcp/tools/read_content.py | 183 | Read a file's raw content by path or permalink. This tool provides direct access to file content in the knowledge b | STRING |
| HIGH | src/basic_memory/mcp/tools/view_note.py | 35 | View a markdown note as a formatted artifact. This tool reads a note using the same logic as read_note but instruct | STRING |
| HIGH | src/basic_memory/mcp/tools/edit_note.py | 507 | Edit an existing markdown note in the knowledge base. Makes targeted changes to existing notes without rewriting th | STRING |
| HIGH | src/basic_memory/mcp/tools/delete_note.py | 164 | Delete a note or directory from the knowledge base. Permanently removes a note or directory from the specified proj | STRING |
| HIGH | src/basic_memory/mcp/tools/utils.py | 372 | Make a GET request and handle errors appropriately. Args: client: The HTTPX AsyncClient to use url: | STRING |
| HIGH | src/basic_memory/mcp/tools/utils.py | 480 | Make a PUT request and handle errors appropriately. Args: client: The HTTPX AsyncClient to use url: | STRING |
| HIGH | src/basic_memory/mcp/tools/utils.py | 597 | Make a PATCH request and handle errors appropriately. Args: client: The HTTPX AsyncClient to use ur | STRING |
| HIGH | src/basic_memory/mcp/tools/utils.py | 719 | Make a POST request and handle errors appropriately. Args: client: The HTTPX AsyncClient to use url | STRING |
| HIGH | src/basic_memory/mcp/tools/utils.py | 907 | Resolve a string identifier to an entity external_id using the v2 API. Resolution is strict: only an exact external | STRING |
| HIGH | src/basic_memory/mcp/tools/utils.py | 958 | Make a DELETE request and handle errors appropriately. Args: client: The HTTPX AsyncClient to use u | STRING |
| HIGH | src/basic_memory/mcp/tools/write_note.py | 297 | Write a markdown note to the knowledge base. Creates a markdown note with semantic observations and relations. | STRING |
| HIGH | src/basic_memory/mcp/tools/search.py | 1194 | Search across all content in the knowledge base with comprehensive syntax support. This tool searches the knowledge | STRING |
| HIGH | src/basic_memory/mcp/tools/read_note.py | 113 | Return the raw markdown for a note, or guidance text if no match is found. Finds and retrieves a note by its title, | STRING |
| HIGH | src/basic_memory/mcp/tools/recent_activity.py | 80 | Get recent activity for one project. Project Resolution: The server resolves projects in this order: 1. Sin | STRING |
| HIGH | src/basic_memory/mcp/tools/move_note.py | 460 | Move a note or directory to a new location within the same project. Moves a note or directory from one location to | STRING |
| HIGH | src/basic_memory/mcp/tools/build_context.py | 243 | Get context needed to continue a discussion within a specific project. This tool enables natural continuation of di | STRING |
| HIGH | src/basic_memory/mcp/tools/project_management.py | 790 | Delete a Basic Memory project. Removes a project from Basic Memory's configuration and database records. Local | STRING |
| HIGH | src/basic_memory/mcp/tools/list_directory.py | 60 | List directory contents from the knowledge base with optional filtering. This tool provides 'ls' functionality for | STRING |
| HIGH | src/basic_memory/mcp/tools/schema.py | 262 | Validate notes against their resolved schema. Validates a specific note (by identifier), all notes of a given type, | STRING |
| HIGH | src/basic_memory/mcp/tools/schema.py | 404 | Analyze existing notes and suggest a schema definition. Examines observation categories and relation types across a | STRING |
| HIGH | src/basic_memory/mcp/tools/schema.py | 534 | Detect drift between a schema definition and actual note usage. Compares the existing schema for a note type agains | STRING |
| HIGH | src/basic_memory/cli/commands/cloud/cloud_utils.py | 135 | Check if a project exists on cloud. Args: project_name: Name of project to check workspace: Optiona | STRING |
| HIGH | src/basic_memory/cli/commands/cloud/rclone_commands.py | 309 | One-way sync: local → cloud. Makes cloud identical to local using rclone sync. Cloud files matching the .bmigno | STRING |
| HIGH | src/basic_memory/cli/commands/cloud/rclone_commands.py | 717 | Two-way sync: local ↔ cloud. Uses rclone bisync with balanced defaults: - conflict_resolve: newer (auto-resolve | STRING |
| 38 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | plugins/claude-code/hooks/session_start.py | 66 | except BaseException: # noqa: BLE001 - the documented fail-open boundary | CODE |
| HIGH | plugins/claude-code/hooks/pre_compact.py | 66 | except BaseException: # noqa: BLE001 - the documented fail-open boundary | CODE |
| HIGH | plugins/codex/hooks/session_start.py | 40 | except BaseException: # noqa: BLE001 - the documented fail-open boundary | CODE |
| HIGH | plugins/codex/hooks/pre_compact.py | 40 | except BaseException: # noqa: BLE001 - the documented fail-open boundary | CODE |
| HIGH | tests/utils/test_validate_project_path.py | 283 | except (ValueError, OSError): | CODE |
| HIGH | tests/utils/test_validate_project_path.py | 266 | except (ValueError, OSError): | CODE |
| HIGH | tests/utils/test_validate_project_path.py | 316 | except (UnicodeError, OSError): | CODE |
| HIGH | tests/mcp/test_tool_build_context.py | 200 | except ToolError: | CODE |
| HIGH | tests/mcp/test_tool_move_note.py | 322 | except Exception: | CODE |
| HIGH | tests/mcp/test_tool_move_note.py | 630 | except Exception: | CODE |
| HIGH | tests/mcp/test_tool_move_note.py | 712 | except Exception: | CODE |
| HIGH | tests/mcp/test_tool_read_content.py | 291 | except ToolError: | CODE |
| HIGH | tests/cli/test_routing.py | 124 | except RuntimeError: | CODE |
| HIGH | tests/services/test_project_service.py | 1265 | except ValueError: | CODE |
| HIGH | tests/services/test_project_service.py | 1688 | except (ValueError, KeyError): | CODE |
| HIGH | tests/services/test_project_service.py | 1747 | except (ValueError, KeyError): | CODE |
| HIGH | tests/services/test_project_service.py | 1120 | except ValueError: | CODE |
| HIGH | tests/services/test_project_service.py | 1632 | except Exception: | CODE |
| HIGH | tests/services/test_project_service.py | 1815 | except Exception: | CODE |
| HIGH | tests/services/test_project_service.py | 144 | except Exception: | CODE |
| HIGH | tests/services/test_project_service.py | 800 | except Exception: | CODE |
| HIGH | tests/services/test_project_service.py | 991 | except Exception: | CODE |
| HIGH | tests/services/test_project_removal_bug.py | 150 | except Exception: | CODE |
| HIGH | integrations/hermes/__init__.py | 592 | except Exception: | CODE |
| HIGH | integrations/hermes/__init__.py | 1976 | except Exception: | CODE |
| HIGH | integrations/hermes/__init__.py | 679 | except Exception: | CODE |
| HIGH | integrations/hermes/__init__.py | 760 | except Exception: | CODE |
| HIGH | integrations/hermes/__init__.py | 766 | except Exception: | CODE |
| HIGH | integrations/hermes/__init__.py | 1457 | except Exception: | CODE |
| HIGH | integrations/hermes/__init__.py | 582 | except Exception: | CODE |
| HIGH | integrations/hermes/__init__.py | 1946 | except Exception: | CODE |
| HIGH | benchmarks/tests/providers/test_mem0_normalization.py | 90 | except Exception: | CODE |
| HIGH | benchmarks/src/basic_memory_benchmarks/runner.py | 83 | except Exception: | CODE |
| HIGH | benchmarks/src/basic_memory_benchmarks/runner.py | 164 | except Exception: | CODE |
| HIGH | benchmarks/src/basic_memory_benchmarks/bm_runtime.py | 126 | except asyncio.CancelledError: | CODE |
| HIGH | …ks/src/basic_memory_benchmarks/providers/mem0_local.py | 186 | except Exception: | CODE |
| HIGH | …ks/src/basic_memory_benchmarks/providers/mem0_local.py | 211 | except Exception: | CODE |
| HIGH | …ks/src/basic_memory_benchmarks/providers/mem0_local.py | 197 | except Exception: | CODE |
| HIGH | …basic_memory_benchmarks/providers/supermemory_local.py | 187 | except Exception: | CODE |
| HIGH | …arks/src/basic_memory_benchmarks/providers/bm_local.py | 301 | except Exception: | CODE |
| HIGH | src/basic_memory/utils.py | 754 | except (json.JSONDecodeError, TypeError): | CODE |
| HIGH | src/basic_memory/utils.py | 770 | except (json.JSONDecodeError, TypeError): | CODE |
| HIGH | src/basic_memory/utils.py | 642 | except json.JSONDecodeError: | CODE |
| HIGH | src/basic_memory/utils.py | 735 | except json.JSONDecodeError: | CODE |
| HIGH | src/basic_memory/ignore_utils.py | 254 | except Exception: | CODE |
| HIGH | src/basic_memory/repository/sqlite_search_repository.py | 214 | except SAOperationalError: | CODE |
| HIGH | src/basic_memory/repository/sqlite_search_repository.py | 236 | except SAOperationalError: | CODE |
| HIGH | src/basic_memory/repository/project_repository.py | 37 | except OperationalError: | CODE |
| HIGH | src/basic_memory/repository/sqlite_vec_index.py | 54 | except SAOperationalError: | CODE |
| HIGH | src/basic_memory/repository/sqlite_vec_index.py | 69 | except SAOperationalError: | CODE |
| HIGH | src/basic_memory/runtime/process.py | 31 | except OSError: | CODE |
| HIGH | src/basic_memory/document_ingestion/bounded_process.py | 160 | except (BrokenPipeError, ConnectionResetError): | CODE |
| HIGH | src/basic_memory/document_ingestion/bounded_process.py | 107 | except ProcessLookupError: | CODE |
| HIGH | src/basic_memory/mcp/workspace_project_index.py | 339 | except ValueError: | CODE |
| HIGH | src/basic_memory/mcp/project_context.py | 135 | except Exception: | CODE |
| HIGH | src/basic_memory/mcp/project_context.py | 1943 | except ValueError: | CODE |
| HIGH | src/basic_memory/cli/auth.py | 117 | except Exception: | CODE |
| HIGH | src/basic_memory/cli/app.py | 126 | except (Exception, SystemExit): | CODE |
| HIGH | src/basic_memory/cli/analytics.py | 108 | except Exception: | CODE |
| HIGH | src/basic_memory/cli/commands/cloud/project_sync.py | 1061 | except Exception: | CODE |
| 10 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_production_cascade_delete.py | 248 | except Exception as e: | CODE |
| LOW | tests/test_production_cascade_delete.py | 279 | except Exception as e: | CODE |
| LOW | tests/test_production_cascade_delete.py | 349 | except Exception as e: | CODE |
| LOW⚡ | …epository/test_vector_manifest_generation_ownership.py | 115 | except Exception: | CODE |
| LOW⚡ | tests/repository/test_postgres_search_repository.py | 129 | except Exception: | CODE |
| LOW | tests/importers/test_importer_base.py | 29 | except Exception as e: | CODE |
| LOW | tests/mcp/test_tool_recent_activity.py | 50 | except Exception as e: | CODE |
| LOW | tests/mcp/test_tool_build_context.py | 180 | except Exception as e: | CODE |
| LOW | tests/mcp/test_tool_move_note.py | 322 | except Exception: | CODE |
| LOW | tests/mcp/test_tool_move_note.py | 630 | except Exception: | CODE |
| LOW | tests/mcp/test_tool_move_note.py | 712 | except Exception: | CODE |
| LOW⚡ | tests/db/test_issue_254_foreign_key_constraints.py | 95 | except Exception as e: | CODE |
| LOW | tests/services/test_semantic_search.py | 558 | except Exception: | CODE |
| LOW⚡ | tests/services/test_project_service.py | 987 | except Exception: | CODE |
| LOW⚡ | tests/services/test_project_service.py | 991 | except Exception: | CODE |
| LOW | tests/services/test_project_service.py | 139 | except Exception as e: | CODE |
| LOW | tests/services/test_project_service.py | 144 | except Exception: | CODE |
| LOW | tests/services/test_project_service.py | 796 | except Exception: | CODE |
| LOW | tests/services/test_project_service.py | 800 | except Exception: | CODE |
| LOW | tests/services/test_project_service.py | 1632 | except Exception: | CODE |
| LOW | tests/services/test_project_service.py | 1815 | except Exception: | CODE |
| LOW | tests/services/test_project_removal_bug.py | 129 | except Exception as e: | CODE |
| LOW | tests/services/test_project_removal_bug.py | 146 | except Exception: | CODE |
| LOW | tests/services/test_project_removal_bug.py | 150 | except Exception: | CODE |
| LOW | tests/services/test_project_removal_bug.py | 362 | except Exception: | CODE |
| LOW | .agents/skills/instrumentation/SKILL.md | 98 | except Exception: | CODE |
| MEDIUM | integrations/hermes/__init__.py | 1221 | def _bg() -> None: | CODE |
| MEDIUM | integrations/hermes/__init__.py | 1287 | def _bg() -> None: | CODE |
| LOW⚡ | integrations/hermes/__init__.py | 58 | except Exception as _e: # pragma: no cover | CODE |
| LOW⚡ | integrations/hermes/__init__.py | 760 | except Exception: | CODE |
| LOW⚡ | integrations/hermes/__init__.py | 766 | except Exception: | CODE |
| LOW⚡ | integrations/hermes/__init__.py | 1239 | except Exception as e: | CODE |
| LOW⚡ | integrations/hermes/__init__.py | 1249 | except Exception: | CODE |
| LOW⚡ | integrations/hermes/__init__.py | 1255 | except Exception: | CODE |
| LOW⚡ | integrations/hermes/__init__.py | 1905 | except Exception as e: | CODE |
| LOW⚡ | integrations/hermes/__init__.py | 1914 | except Exception as e: | CODE |
| LOW⚡ | integrations/hermes/__init__.py | 1923 | except Exception: | CODE |
| LOW⚡ | integrations/hermes/__init__.py | 1976 | except Exception: | CODE |
| LOW | integrations/hermes/__init__.py | 415 | except Exception as e: | CODE |
| LOW | integrations/hermes/__init__.py | 469 | except Exception: | CODE |
| LOW | integrations/hermes/__init__.py | 483 | except Exception as e: | CODE |
| LOW | integrations/hermes/__init__.py | 548 | except Exception: | CODE |
| LOW | integrations/hermes/__init__.py | 582 | except Exception: | CODE |
| LOW | integrations/hermes/__init__.py | 592 | except Exception: | CODE |
| LOW | integrations/hermes/__init__.py | 679 | except Exception: | CODE |
| LOW | integrations/hermes/__init__.py | 706 | except Exception as e: | CODE |
| LOW | integrations/hermes/__init__.py | 995 | except Exception as e: | CODE |
| LOW | integrations/hermes/__init__.py | 1001 | except Exception as e: | CODE |
| LOW | integrations/hermes/__init__.py | 1015 | except Exception as e: | CODE |
| LOW | integrations/hermes/__init__.py | 1018 | except Exception as shutdown_error: | CODE |
| LOW | integrations/hermes/__init__.py | 1029 | except Exception as e: | CODE |
| LOW | integrations/hermes/__init__.py | 1080 | except Exception as e: | CODE |
| LOW | integrations/hermes/__init__.py | 1122 | except Exception as e: | CODE |
| LOW | integrations/hermes/__init__.py | 1177 | except Exception as e: | CODE |
| LOW | integrations/hermes/__init__.py | 1211 | except Exception as e: | CODE |
| LOW | integrations/hermes/__init__.py | 1290 | except Exception as e: | CODE |
| LOW | integrations/hermes/__init__.py | 1349 | except Exception as e: | CODE |
| LOW | integrations/hermes/__init__.py | 1404 | except Exception as e: | CODE |
| LOW | integrations/hermes/__init__.py | 1457 | except Exception: | CODE |
| LOW | integrations/hermes/__init__.py | 1522 | except Exception: | CODE |
| 287 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/conftest.py | 0 | create the shared semantic postgres engine once per test session. | STRING |
| HIGH | test-int/conftest.py | 0 | create the shared semantic postgres engine once per test session. | STRING |
| HIGH | test-int/semantic/conftest.py | 0 | create the shared semantic postgres engine once per test session. | STRING |
| HIGH | …epository/test_vector_manifest_generation_ownership.py | 0 | build one heading section sized to be its own vector chunk. vector chunks split on headings and the size budget, not per | STRING |
| HIGH | tests/repository/test_postgres_search_repository.py | 0 | build one heading section sized to be its own vector chunk. vector chunks split on headings and the size budget, not per | STRING |
| HIGH | …sts/repository/test_sqlite_vector_search_repository.py | 0 | build one heading section sized to be its own vector chunk. vector chunks split on headings and the size budget, not per | STRING |
| HIGH | …repository/test_vector_filter_candidate_restriction.py | 0 | insert into search_index ( id, title, content_stems, content_snippet, script_ngrams, permalink, file_path, type, metadat | STRING |
| HIGH | src/basic_memory/repository/search_repository_base.py | 0 | insert into search_index ( id, title, content_stems, content_snippet, script_ngrams, permalink, file_path, type, metadat | STRING |
| HIGH | …c_memory/repository/accepted_note_search_repository.py | 0 | insert into search_index ( id, title, content_stems, content_snippet, script_ngrams, permalink, file_path, type, metadat | STRING |
| HIGH | tests/mcp/conftest.py | 0 | create test client that both mcp and tests will use. | STRING |
| HIGH | tests/cli/conftest.py | 0 | create test client that both mcp and tests will use. | STRING |
| HIGH | test-int/conftest.py | 0 | create test client that both mcp and tests will use. | STRING |
| HIGH | tests/mcp/test_tool_search_temporal.py | 0 | # cache layer ## observations - [decision] @effective[2026-06-10,2026-07-27) the cache layer will use redis. - [decision | STRING |
| HIGH | tests/api/v2/test_search_router_temporal.py | 0 | # cache layer ## observations - [decision] @effective[2026-06-10,2026-07-27) the cache layer will use redis. - [decision | STRING |
| HIGH | tests/services/test_search_service_temporal.py | 0 | # cache layer ## observations - [decision] @effective[2026-06-10,2026-07-27) the cache layer will use redis. - [decision | STRING |
| HIGH | tests/cli/test_config_command.py | 0 | write config.json under a temporary home and return the file path. | STRING |
| HIGH | tests/cli/test_project_info_cloud_status.py | 0 | write config.json under a temporary home and return the file path. | STRING |
| HIGH | tests/cli/test_project_list_and_ls.py | 0 | write config.json under a temporary home and return the file path. | STRING |
| HIGH | tests/cli/test_json_output.py | 0 | write config.json under a temporary home and return the file path. | STRING |
| HIGH | tests/api/v2/test_knowledge_router.py | 0 | verify v2 project endpoints require project external_id uuid, not name. | STRING |
| HIGH | tests/api/v2/test_resource_router.py | 0 | verify v2 project endpoints require project external_id uuid, not name. | STRING |
| HIGH | tests/api/v2/test_project_router.py | 0 | verify v2 project endpoints require project external_id uuid, not name. | STRING |
| HIGH | test-int/mcp/test_pagination_integration.py | 0 | parse a fastmcp tool result content block into json. | STRING |
| HIGH | test-int/mcp/test_workspace_permalink_integration.py | 0 | parse a fastmcp tool result content block into json. | STRING |
| HIGH | test-int/mcp/test_output_format_json_integration.py | 0 | parse a fastmcp tool result content block into json. | STRING |
| HIGH | …cp/test_observation_permalink_collision_integration.py | 0 | parse a fastmcp tool result content block into json. | STRING |
| HIGH | src/basic_memory/repository/embedding_provider.py | 0 | return provider-specific runtime settings suitable for startup logs. | STRING |
| HIGH | src/basic_memory/repository/rerank_provider.py | 0 | return provider-specific runtime settings suitable for startup logs. | STRING |
| HIGH | src/basic_memory/repository/litellm_provider.py | 0 | return provider-specific runtime settings suitable for startup logs. | STRING |
| HIGH | src/basic_memory/repository/relation_repository.py | 0 | initialize with project_id filter. args: project_id: project id to filter all operations by | STRING |
| HIGH | src/basic_memory/repository/entity_repository.py | 0 | initialize with project_id filter. args: project_id: project id to filter all operations by | STRING |
| HIGH | …asic_memory/repository/memory_time_index_repository.py | 0 | initialize with project_id filter. args: project_id: project id to filter all operations by | STRING |
| HIGH | src/basic_memory/repository/observation_repository.py | 0 | initialize with project_id filter. args: project_id: project id to filter all operations by | STRING |
| HIGH | src/basic_memory/repository/note_section_repository.py | 0 | initialize with project_id filter. args: project_id: project id to filter all operations by | STRING |
| HIGH | …/basic_memory/repository/postgres_search_repository.py | 0 | create index if not exists idx_search_vector_chunks_project_entity on search_vector_chunks (project_id, entity_id) | STRING |
| HIGH | src/basic_memory/models/search.py | 0 | create index if not exists idx_search_vector_chunks_project_entity on search_vector_chunks (project_id, entity_id) | STRING |
| HIGH | …ions/h1b2c3d4e5f6_add_postgres_vector_search_tables.py | 0 | create index if not exists idx_search_vector_chunks_project_entity on search_vector_chunks (project_id, entity_id) | STRING |
| HIGH | src/basic_memory/mcp/container.py | 0 | create container by reading configmanager. this is the single point where api reads global config. | STRING |
| HIGH | src/basic_memory/cli/container.py | 0 | create container by reading configmanager. this is the single point where api reads global config. | STRING |
| HIGH | src/basic_memory/api/container.py | 0 | create container by reading configmanager. this is the single point where api reads global config. | STRING |
| HIGH | src/basic_memory/mcp/clients/memory.py | 0 | initialize the schema client. args: http_client: httpx asyncclient for making requests project_id: project external_id ( | STRING |
| HIGH | src/basic_memory/mcp/clients/resource.py | 0 | initialize the schema client. args: http_client: httpx asyncclient for making requests project_id: project external_id ( | STRING |
| HIGH | src/basic_memory/mcp/clients/search.py | 0 | initialize the schema client. args: http_client: httpx asyncclient for making requests project_id: project external_id ( | STRING |
| HIGH | src/basic_memory/mcp/clients/directory.py | 0 | initialize the schema client. args: http_client: httpx asyncclient for making requests project_id: project external_id ( | STRING |
| HIGH | src/basic_memory/mcp/clients/knowledge.py | 0 | initialize the schema client. args: http_client: httpx asyncclient for making requests project_id: project external_id ( | STRING |
| HIGH | src/basic_memory/mcp/clients/schema.py | 0 | initialize the schema client. args: http_client: httpx asyncclient for making requests project_id: project external_id ( | STRING |
| HIGH | src/basic_memory/mcp/tools/edit_note.py | 0 | report a failed move as a tool error, keeping the guidance for the caller. a returned "move failed" string reads as succ | STRING |
| HIGH | src/basic_memory/mcp/tools/delete_note.py | 0 | report a failed move as a tool error, keeping the guidance for the caller. a returned "move failed" string reads as succ | STRING |
| HIGH | src/basic_memory/mcp/tools/move_note.py | 0 | report a failed move as a tool error, keeping the guidance for the caller. a returned "move failed" string reads as succ | STRING |
| HIGH | src/basic_memory/cli/commands/import_memory_json.py | 0 | get markdownprocessor and fileservice instances for importers. | STRING |
| HIGH | src/basic_memory/cli/commands/import_chatgpt.py | 0 | get markdownprocessor and fileservice instances for importers. | STRING |
| HIGH | src/basic_memory/cli/commands/import_claude_projects.py | 0 | get markdownprocessor and fileservice instances for importers. | STRING |
| HIGH | …sic_memory/cli/commands/import_claude_conversations.py | 0 | get markdownprocessor and fileservice instances for importers. | STRING |
| HIGH | …rsions/d7e8f9a0b1c2_add_structured_metadata_indexes.py | 0 | check if a column exists in a table (idempotent migration support). | STRING |
| HIGH | …rsions/j3d4e5f6g7h8_rename_entity_type_to_note_type.py | 0 | check if a column exists in a table (idempotent migration support). | STRING |
| HIGH | …/g9a0b3c4d5e6_add_external_id_to_project_and_entity.py | 0 | check if a column exists in a table (idempotent migration support). | STRING |
| HIGH | …g7h8i9_add_created_by_and_last_updated_by_to_entity.py | 0 | check if a column exists in a table (idempotent migration support). | STRING |
| HIGH | …/f8a9b2c3d4e5_add_pg_trgm_for_fuzzy_link_resolution.py | 0 | check if a column exists in a table (idempotent migration support). | STRING |
| HIGH | …rsions/d7e8f9a0b1c2_add_structured_metadata_indexes.py | 0 | check if an index exists (idempotent migration support). | STRING |
| HIGH | …rsions/j3d4e5f6g7h8_rename_entity_type_to_note_type.py | 0 | check if an index exists (idempotent migration support). | STRING |
| 5 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH⚡ | tests/test_man_pages.py | 252 | == "- **sort** (string | null, optional, default: None) — ordering" | CODE |
| HIGH⚡ | tests/test_man_pages.py | 259 | assert render_parameters("demo", unresolved_ref) == "- **sort** (null, optional)" | CODE |
| HIGH | tests/test_man_pages.py | 220 | "- **alpha** (string | null, optional) — a union\n" | CODE |
| HIGH | tests/test_man_pages.py | 236 | render_parameters("demo", list_type) == "- **kind** (string | null, optional) — one of a b" | CODE |
| HIGH⚡ | tests/test_config.py | 1326 | "json": "jq . {file} > {file}.tmp && mv {file}.tmp {file}", | CODE |
| HIGH | tests/importers/test_conversation_indexing.py | 131 | ), f"Search permalink should not be null, got: {search_result.permalink}" | CODE |
| HIGH | tests/utils/test_file_utils.py | 29 | # Skip marker for tests that use Unix-specific commands (cat, sh, sleep, /dev/null) | COMMENT |
| HIGH | tests/utils/test_parse_tags.py | 23 | # None entries (e.g. YAML `tags: [alpha, null]`) are skipped, not revived as "None" | COMMENT |
| HIGH⚡ | tests/mcp/test_tool_posix.py | 863 | "priority in null,high", | CODE |
| HIGH⚡ | tests/mcp/test_tool_posix.py | 865 | "score between null,0.8", | CODE |
| HIGH | tests/mcp/test_tool_edit_note.py | 818 | # Call edit_note with explicit None for all optional fields (simulates MCP null) | COMMENT |
| HIGH | tests/mcp/test_async_client_modes.py | 507 | '{"access_token":"oauth-token-456","refresh_token":null,"expires_at":9999999999,"token_type":"Bearer"}', | CODE |
| HIGH | tests/mcp/test_async_client_modes.py | 571 | '{"access_token":"oauth-control-123","refresh_token":null,"expires_at":9999999999,"token_type":"Bearer"}', | CODE |
| HIGH⚡ | tests/cli/test_cli_posix_verbs.py | 889 | '"approved":true,"missing":null}\n' | CODE |
| HIGH⚡ | tests/cli/test_cli_posix_verbs.py | 890 | 'notes/Another Note.md\t{"title":"Another Note","priority":null,' | CODE |
| HIGH⚡ | tests/cli/test_cli_posix_verbs.py | 891 | '"approved":false,"missing":null}\n' | CODE |
| HIGH | tests/cli/cloud/test_cloud_api_client_and_utils.py | 30 | '{"access_token":"token-123","refresh_token":null,"expires_at":9999999999,"token_type":"Bearer"}', | CODE |
| HIGH | tests/cli/cloud/test_cloud_api_client_and_utils.py | 63 | '{"access_token":"token-123","refresh_token":null,"expires_at":9999999999,"token_type":"Bearer"}', | CODE |
| HIGH | tests/cli/cloud/test_cloud_api_client_and_utils.py | 109 | '{"access_token":"token-123","refresh_token":null,"expires_at":9999999999,"token_type":"Bearer"}', | CODE |
| HIGH | tests/cli/cloud/test_cloud_api_client_and_utils.py | 317 | '{"access_token":"oauth-token-456","refresh_token":null,' | CODE |
| HIGH⚡ | tests/okf/test_okf.py | 914 | ["!!set {alpha: null, beta: null}", "[!!set {alpha: null}]", "{nested: !!set {a: null}}"], | CODE |
| HIGH | tests/okf/test_okf.py | 818 | source = b"---\ntype: note\ncustom: !!set {alpha: null, beta: null, gamma: null}\n---\n" | CODE |
| HIGH | benchmarks/tests/agent_tasks/test_models.py | 69 | assert dumped == '{"model_temperature":null}' | CODE |
| HIGH | …nchmarks/src/basic_memory_benchmarks/scoring/review.py | 139 | if (labels[id] === undefined) delete labels[id]; | CODE |
| HIGH | …nchmarks/src/basic_memory_benchmarks/scoring/review.py | 154 | if (ok && fl) ok = (fl==="unlabeled") ? !lab : (lab===fl); | CODE |
| HIGH | …nchmarks/src/basic_memory_benchmarks/scoring/review.py | 170 | human_label: labels[c.query_id + "__" + c.provider] || null, | CODE |
| HIGH | …nchmarks/src/basic_memory_benchmarks/scoring/review.py | 172 | const blob = new Blob([JSON.stringify({{run: RUN, labels: out}}, null, 1)], {{type: "application/json"}}); | CODE |
| HIGH | src/basic_memory/utils.py | 620 | # Skip None entries (e.g. a YAML `tags: [alpha, null]`) so they are not revived as | COMMENT |
| HIGH | src/basic_memory/repository/metadata_filters.py | 151 | (IS NULL: the key is absent or explicitly null). | STRING |
| HIGH | src/basic_memory/repository/sqlite_search_query.py | 357 | # JSON null, and the generated frontmatter_* columns are that same | COMMENT |
| HIGH | src/basic_memory/repository/postgres_search_query.py | 583 | # an explicit JSON null, the same two cases SQLite's json_extract | STRING |
| HIGH | src/basic_memory/markdown/plugins.py | 64 | # if it's a markdown_task, return false | COMMENT |
| HIGH | src/basic_memory/mcp/tools/write_note.py | 607 | # so checksum is null; currentChecksum is the revision to retry | COMMENT |
| HIGH | src/basic_memory/mcp/tools/search.py | 59 | 'for absent-or-null ({"owner": null}); a list for array-contains-all ({"tags": ["a", "b"]}); ' | CODE |
| HIGH | src/basic_memory/mcp/tools/posix_tools.py | 786 | 'score>null' or 'priority in null,high' would answer zero rows for | STRING |
| HIGH | src/basic_memory/mcp/tools/posix_tools.py | 1079 | # Why: projection answers a missing field with null, so an empty segment | COMMENT |
| HIGH | src/basic_memory/mcp/resources/project_info.py | 84 | # (precedence between overlapping template matches is undefined), so a | COMMENT |
| HIGH | src/basic_memory/cli/commands/posix.py | 803 | "'owner=null' (key missing or null). " | CODE |
| HIGH | src/basic_memory/okf/render.py | 177 | state.push("text", "", 0).content = raw | CODE |
| HIGH | src/basic_memory/okf/render.py | 220 | state.push("text", "", 0).content = raw | CODE |
| HIGH | src/basic_memory/api/v2/routers/knowledge_router.py | 207 | Only includes resolved relations (where to_id is not null). | STRING |
| HIGH | src/basic_memory/api/v2/routers/knowledge_router.py | 229 | # Fetch all resolved relations (to_id is not null) with eager-loaded entities | COMMENT |
| HIGH | …basic_memory/indexing/accepted_note_mutation_runner.py | 110 | (checksum null). Keep the message text and key names stable (issue #1445). | STRING |
| HIGH | src/basic_memory/services/context_service.py | 546 | ELSE eg.entity_path || e.id::text || ',' | CODE |
| HIGH | src/basic_memory/services/context_service.py | 706 | eg.entity_path || e.id || ',' as entity_path | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/mcp/test_tool_write_note.py | 723 | # Step 2: Create second note with different title | COMMENT |
| LOW⚡ | tests/mcp/test_tool_write_note.py | 731 | # Step 3: Try to create/replace first note again | COMMENT |
| LOW | tests/mcp/test_tool_write_note.py | 388 | # Step 1: Create initial note (auto-generated permalink) | COMMENT |
| LOW | tests/mcp/test_tool_write_note.py | 409 | # Step 2: Update with content that includes custom permalink in frontmatter | COMMENT |
| LOW | tests/mcp/test_tool_write_note.py | 712 | # Step 1: Create first note | COMMENT |
| LOW⚡ | tests/db/test_issue_254_foreign_key_constraints.py | 46 | # Step 1: Create test project | COMMENT |
| LOW⚡ | tests/db/test_issue_254_foreign_key_constraints.py | 51 | # Step 2: Create related entities that would cause foreign key constraint issues | COMMENT |
| LOW⚡ | tests/db/test_issue_254_foreign_key_constraints.py | 91 | # Step 3: Attempt to remove the project | COMMENT |
| LOW⚡ | tests/db/test_issue_254_foreign_key_constraints.py | 106 | # Step 4: Verify project was successfully removed | COMMENT |
| LOW⚡ | tests/db/test_issue_254_foreign_key_constraints.py | 110 | # Step 5: Verify related data was cascade deleted | COMMENT |
| LOW⚡ | tests/services/test_project_removal_bug.py | 52 | # Step 1: Add the test project | COMMENT |
| LOW⚡ | tests/services/test_project_removal_bug.py | 60 | # Step 2: Create related entities for this project | COMMENT |
| LOW⚡ | tests/services/test_project_removal_bug.py | 76 | # Step 3: Create observations for the entity | COMMENT |
| LOW⚡ | tests/services/test_project_removal_bug.py | 81 | # Step 4: Create relations involving the entity | COMMENT |
| LOW⚡ | tests/services/test_project_removal_bug.py | 106 | # Step 5: Attempt to remove the project | COMMENT |
| LOW⚡ | tests/services/test_project_removal_bug.py | 110 | # Step 6: Verify everything was properly deleted | COMMENT |
| LOW | tests/services/test_entity_service.py | 2132 | # Step 1: Create first entity "Node A" | STRING |
| LOW | tests/services/test_entity_service.py | 2156 | # Step 2: Create Node B to match live test scenario | STRING |
| LOW | tests/services/test_entity_service.py | 2168 | # Step 3: Create Node C - this is where the bug occurs in live testing | STRING |
| LOW | .agents/skills/instrumentation/SKILL.md | 24 | ## Step 1: Detect Language and Frameworks | COMMENT |
| LOW | .claude/commands/release/changelog.md | 18 | ### Step 1: Version Analysis | COMMENT |
| LOW | .claude/commands/release/changelog.md | 34 | ### Step 2: Categorize Changes | COMMENT |
| LOW | .claude/commands/release/changelog.md | 59 | ### Step 3: Generate Changelog Entry | COMMENT |
| LOW | .claude/commands/release/changelog.md | 104 | ### Step 4: Integration | COMMENT |
| LOW | .claude/commands/release/release-check.md | 17 | ### Step 1: Environment Validation | COMMENT |
| LOW | .claude/commands/release/release-check.md | 28 | ### Step 2: Code Quality Gates | COMMENT |
| LOW | .claude/commands/release/release-check.md | 46 | ### Step 3: Documentation Validation | COMMENT |
| LOW | .claude/commands/release/release-check.md | 57 | ### Step 4: Dependency Validation | COMMENT |
| LOW | .claude/commands/release/release-check.md | 68 | ### Step 5: Issue Tracking Validation | COMMENT |
| LOW | .claude/commands/release/release.md | 17 | ### Step 1: Pre-flight Validation | COMMENT |
| LOW | .claude/commands/release/release.md | 38 | ### Step 2: Use Justfile Automation | COMMENT |
| LOW | .claude/commands/release/release.md | 64 | ### Step 3: Monitor Release Process | COMMENT |
| LOW | .claude/commands/release/release.md | 72 | ### Step 4: Post-Release Validation | COMMENT |
| LOW⚡ | .claude/commands/release/beta.md | 17 | ### Step 0: Pre-release dependency check | COMMENT |
| LOW⚡ | .claude/commands/release/beta.md | 25 | ### Step 1: Pre-flight Validation | COMMENT |
| LOW⚡ | .claude/commands/release/beta.md | 31 | ### Step 2: Use Justfile Automation | COMMENT |
| LOW | .claude/commands/release/beta.md | 47 | ### Step 3: Monitor Beta Release | COMMENT |
| LOW | .claude/commands/release/beta.md | 53 | ### Step 4: Beta Testing Instructions | COMMENT |
| LOW⚡ | test-int/mcp/test_chatgpt_tools_integration.py | 430 | # Step 1: Create multiple documents | COMMENT |
| LOW | test-int/mcp/test_chatgpt_tools_integration.py | 466 | # Step 2: Search for API-related content (as ChatGPT would) | COMMENT |
| LOW | test-int/mcp/test_chatgpt_tools_integration.py | 477 | # Step 3: Fetch one of the search results (as ChatGPT would) | COMMENT |
| LOW⚡ | test-int/mcp/test_project_state_sync_integration.py | 24 | # Step 1: Create a second project that we can switch to | COMMENT |
| LOW | test-int/mcp/test_project_state_sync_integration.py | 37 | # Step 2: Test that note operations work in the new project context | COMMENT |
| LOW⚡ | test-int/mcp/test_project_state_sync_integration.py | 52 | # Step 3: Test that we can read the note we just created | COMMENT |
| LOW⚡ | test-int/mcp/test_project_state_sync_integration.py | 60 | # Step 4: Test that edit operations work (this was failing in the original issue) | COMMENT |
| LOW | test-int/mcp/test_project_state_sync_integration.py | 76 | # Step 5: Verify the edit was applied | COMMENT |
| LOW | benchmarks/docs/benchmarks.md | 600 | ### Step 1: Create BM worktrees for target refs | COMMENT |
| LOW | benchmarks/docs/benchmarks.md | 615 | ### Step 2: Prepare benchmark datasets once | COMMENT |
| LOW | benchmarks/docs/benchmarks.md | 624 | ### Step 3: Run BM for each revision with deterministic run IDs | COMMENT |
| LOW | benchmarks/docs/benchmarks.md | 667 | ### Step 4: Run mem0 anchor once per dataset (optional but recommended) | COMMENT |
| LOW | benchmarks/docs/benchmarks.md | 695 | ### Step 5: Compare runs | COMMENT |
| LOW | benchmarks/docs/benchmarks.md | 713 | ### Step 6: Record matrix results | COMMENT |
| LOW | skills/memory-ingest/SKILL.md | 30 | ## Step 1: Parse Raw Input | COMMENT |
| LOW | skills/memory-ingest/SKILL.md | 41 | ## Step 2: Extract Entities | COMMENT |
| LOW | skills/memory-ingest/SKILL.md | 59 | ## Step 3: Search Existing Entities | COMMENT |
| LOW | skills/memory-ingest/SKILL.md | 81 | ## Step 4: Research New Entities (Optional) | COMMENT |
| LOW | skills/memory-ingest/SKILL.md | 93 | ## Step 5: Present Entity Proposal | COMMENT |
| LOW | skills/memory-ingest/SKILL.md | 112 | ## Step 6: Create the Source Note | COMMENT |
| LOW | skills/memory-ingest/SKILL.md | 195 | ## Step 7: Create Approved Entities | STRING |
| LOW | skills/memory-ingest/SKILL.md | 284 | ## Step 8: Extract Action Items | STRING |
| 34 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_codex_plugin_package.py | 62 | CODE | |
| LOW | tests/mcp/test_model_facing_call_examples.py | 47 | CODE | |
| LOW | tests/mcp/test_model_facing_call_examples.py | 73 | CODE | |
| LOW | tests/mcp/test_model_facing_call_examples.py | 93 | CODE | |
| LOW | tests/cli/test_ignore_utils.py | 100 | CODE | |
| LOW | tests/cli/test_share_commands.py | 87 | CODE | |
| LOW | tests/cli/test_share_commands.py | 131 | CODE | |
| LOW | tests/cli/test_share_commands.py | 192 | CODE | |
| LOW | tests/cli/test_share_commands.py | 225 | CODE | |
| LOW | tests/cli/test_share_commands.py | 266 | CODE | |
| LOW | tests/cli/test_share_commands.py | 300 | CODE | |
| LOW | tests/cli/test_share_commands.py | 605 | CODE | |
| LOW | tests/cli/test_share_commands.py | 635 | CODE | |
| LOW | tests/cli/test_man_command.py | 183 | CODE | |
| LOW | tests/services/test_project_service.py | 102 | CODE | |
| LOW | tests/services/test_project_service.py | 353 | CODE | |
| LOW | tests/services/test_project_service.py | 463 | CODE | |
| LOW | tests/services/test_project_service.py | 743 | CODE | |
| LOW | tests/services/test_project_service.py | 936 | CODE | |
| LOW | tests/services/test_project_service.py | 1752 | CODE | |
| LOW | tests/services/test_project_removal_bug.py | 34 | CODE | |
| LOW | integrations/hermes/__init__.py | 496 | CODE | |
| LOW | integrations/hermes/__init__.py | 556 | CODE | |
| LOW | integrations/hermes/__init__.py | 810 | CODE | |
| LOW | integrations/hermes/__init__.py | 1599 | CODE | |
| LOW | integrations/hermes/__init__.py | 1888 | CODE | |
| LOW | integrations/hermes/__init__.py | 743 | CODE | |
| LOW | integrations/hermes/__init__.py | 1672 | CODE | |
| LOW | integrations/tau/continuity.py | 207 | CODE | |
| LOW | integrations/tau/continuity.py | 465 | CODE | |
| LOW | …-int/test_project_index_delete_materialization_race.py | 157 | CODE | |
| LOW | test-int/test_search_performance_benchmark.py | 432 | CODE | |
| LOW | test-int/compare_search_benchmarks.py | 73 | CODE | |
| LOW | benchmarks/tests/agent_tasks/test_task_fixture.py | 99 | CODE | |
| LOW | benchmarks/src/basic_memory_benchmarks/runner.py | 89 | CODE | |
| LOW | benchmarks/src/basic_memory_benchmarks/cli.py | 93 | CODE | |
| LOW | …basic_memory_benchmarks/providers/supermemory_local.py | 82 | CODE | |
| LOW | …marks/src/basic_memory_benchmarks/datasets/convomem.py | 84 | CODE | |
| LOW | …basic_memory_benchmarks/converters/locomo_to_corpus.py | 37 | CODE | |
| LOW | …c/basic_memory_benchmarks/converters/beam_to_corpus.py | 89 | CODE | |
| LOW | …c/basic_memory_benchmarks/converters/xafs_to_corpus.py | 213 | CODE | |
| LOW | …sic_memory_benchmarks/converters/convomem_to_corpus.py | 55 | CODE | |
| LOW | …hmarks/src/basic_memory_benchmarks/agent_tasks/loop.py | 95 | CODE | |
| LOW | …arks/src/basic_memory_benchmarks/agent_tasks/driver.py | 686 | CODE | |
| LOW | benchmarks/src/basic_memory_benchmarks/scoring/beam.py | 209 | CODE | |
| LOW | scripts/sync_memory_schemas.py | 16 | CODE | |
| LOW | src/basic_memory/config.py | 61 | CODE | |
| LOW | src/basic_memory/config_migrations.py | 27 | CODE | |
| LOW | src/basic_memory/utils.py | 79 | CODE | |
| LOW | src/basic_memory/utils.py | 597 | CODE | |
| LOW | src/basic_memory/utils.py | 689 | CODE | |
| LOW | src/basic_memory/ignore_utils.py | 174 | CODE | |
| LOW | src/basic_memory/ignore_utils.py | 205 | CODE | |
| LOW | src/basic_memory/ignore_utils.py | 261 | CODE | |
| LOW | src/basic_memory/man/__init__.py | 238 | CODE | |
| LOW | src/basic_memory/repository/milvus_repository.py | 344 | CODE | |
| LOW | src/basic_memory/repository/search_reader.py | 399 | CODE | |
| LOW | src/basic_memory/repository/search_reader.py | 975 | CODE | |
| LOW | src/basic_memory/repository/search_trace.py | 548 | CODE | |
| LOW | …/basic_memory/repository/embedding_provider_factory.py | 148 | CODE | |
| 102 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_claude_plugin_hooks.py | 28 | # (plugin hooks dir, plugin-root template variable the harness substitutes) | COMMENT |
| MEDIUM⚡ | tests/test_claude_plugin_hooks.py | 55 | # harness shell on both POSIX and Windows, and plugin roots can contain | COMMENT |
| LOW | tests/repository/test_project_repository.py | 135 | # So just create a non-default project | COMMENT |
| MEDIUM⚡ | tests/cli/test_hook_command.py | 1499 | # The operator verb `bm hook install` writes harness config and needs no | COMMENT |
| MEDIUM⚡ | tests/cli/test_hook_command.py | 1502 | # hook, so install still runs and actually writes the harness entries. | COMMENT |
| MEDIUM | tests/cli/test_hook_command.py | 1460 | # must catch it — a hook still exits 0, never a non-zero status to the harness. | COMMENT |
| MEDIUM | tests/cli/test_hook_command.py | 1547 | # run before the hook's own guard (it could return non-zero to the harness) | COMMENT |
| MEDIUM | tests/cli/test_hook_command.py | 1794 | # The settings file is the user's whole harness config, not just our | COMMENT |
| MEDIUM | tests/cli/test_hook_command.py | 1862 | # A user may keep their harness config private (0600); the atomic rewrite | COMMENT |
| MEDIUM | integrations/hermes/.github/workflows/release.yml | 7 | # git tag (`v*.*.*`) — NOT from __init__.py. This is robust to PRs that | COMMENT |
| MEDIUM | test-int/mcp/test_edit_note_integration.py | 1227 | # own slug rather than the exact string, since the harness prefixes the project name. | COMMENT |
| MEDIUM | test-int/semantic/litellm_live_harness.py | 348 | # live calls when someone discovers the harness through `just --list`. | COMMENT |
| MEDIUM | test-int/read_cache/conftest.py | 87 | # construct their own 50ms clients, so keep this shared harness stable. | COMMENT |
| MEDIUM | benchmarks/tests/llm/test_tool_agent.py | 536 | # The summary half is harness-authored, so the operator still learns which | COMMENT |
| MEDIUM | benchmarks/tests/converters/test_xafs_converter.py | 169 | # breakdown; every question routes to the agent harness as judge-graded. | COMMENT |
| MEDIUM | …nchmarks/src/basic_memory_benchmarks/llm/tool_agent.py | 447 | # No detail: the whole message is harness-authored, so there is | COMMENT |
| MEDIUM | benchmarks/src/basic_memory_benchmarks/datasets/xafs.py | 33 | # Exact upstream family keys; the harness maps family -> task "skill" so the | COMMENT |
| MEDIUM | …rks/src/basic_memory_benchmarks/agent_tasks/grading.py | 360 | # reaching here is a harness bug, not a task outcome. | COMMENT |
| MEDIUM | …arks/src/basic_memory_benchmarks/agent_tasks/driver.py | 87 | # harness does NOT inject the project argument into tool calls — naming the | COMMENT |
| MEDIUM | …arks/src/basic_memory_benchmarks/agent_tasks/driver.py | 884 | # handling. Anything else is a harness bug: abort loudly. | COMMENT |
| MEDIUM | scripts/validate_claude_plugin.py | 67 | # Claude harness (settings-based config, session/coding_session types). | COMMENT |
| LOW⚡ | scripts/update_versions.py | 107 | # package release. Codex hook refs are managed by `just set-codex-hook-version`. | COMMENT |
| LOW | src/basic_memory/file_utils.py | 545 | # No frontmatter, just return content | COMMENT |
| LOW | src/basic_memory/ignore_utils.py | 255 | # If we can't read .gitignore, just use default patterns | STRING |
| MEDIUM | …c/basic_memory/mcp/ui/html/search-results-tool-ui.html | 20 | `).replace(N1,"")}function Nw(e,t){return t=KL(t),KL(e)===t}function me(e,t,a,n,r,o){switch(a){case"children":typeof n== | CODE |
| MEDIUM | src/basic_memory/mcp/ui/html/note-preview-tool-ui.html | 20 | `).replace(r1,"")}function Jm(l,t){return t=er(t),er(l)===t}function Z(l,t,a,e,n,u){switch(a){case"children":typeof e==" | CODE |
| MEDIUM | src/basic_memory/mcp/tools/search.py | 1194 | """Search across all content in the knowledge base with comprehensive syntax support. | STRING |
| MEDIUM | src/basic_memory/mcp/tools/move_note.py | 1038 | # misleading the agent (#881 Gap 2). This is the robust backstop behind | STRING |
| MEDIUM | src/basic_memory/mcp/resources/project_info.py | 24 | """Get comprehensive information about a workspace-qualified Basic Memory project. | STRING |
| MEDIUM | src/basic_memory/cli/app.py | 92 | # Trigger: a `hook` invocation (the advisory harness front door, SPEC-55). | COMMENT |
| MEDIUM | src/basic_memory/cli/commands/hook.py | 123 | session_note_type: str # type stamped on this harness's checkpoint notes | CODE |
| MEDIUM | src/basic_memory/cli/commands/hook.py | 519 | # --project-dir wins (the shim passes the harness's project directory so | COMMENT |
| MEDIUM | src/basic_memory/cli/commands/hook.py | 1368 | # ``hook <verb> --harness <harness>`` suffix (rather than the launcher prefix) | COMMENT |
| MEDIUM | src/basic_memory/cli/commands/hook.py | 1449 | # The ownership tag lives in the command's `hook <verb> --harness` | COMMENT |
| MEDIUM | src/basic_memory/hooks/envelope.py | 25 | # A harness session, identified by its producing surface and opaque session id. | COMMENT |
| MEDIUM | src/basic_memory/hooks/envelope.py | 30 | # V0 ships the three events exposed through supported harness hooks. The other | COMMENT |
| MEDIUM | src/basic_memory/hooks/envelope.py | 42 | # Actor when the harness runtime itself produced the event (vs a user action | COMMENT |
| MEDIUM | src/basic_memory/services/project_service.py | 741 | # Update in database using robust lookup | COMMENT |
| MEDIUM | src/basic_memory/services/project_service.py | 776 | # Get project from database using robust lookup | COMMENT |
| MEDIUM | src/basic_memory/services/project_service.py | 818 | """Get comprehensive information about the specified Basic Memory project. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker-compose-postgres.yml | 1 | # Docker Compose configuration for Basic Memory with PostgreSQL | COMMENT |
| LOW | docker-compose-postgres.yml | 41 | COMMENT | |
| LOW | docker-compose.yml | 61 | interval: 30s | COMMENT |
| LOW | docker-compose.yml | 81 | COMMENT | |
| LOW | plugins/claude-code/hooks/session_start.py | 1 | #!/usr/bin/env -S uv run --quiet --script | COMMENT |
| LOW | plugins/claude-code/hooks/pre_compact.py | 1 | #!/usr/bin/env -S uv run --quiet --script | COMMENT |
| LOW | plugins/codex/hooks/session_start.py | 1 | #!/usr/bin/env -S uv run --quiet --script | COMMENT |
| LOW | plugins/codex/hooks/pre_compact.py | 1 | #!/usr/bin/env -S uv run --quiet --script | COMMENT |
| LOW | tests/markdown/test_entity_parser.py | 461 | messages = [record["message"] for record in records] | COMMENT |
| LOW | tests/markdown/test_entity_parser.py | 481 | # | COMMENT |
| LOW | tests/mcp/test_tool_resource.py | 241 | # Skip testing the large document size handling since it would require | COMMENT |
| LOW | tests/mcp/test_tool_contracts.py | 201 | "delete_project": {"readOnlyHint": False, "destructiveHint": True}, | COMMENT |
| LOW | tests/db/test_issue_254_foreign_key_constraints.py | 161 | # Document the current error for tracking | COMMENT |
| LOW | docs/ai-assistant-guide-extended.md | 101 | # "note_count": 156, | COMMENT |
| LOW | integrations/hermes/__init__.py | 1861 | # | COMMENT |
| LOW | integrations/hermes/.github/workflows/release.yml | 1 | name: release | COMMENT |
| LOW | …nchmarks/src/basic_memory_benchmarks/llm/tool_agent.py | 201 | if not secrets: | COMMENT |
| LOW | …arks/src/basic_memory_benchmarks/providers/bm_local.py | 41 | def _isolated_bm_env(self) -> dict[str, str]: | COMMENT |
| LOW | .github/workflows/claude.yml | 1 | name: Claude Code | COMMENT |
| LOW | src/basic_memory/db.py | 21 | ) | COMMENT |
| LOW | src/basic_memory/db.py | 341 | Args: | COMMENT |
| LOW | src/basic_memory/db.py | 601 | finally: | COMMENT |
| LOW | src/basic_memory/temporal.py | 641 | # same span whenever it is asked, which is what refuses `yesterday` further down. | COMMENT |
| LOW | src/basic_memory/temporal.py | 661 | COMMENT | |
| LOW | src/basic_memory/temporal.py | 681 | # rest of it was too broken to parse. A bare `2026` carries no hyphen and is untouched. | COMMENT |
| LOW | src/basic_memory/temporal.py | 821 | # malformed. | COMMENT |
| LOW | src/basic_memory/temporal.py | 881 | if moment is None or date_data.period != "time" or moment.date() != iso.day: | COMMENT |
| LOW | src/basic_memory/temporal.py | 961 | if moment is None: | COMMENT |
| LOW | src/basic_memory/temporal.py | 1001 | case _: | COMMENT |
| LOW | src/basic_memory/temporal.py | 1021 | # entity's `created_at` anchors to derived metadata that can shift on re-import or clone. | COMMENT |
| LOW | src/basic_memory/temporal.py | 1041 | # `sys.get_int_max_str_digits()` -- 4300 by default, and never settable below 640 -- into an | COMMENT |
| LOW | src/basic_memory/config_models.py | 921 | # Skip default-project seeding only for cloud/stateless deployments, where | COMMENT |
| LOW | src/basic_memory/utils.py | 501 | if env == "test": | COMMENT |
| LOW | src/basic_memory/man/__init__.py | 301 | if "default" in prop: | COMMENT |
| LOW | …c/basic_memory/man/man3/basic-memory-diagnostics(3).md | 41 | # → "# Basic Memory Diagnostics | COMMENT |
| LOW | src/basic_memory/repository/search_query.py | 81 | RELAXATION_EDGE_PUNCTUATION = "?!.,;:,。!?;:、" | COMMENT |
| LOW | src/basic_memory/repository/search_query.py | 101 | RELAXATION_ORTHOGRAPHIC_JOINERS = "\u200c\u200d" | COMMENT |
| LOW | src/basic_memory/repository/search_reader.py | 61 | # The shared bind-parameter bound for any statement that carries a list of vector | COMMENT |
| LOW | src/basic_memory/repository/search_reader.py | 1081 | else: | COMMENT |
| LOW | src/basic_memory/repository/search_index_row.py | 161 | # Entity, observation, and relation rows carry ids from independent auto-increment | COMMENT |
| LOW | src/basic_memory/repository/search_repository_base.py | 441 | COMMENT | |
| LOW | src/basic_memory/repository/search_repository_base.py | 1621 | entity_ids, | COMMENT |
| LOW | src/basic_memory/repository/note_content_repository.py | 301 | # write is the single conditional UPDATE whose rowcount decides the | COMMENT |
| LOW | src/basic_memory/repository/observation_repository.py | 141 | # Outcome: leave every existing observation untouched and let the current writer publish. | COMMENT |
| LOW | src/basic_memory/repository/fastembed_provider.py | 241 | # snapshot dir exists but the model artifact file is missing — the | COMMENT |
| LOW | src/basic_memory/markdown/sections.py | 201 | ) | COMMENT |
| LOW | src/basic_memory/runtime/note_object_metadata.py | 41 | } | COMMENT |
| LOW | src/basic_memory/mcp/project_context.py | 901 | # 'research', answered with that one, returned it as the active | COMMENT |
| LOW | src/basic_memory/mcp/project_context.py | 1121 | # rule 1 just claimed against with this same splitter, so asking again | COMMENT |
| LOW | src/basic_memory/mcp/project_context.py | 1161 | # re-resolved against a workspace holding a project literally named | COMMENT |
| LOW | src/basic_memory/mcp/project_context.py | 1181 | # workspace-qualified '<workspace>/<project>/<path>' parsing. A project permalink | COMMENT |
| LOW | src/basic_memory/mcp/project_context.py | 1201 | # looks workspace-shaped ('notes/2026/foo') matches nothing and stays | COMMENT |
| LOW | src/basic_memory/mcp/project_context.py | 1281 | external_id: Optional[str] = None | COMMENT |
| LOW | src/basic_memory/mcp/project_context.py | 1301 | # its miss is terminal: an explicitly named project that must resolve or raise, | COMMENT |
| LOW | src/basic_memory/mcp/project_context.py | 1681 | # ('ls research') or a path under one. | COMMENT |
| LOW | src/basic_memory/mcp/project_context.py | 1701 | # Trigger: a project was named, no mount claimed the segments, and the path | COMMENT |
| LOW | src/basic_memory/mcp/project_context.py | 1721 | ) | COMMENT |
| LOW | src/basic_memory/mcp/tools/edit_note.py | 101 | # 'notes/foo.markdown.md' and a stem identifier still reaches 'notes/foo.markdown'. | COMMENT |
| LOW | src/basic_memory/mcp/tools/write_note.py | 61 | COMMENT | |
| LOW | src/basic_memory/mcp/tools/search.py | 1481 | # Why: SearchQuery rejects the pair too, but the tool assigns its fields after | COMMENT |
| 42 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/mcp/test_tool_write_note.py | 723 | # Step 2: Create second note with different title | COMMENT |
| LOW⚡ | tests/mcp/test_tool_write_note.py | 731 | # Step 3: Try to create/replace first note again | COMMENT |
| LOW | tests/mcp/test_tool_write_note.py | 388 | # Step 1: Create initial note (auto-generated permalink) | COMMENT |
| LOW | tests/mcp/test_tool_write_note.py | 409 | # Step 2: Update with content that includes custom permalink in frontmatter | COMMENT |
| LOW | tests/mcp/test_tool_write_note.py | 712 | # Step 1: Create first note | COMMENT |
| LOW⚡ | tests/db/test_issue_254_foreign_key_constraints.py | 46 | # Step 1: Create test project | COMMENT |
| LOW⚡ | tests/db/test_issue_254_foreign_key_constraints.py | 51 | # Step 2: Create related entities that would cause foreign key constraint issues | COMMENT |
| LOW⚡ | tests/db/test_issue_254_foreign_key_constraints.py | 91 | # Step 3: Attempt to remove the project | COMMENT |
| LOW⚡ | tests/db/test_issue_254_foreign_key_constraints.py | 106 | # Step 4: Verify project was successfully removed | COMMENT |
| LOW⚡ | tests/db/test_issue_254_foreign_key_constraints.py | 110 | # Step 5: Verify related data was cascade deleted | COMMENT |
| LOW⚡ | tests/services/test_project_removal_bug.py | 52 | # Step 1: Add the test project | COMMENT |
| LOW⚡ | tests/services/test_project_removal_bug.py | 60 | # Step 2: Create related entities for this project | COMMENT |
| LOW⚡ | tests/services/test_project_removal_bug.py | 76 | # Step 3: Create observations for the entity | COMMENT |
| LOW⚡ | tests/services/test_project_removal_bug.py | 81 | # Step 4: Create relations involving the entity | COMMENT |
| LOW⚡ | tests/services/test_project_removal_bug.py | 106 | # Step 5: Attempt to remove the project | COMMENT |
| LOW⚡ | tests/services/test_project_removal_bug.py | 110 | # Step 6: Verify everything was properly deleted | COMMENT |
| LOW | tests/services/test_entity_service.py | 2132 | # Step 1: Create first entity "Node A" | STRING |
| LOW | tests/services/test_entity_service.py | 2156 | # Step 2: Create Node B to match live test scenario | STRING |
| LOW | tests/services/test_entity_service.py | 2168 | # Step 3: Create Node C - this is where the bug occurs in live testing | STRING |
| LOW⚡ | test-int/mcp/test_chatgpt_tools_integration.py | 430 | # Step 1: Create multiple documents | COMMENT |
| LOW | test-int/mcp/test_chatgpt_tools_integration.py | 466 | # Step 2: Search for API-related content (as ChatGPT would) | COMMENT |
| LOW | test-int/mcp/test_chatgpt_tools_integration.py | 477 | # Step 3: Fetch one of the search results (as ChatGPT would) | COMMENT |
| LOW⚡ | test-int/mcp/test_project_state_sync_integration.py | 24 | # Step 1: Create a second project that we can switch to | COMMENT |
| LOW | test-int/mcp/test_project_state_sync_integration.py | 37 | # Step 2: Test that note operations work in the new project context | COMMENT |
| LOW⚡ | test-int/mcp/test_project_state_sync_integration.py | 52 | # Step 3: Test that we can read the note we just created | COMMENT |
| LOW⚡ | test-int/mcp/test_project_state_sync_integration.py | 60 | # Step 4: Test that edit operations work (this was failing in the original issue) | COMMENT |
| LOW | test-int/mcp/test_project_state_sync_integration.py | 76 | # Step 5: Verify the edit was applied | COMMENT |
| LOW | src/basic_memory/mcp/project_context.py | 1856 | # Step 1: Resolve project name from config (no network call) | COMMENT |
| LOW | src/basic_memory/mcp/project_context.py | 1887 | # Step 2: Check explicit routing BEFORE workspace resolution | COMMENT |
| LOW | src/basic_memory/mcp/project_context.py | 1905 | # Step 3: Determine if cloud routing is needed | COMMENT |
| LOW | src/basic_memory/mcp/project_context.py | 2029 | # Step 4: Local routing (default) | COMMENT |
| LOW⚡ | src/basic_memory/cli/auth.py | 273 | # Step 1: Request device authorization | COMMENT |
| LOW⚡ | src/basic_memory/cli/auth.py | 278 | # Step 2: Display user instructions | COMMENT |
| LOW⚡ | src/basic_memory/cli/auth.py | 281 | # Step 3: Poll for token | COMMENT |
| LOW⚡ | src/basic_memory/cli/auth.py | 289 | # Step 4: Save tokens | COMMENT |
| LOW | src/basic_memory/cli/commands/cloud/core_commands.py | 234 | # Step 1: Install rclone | COMMENT |
| LOW⚡ | src/basic_memory/cli/commands/cloud/core_commands.py | 267 | # Step 2: Get tenant info (scoped to the target workspace when given) | COMMENT |
| LOW⚡ | src/basic_memory/cli/commands/cloud/core_commands.py | 272 | # Step 3: Generate credentials for that tenant's bucket | COMMENT |
| LOW⚡ | src/basic_memory/cli/commands/cloud/core_commands.py | 277 | # Step 4: Configure the tenant's rclone remote | COMMENT |
| LOW⚡ | …/g9a0b3c4d5e6_add_external_id_to_project_and_entity.py | 76 | # Step 1: Add external_id column as nullable first | COMMENT |
| LOW⚡ | …/g9a0b3c4d5e6_add_external_id_to_project_and_entity.py | 79 | # Step 2: Generate UUIDs for existing rows | COMMENT |
| LOW⚡ | …/g9a0b3c4d5e6_add_external_id_to_project_and_entity.py | 97 | # Step 3: Make external_id NOT NULL | STRING |
| LOW⚡ | …/g9a0b3c4d5e6_add_external_id_to_project_and_entity.py | 105 | # Step 4: Create unique index on project.external_id (idempotent) | STRING |
| LOW⚡ | …/g9a0b3c4d5e6_add_external_id_to_project_and_entity.py | 114 | # Step 1: Add external_id column as nullable first | STRING |
| LOW⚡ | …/g9a0b3c4d5e6_add_external_id_to_project_and_entity.py | 117 | # Step 2: Generate UUIDs for existing rows | STRING |
| LOW⚡ | …/g9a0b3c4d5e6_add_external_id_to_project_and_entity.py | 135 | # Step 3: Make external_id NOT NULL | STRING |
| LOW⚡ | …/g9a0b3c4d5e6_add_external_id_to_project_and_entity.py | 143 | # Step 4: Create unique index on entity.external_id (idempotent) | STRING |
| LOW⚡ | …/f8a9b2c3d4e5_add_pg_trgm_for_fuzzy_link_resolution.py | 75 | # Step 1: Add project_id column as nullable first (idempotent) | COMMENT |
| LOW⚡ | …/f8a9b2c3d4e5_add_pg_trgm_for_fuzzy_link_resolution.py | 79 | # Step 2: Backfill project_id from entity.project_id via from_id | COMMENT |
| LOW | …/f8a9b2c3d4e5_add_pg_trgm_for_fuzzy_link_resolution.py | 98 | # Step 3: Make project_id NOT NULL and add foreign key | STRING |
| LOW⚡ | …/f8a9b2c3d4e5_add_pg_trgm_for_fuzzy_link_resolution.py | 119 | # Step 4: Create index on relation.project_id (idempotent) | STRING |
| LOW⚡ | …/f8a9b2c3d4e5_add_pg_trgm_for_fuzzy_link_resolution.py | 127 | # Step 1: Add project_id column as nullable first (idempotent) | STRING |
| LOW⚡ | …/f8a9b2c3d4e5_add_pg_trgm_for_fuzzy_link_resolution.py | 131 | # Step 2: Backfill project_id from entity.project_id via entity_id | STRING |
| LOW | …/f8a9b2c3d4e5_add_pg_trgm_for_fuzzy_link_resolution.py | 150 | # Step 3: Make project_id NOT NULL and add foreign key | STRING |
| LOW | …/f8a9b2c3d4e5_add_pg_trgm_for_fuzzy_link_resolution.py | 171 | # Step 4: Create index on observation.project_id (idempotent) | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/conftest.py | 286 | # Set BASIC_MEMORY_HOME to the test directory | COMMENT |
| LOW | tests/conftest.py | 822 | # Write file | COMMENT |
| LOW⚡ | tests/test_config.py | 570 | # Set default to a project that exists with exact name match | COMMENT |
| LOW | tests/test_production_cascade_delete.py | 118 | # Check if CASCADE DELETE is configured | COMMENT |
| LOW | tests/test_production_cascade_delete.py | 232 | # Check if entity was cascade deleted | COMMENT |
| LOW | tests/test_production_cascade_delete.py | 252 | # Check if it's a foreign key constraint error | COMMENT |
| LOW | tests/test_production_cascade_delete.py | 306 | # Check if foreign keys are enabled | COMMENT |
| LOW | tests/markdown/test_markdown_processor.py | 40 | # Write file | COMMENT |
| LOW | tests/markdown/test_markdown_processor.py | 89 | # Write file | COMMENT |
| LOW | tests/utils/test_utf8_handling.py | 47 | # Read the file back and verify content | STRING |
| LOW | tests/utils/test_utf8_handling.py | 83 | # Write the file | STRING |
| LOW | tests/utils/test_utf8_handling.py | 138 | # Write the file | STRING |
| LOW | tests/mcp/test_obsidian_yaml_formatting.py | 24 | # Read the file directly to check YAML formatting | COMMENT |
| LOW | tests/mcp/test_obsidian_yaml_formatting.py | 55 | # Read the file to check formatting | COMMENT |
| LOW | tests/mcp/test_tool_write_note.py | 1607 | # Set config to allow overwrites by default | COMMENT |
| LOW | tests/mcp/test_tool_write_note.py | 579 | # Write the file back | STRING |
| LOW | tests/cli/test_project_set_cloud_local.py | 219 | # Set back to local — supply --local-path; existing config path is preserved | COMMENT |
| LOW | tests/cli/test_project_add_with_local_path.py | 68 | # Set HOME to tmp_path so ConfigManager uses our test config | COMMENT |
| LOW | tests/services/test_project_removal_bug.py | 130 | # Check if this is the specific foreign key constraint error from the bug report | COMMENT |
| LOW | tests/services/test_file_service.py | 54 | # Write file and get checksum | COMMENT |
| LOW⚡ | tests/services/test_file_service.py | 237 | # Write file | COMMENT |
| LOW | test-int/conftest.py | 397 | # Set BASIC_MEMORY_HOME to the test directory | COMMENT |
| LOW | test-int/semantic/test_search_diagnostics.py | 229 | # Check if the database entity outranks irrelevant observations | COMMENT |
| LOW | src/basic_memory/db.py | 129 | # Check if Postgres backend is configured (for backward compatibility) | COMMENT |
| LOW | src/basic_memory/utils.py | 47 | # Check if this is a Windows absolute path (e.g., C:\Users\...) | COMMENT |
| LOW | src/basic_memory/utils.py | 123 | # Check if we have CJK characters that should be preserved | COMMENT |
| LOW | src/basic_memory/utils.py | 632 | # Check if it's a JSON array string (common issue from AI assistants) | COMMENT |
| LOW | src/basic_memory/ignore_utils.py | 287 | # Check if the first part of the path matches the directory name | STRING |
| LOW | src/basic_memory/ignore_utils.py | 299 | # Check if any path part matches the directory name | STRING |
| LOW | src/basic_memory/ignore_utils.py | 308 | # Check if any individual path part matches the glob pattern | STRING |
| LOW | src/basic_memory/repository/entity_repository.py | 594 | # Check if this is a FOREIGN KEY constraint failure | COMMENT |
| LOW | src/basic_memory/repository/entity_repository.py | 779 | # Check if this is a FOREIGN KEY constraint failure | COMMENT |
| LOW⚡ | src/basic_memory/repository/repository.py | 47 | # Check if this model has a project_id column | COMMENT |
| LOW | …asic_memory/importers/claude_conversations_importer.py | 79 | # Write file using relative path - FileService handles base_path | COMMENT |
| LOW | src/basic_memory/importers/memory_json_importer.py | 114 | # Write file using relative path - FileService handles base_path | COMMENT |
| LOW | src/basic_memory/importers/chatgpt_importer.py | 74 | # Write file using relative path - FileService handles base_path | COMMENT |
| LOW | src/basic_memory/importers/chatgpt_importer.py | 288 | # Add children to stack in reverse order to maintain conversation flow | COMMENT |
| LOW | src/basic_memory/markdown/entity_parser.py | 230 | # Check if the path is already absolute | COMMENT |
| LOW | src/basic_memory/mcp/tools/view_note.py | 79 | # Check if this is an error message (note not found) | COMMENT |
| LOW | src/basic_memory/mcp/tools/move_note.py | 335 | # Check if note exists in Basic Memory | COMMENT |
| LOW | src/basic_memory/mcp/tools/move_note.py | 993 | # Check if extensions match | STRING |
| LOW | src/basic_memory/cli/commands/db.py | 407 | # Check if it's a cloud-only project — those can't be reindexed locally | COMMENT |
| LOW | src/basic_memory/cli/commands/format.py | 93 | # Check if formatting is enabled | COMMENT |
| LOW | src/basic_memory/cli/commands/cloud/upload.py | 60 | # Check if path exists | COMMENT |
| LOW | src/basic_memory/cli/commands/cloud/upload.py | 129 | # Read file content asynchronously | COMMENT |
| LOW | src/basic_memory/cli/commands/cloud/upload.py | 249 | # Check if file should be ignored | COMMENT |
| LOW | src/basic_memory/cli/commands/cloud/upload_command.py | 93 | # Check if project exists | COMMENT |
| LOW | src/basic_memory/cli/commands/cloud/rclone_commands.py | 786 | # Check if first run requires resync | COMMENT |
| LOW | src/basic_memory/api/v2/routers/project_router.py | 166 | # Check if project already exists before attempting to add | COMMENT |
| LOW | src/basic_memory/api/v2/routers/project_router.py | 579 | # Check if trying to delete the default project | COMMENT |
| LOW | src/basic_memory/alembic/env.py | 198 | # Check if a connection/engine was provided (e.g., from run_migrations) | COMMENT |
| LOW | src/basic_memory/alembic/env.py | 205 | # Check if it's an async URL (sqlite+aiosqlite or postgresql+asyncpg) | COMMENT |
| LOW | …314f1ea54dc4_add_postgres_full_text_search_support_.py | 33 | # Check if we're using Postgres | COMMENT |
| LOW⚡ | src/basic_memory/services/project_service.py | 245 | # Check if either path is a parent of the other | COMMENT |
| LOW⚡ | src/basic_memory/services/project_service.py | 247 | # Check if p2 is under p1 | COMMENT |
| LOW⚡ | src/basic_memory/services/project_service.py | 253 | # Check if p1 is under p2 | COMMENT |
| LOW | src/basic_memory/services/project_service.py | 458 | # Check if project is default | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_alembic_env.py | 24 | def set_main_option(self, name: str, value: str) -> None: | CODE |
| LOW⚡ | tests/test_read_cache_telemetry.py | 46 | def set_attribute(self, name: str, value: object) -> None: | CODE |
| LOW⚡ | tests/test_read_cache_telemetry.py | 49 | def set_attributes(self, attributes: dict[str, object]) -> None: | CODE |
| LOW | tests/mcp/test_client_info.py | 27 | async def set_state(self, key: str, value: object) -> None: | CODE |
| LOW | tests/mcp/conftest.py | 37 | async def set_state(self, key: str, value: object, **kwargs) -> None: | CODE |
| LOW | tests/mcp/test_tool_telemetry.py | 22 | def set_attributes(self, attrs: dict[str, Any]) -> None: | CODE |
| LOW | tests/mcp/test_tool_telemetry.py | 25 | def set_attribute(self, key: str, value) -> None: | CODE |
| LOW⚡ | tests/mcp/test_client_telemetry.py | 27 | def set_attribute(self, key: str, value) -> None: | CODE |
| LOW⚡ | tests/mcp/test_client_telemetry.py | 30 | def set_attributes(self, new_attrs: dict[str, Any]) -> None: | CODE |
| LOW | tests/mcp/test_project_context_scoped_key.py | 21 | async def set_state(self, key: str, value: object) -> None: | CODE |
| LOW | integrations/tau/extension.py | 19 | __all__ = ["MemoryLifecycle", "confirm_write", "execute_tool", "make_tool", "setup", "tool_result"] | CODE |
| LOW | integrations/tau/Basic Memory.py | 10 | __all__ = ["setup"] | CODE |
| LOW | test-int/test_relation_generation_concurrency.py | 334 | async def update_source() -> None: | CODE |
| LOW | benchmarks/src/basic_memory_benchmarks/__init__.py | 5 | __all__ = ["main"] | CODE |
| LOW | benchmarks/src/basic_memory_benchmarks/llm/__init__.py | 26 | __all__ = [ | CODE |
| LOW | …ks/src/basic_memory_benchmarks/agent_tasks/__init__.py | 40 | __all__ = [ | CODE |
| LOW⚡ | scripts/update_versions.py | 80 | def set_server_version(data: dict[str, Any], version: str) -> None: | CODE |
| LOW⚡ | scripts/update_versions.py | 87 | def set_claude_marketplace_version(data: dict[str, Any], version: str) -> None: | CODE |
| LOW⚡ | scripts/update_versions.py | 95 | def set_package_version(data: dict[str, Any], version: str) -> None: | CODE |
| LOW⚡ | scripts/update_versions.py | 99 | def set_npm_lock_version(data: dict[str, Any], version: str) -> None: | CODE |
| LOW | scripts/update_versions.py | 122 | def _update_core(version: str, *, dry_run: bool) -> None: | CODE |
| LOW | scripts/update_versions.py | 136 | def _update_packages(version: str, *, dry_run: bool) -> None: | CODE |
| LOW | scripts/update_versions.py | 197 | def update_versions(raw_version: str, *, scope: str = "all", dry_run: bool) -> None: | CODE |
| LOW | src/basic_memory/config.py | 213 | def set_default_project(self, name: str) -> None: | CODE |
| LOW | src/basic_memory/telemetry.py | 64 | __all__ = ["configure_telemetry", "get_logfire_handler"] | CODE |
| LOW | src/basic_memory/config_models.py | 863 | def set_project_mode(self, project_name: str, mode: ProjectMode) -> None: | CODE |
| LOW | src/basic_memory/project_resolver.py | 117 | __all__ = [ | CODE |
| LOW | src/basic_memory/repository/__init__.py | 16 | __all__ = [ | CODE |
| LOW | src/basic_memory/repository/search_repository.py | 325 | __all__ = [ | CODE |
| LOW⚡ | src/basic_memory/repository/repository.py | 50 | def _set_project_id_if_needed(self, model: T) -> None: | CODE |
| LOW | …asic_memory/importers/claude_conversations_importer.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/basic_memory/importers/claude_projects_importer.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/basic_memory/importers/__init__.py | 23 | __all__ = [ | CODE |
| LOW | src/basic_memory/importers/memory_json_importer.py | 10 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/basic_memory/importers/base.py | 19 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/basic_memory/importers/chatgpt_importer.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/basic_memory/markdown/__init__.py | 24 | __all__ = [ | CODE |
| LOW | src/basic_memory/runtime/note_content.py | 88 | __all__ = [ | CODE |
| LOW | src/basic_memory/document_ingestion/__init__.py | 20 | __all__ = [ | CODE |
| LOW | src/basic_memory/mcp/server.py | 34 | def set_posix_tools_visibility(server: FastMCP, enabled: bool) -> None: | CODE |
| LOW | src/basic_memory/mcp/container.py | 107 | def set_container(container: McpContainer) -> None: | CODE |
| LOW | src/basic_memory/mcp/async_client.py | 343 | def set_client_factory(factory: Callable[..., AbstractAsyncContextManager[AsyncClient]]) -> None: | CODE |
| LOW | src/basic_memory/mcp/project_context.py | 111 | def set_workspace_provider(provider: Callable[[], Awaitable[list[WorkspaceInfo]]]) -> None: | CODE |
| LOW | src/basic_memory/mcp/clients/__init__.py | 23 | __all__ = [ | CODE |
| LOW | src/basic_memory/mcp/ui/__init__.py | 5 | __all__ = ["get_ui_variant", "load_html", "load_variant_html"] | CODE |
| LOW | src/basic_memory/mcp/tools/__init__.py | 40 | __all__ = [ | CODE |
| LOW | src/basic_memory/mcp/resources/__init__.py | 7 | __all__ = ["manual_index", "manual_page", "note_resource", "project_info"] | CODE |
| LOW | src/basic_memory/mcp/prompts/__init__.py | 15 | __all__ = [ | CODE |
| LOW | src/basic_memory/models/__init__.py | 17 | __all__ = [ | CODE |
| LOW | src/basic_memory/cli/container.py | 68 | def set_container(container: CliContainer) -> None: | CODE |
| LOW | src/basic_memory/cli/commands/__init__.py | 21 | __all__ = [ | CODE |
| LOW | src/basic_memory/schemas/__init__.py | 96 | __all__ = [ | CODE |
| LOW | src/basic_memory/schemas/v2/__init__.py | 27 | __all__ = [ | CODE |
| LOW | src/basic_memory/picoschema/__init__.py | 39 | __all__ = [ | CODE |
| LOW | src/basic_memory/hooks/adapters/__init__.py | 29 | __all__ = [ | CODE |
| LOW | src/basic_memory/api/__init__.py | 5 | __all__ = ["app"] | CODE |
| LOW | src/basic_memory/api/container.py | 156 | def set_container(container: ApiContainer) -> None: | CODE |
| LOW | src/basic_memory/api/v2/__init__.py | 26 | __all__ = [ | CODE |
| LOW | src/basic_memory/api/v2/routers/__init__.py | 21 | __all__ = [ | CODE |
| LOW | src/basic_memory/api/v2/routers/importer_router.py | 30 | logger = logging.getLogger(__name__) | CODE |
| 7 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/repository/test_pgvector_index.py | 65 | CODE | |
| LOW | tests/repository/test_semantic_vector_sync.py | 52 | CODE | |
| LOW | tests/repository/test_semantic_search_base.py | 94 | CODE | |
| LOW | benchmarks/src/basic_memory_benchmarks/cli.py | 361 | CODE | |
| LOW | benchmarks/src/basic_memory_benchmarks/cli.py | 418 | CODE | |
| LOW | benchmarks/src/basic_memory_benchmarks/cli.py | 483 | CODE | |
| LOW | benchmarks/src/basic_memory_benchmarks/cli.py | 784 | CODE | |
| LOW | src/basic_memory/repository/search_trace.py | 248 | CODE | |
| LOW | src/basic_memory/repository/search_repository.py | 88 | CODE | |
| LOW | src/basic_memory/repository/search_repository.py | 114 | CODE | |
| LOW | src/basic_memory/repository/search_repository_base.py | 275 | CODE | |
| LOW | src/basic_memory/repository/search_repository_base.py | 330 | CODE | |
| LOW | src/basic_memory/repository/litellm_provider.py | 109 | CODE | |
| LOW | src/basic_memory/repository/repository.py | 412 | CODE | |
| LOW | src/basic_memory/mcp/tools/edit_note.py | 469 | CODE | |
| LOW | src/basic_memory/mcp/tools/ui_sdk.py | 32 | CODE | |
| LOW | src/basic_memory/mcp/tools/utils.py | 357 | CODE | |
| LOW | src/basic_memory/mcp/tools/utils.py | 461 | CODE | |
| LOW | src/basic_memory/mcp/tools/utils.py | 578 | CODE | |
| LOW | src/basic_memory/mcp/tools/utils.py | 700 | CODE | |
| LOW | src/basic_memory/mcp/tools/utils.py | 817 | CODE | |
| LOW | src/basic_memory/mcp/tools/utils.py | 943 | CODE | |
| LOW | src/basic_memory/mcp/tools/write_note.py | 278 | CODE | |
| LOW | src/basic_memory/mcp/tools/search.py | 1059 | CODE | |
| LOW | src/basic_memory/mcp/tools/read_note.py | 87 | CODE | |
| LOW | src/basic_memory/mcp/tools/recent_activity.py | 52 | CODE | |
| LOW | src/basic_memory/mcp/tools/posix_tools.py | 203 | CODE | |
| LOW | src/basic_memory/mcp/tools/posix_tools.py | 355 | CODE | |
| LOW | src/basic_memory/mcp/tools/posix_tools.py | 581 | CODE | |
| LOW | src/basic_memory/mcp/tools/posix_tools.py | 966 | CODE | |
| LOW | src/basic_memory/mcp/tools/build_context.py | 199 | CODE | |
| LOW | src/basic_memory/mcp/tools/list_directory.py | 29 | CODE | |
| LOW | src/basic_memory/cli/commands/ci.py | 50 | CODE | |
| LOW | src/basic_memory/cli/commands/inspect.py | 535 | CODE | |
| LOW | src/basic_memory/cli/commands/posix.py | 497 | CODE | |
| LOW | src/basic_memory/cli/commands/posix.py | 582 | CODE | |
| LOW | src/basic_memory/cli/commands/posix.py | 642 | CODE | |
| LOW | src/basic_memory/cli/commands/posix.py | 726 | CODE | |
| LOW | src/basic_memory/cli/commands/posix.py | 784 | CODE | |
| LOW | src/basic_memory/cli/commands/posix.py | 893 | CODE | |
| LOW | src/basic_memory/cli/commands/posix.py | 950 | CODE | |
| LOW | src/basic_memory/cli/commands/tool.py | 591 | CODE | |
| LOW | src/basic_memory/cli/commands/tool.py | 720 | CODE | |
| LOW | src/basic_memory/cli/commands/tool.py | 908 | CODE | |
| LOW | src/basic_memory/cli/commands/tool.py | 1022 | CODE | |
| LOW | src/basic_memory/cli/commands/tool.py | 1112 | CODE | |
| LOW | src/basic_memory/cli/commands/tool.py | 1199 | CODE | |
| LOW | src/basic_memory/cli/commands/project.py | 845 | CODE | |
| LOW | src/basic_memory/cli/commands/cloud/rclone_commands.py | 703 | CODE | |
| LOW | src/basic_memory/services/context_service.py | 110 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/utils/test_frontmatter_obsidian_compatible.py | 110 | post.metadata["authors"] = ["John Doe", "Jane Smith"] | CODE |
| LOW | tests/mcp/test_project_context.py | 869 | name="Acme Corp", | CODE |
| LOW | tests/mcp/test_tool_project_management.py | 1128 | cloud_workspace_name="Acme Corp", | CODE |
| LOW | tests/mcp/test_tool_project_management.py | 1139 | assert merged[0]["workspace_name"] == "Acme Corp" | CODE |
| LOW⚡ | tests/picoschema/test_diff.py | 143 | notes[0] = _note("n0", observations=[Obs("name", "P0"), Obs("fax", "555-1234")]) | CODE |
| LOW⚡ | tests/picoschema/test_validator.py | 167 | result = validate_note("test-note", schema, [], [Rel("works_at", "Acme Corp")]) | CODE |
| LOW⚡ | tests/picoschema/test_validator.py | 171 | assert result.field_results[0].values == ["Acme Corp"] | CODE |
| LOW⚡ | tests/picoschema/test_validator.py | 265 | relations = [Rel("works_at", "Acme Corp"), Rel("friends_with", "Bob")] | CODE |
| LOW | tests/api/v2/test_knowledge_router.py | 2494 | json={"title": title, "directory": "test", "content": "placeholder"}, | CODE |
| LOW | tests/api/v2/test_overlapping_saves.py | 28 | f"version {version} paragraph {paragraph} " + "lorem ipsum dolor sit amet " * 40 | CODE |
| LOW | tests/api/v2/test_overlapping_saves.py | 28 | f"version {version} paragraph {paragraph} " + "lorem ipsum dolor sit amet " * 40 | CODE |
| LOW | docs/ai-assistant-guide-extended.md | 676 | "email": "user@example.com", | CODE |
| LOW⚡ | integrations/openclaw/openclaw.plugin.json | 39 | "placeholder": "my-agent", | CODE |
| LOW⚡ | integrations/openclaw/openclaw.plugin.json | 44 | "placeholder": "memory/", | CODE |
| LOW⚡ | integrations/openclaw/openclaw.plugin.json | 49 | "placeholder": "MEMORY.md", | CODE |
| LOW⚡ | integrations/openclaw/openclaw.plugin.json | 54 | "placeholder": "bm", | CODE |
| LOW⚡ | integrations/openclaw/openclaw.plugin.json | 64 | "placeholder": "10", | CODE |
| LOW⚡ | integrations/openclaw/openclaw.plugin.json | 74 | "placeholder": "Check for active tasks and recent activity...", | CODE |
| LOW | integrations/openclaw/openclaw.plugin.json | 85 | "placeholder": ".", | CODE |
| LOW | integrations/openclaw/tools/list-workspaces.test.ts | 64 | name: "Acme Corp", | CODE |
| LOW | integrations/openclaw/tools/list-workspaces.test.ts | 94 | name: "Acme Corp", | CODE |
| LOW | test-int/mcp/test_param_aliases_integration.py | 148 | "find_text": "placeholder", | CODE |
| LOW⚡ | test-int/mcp/test_read_content_integration.py | 302 | This is section {i + 1} with substantial content. Lorem ipsum dolor sit amet, | CODE |
| LOW⚡ | test-int/mcp/test_read_content_integration.py | 302 | This is section {i + 1} with substantial content. Lorem ipsum dolor sit amet, | CODE |
| LOW | test-int/mcp/test_read_content_integration.py | 341 | assert "Lorem ipsum" in content | STRING |
| LOW⚡ | test-int/mcp/test_long_relation_type_integration.py | 30 | "**Lorem ipsum dolor sit amet** — consectetur adipiscing elit, sed do eiusmod " | CODE |
| LOW⚡ | test-int/mcp/test_long_relation_type_integration.py | 30 | "**Lorem ipsum dolor sit amet** — consectetur adipiscing elit, sed do eiusmod " | CODE |
| LOW | skills/memory-research/SKILL.md | 39 | search_notes(query="Acme Corp") | CODE |
| LOW | skills/memory-research/SKILL.md | 111 | title="Acme Corp", | CODE |
| LOW | skills/memory-research/SKILL.md | 206 | identifier="Acme Corp", | CODE |
| LOW | …c/basic_memory/mcp/ui/html/search-results-tool-ui.html | 20 | `).replace(N1,"")}function Nw(e,t){return t=KL(t),KL(e)===t}function me(e,t,a,n,r,o){switch(a){case"children":typeof n== | CODE |
| LOW | src/basic_memory/mcp/ui/html/note-preview-tool-ui.html | 20 | `).replace(r1,"")}function Jm(l,t){return t=er(t),er(l)===t}function Z(l,t,a,e,n,u){switch(a){case"children":typeof e==" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | pyproject.toml | 232 | "*/services/initialization.py", # Startup orchestration + background tasks (watchers); exercised indirectly in entry | CODE |
| MEDIUM⚡ | tests/cli/test_cli_posix_verbs.py | 1150 | # Errors and routing (shared command scaffold, exercised per verb) | COMMENT |
| MEDIUM | test-int/BENCHMARKS.md | 39 | ### Multilingual embedding model comparison | COMMENT |
| MEDIUM | test-int/BENCHMARKS.md | 94 | ### Optional guardrails (recommended for nightly runs only) | COMMENT |
| MEDIUM | …ic_memory_benchmarks/providers/baseline_fullcontext.py | 26 | # with room for prompt scaffolding. LongMemEval-S groups (~115K tokens) fit. | COMMENT |
| MEDIUM⚡ | src/basic_memory/repository/search_repository_base.py | 1575 | # Shared semantic search: sync_entity_vectors orchestration | COMMENT |
| MEDIUM | src/basic_memory/repository/search_repository_base.py | 508 | # Compatibility: focused orchestration tests and third-party subclasses | COMMENT |
| MEDIUM | src/basic_memory/mcp/async_client.py | 336 | # Optional factory override for dependency injection. | COMMENT |
| MEDIUM | src/basic_memory/services/project_readiness.py | 309 | # provider, and building one here would load the embedding model. The | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL⚡ | integrations/hermes/tests/test_prefetch.py | 105 | timeout = p._actor.call.call_args.kwargs.get("timeout") or p._actor.call.call_args[1].get( | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/mcp/test_project_context.py | 3564 | CODE | |
| MEDIUM | tests/mcp/test_tool_edit_note.py | 1116 | CODE | |
| MEDIUM | tests/mcp/test_tool_edit_note.py | 1320 | CODE | |
| MEDIUM | tests/mcp/tools/test_search_notes_multi_project.py | 391 | CODE | |
| MEDIUM | tests/indexing/test_forward_reference_resolution.py | 427 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/basic_memory/utils.py | 890 | # once a parent segment stays ambiguous (kept as requested), a deeper | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | test-int/mcp/test_edit_note_integration.py | 955 | assert "def test_function():" in content | CODE |
| LOW | test-int/mcp/test_edit_note_integration.py | 913 | def test_function(): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker-compose-postgres.yml | 7 | # Usage: | COMMENT |