Repository Analysis

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.

16.4 Moderate AI signal View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of AgriciDaniel/claude-obsidian, a Python project with 14,330 GitHub stars. SynthScan v2.0 examined 51,467 lines of code across 161 source files, recording 732 pattern matches distributed across 13 syntactic categories. The overall adjusted score of 16.4 places this repository in the Moderate AI signal band.

The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).

16.4
Adjusted Score
16.4
Raw Score
100%
Time Factor
2026-08-26
Last Push
14.3K
Stars
Python
Language
51.5K
Lines of Code
161
Files
732
Pattern Hits
2026-08-29
Scan Date
0.03
HC Hit Rate

What These Metrics Mean

Adjusted Score
Primary synthetic code indicator. Raw score normalised per 1,000 lines of code and multiplied by the temporal discount factor. This is the definitive comparative metric — use it to rank repositories by AI authorship density.
Raw Score
The unmodified sum of all severity-weighted, context-multiplied pattern match scores before temporal discounting. Reflects the absolute signal strength independent of when the repository was last active.
Time Factor
The temporal discount multiplier (0–100%) applied to the raw score. Repositories last updated before ChatGPT's launch (Nov 2022) receive a 5% factor. Full signal is only assigned to repositories active in the post-adoption era (Jan 2024+).
Pattern Hits
Total count of individual pattern matches across all files and categories. A high hit count with a low score may indicate a very large codebase with isolated AI snippets; a low count with a high score indicates dense, concentrated AI signatures.
HC Hit Rate
High+Critical pattern hits per file, averaged across the repository. This orthogonal signal catches repositories where a few files are densely packed with high-severity AI tells — a strong indicator even when the normalised score appears moderate due to codebase size.
Lines of Code / Files
Total lines and files analysed. The scanner examines 94 file extensions. These denominators are used to normalise the score, enabling fair comparison between repositories of vastly different sizes.

Score History

Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.

No multi-scan history yet — run the scanner again to build trend data.

Severity Breakdown

Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.

CRITICAL 0HIGH 5MEDIUM 54LOW 673

Directory Score Breakdown

This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.

Pattern Findings

The scanner identified 732 distinct pattern matches across 13 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.

Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.

