unaltraweb 0.5.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,200 @@
1
+ # D0 native runtime identity and lifecycle — issue 85
2
+
3
+ Requirements: gaContExt
4
+ `5634ea2e3e42122bb365992dfca9f248feb89dec`,
5
+ [NATIVE_RUNTIME_REQUIREMENTS.md](https://github.com/dosquartsdedocs/gacontext/blob/5634ea2e3e42122bb365992dfca9f248feb89dec/src/bash/mcp_factories/NATIVE_RUNTIME_REQUIREMENTS.md).
6
+ Owner issue: [85](https://github.com/dosquartsdedocs/unaltraweb/issues/85).
7
+ Coordination: [gaContExt 15](https://github.com/dosquartsdedocs/gacontext/issues/15).
8
+
9
+ ## Native API mapping
10
+
11
+ The containing 0.7.0 increment adds `runtime_identity` and
12
+ `web://runtime-identity` on the actual serving MCP instance. Both use one
13
+ startup-created object, not a helper CLI. It records a random backend instance,
14
+ process PID/start ticks/PID namespace, start time, interpreter, loaded package
15
+ version and startup package fingerprint. Current bounded package bytes and
16
+ metadata are separate observations; changing metadata cannot rename the loaded
17
+ version. Only engine code/contracts and allowlisted runtime selections are read,
18
+ not site content or arbitrary environment values.
19
+
20
+ The identity's component/profile/selection hashes bind the fixed requirements,
21
+ startup BOM, behavioral profile, worker selections and consumer mapping. The
22
+ package fingerprint is a startup code-content observation, not a wheel checksum
23
+ or a permanent process attestation. The live container's image ID, source label,
24
+ limits and mount mapping are inspected separately. Its daemon-host init PID is
25
+ not compared numerically with the inner serving PID. Session ID, exact container
26
+ ID, factory/role/project labels and mapping correlate those namespaces.
27
+
28
+ `runtime_drain(confirm=true)` freezes admission on that connection. Ordinary
29
+ tools execute in a bounded one-operation lane, leaving identity/drain responsive
30
+ while a worker runs. Closing stdio waits for active work and releases that
31
+ session's idle preview/capture resources. A new connection creates a new backend
32
+ instance. This profile is **one stdio connection per backend**, not a shared HTTP
33
+ service: shared-backend reattachment/idle leases are not claimed.
34
+
35
+ Host-side installed API:
36
+
37
+ ```text
38
+ unaltraweb-mcp-docker prepare --image REF [--expected-image-id SHA256_ID]
39
+ unaltraweb-mcp-docker serve --project ROOT --image REF --expected-image-id SHA256_ID --managed
40
+ unaltraweb-mcp-docker session-status --project ROOT --session-id SESSION --container-id CONTAINER
41
+ unaltraweb-mcp-docker reap-session --project ROOT --session-id SESSION --container-id CONTAINER
42
+ ```
43
+
44
+ Preparation may acquire the explicitly selected image. Launch/check/smoke never
45
+ build or pull; execution uses its inspected exact configuration ID with
46
+ `--pull never`. Managed mutable aliases require the expected full image ID.
47
+ Full local IDs and repository digests are immutable selections. Ordinary mutable
48
+ local selections without an expected ID remain an explicitly weaker mode.
49
+ Archive hashes, repository/index digests and Docker configuration IDs are distinct.
50
+
51
+ `--offline` disables controller networking; the explicitly mounted local Docker
52
+ socket still permits image/owned-container inspection. Preview HTTP probing and
53
+ intentional external metrics calls need their documented network access.
54
+ `--worker-images` accepts bounded JSON mapping supported worker names to exact
55
+ `reference` / `expected_image_id` pairs. Otherwise startup BOM/dedicated image
56
+ environment selections apply. Managed execution refuses missing/mismatched
57
+ workers and never substitutes a preparation build/pull. Authored computation
58
+ image choices must match the approved startup identity before execution.
59
+
60
+ The normal host launcher canonicalizes the consumer and binds it at its canonical
61
+ path and `/workspace`. A containerized launcher must supply `--host-project` (or
62
+ its explicit inherited daemon mapping); the child uses that verified canonical
63
+ mirror. Identity reports launcher-visible, daemon-host and effective paths.
64
+ Other direct controller layouts are not silently inferred. In particular,
65
+ [issue 31](https://github.com/dosquartsdedocs/unaltraweb/issues/31) remains a separate
66
+ boundary for arbitrary direct `/workspace` controllers and is not automatically
67
+ closed by this profile.
68
+
69
+ ## Resource ownership
70
+
71
+ Each launch has a 32-hex session ID and a uniquely named owned stdio container.
72
+ Previews are per-session for these backends. Worker invocation tokens are retained
73
+ and augmented with session labels. Cleanup validates full IDs and ownership and
74
+ confirms absence before claiming release. Image and volume removal is outside
75
+ these APIs.
76
+
77
+ After EOF or a crash, the caller uses the **retained** binding/session/container
78
+ tuple with `session-status`. A live backend is `connected`; a running one-shot
79
+ worker is `busy`; idle leftovers are `orphaned`; only proven absence is `stopped`
80
+ with `resources_released=true`. Unavailable/changed ownership is `unknown` and
81
+ does not authorize removal. `reap-session` preserves a live backend or running
82
+ job, and recovers only that retired session's idle resources. Occupied or foreign
83
+ networks fail closed. No fresh-helper PID is presented as the backend's PID.
84
+
85
+ The legacy `down` / `make mcp-down` is an explicit **workspace-wide** shutdown;
86
+ `mcp-down-all` is maintainer/factory-wide. Neither is the hub's per-client toggle
87
+ operation. The managed sequence is live drain, close this transport, inspect its
88
+ exact retained identity, and recover eligible orphans when necessary.
89
+
90
+ The profile reports controller limits (2 CPUs, 4 GiB, 512 PIDs), preview/PDF/capture
91
+ limits (2 CPUs, 2 GiB, 256 PIDs), and managed computation limits (4 CPUs, 8 GiB,
92
+ 512 PIDs). Existing per-invocation time bounds remain 1800 seconds for PDF/compute
93
+ and 900 for captures; requests may compose several bounded jobs. Per-backend
94
+ operation concurrency is one. A drain does not falsely claim immediate RAM/CPU
95
+ release while a job continues.
96
+
97
+ ## Accepted visual-helper points and remaining closure blocker
98
+
99
+ The candidate selects the published Diavisuals 0.5.0 and Vega 0.5.1 packages:
100
+
101
+ | Helper | Wheel SHA-256 | Renderer configuration ID |
102
+ | --- | --- | --- |
103
+ | Diavisuals 0.5.0 | `f52e20f20f1fb3a2418f07adb8d6a68a5567d0c321fb7c0ccc0f4db04917b96b` | `sha256:5a6887b372a0e1c386a7b54981d11ae1910215baeb6a12dfd0706b3e85ef0846` |
104
+ | Vega 0.5.1 | `5aba4f267a37179c520b3cd164e1cec62ac5561872aa33b069cce73442dc52b1` | `sha256:695125943d0fbc3aa7c877babb9a11a6501bbc7ac265b0975bb5657c60439d98` |
105
+
106
+ Native selector mapping is Diavisuals `--runtime-image` plus
107
+ `--runtime-expected-id`, and Vega `--renderer-image-id`. Published metadata,
108
+ wheel/acceptance hashes and locally prepared renderer IDs were verified. Actual
109
+ Mermaid, PlantUML, Vega-Lite/CSV and Vega rendering passed native receipt checks,
110
+ tamper refusal and consumer relocation without rewriting renderer aliases.
111
+ Retained evidence: `/tmp/opencode/unaltraweb-d0-85/helpers-proof/evidence.json`.
112
+
113
+ Previously accepted **0.4.0 static receipts remain valid** under the unchanged
114
+ input/output/request integrity rules. This is an exact legacy point, not a
115
+ continuous version interval or permission to overwrite edited outputs. New work
116
+ uses the selected helper points. No existing client or real consumer is migrated
117
+ by this source change.
118
+
119
+ The coordinator does not claim to observe another MCP's serving process. Its live
120
+ identity returns the helper selections and requires their independent connection
121
+ observations. **Diavisuals 0.5.0 still lacks the full live-instance identity**;
122
+ [Diavisuals 14](https://github.com/dosquartsdedocs/diavisuals/issues/14) is therefore
123
+ an external D0 managed-closure blocker. Rendering compatibility alone does not
124
+ close that gate or make the whole coordinator dependency graph managed-ready.
125
+
126
+ ## Acceptance and delivery state
127
+
128
+ `test/d0_runtime_smoke.py` exercises installed launchers, actual images, tool/resource
129
+ agreement, independent consumers, reconnect, running-container metadata drift,
130
+ busy drain, offline launch, wrong/missing image refusal, manual/web work and
131
+ 0.6.0 → containing 0.7.0 → 0.6.0 activation with retained authored/generated state.
132
+ The published 0.6.0 point accurately remains **partial** for live identity; no
133
+ fixture or relabelled package is counted as a second D0-capable release.
134
+ Backend-crash/orphan recovery is exercised separately from graceful disconnect.
135
+ The existing Carta and populated Bundler acceptance drivers remain release gates.
136
+
137
+ This is owner development evidence until reviewed source, containing release
138
+ receipts, installed signed-byte acceptance and remaining blockers are returned to
139
+ the central issue. Published 0.6.0 and its active checkout launcher pin remain
140
+ unchanged during candidate development. The worker/data choices and external
141
+ Diavisuals identity blocker must remain visible in the hub's adapter decision.
142
+
143
+ ## Retained local acceptance — 2026-10-05
144
+
145
+ The owner explicitly authorized the full 0.7.0 review/PR/integration, gated
146
+ publication and post-release pin flow. No other checkout is a write workspace.
147
+
148
+ The installed local wheel
149
+ `67689b76225511439175c82b6df033005d84e990b147b8fa4875f3adbd7d684f` and owned MCP
150
+ image `sha256:d8eafba61a2e1f02bc22b244610d8174879e04d9ea36b47a71e8cd7f993a54b1`
151
+ passed eight stages: reconnect/scope, loaded-versus-disk, busy drain, backend
152
+ crash recovery, offline launch, explicit daemon mapping, wrong worker and missing
153
+ worker. The crash record observed a real PDF job still **busy** after backend
154
+ death, then confirmed eligible recovery and resource absence. The other live
155
+ instance was preserved. The published 0.6.0 A/B/A point remained explicitly
156
+ partial for live identity; authored files and its old cache entries kept their
157
+ hashes. This is prepared development evidence, not a signed release identity.
158
+
159
+ | Local retained evidence under `/tmp/opencode/unaltraweb-d0-85/` | SHA-256 |
160
+ | --- | --- |
161
+ | `acceptance-final/evidence.json` | `e35457153c5ffe98b4bd231f608735a2c4ad07e9db756699d7446e06e6b0b9c7` |
162
+ | `helpers-proof/evidence.json` | `df994ccd8afaff45a7e3cfa9b6a29b650c9d01d63db2c9c36e59c31834273473` |
163
+ | `carta-proof/evidence.json` | `ac305ad222a792291ebd27679a72a37a3ff29ab4746301ed9db7f64705ca4755` |
164
+ | `bundler-proof/evidence.json` | `b304c4c5abe45ae9295f6eba86eae36be92e348e6be33463fcb50e119550d341` |
165
+
166
+ The Carta proof retains the published sender seal and unchanged original PDF,
167
+ removes the copied producer, relocates the receiver and forces another PDF build.
168
+ Both 11-page manuals have SHA-256
169
+ `46e50f815c007a97ac59898194023de3fa4e916e77e7eac21b73f8792244713c`; the letter is
170
+ on page 10. The four-profile populated Bundler regression passed 0.4.0 → prepared
171
+ 0.7.0 → 0.4.0, preserving all six tracked author/cache checksums and separately
172
+ reproducing the known unpatched 0.5.0 failure. No caches were cleared.
173
+
174
+ Review additionally tightened Docker absence classification: an unavailable
175
+ daemon socket is **unknown**, not evidence that a container was removed. That
176
+ source-only correction has a dedicated regression; final release acceptance must
177
+ be repeated against the actual source-bound candidates after integration.
178
+
179
+ The local suite passes 608 tests with 30 optional/environment skips. Distribution,
180
+ workflow, fresh-wheel and extracted-gem gates pass, as do the real MCP smoke,
181
+ manual preparation, docs build, prose checks and whitespace checks. These checks
182
+ do not override the separate signed-candidate/publication gates or the external
183
+ helper-process blocker.
184
+
185
+ ## Reviewed core selection
186
+
187
+ Implementation `0c87e8c276e58ac9c747833df69cdb439aa6132b` was reviewed and
188
+ integrated through [PR 87](https://github.com/dosquartsdedocs/unaltraweb/pull/87)
189
+ as `216ab2e8b6b8b45a5bb7da0a54bffd10edee895d`. Protected PR CI
190
+ [37271200816](https://github.com/dosquartsdedocs/unaltraweb/actions/runs/37271200816)
191
+ and CodeQL [37271200817](https://github.com/dosquartsdedocs/unaltraweb/actions/runs/37271200817)
192
+ passed. The recorded review is agent-attributed.
193
+
194
+ The next candidate source pins that integrated core and authorizes gem, wheel,
195
+ runtime and MCP as `ready` for same-source candidate preparation. The selected
196
+ signed PDF 0.6.0 and computation/capture 0.4.0 workers remain unchanged: the new
197
+ selection/lifecycle behavior is controller-owned. Strict receipt, ancestry,
198
+ candidate, installed-byte and publication gates still apply. This readiness is
199
+ for the containing owner release, not approval of the full managed coordinator
200
+ closure while the external Diavisuals identity gap remains.
@@ -1,5 +1,10 @@
1
1
  # MCP Contract
2
2
 
3
+ The D0 additions require a containing 0.7.0 runtime. Their pinned requirements,
4
+ exact API mapping, lifecycle scopes and external helper-identity blocker are
5
+ documented in [the owner contract](d0-runtime-identity.md). A source descriptor
6
+ does not upgrade an already-running 0.6.0 connection.
7
+
3
8
  `unaltraweb` exposes one global, on-demand stdio MCP server for website workspaces. Every client session starts an independently named Dockerized MCP process and mounts its current consumer project at `/workspace` and at its canonical host path. Stable factory, role, and project labels preserve project-scoped lifecycle control without forcing concurrent sessions to share a deterministic container name. The image includes both FastMCP and the Jekyll runtime, so the host does not need Python, the optional `mcp` package, Ruby, or Bundler.
4
9
 
5
10
  The client registration should launch:
@@ -16,7 +21,7 @@ MCP_CONSUMER_WORKSPACE="$PWD" make --silent --no-print-directory -C /path/to/una
16
21
 
17
22
  Replace `/path/to/unaltraweb` with the checkout's absolute path. The bootstrap canonicalizes the inherited environment value after process launch; neither Make nor generated shell source evaluates consumer path text. The declared launcher remains `make`, which gContExt permits for a container runtime without a `runtime.allowed_host_launchers` exception. Restart clients such as OpenCode after changing their MCP registration.
18
23
 
19
- Next-release wheels also install this native descriptor and its complete host
24
+ Released 0.5.1 wheels also install this native descriptor and its complete host
20
25
  helper closure under `share/unaltraweb-launcher`. For that installed profile,
21
26
  `${factoryRoot}` is the path returned by `unaltraweb-mcp-docker path`, rather than
22
27
  a core checkout. Its small Makefile implements `mcp-build`, `mcp-check`,
@@ -32,13 +37,18 @@ it to an image ID before execution. The source checkout's digest pin is separate
32
37
  it advances only after a new receipt exists. Explicit `--image` (or the console
33
38
  adapter's `UNALTRAWEB_MCP_IMAGE`) permits a reviewed immutable selection.
34
39
 
40
+ The post-release checkout pin selects published 0.6.0 MCP digest
41
+ `sha256:736c4ddd0a543454e3edaeac2e9cfd97a1279ce472923ac54e326c1281b2ba05`.
42
+ Existing processes keep their running image until clients reconnect. Site build
43
+ defaults and customized Makefiles remain separate, explicitly reviewed selections.
44
+
35
45
  gContExt dependency preparation ensures the selected MCP release image and prepares required companions but does not initialize consumer content. The transport passes `${workspaceFolder}` only through `MCP_CONSUMER_WORKSPACE`; it never sets `transport.cwd` or embeds the consumer path in a Make assignment. The factory command may therefore use `make -C` without changing or reparsing the selected consumer root. Companion-aware checks and smoke tests include both required providers, while provider updates remain explicit. The manifest does not advertise an `init` command, and both companion dependencies set `init: false`. Use `new_web` explicitly when a new consumer site should be created. Restart long-lived MCP clients after registration, release-pin changes, or provider upgrades so their stdio processes use the selected releases.
36
46
 
37
47
  Repository editing coordination remains a control-plane responsibility rather than an `unaltraweb` runtime feature. Request one top-level MCP and let the control plane select its declared dependency closure; unrelated user registrations remain configured until explicitly removed and clients reconnect. Before editing, the control plane runs its read-only checkout preflight against the one primary mutable checkout and, when required, holds a process-scoped cooperative lease through its `exec` wrapper. Only one editing session may be active per repository. The control plane must never create, switch to, move, prune, repair, or remove Git worktrees implicitly.
38
48
 
39
49
  For a new agent-driven workspace, create or select the empty Git repository first, open that directory in the IDE, register the factory, restart the client, and then call `new_web`. The tool remains confined to the configured project root and does not accept an arbitrary destination. Generated sites include user-owned `README.md` and `AGENTS.md`, profile-specific source directories, and a managed runtime baseline; `scaffold_sync` never rewrites those user-owned guidance or content files.
40
50
 
41
- The native Python CLI remains modular. Without a factory checkout it supports `version`, `new-web`, top-level `doctor`, the host-only `import-calibre` command, and the exact package-only MCP inventory declared in `component-contract.json`. The complementary exact inventory fails clearly with `UNALTRAWEB_FACTORY_DIR` remediation. The separate Docker adapter delegates to the full image and does not expand that native inventory. The BOM selects the published `diavisuals v0.4.0` and `vegavisuals v0.4.0` releases. Its `consumer_integration` object is also the single source for the immutable core, workflow, PDF worker, and Vega revisions rendered into consumer scaffolds. Neither companion is bundled in the wheel or MCP server namespace.
51
+ The native Python CLI remains modular. Without a factory checkout it supports `version`, `new-web`, top-level `doctor`, the host-only `import-calibre` command, and the exact package-only MCP inventory declared in `component-contract.json`. The complementary exact inventory fails clearly with `UNALTRAWEB_FACTORY_DIR` remediation. The separate Docker adapter delegates to the full image and does not expand that native inventory. The 0.7.0 BOM selects owner-tested `diavisuals v0.5.0` and `vegavisuals v0.5.1`; existing 0.4.0 static receipts retain their exact integrity-checked compatibility point. Its `consumer_integration` object is also the single source for the immutable core, workflow, PDF worker, and Vega revisions rendered into consumer scaffolds. Neither companion is bundled in the wheel or MCP server namespace.
42
52
 
43
53
  Static Vega-Lite and Vega rendering remains owned by the required companion `vegavisuals` MCP dependency. Use its `visualization_status`, `visualization_check`, `render_visualizations`, and `vegavisuals://project/*` resources directly; `unaltraweb` exposes the authoring syntax but does not proxy those tools into the `web://` server.
44
54
 
@@ -76,6 +86,7 @@ baseline format nor runtime cleanup changes.
76
86
 
77
87
  | Resource | Description |
78
88
  | --- | --- |
89
+ | `web://runtime-identity` | Bounded identity of this serving process: startup/current code, instance/PID namespaces, binding, runtime selections and cooperative lifecycle. |
79
90
  | `web://distribution` | Package-owned component BOM plus offline, feature-aware doctor findings for the current factory and project. |
80
91
  | `web://site-context` | Site profile, feature flags, content inventory, bibliography, bibliometrics, build state, and offline consumer-update advisory. |
81
92
  | `web://site-doctor` | Read-only offline distribution, project-contract, freshness, scaffold-drift, and core-override findings. |
@@ -97,12 +108,15 @@ baseline format nor runtime cleanup changes.
97
108
  | `web://manual-authoring-components` | Supported prose structures and component syntax, including callouts, definition lists, figure layouts, tables, diagrams, citations, and web/PDF compatibility. |
98
109
  | `web://manual-computations` | Executable manual sources, selected runtime images, generated outputs, and freshness state. |
99
110
  | `web://web-captures` | Selector-based screenshot recipes, original PNGs, editable SVG layers, edited overrides, and freshness. |
111
+ | `web://artifact-imports` | Native retained-letter bindings, complete seal/mapping integrity and source references; read-only. |
100
112
  | `web://new-web-scaffolds` | Package-owned scaffold availability and contract paths for every supported site profile. |
101
113
 
102
114
  ## Tools
103
115
 
104
116
  | Tool | Notes |
105
117
  | --- | --- |
118
+ | `runtime_identity` | Observe the actual serving instance, startup/current package evidence and selected/observed images; never prepare a runtime or inspect site content. |
119
+ | `runtime_drain` | With `confirm=true`, stop admission on this connection; then close stdio and verify exact container/session resource termination. It is not workspace-wide down. |
106
120
  | `distribution_doctor` | Return offline component/factory/project findings with stable codes and optional local Docker image inspection that never pulls. |
107
121
  | `new_web` | Create a profile-specific site from package-owned assets after a complete collision, path, and symlink preflight. |
108
122
  | `starter_templates` | List package-owned profile scaffolds under the legacy inventory name. |
@@ -111,6 +125,8 @@ baseline format nor runtime cleanup changes.
111
125
  | `site_context` | Read the main local state plus `update_status`: current/target package versions, planned paths, preserved customizations, conflicts and a reviewed-plan digest. |
112
126
  | `site_doctor` | Combine distribution doctor with strict project config, identity/language, generated Make contract, scaffold drift, required generated-output/receipt status, existing HTML audit, companion actions, and core override inventory. Unknown required status is blocking. Read-only and offline. |
113
127
  | `site_check` | Run profile, publication-copy source diagnostics, freshness, companion visualization/diagram receipt, bibliography, bibliometrics, and build-state checks without network. |
128
+ | `import_artifact_bundle` | Plan or explicitly apply a create-only Carta 0.3.0rc1 `letter-pdf-v1` import with the sender SHA-256, complete retained seal, standard v1 integration record and native content binding. Defaults to dry-run; apply requires `confirm_import=true`. |
129
+ | `artifact_import_check` | Verify retained domains, mappings and native source references; optional `output_folder` checks the bound rendered page and exact emitted PDF bytes. |
114
130
  | `site_source_read` | Read one allowed UTF-8 site source and return its exact SHA-256. |
115
131
  | `site_source_write` | Dry-run or atomically create/update one allowed source. Creates require `create_only`; updates require the exact SHA-256 returned by a read. |
116
132
  | `site_source_delete` | Dry-run or delete one allowed source with exact SHA-256 and explicit confirmation. It never deletes `_config.yml` or directories. |
@@ -172,6 +188,33 @@ Manual PDF publication is a local workspace operation: it copies reviewed artefa
172
188
 
173
189
  ## New Site Initialization
174
190
 
191
+ ### Retained Letter Integration
192
+
193
+ The published 0.6.0 release adds package-only import/check commands and the
194
+ `web://artifact-imports` resource. Web rendering needs its containing Jekyll core;
195
+ manual inclusion also needs the matching PDF worker. Published 0.5.1 components
196
+ do not acquire this capability from a launcher-pin change.
197
+
198
+ The complete seal lives at `.unaltraweb/artifacts/<id>/bundle/`, alongside an
199
+ unchanged-schema v1 integration record and a separate native `binding.json`.
200
+ Only the byte-identical mapped PDF under `assets/documents/` is public. A new
201
+ draft page/chapter binds it using the `retained_document` Liquid tag and a literal
202
+ permalink. `site_check`, `site_doctor`, Jekyll and manual PDF preparation verify
203
+ the corresponding domain, seal, mapping and native reference; the PDF fingerprint
204
+ includes every retained dependency and checker. Producer sources are never run.
205
+
206
+ Writes require the consumer Git root, ignored/untracked recovery staging and
207
+ non-ignored durable paths. They are descriptor-relative and create-only, with
208
+ preflight and final integrity checks. The project/import locks coordinate with
209
+ native readers and the PDF controller. An interrupted operation retains its
210
+ prepared tree and partial files, without destructive rollback. An explicit retry
211
+ may adopt identical bytes; conflicts preserve existing content. Successful
212
+ identical reimport preserves authored prose. See the
213
+ [author reference](../_documentation/en/45-retained-documents.md) and
214
+ [owner acceptance record](retained-letter-import.md) for bounds and evidence.
215
+
216
+ ### Package-Owned Initialization
217
+
175
218
  `new_web` is intended for empty or nearly-empty website repositories. It creates common runtime files, profile-specific configuration, localized home pages, the content paths required by the selected profile, and `.unaltraweb/scaffold.json`. All scaffold assets are shipped inside the `unaltraweb_mcp` Python package and MCP Docker image; environment variables, sibling checkouts, and arbitrary template paths are not consulted.
176
219
 
177
220
  The `unaltremanual` scaffold also creates `context/writing-profile.md` with a usable default editorial policy and `.unaltraweb/computations.yml` with both BOM-selected workers, `_chapters` and `assets/quarto` source roots, and a generated-asset root. Customize the writing profile for the manual's audience, voice, terminology, evidence policy, language workflow, and review requirements. Computation configuration is consumer-owned rather than scaffold-managed so a project can add lockfiles, dependency paths, or extension Dockerfiles without creating scaffold-sync conflicts. PDF generation and Vega manifests remain opt-in project configuration.
@@ -0,0 +1,205 @@
1
+ # unaltraweb 0.5.1 delivery closeout
2
+
3
+ Publication: **2026-09-30**, [v0.5.1](https://github.com/dosquartsdedocs/unaltraweb/releases/tag/v0.5.1).
4
+ Owner coordination: [issue 76](https://github.com/dosquartsdedocs/unaltraweb/issues/76).
5
+ This supersedes the pending-publication status of the retained preparation and
6
+ follow-up reports without changing their historical bytes.
7
+
8
+ ## Revisions, review and integration
9
+
10
+ | Role | Revision / evidence |
11
+ | --- | --- |
12
+ | Initial accepted local source | `217340cadc9db85aa717e020682068b9ce0ef379` |
13
+ | Bundler/core implementation, retained consumer pin | `c23e12b0e1567d18a7f9dd225dc062ddc77dad8b` |
14
+ | Closeout installed-launcher default correction | `1640572ccd9156037b9a4c0018b4c849a027296f` |
15
+ | Integrated source producing the release artifacts | `aab5a7b030cd711b40770a3f44ad3a356eab90da`, [PR 77](https://github.com/dosquartsdedocs/unaltraweb/pull/77) |
16
+ | Receipt-only branch commit | `8a0b6ce0d0c875ac6a8b86d9e354b8a388b5d038`, direct child of the source above |
17
+ | Receipt integration and release tag target | `e842c733c8a274279dd5efdc3618e20669f29037`, [PR 78](https://github.com/dosquartsdedocs/unaltraweb/pull/78) |
18
+ | Annotated `v0.5.1` tag object | `c4901b583c777a050cd53e1e96643ad53b7c0f64` |
19
+
20
+ Both integrations used merge commits, preserving the approved core's ancestry.
21
+ The receipt integration's first parent is exactly the artifact source; its diff
22
+ from that parent contains only `release-candidates.json`. The source pin still
23
+ names the real approved core implementation. The later closeout correction
24
+ changes host-launcher selection, not that Jekyll/Bundler core implementation.
25
+
26
+ All preparation commits and the complete base diff were reviewed. The remaining
27
+ delivery finding was that the installed 0.5.1 launcher still selected the older
28
+ 0.5.0 MCP. Commit `1640572` fixes that: the console adapter uses explicit
29
+ `--image`, then `UNALTRAWEB_MCP_IMAGE`, then its own BOM release image. The installed
30
+ Make profile also defaults to its own release. The checkout's stricter digest
31
+ pin remains a separate post-release operation. Default and override precedence
32
+ are exercised by the factory-free wheel gate.
33
+
34
+ Agent review records are attached to both PRs; they do not claim human review.
35
+ Copilot could not review because of quota exhaustion and was not counted as a
36
+ completed review. Explicit owner authorization covered integration and, in two
37
+ later approvals, credentialed candidate preparation and final publication.
38
+ All protected checks and conversation requirements passed without bypass.
39
+
40
+ ## Published receipt and artifacts
41
+
42
+ [Tagged native receipt](https://github.com/dosquartsdedocs/unaltraweb/blob/v0.5.1/release-candidates.json):
43
+
44
+ ```text
45
+ schema_version: 1
46
+ release: v0.5.1
47
+ source_commit: aab5a7b030cd711b40770a3f44ad3a356eab90da
48
+ receipt SHA-256: 0e9d8f0589fa1ebf3aa067f0558523868fec29210927d1715f22e16e72cb30ec
49
+ ```
50
+
51
+ Exactly four ready components are recorded:
52
+
53
+ | Component | Published name / repository | SHA-256 / OCI repository digest |
54
+ | --- | --- | --- |
55
+ | Gem | `unaltraweb-0.5.1.gem` | `818bfbb53af4de16383a211e4224ab7ab77a2647afe8703f9c3f7c1ebd123c64` |
56
+ | Wheel | `unaltraweb_mcp-0.5.1-py3-none-any.whl` | `354bff5894073d66e064b5bcd0887c5963f58035ee2b1751b541722f345cf08f` |
57
+ | Base runtime | `ghcr.io/dosquartsdedocs/unaltraweb` | `sha256:3712453bf30289f02181cff0c095ecda563306e1d8a8f2a0e087c65ea9c8d730` |
58
+ | Full MCP | `ghcr.io/dosquartsdedocs/unaltraweb-mcp` | `sha256:908b4ce54c7bdf355e14ed55b31ed4b9baae319e211af90004a680d1d1cb8692` |
59
+
60
+ The GitHub Release retains both packages and `SHA256SUMS`; that checksum file's
61
+ SHA-256 is `5cd3be237015841b65583b9b54b9df37c8a4b642e9231e6ee522d8d37d90821a`.
62
+ These are the newly downloaded workflow/publication bytes, not the earlier local
63
+ 0.5.1 candidates whose hashes appear in the follow-up report.
64
+
65
+ Native component selections retained unchanged:
66
+
67
+ - PDF 0.5.0:
68
+ `ghcr.io/dosquartsdedocs/unaltraweb-manual-pdf@sha256:9e0b3a45753c170b795e9a9d6df61580085c113436beac5bf6c8de69b6562097`.
69
+ - Python 0.4.0:
70
+ `ghcr.io/dosquartsdedocs/unaltraweb-compute-python@sha256:18cb269811bd4005800382da25a480ec2bca7eac8d0501ad1ef36bad1c0f8cd9`.
71
+ - R 0.4.0:
72
+ `ghcr.io/dosquartsdedocs/unaltraweb-compute-r@sha256:928ffb93f221e09e8b929157dee473b838e061915a2eb67224e4124b85f81837`.
73
+ - Web capture 0.4.0:
74
+ `ghcr.io/dosquartsdedocs/unaltraweb-web-capture@sha256:0bf1bc67fe63e1440bffe708a168beefa11c54441650a871ab99380d362f7c1e`.
75
+ - Diavisuals/Vegavisuals 0.4.0: the same BOM-selected hashed wheels and provider
76
+ receipt contract. Their exact references remain in `component-contract.json`.
77
+
78
+ The image workflow additionally built/tested a PDF verification candidate
79
+ `sha256:55c88a6e805f0612b8dced992868aab8443f077d72ecc9aaf7ff1bf862a154a6`.
80
+ It is not selected by the BOM, not included in this receipt, and was not promoted
81
+ as a 0.5.1 PDF component. The original 0.5.0 receipt remains at its existing tag,
82
+ with SHA-256 `e57a9dbb041c1e7fcd781cd1524f4de0317382e0f7303bb36bfa59c0b6d1cb9b`.
83
+
84
+ ## CI, signing and publication gates
85
+
86
+ | Gate | Successful run |
87
+ | --- | --- |
88
+ | Integration PR CI | [36780877307](https://github.com/dosquartsdedocs/unaltraweb/actions/runs/36780877307) |
89
+ | Integration PR CodeQL | [36780877311](https://github.com/dosquartsdedocs/unaltraweb/actions/runs/36780877311) |
90
+ | Integrated-source CI | [36785554970](https://github.com/dosquartsdedocs/unaltraweb/actions/runs/36785554970) |
91
+ | Signed image build, verification, tests | [36785858325](https://github.com/dosquartsdedocs/unaltraweb/actions/runs/36785858325) |
92
+ | Package preparation | [36785861424](https://github.com/dosquartsdedocs/unaltraweb/actions/runs/36785861424) |
93
+ | Receipt PR CI | [36788752930](https://github.com/dosquartsdedocs/unaltraweb/actions/runs/36788752930) |
94
+ | Receipt/tag target CI | [36789293544](https://github.com/dosquartsdedocs/unaltraweb/actions/runs/36789293544) |
95
+ | Tag CI | [36791298216](https://github.com/dosquartsdedocs/unaltraweb/actions/runs/36791298216) |
96
+ | Semver image promotion | [36791298413](https://github.com/dosquartsdedocs/unaltraweb/actions/runs/36791298413) |
97
+ | PyPI and RubyGems Trusted Publishing | [36791301396](https://github.com/dosquartsdedocs/unaltraweb/actions/runs/36791301396) |
98
+
99
+ GitHub-signed OCI provenance was verified against the owner workflow and exact
100
+ source digest in the candidate and promotion jobs. Local inspection additionally
101
+ confirmed the OCI digests and source revision labels. The package workflow's
102
+ immutable artifact ID is `11129633290`, archive digest
103
+ `sha256:60a68862dcedec3747ed49112b66d10e697765a0ab5d6f249b33690aa5c5a3c5`.
104
+ The publication verifier bound that run, source, artifact inventory and checksums
105
+ to the receipt and annotated tag object before granting OIDC publishing authority.
106
+
107
+ Before promotion, both the actual receipt-only branch and merged tag target
108
+ passed `make distribution-release-check`. The merged `main` and then the annotated
109
+ tag passed `--require-release-ready --validate-publish-ref --components
110
+ gem,wheel,runtime,mcp,manual_pdf`. `verify_package_publish.py release` and exact
111
+ package staging also passed. The old receipt was never substituted as evidence
112
+ for the new version. Strict release validation refers to this receipt/tag
113
+ revision, not to later ordinary post-release source commits.
114
+
115
+ ## Populated-cache evidence
116
+
117
+ The previous final evidence was first rehashed at intake: gem, wheel and
118
+ `final-roundtrip/evidence.json` matched the follow-up report. All six preserved
119
+ files still matched in every profile, and the manual PDF matched its manifest.
120
+
121
+ The actual signed candidate and downloaded CI wheel then passed a new full
122
+ roundtrip in **all four profiles**: `unaltreselfie`, `unaltreprojecte`,
123
+ `unaltredocs`, `unaltremanual`.
124
+
125
+ 1. A real 0.4.0 build populated the generated lock with `google-protobuf 4.36.1`.
126
+ 2. Unpatched 0.5.0 failed as expected on a separate populated copy.
127
+ 3. The signed corrected full MCP passed two builds, preview and HTTP.
128
+ 4. Returning to the unchanged published 0.4.0 passed two builds, preview and HTTP.
129
+ 5. Gemfile, Gemfile.lock, Makefile, scaffold baseline and both historical generated
130
+ Gemfile/lock files retained their original SHA-256 values throughout.
131
+
132
+ New evidence:
133
+ `/tmp/opencode/unaltraweb-closeout-051/candidate-roundtrip/evidence.json`, SHA-256
134
+ `b5a2935359103983ff497760d8e9c367318ed9f77741ae1c5404a56449547179`.
135
+ An external recording wrapper ran the unchanged owner driver and retained the
136
+ manual tool responses plus PDF/cover bytes for both stages; it did not change
137
+ arguments, caches or runtime behavior.
138
+
139
+ | Manual artifact | SHA-256 |
140
+ | --- | --- |
141
+ | Corrected stage PDF | `203b39def968b644d1d0d3999827516e0e00aa8dd6b85202b33167d68dcb150e` |
142
+ | Return-0.4 PDF | `aba2802d4e0d978c8acc0cfbfc26a84607739b0953756a6bdb16fabbc43defa0` |
143
+ | Both stage covers | `afc3ba16ca919a7879f4629023e6316b77e31e56403e82edb7168f3181a3dc9d` |
144
+
145
+ The responses report `ok: true`, `publishes: false`; preview cleanup remained
146
+ receipt-bound. No cache was emptied to obtain a pass. The historical image
147
+ selections and reproduction command remain in `owner-followup-76.md`; this run
148
+ used the receipt's full MCP digest as `--fixed-image` and the downloaded CI wheel.
149
+
150
+ ## Public-download and installed acceptance
151
+
152
+ Artifacts are retained under `/tmp/opencode/unaltraweb-closeout-051/`:
153
+ `packages/`, `verified-packages/`, `published/`, `github-release/`,
154
+ `installed-candidate/`, `installed-published/`, and `candidate-roundtrip/`.
155
+
156
+ - Anonymous PyPI and RubyGems downloads match the receipt exactly; metadata and
157
+ downloaded bytes were independently compared.
158
+ - Both `0.5.1` and `v0.5.1` GHCR aliases were checked with an empty Docker client
159
+ configuration and match the expected OCI index digests.
160
+ - GitHub Release assets were downloaded again and pass their `SHA256SUMS`.
161
+ - The public wheel was installed non-editably in a new venv. Its default
162
+ `prepare`/`check` selects and runs MCP 0.5.1 without a local core.
163
+ - The public gem installs into an isolated gem home and activates as 0.5.1 using
164
+ the image's preinstalled Ruby dependencies. An initial probe artificially
165
+ omitted standard gem paths and failed to find `rexml`; retaining `Gem.path`
166
+ corrected the probe. This is not a claim of a network-fresh dependency install.
167
+ - The host's older Buildx did not render the requested digest-only template;
168
+ anonymous verification instead checked the exact top-level `Digest:` field.
169
+ - Closeout source tests reported **562 cases, 532 passed, 30 optional skips**;
170
+ distribution, workflow, wheel and prose checks passed. CI additionally ran its
171
+ Python matrix, Ruby, PDF, MCP, reproducibility and docs gates.
172
+ - The post-pin local recheck reported **562 cases, 533 passed, 29 optional skips**
173
+ after the public image became available. Distribution, workflow, wheel,
174
+ `mcp-check`, `mcp-smoke`, docs build and diff gates passed with isolated
175
+ `unaltraweb-closeout-051-*:post-pin` tags and a fresh smoke fixture. The smoke
176
+ used the selected published PDF digest. These local development builds do not
177
+ replace the published release artifacts.
178
+
179
+ Observed local configuration IDs (distinct from OCI repository digests):
180
+ runtime `sha256:5c406a7981118203070517b6689f2f4f03ac7fd2b5626b52ed96fe14009d67b9`;
181
+ full MCP `sha256:e7b2bd34751c2d3a30f9974f46c64e30a1a2fbd9ba412279234a5f24ff197eda`.
182
+
183
+ ## Post-release pin and remaining adoption scope
184
+
185
+ The post-release source change on `chore/76-pin-published-mcp-0.5.1` accompanies
186
+ this report. `Makefile` and `scripts/unaltraweb-mcp-bootstrap.sh` select
187
+ `ghcr.io/dosquartsdedocs/unaltraweb-mcp@sha256:908b4ce54c7bdf355e14ed55b31ed4b9baae319e211af90004a680d1d1cb8692`;
188
+ the pin regression and current documentation are updated. Its PR/merge and final
189
+ clean-main confirmation are recorded in issue 76 after protected CI completes.
190
+ Published packages, receipt and tag are not rebuilt by this source update.
191
+
192
+ An actual `MCP_CONSUMER_WORKSPACE`-bound `make mcp-stdio` session was launched from
193
+ the post-pin checkout against a new empty synthetic consumer. Initialize and
194
+ `detect_site` succeeded, and Docker inspection proved the session used the public
195
+ MCP configuration ID `sha256:e7b2bd34751c2d3a30f9974f46c64e30a1a2fbd9ba412279234a5f24ff197eda`.
196
+ The temporary session exited cleanly. The post-pin `mcp-build` and bootstrap
197
+ `--check` also selected the published image without rebuilding it.
198
+
199
+ The installed package already selects its own release; existing MCP processes
200
+ keep their image until reconnected. No real manual, client registration or shared
201
+ authoring worker was migrated. Historical Makefile adaptation remains restricted
202
+ to matching baselines; customized Makefiles require explicit owner integration.
203
+ The accepted evidence covers these exact Linux/amd64 tuples, not an untested
204
+ version interval or architecture. No new H1 fields were introduced. Consumer
205
+ adoption and central catalogue integration remain their own later sessions.