diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 74425caa0a..e79db9cfda 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "1.0.0-beta.63" + ".": "1.0.0-beta.64" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 96fcb762cb..76ffddb434 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,97 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.0.0-beta.64](https://github.com/ScriptedAlchemy/tracedecay/compare/v1.0.0-beta.63...v1.0.0-beta.64) (2026-10-01) + + +### ⚠ BREAKING CHANGES + +* **sessions:** session-temporal stores written by earlier builds are refused until `tracedecay wipe --stale --yes` resets them. +* **graph-db:** the test-helpers release_staging_rows_for_relational_head surface now applies production receipt semantics. +* **global-db:** registries created by v1.0.0-beta.63 and earlier carry graph_scopes.db_relpath. The schema contract refuses that shape as the reset-required state for the "project registry" authority and leaves the table untouched; run `tracedecay wipe --all --yes` to recreate the profile. The `db_relpath` field is removed from graph scopes in `projects context` JSON and the project_context MCP result. +* **global-db:** a registry whose code_projects table lacks the primary_root_platform, primary_root_bytes and primary_root_last_seen_at columns is no longer migrated in place. The daemon serves it in the reset-required state (authority "project registry"). Run `tracedecay wipe --all --yes` to recreate the profile. +* **branch:** `tracedecay_status` `branch_diagnostics` no longer reports `serving_db_path`, `serving_db_exists`, `live_branch_db_path`, `live_branch_db_exists`, `nearest_tracked_ancestor_db_path`, `nearest_tracked_ancestor_db_exists`, nor per-branch `db_file`, `db_path`, `db_exists`, `size_bytes`, `parent_db_path`, `parent_db_exists` and `warnings`. The `tracedecay://branches` resource drops `db_file` and `size_bytes` and lists branches by name. `tracedecay branch list` no longer prints a per-branch size or `missing-db` flag. `branch-meta.json` is written without `db_file`; older binaries read such metadata as corrupt and fall back to single-store mode. +* **sessions:** Codex admission ignores cursors of the retired per-session source identity; stores that still carry them beside observation rows must be reset with `tracedecay wipe --stale --yes`. +* **contracts:** tracedecay_signature, tracedecay_derives and tracedecay_test_map refuse `id`; send `node_id`. LexicalFieldV1 no longer decodes snake_case variant names. @tracedecay/sdk is bumped to 0.11.0. +* **global-db:** TRACEDECAY_ENABLE_GLOBAL_DB is no longer read. Use TRACEDECAY_DISABLE_GLOBAL_DB=1 to disable global accounting; an ENABLE=1 no longer overrides it, and ENABLE=0 no longer disables it. The dashboard accounting mode no longer reports enabled_by_env. +* **sessions:** lcm_status reports payload_gc.last_gc_status as null for a store whose GC never recorded a status, instead of deriving ok/partial/failed from last_error; the next GC pass records it. +* **cli:** `tool --json` successes (and first-class commands such as `tracedecay git status --json`) print the MCP tool result with the typed result under `structuredContent` instead of the bare application envelope. +* **graph-db:** graph format 7. Sealed stores and replays from format 6 are superseded and rebuild cold; there is no migration. +* **cli:** `tracedecay tool --json` refusals from typed application tools and from pre-owner failures print the MCP tool result with the record at `structuredContent.problem` instead of an application envelope or an untyped `{"problem": ...}` object. The problem detail union gains `daemon_unreachable`, and `@tracedecay/sdk` is 0.10.0. +* **host-admission:** group-commit hook admission fsyncs ([#2685](https://github.com/ScriptedAlchemy/tracedecay/issues/2685)) +* **code-index:** `tracedecay gitignore` is removed and exits as an unknown command. index.git_ignore.v1 is retired, the settings patch no longer accepts git_ignore, and tracedecay_admin_project no longer has a gitignore_status action (@tracedecay/sdk 0.4.0). index.exclude.v1 and index.include.v1 now decide which files the code index, grep, ast-grep search and unmounted-files walks see, applied at the next daemon start. +* **sessions:** release retention in micros; GC owner rows only ([#2680](https://github.com/ScriptedAlchemy/tracedecay/issues/2680)) +* **sessions:** retention.observation.reclaim_superseded_cursor_advances is removed; ObservationRetentionReport drops cursor_advances_reclaimed, cursor_advances_before and cursor_advances_after; LcmRetentionReport drops raw_rows_before and raw_rows_after. + +### Features + +* **graph-db:** publish small refreshes as layered generations ([#2695](https://github.com/ScriptedAlchemy/tracedecay/issues/2695)) ([8be35c1](https://github.com/ScriptedAlchemy/tracedecay/commit/8be35c10222f3e563061b98c93652442f214238f)) +* **sessions:** publish typed LCM convergence in status ([#2717](https://github.com/ScriptedAlchemy/tracedecay/issues/2717)) ([c0fe494](https://github.com/ScriptedAlchemy/tracedecay/commit/c0fe49493ee659896414cfd9dcffee10d4b5dfd6)) + + +### Bug Fixes + +* **cli:** one typed tool-result shape for every --json refusal ([#2690](https://github.com/ScriptedAlchemy/tracedecay/issues/2690)) ([dcf2fad](https://github.com/ScriptedAlchemy/tracedecay/commit/dcf2fad5e5c3fae9949c7fb22f3212785545586e)) +* **cli:** print every tool --json answer as the tool result ([#2716](https://github.com/ScriptedAlchemy/tracedecay/issues/2716)) ([79b6931](https://github.com/ScriptedAlchemy/tracedecay/commit/79b69312c8b8a425d874059882cf79eabf7e74c7)) +* **code-index:** classify retries by type, not error text ([#2708](https://github.com/ScriptedAlchemy/tracedecay/issues/2708)) ([605402f](https://github.com/ScriptedAlchemy/tracedecay/commit/605402f158602dbccd78dd5e75faead4967797cc)) +* **code-index:** free captured sources once a pass lets them go ([#2778](https://github.com/ScriptedAlchemy/tracedecay/issues/2778)) ([4e3e1d6](https://github.com/ScriptedAlchemy/tracedecay/commit/4e3e1d6d21411244429fcb5d62d0af5c94412c7b)) +* **code-index:** honor index exclude/include, drop gitignore ([#2514](https://github.com/ScriptedAlchemy/tracedecay/issues/2514)) ([57da1e8](https://github.com/ScriptedAlchemy/tracedecay/commit/57da1e89f2a081acfe02fca3cf47424aac31f066)), closes [#2377](https://github.com/ScriptedAlchemy/tracedecay/issues/2377) +* **code-index:** keep status on the committed generation ([#2760](https://github.com/ScriptedAlchemy/tracedecay/issues/2760)) ([b11bc4d](https://github.com/ScriptedAlchemy/tracedecay/commit/b11bc4d592ac7736f298ee6df69bde67dc8cfe6d)) +* **code-index:** retry a held store lock on its release ([#2768](https://github.com/ScriptedAlchemy/tracedecay/issues/2768)) ([fb7f652](https://github.com/ScriptedAlchemy/tracedecay/commit/fb7f6520a97a0eb1ab43e03c01d7e8d7dcdfdfd5)) +* **code-index:** serve first search while restart graph warms ([#2739](https://github.com/ScriptedAlchemy/tracedecay/issues/2739)) ([f66f8a3](https://github.com/ScriptedAlchemy/tracedecay/commit/f66f8a394a94ff679299c9797de022f51bffb60d)) +* **config:** report uncompilable stored index patterns as findings ([#2728](https://github.com/ScriptedAlchemy/tracedecay/issues/2728)) ([e27b73d](https://github.com/ScriptedAlchemy/tracedecay/commit/e27b73d7aa298cbfaae5ea757ae999ef422cf0f0)) +* **contracts:** drop the id and snake_case wire spelling aliases ([#2722](https://github.com/ScriptedAlchemy/tracedecay/issues/2722)) ([240c971](https://github.com/ScriptedAlchemy/tracedecay/commit/240c97196297dac1528256d14e9edd294b5d7722)) +* **daemon-protocol:** let a delivered reply win over a failed probe ([#2686](https://github.com/ScriptedAlchemy/tracedecay/issues/2686)) ([bf0e1fe](https://github.com/ScriptedAlchemy/tracedecay/commit/bf0e1fe5442efed56f36f9be02d09fe79a8aca16)) +* **daemon:** close stores in one teardown, drop capacity retry ([#2751](https://github.com/ScriptedAlchemy/tracedecay/issues/2751)) ([54fb091](https://github.com/ScriptedAlchemy/tracedecay/commit/54fb0911a9d34fa5b2c86a8562ea5cd5c646d86c)), closes [#2476](https://github.com/ScriptedAlchemy/tracedecay/issues/2476) +* **daemon:** join dropped observability drains at shutdown ([#2665](https://github.com/ScriptedAlchemy/tracedecay/issues/2665)) ([410e8f8](https://github.com/ScriptedAlchemy/tracedecay/commit/410e8f8fb93e529b7365328f7516e2cb241a209e)) +* **daemon:** serve doctor report over reset-required stores ([#2711](https://github.com/ScriptedAlchemy/tracedecay/issues/2711)) ([5dc246d](https://github.com/ScriptedAlchemy/tracedecay/commit/5dc246d2e4c476c1124c7f60c6961b0cd3079e09)) +* **dashboard:** answer the story curate fixture with its receipt ([#2701](https://github.com/ScriptedAlchemy/tracedecay/issues/2701)) ([3abbb8e](https://github.com/ScriptedAlchemy/tracedecay/commit/3abbb8e343d02f0144f2cecab4b8fc59d931c5fb)) +* **doctor:** open the project a lone doctor asks about ([#2743](https://github.com/ScriptedAlchemy/tracedecay/issues/2743)) ([4624623](https://github.com/ScriptedAlchemy/tracedecay/commit/46246233c50e2e62b5cd05f378493889192f49d9)), closes [#2713](https://github.com/ScriptedAlchemy/tracedecay/issues/2713) +* **doctor:** report ingest refusals informationally ([#2681](https://github.com/ScriptedAlchemy/tracedecay/issues/2681)) ([dd092c2](https://github.com/ScriptedAlchemy/tracedecay/commit/dd092c283da0ea34e9ef03ac8b45f559ff8a88b1)) +* **feedback:** publish the advisory mount's own typed state ([#2724](https://github.com/ScriptedAlchemy/tracedecay/issues/2724)) ([a908b62](https://github.com/ScriptedAlchemy/tracedecay/commit/a908b62d6d50e70564a4996df846e2c1de9a23a0)) +* **feedback:** wait for a reopened generation's source proof ([#2668](https://github.com/ScriptedAlchemy/tracedecay/issues/2668)) ([03ba683](https://github.com/ScriptedAlchemy/tracedecay/commit/03ba683fbcbdc4c6f090a6688c966476966a5496)) +* **hooks:** keep hook spool locks free of durability barriers ([#2732](https://github.com/ScriptedAlchemy/tracedecay/issues/2732)) ([654d88d](https://github.com/ScriptedAlchemy/tracedecay/commit/654d88db174d4026c9e9b29fc52a21ded1607cc8)) +* **hooks:** never fail a delivered hook on its receipt spool ([#2698](https://github.com/ScriptedAlchemy/tracedecay/issues/2698)) ([833a46c](https://github.com/ScriptedAlchemy/tracedecay/commit/833a46c08aa97d5f6079da1a275c4f8d5052ef4c)) +* **hooks:** wake the drain when a delivery receipt is published ([#2759](https://github.com/ScriptedAlchemy/tracedecay/issues/2759)) ([3114485](https://github.com/ScriptedAlchemy/tracedecay/commit/3114485194db15661a22adb2fcc1f56cdf0bbcbd)) +* **hosts:** report ETXTBSY spawn refusals on the first attempt ([#2719](https://github.com/ScriptedAlchemy/tracedecay/issues/2719)) ([72fa922](https://github.com/ScriptedAlchemy/tracedecay/commit/72fa9229977e20ad16be86471fe6065b520aadcb)) +* **maintenance:** retire a removed worktree's scheduler first ([#2725](https://github.com/ScriptedAlchemy/tracedecay/issues/2725)) ([f528565](https://github.com/ScriptedAlchemy/tracedecay/commit/f528565d074f72d1acb45808de678c554a68bdfc)) +* **mcp:** pin lcm convergence and schema template key ([#2758](https://github.com/ScriptedAlchemy/tracedecay/issues/2758)) ([bdd8a97](https://github.com/ScriptedAlchemy/tracedecay/commit/bdd8a974498d3dcd42b93c532473cd25d856c5c8)), closes [#2749](https://github.com/ScriptedAlchemy/tracedecay/issues/2749) [#2753](https://github.com/ScriptedAlchemy/tracedecay/issues/2753) +* **memory:** allocate SQLite and tree-sitter from mimalloc ([#2773](https://github.com/ScriptedAlchemy/tracedecay/issues/2773)) ([c36fa64](https://github.com/ScriptedAlchemy/tracedecay/commit/c36fa642c06879d26dc7ff3b4f1872eaa94b98f0)) +* **memory:** charge and release the retained parse pool ([#2775](https://github.com/ScriptedAlchemy/tracedecay/issues/2775)) ([aa1e2d5](https://github.com/ScriptedAlchemy/tracedecay/commit/aa1e2d5b00e774f4049ba7c9faa053ff1976c3f5)) +* **memory:** release idle thread heaps, charge graph owner pages ([#2727](https://github.com/ScriptedAlchemy/tracedecay/issues/2727)) ([f5b938b](https://github.com/ScriptedAlchemy/tracedecay/commit/f5b938b26f7097fb5e65717eb2319c73e0a62f56)) +* **memory:** return idle index workers' heaps and drop built sources ([#2661](https://github.com/ScriptedAlchemy/tracedecay/issues/2661)) ([154a0eb](https://github.com/ScriptedAlchemy/tracedecay/commit/154a0eb604eed02a6fcb53bf82b72f8a06661f48)) +* **memory:** wake refused work on the release it waits on ([#2771](https://github.com/ScriptedAlchemy/tracedecay/issues/2771)) ([7b364c8](https://github.com/ScriptedAlchemy/tracedecay/commit/7b364c8e7c2613edb530f796dfe7eec2e671b4ba)) +* **runtime-core:** share in-flight checkout topology walks ([#2726](https://github.com/ScriptedAlchemy/tracedecay/issues/2726)) ([d06b068](https://github.com/ScriptedAlchemy/tracedecay/commit/d06b0688ca104401df709afdb1add51475adb8ad)) +* **sessions:** read only the source objects a capture names ([#2777](https://github.com/ScriptedAlchemy/tracedecay/issues/2777)) ([da62880](https://github.com/ScriptedAlchemy/tracedecay/commit/da62880a34c0de111bc86bbe42efe4be1332a52f)) +* **sessions:** release retention in micros; GC owner rows only ([#2680](https://github.com/ScriptedAlchemy/tracedecay/issues/2680)) ([fff453b](https://github.com/ScriptedAlchemy/tracedecay/commit/fff453b19f09fcd5650431eb717f906b2a9403c3)) +* **sessions:** resume replaced transcripts by prefix digest ([#2737](https://github.com/ScriptedAlchemy/tracedecay/issues/2737)) ([ca59a36](https://github.com/ScriptedAlchemy/tracedecay/commit/ca59a3659ac52495b77f85d5b655b638507b9ece)), closes [#2712](https://github.com/ScriptedAlchemy/tracedecay/issues/2712) +* **store-runtime:** read seals without store or pool locks ([#2714](https://github.com/ScriptedAlchemy/tracedecay/issues/2714)) ([51aa2b8](https://github.com/ScriptedAlchemy/tracedecay/commit/51aa2b8968af3808beadf227b347861cb38aa436)) +* **store-runtime:** type remote recovery fence interruptions ([#2718](https://github.com/ScriptedAlchemy/tracedecay/issues/2718)) ([1ecbdc2](https://github.com/ScriptedAlchemy/tracedecay/commit/1ecbdc26f72c75d54054c839085949567a2d1a2d)) +* **test:** compile Windows check past unix-only helpers ([#2670](https://github.com/ScriptedAlchemy/tracedecay/issues/2670)) ([d01a884](https://github.com/ScriptedAlchemy/tracedecay/commit/d01a884765baee4858a5edd340f5d681a60b2dcd)), closes [#2663](https://github.com/ScriptedAlchemy/tracedecay/issues/2663) +* unwedge refresh joins and scope rollback under load ([#2677](https://github.com/ScriptedAlchemy/tracedecay/issues/2677)) ([0633913](https://github.com/ScriptedAlchemy/tracedecay/commit/0633913f0100b50bea9e74d81806b95c221e8d1f)), closes [#2667](https://github.com/ScriptedAlchemy/tracedecay/issues/2667) + + +### Performance Improvements + +* **code-index:** re-resolve only references an edit can move ([#2770](https://github.com/ScriptedAlchemy/tracedecay/issues/2770)) ([a02c95a](https://github.com/ScriptedAlchemy/tracedecay/commit/a02c95a0d17a4c1114dfb6f4529fa2ba6e477e3b)) +* **graph-db:** seal layers from a base row index ([#2754](https://github.com/ScriptedAlchemy/tracedecay/issues/2754)) ([363a5f7](https://github.com/ScriptedAlchemy/tracedecay/commit/363a5f7ca7e43e150a8d5fa55dd0c169e227d47b)) +* **host-admission:** group-commit hook admission fsyncs ([#2685](https://github.com/ScriptedAlchemy/tracedecay/issues/2685)) ([73b0bf1](https://github.com/ScriptedAlchemy/tracedecay/commit/73b0bf1bcbe03597fd823e93c57c0b3f24b9c827)) +* **runtime-core:** close idle stores concurrently at shutdown ([#2669](https://github.com/ScriptedAlchemy/tracedecay/issues/2669)) ([180200b](https://github.com/ScriptedAlchemy/tracedecay/commit/180200b89beb479a9e50fbc658a68393aa7e51b3)) +* **sessions:** drive retention from cursors and candidates ([#2675](https://github.com/ScriptedAlchemy/tracedecay/issues/2675)) ([e3f179c](https://github.com/ScriptedAlchemy/tracedecay/commit/e3f179cdf4a600f530209d4855cf485a0c2eedc6)) +* **sessions:** extend session generations, don't copy them ([#2761](https://github.com/ScriptedAlchemy/tracedecay/issues/2761)) ([9d91e64](https://github.com/ScriptedAlchemy/tracedecay/commit/9d91e647c1121aa2100a869267b5de034f3608ed)) +* **sessions:** resume rewritten JSONL after the retained prefix ([#2767](https://github.com/ScriptedAlchemy/tracedecay/issues/2767)) ([3dfee41](https://github.com/ScriptedAlchemy/tracedecay/commit/3dfee4127eac3cc43b37f74f7af05fafff160d2b)) + + +### Code Refactoring + +* **branch:** delete per-branch database residue ([#2731](https://github.com/ScriptedAlchemy/tracedecay/issues/2731)) ([d04b269](https://github.com/ScriptedAlchemy/tracedecay/commit/d04b26982e751c4256de74f786e8b9f3491bfd19)) +* **global-db:** drop graph_scopes.db_relpath ([#2747](https://github.com/ScriptedAlchemy/tracedecay/issues/2747)) ([ae7bed2](https://github.com/ScriptedAlchemy/tracedecay/commit/ae7bed286b2a2b8758843205562ae858f4362426)) +* **global-db:** drop in-place registry column migrations ([#2741](https://github.com/ScriptedAlchemy/tracedecay/issues/2741)) ([ccef776](https://github.com/ScriptedAlchemy/tracedecay/commit/ccef7768c69fe2b53844cd95f355845ab50ea5dd)) +* **global-db:** one opt-out variable for global accounting ([#2723](https://github.com/ScriptedAlchemy/tracedecay/issues/2723)) ([3d79ba6](https://github.com/ScriptedAlchemy/tracedecay/commit/3d79ba6b762f988baabc0ff2a8ab6206239d44bc)) +* **graph-db:** delete the test-only sealed receipt denial ([#2755](https://github.com/ScriptedAlchemy/tracedecay/issues/2755)) ([09d89e3](https://github.com/ScriptedAlchemy/tracedecay/commit/09d89e367dbe2b7654fe986a12fdc4c7a76308ef)) +* **sessions:** delete surviving legacy session readers ([#2715](https://github.com/ScriptedAlchemy/tracedecay/issues/2715)) ([5514288](https://github.com/ScriptedAlchemy/tracedecay/commit/55142887d51d46217f4d14cd0b4bd22e60daa9c9)) +* **sessions:** delete the Codex v1 source-cursor replay ([#2730](https://github.com/ScriptedAlchemy/tracedecay/issues/2730)) ([611207f](https://github.com/ScriptedAlchemy/tracedecay/commit/611207f41fa7ceb16ea741442b454492723d48e2)) + ## [1.0.0-beta.63](https://github.com/ScriptedAlchemy/tracedecay/compare/v1.0.0-beta.62...v1.0.0-beta.63) (2026-09-29) diff --git a/Cargo.lock b/Cargo.lock index 15db43bd20..9a82496908 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5708,7 +5708,7 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracedecay" -version = "1.0.0-beta.63" +version = "1.0.0-beta.64" dependencies = [ "axum", "constant_time_eq", @@ -5981,7 +5981,7 @@ dependencies = [ [[package]] name = "tracedecay-cli" -version = "1.0.0-beta.63" +version = "1.0.0-beta.64" dependencies = [ "aws-lc-rs", "axum", @@ -6744,7 +6744,7 @@ dependencies = [ [[package]] name = "tracedecay-project" -version = "1.0.0-beta.63" +version = "1.0.0-beta.64" dependencies = [ "hotpath", "rusqlite", diff --git a/Cargo.toml b/Cargo.toml index 0af12e24f3..8ae59d114f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -64,7 +64,7 @@ resolver = "3" # inheritance table is the sanctioned single source of truth. [workspace.package] edition = "2024" -version = "1.0.0-beta.63" +version = "1.0.0-beta.64" [workspace.dependencies] # Opt-in profiler, pinned once for the whole workspace. Non-optional on purpose: diff --git a/server.json b/server.json index de4df074c7..f21e0cb36f 100644 --- a/server.json +++ b/server.json @@ -8,6 +8,6 @@ "source": "github" }, "websiteUrl": "https://github.com/ScriptedAlchemy/tracedecay", - "version": "1.0.0-beta.63", + "version": "1.0.0-beta.64", "packages": [] } diff --git a/version.txt b/version.txt index 1d60aa6c14..7fb92e0052 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.0.0-beta.63 +1.0.0-beta.64