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.
- checksums.yaml +4 -4
- data/Makefile +13 -11
- data/_plugins/retained_documents.rb +62 -0
- data/docs/_documentation/en/40-distribution.md +73 -19
- data/docs/_documentation/en/45-retained-documents.md +138 -0
- data/docs/_documentation/en/46-live-runtime.md +89 -0
- data/docs/agents/d0-runtime-identity.md +200 -0
- data/docs/agents/mcp-contract.md +45 -2
- data/docs/agents/owner-closeout-76.md +205 -0
- data/docs/agents/owner-closeout-80.md +185 -0
- data/docs/agents/retained-letter-import.md +235 -0
- data/lib/unaltraweb.rb +1 -0
- data/requirements.txt +2 -0
- data/scripts/manual/Dockerfile +7 -4
- data/scripts/manual/build_pdf.py +28 -0
- data/scripts/manual/templates/manual.tex +1 -0
- data/scripts/test_gem_build.py +27 -0
- data/scripts/test_wheel_install.py +7 -2
- data/scripts/unaltraweb-mcp-bootstrap.sh +90 -9
- data/scripts/unaltraweb-mcp-cleanup.sh +41 -9
- data/scripts/web_captures/render.py +8 -1
- data/src/unaltraweb_mcp/__init__.py +4 -0
- data/src/unaltraweb_mcp/artifact-handoff-v1.schema.json +102 -0
- data/src/unaltraweb_mcp/artifact_handoff_v1.py +435 -0
- data/src/unaltraweb_mcp/artifact_imports.py +368 -0
- data/src/unaltraweb_mcp/component-contract.json +27 -27
- data/src/unaltraweb_mcp/distribution.py +887 -0
- data/src/unaltraweb_mcp/letter_bundle.py +223 -0
- data/src/unaltraweb_mcp/pdf_probe.py +63 -0
- metadata +16 -2
|
@@ -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.
|
data/docs/agents/mcp-contract.md
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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.
|