Completed Features - alexherrero/agentm GitHub Wiki
Note
Historical record. Entries before 2026-06-24 reference "ADR NNNN". These point to decisions we folded into the living designs under Designs. We preserve the older ADR names exactly as written. They represent what actually shipped at the time.
This page provides the combined build timeline for agentm and its sibling toolkit crickets. The table contains one row per shipped feature in the order it landed. This gives you a single answer for what we built and when we built it. Read the table top-to-bottom to follow the story. Read the mapping section below to see which release tag carries a given roadmap era. Several major roadmap milestones shipped inside ordinary "Minor" point releases instead of receiving a major version bump. These include the whole V6 memory engine, most of V7, and the bulk of V8/Autonomy. The authoritative version history remains in CHANGELOG.md for agentm and its crickets counterpart. We maintain this page so you can understand what shipped and why without reading every commit.
Coverage note. Every row from 2026-06-18 forward covers both repos at feature granularity. This window starts with agentm v5.6.0 and crickets v3.20.0. A dedicated release-archaeology pass (E4, 2026-07-10) drafted these rows feature-by-feature from the git and PR history of both repos. Rows before that date come from agentm's own release history one release at a time. We do not independently itemize crickets releases before v3.20.0 here. No feature-level source covers that earlier window yet. We can backfill the crickets pre-window history later if it receives its own archaeology pass. This will not disturb anything below it.
| Date | Feature (plain English) | Release | Roadmap id |
|---|---|---|---|
| 2026-10-16 | Memory keeps only the notes that earned their place (task 191). The memory junk review judged the 628 notes already in memory, and you agreed the 143 its verifiers left were junk. 121 were purged through the purge lane on your typed count, each listed with its git blob. 22 moved by rename with their links repaired, 18 of them into the archive. 6 duplicate lessons were folded into the lessons they repeated. Curated memory went from 342 notes to 205, and every lesson's sources still resolve. The writers that made the junk are fixed. An issue reference takes the repository its text names, so 9 of 12 wrong entity pages left through the night's journal. A page cut into slices counts as one source for a lesson. A superseded lesson retires once a live successor answers instead, and stays where you put it if you move it back. Four adversarial reviews found 15 cases in the fixes, each fixed with a test before release. | agentm v10.8.0 (PR #890, #892, #893, #894, #896) | agentm task 191 |
| 2026-10-13 | The vault keeps only the writes that earn their place (task 190). An audit of two days of vault writes found none of 18 new memory cards earned, and maps, trackers and entity pages rewritten with nothing in them changed. A meter in the morning note now counts each day's writes against a budget. A session nobody typed into leaves no trace, derived pages change only when what they say does, issue and release pages need three sources, a weekly lesson must clear its bar on its own sources, and enrichment stops adding prose to designs or moving a note's date. Over the first three nights new cards ran one or two a night. | agentm v10.7.0 (PR #885, PR #886, PR #888, PR #891) | agentm task 190 |
| 2026-10-08 |
A git worktree is kept out of the vault, and the daemon survives the key one leaves behind (task 189). On 2026-10-02 a worktree was made inside the vault, and Drive uploaded about 6,300 of its items. A machine-wide hook now refuses a worktree there. The doctor, the morning note and agentmd status name one that gets in the same day. The daemon reads past the extensions.worktreeConfig key a worktree leaves, which had stopped commits on 10-03. |
agentm v10.6.0; the hook shipped in v10.5.1 and the detection in v10.5.2 (PR #876, PR #880, PR #883) | agentm task 189 |
| 2026-10-08 | The daemon keeps committing however git packs the vault (task 188). On 2026-10-04 objects in a pack its git library can't list stopped commits for eleven hours, and a restart didn't help. The daemon now heals with a lossless repack and a reopen, and takes back a lock its own dead process left. It reports a stall within the hour, and owns the repository's packing. | agentm v10.6.0 (PR #874) | agentm task 188 |
| 2026-10-07 | The night stops paying to re-judge notes whose answer has not changed β task 181, from task 180's measurement that $75 of $197 over nine nights bought re-judgments that changed only the stamps. A skip no longer erases a note's judgment; the record of what was judged lives in a file of its own, survives an index rebuild and follows a moved note; a judgment is keyed only to the part of the filing rules it reads; the night takes notes by why they are owed, never-judged first; and a re-judgment that reaches the same answer leaves the file alone. Over five measured nights no rewrite changed only the stamps (159 of 413 before) and no note was paid for twice. A project record with no frontmatter is now turned away before the model is paid. | agentm v10.5.2, its code first shipped in v10.4.0 (PR #790, PR #791, PR #792, PR #794, PR #795, PR #881, PR #882) | agentm task 181 |
| 2026-10-06 |
A bare issue number below a project's floor is no issue, and the night journals your edit of a note's lifecycle as yours β task 187, task 186's two follow-ups. A survey of the 73 low-number agentm and crickets issue pages found that their early roadmaps numbered items in the same range as their first issues, so each project's project.yaml now sets bare_issue_floor: 48, and 60 roadmap-number pages left through the entity journal. A hand edit of lifecycle is journaled as yours and restarts the note's clock; a dormant note returns only on a recall after it went dormant; and enrichment journals its own sink, so its verdict is never read as your edit. The two-night check found the night's refile job moving archived notes back out of the archive, now fixed. |
agentm v10.5.0 and v10.5.1 (PR #866, PR #869, PR #870, PR #875) | agentm task 187 |
| 2026-10-04 | Two untried ranking ideas were tested, and neither moves recall β task 184. MMR (re-ranking for diversity) and spreading activation (pulling in a note's linked neighbours) were measured against the shipped search on one frozen snapshot, under a pass rule registered before any code was written. The baseline held at 40 of 63 questions; MMR got 38 and spreading activation 40 with no net change, and both together got 38. The refutation joins the retrieval ladder as row 7 with its per-question diff, and the stage code was built, tested and removed before it reached main. The eval gained snapshot and arm options, so the next idea can be measured the same way. | agentm v10.5.0 (PR #863, PR #865) | agentm task 184 |
| 2026-10-03 |
A weekly brief of what is new in the field, in your vault and your inbox β task 185, replacing forward learning, which collected 113 entries nobody read. Once a week one note of at most ten links lands in resources/briefs/ and in the inbox: each item is the link, two sentences on what it is and one on why it matters to the work in flight, ranked against the roadmap's What remains and the open designs, and nothing shown is shown again for 90 days. --ask answers one question and writes nothing, and keep turns an item into a reference card. The script drives the last30days engine itself and runs one claude -p with only web search and fetch (an exclusive tool list), hooks off and its own stream audited. The first brief, run by hand, cost $0.24 and its email arrived; the weekly job runs Saturday evenings from 2026-10-10. Forward learning's job, scripts and review surface are gone and its 113 entries are archived, not deleted. |
agentm v10.5.0 (PR #841, PR #851, PR #852, PR #856, PR #857, PR #864) | agentm task 185 |
| 2026-10-03 |
The vault's writers stop filing junk β task 186, from the vault growth audit of 2026-10-03. Entity pages need two sources and a number or version the repository had, so a listing number or a colour is no longer paged as an issue; an extractor change reaches the notes already indexed without a rebuild; the idea lane stops filing replies, and a removed card stays removed; an episodic trace links only notes that exist; and the night's dreaming facet names a note you edited once. The junk already written left through the journal and two reviewed manifests: 702 entity pages became 563, and nothing was deleted by hand. |
agentm v10.5.0 (PR #853, PR #854, PR #860) | agentm task 186 |
| 2026-10-02 |
Recall stops losing good answers to bookkeeping β task 182, the retrieval gate's gap after #749 and Plan D. Enrichment keeps the stamps other writers leave and every alias; a card names every lesson it rests on and is demoted only beside one in the results; a project ranks by the work done in it, read when a query runs; entity pages date a mention by the note; the night embeds before the gate, and the eval canary is an instrument. Live repairs re-stamped 38 cards, gave 31 lessons their provenance back and restored 31 aliases. The gate reads R@5 0.651, clean against the baseline, with every remaining miss explained in REPIN-QUEUE.md; a review before the cut fixed eight defects (#834). |
agentm v10.4.0 (PR #796, PR #798, PR #799, PR #800, PR #801, PR #802, PR #803, PR #805, PR #823, PR #830, PR #834) | agentm task 182 |
| 2026-10-02 |
No agent co-author trailer lands from this machine, in any repo β crickets' developer-safety 0.6.3 installs coauthor-guard once per machine. A global core.hooksPath dispatcher strips every Co-Authored-By trailer that names an AI agent, on every commit in every repo and from any host or tool, and hands every other git hook on to the repo's own .git/hooks. A human co-author's trailer stays. A read-only SessionStart check warns if the install breaks. Commits made off the machine (cloud sessions, collaborators) are out of its reach. The same release ships check-wiki's broken-image rule, ten explanation pages' diagrams restored, and /handoff copies kept as handoff-artifact records. |
crickets v5.1.0 (PR #262, PR #263, PR #264, PR #265, PR #266, PR #267) | crickets task 102 |
| 2026-09-30 |
Entity pages: a page for each repository, issue, release and person the vault keeps mentioning β Plan D of the AgentKV layout convergence, section 5 of the operator's rulings of 2026-09-24 and the choices of 2026-09-28. A free nightly builder writes one page per repository, repo-qualified issue and release that two notes mention, and one per person named in two pieces of shared work, under agent/memory/entities/{repos,issues,releases,people}/. Each page lists every note that mentions its entity, by project and then by space, newest first, and goes through the journal when it falls below its bar. A bare #12 is qualified by the note's project, its place first, so the 2,340 bare mentions in single-repository projects' notes became qualified issues, and releases are recognized from version tags. The nightly enrichment now records the people a note names, held to the note's own words and the operator's alias table. The deployed build holds 613 pages (50 repositories, 422 issues, 141 releases) and no page for a commit or a bare number; the issue pages buried each repository's page, so on the operator's ruling a query that names an entity puts its page first. People pages arrive as enrichment reaches the project records; a mail thread can count as shared work behind a switch that ships off. |
agentm v10.3.0 (PR #763, PR #764, PR #765, PR #766, PR #767, PR #768, PR #770, PR #771, PR #772, PR #779) | AgentKV convergence, Plan D (agentm task 179); GH #762 |
| 2026-09-30 |
A memory is saved once, and each new memory knows its project β Plan C of the AgentKV layout convergence, sections 6 and 7 of the operator's rulings of 2026-09-24. The twin list carries memories only (62 report pairs down to 0). A session keeps one trace, the same outside source updates its note, an article is one note, an idea adds to its card, and a reply typed to the agent is not filed. A rule stated twice merges on the strong tier's word, by supersede. New captures take their project from project.yaml, conventions and preferences staying global, and 70 existing notes were labelled where the source made it clear. Its review (#781) labelled more traces and untyped captures and fixed the morning note's per-job costs; 75 existing notes carry their project. Nothing was deleted by policy. |
agentm v10.3.0 (PR #750, PR #751, PR #752, PR #753, PR #754, PR #755, PR #756, PR #757, PR #758, PR #759, PR #760, PR #781) | AgentKV convergence, Plan C (agentm task 178); GH #748 |
| 2026-09-28 |
Closed tasks move to completed/tasks/, and crystallize writes its first lessons β Plan B of the AgentKV layout convergence, the lifecycle half of the operator's rulings of 2026-09-24. Two weeks after a task's tracker reads done or dropped, the night moves its whole folder, under its own name, to the project's completed/tasks/, where it ranks at Γ0.30 with the project's other finished work. Each file is one journaled move with the tracker last, so a crash or a file edited mid-move leaves the folder for the next night to finish; links and the recall sidecars are repaired from what is on disk, and a folder a note under personal/ or standards/ links into is held and listed. Every reader that finds a task by name looks in both folders, so crickets needed no change. Readers landed and deployed first; the retrieval gate was measured on an APFS clone with the moves applied before anything moved; the first move, on 2026-09-28 under quiesce, put 278 folders (675 files) in place with links repaired in 72 notes and no new broken link. Crystallize was fixed to read and write under the vault's memory root and to write a kind: crystallized record, ran once funded to finish (115 calls, 42 lessons, 2.9M tokens), and its weekly job runs on a provisional budget. An adversarial review before the mover merged found and closed 13 defects. |
agentm v10.2.0 (PR #715, PR #717, PR #718, PR #723, PR #724, PR #742, PR #745, PR #747) | AgentKV convergence, Plan B (agentm task 177); GH #712 |
| 2026-09-26 |
The vault takes the AgentKV layout: a reference library, a systems space, and one front page per project β Plan A of the AgentKV layout convergence, the layout half of the operator's rulings of 2026-09-24 on the work vault's spec. Two shared spaces join the vault. resources/ is the reference library: 233 reference cards moved there from projects/agentm/research/, 101 watchlist items from projects/agentm/_watchlist/, and a university/ shelf opens for study guides. Only the watchlist ranks low in recall: dampening the whole library cost seven of ten reference-card gold questions their card, so the operator ruled the topic cards rank as any note does and topic-aware dampening became a follow-up. systems/ describes the systems the operator runs: the six homelab notes in full, kept under their own names so no link moved, and a one-page front door each for agentm and crickets. Every project's root holds the same five files β project.yaml, charter.md, blueprint.md, tracker.md and its map β and the door answers any other new root file with a question. A new gate holds every project.yaml to one schema, and the night writes each project's tracker from its task trackers, carrying the projects job's activity reading across. Every move ran readers first, with the daemon deployed ahead of it, under quiesce, closed by a reindex, an embed backfill and a link audit compared as sets before and after: no new broken link. A one-time tidy moved the movies project's 49 finished cleanup batches to completed/ and sent the board ledger's seven dated backups to the Trash on the operator's approval of a manifest. |
agentm v10.1.0 (PR #692, PR #694, PR #695, PR #696, PR #697, PR #698, PR #699, PR #700, PR #701, PR #702, PR #703, PR #704, PR #705, PR #706) | AgentKV convergence, Plan A (agentm task 176); GH #693 |
| 2026-09-26 |
The research and wiki plugins find the watchlist in agentm's reference library β The crickets half of agentm's AgentKV layout. research 0.2.8 and wiki 0.12.2 resolve the forward-learning watchlist to resources/watchlist/ at the vault root. They read it there first while the move was pending, and only there once agentm's first forward-learning run had written to it, so a leftover copy in the project space can never fork the watchlist. |
crickets v5.0.1 (PR #260, PR #261) | AgentKV convergence, Plan A (agentm task 176 step 8) |
| 2026-09-23 |
The vault-perfection series closes: every project is a directory of numbered tasks, and _harness/ is gone for good. Plan 10 dissolved _harness/ into 292 numbered tasks across eleven projects, each with a plan, a progress log and a tracker in one schema. Plan 11 gave every space one ageing curve, behind a wall that keeps projects/, personal/ and standards/ permanent. Plans 12 and 16 gave every chat surface one memory and one write path, a card dropped into agent/inbox/. Plan 13 rebuilt Ideas.md every night over idea cards the night never re-grades. Plan 15 retired the resolver's _harness/ fallbacks and the plan's Status line (off 284 plans), with a gate and a doctor row that keep both gone. Two verbs read a project with no checkout by slug. |
agentm v10.0.0 (PR #650, PR #651, PR #652, PR #653, PR #656, PR #657, PR #658, PR #660, PR #663, PR #666, PR #675, PR #679, PR #680, PR #681, PR #683, PR #686, PR #687, PR #689, PR #690, PR #691) | AgentM Vault (vault-perfection series): plans 10β16, the arc's close; GH #609, #610 |
| 2026-09-23 |
development-lifecycle keeps its plans through agentm alone β The second and last crickets landing of agentm-vault part 15. The phase commands read and write a plan only where agentm puts it: a numbered task, or, in a repo with no vault, agentm's repo-local .harness/ plan. With no agentm there is no plan. queued-plans/ staging, the standalone pair and the plan's **Status:** line are gone; the tracker is a plan's only status (agentm task 172 step 3 reads it first). /open lists plans through agentm by checkout or by slug, and features.json and the orientation note sit in the project's desk/. check-no-harness-paths now enforces with no exemption list. Breaking for a repo without agentm. |
crickets v5.0.0 (PR #259) | agentm-vault part 15, crickets task 101 (unblocks agentm task 172 step 4) |
| 2026-09-22 |
The other crickets plugins find a project's homes through agentm β The first crickets landing of agentm-vault part 15, the _harness/ retirement. Every crickets plugin except development-lifecycle now asks agentm where a project's tasks/, designs/ and desk/ are, through one pinned module, project_homes.py, over agentm's process_seam.py project-path and list-plans. None composes, probes or creates a harness directory. code-review's evidence tracker gates a task's plan.md again; no [x] in a task had been gated since the projects migration. github-projects' depth maintenance matches agentm's plan list. /design keeps confidential designs and every design's parts in the project's designs/, and /design sequence opens each part as a numbered task with a queued tracker. wiki-watch's cursors and /handoff's default destination live in desk/. A gate, check-no-harness-paths, fails on the word anywhere in the plugins, tests included; only development-lifecycle's files, task 101's, stay exempt. Breaking for a vault that never migrated. |
crickets v4.0.0 (PR #257) | agentm-vault part 15, crickets task 100 (needs agentm PR #681) |
| 2026-09-15 |
The phase commands write and read agentm's tracker, in both plan layouts β The crickets half of agentm-vault's second paired landing: a plan written or worked after this release carries a tracker that says where it stands, and every development-lifecycle phase command reads status from it before the plan's **Status:** line. /plan opens the tracker at queued after the board step, /work marks the start, rewrites State and Next after each step and writes the Outcome at close, /review, /release and /bugfix read its status, and /orient opens with agentm's brief and lists the project's plans through agentm. Only agentm's tracker.py writes a tracker: crickets reaches it through the bridge's new tracker, project-brief and plans verbs and one helper, plan_tracker.py, which keeps the plan's Status line in step until part 15 retires it. The resolver prints a third field, the tracker path agentm names, and every command follows the paths agentm returns, in today's flat _harness/ pairs and in the numbered task directories plan 10 moves every project into; a bare call on a project that keeps tasks gets exit 4, and the commands ask for or propose a task name. /orient --note no longer creates _harness/. |
crickets v3.39.0 (PR #253) | Landing 2 of agentm-vault's three paired landings (the consumers of agentm-vault part 09; needs agentm PR #646) |
| 2026-09-14 |
The vault-perfection series lands plans 08 and 09, and the data run's first battery finds the one thing the migration's own tests could not. The four root spaces are lowercase, agent/, calendar/, personal/ and projects/ beside standards/, renamed on 2026-09-14 under quiesce by scripts/migrate/root_casing.py, each through a temporary name in one git mv two-step so the index moved with the tree on a case-insensitive disk under Drive (3,467 tracked files, none left under an old name), with the Obsidian settings, the config keys and the exports repointed and the clone and both binaries deployed in the same block. check-no-title-case-roots keeps the retired spelling out of the code, over 1,097 literals swept in the repoint, and crickets v3.38.1 shipped first so its project-space resolvers accept both spellings and report the disk's. The run's own lessons: the index and the ledger are keyed by the relative path, so agentmd reindex comes before the ledger recovery, or the night reads as owing nothing; the link check read identical before and after; the retrieval gate stayed clean with one question named for its cause, the dense arm's re-embed of a 149 KB note; and the first full battery after the run named the run's own marker as a loose file in memory/, which the shape gate now tolerates as it does the other data runs' β the one defect the migration's scratch-vault tests could not see, since no gate ran over them. Plan 09 rode in the same release: the resolver finds a task in either layout, one tracker schema behind a gate, project: and task: on captures and traces with a modest recall lift, maps over the projects space, readers for both layouts, a twenty-line opening brief, and the nightly pass over project records |
agentm v9.24.0 (PR #621, PR #636, PR #643) | AgentM Vault (vault-perfection series): plans 08β09 of 14 |
| 2026-09-13 |
The project space resolves under either spelling of its root, lowercase first β The crickets half of agentm's root casing: the project-space rungs in the development-lifecycle resolver, the design plugin's prose pass and the wiki plugin's layout module list projects ahead of Projects, admit the Title Case rung under a case-folded witness, and hand a path back spelled as the disk lists it, so a vault on either side of the rename resolves and a caller sees one spelling per vault on any disk; the research watchlist probes both spellings and defaults to the lowercase space. The rest of the release is the follow-on to the memory-root trims: nothing in crickets writes to agentm's retired memory-space homes, every bridge hands agentm its own modules for every call, the real-bridge suites and the learn-forward tests give agentm its own siblings, the wiki, design and research plugins read the trims' new homes, the vault-content tests find the voice kernel where the trims put it and run in CI on five scratch layouts, the rule pack reads the global voice overlay from standards/voice/ first, and a cross-review that runs out of time says so and degrades before agy is called on material over 50,000 bytes |
crickets v3.38.1 (PR #242, PR #243, PR #244, PR #245, PR #246, PR #247, PR #248, PR #249, PR #250, PR #251, PR #252) | Follow-on to agentm's memory-root trims and root casing (agentm-vault plans 05 and 08) |
| 2026-09-13 |
The vault-perfection series lands plan 07, and the maps data run's own post-conditions catch a link the review writer would have left dangling. The dreaming pass writes moc-root.md, the agent's entry point, listing every area's map, and moc-memory.md, which lists every memory type: a type big enough for its own page by that page's link, a smaller one with its notes in full. A type's page paginates inside itself instead of spilling into workflow-2.md, and each calendar year gets moc-calendar-YYYY.md beside it, listing the year's facet notes newest first under a heading per month. Home.md retired, Filing.md folded its write-authority table into index.md, and the twelve numbered map pages went, in a data run that changed thirty files and recorded a manifest line before each of its sixteen deletions. Three gates, check-root-notes, check-calendar-root and check-class-directories, report until that run writes its marker and enforce after it. The run's --finish step first refused to write the marker. The week and month reviews the dreaming pass had just written linked the day 2026-08-10 by its bare date, the day index the design dropped, and that day's note had moved to its diary name, so the link dangled; a review's day lines now link the facet notes the review is built from. The run's how-to was corrected in the same change: after the ledger rebuild it told you to forget every card the run rewrote, which undid the rebuild, and it now forgets only the targets owed before the run. Plan 06's leftovers rode along: repair_excerpts reports an excerpt it cannot verify instead of writing a field the card retired, and the retrieval gate names six flipped questions and counts the rest. The stale _n1_handoff/ pair left the repo |
agentm v9.23.0 (PR #608, PR #620, PR #622) | AgentM Vault (vault-perfection series): plan 07 of 14 |
| 2026-09-12 |
The vault-perfection series lands two more plans, and reading before running finds what a stem-wide rewrite would have broken. Plans 05 and 06 shipped: the memory root trims to diagnostics/ and memory/ and nothing loose, with the always-load pen folded into standards/user-preferences.md, security-and-secret-governance.md drafted from the standing constraints, the nine voice rules moved to standards/voice/, moc-standards.md generated, the watchlists and agentm's own settings and sources config moved to Projects/agentm/, and the sidecars, the repo registry and the dream exhaust moved out to the engine state directory; and every writer of a class card now lands the one definition of the card's order (card_shape.py in the toolkit, internal/cardshape in the daemon, held equal by a test), with the retired fields dropped and the six empty opinion-lane directories removed by the card backfill. Reading every link the backfill planned to rewrite, before its data run, found it would have rewritten ten project-space records β purge manifests and labelling results among them β that name what was measured under the old names, and would have repointed a renamed card's own derived_from at an inbox path that never existed; the backfill now rewrites links only in Agent/ and Calendar/, and repoints a path only when it names the renamed note's own class. The move exposed one more gap the same way: the first retrieval gate after the memory-root trims flipped five gold questions to a miss, because the nine voice rules had left Projects/ for standards/voice/, which the daemon's default embed scope did not name β closed by naming standards/voice beside Projects and Calendar in defaultEmbedScope, pinned by a test. Two defects surfaced outside the vault. agentmd tiers --audit's first live run failed thirty cheap-tier calls in twenty-seven seconds to a lapsed CLI login and could only report that a tier was unreachable; the audit now names each sample it could not score and why, up to five, and stops after five failures in a row rather than walking a sample it cannot score. And the doctor's new check_install_binary row flags a resident agentmd binary that predates the daemon source β a gap noticed three times by a human remembering to look, most recently when PR #599 renamed MEMORY_VAULT_PATH to MEMORY_ROOT and the live hooks exported the new name before anybody rebuilt the binary that had to read it β by comparing the newest commit touching daemon/ against the binary's own mtime, and the running process's start against the binary's mtime, since agentmd status reports full health from an old process that kept its inode. Two smaller fixes rode along: thirty of the Memory-Daemon reference's sixty-nine file:line citations, drifted from the code they named, were repointed at where it sits now; and the overnight n1 run's handoff pack moved out of the live clone's own working directory, where it had been rewriting two tracked files every night, to n1-handoff/ under the project's _harness/ in the vault |
agentm v9.22.0 (PR #600, PR #601, PR #602, PR #603, PR #604, PR #605, PR #606, PR #607) | AgentM Vault (vault-perfection series): plans 05β06 of 14 |
| 2026-09-11 |
The vault-perfection series lands its first four plans, and the night runs β The AgentM Vault design, Filing v2's successor, was decided across seven sessions and approved as final, then translated to fourteen parts and sequenced into fourteen named plans. Plans 01 to 04 landed: the vault survey's housekeeping defects fixed, 627 residue notes purged on the operator's re-measured ruling with the tally template refused at both write doors, every writer landing the same card with status derived rather than asserted and the session trace as the handoff record, and the night itself β enrichment, the dreaming binary, the Python cycle and the scorecards inside a 02:00β06:00 window, the batch spending against one two-million-token line with a call guard, and one morning note that holds the night to the operator's numbers. The first supervised batches then sharpened it: no MCP servers loaded into an enrichment call (four fifths of a call's baseline), a prompt that asks only for what its own judge accepts, a token line that counts what a call adds rather than a constant re-read, a refusal written down so the night stops re-buying the same no, and every pre-pass fact carried so a memory never loses its lineage; a model judges the cheap tier's audit. MEMORY_VAULT_PATH has one meaning and a name that says it, MEMORY_ROOT, both names exported for one release so crickets' installed readers keep working. The doctor sees a checkout that is missing merged work, and the Python FastMCP memory server is gone |
agentm v9.21.0 (PR #576, PR #577, PR #578, PR #579, PR #580, PR #581, PR #582, PR #583, PR #584, PR #585, PR #586, PR #587, PR #588, PR #589, PR #590, PR #591, PR #592, PR #593, PR #594, PR #595, PR #596, PR #597, PR #598, PR #599) | AgentM Vault (vault-perfection series): design sessions 1β7, plans 01β04 of 14 |
| 2026-09-11 |
The shepherd proves what landed, and every reader takes MEMORY_ROOT first β The worktree shepherd can now prove a squash-merged branch landed by the content main holds, so the orphaned branches a squash-merge repo leaves behind are reclaimable at last, and it sees a worktree stranded on main by a hand gh pr merge --delete-branch and detaches it. Every crickets reader takes agentm's renamed MEMORY_ROOT first and reads MEMORY_VAULT_PATH only as the deprecated alias, so agentm can drop the alias export one release after the rename without breaking a crickets hook or script. A plugin finds its siblings through Claude Code's versioned cache instead of a flat ../design path that named nothing on an installed machine, which had degraded every installed prose pass to Claude-only. The prose pass catches a fact-guard copied in pieces, a timeout typo no longer reads as agy being down, and a handoff pack carries agentm's handoff marker on every prompt so its text is never mined as the operator's own words |
crickets v3.38.0 (PR #235, PR #237, PR #236, PR #238, PR #239, PR #240, PR #241) | Worktree-shepherd hardening + follow-on to agentm's MEMORY_ROOT rename |
| 2026-09-06 |
The inbox triage engine retires, and the needs-your-eye surface it was the only producer of. harness/skills/memory/scripts/inbox_triage.py walked memory/_inbox/, a directory filing v2 removed with nothing writing it since, so its promote / merge / expire had proposed nothing since; each of its three jobs now has an owner β the heat policy, the dreaming binary's copies job, and the lifecycle axis. The engine, its test, and the needs-your-eye surface test go with it: dream.py loses the folded sub-run (the digest field, the call, the render line, the include_inbox_triage switch, and the audit branch for the fold's applied merges); console.section_needs_your_eye and its report key and renderer row are gone; session_brief.count_needs_your_eye, the brief clause it fed, and the term it contributed to the fresh-brief dedup signature are gone. inbox_triage.py was the sole writer of _meta/needs-your-eye.json, and the file has never existed on this machine, so all three readers had reported dark or zero since filing v2 β a reader whose only writer is gone is not honest for saying so. /memory inbox drops from SKILL.md, verb-table row and section both. What's genuinely lost: nothing now detects a fuzzy-similar, fingerprint-distinct pair and parks it for a human β the copies job takes content-identical families, and the dedup stage proposes a merge. 2,600 lines removed |
agentm v9.20.0 (PR #575) | Filing v2 follow-up (inbox-triage-retirement) |
| 2026-09-06 |
One meaning for source:, and the hygiene the filing arc left β source: now names only the transport a memory arrived by, from the contract's closed vocabulary (operator-direct, conversation, external-fetch, email); where the material came from moves to its own field, source_url: for a fetched page's address and source_id: for a mined unit's registry identity. note.Source (daemon/internal/note/note.go) resolves source_id:, then source_url:, then the legacy source:, so the source registry stays sighted on notes nobody migrated; the Go capture request and note doc gain SourceID/SourceURL (daemon/internal/capture/capture.go), and the hash and version ride with whichever field names the unit. check-vault-frontmatter gains source-not-a-transport β a source: outside the vocabulary is a finding naming which field the value belongs in β and source_migrate.py converted the live corpus: 124 fetched pages to source_url: + source: external-fetch, 14 references to source_id: with source: dropped, leaving the vault reading 848 notes clean. Four residuals closed alongside: the enrichment floor now reads Stamp.ConfidenceFloor from the contract's thresholds.low_confidence (0.65) rather than a compiled-in constant, DefaultConfidenceFloor standing in only when no contract resolves; recall.py demotes a served unfiled or expired note by 0.60, the daemon's own note.Weights[ClassStatus], multiplicatively and independently of the lifecycle demotion; orchestration_briefing.count_inbox and console.count_inbox read needs_review.summary() instead of the memory/_inbox/ directory filing v2 removed, both having returned zero since; and the dreaming binary's copies job reports the population it walked on purpose β measured on the live corpus at 21 content-identical families inside the memory classes and exactly two outside, both latest_* scorecard mirrors whose duplication is their function. Nineteen test suites stopped sharing engine state via scripts/engine_state_isolation.py The release sweep found the last gap and closed it: the capture tool's own schema still advertised the single field, described as the job it no longer has, and the CLI could not pass the new ones at all. |
agentm v9.19.0 (PR #570, PR #571, PR #572) | Filing v2 follow-up (source-and-hygiene) |
| 2026-09-05 |
One vocabulary for the superseded relation β resolves the direction-and-effect split the row below left to a human ruling. A superseded memory now carries lifecycle: superseded + superseded_by: <successor> alone; supersedes: is only ever the successor's back-link, and status: no longer carries supersession for a memory (it keeps whatever it had, or moves to active when a loser leaves the inbox pool). The old inverted shape β status: superseded + supersedes: <winner> on the loser β is gone from every writer: the dreaming binary's copies job, dream.py's dedup merge, inbox_triage.py's collapse, correction.py, and evolve.py; the sources layer's supersede.go is untouched, since its superseded_by: <source id> at <version> was never a note reference. Both recall paths now treat a superseded memory like an archived one: the daemon's wall (wallUnserved, renamed from wallArchived) hides lifecycle: superseded beside lifecycle: archived, include_archived (MCP) and -include-archived (CLI) lift both, and the outcome reports superseded_hidden beside archived_hidden; recall.py now serves a superseded note on the explicit query, demoted, instead of never. check-vault-frontmatter gains two rules β missing-successor (a superseded memory naming no successor) and inverted-supersession (a superseded memory still carrying supersedes:) β across four new self-test fixtures; vault_lint.py's supersede-integrity now also resolves superseded_by:, and dangling-supersession reads the lifecycle axis and takes a note's own superseded_by: as its lineage. supersession_migrate.py converts the vault to the new shape β report first, --apply to write, idempotent, journaled as actor migration β reviving a note outright when its named successor turns out not to be in the vault, rather than walling it forever; the live run converted 9, revived 3, converted 1 telemetry digest outside memory/, and left the gate reading 846 notes clean. eval_lifecycle_separation.py gained a --superseded arm measuring the twin pairs the same way it already measured archived ones, and the frozen dreaming-parity recording took its one deliberate post-freeze edit for this: the copies job's two fixture entries now carry the new shape, status untouched, recorded in the fixture's own README |
agentm v9.18.0 (PR #566, PR #567) | Filing v2 follow-up (superseded-vocabulary) |
| 2026-09-05 |
The loose ends filing v2 left behind β a bad manifest can't take the runner down with it, and the agent remembers its own sessions β four PRs landed the same day to close out what the six-part arc deferred. The runner no longer treats one malformed .harness/jobs/*.yaml manifest as a reason to run nothing: load_manifests_lenient (scripts/runner/manifest.py) keeps every manifest that loads and names each one it refuses, the cycle runs what loaded, and the account lands at ~/.cache/agentm/runner/last-cycle.json β read by the session brief's β runner refused N manifest(s): β¦ line and the doctor's new runner-cycle row; agentm-runner run --strict keeps the old all-or-nothing load for a caller that wants it, and the CLI exits 3 only when nothing loaded at all. The gap was not hypothetical: the runner's own log dated the Python dream job's silence at 89 not-due cycles between 2026-08-27 and the outage, a schedule quietly longer than weekly on the live manifest before its re-registration. The dreaming binary's own passes join the nightly scorecard β agentmdream leaves the report of each completed pass at <engine state dir>/dreaming/last-report.json (a refused or not-due start keeps the previous file), and dreaming_scorecard.py renders a "The dreaming binary" section from it: the run, its mode and outcome, the gate's reason, the pass's age, one row per job, and an applied/skipped count β with no report a sentence saying agentmdream has never completed a pass on this machine or the state dir moved, never a row of zeros. memory/episodic/ becomes the agent's memory of its own sessions: episodic_trace.py, called from the Stop hook (bash and pwsh) at session end, writes one kind: session-trace note per session β the notes it captured and recalled, as wikilinks, under a title taken from the session's first request, capped at 40 links, no model call β and a session that touched nothing leaves no trace; the calendar's day index links the day's traces, the dreaming binary's promotion job reads those links as its recurrence signal, the contract's record_kinds gains session-trace, and calendar_layer.py, an earlier trace writer nothing had ever called, retires into it. /memory diary "<text>" (plus --facet and --day) gives the register a front door from a session, a thin verb over calendar_facets.py quick/append with the closed-day refusal spelled out rather than a third MCP tool β the daemon still serves exactly two, deliberately. And the vault-root Calendar/ register joins the dense retrieval arm beside Projects in defaultEmbedScope, having been lexically indexed from the start. Two smaller fixes rode along: TestCaptureStaysUnderBudget now asserts the floor-relative share rather than the absolute p95 on Windows CI, where the runner's shared disk read past the absolute budget on two PRs with no Go change; and test_dream, test_dream_confirm and test_needs_your_eye_surface each govern their own engine state now rather than sharing it. Left to the operator, not built: one vocabulary for the superseded relation β the copies job's status: superseded + supersedes: and the write path's lifecycle: superseded + superseded_by: differ in direction and in effect, and the analysis plus a recommendation sit in PLAN-filing-v2-remainders's locked calls rather than in code |
agentm v9.17.0 (PR #560, PR #561, PR #562, PR #563) | Filing v2 / remainders |
| 2026-09-05 |
Memory ages honestly, and the nightly pass is a Go binary now β every memory carries one aging axis, lifecycle: (pinned/active/dormant/archived/superseded): a dormant note ranks below its active twin, an archived note leaves default recall until you ask for it by name, a superseded note never competes with its successor, and every move is journaled. The governance lanes (lifecycle_transitions.py) tier by how hard a move is to undo: activeβdormant runs automatically off a silence clock (dormant_after_days 365), a dormant memory past archive_after_days (1825) is staged as an archive proposal, entering archived itself only ever applies through the confirm surface, and deletion stays entirely the operator's, through a manifest and a typed count (purge.py) β the older memory-archive move (a physical file move after five years of silence) retires with it. The second Go binary the design names, agentmdream, runs one pass and exits under a dual gate (elapsed time and real activity since), behind a lock a second start is refused by, journaling every mutation before it happens so a crash resumes rather than repeats or loses work; report-only by default, -apply writes. Its jobs, in the order they run: the lifecycle policy, collapsing content-identical copies, re-filing what write time got wrong, promoting what recurs into a crystallized note, the register's weekly and monthly reviews, one map of content per memory type, and additive relative-date glosses β then three checks that mutate nothing (a vocabulary audit, trend flags, a sampled re-classification diff). Parity with the Python producers it replaces is asserted against a recording taken before they retired, never recomputed, since the recording is now the only contract left. The two ran side by side through a report-only overlap window with a daily divergence review; the one review agreed on every surface, and the operator flipped -apply the same day β dream.py no longer runs the suffix-backlog drain, the calendar rollups, or the lifecycle policy's own sinking and lifting, and now only reads the axis, stages archive proposals, and runs the stages the binary doesn't carry. This closes out agentm-filing-v2.md, whose status flips to launched
|
agentm v9.16.0 (PR #550, PR #551, PR #552, PR #553, PR #554, PR #555, PR #556, PR #557) | Filing v2 / lifecycle-dreaming (part 6 of 6; design launched) |
| 2026-09-03 |
The corpus migration β six classes populated, every staging directory gone β memory/ now holds exactly the six class directories the design named (semantic, procedural, episodic, entities, crystallized, mocs), and every staging and legacy directory that fed them is dissolved: the inbox, the type-named dirs (preferences/, preference/, idea/, fix/, workflow/, workflow-pattern/, insight/, feedback/, domains/), the memory/2026/ month buckets, _archive/ and _opinions/ routed into semantic/, procedural/ and crystallized/. The one irreversible act ran once, on the operator's confirmed count: 2,638 notes across the inbox, the legacy dirs, _archive/, and expired opinion supplements, manifested with titles and hashes before deletion (scripts/migrate/corpus_migration_3.py, dry run by default, `--apply --phase route |
archive | purge, three purge scopes so the ruling needed no code change). The opinion lanes now live at memory/crystallized//, subdirectories beside the crystallized memories themselves; opinion_supplement.lane_base()is the one place the root is spelled, and dream's general walk,vault_lint, frontmatter_validator, the console, and the daemon's meter sampler (MeterExcludedNested) all exempt the lanes wherever they sit. The scorecard gained a class populations reading so the empty-shell failure that motivated the whole arc β six directories built and never populated, invisible for months β can't happen again unnoticed. Four record kinds joined the packaged contract (report, standard, analysis, progress-log, the shapes 45 live records already carried), which let check-vocabulary-membershipflip from a ratchet to--strictin the battery: any unregisteredtype:orkind: value now fails outright, and the live run reads 0 offenders over 2,291 notes. The retrieval gate's gold set pins pre-migration paths while its pinned baseline moved with the corpus, so both sides now fold onto the note's basename rather than reading the migration itself as a regression β against the migrated corpus it reads 0.750, no significant change from 0.734. Applied live under a quiesced daemon in three phases plus two later settling passes; residual for part 4: the Python capture path (capture.py, reflect.py) still writes new captures into memory/_inbox/`, which regrows between route passes
|
| 2026-09-04 |
The calendar β a daily register that earns rereading β the vault-root Calendar/YYYY/ holds one note per day per facet for the contract's four registered facets (meetings, correspondence, docs, diary), created only when the day has content, append-only while the day is open, and corrected once closed by a new dated note carrying supersedes: β the original never rewritten. The bare-date file is generated from what exists: each facet with a context phrase and count, the day's episodic traces, the system digest. Weekly and monthly reviews appear on the dreaming cadence whether or not anyone remembered to want them, sparse weeks reading sparse. A diary label recurring on three distinct days in thirty becomes a confirm-gated proposal to register it as a facet β one line under facets: in the contract, never applied by the agent. Rode along: the volume gate now counts against the day a capture is stamped for, found when this PR's checks crossed UTC midnight. Deployed Python-only; the live register resolved to the operator's existing Calendar/. Recall does not search the register yet (index scope, a follow-up) |
agentm v9.15.0 (PR #548) | Filing v2 part 5 of 6 (calendar) |
| 2026-09-04 |
The miner admits only what the operator wrote and keeps only what records a process β the write path's labeled sample (20 decisions, 14 right, 6 of 12 outside the tool stubs) found the filing engine sound and the miner wanting, and the operator's four rulings landed the same day: a handoff prompt carries a marker the miner skips (15 vault prompts marked; the crickets handoff-pack renderer emits it); the per-tool tally is instrumentation, never a candidate, and the 830 existing stubs were purged on the operator's confirmed count with a manifest (memory/procedural/ 1,142 β 312); a fix candidate carries its cause and its remedy sentences or is not a fix; a HIGH preference needs a durability cue. The twenty labeled rows are a committed fixture in the battery; re-mined, the sample yields 9 candidates where it yielded 20. Retrieval gate after the purge: 0.734 β 0.688, p = 0.375 |
agentm v9.14.0 (PR #546) + crickets #236 | Filing v2 follow-up (miner-provenance) |
| 2026-09-04 |
Filing decided at write time β filing v2's write path lands β no writer stages anything any more. filing_engine.py decides, before a note lands, its type through the contract, its class, its settled destination and its update relationship to the corpus (add / update / supersede / noop, deterministic keys before similarity, supersession without deletion, probable duplicates filed flagged beside their twin); the reflect lanes, capture.py / memory_capture and the daemon's Go capture all file through it at the class directory with lifecycle, source and filing_confidence. memory/_inbox/ has no writers left; the 90 notes the old writers regrew before the merge were routed at deploy. The metadata is the inbox: needs_review.py renders memory/mocs/needs-review.md with a context phrase per link (first live reading 659, 656 of them the daemon's own undrained captures), the dream cycle regenerates it and the scorecard counts it. Capture volume is gated on its own β thresholds.daily_write_cap 200, grounded in the corpus, refused with a named message at the engine's door and in the daemon β and the scorecard gains a writes-per-day line with the week-over-week trend. trust: is stamped from the contract's sources map and smuggled instructions stay inert through every writer, as fixtures. The enrichment pass stamps its confidence and carries a capture's provenance across the rewrite that used to drop it. The labeled-sample eval (scripts/health/eval_write_path.py) put twenty real decisions in front of the operator: 14/20 right, 6/12 outside the tool stubs, and the finding that the next work is the miner's. Retrieval gate after deploy: 0.734 β 0.719, p = 1.0 |
agentm v9.13.0 (PR #540, PR #543) | Filing v2 part 4 of 6 (write-path) |
| 2026-09-03 |
One tree per project β filing v2's projects merge lands β Agent/desk/projects/ is gone; every project's tree lives at the root Projects/<slug>/, a sibling of the memory root, the one-tree-per-project shape the design named. This is the paired half of a cross-repo release: the crickets development-lifecycle plugin shipped its location-tolerant resolver first, as v3.37.0, so every plan-resolution path in that plugin already knew the root generation before anything moved. Applied live under a quiesced daemon and runner β ten entries moved as git mv (desk/labelling folding into Projects/agentm/labelling) β then the embed backfill a bulk move turns out to need: re-keying every moved note silently dropped the retrieval gate from 0.734 to 0.438 until agentmd embed (1,294 notes) restored it exactly, now recorded as a migration invariant in the move script's own run order. The vault-root space sits above a root-confined Locator, so resolve_project reaches it through a second instance of the same storage-seam backend rooted one level up (layout: "root"), derived from the backend's own root rather than global config; readers keep desk/projects/ as a documented older rung β discovered, never conjured, so nothing creates the root space unprompted. Writers now follow the tree: a root-space note carries group: projects/<slug>/β¦, and save.py, MCP capture, promote, ideas_promote, the MOC arcs index, offer-save, and new-project resolution all land there when it exists (fixing ideas_promote's stale pre-four-space memory/projects target along the way). Walkers (arc_registry, kind_registry, moc_generator, vault_lint, frontmatter_validator, graph_snapshot, migrate_arcs, machinery_doctor) union both spaces; recall's corpus walk crosses into the sibling; the daemon's default embed scope and spaces.projects default both gain the root Projects; check-memory-root-consistency allows the one designed sibling; and the two retrieval evals remap pinned desk/projects paths at score time. scripts/migrate/projects_merge_2b.sh is the one-shot move script, dry-run by default. A separate fix rides along: eleven memory-skill modules imported the vendored engine_state before bootstrapping their own directory onto sys.path, so a foreign file-load raised ModuleNotFoundError β the guard now precedes every sibling import, pinned by test_skill_modules_file_loadable.py
|
agentm v9.11.0 (PR #528, PR #529) + crickets v3.37.0 | Filing v2 part 2b of 6 (projects-merge) |
| 2026-09-02 |
Machine state leaves the vault β filing v2's structural moves land β the vault had accumulated a machine annex a human never browses: _meta/ caches and cursors, _dream/ insights, _crystallize-staging/ markers, a desk/scratch drawer, scorecards filed under a desk that also held the operator's own work. Part 2a moves every machine file to an engine state directory at ~/.local/state/agentm/ ($AGENTM_STATE_DIR overrides it; resolved by harness_memory.engine_state_dir() and a four-line vendored twin pinned by a parity test), with one deliberate carve-out β _meta/repos.json stays put, owned by the storage seam's design and moving only with that design's own amendment. The durability the old files got from vault history moved with them: the state directory is a git repository the migration initializes and the runner commits on the vault's own cadence. What stays in the vault is what a person reads: a first-class diagnostics/ space (health/, dreaming/, digests/) absorbs the scorecards, the digest briefs, and the dated lint reports, and joins the daemon's default capture spaces. The always-load surface becomes standards/ at the vault root β probed as a sibling of the memory root first, generated moc-* navigation skipped β read in union with the legacy memory/_always-load/ pen at the same priority and token budget, while save --always-load now stamps lifecycle: pinned so part 6's pinned loader can retire the pen with a query rather than a directory move. desk/scratch retires (swept to a local unsynced folder; desk/tasks/ is the workbench now), and the battery goes hermetic on the new seam: run_unit_suite.py gives every unit test a fresh scratch $AGENTM_STATE_DIR, scripts/conftest.py extends the same guard to pytest, and every verify-* script exports its own scratch state dir. The migration itself (structural_2a.sh, dry-run by default, quiesced daemon and runner as a precondition) was applied live, and the production apply found two defects the dry run structurally could not surface: four naked rmdir AND-lists that killed the apply under set -e whenever a directory kept its Drive Icon artifact β in dry-run the guard fails first, which set -e exempts β and a collision policy that skipped rather than resolved, stranding the real needs-your-eye queue behind scratch leakage; collisions now resolve vault-wins, since the quiesce precondition makes the vault copy the last production write and the engine directory's git history keeps whatever is replaced. The same apply exposed that four verify-* scripts had been writing scratch state into the real engine directory on every battery run β the exact leakage the collisions hit β closed by the script-wide exports above. The Projects merge (desk/projects β root Projects/) is deliberately not here: it is part 2b, a queued plan paired with a crickets release |
agentm v9.10.0 (PR #521, PR #522) | Filing v2 part 2a of 6 (structural moves) |
| 2026-09-01 |
Filing v2 opens β the whole-vault design goes final, and its first part ships β agentm-filing-v2.md converges the vault on the six-class layout the operator's own deployment already proved, defines who may write where, and adds the two subsystems neither prior deployment solved: a memory lifecycle and a write-authority table. Authored via /design from a six-lane research synthesis plus a vault census; review approved every section unrevised, translate produced six parts, and /design sequence activated PLAN-rules-and-authority with five more queued. Part 1 shipped the same day: the storage-rules contract gains a five-value lifecycle axis with its required default, a four-transport sources vocabulary closed to a two-tier trust set (trust is a property of the transport, never the content), and the calendar's facets registry β plus three calendar record_kinds and an ideaβmemory/semantic routing flip, applied identically to the shipped default and the live vault instance. All four new keys are optional-when-absent, so a pre-v2 rules file keeps parsing while the migration runs. The census that motivated this arc found the one enforcement gap the type-XOR-kind rule never covered β kind: alone had drifted to 38 in-use values against a 32-value register, with nothing checking the values themselves β closed by check-vocabulary-membership, a set-ratchet gate: a recorded baseline names every currently-tolerated offender, anything new fails the battery immediately, and the baseline only ever shrinks. Its live first run recorded a zero-offender baseline over 212 retired-value notes awaiting the migration. The vault also gets its first enforced write-authority table β five spaces (Agent agent-owned, Calendar shared, Projects grant-required, Personal per-task, standards operator-owned), deny-by-default for root files and undeclared spaces, with session grants composing into the existing per-file-class judgment so a root document still asks even inside a grant. A pre-tag adversarial review then caught three real defects, none of which shipped to a running binary: the four new block fields were missing omitempty, so a binary upgrade alone would have re-hashed every unchanged contract and marked every ledger row stale; the grant's inner per-file-class match wasn't case-canonicalized, so a non-canonically-cased projects/β¦ path fell through to a weaker permission than the one it was granted; and a corrupt ratchet baseline silently re-baselined whatever the corpus held instead of halting, the exact adversarial shape the ratchet exists to catch. All three fixed with pinning tests before the tag |
agentm v9.9.0 (PR #518, PR #519, PR #520) | Filing v2 part 1 of 6 (rules-and-authority) |
| 2026-08-27 |
Per-project behaviour without a per-project install β retiring the per-project install left three things with no delivery mechanism, each reachable only through --scope project and so already dead on this machine before the path was removed. They now install once and resolve the project when they fire. verify-dispatch runs the edited file's own project's .harness/verify.sh on every Write/Edit; the predecessor hardcoded a cwd-relative path, which worked only because hook and project were installed into the same directory, so machine-wide an agent editing one project's file from a session opened in another would have run the wrong script or silently none. Two behaviours changed on the way, both where the old design chose silence and silence was the confusing answer: a verify.sh that exists but is not executable now runs rather than being skipped, and a failing verify script now fails rather than being swallowed by a trailing ` |
truethat let a project's typecheck fail on every edit without once saying so.compaction-markerrecords in the progress log that a compaction happened, so entries above it read as written before the context was lost β it earns its keep on *automatic* compaction, the case nobody chose β andcompaction-reanchortells the resuming session its conversation was discarded rather than paused. All three install through the existing hook-bundle mechanism, so the installer was never touched; the marker writes through the process seam and the vault write lock rather than appending to a path, since state may live in the vault and a direct append would race the daemon. A fourth item, enforcingsupported_hostsat install time, was investigated and deliberately **not** built: the machine-wide install has no Antigravity primitives destination at all, so filtering such a primitive out of~/.claude/would deliver it nowhere rather than correctly β the missing piece is a delivery path, not a guard. Two bugs surfaced only because the tests drove real scratch projects rather than reading the code:resolve-active-plananswers with paths rather than existence, so a non-empty check guarded nothing and the reanchor would have lectured every compacted session on the machine about a plan that does not exist; andgit rev-parse --abbrev-ref HEAD` in a repo with no commits prints to stdout while exiting non-zero, so the obvious fallback idiom wrote two lines into the progress log |
|
| 2026-08-26 |
One install, not two β AgentM had two install scopes, and the documented default was the one almost nobody wanted. --scope project copied a .claude/ / .harness/ / .agents/ tree into every target repo, which meant two delivery mechanisms with different on-disk shapes, a migration tool to move between them, and a parity surface to keep them honest β all to serve cases (team dotfiles, a project pinning its own config) that a machine-wide install plus per-project state already covers. It is gone: the code, the tests, the templates it delivered, the CI gates guarding those templates, and the docs describing it. install.sh drops 1336 β 764 lines, install.ps1 704 β 244, net β6,306 across 101 files. --update retires with it, because re-running the installer is the refresh β source-mode installs are symlinks that never go stale and release-mode installs re-copy every run. Retired flags fail rather than being ignored, each naming its replacement, on the reasoning that a stale caller passing one is announcing an expectation the installer no longer meets and a silent no-op would let that ride until something downstream broke. Deleting the branch fixed a standing bug for free: the --mcp-server refusal and the entire Go-daemon/embedder section sat below it and had never once been reachable under --scope user, so --daemon finally does what it documents. Both agentm-update launchers were passing --update --scope user and would have broken on first use β they are installed by the surviving path itself, which is what made that miss dangerous. The install test suites were rewritten rather than trimmed, every project-scope assertion folded into a machine-wide equivalent, and both are now hermetic (scratch HOME as well as scratch prefix, since the installer keys its launcher, the launchd plist and ~/.gemini/GEMINI.md off $HOME). Each deleted template shipped in the same commit as the CI gate guarding it, which mattered more than it sounds: check-vendored-parity's workflow mode was hardened to hard-error on an empty template dir, while the hand-rolled copy of that same check in tests-linux.yml has no such guard and would have gone vacuously green while verifying nothing β the more dangerous of the two to leave behind. doctor now resolves one install prefix instead of a three-way scope, and reports a leftover <project>/.claude/ as safe-to-delete rather than ignoring it, because files that shadow nothing still get edited by operators who don't know they're dead. Three gaps the retirement exposed β a machine-wide PostToolUse verify dispatcher, the two compaction hooks whose "superseded by crickets" justification turned out false in both halves, and a supported_hosts filtering question whose premise needs re-testing β were deliberately left to a successor plan rather than smuggled into a deletion |
agentm v9.7.0 (PR #490) | user-only install |
| 2026-08-02 |
The board can say "parked", and something finally checks what it says β two boards showed 35 open issues while the roadmap declared every arc complete, under fully green checks. Three causes produced that gap and only one was a mistake. The drift gate diffs rendered issue bodies, and status appears in no body template, so a row left Todo whose issue closed months ago was zero drift by construction β the gate was doing exactly what it promises, and nothing checked that axis at all. The release close-out existed and ran correctly, but covered only the shipping plan and its parent feature, so a release that satisfied a pre-existing backlog row by opening a fresh plan left the older row at Todo forever: the flow closed what it created and never closed what it fulfilled. And the board had no way to mark work deliberately deferred, so anything adjudicated out of an arc sat at Todo indefinitely. All three are now closed, and the boards went from 35 open issues to 19, each remaining one accounted for. A Parked status joins the field on both boards, added by the additive procedure the design already specified β every existing option resubmitted with its id, the new one without β at zero item churn across all 371 items; parking closes the issue as not-planned, so the open count stays honest while the item stays queryable and visibly distinct from what shipped. A new gate asserts the axis the body gate cannot see: a non-Done row with a closed issue means the vault lags reality, a Done or Parked row with an open issue means the close never landed, and both fail. It was built as a separate reader rather than an extension of the drift oracle, which this design says is never modified from below and which three other modules route through, and it was verified against the pre-sweep vault β the exact state where the existing gate reported PASS β where it flagged precisely the 19 known-stale rows and nothing else. Coalescence item 3 stopped being prose a human was trusted to honor: every GH #N a release body names must now be a closed issue, and fed the real v9.0.2 and v9.0.3 bodies with the issue states as they were, both fail β those releases each named their roadmap id verbatim while the issue stayed open for weeks. The sweep then found two defects in its own tooling, neither of which any exit code would have revealed. Four parks reported success and did nothing, because the writer resolved the board item before the close branch and returned early when an exhausted GraphQL quota made that resolution fail, dropping the issue close while the body render still printed its no-op line and the process exited 0 β the close never needed the board at all, and now runs regardless. Then every park that did run left the board reading Done, because the Projects auto-close workflow runs in both directions: closing an issue forces its status to Done, so a Parked written beforehand was overwritten moments later by the park's own close. Parked sticks perfectly well on an already-closed issue, so park now closes first and writes status after, an inversion that applies to parking alone and is pinned by tests in both directions. A parent-closes-when-all-children-close rule was evaluated and rejected: "all children closed" is vacuously true of a childless container, so the rule reduces to closing every container with no children, which would have closed a genuinely open row while still leaving V6 open, since V6 has a live child β it would have fixed none of the four containers it was proposed for |
crickets v3.36.0 (PR #220) | Post-arc boardβroadmap reconciliation |
| 2026-08-01 |
An issue can be tracked on the board without the board rewriting it β board sync assumed the vault owns every issue body it tracks, which is what made "the board body differs from the render" safe to auto-correct. Five real, open issues on agentm's board broke that assumption: a human had written each one in full, with scope, out-of-scope, rationale and cross-impacts, while every board template renders a single-line digest. They were absent from the vault source, so every drift run called them orphans β and reconciling them the obvious way turned out to be a trap. An orphan is inert, never auto-corrected; a vault-backed item reclassifies to an update, which the corrector does execute. Quieting the drift report is what armed the destruction of the thing being reconciled. The edit was made, caught in a dry-run, and reverted before anything was overwritten. An item can now declare body_owner: "github", meaning the live body is authoritative: it is tracked in the vault, syncs status and board membership, and never produces a body write. Creating a new issue is unaffected, since an item with no issue yet has no human body to protect. An unreadable live body does not defeat the guard either, which is a deliberate inversion of the surrounding rule β for a vault-owned item, not knowing the live state means don't assume no-op, but for a human-owned one it is the strongest reason to leave it alone. Because the guard makes these items emit no drift line at all, they are reported in their own section rather than dropped, on every path including the clean one; an item absent from every report is indistinguishable from one nobody tracks. A richer template was rejected: copying that prose into the vault would duplicate the source of truth and recreate the drift one level up. The build also produced a sequencing lesson worth keeping β the flag means nothing to a plugin copy that predates it, proven against a scratch vault copy where the installed older plugin still emitted the destructive edit, so the vault backfill had to follow the guard being installed rather than merely merged |
crickets v3.35.0 (PR #218) | Follow-up from the post-arc board reconciliation |
| 2026-08-01 |
The lifecycle design records that a second listener joined its phase-close events β post-work and post-release fire agentm's orchestration bridge, and until this landing the crickets design describing them said they did one thing: reflect the session and refresh skills. agentm has since hung crystallization's phase-close trigger on the same two events, so they now also stage a bare candidate for later distillation. Nothing changed on the crickets side β work.md and release.md still just fire the bridge, and both keep their always-exit-0, non-blocking contract β but a reader should not have to cross into agentm's own design to learn that these events do two things now rather than one. Recorded as an amendment rather than a rewrite, since the original entry's reasoning still holds exactly as written: a second consumer joining the same events changes neither the events nor their contract, only what happens once they land |
crickets v3.34.1 (ce52c41) |
Cross-repo docs follow-on to agentm v9.4.0 |
| 2026-08-01 |
Recall-history rows expire on a 90-day clock β recall trace widened every row of recall-history.jsonl with the path each hit came from, which is what makes the reader useful and also means a row names the vault directory a note lived in. Nothing ever removed one. That release's pre-tag security review accepted the disclosure on the explicit condition that a retention policy follow, and wrote the condition into the design's Risks section rather than trusting it to memory; this closes it. Rows now expire by age, swept from record_recall()'s own write path, with a 25 MB ceiling behind it. Age was chosen over redaction because it subsumes it β a row naming a note deleted six months ago disappears because the row is six months old, with no vault lookup and no target moving while you chase it. Purging by liveness instead (drop rows whose path no longer resolves) reads well and is wrong here: the heat policy's promote/demote and dream's tidying stage both move notes without recording where they went, so an unresolvable path usually means a note alive one directory over, and the sweep would delete history for exactly the notes being reorganized. Dream's dedup and compression never delete sources, and crystallization only removes staging markers, so there was far less orphaning to clean up than the idea assumed β and a note deleted because it kept surfacing wrongly is the highest-value thing a trace can explain, so purging on delete destroys the evidence right when it gets interesting. Enforcement rides the write path rather than a scheduled job on purpose: dream's job template is weekly, ships dry-run, and is not seeded at install, and the repo's only other retention routine has no production caller at all. This codebase has shipped inert triggers twice, so retention hangs on the one function that provably runs, because it is the function writing the rows. The build also turned up a live hazard mid-flight: three test files were driving prompt_submit() against the operator's real production ledger, harmless while the file only grew and destructive the moment pruning existed, so test isolation via an $AGENTM_RECALL_HISTORY override landed before the pruning did. The suite was mutation-tested rather than trusted β four mutations, one of which initially passed because the fixture round-tripped unchanged and had to be strengthened β and smoke-tested on a copy of the real 1,509-row ledger |
agentm v9.6.0 (PR #393) | Follow-up spawned by v9.5.0's security review |
| 2026-08-01 |
The memory hooks read the transcript path instead of computing it β both memory hooks built the session transcript path from session_id by hand. Claude Code sends transcript_path on every hook event and its documentation directs hooks to use it, because the correspondence the formula assumed is not guaranteed. This is hygiene rather than a repair β reflection worked before and after, because marker resolution filters to transcripts that actually exist before applying its exactly-one rule, so the phantom markers the formula produced were discarded correctly rather than resolving to the wrong session. The win is that phantoms stop being written at all, and that a whole class of path-construction bug leaves the codebase. The computed slug survives deliberately as a fallback for hosts predating the field: deleting it would convert "this host is older" into "reflection silently never runs", which is the same outage this repo already took once from the opposite direction. The sweep also found a second live instance of the same defect class β the session cost-capture hook slugged with tr '/' '-' and left dots intact, so every worktree session, the normal shape in this repo, resolved to a directory that does not exist and was skipped |
agentm v9.6.0 (PR #394) | Hygiene follow-up to the 57-day reflection outage |
| 2026-07-25 |
Recall trace β why a memory surfaced β a recalled memory's score breakdown used to exist for one prompt turn only, printed into the injected block and then discarded, so auditing a bad recall meant re-running the query later and hoping the index, the decay clock, and the vault hadn't moved since. recall_counter.py's per-recall ledger already recorded which slugs surfaced on every prompt but had zero production readers and captured no reason why; this release widens the same ledger with the score breakdown recall.py's query() already computes β sim, keyword, combined, rank, lifecycle tier β and ships its first reader, memory-recall trace <slug>. This is the Loose Ends arc's own last rung β a conditional item correctly left untaken when the arc closed at 7 of 8, picked back up whole in its own dedicated session β and it went through three review passes that each found something real. A dedicated design review (a separate Opus pass, before any code) caught four things wrong in its own first draft: a production reader the draft implied already existed but doesn't, slugs that collide often enough in the live vault (6,028 notes, many repeated basenames) to need path stored alongside them, a naive filter-by-membership capture method that misattributes evidence under exactly that collision, and a promised backward-scan the draft would not actually have implemented. The build then caught two more, both flagged as separate follow-ups rather than fixed inline: a pre-existing test suite that has been writing rows into the real production ledger instead of a mock, and the pinned retrieval eval's query set drifting stale against the live vault (4 of its expected-notes paths no longer resolve), neither this diff's fault. A pre-tag adversarial review β run after merge, before the tag β then caught a real crash: the new reader only guarded malformed JSON syntax, so a shape error or invalid UTF-8 anywhere in the ledger raised an uncaught exception instead of degrading honestly; fixed same day, with tests reproducing all three failure shapes. The same review surfaced a second gap, this one left open on purpose: each hit's stored path discloses vault directory structure, with no redaction tied to a note's later deletion or move. The operator reviewed it, judged it low-severity on this single-user, single-machine deployment where hashing or stripping the path would only defeat the reader's whole purpose, named it honestly in the design's Risks section, and spawned rotation/redaction as a separate follow-up rather than shipping the gap silently |
agentm v9.5.0 (PR #389) | Loose Ends Release 8 of 8 ("why a memory surfaced") |
| 2026-07-26 |
The crystallization trigger shipped inert, and a check against reality caught it β v9.4.0's trigger could not fire in any repo that had ever reflected two sessions. It resolved which session just closed by reading marker files, and counted the .reflected dedup markers that legitimately accumulate for thirty days as competing live sessions, so it always refused rather than guessing. Every test fixture carried one or two markers, so none modeled a repo with history, and the mutation pass that preceded it checked whether the code did what the design said rather than whether the design was right. Found by dry-running the shipped feature against the real vault, which held 111 such markers. Staging now runs ahead of reflection and reads only live in-progress markers, trading a per-commit counter for a resolver that does not decay as a repo ages |
agentm v9.4.1 (PR #388) | Loose Ends follow-on |
| 2026-07-26 |
Crystallization's phase-close trigger, and a 57-day-old reflection defect it depended on β the trigger had been parked since 2026-07-07 on the premise that "the close of a completed exploration" named no bounded, detectable event in this codebase. That premise expired: crickets shipped a phase-dispatch bridge firing after every /work task and every /release. The design pass locked nine calls β the trigger stages a bare marker rather than judging or composing a digest, since the chain that fires cannot dispatch a model to do either β and checking whether the marker-resolution rule was even satisfiable surfaced that session reflection had never run once in this repo: both memory hooks doubled a leading hyphen in the transcript path, matching no real directory, for 57 days, under a fully green CI battery that mirrored the same bug in its own test fixtures. Both fixed; the trigger built against the nine calls; 110 recoverable sessions from the backlog reflected by hand, with the ~10 confirmed false-positives (the scanner mining its own docstring as if a user had said it) removed |
agentm v9.4.0 (PR #384, PR #385) | Loose Ends follow-on |
| 2026-07-26 |
The last lint walker catches up to _opinions/ β v9.3.0's own build tracked one out-of-scope gap rather than fixing it: dream.py excluded _opinions/ from its general dreaming stages, but vault_lint.py and frontmatter_validator.py β both of which claim to mirror that exclusion set β had gone one-way and kept walking it. A served supplement is text the agent reads as its own standards, so no lint stage may touch it, and a lane entry's bespoke frontmatter shape would have flooded both walkers with false findings once real content lands there. Both walkers now exclude it, frontmatter_validator.py's set absorbs its inline _archive special-case so its "mirrors exactly" claim is true again, and a new parity test pins the three-way mirror so a directory added to one list can't silently go missing from the others |
agentm v9.3.1 (PR #382) | Loose Ends follow-on |
| 2026-07-25 |
Standards that learn from you, part 2 β the accumulate loop's Stages 2-3 β v9.1.0 shipped the classifier and stopped there, since the landed spec for what came next was a design amendment rather than something buildable. A design pass closed the seven holes as ten locked calls: the signalβopinion map is retired outright (its sources emit nothing machine-readable) in favor of the classifier already shipped, and promotion into a served supplement is confirm-gated through one supervised window before it can ever auto-apply. The build then shipped all ten in one new dreaming stage β a recurrence gate (same-opinion difflib clustering at 0.85 similarity, gated on two distinct sessions), a narrow contradiction check that parks a suspected base conflict as a proposal rather than serving it silently, and composition that regenerates the served supplement wholly from the lane every cycle. A reconciliation pass flipped both design docs' [PENDING-IMPL] markers to as-built, and this release's own wiki sweep caught and fixed two more stale mentions in a third design |
agentm v9.3.0 (PR #379, PR #380, PR #381) | Loose Ends Release 6 of 8 ("standards that learn from you"), part 2 |
| 2026-07-25 |
Loose Ends Release 5b β the prose items β retried the 3 parked reference pages through the cross-model prose pass: Queue-Status-Lite.md applied clean (with two small hand-corrections found during verification), Vault-Lint-Checks.md rejected after the revision dropped a real severity value from its own enum (confirmed against the code) plus other precision losses, persona-tier-schema.md accepted as-is after failing the structural contract for the third time. Also re-verified a pre-existing queued plan for a memory-first prose reframe against live content rather than its age β most of its 6-task scope was already done by later work, and the operator's own global config needed no changes at all; fixed the 3 files that were genuinely still stale (harness/principles.md's principle ordering, the README/Home hero block, Phases.md's opening line) and retired the queued plan with the full reasoning recorded |
agentm v9.2.2 (PR #376) | Loose Ends follow-on |
| 2026-07-25 |
The orphaned phase_dispatch bridge gets a caller β agentm's V5-5 orchestration bridge was built, tested, and documented since the last arc, and called by nothing: the plugin that used to call it (development-lifecycle) was retired, and development-lifecycle never grew the wiring. On Claude Code the Stop hook reflects every session regardless, so the gap went unnoticed there; on Antigravity, which has no Stop hook, this was a real behavior gap, not redundancy-with-a-fallback. crickets' agentm_bridge.py gained a sixth verb, phase-dispatch, honoring the design's own re-audit trigger (extend the merged dispatcher, don't start a new bridge file) for the second time β work.md now fires post-work after each task's commit, release.md fires post-release after the release lands |
agentm v9.2.1 (PR #373) + crickets v3.34.0 (PR #214) | Loose Ends follow-on |
| 2026-07-25 |
eval_v6_retrieval.py fails loud on drifted expected-notes β the sibling of v9.0.5's eval_v6_graph.py fix. The query set's expected_notes paths hadn't all survived an archive move, and the retrieval eval reported a confident-looking recall number for those queries with no signal that the ground truth itself was gone β measured zero looked identical to measured nothing. Confirmed live before fixing: 4 of 22 real queries were already affected. run_eval() now checks every expected path against the vault and fails loud (exit 1 + a failing JSONL record) on any drift. No pinned-baseline file added: this eval scores against a live, continuously-growing vault, so an absolute historical floor would be noisy for reasons unrelated to retrieval quality β recorded as dropped, not deferred |
agentm v9.2.1 (PR #373) | Loose Ends follow-on |
| 2026-07-25 |
Crystallization you can actually run β crystallization distils a finished exploration into a five-field digest (question Β· investigation Β· findings Β· lessons Β· open threads), and had described itself since it shipped as "the callable an operator invokes once an exploration is judged closed" β but with no argparse and no __main__ block it was importable-only, so an operator could not in fact invoke it. It now has a command line: write takes the five locked sections from a file or stdin and writes the entry, read parses one back, a malformed digest names the section it's missing, and a slug already taken reports plainly while leaving the original untouched. The automatic phase-close trigger the roadmap named was NOT built and stays [PENDING-IMPL] β re-checking found the design deliberately deferred it, with reasons that still hold: "the close of a completed exploration" names no detectable event anywhere in the codebase, composing the five fields needs a sub-agent the background chains structurally cannot dispatch, and a real trigger would need a crickets-side change too. What shipped is the design's own stated next step, the thin manual path in the same order /dream and forward learning already followed. Also corrected a false doc claim found while scoping: the auto-orchestration page stated the crickets developer plugin calls in through the phase_dispatch() bridge β that plugin was retired and its replacement has zero references, so post-work reflection and post-release skill-refresh don't fire at phase boundaries at all; the Stop hook still reflects every session, which is why nobody noticed |
agentm v9.2.0 (PR #370) | Loose Ends Release 7 of 8 ("auto-summarize finished work") |
| 2026-07-24 |
Standards that learn from you (Stage 1) β the first piece of the accumulate loop. The nine coded opinions (done, good, efficient, how-we-engineer and the rest) have always been able to carry a learned supplement on top of the base, but nothing ever wrote one and nothing in production told the resolver where to look. Both ends now close: reflection recognizes a lesson that reads as a rule about how work should be judged or done and routes it to personal/_opinions/<name>/ instead of general memory, and opinion_resolver takes a --supplement-dir so a caller can point it at them. The classifier is deliberately narrow β a candidate must read as a rule and be about doing work, which is what separates a standard ("always run the gates before committing") from a preference wearing the same grammar ("always use dark mode") β and anything it can't place confidently takes its normal path, since over-routing puts noise in front of the standards the agent works to while under-routing costs nothing. Voice lessons never route; the spec forbids double-capture. Nothing is ever written into a coded base opinion: supplements land as proposals in their own lane, so the extend-never-override guard holds by construction rather than by a guard that isn't built yet. Stages 2-3 were deliberately not built β the landed spec is a design amendment rather than an implementable design, with a signalβopinion map that keys on sources emitting nothing machine-readable plus six further holes needing design decisions, all recorded rather than guessed at. Retrieval eval unchanged (R@5 0.3258, avg-rank 1.625) |
agentm v9.1.0 (PR #367) | Loose Ends Release 6 of 8 ("standards that learn from you") |
| 2026-07-24 |
Engine tidy-up β a batch of small engine tails, reshaped by re-checking each one against live code before building it. Every kind: value in the memory vault is now canonical, closing a cleanup parked since the kind registry first shipped: an audit over 3,069 files found 30 non-canonical values β 15 with descriptive prose sitting inside the field (handoff-artifact (verdict memo)) and 15 well-formed but unregistered β and took them to zero. arc-index, dir-index and pilot-index joined the registry's existing *-index family; capture joined it too rather than being remapped, because the capture pipeline writes it by default and remapping the single live instance would be undone by the next capture. Also fixed eval_v6_graph.py, which printed its own "the fixture has drifted, these numbers aren't trustworthy" error and then exited success β a recall figure below the pass bar is a real measurement that reports through the run record, but a missing fixture file means there is no trustworthy measurement at all, so those now exit differently (the existing test called main() and discarded its return value, so it passed against the bug). Recorded the current organic-connectivity figure, 30.0% of 590 notes, against a design that still read "starts at 13.8%". And dropped the vault-path config-resolution dedup from the backlog outright: the repo's own one-way-import and vendored-parity gates require the copies that item proposed removing, so it was a wrong premise rather than pending work |
agentm v9.0.5 (PR #364) | Loose Ends Release 5 of 8 ("engine tidy-up") |
| 2026-07-24 |
A smooth first run for newcomers β added the onboarding page a newcomer needs before their first background dispatch: dispatching through Agent View spawns its own process, so it doesn't inherit the ambient auth an interactive host injects per session, and needs claude auth login run once on that machine. A real acceptance run diagnosed this months ago and the autonomy design's own re-audit note asked for it to be named in onboarding docs; nothing in the wiki mentioned Agent View or claude auth login until now. Shipped as a tutorial-mode sequel to "Your first install", linked from the How-to index and sidebar. Also fixed a real locking bug found while shipping it: this release's own three-markdown-file PR kept failing the Windows CI leg on a concurrency test it could not touch, twice consecutively β vault_lock.py told a genuine permission problem apart from a Windows mkdir race by checking whether the lockdir existed right after the failed mkdir, which is time-of-check-to-time-of-use (the holder can release in that window, so pure contention reads as a permissions failure and the loser raises a PermissionError that never happened). It now discriminates on the timeout it already has. Affected any caller under contention, not just tests |
agentm v9.0.4 (PR #361) | Loose Ends Release 4 of 8 ("a smooth first run for newcomers") |
| 2026-07-24 |
Works on every OS and install mode, part 2 β pwsh hook parity β install.ps1 -Scope user never merged installed hooks' settings fragments into settings.json, so even after part 1's directory-layout fix, hooks still never fired on a Windows user-scope install. Ported install.sh's equivalent merge function to pwsh. The four new .ps1 hook-firing test twins this release adds β the first tests to ever exercise these hooks on PowerShell β found two more real bugs immediately: a PowerShell array-to-string coercion bug that predates this entire release ladder, silently collapsing harness-context-session-start.ps1's multi-line plan discovery into one unparseable line (confirmed on real Linux and macOS CI before being fixed), and a Windows-specific bug where PowerShell's automatic $HOME variable doesn't follow an overridden HOME environment variable (it's derived from the OS user-profile API instead), fixed across the three hooks that read it directly. Also confirmed --mcp-server has no PowerShell equivalent (it's inherently macOS-only) β flagged as a real, low-severity, separate follow-up rather than built here |
agentm v9.0.3 (PR #359) | Loose Ends Release 3 of 8, Plan B of 2 ("works on every OS and install mode") |
| 2026-07-24 |
Works on every OS and install mode, part 1 β the matrix β built out the install-mode Γ OS test matrix (--scope user had zero end-to-end coverage on any OS before this). That new coverage found a real, previously-undiagnosed bug: --scope user release-mode installs have laid harness/agents, harness/skills, and harness/hooks out flat instead of nested since the original implementation (V4 #30 task 8), breaking every real machine-wide install without a source clone. Fixed in both install.sh and install.ps1; both smoke-install scripts now force release mode via a scratch HOME so this exact local blind spot can't mask a regression again. Also found: the four Linux/Mac-only verify-*.sh scripts this release meant to backfill onto Windows all hit the same git-bash/native-python3.exe path-translation issue in real CI β escalated-and-parked with the blocker documented, not guessed at further. Plus --local-state coverage on pwsh and a macOS test-install.sh backfill |
agentm v9.0.2 (PR #358) | Loose Ends Release 3 of 8, Plan A of 2 ("works on every OS and install mode") |
| 2026-07-24 |
A clean install, proven β Hardening II's acceptance gate closes β ran the post-FRIDAY cold-install acceptance sweep (locked call β ) against a genuinely fresh checkout: the base install/update/local-state contract, all 7 heavy-tier checks (real-embedding recall, a live MCP daemon round-trip, fault-injection negatives, the cold-install dogfood, both B3 dashboard/gate criteria, telemetry-rollup idempotency), and a manual zeroβfirst-recall exercise. 11 of 12 sub-checks passed clean on the first run. One real defect found and fixed: recall.py query's CLI subcommand defaulted its time budget to the interactive UserPromptSubmit hook's tight 300ms window, which a cold embedding-model load routinely exceeds, so a genuinely bare install's first recall silently returned nothing β the exact symptom an earlier acceptance pass (AA4, 2026-07-08) flagged without diagnosing. Also corrected the record for two Loose Ends sweep-inventory items (an installer vault-detection probe bug, an install-state-sync symlink bug) that were already shipped years ago |
agentm v9.0.1 (PR #355) | Loose Ends Release 2 of 8 ("a clean install, proven") |
| 2026-07-24 |
Release and generator polish (Loose Ends arc, crickets errand lane, parallel to the agentm lane) β /release and ship-release gain a close-out check that prompts confirming whether a release's governing living design needs updating, keyed off the plan's own touches_architecture: flag; the generator gains a Claude Code marketplace rename tombstone (a renamed_from: group.yaml field feeds a renames map in the built marketplace.json, Claude Code v2.1.193+, so an install on a renamed plugin's old name resolves natively instead of plugin-not-found), proven with two real cases (wiki, single-hop; tokens, two-hop chain) β closes crickets #41's v3.x residual. Bundled in the same tag: a prior, separately-merged fix (#210, 2026-07-19) hardening worktree-slot integrity against a silent fake-slot bug, whose own version bump had been deferred to this release |
crickets v3.33.0 (PR #213) | Loose Ends crickets errand lane |
| 2026-07-24 |
The version catches up: FRIDAY's major β per the versioning ladder, the major version number now equals FRIDAY's completed era, the same version-correction shape v7.0.0 used for V6/V7. Also the first release of the Loose Ends cleanup arc: fixed the FRIDAY-declared-complete row's date and the contradicting roadmap-era decoder row on this page, corrected ROADMAP-MASTER.md's stale V6-5/V6-17 open-flags, reconciled two 2026-07-18 FOLLOWUPS.md security-auditor entries and one self-contradicting FOLLOWUPS.md entry, and triaged both queued-plans holding pens (7 stranded repo plans + 7 stale vault-staged copies deleted; 2 genuinely-pending plans re-staged to the vault). No engine code |
agentm v9.0.0 (PR #352) | Loose Ends Release 1 of 8 ("the record reads true") |
| 2026-07-23 |
FRIDAY declared complete β the P6 arc-exit demo passed, operator-run, on the real machine and vault: a phone capture staged via the Capture project's Drive-connector inlet, promoted to permanent memory, then surfaced automatically in a brand-new session by the recall hook (the capture design's own named acceptance test); dream.py's connectivity + browse-surface meters run for real for the first time since they shipped (the prior cycle predated the meter β a genuine never-measured β measured delta); and all three Delivery channels (session-start line, on-device notification, daily digest email) confirmed firing live, surfacing along the way that the notification and email job manifests had never actually been registered on this machine despite the opt-in config being set months earlier β a real gap the demo closed, not a formality. All 9 FRIDAY ladder features (7 agentm-lane + /open + wake-the-dormant-libraries) now shipped; both FINAL designs launched; Hardening II's locked call β unlocks; v9 opens |
β | FRIDAY arc-exit declaration |
| 2026-07-19 | Wake the dormant libraries: forward-learning runs for real against five operator-approved research sources (Anthropic, OpenAI, DeepMind, DeepSeek, Moonshot AI), each paper individually reviewable rather than one candidate per source β RSS/Atom parsing with per-source category filtering, headless-Chromium rendering for the labs whose research listing is JS-only, and a GitHub API path for labs that ship papers as repos rather than blog posts, none of it a hard new dependency (Playwright is opt-in, degrades gracefully when absent); a cross-scan dedup keyed on each item's own identity (permalink for a feed item, content hash for a whole-page source) keeps the daily cycle small once the initial backlog is seen. dry_run flipped off on the operator's explicit go β the daily runner cycle now finds real findings, not a no-op. This is the last FRIDAY ladder feature; the arc-exit demo is next |
agentm v8.10.0 | F1-REAUDIT D5, FRIDAY ladder feature 9 of 9 (final) |
| 2026-07-19 | Fix duplicates and broken links (FRIDAY ladder feature 7, auto-organization part 3 of 3, closing out the whole 3-part design) β a write-time dedup guard reinforces an exact-fingerprint match instead of writing a new _1/_2 suffix file; a cluster-aware weekly pass collapses whole suffix families (fingerprint-exact deterministically, fuzzy matches behind a cheap-model verdict seam that stays unreachable until a model tier exists); inbox triage folds into the weekly dreaming cycle as a sibling sub-run instead of waiting on an operator-invoked command; ambiguous dedup/merge candidates surface on a needs-your-eye list across the console, the digest, and the morning brief rather than being forced; a capped drain works down the existing suffix-family backlog with a persisted rotation cursor so nothing past the cap starves forever; a new lint engine (/memory lint) reports orphans, broken links, contradictions, and quality scores, and auto-repairs the one safe case β a mis-cased wikilink with a single unambiguous target; the connectivity and browse-surface meters now land in the digest every cycle and in the health dashboard's memory freshness+experience axis (no literal ninth "FRIDAY" family exists); and the remaining automation guards close out the design β the anomaly breaker generalizes from tidying-only to also watch suffix_backlog_drain and lint, a graph-snapshot cross-check catches drift between the persisted snapshot and a live re-extraction (which required reordering the weekly cycle so lint runs before link-improvement's own full-vault rebuild), and a sampled higher-tier audit narrows the ambiguous linking band automatically once disagreement crosses 20% β all deterministic-only today, since no higher-tier-model primitive exists anywhere in this codebase yet, a named and tracked gap rather than a silent drop. Two adversarial review passes caught real bugs along the way: a starvation bug in the cross-check's first fixed sort-and-slice sample (fixed with a persisted rotation cursor mirroring the link-backfill's own pattern) and a cross-stage auto-apply collision where two auto-apply stages could act on the same note in the same cycle (fixed with a same-cycle path-overlap guard in dream_confirm.auto_apply_batch). This closes out the entire 3-part agentm-auto-organization.md design β its status flips from final to launched β and is the last agentm-lane feature in the FRIDAY ladder before the operator-run arc-exit demo |
agentm v8.9.0 (PR #340) | FRIDAY ladder feature 7 of 7 (auto-organization part 3 of 3 β design closed) |
| 2026-07-18 | Notes that link themselves (FRIDAY ladder feature 6, auto-organization part 2 of 3) β a newly saved note picks up to three [[wikilinks]] to its nearest neighbors under a Related line; a weekly link-improvement sweep joins the dreaming pipeline as its sixth stage (both-direction links for confident matches, auto-applied and revert-logged); the ~880-note unlinked backlog drains 25 notes per cycle with starvation-proof rotation; ingest batches link outward only (their reading-order nav already links them internally); and every dream digest now prints organic connectivity separately from the linker's own generated-link count so the linker can't inflate the number it's judged by. Two pieces of infrastructure landed underneath: the vector index's first nearest-neighbor query (vec_index.nearest()) and a persisted, incrementally-rebuilt typed-edge graph snapshot (graph_snapshot.py). The write-time linker runs at drain time, not inline in the save call β the inline version made every save trigger a real model load and a live network round-trip (confirmed twice, including a failed HF_HUB_OFFLINE workaround), so linking reuses the embedding drain already computes and saving stays genuinely fast. Two adversarial review passes caught five real defects before merge (a TOCTOU race, a non-idempotent double-apply, a self-consuming staleness signal, fence-unaware Related-line merging, a pair-dedup bug dropping confident reverse-direction matches), all fixed with regression tests. The cheap-model band for ambiguous-similarity candidates ships as an explicit always-unavailable seam rather than being built β no budgeted synchronous model-call primitive exists in the codebase β so the band degrades to "left unlinked," the design's own named fallback |
agentm v8.8.0 (PR #339) | FRIDAY ladder feature 6 of 7 (auto-organization part 2 of 3) |
| 2026-07-18 | Old notes out of the way: the tidying stage (FRIDAY ladder feature 5, auto-organization part 1 of 3) β a stepped rank-curve retune for decay scoring lands shadow-mode only, gated behind a new --decay-curve eval mode before it can ever drive live ranking; a memory archive move (5y of silence, a 4.5y digest preview first) and an artifact shelf (1y untouched, bidirectional β a shelved artifact returns automatically once touched again) share one tidying stage in dream.py, both auto-applying with no confirm gate since every move is a revertable delete-and-write pair; a new --include-archive flag on recall.py is built from scratch (the plan wrongly assumed it already existed); and an anomaly breaker applies nothing from the tidying stage on an abnormal spike rather than a capped partial batch. Task 4 hit a genuine design gap β no mechanism existed in the codebase for "any injection into a conversation counts as a touch" β resolved by an operator ruling to reuse recall.py's existing access-tracking instead, scoped to entries with no kind: field. Windows CI caught a real bug after the PR opened: lifecycle.py's decisions/ archive exemption silently broke on Windows, where a PurePosixPath(str(rel_path)) call mishandled backslash-separated paths on a real Path object; fixed with a plain Path(rel_path) call. Pre-existing since 2026-07-07, not introduced by this plan β this plan's own new test was the first caller anywhere to exercise it with a real Path object instead of a hand-written string |
agentm v8.7.0 (PR #337) | FRIDAY ladder feature 5 of 7 (auto-organization part 1 of 3) |
| 2026-07-18 | Capture from your phone: the ingest sweep, capture part 3 of 3 (the capture trilogy's final part) β an hourly runner job (harness/skills/memory/scripts/ingest_sweep.py) that gives forwarded links and documents in _inbox/ full processing with no manual step: fetch (or skip straight to chunking for an already-complete clip), a closed tag:/file-under: act-step grammar (never free-text instruction execution), an idea-ledger fold, and a timestamp re-stamp; automated fetches stage in place and only promote to permanent memory after surviving one full sweep cycle, a mechanism of the sweep's own, separate from inbox triage. A pre-merge /review found and fixed five real bugs, the most significant a pre-existing gap in recall.py/vec_index.py β semantic recall and the drift walk never respected the _inbox exclusion the way keyword recall did β a codebase gap this plan's build surfaced and closed, not one it introduced. Windows CI then caught a sixth: vault_lock.py's mkdir race raises PermissionError on Windows where POSIX raises FileExistsError, fixed in both the top-level and vendored copies |
agentm v8.6.0 (PR #333) | FRIDAY ladder feature 4 of 7 (capture part 3 of 3 β capture trilogy complete) |
| 2026-07-18 | Read and remember articles: /memory ingest <url|file>, capture part 2 of 3 β reads a URL or a local file and writes it straight into permanent memory as one intact full-document note plus reading-order-linked chunk notes for retrieval, unlike capture part 1's _inbox/-only staging writer; a pre-merge adversarial /review (run before the PR this time, not retroactively) found and fixed two real bugs: a mid-sequence slug collision that could permanently orphan partially-written notes on disk, and an HTML-fragment sniff false negative that could leave raw markup in a saved note |
agentm v8.5.0 (PR #331) | FRIDAY ladder feature 3 of 7 (capture part 2 of 3) |
| 2026-07-18 | The inbox front door: memory_capture, a staging-only MCP tool (the server's fourth, alongside memory_search/memory_append/memory_forget) plus a /memory capture CLI verb β every capture now lands in personal/_inbox/ for triage instead of writing straight to permanent memory, the first of three capture-front-door parts; a retroactive adversarial /review before the release cut found and fixed a TOCTOU race where two concurrent writers resolving the same free slug could silently overwrite one candidate with the other |
agentm v8.4.0 (PR #328/#329) | FRIDAY ladder feature 2 of 7 (capture part 1 of 3) |
| 2026-07-18 | Reports that reach you: an opt-in daily on-device notification and an opt-in daily digest email (authenticated + TLS SMTP, works with transactional-email relays like Resend), the two Delivery channels that weren't built yet alongside the already-shipped SessionStart line β dogfooded live, including a real STARTTLS-downgrade credential-leak fix caught by adversarial review before the cut | agentm v8.3.0 (PR #325/#326) | FRIDAY ladder feature 1 of 7 |
| 2026-07-17 |
/open (alias /orient): a read-only conversational verb that locates a project by name across registered repos, the vault, and recall, confirms the match, then renders a short status orientation (what it is, plan progress, recent activity, board state) β absorbs the planned wake-from-state notifier as its successor |
crickets v3.32.0 (PR #209) | F1-REAUDIT goal 5 + goal 6 |
| 2026-07-17 | Observability digest ladder fixed and made visible β a launchd-cd bug meant every background cycle had discovered zero jobs since the runner was first built, so the ladder never ran unattended; fixed, plus a genuine session-start line and /console section replace the always-load dump nobody was reading |
agentm v8.2.0 (PR #320/#321) | #319 |
| 2026-07-17 |
Ideas.md's default path corrected for Drive-synced vault storage |
agentm v8.2.0 (PR #318) | (bugfix) |
| 2026-07-16 | The overnight loop stops self-certifying done β goal_contract.decide() wired into n1_run's done determination, closing the proving retest's central open question (proving-ledger item 19); alongside it, a doctor check for the unattended merge-on-green permission gap, the health scorecard moves off its nightly commit-back workflow, a scoped permission allowlist unblocks unattended fleet dispatch, and the remaining wiki/reference/ pages get a cross-model plain-English pass |
agentm v8.1.0 + crickets v3.29.0 | V8 proving residual 5; V8-19 |
| 2026-07-12 | V8 / Autonomy declared complete, ahead of its proving report by explicit operator decision (report follows post-release); carries the Consolidation arc's follow-ups batch β inbox bulk-review triage (built, backlog cleared, confirm-gate retired), dreaming's expire action auto-applying, the machinery-integrity doctor check, scheduled vault-lint, console composition, and a visitor-wording pass | agentm v8.0.0 + crickets v3.28.0 | V8 / Autonomy declaration; Consolidation arc follow-ups |
| 2026-07-10 | Version numbers catch up to the work: agentm jumps v5.14.0 β v7.0.0 (declaring the V6 and V7 eras complete, publishing this page's own mapping table in the release notes); crickets cuts v3.27.0 (the Consolidation arc's repo-slimming, prose-restoration, and process-codification lanes) | agentm v7.0.0 + crickets v3.27.0 | Consolidation arc, ruling 4 |
| 2026-07-10 | V6-15 typed-object schema-registry (kind audit, frontmatter validator) + V6-18 browse-first MOC generator | agentm v7.0.0 (PR #274) | V6-15 / V6-18 |
| 2026-07-10 |
plan_goal KeyError fix on a plan-less progress entry |
crickets v3.27.0 (PR #180) | V8 (bugfix) |
| 2026-07-09 | Real-vault lint triage (587β561 findings after fixes), PARA/Zettel design-call note, Obsidian graph colorize by kind
|
vault-only, no repo tag | #16 / #34 |
| 2026-07-09 | Autonomy arc lands end-to-end; AG Wave E closes out; AA5 consolidation pass | agentm v5.14.0 | V8, V6, AG close-out |
| 2026-07-09 | AG Waves C+D formally close out; crickets half of the Autonomy arc lands | crickets v3.26.0 | AG close-out |
| 2026-07-09 | Task attribution wired through the observability ledger | crickets v3.26.0 (PR #176) | V8-13 |
| 2026-07-09 | Vector-inclusive re-measurement of the V6 retrieval stack β reverses the previously-shipped vector-less baseline, an honest regression against the project's own merge gate | agentm v5.14.0 (PR #265, AA5 C8) | V6-20 eval |
| 2026-07-09 | Silent-dark family closed: verification-honesty + docs/voice-health families score live or explicit-dark, never silent zero | agentm v5.14.0 (PR #264, AA5 C7) | health scorecard |
| 2026-07-09 | Observability residue trio: attribution tags, morning-report persistence, digest dogfood | agentm v5.14.0 (PR #258) | V8-13 |
| 2026-07-09 | Efficiency health-axis lit, dark-check registry cleaned | agentm v5.14.0 (PR #257, AA5 C3) | #46 token-efficiency |
| 2026-07-08 | AA4 acceptance pass: fabricated bare-install score and a fail-open budget gate both found and fixed same day | agentm v5.14.0 (PR #255/#256) | Hardening II |
| 2026-07-08 | Board tracking model decided: repurpose Track field for dispatch tier |
agentm v5.14.0 (PR #254) + crickets v3.26.0 (PR #175) | V8 |
| 2026-07-08 | Autonomy control plane: fleet-substrate decision, dispatch, board+handoff wiring, launch-time grade statement β real acceptance run, $0.4607 spend | agentm v5.14.0 (PR #251/#252) | V8-15 / V8-16 |
| 2026-07-08 | Observability console: static dashboard, digest ladder, window-park artifact, morning report | agentm v5.14.0 (PR #250) | V8-13 |
| 2026-07-08 | Observability ledger: device-local spend/run event log, split agentm-half/crickets-half | agentm v5.14.0 (PR #249) + crickets v3.26.0 (PR #174) | V8-13 |
| 2026-07-07 | 9-name persona manifest set completed; agentm-side companion close-out | agentm v5.14.0 (PR #239/#240/#242) | AG Wave D |
| 2026-07-07 | Scheduled surfaces: health passes, docs-drift loop, goal-contract anti-gaming guard, /status operator surface |
agentm v5.14.0 (PR #243) | AG Wave E |
| 2026-07-07 | Experience pipeline: forward-learning generalized, crystallization schema, accumulate-loop spec | agentm v5.14.0 (PR #246) | V6-6 |
| 2026-07-07 | Dreaming arc: revert-log primitive, thin /dream, confirm/expire, scheduled job |
agentm v5.14.0 (PR #244) | V7-2 |
| 2026-07-07 | V6 retrieval engine: typed-edge knowledge graph, RRF hybrid retrieval, chunking + time-weighting, consolidation β real-vault recall accuracy roughly doubled | agentm v5.14.0 (PR #247) | V6-1/2/3/4/10/12 |
| 2026-07-07 | Wave C's last box: forward-learning + codebase-improvement watchlist scanner | crickets (PR #173) | V7-4 |
| 2026-07-07 | Persona roster: workflow-step resolver + opinion-consumer conformance sweep | crickets (PR #163/#170) | AG Wave D |
| 2026-07-07 | Idea-search over the recall engine | crickets (PR #156) | AG Wave C |
| 2026-07-07 | Dependabot-fixer + /bugfix cross-wired onto the shared diagnose engine |
crickets (PR #168) | AG Wave D |
| 2026-07-07 | Opinion request-by-name wiring proven on two real bindings | crickets (PR #162/#167) | AG Wave D |
| 2026-07-07 | Session-cost capture, privacy-review skill, Semgrep taint pack, scrub_text.py surface β the single largest PR of the window |
crickets (PR #166) | AG Wave D |
| 2026-07-07 | github-projects doc reconciliation + Planner (TPM) depth-maintainer | crickets (PR #164) | AG Wave D |
| 2026-07-07 | AG Wave C design-and-conventions cluster: coauthor-guard, homeless-conventions migration, 2 new /design rungs |
crickets (PR #160) | AG Wave C |
| 2026-07-06 | 4 new maintenance primitives (deps-currency, cve-security-patch, tech-debt-inventory, content-refresh) | crickets (PR #157) | V7-5/6 |
| 2026-07-06 | Diagnostics engine: fingerprint normalizer, 2-layer recall ladder, scrubbed failure-incident writer | crickets (PR #153, β v3.26.0) | AG Wave C |
| 2026-07-06 | Persona roster grows from 2 to 11 manifests; content-refresh gets its first consumer |
agentm v5.13.0 | AG Wave D |
| 2026-07-06 |
/work//bugfix spawn worktrees via the host's own primitive; the bespoke spawn/integrate scripts are deleted outright |
crickets v3.25.0 | AG process fix |
| 2026-07-06 | V5-14 storage convergence β save/evolve/recall route through the storage seam instead of direct vault calls |
agentm v5.12.0 | V5-14 |
| 2026-07-06 | Persona-tier activation pipeline | agentm v5.12.0 | AG Wave B |
| 2026-07-06 | V6-11 extended memory metadata + hybrid --filter recall + mandatory failure-incident PII scrub |
agentm v5.12.0 | V6-11 |
| 2026-07-06 | Request-by-name Opinion registry (9-name catalog, baseβsupplement compose) | agentm v5.12.0 | AG Wave B |
| 2026-07-06 | AgentM runner core: job manifests, due-decision loop, budget ceiling, throttle watchdog | agentm v5.12.0 | V7-1 |
| 2026-07-05 | Anti-slop voice gate, CI path-filtered matrices, per-dispatch model/effort routing land as backlog from already-completed plans | crickets v3.24.0 | R3 / efficiency automation |
| 2026-07-05 | 7 crickets plugins rename to their settled capability nouns via declared-both-names, no alias map | crickets v3.24.0 | AG Wave A |
| 2026-07-01 | crickets relicenses to Apache-2.0/CC-BY-4.0; all 17 crickets ADRs fold into living-design amendment logs; combined Architecture+Reference page for all 13 plugins | crickets v3.23.0 | AG Phase 1-4 |
| 2026-07-01 |
/work executor moves from Opus to Sonnet for cheaper long build stretches |
crickets v3.23.0 | model+effort routing |
| 2026-07-01 | agentm relicenses to Apache-2.0/CC-BY-4.0 with a trademark policy; local ship-release retires in favor of crickets' unified skill |
agentm v5.11.0 | AG governance |
| 2026-07-01 | 13 new living designs lifted; all 20 agentm ADRs fold into amendment logs; wiki taxonomy narrows from seven sections to six | agentm v5.11.0 | AG Phase 1-4 |
| 2026-06-19 |
auto_orchestration splits into its three natural trigger owners with no behavior change |
agentm v5.9.0 | V5-5 |
| 2026-06-18 |
resolve_plan.py migrates to the designed process-seam bridge instead of an informal reach-in |
crickets v3.22.0 | V5-4 |
| 2026-06-19 | The vault_path config key migrates fully into the obsidian-vault plugin's own settings |
agentm v5.8.0 | V5-7 |
| 2026-06-19 | CI gate blocking hardcoded vault-path literals from re-entering the codebase | agentm v5.9.1 | Hardening I |
| 2026-06-18 | Capability-request matching lands: a backend can now refuse to serve a capability it doesn't have, rather than silently degrading | agentm v5.6.0 | V5-7 |
| 2026-06-18 | The routing plane (project resolution, repo registry, state mode) fully de-vaults onto the V5-1 storage seam | agentm v5.7.0 | V5-6 |
| 2026-06-18 | A proactive PII stand-in rule ships so the reactive scrubber never has to catch a real value | crickets v3.21.0 | developer-safety |
| 2026-06-18 |
recoverability skill: the reversibility-first autonomy doctrine becomes a standing per-session instruction |
crickets v3.20.0 | developer-safety |
| 2026-06-17 | Memory exposed as an MCP server β four tools, bearer-token security, host configs for Claude Code / Cursor / Goose / Claude Desktop | agentm v5.4.0 | V5-9 |
| 2026-06-16 | Team-coordinator persona: the first real composed persona, with plan-graph, standup, readiness, and merge-order tooling | agentm v5.3.0 | V5-11 |
| 2026-06-16 | Capability-discovery resolver (the enhances: runtime) and the persona tier substrate both land together |
agentm v5.2.0 | V5-8 / V5-12 |
| 2026-06-13 | Non-UTF-8 config readers stop crashing instead of failing loud β a correctness follow-on to the storage seam | agentm v5.0.1 | V5-1 |
| 2026-06-13 | AgentM V5 ships: the memoryβstorage seam, the vault-write protocol, the process seam, named plans, and the retirement of the vendored dev loop in favor of crickets plugins | agentm v5.0.0 | V5 |
| 2026-05-25 | Repo rename agentic-harness β agentm, paired with the toolkit's rename to crickets
|
agentm v3.1.0 | β |
| 2026-05-24 | First visual brand iteration: the AgentM logo asset set and a redesigned README hero | agentm v3.0.1 | β |
| 2026-05-24 | AgentM V3 ships: the merged Obsidian+GDrive vault with auto-recall in every harness phase, and the two repos adopt the AgentM/crickets brand framing | agentm v3.0.0 | V3 |
| 2026-05-23 | Quality-gates bundle: one-command install for evaluator, kill-switch, steer, commit-on-stop, and evidence-tracker together | agentm v2.6.1 | #10 |
| 2026-05-23 | Evidence-tracking for /work: a task can't flip done without demonstrably reading the relevant spec first |
agentm v2.6.0 | #9 |
| 2026-05-22 | Auto-context lands in all five harness phases β the first non-doc-only paired release in the run | agentm v2.5.0 | #8 |
| 2026-05-22 |
diataxis-author skill ships in the toolkit, covering the full DiΓ‘taxis-wiki lifecycle |
agentm v2.4.3 | β |
| 2026-05-22 | MemoryVault discovery + mining: five new /memory sub-commands turn the vault from a static store into a living surface |
agentm v2.4.2 | #7b |
| 2026-05-20 | Embedding mode collapses to local-only sentence-transformers, dropping the hosted API option | agentm v2.4.1 | β |
| 2026-05-17 | Gemini CLI dropped from supported hosts, keeping Claude Code + Antigravity | agentm v2.4.0 | β |
| 2026-05-16 |
/plan gains an external-review-handoff option for long plans |
agentm v2.3.1 | β |
| 2026-05-15 |
/release + /setup integrate with crickets' /design skill |
agentm v2.3.0 | β |
| 2026-05-14 |
/work + /release become augmentable with crickets' base operator-control hooks |
agentm v2.2.0 | β |
| 2026-05-13 |
/review becomes augmentable with crickets' evaluator
|
agentm v2.1.0 | β |
| 2026-05-12 | The crickets repo splits off: dependabot-fixer + ship-release move out of agentm |
agentm v2.0.0 | β |
| 2026-05-11 | Three-adapter scope settles, the Codex adapter drops, and the project commits to 1.0.0 semver discipline | agentm v1.0.0 | β |
| 2026-04-23 | DiΓ‘taxis documentation spec ships alongside the new /doctor skill |
agentm v0.9.0 | β |
| 2026-04-21 | GitHub Projects wiring lands, dogfooded end-to-end by the documenter sub-agent |
agentm v0.8.7 | β |
Semver and the roadmap version line use two independent numbering schemes. The roadmap line flows as V4 β V5 β V6 β V7 β FRIDAY β V8. These schemes share digits, but they do not correspond in any other way. This table acts as your decoder. It shows you which tag actually carries the work for each era. You can find full evidence and the six colliding vocabularies in the E4-release-archaeology evidence memo. This memo sits behind the Consolidation-arc review.
| Roadmap era | What it means | agentm tags | crickets tags |
|---|---|---|---|
| V3 | Merged Obsidian+GDrive vault, auto-recall in every phase | v3.0.0 β v3.1.0 | v1.0.0 β v1.1.0 |
| V4 β "Recall, everywhere" | Cross-surface vault access, auto-orchestration push surface | v4.0.0 β v4.15.0 | β |
| Hardening I (#44β#46) | Single-repo-first-class, end-to-end test matrix, token-efficiency-by-default | v4.15.0, v5.9.1 | v3.24.0 (voice gate, CI matrices) |
| V5 β "the unbundling" | Storage-agnostic memory OS + plugin host; the dev loop moves to crickets | v5.0.0 β v5.9.0 (core), v5.12.0 (V5-14 storage convergence) | v3.1.0 β v3.22.0 |
| Architecture-Governance (AG, cross-cutting) | Classification spine, ADR retirement into living designs, the grounded review/plan loop, altitude structure | v5.11.0 (design lift) β v5.13.0 (Wave B/D) | v3.23.0 β v3.26.0 (Wave A/C/D) |
| V6 β "Memory that maintains itself" | Typed-edge knowledge graph, RRF hybrid retrieval, consolidation, the typed-object schema registry | v5.14.0 (core engine), v7.0.0 (V6-15/V6-18) | β |
| V7 β "Memory that works while you sleep" | Absorbed into AG β shipped disguised as the runner, the dreaming arc, and the maintenance primitives | v5.12.0 (runner), v5.14.0 (dreaming) | v3.26.0 (maintenance primitives) |
| V8 / the Autonomy arc β "A team of agents, one memory" | Observability ledger + console, the thin control plane, the board tracking-model decision β code shipped and proven once (a real overnight acceptance run); era declared complete 2026-07-12, ahead of the Consolidation arc's deeper proving report by explicit operator decision β the report follows post-release, against the same rubric, rather than gating the version | v5.14.0, v8.0.0 | v3.26.0, v3.28.0 |
| Consolidation (process, not a roadmap era) | The version ladder itself catches up: agentm's major version now equals its completed roadmap era; this page rebuilt as the combined timeline; ROADMAP-MASTER.md rewritten era-by-era; all 13 window release bodies + 56 window PRs rewritten plain-English | v7.0.0 | v3.27.0 |
| Consolidation follow-ups batch (process, not a roadmap era) | The arc's own tail: inbox bulk-review triage built and the real 1,565-note backlog cleared, dreaming's expire action auto-applies, a machinery-integrity doctor check, scheduled vault-lint, /console composition, a visitor-facing wording pass, and process fixes caught in operator review (a public-content-edit inconsistency, a dry-run-first departure) |
v8.0.0 | v3.28.0 |
| FRIDAY | Hold lifted; the ladder ran to completion β feature 1 of 7 (Delivery channels) shipped; the capture trilogy (features 2β4 of 7: front door, article ingestion, the ingest sweep) fully shipped; features 5β7 of 7 (auto-organization parts 1β3: the tidying stage, write-time linking, then dedup + lint) fully shipped, closing out the whole 3-part agentm-auto-organization.md design. All 7 agentm-lane FRIDAY ladder features shipped, plus /open and wake-the-dormant-libraries β all 9 ladder features now shipped, both FINAL designs launched, and the operator-run P6 arc-exit demo passed 2026-07-23. The arc is declared complete |
v8.3.0 β v8.10.0 (complete) | β |
| Loose Ends (the cleanup arc) | Clears the dangling work earlier arcs left and closes Hardening II: the cold-install acceptance sweep, the install-mode Γ OS matrix with PowerShell hook parity, onboarding docs, the accumulate loop for standards, crystallization's manual path and phase-close trigger, recall trace, and recall-ledger retention | v9.0.0 β v9.6.0 | v3.33.0 β v3.34.1 |
| The rescope and the Hybrid Retrieval ladder | Recall moves into the Go daemon (agentmd): a persistent FTS5 index, the derived chunk, link and entity indexes, and a dense embedder for hybrid search. The Python vector stack is removed, the enrichment pass ships with its corpus-flatness meters, and AgentM stops installing per project. The ladder closes at its measured plateau |
v9.7.0 β v9.8.0, v9.9.0 (the recall verdict) | β |
| Filing v2 | The whole-vault convergence: machine state leaves the vault, each project gets one tree, the corpus migrates into six memory classes, filing is decided at write time, the calendar becomes a daily register, lifecycle and the nightly pass move to the Go binary, and the inbox triage engine retires | v9.9.0 β v9.20.0 | v3.37.0 β v3.37.1 |
| The vault-perfection series (the AgentM Vault design) | The plans of the AgentM Vault design: the night runs, the memory root trims to two folders, every card takes the card shape, root spaces go lowercase, every project becomes a directory of numbered tasks each with a plan, a progress log and a tracker, and the _harness/ directory is gone |
v9.21.0 β v10.0.0 | v3.38.0 β v5.0.0 |
| The AgentKV layout convergence | Four plans carry out the operator's rulings of 2026-09-24: a reference library and a systems space join the vault with one front page per project (Plan A), closed tasks move to completed/tasks/ and crystallize writes its first lessons (Plan B), each memory is saved once and labelled with its project (Plan C), and entity pages are built for repositories, issues, releases and people (Plan D) |
v10.1.0 β v10.3.0 | v5.0.1 |
Reading this honestly: Three separate roadmap eras landed inside the single agentm v5.14.0 "Minor" release. These eras include the last slice of AG, the entire V6 engine, and the whole V8/Autonomy arc. This release contained eleven distinct features under one tag. We created this table specifically because of that compression. The semver number alone tells you very little about which roadmap milestones a release actually completed.
The ship-release skill maintains this page. It appends a new timeline row at every cut. It also updates the mapping table when a release closes out a roadmap era.