AI Slop Code RIsk Monitor

AgriciDaniel/claude-obsidian

Self-organizing AI second brain for Obsidian + Claude Code. Drop any source and Claude reads, links, and files it into one connected knowledge graph of plain Markdown you own. AI note-taking, personal knowledge management (PKM), and an open-source Notion alternative. Based on Karpathy's LLM Wiki pattern.

20.1 Elevated pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for AgriciDaniel/claude-obsidian, a Python project with 15,465 GitHub stars. SynthScan examined 53,295 lines of code across 165 source files, recording 824 pattern matches distributed across 14 syntactic categories. The legacy adjusted pattern signal is 20.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.

20.1
Adjusted Signal
20.1
Raw Pattern Score
100%
Time Factor
2026-09-10
Last Push
15.5K
Stars
Python
Language
53.3K
Lines of Code
165
Files
824
Pattern Hits
2026-10-12
Scan Date
0.26
HC Hit Rate

Risk Review · v3

Use each vector to guide manual verification of the underlying findings.

Cognitive Ownership Risk 42.5/100 · MEDIUM

Can maintainers explain intent, assumptions, and trade-offs? 653 finding(s).

Hallucinated Dependency & Supply Chain Risk 5.4/100 · LOW

Are imports declared and package/API names verified? 55 finding(s).

Agent Over-Engineering Ratio 58.5/100 · HIGH

Are wrappers, guards, and repeated structures necessary? 684 finding(s).

PR Review Velocity Impact 66.0/100 · HIGH

Which changes need focused human review? 824 finding(s).

What These Metrics Mean

Adjusted Signal
Legacy pattern score normalized per 1,000 scanned lines and multiplied by the repository-level time factor. It is not an estimate of AI authorship.
Raw Pattern Score
Sum of severity- and context-weighted pattern findings before applying the time factor.
Time Factor
A coarse multiplier based on repository last-push metadata. It does not identify when individual code was written.
Pattern Hits
Count of configured pattern findings. Review each location and surrounding code before acting.
HC Hit Rate
High- and critical-severity findings per scanned file. Severity is a configured detector weight, not proof of a vulnerability or authorship.
Lines / Files
Scan coverage denominators used by the legacy normalized score.

Pattern-Signal History

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.

Severity Breakdown

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.

CRITICAL 0HIGH 43MEDIUM 55LOW 726

Directory Score Breakdown

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.

Pattern Findings

The scanner identified 824 distinct pattern matches across 14 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.

