From 2a5be40c718e8069fb466af1be265357d8cb7ce0 Mon Sep 17 00:00:00 2001 From: James Ross Date: Mon, 24 Aug 2026 14:39:41 -0700 Subject: [PATCH 1/2] release: prepare v6.5.10 --- BEARING.md | 25 ++-- CHANGELOG.md | 2 + README.md | 4 +- ROADMAP.md | 56 ++++----- STATUS.md | 19 ++- UPGRADING.md | 44 ++++++- .../compound-workspace-assets.md | 4 +- .../witness/release-candidate.md | 89 ++++++++++++++ .../witness/verification.md | 26 ++-- docs/design/README.md | 2 +- .../compound-workspace-assets.md | 51 ++++++++ docs/releases/v6.5.10.md | 115 ++++++++++++++++++ jsr.json | 2 +- package.json | 3 +- src/package-version.js | 2 +- test/unit/docs/package-docs.test.js | 2 + test/unit/docs/release-state.test.js | 76 +++++++++++- test/unit/docs/release-truth.test.js | 20 +++ 18 files changed, 468 insertions(+), 74 deletions(-) create mode 100644 docs/design/0061-compound-workspace-assets/witness/release-candidate.md create mode 100644 docs/method/retro/0061-compound-workspace-assets/compound-workspace-assets.md create mode 100644 docs/releases/v6.5.10.md diff --git a/BEARING.md b/BEARING.md index 6fb01ee1..d0539f87 100644 --- a/BEARING.md +++ b/BEARING.md @@ -14,7 +14,7 @@ timeline ## Current State -`v6.5.9` shipped on `2026-08-24`. +`v6.5.9` shipped on `2026-08-24`, and `v6.5.10` is under release review. Application asset, bundle, page, cache, expiry, witness, and repository-diagnostics APIs sit above mutable root sets and the low-level CAS pipeline. Direct bundle-reference reads and bounded @@ -100,6 +100,14 @@ What exists now: generation retains their union. A 33-operation witness reduced 200 Git children to 23 and 33 retained generations to one in both SHA-1 and SHA-256 repositories without changing any application handle. +- **Compound workspace assets and exact roots.** The v6.5.10 candidate adds + bounded asset waves to the same compound persistence scope and optionally + retains a canonical, nonempty, deduplicated selection of handles staged by + that exact admission. Prior workspace roots and v6.5.9 retain-all behavior + remain intact. A controlled downstream git-warp prototype reduced cold Git + commands from 139 to 50 and incremental commands from 149 to 60; those + consumer numbers remain provisional until repeated against the public + registry artifact. - **Batched workspace page retention.** v6.5.4 adds `workspace.pages.putBatch()` so one bounded ordered page group is written and retained under one exact workspace generation instead of rewriting a growing @@ -170,19 +178,16 @@ These were the active tensions from the previous bearing. All resolved. ## Next Horizon -With v6.5.9 shipped, active work is tracked in GitHub Issues and Milestones. -Repo docs hold design and evidence records, not the active queue. The immediate -v6.5.10 goalpost completes compound admission with bounded asset waves and -exact newly staged terminal-root selection: +With v6.5.9 shipped and the v6.5.10 candidate under release review, active work +is tracked in GitHub Issues and Milestones. Repo docs hold design and evidence +records, not the active queue. The candidate design is: - [#127](https://github.com/git-stunts/git-cas/issues/127) - [0061-compound-workspace-assets](./docs/design/0061-compound-workspace-assets/compound-workspace-assets.md) -The completed release design is -[0060-compound-workspace-admission](./docs/design/0060-compound-workspace-admission/compound-workspace-admission.md). -Its completed release goalpost is -[#123](https://github.com/git-stunts/git-cas/issues/123) in the -[`v6.5.9` milestone](https://github.com/git-stunts/git-cas/milestone/19). +Its release evidence remains owned by +[#127](https://github.com/git-stunts/git-cas/issues/127) under the +[`v6.5.10` milestone](https://github.com/git-stunts/git-cas/milestone/20). The broader horizon remains: diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b2a792b..b15a78cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [6.5.10] — 2026-08-24 + ### Added - **Compound asset admission and exact terminal roots** - diff --git a/README.md b/README.md index fe5bbd78..6f6890f7 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ Unlike traditional LFS which moves files to external servers, `git-cas` treats t Existing v5 users should read [UPGRADING.md](./UPGRADING.md) and run `npm run upgrade` in dry-run mode before restoring old encrypted vault entries. For the release overview, see the -[v6.5.9 Release Notes](./docs/releases/v6.5.9.md). +[v6.5.10 Release Notes](./docs/releases/v6.5.10.md). ### 1. CLI Usage @@ -242,6 +242,8 @@ All three runtimes are tested in CI on every push. The hexagonal architecture is write waves, one-generation workspace batches, and reusable ref sessions. - **[v6.5.9 Release Notes](./docs/releases/v6.5.9.md)**: Compound dependent write waves retained under one exact staging-workspace generation. +- **[v6.5.10 Release Notes](./docs/releases/v6.5.10.md)**: Compound asset, + page, and bundle admission with exact selected terminal roots. - **[Upgrading](./UPGRADING.md)**: Migration guide for v5 → v6. - **[Changelog](./CHANGELOG.md)**: Version history and migration notes. diff --git a/ROADMAP.md b/ROADMAP.md index 53cd7d81..0176d2a3 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -29,47 +29,39 @@ Repo docs are supporting records: The milestones below should exist in GitHub. If this table and GitHub disagree, GitHub wins and this file should be corrected. -| Milestone | Theme | Tracker | -| -------------------------------------------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| [`v6.0.1`](https://github.com/git-stunts/git-cas/milestone/1) | Patch closeout and planning truth | [#37](https://github.com/git-stunts/git-cas/issues/37) | -| [`v6.1.0`](https://github.com/git-stunts/git-cas/milestone/2) | Bounded residency and scale hardening | [#43](https://github.com/git-stunts/git-cas/issues/43), [#44](https://github.com/git-stunts/git-cas/issues/44), [#45](https://github.com/git-stunts/git-cas/issues/45), [#48](https://github.com/git-stunts/git-cas/issues/48) | -| [`v6.2.0`](https://github.com/git-stunts/git-cas/milestone/3) | Emergency application storage and cache ownership boundary | [#50](https://github.com/git-stunts/git-cas/issues/50) | -| [`v6.3.0`](https://github.com/git-stunts/git-cas/milestone/7) | Bounded scoped cache acquisitions | [#69](https://github.com/git-stunts/git-cas/issues/69), [#70](https://github.com/git-stunts/git-cas/issues/70) | -| [`v6.4.0`](https://github.com/git-stunts/git-cas/milestone/4) | Scoped staging workspaces | [#75](https://github.com/git-stunts/git-cas/issues/75), [#77](https://github.com/git-stunts/git-cas/issues/77) | -| [`v6.4.1`](https://github.com/git-stunts/git-cas/milestone/8) | Historical bounded-residency proof closeout | [#38](https://github.com/git-stunts/git-cas/issues/38), [#46](https://github.com/git-stunts/git-cas/issues/46) | -| [`v6.5.0`](https://github.com/git-stunts/git-cas/milestone/5) | Bounded lazy bundle references and immutable metadata reads | [#81](https://github.com/git-stunts/git-cas/issues/81) | -| [`v6.5.1`](https://github.com/git-stunts/git-cas/milestone/11) | Bounded immutable page payload reuse | [#85](https://github.com/git-stunts/git-cas/issues/85) | -| [`v6.5.2`](https://github.com/git-stunts/git-cas/milestone/12) | Persistent bounded Git object sessions | [#90](https://github.com/git-stunts/git-cas/issues/90) | -| [`v6.5.3`](https://github.com/git-stunts/git-cas/milestone/13) | Coherent Git object sessions across immutable writes | [#94](https://github.com/git-stunts/git-cas/issues/94) | -| [`v6.5.4`](https://github.com/git-stunts/git-cas/milestone/14) | Batched staging-workspace page retention | [#99](https://github.com/git-stunts/git-cas/issues/99) | -| [`v6.5.5`](https://github.com/git-stunts/git-cas/milestone/15) | Identity-independent internal Git commits | [#102](https://github.com/git-stunts/git-cas/issues/102) | -| [`v6.5.6`](https://github.com/git-stunts/git-cas/milestone/16) | Bijou 7 framed cockpit and deterministic ref conflicts | [#105](https://github.com/git-stunts/git-cas/issues/105), [#106](https://github.com/git-stunts/git-cas/issues/106), [#111](https://github.com/git-stunts/git-cas/issues/111) | -| [`v6.5.7`](https://github.com/git-stunts/git-cas/milestone/17) | Bounded session-backed small payload stream reads | [#115](https://github.com/git-stunts/git-cas/issues/115) | -| [`v6.5.8`](https://github.com/git-stunts/git-cas/milestone/18) | Bounded application write and retention waves | [#119](https://github.com/git-stunts/git-cas/issues/119) | -| [`v6.5.9`](https://github.com/git-stunts/git-cas/milestone/19) | Compound staging-workspace admission | [#123](https://github.com/git-stunts/git-cas/issues/123) | -| [`v6.5.10`](https://github.com/git-stunts/git-cas/milestone/20) | Compound workspace assets and exact roots | [#127](https://github.com/git-stunts/git-cas/issues/127) | -| [`v6.6.0`](https://github.com/git-stunts/git-cas/milestone/9) | Operator TUI and agent automation follow-through | [#39](https://github.com/git-stunts/git-cas/issues/39), [#40](https://github.com/git-stunts/git-cas/issues/40) | -| [`v6.7.0`](https://github.com/git-stunts/git-cas/milestone/10) | Browser and edge read-path exploration | [#41](https://github.com/git-stunts/git-cas/issues/41) | -| [`v7.0.0`](https://github.com/git-stunts/git-cas/milestone/6) | Protocol break only if audit requires it | [#42](https://github.com/git-stunts/git-cas/issues/42), only when justified | +| Milestone | Theme | Tracker | +| --------------------------------------------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| [`v6.0.1`](https://github.com/git-stunts/git-cas/milestone/1) | Patch closeout and planning truth | [#37](https://github.com/git-stunts/git-cas/issues/37) | +| [`v6.1.0`](https://github.com/git-stunts/git-cas/milestone/2) | Bounded residency and scale hardening | [#43](https://github.com/git-stunts/git-cas/issues/43), [#44](https://github.com/git-stunts/git-cas/issues/44), [#45](https://github.com/git-stunts/git-cas/issues/45), [#48](https://github.com/git-stunts/git-cas/issues/48) | +| [`v6.2.0`](https://github.com/git-stunts/git-cas/milestone/3) | Emergency application storage and cache ownership boundary | [#50](https://github.com/git-stunts/git-cas/issues/50) | +| [`v6.3.0`](https://github.com/git-stunts/git-cas/milestone/7) | Bounded scoped cache acquisitions | [#69](https://github.com/git-stunts/git-cas/issues/69), [#70](https://github.com/git-stunts/git-cas/issues/70) | +| [`v6.4.0`](https://github.com/git-stunts/git-cas/milestone/4) | Scoped staging workspaces | [#75](https://github.com/git-stunts/git-cas/issues/75), [#77](https://github.com/git-stunts/git-cas/issues/77) | +| [`v6.4.1`](https://github.com/git-stunts/git-cas/milestone/8) | Historical bounded-residency proof closeout | [#38](https://github.com/git-stunts/git-cas/issues/38), [#46](https://github.com/git-stunts/git-cas/issues/46) | +| [`v6.5.0`](https://github.com/git-stunts/git-cas/milestone/5) | Bounded lazy bundle references and immutable metadata reads | [#81](https://github.com/git-stunts/git-cas/issues/81) | +| [`v6.5.1`](https://github.com/git-stunts/git-cas/milestone/11) | Bounded immutable page payload reuse | [#85](https://github.com/git-stunts/git-cas/issues/85) | +| [`v6.5.2`](https://github.com/git-stunts/git-cas/milestone/12) | Persistent bounded Git object sessions | [#90](https://github.com/git-stunts/git-cas/issues/90) | +| [`v6.5.3`](https://github.com/git-stunts/git-cas/milestone/13) | Coherent Git object sessions across immutable writes | [#94](https://github.com/git-stunts/git-cas/issues/94) | +| [`v6.5.4`](https://github.com/git-stunts/git-cas/milestone/14) | Batched staging-workspace page retention | [#99](https://github.com/git-stunts/git-cas/issues/99) | +| [`v6.5.5`](https://github.com/git-stunts/git-cas/milestone/15) | Identity-independent internal Git commits | [#102](https://github.com/git-stunts/git-cas/issues/102) | +| [`v6.5.6`](https://github.com/git-stunts/git-cas/milestone/16) | Bijou 7 framed cockpit and deterministic ref conflicts | [#105](https://github.com/git-stunts/git-cas/issues/105), [#106](https://github.com/git-stunts/git-cas/issues/106), [#111](https://github.com/git-stunts/git-cas/issues/111) | +| [`v6.5.7`](https://github.com/git-stunts/git-cas/milestone/17) | Bounded session-backed small payload stream reads | [#115](https://github.com/git-stunts/git-cas/issues/115) | +| [`v6.5.8`](https://github.com/git-stunts/git-cas/milestone/18) | Bounded application write and retention waves | [#119](https://github.com/git-stunts/git-cas/issues/119) | +| [`v6.5.9`](https://github.com/git-stunts/git-cas/milestone/19) | Compound staging-workspace admission | [#123](https://github.com/git-stunts/git-cas/issues/123) | +| [`v6.5.10`](https://github.com/git-stunts/git-cas/milestone/20) | Compound workspace assets and exact roots | [#127](https://github.com/git-stunts/git-cas/issues/127) | +| [`v6.6.0`](https://github.com/git-stunts/git-cas/milestone/9) | Operator TUI and agent automation follow-through | [#39](https://github.com/git-stunts/git-cas/issues/39), [#40](https://github.com/git-stunts/git-cas/issues/40) | +| [`v6.7.0`](https://github.com/git-stunts/git-cas/milestone/10) | Browser and edge read-path exploration | [#41](https://github.com/git-stunts/git-cas/issues/41) | +| [`v7.0.0`](https://github.com/git-stunts/git-cas/milestone/6) | Protocol break only if audit requires it | [#42](https://github.com/git-stunts/git-cas/issues/42), only when justified | ## Latest Landed Design The latest landed design record is: -- [0060-compound-workspace-admission](./docs/design/0060-compound-workspace-admission/compound-workspace-admission.md) +- [0061-compound-workspace-assets](./docs/design/0061-compound-workspace-assets/compound-workspace-assets.md) Its GitHub goalpost issue, -[#123](https://github.com/git-stunts/git-cas/issues/123), owns the release +[#127](https://github.com/git-stunts/git-cas/issues/127), owns the release evidence. The design doc is the durable contract; GitHub records completion. -The active design record is: - -- [0061-compound-workspace-assets](./docs/design/0061-compound-workspace-assets/compound-workspace-assets.md) - -Its GitHub goalpost issue is -[#127](https://github.com/git-stunts/git-cas/issues/127) under the -[`v6.5.10` milestone](https://github.com/git-stunts/git-cas/milestone/20). - The `v6.2.0` slice record is: - [#54 Opaque asset handles and retention witnesses](https://github.com/git-stunts/git-cas/issues/54) diff --git a/STATUS.md b/STATUS.md index b676c49d..949ba86d 100644 --- a/STATUS.md +++ b/STATUS.md @@ -1,8 +1,8 @@ # STATUS **Last tagged release:** `v6.5.9` (`2026-08-24`) -**Current release state:** `v6.5.9` is published to npm and GitHub Releases. -**Latest verification:** reviewed release merge `a16e31a9` passed 14/14 release-verifier stages with 7,147 observed tests; signed tag `v6.5.9` peels to that merge, and release workflow `32766297971` published the matching npm artifact plus final GitHub Release. +**Current release state:** `v6.5.10` release candidate; tag, npm publication, and GitHub Release remain pending the reviewed tag workflow. +**Latest verification:** exact implementation checkpoint `e663754b` passed 14/14 release-verifier stages with 7,186 observed tests; exact versioned-candidate verification remains pending. **Playback truth:** `main` **Runtimes:** Node.js 22.x, Bun, Deno **Current planning method:** [WORKFLOW.md](./WORKFLOW.md) @@ -18,6 +18,19 @@ - The machine-facing `git cas agent` surface exists and now supports OS-keychain passphrase sources for vault-derived key flows, but parity and portability are still partial. +- **v6.5.10 candidate posture** — implementation PR + [#128](https://github.com/git-stunts/git-cas/pull/128) merged normally as + `57cd3002`; its exact reviewed head is `67147506`, and exact implementation + checkpoint `e663754b` passed all 14 release-verifier stages with 7,186 + observed tests. npm, JSR, and runtime metadata identify `6.5.10`, while the + signed tag and registry artifact remain deliberately absent pending release + review. The additive contract admits bounded asset waves into the compound + scope and can retain exact selected terminal roots without changing stored + formats, handles, refs, or readers. The controlled git-warp prototype cut + cold Git commands from 139 to 50 and incremental commands from 149 to 60; + those downstream numbers remain provisional until repeated against the + public registry artifact. No application or stored-data migration is + required. - **v6.5.9 artifact posture** — implementation PR [#124](https://github.com/git-stunts/git-cas/pull/124) and release PR [#125](https://github.com/git-stunts/git-cas/pull/125) merged normally. @@ -193,8 +206,6 @@ under [`v6.6.0`](https://github.com/git-stunts/git-cas/milestone/9). - The latest landed design record is - [0060-compound-workspace-admission](./docs/design/0060-compound-workspace-admission/compound-workspace-admission.md). -- The active design record is [0061-compound-workspace-assets](./docs/design/0061-compound-workspace-assets/compound-workspace-assets.md). ## Read Next diff --git a/UPGRADING.md b/UPGRADING.md index d2e4ec01..98914d8d 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -2,6 +2,42 @@ v6.0.0 is a major release that simplifies the encryption model, hardens security defaults, and cleans up the architecture. This guide covers every breaking change and what you need to do. +## v6.5.9 To v6.5.10 + +v6.5.10 adds compound asset admission and exact terminal-root selection and +requires no application or stored-data migration. Existing object bytes, +handles, descriptors, workspace generations, ref layouts, readers, and +retain-all compound calls remain compatible. Existing repositories open in +place. + +Compound callbacks may now stage bounded asset batches alongside pages and +ordered bundles. An optional synchronous selector can retain only terminal +handles staged by that exact callback: + +```js +const admitted = await workspace.batch({ + maxOperations: 4, + operation: async (scope) => { + const assets = await scope.assets.putBatch({ assets: assetRequests }); + const pages = await scope.pages.putBatch({ pages: pageRequests }); + const leaves = await scope.bundles.putOrderedBatch({ + bundles: leafRequests(assets, pages), + }); + return ( + await scope.bundles.putOrderedBatch({ + bundles: [rootRequest(leaves)], + }) + )[0]; + }, + retain: (terminal) => [terminal], +}); +``` + +The selector must return a nonempty array of canonical handles staged by the +same admission. It is bounded by that admission's staged-artifact count, +deduplicates repeated handles in stable order, and cannot remove roots retained +before the call. Omit `retain` to preserve v6.5.9 retain-all behavior. + ## v6.5.8 To v6.5.9 v6.5.9 adds `workspace.batch()` and requires no application or stored-data @@ -20,9 +56,11 @@ const admitted = await workspace.batch({ const leaves = await scope.bundles.putOrderedBatch({ bundles: buildLeafRequests(pages), }); - return (await scope.bundles.putOrderedBatch({ - bundles: [buildRootRequest(leaves)], - }))[0]; + return ( + await scope.bundles.putOrderedBatch({ + bundles: [buildRootRequest(leaves)], + }) + )[0]; }, }); diff --git a/docs/design/0061-compound-workspace-assets/compound-workspace-assets.md b/docs/design/0061-compound-workspace-assets/compound-workspace-assets.md index b143b59b..9b78d2b1 100644 --- a/docs/design/0061-compound-workspace-assets/compound-workspace-assets.md +++ b/docs/design/0061-compound-workspace-assets/compound-workspace-assets.md @@ -7,7 +7,7 @@ release_home: 'v6.5.10' issue: 'https://github.com/git-stunts/git-cas/issues/127' goalpost_issue: 'https://github.com/git-stunts/git-cas/issues/127' tracker_source: 'github' -status: 'active' +status: 'landed' base_commit: '6d5a43e2853f61b3c12d5000e81ef7832c00b8d2' owners: - '@git-stunts' @@ -431,7 +431,7 @@ The work is done when: SHA-1 and SHA-256 repositories. - [x] Existing v6.5.9 calls and all persisted repositories remain compatible without migration. -- [ ] Public docs, architecture, changelog, issue, PR, CI, and local validation +- [x] Public docs, architecture, changelog, issue, PR, CI, and local validation are complete. - [ ] v6.5.10 is publicly installable before downstream results are claimed as release behavior. diff --git a/docs/design/0061-compound-workspace-assets/witness/release-candidate.md b/docs/design/0061-compound-workspace-assets/witness/release-candidate.md new file mode 100644 index 00000000..8dfa6590 --- /dev/null +++ b/docs/design/0061-compound-workspace-assets/witness/release-candidate.md @@ -0,0 +1,89 @@ +# PERF-0061 v6.5.10 Release Candidate Witness + +Date: 2026-08-24 + +Issue: #127 + +Implementation review: #128 + +Release review: pending + +## Scope + +This witness records the pre-publication candidate for compound asset admission +and exact selected terminal roots. It does not claim that a `v6.5.10` tag, npm +artifact, or GitHub Release exists. This is an explicitly unpublished +candidate. + +The candidate: + +- sets npm, JSR, and runtime package metadata to `6.5.10`; +- moves compound workspace assets and exact roots from `Unreleased` to + `6.5.10`; +- packages and links `docs/releases/v6.5.10.md`; +- records v6.5.9 publication evidence as immutable history; +- marks design 0061 landed after implementation review #128; and +- leaves v6.5.10 tag and registry claims deliberately absent. + +## Implementation Provenance + +Implementation review #128 merged normally as +`57cd300294a94660d2afb644c653a3be78c15d53`. Its second parent is exact +reviewed head `6714750620aa2310ad0279f957414be65898a66a`. + +Exact implementation checkpoint +`e663754bf221784f0e5856a41fe071bebfa5befb` passed the complete release method +before the reviewed head added only the committed verification record: + +| Gate | Result | Observed tests | +| -------------------------- | --------------------- | -------------: | +| Lint | PASS | - | +| Unit tests (Node) | PASS | 2,192 | +| Unit tests (Bun) | PASS | 2,191 | +| Unit tests (Deno) | PASS | 2,182 | +| Public type compatibility | PASS | - | +| Integration tests (Node) | PASS | 207 | +| Integration tests (Bun) | PASS | 207 | +| Integration tests (Deno) | PASS | 207 | +| Examples and build stamp | PASS | - | +| npm and JSR dry-runs | PASS | - | +| **Release method summary** | **PASS: 14/14 gates** | **7,186** | + +Versioned candidate verification: pending. The committed versioned tree must +pass the same method before this release review can become ready. + +## Semantic and Process Witness + +The direct git-cas SHA-1/SHA-256 integration proof preserves application +handles, transitive readback after immediate prune, one exact final workspace +generation, and later reclamation with only the selected terminal roots held +directly. + +A controlled downstream git-warp prototype compared the same 65-node, +65-patch corpus plus a five-patch suffix across one warmup and three measured +runs per scenario: + +| Scenario | Git commands | Median CPU ms | Median wall ms | +| ----------- | -----------: | ------------: | -------------: | +| Cold before | 139 | 545.476 | 2,822.893 | +| Cold after | 50 | 322.103 | 1,328.603 | +| Incr before | 149 | 555.478 | 3,039.536 | +| Incr after | 60 | 320.050 | 1,387.245 | +| Warm before | 25 | 166.882 | 548.191 | +| Warm after | 25 | 176.325 | 622.956 | + +Semantic fingerprints, cache posture, and replay counts match. The warm path +does not materialize writes and retains the exact 25-command topology. These +consumer measurements justify the candidate API but remain provisional until +rerun against the public v6.5.10 registry artifact. + +## Compatibility and Publication Gate + +The release is additive and migration-free. Existing stored objects, handles, +descriptors, ref layouts, readers, workspace generations, and retain-all calls +remain compatible without rewriting or cutover. + +Publication remains blocked until the versioned candidate passes the full +release method, the release PR passes hosted CI and review, the exact reviewed +merge passes verification, a signed annotated `v6.5.10` tag peels to that +merge, and the release workflow publishes npm plus the final GitHub Release. diff --git a/docs/design/0061-compound-workspace-assets/witness/verification.md b/docs/design/0061-compound-workspace-assets/witness/verification.md index 46d21fa3..f4d0fb45 100644 --- a/docs/design/0061-compound-workspace-assets/witness/verification.md +++ b/docs/design/0061-compound-workspace-assets/witness/verification.md @@ -4,6 +4,8 @@ - implementation commit: `e663754bf221784f0e5856a41fe071bebfa5befb` - implementation PR: [#128](https://github.com/git-stunts/git-cas/pull/128) +- exact reviewed head: `6714750620aa2310ad0279f957414be65898a66a` +- normal merge: `57cd300294a94660d2afb644c653a3be78c15d53` - base commit: `6d5a43e2853f61b3c12d5000e81ef7832c00b8d2` - installed Plumbing: `@git-stunts/plumbing@3.3.0` - Node.js: `v26.0.0` @@ -14,7 +16,8 @@ The implementation worktree was clean when the complete release verifier started and after it completed. The verifier's build stamp named the same -implementation commit. +implementation commit. PR #128 then added only this verification record and +merged normally; the merge's second parent is the exact reviewed head above. ## Red to green @@ -86,12 +89,12 @@ run used the exact API implemented here through a local prototype. | Scenario | Git commands | Median CPU ms | Median wall ms | | ----------- | -----------: | ------------: | -------------: | -| Cold before | 139 | 545.476 | 2,822.893 | -| Cold after | 50 | 322.103 | 1,328.603 | -| Incr before | 149 | 555.478 | 3,039.536 | -| Incr after | 60 | 320.050 | 1,387.245 | -| Warm before | 25 | 166.882 | 548.191 | -| Warm after | 25 | 176.325 | 622.956 | +| Cold before | 139 | 545.476 | 2,822.893 | +| Cold after | 50 | 322.103 | 1,328.603 | +| Incr before | 149 | 555.478 | 3,039.536 | +| Incr after | 60 | 320.050 | 1,387.245 | +| Warm before | 25 | 166.882 | 548.191 | +| Warm after | 25 | 176.325 | 622.956 | The cold path used 64.029% fewer Git commands, 40.950% less Node CPU, and 52.935% less wall time. The incremental path used 59.732% fewer Git commands, @@ -116,8 +119,7 @@ authority cutover. ## Publication boundary The implementation is not a published v6.5.10 release merely because this -witness and local verification are green. Publication still requires hosted -review and CI on the exact PR head, a normal reviewed merge, a separately -reviewed versioned release candidate, a signed annotated tag that peels to the -reviewed release merge, successful registry publication, and an external -consumer installation check. +witness, hosted implementation CI, and local verification are green. +Publication still requires a separately reviewed versioned release candidate, +a normal release merge, a signed annotated tag that peels to that merge, +successful registry publication, and an external consumer installation check. diff --git a/docs/design/README.md b/docs/design/README.md index 20f01c64..3f1c7d2b 100644 --- a/docs/design/README.md +++ b/docs/design/README.md @@ -11,7 +11,6 @@ process in [docs/method/process.md](../method/process.md). ## Active METHOD Cycles -- [0061-compound-workspace-assets - compound-workspace-assets](./0061-compound-workspace-assets/compound-workspace-assets.md) - [0054-batched-page-retention - batched-page-retention](./0054-batched-page-retention/batched-page-retention.md) - [0050-lazy-bundle-reference-reads - lazy-bundle-reference-reads](./0050-lazy-bundle-reference-reads/lazy-bundle-reference-reads.md) - [0049-scoped-staging-workspaces — scoped-staging-workspaces](./0049-scoped-staging-workspaces/scoped-staging-workspaces.md) @@ -45,6 +44,7 @@ process in [docs/method/process.md](../method/process.md). ## Landed METHOD Cycles +- [0061-compound-workspace-assets - compound-workspace-assets](./0061-compound-workspace-assets/compound-workspace-assets.md) - [0060-compound-workspace-admission - compound-workspace-admission](./0060-compound-workspace-admission/compound-workspace-admission.md) - [0059-bounded-write-waves - bounded-write-waves](./0059-bounded-write-waves/bounded-write-waves.md) - [0058-bounded-stream-session-reads - bounded-stream-session-reads](./0058-bounded-stream-session-reads/bounded-stream-session-reads.md) diff --git a/docs/method/retro/0061-compound-workspace-assets/compound-workspace-assets.md b/docs/method/retro/0061-compound-workspace-assets/compound-workspace-assets.md new file mode 100644 index 00000000..46ea32a4 --- /dev/null +++ b/docs/method/retro/0061-compound-workspace-assets/compound-workspace-assets.md @@ -0,0 +1,51 @@ +# Retro — 0061 Compound Workspace Assets And Exact Roots + +## Drift Check + +- The cycle stayed inside bounded compound asset admission, exact newly staged + root selection, prior-root preservation, Git process reuse, failure + containment, deterministic witnesses, and compatibility documentation. +- It did not change stored objects or handles, expose raw Git sessions, weaken + checked refs, reinterpret a physical batch as a cross-ref transaction, or + claim provisional consumer timings as published behavior. + +## What Shipped To Main + +- `scope.assets.putBatch()` joins page and ordered-bundle waves through one + caller-owned compound persistence scope. +- Optional synchronous `retain(value)` selection accepts only a bounded, + nonempty, canonical, stably deduplicated subset of handles staged by that + exact admission while preserving every prior workspace root. +- Adversarial selector and lifecycle tests reject malformed, asynchronous, + empty, oversized, lookalike, and unstaged selections before ref movement. +- SHA-1/SHA-256 immediate-prune integration tests prove selected terminal-root + reachability, transitive asset/page readback, later reclamation, and + no-generation failure behavior. +- Implementation PR #128 merged normally as + `57cd300294a94660d2afb644c653a3be78c15d53`; exact reviewed head + `6714750620aa2310ad0279f957414be65898a66a` contains implementation checkpoint + `e663754bf221784f0e5856a41fe071bebfa5befb`, whose complete release method + passed 14/14 stages with 7,186 observed tests. + +## What Did Not Yet Ship + +- v6.5.10 has not yet been tagged or published to npm and GitHub Releases. +- git-warp has not yet installed the registry artifact or repeated its exact + reference, migrated-v18, process-census, CPU, and wall-time gates. +- Think remains unchanged until the ordered Plumbing -> git-cas -> git-warp + publication chain is complete. + +## Debt + +- The consumer prototype still opens 50 cold and 60 incremental Git commands. + The released-artifact benchmark must classify that residual topology before + another lower-layer optimization is justified. +- Exact selected roots are scoped to one workspace admission. Cross-workspace + or cross-ref atomicity remains deliberately outside this contract. + +## Cool Ideas + +- Reuse the same deterministic git-warp corpus as the public-artifact + conformance witness and the later Think before/after acceptance gate. +- Compare any native Git implementation only against the residual capability + and process ledger after this stock-Git path is measured end to end. diff --git a/docs/releases/v6.5.10.md b/docs/releases/v6.5.10.md new file mode 100644 index 00000000..96d66afb --- /dev/null +++ b/docs/releases/v6.5.10.md @@ -0,0 +1,115 @@ +# git-cas v6.5.10 Release Notes + +v6.5.10 completes bounded compound staging-workspace admission by adding asset +waves and exact selected terminal roots. Applications can stage replay or +provenance payloads, pages, support bundles, descriptors, and one terminal +bundle through a shared persistence scope, then publish one exact workspace +generation without retaining every construction intermediate as a direct root. + +## Compound Assets And Exact Roots + +`workspace.batch()` now exposes the existing bounded asset-batch contract on +its private scope: + +```js +const admitted = await workspace.batch({ + maxOperations: 4, + operation: async (scope) => { + const assets = await scope.assets.putBatch({ assets: assetRequests }); + const pages = await scope.pages.putBatch({ pages: pageRequests }); + const leaves = await scope.bundles.putOrderedBatch({ + bundles: leafRequests(assets, pages), + }); + return ( + await scope.bundles.putOrderedBatch({ + bundles: [rootRequest(leaves)], + }) + )[0]; + }, + retain: (terminal) => [terminal], +}); + +admitted.value; +admitted.retention; +``` + +Asset, page, and bundle calls serialize by invocation order and share the +operation-owned persistence scope. Every call retains its ordinary count, +object, member, and byte limits. Asset writes preserve the same chunking, +compression, encryption, manifest, and handle semantics as the public +`assets.putBatch()` method. + +The optional `retain(value)` callback executes synchronously after the bounded +operation succeeds. It must return a nonempty array of canonical handles staged +by that exact admission. Input count cannot exceed the staged-artifact ledger; +repeated handles deduplicate in stable order. Malformed, asynchronous, empty, +oversized, lookalike, and valid-but-unstaged selections fail before the +workspace ref moves. Omitting the selector preserves v6.5.9 retain-all +behavior. + +Exact selection affects only newly staged direct roots. Every root retained +before the compound call remains in the next generation. A selected terminal +bundle continues to retain its referenced pages, assets, and nested bundles +transitively through ordinary Git tree edges. + +## Failure And Reachability + +An asset failure poisons queued dependent work, publishes no compound +generation, and exposes no admitted callback result. A selector refusal also +leaves the prior generation unchanged. Immutable objects written before a +refusal may remain unreachable until normal Git maintenance reclaims them; the +selector is not a cross-ref transaction. + +Real-Git integration tests cover fresh SHA-1 and SHA-256 repositories. They +prove one checked workspace update, closed scoped sessions, selected-root +readback after immediate prune, preservation of prior roots, reclamation after +workspace release, and no-generation refusal behavior. + +## Downstream Process Witness + +A controlled git-warp prototype compared a 65-node, 65-patch materialization +plus a five-patch suffix using public v6.5.9 as the control and this exact API +as a local prototype. Each scenario used one warmup and three measured runs. + +| Scenario | Git commands | Median CPU ms | Median wall ms | +| ----------- | -----------: | ------------: | -------------: | +| Cold before | 139 | 545.476 | 2,822.893 | +| Cold after | 50 | 322.103 | 1,328.603 | +| Incr before | 149 | 555.478 | 3,039.536 | +| Incr after | 60 | 320.050 | 1,387.245 | +| Warm before | 25 | 166.882 | 548.191 | +| Warm after | 25 | 176.325 | 622.956 | + +Cold writes fell from 139 to 50 Git commands: 64.029% fewer commands, 40.950% +less Node CPU, and 52.935% less wall time. Incremental writes fell from 149 to +60 commands: 59.732% fewer commands, 42.383% less Node CPU, and 54.360% less +wall time. Semantic fingerprints, node/edge/property counts, cache posture, and +replay counts matched. The warm read path materializes no writes and retained +its exact 25-command topology; elapsed variation there is host noise, not a +claimed regression or gain. + +These downstream measurements are deliberately provisional until git-warp +installs the public v6.5.10 registry artifact and repeats the same corpus. The +deterministic contract is the equal semantic result and reduced command +topology, not a universal timing promise. + +## Verification + +Implementation review #128 merged normally as +`57cd300294a94660d2afb644c653a3be78c15d53`; its exact reviewed head is +`6714750620aa2310ad0279f957414be65898a66a`. Exact implementation checkpoint +`e663754bf221784f0e5856a41fe071bebfa5befb` passed all 14 release-verifier +stages with 7,186 observed tests across Node, Bun, Deno, public types, +executable examples, real-Git integrations, build stamping, npm packing, and a +JSR publication dry-run. Exact versioned-candidate verification remains the +next release gate. No tag, npm artifact, or GitHub Release is claimed by this +candidate. + +## Compatibility + +This release is additive and requires no application or stored-data migration. +It makes no stored object, handle, descriptor, ref layout, or reader change. +Existing repositories and workspace refs open in place; existing callers may +keep retain-all compound behavior by omitting `retain`. Custom asset services +that do not implement the scoped persistence hook remain compatible for page- +and bundle-only compound calls and reject only if the new asset scope is used. diff --git a/jsr.json b/jsr.json index c78b8b28..9886be83 100644 --- a/jsr.json +++ b/jsr.json @@ -1,6 +1,6 @@ { "name": "@git-stunts/git-cas", - "version": "6.5.9", + "version": "6.5.10", "exports": { ".": "./index.js", "./service": "./src/domain/services/CasService.js", diff --git a/package.json b/package.json index 2bf72f73..6c1de045 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@git-stunts/git-cas", - "version": "6.5.9", + "version": "6.5.10", "description": "Content-addressed storage backed by Git's object database, with optional encryption and pluggable codecs", "type": "module", "main": "index.js", @@ -46,6 +46,7 @@ "docs/releases/v6.5.7.md", "docs/releases/v6.5.8.md", "docs/releases/v6.5.9.md", + "docs/releases/v6.5.10.md", "docs/THREAT_MODEL.md", "docs/VAULT_INTERNALS.md", "docs/WALKTHROUGH.md", diff --git a/src/package-version.js b/src/package-version.js index b9fdf22e..655d8c83 100644 --- a/src/package-version.js +++ b/src/package-version.js @@ -1 +1 @@ -export const PACKAGE_VERSION = '6.5.9'; +export const PACKAGE_VERSION = '6.5.10'; diff --git a/test/unit/docs/package-docs.test.js b/test/unit/docs/package-docs.test.js index fce53a9c..f0c35c33 100644 --- a/test/unit/docs/package-docs.test.js +++ b/test/unit/docs/package-docs.test.js @@ -24,6 +24,7 @@ const requiredStandardDocs = [ 'docs/releases/v6.5.7.md', 'docs/releases/v6.5.8.md', 'docs/releases/v6.5.9.md', + 'docs/releases/v6.5.10.md', ]; const forbiddenPackagePrefixes = ['docs/audit/', 'docs/archive/', 'docs/method/']; const forbiddenPackageFiles = ['docs/cli.gif', 'docs/vault.gif']; @@ -104,6 +105,7 @@ function publicPackagedMarkdownFiles(files) { 'docs/releases/v6.5.7.md', 'docs/releases/v6.5.8.md', 'docs/releases/v6.5.9.md', + 'docs/releases/v6.5.10.md', 'docs/THREAT_MODEL.md', 'docs/WALKTHROUGH.md', ].filter((file) => files.has(file)); diff --git a/test/unit/docs/release-state.test.js b/test/unit/docs/release-state.test.js index 130ac828..1bd1e8fd 100644 --- a/test/unit/docs/release-state.test.js +++ b/test/unit/docs/release-state.test.js @@ -4,6 +4,8 @@ import path from 'node:path'; const repoRoot = process.cwd(); const v653PublishedMarker = '**v6.5.3 artifact posture**'; +const v6510CandidatePath = + 'docs/design/0061-compound-workspace-assets/witness/release-candidate.md'; const v659CandidatePath = 'docs/design/0060-compound-workspace-admission/witness/release-candidate.md'; const v659PublicationPath = @@ -49,6 +51,29 @@ function v6Heading(changelog) { return changelog.match(/^## \[6\.0\.0\] — (.+)$/m)?.[1]; } +function expectNoV6510PublicationEvidence(...documents) { + const forbiddenMarkers = [ + '**Last tagged release:** `v6.5.10`', + '**Current release state:** `v6.5.10` is published', + '- Signed annotated tag: `v6.5.10`', + 'https://github.com/git-stunts/git-cas/releases/tag/v6.5.10', + '## npm Registry Evidence', + /\| Package\s+\| `@git-stunts\/git-cas@6\.5\.10`\s+\|/, + /\| Dist-tag\s+\| `latest` -> `6\.5\.10`\s+\|/, + 'attestations/@git-stunts%2fgit-cas@6.5.10', + ]; + + for (const document of documents) { + for (const marker of forbiddenMarkers) { + if (marker instanceof RegExp) { + expect(document).not.toMatch(marker); + } else { + expect(document).not.toContain(marker); + } + } + } +} + function expectNoV659PublicationEvidence(...documents) { const forbiddenMarkers = [ '**Last tagged release:** `v6.5.9`', @@ -430,9 +455,25 @@ function expectV659CandidateEvidence(candidate, releaseNotes) { expectNoV659PublicationEvidence(candidate, releaseNotes); } +function expectV6510CandidateEvidence(status, candidate, releaseNotes) { + expect(status).toContain('**Current release state:** `v6.5.10` release candidate'); + expect(status).toContain('**v6.5.10 candidate posture**'); + expect(candidate).toContain('# PERF-0061 v6.5.10 Release Candidate Witness'); + expect(candidate).toContain('Implementation review: #128'); + expect(candidate).toContain('Release review: pending'); + expect(candidate).toContain('57cd300294a94660d2afb644c653a3be78c15d53'); + expect(candidate).toContain('6714750620aa2310ad0279f957414be65898a66a'); + expect(candidate).toContain('e663754bf221784f0e5856a41fe071bebfa5befb'); + expect(candidate).toContain('**PASS: 14/14 gates**'); + expect(candidate).toContain('**7,186**'); + expect(candidate).toContain('Versioned candidate verification: pending'); + expect(candidate).toMatch(/explicitly\s+unpublished\s+candidate/); + expect(releaseNotes).toMatch(/requires no application or stored-data migration/); + expectNoV6510PublicationEvidence(status, candidate, releaseNotes); +} + function expectV659PublishedEvidence(status, publication) { expect(status).toContain('**Last tagged release:** `v6.5.9` (`2026-08-24`)'); - expect(status).toContain('**Current release state:** `v6.5.9` is published'); expect(status).toContain('**v6.5.9 artifact posture**'); expect(status).toContain('a16e31a9'); expect(status).toContain('32766297971'); @@ -636,17 +677,32 @@ function expectV659ReleaseDocs(status) { expectV659PublishedEvidence(status, publication); } +function expectV6510ReleaseDocs(status) { + const candidate = read(v6510CandidatePath); + const releaseNotes = read('docs/releases/v6.5.10.md'); + + expectV6510CandidateEvidence(status, candidate, releaseNotes); +} + +function expectRecentReleaseDocs(status) { + expectV6510ReleaseDocs(status); + expectV659ReleaseDocs(status); + expectV658ReleaseDocs(status); + expectV657ReleaseDocs(status); +} + function expectCurrentQueue(status) { expect(status).toContain('Latest completed release goalpost:'); expect(status).toContain('Current queued release goalposts are'); expect(status).toContain('#39 v6.6.0: Operator TUI'); expect(status).toContain('#40 v6.6.0: Agent automation follow-through'); expect(status).toContain('#123 v6.5.9: Compound staging-workspace admission'); - expect(status).toContain('0060-compound-workspace-admission'); + expect(status).toContain('#127 v6.5.10: Compound workspace assets and exact roots'); + expect(status).toContain('0061-compound-workspace-assets'); } describe('release state docs', () => { - it('enforces the v6.5.9 candidate history and publication evidence', () => { + it('enforces the v6.5.10 candidate and prior publication evidence', () => { const status = read('STATUS.md'); const [v656Candidate, v656Publication] = [v656CandidatePath, v656PublicationPath].map(read); const v655Candidate = read(v655CandidatePath); @@ -667,9 +723,7 @@ describe('release state docs', () => { const v650Publication = read(v650PublicationPath); const v640Publication = read(v640PublicationPath); - expectV659ReleaseDocs(status); - expectV658ReleaseDocs(status); - expectV657ReleaseDocs(status); + expectRecentReleaseDocs(status); expectV656CandidateEvidence(v656Candidate); expectV656PublishedEvidence(status, v656Publication); expectV655CandidateEvidence(v655Candidate); @@ -696,6 +750,16 @@ describe('release state docs', () => { }); }); +describe('v6.5.10 candidate publication-marker calibration', () => { + it('rejects a GitHub Release marker in candidate release notes', () => { + const status = read('STATUS.md'); + const candidate = read(v6510CandidatePath); + const releaseNotes = `${read('docs/releases/v6.5.10.md')}\nhttps://github.com/git-stunts/git-cas/releases/tag/v6.5.10\n`; + + expect(() => expectV6510CandidateEvidence(status, candidate, releaseNotes)).toThrow(); + }); +}); + describe('v6.5.9 candidate publication-marker calibration', () => { it('rejects a GitHub Release marker in candidate release notes', () => { const candidate = read(v659CandidatePath); diff --git a/test/unit/docs/release-truth.test.js b/test/unit/docs/release-truth.test.js index d5fd222f..ef8243a3 100644 --- a/test/unit/docs/release-truth.test.js +++ b/test/unit/docs/release-truth.test.js @@ -373,6 +373,26 @@ describe('compound workspace-admission release documentation', () => { }); }); +describe('compound workspace-asset release documentation', () => { + it('ships and links the v6.5.10 migration-free exact-root contract', () => { + const readme = read('README.md'); + const upgrading = read('UPGRADING.md'); + const releaseNotes = read('docs/releases/v6.5.10.md'); + + expect(readme).toContain('[v6.5.10 Release Notes](./docs/releases/v6.5.10.md)'); + expect(upgrading).toContain('## v6.5.9 To v6.5.10'); + expect(upgrading).toMatch(/requires no application or stored-data\s+migration/); + expect(releaseNotes).toContain('# git-cas v6.5.10 Release Notes'); + expect(releaseNotes).toMatch(/139 to\s+50/); + expect(releaseNotes).toMatch(/149 to\s+60/); + expect(releaseNotes).toMatch(/exact selected terminal roots/); + expect(releaseNotes).toMatch(/requires no application or stored-data migration/); + expect(releaseNotes).toMatch( + /no stored object, handle, descriptor, ref layout, or reader change/ + ); + }); +}); + describe('advanced guide rendering', () => { it('keeps the table of contents rendered as Markdown links', () => { const advancedGuide = read('ADVANCED_GUIDE.md'); From 400afaaf730a4934a725c272200ecc065ba1e4da Mon Sep 17 00:00:00 2001 From: James Ross Date: Mon, 24 Aug 2026 14:47:42 -0700 Subject: [PATCH 2/2] docs: bind v6.5.10 candidate evidence --- STATUS.md | 21 ++++++------ .../witness/release-candidate.md | 33 +++++++++++++++---- docs/releases/v6.5.10.md | 8 +++-- test/unit/docs/release-state.test.js | 5 +-- 4 files changed, 45 insertions(+), 22 deletions(-) diff --git a/STATUS.md b/STATUS.md index 949ba86d..65299af6 100644 --- a/STATUS.md +++ b/STATUS.md @@ -2,7 +2,7 @@ **Last tagged release:** `v6.5.9` (`2026-08-24`) **Current release state:** `v6.5.10` release candidate; tag, npm publication, and GitHub Release remain pending the reviewed tag workflow. -**Latest verification:** exact implementation checkpoint `e663754b` passed 14/14 release-verifier stages with 7,186 observed tests; exact versioned-candidate verification remains pending. +**Latest verification:** exact versioned candidate `2a5be40c` passed 14/14 release-verifier stages with 7,192 observed tests; tag and publication verification remain pending. **Playback truth:** `main` **Runtimes:** Node.js 22.x, Bun, Deno **Current planning method:** [WORKFLOW.md](./WORKFLOW.md) @@ -22,15 +22,16 @@ [#128](https://github.com/git-stunts/git-cas/pull/128) merged normally as `57cd3002`; its exact reviewed head is `67147506`, and exact implementation checkpoint `e663754b` passed all 14 release-verifier stages with 7,186 - observed tests. npm, JSR, and runtime metadata identify `6.5.10`, while the - signed tag and registry artifact remain deliberately absent pending release - review. The additive contract admits bounded asset waves into the compound - scope and can retain exact selected terminal roots without changing stored - formats, handles, refs, or readers. The controlled git-warp prototype cut - cold Git commands from 139 to 50 and incremental commands from 149 to 60; - those downstream numbers remain provisional until repeated against the - public registry artifact. No application or stored-data migration is - required. + observed tests. Exact versioned candidate `2a5be40c` passed the same 14-stage + method with 7,192 observed tests. npm, JSR, and runtime metadata identify + `6.5.10`, while the signed tag and registry artifact remain deliberately + absent pending release review [#129](https://github.com/git-stunts/git-cas/pull/129). + The additive contract admits bounded asset waves into the compound scope and + can retain exact selected terminal roots without changing stored formats, + handles, refs, or readers. The controlled git-warp prototype cut cold Git + commands from 139 to 50 and incremental commands from 149 to 60; those + downstream numbers remain provisional until repeated against the public + registry artifact. No application or stored-data migration is required. - **v6.5.9 artifact posture** — implementation PR [#124](https://github.com/git-stunts/git-cas/pull/124) and release PR [#125](https://github.com/git-stunts/git-cas/pull/125) merged normally. diff --git a/docs/design/0061-compound-workspace-assets/witness/release-candidate.md b/docs/design/0061-compound-workspace-assets/witness/release-candidate.md index 8dfa6590..903188cd 100644 --- a/docs/design/0061-compound-workspace-assets/witness/release-candidate.md +++ b/docs/design/0061-compound-workspace-assets/witness/release-candidate.md @@ -6,7 +6,7 @@ Issue: #127 Implementation review: #128 -Release review: pending +Release review: #129 ## Scope @@ -49,8 +49,27 @@ before the reviewed head added only the committed verification record: | npm and JSR dry-runs | PASS | - | | **Release method summary** | **PASS: 14/14 gates** | **7,186** | -Versioned candidate verification: pending. The committed versioned tree must -pass the same method before this release review can become ready. +The versioned release-candidate tree verified below was committed as +`2a5be40c718e8069fb466af1be265357d8cb7ce0`. The following +documentation-only commit binds that immutable candidate identity into the +witness; publication still requires verification of the eventual reviewed +merge. + +The versioned candidate passed the same complete release method: + +| Gate | Result | Observed tests | +| -------------------------- | --------------------- | -------------: | +| Lint | PASS | - | +| Unit tests (Node) | PASS | 2,194 | +| Unit tests (Bun) | PASS | 2,193 | +| Unit tests (Deno) | PASS | 2,184 | +| Public type compatibility | PASS | - | +| Integration tests (Node) | PASS | 207 | +| Integration tests (Bun) | PASS | 207 | +| Integration tests (Deno) | PASS | 207 | +| Examples and build stamp | PASS | - | +| npm and JSR dry-runs | PASS | - | +| **Release method summary** | **PASS: 14/14 gates** | **7,192** | ## Semantic and Process Witness @@ -83,7 +102,7 @@ The release is additive and migration-free. Existing stored objects, handles, descriptors, ref layouts, readers, workspace generations, and retain-all calls remain compatible without rewriting or cutover. -Publication remains blocked until the versioned candidate passes the full -release method, the release PR passes hosted CI and review, the exact reviewed -merge passes verification, a signed annotated `v6.5.10` tag peels to that -merge, and the release workflow publishes npm plus the final GitHub Release. +Publication remains blocked until release PR #129 passes hosted CI and review, +the exact reviewed merge passes verification, a signed annotated `v6.5.10` tag +peels to that merge, and the release workflow publishes npm plus the final +GitHub Release. diff --git a/docs/releases/v6.5.10.md b/docs/releases/v6.5.10.md index 96d66afb..14120abe 100644 --- a/docs/releases/v6.5.10.md +++ b/docs/releases/v6.5.10.md @@ -101,9 +101,11 @@ Implementation review #128 merged normally as `e663754bf221784f0e5856a41fe071bebfa5befb` passed all 14 release-verifier stages with 7,186 observed tests across Node, Bun, Deno, public types, executable examples, real-Git integrations, build stamping, npm packing, and a -JSR publication dry-run. Exact versioned-candidate verification remains the -next release gate. No tag, npm artifact, or GitHub Release is claimed by this -candidate. +JSR publication dry-run. Exact versioned candidate +`2a5be40c718e8069fb466af1be265357d8cb7ce0` then passed the same 14-stage +method with 7,192 observed tests: 2,194 Node, 2,193 Bun, 2,184 Deno, and 207 +integration tests in each runtime. No tag, npm artifact, or GitHub Release is +claimed by this candidate. ## Compatibility diff --git a/test/unit/docs/release-state.test.js b/test/unit/docs/release-state.test.js index 1bd1e8fd..6779adee 100644 --- a/test/unit/docs/release-state.test.js +++ b/test/unit/docs/release-state.test.js @@ -460,13 +460,14 @@ function expectV6510CandidateEvidence(status, candidate, releaseNotes) { expect(status).toContain('**v6.5.10 candidate posture**'); expect(candidate).toContain('# PERF-0061 v6.5.10 Release Candidate Witness'); expect(candidate).toContain('Implementation review: #128'); - expect(candidate).toContain('Release review: pending'); + expect(candidate).toContain('Release review: #129'); expect(candidate).toContain('57cd300294a94660d2afb644c653a3be78c15d53'); expect(candidate).toContain('6714750620aa2310ad0279f957414be65898a66a'); expect(candidate).toContain('e663754bf221784f0e5856a41fe071bebfa5befb'); + expect(candidate).toContain('2a5be40c718e8069fb466af1be265357d8cb7ce0'); expect(candidate).toContain('**PASS: 14/14 gates**'); expect(candidate).toContain('**7,186**'); - expect(candidate).toContain('Versioned candidate verification: pending'); + expect(candidate).toContain('**7,192**'); expect(candidate).toMatch(/explicitly\s+unpublished\s+candidate/); expect(releaseNotes).toMatch(/requires no application or stored-data migration/); expectNoV6510PublicationEvidence(status, candidate, releaseNotes);