Solution for long term memory for agent coding CLIs and to facilitate handoff between different agent vendors
This report summarizes scanner evidence for akitaonrails/ai-memory, a Rust project with 14,754 GitHub stars. SynthScan examined 634,539 lines of code across 1035 source files, recording 1856 pattern matches distributed across 16 syntactic categories. The legacy adjusted pattern signal is 3.1 (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? 1751 finding(s).
Are imports declared and package/API names verified? 10 finding(s).
Are wrappers, guards, and repeated structures necessary? 140 finding(s).
Which changes need focused human review? 1856 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 1856 distinct pattern matches across 16 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 | Cargo.toml | 61 | # Error handling. | COMMENT |
| LOW | Cargo.toml | 181 | # LLM provider HTTP. | COMMENT |
| LOW | install.sh | 1 | #!/bin/sh | COMMENT |
| LOW | .gitleaks.toml | 1 | # gitleaks configuration for ai-memory. | COMMENT |
| LOW | .gitleaks.toml | 41 | '''github_pat_FAKE[A-Z0-9_]+''', | COMMENT |
| LOW | .config/nextest.toml | 1 | # cargo-nextest configuration. Two profiles for people, one for CI: | COMMENT |
| LOW | evals/tests/smoke.rs | 1 | //! On-demand end-to-end smoke for the retrieval harness (mirrors the | COMMENT |
| LOW | evals/src/ab.rs | 1 | //! Live A/B harness for the ai-memory consolidation prompt. | COMMENT |
| LOW | evals/src/ab.rs | 21 | //! and `must_not_mention` hits. | COMMENT |
| LOW | evals/src/ab.rs | 121 | #[arg(long)] | COMMENT |
| LOW | evals/src/ab.rs | 141 | /// observations the consolidation prompt actually consumes; the | COMMENT |
| LOW | evals/src/generate.rs | 1 | //! Seeded long-session generator for the fidelity harness (#1215). | COMMENT |
| LOW | evals/src/main.rs | 1 | //! `ai-memory-eval` — offline evaluation harnesses for ai-memory. | COMMENT |
| LOW | evals/src/abstention.rs | 21 | COMMENT | |
| LOW | evals/src/fidelity.rs | 1 | //! Zero-LLM literal-fidelity metrics for the consolidation prompt (#1215). | COMMENT |
| LOW | evals/src/retrieval/grep.rs | 1 | //! `--engine grep`: a whole-session term-overlap baseline with no server. | COMMENT |
| LOW | evals/src/retrieval/query.rs | 21 | } | COMMENT |
| LOW | evals/src/retrieval/query.rs | 41 | /// Ranked hit contexts (title + snippet), same order as `retrieved`. | COMMENT |
| LOW | evals/src/retrieval/query.rs | 61 | /// Raw observation hits in the response. The server only falls back to | COMMENT |
| LOW | evals/src/retrieval/server.rs | 21 | pub base_url: String, | COMMENT |
| LOW | evals/src/retrieval/server.rs | 41 | /// fetches. | COMMENT |
| LOW | evals/src/retrieval/ingest.rs | 1 | //! Replay LongMemEval haystack sessions through the real hook-ingest | COMMENT |
| LOW | evals/src/retrieval/ingest.rs | 101 | pub elapsed: Duration, | COMMENT |
| LOW | evals/src/retrieval/qa.rs | 1 | //! Opt-in, live-LLM QA-accuracy mode for the retrieval harness (R2b). | COMMENT |
| LOW | evals/src/retrieval/qa.rs | 41 | /// Shared opt-in QA provider arguments. Both retrieval QA and the abstention | COMMENT |
| LOW | evals/src/retrieval/qa.rs | 61 | /// Env var containing the QA answerer API key. | COMMENT |
| LOW | evals/src/retrieval/qa.rs | 101 | /// server answer's validated citation presence). | COMMENT |
| LOW | evals/src/retrieval/report.rs | 1 | //! Render benchmark results as JSON (machine) + markdown (human), with | COMMENT |
| LOW | evals/src/retrieval/mod.rs | 1 | //! Pinned retrieval benchmarks, end to end through the real stack. | COMMENT |
| LOW | evals/src/retrieval/mod.rs | 21 | //! | COMMENT |
| LOW | evals/src/retrieval/mod.rs | 61 | COMMENT | |
| LOW | evals/src/retrieval/mod.rs | 81 | /// Score only the first N scored (non-abstention) questions of each | COMMENT |
| LOW | evals/src/retrieval/mod.rs | 101 | #[arg(long)] | COMMENT |
| LOW | evals/src/retrieval/mod.rs | 121 | COMMENT | |
| LOW | evals/src/retrieval/mod.rs | 141 | /// retrieval flags, future toggles). | COMMENT |
| LOW | evals/src/retrieval/mod.rs | 161 | #[arg(long, value_enum, default_value_t = DatePrefix::Turn)] | COMMENT |
| LOW | evals/src/retrieval/score.rs | 1 | //! Session-level retrieval scoring, matching how published LongMemEval | COMMENT |
| LOW | evals/src/retrieval/score.rs | 41 | #[serde(default)] | COMMENT |
| LOW | evals/src/retrieval/dataset.rs | 1 | //! Pinned retrieval datasets in the LongMemEval question/session format. | COMMENT |
| LOW | evals/src/retrieval/reachability.rs | 1 | //! `--reachability`: does the evidence reach the index at all? | COMMENT |
| LOW | evals/src/retrieval/reachability.rs | 21 | //! fixed English stopword list. Its *distinctive* tokens are the content | COMMENT |
| LOW | crates/ai-memory-web/build.rs | 1 | //! Build script for ai-memory-web. | COMMENT |
| LOW | crates/ai-memory-web/tests/suite/routes.rs | 2761 | /// the text an automatic handoff synthesises from the operator's prompts. | COMMENT |
| LOW | crates/ai-memory-web/tests/suite/routes.rs | 4461 | /// Pins a documented, by-design boundary (see `docs/users.md`): under a | COMMENT |
| LOW | crates/ai-memory-web/src/health.rs | 1 | //! The root-only health page's data model and its checks. | COMMENT |
| LOW | crates/ai-memory-web/src/lib.rs | 1 | //! `ai-memory-web` — read-only HTTP browser for the wiki. | COMMENT |
| LOW | crates/ai-memory-web/src/lib.rs | 21 | //! - `GET /w/:workspace/:project/s/:session` → session timeline, paged | COMMENT |
| LOW | crates/ai-memory-web/src/lib.rs | 81 | /// The host should `nest("/api/v1", api_router(...))` behind its normal auth | COMMENT |
| LOW | crates/ai-memory-web/src/lib.rs | 101 | #[cfg(test)] | COMMENT |
| LOW | crates/ai-memory-web/src/recall.rs | 1 | //! Project search through the same hybrid ranker as `memory_query`. | COMMENT |
| LOW | crates/ai-memory-web/src/html_auth.rs | 61 | } else { | COMMENT |
| LOW | crates/ai-memory-web/src/state.rs | 21 | /// Read-only SQLite pool — drives FTS5 search, page metadata, | COMMENT |
| LOW | crates/ai-memory-web/src/mount.rs | 21 | use axum::response::{IntoResponse, Response}; | COMMENT |
| LOW | crates/ai-memory-web/src/mount.rs | 41 | /// `..` are rejected outright even though their characters are unreserved | COMMENT |
| LOW | crates/ai-memory-web/src/mount.rs | 301 | /// Operator-supplied custom SPA directory (`--web-ui-dir`). `None` | COMMENT |
| LOW | crates/ai-memory-web/src/markdown.rs | 1 | //! Markdown → HTML rendering for the read-only web browser, plus the | COMMENT |
| LOW | crates/ai-memory-web/src/markdown.rs | 21 | /// `[[wiki links]]` (with the `[[target|label]]`, `[[project:path]]`, | COMMENT |
| LOW | crates/ai-memory-web/src/markdown.rs | 161 | ) | COMMENT |
| LOW | crates/ai-memory-web/src/markdown.rs | 621 | url | COMMENT |
| LOW | crates/ai-memory-web/src/markdown.rs | 741 | #[must_use] | COMMENT |
| 1557 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | crates/ai-memory-web/tests/suite/routes.rs | 312 | // ── /web HTML chrome for multi-user attribution ────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-web/tests/suite/routes.rs | 3192 | // ── Part A: Cache-Control + ETag tests ───────────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-cli/tests/suite/autoscope_env.rs | 314 | // ─── Boundary-value cases for the numeric fields ────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-cli/src/marker.rs | 2271 | // ── #668: a capture-only marker is scope/settings-transparent ──────── | COMMENT |
| MEDIUM | crates/ai-memory-cli/src/marker.rs | 2271 | // ── #668: a capture-only marker is scope/settings-transparent ──────── | COMMENT |
| MEDIUM | crates/ai-memory-cli/src/marker.rs | 2459 | // ── #992: `server` profile selection ───────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-cli/src/marker.rs | 2459 | // ── #992: `server` profile selection ───────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-cli/src/commands/serve.rs | 7967 | // ── Part B: CORS validation tests ────────────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-cli/src/commands/hook.rs | 7971 | // ── `[briefing] inject_on_subagent_start` ───────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-cli/src/commands/hook.rs | 8186 | // ── #992: per-repository server profiles ───────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-cli/src/commands/hook.rs | 8186 | // ── #992: per-repository server profiles ───────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-cli/src/commands/hook_capture.rs | 2377 | // ── install-time default strategy (#128), no marker required ────── | COMMENT |
| MEDIUM | crates/ai-memory-cli/src/commands/hook_capture.rs | 2377 | // ── install-time default strategy (#128), no marker required ────── | COMMENT |
| MEDIUM | crates/ai-memory-cli/src/commands/install_hooks.rs | 10022 | // ── #issue project-strategy preservation on re-apply ───────────── | COMMENT |
| MEDIUM | crates/ai-memory-cli/src/commands/install_hooks.rs | 10022 | // ── #issue project-strategy preservation on re-apply ───────────── | COMMENT |
| MEDIUM | crates/ai-memory-cli/src/commands/install_hooks.rs | 10237 | // ── P1.8 validate_as_user ──────────────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-cli/src/commands/render_shared.rs | 5504 | // ── install-time --project-strategy baking (#128) ──────────────── | COMMENT |
| MEDIUM | crates/ai-memory-cli/src/commands/render_shared.rs | 5504 | // ── install-time --project-strategy baking (#128) ──────────────── | COMMENT |
| MEDIUM | crates/ai-memory-mcp/tests/suite/autoscope_multiuser.rs | 522 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-mcp/tests/suite/autoscope_multiuser.rs | 526 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-mcp/tests/suite/autoscope_multiuser.rs | 672 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-mcp/tests/suite/autoscope_multiuser.rs | 679 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-mcp/tests/suite/autoscope_multiuser.rs | 733 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-mcp/tests/suite/autoscope_multiuser.rs | 737 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-mcp/tests/suite/stress_autoscope.rs | 397 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-mcp/tests/suite/stress_autoscope.rs | 399 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-mcp/tests/suite/stress_autoscope.rs | 458 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-mcp/tests/suite/stress_autoscope.rs | 460 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-mcp/tests/suite/stress_autoscope.rs | 553 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-mcp/tests/suite/stress_autoscope.rs | 561 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-mcp/tests/suite/stress_autoscope.rs | 651 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-mcp/tests/suite/stress_autoscope.rs | 653 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-mcp/tests/suite/stress_autoscope.rs | 744 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-mcp/tests/suite/stress_autoscope.rs | 746 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-mcp/tests/suite/stress_autoscope.rs | 809 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-mcp/tests/suite/stress_autoscope.rs | 811 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-mcp/tests/suite/stress_autoscope.rs | 870 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-mcp/tests/suite/stress_autoscope.rs | 884 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-mcp/tests/suite/stress_autoscope.rs | 1102 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-mcp/tests/suite/stress_autoscope.rs | 1117 | // ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-mcp/tests/suite/read_page_related.rs | 115 | /// └────────▶ lib:notes/x.md (cross-project) | COMMENT |
| MEDIUM | crates/ai-memory-mcp/src/admin.rs | 14756 | // ── user-management endpoints (P1.4) ────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-core/src/user.rs | 357 | // ── username validation ─────────────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-core/src/user.rs | 421 | // ── email validation ────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-core/src/user.rs | 478 | // ── NewUser::validate normalisation ─────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-core/src/active_project.rs | 1511 | // ──────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-core/src/active_project.rs | 1526 | // ──────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-llm/src/openai_compat.rs | 835 | // ── strip_reasoning_blocks ─────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-wiki/src/wiki.rs | 7974 | // ── P1.6: write attribution ───────────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-store/tests/suite/related_walk.rs | 83 | /// └── links to ─────┘ (cycle b⇄c) | COMMENT |
| MEDIUM | crates/ai-memory-store/src/reader.rs | 13935 | // ── user lookups ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-hooks/src/session_end_equivalence.rs | 1059 | // ── fixtures ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-hooks/src/session_end_equivalence.rs | 1269 | // ── the tests ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-consolidate/tests/suite/lifecycle.rs | 168 | // ── Phase 1 — bootstrap a fresh wiki + store ───────────────── | COMMENT |
| MEDIUM | crates/ai-memory-consolidate/tests/suite/lifecycle.rs | 214 | // ── Phase 3 — time-travel via direct SQL ──────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-consolidate/tests/suite/lifecycle.rs | 261 | // ── Phase 5 — real sweep; verify row counts ───────────────── | COMMENT |
| MEDIUM | crates/ai-memory-consolidate/tests/suite/lifecycle.rs | 333 | // ── Phase 6 — FTS5 invariants ─────────────────────────────── | COMMENT |
| MEDIUM | crates/ai-memory-consolidate/tests/suite/lifecycle.rs | 456 | // ── Phase 8 — retention scores ordering sanity check ──────── | COMMENT |
| MEDIUM | crates/ai-memory-consolidate/src/lint.rs | 487 | // ── A5: zero-LLM contradiction detection (cosine-similarity band) ────────── | COMMENT |
| MEDIUM | crates/ai-memory-consolidate/src/lint.rs | 1201 | // ── LintFinding tolerant deserialization ───────────────────────────── | COMMENT |
| 28 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | Cargo.toml | 16 | # Live A/B harness — not part of the shipped binary, but in | COMMENT |
| MEDIUM | Cargo.toml | 21 | # ships, plus test-support. The evals harness is two more test binaries nobody | COMMENT |
| MEDIUM | crates/ai-memory-web/src/markdown.rs | 33 | // robust hook. Code (fenced + inline) is skipped so `[[…]]` stays literal | COMMENT |
| MEDIUM | crates/ai-memory-cli/Cargo.toml | 23 | # a second ~120 MB harness binary for it that contains no tests. | COMMENT |
| MEDIUM | crates/ai-memory-cli/tests/suite/backfill_e2e.rs | 263 | // it acks, but poll briefly to stay robust against any lag. | COMMENT |
| MEDIUM⚡ | crates/ai-memory-cli/templates/config.default.toml | 178 | # existing local harness session history once, so installing hooks mid-project | COMMENT |
| MEDIUM⚡ | crates/ai-memory-cli/templates/config.default.toml | 185 | # The first `ai-memory run <harness>` launch per harness, binary version and | COMMENT |
| MEDIUM⚡ | crates/ai-memory-cli/templates/config.default.toml | 186 | # config home installs that harness's lifecycle hooks and MCP server when they | COMMENT |
| MEDIUM | crates/ai-memory-cli/templates/config.default.toml | 292 | # (crashed harness, closed terminal, timed-out hook) with the summary page | COMMENT |
| MEDIUM | crates/ai-memory-cli/templates/config.default.toml | 340 | # Optional env-only presets for managed harness launches. Select one with | COMMENT |
| MEDIUM | crates/ai-memory-cli/templates/config.default.toml | 594 | # behaviour; correct only for one harness at a time. | COMMENT |
| MEDIUM | crates/ai-memory-cli/templates/plugin/ai-memory-hook.sh | 29 | # fallbacks. Attribute the event to the harness that really ran it, or stay | COMMENT |
| MEDIUM | crates/ai-memory-cli/src/cli.rs | 2650 | #[value(alias = "deepseek-harness", alias = "deepseek_harness")] | COMMENT |
| MEDIUM | crates/ai-memory-cli/src/cli.rs | 3002 | #[value(alias = "deepseek-harness", alias = "deepseek_harness")] | COMMENT |
| MEDIUM | crates/ai-memory-cli/src/commands/run.rs | 3998 | failures.push(format!("{} store resolution: {error:#}", harness.as_str())); | CODE |
| MEDIUM | crates/ai-memory-cli/src/commands/run.rs | 4032 | failures.push(format!("{} transcript export: {error:#}", harness.as_str())); | CODE |
| MEDIUM | crates/ai-memory-store/tests/suite/multi_session.rs | 315 | "# Plan\n\nfrom harness A" | CODE |
| MEDIUM | crates/ai-memory-store/tests/suite/multi_session.rs | 325 | "# Plan\n\nfrom harness B" | CODE |
| MEDIUM | crates/ai-memory-store/src/ops.rs | 5111 | // path-boundary match robust to trailing slash/backslash drift. | COMMENT |
| MEDIUM | crates/ai-memory-hooks/src/synth.rs | 1197 | /// #1225: the harness's end reason, when captured, closes the summary; | COMMENT |
| MEDIUM | docker/multiuser-test/compose.yml | 8 | # The unproxied port is deliberately exposed: it is how the harness checks that | COMMENT |
| MEDIUM | tests/wrapper_upgrade.sh | 351 | # harness arguments remain intact, and preserve the native child's exit code. | COMMENT |
| MEDIUM | tests/hooks/test_lib.sh | 732 | # The spool dir follows the data dir, which the harness pins inside $TMP. | COMMENT |
| MEDIUM | tests/hooks/test_lib.sh | 1157 | # show for it on the harness side. A PATH curl shim runs the real shipped | COMMENT |
| MEDIUM | tests/hooks/test_plugin_launcher.sh | 10 | # precedence, the missing-binary path, the foreign-harness guard and the | COMMENT |
| MEDIUM | .cargo/config.toml | 5 | # (everything but the evals harness) and lets `cargo t -p <crate>` build just | COMMENT |
| MEDIUM | hooks/_lib.sh | 275 | # Extract a harness-native session id from the common hook payload spellings. | COMMENT |
| MEDIUM | scripts/managed-workstream-acceptance.sh | 2 | # Manual, opt-in acceptance test for managed cross-harness workstreams. | COMMENT |
| MEDIUM | scripts/managed-workstream-acceptance.sh | 3 | # This is intentionally not called by CI: the real-harness phase uses the | COMMENT |
| MEDIUM | scripts/managed-workstream-acceptance.sh | 19 | # `ai-memory run` wires the harness it launches into that harness's user | COMMENT |
| MEDIUM | scripts/managed-workstream-acceptance.sh | 154 | # the harness produced new portable evidence, and any assigned context delta | COMMENT |
| MEDIUM | scripts/managed-workstream-acceptance.sh | 601 | # native session in any auto-detected harness. | COMMENT |
| MEDIUM | scripts/managed-workstream-acceptance.sh | 615 | # The harness list in this message grows as adapters join the automatic | COMMENT |
| MEDIUM | scripts/managed-workstream-acceptance.sh | 1187 | # history through the local dossier. Other cross-harness checks mutate the | COMMENT |
| MEDIUM | scripts/managed-workstream-acceptance.sh | 1188 | # Kimi workstream before this point, so it is not an exact two-harness switch. | COMMENT |
| MEDIUM | scripts/managed-workstream-acceptance.sh | 1564 | # The real-harness phase reads credentials from the operator's home and | COMMENT |
| MEDIUM | .github/workflows/plugins.yml | 7 | # launcher; this workflow adds what needs the real harness CLIs: | COMMENT |
| MEDIUM | .github/workflows/plugins.yml | 48 | # Pinned harness CLIs: a new release is adopted deliberately, after its | COMMENT |
| MEDIUM | .github/workflows/ci.yml | 178 | # companions/. The harness gives the server a scratch data dir, a | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …ates/ai-memory-web/templates/_inbox_notifications.html | 7 | async function refreshInboxNotifications(){ | CODE |
| LOW | crates/ai-memory-cli/src/commands/render_shared.rs | 470 | function captureWindowsUnplaceable(word: string, base: string): boolean { const w = captureStripProvider(word); if (/^[A | CODE |
| LOW | crates/ai-memory-cli/src/commands/render_shared.rs | 602 | function captureWithoutWindowsEscapes(command: string): string | undefined { if (!/[`^]/.test(command)) return undefined | CODE |
| LOW | crates/ai-memory-cli/src/commands/render_shared.rs | 627 | function captureUnevaluatedExpansion(command: string): boolean { const operator = (c: string) => "|&;<>()`".includes(c); | CODE |
| LOW | crates/ai-memory-cli/src/commands/render_shared.rs | 667 | function captureBraceSequenceBounds(body: string): [number, number, boolean] | undefined { const parts = body.split(".." | CODE |
| LOW | crates/ai-memory-cli/src/commands/render_shared.rs | 669 | function captureBraceOverflowLeaves(segment: string): boolean { if (/[\/\\~()|]/.test(segment)) return true; const chars | CODE |
| LOW | tests/e2e/external_relay_smoke.py | 485 | def start_drop_response_proxy(self) -> DropFirstResponseProxy: | CODE |
| LOW | tests/e2e/test_external_relay_smoke.py | 14 | def test_failed_subprocess_exposes_safe_error_markers_not_payloads(self): | CODE |
| LOW | tests/e2e/test_external_relay_smoke.py | 42 | def test_unknown_and_large_output_are_omitted_and_success_is_unchanged(self): | CODE |
| LOW | tests/e2e/test_external_relay_smoke.py | 55 | def test_expected_failure_and_unspecified_exit_do_not_raise(self): | CODE |
| LOW | tests/e2e/test_external_relay_smoke.py | 62 | def test_numeric_codes_are_bounded_and_empty_stderr_is_explicit(self): | CODE |
| LOW | tests/e2e/claude_plugin_smoke.py | 223 | def scenario_settings_hook_wins(box: Sandbox) -> None: | CODE |
| LOW⚡ | …es/jev-reranker-adapter/test_jev_rerank_shim_choice.py | 48 | def test_rounding_drift_tolerated(self): | CODE |
| LOW⚡ | …es/jev-reranker-adapter/test_jev_rerank_shim_choice.py | 53 | def test_missing_probabilities_object(self): | CODE |
| LOW⚡ | …es/jev-reranker-adapter/test_jev_rerank_shim_choice.py | 57 | def test_non_object_response_rejected(self): | CODE |
| LOW⚡ | …es/jev-reranker-adapter/test_jev_rerank_shim_choice.py | 99 | def test_out_of_range_rejected(self): | CODE |
| LOW⚡ | …es/jev-reranker-adapter/test_jev_rerank_shim_choice.py | 106 | def test_degenerate_sum_rejected(self): | CODE |
| LOW⚡ | …es/jev-reranker-adapter/test_jev_rerank_shim_choice.py | 114 | def test_duplicate_candidate_ids_rejected(self): | CODE |
| LOW⚡ | …es/jev-reranker-adapter/test_jev_rerank_shim_choice.py | 119 | def test_empty_candidates_rejected(self): | CODE |
| LOW⚡ | …es/jev-reranker-adapter/test_jev_rerank_shim_choice.py | 125 | def test_duplicate_keys_rejected(self): | CODE |
| LOW⚡ | …es/jev-reranker-adapter/test_jev_rerank_shim_choice.py | 130 | def test_normal_json_accepted(self): | CODE |
| LOW⚡ | …es/jev-reranker-adapter/test_jev_rerank_shim_choice.py | 145 | def test_duplicate_json_key_in_response_raises(self): | CODE |
| LOW⚡ | …es/jev-reranker-adapter/test_jev_rerank_shim_choice.py | 153 | def test_valid_response_maps_scores(self): | CODE |
| LOW⚡ | …es/jev-reranker-adapter/test_jev_rerank_shim_choice.py | 161 | def test_malformed_response_raises(self): | CODE |
| LOW⚡ | docs/examples/auto-improve-eval/test_score_proposal.py | 48 | def test_the_sample_proposal_passes(self) -> None: | CODE |
| LOW⚡ | docs/examples/auto-improve-eval/test_score_proposal.py | 51 | def test_a_portuguese_procedure_passes_and_todo_in_prose_is_no_placeholder( | CODE |
| LOW⚡ | docs/examples/auto-improve-eval/test_score_proposal.py | 56 | def test_a_japanese_procedure_passes(self) -> None: | CODE |
| LOW⚡ | docs/examples/auto-improve-eval/test_score_proposal.py | 60 | def test_a_portuguese_rule_passes(self) -> None: | CODE |
| LOW⚡ | docs/examples/auto-improve-eval/test_score_proposal.py | 64 | def test_rule_length_counts_characters_not_bytes(self) -> None: | CODE |
| LOW⚡ | docs/examples/auto-improve-eval/test_score_proposal.py | 71 | def test_a_procedure_without_a_list_of_steps_fails(self) -> None: | CODE |
| LOW⚡ | docs/examples/auto-improve-eval/test_score_proposal.py | 79 | def test_a_rewrite_that_scores_lower_than_the_page_fails(self) -> None: | CODE |
| LOW⚡ | docs/examples/auto-improve-eval/test_score_proposal.py | 83 | def test_escaped_json_and_nested_keys_are_read_as_the_server_sends_them( | CODE |
| LOW⚡ | docs/examples/auto-improve-eval/test_score_proposal.py | 91 | def test_an_escaped_backslash_before_n_is_not_read_as_a_line_break(self) -> None: | CODE |
| LOW⚡ | docs/examples/auto-improve-eval/test_score_proposal.py | 96 | def test_a_crlf_page_scores_as_its_lf_twin(self) -> None: | CODE |
| LOW | docs/examples/auto-improve-eval/test_score_proposal.py | 112 | def test_a_non_json_input_fails_closed_in_the_shell_scorer(self) -> None: | CODE |
| LOW⚡ | .github/codeql/test_filter_test_alerts.py | 59 | def test_inline_test_module_result_is_dropped(self): | STRING |
| LOW⚡ | .github/codeql/test_filter_test_alerts.py | 64 | def test_production_code_result_is_kept(self): | STRING |
| LOW⚡ | .github/codeql/test_filter_test_alerts.py | 69 | def test_code_after_the_test_module_is_kept(self): | STRING |
| LOW⚡ | .github/codeql/test_filter_test_alerts.py | 73 | def test_tests_directory_result_is_dropped(self): | STRING |
| LOW⚡ | .github/codeql/test_filter_test_alerts.py | 79 | def test_other_rules_in_test_code_are_kept(self): | STRING |
| LOW⚡ | .github/codeql/test_filter_test_alerts.py | 83 | def test_unreadable_source_keeps_its_result(self): | STRING |
| LOW⚡ | .github/codeql/test_filter_test_alerts.py | 87 | def test_rule_resolved_through_its_index(self): | STRING |
| LOW | .github/codeql/test_filter_test_alerts.py | 104 | def test_module_ranges_skip_a_cfg_test_function(self): | STRING |
| LOW | .github/codeql/test_filter_test_alerts.py | 108 | def test_out_of_line_module_paths_follow_rustc(self): | STRING |
| LOW | .github/codeql/test_filter_test_alerts.py | 133 | def test_out_of_line_test_module_file_is_dropped(self): | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | evals/src/fidelity.rs | 88 | // Tokens the scaffold always carries would count as recalled whatever | COMMENT |
| MEDIUM | evals/src/fidelity.rs | 406 | // `body_markdown` is in the batch scaffold, so it can never be lost. | COMMENT |
| MEDIUM | crates/ai-memory-cli/templates/config.default.toml | 444 | # differ by provider and model. Their sum must fit the model's context window; | COMMENT |
| MEDIUM | crates/ai-memory-core/src/profile.rs | 239 | /// room for the scaffold every digest carries (the precedence line, the | COMMENT |
| MEDIUM | …/ai-memory-llm/tests/suite/openai_compat_guardrails.rs | 1 | //! Integration tests for the openai-compat guardrails, driving the real | COMMENT |
| MEDIUM | crates/ai-memory-hooks/src/brief_tiers.rs | 12 | //! router owns the strings and the security scaffold around them. | COMMENT |
| MEDIUM | docs/competitive-parity.md | 84 | | **Caura** (governed fleet memory, issue #810) | **No: different buyer** (org-scale multi-agent governance and live pee | CODE |
| MEDIUM | docs/competitive-parity.md | 84 | | **Caura** (governed fleet memory, issue #810) | **No: different buyer** (org-scale multi-agent governance and live pee | CODE |
| MEDIUM | docs/ARCHITECTURE.md | 1346 | # their sum must fit the model context window; | COMMENT |
| MEDIUM | docs/companion-crates.md | 551 | ├── crates/server/ # auth, CSRF, mutation broker, LLM orchestration | CODE |
| MEDIUM | docs/install.md | 3338 | #### Match the consolidation budget to a local model's context window | COMMENT |
| MEDIUM | docs/install.md | 3347 | # e.g. a model loaded with a 12k context window | COMMENT |
| MEDIUM | docs/research-2026-landscape.md | 997 | - Caura (issue #810): github.com/caura-ai/caura (README: governed multi-agent | CODE |
| MEDIUM | docs/marker-file.md | 142 | # captures. A multi-agent harness fans one goal out to many subagent | COMMENT |
| MEDIUM | docs/security-boundaries.md | 113 | | 11b | Capture exclusions drop before storage | `ai-memory-hooks` `capture_policy.rs` `extract` reads each adapter's ow | CODE |
| MEDIUM | docs/issues-mempalace.md | 125 | - **#1561**: "persist and verify embedding model metadata in palace | CODE |
| MEDIUM | docs/issues-mempalace.md | 130 | - **#1563 / #1261**: embedding model is hardcoded to all-MiniLM-L6-v2; users | CODE |
| MEDIUM | docs/issues-mempalace.md | 185 | | #1561/#1563: no stored embedding model identity; drift on model change | **#8 `{provider, model, dim}` stored next to | CODE |
| MEDIUM | docs/llm-provider-comparison.md | 370 | ## Run 3 - tightened anti-hallucination system prompt | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | crates/ai-memory-cli/src/commands/install_hooks.rs | 8304 | "# Generated by ai-memory install-hooks --agent cline.\n\ | CODE |
| HIGH | crates/ai-memory-cli/src/commands/install_hooks.rs | 8316 | "#!/bin/sh\n# Generated by ai-memory install-hooks --agent cline.\nexec {command}\n" | CODE |
| HIGH | crates/ai-memory-cli/src/commands/install_hooks.rs | 8382 | if !existing.contains("Generated by ai-memory install-hooks --agent cline") => | CODE |
| HIGH | crates/ai-memory-cli/src/commands/install_hooks.rs | 8405 | && !existing.contains("Generated by ai-memory install-hooks --agent cline") | CODE |
| HIGH | crates/ai-memory-cli/src/commands/uninstall.rs | 1572 | content.contains("Generated by ai-memory install-hooks --agent cline") | CODE |
| HIGH | crates/ai-memory-cli/src/commands/uninstall.rs | 2720 | "#!/bin/sh\n# Generated by ai-memory install-hooks --agent cline.\nexec 'other' 'hook' '--agent' 'cline'\n", | CODE |
| HIGH | crates/ai-memory-cli/src/commands/uninstall.rs | 2727 | "#!/bin/sh\n# Generated by ai-memory install-hooks --agent cline.\nexec 'ai-memory' 'hook' '--agent' 'cline' | CODE |
| HIGH | docs/usage.md | 667 | to be generated by ai-memory. | CODE |
| HIGH | docs/changelog/2.x.md | 1232 | entries. Migrations remove only entries proven generated by ai-memory, and plugin | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …ates/ai-memory-cli/tests/suite/live_token_usage_e2e.rs | 262 | // Step 1: first response, mid-session (`post-tool-use`). Usage must already be there and the session still open. | COMMENT |
| LOW | …ates/ai-memory-cli/tests/suite/live_token_usage_e2e.rs | 279 | // Step 2: a second response arrives; `stop` adds exactly that response. | COMMENT |
| LOW | …ates/ai-memory-cli/tests/suite/live_token_usage_e2e.rs | 296 | // Step 3: the same event delivered again (a retry, or a boundary that re-reads the same tail) changes nothing. | COMMENT |
| LOW | …ates/ai-memory-cli/tests/suite/live_token_usage_e2e.rs | 311 | // Step 4: a response that streams. First it is partial, then final under the SAME id: it counts once, at its | COMMENT |
| LOW | …ates/ai-memory-cli/tests/suite/live_token_usage_e2e.rs | 344 | // Step 5: the session ends. The legacy cumulative report must agree with what live capture already recorded; if | COMMENT |
| LOW | crates/ai-memory-mcp/src/admin.rs | 6354 | // Step 3: execute the rename. The writer validates the name and | COMMENT |
| LOW | crates/ai-memory-mcp/src/admin.rs | 6375 | // Step 4: count is_latest pages that now belong to the renamed project. | COMMENT |
| LOW | …es/ai-memory-consolidate/tests/suite/embed_backfill.rs | 389 | // Step 2: forced backfill with the embedder that fails on notes/bad.md. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …ates/ai-memory-cli/tests/suite/live_token_usage_e2e.rs | 262 | // Step 1: first response, mid-session (`post-tool-use`). Usage must already be there and the session still open. | COMMENT |
| LOW | …ates/ai-memory-cli/tests/suite/live_token_usage_e2e.rs | 279 | // Step 2: a second response arrives; `stop` adds exactly that response. | COMMENT |
| LOW | …ates/ai-memory-cli/tests/suite/live_token_usage_e2e.rs | 296 | // Step 3: the same event delivered again (a retry, or a boundary that re-reads the same tail) changes nothing. | COMMENT |
| LOW | …ates/ai-memory-cli/tests/suite/live_token_usage_e2e.rs | 311 | // Step 4: a response that streams. First it is partial, then final under the SAME id: it counts once, at its | COMMENT |
| LOW | …ates/ai-memory-cli/tests/suite/live_token_usage_e2e.rs | 344 | // Step 5: the session ends. The legacy cumulative report must agree with what live capture already recorded; if | COMMENT |
| LOW | crates/ai-memory-mcp/src/admin.rs | 6354 | // Step 3: execute the rename. The writer validates the name and | COMMENT |
| LOW | crates/ai-memory-mcp/src/admin.rs | 6375 | // Step 4: count is_latest pages that now belong to the renamed project. | COMMENT |
| LOW | …es/ai-memory-consolidate/tests/suite/embed_backfill.rs | 389 | // Step 2: forced backfill with the embedder that fails on notes/bad.md. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/e2e/external_relay_smoke.py | 464 | except (urllib.error.URLError, TimeoutError): | CODE |
| HIGH | …xamples/jev-reranker-adapter/jev_rerank_shim_choice.py | 259 | except KeyboardInterrupt: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | scripts/check-dashboard-core-mutations.py | 27 | {'name': 'expose-admin-feature-settings', 'file': 'crates/ai-memory-web/src/features.rs', 'start': 'pub(crate) async | CODE |
| HIGH | scripts/check-dashboard-core-mutations.py | 32 | "before": "if cursor.offset > len", "after": "if true || cursor.offset > len", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/e2e/external_relay_smoke.py | 894 | except Exception as error: # diagnostics must survive every assertion failure | CODE |
| LOW | …xamples/jev-reranker-adapter/jev_rerank_shim_choice.py | 204 | except Exception as e: # transport failure upstream | CODE |
| LOW | …xamples/jev-reranker-adapter/jev_rerank_shim_choice.py | 244 | except Exception as e: | CODE |
| LOW | scripts/check-dashboard-core-mutations.py | 204 | except Exception as error: | CODE |
| LOW | scripts/check-dashboard-core-mutations.py | 216 | except Exception as error: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/e2e/external_relay_smoke.py | 17 | CODE | |
| LOW | tests/e2e/codex_plugin_smoke.py | 25 | CODE | |
| LOW | tests/e2e/claude_plugin_smoke.py | 31 | CODE | |
| LOW | docs/examples/auto-improve-eval/score_proposal.py | 19 | CODE | |
| LOW | docs/examples/auto-improve-eval/test_score_proposal.py | 6 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/e2e/codex_plugin_smoke.py | 113 | CODE | |
| LOW | tests/e2e/codex_plugin_smoke.py | 161 | CODE | |
| LOW | tests/e2e/claude_plugin_smoke.py | 98 | CODE | |
| LOW | …xamples/jev-reranker-adapter/jev_rerank_shim_choice.py | 186 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crates/ai-memory-mcp/tests/suite/admin_llm_test.rs | 49 | body: format!("Incorrect API key provided: {}", fake_key()), | CODE |
| LOW | crates/ai-memory-mcp/tests/suite/admin_llm_test.rs | 67 | fn fake_key() -> String { | CODE |
| LOW | crates/ai-memory-mcp/tests/suite/admin_llm_test.rs | 160 | !message.contains(&fake_key()), | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crates/ai-memory-consolidate/tests/suite/lifecycle.rs | 407 | // the "don't forget too fast" property explicit — searching for a | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/install-hooks.sh | 8 | # Usage: | COMMENT |