Hyper-Verbose Identifiers568 hits · 514 pts
SeverityFileLineSnippetContext
LOW⚡tests/test_contracts.py68 def test_capability_and_transaction_operation_types_cannot_drift(self) -> None:CODE
LOW⚡tests/test_contracts.py71 def test_canonical_contracts_validate(self) -> None:CODE
LOW⚡tests/test_contracts.py74 def test_manifest_covers_every_current_skill(self) -> None:CODE
LOW⚡tests/test_contracts.py81 def test_product_contract_locks_privacy_compatibility_and_release_authority(CODE
LOW⚡tests/test_contracts.py285 def test_missing_implementation_path_is_rejected(self) -> None:CODE
LOW⚡tests/test_contracts.py292 def test_unregistered_skill_is_rejected(self) -> None:CODE
LOW⚡tests/test_contracts.py301 def test_inconsistent_mutation_and_egress_declarations_are_rejected(self) -> None:CODE
LOW⚡tests/test_contracts.py409 def test_missing_optional_configuration_is_available(self) -> None:CODE
LOW⚡tests/test_contracts.py414 def test_partial_configuration_is_degraded(self) -> None:CODE
LOW⚡tests/test_contracts.py422 def test_complete_configuration_is_configured(self) -> None:CODE
LOW⚡tests/test_contracts.py428 def test_successful_execution_is_verified(self) -> None:CODE
LOW⚡tests/test_contracts.py434 def test_failed_execution_is_degraded(self) -> None:CODE
LOWtests/test_contracts.py105 def test_evaluation_is_deterministic_and_has_no_absolute_roots(self) -> None:CODE
LOWtests/test_contracts.py113 def test_canonical_core_capabilities_report_only_behavioral_verification(CODE
LOWtests/test_contracts.py148 def test_canonical_verifiers_are_behavioral_or_explain_their_absence(self) -> None:CODE
LOWtests/test_contracts.py168 def test_wiki_cli_and_lint_scopes_are_least_privilege(self) -> None:CODE
LOWtests/test_contracts.py211 def test_verified_wiki_contract_covers_every_init_target(self) -> None:CODE
LOWtests/test_contracts.py244 def test_cli_check_only_and_unknown_capability(self) -> None:CODE
LOWtests/test_contracts.py324 def test_absolute_tracked_paths_are_rejected(self) -> None:CODE
LOWtests/test_contracts.py335 def test_empty_verifier_requires_an_explicit_reason(self) -> None:CODE
LOWtests/test_contracts.py340 def test_self_and_schema_only_verifiers_are_rejected(self) -> None:CODE
LOWtests/test_contracts.py379 def test_malformed_json_returns_structured_errors(self) -> None:CODE
LOWtests/test_contracts.py385 def test_duplicate_contract_keys_return_structured_errors(self) -> None:CODE
LOWtests/test_contracts.py445 def test_missing_automated_verifier_stays_configured_with_reason(self) -> None:CODE
LOW⚡tests/test_release.py355 def test_tracked_symlink_is_rejected(self) -> None:CODE
LOW⚡tests/test_release.py365 def test_root_raw_and_live_vault_state_are_hard_rejected(self) -> None:CODE
LOW⚡tests/test_release.py375 def test_secret_token_is_rejected(self) -> None:CODE
LOW⚡tests/test_release.py385 def test_private_repo_url_needs_named_disclosure(self) -> None:CODE
LOW⚡tests/test_release.py395 def test_absolute_home_path_is_rejected(self) -> None:CODE
LOW⚡tests/test_release.py403 def test_personal_email_address_is_rejected(self) -> None:CODE
LOW⚡tests/test_release.py413 def test_quoted_unicode_literal_and_encoded_email_forms_are_rejected(self) -> None:CODE
LOW⚡tests/test_release.py459 def test_unreviewed_binary_is_rejected(self) -> None:CODE
LOW⚡tests/test_release.py466 def test_missing_config_and_non_zip_output_fail_closed(self) -> None:CODE
LOW⚡tests/test_release.py476 def test_failed_build_does_not_replace_existing_artifact(self) -> None:CODE
LOW⚡tests/test_release.py483 def test_collected_bytes_must_match_the_clean_git_blob(self) -> None:CODE
LOW⚡tests/test_release.py651 def test_traversal_entry_is_rejected_without_extraction(self) -> None:CODE
LOW⚡tests/test_release.py659 def test_archive_symlink_and_special_entry_are_rejected(self) -> None:CODE
LOW⚡tests/test_release.py669 def test_compressed_bomb_is_rejected_before_expansion(self) -> None:CODE
LOWtests/test_release.py66 def test_public_policy_never_selects_root_contributor_vault_state(self) -> None:CODE
LOWtests/test_release.py170 def test_release_authority_json_rejects_duplicate_keys(self) -> None:CODE
LOWtests/test_release.py184 def test_release_authority_json_rejects_nonfinite_numbers(self) -> None:CODE
LOWtests/test_release.py200 def test_release_authority_rejects_unknown_keys(self) -> None:CODE
LOWtests/test_release.py215 def test_portable_unicode_path_collision_is_rejected_before_build(self) -> None:CODE
LOWtests/test_release.py232 def test_two_builds_are_byte_identical_and_self_auditing(self) -> None:CODE
LOWtests/test_release.py267 def test_public_marketplace_is_injected_only_into_the_audited_artifact(CODE
LOWtests/test_release.py341 def test_dirty_and_untracked_worktrees_are_rejected_without_output(self) -> None:CODE
LOWtests/test_release.py427 def test_release_safe_email_addresses_are_accepted(self) -> None:CODE
LOWtests/test_release.py438 def test_non_email_at_sign_forms_are_accepted(self) -> None:CODE
LOWtests/test_release.py448 def test_release_safe_domains_require_an_exact_match(self) -> None:CODE
LOWtests/test_release.py501 def test_git_environment_cannot_redirect_release_provenance(self) -> None:CODE
LOWtests/test_release.py542 def test_build_does_not_refresh_or_mutate_the_real_git_index(self) -> None:CODE
LOWtests/test_release.py575 def test_release_version_and_date_surfaces_are_coordinated(self) -> None:CODE
LOWtests/test_release.py612 def test_repository_allowlist_is_canonical_and_valid(self) -> None:CODE
LOWtests/test_release.py681 def test_live_state_and_secret_filename_are_rejected(self) -> None:CODE
LOWtests/test_release.py699 def test_archive_with_personal_email_address_is_rejected(self) -> None:CODE
LOWtests/test_release.py716 def test_tampered_valid_artifact_fails_manifest_and_checksums(self) -> None:CODE
LOWtests/test_release.py734 def test_mode_tampering_is_rejected_against_manifest(self) -> None:CODE
LOWtests/test_release.py750 def test_local_header_timestamp_must_match_central_directory(self) -> None:CODE
LOWtests/test_release.py770 def test_alternate_valid_zip_header_encoding_is_noncanonical(self) -> None:CODE
LOWtests/test_release.py794 def test_audit_snapshot_rejects_artifact_path_replacement(self) -> None:CODE
508 more matches not shown…
Decorative Section Separators52 hits · 195 pts
SeverityFileLineSnippetContext
MEDIUMtests/test_concurrent_write.sh56# ── Worker function: acquire lock, append, release ──────────────────────────COMMENT
MEDIUMtests/test_concurrent_write.sh81# ── Spawn workers in parallel ───────────────────────────────────────────────COMMENT
MEDIUMtests/test_concurrent_write.sh100# ── Verify: file has seed + exactly N tagged lines ──────────────────────────COMMENT
MEDIUM⚡tests/test_concurrent_write.sh117# ── Verify: no orphaned lockfiles ───────────────────────────────────────────COMMENT
MEDIUM⚡tests/test_concurrent_write.sh121# ── Verify: clear-stale reports 0 (nothing to reap) ─────────────────────────COMMENT
MEDIUM⚡tests/test_concurrent_write.sh125# ── Verify: file content sanity (no truncated/garbled lines) ────────────────COMMENT
MEDIUM⚡tests/test_contextual_prefix.py53# ─── Below the floor → no cache_control (silent no-op avoided) ───────────────COMMENT
MEDIUM⚡tests/test_contextual_prefix.py63# ─── At / above the floor → ephemeral cache_control ──────────────────────────COMMENT
MEDIUM⚡tests/test_wiki_lock.sh77# ── acquire on a fresh path returns 0 ────────────────────────────────────────COMMENT
MEDIUM⚡tests/test_wiki_lock.sh81# ── second acquire while the lock is fresh returns 75 ────────────────────────COMMENT
MEDIUM⚡tests/test_wiki_lock.sh88# ── peek shows the lock ──────────────────────────────────────────────────────COMMENT
MEDIUM⚡tests/test_wiki_lock.sh95# ── list shows the held lock ─────────────────────────────────────────────────COMMENT
MEDIUM⚡tests/test_wiki_lock.sh102# ── release frees the lock (cross-process release is allowed by design) ─────COMMENT
MEDIUM⚡tests/test_wiki_lock.sh107# ── re-acquire after release succeeds ───────────────────────────────────────COMMENT
MEDIUM⚡tests/test_wiki_lock.sh112# ── short --stale-after-sec lets us test age-based reap quickly ─────────────COMMENT
MEDIUM⚡tests/test_wiki_lock.sh146# ── peek on unheld path ──────────────────────────────────────────────────────COMMENT
MEDIUM⚡tests/test_wiki_lock.sh150# ── path validation: absolute path rejected ──────────────────────────────────COMMENT
MEDIUM⚡tests/test_wiki_lock.sh154# ── path validation: traversal rejected ──────────────────────────────────────COMMENT
MEDIUM⚡tests/test_wiki_lock.sh158# ── path validation: empty rejected ──────────────────────────────────────────COMMENT
MEDIUM⚡tests/test_wiki_lock.sh162# ── path validation: newline rejected (v1.7.2; closes audit M4) ──────────────COMMENT
MEDIUM⚡tests/test_wiki_lock.sh168# ── path validation: carriage return rejected (v1.7.2; closes audit M4) ──────COMMENT
MEDIUM⚡tests/test_wiki_lock.sh172# ── numeric inputs are validated before Bash arithmetic ──────────────────────────────COMMENT
MEDIUMtests/test_wiki_lock.sh306# ── stress: 10 unique paths all acquire cleanly ──────────────────────────────COMMENT
MEDIUMtests/test_wiki_lock.sh326# ── summary ──────────────────────────────────────────────────────────────────COMMENT
MEDIUM⚡tests/test_bm25_index.py60# ─── tokenize() ──────────────────────────────────────────────────────────────COMMENT
MEDIUMtests/test_bm25_index.py190# ─── build_index + query() ───────────────────────────────────────────────────COMMENT
MEDIUMtests/test_bm25_index.py856# ─── CLI smoke test ──────────────────────────────────────────────────────────COMMENT
MEDIUM⚡tests/test_wiki_mode.py203# ─── Zettel ID format ───────────────────────────────────────────────────────COMMENT
MEDIUM⚡tests/test_wiki_mode.py479# ─── Invalid content type raises ───────────────────────────────────────────COMMENT
MEDIUM⚡tests/test_wiki_mode.py489# ─── CLI subprocess: `wiki-mode.py get` returns mode string ─────────────────COMMENT
MEDIUMtests/test_wiki_mode.py51# ─── Default-to-generic when no config file ──────────────────────────────────COMMENT
MEDIUMtests/test_wiki_mode.py68# ─── Existing config load ────────────────────────────────────────────────────COMMENT
MEDIUMtests/test_wiki_mode.py100# ─── Existing corrupt mode.json fails closed ────────────────────────────────COMMENT
MEDIUMtests/test_wiki_mode.py119# ─── Mode=generic routing matches v1.7 conventions ──────────────────────────COMMENT
MEDIUMtests/test_wiki_mode.py145# ─── Mode=lyt routing: all atomic notes flat under wiki/notes/ ──────────────COMMENT
MEDIUMtests/test_wiki_mode.py157# ─── Mode=para routing: actionability-based folders ─────────────────────────COMMENT
MEDIUMtests/test_wiki_mode.py187# ─── Mode=zettelkasten routing: flat, timestamp-prefixed ────────────────────COMMENT
MEDIUMtests/test_wiki_mode.py249# ─── Slugify handles unicode + special chars ────────────────────────────────COMMENT
MEDIUMtests/test_wiki_mode.py408# ─── CLI --mode preview override (v1.8.2) ───────────────────────────────────COMMENT
MEDIUMtests/test_wiki_mode.py532# ─── CLI subprocess: `wiki-mode.py id` returns a sortable nonce ID ───────COMMENT
MEDIUMtests/test_wiki_mode.py552# ─── CLI subprocess: `wiki-mode.py route source NAME` returns a path ────────COMMENT
MEDIUMtests/test_wiki_mode.py579# ─── CLI subprocess: invalid mode rejected ──────────────────────────────────COMMENT
MEDIUMtests/test_wiki_mode.py594# ─── CLI subprocess: templates listing returns all 6 ───────────────────────COMMENT
MEDIUMtests/test_wiki_mode.py610# ─── Single-source page vocabulary (claude_obsidian.page_schema) ─────────────COMMENT
MEDIUM⚡tests/test_retrieve.py81# ─── import_sibling ──────────────────────────────────────────────────────────COMMENT
MEDIUM⚡tests/test_retrieve.py89# ─── chunk_snippet ───────────────────────────────────────────────────────────COMMENT
MEDIUM⚡tests/test_retrieve.py104# ─── rerank.cosine() ─────────────────────────────────────────────────────────COMMENT
MEDIUMtests/test_retrieve.py238# ─── rerank.rerank() no-op fallback ──────────────────────────────────────────COMMENT
MEDIUMtests/test_retrieve.py379# ─── Nomic asymmetric task prefixes and cache scheme ──────────────────────COMMENT
MEDIUMtests/test_retrieve.py620# ─── retrieve.py CLI: exit 10 when not provisioned ────────────────────────────COMMENT
MEDIUMtests/test_retrieve.py820# ─── Integration smoke test: end-to-end with synthetic data ──────────────────COMMENT
MEDIUMtests/test_retrieve.py1109# ─── M8 closure: --explain and --no-rerank flag coverage ─────────────────────COMMENT
Empty Error Handlers38 hits · 190 pts
SeverityFileLineSnippetContext
HIGHtests/test_transaction.py120except RuntimeError:CODE
HIGHtests/test_transaction.py1127except Exception:CODE
HIGHtests/test_transaction.py441except RuntimeError:CODE
HIGHtests/test_vault_ops.py99except LedgerValidationError:CODE
HIGHtests/test_windows_compat.py241except NotADirectoryError:CODE
HIGHtests/test_ledgers.py675except LedgerValidationError:CODE
HIGHtests/test_bm25_index.py824except (OSError, bm25.TransactionError):CODE
HIGHtests/test_wiki_mode.py394except ValueError:CODE
HIGHtests/test_wiki_mode.py401except ValueError:CODE
HIGHclaude_obsidian/release.py2552except FileNotFoundError:CODE
HIGHclaude_obsidian/release.py2570except FileNotFoundError:CODE
HIGHclaude_obsidian/checkpoint.py497except FileNotFoundError:CODE
HIGHclaude_obsidian/legacy_lock.py526except FileNotFoundError:CODE
HIGHclaude_obsidian/transaction.py1516except (ImportError, AttributeError, OSError, TypeError, ValueError):CODE
HIGHclaude_obsidian/transaction.py1630except FileNotFoundError:CODE
HIGHclaude_obsidian/transaction.py1634except OSError:CODE
HIGHclaude_obsidian/transaction.py1641except OSError:CODE
HIGHclaude_obsidian/transaction.py2396except OSError:CODE
HIGHclaude_obsidian/transaction.py886except FileNotFoundError:CODE
HIGHclaude_obsidian/transaction.py1619except FileNotFoundError:CODE
HIGHclaude_obsidian/transaction.py2101except FileExistsError:CODE
HIGHclaude_obsidian/transaction.py2304except FileNotFoundError:CODE
HIGHclaude_obsidian/transaction.py378except FileExistsError:CODE
HIGHclaude_obsidian/transaction.py1775except OSError:CODE
HIGHclaude_obsidian/transaction.py2099except OSError:CODE
HIGHclaude_obsidian/transaction.py1475except FileExistsError:CODE
HIGHclaude_obsidian/transaction.py1473except OSError:CODE
HIGHclaude_obsidian/transaction.py1931except OSError:CODE
HIGHclaude_obsidian/transaction.py2021except (OSError, _LockIdentityChanged):CODE
HIGHclaude_obsidian/transaction.py1977except OSError:CODE
HIGHclaude_obsidian/capture.py387except FileNotFoundError:CODE
HIGHclaude_obsidian/capture.py1880except (CODE
HIGHclaude_obsidian/capture.py1568except OSError:CODE
HIGHclaude_obsidian/capture.py1657except (OSError, _LockIdentityChanged):CODE
HIGHclaude_obsidian/capture.py757except (KeyError, OSError, zipfile.BadZipFile):CODE
HIGHclaude_obsidian/capture.py762except UnicodeDecodeError:CODE
HIGHclaude_obsidian/capture.py1612except OSError:CODE
HIGHclaude_obsidian/cli.py1258except (OSError, ValueError):CODE
Deep Nesting71 hits · 57 pts
SeverityFileLineSnippetContext
LOWtests/test_transaction.py2114CODE
LOWtests/test_transaction.py2225CODE
LOWtests/test_transaction.py2561CODE
LOWtests/test_transaction.py2133CODE
LOWtests/test_windows_compat.py230CODE
LOWtests/test_contextual_prefix.py684CODE
LOWtests/test_contextual_prefix.py753CODE
LOWtests/test_lint_engine.py284CODE
LOWtests/test_ledgers.py321CODE
LOWtests/test_ledgers.py532CODE
LOWtests/test_setup_vault.py69CODE
LOWtests/test_bm25_index.py684CODE
LOWtests/test_bm25_index.py748CODE
LOWtests/test_bm25_index.py877CODE
LOWtests/test_capture.py1068CODE
LOWtests/test_retrieve.py579CODE
LOWtests/test_checkpoint.py169CODE
LOWtests/test_checkpoint.py531CODE
LOWtests/test_installed_tree_boundary.py58CODE
LOWclaude_obsidian/release.py456CODE
LOWclaude_obsidian/release.py837CODE
LOWclaude_obsidian/release.py1310CODE
LOWclaude_obsidian/release.py1336CODE
LOWclaude_obsidian/release.py1984CODE
LOWclaude_obsidian/checkpoint.py1190CODE
LOWclaude_obsidian/checkpoint.py513CODE
LOWclaude_obsidian/paths.py361CODE
LOWclaude_obsidian/legacy_lock.py119CODE
LOWclaude_obsidian/legacy_lock.py293CODE
LOWclaude_obsidian/legacy_lock.py570CODE
LOWclaude_obsidian/transaction.py419CODE
LOWclaude_obsidian/transaction.py471CODE
LOWclaude_obsidian/transaction.py727CODE
LOWclaude_obsidian/transaction.py1051CODE
LOWclaude_obsidian/transaction.py1450CODE
LOWclaude_obsidian/transaction.py2128CODE
LOWclaude_obsidian/transaction.py2329CODE
LOWclaude_obsidian/transaction.py2875CODE
LOWclaude_obsidian/transaction.py4054CODE
LOWclaude_obsidian/transaction.py4215CODE
LOWclaude_obsidian/transaction.py4465CODE
LOWclaude_obsidian/transaction.py1820CODE
LOWclaude_obsidian/package_validation.py253CODE
LOWclaude_obsidian/package_validation.py347CODE
LOWclaude_obsidian/gitignore.py42CODE
LOWclaude_obsidian/gitignore.py72CODE
LOWclaude_obsidian/capture.py586CODE
LOWclaude_obsidian/capture.py639CODE
LOWclaude_obsidian/capture.py721CODE
LOWclaude_obsidian/capture.py822CODE
LOWclaude_obsidian/capture.py909CODE
LOWclaude_obsidian/capture.py1519CODE
LOWclaude_obsidian/hook_adapter.py218CODE
LOWclaude_obsidian/ledgers.py274CODE
LOWclaude_obsidian/ledgers.py346CODE
LOWclaude_obsidian/ledgers.py467CODE
LOWclaude_obsidian/ledgers.py901CODE
LOWclaude_obsidian/contracts.py320CODE
LOWclaude_obsidian/contracts.py620CODE
LOWclaude_obsidian/contracts.py1203CODE
11 more matches not shown…
Unused Imports51 hits · 48 pts
SeverityFileLineSnippetContext
LOWtests/test_contracts.py4CODE
LOWtests/test_release.py4CODE
LOWtests/test_transaction.py4CODE
LOWtests/test_legacy_lock.py4CODE
LOWtests/test_setup_wrappers.py4CODE
LOWtests/test_distribution_vaults.py4CODE
LOWtests/test_setup_retrieve.py4CODE
LOWtests/test_vault_root_separation.py4CODE
LOWtests/test_vault_ops.py3CODE
LOWtests/test_gitignore.py4CODE
LOWtests/test_setup_multi_agent.py4CODE
LOWtests/test_extensions.py4CODE
LOWtests/test_windows_compat.py15CODE
LOWtests/test_knowledge_contracts.py4CODE
LOWtests/test_cli_mode.py4CODE
LOWtests/test_lint_engine.py4CODE
LOWtests/test_cli_approval.py4CODE
LOWtests/test_ledgers.py4CODE
LOWtests/test_setup_vault.py4CODE
LOWtests/test_hooks.py4CODE
LOWtests/test_package_validation.py4CODE
LOWtests/test_capture.py4CODE
LOWtests/test_paths.py4CODE
LOWtests/test_benchmark_tools.py4CODE
LOWtests/test_detect_transport.py4CODE
LOWtests/test_gates.py4CODE
LOWtests/test_checkpoint.py3CODE
LOWtests/test_installed_tree_boundary.py4CODE
LOWclaude_obsidian/release.py9CODE
LOWclaude_obsidian/checkpoint.py3CODE
LOWclaude_obsidian/paths.py3CODE
LOWclaude_obsidian/url_safety.py3CODE
LOWclaude_obsidian/legacy_lock.py10CODE
LOWclaude_obsidian/transaction.py9CODE
LOWclaude_obsidian/__init__.py8CODE
LOWclaude_obsidian/gates.py3CODE
LOWclaude_obsidian/package_validation.py10CODE
LOWclaude_obsidian/extensions.py3CODE
LOWclaude_obsidian/gitignore.py26CODE
LOWclaude_obsidian/capture.py8CODE
LOWclaude_obsidian/vault_ops.py3CODE
LOWclaude_obsidian/cli.py3CODE
LOWclaude_obsidian/hook_adapter.py3CODE
LOWclaude_obsidian/ledgers.py3CODE
LOWclaude_obsidian/contracts.py8CODE
LOWclaude_obsidian/lint_engine.py37CODE
LOWclaude_obsidian/json_utils.py3CODE
LOWclaude_obsidian/mode_config.py3CODE
LOWclaude_obsidian/__main__.py1CODE
LOWclaude_obsidian/page_schema.py29CODE
LOWscripts/claude-obsidian.py4CODE
Excessive Try-Catch Wrapping17 hits · 16 pts
SeverityFileLineSnippetContext
LOWtests/test_transaction.py1127 except Exception:CODE
LOWtests/test_transaction.py1820 except Exception as exc:CODE
LOWclaude_obsidian/transaction.py2018 except Exception:CODE
LOWclaude_obsidian/transaction.py4108 except Exception as exc: # recovery must aggregate every path failureCODE
LOWclaude_obsidian/capture.py1654 except Exception as exc:CODE
LOWclaude_obsidian/ledgers.py572 except Exception as exc:CODE
LOWclaude_obsidian/ledgers.py675 except Exception as exc:CODE
LOWclaude_obsidian/ledgers.py730 except Exception as exc:CODE
LOWclaude_obsidian/ledgers.py997 except Exception as exc:CODE
LOWclaude_obsidian/ledgers.py1231 except Exception as exc:CODE
LOWclaude_obsidian/lint_engine.py698 except Exception as exc:CODE
LOWclaude_obsidian/lint_engine.py717 except Exception as exc:CODE
LOWclaude_obsidian/lint_engine.py875 except Exception as exc:CODE
MEDIUMclaude_obsidian/lint_engine.py850def _transaction_reader() -> Any:CODE
LOWscripts/rerank.py429 except Exception as e:CODE
LOWscripts/rerank.py456 except Exception as e:CODE
LOWscripts/tiling-check.py407 except Exception as exc:CODE
Cross-File Repetition3 hits · 15 pts
SeverityFileLineSnippetContext
HIGHscripts/rerank.py0parse a positive, bounded result count for command-line callers.STRING
HIGHscripts/retrieve.py0parse a positive, bounded result count for command-line callers.STRING
HIGHscripts/bm25-index.py0parse a positive, bounded result count for command-line callers.STRING
Over-Commented Block9 hits · 9 pts
SeverityFileLineSnippetContext
LOWtests/test_concurrent_write.sh1#!/usr/bin/env bashCOMMENT
LOWtests/test_wiki_lock.sh1#!/usr/bin/env bashCOMMENT
LOWtests/test_setup_vault.py121 result = _run("--check", "--vault", str(vault))COMMENT
LOWclaude_obsidian/page_schema.py61# vocabulary rejects. Subtraction makes ROUTABLE_TYPES ⊆ PAGE_TYPES structurallyCOMMENT
LOWscripts/detect-transport.sh1#!/usr/bin/env bashCOMMENT
LOWscripts/allocate-address.sh1#!/usr/bin/env bashCOMMENT
LOWscripts/setup-vault.sh1#!/usr/bin/env bashCOMMENT
LOWscripts/bm25-index.py121# Small high-frequency-stopword list (English). Conservative — keep recall high.COMMENT
LOWscripts/bm25-index.py161EXIT_LOCK = 1COMMENT
Modern Structural Boilerplate6 hits · 6 pts
SeverityFileLineSnippetContext
LOW⚡tests/test_contracts.py58 def update_capability(self, **changes: object) -> None:CODE
LOWclaude_obsidian/release.py2591__all__ = ["audit_artifact", "build_public_artifact"]CODE
LOWclaude_obsidian/url_safety.py94__all__ = ["URLSafetyIssue", "url_credential_issue"]CODE
LOWclaude_obsidian/capture.py2234__all__ = [CODE
LOWclaude_obsidian/mode_config.py83__all__ = [CODE
LOWclaude_obsidian/page_schema.py119__all__ = [CODE
Modern AI Meta-Vocabulary2 hits · 6 pts
SeverityFileLineSnippetContext
MEDIUMskills/wiki/SKILL.md6# Wiki orchestrationCOMMENT
MEDIUMskills/wiki/references/modes.md1# Domain-specific scaffold profilesCOMMENT
Cross-Language Confusion1 hit · 5 pts
SeverityFileLineSnippetContext
HIGHtests/test_transaction.py297 '"expected_hashes":{"wiki/A.md":null},'CODE
Magic Placeholder Names1 hit · 5 pts
SeverityFileLineSnippetContext
HIGHclaude_obsidian/release.py127 "your-api-key",CODE
Example Usage Blocks3 hits · 4 pts
SeverityFileLineSnippetContext
LOWscripts/detect-transport.sh8# Usage:COMMENT
LOWscripts/allocate-address.sh9# Usage:COMMENT
LOWscripts/setup-vault.sh8# Usage:COMMENT
Fake / Example Data2 hits · 2 pts
SeverityFileLineSnippetContext
LOWclaude_obsidian/release.py123 "placeholder",CODE
LOWclaude_obsidian/release.py396 word in captured for word in ("example", "placeholder", "redacted", "your-")CODE