diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index cdfc92bf..1074017f 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -8,6 +8,17 @@ If you are learning the product for the first time, start with: - [Getting started](docs/topics/getting-started.md) - [Querying](docs/topics/querying.md) +## Release posture + +`v18.1.0` is the current release target. Architecturally, it closes the v18 +read-model cycle by making `Optic` a runtime noun, making observer reading +envelopes explicit, naming bounded support planning, and keeping release +evidence in `CHANGELOG.md` plus the consolidated `docs/topics/` shelf. + +The longer release notes live in [CHANGELOG.md](CHANGELOG.md). The runtime +architecture below describes current implementation boundaries, not aspirational +roadmap state. + ## System map ```text diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ce880c9..4a24bbae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,26 @@ 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.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [18.1.0] - 2026-06-23 +## [18.1.0] - 2026-06-24 + +### Release notes + +`v18.1.0` is the read-model closeout for the v18 line. `v18.0.0` gave users the +Worldline-first public surface; `v18.1.0` makes the read side structurally +honest by reifying `Optic`, validating coherent coordinate-backed optic reads, +giving observers explicit reading envelopes, and naming the bounded support +contracts that keep reads from falling back to whole-graph materialization. + +The release also sharpens the runtime and operator surface around that model: +`GraphDiff`, streaming traversal, stream-first materialization, sync pagination, +signed sync-auth scheme declaration, read-only MCP tools, CAS content encryption +policy, and merge-conflict classification all move previously fuzzy boundaries +into runtime-backed artifacts. + +Documentation and release evidence now follow the same rule. The live public +corpus is the root `README.md`, root `ARCHITECTURE.md`, `CHANGELOG.md`, and +`docs/topics/`; release evidence lives in the changelog and executable gates +rather than one-off release packets or retired planning documents. ### Added diff --git a/README.md b/README.md index a0642066..892444a1 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,16 @@ It lets you: - Keep provenance attached to values and outcomes. - Sync through normal Git transport. +## Latest release + +`v18.1.0` is the read-model closeout for the v18 line. It makes `Optic` a +first-class runtime noun, puts coherent optic reads on the public +`prepareOpticBasis()` → `coordinate()` → `coordinate.optic()` path, adds +observer reading envelopes, sharpens bounded support planning, and keeps the +new consolidated docs topology under an executable guard. + +See [CHANGELOG.md](CHANGELOG.md) for the full in-repository release notes. + ## Quick start ```typescript diff --git a/docs/topics/README.md b/docs/topics/README.md index eb2ad718..3332e1ab 100644 --- a/docs/topics/README.md +++ b/docs/topics/README.md @@ -3,6 +3,13 @@ Use these pages when you know what `git-warp` is and want the right page for a specific task. +## Current release + +`v18.1.0` focuses the public docs around the shipped v18 read model: worldlines, +coordinates, reified optics, observers, bounded support, strands, Git substrate, +sync, CLI, operations, and troubleshooting. The full release narrative lives in +the root [CHANGELOG](../../CHANGELOG.md). + ## Start here - [Getting started](getting-started.md): install the package, open a worldline, diff --git a/package-lock.json b/package-lock.json index cbdb3600..5e31a9d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "packages/*" ], "dependencies": { - "@git-stunts/alfred": "^0.10.3", + "@git-stunts/alfred": "^0.10.4", "@git-stunts/git-cas": "^6.0.0", "@git-stunts/plumbing": "^3.0.3", "@git-stunts/trailer-codec": "^2.1.1", @@ -472,9 +472,9 @@ } }, "node_modules/@git-stunts/alfred": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@git-stunts/alfred/-/alfred-0.10.3.tgz", - "integrity": "sha512-dvy7Ej9Jyv9gPh4PtQuMfsZnUa7ycIwoFFnXLrQutRdoTTY4F4OOD2kcSJOs3w8UZhwOyLsHO7PcetaKB9g32w==", + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@git-stunts/alfred/-/alfred-0.10.4.tgz", + "integrity": "sha512-trA8/7AjePIbfUu1tXF2pzaT6Cb93Zy2DuwaxIqvi15qqMNA6Rhb0/7dpu0kOIW3s2DqPSjV/CA6tfecbRAigw==", "license": "Apache-2.0", "engines": { "node": ">=20.0.0" diff --git a/package.json b/package.json index feae902d..d0fe39db 100644 --- a/package.json +++ b/package.json @@ -107,7 +107,7 @@ "ratchet:delta": "node scripts/ratchet-delta.ts" }, "dependencies": { - "@git-stunts/alfred": "^0.10.3", + "@git-stunts/alfred": "^0.10.4", "@git-stunts/git-cas": "^6.0.0", "@git-stunts/plumbing": "^3.0.3", "@git-stunts/trailer-codec": "^2.1.1", diff --git a/patches/@git-stunts+alfred+0.10.3.patch b/patches/@git-stunts+alfred+0.10.3.patch deleted file mode 100644 index a8ffbce6..00000000 --- a/patches/@git-stunts+alfred+0.10.3.patch +++ /dev/null @@ -1,80 +0,0 @@ -diff --git a/node_modules/@git-stunts/alfred/src/policies/timeout.js b/node_modules/@git-stunts/alfred/src/policies/timeout.js -index 0548dff..99f7db3 100644 ---- a/node_modules/@git-stunts/alfred/src/policies/timeout.js -+++ b/node_modules/@git-stunts/alfred/src/policies/timeout.js -@@ -53,36 +53,45 @@ import { resolve } from '../utils/resolvable.js'; - * await clock.advance(5000); // Triggers timeout - */ - export async function timeout(ms, fn, options = {}) { -- const { onTimeout, telemetry = new NoopSink(), clock = new SystemClock() } = options; -+ const { onTimeout, telemetry = new NoopSink() } = options; -+ const clock = options.clock || new SystemClock(); - const timeoutMs = resolve(ms); - const controller = new AbortController(); - const startTime = clock.now(); - - let completed = false; -+ let timeoutHandle = null; - -- const timeoutPromise = new Promise((_, reject) => { -- clock.sleep(timeoutMs).then(() => { -- if (completed) { -- return; -- } -- -- controller.abort(); -- const elapsed = clock.now() - startTime; -+ const rejectWithTimeout = (reject) => { -+ if (completed) { -+ return; -+ } - -- if (onTimeout) { -- onTimeout(elapsed); -- } -+ controller.abort(); -+ const elapsed = clock.now() - startTime; - -- telemetry.emit({ -- type: 'timeout', -- timestamp: clock.now(), -- timeout: timeoutMs, -- elapsed, -- metrics: { timeouts: 1, failures: 1 }, -- }); -+ if (onTimeout) { -+ onTimeout(elapsed); -+ } - -- reject(new TimeoutError(timeoutMs, elapsed)); -+ telemetry.emit({ -+ type: 'timeout', -+ timestamp: clock.now(), -+ timeout: timeoutMs, -+ elapsed, -+ metrics: { timeouts: 1, failures: 1 }, - }); -+ -+ reject(new TimeoutError(timeoutMs, elapsed)); -+ }; -+ -+ const timeoutPromise = new Promise((_, reject) => { -+ if (options.clock) { -+ clock.sleep(timeoutMs).then(() => rejectWithTimeout(reject)); -+ return; -+ } -+ -+ timeoutHandle = setTimeout(() => rejectWithTimeout(reject), timeoutMs); - }); - - try { -@@ -96,5 +105,9 @@ export async function timeout(ms, fn, options = {}) { - } catch (error) { - completed = true; - throw error; -+ } finally { -+ if (timeoutHandle !== null) { -+ clearTimeout(timeoutHandle); -+ } - } - } diff --git a/patches/README.md b/patches/README.md index 6a0e198c..0f6e9b54 100644 --- a/patches/README.md +++ b/patches/README.md @@ -4,17 +4,6 @@ This directory contains local modifications to dependencies, managed by [`patch- ## Rationale -### `@git-stunts/alfred@0.10.3` - -- **Issue:** The timeout policy only uses injected clocks, which can leave the - default runtime path without a real timer. -- **Impact:** Production timeout policies need to race against wall-clock - timers while tests can still supply deterministic clocks. -- **Why Patch?** git-warp depends on timeout enforcement before the upstream - package has released equivalent system-clock behavior. -- **Status:** Required until upstream ships the same real-clock fallback and - timer cleanup semantics. - ### `@git-stunts/trailer-codec@2.1.1` - **Issue:** The package ships JavaScript without bundled TypeScript diff --git a/test/unit/scripts/dependency-hygiene.test.ts b/test/unit/scripts/dependency-hygiene.test.ts index f4cc3820..ff7be6f8 100644 --- a/test/unit/scripts/dependency-hygiene.test.ts +++ b/test/unit/scripts/dependency-hygiene.test.ts @@ -5,12 +5,10 @@ import { describe, expect, it } from 'vitest'; const REPO_ROOT = new URL('../../../', import.meta.url); const PATCH_PACKAGE_FILES: readonly string[] = [ - '@git-stunts+alfred+0.10.3.patch', '@git-stunts+trailer-codec+2.1.1.patch', ]; const PATCH_PACKAGE_README_HEADINGS: readonly string[] = [ - '### `@git-stunts/alfred@0.10.3`', '### `@git-stunts/trailer-codec@2.1.1`', ];