Releases: Da7-Tech/mind
Release list
mind v6.2.10 — serializable concurrency and crash-safe recovery
What changed
- Serializes semantic graph operations under one bounded transaction lock, closing stale
dream,correct,link, reopen, duplicate-remember, and concurrent-confirm races. - Adds a crash-recoverable prune outbox so archive and provenance records describe only committed removals and can be delivered idempotently after interruption.
- Hardens project-file handling against symlinks, hardlinks, special files, parent swaps, and transient Windows atomic-replacement races.
- Makes export and dream side effects consistent under concurrency, preserves concurrent signal suffixes, and merges cortex output safely.
- Adds explicit resource ceilings for graph size, queries, history, journals, dream work, and retained artifacts.
- Corrects CLI ambiguity, malformed history/journal handling, terminal sanitization, partial initialization, and documentation claims.
Verification
- 267 unit and regression tests.
- 9/9 CI jobs: Ubuntu, macOS, and Windows on Python 3.9, 3.12, and 3.14.
- Fuzz: 420/420; multilingual: 24/24; discrimination: 12/12.
- Soak: 15/15, 0/256, 8/8.
- Retrieval: recall@1 1.00 at 100 and 1,000 nodes.
- Mutation sample: 46/120 killed (38%).
mind.pySHA-256:7cb64a6bb96824a6ac00d8871b889b02d57526fc9a70cf33488ae443c8bf139c.
See CHANGELOG.md for the full defect and compatibility record.
mind v6.2.9 — independent re-audit closes the stale-decision races
An independent re-audit of the v6.2.8 hardening release: one line-by-line auditor over the whole file, one differential regression hunter that first reproduced v6.2.7's defects to validate the 6.2.8 fixes, one claims-and-channels auditor, plus a full maintainer read of every file. Every headline number of 6.2.8 reproduced exactly before this release changed anything (213/213 tests, fuzz 420/420, recall@1/@5 = 1.00, multilang 24/24, discrimination 12/12, soak 15/15 & 0/256 & 7/8, mutation 39% = 47/120, published sha256 verified from the live tag).
Fixes — each reproduced red with a regression test before the change:
- The last stale-decision races are closed. The merge keeps a per-node disk-freshness baseline (
last_accessed/access_countas of our last disk read) and re-validates stale decisions against the current disk copy inside the lock: a dream computed on a stale view can no longer prune a memory another process confirmed meanwhile (the GRACE_DAYS promise now holds under concurrency), a stale decayed weight no longermin()s down a fresh confirm, and persisting a duplicate-remember confidence upgrade no longer whole-copies stale counters over a concurrent confirm — confidence merges max-wins as its own field, the way counters merge as deltas. - The contradiction scan flags without clobbering: an existing user link between a conflicting pair keeps its relation and earned weight.
recall --atnormalizes compact and tz-aware forms before the lexicographic compare —--at 20260101returned wrong-era results on Python 3.11+.- A hand-deleted END guard no longer costs user content: export leaves the damaged file untouched and reports it, instead of silently truncating everything after BEGIN.
- One duplicate-remember boost number (BOOST_PER_ACCESS) on every path.
- Prune events journal after the save, and only for prunes that actually landed.
Verification on this release: 220/220 tests, CI 9/9 on the tagged commit (Linux/macOS/Windows × 3.9/3.12/3.14), fuzz 420/420, recall@1 = recall@5 = 1.00 at 100 and 1,000 nodes, multilang 24/24, discrimination 12/12, 180-day soak 15/15 core & 0/256 stale & 7/8 hot slots, dream determinism PASS, mutation kill rate 42% (50/120) re-measured on the final file.
sha256(mind.py) = 6dda66fcdb4352fb215f0f285d356e4a110617ff7714f3bdd1d96ab85f766663
mind v6.2.8 — exhaustive hardening audit
A full line-by-line audit of the code, tests, benchmarks, documentation, release metadata, and rendered presentation. Every behavioral fix was reproduced against v6.2.7 first.
Highlights:
- concurrent edges now merge per directional pair; reinforcement deltas and once-per-day edge decay are serialized under the graph lock
- atomic replacement uses unique O_EXCL temp files, completes short writes, fsyncs before rename, and fsyncs the directory on POSIX
- hostile live/on-disk state, timestamps, histories, metadata, and journal reads are repaired or bounded consistently
why <id>scans the full journal for targeted provenance; link events belong to both endpoints; reads refuse symlinks- exported memories are collapsed, guard-escaped, data-labeled, and paired with explicit privacy/untrusted-content guidance
- recall and working-memory tie-breaking are deterministic and usage-driven; CLI arity/path behavior is strict
- the stale competitor scorecard was replaced with a neutral scope comparison based on current official documentation
Verification:
- PR CI: 9/9 green; merged
mainCI: 9/9 green - 213/213 unit tests
- full fuzz: 420/420
- multilingual: 24/24; discrimination: 12/12
- 180-day soak: 15/15 core survival, 0/256 stale junk, 7/8 hot core slots
- mutation sample: 47/120 killed (39%), with all survivors printed for triage
- 20/20 repeated concurrency stress rounds
mind.py sha256: b3e944ce9103bd5e353e09a12f434721cb274bc919326361039104889c6c5e03
mind v6.2.7 — Windows reader retry
The closing auditor caught windows-latest 3.9 red on the 6.2.6 tag: 1 of 12 parallel CLI writers died with Errno 13 reading CLAUDE.md during a concurrent os.replace. The reader side of export_to_agents was the fourth and last member of the Windows sharing-violation family that 6.1.3 fixed for graph.json — both agent-file reads now retry, and a file vanishing mid-race reads as fresh.
CI is 9/9 green on this tag, including windows-latest 3.9 (verified before publishing this release — the lesson is learned).
mind.py sha256: c55594585f8d1dbb944e3ec56b57d6e36dc7c639ceeb0f5621f19ce45c66451b · 190 tests · mutation 45% on this file
mind v6.2.6 — final panel closure
Final panel round on 6.2.5: two auditors returned zero; the third caught one last LOW — the recall footer (and two init/status hints) still printed a bare python3 mind.py ..., the exact field-failure class the exported contract was fixed for in 6.2.0. Every runtime guidance string now routes through the same path resolver as the contract (regression-tested from a non-root install).
The user-journey auditor's bottom line on the original field complaint ("worked all day, memory stayed empty"): it cannot recur — absolute-path contract, self-running dream, and the no-permission rule each verified end-to-end from the live tag.
mind.py sha256: 88b46a8c98ab8c8133d853149bec3b1243d61e7d149d8352443c6a277281ead8 · 190 tests · mutation 45% measured on this file
mind v6.2.5 — distribution-channel closure
The panel's remaining findings were about the release view, not the code — so this release closes the channel itself:
- The tag carries the current docs (6.2.4's two doc corrections had landed on main after the tag — readers of the released tree saw stale figures).
- Fixtures are actually persona-free (the English alias survived the earlier Arabic-only neutralization in 7 test lines).
- graph.json
metais whitelist-bounded — a hand-edited file can no longer grow it without bound (1000-key injection collapses to the whitelist; regression-tested). - Mutation kill rate measured on this exact file as the last pre-tag step: 45% (the deterministic sample re-draws on every code change).
Scope notes, stated plainly: branch protection intentionally has no required PR reviews / enforce_admins (solo-maintainer repo — the 9-job strict matrix is the real guard), and PR #56859 referenced in past notes lives in NousResearch/hermes-agent, not here.
mind.py sha256: bddfd7459f78ad08513646a056961df593111c16e6def70737a2723fffd9afb3 · 189 tests
mind v6.2.4 — panel round 2
Second panel round: three fresh auditors re-broke every v6.2.3 fix and cross-examined all round-1 claims — two returned zero findings (all fixes held: concurrent poison injection, malformed markers, SIGKILL storms, live-tag field simulation end-to-end), one found a LOW display issue, fixed here:
- Correction fusion no longer inherits supersession-transition edges: after an A→B→C→A chain,
why Bshowed two "superseded-by" edges, contradicting its ownsuperseded_byfield. Transition edges mark one pair's state change and stay with that pair. recall/entity/validity were never affected — but provenance must not lie.
mind.py sha256: e1d810634e74ed39920a12e9a9012f8506faad3731f5eb6569becef01a6ca2f9 · 188 tests
mind v6.2.3 — panel round
Three-auditor panel on 6.2.2 (nine methodologies total). One MEDIUM defect found and fixed: a future-dated last_edge_decay marker (clock skew / hand edit / synced graph) froze edge homeostasis forever under max-wins merging — markers are now clamped to today at load and inside the merge, decay resumes next day, no same-day compounding (regression-tested with the exact 2099 attack). Meta values hardened (printable, 64-char cap). The accepted ≤26h present-vs---at divergence is documented at the code site. Mutation kill remeasured on this release: 42% (sample re-drawn when the file changes — wording now says so). Panel also confirmed clean: 20-way concurrency exact counts, 160 SIGKILL crash injections with zero corruption, fuzz 420/420, all symlink classes contained, py3.9 AST-clean, live tag checksum match, zero identity leaks.
mind.py sha256: f6110e423a18dbb9d5f6487b9355470084505b9fb415c70876f0c3196b47230d · 187 tests
mind v6.2.2 — second-review remnants
Second audit round on 6.2.1 — every remnant reproduced before fixing, each with a regression test (185 tests, all benches PASS):
- Order-independent identity ranking: third-person assertions ("the user's name is X") earn facet keys, and co-occurrence expansion can no longer gift identity keys to non-identity facts — the filename-convention distractor can't win "what is my name" in any store order.
- Persistent daily-decay marker (
meta.last_edge_decayin graph.json, max-wins merge) — deleting the day's dream journal no longer re-applies edge decay. - Clean reopen: postgres → sqlite → postgres no longer leaves the live fact wearing a stale "superseded-by" edge.
- Symmetric clock-skew tolerance for
valid_toon present-time checks. signals.jsonlparent-chain check; neutral fixtures; scoped wording.
mind.py sha256: 60ddc63f8f5740aac50bafa5e1ccf1e0ade0218b874e9797e24b6119aeecc141
mind v6.2.1 — fifth audit round
Two independent external audits of 6.2.0 — every claim reproduced-or-refuted before acting (one claim refuted by measurement: CONCEPT_SEED has 83 entries as documented, not 44). All confirmed findings fixed with regression tests (180 tests):
- Identity facets: a stored first-person fact earned ALL identity keys, so "my city is Riyadh" outranked the user's actual name on "what is my name". Facts and facet-naming queries now earn only the facets they state; facet-less queries (who am I) still reach every identity fact.
- Edge homeostasis is once per calendar day — auto-dream can cycle several times a day, and per-cycle decay compounded fast enough to prune healthy edges in days instead of the documented ~45 nights.
- Clock-skew tolerance (26 h) in present-time validity: naive local timestamps synced from a machine east of yours no longer hide a fresh fact until midnight;
--athistory stays literal. - The last unhardened append closed:
signals.jsonlnow uses O_NOFOLLOW+O_APPEND like every other write path; permanence-bearing appends (provenance journal, archive, dream journal) fsync. - Governance: private vulnerability reporting actually enabled, branch protection requires all 9 CI jobs (strict), code of conduct + issue/PR templates.
- Docs precision: ~2,600 lines, mutation kill rate remeasured live at 44%, agent-support claims scoped to the enumerated list.
mind.py sha256: faccb80fdb926e3486151fb312b8cccffaf503d48790c1876dd6cd74b55a5c6c