Changelog¶
Release notes¶
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Releases 1.0.0–3.0.0 below were reconstructed retrospectively (this changelog was introduced after 3.0.0 shipped), organized by capability rather than by individual commit. The capability ladder matches
VERSIONandUPGRADE.md.
Version 4.34.1, 8/14/2026¶
Secret-guard output readability (PATCH). Field feedback from the maintainer's own regression test of the v4.34.0 pre-commit guard: every finding line repeated the same advisory tail, burying the findings. Guidance now appears once per run, not once per finding.
Changed¶
[secret-material]finding lines are findings only — they end at(N hit(s), first at line N); the redact/rotate/history guidance moved to a single consolidated line per consumer: the pre-commit hook's-> fix itfooter (now preceded by a blank separator line and carrying the shared/rotation/history wording), a one-line trailer in--scan-filesmode, and a one-line trailer after the warnings in a fullmemory-lintrun. Both runtimes at parity; 49 mirror tests unchanged and passing; the hook's grep contract is unaffected (the guidance line carries no[secret-material]tag).
Targets: re-copy the memory-lint built-in + .githooks/pre-commit, stamp.
Version 4.34.0, 8/14/2026¶
Pre-commit secret guard — the layer that prevents instead of detects (MINOR). The v4.33.x arc left one timing gap: agents get the redaction rule at write time and every push meets the CI floor — but a human teammate committing directly meets no automated check until the remote already has the secret, where redaction is no longer un-leaking and rotation begins. And the field incident's origin was never a memory file: the credentials entered the repo inside a Postman JSON and an OpenShift YAML, then contaminated a session log when a dry-run rendered them. The new committed
.githooks/pre-commitcloses the gap at the only placement that can — before the commit exists — and covers both surfaces.
Added¶
.githooks/pre-commit— scans the staged content (the index viagit show :path, not the worktree: exactly what this commit would publish; only what THIS commit stages, so a pre-existing finding elsewhere never gates an unrelated commit) of:memory/**.md— the full[secret-material]profile (credentials + PII);- config files —
.json/.yml/.yaml/.properties/.toml/.ini/.envand.env.*anywhere in the repo — credential-class checks only (token shapes, key assignments, Authorization headers, private keys): config files legitimately carry contact emails and paths; credential material never is. Findings print the linter's non-echoing report plus redaction / waiver / rotation guidance. Enforcing by default (maintainer decision): findings block the commit — the deliberate, scoped exception to the trigger layer's advisory doctrine, because secrets carry irreversible after-the-fact cost and an advisory default lets an inattentive commit ride to the remote. Opt down to warn-only withAGENT_MEMORY_SECRET_GUARD=advisory(env orgit config agent-memory.secretguard advisory); one-off bypassgit commit --no-verify; merge commits skipped; python3→node fallback (with neither, it skips with a note). Rides the existingcore.hooksPathactivation — zero new setup on initialized clones; a never-initialized clone falls through to the CI floor. memory-lint --scan-files FILE...(both runtimes): the standalone credential-class scan powering the hook and the CI wrappers — paths reported as given, exit 1 on findings, values never echoed.- Changed-config secret scan on the CI floor (all three forge wrappers): the push-time
sibling of the hook, scanning the push/PR's changed config files with the same advisory /
STRICT semantics — catches
--no-verifybypasses and never-initialized clones. .agent/secret-scan-ignore(committed, human-audited; installed as a commented stub): shell-glob-per-line exemptions for formats that can't carry the inline waiver tag (JSON has no comments; a.propertiessame-line comment corrupts the value). Config files only —memory/is never exempt. Honored by the hook and all three CI wrappers.- Detector refinements from a 661-file live-corpus probe (every committed
json/yml/yaml/properties file across two production repos — 6 findings, all false positives,
→ 0 after): single-brace
{PLACEHOLDER}and GitHub-Actions${{ … }}template forms;demo/testjoin the placeholder words; a template default that is itself provably a placeholder is safe (${DEMO_PEER_TOKEN:demo}) while credential-shaped fallbacks keep flagging (the v4.33.4 rule); dotted lowercase route references (v1.basic.auth) are exempt from the Authorization check;;joins the value delimiters (JAAS terminators); and a Postman split-pair pattern ("key": "client_secret", "value": "…") covers the literal incident artifact class. Mirror suites grow 46 → 49 tests per runtime, byte parity held.
Changed¶
- Trigger-layer docs enumerate both hooks, both surfaces, and the refined doctrine —
advisory by default; the pre-commit secret guard alone enforces:
AGENTS.mdroot - template,
ENABLE.md(Step 5e ignore-stub install, Step 6 hooks + CI floor descriptions, both-hooks chmod line),.githooks/README.md+init.sh,SKILL.mdbody (--scan-files),docs/DESIGN-ritual-triggers.md(v4.34.0 amendment — its §7.3 fork had recommended an opt-in pre-commit half back at v4.19.0), the whitepaper ×2, and the docs-site reliability + built-in-skills pages.
No memory-file shape change; SKILL.md frontmatter description unchanged → adapters untouched.
Verified end to end: 49/49 both runtimes; hook exercised across fourteen scratch-repo paths
(default-block / advisory-opt-down via env and git-config / waiver / ignore-file /
clean-config / index-vs-worktree / fast-path / node-only / --no-verify / .env /
Postman-JSON / memory-regression); live corpus scans clean through the real CLI in both
runtimes. Targets: copy the new hook + ignore stub, re-copy the built-in + hook docs + forge
CI file, chmod +x, stamp.
Version 4.33.4, 8/13/2026¶
[secret-material]— reject non-empty template defaults (PATCH). Post-release review found that v4.33.3's broad${…}placeholder exemption also trusted literal fallback values. A line such asclient_secret=${CLIENT_SECRET:-RealSecret123}could therefore evade assignment detection.
Fixed¶
${NAME},${NAME:}, and dotted references such as${vault.paths.kafka}remain safe placeholders. Any non-empty fallback is no longer exempt, soclient_secret=${CLIENT_SECRET:-RealSecret123}flags without echoing the value.- Python and Node remain at output parity; mirror suites pass 46 tests each.
No memory-file shape change; SKILL.md description unchanged, so adapters are untouched.
Targets re-copy the tool-managed memory-lint built-in and stamp.
Version 4.33.3, 8/13/2026¶
[secret-material]security-review hardening (PATCH). A fresh-context security review found that the detector was useful but not a reliable enforcement control: forge wrappers never passed--strict, the v4.33.1 ALL-CAPS exemption trusted uppercase secrets globally, common quoted/Authorization forms could bypass assignment detection, and Mode C did not require migrated-history triage. This patch closes all four findings while preserving the advisory-by-default doctrine.
Security¶
- Forge CI enforcement fixed: GitHub, GitLab, and Azure wrappers now invoke
memory-lint --strict, making warnings observable to the wrapper. The wrapper still converts findings to its native advisory result by default;AGENT_MEMORY_STRICT=1now genuinely blocks. - Uppercase-secret bypass closed: ALL-CAPS enum values are exempt only when the key names an
enum dimension (
source,type,mode,mechanism, orstrategy). Uppercase passwords, client secrets, and opaque tokens on secret-bearing keys flag. - Pasted-output coverage expanded: quoted JSON/YAML credential keys and
Authorization/Proxy-Authorizationheaders flag without echoing their values. Placeholder recognition is full-value anchored, so embeddingdummy,sample, or similar text no longer launders a credential; template/redaction forms remain safe. - Mode C migration hardened:
MIGRATE.mdrequires redaction during conversion, andENABLE.mdverification requires[secret-material]triage before the enable commit. - Fold-in (pre-tag, from the post-merge live-target review): the tightened template
recognition initially accepted only
${IDENTIFIER}, re-flagging standard default-value and dotted env-var forms (${REDIS_PASSWORD:},${VAR:-x},${a.b.c}) — including a target repo's own documented safe pattern for secrets (two live false positives on mercury-composable). The${…}alternative now accepts any brace-delimited reference; recognition stays full-value anchored, so a partially-literal value still flags. The motivating line is a verbatim mirror fixture.
Both runtimes remain at output parity; mirror suites now pass 46 tests each. No memory-file shape change; SKILL.md description unchanged, so adapters are untouched. Targets re-copy the built-in and their forge CI file, merge the Mode C redaction rule if they use migration, then stamp.
Version 4.33.2, 8/13/2026¶
[secret-material]— backtick is a value delimiter (PATCH). The v4.33.1 enum-constant exclusion missed the form the motivating field line actually used: markdown inline code. In`key=VALUE`the closing backtick rode into the captured value (OAUTHBEARER`), so the ALL-CAPS rule didn't match and the false positive survived. Caught minutes after release by the 4.33.1 rung's own verify step against the live target. Every scanned memory surface is markdown — the assignment pattern now treats backticks like quotes.
Fixed¶
memory-lintcredential-assignment pattern: backtick joins the quote/value delimiter set (`key=VALUE`capturesVALUE, notVALUE`) — both runtimes at parity; the mirror enum test now uses the exact field line form plus a backticked real-secret negative control (45 each). Verified against the live target: zero[secret-material]hits with no waiver.
Changed¶
- PR/MR description templates (this repo's own + all three forge variants): the rendered
<sub>convention-explainer footer became an HTML comment — it still guides authors in the pre-filled body, but never renders in a created PR/MR. From maintainer feedback on this release's own PR: the explanation is template guidance, not PR content.
No memory-file shape change; SKILL.md description unchanged → adapters untouched. Targets: re-copy the built-in + stamp — the mercury-composable waiver becomes genuinely droppable here (4.33.1's rung said it; 4.33.2 makes it true) — and optionally re-copy the forge description template if uncustomized.
Version 4.33.1, 8/13/2026¶
[secret-material]— ALL-CAPS enum constants are not credentials (PATCH). Check 10's first field contact (the 2026-08-13 Mode B upgrades) produced exactly one finding across two production repos — and it was a false positive: a session log documenting Confluent'sbearer.auth.credentials.sourceproperty, whose value there is the enum constantOAUTHBEARER— a source type, not a credential. The credential-assignment pattern now recognizes ALL-CAPS identifiers (OAUTHBEARER,SASL_SSL,STATIC_TOKEN, …) as config constants: real credentials carry mixed case/symbols, and the famous uppercase-only shapes (e.g. AWS access-key ids) stay covered by the value-shape patterns independently. The advisory stays signal, not noise — fix the detector, don't sprinkle waivers through client repos.
Fixed¶
memory-lint_is_placeholder_value/is_placeholder_value: values matching^[A-Z][A-Z0-9_]{2,}$are treated as config enum constants, not secrets — both runtimes at parity, mirror test added (45 each).- Targets that waived this exact FP class (mercury-composable, session
2026-07-09-212417.md) may drop the waiver tag after upgrading — noted in the rung.
No memory-file shape change; SKILL.md description unchanged → adapters untouched.
Version 4.33.0, 8/13/2026¶
Session-log secret redaction — ritual rule +
memory-lint[secret-material]advisory (MINOR). A client-side DLP scanner caught a live OAuth client secret in a committed session log: the agent had pasted smoke-test output verbatim, and nothing in the protocol or tooling stood between a rendered credential andgit push. Session logs and continuity are committed and shared by design — so the ritual now carries an explicit redaction rule, andmemory-lintgains a deterministic backstop for the detectable shapes. Doc rule first, observational lint second, no mutation — the tool warns; the human redacts and rotates.
Added¶
- Redaction rule in the after-session ritual (
AGENTS.mdroot + template; echoed inENABLE.mdStep 5c and the schema's session-file section): never write secrets or PII intomemory/— redact pasted command/smoke-test output to(REDACTED)before persisting (template placeholders like${VAR}are already safe); a secret that was committed anyway is exposed — redaction is not un-leaking; rotate it, and git history cleanup is a separate, human-led step. Redaction is the one sanctioned edit to an otherwise-immutable session log. memory-lintcheck (10)[secret-material](both runtimes at parity + mirror tests, 44 each): scans every committed memory surface —memory/*.md,memory/sessions/, andmemory/archive/(where pasted output lives; the conflict-marker check's session exclusion deliberately does NOT apply here) — for known token shapes (AWS / GitHub / GitLab / Slack / Google, private-key blocks, JWTs), credential-key assignments with literal values (the rendered-JAAS class; placeholders and(REDACTED)recognized as safe, number/date shapes excluded), emails (noreply/git@/ example forms excluded), SSN and Luhn-verified payment-card shapes, and absolute home paths (write~). Advisory WARN (--strict/ CIAGENT_MEMORY_STRICT=1gate it red); the report never echoes the matched value — a lint line quoting the secret would amplify the leak into terminals and CI logs;lint:allow-secret-materialon a line waives a deliberately-quoted example.- Dogfooded on this repo (145 session logs + full archive): two real pre-existing
home-pathhits surfaced (mock-path quotes in old cleanup logs — waived in place with the new marker); zero credential/PII noise across all technical content.
Changed¶
memory-lintSKILL.md (check list + description — description change → adapters re-synced).- Lockstep:
VERSION→ 4.33.0;CHANGELOG;README(row + 10-cap trim);UPGRADE.md(row +4.32.1 → 4.33.0rung); docs site (reference/built-in-skills.md— ten checks). No memory-file shape change.
Version 4.32.1, 8/6/2026¶
Mode A
last_sessioncontradiction fix (PATCH). A real Mode A enable (2026-08-06), confirmed by an adversarial protocol audit, surfaced a tensionENABLE.mdhad carried since Step 5c was added: Step 5b still said a non-migrated enable leaveslast_session: (none yet), while Step 5c mandates writing a first enable session log for every fresh enable — so "(none yet)" was false the moment the enable completed, and it blinded the multi-agent continuity check (AGENTS.mdreadslast_sessionto decide whether another agent family worked last). Step 5b's own footer bullet already pointed the seeded facts'originat the 5c log;last_sessionnow points there too.
Fixed¶
ENABLE.mdStep 5b: a non-migrated enable now pointslast_sessionat the Step 5c enable log —<today> | agent: <your agent name> (<the 5c log's filename stem>)— filled when that log is written (the same moment its stem becomes the seeded facts'origin). The migrated-history branch (Mode C) is unchanged. Step 5c states the back-reference.templates/memory/continuity.md: the literal(none yet)seed became a{{LAST_SESSION}}placeholder — the value is mode-dependent and always filled (the{{BOOTSTRAP_IMPORTS}}pattern, v4.29.1).templates/.agent/schema.md: thelast_sessionline now marks(none yet)as legacy (pre-4.32.1 enables only).examples/rust-event-bus/: the fixture stays unedited by design — it truthfully predates Step 5c; itsENABLE_OUTPUT.mdheader now says so, so its(none yet)isn't read as current behavior.
No memory-file shape change (the schema touch is a value-domain note, not a field change);
skills/adapters unchanged. Existing targets: re-copy the schema + stamp; optionally point a
still-(none yet) last_session at the newest session log if one exists.
Version 4.32.0, 7/27/2026¶
Azure DevOps forge support — own-pipeline ritual floor + PR template (MINOR). The third forge, and unlike Bitbucket (investigated and deferred the same week) this one has a real field installation behind it. Azure DevOps verified as structurally different from both shipped forges: the committed artifacts map cleanly, but activation is not file-driven — a pipeline is a resource that must be bound to the YAML once, and Azure Repos ignores the YAML
pr:key entirely (PR validation lives in branch policies). The design leans into what the forge does well and is honest about what the tool cannot do for you.
Added¶
- Own-pipeline CI floor:
templates/.azuredevops/agent-memory-ci.yml— a complete, self-contained pipeline, so an existingazure-pipelines.ymlis never touched (no include splicing, no stage hazards; one repo can carry many pipelines). Same two checks as the other forges; the best advisory semantics of the set —##vso[task.logissue type=warning]annotations task.complete result=SucceededWithIssuesgive a native "partially succeeded" (orange) tri-state;AGENT_MEMORY_STRICT=1fails the run;fetchDepth: 0(new ADO pipelines default to shallow=1); PR-validation builds diff againstHEAD^1(the merge commit's target parent).- PR template:
templates/.azuredevops/pull_request_template.md— auto-applies to new PRs (default-branch-read;.azuredevops/is first in ADO's search order; 4000-char description cap noted in the footer). - Forge detection extended (
ENABLE.md):dev.azure.com/*.visualstudio.comremotes +azure-pipelines.yml/.azuredevops/signals; Step 6/8/9 + write-scope gained the third branch. Unknown forge now installs the GitHub + GitLab sets only — the ADO set requires positive detection, since its pipeline needs activation and a blind install is pure noise. - The honest limit, stated everywhere it matters: enable reports the one-time
az pipelines create … --skip-first-runcommand (Contributors-level) and runs it only at the user's explicit direction; PR-time validation is documented as the optional Build Validation branch policy (admin; "Optional" mode = notify-only); Microsoft-hosted agents need parallelism — the free grant (Microsoft's request form) or paid parallel jobs via a linked Azure subscription — or a self-hosted agent.
Changed¶
- Squash-merge guidance gains the third branch (
AGENTS.mdroot + template): Azure DevOps drops trailers like GitLab, but has no message-template mechanism at all — the durable record is the PR-description footer; re-add the trailer via "Customize merge commit message" at completion. - Forge-qualified claims updated across
.githooks/README.md,.githooks/init.sh,AGENTS.md×2,docs/DESIGN-ritual-triggers.md(a v4.32.0 status-header amendment),docs/optional-ritual-hook.md, and the six docs-site pages. - Lockstep:
VERSION→ 4.32.0;CHANGELOG;README(row + 10-cap + file tree);UPGRADE.md(row +4.31.0 → 4.32.0rung). No memory-file shape change; skills/adapters unchanged. Bitbucket remains a trigger-gated backlog thread.
Version 4.31.0, 7/27/2026¶
GitLab forge support — forge-aware ritual floor + MR template (MINOR). A GitLab-hosted installation reported that GitLab ignores
.github/entirely (verified: no compatibility shim — templates, CODEOWNERS, and the importer all skip it). A 5-agent gap analysis found exactly two installed artifacts die there — but one is load-bearing: the CI floor never runs, so a fresh clone where no agent activated the git hook has no ritual backstop at all (the precise gap v4.19.0 existed to close), and the What/Why PR template never seeds. Root cause: "vendor-neutral" had quietly conflated AI vendor with hosting forge. Everything else under.github/(copilot-instructions, skills adapters) is read by local tooling and was never broken — the fix deliberately leaves those untouched on every forge.
Added¶
- Forge detection (
ENABLE.mdStep 4): remote URL +.gitlab-ci.yml/.gitlab/signals;.gitlab-ci.ymlis now a recognized CI structure signal. Unknown forge → install both sets (each forge ignores the other's files — additive-safe). - GitLab CI floor:
templates/.gitlab/agent-memory-ci.yml— the same two checks as the GitHub workflow (memory-lint + advisory session-log presence), advisory viaallow_failure: exit_codes: [42](orange warning, never blocks;AGENT_MEMORY_STRICT=1exits 1 and gates),image: python:3(git needed in-container),GIT_DEPTH: 0for the diff-based check. Root wiring is additive-safe: no.gitlab-ci.yml→ installtemplates/.gitlab-ci.ymlverbatim (include + the canonicalworkflow:rulesduplicate-pipeline guard, which GitLab requires in the root file for MR pipelines); pre-existing.gitlab-ci.yml→ add-onlyinclude:entry, neverworkflow:rules(that would change when the repo's own jobs run; the job then rides branch-push pipelines — still a real floor). - GitLab MR template:
templates/.gitlab/merge_request_templates/Default.md(auto-applies to new MRs, all tiers) — same What/Why + Co-Authored-By footer, plus the GitLab squash note. - Step 6/8/9 + the write-scope notes gained forge-conditional branches; the enable report now names the detected forge and, for self-managed GitLab, the runner prerequisite.
Changed¶
- Squash-merge co-author guidance is forge-aware (
AGENTS.mdroot + template): the failure mode inverts across forges — GitHub compounds trailers (keep one, trim repeats; the v4.28.x rule), GitLab drops them (default squash message is the MR title only) — so on GitLab the guidance is to make the trailer survive: re-add it when editing the squash message at merge, or set%{all_commits}in the project squash template (it embeds full commit messages incl. body trailers; GitHub-like compounding, so the dedup rule applies).%{co_authored_by}does not carry body trailers — it credits commit authors only (verified against GitLab's message generator; the adversarial pre-ship review caught the earlier misprescription). "Pull request" wording is now "pull/merge request" where installed. - Every "CI is the zero-config backstop" claim is forge-qualified —
.githooks/README.md,REVIEW.md,AGENTS.md(root + template),docs/DESIGN-ritual-triggers.md(a status-header amendment: the vendor-neutrality argument now names the forge dimension explicitly),docs/optional-ritual-hook.md, and six docs-site pages (getting-started, index, reliability, enable-a-repo, built-in-skills, whitepaper). Honest limit stated where it bites: GitLab.com runners are zero-config; a self-managed GitLab needs an admin-registered runner. - Lockstep:
VERSION→ 4.31.0;CHANGELOG;READMErow;UPGRADE.mdrow +4.30.0 → 4.31.0rung. No memory-file shape change; skills/adapters unchanged. Non-goals kept lean: no CODEOWNERS, no issue templates, no further forges yet — but the forge seam is where they'd slot in.
Version 4.30.0, 7/15/2026¶
Stack-aware
.gitignorebuild-output seed (MINOR). A greenfield field case (mercury, a Rust port started from an empty repo, enabled at v4.29.1): the installed.gitignoreis deliberately scoped to AI infrastructure, so when the stack landed after enable, the firstcargo buildpollutedgit statusuntil the user hand-addedtarget/. The gap splits by when the stack is knowable: brownfield enables can seed at Step 7; greenfield enables can only carry the action forward to the moment the stack lands — and the agent working in the repo then is the runtime that applies it.Why: the enable advisory already promises "add-only edits to
.gitignore"; a repo whose first build dirtiesgit statusundercuts the faithful-enablement goal for the price of a six-row table. Deliberately bounded — an explicit non-goal note keeps it a minimal seed, never a gitignore manager.
Added¶
ENABLE.mdStep 7 → "Stack-aware build-output seed": when Step 4 detected a primary language/stack, append only the missing canonical build-output entries under a second, separately-scoped sentinel (# === agent-memory: build output (stack-aware seed …) ===) — add-only, de-duplicating against the whole file (a no-op for repos that already ignore them). Seed table: Rusttarget/; Node/JS/TSnode_modules/,dist/; Python.venv/,venv/; Java/Kotlintarget/,build/,*.class; .NETbin/,obj/; Go none (builds out of tree).ENABLE.mdStep 5b: greenfield enables seed a- [ ] Greenfield — no code yetOpen Thread listing what to record when the first code lands — stack, conventions, invariants, and the stack's build-output ignores (the Step 7 table, applied at that moment).ENABLE.mdStep 8 (verify) checks the detected stack's build output is ignored (pre-existing or seeded); Step 9 report gains a greenfield next-steps line.
Notes¶
- Operator-side only (
ENABLE.md): no template, memory-file, skill, or adapter change —templates/.gitignorestays AI-infrastructure-scoped by design. - Already-enabled repos: nothing required; a future Mode B upgrade may apply the Step 7 seed
additively (see the
4.29.1 → 4.30.0rung).
Version 4.29.1, 7/12/2026¶
Template import blocks become a
{{BOOTSTRAP_IMPORTS}}placeholder (PATCH). Cross-vendor dogfooding of v4.29.0 (a GitHub Copilot assessment, independently corroborated live on Claude Code) found a tool-repo instruction bleed-through the release amplified: runtimes that auto-load directory-scoped instruction files picked uptemplates/CLAUDE.md, and because@-imports resolve relative to the containing file, its live import block pulled the placeholder template stubs (templates/AGENTS.md,templates/memory/*—{{PROJECT_NAME}}junk, "last_session: (none yet)", conflicting "Identify yourself as…" lines) into context as if they were real instructions. Tool-repo-only: installed targets have notemplates/directory.
Fixed¶
templates/CLAUDE.md+templates/GEMINI.mdno longer carry live import lines. The block is now a{{BOOTSTRAP_IMPORTS}}placeholder (the established{{UPPER_SNAKE_CASE}}mechanism);ENABLE.mdStep 6 defines each vendor's literal block (Claude@pathidiom / Gemini@./path.md) and expands it at install. Installed output is byte-identical to v4.29.0's — enabled repos need nothing beyond a version stamp (see the4.29.0 → 4.29.1rung).- The
4.28.4 → 4.29.0rung no longer points at the templates for the block — it references the literal blocks inENABLE.mdStep 6, so a ladder run can't copy the placeholder verbatim.
Changed¶
- Honest residual, documented: a runtime that auto-loads a nested
AGENTS.mddirectly may still surfacetemplates/AGENTS.mditself — behavior that predates v4.29.0 and belongs to the runtime; this patch removes the amplification (the memory-stub pull-in via imports), which is the part the tool controls. RootCLAUDE.md/GEMINI.mdkeep their live imports — that's the feature, dogfooded. - Lockstep:
VERSION→ 4.29.1;CHANGELOG;READMErow;UPGRADE.mdrow + rung (+ the 4.29.0 rung amendment);templates/CLAUDE.md/GEMINI.md;ENABLE.mdStep 6. No memory-file shape change; skills/adapters unchanged.
Version 4.29.0, 7/12/2026¶
Before-session context presence — bootstrap
@-imports + an opt-in SessionStart recipe (MINOR). A child-repo field report (2026-07-11) showed agents skipping the before-session read chain (CLAUDE.md → AGENTS.md → memory/*) under task pressure — skill-unawareness, off-model engagement, rework, apparent "memory loss." The root cause is structural, not a one-off lapse: the v4.19.0 trigger layer reinforces only the after-session rituals, because its vendor-neutral substrate (git + CI) has no session-start moment — so the before-session read rested on prompt adherence, the same non-determinism v4.20.1 recorded for Copilot self-init. This closes the presence half of that asymmetry; attendance remains agent judgment.
Added¶
- Native
@-imports in the bootstrap pointers.templates/CLAUDE.mdandtemplates/GEMINI.md(and this repo's own root pointers — dogfooded) now import@AGENTS.md,@memory/instructions.md,@memory/continuity.md,@memory/vision.md, so the hub + core memory files are structurally present at session start on import-capable runtimes (Claude Code:@path, relative to the containing file, max 4 hops, code blocks skipped; Gemini CLI: the@./path.mdform,.mdfiles only, max depth 5). Markdown-only, no hooks — the same fix-shape as v4.20.1's copilot-instructions front-load. Imports live only in the per-vendor bootstrap files;AGENTS.mdstays vendor-neutral. - Opt-in
SessionStartinjection recipe indocs/optional-ritual-hook.md(tool-only, never installed) — "Option A0," for teams that also wantmemory/sessions/recency injected (imports can't express dynamic paths). Deliberately not installed byENABLE.md: the installed.gitignoreignores all of.claude/(personal runtime config; a committedsettings.jsonaccretes personal allow-lists — observed in the field), and the hook is Claude-Code-only — Layer-2 in the trigger-design taxonomy, a per-vendor nicety, not the vendor-neutral floor.
Changed¶
- Honest limits, stated where they bite: the bootstrap note tells the agent imports can't
express dynamic paths — the newest 2–3
memory/sessions/logs stay an explicit read; Cursor/Windsurf/Copilot have no import mechanism and keep the prose pointer (Copilot's mitigation remains the v4.20.1 front-load pattern). The imported files enter context every session, so the continuity-bloat controls (v4.24.0/4.28.2/4.28.3) are now load-bearing, not cosmetic. Attestation canaries (a child repo's local hardening) remain a downstream per-repo pattern, not part of the tool. - Lockstep:
VERSION→ 4.29.0;CHANGELOG;READMErow;UPGRADE.mdrow +4.28.4 → 4.29.0rung; root + templateCLAUDE.md/GEMINI.md;docs/optional-ritual-hook.md(retitled "Reinforcing the session rituals with hooks" — it now covers a before-session layer). No memory-file shape change; skills/adapters unchanged.
Version 4.28.4, 7/6/2026¶
Co-Authored-Bytrailer duplication — reframed as a dedup-by-email invariant (PATCH). Third field report frommercury-composable: the v4.28.0 commit-attribution guidance assumed the agent fully authors the message, but the agent co-authors it with its harness, which often injects its own (model-version)Co-Authored-By. A conscientious agent then appended a second (stable-name) trailer → duplicate co-authors for one collaborator; squash-merges compounded it (one observed commit had 55 trailer lines). Doc-only refinement of the convention; no code, no shape change.
Changed¶
- The rule is now a deterministic invariant, keyed on email.
AGENTS.md(root +templates/) reframes the mental model — you co-author the commit message with your harness; treat the harness's message as the base and reconcile, don't blindly append — and states the invariant: at most oneCo-Authored-Byper collaborator, matched on email (Claude Code,Claude Opus 4.8,Gemini CLI,Gemini 2.5… are one collaborator at onenoreply@…address; the name varies, the email doesn't). A three-branch resolution tree replaces the ambiguous "accept it": harness trailer you can't suppress → that's your one; you control the message → emit exactly one stable-name trailer and drop the harness duplicate at the same email; never both. - Squash-merge guidance is forge-aware. The canonical trailer lives once (PR-description footer; omitted from per-commit bodies); trim inline repeats so one line per collaborator survives.
- PR template + docs. The
.github/pull_request_template.mdfooter comment (root +templates/) anddocs/getting-started.mdnow carry the one-per-collaborator-by-email rule. - Enforcement deferred (deliberate). A dedup hook and a
memory-lintadvisory were proposed; both deferred — an auto-dedupcommit-msghook would rewrite commit messages, a departure from the tool's "never mutate your commits" stance. Revisit (an observational lint advisory first) if the doc fix doesn't hold in the field. - Lockstep:
VERSION→ 4.28.4;READMErow;UPGRADE.mdrow +4.28.3 → 4.28.4rung; docs site. Re-syncAGENTS.md+.github/pull_request_template.mdon enabled repos. No memory-file shape change; skills/adapters unchanged.
Version 4.28.3, 7/6/2026¶
[continuity-bloat]line-count message is now decay-aware (PATCH). Second field report frommercury-composable(a 29-module Maven reactor): after a by-the-book review the fact count is healthy but thecontinuity_max_linesbackstop trips on genuinely-active, information-dense Key Decisions — and the review has nothing to archive, so the warning can't be honestly cleared. Same failure class as v4.28.2 (an unclearable warning erodes the signal), but on the line axis; the generic "a review is due to lean it down" also nudges toward premature archival of active facts — REVIEW.md's costliest error.
Fixed¶
- The line-count
[continuity-bloat]message branches on whether anything is actually archivable.memory-lintnow computesarchivable= facts overdue for decay (sslu > archive_window, excluding core/superseded/pinned) + superseded facts. When lines exceedcontinuity_max_linesandarchivable == 0, the message tells the truth — "nothing is archivable yet; the excess is active/dense facts. Condense shipped decisions, or raise continuity_max_lines in decay-policy.md if this repo is legitimately large." — instead of prescribing a review that can't help. When something is archivable, the original actionable message stands. Validated on mercury's live memory (37 facts / 708 lines / 0 archivable → the honest message; both runtimes byte-identical). decay-policy.mdnote. Thecontinuity_max_linescomment now states it is meant to be raised for a legitimately large/complex repo (covers the field report's per-repo-acknowledgement ask cheaply; the value was already per-repo tunable).- Scope / deferred. Only the line-count message changed; the fact-count check (v4.28.2) is untouched. A dedicated non-archival "condense shipped decisions" lever was proposed but deferred until the need recurs in the field — the honest message points at that lever without building it yet.
- Lockstep:
VERSION→ 4.28.3;check_continuity_healthgains an optionalarchivablearg (default unknown → generic message; backward compatible) in both runtimes at parity;main()computes and passes it; two new mirror tests (archivable > 0→ actionable,archivable == 0→ active-verbosity).READMErow;UPGRADE.mdrow +4.28.2 → 4.28.3rung. Skill description unchanged → adapters need no re-sync.
Version 4.28.2, 7/4/2026¶
Fix
[continuity-bloat]false positive on mature repos (PATCH). Field report frommercury-composable: the bloat check fired permanently after a correct review because it countedtier: corefacts and pinned open threads against the cap, even though those entries can never be archived. The fix aligns the count withdecay-policy.md's documented intent ("count of decaying facts/threads") by excluding non-archivable entries.
Fixed¶
memory-lintbloat check now counts only decay-eligible facts.tier: coreentries (structural invariants) and pinned open- [ ]threads are excluded fromnfactsbefore comparing againstcontinuity_max_facts. A repo with 14 core facts + 11 open threads + 16 working facts now correctly reads16 < 30(clean) rather than41 > 30(chronic WARN) after a fully correct review. The warning message updated to say "decay-eligible facts" so the scope is unambiguous.- Lockstep:
VERSION→ 4.28.2;check_continuity_healthgains optionalpinnedparam (defaultset()— backward compatible); call site passes the already-computedpinnedset; new testtest_fact_bloat_excludes_core_and_pinnedcovers the mercury scenario directly.
Version 4.28.1, 7/2/2026¶
Post-commit hook: uncommitted-session-log guard (PATCH). The auto-stub window check misfired on the recommended two-commit pattern (feature commit →
chore(memory)commit) when the session log was written more than 30 min before the feature commit — the clock is the wrong proxy when the artifact state is directly observable.
Fixed¶
- Suppress the auto-stub when a session log already exists uncommitted. The
.githooks/post-commitauto-stub gained a primary guard: before the filename-timestamp window check, it inspectsgit status --porcelain -- memory/sessions/for any uncommitted.md. If one is staged, modified, or untracked, the agent already has a log for this session — the hook emits the enrich-and-commit nudge and skips stubbing. Previously the filename-timestamp threshold treated an in-flight (uncommitted) log written >30 min before the feature commit as "too old" and stubbed a near-duplicate. The window check stays as fallback for already-committed, hours-old logs (e.g. a follow-on commit). Bash 3.2-compatible; hook stays non-blocking. - Lockstep:
VERSION→ 4.28.1;UPGRADE.mdrow +4.28.0 → 4.28.1rung. Re-copy.githooks/post-commit. No memory-file shape change; no skill/adapter change.
Version 4.28.0, 6/29/2026¶
Co-author convention cleanup — stable agent identity + one trailer (MINOR). From a real-world finding dogfooding the v4.27.0 convention on
mercury-composable: a squash-merged PR (#126) surfaced two imperfections in how theCo-Authored-Byself-identification renders. The attribution itself worked (human + AI both credited, Verified) — these are consistency fixes.
Changed¶
- Stable agent identity, not a model version. The convention said "identify yourself the same
way you do in session logs," but session logs use a stable agent name (
Claude Code) while the commit/PR trailer was a model-version string (Claude Opus 4.8) — so it (a) wasn't actually "the same," and (b) churns every model release, fragmenting the co-author across many identities over time.AGENTS.md(root +templates/) and the PR-template footer comment now specify the stable agent name — the actual AI collaborator (Claude Code,Gemini CLI, …), kept vendor-neutral via a<your agent name>placeholder — explicitly not a model version. Where a runtime auto-injects a model-version commit trailer it can't override, that's accepted (the agent controls the PR footer + session logs, which carry the stable name). - One trailer on squash-merge. Every commit carries the trailer (often harness-injected), so a
squash-merged PR stacked ~9 identical inline
Co-Authored-Bylines plus the consolidated one GitHub appends after the---------separator. The convention now notes: on a squash-merge, collapse to a singleCo-Authored-By:— GitHub's appended consolidated line is canonical; trim the redundant inline repeats. Advisory (the agent can't suppress the harness trailer or GitHub's squash template; this is merge-time guidance). - Lockstep:
VERSION→ 4.28.0;UPGRADE.mdrow +4.27.0 → 4.28.0rung;READMErow (and the recent-releases table trimmed back to its 10-most-recent cap); docs site (Getting Started). No memory-file shape change; no skill/adapter change.
Version 4.27.0, 6/29/2026¶
Standardized PR description — lead with What / Why (MINOR). From a maintainer suggestion: standardize the look-and-feel of pull-request descriptions created under the agent-memory protocol with two short summary sections — What and Why — so the standard propagates to every AI-enabled repo. A natural fit: why is already a first-class artifact throughout the protocol (the VBDI intent trace, ADR rationale, supersession reasons, even this changelog's own
> summary + Whyshape), and the content projects straight from the session log(s) in the PR — What from the change, Why from the Blueprint gap / decision it serves. There was no PR guidance before this (only a commitCo-Authored-Bytrailer convention), so it fills a real gap.
Added¶
.github/pull_request_template.md(this repo +templates/, so every enabled repo inherits it) — two sections, What (the change) and Why (the intent it serves; substantive intent, not a restatement of What), each 1–2 short paragraphs (flexible — a trivial PR isn't padded; a What may use a bullet or two). GitHub auto-populates the PR body from it; the agent draws the content from the session log(s) in the PR. The template also closes with a self-identifyingCo-Authored-By:footer — the same authorship-traceability convention as commits and session logs, now extended to the PR altitude. Advisory, never a gate (guide-don't-prescribe). Installed byENABLE.mdStep 6 (tracked — it travels).
Changed¶
AGENTS.md(root +templates/) — the after-session commit step gains an "Opening a pull request? → lead with What / Why" convention next to the co-author-trailer note, plus a checklist line. This is the vendor-neutral backstop: the.github/template only covers the GitHub web UI /gh pr create, so the steering line carries the convention for agents that compose a PR body themselves. Re-sync a target'sAGENTS.mdfromtemplates/AGENTS.md.ENABLE.mdStep 6 installs the new template;UPGRADE.mdgains the4.26.1 → 4.27.0rung + version-table row;READMEversion-table row + file-tree entry; docs site updated.VERSION→ 4.27.0. No memory-file shape change.
Version 4.26.1, 6/28/2026¶
[stale-metadata]/refresh-metadatano longer opine on a pinned thread's tier (PATCH). A sanity check of mercury (post-Copilot review) surfaced that v4.26.0 flagged everyworking-tagged pinned- [ ]open thread as "should beactive" — noise, since a pinned thread never decays regardless of its tier label. The protection is its pinned-ness (being unchecked), not the label. Refinement: the tooling now has no opinion on a pinned thread's tier —memory-lintwon't flag it andrefresh-metadatawon't rewrite it (it still refreshes the factualuses/last_used). Surfaced comparingrefresh-metadataagainst Copilot's ownupdate-metadata.py(which skipped pinned threads); this lands on the same outcome, by a cleaner rule.
Changed¶
memory-lintexpected_tier(check 9) +refresh-metadataexpected_tier: a pinned thread returns its stored tier (no drift, no rewrite) instead of being forced toactive. Both runtimes at parity; tests added (memory-lint 34, refresh-metadata unchanged count — assertion updated).DECAY.mdrule 4 + both SKILL.md notes clarify: pinned-ness protects an open thread, not its tier label;workingon a pinned thread is fine. Doc-only otherwise; no shape change.
Version 4.26.0, 6/28/2026¶
refresh-metadata+ amemory-lint[stale-metadata]advisory — close the skipped-re-tier gap (MINOR). From a cross-vendor field test: Copilot / Gemini 3.1 Pro committed the v4.25.0 upgrade to mercury and, seeing the[review-overdue]advisory, ran the review unprompted — correctly usingarchive-fact(the over-archival guard even caught a premature-archive attempt and it reverted). But it did Step 4 (archive) + Step 5 (sweep) and skipped Step 2 (apply events) + Step 3 (re-tier) — leaving stalelast_used/uses/tierfooters on the facts that stayed. A capable agent silently did half the ritual. This is the third instance of one failure class (after the truncation trap →archive-fact, and the never-fired review →[review-overdue]): multi-step agent rituals get partially executed. The fix refines the earlier "reject auto-fix" stance — the real boundary is judgment vs. arithmetic: deciding what to archive is judgment (stays with the agent); recomputing metadata is arithmetic (the "full rebuild" path REVIEW.md already calls deterministic + reproducible) and is safe to mechanize.
Added¶
agent-skills/refresh-metadata/— the 7th built-in (provenance: agent-memory-builtin). Executes REVIEW.md steps 2–3 deterministically: recomputes every fact'slast_used/uses/tierfrom the## Memory Referencesacrossmemory/sessions/and writes the footers back (reads into memory, writes once). Pure arithmetic —core/supersededand never-referenced facts are untouched, and it clamps atarchive-candidate(it never archives; that'sarchive-fact+ the agent's judgment). Python or Node at parity, with mirror tests;--dry-run; idempotent.memory-lintcheck (9)[stale-metadata]— flags a fact whose storedtier≠ the tier recomputed from the reference log (i.e. steps 2–3 were skipped), excludingcore/superseded/never-referenced. Both runtimes + mirror tests. This is what makes the skipped-re-tier gap visible on every lint run + CI.
Changed¶
REVIEW.mdsteps 2–3 now lead withrefresh-metadata(the deterministic path; hand-editing 30 footers is discouraged).ENABLE.md§5i installs seven built-ins.README/ADR/continuitybuilt-in lists updated.sync skill adaptersnow writes 8 skills → 48 adapters.
Version 4.25.0, 6/28/2026¶
archive-fact— a deterministic, safe archive-move helper (MINOR). From a cross-vendor critique (Copilot / Gemini 3.1 Pro): "agent behaviors vary by vendor; the reliance on agent interpretation ofREVIEW.mdto safely mutate state is vulnerable to LLM regressions / file-editing precision — harden the memory-writing mechanism itself, perhaps a small CLI helper for safe writes." Spot-on, and it names our most-repeated bug: theopen(f,"w").write(open(f).read()+…)truncate-before-read trap wiped aversion.mdstamp and then this repo's archive (50 facts → 6), once each. The v4.22.4 safeguard moved the rule from a personal note → shared doc; this is the logical next step — doc → tool.
Added¶
agent-skills/archive-fact/— the 6th built-in (provenance: agent-memory-builtin). ExecutesREVIEW.mdstep 4's archive-move deterministically: given fact id(s) the agent has decided to retire, it extracts each block (the column-0 bullet through its<!-- id: … -->footer, whole), appends it to the quarter archive +INDEX.md(append-mode), and rewritescontinuity.mdwithout it (read whole file into memory, write once — truncation is structurally impossible). Python or Node at output parity, with mirror tests (test_archive_fact.py/.mjs). Guards (refuse, exit 1): id with no footer, id already archived, or a move that would empty continuity; the move is all-or-nothing.--dry-runto preview. Keeps the meaning/mechanics split intact (same asmemory-lint): the agent judges what to archive; the helper performs the move safely — it never decides (never-pick-a-winner).
Changed¶
REVIEW.mdstep 4 now leads witharchive-factas the preferred path (manual append-mode / read-into-var stays the no-runtime fallback).ENABLE.md§5i installs six built-ins.README.md/ADR.md/continuity.mdbuilt-in lists updated.sync skill adaptersnow writes 7 skills → 42 adapters.
Critique disposition (also from the same review)¶
- Auto-fix, not just lint — declined for semantic decay (auto-deciding what to archive violates
never-pick-a-winner); theREVIEW.mdritual is the agent-driven fix, the v4.24.0 advisory triggers it, andarchive-factnow makes the move deterministic. Upgrade automation — logged as a backlog thread (the mechanical steps could be scripted, but the rungs are semantic merges that must stay agent-judged; the chosen mitigation is deterministic guardrails likememory-lint).
Version 4.24.0, 6/28/2026¶
Decay-policy retune + a review-cadence/size advisory in
memory-lint(MINOR). Grounded in real measurements across two enabled repos: this tool (121 sessions, continuity 490 lines / 24 facts right after a clean review) and a product repo (61 sessions, 585 lines / 41 facts, 0 archived — the cadence review never fired in the field). Findings: (1)continuity_max_lines: 300was permanently-red on both (alert fatigue) and conflates non-decaying structural sections (Vision, Invariants, Key Decisions, Blueprint) with the decaying region; (2) there was no count-based trigger, though fact-count is the verbosity- and velocity-independent signal; (3) nothing enforced the review cadence, so a real repo silently accumulated; (4)verify_invariants_every: 20meant near-daily human re-confirms at burst velocity (10–20 sessions/day).
Changed¶
memory-lint— new advisory check (8), both runtimes at parity + mirror tests (29 each).[review-overdue]fires whensessions_since_last_review ≥ review_every(read from thelast_reviewProject-State stamp; never reviewed ⇒ all sessions count).[continuity-bloat]fires when continuity holds more thancontinuity_max_factsdecaying facts/threads, or more thancontinuity_max_lineslines. All advisory (WARN) — a review is a ritual, never a hard gate — but they ride every lint run + the CI floor, so a lapsed review can't hide. This is the keystone: parameters alone don't fix a review that never runs.- Decay-policy defaults retuned (
templates/memory/decay-policy.md+ this repo's):continuity_max_facts: 30(NEW — primary lean signal),continuity_max_lines: 300 → 600(a mature layer sits ~450–600 when healthy),verify_invariants_every: 20 → 40(anti-fatigue).working/active/archive_windowandreview_everyunchanged — they work; the bloat came from reviews not running, not from the windows. - Docs:
REVIEW.mdsize trigger (facts primary + the new lint advisories),agent-skills/memory-lint/SKILL.md(check 8),AGENTS.md(root + template) review-cadence note,templates/.agent/schema.mdwindows list. Skill description unchanged → adapters need no re-sync.
Version 4.23.2, 6/28/2026¶
Context-hygiene guidance: keep state externalized so compaction is safe (PATCH). From a maintainer exchange about multi-hour AI sessions. Two corrections to an initial "brain fog" framing: (1) the agent usually can't compact itself (compaction is user-invoked or a harness auto-compact), so the agent's reliable lever is externalizing state, not self-compacting; (2) "retrieval degrades over hours" is a judgment call — the objective health signal is context-window utilization (tokens used vs. the model's limit), which the harness tracks and may auto-act on, while time and a felt "fog" are only proxies.
AGENTS.mdnow teaches: write the session log +continuity.mdat each natural seam (milestone, phase shift, before a topic pivot) before compaction; at a seam with high utilization, suggest compacting (or rely on auto-compact), never mid-task; re-verify specifics against live files after any compaction. Reinforces why the memory layer lives in files, not the chat buffer.
Changed¶
templates/AGENTS.md+ rootAGENTS.md— new "Long session? Keep state externalized so compaction is safe" block, placed as a corollary to lightweight mode (the session-log write is the seam). Vendor-neutral (/compact/ auto-compact / fresh session). Doc-only, additive, no memory-file shape change; re-synctemplates/AGENTS.mdinto targets on the4.23.1 → 4.23.2rung.
Version 4.23.1, 6/28/2026¶
last_harvestmarker for incremental harvests (PATCH). From a cross-vendor test drive: mercury's agent ranharvest-knowledgecorrectly but had to infer the harvest window ("since enable") because nothing recorded when the last harvest ran. Add alast_harvestmarker so each run scopes "docs changed since then" deterministically. Decided to keep it incontinuity.mdProject State (withlast_review/last_invariant_check— same family: "when did this periodic memory ritual last run"), not.agent/version.md(the install manifest, a different concern).
Changed¶
templates/.agent/schema.md— Project State gains an optionallast_harvest:YYYY-MM-DD | through <session-file>field (omitted until the first harvest).agent-skills/harvest-knowledge/SKILL.md— now readslast_harvestto scope the next run to docs changed since then (full first pass if absent), and stamps it on completion (even on a no-op run — "docs checked through here"). The harvest ownslast_harvestas the review ownslast_review. The check-existing-first guard still prevents duplicates, so a re-scan is always safe —last_harvestonly scopes the read.VERSION→ 4.23.1; re-synced on the4.23.0 → 4.23.1rung (skill description unchanged → adapters unchanged).
Version 4.23.0, 6/28/2026¶
harvest-knowledge— on-demand knowledge harvest as a built-in skill (MINOR). The curious harvest (v4.22.0,ENABLE.mdStep 4b) seeds memory from the team's docs once, at enable. But a living repo's docs keep evolving, and there was no recurring way to fold new ADRs / design specs / decision-log entries into memory short of re-enabling. This adds a 5th built-in skill that does exactly that, on demand — and moves "re-harvest" out of the Mode B upgrade path (it was a one-time backfill bolted onto a rung) into a proper, repeatable skill. The enable-time harvest stays a fresh-enable event.
Added¶
agent-skills/harvest-knowledge/— a no-code, agent-run built-in (provenance: agent-memory-builtin). Re-scans the repo's human-authored documentation (recursivedocs/trees + root sweep for ADRs, decision logs, design specs, roadmaps, kanban — same net as Step 4b) and distills durable facts into the neutral, sharedmemory/layer additively: map-don't-mirror, check-existing-first so a re-run doesn't duplicate, conflicts → aContradictionthread (never-pick-a-winner), genuine replacements → supersession, budget-with-disclosure → a(knowledge-harvest)Open Thread. Installed into every repo byENABLE.md§5i (now five built-ins); added to theupgrades-additivemanaged-built-ins list. Explicitly not a vendor/init:/initdoes a deep code analysis and (re)writes/overwrites a vendor steering file;harvest-knowledgereads human-authored knowledge, writes neutral shared memory, and is additive + repeatable — borrow/init's analysis muscle, but the output goes tomemory/, never a vendor file.
Changed¶
UPGRADE.md— the4.21.0 → 4.22.0rung no longer offers an inline Mode B re-harvest; backfilling an already-enabled repo from docs is now theharvest-knowledgeskill's job (run on demand). The enable-time harvest remains a fresh-enable event.VERSION→ 4.23.0; the4.22.4 → 4.23.0rung installs the new built-in.
Version 4.22.4, 6/28/2026¶
Safe-write safeguard in
REVIEW.md(PATCH). A truncate-before-read antipattern (open(f,"w").write(open(f).read() + …)) wiped this repo's archive during a review (50 facts → 6; caught bymemory-lint, recovered from git). The lesson belonged in the shared, committed protocol (every contributor + every vendor's agent inherits it), not a per-machine personal note — so it's now a rule in the review ritual's Safety section.
Changed¶
REVIEW.md→ Safety gains two rules: (1) never truncate a memory file when scripting the move — append with>>/ append-mode for the archive +INDEX.md, read-into-a-variable-then-write forcontinuity.md; neveropen(f,"w").write(open(f).read() + …)(opening"w"truncates before the read). (2) After any scripted memory mutation, runmemory-lint— it catches a truncation (count drops, links dangle), and git-tracked memory files recover viagit checkout HEAD -- <file>. Installed verbatim into every enabled repo; re-synced on the4.22.3 → 4.22.4rung.VERSION→ 4.22.4.
Version 4.22.3, 6/27/2026¶
Tighten the post-commit session window: 2h → 30 min (PATCH). v4.22.1 shipped a 2-hour active-session window, but the observed problem was follow-up stubs minutes apart, and 2h is long enough to wrongly conflate a genuinely new session that starts within 2h of the previous one's log (the hook would nudge "enrich the old log" for a new session). 30 minutes spans a working session's commit cadence — including a short test/think gap — while a real new session (a longer pause) still gets its own stub.
Changed¶
.githooks/post-commit— the active-session window default is now 30 minutes (was 2h), and the override env var isAGENT_MEMORY_SESSION_WINDOW_MINUTES(integer minutes), replacingAGENT_MEMORY_SESSION_WINDOW_HOURS. The unit changed to minutes because BSDdate -vrejects a fractional hour (-v-0.5H), so sub-hour windows need integer minutes; both runtimes stay supported (date -v-30M/date -d "30 minutes ago"). Re-validated (2 min & 25 min → suppress; 45 min & none → stub; custom override honored)..githooks/README.md+docs/DESIGN-ritual-triggers.mdupdated;VERSION→ 4.22.3; re-copied into targets on the4.22.2 → 4.22.3rung.
Version 4.22.2, 6/27/2026¶
Lightweight mode: one log per working session, not per commit (PATCH). The agent-side mirror of v4.22.1. The lightweight-mode rule wrote a lite session log for every memory-neutral tracked-file change — so an agent making several small commits in one sitting produced a near-duplicate lite log per commit (the same clutter + decay session-count inflation the v4.22.1 hook fix addressed, but on the agent-behavior side). The agent has context the hook lacks — it knows it's the same working session — so it needs no time-window: it simply enriches the log it already wrote.
Changed¶
AGENTS.md(root +templates/) — the lightweight-mode "lite log" tier gains: if you already wrote a session log earlier in this working session, a later memory-neutral commit should enrich that existing log (a one-line "also: …" note) rather than spawn another lite log — a burst of commits in one sitting is one session. Explicitly preserves the existing model for memory-relevant work (distinct events still each get their own log, so a multi-task conversation may still yield several); the rule only stops trivial follow-on commits from minting near-duplicate lite logs that would also inflate the decay session-count. Wording-only — no file shape, skill, or script change.VERSION→ 4.22.2; re-synced into targets on the4.22.1 → 4.22.2rung (re-copytemplates/AGENTS.md).
Version 4.22.1, 6/27/2026¶
post-commit auto-stub is now per session, not per commit (PATCH). A downstream report (
mercury-composable) found the hook's auto-stub fired on every work commit: its only de-dup guard checked for an untracked stub, so once the agent enriched and committed the session log, the next work commit found no waiting stub and wrote a fresh one. One long session produced ~6 near-identical lite logs (each with an extramemory: session log …commit), and — since the decay model counts session files — inflatedsessions_since_last_used, so facts decayed ~N× too fast (ironic, givenmemory-lintexists to catch decay miscounts).
Fixed¶
.githooks/post-commit— the auto-stub now suppresses a new stub when a session log already exists within an active-session window (default 2h; overrideAGENT_MEMORY_SESSION_WINDOW_HOURS), nudging the agent to enrich that log instead. Detection is by the newest session filename timestamp (immutable + clone-safe —mtimeis reset bygit clone/checkout, which would wrongly suppress stubs for hours after a clone), compared lexicographically against a window-ago stamp in the sameYYYY-MM-DD-HHMMSSform. This subsumes the old untracked-stub guard (a fresh stub has a recent filename) and covers the just-committed case too. A genuinely new session (no log within the window) still gets a stub — the "no silent gap" guarantee holds. Net: one enriched log per working session, and the session-file count tracks sessions, not commits. Bash 3.2-compatible (BSDdate -vwith a GNUdate -dfallback).VERSION→ 4.22.1; re-copied into targets on the4.22.0 → 4.22.1rung.
Version 4.22.0, 6/27/2026¶
Discovery, consent & merge-friendliness +
MERGE.md(MINOR). One release bundling four additive improvements developed iteratively in a single session (dev-numbered 4.22–4.25) and consolidated into one version per a new "one version per release" policy —VERSIONand the upgrade ladder track releases, not per-feature dev iterations (granular history lives in the session logs + Open Threads). The work came from three real signals — a client enablement complaint, a teammate-concurrency review, and a GitHub Copilot review — and was hardened by a full fresh-context review loop validated end-to-end by a different vendor: Gemini 3.1 Pro critiqued the milestone and re-validated the applied fixes, proving thesecond-opinion→apply-critiquepair cross-vendor on this very release.
Added¶
- Curious knowledge harvest at enable (
ENABLE.mdStep 4b) — discovery now recursively descends every documentation tree (docs/,doc/,wiki/,rfcs/,adr/, … all subfolders) and sweeps repo + module roots for human-authored knowledge markdown (decision logs, ADRs, kanban/roadmap, architecture & design notes, CONTRIBUTING, RFCs), distilling the durable facts into memory (map-don't-mirror). Bounded by a read budget with disclosure — overflow is recorded as a(knowledge-harvest)Open Thread so nothing vanishes silently. From a client complaint: a canonicaldocs/tree was skipped entirely and a recursive re-ask still stopped at depth-1. - Fresh-enable advisory + discovery depth (
ENABLE.mdMode A) — a fresh enable now opens with a concise exec summary of the protocol (what it is, what it writes, what it leaves untouched, that it's committed + shared) and acancelgate, for informed consent rather than a blind yes. It then offers a discovery depth: standard scan (default) or an/init-depth deep analysis — which borrows the capability of a vendor's built-in/initbut writes findings into the neutral memory layer, never a vendor steering file. A first enable session log records the chosen depth. MERGE.md— a new installed, no-code, on-demand protocol for resolving a git merge/rebase conflict inmemory/. Tiered + human-gated, enforcing thenever-pick-a-winnerinvariant: classify the hunk → Tier-1 mechanical (additive → union/keep-both; scalar → take-later, deterministic) → Tier-2 semantic clash (the AI never decides — preserve both + raise a Contradiction; a supersession only on the human's explicit instruction) →memory-lintgate → human approves the merge commit (never auto-commit). JoinsDECAY/REVIEW/SKILLSas a root protocol doc, read on demand.memory-lintcheck 7 — a leftover VCS merge-conflict marker (<<<<<<</>>>>>>>/ diff3|||||||) in the live top-levelmemory/*.mdfiles is now an ERROR (a bare=======line is exempt — it's a valid Markdown setext heading underline).sessions/andarchive/are excluded (immutable/append narrative that legitimately quotes markers — e.g. a session log pasting a diff). Both runtimes at parity, with mirror tests.
Changed¶
continuity.mdmerge-friendliness —statusis now spec'd as a short current-state line, not a changelog (.agent/schema.md+AGENTS.md): a single ~20 KB accretedstatusline was a merge-conflict hotspot for concurrent teammates and duplicated the upgrade ladder. A new schema section "Concurrency & merge-friendliness" documents the conventions (one fact per line; append-only sections → keep-both/union on conflict; scalar bumps → take-later; same-thread clash → human). This repo's ownstatusline slimmed 19,828 → ~1,100 chars.- "One version per release" policy added to
UPGRADE.md's versioning model — bump for a release event, not per feature; keep a single pending version while unreleased; magnitude = the largest change in the batch; consolidate working-tree bumps beyondHEADbefore committing. (This release is the first to apply it: four dev-iterations → one v4.22.0.) upgrades-additiveinvariant + ADR-0005 — addedsync-adaptersto the managed-built-ins example list (it became a tool-managed built-in in v4.18.0). Surfaced and applied during a maintainer invariant re-verification (all five core invariants + the Vision re-confirmed, none superseded).REVIEW.mdstep 9 now codifies that archived ids go in the## Memory Reviewblock, never under## Memory References(which re-arms the over-archival guard → false reactivation)..githooks/README.mddocuments that a feat/memory commit split trips the advisory hook on the code commit (expected/benign; prefer an atomic commit).VERSION→ 4.22.0.
Notes¶
- Mostly operator-side (
ENABLE.md) plus thememory-lintskill and one new root doc (MERGE.md) — no memory-file shape change. The single4.21.0 → 4.22.0upgrade rung bundles all four features. - A full memory review ran alongside this release (continuity 753 → 577 lines; 14 faded facts archived).
Version 4.21.0, 6/26/2026¶
Google Antigravity (
agy) skills adapter (MINOR). Adds a 6th skills adapter target,.agents/skills/<name>/SKILL.md. Antigravity — the successor to Gemini CLI — merged custom commands into the open Agent Skills standard and reads workspace skills from.agents/skills/, not the old.gemini/commands/*.toml. So on an enabled repo,init.shfaithfully populated the Gemini adapter, yetagyreported/<command>(e.g./memory-lint) as not found — it never looks in.gemini/commands. The new adapter uses the sameSKILL.mdshape as the Claude/Kiro/Copilot adapters, so it is a one-line addition per runtime, no new format. The.gemini/commandsTOML adapter stays for now so Gemini CLI keeps working through the transition. Found dogfoodingagyon an enabled repo.
Added¶
- 6th vendor adapter
.agents/skills/<name>/SKILL.mdin all three sync-adapters runtimes (sync-adapters.py/.mjs/.sh, kept byte-for-byte equivalent — verified identical output): each now writes six adapters per skill and prunes orphaned.agents/skills/dirs by the shared pointer signature..agents/added to the root and template.gitignore(regenerated, local-only). - Google Antigravity (
agy) added to the Mode C detection/migration table and the bootstrap-files table inREADME.md(readsAGENTS.md+.agents/skills/; Gemini CLI successor). Vendor adapter lists updated acrossENABLE.md,templates/AGENTS.md,templates/.agent/schema.md, and thesync-adaptersSKILL.md(five → six).VERSION→ 4.21.0.
Version 4.20.3, 6/24/2026¶
memory-lint catches an empty/malformed version manifest (PATCH). Adds a deterministic
check_version_manifestcheck (an ERROR) so a present-but-empty or malformed.agent/version.mdis caught by the lint floor (CI + reviews + manual runs) instead of silently breaking Mode B upgrade detection. This closes the loop on the v4.20.1 bug: a truncating stamp one-liner emptied a target'sversion.md, which made an agent misread the repo's version — now that exact failure mode fails the lint rather than going unnoticed. A missingversion.mdstays valid (the pre-versioning baseline) and is not flagged.
Added¶
check_version_manifestin bothmemory-lint.pyandmemory-lint.mjs(byte-identical message, at parity) — wired intomain's error list; with mirror tests intest_memory_lint.py/test_memory_lint.mjs(empty → error, malformed → error, valid → ok, missing → ok).SKILL.mddocuments the new check. Re-copied into targets on the4.20.2 → 4.20.3rung.VERSION→ 4.20.3.
Version 4.20.2, 6/24/2026¶
Windows line-ending hardening (PATCH). Adds a
.gitattributespinning*.shand.githooks/*to LF, so Git for Windows (core.autocrlf=trueby default) doesn't rewrite them to CRLF on checkout — which would break bash (bad interpreter: /usr/bin/env bash^M) and silently disable the hook +init.sh. From a Copilot Windows-feasibility check: the bootstrap works via Git Bash/WSL, but without this it was luck-of-the-default. Now robust on Windows.
Added¶
.gitattributes(root +templates/) —*.sh text eol=lf,.githooks/* text eol=lf. Installed / merged into targets additively (ENABLE Step 7b + a4.20.1 → 4.20.2rung), same discipline as the.gitignoreblock.VERSION→ 4.20.2.
Version 4.20.1, 6/24/2026¶
Self-init folded into
copilot-instructions.md(PATCH). A fresh-clone dogfood showed v4.20.0's self-init worked for Claude Code (which acts onAGENTS.md) but not GitHub Copilot CLI — itsstartis driven bycopilot-instructions.md's front-loaded read list, so it loaded memory and summarized without acting on the AGENTS.md self-init step (hook stayed inactive, adapters absent). Fix: put the first-run init at the top ofcopilot-instructions.md(the file Copilot reliably front-loads), as the first action — runbash .githooks/init.shifcore.hooksPathis unset / adapters absent, before summarizing. Improves Copilot's odds of self-initing;bash .githooks/init.shremains the one-command fallback and CI remains the zero-config floor.
Changed¶
templates/.github/copilot-instructions.md— now leads with a first-run-init block.VERSION→ 4.20.1.
Version 4.20.0, 6/24/2026¶
First-run init for fresh clones (MINOR). Closes the gap a Copilot fresh-clone dogfood exposed: the memory bootstrap self-initializes (the agent reads AGENTS.md/memory on its own), but a clone has the gitignored skill adapters absent and the git hook unactivated (git can't auto-run committed hooks on clone). That had meant a two-command manual setup. Now:
.githooks/init.sh(one idempotent command — regenerate adapters +git config core.hooksPath .githooks) + anAGENTS.mdself-init note so the agent does it on its first session. CI remains the zero-config floor regardless.
Added¶
.githooks/init.sh— one-command first-run init (sync adapters + activate the hook). Idempotent; not a git-hook name, so git never auto-runs it (runbash .githooks/init.sh). Committed executable (100755).
Changed¶
AGENTS.md(root + template) — first-session self-init note: runbash .githooks/init.shif adapter dirs are empty /core.hooksPathis unset..githooks/README.md— now leads with the one-command init.UPGRADE.md(rung + table),docs/DESIGN-ritual-triggers.md,README,VERSION→ 4.20.0.
Version 4.19.0, 6/24/2026¶
Vendor-neutral ritual triggers (MINOR). The after-session ritual (session log, review, sync) no longer depends on the agent self-triggering — which failed in practice: client teams report it isn't followed through even with Claude, a Copilot-only team had no triggers at all, and the hook layer was opt-in, per-vendor, and didn't travel into targets. Enable now installs a committed, vendor-neutral
.githooks/post-commitand a CI floor, and the agent activates the local hook — zero manual user step (the adoption constraint: any manual op is a barrier as the protocol gains traction and lands with untrained users).no-build-step-agent-runholds: git/CI invoke them in the user's env; the tool runs nothing. Design:docs/DESIGN-ritual-triggers.md.
Added¶
.githooks/post-commit(bash, advisory, never blocks) — after a commit: auto-stubs a session log when the commit did real work but carried none (capture; the thoughtful summary stays the agent's job — same split asmemory-lint) and re-syncs adapters when a skill changed. Activated bygit config core.hooksPath .githooks(the agent runs this at enable). Plus.githooks/README.md..github/workflows/agent-memory.yml— the CI floor: runsmemory-lint+ an advisory session-log presence check on push/PR with zero per-user setup (the untrained-user-proof layer). Advisory by default; opt-in gate viaAGENT_MEMORY_STRICT=1.docs/DESIGN-ritual-triggers.md— the design (layered: agent-primary + git-hook/CI net + optional vendor hooks; the capture/judgment split; the no-code reconciliation).
Changed¶
ENABLE.md— Step 6 installs.githooks/+ the CI workflow and activatescore.hooksPath(agent-run, no user step); Notes scope + the honest git-clone-activation limit (CI backstops).AGENTS.md(root + template) — the ritual note is now "reinforced, not just documented" + a definition-of-done framing (a task that changed tracked files isn't done until its log exists).docs/optional-ritual-hook.md— reframed: the vendor-neutral git-hook + CI are now installed and agent-activated; this doc is the optional per-vendor end-of-turn hooks + git pre-commit reminder.UPGRADE.md(rung + table),README,VERSION→ 4.19.0.
Honest limit¶
- Git cannot auto-run committed hooks on a fresh clone (security). So local hooks are agent-activated (no user step in the common path) and CI is the always-on, zero-config backstop.
Version 4.18.0, 6/24/2026¶
sync skill adaptersis now a runnable script (MINOR). A new built-insync-adaptersskill ships a deterministic adapter-regeneration script (bashsync-adapters.sh+ Nodesync-adapters.mjs+ Pythonsync-adapters.py, at three-way output parity; bash needs no runtime install — preferred). For eachagent-skills/<name>/SKILL.mdit (re)writes the five vendor adapters and prunes the orphans it generated (signature-guarded — never deletes a hand-authored vendor file). Why: dogfooding~/sandbox/simple-proxy, GitHub Copilot CLI (Gemini 3.1 Pro) readSKILLS.mdand still couldn't runsync skill adapters— it was a prose recipe with no executable, so the agent hunted for a non-existent command (node memory-lint.mjs sync skill adapters, anmcp-agent-memorynpm package,npm run, grep for functions) and flailed. A real script removes the ambiguity. Consistent withno-build-step-agent-run(same category as thememory-lintscript — an optional helper the agent/vendor/CI invokes; the tool runs nothing itself).
Added¶
agent-skills/sync-adapters/— the built-insync-adaptersskill:SKILL.md+ bundledscripts/sync-adapters.sh(bash — no runtime install, preferred),sync-adapters.mjs(Node ≥ 18), andsync-adapters.py(Python 3 stdlib) at three-way byte-identical output parity.--dry-runpreviews; prune is signature-guarded (never deletes a hand-authored vendor file). Installed into every enabled repo (ENABLE §5i). The bash runtime is from a Copilot finding — the script must run in a non-Node project (nonpm/npx/package.json).SKILLS.mddocuments adelete a skilloperation — remove the neutral source (rm -rf agent-skills/<name>/), run the sync script (it auto-prunes the orphaned adapters, signature-guarded), and mark the continuity id superseded (DECAY §9). From Copilot feedback: the delete path was undocumented and required manual adapter cleanup. The script never deletesagent-skills/itself — removing the committed source stays a deliberate, human-visiblerm.
Changed¶
sync skill adaptersis now the script, not a prose recipe —SKILLS.md(the operation + "Authoring a skill"),ENABLE.md(§5h closing step + §5i "all four" built-ins), andUPGRADE.md(standing sync + new4.17.0 → 4.18.0rung + version table) now run it. The adapter recipe remains as the format spec the script implements.VERSION→ 4.18.0.- Built-ins are now four (memory-lint, second-opinion, apply-critique, sync-adapters) in the current-state docs; historical rungs/changelog entries keep their period-accurate "three".
Version 4.17.0, 6/24/2026¶
GitHub Copilot CLI skills adapter (MINOR). Adds a 5th vendor adapter target so a skill authored once in the neutral
agent-skills/layer is natively discoverable by GitHub Copilot CLI. Copilot CLI follows the open Agent Skills standard (the sameSKILL.mdshape as the Claude/Kiro adapter) and discovers project skills under.github/skills/<name>/SKILL.md, auto-matching bydescription(and also accepting an explicit/<name>). Found dogfooding~/sandbox/simple-proxy: Copilot CLI could not find a skill that lived only inagent-skills/, because no.github/skills/adapter had been generated. Mirrors the v4.5.0 Kiro addition. Cross-vendor validated 2026-06-24 by GitHub Copilot CLI (Gemini 3.1 Pro) in Agent mode: it authored agreetingskill, ransync skill adapters, generated all five adapters, and recognized the.github/skills/adapter (after a session restart — Copilot loads adapters at init) — "behaves exactly as documented."
Added¶
.github/skills/<name>/SKILL.mdadapter —sync skill adaptersnow writes five adapters (Claude / Gemini / Cursor / Kiro / Copilot). Recipe inSKILLS.md; same thin-pointer shape as the Claude/Kiro adapters.- Copilot skills in Mode C migration —
MIGRATE.mdnow detects and promotes Copilot project skills (.github/skills/,.agents/skills/) intoagent-skills/, with adapters regenerated. - Optional GitHub Copilot CLI
sessionEndritual hook —docs/optional-ritual-hook.mddocuments a CopilotsessionEndhook (the analog of the ClaudeStophook) that nudges the after-session ritual on a non-agentic vendor; advisory (echo, never blocks), opt-in, not installed byENABLE.md(lives in repo-level.github/hooks/or user-level~/.copilot/hooks/). Addresses review point #4 (manual session upkeep) by making a skipped ritual visible, not enforced. - Optional GitHub Copilot CLI
postToolUseadapter auto-sync hook —docs/optional-ritual-hook.mddocuments an opt-in hook that regenerates the Copilot.github/skills/adapter after a tool use, so authoring a skill no longer requires remembering to runsync skill adapters(from a real-vendor finding: agents don't reliably auto-sync). Convenience-scoped: Copilot adapter only, no prune, duplicates the recipe in bash (regenerate if the recipe changes), and/restartstill loads it — the canonical path stays the agent-runsync skill adapters. The tool ships no sync script by design.
Changed¶
.gitignore(template + this repo) —.github/skills/is now ignored path-scoped. Unlike the other adapter dirs,.github/is not ignored wholesale: it holds the trackedcopilot-instructions.mdandworkflows/. Only.github/skills/(the regenerated adapter) is ignored.templates/.github/copilot-instructions.md— now front-loads the explicitmemory/read list (not just a pointer toAGENTS.md), states the lightweight-mode logging rule (log when tracked files change; read-only Ask/Plan sessions correctly write no log), plus points Copilot at the skills layer. Copilot's Ask/Plan modes don't reliably chase a pointer chain, so the steering file carries the read list directly — a deliberate, Copilot-scoped reversal of the thin-pointer / single-source-read-order convention (reliability over DRY; Claude/Gemini/Kiro keep their thin pointers since they proactively loadAGENTS.md). (Copilot later confirmed it readsmemory/in Ask/Plan and logs in Agent mode — fully lightweight-mode-conformant, so the steering wording avoids framing read-only no-log as a deficiency.)- Adapter lists updated across living docs to include
.github/skills/:AGENTS.md(root + template),SKILLS.md,ENABLE.md(Step 5h + the Step 8 completeness assertion now requires five adapters),UPGRADE.md(standing sync + new4.16.1 → 4.17.0rung + version table),.agent/schema.md,README.md,docs/DESIGN-skills-layer.md.VERSION→ 4.17.0. SKILLS.md—sync skill adaptersgains a hot-reload caveat: some runtimes load skill adapters only at startup (e.g. GitHub Copilot CLI parses.github/skills/on init), so a freshly-synced/<name>needs a session restart / skills rescan to appear mid-session. From the Copilot validation above.- Authoring convention strengthened (
SKILLS.md+AGENTS.mdroot/template) — "Authoring a skill" is now an explicit 3-step action (writeagent-skills/<name>/SKILL.md→ runsync skill adapters→ reload the runtime), because agents (incl. Copilot/Gemini) don't reliably auto-sync after writing the file. The tool can't force it mid-session (no-build-step-agent-run; auto-sync is guaranteed only at enable/upgrade per v4.12.0), so the instruction is now emphatic in both the on-demandSKILLS.mdand the always-readAGENTS.md.
Version 4.16.1, 6/23/2026¶
Session filename drift fix (PATCH). Two independent gaps allowed agents to write date-only session filenames (
2026-06-23.md) instead of timestamped ones (2026-06-23-153401.md): (1) the protocol said "Usedate -uor equivalent", letting agents treat the context-injectedcurrentDate(date-only) as equivalent; (2)memory-linthad no filename-format check, so drift was invisible until manual inspection. Fixed both: tightened protocol wording to an explicit prohibition, and added acheck_session_filenameswarning to both linters. Surfaced from drift in this session.
Changed¶
templates/AGENTS.md— Step 1 and checklist: "always rundate -u +%Y-%m-%d-%H%M%S" replaces "or equivalent"; explicit warning against usingcurrentDatefrom context.templates/.agent/schema.md— same prohibition in the session-naming paragraph.memory-lint.py+memory-lint.mjs— newcheck_session_filenameswarning (check 5): flagsYYYY-MM-DD.mdsessions; exported from the Node module. Registered inmain()for both runtimes. Tests added to both suites (3 cases each, Python + Node).
Version 4.16.0, 6/23/2026¶
ADR default path aligned to industry convention (MINOR). The optional Architecture Decision Record log default moves from
docs/ADR.mdtodocs/arch-decisions/ADR.md, matching the wider convention of placing the ledger in a named subdirectory (purpose-signalling; leavesdocs/root uncluttered). Surfaced frommercury-composablefeedback — that project had already adopteddocs/arch-decisions/ADR.mdahead of the default. Targets at the new path need no file move; targets at the old path rename on upgrade.
Changed¶
templates/.agent/schema.md— section header updated to## docs/arch-decisions/ADR.mdand the one body reference to the path updated.templates/AGENTS.md— ADR path reference updated.AGENTS.md(root) — ADR path reference updated.DECAY.md§12 — Design primitive path reference updated.README.md— file-tree entry updated; new version-table row.UPGRADE.md— new4.15.0 → 4.16.0rung + version-table row.docs/arch-decisions/ADR.md— this repo's own ADR log moved fromdocs/ADR.md(dogfooding the new default).
Version 4.15.0, 6/22/2026¶
ADR log upkeep trigger (MINOR). The optional
docs/ADR.mdlog (4.14.0) could be adopted but had no cue to evolve — the per-session ritual covered continuity-fact supersession yet never said to maintain a linked ADR. This adds the missing trigger: once the log exists, a new durable architecture decision, or the supersession/invalidation of a continuity fact carrying an(ADR-NNNN)tag, prompts a human-gated ledger update (add a newer ADR; mark the oldSuperseded/Deprecated, never delete; keepformalizes:↔(ADR-NNNN)in sync). Surfaced dogfoodingmercury-composable's ADR opt-in.
Changed¶
AGENTS.md(root +templates/) — the ADR paragraph gains an "If the log exists, keep it alive" maintenance/supersession trigger (propose; human-gated)..agent/schema.md(docs/ADR.mdsection) — a new "When to maintain it" paragraph spelling out the on-demand-but-kept-in-sync lifecycle.DECAY.md§12 — the Design primitive notes the ADR lifecycle is kept in sync with fact supersession.UPGRADE.md— new4.14.1 → 4.15.0rung (re-sync the guidance; merge into a repo-customized ADR note rather than overwrite) + version-table row.
Version 4.14.1, 6/20/2026¶
Re-synced
AGENTS.mdsource clarified (PATCH). A cross-vendor dogfood (GitHub Copilot upgradingmercury-composablefrom v3.7.0 → v4.14.0) re-synced the target'sAGENTS.mdfrom the tool's rootAGENTS.md— the operator/dual-mode dispatcher — instead oftemplates/AGENTS.md, leaving the target presenting itself as an enablement tool and referencing the non-installedENABLE.md. The other synced docs were correct; onlyAGENTS.mdhas a different canonical source for a target, and the upgrade ladder didn't say so per-file.
Changed¶
UPGRADE.mdgains a "Source of truth for re-synced files" section — a per-file map: a target'sAGENTS.mdcomes fromtemplates/AGENTS.md(the memory hub);DECAY.md/REVIEW.md/SKILLS.mdfrom the tool root;.agent/schema.md+ bootstrap pointers fromtemplates/. Explicit warning that the tool's rootAGENTS.md(which referencesENABLE.md/MIGRATE.md/UPGRADE.md) must never be installed into a target, plus a grep self-check ("AI-Enable Another Repository").- New
4.14.0 → 4.14.1rung that verifies and repairs a mis-syncedAGENTS.md(re-copies fromtemplates/AGENTS.mdif the target's copy looks operator-sourced).
Notes¶
UPGRADE.mdis tool-operator-only — no target memory-file shape change;ENABLE.md(fresh enable) was already explicit and unaffected. Purely an upgrade-path clarity + self-heal fix.
Version 4.14.0, 6/20/2026¶
Optional Architecture Decision Record (ADR) log (MINOR). The VBDI Design altitude was realized by the
## Architectural Invariants/## Key Decisionsincontinuity.mdand the long-formdocs/DESIGN-*.md, but there was no atomic, dated, status-tracked, never-deleted record of an individual architecture decision with its rationale, browsable by a human IT-governance audience. This adds the well-established ADR practice (Nygard 2011) as a lightweight, optional, human-facing ledger — kept token-efficient by living underdocs/and being read on demand, never in the per-session agent read path.
Added¶
docs/ADR.md(this tool's own, dogfooded) — a single-file decision log, entries newest first, each with Status · Date · Abstract · Rationale (incl. consequences/trade-offs) andformalizes:/serves:trace links. Status lifecycleProposed → Accepted → Superseded / Deprecated; nothing is ever deleted (mirrors the memory layer's supersession model,DECAY.md§9). Seeded with the 5 standing Architectural Invariants, plus the supersededno-code-markdown-onlydecision (ADR-0001…0006 —no-code-markdown-onlyrecorded as ADR-0004, Superseded by ADR-0006)..agent/schema.mddocuments the optionaldocs/ADR.mdsection (format + lifecycle + map-don't-duplicate cross-linking + the "on-demand, not per-session" rule).
Changed¶
AGENTS.md(root + template) andDECAY.md§12 note that the Design altitude may keep an optionaldocs/ADR.mdlog, explicitly not part of the Before-session read path.docs/DESIGN-vbdi-lifecycle.md§4 names the optional ADR log on the Design row.- each
memory/continuity.mdArchitectural Invariant title gains a visible(ADR-NNNN)pointer to its record (e.g.Target-repo scope only (ADR-0001)) — a human cue, explicitly not a prompt for the agent to opendocs/ADR.md.
Notes¶
- Map, don't duplicate:
continuity.mdkeeps the live what (withid); the ADR carries the durable why. The constraint text is never restated as competing truth. - Not auto-installed. ENABLE/UPGRADE document the convention; no
docs/ADR.mdis created in a target — a team adopts one on demand. Additive → no memory-file shape change.
Version 4.13.0, 6/20/2026¶
Tool-provided (system) skills are marked + carry an upstream advisory (MINOR). The built-ins agent-memory installs into every repo (
memory-lint,second-opinion,apply-critique) are tool-managed copies — overwritten on upgrade — but nothing told a target's AI that at edit time, so a local change could be made (and stranded) without anyone realizing it should go back upstream. This is exactly what happened with thememory-lintdangling-link fix in~/sandbox/simple-proxy: it was a genuine fix, but the target session didn't surface it for back-port. (The existing warn-before-overwrite only fires during an upgrade, which that session never ran.)
Added¶
provenance: agent-memory-builtinfrontmatter marker on the three shipped built-ins, plus a one-line banner in eachSKILL.mdbody. Any vendor's agent can now recognize a system skill by reading the file — no out-of-band knowledge needed. (hello-worldis a dogfood sample, never installed into targets, so it is not marked.)- Edit-time advisory (
SKILLS.md→ new "Tool-provided (system) skills" section): before editing a skill, check its frontmatter; if it isprovenance: agent-memory-builtin, don't edit in place — advise the human and either fork under a new name (local variant) or upstream a genuine fix to the agent-memory project for back-port + validation. Production: file an issue in the agent-memory repo. Pre-release: an advisory message to the maintainer (best effort until there's an issue tracker). The upstream pointer is kept generic (not a hard-coded URL) until the project's enterprise-GitHub move. - Upgrade-time backstop extended:
ENABLE.md§5i's warn-before-overwrite now also advises upstreaming a locally-modified built-in (not just keep-yours/take-update).
Changed¶
.agent/schema.mddocuments the optionalprovenancefield;AGENTS.md(root + template) gains a one-line pointer;docs/DESIGN-skills-layer.mdgains a status entry.DECAY.md/REVIEW.mdand the adapter recipe are unchanged (adapters mirror onlyname+description, so the marker doesn't touch them). Lockstep:VERSION→ 4.13.0,UPGRADE.mdrung + table,README.
Version 4.12.1, 6/20/2026¶
memory-lintdangling-link check resolves supersession targets acrossmemory/*.md(PATCH).check_danglingresolvedsuperseded-by/supersedeslinks against footers fromcontinuity.md+ the archive only — so a fact superseded by one whose footer lives in another memory file (notablyvision.md) was falsely flagged[dangling] … which has no footer anywhere. Found dogfooding on~/sandbox/simple-proxy(a retired vision was superseded by avision.mdfact); the maintainer fixed it there, and this ports the fix back to the tool with a regression test.
Fixed¶
load_reponow also pools footers from othermemory/*.mdfiles (e.g.vision.md), excludingcontinuity.md+decay-policy.md, into anextraset used only for supersession-link resolution incheck_dangling— never counted as continuity/archive facts (counts, overdue, and over-archived checks are unchanged). Fixed identically in bothmemory-lint.pyandmemory-lint.mjs(code-point sort preserved → byte-identical output).- Regression test added to both suites (
test_memory_lint.py/.mjs): a continuity fact superseded by avision.mdfact must not warn, while a genuinely missing target still warns. Exercisesload_repoend-to-end against a tempmemory/layer (the bug site), notcheck_danglingalone. To enable it,memory-lint.mjsnow also exportsload_repo+check_dangling(the Python module already exposed them) — additive, no behavior change. - Lockstep:
VERSION→ 4.12.1,UPGRADE.mdrung + table,README. Verified: both suites 8/8;memory-lintparity byte-identical on the tool's own memory (0 errors, 0 warnings).
Version 4.12.0, 6/19/2026¶
Enforced skill-adapter sync at enable + upgrade (MINOR). Skill adapters are gitignored per-machine pointers, so they don't travel with a clone/pull, and a rung that adds a new adapter target (e.g. Kiro in 4.5.0) left older skills' adapters incomplete. Previously enable/upgrade only did a read-only "recommend, don't run" check, so after an upgrade a skill's vendor-native adapters could be missing — blocking subsequent work that relies on native auto-trigger until the user manually ran sync. Surfaced upgrading
~/sandbox/simple-proxy(v4.4.0 → v4.11.1): the pre-existinghello-worldskill was left without its Kiro adapter.
Changed¶
- ENABLE and every Mode B re-enable (upgrade or already-up-to-date) now run
sync skill adaptersas their closing skills step, instead of recommending it. For eachagent-skills/<name>/it (re)writes the four vendor adapters and prunes orphaned generated adapters. Safe to run unconditionally: it is idempotent and writes only gitignored files (neveragent-skills/, never a committed file) — so it is not a version change and needs no session log.no-build-step-agent-runholds: the agent runs it during a human-invoked enable/upgrade, not a daemon or per-session automation. The per-session path still never touches skills; content-drift realignment is still the on-demandskill sanity check. ENABLE.mdStep 8 now asserts adapter completeness (every skill has all four adapters, no orphans) — enforcement is checked, not convention.- Touched:
UPGRADE.md(standing "Skills adapter sync" section + 4.11.1 → 4.12.0 rung + version table; stale back-references in older rungs updated),SKILLS.md,ENABLE.md(Step 5h + Step 8),docs/DESIGN-skills-layer.md,VERSION→ 4.12.0,README.AGENTS.md/DECAY.md/REVIEW.mdunchanged.
Version 4.11.1, 6/19/2026¶
Review step-6 archival guard hardened against prose (PATCH). The
REVIEW.mdstep-6 archival-verify told the agent to grep recent session files for an about-to-be-archived id and keep it if found — but a raw full-text grep also matches a prior review summary that merely names the fact while recording its decay status. Because every review that defers a fact re-names it, the guard re-armed each cycle: an archival livelock (tracked asot-review-step6-prose, same class as the v4.10.1 prose-vs-heading bug). Found during the 2026-06-19 review.
Fixed¶
REVIEW.mdstep 6 now defines a "use" as a## Memory Referencesentry, not a prose mention. It makesmemory-lintthe preferred archival check (it counts Memory-References only, so it is immune to the trap), and scopes the by-hand fallback to hits inside a## Memory Referencesblock — explicitly ignoring## Memory Review/## What happenedmentions. The verifier script itself needed no change (memref_idswas already line-anchored since v4.10.1); addedmemref_idsregression tests (prose/review-summary mention is not counted; block bounded at the next heading) to bothtest_memory_lint.pyandtest_memory_lint.mjs.
Version 4.11.0, 6/19/2026¶
memory-lintgains a Node runtime (MINOR). The deterministic decay-integrity check is the answer to "LLM hand-counting isn't reliable" — but that guarantee shouldn't depend on the machine having Python.memory-lintnow ships in both Python and Node; on a node-only box you still get the script, not a hand count.
Added¶
memory-lint.mjs— a Node port of the verifier (Node ≥ 18, built-in modules only, no npm install), at feature + output parity withmemory-lint.py.SKILL.mddocuments both commands as interchangeable; the agent runs whichever runtime the machine has (no dispatcher, no installer — the agent is the runtime). Verified byte-identical output (default and--strict) on this repo.test_memory_lint.mjs— the cross-runtime contract. Mirrorstest_memory_lint.py's fixtures exactly; both suites must pass, which is what holds the two implementations equivalent over time.
Version 4.10.4, 6/18/2026¶
memory-lint nested list fix (PATCH). Hardened the verifier script to handle deeply-nested lists correctly.
Fixed¶
memory-lintpinned Open Threads: Fixed a bug wherepinned_open_threads()incorrectly reset its state on any standard list bullet, causing it to lose track of the "pinned" state if a parent Open Thread contained deeply nested sub-items. It now correctly checks indentation level. (tracked viaot-memlint-pinned-nested.)
Version 4.10.3, 6/18/2026¶
Lightweight-mode wording fix (PATCH). A loose end surfaced while running
sync skill adapters: the sync (re)wrote 16 gitignored vendor adapters but leftgit statusclean — yetAGENTS.md's lightweight-mode note, read literally ("did a file change?"), seemed to demand a lite session log. It shouldn't:SKILLS.mdalready says the sync op "touches no committed file… not a version change," and the note's own anchor is the git diff. The wording just didn't say tracked.
Changed¶
- Lightweight-mode test re-keyed to a tracked change.
AGENTS.md(root + template) now states the objective test is the git diff over tracked files, not any filesystem write. The Read-only tier explicitly covers a run whose only writes are gitignored, regenerated artifacts —sync skill adapters,review-scratch/snapshots, the compiled lint artifact — as no session log. The middle tier reads "A tracked file changed…"; the closing line, "anything that touched a tracked file." Aligns the note withSKILLS.md(sync touches no committed file) and prevents a spurious lite log after every adapter sync. Wording-only — no file shape, skill, or script change.
Lockstep: AGENTS.md (root + template), VERSION→4.10.3, UPGRADE.md 4.10.2→4.10.3 rung + table,
README table. SKILLS.md / DECAY.md / REVIEW.md / .agent/schema.md unchanged.
Version 4.10.2, 6/18/2026¶
Fresh-context-review critique fixes (PATCH). The v4.10.x line was put through its own
second-opinionritual: a clean-vendor reviewer (GitHub Copilot CLI) challenged the milestone and returned a critique applied through theapply-critiqueloop. It confirmed the design was sound, cleared theno-build-step-agent-runquestion, and surfaced four scoped refinements — two documentation-consistency gaps that would have re-triggered the same review noise, one real parser robustness hole the v4.10.1 fix didn't cover, and one expectation-setting caveat.
Fixed¶
memory-lint— guard against an unclosed footer.FOOTER_REis now bound to a single line ([^\n], nore.S). A malformed footer (<!-- id: foo | ...with no closing-->) can no longer let the non-greedy field capture span newlines and swallow the rest of the file up to a stray-->, which would have silently misparsedtier/supersededfields and corrupted decay counts with no error. Same lesson as v4.10.1: a verifier whose job is trustworthy counting must not be fooled by malformed input. Script-only; no description change → adapters unchanged.
Changed¶
- Install protocol warns before overwriting a locally-modified built-in.
ENABLE.md§5i (and theUPGRADE.md4.10.0 / 4.10.2 rungs) now say: before overwriting an already-installed tool-managed built-in, diff it against the source; if it was locally customized, warn the human and let them decide rather than silently discarding their change. Makes the tool-managed-copies contract a checked step, not convention-only. Agent-run at the human's direction (no-build-step-agent-run); a no-op on a fresh enable. upgrades-additiveinvariant text carries its exception inline. The invariant in this repo'smemory/continuity.mdnow states the tool-managed-built-ins carve-out at its declaration (it was only in ENABLE/UPGRADE prose), so a reader encountering it cold no longer re-flags the overwrite as a contradiction — the exact noise the dogfood reviewer raised.second-opinion— same-vendor vs. different-vendor caveat. A Notes bullet now states that a same-vendor clean session (or spawned subagent) tests the mechanism, while a different vendor adds the epistemic diversity that is the whole point of a fresh reviewer for high-stakes milestones. Body only — description unchanged → adapters unchanged.
Deferred (reviewer rated low-confidence/contrived): hardening
pinned_open_threadsagainst deeply nested lists — tracked as an Open Thread, not changed, since current session-log formatting is flat.
Version 4.10.1, 6/18/2026¶
memory-lintbug fix — line-anchor the Memory-References detection (PATCH). Found while running the verifier during a memory review: a first pass false-positived[over-archived] sync-adapters-v420. The review's own session log quoted the heading string "## Memory References" in its prose (describing the very check), and the script's un-anchoredfind()matched that inline mention before the real section — scooping the neighbouring## What happenedparagraph (which named the archived id) in as the references block. The archival was in fact correct. A verifier whose whole job (v4.9.0) is trustworthy decay-counting must not be fooled by prose, so this anchors the heading match to the start of a line.
Fixed¶
agent-skills/memory-lint/scripts/memory-lint.py—memref_ids()now anchors the heading to a real line ((?m)^## +Memory References[ \t]*$) and bounds the block at the next line-anchored heading, instead oftext.find("## Memory References"). A session log may now safely quote the heading inline without producing a falseover-archivederror. Verified with added cases: the false-positive is gone, genuine references in the real section are still detected, and block-bounding still stops at the next heading. No description change → adapters unchanged; the tool still never runs it (no-build-step-agent-run).- Ignore Python bytecode caches —
.gitignoreandtemplates/.gitignorenow ignore__pycache__/+*.py[cod]. The bundledmemory-linthelper generates these on run (in this repo and in every enabled target as of v4.10.0); the.pysource underagent-skills/stays tracked. Add-only, consistent with the v3.1.0.gitignorepropagation.
Version 4.10.0, 6/18/2026¶
Fresh-context second opinion — a clean-memory reviewer as a deliberate gate. A long session accumulates self-trust; the agent that built a solution over-trusts its own trajectory. This release adds a skill pair for the highest-value antidote: at a milestone or risk point, hand a compact snapshot to an AI with clean memory (a fresh session or a different vendor) and ask it to challenge the work. It folds an external brainstorming idea (the "Agent Interchange Format" draft) into the existing skills layer + VBDI rather than a standalone spec — the net-new surface is small: a security advisory on export, the handoff ritual, and the critique shape. Everything else reuses
continuity.md+ session logs, the VBDI human gate, andmemory-lint/build-tests. It carries the hard-won v4.8/v4.9 lesson in its bones: the fresh reviewer is a hypothesis generator, not an authority (a clean-context reviewer once over-archived still-referenced facts here), so critique is advisory and gated by deterministic checks + a human.
Added¶
agent-skills/second-opinion/— generates a review snapshot derived fromcontinuity.md+ recent session logs (decision-relevant deltas only — never a parallel committed state file), behind a security advisory the human must acknowledge before any state is exported. Supports milestone mode (challenge a done-looking milestone) and reactive mode (blocked / uncertain / risky). Writes to gitignoredreview-scratch/.agent-skills/apply-critique/— consumes the reviewer's critique through a bounded, validated, human-gated loop: parse → plan a few scoped fixes → apply → validate (build/tests +memory-lintif memory changed) → summarize applied vs. rejected. Conflicts become Open Threads (never-pick-a-winner); the cycle writes a normal session log.review-scratch/— a gitignored, per-machine scratch dir for snapshots/critiques, with a README marking the files personal. Sharing one is a conscious human decision. Added to the root andtemplates/.gitignore; documented in.agent/schema.md.
Changed¶
- Built-in skills now installed (
ENABLE.mdStep 5i + the 4.10.0 upgrade rung). Every enabled repo gets the built-in skills —second-opinion+apply-critiqueandmemory-lint— copied intoagent-skills/with adapters regenerated;review-scratch/added to the target.gitignore.memory-lintis installed too because the review ritual relies on it — this supersedes its v4.9.0 "tool-local / not auto-installed" stance. Install is idempotent and never touches unrelatedagent-skills/content; a fresh Mode A enable now creates a populated (never empty)agent-skills/. Report + scope + verify notes updated. VERSION→ 4.10.0;UPGRADE.md4.9.0→4.10.0 rung + table;READMEversion table.AGENTS.md/SKILLS.md/DECAY.md/REVIEW.mdunchanged — the critique→repair loop reuses the existing ritual. Design:docs/DESIGN-fresh-context-review.md.
Version 4.9.0, 6/18/2026¶
memory-lint— a deterministic verifier skill (move the decay arithmetic off the LLM). v4.8.0 added a markdown self-verify step, but the primary count was still hand-done — and an LLM (Copilot, then a hand re-check) miscounts. This release ships the stronger fix Copilot argued for: a portable, optionalmemory-lintskill whose bundled script deterministically checks memory integrity. The agent judges meaning; the script does the counting. On its very first run it caught a real over-archival that two rounds of human review had missed (skills-layer-v411-fixes, last referenced 16 sessions ago ≤ archive_window 20) — now reactivated.
Added¶
agent-skills/memory-lint/— a portable skill (neutralSKILL.md+scripts/memory-lint.py, Python 3 stdlib, no install). Deterministic checks: no id in bothcontinuity.mdand the archive; no archived-as-faded fact referenced withinarchive_window(the decay-miscount guard); advisory overdue-for-archival (excludingcore/superseded/ pinned- [ ]threads); supersession links resolve. Exit non-zero on error → wire to a pre-commit hook / CI. Optional and agent/human-invoked (no-build-step-agent-run— the tool never runs it); it lints the arithmetic, not the meaning.
Changed¶
REVIEW.mdstep 6 ("Verify archival") now points tomemory-lintas the recommended deterministic version of the check ("let the script count").VERSION→ 4.9.0;UPGRADE.md4.8.0→4.9.0 rung + table;README.AGENTS.md/SKILLS.md/DECAY.mdunchanged.
Fixed¶
- Reactivated
skills-layer-v411-fixes—memory-lintflagged it as over-archived by the 2026-06-18 Copilot review (sslu 16 ≤ archive_window 20); moved back tocontinuity.md(active).
Version 4.8.0, 6/18/2026¶
Review self-verify guard — catch decay miscounts before they archive. A GitHub Copilot CLI review (2026-06-18) over-archived three recent, active facts — it miscomputed
sessions_since_last_used(counted ~5–9 as ">20") and ignored its own "still referenced in review window" note. The decay rule was right; what was missing was a check that the count was. Counting session files by hand is the easiest review step to get wrong, and archival is the costliest error — so the review now verifies its own archival against a cheap, grep-able signal.
Added¶
- "Verify archival" step in
REVIEW.md(new step 6, before stamping): for each fact about to be archived as faded,grepthe lastarchive_windowsession files for its id — any hit means the count was wrong, so keep the fact (it'sactive/archive-candidate), don't archive. Then confirm no id lives in bothcontinuity.mdand the archive. Superseded facts are exempt (they archive on truth-state, not recency). Added anArchive-verify:line to the review-summary format. Pure markdown; replaces a hand-counted judgment with a checkable signal for the riskiest operation.
Changed¶
VERSION→ 4.8.0;UPGRADE.md4.7.1→4.8.0 rung (re-syncREVIEW.md) + table;README.AGENTS.md/SKILLS.md/DECAY.mdunchanged.
Version 4.7.1, 6/17/2026¶
Lightweight mode — sharpen the skip criterion to an objective test. v4.7.0 let any "memory-neutral" task drop to a lite log. But "trivial" is a judgment call — both AI and human misjudge it, and a misjudged change that actually mattered would slip out of the ledger. So the distinction is now keyed to the objective question "did a file change?", not a subjective "is this trivial?": - Read-only (no file changes — orientation, Q&A, exploration) → no session log. - Any file change, however small (a one-line fix, a typo) with no memory-relevant event → a one-line "lite" session log (never skipped on a "felt trivial" call; the git diff anchors it). - Memory-relevant event → the full ritual.
Changed¶
AGENTS.md(root + template) "Lightweight mode" note rewritten to the three-tier, file-change-keyed form above.VERSION→ 4.7.1;UPGRADE.md4.7.0→4.7.1 rung + table;README.SKILLS.md/DECAY.md/REVIEW.mdunchanged.
Version 4.7.0, 6/17/2026¶
Lightweight mode — scale the ceremony to the memory impact. From a real cross-vendor enablement: Kiro used the installed tool to AI-enable a new source-code repo and gave an honest assessment — the protocol "helps more than it interferes" (immediate orientation from
memory/, actionableSKILLS.md, real multi-agent-continuity value), but the per-session write ceremony is disproportionate for trivial tasks ("for a two-line script and a skill file, the protocol's weight is noticeable") and "could benefit from a lightweight mode." This release adds exactly that — without breaking the event-sourced ledger.
Added¶
- Lightweight mode (memory-neutral tasks) in
AGENTS.md(root + template), in "After Every Session": if a task produced no memory-relevant event (no new/changed fact, no decision, no Open Thread touched, no project-state change), write a one-line "lite" session log (persist-time filename +**Agent:**+ a lightweight-marked summary +## Memory References→(none)) and skip the full template, fact-footer bookkeeping, and continuity edits. The ledger stays continuous (every session still logged), so multi-agent continuity is preserved; the review counts a lite log like any session but it carries no references, so usage is unaffected. When unsure, write the full log; Vision/Blueprint/invariant/supersession changes are never memory-neutral.DECAY.md/REVIEW.mdneed no change — a lite log is just a session file with no## Memory References.
Changed¶
VERSION→ 4.7.0;UPGRADE.md4.6.0→4.7.0 rung (re-syncAGENTS.md) + table;README.SKILLS.md/DECAY.md/REVIEW.mdunchanged.
Version 4.6.0, 6/17/2026¶
Vendor-neutral commit attribution — encode the convention once, every vendor follows. A Kiro observation crystallized it: Claude Code adds a deliberate, human-gated
Co-Authored-By:trailer automatically (it's in its harness), Kiro needed a per-machine hook + steering to do the same, and Gemini/Cursor do nothing by default. That's exactly the gap the shared layer closes — soAGENTS.mdnow extends its existing "identify yourself" principle (already true for session logs) to commits: any vendor's agent gets Claude's behavior with no per-vendor hook. Serves multi-contributor traceability (bp-multi-user) + provenance.
Added¶
- Commit-attribution convention in
AGENTS.md(root + template), in the "After Every Session" step 4 + checklist: "Commits are deliberate and human-initiated. When you commit at the human's direction, identify yourself the same way you do in session logs — e.g. aCo-Authored-By: <your agent name>trailer — so authorship is traceable across vendors. (If your runtime already adds one, nothing to do.)" Soft by design — guides, doesn't prescribe git workflow; a no-op for runtimes (like Claude Code) that already do it.
Changed¶
VERSION→ 4.6.0;UPGRADE.md4.5.2→4.6.0 rung (re-syncAGENTS.md) + table;README.SKILLS.md/DECAY.md/REVIEW.mdunchanged.
Version 4.5.2, 6/17/2026¶
Kiro hooks in Mode C + a bootstrap edge-case note — from a Windows/Kiro enable. Cloning an agent-memory repo on a fresh machine and opening it in an enterprise Kiro surfaced two things: (1)
.kiro/doesn't exist on a fresh clone (gitignored, per-machine), and an enterprise IDE may self-bootstrap from its own onboarding/MCP before readingAGENTS.md— the fix is the human nudge "Start fromAGENTS.md"; and (2) once Kiro is running it deposits hooks and steering into.kiro/(e.g. a commit-signature hook). Those stay gitignored/per-machine and don't touch the sharedmemory/layer, but the migration protocol didn't cover hooks for other repos being enabled. (The Kiro commit hook is human-gated — it fires only when the human says "commit" and adds a co-author trailer — so it aligns with agent-memory's deliberate-commit model; no tension.)
Changed¶
MIGRATE.md— the Kiro per-vendor protocol gains a Hooks sub-case:.kiro/hooks/*.kiro.hookare preserved verbatim underlegacy/kiro/hooks/, never converted or run (automation is a human, gated decision). Human-gated commit hooks (like Kiro's, triggered by the human saying "commit") align with agent-memory and need no action; only a hook that commits or pushes unprompted is surfaced as an Open Thread (never-pick-a-winner).README.md— a bootstrap edge-case note: on a fresh clone the vendor dirs are gitignored, so an enterprise IDE may self-bootstrap first; tell the agent "Start fromAGENTS.md", then runsync skill adapters. Enterprise hooks/steering in.kiro/stay gitignored and per-machine.VERSION→ 4.5.2;UPGRADE.md4.5.1→4.5.2 rung + table.AGENTS.md/SKILLS.md/DECAY.md/REVIEW.mdunchanged.
Version 4.5.1, 6/17/2026¶
Skills-layer guidance — from a cross-machine Gemini CLI dogfood. A real Gemini CLI run (different machine) surfaced two rough edges, both wording/guidance, no shape change: (1) after
sync, a natural-language "run hello-world" kept readingagent-skills/instead of the freshly-generated.gemini/commands/command; (2) the agent told the user to commit the vendor adapter dirs. Root causes: Gemini custom commands are slash commands (/<name>, explicit) — not natural-language auto-triggers like Claude/Cursor/Kiro — so NL correctly routes through theAGENTS.mdbaseline to the same neutral skill (identical result, not a defect); and our docs stated adapters are gitignored but never explicitly said don't commit / recommend committing them.
Changed¶
SKILLS.md— the Gemini adapter is now documented as a slash command/<name>(explicit, not NL-matched); added a "trigger semantics differ per vendor" note (Claude / Cursor / Kiro are description-matched, Gemini is slash-invoked, all pointing to the same neutral skill); and a never-commit-the-adapters guard on thesync skill adaptersoperation (report adapters as "gitignored — do not commit; onlyagent-skills/is shared").AGENTS.md(root + template) — the adapter line now says "never commit them".docs/DESIGN-skills-layer.md— recipe table flags Gemini as slash-invoked; a trigger- semantics + commit-guard note under the table; status line.VERSION→ 4.5.1;UPGRADE.md4.5.0→4.5.1 rung + table;README.DECAY.md/REVIEW.mdunchanged.
Version 4.5.0, 6/16/2026¶
Kiro support — convergence on open standards. Amazon's Kiro IDE adopts the two open standards this tool already bets on: it auto-reads a root
AGENTS.md(so the memory layer works with no pointer file) and its Agent Skills follow the open Agent Skills standard (the sameSKILL.mdshape as Claude). So enabling a Kiro repo needs almost nothing new — this release adds a 4th skills adapter target and teaches Mode C to detect/migrate Kiro's repo-local artifacts. Kiro Powers need no special handling: they are partner-published bundles (MCP + steering + hooks) that consume open-standard skills, which ours already are — the tool never emits a Power.
Added¶
- Kiro skills adapter (
SKILLS.mdrecipe): a 4th target.kiro/skills/<name>/SKILL.md— identical shape to the Claude adapter (frontmattername+description+ a pointer body), since Kiro follows the open Agent Skills standard.sync skill adaptersnow writes four adapters; the standing read-only Skills adapter check (UPGRADE.md) now scans for it too. - Kiro in the Mode C detection table (
MIGRATE.md) + a per-vendor Kiro protocol:.kiro/steering/*.md→memory/instructions.md;.kiro/skills/→ promoted toagent-skills/(open-standard, same as Claude);.kiro/specs/preserved verbatim underlegacy/kiro/specs/(never auto-flattened — folding a spec into the Vision/Blueprint is a human, altitude-gated decision).
Changed¶
- Adapter lists across the living docs now include
.kiro/skills/(AGENTS.mdroot + template,ENABLE.mdStep 5h / Step 8 / scope,docs/DESIGN-skills-layer.mdrecipe table + Option A)..gitignoreneeds no change —.kiro/was already in the managed block; the comment now names.kiro/skills/among the adapters.VERSION→ 4.5.0;UPGRADE.md4.4.0→4.5.0 rung + table;README.DECAY.md/REVIEW.mdunchanged.
Version 4.4.0, 6/16/2026¶
Lightweight skills — conscious, not per-session. Skill creation is a deliberate, occasional developer action, so it leaves the per-session path. The per-session
AGENTS.mdnow carries only the runtime baseline (read & follow a matching skill) + a pointer; the adapter recipe and the sync / adopt / sanity-check operations move to a new on-demandSKILLS.md(installed likeDECAY.md/REVIEW.md). The v4.3.0 per-session "skills safety check" is removed; upgrades instead do a read-only filename check that recommendssync skill adaptersif an adapter is missing/orphaned. Trims the per-session bootstrap (the skills recipe was ~1.3K tokens read every session).
Added¶
SKILLS.md(installed at repo root) — the on-demand skills reference: authoring convention, adapter recipe, and thesync/adopt/skill sanity checkoperations.- Standing "Skills adapter check" in
UPGRADE.md— read-only, filename-only; runs on any Mode B re-enable (incl. "up to date") and recommends sync if adapters are missing/orphaned.
Removed¶
- The per-session "Skills safety check" step from "After Every Session" (both
AGENTS.mdfiles) + its checklist line — superseded by the on-demand + upgrade-time model.
Changed¶
AGENTS.md(root + template): "Skills" reduced to the runtime baseline + a pointer toSKILLS.md.ENABLE.md(Step 5h referencesSKILLS.md; Step 6 installs it; Step 8 verifies),MIGRATE.md,.agent/schema.mdnow point atSKILLS.md.VERSION→ 4.4.0;UPGRADE.md4.3.3→4.4.0 rung + standing check + table;README.DECAY.md/REVIEW.mdunchanged.
Version 4.3.3, 6/16/2026¶
Skill description guidance (reviewed from external feedback). A
descriptionis a model-matched activation signal read within a small discovery budget, so it should be a concise, trigger-phrase-rich summary — not a long abstract paragraph (which weakens activation). Also clarified that YAML>/|folded/literal blocks are YAML-only and don't carry into the TOML adapter, so the canonical value stays one logical line. Wording only.
Changed¶
AGENTS.md"Authoring a skill" asks for a concise (~1–2 sentence), trigger-richdescription; the recipe notes the>/|YAML-only caveat.- Tightened the dogfood
hello-worlddescription (~35 words) and regenerated its adapters.
VERSION → 4.3.3; UPGRADE.md 4.3.2→4.3.3 rung + table; README; docs/DESIGN-skills-layer.md
§9 note. DECAY.md / REVIEW.md unchanged.
Version 4.3.2, 6/16/2026¶
Skill description hardening, surfaced by a deliberate skill-lifecycle sanity check (dogfood). The check confirmed the mechanics (git split / pointer integrity / per-vendor format / adopt / prune all correct) but found two hard-to-spot
descriptionhazards. Wording/clarity only — no shape, data, or behavior change.
Changed¶
- Adapter
descriptionmirrors the neutral skill's verbatim — never abbreviate it (the prior hand-madehello-worldadapters had abbreviated descriptions that silently drifted from the skill). - Skill descriptions must be single-line and quote-free — a
descriptioncontaining a"would otherwise emit invalid TOML (Gemini) or.mdc/YAML frontmatter (Cursor) when synced. The recipe adds an escape/quote fallback for unavoidable cases. - Fixed the dogfooded
hello-worldskill's description (dropped inner quotes) and regenerated its adapters to mirror it.
VERSION → 4.3.2; UPGRADE.md 4.3.1→4.3.2 rung + table; README. templates/AGENTS.md
(+ root AGENTS.md) re-synced; docs/DESIGN-skills-layer.md §9 note; DECAY.md / REVIEW.md
unchanged.
Version 4.3.1, 6/16/2026¶
Skills-layer doc fixes, surfaced by a fresh-agent test-drive of the v4.3.0 session-close ritual (dogfooded on a real target). Wording/clarity only — no shape, data, or behavior change.
Changed¶
- "Adopt a skill" no longer instructs a mid-ritual commit — it conflicted with the session-close ritual (which only reminds to commit). Adopt now says to stage the neutral skill for the session-end commit; the agent doesn't self-commit mid-ritual.
- Session-close skills check notes that adoption (which changes the tree) should run before writing the session log, so the log records it.
- Clarified adopt body normalization (preserve the procedure, neutralize vendor phrasing) and the detection locations.
VERSION → 4.3.1; UPGRADE.md 4.3.0→4.3.1 rung + table; README. templates/AGENTS.md
re-synced; DECAY.md / REVIEW.md unchanged.
Version 4.3.0, 6/16/2026¶
Skill authoring convention + "adopt skill" safety-net. Closes a footgun in the skills layer: the source of truth is
agent-skills/<name>/SKILL.md, but a user — or a vendor's built-in skill creator — might author a skill directly in a vendor folder (.claude/skills/, …), which is gitignored, so it's never shared and isn't the source of truth. v4.3.0 makes the authoring convention explicit and adds a reverse "adopt" operation, checked at session close. Additive (docs/protocol only).
Added¶
- Authoring convention (
AGENTS.md"Skills" → "Authoring a skill"): create skills inagent-skills/<name>/SKILL.md, then "sync skill adapters"; never author in a vendor folder. - "Adopt a skill" operation (
AGENTS.md"Skills" → "Adopt a skill"): promote a skill authored natively in a vendor folder intoagent-skills/(the reverse of sync — the same move migration makes at enable), then sync. The on-demand complement to migration's one-time promote. - Session-close safety check: the "After Every Session" ritual gains a step (+ checklist line) that detects a skill stranded in a vendor folder and prompts adoption before commit.
Removed¶
N/A.
Changed¶
AGENTS.md(root + template),MIGRATE.md(on-demand-adopt note),.agent/schema.md,docs/DESIGN-skills-layer.md.VERSION→ 4.3.0;UPGRADE.md4.2.0→4.3.0 rung + table;README.DECAY.md/REVIEW.mdunchanged.
Version 4.2.0, 6/16/2026¶
"Sync skill adapters." Closes a gap surfaced by a real cross-machine test: the neutral
agent-skills/<name>/SKILL.mdtravels via git, but the per-vendor adapters are gitignored and don't travel — so a freshly cloned/pulled repo has no native/-command / auto-trigger until they're regenerated locally, and re-running "AI enable" on an up-to-date repo is a no-op. v4.2.0 adds an on-demand operation to regenerate them, and moves the adapter recipe into the installedAGENTS.mdso a target's own agent (any vendor) can self-sync. Additive (the runtime baseline always worked without adapters).
Added¶
- "Sync skill adapters" operation — for each
agent-skills/<name>/SKILL.md, regenerate the Claude/Gemini/Cursor adapters (idempotent) and prune orphaned ones. Invoked by saying "sync skill adapters"; touches no committed file (adapters are gitignored). - Canonical adapter recipe relocated to the installed
AGENTS.md"Skills" section, so a contributor's agent — on any vendor, on any machine — can self-sync by reading its ownAGENTS.md.ENABLE.mdStep 5h now references this single recipe (DRY).
Removed¶
N/A.
Changed¶
AGENTS.md(root + template): "Skills" section gains the adapter recipe + the sync operation.ENABLE.mdStep 5h references the recipe instead of duplicating it..agent/schema.mdnotes on-demand sync.VERSION→ 4.2.0;UPGRADE.md4.1.1→4.2.0 rung- version table;
README.DECAY.md/REVIEW.mdunchanged.
Version 4.1.1, 6/16/2026¶
Skills-layer refinements — pre-adoption corrections to v4.1.0 (which shipped the same day and was not yet consumed by any repo), so the first real target run starts clean. The adapter formats were verified against current vendor docs in the process.
Changed¶
- Folder renamed
skills/→agent-skills/.skills/is a common top-level dir;agent-skills/is namespaced to avoid collision (and stays visible/discoverable, a peer tomemory/). All living docs updated; vendor.claude/skills/references unchanged. - Cursor adapter fixed.
.cursor/rules/<name>.mdcnow emits the agent-requested rule type —description+ emptyglobs:+alwaysApply: false— verified against current Cursor docs. (Gemini.gemini/commands/*.tomlwithdescription/prompt/{{args}}, and Claude.claude/skills/<name>/SKILL.md, were verified correct as shipped.) - Collision guard. Enable/migrate never overwrite a pre-existing
agent-skills/— they raise aContradiction:Open Thread (never-pick-a-winner) and stop. - Vendor-dir double-duty clarified (
MIGRATE.md):.cursor/rules/and.gemini/are both migration sources and adapter targets — archive originals tolegacy/first, then generate adapters, so they never collide.
VERSION → 4.1.1; UPGRADE.md 4.1.0→4.1.1 rung + version table; README. DECAY.md /
REVIEW.md unchanged.
Version 4.1.0, 6/15/2026¶
Cross-vendor skills layer. The shared layer gains its third leg — capabilities — beside memory and steering. A skill is committed, vendor-neutral markdown (
skills/<name>/SKILL.md: aname, adescription= when-to-use, a procedure, optional scripts). TheAGENTS.md"Skills" section is the universal runtime (the agent reads the skill — works on any vendor); native adapters (.claude/skills/,.gemini/commands/,.cursor/rules/) are thin, regenerated, gitignored pointers. Migration promotes vendor skill bundles (e.g..claude/skills/) intoskills/rather than flattening them into steering. Additive (a repo with no skills is unchanged). Design:docs/DESIGN-skills-layer.md.
Added¶
skills/layer — neutral, committedskills/<name>/SKILL.mdcapabilities (the shared source of truth), documented in.agent/schema.md.AGENTS.md"Skills" baseline (root + template) — the agent-as-runtime mechanism; works on any vendor with no per-vendor engine.- Per-vendor adapters — generated Claude (
.claude/skills/), Gemini (.gemini/commands/), and Cursor (.cursor/rules/) pointers; regenerated, gitignored. - Migration promotion —
MIGRATE.mdSection B2 + the Claude Code skills protocol: detect.claude/skills/, promote intoskills/(originals preserved underlegacy/), regenerate adapters.ENABLE.mdStep 5h defines adapter generation.
Removed¶
N/A.
Changed¶
ENABLE.md(Step 5h + verify/report/scope),MIGRATE.md(principle 6, Section B2, Claude protocol, detection table, continuity note),AGENTS.md(root + template),.agent/schema.md,templates/.gitignore(comment),README.VERSION→ 4.1.0;UPGRADE.md4.0.0→4.1.0 rung + version table.DECAY.md/REVIEW.mdunchanged.
Version 4.0.0, 6/15/2026¶
The forward layer. agent-memory gains a cognitive lifecycle loop on top of its memory substrate: Current State → Vision → Blueprint → Design → Implementation → Feedback. Memory was backward-looking (faithful to what happened); VBDI makes it goal-aware (faithful to what was intended) — the "predictable innovation with human partnership" mission. Integrates an independently-drafted cognitive framework (
docs/agent-cognitive-framework.md), designed indocs/DESIGN-vbdi-lifecycle.md. Additive (a repo with no Vision is unchanged) — bumped to 4.0.0 to mark the new layer, the forward counterpart to 3.0.0's evolving-memory layer.
Added¶
memory/vision.md— the north-star artifact (templates/memory/vision.md): target state, for whom, success criteria, non-goals.core, invariant-verified, one per repo.- Blueprint — the Vision↔Current-State gap as typed
(blueprint)Open Threads (… → serves: <vision-id>); no new file. - Altitude trace — Implementation → Design → Blueprint → Vision, linked by
id; a broken link is drift (DECAY.md§10/§12), grep-detectable. - Bootstrap, never fabricate —
ENABLE.md(Step 5g) and theUPGRADE.md3.7.0→4.0.0 rung create a ⚠️ DRAFT Vision (Current-state context only; target left for the human) and raise a(vision-bootstrap)human gate.
Removed¶
N/A.
Changed¶
DECAY.md(§10 altitude drift + new §12 "The forward layer"),REVIEW.md(Vision in invariant-verification + altitude drift in the backstop),.agent/schema.md,AGENTS.md(root + template: a "cognitive loop" section + Vision in the session read-list),ENABLE.md(Step 5g + verify + report).VERSION→ 4.0.0;UPGRADE.mdrung + version tables;README. The tool dogfoods its own confirmed Vision + Blueprint.
Version 3.7.0, 6/14/2026¶
Provenance + retrieval-at-scale — the last backlog item. Event-sourcing already records which session each fact came from; v3.7.0 surfaces it as an optional
origin:footer, and documents retrieval as deliberately lexical + indexed (grep +archive/INDEX.md+originpointers), with vector/semantic retrieval intentionally out of scope. Closes the assessment's provenance gap (#6); addresses the retrieval gap (#4) by design.
Added¶
- Optional
origin: <session-file>footer field (DECAY.md§1 + new §11) — the session where a fact wasCreated; set at creation, repairable by review (the earliestCreatedevent). Provenance becomes one hop, and is the cheap defence against memory poisoning (every fact traces to an immutable session). DECAY.md§11 "Provenance & retrieval" documents the lexical+indexed retrieval strategy (grep continuity → greparchive/INDEX.md→ followorigin→ optionalsessions/INDEX.md), bounded by project scale.
Removed¶
N/A.
Changed¶
AGENTS.md(root + template) setoriginon new facts and point at the retrieval path;.agent/schema.mddocumentsorigin+ the retrieval note;REVIEW.mdnotesoriginbackfill;ENABLE.mdnotesoriginis omitted at enable. The worked example showsoriginon the facts created in its session.VERSION→ 3.7.0;UPGRADE.md3.6.0→3.7.0 rung + version tables;README. Assessment gap #6 flipped ⬜ → ✅; gap #4 (lexical retrieval) marked ◐ by-design; Retrieval scorecard row updated.
Version 3.6.0, 6/14/2026¶
Memory smoke test — a cheap, no-code answer to "memory evaluation is unsolved": a
memory/smoke-test.mdwhose questions a fresh agent should be able to answer from the memory layer alone. A ❌ is a memory gap to fix, not a question to soften. Closes the assessment's gap #5. Additive (a new installed file).
Added¶
templates/memory/smoke-test.md— generic orientation questions (project & type, stack, invariants, recent decisions + why, open threads, conventions, preferences, supersessions) plus project-specific questions seeded at enable, a how-to-run, and a result log.ENABLE.mdstep 5f generates it (seeding 2–4 project-specific questions from the analysis); Step 8 verifies it; Step 9 reports it.REVIEW.mdnotes that a review is a natural time to run it.
Removed¶
N/A.
Changed¶
.agent/schema.mddocuments the file.VERSION→ 3.6.0;UPGRADE.md3.5.0→3.6.0 rung + version tables;README. Assessment gap #5 flipped ⬜ → ✅ and the Evaluation scorecard row ⬜ → ✅.
Version 3.5.0, 6/14/2026¶
Write-time contradiction check — the migration-time "surface contradictions, never pick a winner" rule now applies to normal sessions: a new fact is scanned against existing ones before it's recorded. Closes the assessment's gap #3 (the last "Partial"). Additive — a behavioral rule + a review backstop; no new fields or knobs.
Added¶
DECAY.md§10 — write-time contradiction check: on adding/rewriting a fact, scancore/invariants + active decisions in the same area; a clear replacement → supersede (§9), a genuine conflict → aContradiction:Open Thread, a clash with acoreinvariant → stop and surface.- A contradiction backstop in
REVIEW.md(the review scans the facts it already reads and flags conflicts it finds). - The before-adding-a-fact check in the after-session step of
AGENTS.md(root + template).
Removed¶
N/A.
Changed¶
VERSION→ 3.5.0;UPGRADE.md3.4.0→3.5.0 rung + version tables;README. Assessment gap #3 flipped ⬜ → ✅ and the "Truth maintenance" scorecard row ◐ → ✅.
Version 3.4.0, 6/14/2026¶
Invariant verification — never-decay facts (
core/ Architectural Invariants) can quietly go "confidently wrong" when circumstances change. The review now periodically prompts a human to re-confirm them (or supersede the false ones via v3.3.0). Closes the assessment's gap #2. Additive (a policy knob + a tracker field); already-enabled repos catch up via theUPGRADE.md3.3.0→3.4.0 rung.
Added¶
verify_invariants_every(default 20) indecay-policy.md, and alast_invariant_checktracker incontinuity.mdProject State.- Review routine step 6 (
REVIEW.md): when due, raise one Open Thread asking a human to re-confirm every never-decay fact, then stamplast_invariant_check. The review never auto-invalidates — it only prompts; the human confirms or supersedes (§9). AnInvariants:line joins the review summary. - The worked example shows a first invariant-verification prompt.
Removed¶
N/A.
Changed¶
DECAY.md§6 gains a "never-decay ≠ never-checked" note;.agent/schema.mddocuments thelast_invariant_checkfield + the knob.VERSION→ 3.4.0;UPGRADE.md3.3.0→3.4.0 rung + version tables;README. Assessment gap #2 flipped ⬜ → ✅.
Version 3.3.0, 6/13/2026¶
Supersession / fact-invalidation — the evolving-memory layer can now represent a fact becoming false (a decision reversed, a dependency dropped), not just fading from disuse. Closes the industry-alignment assessment's one "High" gap. Additive (optional footer fields + a terminal tier); already-enabled repos pick it up via the
UPGRADE.md3.2.0→3.3.0 rung.
Added¶
- A terminal
supersededtier and optionalsuperseded-by/supersedesfooter fields (DECAY.md§9). When a fact is reversed/invalidated, the agent marks itsupersededimmediately, adds the successor (supersedes: <old>), and recordsSuperseded: <old> → <new>in the session log's## Memory References. - Review behavior: superseded facts are archived flagged "superseded" (distinct
from "faded"), promptly (no
archive_windowwait), links preserved in the archive +INDEX.md; aSuperseded: Nline joins the review summary. Superseded is terminal — never reactivated by a reference (only a human can reverse it). - A worked supersession in
examples/evolving-memory-example/— a reversed REST-versioning decision threaded through before/after/session-log/archive.
Removed¶
N/A.
Changed¶
DECAY.md,REVIEW.md,.agent/schema.md, andAGENTS.md(root + template) updated for the above;VERSION→ 3.3.0;UPGRADE.md3.2.0→3.3.0 rung + version tables; the industry-alignment assessment flips gap #1 ⬜ → ✅.
Version 3.2.0, 6/13/2026¶
Protocol clarifications from a real-work field report (a Node.js→Rust refactor of an enabled repo, driven entirely by that repo's own memory layer). Documentation and wording only — no memory-file shape change; already-enabled repos pick these up via the
UPGRADE.md3.1.0→3.2.0 rung.
Added¶
- After-session checklist in
AGENTS.md(root + template), plus an optional Stop/pre-commit hook recipe (docs/optional-ritual-hook.md) to prompt the ritual without breaking the no-code core. - Stack-fact altitude rule:
continuity.md→## Stack & Toolsis the canonical live home for language/deps/versions;instructions.mdkeeps a high-level descriptor and points there (notes added to both templates and.agent/schema.md).
Removed¶
N/A.
Changed¶
- Session model defined precisely: a session is one log-write (a long
conversation may produce several), and the title's
startis now best-effort (the persist-timeendis the required ordering stamp) — no more fabricated starts. - Metadata ownership pinned and a contradiction fixed:
ENABLE.mdStep 5b seeded new facts astier: activewhileDECAY.md/AGENTS.mdsaidtier: working— now uniformly bornworking. The agent seedsid/created/tier/uses: 1; the review ownsuses/last_used/tierthereafter. - Open-Thread archival rule surfaced to the agent: mark
[x]and leave it for the review to sweep — don't self-archive.
Version 3.1.0, 6/13/2026¶
Propagate the AI-infrastructure
.gitignoreinto enabled repos. Personal AI-IDE runtime directories (.claude/,.kiro/,.cursor/, …) are per-machine state that should never be committed to a shared repo; the tool's own repo already ignored them, but enablement never passed that design on to targets. Additive and backward-compatible; already-enabled repos catch up in place viaUPGRADE.mdMode B.
Added¶
templates/.gitignore— the canonical managed block (sentinel-headed) listing the AI-IDE runtime directories and Aider local-history/cache files to ignore, while explicitly keeping steering files and thememory/layer tracked.UPGRADE.mdrung 3.0.0 → 3.1.0 — creates or appends the.gitignoreblock in already-enabled repos (idempotent, add-only).
Removed¶
N/A — additive.
Changed¶
ENABLE.mdStep 7 — now installs a.gitignore(copied from the template) when the target has none, and appends only the missing managed entries when one exists; never removes or reorders the user's existing entries. Previously it only added a comment to an existing file and refused to create one.ENABLE.md— Step 8 verifies the.gitignoresentinel + entries; the Step 9 report and the Notes file-scope list now include.gitignore.VERSION→ 3.1.0; version tables inUPGRADE.mdandREADME.mdupdated.
Version 3.0.0, 6/13/2026¶
Evolving memory layer. Facts stop being static: they carry usage metadata, fade through tiers, and archive when stale — recomputed deterministically from the session-log event stream. Breaking memory-file shape change (an un-upgraded agent couldn't correctly maintain the new files); already-enabled repos catch up in place via
UPGRADE.mdMode B. Upgrades are additive and non-destructive.
Added¶
- Evolving-memory layer — facts carry usage metadata (
id,created,last_used,uses,tier) and fade through tiers (active → recent → archive), recomputed deterministically from session logs. Full design indocs/DESIGN-evolving-memory.md. DECAY.md— metadata fields, tier lifecycle, and the deterministic integer decay rules (no floating-point scoring).REVIEW.md— the review ritual that recomputes usage from session logs and archives faded facts.## Architectural Invariantssection inmemory/continuity.md— core-tier facts (the tool's safety philosophy) that never decay.## Memory Referencessection in the session-log schema — the event source the review tallies usage from.templates/memory/decay-policy.md— tunable decay windows (defaults 3/8/20, review every 10 sessions).memory/archive/— cold storage for faded facts (never deleted).- Versioning: root
VERSIONfile (semver) plus a per-repo.agent/version.mdinstall manifest recording what each enabled repo is on. UPGRADE.md— the in-place version-upgrade ladder (reached only viaENABLE.mdMode B); tool-operator-only, not installed into targets.examples/evolving-memory-example/— the review ritual in action (continuity before/after, archive, a session log with Memory References).- Completed the root vendor bootstraps (
.cursorrules,.windsurfrules,.github/copilot-instructions.md) and added.gitignore.
Removed¶
N/A — the upgrade is additive and non-destructive.
Changed¶
ENABLE.md— Mode B is now version-aware: an up-to-date repo is skipped, an older one is upgraded in place viaUPGRADE.md; added the generate / install / verify steps for the evolving-memory files.AGENTS.md(root + template) — the Before / During / After flow now references fact metadata and the review ritual..agent/schema.md— documents the metadata fields, the Memory References section, and the new files.README.mdandCLAUDE.md— added the architecture map, version table, and the evolving-memory section.
Version 2.0.0, 6/12/2026¶
Vendor detection and migration. The tool can now be pointed at a repo that already uses vendor AI files and fold them into the unified format, plus recognize and skip its own prior installs (idempotent re-runs).
Added¶
MIGRATE.md— a per-vendor detection table and conversion rules for 11 sources: Claude Code, Cursor, Cline, Roo Code, Aider, Continue.dev, Codeium/Windsurf, GitHub Copilot, GPT/Codex agents, Zed AI, and Gemini CLI.- Mode C (Migrate Vendor) — originals preserved under
legacy/<vendor>/, steering folded intomemory/instructions.mdas## Migrated rules from <vendor>, chat history converted to datedmemory/sessions/logs, and contradictions surfaced as Open Threads (the tool never picks a winner). - Mode B (Already Ours) — idempotent re-runs: an existing install is detected and skipped.
- Dry-run support, so users can preview changes before committing.
- Monorepo / multi-module guidance — detection signals, single-root default, and a Module Inventory template.
examples/rust-event-bus/— a real Mode A fixture (the unedited output of enabling an actual Rust repo), replacing the earlier mock example.examples/migrated-cursor-aider-project/— a Mode C example with originals underlegacy/and converted session logs.- Documented the two memory layers (the repo's shared
memory/vs. the runtime's personal~/.claude/).
Removed¶
- The mock
examples/node-project(taskflow-api) — replaced by the realrust-event-busfixture. - The unreliable
Durationfield from the session-log schema.
Changed¶
- Session-log filenames moved to
YYYY-MM-DD-HHMMSS.md(UTC persist time); the title line is# Session (startZ - endZ)with full ISO 8601 millisecond timestamps — multi-contributor safe, with lexicographic sort matching chronological sort. ENABLE.md— added version-drift guidance (prefer the build manifest as source of truth, surface drift as an Open Thread) and a post-report verification step.MIGRATE.md— git-aware archiving (git mvfor tracked files, plain move otherwise) and an integration quality gate that distinguishes project instructions (integrated into schema sections) from AI-only rules (appended verbatim).- Fixed a
legacy/.gitignorecontradiction —legacy/now commits to git, consistent with the "preserved" promise inREADME.md/MIGRATE.md. - Cold-start and accuracy refinements: inline project header in the
CLAUDE.md/GEMINI.mdtemplates, a User Preferences "explicit only, never infer" guard, and a sharpened different-agent check that compares agent family.
Version 1.0.0, 6/12/2026¶
Initial release. A no-code, markdown-only memory system that any AI agent can read, plus a Mode A enablement protocol to generate a tailored memory system in any repo.
Added¶
ENABLE.md— the enablement protocol (detect footprint → choose mode → analyze the repo → generate tailored memory files).- Mode A (Fresh Enable) — generate a tailored
memory/system from repo analysis. templates/— exactly what gets installed into a target repo: bootstrap files plusmemory/files with{{UPPER_SNAKE_CASE}}placeholders, and.agent/schema.md(the canonical memory-file format).AGENTS.md— the dual-mode dispatcher: the memory protocol when working within the repo, the enablement protocol when AI-enabling another repo.- Per-vendor root bootstrap pointers —
CLAUDE.md,GEMINI.md,.cursorrules,.windsurfrules,.github/copilot-instructions.md— each a thin pointer so any agent lands in the sameAGENTS.mdprotocol. - This repo's own
memory/layer (instructions.md,continuity.md,sessions/) — the tool eats its own dog food. - The core safety constraints: target-repo scope only; never delete or overwrite vendor files; never modify source code or package manifests.
Removed¶
N/A — initial release.
Changed¶
N/A — initial release.