47 crates, 771 tests green (up from 753 at v0.33.0). Zero new features — pure hygiene. ## kei-shared extract (SSoT for DNA format) New crate `kei-shared` consolidates DNA-parse logic that was duplicated across kei-agent-runtime + kei-dna-index. Both consumers migrated to import ParsedDna / parse_dna / is_hex8 from kei_shared. - 12 tests (10 integration + 2 unit) - kei-dna-index LOC reduction: -60 in parsed.rs (body replaced by wrapper) - kei-agent-runtime preserves lenient DnaError (legacy 4-hex parse path) - Format-string SSoT: kei_shared::compose_dna is sole source ## MEDIUM audit residuals closed (kei-entity-store) A. DDL panic coverage — verified exhaustive match across all 12 FieldKind variants; new test ddl_never_panics_on_any_fieldkind compile-time-breaks if a variant added without test update. B. Update FTS reindex invariant — doc + new update_invariant.rs module with debug_assert validating non-input FTS columns don't drift pre/post UPDATE. Zero release-mode cost (cfg-gated). C. WAL fallback — wal_pragma_fallback_keeps_store_usable test (cfg(unix)) verifies read-only-parent dir doesn't brick Store::open. D. Search Unicode edge cases — 4 new tests (punctuation, emoji, zero-width, mixed RTL). has_searchable_token already correct, no source change needed; tests pin current behavior. Added: residual_audit_smoke.rs (8 tests), update_invariant.rs module. kei-entity-store: 57 → 65 tests. ## Docs drift fixed (count claims → reality) - README.md: "36 crates → 47 crates", "500+ tests → 800+ tests" - PLUGIN.md, docs/INSTALL.md, docs/REFERENCE.md, docs/SUBSTRATE-SCHEMA.md all synced to real counts. - CHANGELOG.md: 6 new version blocks (v0.28 → v0.33) consolidated in existing style. - Historical snapshots (HANDOFF-WAKE v0.29, CONVERGENCE-PLAN, etc) deliberately preserved — they're version-scoped, not drift. ## Known deviation from task spec kei-shared's [workspace] table was dropped (Cargo rejected "multiple workspace roots" when parent workspace pulls via path dep). Crate registered in workspace.members instead. Verified cargo check + test clean in both modes. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
32 KiB
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Entries are generated from the git history via
_primitives/_rust/kei-changelog (a conventional-commits walker).
Regenerate a single version block with, e.g.:
_primitives/_rust/target/release/kei-changelog \
--from v0.14.2 --to v0.15.0 --version v0.15.0 --update CHANGELOG.md
Unreleased
Work in flight on
feat/v0.16-changelog-genand follow-up branches. Only placeholders — no corresponding commits exist yet. Any line that ships must be replaced with the real commit summary before release.
Changed
- primitives (v0.22 —
keiseischema v4, BREAKING marker shape):- Marker schema bumped from v3 to v4. The top-level
brain_path/brain_name/attached_atfields are gone; every[[attachments]]entry now owns its ownbrain_path,brain_name, andattached_at. Consequence: one marker can track multiple brains wired to different clients at the same time (e.g. brain-A on Claude Code at user scope + brain-B on Cursor at project scope).config::AttachRecord::new(attachments)is the fresh constructor; raw struct literals no longer compile. ClientAdapter::post_attach_hintsignature widened fromfn (&self) -> &'static strtofn (&self, brain: &Brain, scope: Scope) -> Stringso adapters can interpolate the brain's name and the resolved scope into the reload instruction. Implementations of the trait outside this crate need to update.- Adapter enumeration centralised in
adapters/_registry.rs::all_adapters.adapter::all()now delegates; the "add a 5th adapter" touchpoint drops from three files to one. Public API ofadapter::all()unchanged.
- Marker schema bumped from v3 to v4. The top-level
- primitives (v0.22 —
config.rsdecomposition):- Schema-migration logic extracted from
config.rsintoconfig_migrate.rs(pure functions onWireRecord→AttachRecord). Time helpers extracted intotime.rswith a 5-test anchor suite covering epoch-0, leap day 2020-02-29, century non-leap 2100-03-01, an arbitrary recent timestamp, andcivil_from_daysdirect invariants.config.rsdrops from 224 LOC to 197 LOC, below the 200-LOC Constructor Pattern ceiling.
- Schema-migration logic extracted from
Added
- primitives/keisei (v0.22 Track A — schema v4 multi-brain marker):
AttachRecordinverted so everyAttachmentcarries its ownbrain_path+brain_name+scope+attached_at. Enables brain-A attached to Claude Code (user scope) + brain-B attached to Cursor (project scope) simultaneously in ONE marker. v1/v2/v3 readers transparent via#[serde(untagged)]— auto-migrate silently on first v0.22config::read()with one-line stderr notice. - primitives (v0.22 —
Scope::AutoCLI default):keisei attach <brain>without--scopenow defaults toauto. Each adapter exposesauto_scope(); Claude Code returnsScope::Projectwhen CWD has.claude/(dir orsettings.json), Cursor when CWD has.cursor/. Continue + Zed stay on user-scope default. Team workflowcd team-repo; keisei attach brainnow picks project-scope without an extra flag.Scope::Autois a CLI-level intent only —attach.rsresolves it to a concreteUser/Projectbefore writing the marker. The persisted marker never containsauto.
- primitives (v0.22 —
keisei mountper-adapter scope resolution):mountnow resolves scope per-adapter viaauto_scope()instead of forcingScope::Useracross the fan-out. A singlekeisei mount braininsideteam-repo/can wire Cursor at project scope and Claude Code at user scope (or both at project, depending on CWD).
- primitives (v0.22 — templated
post_attach_hint):fn post_attach_hint(&self, brain: &Brain, scope: Scope) -> Stringinterpolates the brain name + resolved scope into the per-adapter reload instruction. No more Claude-Code-specific string in the orchestrator. - primitives (v0.22 — adapter registry): new
adapters/_registry.rs(32 LOC) is the single canonical adapter list.adapter::all()delegates. Adding a 5th adapter is one line, one place. - primitives (v0.22 —
config.rsdecomposition):config.rs224 → 197 LOC. Extractedtime.rs(90 LOC —now_utc_string+format_epoch_utc+civil_from_days+ 5 unit tests covering epoch-0, leap-day 2020-02-29, century-non-leap 2100-03-01, arbitrary 2026-04-22, RFC3339 shape) andconfig_migrate.rs(114 LOC —WireRecordv1→v4 migration). - docs (v0.22 — README
## Referencesection): major new section appended before## Runtime hook controls. Documents the actual CLI surface of every shipped component: 25 Rust primitives (clap subcommands + flags + state paths + exit codes extracted from_primitives/_rust/*/src/main.rs), 13 shell primitives (header docstrings + flags), all 10 hooks (event + severity + bypass table), 39 skills grouped into 6 collapsible categories, and a deep-dive on thekeiseiexobrain CLI (real flag matrix, exit codes, env vars, marker SSoT, v0.19 security hardening). Every claim is source-verified — flags not present in code are marked absent, not fabricated. Adds ~670 LOC to README.md; collapsible<details>used for the 39-skill table to keep scroll length reasonable. - primitives/keisei (v0.22 Track C — filesystem-type advisory): new
fs_type.rscube (<110 LOC) classifies the brain root viastatfs(2)on macOS + Linux and returnsFsWarning::{None,ExFat,Fat32,Unknown}. Windows support deferred (returnsUnknownuntilGetVolumeInformationWlands).Brain::loadnow prints a stderr advisory when exFAT / FAT32 is detected — SQLite WAL shared-mmap is unreliable there andkeisei mount(multi-client) WILL corruptkei-memory/kei-artifact/kei-social-storeDBs. Warning is non-blocking — single-clientkeisei attachon exFAT stays supported. New runtime deplibc = "0.2"(unix-only). Two new integration tests (brain_load_on_typical_filesystem_no_warn,fs_type_detection_returns_none_on_standard_fs). - tests/battle (v0.22 Track C — distro matrix): two new Dockerfiles alongside the existing
ubuntu:24.04image.Dockerfile.install-test-alpine(Alpine 3.19 — musl libc, exposes musl-static-link quirks inrusqlite/git2/aws-sdk-s3).Dockerfile.install-test-debian(Debian 12 bookworm — glibc, different apt structure from Ubuntu).README.mddocuments the 3-image matrix and documents known musl-static-link failures as matrix signal rather than regression. - docs (v0.22 Track C — USB guide platform split):
USB-BRAIN-GUIDE.mdrestructured into a TOC + platform-agnostic preamble (prerequisites, exFAT/FAT32 warning, invariants, troubleshooting). Three new platform-specific walkthroughs:USB-BRAIN-GUIDE-macos.md(Gatekeeperxattr,/Volumes/,diskutil),USB-BRAIN-GUIDE-linux.md(/media/$USER/,umount, ext4, optional systemd-udev auto-attach),USB-BRAIN-GUIDE-windows.md(PowerShell, drive letter, NTFS,Dismount-Volume, FS-advisory returnsUnknowncaveat).
Removed
- primitives (v0.22 — dead
Errorvariants):Error::NotAttached— never surfaced;detachprints "nothing to detach" and returnsOk(()).Error::AdapterFailed { client, reason }— never constructed;mount/detachorchestration carried(client, reason)tuples instead. Downstream matches on these variants won't compile against v0.22.
Added (pre-v0.22)
- primitives (v0.21 — keisei SSoT relocation +
Scopeenum):- Marker file relocated from
~/.claude/keisei-attached.tomlto~/.keisei/attached.toml.~/.claude/is Claude-Code-specific territory and should not host cross-adapter keisei state.config::read()performs a one-shot migration the first time it runs under v0.21: if the legacy file exists and the new location is empty, the marker moves over (new file written, legacy file deleted) and a stderr notice is emitted. Scopeenum (user/project) on theClientAdaptertrait. Adapters declaresupported_scopes();config_path(scope),attach(brain, scope),detach(brain_name, scope)are scope-aware. Claude Code and Cursor support both scopes; Continue and Zed are user-only.keisei attachgains--scope=<user|project>(defaultuser);keisei mountstays host-wide (Scope::Userfan-out by design).- Marker schema v3: each
[[attachments]]entry carriesscope = "user" | "project". Pre-v0.21 markers without the field default toScope::Usersilently. New error variantError::ScopeUnsupported { client, scope, supported }fires when a caller asks for a scope the adapter doesn't advertise.
- Marker file relocated from
- primitives (v0.21 —
kei-storereal S3 backend):S3CloudStore— functional S3 / R2 / MinIO / Wasabi backend viaaws-sdk-s3v1. GetObject / PutObject / ListObjectsV2 (paginated) / DeleteObject wired behind the existingMemoryStoretrait (sync-over-async via a single-thread tokio runtime). Enableskeisei attach s3://my-bucket/brain/as a real cloud-mount path, not just a local stub.- Opt-in feature flag
s3on thekei-storecrate — off by default so users who don't need cloud pay zero binary weight. Enabling adds tokio + hyper + rustls + aws-sdk-s3 (~5 MB release binary growth [estimate, E5 — not yet measured; would requirecargo build --releasebefore/after feature flag]). - AWS default credential chain honoured (env vars →
~/.aws/credentials→ IMDS). No new credential format; RULE 0.8 secrets-single-source unchanged. - Endpoint override for non-AWS S3-compat providers via
KEI_STORE_S3_ENDPOINTenv var (runtime) ors3.endpointinstore-config.toml(persistent). Path-style addressing auto-enabled when a custom endpoint is set (MinIO / some R2 configs). - "Branch" semantics: S3 has no native branching, so a branch is modelled as a key prefix (
<branch>/<path>).branch()sets the active prefix in-memory; defaultmain. - Factory auto-routes:
backend = "s3"+ features3+s3.bucketset → real cloud; otherwise falls back to the v0.14 local-manifest stub (still behindKEI_STORE_ALLOW_S3_STUB=1). - Path-traversal guard parity with
FilesystemStore: absolute and..-component paths rejected before keys are spliced.
- tests/battle: Docker-based clean-Ubuntu install test —
tests/battle/Dockerfile.install-test+verify.sh+battle-entry.sh+ README. Builds a freshubuntu:24.04image, runsinstall.sh --profile=<minimal|core|dev|full>under--yes, then asserts post-install counts (blocks ≥ 79, skills ≥ 39, top hooks ≥ 10,_libhooks ≥ 2), runshooks/_lib/test-gate.sh, and validatessettings.json. First real-world "does it work on a fresh machine?" signal — CI previously only ran--no-executedry-runs. v0.21 ship-blocker for any profile that regresses. - primitives (v0.20 — brain schema v2 + per-client hint):
- Brain schema v2 with per-platform
mcp_serverdispatch — a single brain directory can now host binaries for darwin-arm64/darwin-x64/linux-x64/linux-arm64/windows-x64 andkeisei attachpicks the right one automatically. Schema v1 (single string) still accepted for backward-compat. ClientAdapter::post_attach_hint()— per-client reload instruction, no more hardcoded Claude-Code string in the orchestrator.
- Brain schema v2 with per-platform
- primitives:
keiseiCLI MVP —attach <brain-path>+statussubcommands for mounting a portable exobrain directory into Claude Code. First step of the v0.18 exobrain architecture (multi-client adapter surface prepared; onlyclaude-codeadapter ships in MVP). - primitives (v0.19 — multi-client exobrain):
keisei mount <brain-path>— attach a brain to EVERY detected AI client in one shot (Claude Code + Cursor + Continue + Zed).keisei detach— remove the brain from every client recorded in the marker, preserving user's other MCP/context-server entries.keisei list-adapters— tabular dump of every registered adapter and whether it's detected on this host.- 3 new
ClientAdapterimplementations:cursor(.cursor/mcp.jsonproject-local or~/.cursor/mcp.jsonglobal),continue(~/.continue/config.{yaml,json}— YAML preferred, JSON fallback),zed(~/Library/Application Support/Zed/settings.jsonon macOS or~/.config/zed/settings.jsonon Linux, undercontext_servers). keisei-attached.tomlschema v2 — carries a list of[[attachments]](client_type + config_path) instead of a singleclient_type. v1 markers read transparently (auto-migrated in memory).- New error variants:
AdapterFailed { client, reason }andConfigParseError { path, reason }.
- Placeholder: CHANGELOG.md generation wired through
kei-changelog(this file). - Placeholder:
.github/workflows/release.yml— tag-driven multi-platform release. - Placeholder: pre-built-binary install path in
install.sh(KEI_SKIP_RUST_BUILD=1). - added:
kei-mcp-serversingle-binary compile for 5 platforms (linux/darwin/windows × x64/arm64 where available) viabun build --compile— v0.18 Phase 1 of the exobrain distribution architecture. Ships as bare binaries +.sha256sums on every GitHub release;install.shdetects a dropped binary at_primitives/_rust/target/release/kei-mcp-server-<os>-<arch>and skips bun/npm build. Opt-out viaKEI_SKIP_MCP_BUILD=1. See_ts_packages/packages/mcp-server/BUILD.md.
Changed
- primitives (v0.22 Track B —
kei-storeAsyncBackend trait + shared tokio runtime):- New
async_backendmodule (gated behinds3feature) — introduces anAsyncBackendsub-trait (4 async methods:get/put/list/list_recursive+label) and a genericAsyncBackendStore<B: AsyncBackend>wrapper that implementsMemoryStoreon top of any backend. Adding a new cloud backend (GCS, Azure Blob, Bunny Storage, …) is now 6 methods, not a re-invention of the sync-over-async bridge. - Shared process-global multi-thread tokio runtime via
OnceLock<Runtime>— 2 worker threads,enable_io + enable_time. Replaces the previous per-instancecurrent_threadruntime insideS3CloudStore, which caused ablock_onpanic when twoS3CloudStoreinstances in one process interacted across threads (N=2-Store footgun). S3CloudStoreis nowpub type S3CloudStore = AsyncBackendStore<S3AsyncBackend>. Public API (S3CloudStore::new(cfg),.branch(),.current_branch(),.key(),.backend_name()) preserved. NewS3AsyncBackendstruct ins3_cloud/backend.rsholds theaws-sdk-s3::Clientand the bucket name; the sync wrapper handles branch-prefix + path-validation + commit-manifest.validate_rel,short_hash,is_manifest_keyhelpers moved froms3_cloud/keys.rsintoasync_backend(single source of truth for every future cloud backend).s3_cloud/keys.rskept as a thin re-export shim so external callers and its unit tests keep working unchanged.- New deps under
s3feature:async-trait 0.1+tokiofeaturert-multi-thread. No change to the default-feature dep graph. - +7 tests (5 async_backend units +
two_store_instances+runtime_is_multi_thread). Existing 46 tests (31 unit + 9 integration + 6 smoke) unchanged and green.
- New
- Placeholder: plugin / block format refresh targeted for v0.16.0.
Security
- primitives/keisei (v0.19.2 audit polish — M1):
keisei-attached.tomlmarker is nowchmod 0o600on unix (Windows unchanged — no equivalent bit). The marker carries the resolvedbrain_pathand every attached client's config path; restricting it to owner-only closes the residual "other local user can enumerate attached brains" surface. - primitives/keisei (v0.19.2 audit polish — L9): every manifest-sourced string printed by
statusandattach(brain name, brain path, client/config paths) is now scrubbed throughdisplay::sanitize_display, which replaces every ASCII control byte (< 0x20or== 0x7F) with?. Closes the escape-sequence injection surface from a maliciousbrain.namelike"evil\x1b[2Jpayload"that would otherwise clear the user's terminal or rewrite already-printed lines. - primitives/keisei (v0.19.2 audit polish — L12):
manifest.tomlis now capped at 64 KiB (Error::ManifestTooLarge { size, max }). The check runs offfs::metadatabeforeread_to_stringso an attacker-supplied 1 GB file can't exhaust memory inside the toml parser. Legit manifests are ~1 KB; the cap is three orders of magnitude of headroom.
Fixed
- Placeholder: hook-bypass edge case follow-up to v0.15.1.
- primitives/kei-store (v0.21.1 audit wave, HIGH-1):
S3CloudStore::commit()now calls a newlist_recursive(prefix)helper (ListObjectsV2 withoutdelimiter) so every nested key under the branch — e.g.write("traces/x.jsonl", ...)— contributes to the manifest hash. The previous implementation calledlist("")which under the hood useddelimiter="/"and hid all sub-directory writes from the commit, silently breaking hash-stability.commit()ALSO strips any existingmanifest-*.jsonentries from the input so the hash is stable across repeated commits on unchanged data. - primitives/kei-store (v0.21.1 audit wave, HIGH-2):
S3Cfg::access_key_env+S3Cfg::secret_key_envare now wired through to the aws-sdk-s3 builder. When both are set, we resolve the named env vars into an explicitCredentialsprovider and overlay it on the SDK config. Partial configuration (only one of the two set) now returns an error rather than silently ignoring it. Previously both fields were dead — configured users were getting the ambient AWS default chain instead of the named pair. - primitives/kei-store (v0.21.1 audit wave, HIGH-5): all tests that mutate process env on
KEI_STORE_*vars now take a sharedtest_env::ENV_LOCKmutex (exposed undercfg(any(test, feature = "s3"))). Prevents cargo-test parallelism from racing multiple tests on the same env state.github.rsdedups onto the shared lock;s3_cloud/tests.rs+tests/s3_smoke.rsnow use it. - primitives/keisei (v0.21.1 audit wave, HIGH-3):
detach.rs+mount.rsnow scrub every manifest-sourced string (brain name, brain path, config path, client type, error reason) throughdisplay::sanitize_displaybeforeprintln!/eprintln!.status.rs+attach.rswere already compliant; this closes the L9 regression gap for the other two print sites. Two new integration tests (detach_sanitizes_control_chars_in_marker_fields,mount_sanitizes_control_chars_in_error_reason) assert source-level guard presence. - primitives/keisei (v0.21.1 audit wave, HIGH-4): extracted
adapters/jsonmcp.rs(~107 LOC) as the shared JSON merge/remove/persist helper used by theclaude-code,cursor, andzedadapters. All three adapters drop from ~170 LOC to ~105 LOC each and share a uniform error-surfacing contract (Error::ConfigParseError { path }rather than raw serde_json on parse failure).continue_adapter.rsis YAML-based and is unaffected. - security (v0.21.1 audit wave, H1):
scripts/install-actionlint.shnow verifies SHA-256 of the downloaded tarball before extraction. Per (OS, ARCH) hashes are pinned at the top of the script and documented as the output ofchecksums.txton the upstream release page. If a hash is markedSKIP(documented as[UNVERIFIED]pending live fetch), the installer prints a WARNING. Missingshasum/sha256sumis a hard exit 2 — refuses to install an unverified binary. Env overrideACTIONLINT_SHA256_OVERRIDE=<hex>lets CI inject the hash at runtime. - security (v0.21.1 audit wave, H2):
kei-store::s3_cloud::client::validate_endpointrejects loopback / link-local / metadata hosts (127.0.0.0/8,::1,169.254.0.0/16,fe80::/10,metadata.google.internal, etc.) and plain-HTTP URLs by default. Closes the SSRF / IMDS-leak surface where an attacker-controlledKEI_STORE_S3_ENDPOINTpointed athttp://169.254.169.254would cause the AWS default credential chain to sign requests against the instance metadata endpoint and leak IMDS creds. Env overrides:KEI_STORE_S3_ALLOW_INTERNAL=1(local MinIO / tests),KEI_STORE_S3_ALLOW_INSECURE=1(plain-HTTP). When a custom endpoint is set, explicitaccess_key_env+secret_key_envare REQUIRED — the default credential chain is no longer consulted for non-AWS endpoints. - docs (v0.21.1 audit wave, D1):
docs/USB-BRAIN-GUIDE.mdnow warns that exFAT / FAT32 are NOT safe for multi-client attach — SQLite WAL shared-memory mmap doesn't work reliably on those filesystems. Recommends APFS / ext4 / NTFS forkeisei mount. Troubleshooting entry "SQLite corruption on mount-attach" added with recovery steps. - docs (v0.21.1 audit wave, D2): the "~5 MB release binary growth" claim for the
s3feature is now labelled[estimate, E5 — not yet measured]in both CHANGELOG.md and thes3_cloudmodule doc-comment. Prevents over-claim until a realcargo build --releasebefore/after comparison is landed. - scripts (v0.21.1 audit wave, D3):
scripts/validate-workflow-shas.shnow exits 2 when UNVERIFIED pins exist AND noGITHUB_TOKENwas provided (rate-limit path). Previously silently returned 0 which masked incomplete verification in CI. - primitives/keisei (v0.19 audit hardening): close 3 Security HIGH + 3 Critic HIGH + 2 Critic MEDIUM findings. Path-escape guard on
mcp_server+memory/artifacts/manifests(absolute /../ canonical-mismatch →PathEscape); brain-name regex^[a-z][a-z0-9_-]{0,63}$(InvalidName); symlink-rooted brain inputs rejected (BrainIsSymlink— closes USB →$HOMEpivot); MCP-entry collision check across all 4 adapters (NameConflictinstead of silent clobber); dropped unusedrusqlitedep (no C toolchain tail);BrainPaths.{memory,artifacts,manifests}relaxed toOption<String>;$KEISEI_HOME/$HOMEresolver deduped intopaths.rsSSoT;fsx::write_atomicrewritten ontempfile::NamedTempFilefor Windows + cross-fs correctness; 5 adversarial integration tests added (16 total pass). - primitives/keisei (v0.19.2 polish): dropped unused
ClientAdapterimports frommount.rs+detach.rs;Error::NotAttachedandAttachRecord::has_clientnow carry explicit#[allow(dead_code)]markers documenting that they're reserved for future callers / test-only respectively.cargo check -p keiseiis warning-clean; integration suite is 19/19 pass (3 new:marker_file_has_0600_perms_on_unix,status_sanitizes_control_chars_in_brain_name,manifest_too_large_rejected).brain.rsmodule-level doc-comment now lists the v0.19 invariants (path confinement / symlink reject / name regex / manifest size cap) and flags schema v2 as v0.20.
Security
- Pinned all GitHub Actions (
ci.yml,release.yml) by full commit SHA to defend against CVE-2025-30066-class supply-chain attacks via mutable tag re-pointing. - Removed
|| bun installfallback fromrelease.ymlbuild-mcp-binary job — lockfile is now strictly REQUIRED (H4 audit finding). - Added
.github/dependabot.ymlfor weekly SHA update PRs on github-actions, npm, and cargo ecosystems. - v0.20.1 — workflow validation defense-in-depth: motivated by the 2026-04-22 incident where
dtolnay/rust-toolchain@3c5f7ea...SHA-pinned a specific Rust version (1.94.1 branch tip) instead of "install current stable", breaking CI for 4 jobs. Added three gates against the incident class:scripts/install-actionlint.sh(pinned v1.7.12 installer, macOS-arm64 + linux-x64),scripts/lint-workflows.sh(actionlint runner, advisory if binary missing),scripts/validate-workflow-shas.sh(git-ls-remote everyuses: <repo>@<sha40>pin; exits 1 onSHA MISSING, soft-continues on network errors with[UNVERIFIED]),scripts/pre-commit-workflow-lint.sh(symlink-to-install pre-commit hook, fires only when workflow files are staged), and newworkflow-lintCI job running the two validators on every push + PR.
[0.33.0] — 2026-04-23
Wave 16 — parallel consumer wiring. Ledger v6 + cluster-aware prune + DNA-driven fork precedent + three-role pipeline. Consolidates v0.28 → v0.33.
Added
- primitives:
kei-forkwatch-hook auto-collects on.DONEmarker - primitives:
kei-prunecluster-based retirement viakei-dna-indexclusters - primitives:
kei-brain-viewcluster + summary visualization - pipeline: three-role pipeline (Writer → Auditor → Merger) with precedent pre-check
Changed
- kei-ledger: schema v6 — 3 performance indexes +
fork_transactionallibrary API
Snapshot
- 47 crates workspace
- 800+ tests green total
[0.32.0] — 2026-04-23
Wave 15 Option D — DNA adjacency + managed fork primitive.
Added
- primitives:
kei-dna-index— read-only adjacency / cluster / precedent view over the ledger - primitives:
kei-fork— managed git-worktree + ledger lifecycle
Changed
- kei-fork: root path moved to
_forks/(sandbox-writable, kit convention)
[0.31.0] — 2026-04-23
Wave 15 foundation — spawn hardening + entity-store medium fixes.
Added
- kei-spawn:
HttpDriverfeature-flag behindhttp-driver
Fixed
- security:
agent_idpath-traversal validator +safe_joinhardening - kei-entity-store: medium audit fixes (ddl panic, search empty-token, WAL logging)
[0.30.0] — 2026-04-23
Wave 14 — bio-inspired primitives.
Added
- primitives:
kei-prune— bio-inspired retirement of idle agents - primitives:
kei-discover— federated marketplace discovery stub - primitives:
kei-brain-view— brain-state visualizer - primitives:
kei-hibernate— agent hibernation / reawaken lifecycle - primitives:
kei-ledger-sign— signing + verification for ledger rows
Snapshot
- 44 crates workspace
- 713 tests green
[0.29.0] — 2026-04-22
Wave 13 — structural diff, scheduler, watcher + HIGH audit fixes.
Added
- primitives:
kei-diff— RFC 6902 JSON Patch subset (add / remove / replace) - primitives:
kei-scheduler— cron / at / interval metadata primitive - primitives:
kei-watch— filesystem watcher (thinnotifywrapper, sync API)
Fixed
- fts: delete-transaction + archive FTS desync fixed
- kei-dna-index:
UNIQUEconstraint (v5 migration)
[0.28.0] — 2026-04-23
Wave 12 — count refresh + content-store engine promotion.
Changed
- kei-content-store:
CAMPAIGNS_SCHEMApromoted to engine - docs: counts refreshed across README / INSTALL / REFERENCE after v0.23 → v0.27 cluster
0.15.0 — 2026-04-22
Added
- primitives:
kei-artifacttyped handoff pipeline (BMAD-style doc passthrough) (3f303b7) - blocks: 5 cognitive mode blocks + 2 manifest wirings (
fdfc690)
0.14.2 — 2026-04-22
Added
- hooks: runtime controls via
KEI_DISABLED_HOOKS+KEI_HOOK_PROFILE(v0.14.2) (1a448e8)
Removed
- genesis-scan from public kit (internal tool, Bundle-only) (
268226b)
0.14.1 — 2026-04-22
Added
- ci: GitHub Actions workflows +
.claude/worktreesgitignore (407e8b7)
Changed
- readme + install: reconcile all count drift (F4 RELEASE BLOCKER) (
0199fd4) - rust: misc schema/main refactor in 8 crates (assorted CP splits) (
61448b9) - mock-render: split
main.rs227 LOC into 4 cubes (F5a Constructor Pattern) (ad5977d)
Fixed
- kei-auth: remove
--keyCLI flag (F12 HIGH —/proc/cmdlineleak) (b449587) - kei-refactor-engine: retract 'git apply-ready' claim (F1 RELEASE BLOCKER) (
f50ef43) - kei-store: path-traversal guard (F2 RELEASE BLOCKER) + S3 stub gate (F7) + GitHub RULE 0.1 guard (F8) (
ad9c53f)
0.14.0 — 2026-04-22
Added
- primitives: 10 Rust crates extracted from LBM (Genesis-scrubbed) (
a5e6649) - ts-packages: 6 TS packages — MCP server + 5 external-API adapters (
7b647d5)
Changed
- rust-core: Constructor-Pattern splits in
kei-router+kei-auth(afed921)
0.13.0 — 2026-04-22
Added
- integration: deep-sleep wired into MANIFEST + sleep-setup Phase 3b + README (
bcd80f6) - primitives: 4 Rust crates for deep-sleep —
conflict-scan,refactor-engine,graph-check,store(0f75493) - skills:
/onboardauto-project-analyze with 3-mode apply (full-auto / step-by-step / full-manual) (1396139)
Changed
- readme: "Why Rust, not Python" paragraph in author note (
92c918a) - readme: clarify "my sample, not claim of originality" in author note (
47d2448) - readme: add "double sorry" disclaimer in author note (
3d5d768) - readme: move "From the author" to opening, expand with transformer-error context (
fd67315) - readme: add "From the author" note (
b103c3d)
0.12.0 — 2026-04-22
Added
- integration: Phase A incubation wired into trigger + install + README (
d72de64) - skills:
/sleep-on-it6-phase wizard +kei-sleep-queueCRUD + incubation prompt (30df6cb)
0.11.0 — 2026-04-22
Added
- integration:
--with-sleep-syncflag + README Cloud REM sync section (1dd05c6) - skills:
/sleep-setup5-phase wizard (click + 1 free-text URL) (b658f81) - hooks:
session-end-dumpcallskei-sleep-syncafter ingest (1ab39d5) - primitives:
kei-sleep-setupwizard +kei-sleep-synchelper + trigger template (4fdaab6)
0.10.0 — 2026-04-22
Added
- integration: register
genesis-scanin MANIFEST core+full + README +install.shsizing (93ba0a0) - hooks:
git-pre-commit-genesis— template for repo symlink into.git/hooks/pre-commit(670af3f) - primitives:
genesis-scanRust — patent-IP leak detector (CI / pre-commit) (5db8548) - integration: wire
kei-memoryinto MANIFEST + settings-snippet + README for v0.10 (0b5da5a) - skills:
/self-audit5-phase triage pipeline (334a867) - hooks: 3 self-audit triggers — stop / milestone / error-spike (
a5c3896) - primitives:
kei-memoryRust crate — offline session analyzer (Genesis-clean) (448fc07)
0.9.1 — 2026-04-21
Added
- install: interactive menu (whiptail / dialog / plain) + confirm screen +
--yes/--no-execute(4809269)
0.9.0 — 2026-04-21
Added
- install: modular profiles +
--add/--remove/--listincremental install (b1b8de0) - primitives:
MANIFEST.toml— SSoT for 21 primitives + 6 profiles (764a999)
Changed
- readme: install profiles table + migration note for v0.9.0 (
47931a3)
BREAKING: default install profile is now
minimal(wasfull). Re-run with--profile=fullto preserve prior behaviour.
0.8.0 — 2026-04-21
Added
- install: copy
_primitives/+ build Rust workspace; registeragent-fork-logger+site-wysiwydhooks (b0d9389) - hooks:
site-wysiwyd-checkPostToolUse(Edit | Write) drift advisory (c2041b4) - skills:
/site-createpipeline (phases 0–4 — phases 5–6 deferred) (839ae57)
Changed
- compose-solution: prior-art grep paths + phase-5 cross-refs for 10 pipelines + 21 primitives (
f664cbc) - readme: v0.8.0 — 73 blocks / 34 skills / 21 primitives / 6 hooks / 11 bridges + pipelines section (
ed7d566)