diff --git a/.agents/skills/publishing-and-deployment/SKILL.md b/.agents/skills/publishing-and-deployment/SKILL.md index 96430f2e3..b50207d84 100644 --- a/.agents/skills/publishing-and-deployment/SKILL.md +++ b/.agents/skills/publishing-and-deployment/SKILL.md @@ -34,7 +34,7 @@ Registry release inventory: 18 package-bearing contracts across 9 producers; 16 | `game` | `game-scene-adapter` | `0.17.0` | `0.17.0` | `game:0.17.0` | FS.GG.Game.Render package — Adapter (sim-state -> FS.GG.UI.Scene drawables) | | `audio` | `fs-gg-audio` | `0.6.0` | `0.6.0` | `audio:0.6.0` | FS.GG.Audio.Core/.Host/.Engine/.Elmish/.WebBrowser public .fsi surfaces — AudioEffect vocabulary + IAudioBackend/IMixingBackend seam + mixing Engine + Audio.Cmd Elmish bridge + browser Web Audio host | | `net` | `fs-gg-net` | `0.6.0` | `0.6.0` | `net:0.6.0` | FS.GG.Net.Core/.WebSocket/.WebSocket.Server/.Protobuf/.Grpc/.Elmish public .fsi surfaces — ITransport/IMessageChannel seam + Sequential/Multiplexed correlation + serve/ServerEcho + WebSocket client/server transport + Google.Protobuf/protobuf-net codecs + gRPC lifecycle bridge + Elmish Cmd/Sub | -| `github` | `coord-engine` | `0.110.0` | `0.110.0` | `github:0.110.0` | the `fsgg-coord-engine` CLI verb surface (claim/take/batch/who/widen/set-paths/say/landable/done/release/flush/…) + its exit-code contract, emitted from src/FS.GG.Coord.Core/Protocol.fs; shipped as the FS.GG.Coord.Cli dotnet tool | +| `github` | `coord-engine` | `0.111.0` | `0.110.0` | `github:0.110.0` | the `fsgg-coord-engine` CLI verb surface (claim/take/batch/who/widen/set-paths/say/landable/done/release/flush/…) + its exit-code contract, emitted from src/FS.GG.Coord.Core/Protocol.fs; shipped as the FS.GG.Coord.Cli dotnet tool | | `github` | `telemetry-host` | `0.7.0` | `0.7.0` | `github:0.7.0` | optional Linux x64 FS.GG.Telemetry.Host dotnet tool — authenticated workspace-scoped ingestion, private dashboard, protected native capture and bounded learning export; independently versioned from the github coordination coherent set | | `github` | `new-sdd-workspace` | `0.21.0` | `0.21.0` | `github:0.21.0` | the `new-sdd-workspace` scaffolder CLI (package FS.GG.NewSddWorkspace) — one-command full-stack SDD workspace creation, wrapping the FS.GG.Templates `rendering` provider (ADR-0016); shipped as a dotnet tool | | `templates` | `fs-gg-workspace-template` | `0.19.0` | `0.19.0` | `templates:0.19.0` | FS.GG.Workspace.Template package, eight template configurations and seven `dotnet new` selectors: workspace-provider identities — `fs-gg-console` (provider `console` — minimal F# executable, no npm lane, ADR-0072 §2); `fs-gg-web` (provider `web` — F# ASP.NET Core + plain TypeScript/Vite website, ADR-0071 §3); `fs-gg-fable-game` (provider `fable-game` — F# ASP.NET Core + Fable/Elmish game client, SignalR for connection-oriented real-time traffic + plain HTTP endpoints with explicit versioned DTOs for typed request/response per ADR-0073, consuming the published `fs-gg-game-core-fable-lockstep-v1` profile per ADR-0069); `fs-gg-fable-bindings` (provider `fable-bindings` — Fable interop library over an exactly pinned npm package/declaration closure, ADR-0072 §3, first proved by the unreleased EHotwagner/babylonjsBindings reference) — plus `fs-gg-governance`, the separately registered pre-existing governance overlay template folded into this package at the same rename; `fs-gg-project-knowledge` and `fs-gg-python` are also already packaged. The current and legacy fable-game configurations share one selector. | @@ -119,6 +119,13 @@ A consumed journal or completed publication does not authorize another candidate Historical `release-saga-start`, prepare, component publishers and promote workflows remain sealed under GS2-08.9; their recipes do not authorize current publication. +Before pushing a coherent source cut, trace normal project-reference consumers and run their +maintained pure closure/source-axis controls alongside registry preparation. Preserve distinct +current-source, historical-source and published-dependency bindings; registry projection checks +do not qualify consumers. Run the existing changelog check and update the release-note operand +that the project actually uses. Static source checks do not establish CLR evaluation; require +separately admitted execution or current hosted CI. + 1. Qualify and merge the selected successor source. Dispatch `release-successor-candidate.yml` on current `main` once. Authenticate the successful first-attempt run and its original seven-file Actions archive: three packages, manifest, predecessor channel and two standalone qualification files. diff --git a/.claude/skills/publishing-and-deployment/SKILL.md b/.claude/skills/publishing-and-deployment/SKILL.md index 96430f2e3..b50207d84 100644 --- a/.claude/skills/publishing-and-deployment/SKILL.md +++ b/.claude/skills/publishing-and-deployment/SKILL.md @@ -34,7 +34,7 @@ Registry release inventory: 18 package-bearing contracts across 9 producers; 16 | `game` | `game-scene-adapter` | `0.17.0` | `0.17.0` | `game:0.17.0` | FS.GG.Game.Render package — Adapter (sim-state -> FS.GG.UI.Scene drawables) | | `audio` | `fs-gg-audio` | `0.6.0` | `0.6.0` | `audio:0.6.0` | FS.GG.Audio.Core/.Host/.Engine/.Elmish/.WebBrowser public .fsi surfaces — AudioEffect vocabulary + IAudioBackend/IMixingBackend seam + mixing Engine + Audio.Cmd Elmish bridge + browser Web Audio host | | `net` | `fs-gg-net` | `0.6.0` | `0.6.0` | `net:0.6.0` | FS.GG.Net.Core/.WebSocket/.WebSocket.Server/.Protobuf/.Grpc/.Elmish public .fsi surfaces — ITransport/IMessageChannel seam + Sequential/Multiplexed correlation + serve/ServerEcho + WebSocket client/server transport + Google.Protobuf/protobuf-net codecs + gRPC lifecycle bridge + Elmish Cmd/Sub | -| `github` | `coord-engine` | `0.110.0` | `0.110.0` | `github:0.110.0` | the `fsgg-coord-engine` CLI verb surface (claim/take/batch/who/widen/set-paths/say/landable/done/release/flush/…) + its exit-code contract, emitted from src/FS.GG.Coord.Core/Protocol.fs; shipped as the FS.GG.Coord.Cli dotnet tool | +| `github` | `coord-engine` | `0.111.0` | `0.110.0` | `github:0.110.0` | the `fsgg-coord-engine` CLI verb surface (claim/take/batch/who/widen/set-paths/say/landable/done/release/flush/…) + its exit-code contract, emitted from src/FS.GG.Coord.Core/Protocol.fs; shipped as the FS.GG.Coord.Cli dotnet tool | | `github` | `telemetry-host` | `0.7.0` | `0.7.0` | `github:0.7.0` | optional Linux x64 FS.GG.Telemetry.Host dotnet tool — authenticated workspace-scoped ingestion, private dashboard, protected native capture and bounded learning export; independently versioned from the github coordination coherent set | | `github` | `new-sdd-workspace` | `0.21.0` | `0.21.0` | `github:0.21.0` | the `new-sdd-workspace` scaffolder CLI (package FS.GG.NewSddWorkspace) — one-command full-stack SDD workspace creation, wrapping the FS.GG.Templates `rendering` provider (ADR-0016); shipped as a dotnet tool | | `templates` | `fs-gg-workspace-template` | `0.19.0` | `0.19.0` | `templates:0.19.0` | FS.GG.Workspace.Template package, eight template configurations and seven `dotnet new` selectors: workspace-provider identities — `fs-gg-console` (provider `console` — minimal F# executable, no npm lane, ADR-0072 §2); `fs-gg-web` (provider `web` — F# ASP.NET Core + plain TypeScript/Vite website, ADR-0071 §3); `fs-gg-fable-game` (provider `fable-game` — F# ASP.NET Core + Fable/Elmish game client, SignalR for connection-oriented real-time traffic + plain HTTP endpoints with explicit versioned DTOs for typed request/response per ADR-0073, consuming the published `fs-gg-game-core-fable-lockstep-v1` profile per ADR-0069); `fs-gg-fable-bindings` (provider `fable-bindings` — Fable interop library over an exactly pinned npm package/declaration closure, ADR-0072 §3, first proved by the unreleased EHotwagner/babylonjsBindings reference) — plus `fs-gg-governance`, the separately registered pre-existing governance overlay template folded into this package at the same rename; `fs-gg-project-knowledge` and `fs-gg-python` are also already packaged. The current and legacy fable-game configurations share one selector. | @@ -119,6 +119,13 @@ A consumed journal or completed publication does not authorize another candidate Historical `release-saga-start`, prepare, component publishers and promote workflows remain sealed under GS2-08.9; their recipes do not authorize current publication. +Before pushing a coherent source cut, trace normal project-reference consumers and run their +maintained pure closure/source-axis controls alongside registry preparation. Preserve distinct +current-source, historical-source and published-dependency bindings; registry projection checks +do not qualify consumers. Run the existing changelog check and update the release-note operand +that the project actually uses. Static source checks do not establish CLR evaluation; require +separately admitted execution or current hosted CI. + 1. Qualify and merge the selected successor source. Dispatch `release-successor-candidate.yml` on current `main` once. Authenticate the successful first-attempt run and its original seven-file Actions archive: three packages, manifest, predecessor channel and two standalone qualification files. diff --git a/.github/workflows/release-successor-candidate.yml b/.github/workflows/release-successor-candidate.yml index 3bcd889b5..36962963d 100644 --- a/.github/workflows/release-successor-candidate.yml +++ b/.github/workflows/release-successor-candidate.yml @@ -1,6 +1,6 @@ name: release-successor-candidate -# Source/byte qualification for coherent set 0.110.0 only. This route has no tag, release, +# Source/byte qualification for coherent set 0.111.0 only. This route has no tag, release, # journal, package-feed, OIDC or promotion write. Its retained Actions artifact # is an unpromoted candidate, not a published release or an admission receipt. on: @@ -43,7 +43,7 @@ jobs: test "$(git rev-parse HEAD)" = "$SOURCE_SHA" test "$(git ls-remote origin refs/heads/main | cut -f1)" = "$SOURCE_SHA" version="$(dotnet msbuild src/FS.GG.Coord.Cli/FS.GG.Coord.Cli.fsproj -getProperty:Version | tr -d '[:space:]')" - test "$version" = 0.110.0 + test "$version" = 0.111.0 echo "version=$version" >> "$GITHUB_OUTPUT" - name: Verify the stable predecessor and unused package version env: @@ -53,24 +53,24 @@ jobs: run: | set -euo pipefail mkdir -p artifacts/predecessor artifacts/packages - gh release download coherent-set/v0.109.0 --repo "$GITHUB_REPOSITORY" \ + gh release download coherent-set/v0.110.0 --repo "$GITHUB_REPOSITORY" \ --pattern stable-channel.json --dir artifacts/predecessor python3 scripts/release-saga.py predecessor \ --channel artifacts/predecessor/stable-channel.json \ - --release-tag coherent-set/v0.109.0 \ - --tag-source 0d85830e7329a2718ee57ff0f1a16e6c751a469c \ + --release-tag coherent-set/v0.110.0 \ + --tag-source 42cd9e7c8505f7cd72d5a22ad424a27af6d51458 \ > artifacts/predecessor/identity.json - test "$(jq -r .version artifacts/predecessor/identity.json)" = 0.109.0 + test "$(jq -r .version artifacts/predecessor/identity.json)" = 0.110.0 python3 scripts/check-release-candidate-uniqueness.py \ - --version "$VERSION" --predecessor 0.109.0 + --version "$VERSION" --predecessor 0.110.0 release_status="$(curl --silent --show-error --location -o /dev/null -w '%{http_code}' \ -H "Authorization: Bearer $GH_TOKEN" \ -H 'Accept: application/vnd.github+json' \ - "https://api.github.com/repos/$GITHUB_REPOSITORY/releases/tags/coherent-set/v0.110.0")" + "https://api.github.com/repos/$GITHUB_REPOSITORY/releases/tags/coherent-set/v0.111.0")" test "$release_status" = 404 test -z "$(git ls-remote --tags origin \ - 'refs/tags/coherent-set/v0.110.0' 'refs/tags/kit/v0.110.0' \ - 'refs/tags/drivers/v0.110.0' 'refs/tags/coord-engine/v0.110.0')" + 'refs/tags/coherent-set/v0.111.0' 'refs/tags/kit/v0.111.0' \ + 'refs/tags/drivers/v0.111.0' 'refs/tags/coord-engine/v0.111.0')" - name: Test the telemetry producer and prepare the browser fixture run: | set -euo pipefail @@ -183,7 +183,7 @@ jobs: set -euo pipefail test "$(git ls-remote origin refs/heads/main | cut -f1)" = "$SOURCE_SHA" python3 scripts/check-release-candidate-uniqueness.py \ - --version "$VERSION" --predecessor 0.109.0 + --version "$VERSION" --predecessor 0.110.0 - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: name: release-successor-candidate-${{ github.sha }}-${{ github.run_id }} diff --git a/.github/workflows/release-successor-feed-readiness.yml b/.github/workflows/release-successor-feed-readiness.yml index cb9ea7cf0..1671fbbea 100644 --- a/.github/workflows/release-successor-feed-readiness.yml +++ b/.github/workflows/release-successor-feed-readiness.yml @@ -1,6 +1,6 @@ name: release-successor-feed-readiness -# Informational freshness observation for a prospective 0.110.0 coherent set. +# Informational freshness observation for a prospective 0.111.0 coherent set. # This does not select a release, qualify source bytes, or authorize publication. on: workflow_dispatch: @@ -35,10 +35,10 @@ jobs: test "$(git rev-parse HEAD)" = "$SOURCE_SHA" test "$(git ls-remote origin refs/heads/main | cut -f1)" = "$SOURCE_SHA" python3 tests/release-successor-candidate/run.py - - name: Observe both feeds for 0.110.0 against published 0.109.0 + - name: Observe both feeds for 0.111.0 against published 0.110.0 env: GITHUB_TOKEN: ${{ github.token }} run: | set -euo pipefail python3 scripts/check-release-candidate-uniqueness.py \ - --version 0.110.0 --predecessor 0.109.0 + --version 0.111.0 --predecessor 0.110.0 diff --git a/Directory.Build.props b/Directory.Build.props index d30d36f7d..fce446ab9 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -625,8 +625,11 @@ + - 0.110.0 + 0.111.0 diff --git a/docs/architecture.md b/docs/architecture.md index f79fb33c7..4a33fddf8 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -653,7 +653,7 @@ product's `FS.GG.UI.*` pin), which is a different axis from the template package | `game-scene-adapter` | FS.GG.Game | `0.17.0` | `0.17.0` | | `fs-gg-audio` | FS.GG.Audio | `0.6.0` | `0.6.0` | | `fs-gg-net` | FS.GG.Net | `0.6.0` | `0.6.0` | -| `coord-engine` | FS-GG/.github | `0.110.0` | `0.110.0` | +| `coord-engine` | FS-GG/.github | `0.111.0` | `0.110.0` | | `telemetry-host` | FS-GG/.github | `0.7.0` | `0.7.0` | | `new-sdd-workspace` | FS-GG/.github | `0.21.0` | `0.21.0` | | `fs-gg-workspace-template` | FS.GG.Templates | `0.19.0` | `0.19.0` | diff --git a/docs/registry/compatibility.md b/docs/registry/compatibility.md index b305669da..e0c92b237 100644 --- a/docs/registry/compatibility.md +++ b/docs/registry/compatibility.md @@ -179,7 +179,7 @@ authored `Version` cells of the Versioned contracts table (#748).* | `fs-gg-audio` | FS.GG.Audio | `0.6.0` | `0.6.0` | | `fs-gg-net` | FS.GG.Net | `0.6.0` | `0.6.0` | | `keyboard-input` | FS.GG.Rendering | `0.5.0` | — | -| `coord-engine` | FS-GG/.github | `0.110.0` | `0.110.0` | +| `coord-engine` | FS-GG/.github | `0.111.0` | `0.110.0` | | `telemetry-host` | FS-GG/.github | `0.7.0` | `0.7.0` | | `new-sdd-workspace` | FS-GG/.github | `0.21.0` | `0.21.0` | | `fs-gg-workspace-template` | FS.GG.Templates | `0.19.0` | `0.19.0` | diff --git a/docs/roadmaps/utel-release-successor.md b/docs/roadmaps/utel-release-successor.md index 78f6c0f30..673970c7b 100644 --- a/docs/roadmaps/utel-release-successor.md +++ b/docs/roadmaps/utel-release-successor.md @@ -2037,3 +2037,50 @@ reviewed021 candidate/publication binding. No future pin is invented, no020/108 Registry published versions and consumer pins advance only after their actual promotion/adoption boundaries; no new scalar bump, current-public inventory claim or shared projection rewrite is required by this prospective source preparation. + + +### Accepted coherent110 and prospective111 operating window — 2026-10-21 + +[Delivery4743](https://github.com/FS-GG/.github/issues/4743) retains its complete seven-clause +promise under [Outcome4730](https://github.com/FS-GG/.github/issues/4730). Its guidance source +was protected through4751; four packaged work-board leaves differ from accepted110 within the +same22-leaf population. The Kit parallel-work leaves are unchanged. The organization operator +uses the complete current work-board/work-board-coord checkout instructions; operator-scope +work-board-coord is not packaged. No new Creator or SDD release follows from this guidance demand. + +Genuine110 was promoted from immutable source `42cd9e7c8505f7cd72d5a22ad424a27af6d51458`, +content `sha256:12c130cddf0a580334507cb821767ed1838884d897422f4515c3fbd6892224dc`. +Original candidate [39423302862](https://github.com/FS-GG/.github/actions/runs/39423302862), +artifact12263934322, and final same-journal publisher +[39438076230](https://github.com/FS-GG/.github/actions/runs/39438076230) are retained. +[Release418406702](https://github.com/FS-GG/.github/releases/tag/coherent-set/v0.110.0) +has seven original assets; release-manifest asset659550415 has SHA256 +`bcae24d71571ab7f0dc26abbbf00beb0abf12718b22e7060838990384b86911f`. +Completed `coord110-observer-20261020-01` remains generation33/all16 verified. Original failed +publisher and partial checkpoints, archives, channel, both-feed acceptance and installed110 +qualification remain distinct immutable evidence; never replay or repack110. + +Root selects SOURCE version0.111.0 over predecessor0.110.0, prospective logical ref +`refs/heads/fsgg/v2/journal/release/coord111-resource-aware-20261021-01` and directory +`state/releases/coord111-resource-aware-20261021-01`. This is no namespace allocation or effect +admission. Bounded source-preparation reads found no coherent111 tag/release or public NuGet111; +existing-user-token GitHub package metadata reads refused403, so private-feed collision remains +Unknown. The actual candidate/preflight must freshly authenticate all ordinary feed/ref/protection, +competing-entry/source/resource and authority prerequisites. Source reads do not prove availability. + +Keep the normal45-minute candidate graph, exact seven-member archive,60-minute publisher, +1500 Authority-entry ceiling,1800 quota floor,2700-second inner deadline and135 visibility probes. +Historical selectors, provider fences, coherent-tag-only publication, all16 durable effects and +both-feed verification remain unchanged. Exact source CI and normal protected delivery precede +separately admitted candidate, publish=false preflight and publish=true with the same original +source/archive. Reserve the full determining main/ref horizon through final retention/publication; +file-disjoint source work alone does not establish protected-ref independence. + +Whole-instruction discovery/loading and decisions during necessary organization operations are +separate from catalog presence and package/source hashes. Root has used the current complete +checkout instructions for conservative combined admission and preserved native Status readback; +that bounded ordinary-use evidence does not prove two independently useful local runtime +operations overlapping, measured combined peak, economic improvement or full4743 acceptance. +Retain actual publication and selected physical caller/instruction adoption, ordinary useful-overlap +qualification and proportionate baseline/coverage evidence as unfinished work. No synthetic product, +new ledger, publisher retry, credential acquisition or Unknown-reservation release is introduced. diff --git a/registry/CHANGELOG.md b/registry/CHANGELOG.md index 29ee463fd..ca12fc5d5 100644 --- a/registry/CHANGELOG.md +++ b/registry/CHANGELOG.md @@ -67,6 +67,9 @@ no gate behaviour changes — this is purely how humans record the log. ## Entries +- **2026-10-21** — Resource-aware guidance coherent111 source readiness (Programme/root; #4743): Advance the shared CLI/Kit/Drivers source scalar and coord-engine source version to0.111.0 for four changed packaged work-board instruction leaves within the unchanged22-leaf population. The closed ordinary route selects genuine completed110 source42cd9e7c/content12c130cd and prospective journal coord111-resource-aware-20261021-01. Published110 versions/tags, installed pins, completed journals and Creator/SDD release axes remain unchanged. Source preparation creates no namespace or effect authority; actual candidate, normal publication and instruction/caller adoption require their separate admission/readback. Full4743 useful-overlap/economic acceptance remains. + + - **2026-10-20** — — Creator021 publication and isolated installation accepted (github; #4741, #4748; creator021-publication-4741): record genuine candidate39459556960/artifact12281917883 and original publisher39462099428/a1, all eight effects/final17, promoted release418651768/source12480. Prepared package9cd48f4d and signed public NuGet4326f57d share normalized57232ac5; hosted both-feed receipts and native asset commitments retain local GitHub403/release-body timeout limits. Actual isolated public88/shared81 install and absolute help passed with genuine coherent110 source42. Preserve Creator020/013/coherent108 histories and SOURCE021 refusal. Product Python Matrix4723/parent4642 remain separate; this metadata update republishes nothing. - **2026-10-20** — coherent110-publication-accepted (Programme/root; #4731/#4730): record genuine coherent110 from source42cd9e7c8505f7cd72d5a22ad424a27af6d51458, original candidate39423302862/a1/artifact12263934322 and final publisher39438076230/a1, all16 effects/gen33. Release418406702 and all seven assets match the original producer payloads; final manifest asset659550415 has SHA256bcae24d71571ab7f0dc26abbbf00beb0abf12718b22e7060838990384b86911f. Maintained hosted GitHub-feed verification and independent public payload readbacks are accepted; the direct user CLI feed403 remains retained. Advance the canonical dist CLI pin108 to public110 and regenerate maintained projections. Original failures/checkpoints,109 history and all Unknowns survive. This does not repack110, publish Creator021, select a global installed caller or complete native observer acceptance. diff --git a/registry/dependencies.yml b/registry/dependencies.yml index a3c41ed92..185acb2f3 100644 --- a/registry/dependencies.yml +++ b/registry/dependencies.yml @@ -3,7 +3,7 @@ # versions are coherent. A `contract-change` issue MUST update this file as part of # its resolution. Human projection: docs/registry/compatibility.md. schemaVersion: 2 # → 2 (.github#1114, SDD#508 step 3): `consumers` becomes "required, may be EMPTY" — a present-but-empty `consumers: []` is now a legal, honest value for a package-bearing contract that nothing restores (the `new-sdd-workspace` scaffolder). Schema growth under #686 / ADR-0015; the FS.GG.SDD.Cli validator pin in contract-coherence.yml advances to 0.13.0 with this bump (publish-before-flip, ADR-0037: SDD published the three-state validator FIRST, in SDD#512/#516). -updated: "2026-10-20" # Changelog moved to registry/CHANGELOG.md (.github#129 / review M4): prepend one dated entry there per change and set this date to match. Kept short deliberately — the typed validator does not read this comment. +updated: "2026-10-21" # Changelog moved to registry/CHANGELOG.md (.github#129 / review M4): prepend one dated entry there per change and set this date to match. Kept short deliberately — the typed validator does not read this comment. repos: fsquint: { name: FsQuint, role: "Independent public Quint–F# decoding, replay and optional tooling" } @@ -960,7 +960,7 @@ contracts: # release416724931 and all16/final33 were independently accepted2026-10-18T22:19:39Z under #4682. # Published source75ab98dd28b1a818cc3986d595bf21e0fe691ec6 is immutable; later source prep is not in that archive. # Installed/discovery, binding5/schema3 migration and consumer/restart/rollback acceptance remain separate. - version: "0.110.0" # SOURCE/PUBLISHED: mandatory Status lifecycle and finite read-only observer, published from immutable source42cd9e7c8505f7cd72d5a22ad424a27af6d51458. Postpublication registry/pin maintenance does not repack that release. Installed instruction/caller adoption and ordinary observer acceptance remain separately owned by #4731/#4730. PRIOR: SOURCE PREPARATION ONLY: mandatory Status lifecycle reconciliation; coherent Kit/Drivers/CLI source successor. Publication and installed adoption remain separately unselected; current published109 custody is unchanged. PRIOR source scalar: immutable published109 source0d85830e7329a2718ee57ff0f1a16e6c751a469c. Later source knowledge/observer records do not repack that artifact. PRIOR: SOURCE PREPARATION ONLY: continuous board clearing, canonical native intake and complete Delivery acceptance plus bounded full-cohort acquisition (#4701/#4702). MINOR receiver-visible behavior; publication/installed/native acceptance pending. Published108 and original journal26 remain immutable. PRIOR SOURCE/PUBLISHED: genuine candidate39233536189 and same-journal forward39238215850 completed33generations/all16effects; promoted release417149016 at f984a361. Actual installed/native qualification remains separate. PRIOR SOURCE PREPARATION: successor planning read-budget repair; publication and installed qualification pending. Published107 remains unchanged. PRIOR HISTORICAL SOURCE PREPARATION: canonical work-board coordinator, explicit outcome/delivery binding5/schema3/inspection3 and integrator2, bounded migration and progress. Source delivery #4677 under #4641; independent coherent107 publication, installed caller adoption and native schema/enrollment/view acceptance remain separate. Accepted binding4/schema2/inspection2 stays unchanged; retained105 qualification is historical scope. Later selector106 observation has unknown change timing and proves neither whole runtime nor instruction discovery. Published106 pins stay unchanged. PRIOR SOURCE/PUBLISHED: exact source 2e42faaa994367b9f50be87439e8fd973ad21501, candidate 39124245029, same-journal forward 39130246438 accepted all 16 effects at final generation 33 and release 416441527. Active installed 0.105 and board binding unchanged; Host receiver adoption remains separate. PRIOR SOURCE PREPARATION: SOURCE PREPARATION ONLY: prospective coherent 0.106.0 over published 0.105.0 for passive native observation; candidate/publication/installation unselected, both-feed collision guards remain required. Published package-version/tag and active board pin stay 0.105.0. PRIOR CURRENT SOURCE/PUBLISHED: coherent-set/v0.105.0, exact candidate e54a59885580c894c8fbc67b0b27af3571ea9883; original candidate39095711219/a1 and publisher resume39098313280/a1 accepted; initial39096861301 remains an incomplete generation14 checkpoint. Maintained developer update and exact82-member installed105 payload correspondence accepted; board migration, binding and consumer acceptance remain separately scoped. PRIOR source0.104.0 is published from immutable candidate 912eba8bbd707dabcbc5011d508c479109010b71; executor 5a2d13d0 is the continuation controller only. HISTORICAL SOURCE PREPARATION: SOURCE PREPARATION ONLY: current programme migration and prospective release-specific .103 suspension; literal utel-rel-22 selection grants no allocation/publication/installed authority. Original .103 tag:intent remains Unknown with all reservations preserved. Published package-version/tag stay0.102.0. PRIOR 0.103 SOURCE PREPARATION ONLY: receiver-first bounded CI continuation and authenticated suite graphs; original utel-rel-21 effects remain unresolved, original0.102/utel-rel-20 recovery is frozen. PRIOR SOURCE/PUBLISHED: coherent-set/v0.101.0 source79051e56b025dadfc6fcaabd58b79e33f2854928, original publisher38094091013/a1; canonical generation33/all16 effects and independent both-feed CLI/Kit/Drivers payloads accepted. Installed adoption, current channel, collector activation and adapter SDK pairing remain separate. PRIOR SOURCE PREPARATION ONLY: exact CI attribution/native association and additive immutable causal receiver; selected utel-rel-19 source rail, packed receiver qualification/publication/adoption pending. Published package-version/tag remain0.100.0; current14 and local receiver-first boundary, no Host dependency. PRIOR SOURCE/PUBLISHED: coherent-set/v0.100.0 at 3ed8ad419a64253ca6f665e9779e5e4d110f50a5; retained original manifest and both-feed payload readbacks verified, stable channel promoted. Installed payload identity82/82 matches; global collector activation and genuine usage unverified, original UTEL19 custody unknown. PRIOR SOURCE ONLY: breaking current receipt ABI, current14 init/restore, explicit13 maintenance and scoped14 dashboard; prospective utel-rel-18, collision/qualification/publication pending. PRIOR SOURCE PREPARATION: 0.99.1 compatible bounded private dispatch-state IO; proposed utel-rel-17. Published frontier0.99.0; no new publication/adoption. PRIOR SOURCE ONLY: EFF schema14, prospective assessment gate and closed Drivers helper inputs. Not published/installed; package frontier remains0.98.0 and immutable utel-rel-15. Independent Host0.5 required for Store14 collection; native pilot/package qualification pending. PRIOR SOURCE/PUBLISHED: verified coherent 0.98.0 at producer 3d4f7e9c6337fb020e269e632653de0faeef6d72, journal utel-rel-15 and publisher 37434982959. PRIOR SOURCE SELECTION: additive schema 13 CI attribution correction and native compact/3 report contract; exact-source integration/qualification remains required. Published frontier remains accepted0.97.1 from99ea75286f5c3cea2a261fef4e5b45cd70378185; consumedutel-rel-13 and historical0.97.2/utel-rel-14 source are preserved. SOURCE/PUBLISHED: compatible equal feature/item telemetry fact identity and native agent binding repairs (PRs 4242/4243/4245); accepted coherent-set/v0.97.1 producer 99ea75286f5c3cea2a261fef4e5b45cd70378185 has both-feed verification. Installed root adoption and the fresh two-fact local cycle are scoped acceptance; historical and unsupported usage remain unknown. PRIOR 0.97.0 SOURCE/PUBLISHED: COORD-BOARD-V2-01.5 product adapter and guidance; publisher 37235030417 promoted exact source 2ab0c0ff9f37bdec9a11ba3604ebdc230711934f with all 16 journal effects verified and both-feed payload readback. Installed product adoption remains separate. PRIOR 0.96.0 SOURCE/PUBLISHED: UTEL-H3 coherent successor carries telemetry CI legacy-default selection repair from PR #4152 (a0044731f432b9f3f7dffa4f9d0a0c85eebb8a1b); publisher 37161212706 promoted exact source f891b5b0723070c67e08d1a87b7d12b0b4d8bebe; installed selections and receiver adoption remain separate. PRIOR 0.95.0 SOURCE/PUBLISHED — MINOR coherent successor for bounded read-only board-v2 inspection and gated organization guidance; publisher 37071597534 promoted exact source 3b5de3367f8647cea0cd9366b8cb11eddf53feae with all 16 protected-journal effects verified; installed qualification and four-target Board adoption remain pending. PRIOR 0.94.0 SOURCE/PUBLISHED — MINOR, Drivers removes the retired Python skill-helper implementations from both mirrored skill roots and the compatibility wrapper after supported callers moved to packaged F# commands; installed-package verification rejects reintroduction; includes protected native learning capture and export accumulated since 0.93.0; immutable coherent-set/v0.94.0 was promoted from source 337b6a1d53571b07ca8e1417e18e52546ad319a7 after exact both-feed readback; receiver adoption remains separate. PRIOR 0.93.0 SOURCE/PUBLISHED — MINOR, supported skill callers use packaged F# telemetry and preflight commands; includes protected native telemetry collection provenance accumulated since 0.92.0; immutable coherent release github:0.93.0 was promoted from source d53d5c4fa0a54894da87e96ae2999288fb280ea5 after protected both-feed readback; no receiver adoption is claimed. PRIOR 0.92.0 SOURCE/PUBLISHED — MINOR, additive bounded read-only `skill telemetry-config discover` for installed workflows; immutable coherent release github:0.92.0 was promoted from source eb0f73186a07daf26e0f7bb5d4c1ee2054a8adaf after exact both-feed readback; no receiver adoption is claimed. PRIOR 0.91.5 SOURCE PREPARED — FSharp.Core 10.1.401 and compatible telemetry/driver updates; package-version remains published 0.91.4 until both-feed promotion. PRIOR 0.91.4 SOURCE/PUBLISHED — coherent telemetry-capable set from f0b1bb8748cbb7b27aeaf7346b8690c82ed03343; PRIOR 0.89.0 SOURCE/PUBLISHED — MINOR, FS.GG.Drivers adds the content-addressed installed routine policy, helper and native-check closure; immutable coherent release github:0.89.0 was promoted from source 535970a06055dfcdbb96aad8726b4d7d981a5b72 after exact both-feed readback. PRIOR 0.88.0 SOURCE/PUBLISHED — MINOR, independently activated private telemetry, source-free scoped dashboard, durable receipt transport, release qualification, and intake-audit hardening. Immutable tags `coord-engine/v0.88.0` and `coherent-set/v0.88.0` resolve the accepted source d77fe195bc4e133ace8763c2158834410ca72bc0. PRIOR 0.87.0 SOURCE PREPARED — MINOR, prospective private SQLite telemetry, repository-owned Codex lifecycle observation, exact-head CI reconciliation, native outcomes, and derived whole-item budget inputs (UTEL-06.1–06.4, .github#3360–#3363). Published from exact source bffc370933ec4f35af2af4acf5f72b5888844365 and promoted after both-feed verification. PRIOR 0.86.1 SOURCE/PUBLISHED — PATCH, routed board drivers reserve the three-round fresh implementer/critic repair chain for strict items so admitted routine work remains reduced through repair (.github#3338); immutable coherent release github:0.86.1 is promoted from source ce6edfd8e3f569867e6809ca3933c6ae65769a1d with content sha256:ccea15d2acd633188f34bdaa9761137538dd834fafa43cda185dbf90c473307c. PRIOR 0.86.0 SOURCE/PUBLISHED — MINOR, reduced one-owner routine route; immutable coherent release github:0.86.0 is promoted from source beb3456ecb2c4b4cadb6bc8dc268598246449aaf with content sha256:01d0c921ab23b6807e1d6da1a9c623cd0cfb5a595bf790b51662746a0681b974. PRIOR 0.85.2 SOURCE/PUBLISHED — PATCH, guarded two-phase implementation landing accepts a missing closing keyword only under an exact typed positive acceptance-receipt obligation and fresh same-item authority, while terminal completion remains reserved for the canonically closing receipt PR (.github#3286); immutable coherent release github:0.85.2 is promoted from source e94f7da34e2c3792a2c532a4969123fd26fd601b with content sha256:3fb04e68d9b90dff5d37f3ad9d0533346cf753444effdb6de5721191557d58fa. PRIOR 0.85.1 SOURCE/PUBLISHED — PATCH, acceptance survives a forward-only, complete, path-disjoint base advance while changed candidates, conflicts, relevant overlap, and unverifiable equivalence remain fail-closed (.github#3274); immutable coherent release github:0.85.1 is promoted from source 503a07d24a6087c549bc47b5322d6f05cce2a6c5 with content sha256:f0f3706c755c767c9f761c993bb01f7a9c52c08cd74d504c1de7322aadaf471c. PRIOR 0.85.0 SOURCE/PUBLISHED — MINOR, human-authorized scope-bound synthetic lifecycle checkpoint with mandatory functional verification and strict post-anchor resumption (.github#3263); immutable coherent release github:0.85.0 is promoted from source 9307b85458b326019415f8bcf6a1d13d0139eb6a with content sha256:95892fd5d1765ec3020168f71b103a1849ae645e00de77f8fcb549ddbd510081. PRIOR 0.84.0 SOURCE/PUBLISHED — MINOR, durable content-addressed private telemetry receipts, automatic digest resolution, and separately reviewed non-counting legacy recovery (.github#3259); immutable coherent release github:0.84.0 is promoted from source 17f400d70db2cdd28efd8d7ce14327f1495411d2 with content sha256:ec226689bf12f9ede6aebab4f1f045cc1bcb24e0c8208a9fcae031387cf776d5. PRIOR 0.83.5 SOURCE/PUBLISHED — PATCH, roadmap acceptance recognizes native FS.GG.SDD.Artifacts/1.5.0 verify and ship stage schemas while retaining exact revision, work, and evidence identity (.github#3255); immutable coherent release github:0.83.5 is promoted from source 97666e7f0193b71fde5642d5950093490fbabbdb with content sha256:3519327ac384e1549a2fed7fc431f47047c63f335341ce3d8eaf8b1b63aa3a9a. PRIOR 0.83.4 SOURCE/PUBLISHED — PATCH, roadmap unit acceptance now permits a single immutable implementation/acceptance PR only under equal identities, derives the repository from applied unit authority, and proves exact one-commit canonical critique ancestry (.github#3251); immutable coherent release github:0.83.4 is promoted from source a3641ca0827187fa4ff693f627f5024dab4093b0 with content sha256:aea555a3e8a6acf9d319b42cf714b605067be23ce2c8b39647780db4a96930bf. PRIOR 0.83.3 SOURCE/PUBLISHED — PATCH, roadmap acceptance uses separately authorable structured-review and immutable-envelope identities and binds SDD observation to the current structured route work ID (.github#3247); immutable coherent release github:0.83.3 is promoted from source 5e4c23790c714b892b0c5efa25b515ae4eaf252e with content sha256:aa95e6038bd0630eb163b0001c2f5628bc0daf71d0da8170f9e6fb6e44697ec2. PRIOR 0.83.2 SOURCE/PUBLISHED — PATCH, live acceptance relies on independently regenerated ignored SDD artifacts while retaining exact-revision observation and canonical comparison (.github#3242); immutable coherent release github:0.83.2 is promoted from source 0697e72f0f5b0d6bcc9728da3589f71d24dde420 with content sha256:40072e5998da0476a0bb7ad177d5c68129268b120d2cf3a2d554dbc7490dc7ed. PRIOR 0.83.1 SOURCE/PUBLISHED — PATCH, ordered partial roadmap catalog acceptance (.github#3233); immutable coherent release github:0.83.1 is promoted from source 2237ab8282433234e0d1af3f4716ef099422e282 with content sha256:43f9d6a386ce2988e1825d0439642e2965c937ee264bec3dca107dcd78ee2c1d. PRIOR 0.83.0 SOURCE/PUBLISHED — MINOR, additive typed roadmap work-unit preparation and atomic acceptance transaction (.github#3210); immutable coherent release github:0.83.0 is promoted from source fe13bf08d82091a3d024583e0315c50d30c59376 with content sha256:0e0df10f52fdd68747739aa6083f7d5b34cdaffd35e6d16976bcfdfa1106ebaa. PRIOR 0.82.0 SOURCE/PUBLISHED — MINOR, deterministic qualification/evidence runner; immutable coherent release github:0.82.0 is promoted from source 3c53e4600110974bb1b22d3522a7d794fd24e3fd with content sha256:20cd31e6a90658237571d37874f6885789217db329ca613d4a5e819432223a0d. PRIOR 0.81.1 SOURCE/PUBLISHED — PATCH, publish-before-adopt completion; packed callers use compiled telemetry and compatibility helpers are removed. PRIOR 0.78.1 SOURCE/PUBLISHED — PATCH, stable. Documentation-only orchestration visualization design plus the auto-publish frontier repair; no engine wire change. PRIOR 0.78.0 SOURCE/PUBLISHED — MINOR, stable. Intake derives Class from the shared board vocabulary and recovers only enumerated legacy drafts after a partial create; the exact predecessor body and authoritative post-PATCH read gate receipt advancement. Packed filing skills remove the unprojectable capability example. package-version is 0.78.0 after immutable dual-feed promotion. PRIOR 0.77.0 SOURCE/PUBLISHED — MINOR. ADR-0079 makes one Accountable Delivery Owner the sole routine authorization boundary; packed pnext-item retains exact-head critique/repair/acceptance evidence under distinct phase identities but requires no external person, account, agent, or approval quorum. PRIOR 0.76.0 SOURCE/PUBLISHED — MINOR. The coherent Kit adds initialize-sdd-workspace as a new receiver-visible member; Drivers and Coord.Cli advance on the shared scalar with no engine wire change. PRIOR 0.75.5 SOURCE/PUBLISHED — PATCH, stable (.github#2983, source PR #2990, merge 34b1fd8b). Three compatible lifecycle repairs ship: successful completed post-merge runs classify correctly, completion provenance preserves the full GraphQL merge OID, and closed delivery reads authoritative issue Paths while retaining unread-versus-undeclared state. Protocol.fs has zero wire commits across the span. PRIOR 0.75.4 SOURCE/PUBLISHED — PATCH, stable (.github#2941, source PR #2967, merge 8d720471). Nine accumulated non-wire engine commits ship with corrected cumulative release notes; Protocol.fs has zero wire commits across the release span. PRIOR 0.75.3 SOURCE/PUBLISHED — PATCH, stable, source 264725f374e3f05da46d7c3089462076a1f9bf7a; the immutable release predates this correction and its embedded notes misdescribe the accumulated changes. PRIOR: 0.74.0 SOURCE/PUBLISHED — MINOR, stable (.github#2876, source PR #2879). Five pre-existing non-wire engine-path commits plus the release-preparation commit are shipped from d4458d8fdfff0c332c80d920202ab0230bd9de0f; Protocol.fs is unchanged across the release span. PRIOR: 0.71.0 SOURCE/PUBLISHED — MINOR, stable (.github#2813, source PR #2814). Forward recovery ships the live stable-predecessor authority from source 3890c8f6b20fcd2c1fdd5b2a9a5356877c217397 while poisoned 0.70.0 remains unpromoted. Previous coherent registry frontier: 0.68.0. PRIOR 0.68.0 SOURCE/PUBLISHED — MINOR, stable (.github#2794, source PR #2803). Four additive exhausted-review/forced-claim commits are shipped with zero Protocol.fs wire commits. Previous coherent registry frontier: 0.67.0. PRIOR 0.67.0 SOURCE/PUBLISHED — MINOR, stable (.github#2756, PR #2792). Durable bounded review-wait receipts and the ordinary full fresh-successor review route are additive receiver-visible semantics. Previous coherent registry frontier: 0.66.0. PRIOR 0.66.0 SOURCE/PUBLISHED — MINOR, stable (.github#2757, PR #2789). The packaged findings-and-filing contract adds the named `disclosed residual` terminal state: measured bound, caller-facing disclosure, executable red pin, and durable authorized decision are conjunctive; a #266 check that cannot fail is explicitly excluded. Previous coherent registry frontier: 0.65.0. PRIOR 0.61.0 SOURCE/PUBLISHED — MINOR, stable. Two receiver-observable legs, either of which carries the line on the criterion the 0.56.0, 0.57.0, 0.59.0 and 0.60.0 entries used (.github#2712, PR #2745, engine commit 73024dc3): the board gains a `Kind:` body-line sentinel with a CLOSED four-value vocabulary — work|anchor|register|directive — in the same grammar as `Paths:`/`Class:`/`Blocked on:`, and a row declaring a NON-`work` kind is EXEMPT FROM THE LIFECYCLE REDUCER ENTIRELY (no projected Status, no persisted watermark, no park, no promotion, no Done), which the scheduler reports through a NEW verdict `not-a-unit-of-work` naming the kind rather than the row's column; and `ready --json` plus the board reads gain two per-row fields, `kind` (null until an operator creates the field) and `commentCount` (observable REGISTER DEPTH, riding the existing board page query as a connection totalCount and selecting no nodes, so the board read costs what it did before). AN ABSENT `Kind:` LINE MEANS `work`, so every row that existed at 0.60.0 behaves exactly as it did — the opposite default from an absent `Class:` line, deliberately. THE WIRE SURFACE DID MOVE HERE, AND ADDITIVELY, which is the honest difference from the 0.59.0 and 0.60.0 entries and is measured rather than asserted: src/FS.GG.Coord.Core/Protocol.fs is 214 insertions/254 deletions across coord-engine/v0.60.0..v0.61.0, but classifying that diff line by line finds ZERO removed type/DU/let/member definitions and exactly ONE added case, `Schedulability.NotAUnitOfWork` — the churn is the projected rule PROSE, not surface removal, so this is a MINOR BY ADDITION and not a MAJOR. THE SPAN IS 32 commits, of which 15 touch the engine paths under `git rev-list --full-history` and only 12 under default history simplification; BOTH numbers are stated because the smaller one is what a reader gets by default, and .github#2743 — the row that ordered this cut — records exactly that merge-vs-squash sensitivity as a real gate defect. Cut under per-cut operator authorisation (.github#2743 Sequencing; the 0.60.0 authorisation explicitly did not extend forward). PRIOR 0.60.0 SOURCE/PUBLISHED — MINOR, stable. Two receiver-visible legs, either of which carries the line on the criterion the 0.56.0, 0.57.0 and 0.59.0 entries used (.github#2645, PR #2650, engine commit aea56a4a): `claim --json` reports differently — `statusWrite` gains a FIFTH value `withheld`, distinct from `failed` (asserts a mutation was sent) and `deferred` (promises `flush`), and `converged` now means agreement with the DERIVED destination rather than with the literal column `In progress` — and the packed kit retires a start-gate `jq` predicate asserting `.status == "In progress"` that receivers copy verbatim. THE WIRE SURFACE IS UNCHANGED and that is measured, not assumed: check-engine-freshness reported 0 of the 2 unreleased engine commits touching src/FS.GG.Coord.Core/Protocol.fs, so `withheld` is a new INHABITANT of an existing reported field, not a new verb, flag, help entry, render name, result name or exit code. Cut by .github#2409's MANUAL path (.github#2713) because nothing automatic can cut it: kit-auto-publish.py:99-100 refuses this candidate `candidate-not-next-patch` — 0.60.0 opens a NEW minor line against a 0.59.0 frontier, failing the first clause and short-circuiting before the sibling-tag block at :101 — which is the rail working by design (.github#2442), verified here by driving decide() over the live facts with a 0.59.1 control that clears that same rail. PRIOR 0.59.0 SOURCE/PUBLISHED — MINOR, stable. Five receiver-visible engine defect fixes (.github#2575/#2662/#2683/#2678/#2694) plus a new reviewer protocol boundary in the packed pnext-item skill (finding-packet contract + independent-review consolidation), which is the 0.57.0 entry's shape. The 290 lines of new .fsi surface are corroboration only: FS.GG.Coord.Core.Operation is IsPackable=false and unreferenced by the CLI, so it reaches no receiver, and Protocol.fs is byte-identical across the span (.github#2648, PR #2706, round-1 finding by critic heron-d444). This cut ABANDONS 0.58.1, whose three tags at a415652f published nothing on either feed (.github#2654); those tags are immutable and are deliberately left alone (.github#1772). PRIOR 0.58.0 — 0.58.1 was never published and must not be read as a prior. + version: "0.111.0" # SOURCE ONLY: #4743 operation-specific admission and source/ref/preflight guidance; normal coherent111 readiness over completed110. Published110/installed pins unchanged. PRIOR SOURCE/PUBLISHED: mandatory Status lifecycle and finite read-only observer, published from immutable source42cd9e7c8505f7cd72d5a22ad424a27af6d51458. Postpublication registry/pin maintenance does not repack that release. Installed instruction/caller adoption and ordinary observer acceptance remain separately owned by #4731/#4730. PRIOR: SOURCE PREPARATION ONLY: mandatory Status lifecycle reconciliation; coherent Kit/Drivers/CLI source successor. Publication and installed adoption remain separately unselected; current published109 custody is unchanged. PRIOR source scalar: immutable published109 source0d85830e7329a2718ee57ff0f1a16e6c751a469c. Later source knowledge/observer records do not repack that artifact. PRIOR: SOURCE PREPARATION ONLY: continuous board clearing, canonical native intake and complete Delivery acceptance plus bounded full-cohort acquisition (#4701/#4702). MINOR receiver-visible behavior; publication/installed/native acceptance pending. Published108 and original journal26 remain immutable. PRIOR SOURCE/PUBLISHED: genuine candidate39233536189 and same-journal forward39238215850 completed33generations/all16effects; promoted release417149016 at f984a361. Actual installed/native qualification remains separate. PRIOR SOURCE PREPARATION: successor planning read-budget repair; publication and installed qualification pending. Published107 remains unchanged. PRIOR HISTORICAL SOURCE PREPARATION: canonical work-board coordinator, explicit outcome/delivery binding5/schema3/inspection3 and integrator2, bounded migration and progress. Source delivery #4677 under #4641; independent coherent107 publication, installed caller adoption and native schema/enrollment/view acceptance remain separate. Accepted binding4/schema2/inspection2 stays unchanged; retained105 qualification is historical scope. Later selector106 observation has unknown change timing and proves neither whole runtime nor instruction discovery. Published106 pins stay unchanged. PRIOR SOURCE/PUBLISHED: exact source 2e42faaa994367b9f50be87439e8fd973ad21501, candidate 39124245029, same-journal forward 39130246438 accepted all 16 effects at final generation 33 and release 416441527. Active installed 0.105 and board binding unchanged; Host receiver adoption remains separate. PRIOR SOURCE PREPARATION: SOURCE PREPARATION ONLY: prospective coherent 0.106.0 over published 0.105.0 for passive native observation; candidate/publication/installation unselected, both-feed collision guards remain required. Published package-version/tag and active board pin stay 0.105.0. PRIOR CURRENT SOURCE/PUBLISHED: coherent-set/v0.105.0, exact candidate e54a59885580c894c8fbc67b0b27af3571ea9883; original candidate39095711219/a1 and publisher resume39098313280/a1 accepted; initial39096861301 remains an incomplete generation14 checkpoint. Maintained developer update and exact82-member installed105 payload correspondence accepted; board migration, binding and consumer acceptance remain separately scoped. PRIOR source0.104.0 is published from immutable candidate 912eba8bbd707dabcbc5011d508c479109010b71; executor 5a2d13d0 is the continuation controller only. HISTORICAL SOURCE PREPARATION: SOURCE PREPARATION ONLY: current programme migration and prospective release-specific .103 suspension; literal utel-rel-22 selection grants no allocation/publication/installed authority. Original .103 tag:intent remains Unknown with all reservations preserved. Published package-version/tag stay0.102.0. PRIOR 0.103 SOURCE PREPARATION ONLY: receiver-first bounded CI continuation and authenticated suite graphs; original utel-rel-21 effects remain unresolved, original0.102/utel-rel-20 recovery is frozen. PRIOR SOURCE/PUBLISHED: coherent-set/v0.101.0 source79051e56b025dadfc6fcaabd58b79e33f2854928, original publisher38094091013/a1; canonical generation33/all16 effects and independent both-feed CLI/Kit/Drivers payloads accepted. Installed adoption, current channel, collector activation and adapter SDK pairing remain separate. PRIOR SOURCE PREPARATION ONLY: exact CI attribution/native association and additive immutable causal receiver; selected utel-rel-19 source rail, packed receiver qualification/publication/adoption pending. Published package-version/tag remain0.100.0; current14 and local receiver-first boundary, no Host dependency. PRIOR SOURCE/PUBLISHED: coherent-set/v0.100.0 at 3ed8ad419a64253ca6f665e9779e5e4d110f50a5; retained original manifest and both-feed payload readbacks verified, stable channel promoted. Installed payload identity82/82 matches; global collector activation and genuine usage unverified, original UTEL19 custody unknown. PRIOR SOURCE ONLY: breaking current receipt ABI, current14 init/restore, explicit13 maintenance and scoped14 dashboard; prospective utel-rel-18, collision/qualification/publication pending. PRIOR SOURCE PREPARATION: 0.99.1 compatible bounded private dispatch-state IO; proposed utel-rel-17. Published frontier0.99.0; no new publication/adoption. PRIOR SOURCE ONLY: EFF schema14, prospective assessment gate and closed Drivers helper inputs. Not published/installed; package frontier remains0.98.0 and immutable utel-rel-15. Independent Host0.5 required for Store14 collection; native pilot/package qualification pending. PRIOR SOURCE/PUBLISHED: verified coherent 0.98.0 at producer 3d4f7e9c6337fb020e269e632653de0faeef6d72, journal utel-rel-15 and publisher 37434982959. PRIOR SOURCE SELECTION: additive schema 13 CI attribution correction and native compact/3 report contract; exact-source integration/qualification remains required. Published frontier remains accepted0.97.1 from99ea75286f5c3cea2a261fef4e5b45cd70378185; consumedutel-rel-13 and historical0.97.2/utel-rel-14 source are preserved. SOURCE/PUBLISHED: compatible equal feature/item telemetry fact identity and native agent binding repairs (PRs 4242/4243/4245); accepted coherent-set/v0.97.1 producer 99ea75286f5c3cea2a261fef4e5b45cd70378185 has both-feed verification. Installed root adoption and the fresh two-fact local cycle are scoped acceptance; historical and unsupported usage remain unknown. PRIOR 0.97.0 SOURCE/PUBLISHED: COORD-BOARD-V2-01.5 product adapter and guidance; publisher 37235030417 promoted exact source 2ab0c0ff9f37bdec9a11ba3604ebdc230711934f with all 16 journal effects verified and both-feed payload readback. Installed product adoption remains separate. PRIOR 0.96.0 SOURCE/PUBLISHED: UTEL-H3 coherent successor carries telemetry CI legacy-default selection repair from PR #4152 (a0044731f432b9f3f7dffa4f9d0a0c85eebb8a1b); publisher 37161212706 promoted exact source f891b5b0723070c67e08d1a87b7d12b0b4d8bebe; installed selections and receiver adoption remain separate. PRIOR 0.95.0 SOURCE/PUBLISHED — MINOR coherent successor for bounded read-only board-v2 inspection and gated organization guidance; publisher 37071597534 promoted exact source 3b5de3367f8647cea0cd9366b8cb11eddf53feae with all 16 protected-journal effects verified; installed qualification and four-target Board adoption remain pending. PRIOR 0.94.0 SOURCE/PUBLISHED — MINOR, Drivers removes the retired Python skill-helper implementations from both mirrored skill roots and the compatibility wrapper after supported callers moved to packaged F# commands; installed-package verification rejects reintroduction; includes protected native learning capture and export accumulated since 0.93.0; immutable coherent-set/v0.94.0 was promoted from source 337b6a1d53571b07ca8e1417e18e52546ad319a7 after exact both-feed readback; receiver adoption remains separate. PRIOR 0.93.0 SOURCE/PUBLISHED — MINOR, supported skill callers use packaged F# telemetry and preflight commands; includes protected native telemetry collection provenance accumulated since 0.92.0; immutable coherent release github:0.93.0 was promoted from source d53d5c4fa0a54894da87e96ae2999288fb280ea5 after protected both-feed readback; no receiver adoption is claimed. PRIOR 0.92.0 SOURCE/PUBLISHED — MINOR, additive bounded read-only `skill telemetry-config discover` for installed workflows; immutable coherent release github:0.92.0 was promoted from source eb0f73186a07daf26e0f7bb5d4c1ee2054a8adaf after exact both-feed readback; no receiver adoption is claimed. PRIOR 0.91.5 SOURCE PREPARED — FSharp.Core 10.1.401 and compatible telemetry/driver updates; package-version remains published 0.91.4 until both-feed promotion. PRIOR 0.91.4 SOURCE/PUBLISHED — coherent telemetry-capable set from f0b1bb8748cbb7b27aeaf7346b8690c82ed03343; PRIOR 0.89.0 SOURCE/PUBLISHED — MINOR, FS.GG.Drivers adds the content-addressed installed routine policy, helper and native-check closure; immutable coherent release github:0.89.0 was promoted from source 535970a06055dfcdbb96aad8726b4d7d981a5b72 after exact both-feed readback. PRIOR 0.88.0 SOURCE/PUBLISHED — MINOR, independently activated private telemetry, source-free scoped dashboard, durable receipt transport, release qualification, and intake-audit hardening. Immutable tags `coord-engine/v0.88.0` and `coherent-set/v0.88.0` resolve the accepted source d77fe195bc4e133ace8763c2158834410ca72bc0. PRIOR 0.87.0 SOURCE PREPARED — MINOR, prospective private SQLite telemetry, repository-owned Codex lifecycle observation, exact-head CI reconciliation, native outcomes, and derived whole-item budget inputs (UTEL-06.1–06.4, .github#3360–#3363). Published from exact source bffc370933ec4f35af2af4acf5f72b5888844365 and promoted after both-feed verification. PRIOR 0.86.1 SOURCE/PUBLISHED — PATCH, routed board drivers reserve the three-round fresh implementer/critic repair chain for strict items so admitted routine work remains reduced through repair (.github#3338); immutable coherent release github:0.86.1 is promoted from source ce6edfd8e3f569867e6809ca3933c6ae65769a1d with content sha256:ccea15d2acd633188f34bdaa9761137538dd834fafa43cda185dbf90c473307c. PRIOR 0.86.0 SOURCE/PUBLISHED — MINOR, reduced one-owner routine route; immutable coherent release github:0.86.0 is promoted from source beb3456ecb2c4b4cadb6bc8dc268598246449aaf with content sha256:01d0c921ab23b6807e1d6da1a9c623cd0cfb5a595bf790b51662746a0681b974. PRIOR 0.85.2 SOURCE/PUBLISHED — PATCH, guarded two-phase implementation landing accepts a missing closing keyword only under an exact typed positive acceptance-receipt obligation and fresh same-item authority, while terminal completion remains reserved for the canonically closing receipt PR (.github#3286); immutable coherent release github:0.85.2 is promoted from source e94f7da34e2c3792a2c532a4969123fd26fd601b with content sha256:3fb04e68d9b90dff5d37f3ad9d0533346cf753444effdb6de5721191557d58fa. PRIOR 0.85.1 SOURCE/PUBLISHED — PATCH, acceptance survives a forward-only, complete, path-disjoint base advance while changed candidates, conflicts, relevant overlap, and unverifiable equivalence remain fail-closed (.github#3274); immutable coherent release github:0.85.1 is promoted from source 503a07d24a6087c549bc47b5322d6f05cce2a6c5 with content sha256:f0f3706c755c767c9f761c993bb01f7a9c52c08cd74d504c1de7322aadaf471c. PRIOR 0.85.0 SOURCE/PUBLISHED — MINOR, human-authorized scope-bound synthetic lifecycle checkpoint with mandatory functional verification and strict post-anchor resumption (.github#3263); immutable coherent release github:0.85.0 is promoted from source 9307b85458b326019415f8bcf6a1d13d0139eb6a with content sha256:95892fd5d1765ec3020168f71b103a1849ae645e00de77f8fcb549ddbd510081. PRIOR 0.84.0 SOURCE/PUBLISHED — MINOR, durable content-addressed private telemetry receipts, automatic digest resolution, and separately reviewed non-counting legacy recovery (.github#3259); immutable coherent release github:0.84.0 is promoted from source 17f400d70db2cdd28efd8d7ce14327f1495411d2 with content sha256:ec226689bf12f9ede6aebab4f1f045cc1bcb24e0c8208a9fcae031387cf776d5. PRIOR 0.83.5 SOURCE/PUBLISHED — PATCH, roadmap acceptance recognizes native FS.GG.SDD.Artifacts/1.5.0 verify and ship stage schemas while retaining exact revision, work, and evidence identity (.github#3255); immutable coherent release github:0.83.5 is promoted from source 97666e7f0193b71fde5642d5950093490fbabbdb with content sha256:3519327ac384e1549a2fed7fc431f47047c63f335341ce3d8eaf8b1b63aa3a9a. PRIOR 0.83.4 SOURCE/PUBLISHED — PATCH, roadmap unit acceptance now permits a single immutable implementation/acceptance PR only under equal identities, derives the repository from applied unit authority, and proves exact one-commit canonical critique ancestry (.github#3251); immutable coherent release github:0.83.4 is promoted from source a3641ca0827187fa4ff693f627f5024dab4093b0 with content sha256:aea555a3e8a6acf9d319b42cf714b605067be23ce2c8b39647780db4a96930bf. PRIOR 0.83.3 SOURCE/PUBLISHED — PATCH, roadmap acceptance uses separately authorable structured-review and immutable-envelope identities and binds SDD observation to the current structured route work ID (.github#3247); immutable coherent release github:0.83.3 is promoted from source 5e4c23790c714b892b0c5efa25b515ae4eaf252e with content sha256:aa95e6038bd0630eb163b0001c2f5628bc0daf71d0da8170f9e6fb6e44697ec2. PRIOR 0.83.2 SOURCE/PUBLISHED — PATCH, live acceptance relies on independently regenerated ignored SDD artifacts while retaining exact-revision observation and canonical comparison (.github#3242); immutable coherent release github:0.83.2 is promoted from source 0697e72f0f5b0d6bcc9728da3589f71d24dde420 with content sha256:40072e5998da0476a0bb7ad177d5c68129268b120d2cf3a2d554dbc7490dc7ed. PRIOR 0.83.1 SOURCE/PUBLISHED — PATCH, ordered partial roadmap catalog acceptance (.github#3233); immutable coherent release github:0.83.1 is promoted from source 2237ab8282433234e0d1af3f4716ef099422e282 with content sha256:43f9d6a386ce2988e1825d0439642e2965c937ee264bec3dca107dcd78ee2c1d. PRIOR 0.83.0 SOURCE/PUBLISHED — MINOR, additive typed roadmap work-unit preparation and atomic acceptance transaction (.github#3210); immutable coherent release github:0.83.0 is promoted from source fe13bf08d82091a3d024583e0315c50d30c59376 with content sha256:0e0df10f52fdd68747739aa6083f7d5b34cdaffd35e6d16976bcfdfa1106ebaa. PRIOR 0.82.0 SOURCE/PUBLISHED — MINOR, deterministic qualification/evidence runner; immutable coherent release github:0.82.0 is promoted from source 3c53e4600110974bb1b22d3522a7d794fd24e3fd with content sha256:20cd31e6a90658237571d37874f6885789217db329ca613d4a5e819432223a0d. PRIOR 0.81.1 SOURCE/PUBLISHED — PATCH, publish-before-adopt completion; packed callers use compiled telemetry and compatibility helpers are removed. PRIOR 0.78.1 SOURCE/PUBLISHED — PATCH, stable. Documentation-only orchestration visualization design plus the auto-publish frontier repair; no engine wire change. PRIOR 0.78.0 SOURCE/PUBLISHED — MINOR, stable. Intake derives Class from the shared board vocabulary and recovers only enumerated legacy drafts after a partial create; the exact predecessor body and authoritative post-PATCH read gate receipt advancement. Packed filing skills remove the unprojectable capability example. package-version is 0.78.0 after immutable dual-feed promotion. PRIOR 0.77.0 SOURCE/PUBLISHED — MINOR. ADR-0079 makes one Accountable Delivery Owner the sole routine authorization boundary; packed pnext-item retains exact-head critique/repair/acceptance evidence under distinct phase identities but requires no external person, account, agent, or approval quorum. PRIOR 0.76.0 SOURCE/PUBLISHED — MINOR. The coherent Kit adds initialize-sdd-workspace as a new receiver-visible member; Drivers and Coord.Cli advance on the shared scalar with no engine wire change. PRIOR 0.75.5 SOURCE/PUBLISHED — PATCH, stable (.github#2983, source PR #2990, merge 34b1fd8b). Three compatible lifecycle repairs ship: successful completed post-merge runs classify correctly, completion provenance preserves the full GraphQL merge OID, and closed delivery reads authoritative issue Paths while retaining unread-versus-undeclared state. Protocol.fs has zero wire commits across the span. PRIOR 0.75.4 SOURCE/PUBLISHED — PATCH, stable (.github#2941, source PR #2967, merge 8d720471). Nine accumulated non-wire engine commits ship with corrected cumulative release notes; Protocol.fs has zero wire commits across the release span. PRIOR 0.75.3 SOURCE/PUBLISHED — PATCH, stable, source 264725f374e3f05da46d7c3089462076a1f9bf7a; the immutable release predates this correction and its embedded notes misdescribe the accumulated changes. PRIOR: 0.74.0 SOURCE/PUBLISHED — MINOR, stable (.github#2876, source PR #2879). Five pre-existing non-wire engine-path commits plus the release-preparation commit are shipped from d4458d8fdfff0c332c80d920202ab0230bd9de0f; Protocol.fs is unchanged across the release span. PRIOR: 0.71.0 SOURCE/PUBLISHED — MINOR, stable (.github#2813, source PR #2814). Forward recovery ships the live stable-predecessor authority from source 3890c8f6b20fcd2c1fdd5b2a9a5356877c217397 while poisoned 0.70.0 remains unpromoted. Previous coherent registry frontier: 0.68.0. PRIOR 0.68.0 SOURCE/PUBLISHED — MINOR, stable (.github#2794, source PR #2803). Four additive exhausted-review/forced-claim commits are shipped with zero Protocol.fs wire commits. Previous coherent registry frontier: 0.67.0. PRIOR 0.67.0 SOURCE/PUBLISHED — MINOR, stable (.github#2756, PR #2792). Durable bounded review-wait receipts and the ordinary full fresh-successor review route are additive receiver-visible semantics. Previous coherent registry frontier: 0.66.0. PRIOR 0.66.0 SOURCE/PUBLISHED — MINOR, stable (.github#2757, PR #2789). The packaged findings-and-filing contract adds the named `disclosed residual` terminal state: measured bound, caller-facing disclosure, executable red pin, and durable authorized decision are conjunctive; a #266 check that cannot fail is explicitly excluded. Previous coherent registry frontier: 0.65.0. PRIOR 0.61.0 SOURCE/PUBLISHED — MINOR, stable. Two receiver-observable legs, either of which carries the line on the criterion the 0.56.0, 0.57.0, 0.59.0 and 0.60.0 entries used (.github#2712, PR #2745, engine commit 73024dc3): the board gains a `Kind:` body-line sentinel with a CLOSED four-value vocabulary — work|anchor|register|directive — in the same grammar as `Paths:`/`Class:`/`Blocked on:`, and a row declaring a NON-`work` kind is EXEMPT FROM THE LIFECYCLE REDUCER ENTIRELY (no projected Status, no persisted watermark, no park, no promotion, no Done), which the scheduler reports through a NEW verdict `not-a-unit-of-work` naming the kind rather than the row's column; and `ready --json` plus the board reads gain two per-row fields, `kind` (null until an operator creates the field) and `commentCount` (observable REGISTER DEPTH, riding the existing board page query as a connection totalCount and selecting no nodes, so the board read costs what it did before). AN ABSENT `Kind:` LINE MEANS `work`, so every row that existed at 0.60.0 behaves exactly as it did — the opposite default from an absent `Class:` line, deliberately. THE WIRE SURFACE DID MOVE HERE, AND ADDITIVELY, which is the honest difference from the 0.59.0 and 0.60.0 entries and is measured rather than asserted: src/FS.GG.Coord.Core/Protocol.fs is 214 insertions/254 deletions across coord-engine/v0.60.0..v0.61.0, but classifying that diff line by line finds ZERO removed type/DU/let/member definitions and exactly ONE added case, `Schedulability.NotAUnitOfWork` — the churn is the projected rule PROSE, not surface removal, so this is a MINOR BY ADDITION and not a MAJOR. THE SPAN IS 32 commits, of which 15 touch the engine paths under `git rev-list --full-history` and only 12 under default history simplification; BOTH numbers are stated because the smaller one is what a reader gets by default, and .github#2743 — the row that ordered this cut — records exactly that merge-vs-squash sensitivity as a real gate defect. Cut under per-cut operator authorisation (.github#2743 Sequencing; the 0.60.0 authorisation explicitly did not extend forward). PRIOR 0.60.0 SOURCE/PUBLISHED — MINOR, stable. Two receiver-visible legs, either of which carries the line on the criterion the 0.56.0, 0.57.0 and 0.59.0 entries used (.github#2645, PR #2650, engine commit aea56a4a): `claim --json` reports differently — `statusWrite` gains a FIFTH value `withheld`, distinct from `failed` (asserts a mutation was sent) and `deferred` (promises `flush`), and `converged` now means agreement with the DERIVED destination rather than with the literal column `In progress` — and the packed kit retires a start-gate `jq` predicate asserting `.status == "In progress"` that receivers copy verbatim. THE WIRE SURFACE IS UNCHANGED and that is measured, not assumed: check-engine-freshness reported 0 of the 2 unreleased engine commits touching src/FS.GG.Coord.Core/Protocol.fs, so `withheld` is a new INHABITANT of an existing reported field, not a new verb, flag, help entry, render name, result name or exit code. Cut by .github#2409's MANUAL path (.github#2713) because nothing automatic can cut it: kit-auto-publish.py:99-100 refuses this candidate `candidate-not-next-patch` — 0.60.0 opens a NEW minor line against a 0.59.0 frontier, failing the first clause and short-circuiting before the sibling-tag block at :101 — which is the rail working by design (.github#2442), verified here by driving decide() over the live facts with a 0.59.1 control that clears that same rail. PRIOR 0.59.0 SOURCE/PUBLISHED — MINOR, stable. Five receiver-visible engine defect fixes (.github#2575/#2662/#2683/#2678/#2694) plus a new reviewer protocol boundary in the packed pnext-item skill (finding-packet contract + independent-review consolidation), which is the 0.57.0 entry's shape. The 290 lines of new .fsi surface are corroboration only: FS.GG.Coord.Core.Operation is IsPackable=false and unreferenced by the CLI, so it reaches no receiver, and Protocol.fs is byte-identical across the span (.github#2648, PR #2706, round-1 finding by critic heron-d444). This cut ABANDONS 0.58.1, whose three tags at a415652f published nothing on either feed (.github#2654); those tags are immutable and are deliberately left alone (.github#1772). PRIOR 0.58.0 — 0.58.1 was never published and must not be read as a prior. # HISTORICAL PACKAGE: 0.91.2, immutable coherent-set/v0.91.2 from source fc64f351a6c7733c3df6520ad1e1671bfcc1714b; content sha256:a3073f2b92d64048e1b8ee08e76263a1b5d6d56b6c75dd930505aa9eb3fcecd6. Publisher run 35506239965 and protected journal fsgg/v2/journal/release/utel-rel-03 verified all three members on both feeds and promotion. Manifest SHA-256 1f98d1f970810ecd357252663ad0582c97b0dd42008bb3b55b9b585bfa4f4cfa; stable-channel SHA-256 317ff8d08f484ecec5063ce7495da63bc33b18e40707ecb0ae9c46bd158d6984. PRIOR 0.91.1 from source 05e3feadcce3d546a05b2a4e0b1780e8a642a228; content sha256:3a87727ed7178b79e00f904457f19abcff1e7b00b0a93cc593568735eb28aefc. Both feeds verified all three members; producer CLI 0.91.1 adopted on both dev containers. PRIOR 0.91.0 from source 85c356b2c44cfea4b83659b14b6946d64bbd9a22; content sha256:c8b03938aa6357f696ff9ca257315e02f79e0a23ef8b6d87d37430139f2e600c. Prior package-version: 0.90.0. package-version: "0.110.0" # PUBLISHED coherent-set/v0.110.0: original39423302862/a1/artifact12263934322, final39438076230/a1, all16effects/gen33, release418406702 accepted2026-10-20T14:35:18Z. All7native assets and3public producer payloads match; maintained hosted GitHub-feed verification is retained beside the direct user CLI read403. Canonical source pin is not installed/native acceptance (#4731/#4730). PRIOR: PUBLISHED coherent-set/v0.109.0: original39302112260/artifact12210674422, final39317658813, all16effects/final33 and independent native7assets/3public payload readback accepted2026-10-19T20:36:20Z. Installed/native consumer acceptance remains separately owned #4712. PRIOR: PUBLISHED coherent-set/v0.108.0 at f984a3619129c5e9ab68e1291fd080ef77ef9337; independent full-chain/public7asset/3NuGetpayload acceptance2026-10-19T10:56:28Z. PRIOR PUBLISHED coherent-set/v0.107.0 at source75ab98dd; #4682 accepted original39170373582/a1 complete. PRIOR PUBLISHED: coherent-set/v0.106.0, release 416441527, original candidate 2e42faaa994367b9f50be87439e8fd973ad21501/content sha256:351a435c1f162f3ff8ca8e6722d58b34b193b44744a6a207f9bb57f015f8204d. Original 39127872315 remains incomplete generation 16; separately admitted 39130246438 settled Drivers without resend and verified all 16 effects at final generation 33. Both feeds match original normalized payloads; signed NuGet archives differ. Later global selector106 observation has no pre-entry preimage/change timing; whole runtime/discovery, board binding, fleet and receiver acceptance remain separate. PRIOR immutable 0.105.0: PUBLISHED: coherent-set/v0.105.0, candidate e54a59885580c894c8fbc67b0b27af3571ea9883, initial39096861301 stopped at generation14; separately selected39098313280/a1 completed all16/final33 without resending the settled Kit intent, release416229635 promoted/latest; final coherent channel and installed82-file correspondence remain bounded to their original evidence. PRIOR immutable0.104.0: coherent-set/v0.104.0, release416097241, candidate912eba8bbd707dabcbc5011d508c479109010b71/content sha256:86a776fe591b5b98bf189fdf2c47148b1b417551c44f091146a1d6ce1acfd987; continuation39080633461/a1 at controller5a2d13d0 accepted final journal22 generation34/all16 effects. Original39073648848/a1 remains an incomplete checkpoint; original .103 Unknown and all inherited reservations remain. Installed update and private-caller/consumer acceptance are separate. PRIOR 0.102: PUBLISHED: fixed candidate6e9be17bacd288ece103b67ecd5842d37a9c8e50, content sha256:fc16321e011ea616648ccc1dafda00bfc06fa34210fd49ddb008bb56c9ceecf5; original publisher38133108945/a1, continuation38156868958/a1 accepted generation33/all16effects including both feeds and promotion. Installed selector custody and C3 provider acceptance remain separate. PRIOR Published coherent-set/v0.101.0, release408709919; candidate content sha256:e8ed439047f663dfcb34aba1152ffd4c6966a0c3a27be0ebb48eebcf47e26996, source79051e56b025dadfc6fcaabd58b79e33f2854928; all three normalized candidate payloads match both feeds. No installed-adoption or current-channel claim. PRIOR Published coherent-set/v0.100.0, source3ed8ad419a64253ca6f665e9779e5e4d110f50a5; original manifest0b31c416 and both-feed normalized payloads verified, fresh tag/release/feed metadata confirmed2026-10-09. Original operation custody remains unknown. PRIOR Accepted coherent-set/v0.99.0 publisher37566865635, source64e95ebec1a8294e16edaafdb27e6aa96f32c6f7, release405346080; both-feed readbacks accepted by root. PRIOR Verified coherent-set/v0.98.0 publication 37434982959, journal utel-rel-15, producer 3d4f7e9c6337fb020e269e632653de0faeef6d72, content sha256:15a3bc4c133216cde77d1fef5b639d1842588a5754802eaa11b098e7b62c2a06. PRIOR Both-feed publication accepted for coherent-set/v0.97.1 at source 99ea75286f5c3cea2a261fef4e5b45cd70378185; exact-head hosted feed readback also confirms both feeds. PRIOR0.97.0 publication: run 37235030417; coherent-set/v0.97.0, release 403211100, content sha256:b78fd7bdff1251e32c07ffb181c31b8c2009e3174cfe305b0761f5ca8b4e245d. Prior 0.96.0 receipts remain immutable. package-tag: "coherent-set/v0.110.0" # Release418406702, immutable source42cd9e7c8505f7cd72d5a22ad424a27af6d51458; release-manifest asset659550415 SHA256bcae24d71571ab7f0dc26abbbf00beb0abf12718b22e7060838990384b86911f. Original failed publication and gen14/gen16 checkpoints retained; no replay. PRIOR: Release417623644, immutable source0d85830e7329a2718ee57ff0f1a16e6c751a469c. Original partial journals/failures retained; no replay. PRIOR: Release417149016, candidate39233536189/artifact12178009778, original journal26 retained through failure39235248295/checkpoint39235800776 and complete forward39238215850. PRIOR Release416724931 at source75ab98dd28b1a818cc3986d595bf21e0fe691ec6. PRIOR coherent-set/v0.106.0: Exact candidate source 2e42faaa994367b9f50be87439e8fd973ad21501; release 416441527 promoted 2026-10-18T13:18:34Z. Prior coherent-set/v0.105.0 remains immutable. Prior coherent-set/v0.104.0, coherent-set/v0.102.0 and all earlier release identities remain immutable. diff --git a/registry/driver-skill-manifest.json b/registry/driver-skill-manifest.json index 98505f7f3..94b5fb06b 100644 --- a/registry/driver-skill-manifest.json +++ b/registry/driver-skill-manifest.json @@ -2389,12 +2389,12 @@ { "id": "publishing-and-deployment", "scope": "operator", - "sha256": "302af2195669832f80f489edf0b7ea211edad22b93f61cf2cb27c96fc07eb1d2", - "tree-sha256": "e66eb15e95b4fda53dcbbdef6d2ba05638265dd3036d11da6a7e19b21a974f89", + "sha256": "b69ed9339af78302198dd7984ec6a1beb72285dfcba945f229f5f2968ccafb15", + "tree-sha256": "419cff784bf647d6189f6fc67c41c1a8b35817a70445f916f02245fdc680f31b", "files": [ { "path": "SKILL.md", - "sha256": "302af2195669832f80f489edf0b7ea211edad22b93f61cf2cb27c96fc07eb1d2", + "sha256": "b69ed9339af78302198dd7984ec6a1beb72285dfcba945f229f5f2968ccafb15", "executable": false }, { diff --git a/registry/skills.CHANGELOG.md b/registry/skills.CHANGELOG.md index 2f30dfb51..a890a6c2d 100644 --- a/registry/skills.CHANGELOG.md +++ b/registry/skills.CHANGELOG.md @@ -31,6 +31,8 @@ advances the pin to that CLI. ## Entries +- **2026-10-21** — SOURCE111 READINESS (Programme/root; .github#4743): reconcile only the maintained `publishing-and-deployment` operator inventory projection and its existing manifest/registry digest after coherent source advances111 while published110 remains. No skill population/schema or materialization change; packaged work-board changes were already protected by4751. Source is neither publication nor installed instruction/caller adoption. + - **2026-10-20** — PUBLICATION PROJECTION (Programme/root; .github#4731/#4730): reconcile the `publishing-and-deployment` operator row and driver manifest from the maintained generator after genuine coherent110 publication acceptance. The current published inventory advances109 to110; released110 artifacts and Creator dependencies remain immutable. Canonical source metadata does not establish installed instruction/caller or native observer acceptance. - **2026-10-20** — SOURCE021 publication guidance projection (Programme/root; .github#4727): reconcile the maintained publishing-and-deployment source-version projection and producer digest for Creator source0.21 while retaining published0.20 and all release authority boundaries. diff --git a/registry/skills.yml b/registry/skills.yml index 3b95531de..f6ddb3015 100644 --- a/registry/skills.yml +++ b/registry/skills.yml @@ -107,7 +107,7 @@ # operator`. Removing the optional mirror projection does not change either active vocabulary, and # the pinned typed validator already accepts rows without that optional field. schemaVersion: 3 -updated: "2026-10-20" +updated: "2026-10-21" # The scaffold parameters `materializes-when` predicates may reference, read at scaffold time from # scaffold-provenance.json → effectiveParameters, or DERIVED from another fact in that same document @@ -398,7 +398,7 @@ skills: # publishing-and-deployment — homed beside its owner+predicate siblings and reconciled verbatim from # .github's producer manifest by `--write` (.github#299/.github#1200). The position # and this annotation are generated; the row's bytes are the manifest's. - - { id: publishing-and-deployment,scope: operator,owner: .github, source: .github/.claude/skills/publishing-and-deployment/SKILL.md, sha256: 302af2195669832f80f489edf0b7ea211edad22b93f61cf2cb27c96fc07eb1d2, materializes-when: "false" } + - { id: publishing-and-deployment,scope: operator,owner: .github, source: .github/.claude/skills/publishing-and-deployment/SKILL.md, sha256: b69ed9339af78302198dd7984ec6a1beb72285dfcba945f229f5f2968ccafb15, materializes-when: "false" } # drive-board-best — homed beside its owner+predicate siblings and reconciled verbatim from # .github's producer manifest by `--write` (.github#299/.github#1200). The position # and this annotation are generated; the row's bytes are the manifest's. diff --git a/scripts/NewSddWorkspace/NewSddWorkspace.fsproj b/scripts/NewSddWorkspace/NewSddWorkspace.fsproj index 62544c34b..178e9c1e7 100644 --- a/scripts/NewSddWorkspace/NewSddWorkspace.fsproj +++ b/scripts/NewSddWorkspace/NewSddWorkspace.fsproj @@ -20,7 +20,7 @@ 0.21.0 - 0.21.0: expose the existing generic Python provider in the Wizard and forward the bindings descriptor bindingTarget key. Normal source uses coherent110; the independent release route reuses authenticated published coherent110 dependencies. Published Creator0.20 and its genuine108 dependency/effect identities remain immutable. Publication and installed successor adoption require their own acceptance. + 0.21.0: expose the existing generic Python provider in the Wizard and forward the bindings descriptor bindingTarget key. Normal source uses coherent111; the independent release route reuses authenticated published coherent110 dependencies. Published Creator0.20 and its genuine108 dependency/effect identities remain immutable. Publication and installed successor adoption require their own acceptance. new-sdd-workspace FS.GG workspace scaffolder — composes a selectable Standard or Typed SDD lifecycle, a runnable provider workspace, and an optional Governance overlay in one command, with a rich Spectre.Console progress UI. Orchestrates existing published machinery; no FS.GG.Templates checkout required. diff --git a/scripts/creator_source_qualification.py b/scripts/creator_source_qualification.py index 8e739f087..b6c4bbbf9 100644 --- a/scripts/creator_source_qualification.py +++ b/scripts/creator_source_qualification.py @@ -1,6 +1,6 @@ """Closed Creator021 normal-source qualification; deliberately grants no release effects. -The normal source composition is coherent110. Retained Creator020 source qualification +The normal Creator021 source composition is coherent111. Retained Creator020 source qualification and its separate genuine108 published-dependency mode keep their identities. Creator021 is normal-source only; neither source binding is an installed/publication receipt. """ @@ -15,7 +15,8 @@ class SourceQualificationBinding: SOURCE_020 = SourceQualificationBinding("FS.GG.NewSddWorkspace", "0.20.0", "new-sdd-workspace/v0.20.0") SOURCE_021 = SourceQualificationBinding("FS.GG.NewSddWorkspace", "0.21.0", "new-sdd-workspace/v0.21.0") -SOURCE_COHERENT_VERSION = "0.110.0" +SOURCE_020_COHERENT_VERSION = "0.110.0" +SOURCE_COHERENT_VERSION = "0.111.0" def qualification_version(binding): diff --git a/scripts/release_successor_journal.py b/scripts/release_successor_journal.py index 464e81dfb..32cd72493 100644 --- a/scripts/release_successor_journal.py +++ b/scripts/release_successor_journal.py @@ -30,12 +30,12 @@ SCHEMA = "fsgg.release-successor-journal/1" # One prospective root-selected source composition; no namespace allocation or effect authority. -# Completed109/journal27 and frozen original cuts remain immutable. -CURRENT_RELEASE = {"version": "0.110.0", "predecessor": "0.109.0", - "logicalRef": "refs/heads/fsgg/v2/journal/release/coord110-observer-20261020-01", - "directory": "state/releases/coord110-observer-20261020-01", - "predecessorSource": "0d85830e7329a2718ee57ff0f1a16e6c751a469c", - "predecessorContentId": "sha256:a3ff6fd1f998e32a750efe25bbb4255c5bd9d9b28ff5b21af441194d44e128ce"} +# Completed110/observer journal and frozen original cuts remain immutable. +CURRENT_RELEASE = {"version": "0.111.0", "predecessor": "0.110.0", + "logicalRef": "refs/heads/fsgg/v2/journal/release/coord111-resource-aware-20261021-01", + "directory": "state/releases/coord111-resource-aware-20261021-01", + "predecessorSource": "42cd9e7c8505f7cd72d5a22ad424a27af6d51458", + "predecessorContentId": "sha256:12c130cddf0a580334507cb821767ed1838884d897422f4515c3fbd6892224dc"} diff --git a/src/FS.GG.Coord.Cli/FS.GG.Coord.Cli.fsproj b/src/FS.GG.Coord.Cli/FS.GG.Coord.Cli.fsproj index 8d7c194a0..a85e4b671 100644 --- a/src/FS.GG.Coord.Cli/FS.GG.Coord.Cli.fsproj +++ b/src/FS.GG.Coord.Cli/FS.GG.Coord.Cli.fsproj @@ -130,10 +130,10 @@ bytes under 0.52.0 would make the same version identify different artifacts. Ado coherent set cut from corrected source. All three partial sets are recorded in `registry/dependencies.yml`. - 0.110.0 — Require current root-owned board Status at canonical lifecycle boundaries. Adds a finite read-only observer for one explicit original CI operation, preserving its identity, deadlines and remaining request/output budgets. -Reconcile observed acceptance and blockers before selection, after dispatch and before handoff; Delivery decisions precede whole-parent Outcome decisions. -Use the six existing statuses with guarded native preimages, preservation and verified readback; inspection stays read-only and Status grants no operation or closure authority. -Kit and Drivers inherit the mandatory lifecycle. Source preparation is distinct from publication and installed adoption. + 0.111.0 — Carry resource-aware work-board guidance through the coherent CLI/Kit/Drivers release. +Admit each operation from its actual CPU quota/demand, combined memory/headroom, storage/backing and write domains, transitive children and known/Unknown reservations. +Preserve determining source/ref stability through final retention; close attributed input/preflight facts and reconcile current native/owning-plan joins before invocation. +The CLI command/API surface is unchanged. Publication, physical caller/instruction adoption, useful local overlap and economic evidence retain their separate acceptance. $(FsggStandingAdvisories) diff --git a/tests/new-sdd-workspace-successor/run.py b/tests/new-sdd-workspace-successor/run.py index 5649b23aa..cf975fe6c 100644 --- a/tests/new-sdd-workspace-successor/run.py +++ b/tests/new-sdd-workspace-successor/run.py @@ -29,7 +29,7 @@ import new_sdd_workspace_successor_admission as source_admission from new_sdd_workspace_successor_admission import WizardAdmission, SourceCompatibility from new_sdd_workspace_successor_execution import effects, CURRENT_017, CURRENT_021, CURRENT_020, CURRENT_019, CURRENT_016, CURRENT_015, CURRENT_014, HISTORICAL_013, ReleaseBinding -from creator_source_qualification import SOURCE_020, SOURCE_021, SOURCE_COHERENT_VERSION, qualification_version +from creator_source_qualification import SOURCE_020, SOURCE_021, SOURCE_020_COHERENT_VERSION, SOURCE_COHERENT_VERSION, qualification_version from new_sdd_workspace_successor_provider import WizardProvider, NotFound, output_signals, publisher_error, DIAGNOSTIC_LIMIT @@ -136,7 +136,8 @@ def board_package_closure(package: pathlib.Path, source_sha: str, *, source_root if checker.package_identity(package) != (release_binding.package, release_binding.version, source_sha): raise ValueError("current creator package/source identity differs") dependency_pin = json.loads((source_root / "scripts/creator-frozen-coord-dependencies.json").read_text()) - coherent_version = (SOURCE_COHERENT_VERSION if release_binding is SOURCE_020 or release_binding is SOURCE_021 else + coherent_version = (SOURCE_COHERENT_VERSION if release_binding is SOURCE_021 else + SOURCE_020_COHERENT_VERSION if release_binding is SOURCE_020 else "0.108.0" if release_binding is CURRENT_019 else dependency_pin["version"]) if release_binding in (CURRENT_019, SOURCE_020, SOURCE_021) and (frozen_dependencies is not None or frozen_source is not None): raise ValueError("Creator 0.19 requires its normal 0.108 source graph, not retained frozen inputs") @@ -581,7 +582,7 @@ def pack(selected): board_package_closure(package, 'a' * 40, source_root=root) project_path.write_bytes(original_project) - # The new explicit source binding follows the current110 build graph. It must never + # The retained020 source binding follows its110 build graph. It must never # confuse normal source output with the separately retained genuine108 dependency mode. nuspec = nuspec.replace(b'0.19.0', b'0.20.0') source_deps = json.loads(json.dumps(deps)) @@ -602,7 +603,7 @@ def pack(selected): with self.assertRaisesRegex(ValueError, 'package/source identity'): board_package_closure(package, 'a' * 40, source_root=root) # Neither the previous normal source graph nor genuine published108 qualifies110. - for stale_version in ('0.109.0', '0.108.0'): + for stale_version in ('0.111.0', '0.109.0', '0.108.0'): stale_metadata = json.dumps(source_deps).replace('0.110.0', stale_version).encode() (output / 'new-sdd-workspace.deps.json').write_bytes(stale_metadata) pack({**selected_members, 'new-sdd-workspace.deps.json': stale_metadata}) @@ -610,9 +611,9 @@ def pack(selected): board_package_closure(package, 'a' * 40, source_root=root, release_binding=SOURCE_020) - # The selected021 source identity is normal110 only; retained020 above stays exact. + # The selected021 source identity is normal111 only; retained020 above stays exact. nuspec = nuspec.replace(b'0.20.0', b'0.21.0') - next_deps = json.loads(json.dumps(source_deps)) + next_deps = json.loads(json.dumps(source_deps).replace('0.110.0', '0.111.0')) for target in next_deps['targets'].values(): target['new-sdd-workspace/0.21.0'] = target.pop('new-sdd-workspace/0.20.0') next_members = {**members, 'new-sdd-workspace.deps.json': json.dumps(next_deps).encode()} @@ -620,7 +621,7 @@ def pack(selected): (output / name).write_bytes(body) pack(next_members) result = board_package_closure(package, 'a' * 40, source_root=root, release_binding=SOURCE_021) - self.assertEqual((result['version'], result['coherentVersion']), ('0.21.0', '0.110.0')) + self.assertEqual((result['version'], result['coherentVersion']), ('0.21.0', '0.111.0')) self.assertEqual(result['builtFilesCompared'], len(next_members)) self.assertEqual(result['mode'], 'source-only') self.assertIs(result['releaseEligible'], False) @@ -631,8 +632,8 @@ def pack(selected): forged = type(SOURCE_021)(SOURCE_021.package, SOURCE_021.version, SOURCE_021.tag) with self.assertRaisesRegex(ValueError, 'unknown Creator package binding'): board_package_closure(package, 'a' * 40, source_root=root, release_binding=forged) - for stale_version in ('0.109.0', '0.108.0'): - stale_metadata = json.dumps(next_deps).replace('0.110.0', stale_version).encode() + for stale_version in ('0.110.0', '0.109.0', '0.108.0'): + stale_metadata = json.dumps(next_deps).replace('0.111.0', stale_version).encode() (output / 'new-sdd-workspace.deps.json').write_bytes(stale_metadata) pack({**next_members, 'new-sdd-workspace.deps.json': stale_metadata}) with self.assertRaisesRegex(ValueError, 'current coherent CLI dependency metadata'): @@ -745,6 +746,8 @@ def test_source_cut_and_candidate_package_names_agree(self): self.assertIn('--tag new-sdd-workspace/v0.21.0', candidate) props = ElementTree.parse(ROOT / 'Directory.Build.props') self.assertEqual(next(node.text for node in props.iter('FsggCoherentSetVersion')), SOURCE_COHERENT_VERSION) + self.assertEqual(SOURCE_020_COHERENT_VERSION, '0.110.0') + self.assertEqual(SOURCE_COHERENT_VERSION, '0.111.0') self.assertLess(candidate.index("creator-current-coord-dependencies.py preflight"), candidate.index("actions/setup-dotnet")) self.assertIn('creator-current-coord-dependencies.py preflight', candidate) diff --git a/tests/release-successor-candidate/run.py b/tests/release-successor-candidate/run.py index 0d949c337..f5d695aea 100644 --- a/tests/release-successor-candidate/run.py +++ b/tests/release-successor-candidate/run.py @@ -129,22 +129,22 @@ def test_prospective_0104_probe_requires_exact_0102_frontier_on_both_feeds(self) gate.check("0.104.0", "0.102.0", "read-token") def test_selected110_requires_exact109_on_all_six_feed_coordinates(self) -> None: - self.github_read.return_value = ["0.109.0"] - self.nuget_read.return_value = ["0.109.0"] - rows = gate.check("0.110.0", "0.109.0", "inert-token") + self.github_read.return_value = ["0.110.0"] + self.nuget_read.return_value = ["0.110.0"] + rows = gate.check("0.111.0", "0.110.0", "inert-token") self.assertEqual(len(rows), 6) for feed in (self.github_read, self.nuget_read): with self.subTest(feed=feed): - feed.return_value = ["0.109.0", "0.110.0"] + feed.return_value = ["0.110.0", "0.111.0"] with self.assertRaisesRegex(gate.GateError, "already exists"): - gate.check("0.110.0", "0.109.0", "inert-token") - feed.return_value = ["0.109.0"] + gate.check("0.111.0", "0.110.0", "inert-token") + feed.return_value = ["0.110.0"] self.nuget_read.return_value = ["0.108.0"] with self.assertRaisesRegex(gate.GateError, "not predecessor"): - gate.check("0.110.0", "0.109.0", "inert-token") + gate.check("0.111.0", "0.110.0", "inert-token") self.github_read.side_effect = gate.GateError("HTTP 403: occupancy Unknown") with self.assertRaisesRegex(gate.GateError, "occupancy Unknown"): - gate.check("0.110.0", "0.109.0", "inert-token") + gate.check("0.111.0", "0.110.0", "inert-token") def test_an_occupied_version_on_either_feed_refuses(self) -> None: for feed in (self.github_read, self.nuget_read): @@ -240,7 +240,7 @@ def test_prospective_feed_probe_has_only_main_read_permissions_and_no_release_ef self.assertIn('test "$(git ls-remote origin refs/heads/main | cut -f1)" = "$SOURCE_SHA"', workflow) self.assertIn("python3 tests/release-successor-candidate/run.py", workflow) self.assertIn("python3 scripts/check-release-candidate-uniqueness.py", workflow) - self.assertIn("--version 0.110.0 --predecessor 0.109.0", workflow) + self.assertIn("--version 0.111.0 --predecessor 0.110.0", workflow) for forbidden in ( "packages: write", "contents: write", "id-token:", "environment:", "secrets.", "release-successor-publish.py", "release-saga.py", "dotnet pack", @@ -249,23 +249,58 @@ def test_prospective_feed_probe_has_only_main_read_permissions_and_no_release_ef with self.subTest(forbidden=forbidden): self.assertNotIn(forbidden, workflow.lower()) + def test_actual_declared_predecessor_command_joins_promoted110_and_current_binding(self) -> None: + import contextlib, io, json, re, runpy, shlex, tempfile + from release_successor_journal import CURRENT_RELEASE + saga = runpy.run_path(str(ROOT / "scripts/release-saga.py")) + workflow = (ROOT / ".github/workflows/release-successor-candidate.yml").read_text() + # Genuine promoted110 channel identity; fixture loading makes no native observation. + receipt = {"version":"0.110.0", "sourceSha":"42cd9e7c8505f7cd72d5a22ad424a27af6d51458", + "contentId":"sha256:12c130cddf0a580334507cb821767ed1838884d897422f4515c3fbd6892224dc", + "promotedAt":"2026-10-20T14:26:43.180517Z"} + expected = {"version":CURRENT_RELEASE["predecessor"], "sourceSha":CURRENT_RELEASE["predecessorSource"], + "contentId":CURRENT_RELEASE["predecessorContentId"]} + def consume(declared, channel): + command = re.search(r"python3 scripts/release-saga\.py predecessor\s+(.+?)\s+> artifacts/predecessor/identity\.json", declared.replace(chr(92)+"\n", " "), re.S) + self.assertIsNotNone(command) + # Parse the workflow's actual arguments through the maintained CLI parser/consumer. + argv = shlex.split(command.group(1)) + args = saga["parser"]().parse_args(["predecessor", *argv]) + with tempfile.TemporaryDirectory() as directory: + path = pathlib.Path(directory)/"channel.json"; path.write_text(json.dumps(channel)) + args.channel = str(path) + with contextlib.redirect_stdout(io.StringIO()) as output: + args.run(args) + identity = json.loads(output.getvalue()) + self.assertEqual(identity, expected) + self.assertIn("gh release download coherent-set/v"+identity["version"], declared) + consume(workflow, receipt) + old_source = "0d85830e7329a2718ee57ff0f1a16e6c751a469c" + with self.assertRaisesRegex(ValueError, "does not match tag source"): + consume(workflow.replace("--tag-source "+receipt["sourceSha"], "--tag-source "+old_source), receipt) + with self.assertRaisesRegex(ValueError, "does not match release tag"): + consume(workflow.replace("--release-tag coherent-set/v0.110.0", "--release-tag coherent-set/v0.109.0"), receipt) + with self.assertRaises(AssertionError): + consume(workflow, {**receipt,"contentId":"sha256:a3ff6fd1f998e32a750efe25bbb4255c5bd9d9b28ff5b21af441194d44e128ce"}) + def test_candidate_binds_the_next_version_and_exact_predecessor(self) -> None: workflow = (ROOT / ".github/workflows/release-successor-candidate.yml").read_text() - self.assertIn('test "$version" = 0.110.0', workflow) - self.assertIn("gh release download coherent-set/v0.109.0", workflow) - self.assertIn("--tag-source 0d85830e7329a2718ee57ff0f1a16e6c751a469c", workflow) - self.assertEqual(workflow.count("--predecessor 0.109.0"), 2) - self.assertIn("--release-tag coherent-set/v0.109.0", workflow) + self.assertIn('test "$version" = 0.111.0', workflow) + self.assertIn("gh release download coherent-set/v0.110.0", workflow) + from release_successor_journal import CURRENT_RELEASE + self.assertIn("--tag-source " + CURRENT_RELEASE["predecessorSource"], workflow) + self.assertEqual(workflow.count("--predecessor 0.110.0"), 2) + self.assertIn("--release-tag coherent-set/v0.110.0", workflow) for namespace in ("coherent-set", "kit", "drivers", "coord-engine"): - self.assertIn(f"refs/tags/{namespace}/v0.110.0", workflow) + self.assertIn(f"refs/tags/{namespace}/v0.111.0", workflow) for project in ("FS.GG.Coord.Cli", "FS.GG.Kit", "FS.GG.Drivers"): self.assertEqual(workflow.count(f"dotnet pack src/{project}/"), 1) initial=workflow.split(' - name: Verify the stable predecessor and unused package version',1)[1].split(' - name: Test the telemetry producer',1)[0] retention=workflow.split(' - name: Refuse a changed main or newly occupied version before retention',1)[1].split(' - uses: actions/upload-artifact',1)[0] - self.assertIn('releases/tags/coherent-set/v0.110.0',initial) + self.assertIn('releases/tags/coherent-set/v0.111.0',initial) self.assertIn('git ls-remote',initial) self.assertIn('refs/heads/main',retention) - self.assertIn('--predecessor 0.109.0',retention) + self.assertIn('--predecessor 0.110.0',retention) self.assertNotIn('releases/tags/',retention) self.assertNotIn('refs/tags/',retention) self.assertIn('timeout-minutes: 45',workflow) diff --git a/tests/release-successor-recovery/run.py b/tests/release-successor-recovery/run.py index bb1e1bc21..4de4c6989 100644 --- a/tests/release-successor-recovery/run.py +++ b/tests/release-successor-recovery/run.py @@ -1609,29 +1609,39 @@ def test_primary_upload_uncertainty_survives_report_failure(self): class SelectedReleaseBindingTests(unittest.TestCase): - def test_current_default_has_110_109_and_selected_observer_identity(self): + def test_current_default_has_111_110_and_selected_resource_identity(self): args = types.SimpleNamespace(recovery_checkpoint=False, repeat_original_nuget_kit_intent=False, recover_original_runtime_intent=False) self.assertEqual(publisher.selected_release_binding(args), - ("0.110.0", "0.109.0", "refs/heads/fsgg/v2/journal/release/coord110-observer-20261020-01")) + ("0.111.0", "0.110.0", "refs/heads/fsgg/v2/journal/release/coord111-resource-aware-20261021-01")) - def test_current_profile_binds_promoted109_and_cannot_claim_old_journals(self): + def test_current_profile_binds_promoted110_and_cannot_claim_old_journals(self): self.assertEqual(set(publisher.CURRENT_RELEASE), {'version','predecessor','logicalRef','directory','predecessorSource','predecessorContentId'}) - self.assertEqual(publisher.CURRENT_RELEASE['predecessorSource'],'0d85830e7329a2718ee57ff0f1a16e6c751a469c') - self.assertEqual(publisher.CURRENT_RELEASE['predecessorContentId'],'sha256:a3ff6fd1f998e32a750efe25bbb4255c5bd9d9b28ff5b21af441194d44e128ce') - self.assertEqual(publisher.CURRENT_RELEASE['directory'],'state/releases/coord110-observer-20261020-01') - for suffix in ('utel-rel-23','utel-rel-24','utel-rel-25','utel-rel-26','utel-rel-27'): + self.assertEqual(publisher.CURRENT_RELEASE['predecessorSource'],'42cd9e7c8505f7cd72d5a22ad424a27af6d51458') + self.assertEqual(publisher.CURRENT_RELEASE['predecessorContentId'],'sha256:12c130cddf0a580334507cb821767ed1838884d897422f4515c3fbd6892224dc') + self.assertEqual(publisher.CURRENT_RELEASE['directory'],'state/releases/coord111-resource-aware-20261021-01') + for suffix in ('utel-rel-23','utel-rel-24','utel-rel-25','utel-rel-26','utel-rel-27','coord110-observer-20261020-01'): authority=MemoryAuthority() with self.subTest(prior=suffix),self.assertRaisesRegex(JournalRefused,'different owner or profile'): ProtectedReleaseJournal(authority,'refs/heads/fsgg/v2/journal/release/'+suffix, main_directory=True,ordinary_forward=True) self.assertFalse(any(method in {'post','patch'} for method,_ in authority.calls)) - def test_current110_cannot_initialize_completed109_journal27(self): + def test_current111_cannot_initialize_completed109_journal27(self): authority=MemoryAuthority() journal=ProtectedReleaseJournal(authority,'refs/heads/fsgg/v2/journal/release/utel-rel-27',main_directory=True) authority.calls.clear() - intent={'version':'0.110.0','sourceSha':'b'*40,'contentId':'sha256:'+'b'*64, + intent={'version':'0.111.0','sourceSha':'b'*40,'contentId':'sha256:'+'b'*64, + 'candidateArchiveSha256':'c'*64,'operator':'EHotwagner'} + with self.assertRaisesRegex(JournalRefused,'different journal identity'): + journal.initialize(intent) + self.assertFalse(any(method in {'post','patch'} for method,_ in authority.calls)) + + def test_current111_cannot_initialize_completed110_observer_journal(self): + authority=MemoryAuthority() + journal=ProtectedReleaseJournal(authority,'refs/heads/fsgg/v2/journal/release/coord110-observer-20261020-01',main_directory=True) + authority.calls.clear() + intent={'version':'0.111.0','sourceSha':'b'*40,'contentId':'sha256:'+'b'*64, 'candidateArchiveSha256':'c'*64,'operator':'EHotwagner'} with self.assertRaisesRegex(JournalRefused,'different journal identity'): journal.initialize(intent) @@ -2413,7 +2423,7 @@ def test_precredential_workflow_order_and_candidate_binding(self): self.assertLess(fence,workflow.index(name)) self.assertNotIn('disposition_json:',workflow) candidate = (ROOT/'.github/workflows/release-successor-candidate.yml').read_text() - self.assertIn('test "$version" = 0.110.0',candidate) + self.assertIn('test "$version" = 0.111.0',candidate) self.assertNotIn('-p:Version=',candidate) self.assertIn('name: release-successor-candidate-${{ github.sha }}-${{ github.run_id }}',candidate) self.assertIn('Separate evidence: never add a member to the exact seven-member publisher archive.',candidate) @@ -2424,8 +2434,8 @@ class LiteralForwardControls(SuspensionFixture): def context(self): if not hasattr(self,'_forward_base'):self._forward_base=copy.deepcopy(self.authority) self.authority=copy.deepcopy(self._forward_base) - self.install();self.authority.logical_ref=publisher.CURRENT_RELEASE['logicalRef'];self.authority.directory_suffix='coord110-observer-20261020-01';self.authority.calls.clear() - candidate=manifest();candidate['descriptor'].update(version='0.110.0',previousStableVersion='0.109.0') + self.install();self.authority.logical_ref=publisher.CURRENT_RELEASE['logicalRef'];self.authority.directory_suffix='coord111-resource-aware-20261021-01';self.authority.calls.clear() + candidate=manifest();candidate['descriptor'].update(version='0.111.0',previousStableVersion='0.110.0') candidate['contentId']='sha256:'+hashlib.sha256(json.dumps(candidate['descriptor'],sort_keys=True,separators=(',',':')).encode()).hexdigest() counted=publisher.CountedAuthorityAPI(self.authority,ceiling=1500,quota_floor=1800);counted.admit_quota() shared=self.mod.ReleaseSuspension(counted);rows=report();native=MemoryPublisher() @@ -2442,7 +2452,7 @@ def visibility(effect): if observation.state=='matched' and observation.observed_digest==effect.target_digest:return 'potential' raise publisher.Refused('inert pending witness '+observation.state) provider.ordinary_visibility=visibility - intent={'contentId':candidate['contentId'],'sourceSha':'b'*40,'version':'0.110.0','candidateArchiveSha256':'c'*64,'operator':'EHotwagner'} + intent={'contentId':candidate['contentId'],'sourceSha':'b'*40,'version':'0.111.0','candidateArchiveSha256':'c'*64,'operator':'EHotwagner'} publisher.prepare_release_journal(journal,counted,admission,provider,native,candidate,intent,'b'*40,'b'*40,False,lambda:None) journal.capture();ticks=[0];sleeps=[] def sleep(seconds):sleeps.append(seconds);ticks[0]+=seconds @@ -2510,7 +2520,7 @@ def get(path): if '/actions/runs/' in path:row['status']='cancelled' return row native.get=get - elif mode=='suspension':self.add_file('state/releases/coord110-observer-20261020-01/release-state.json',canonical(journal._observed.state)+b' ') + elif mode=='suspension':self.add_file('state/releases/coord111-resource-aware-20261021-01/release-state.json',canonical(journal._observed.state)+b' ') else:next(iter(self.authority.controls.values()))['enforcement']='disabled' with self.assertRaises(RuntimeError):run(sleep=sleep) self.assertEqual(provider.dispatched,['tag']);self.assertEqual(sleeps,[5]) @@ -3510,7 +3520,7 @@ def prepare_caller(self, *, history=0, delays=0, target='channel-asset', ceiling self.promoted108_fixture=b'preserved synthetic consumed108 journal bytes\n' self.add_file('state/releases/utel-rel-26/release-state.json',self.promoted108_fixture) self.add_file('state/releases/utel-rel-26/release-head.txt',b'preserved prior108 logical head\n') - # Synthetic completed109 sibling: its bytes/head must survive the real110 caller. + # Synthetic completed109 sibling: its bytes/head must survive the real111 caller. # These fixture identities are not native109 publication/history evidence. self.promoted109_fixture=canonical({'schema':self.mod.SCHEMA,'version':'0.109.0', 'sourceSha':'9'*40,'contentId':'sha256:'+'9'*64,'candidateArchiveSha256':'9'*64, @@ -3519,12 +3529,22 @@ def prepare_caller(self, *, history=0, delays=0, target='channel-asset', ceiling self.promoted109_head=b'9999999999999999999999999999999999999999\n' self.add_file('state/releases/utel-rel-27/release-state.json',self.promoted109_fixture) self.add_file('state/releases/utel-rel-27/release-head.txt',self.promoted109_head) - self.authority.directory_suffix='coord110-observer-20261020-01';self.authority.logical_ref=publisher.CURRENT_RELEASE['logicalRef'] + # Synthetic completed110 sibling uses the genuine promoted predecessor identity. + # Fixture Git bytes/head remain inert; native completion is independently read. + self.promoted110_fixture=canonical({'schema':self.mod.SCHEMA,'version':'0.110.0', + 'sourceSha':'42cd9e7c8505f7cd72d5a22ad424a27af6d51458', + 'contentId':'sha256:12c130cddf0a580334507cb821767ed1838884d897422f4515c3fbd6892224dc', + 'candidateArchiveSha256':'0'*64,'operator':'EHotwagner','generation':33, + 'effects':{effect.identity:'verified' for effect in ordered_effects(manifest())}}) + self.promoted110_head=b'0000000000000000000000000000000000000000\n' + self.add_file('state/releases/coord110-observer-20261020-01/release-state.json',self.promoted110_fixture) + self.add_file('state/releases/coord110-observer-20261020-01/release-head.txt',self.promoted110_head) + self.authority.directory_suffix='coord111-resource-aware-20261021-01';self.authority.logical_ref=publisher.CURRENT_RELEASE['logicalRef'] for n in range(history):self.add_file('state/ordinary/cold-history.json',canonical({'generation':n})) - self.native=Literal104ProviderFixture(self.root,None,version="0.110.0") + self.native=Literal104ProviderFixture(self.root,None,version="0.111.0") stream=io.BytesIO() with zipfile.ZipFile(stream,'w') as archive: - for name in [*(f'{package}.0.110.0.nupkg' for package in PACKAGES), + for name in [*(f'{package}.0.111.0.nupkg' for package in PACKAGES), 'release-manifest.json','previous-stable-channel.json', 'standalone-telemetry-evidence.json','standalone-telemetry-runtime-evidence.json']: archive.writestr(name,(self.root/name).read_bytes()) @@ -3561,7 +3581,7 @@ def get(path,_original_get=original): if '/releases?' in path:return [] if hidden=='promote' and '/releases/tags/' in path:value['draft']=True if hidden and '/assets?per_page=100' in path: - name={**{f'archive-asset:{package}':f'{package}.0.110.0.nupkg' for package in PACKAGES}, + name={**{f'archive-asset:{package}':f'{package}.0.111.0.nupkg' for package in PACKAGES}, 'qualification-asset:evidence':'standalone-telemetry-evidence.json', 'qualification-asset:runtime':'standalone-telemetry-runtime-evidence.json', 'channel-asset':'stable-channel.json','manifest-asset':'release-manifest.json'}.get(hidden) @@ -3631,7 +3651,7 @@ def process(argv,**kwargs): return types.SimpleNamespace(returncode=0) if len(argv)>1 and argv[1].endswith('check-release-candidate-uniqueness.py'): self.local_ports.append('uniqueness-external-port') - self.assertEqual(argv[2:],['--version','0.110.0','--predecessor','0.109.0']) + self.assertEqual(argv[2:],['--version','0.111.0','--predecessor','0.110.0']) self.assertFalse(self.native.feeds);self.assertIsNone(self.native.release) return types.SimpleNamespace(returncode=0) self.local_ports.append('inert-nuget-send' if argv[:3]==['dotnet','nuget','push'] else 'saga:'+argv[2]) @@ -3701,6 +3721,8 @@ def assert_complete(self): self.assertEqual(reader.file(self.authority.head,'state/releases/utel-rel-26/release-head.txt'),b'preserved prior108 logical head\n') self.assertEqual(reader.file(self.authority.head,'state/releases/utel-rel-27/release-state.json'),self.promoted109_fixture) self.assertEqual(reader.file(self.authority.head,'state/releases/utel-rel-27/release-head.txt'),self.promoted109_head) + self.assertEqual(reader.file(self.authority.head,'state/releases/coord110-observer-20261020-01/release-state.json'),self.promoted110_fixture) + self.assertEqual(reader.file(self.authority.head,'state/releases/coord110-observer-20261020-01/release-head.txt'),self.promoted110_head) self.assertEqual(reader.file(self.authority.head,'state/releases/utel-rel-24/release-head.txt'),b'preserved prior106 logical head\n') if self.history:self.assertEqual(reader.file(self.authority.head,'state/ordinary/cold-history.json'),canonical({'generation':self.history-1})) self.assertEqual(sum(self.rows['authorityCounter'].attempted.values()),counted_entries) @@ -3826,7 +3848,7 @@ def get(path): return row self.native.get=get elif mode=='protection':next(iter(self.authority.controls.values()))['enforcement']='disabled' - else:self.external_file('state/releases/coord110-observer-20261020-01/release-state.json',canonical(self.rows['lastObservedJournal'])+b' ') + else:self.external_file('state/releases/coord111-resource-aware-20261021-01/release-state.json',canonical(self.rows['lastObservedJournal'])+b' ') self.on_sleep=change with self.assertRaises(RuntimeError):self.invoke_caller() self.assertEqual(self.dispatches,['tag']) @@ -3920,7 +3942,7 @@ def prepare(effect): name='release-state.json' if mode=='state' else 'release-head.txt' expected=self.providers[0]._ordinary_expected_journal raw=expected[1]+b' ' if mode=='state' else ('e'*40+'\n').encode() - self.external_file('state/releases/coord110-observer-20261020-01/'+name,raw) + self.external_file('state/releases/coord111-resource-aware-20261021-01/'+name,raw) self.on_prepare=prepare with self.assertRaises(RuntimeError):self.invoke_caller() self.assertIsNone(self.native.tag);self.assertEqual(self.publisher_ports.count('post'),0)