Hyper-Verbose Identifiers523 hits · 486 pts
SeverityFileLineSnippetContext
LOWtests/test_contracts.py68 def test_capability_and_transaction_operation_types_cannot_drift(self) -> None:CODE
LOWtests/test_contracts.py71 def test_canonical_contracts_validate(self) -> None:CODE
LOWtests/test_contracts.py74 def test_manifest_covers_every_current_skill(self) -> None:CODE
LOWtests/test_contracts.py81 def test_product_contract_locks_privacy_compatibility_and_release_authority(CODE
LOWtests/test_contracts.py285 def test_missing_implementation_path_is_rejected(self) -> None:CODE
LOWtests/test_contracts.py292 def test_unregistered_skill_is_rejected(self) -> None:CODE
LOWtests/test_contracts.py301 def test_inconsistent_mutation_and_egress_declarations_are_rejected(self) -> None:CODE
LOWtests/test_contracts.py409 def test_missing_optional_configuration_is_available(self) -> None:CODE
LOWtests/test_contracts.py414 def test_partial_configuration_is_degraded(self) -> None:CODE
LOWtests/test_contracts.py422 def test_complete_configuration_is_configured(self) -> None:CODE
LOWtests/test_contracts.py428 def test_successful_execution_is_verified(self) -> None:CODE
LOWtests/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
LOWtests/test_release.py355 def test_tracked_symlink_is_rejected(self) -> None:CODE
LOWtests/test_release.py365 def test_root_raw_and_live_vault_state_are_hard_rejected(self) -> None:CODE
LOWtests/test_release.py375 def test_secret_token_is_rejected(self) -> None:CODE
LOWtests/test_release.py385 def test_private_repo_url_needs_named_disclosure(self) -> None:CODE
LOWtests/test_release.py395 def test_absolute_home_path_is_rejected(self) -> None:CODE
LOWtests/test_release.py403 def test_personal_email_address_is_rejected(self) -> None:CODE
LOWtests/test_release.py413 def test_quoted_unicode_literal_and_encoded_email_forms_are_rejected(self) -> None:CODE
LOWtests/test_release.py459 def test_unreviewed_binary_is_rejected(self) -> None:CODE
LOWtests/test_release.py466 def test_missing_config_and_non_zip_output_fail_closed(self) -> None:CODE
LOWtests/test_release.py476 def test_failed_build_does_not_replace_existing_artifact(self) -> None:CODE
LOWtests/test_release.py483 def test_collected_bytes_must_match_the_clean_git_blob(self) -> None:CODE
LOWtests/test_release.py651 def test_traversal_entry_is_rejected_without_extraction(self) -> None:CODE
LOWtests/test_release.py659 def test_archive_symlink_and_special_entry_are_rejected(self) -> None:CODE
LOWtests/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
463 more matches not shown…
Decorative Section Separators51 hits · 192 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
MEDIUMtests/test_concurrent_write.sh117# ── Verify: no orphaned lockfiles ───────────────────────────────────────────COMMENT
MEDIUMtests/test_concurrent_write.sh121# ── Verify: clear-stale reports 0 (nothing to reap) ─────────────────────────COMMENT
MEDIUMtests/test_concurrent_write.sh125# ── Verify: file content sanity (no truncated/garbled lines) ────────────────COMMENT
MEDIUMtests/test_contextual_prefix.py50# ─── Below the floor → no cache_control (silent no-op avoided) ───────────────COMMENT
MEDIUMtests/test_contextual_prefix.py60# ─── At / above the floor → ephemeral cache_control ──────────────────────────COMMENT
MEDIUMtests/test_wiki_lock.sh77# ── acquire on a fresh path returns 0 ────────────────────────────────────────COMMENT
MEDIUMtests/test_wiki_lock.sh81# ── second acquire while the lock is fresh returns 75 ────────────────────────COMMENT
MEDIUMtests/test_wiki_lock.sh88# ── peek shows the lock ──────────────────────────────────────────────────────COMMENT
MEDIUMtests/test_wiki_lock.sh95# ── list shows the held lock ─────────────────────────────────────────────────COMMENT
MEDIUMtests/test_wiki_lock.sh102# ── release frees the lock (cross-process release is allowed by design) ─────COMMENT
MEDIUMtests/test_wiki_lock.sh107# ── re-acquire after release succeeds ───────────────────────────────────────COMMENT
MEDIUMtests/test_wiki_lock.sh112# ── short --stale-after-sec lets us test age-based reap quickly ─────────────COMMENT
MEDIUMtests/test_wiki_lock.sh146# ── peek on unheld path ──────────────────────────────────────────────────────COMMENT
MEDIUMtests/test_wiki_lock.sh150# ── path validation: absolute path rejected ──────────────────────────────────COMMENT
MEDIUMtests/test_wiki_lock.sh154# ── path validation: traversal rejected ──────────────────────────────────────COMMENT
MEDIUMtests/test_wiki_lock.sh158# ── path validation: empty rejected ──────────────────────────────────────────COMMENT
MEDIUMtests/test_wiki_lock.sh162# ── path validation: newline rejected (v1.7.2; closes audit M4) ──────────────COMMENT
MEDIUMtests/test_wiki_lock.sh168# ── path validation: carriage return rejected (v1.7.2; closes audit M4) ──────COMMENT
MEDIUMtests/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
MEDIUMtests/test_bm25_index.py60# ─── tokenize() ──────────────────────────────────────────────────────────────COMMENT
MEDIUMtests/test_bm25_index.py190# ─── build_index + query() ───────────────────────────────────────────────────COMMENT
MEDIUMtests/test_bm25_index.py856# ─── CLI smoke test ──────────────────────────────────────────────────────────COMMENT
MEDIUMtests/test_wiki_mode.py200# ─── Zettel ID format ───────────────────────────────────────────────────────COMMENT
MEDIUMtests/test_wiki_mode.py476# ─── Invalid content type raises ───────────────────────────────────────────COMMENT
MEDIUMtests/test_wiki_mode.py486# ─── CLI subprocess: `wiki-mode.py get` returns mode string ─────────────────COMMENT
MEDIUMtests/test_wiki_mode.py48# ─── Default-to-generic when no config file ──────────────────────────────────COMMENT
MEDIUMtests/test_wiki_mode.py65# ─── Existing config load ────────────────────────────────────────────────────COMMENT
MEDIUMtests/test_wiki_mode.py97# ─── Existing corrupt mode.json fails closed ────────────────────────────────COMMENT
MEDIUMtests/test_wiki_mode.py116# ─── Mode=generic routing matches v1.7 conventions ──────────────────────────COMMENT
MEDIUMtests/test_wiki_mode.py142# ─── Mode=lyt routing: all atomic notes flat under wiki/notes/ ──────────────COMMENT
MEDIUMtests/test_wiki_mode.py154# ─── Mode=para routing: actionability-based folders ─────────────────────────COMMENT
MEDIUMtests/test_wiki_mode.py184# ─── Mode=zettelkasten routing: flat, timestamp-prefixed ────────────────────COMMENT
MEDIUMtests/test_wiki_mode.py246# ─── Slugify handles unicode + special chars ────────────────────────────────COMMENT
MEDIUMtests/test_wiki_mode.py405# ─── CLI --mode preview override (v1.8.2) ───────────────────────────────────COMMENT
MEDIUMtests/test_wiki_mode.py529# ─── CLI subprocess: `wiki-mode.py id` returns a sortable nonce ID ───────COMMENT
MEDIUMtests/test_wiki_mode.py549# ─── CLI subprocess: `wiki-mode.py route source NAME` returns a path ────────COMMENT
MEDIUMtests/test_wiki_mode.py576# ─── CLI subprocess: invalid mode rejected ──────────────────────────────────COMMENT
MEDIUMtests/test_wiki_mode.py591# ─── CLI subprocess: templates listing returns all 6 ───────────────────────COMMENT
MEDIUMtests/test_retrieve.py81# ─── import_sibling ──────────────────────────────────────────────────────────COMMENT
MEDIUMtests/test_retrieve.py89# ─── chunk_snippet ───────────────────────────────────────────────────────────COMMENT
MEDIUMtests/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
Deep Nesting69 hits · 56 pts
SeverityFileLineSnippetContext
LOWtests/test_transaction.py2009CODE
LOWtests/test_transaction.py2120CODE
LOWtests/test_transaction.py2344CODE
LOWtests/test_transaction.py2028CODE
LOWtests/test_windows_compat.py230CODE
LOWtests/test_contextual_prefix.py681CODE
LOWtests/test_contextual_prefix.py750CODE
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.py1005CODE
LOWtests/test_retrieve.py579CODE
LOWtests/test_checkpoint.py169CODE
LOWtests/test_checkpoint.py531CODE
LOWtests/test_installed_tree_boundary.py50CODE
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.py2122CODE
LOWclaude_obsidian/transaction.py2297CODE
LOWclaude_obsidian/transaction.py2843CODE
LOWclaude_obsidian/transaction.py4022CODE
LOWclaude_obsidian/transaction.py4183CODE
LOWclaude_obsidian/transaction.py4433CODE
LOWclaude_obsidian/transaction.py1814CODE
LOWclaude_obsidian/package_validation.py253CODE
LOWclaude_obsidian/package_validation.py310CODE
LOWclaude_obsidian/capture.py585CODE
LOWclaude_obsidian/capture.py638CODE
LOWclaude_obsidian/capture.py720CODE
LOWclaude_obsidian/capture.py821CODE
LOWclaude_obsidian/capture.py908CODE
LOWclaude_obsidian/capture.py1496CODE
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
LOWclaude_obsidian/lint_engine.py194CODE
LOWclaude_obsidian/lint_engine.py605CODE
9 more matches not shown…
Unused Imports48 hits · 45 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_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/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.py23CODE
LOWclaude_obsidian/json_utils.py3CODE
LOWclaude_obsidian/mode_config.py3CODE
LOWclaude_obsidian/__main__.py1CODE
LOWscripts/claude-obsidian.py4CODE
Excessive Try-Catch Wrapping17 hits · 17 pts
SeverityFileLineSnippetContext
LOWtests/test_transaction.py1126 except Exception:CODE
LOWtests/test_transaction.py1819 except Exception as exc:CODE
LOWclaude_obsidian/transaction.py2012 except Exception:CODE
LOWclaude_obsidian/transaction.py4076 except Exception as exc: # recovery must aggregate every path failureCODE
LOWclaude_obsidian/capture.py1631 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.py635 except Exception as exc:CODE
LOWclaude_obsidian/lint_engine.py653 except Exception as exc:CODE
LOWclaude_obsidian/lint_engine.py809 except Exception as exc:CODE
MEDIUMclaude_obsidian/lint_engine.py784def _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 Block7 hits · 7 pts
SeverityFileLineSnippetContext
LOWbin/setup-vault.sh1#!/usr/bin/env bashCOMMENT
LOWtests/test_concurrent_write.sh1#!/usr/bin/env bashCOMMENT
LOWtests/test_wiki_lock.sh1#!/usr/bin/env bashCOMMENT
LOWscripts/detect-transport.sh1#!/usr/bin/env bashCOMMENT
LOWscripts/allocate-address.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 AI Meta-Vocabulary2 hits · 6 pts
SeverityFileLineSnippetContext
MEDIUMskills/wiki/SKILL.md6# Wiki orchestrationCOMMENT
MEDIUMskills/wiki/references/modes.md1# Domain-specific scaffold profilesCOMMENT
Modern Structural Boilerplate5 hits · 6 pts
SeverityFileLineSnippetContext
LOWtests/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.py2211__all__ = [CODE
LOWclaude_obsidian/mode_config.py83__all__ = [CODE
Cross-Language Confusion1 hit · 5 pts
SeverityFileLineSnippetContext
HIGHtests/test_transaction.py296 '"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
LOWbin/setup-vault.sh8# Usage:COMMENT
LOWscripts/detect-transport.sh8# Usage:COMMENT
LOWscripts/allocate-address.sh9# 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