OpenWiki is a CLI that writes and maintains agent documentation for your codebase.
This report summarizes scanner evidence for langchain-ai/openwiki, a TypeScript project with 17,644 GitHub stars. SynthScan examined 175,657 lines of code across 567 source files, recording 372 pattern matches distributed across 9 syntactic categories. The legacy adjusted pattern signal is 2.2 (Low 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.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 360 finding(s).
Are imports declared and package/API names verified? 11 finding(s).
Are wrappers, guards, and repeated structures necessary? 333 finding(s).
Which changes need focused human review? 372 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 372 distinct pattern matches across 9 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 | evals/ledger/benchmark/validation.ts | 60 | export async function validateEvidenceMapSources( | CODE |
| LOW | evals/ledger/benchmark/source-repo.ts | 87 | export async function ensureSourceRepoAvailable( | CODE |
| LOW | evals/ledger/metrics/claims.ts | 44 | export function computeEvaluationCompleteness( | CODE |
| LOW | evals/ledger/evaluator/precision.ts | 941 | function deduplicateHistoricalEvidence( | CODE |
| LOW | evals/ledger/evaluator/precision.ts | 987 | function statementNamesMissingSourcePath( | CODE |
| LOW | evals/ledger/evaluator/precision.ts | 1168 | function toJudgmentArtifactContexts( | CODE |
| LOW | evals/ledger/evaluator/precision.ts | 1373 | async function resolvePrecisionBatchResilient( | CODE |
| LOW | evals/ledger/evaluator/prompts.ts | 409 | export function precisionExtractionPrompt( | CODE |
| LOW | evals/ledger/replay/workspace.ts | 47 | export async function assertContainedByRealpath( | CODE |
| LOW | evals/ledger/run/progress.ts | 110 | export function createCliProgressReporter( | CODE |
| LOW | evals/ledger/run/saved-run.ts | 131 | async function readSavedArtifactDocument( | CODE |
| LOW | evals/ledger/run/reevaluate-args.ts | 137 | export function resolveReevaluationConfig( | CODE |
| LOW | evals/deepswe/openwiki_codex.py | 36 | def _normalized_package_digest(package_path: Path) -> str: | CODE |
| LOW | evals/deepswe/openwiki_codex.py | 90 | def _validate_wiki_cache_archive(archive_path: Path) -> dict[str, str] | None: | CODE |
| LOW | evals/deepswe/analyze_openwiki_usage.py | 87 | def is_openwiki_filesystem_read(command: str) -> bool: | CODE |
| LOW⚡ | evals/deepswe/tests/test_run.py | 58 | def test_langsmith_feedback_programming_error_still_propagates(self) -> None: | CODE |
| LOW⚡ | evals/deepswe/tests/test_run.py | 67 | def test_openwiki_install_rebuilds_only_native_sqlite_dependency(self) -> None: | CODE |
| LOW⚡ | evals/deepswe/tests/test_run.py | 76 | def test_agent_install_ignores_broken_nodesource_apt_repository(self) -> None: | CODE |
| LOW⚡ | evals/deepswe/tests/test_run.py | 86 | def test_adapter_captures_committed_patch_for_separate_verifier(self) -> None: | CODE |
| LOW⚡ | evals/deepswe/tests/test_run.py | 96 | def test_openwiki_treatment_uses_just_in_time_navigation(self) -> None: | CODE |
| LOW | evals/deepswe/tests/test_run.py | 20 | def test_langsmith_feedback_rounds_scores_and_skips_invalid_metrics(self) -> None: | CODE |
| LOW | evals/deepswe/tests/test_run.py | 44 | def test_langsmith_feedback_http_error_does_not_abort_trial(self) -> None: | CODE |
| LOW | evals/deepswe/tests/test_run.py | 113 | def test_eval_defaults_use_terra_without_changing_openwiki_defaults(self) -> None: | CODE |
| LOW | evals/deepswe/tests/test_run.py | 118 | def test_paired_commands_share_selection_and_agent_settings(self) -> None: | CODE |
| LOW | evals/deepswe/tests/test_run.py | 190 | def test_custom_agent_setup_timeout_multiplier_is_forwarded(self) -> None: | CODE |
| LOW | evals/deepswe/tests/test_run.py | 201 | def test_openwiki_cache_key_is_stable_and_configuration_sensitive(self) -> None: | CODE |
| LOW | evals/deepswe/tests/test_run.py | 211 | def test_wiki_cache_archive_accepts_only_contained_regular_content(self) -> None: | CODE |
| LOW | evals/deepswe/tests/test_run.py | 254 | def test_compatible_cache_requires_exact_commit_and_model_metadata(self) -> None: | CODE |
| LOW | evals/deepswe/tests/test_run.py | 293 | def test_cache_only_cli_flags_are_forwarded(self) -> None: | CODE |
| LOW | evals/deepswe/tests/test_run.py | 305 | def test_custom_allowed_host_is_validated_and_included(self) -> None: | CODE |
| LOW | evals/deepswe/tests/test_run.py | 318 | def test_credentials_require_openai_and_langsmith(self) -> None: | CODE |
| LOW | evals/deepswe/tests/test_run.py | 333 | def test_langsmith_endpoint_rejects_embedded_credentials(self) -> None: | CODE |
| LOW | evals/deepswe/tests/test_run.py | 340 | def test_run_clears_ambient_experiment_overrides(self) -> None: | CODE |
| LOW | evals/deepswe/tests/test_run.py | 359 | def test_cleanup_removes_only_inactive_owned_trial_network(self) -> None: | CODE |
| LOW | evals/deepswe/tests/test_run.py | 402 | def test_cleanup_skips_active_or_foreign_trial_networks(self) -> None: | CODE |
| LOW | evals/deepswe/tests/test_run.py | 454 | def test_run_condition_cleans_docker_networks_even_when_harbor_fails(self) -> None: | CODE |
| LOW | evals/deepswe/tests/test_run.py | 477 | def test_cleanup_failure_does_not_mask_harbor_failure(self) -> None: | CODE |
| LOW | evals/deepswe/tests/test_run.py | 495 | def test_seeded_task_selection_is_reproducible(self) -> None: | CODE |
| LOW | evals/deepswe/tests/test_run.py | 521 | def test_named_task_suites_are_independent_and_composable(self) -> None: | CODE |
| LOW | evals/deepswe/tests/test_run.py | 540 | def test_named_task_suite_selects_every_exact_member(self) -> None: | CODE |
| LOW | evals/deepswe/tests/test_run.py | 564 | def test_named_task_suite_reports_missing_pinned_tasks(self) -> None: | CODE |
| LOW | evals/deepswe/tests/test_run.py | 585 | def test_named_task_suite_cannot_be_combined_with_task_filter(self) -> None: | CODE |
| LOW | evals/deepswe/tests/test_run.py | 597 | def test_load_and_aggregate_trial_rows(self) -> None: | CODE |
| LOW | evals/deepswe/tests/test_analyze_openwiki_usage.py | 14 | def test_canonical_call_json_and_filesystem_classification(self) -> None: | CODE |
| LOW | evals/deepswe/tests/test_analyze_openwiki_usage.py | 26 | def test_analyze_trace_pairs_events_and_counts_direct_overhead(self) -> None: | CODE |
| LOW | evals/deepswe/tests/test_analyze_openwiki_usage.py | 132 | def test_collect_trials_includes_complete_usage_even_after_verifier_failure( | CODE |
| LOW | evals/deepswe/tests/test_analyze_openwiki_usage.py | 174 | def test_analyze_trace_scopes_reused_item_ids_to_each_completion(self) -> None: | CODE |
| LOW | evals/deepswe/tests/test_analyze_openwiki_usage.py | 223 | def test_summary_subtracts_calls_and_estimated_tokens(self) -> None: | CODE |
| LOW | test/openrouter-debug-fetch.test.ts | 130 | async function expectOpenRouterMalformedError( | CODE |
| LOW | test/connectors/raw-connector-tools.test.ts | 173 | async function loadConnectorToolsForMode( | CODE |
| LOW | test/connectors/tools.test.ts | 336 | async function loadToolsWithMockRegistry( | CODE |
| LOW | test/connectors/tools.test.ts | 357 | async function loadToolsWithMockMcpRuntime(config: { | CODE |
| LOW | test/ingestion/code-mode.test.ts | 93 | function expectFailurePreservingWorkflow(workflow: string): void { | CODE |
| LOW | test/setup/openai-chatgpt-credentials.test.ts | 57 | function configureValidChatGptSession(): void { | CODE |
| LOW | test/agent/repository-runner.test.ts | 621 | async function getNoDelegationWrapModelCall(): Promise< | CODE |
| LOW | test/integrations/installer.test.ts | 280 | function failingPriorMoveOperations( | CODE |
| LOW | src/model-availability.ts | 26 | export async function getSelectedModelAvailability( | CODE |
| LOW | src/connectors/mcp-client.ts | 58 | export async function executeMcpReadOnlyOperations( | CODE |
| LOW | src/connectors/mcp-client.ts | 855 | async function resolveTemplateEnvReferences( | CODE |
| LOW | src/connectors/mcp-client.ts | 885 | async function resolveHeaderEnvReference(envKey: string): Promise<string> { | CODE |
| 272 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | evals/deepswe/openwiki_codex.py | 206 | "apt-get update && apt-get install -y ripgrep; " | CODE |
| HIGH | evals/deepswe/openwiki_codex.py | 391 | "command -v openwiki-retrieval-mcp || true" | CODE |
| HIGH⚡ | evals/deepswe/tests/test_run.py | 101 | self.assertIn("command -v openwiki-retrieval-mcp || true", adapter) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | test/ingestion/ingestion-run.test.ts | 237 | // An agentic connector is not pulled up front, so the message must instead | COMMENT |
| MEDIUM | test/ingestion/ingestion-run.test.ts | 486 | // Cover both message templates: an agentic source (named, no goals) and a | COMMENT |
| MEDIUM | openwiki/workflows/personal-ingestion.md | 53 | ## Entrypoint and orchestration | COMMENT |
| MEDIUM | openwiki/workflows/personal-ingestion.md | 121 | ## Per-source run: deterministic pull vs. agentic discovery | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | vitest.config.ts | 21 | coverage: { | COMMENT |
| LOW | pnpm-workspace.yaml | 1 | allowBuilds: | COMMENT |
| LOW | test/connectors/connector-config-overrides.test.ts | 1 | import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises"; | COMMENT |
| LOW | test/config/env-behavior.test.ts | 41 | // | COMMENT |
| LOW | test/auth/oauth-run.test.ts | 1 | import { createHash } from "node:crypto"; | COMMENT |
| LOW | test/agent/gemini-enterprise-claude.e2e.test.ts | 1 | import { mkdtemp, rm, writeFile } from "node:fs/promises"; | COMMENT |
| LOW | test/agent/gemini-enterprise-claude.e2e.test.ts | 21 | // awaited later, on the first request). In an unauthenticated CI environment that | COMMENT |
| LOW | src/config/constants.ts | 1241 | ); | COMMENT |
| LOW | src/config/constants.ts | 1261 | TRUE_ENV_VALUE | COMMENT |
| LOW | src/agent/okf-middleware.ts | 81 | // model so the agent can recover, so tool/connector throws never reach the run | COMMENT |
| LOW | src/agent/index.ts | 1601 | // Gemini/Gemma over generateContent wants the bare model ID; normalize a | COMMENT |
| LOW | src/telemetry/senders.ts | 101 | ...(details.provider ? { provider: details.provider } : {}), | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | evals/deepswe/run.py | 297 | CODE | |
| LOW | evals/deepswe/run.py | 805 | CODE | |
| LOW | evals/deepswe/openwiki_codex.py | 36 | CODE | |
| LOW | evals/deepswe/openwiki_codex.py | 90 | CODE | |
| LOW | evals/deepswe/openwiki_codex.py | 423 | CODE | |
| LOW | evals/deepswe/analyze_openwiki_usage.py | 93 | CODE | |
| LOW | evals/deepswe/analyze_openwiki_usage.py | 128 | CODE | |
| LOW | evals/deepswe/analyze_openwiki_usage.py | 159 | CODE | |
| LOW | evals/deepswe/tests/test_run.py | 211 | CODE | |
| LOW | evals/deepswe/tests/test_run.py | 212 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | evals/deepswe/run.py | 56 | # Directory containing the DeepSWE harness. | COMMENT |
| MEDIUM | evals/deepswe/run.py | 97 | # Ten disjoint tasks selected for high documentation leverage. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | evals/deepswe/run.py | 4 | CODE | |
| LOW | evals/deepswe/deepswe_langsmith.py | 3 | CODE | |
| LOW | evals/deepswe/openwiki_codex.py | 3 | CODE | |
| LOW | evals/deepswe/analyze_openwiki_usage.py | 10 | CODE | |
| LOW | evals/deepswe/tests/test_run.py | 1 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | test/setup/credentials/format.test.ts | 222 | email: "user@example.com", | CODE |
| LOW | test/agent/entra-auth.test.ts | 332 | token: `fake-token-${identityMocks.getToken.mock.calls.length}`, | CODE |
| LOW | test/agent/entra-auth.test.ts | 403 | ).toEqual(["Bearer fake-token-1", "Bearer fake-token-2"]); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | evals/deepswe/run.py | 576 | except Exception: | CODE |