CodeDecay can read repo-local memory from .codedecay/memory.json and use it
to enrich PR risk reports with project-specific flows, commands, invariants,
architecture notes, and past regressions.
Memory is optional. If no memory file exists, CodeDecay uses empty defaults. The memory file is local to the repository, is never uploaded by CodeDecay, and does not require telemetry, API keys, LLMs, model calls, or a hosted service.
npx codedecay memory --format markdown
npx codedecay memory --cwd ../my-repo --format jsoncodedecay analyze automatically applies memory when .codedecay/memory.json
exists in the analyzed repository.
Use codedecay memory setup to inspect safe setup guidance for local memory,
Mem0, and Supermemory:
npx codedecay memory setup --provider all
npx codedecay memory setup --provider supermemory --format jsonThe command is dry-run by default. It does not install packages, call providers, send telemetry, call models, or edit tracked config.
To write a reviewable config snippet under .codedecay/local/, pass --apply:
npx codedecay memory setup --provider mem0 --applyThis writes .codedecay/local/memory-providers.yml only. Review the snippet
before copying any provider settings into .codedecay/config.yml.
Use codedecay memory-import when you want to turn structured learnings into a
reviewable local memory file instead of hand-editing everything.
npx codedecay memory-import --input incidents.json
npx codedecay memory-import --input incidents.json --apply --format jsonCurrent import shapes include:
- direct CodeDecay memory sections such as
flows,commands,invariants,architecture, andregressions ciFailuresincidentspullRequests
The command previews the merged result by default. Use --apply to write the
normalized output to .codedecay/memory.json.
Imported learnings remain local-first and reviewable in git. After import, the
next codedecay analyze, redteam, or agent run will use the merged memory
to produce deterministic findings and recommended checks.
Use codedecay memory-learn when the input is closer to CI, PR, or CodeDecay
report data than hand-authored memory.
npx codedecay memory-learn --input ci-failure.json
npx codedecay memory-learn --input incidents/auth-outage.md
npx codedecay memory-learn --input codedecay-report.json --apply --format json
npx codedecay memory-learn --input .codedecay/local/product-runs/latest.json --applyAccepted inputs include:
ciFailures: failing workflow, job, message, command, files, and areaspullRequests: title, body, labels, commit messages, changed files, checks, and areasincidentsorincidentMarkdowns: structured incident/postmortem entries that become invariant and past-regression proposals- direct
.mdor.markdownincident/postmortem files incidentMarkdownFiles: paths in a JSON input file, read relative to the input filereports,codeDecayReports,failOnReports, orblockedReports- a single CodeDecay JSON report with
tool: "CodeDecay"andfindings - product verification reports with
tool: "CodeDecay"andtargets productReports,productVerificationReports, orproductTargetReports
The learner converts those signals into reviewable proposals for flows,
commands, invariants, architecture notes, and past regressions. Each proposal
includes the source type/path, confidence, timestamp, and why the learning
matters. The preview also shows the merged memory that would be written if
--apply is passed.
It infers impacted areas from file paths, PR labels such as area: auth, and
text such as auth, api, schema, migration, workflow, or coverage.
For CodeDecay report inputs, memory-learn keeps only actionable findings that
include concrete evidence such as a file, impacted area, or recommended check.
Generic self-referential gate output without evidence is ignored so the memory
file does not learn CodeDecay finding placeholders as real regressions.
For product verification reports, memory-learn keeps only reviewable metadata:
passed generated test titles, target ids, product route/API paths, impacted
files, and rerun commands. It does not store generated test source, stdout,
stderr, screenshots, traces, request bodies, headers, cookies, or full URLs with
query strings.
memory-learn is deterministic and local. It does not query GitHub, inspect
remote CI, call a model, upload telemetry, or write anything unless --apply
is passed. GitHub PR and CI data must be provided as local JSON input if you
want CodeDecay to learn from it.
{
"version": 1,
"flows": [
{
"name": "Checkout",
"description": "Customer checkout from cart to payment confirmation.",
"areas": ["api", "ui"],
"productPaths": ["/checkout", "/api/checkout"],
"checks": [
"failed card retry",
"missing shipping address",
"duplicate webhook delivery"
]
}
],
"commands": [
{
"name": "Checkout smoke tests",
"command": "pnpm test checkout",
"areas": ["api", "ui"]
}
],
"invariants": [
{
"name": "Auth fails closed",
"description": "Missing or invalid users must not become admins.",
"areas": ["auth"],
"severity": "high"
}
],
"architecture": [
{
"title": "Session boundary",
"note": "Session parsing feeds all API routes.",
"files": ["src/auth/*"]
}
],
"regressions": [
{
"title": "Anonymous admin fallback",
"description": "A previous fallback user path granted admin access.",
"areas": ["auth"],
"productPaths": ["/api/admin/users"],
"check": "request protected routes without a token",
"severity": "high"
}
]
}All top-level arrays are optional. Unknown fields are ignored by v1.
Memory entries can match changed code by impacted area, file path, or both.
Supported areas values:
apiuidatabaseauthconfigtestsourcedocs
Supported files values are simple path patterns:
- exact path:
src/auth/session.ts - contains match:
auth - wildcard match:
src/auth/*
Supported productPaths values are live product routes or API paths:
- UI route:
/settings - API path:
/api/users - parameterized path:
/api/users/{id}or/api/users/:id
codedecay product --generate-tests and
codedecay product --generate-api-tests use product memory for priority:
- previous product regressions are generated with high priority
- passed product flows become high priority when their memory entry matches the current changed files or impacted areas
- changed framework routes remain high priority even without memory
Recommended review workflow:
- Run product verification and write a JSON report, for example
codedecay product --generate-api-tests --run-generated-api-tests --output .codedecay/local/product-runs/latest.json --format json. - Preview learned memory with
codedecay memory-learn --input .codedecay/local/product-runs/latest.json. - Review the
proposalssection for source, confidence, timestamp, and why each entry matters. - Re-run with
--applyonly after reviewing the preview. - Commit
.codedecay/memory.jsonlike source code so changes are visible in PRs.
Retention and redaction defaults:
memory-learnstrips bearer tokens, common secret query keys, email addresses, query strings, generated test source, request bodies, headers, screenshots, traces, stdout, and stderr.- Keep
.codedecay/local/**uncommitted unless your team explicitly wants to review generated artifacts. - Prune stale product memory by removing obsolete
flows[].productPathsorregressions[]entries from.codedecay/memory.json; the file is intentionally plain JSON so pruning is a normal code-review change. - If a learned check is flaky, edit the entry before committing it: downgrade the
severity, add a clearer
description, or remove theproductPathsuntil the check is stable.
Flat memory sections are useful, but durable engineering knowledge should come from verified outcomes: confirmed regressions, repairs, refuted hypotheses, accepted risks, incidents, ADRs, conventions, ownership changes, and proof recipes.
Use versioned learningEvents in .codedecay/memory.json:
# Preview a proposal (does not mutate memory)
npx codedecay memory learning --action propose --input learning-event.json
# Persist the proposal
npx codedecay memory learning --action propose --input learning-event.json --apply
# Explicit human review
npx codedecay memory learning --action approve --event-id <id> --actor kunal --reason "Verified against payout retry CI" --apply
npx codedecay memory learning --action reject --event-id <id> --apply
npx codedecay memory learning --action supersede --event-id <id> --apply
npx codedecay memory learning --action expire --event-id <id> --apply
npx codedecay memory learning --action revoke --event-id <id> --applyRules:
- Agent output, PR text, comments, and external memory stay
proposeduntil an explicit approve/reject/supersede/expire/revoke operation. - Trusted runtime/tool evidence can raise proposal confidence, but never silently writes durable approved memory.
- Every event keeps source evidence IDs, scope (repo/revision/files/symbols), trust class, creator, timestamps, review status, and an audit trail.
- Retrieval only surfaces approved, in-scope, non-expired events and explains inclusion and suppression.
- Refuted hypotheses affect ranking only inside a narrowly matched scope; they cannot globally disable a rule.
- Redteam/analyze reports show when a prior approved learning influenced
investigation or proof planning (
memory-learning-influenced).
Conflict detection flags duplicates, contradictions (for example confirmed regression vs refuted hypothesis), and ownership/architecture overlaps that should supersede stale routing.
When memory matches a PR, CodeDecay may add:
- findings for impacted invariants
- findings for past regression areas
- findings for matching architecture notes
- findings for approved learning events that match the change
- recommended checks for flows
- recommended commands from the memory file
- recommended proof recipes from approved learnings
CodeDecay does not run memory commands automatically. They are reported as project-specific checks for the user or future execution adapters.
Memory matches are rendered as untrusted memory-context, contribute 0 score,
and do not count as high-severity blockers in the closed loop. Markdown reports
separate them from scored risk findings, and SARIF emits them as informational
notes. Memory can guide a user or agent toward a check, but only the resulting
deterministic tool or runtime evidence can change trusted risk.
The v1 default memory provider is the local .codedecay/memory.json file.
CodeDecay formalizes this behind a MemoryProvider interface and a
memoryProviders config section so adapters can map the same provider shape to
open-source or user-owned memory systems such as Mem0 or Supermemory, while
preserving the local-first default.
Any future hosted or external memory adapter should be opt-in, never required
for codedecay analyze, and must not change deterministic baseline scoring.
The built-in provider is:
id: local
name: Local .codedecay memory
kind: local
The Mem0 adapter is available as an optional provider boundary. CodeDecay does
not install or import mem0ai unless a future workflow explicitly constructs
the provider from config. To prepare a repo for Mem0-backed context, install the
official package in the analyzed project and configure an API-key environment
variable:
npm install -D mem0aimemoryProviders:
providers:
- local
- provider: mem0
endpoint: http://127.0.0.1:8000
apiKeyEnv: MEM0_API_KEY
projectId: codedecayThe Supermemory adapter follows the same optional boundary. CodeDecay does not
install, import, or call supermemory unless a future workflow explicitly
constructs the provider from config. To prepare a repo for Supermemory-backed
context, install the official SDK in the analyzed project and configure an
API-key environment variable:
npm install -D supermemorymemoryProviders:
providers:
- local
- provider: supermemory
endpoint: http://127.0.0.1:8787
apiKeyEnv: SUPERMEMORY_API_KEY
collection: codedecayExternal providers are not enabled by default. They must not add telemetry, hidden network calls, API key requirements, LLM calls, or CodeDecayCloud dependencies to the OSS workflow.
codedecay analyze keeps deterministic local-memory behavior. It reads only
.codedecay/memory.json and does not call external memory providers.
codedecay redteam and codedecay agent can load enabled external memory
providers from memoryProviders.providers. External memory is merged into the
red-team context only. The report labels provider sources as untrusted context,
not deterministic evidence, and provider failures degrade into report warnings
instead of failing the command.
Keep external providers disabled until the repo intentionally opts in:
memoryProviders:
providers:
- local
- provider: supermemory
enabled: false
endpoint: http://127.0.0.1:8787
apiKeyEnv: SUPERMEMORY_API_KEY
collection: codedecay