unaltraweb 0.6.0 → 0.7.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 33193d7900939e3cf2e4e9769e8fd9443e0a7242eaa73aef1d93b8ffcee6e79b
4
- data.tar.gz: 3ef63e4f55c4b369e0926be413eb2da4d3702f49ac733d84dedc952bb1ec563c
3
+ metadata.gz: 5697f730a670b00edc9d6cda6bb653552470c6c58667d27557e33309203f552c
4
+ data.tar.gz: 1fb32fa043262eca9724aed6dc0184246bc6012f2a6261037f03203ef1265945
5
5
  SHA512:
6
- metadata.gz: eb799646f841a4444d315aa4a71d161ec83acacbef75f36fe00b8db7242699be40147c2829bedee18f249f3085b51328cd18a902f317196d518b4f2b8e11a9f2
7
- data.tar.gz: cfe5a103146718d7bbae56c9821b2dabdc0fdf1bcde966779ee41ea96c468bd795446202844a56a0974919ce4bca33e2d90e5c6de98e8e95936b1335c44dca86
6
+ metadata.gz: d43c24786b83d17e9cf8cc238eb12227a3d46581fbc550468c95549f9061cd60b6eb4681021855e646929ca41f6b51de850e2db183d956dfd72876b6e48a8a2e
7
+ data.tar.gz: 15c574473f3c71b81b624b08bf4767902deebfc5f0164abc668f43dae6f33f9a0eb8c4a45e1d734a03bd4540b42b81d4e0a77aa8f42ae46566e7cd81cf7af19f
data/Makefile CHANGED
@@ -1,9 +1,9 @@
1
1
  PYTHON ?= python3
2
2
  override PROJECT := $${MCP_CONSUMER_WORKSPACE:?MCP_CONSUMER_WORKSPACE is required}
3
3
  override PROJECT_ROOT := $(PROJECT)
4
- MCP_RUNTIME_IMAGE ?= ghcr.io/dosquartsdedocs/unaltraweb:0.6.0
5
- MCP_IMAGE ?= ghcr.io/dosquartsdedocs/unaltraweb-mcp:0.6.0
6
- MCP_RELEASE_IMAGE ?= ghcr.io/dosquartsdedocs/unaltraweb-mcp@sha256:908b4ce54c7bdf355e14ed55b31ed4b9baae319e211af90004a680d1d1cb8692
4
+ MCP_RUNTIME_IMAGE ?= ghcr.io/dosquartsdedocs/unaltraweb:0.7.1
5
+ MCP_IMAGE ?= ghcr.io/dosquartsdedocs/unaltraweb-mcp:0.7.1
6
+ MCP_RELEASE_IMAGE ?= ghcr.io/dosquartsdedocs/unaltraweb-mcp@sha256:b84cdb404ba7bab5ff0b14fa8a7ee93d7293e829cf32e28ff0dacaa8afff4677
7
7
  MCP_DOCKER_BUILD_NETWORK ?= default
8
8
  INIT_SITE_PROFILE ?= unaltreselfie
9
9
  NEW_WEB_PROFILE ?= unaltreselfie
@@ -40,8 +40,8 @@ WEB_CAPTURE_IMAGE ?= ghcr.io/dosquartsdedocs/unaltraweb-web-capture@sha256:0bf1b
40
40
  WEB_CAPTURE_DEV_IMAGE ?= unaltraweb-web-capture:dev
41
41
  WEB_CAPTURE_DOCKER_BUILD_NETWORK ?= default
42
42
  VEGAVISUALS_CLI ?=
43
- DOCKER_IMAGE ?= ghcr.io/dosquartsdedocs/unaltraweb:0.6.0
44
- MANUAL_PDF_IMAGE ?= ghcr.io/dosquartsdedocs/unaltraweb-manual-pdf@sha256:0ba267cb87f53ebaca4e31805fe00610cd61fdf97a8d2c3692f4655700dceaed
43
+ DOCKER_IMAGE ?= ghcr.io/dosquartsdedocs/unaltraweb:0.7.1
44
+ MANUAL_PDF_IMAGE ?= ghcr.io/dosquartsdedocs/unaltraweb-manual-pdf@sha256:1bb3f2dafd741e96c28639ec1cc8ccaeb81cbaa73e649f787c0b4ef59997bd4b
45
45
  MANUAL_PDF_DEV_IMAGE ?= unaltraweb-manual-pdf:dev
46
46
  MCP_SMOKE_MANUAL_PDF_IMAGE ?= $(MANUAL_PDF_IMAGE)
47
47
  MCP_SMOKE_PROJECT ?=
@@ -71,7 +71,7 @@ export MANUAL_RELEASE_SELECTOR MANUAL_PDF_LANG MANUAL_PDF_PUBLISH_DRY_RUN MANUAL
71
71
  UNALTRAWEB_WORKER_ROLE ?=
72
72
  UNALTRAWEB_WORKER_PROJECT ?=
73
73
  UNALTRAWEB_WORKER_TOKEN ?=
74
- WORKER_LABEL_ARGS = $(if $(strip $(UNALTRAWEB_WORKER_TOKEN)),--label "io.context.mcp-factory=unaltraweb" --label "io.context.mcp-role=$(UNALTRAWEB_WORKER_ROLE)" --label "io.context.mcp-project=$(UNALTRAWEB_WORKER_PROJECT)" --label "io.context.mcp-worker-token=$(UNALTRAWEB_WORKER_TOKEN)",)
74
+ WORKER_LABEL_ARGS = $(if $(strip $(UNALTRAWEB_WORKER_TOKEN)),--label "io.context.mcp-factory=unaltraweb" --label "io.context.mcp-role=$(UNALTRAWEB_WORKER_ROLE)" --label "io.context.mcp-project=$(UNALTRAWEB_WORKER_PROJECT)" --label "io.context.mcp-worker-token=$(UNALTRAWEB_WORKER_TOKEN)",) $(if $(strip $(UNALTRAWEB_RUNTIME_SESSION)),--label "io.context.mcp-session=$(UNALTRAWEB_RUNTIME_SESSION)",)
75
75
  DOCS_CONTAINER ?= unaltraweb-docs-local
76
76
  DOCS_HOST ?= 0.0.0.0
77
77
  DOCS_PORT ?= 4000
@@ -295,17 +295,18 @@ manual-compute-render: ## Execute sources and atomically publish Markdown and fi
295
295
  python_image="$(COMPUTE_PYTHON_IMAGE)"; r_image="$(COMPUTE_R_IMAGE)"; \
296
296
  if test "$$engine" = "r"; then r_image="$$image"; else python_image="$$image"; fi; \
297
297
  if ! docker image inspect "$$image" >/dev/null 2>&1; then \
298
+ if test "$${UNALTRAWEB_MANAGED_RUNTIME:-0}" = 1; then printf '%s\n' 'Selected computation image is not prepared; managed execution never builds or pulls' >&2; exit 1; fi; \
298
299
  COMPUTE_PYTHON_IMAGE="$(COMPUTE_PYTHON_IMAGE)" COMPUTE_R_IMAGE="$(COMPUTE_R_IMAGE)" COMPUTE_DOCKER_BUILD_NETWORK="$(COMPUTE_DOCKER_BUILD_NETWORK)" $(PYTHON) "$(COMPUTE_SCRIPT)" image --project "$(PROJECT_ROOT)" --engine "$$engine" >/dev/null; \
299
300
  fi; \
300
301
  identity=$$(docker image inspect "$$image" --format '{{.Id}}'); \
301
302
  digest=$$(docker image inspect "$$image" --format '{{join .RepoDigests ","}}'); \
302
303
  set --; if test -n "$(UNALTRAWEB_WORKER_TOKEN)"; then cidfile="$$runtime_dir/worker-$(UNALTRAWEB_WORKER_TOKEN)-$$engine.cid"; rm -f "$$cidfile"; cidfiles="$$cidfiles $$cidfile"; set -- --cidfile "$$cidfile"; fi; \
303
- docker run --rm "$$@" $(WORKER_LABEL_ARGS) --user "$(LOCAL_UID):$(LOCAL_GID)" --network none --read-only --cap-drop ALL --security-opt no-new-privileges --pids-limit "$(COMPUTE_PIDS_LIMIT)" --cpus "$(COMPUTE_CPUS)" --memory "$(COMPUTE_MEMORY)" --tmpfs /tmp:rw,noexec,nosuid,size=1g \
304
+ docker run --rm --pull never "$$@" $(WORKER_LABEL_ARGS) --user "$(LOCAL_UID):$(LOCAL_GID)" --network none --read-only --cap-drop ALL --security-opt no-new-privileges --pids-limit "$(COMPUTE_PIDS_LIMIT)" --cpus "$(COMPUTE_CPUS)" --memory "$(COMPUTE_MEMORY)" --tmpfs /tmp:rw,noexec,nosuid,size=1g \
304
305
  -e HOME=/tmp -e COMPUTE_PYTHON_IMAGE="$$python_image" -e COMPUTE_R_IMAGE="$$r_image" \
305
306
  -e UNALTRAWEB_COMPUTE_IMAGE_ID="$$identity" -e UNALTRAWEB_COMPUTE_IMAGE_DIGEST="$$digest" \
306
307
  --mount "$$project_mount" \
307
308
  --mount "$$runtime_mount" \
308
- -w /project --entrypoint python3 "$$image" \
309
+ -w /project --entrypoint python3 "$$identity" \
309
310
  /opt/unaltraweb/computations/render.py render --project /project --engine "$$engine" $(if $(strip $(COMPUTE_SOURCE)),--source "$(COMPUTE_SOURCE)",) $(if $(filter 1 true TRUE yes YES y Y,$(COMPUTE_CONFIRM_OVERWRITE)),--confirm-overwrite,) $(if $(filter 1 true TRUE yes YES y Y,$(COMPUTE_STALE_ONLY)),--stale-only,) $(if $(strip $(COMPUTE_MODE)),--mode "$(COMPUTE_MODE)",) >> "$$results"; \
310
311
  done; \
311
312
  if test -z "$(strip $(COMPUTE_SOURCE))"; then $(PYTHON) "$(COMPUTE_SCRIPT)" prune --project "$(PROJECT_ROOT)" >/dev/null; fi; \
@@ -382,13 +383,14 @@ define run_manual_pdf_worker
382
383
  if test -n "$(UNALTRAWEB_WORKER_TOKEN)"; then runtime_dir="$(PROJECT_ROOT)/tmp/.unaltraweb/manual-pdf"; mkdir -p "$$runtime_dir"; cidfile="$$runtime_dir/worker-$(UNALTRAWEB_WORKER_TOKEN).cid"; rm -f "$$cidfile"; set -- --cidfile "$$cidfile"; fi; \
383
384
  mount=$$(/bin/sh "$(DOCKER_MOUNT_SCRIPT)" "$(PROJECT_ROOT)" /project); \
384
385
  trap 'test -z "$$cidfile" || rm -f "$$cidfile"' EXIT; \
385
- docker run --rm "$$@" $(WORKER_LABEL_ARGS) --user "$(LOCAL_UID):$(LOCAL_GID)" -e HOME=/tmp -e "UNALTRAWEB_MANUAL_RELEASE_SELECTOR=$${MANUAL_RELEASE_SELECTOR}" --mount "$$mount" -w /project "$(MANUAL_PDF_IMAGE)" $(1) --project /project $(if $(strip $(MANUAL_PDF_LANG)),--language "$(MANUAL_PDF_LANG)",) $(2)
386
+ identity=$$(docker image inspect "$(MANUAL_PDF_IMAGE)" --format '{{.Id}}'); \
387
+ docker run --rm --pull never --network none --cpus 2 --memory 2g --pids-limit 256 "$$@" $(WORKER_LABEL_ARGS) --user "$(LOCAL_UID):$(LOCAL_GID)" -e HOME=/tmp -e "UNALTRAWEB_MANUAL_RELEASE_SELECTOR=$${MANUAL_RELEASE_SELECTOR}" --mount "$$mount" -w /project "$$identity" $(1) --project /project $(if $(strip $(MANUAL_PDF_LANG)),--language "$(MANUAL_PDF_LANG)",) $(2)
386
388
  endef
387
389
 
388
390
  manual-pdf-preflight: ## Run required PDF gates without contaminating the worker JSON stream
389
391
  @$(MAKE) --silent --no-print-directory manual-compute-check >/dev/null
390
392
  @$(MAKE) --silent --no-print-directory web-capture-check >/dev/null
391
- @docker image inspect "$(MANUAL_PDF_IMAGE)" >/dev/null 2>&1 || docker pull "$(MANUAL_PDF_IMAGE)" >/dev/null
393
+ @docker image inspect "$(MANUAL_PDF_IMAGE)" >/dev/null 2>&1 || { if test "$${UNALTRAWEB_MANAGED_RUNTIME:-0}" = 1; then printf '%s\n' 'Selected PDF image is not prepared; managed execution never pulls' >&2; exit 1; fi; docker pull "$(MANUAL_PDF_IMAGE)" >/dev/null; }
392
394
 
393
395
  manual-pdf-status: ## Inspect manual PDF configuration and artefacts without Docker, network, or writes
394
396
  @UNALTRAWEB_MANUAL_RELEASE_SELECTOR="$${MANUAL_RELEASE_SELECTOR}" $(PYTHON) "$(CURDIR)/scripts/manual/build_pdf.py" status --project "$(PROJECT_ROOT)" $(if $(strip $(MANUAL_PDF_LANG)),--language "$(MANUAL_PDF_LANG)",)
@@ -45,9 +45,34 @@ For `unaltremanual`, the `latest` channel is a manual-only deployment from the r
45
45
 
46
46
  Clean package scaffolds include a manual GitHub Pages wrapper pinned to a reviewed workflow revision. It has no push deployment trigger: a maintainer runs it only after local checks/renders and human review. The optional integration template retains additional local publishing experiments, but generated sites do not publish from local validation targets.
47
47
 
48
- The `consumer_integration` object in `src/unaltraweb_mcp/component-contract.json` is the single source for the reviewed core revision, workflow path, attested manual PDF image digest, and Vega renderer revision. The scaffold renders that tuple atomically into `Gemfile`, `Gemfile.lock`, and the packaged caller. The caller passes the existing `reviewed_sha` input through to the provider, so the reviewed `main` source is checked independently at both caller and provider boundaries.
49
-
50
- This pin-only integration follows the required M -> D -> B order: D was built from M's permanent identity before the caller recorded either value. Repeat that order for future provider updates; never use `@main` or substitute a mutable/version-tagged image for D.
48
+ The `consumer_integration` object in `src/unaltraweb_mcp/component-contract.json` is the single source for the reviewed core revision, workflow path and revision, attested manual PDF image digest, and Vega renderer revision. The scaffold renders that tuple atomically into `Gemfile`, `Gemfile.lock`, and the packaged caller. From 0.7.1, `site_deploy_workflow_sha` is independent of `core_sha`; older records default to their core pin. The caller passes the existing `reviewed_sha` input through to the provider, so the reviewed `main` source is checked independently at both caller and provider boundaries.
49
+
50
+ The 0.7.1 deployment workflow reads the exact accepted PDF digest and its producer
51
+ commit from the defining provider revision's `deployment_contract` in the BOM.
52
+ It fetches bounded JSON from that immutable provider commit, independently of
53
+ the consumer checkout. It checks the pulled image's revision label against that record, rather
54
+ than assuming the worker and a later workflow revision share a commit. Unknown
55
+ digests fail before Docker access. The reviewed records cover PDF workers 0.5.0
56
+ and 0.6.0; extending them requires a provider review and published-worker tests.
57
+ The records are data in the contract, rather than a release list embedded in the
58
+ workflow program. Release readiness checks the selected workflow's code and own
59
+ records; CI generates a caller and executes the workflow it actually references.
60
+
61
+ A reviewed deployment-only workflow fix can therefore be pinned independently
62
+ of the site's Gem/core revision while retaining an already-accepted PDF worker.
63
+ Update the caller's `uses:` to the immutable corrected workflow commit, review
64
+ that consumer change, and dispatch with the resulting reviewed `main` SHA. The
65
+ existing Gem, PDF and Vega selections need not change for this workflow repair.
66
+ Such a local caller override remains subject to normal scaffold-update conflict
67
+ review. A later package release can incorporate its own reviewed integration tuple.
68
+ Never use `@main` or a mutable/version-tagged image as a substitute for these pins.
69
+
70
+ The 0.7.1 update plan recognizes the exact reviewed one-line issue-86 caller fix
71
+ by both its original baseline hash and current content hash. It lists this as a
72
+ `migrations` entry and requires the normal reviewed plan/atomic apply. Additional
73
+ local edits still produce a conflict; authored content and unrelated files are
74
+ preserved. This lets a known provider repair converge to the next managed tuple
75
+ without treating arbitrary custom workflow code as package-owned.
51
76
 
52
77
  ## Stable manual releases
53
78
 
@@ -25,12 +25,40 @@ The template is the better place to validate gem consumption, centralized styles
25
25
 
26
26
  ## Component Contract
27
27
 
28
- ### Pending 0.6.0 retained-letter increment
29
-
30
- The source branch prepares a separate 0.6.0 identity for native
31
- [retained-letter import]({{ '/retained-documents/' | relative_url }}).
32
- Gem, wheel, base runtime and MCP are authorized as `ready` for final same-source
33
- candidates. The consumer core selects reviewed integration
28
+ ### Published 0.7.0 release
29
+
30
+ [**0.7.0**](https://github.com/dosquartsdedocs/unaltraweb/releases/tag/v0.7.0)
31
+ adds [live instance identity and session-scoped
32
+ resource control]({{ '/live-runtime/' | relative_url }}). Preparation is explicit,
33
+ launch is pull-never, and startup identity remains distinct from current disk
34
+ metadata. The owner-tested rendering closure selects Diavisuals 0.5.0 and Vega
35
+ 0.5.1 with exact artifacts; old 0.4.0 static receipts remain integrity-checked.
36
+ The selected Diavisuals 0.5.0 lacks full live-process identity. The provider's
37
+ [0.6.0 correction](https://github.com/dosquartsdedocs/diavisuals/releases/tag/v0.6.0)
38
+ is published, but remains outside this tested Web combination. Full managed
39
+ coordinator acceptance requires composing-owner validation and a new reviewed
40
+ helper selection.
41
+
42
+ Gem, wheel, base runtime and MCP were produced from
43
+ `b44818c67eecef159f7aa0f825b0416cd511bc43`; receipt integration and tag target
44
+ `9fc84ac7fd01c78c6fe15fe862beb6a5d1633a9e` bind the same-source candidates.
45
+ The post-release checkout launcher selects
46
+ `sha256:b84cdb404ba7bab5ff0b14fa8a7ee93d7293e829cf32e28ff0dacaa8afff4677`.
47
+ Signed-byte D0 acceptance, the retained-letter relocation/rebuild and all four
48
+ populated Bundler roundtrips passed. Public downloads match the receipt.
49
+ The [delivery report](https://github.com/dosquartsdedocs/unaltraweb/blob/main/docs/agents/owner-closeout-85.md)
50
+ records exact identities and the remaining gates; the
51
+ [D0 owner contract](https://github.com/dosquartsdedocs/unaltraweb/blob/main/docs/agents/d0-runtime-identity.md)
52
+ defines the native API and lifecycle scopes.
53
+
54
+ ### Previous 0.6.0 release
55
+
56
+ [**0.6.0**](https://github.com/dosquartsdedocs/unaltraweb/releases/tag/v0.6.0)
57
+ delivers native [retained-letter import]({{ '/retained-documents/' | relative_url }}).
58
+ Gem, wheel, base runtime and MCP were published from
59
+ `de52db351490e94939aac20c6af264f22a6a1678`; receipt-only integration and tag target
60
+ `ec6dcb28e890d32718aa173934527a7b4213a042` bind their verified bytes.
61
+ The consumer core selects reviewed integration
34
62
  `5cf9817489c8dc47cee726bfe42fe3071cd32b85`; the PDF 0.6.0 worker is already
35
63
  published, signed and tested at immutable digest
36
64
  `sha256:0ba267cb87f53ebaca4e31805fe00610cd61fdf97a8d2c3692f4655700dceaed`.
@@ -38,12 +66,14 @@ The PDF worker changes to include complete retained documents and the same
38
66
  integrity checkers used by its controller. Computation, capture and visual
39
67
  companions retain their tested 0.4.0 selections.
40
68
 
41
- The checkout's active launcher remains pinned to the published 0.5.1 MCP digest.
42
- Its receipt and package bytes remain unchanged. Local development images and an
43
- installed wheel exercise the new import without claiming a public 0.6.0 release
44
- or changing real consumer sites. The
45
- [owner acceptance record](https://github.com/dosquartsdedocs/unaltraweb/blob/main/docs/agents/retained-letter-import.md)
46
- records the authenticated Carta packet, receiver mapping and relocation proof.
69
+ That release's post-release checkout launcher selected MCP digest
70
+ `sha256:736c4ddd0a543454e3edaeac2e9cfd97a1279ce472923ac54e326c1281b2ba05`.
71
+ Signed candidates, protected CI, strict receipt/ancestry gates, registry promotion
72
+ and Trusted Publishing passed. Anonymous downloads match the receipt. The
73
+ [delivery report](https://github.com/dosquartsdedocs/unaltraweb/blob/main/docs/agents/owner-closeout-80.md)
74
+ records the installed Carta relocation proof and four-profile populated-cache
75
+ roundtrip against those exact bytes. Existing clients keep their loaded image
76
+ until reconnecting; real consumer adoption remains explicit.
47
77
 
48
78
  ### Published 0.5.1 release
49
79
 
@@ -53,7 +83,7 @@ state. Source `aab5a7b030cd711b40770a3f44ad3a356eab90da` produced the signed
53
83
  images and verified gem/wheel. Receipt/tag commit
54
84
  `e842c733c8a274279dd5efdc3618e20669f29037` changes only the receipt from that
55
85
  first parent. Strict release/publication gates passed before promotion, and
56
- anonymous registry downloads match the receipt. The checkout launcher now selects
86
+ anonymous registry downloads match the receipt. That release's launcher selected
57
87
  `ghcr.io/dosquartsdedocs/unaltraweb-mcp@sha256:908b4ce54c7bdf355e14ed55b31ed4b9baae319e211af90004a680d1d1cb8692`.
58
88
 
59
89
  The four-profile populated-cache roundtrip also passed against the actual signed
@@ -91,25 +121,25 @@ candidate, receipt, tag and package evidence.
91
121
 
92
122
  The BOM is an interoperability contract, not a bundle. The wheel contains its Python control/inspection modules, schema/BOM, clean package-owned scaffolds and a small host Docker launcher, described below. It does not include Ruby theme assets, Docker image layers, the factory's build/worker implementations, TeX, Chromium, computation environments, `diavisuals`, or `vegavisuals`.
93
123
 
94
- The selected public core release is `0.5.1`; earlier distributions remain immutable. Its BOM reuses immutable PDF, compute and web-capture worker digests and selects published `diavisuals v0.4.0` and `vegavisuals v0.4.0` through SHA-256-pinned wheel URLs. Companion references can describe either a provider/release-matching Git reference or a provider/release/version-matching wheel with its content hash. The wheel boundary remains external. The scaffold's Vega revision is the published `68c0b231402ae9485cc34ce530dc5239cb0ec194` commit. `distribution-check` validates structural integrity for normal CI. `distribution-release-check` blocks coordinated publication while any component is `pending` or `unavailable`; reviewed source authorized to produce final same-commit candidates is `ready`, while an already-published component is `released`. Final receipt values remain immutable after publication.
124
+ The selected public core release is `0.7.0`; earlier distributions remain immutable. Its BOM reuses immutable PDF, compute and web-capture worker digests and selects published `diavisuals v0.5.0` and `vegavisuals v0.5.1` through SHA-256-pinned wheel URLs. Companion references can describe either a provider/release-matching Git reference or a provider/release/version-matching wheel with its content hash. The wheel boundary remains external. The scaffold's Vega revision is the published `a448cc50a5f511743a6fcfc213baeb9be80f4a27` commit. `distribution-check` validates structural integrity for normal CI. `distribution-release-check` blocks coordinated publication while any component is `pending` or `unavailable`; reviewed source authorized to produce final same-commit candidates is `ready`, while an already-published component is `released`. Final receipt values remain immutable after publication.
95
125
 
96
126
  ## Docker-First Hybrid Policy
97
127
 
98
- ### 0.5.1 component selection
128
+ ### 0.7.0 component selection
99
129
 
100
- The coordinated core identity is **0.5.1**: gem, wheel, base runtime and MCP
130
+ The coordinated core identity is **0.7.0**: gem, wheel, base runtime and MCP
101
131
  images were published together. The installed host launcher and runtime-aware
102
- generated Bundler state are included. The unchanged PDF worker retains its
103
- published 0.5.0 digest, alongside the 0.4.0 computation/capture workers and visual
104
- companions. A released PDF can be reused only by full digest; new/pending workers
105
- still require the coordinated version. The historical 0.5.0 receipt remains
106
- unchanged. Signed image/package evidence is recorded in the 0.5.1 receipt;
132
+ generated Bundler state are included. The PDF worker uses its reviewed, signed
133
+ 0.6.0 digest, alongside the 0.4.0 computation/capture workers and the accepted
134
+ Diavisuals 0.5.0 / Vega 0.5.1 rendering combination. A released PDF can be reused
135
+ only by full digest; new/pending workers still require the coordinated version.
136
+ Earlier receipts remain unchanged. Signed image/package evidence is recorded in the 0.7.0 receipt;
107
137
  promotion and anonymous-download checks passed before the post-release launcher
108
138
  pin was advanced.
109
139
 
110
140
  ### Local delivery
111
141
 
112
- GHCR is the canonical delivery channel for normal local use. The released package scaffold selects `ghcr.io/dosquartsdedocs/unaltraweb-mcp:0.5.1`; existing sites can remain on their immutable previous release until deliberately updated. Its `make build`, `make serve` and `make test` targets mount the thin child site and run inside that image. The image contains both the installed Python control plane and the reviewed factory source at `/opt/unaltraweb`, so those targets load the theme as a path gem without downloading PyPI or RubyGems packages.
142
+ GHCR is the canonical delivery channel for normal local use. The released package scaffold selects `ghcr.io/dosquartsdedocs/unaltraweb-mcp:0.7.0`; existing sites can remain on their immutable previous release until deliberately updated. Its `make build`, `make serve` and `make test` targets mount the thin child site and run inside that image. The image contains both the installed Python control plane and the reviewed factory source at `/opt/unaltraweb`, so those targets load the theme as a path gem without downloading PyPI or RubyGems packages.
113
143
 
114
144
  Factory registration uses a stricter pin. gContExt runs `mcp-build`, which inspects or pulls the full `MCP_RELEASE_IMAGE` digest, and `mcp-stdio` launches that exact image. Checkout builds use local `:dev` names by default through `mcp-image`, `mcp-check` and `mcp-smoke`, so they do not shadow public semver references unless a maintainer explicitly overrides them. The digest is advanced in a separate post-release change after each new receipt exists; candidate source continues to select the last completed release instead of attempting to embed an unknown self-digest.
115
145
 
@@ -139,7 +169,7 @@ unaltraweb-mcp-docker serve --project /absolute/consumer
139
169
  ```
140
170
 
141
171
  The installed default selects its package's full MCP release image, currently
142
- `ghcr.io/dosquartsdedocs/unaltraweb-mcp:0.5.1`. It resolves that selection to the
172
+ `ghcr.io/dosquartsdedocs/unaltraweb-mcp:0.7.0`. It resolves that selection to the
143
173
  local immutable image ID before executing. The checkout's `MCP_RELEASE_IMAGE`
144
174
  is a separate digest pin advanced only after publication; it is not the installed
145
175
  wheel's default. This avoids sending a new package back to an older MCP while
@@ -284,7 +314,7 @@ For that reason:
284
314
 
285
315
  ## Docker Runtime
286
316
 
287
- Release `0.5.1` publishes the selected base/MCP runtime and packages while pinning the verified PDF worker and reusing unchanged specialized workers. Local maintainers continue to use explicit development names such as `unaltraweb:dev`; generated sites select the reviewed semver MCP image rather than `main` or `latest`.
317
+ Release `0.7.0` publishes the selected base/MCP runtime and packages while pinning the verified PDF worker and reusing unchanged specialized workers. Local maintainers continue to use explicit development names such as `unaltraweb:dev`; generated sites select the reviewed semver MCP image rather than `main` or `latest`.
288
318
 
289
319
  The base runtime owns Ruby, Jekyll and system dependencies. The MCP image builds on its exact candidate digest and adds the full reviewed factory plus the Python package. Specialized workers remain separate. This keeps each layer focused without adding Chromium, TeX or computation stacks to every site; the coordinated core-image workflow still rebuilds and verifies runtime, MCP and manual PDF candidates together.
290
320
 
@@ -19,7 +19,7 @@ provenance needed to inspect its origin. The importer keeps that complete unit i
19
19
  the receiving repository and creates a native page or chapter referencing the PDF.
20
20
  The website displays the original; a manual PDF includes all its pages.
21
21
 
22
- This capability belongs to the **0.6.0 development increment**. It requires a
22
+ This capability ships in **0.6.0**. It requires a
23
23
  containing Python package and Jekyll core, plus the matching PDF worker for manual
24
24
  output. The published 0.5.1 runtime predates it. Changing the global MCP selection
25
25
  does not update a site's Gemfile, Makefile or PDF-worker selection.
@@ -0,0 +1,92 @@
1
+ ---
2
+ title: Inspect And Close A Live MCP Session
3
+ description: Startup identity, exact prepared images and session-scoped resource release.
4
+ lang: en
5
+ ref: live_runtime_identity
6
+ profiles:
7
+ - unaltredocs
8
+ documentation_profiles:
9
+ - local-authors
10
+ - core-developers
11
+ section: Core Development
12
+ weight: 635
13
+ permalink: /live-runtime/
14
+ nav_title: Live Runtime
15
+ ---
16
+
17
+ The [published 0.7.0 runtime](https://github.com/dosquartsdedocs/unaltraweb/releases/tag/v0.7.0)
18
+ distinguishes the process serving a connection from
19
+ the installed package, source checkout and rendering workers. Call
20
+ `runtime_identity` or read `web://runtime-identity` through that live MCP
21
+ connection. Both report the same backend instance and startup information.
22
+
23
+ The observation includes the loaded package version, startup code fingerprint,
24
+ current disk fingerprint, interpreter, PID/start information, workspace mapping
25
+ and selected versus observed image identities. A disk edit is reported as drift;
26
+ it does not upgrade an already-running process. Docker-host and container PID
27
+ namespaces are reported separately. Identity checks read engine/runtime metadata,
28
+ not website prose, private records or arbitrary environment variables.
29
+
30
+ ## Prepare Explicitly, Then Launch
31
+
32
+ Use `unaltraweb-mcp-docker prepare --image REF` to acquire a selected release.
33
+ Launch, check, smoke and identity observations do not build or pull missing images.
34
+ For a managed launch, supply a full image ID or repository digest, or bind a local
35
+ reference to its independently verified configuration ID:
36
+
37
+ ```bash
38
+ unaltraweb-mcp-docker serve --project /absolute/site \
39
+ --image "$PREPARED_REFERENCE" --expected-image-id "$EXPECTED_IMAGE_ID" --managed
40
+ ```
41
+
42
+ The expected value is Docker's full `sha256:` configuration ID, not the archive
43
+ checksum or OCI index digest. A missing or mismatched selection is an error.
44
+ Execution uses that inspected ID with `--pull never`; existing aliases are not
45
+ rewritten. Add `--offline` for a controller without networking. The declared
46
+ Docker socket remains available for local inspection and prepared workers.
47
+
48
+ The normal host launcher mounts the canonical site path and a `/workspace` alias.
49
+ A launcher itself running in a container must supply its explicit daemon-host
50
+ mapping using `--host-project`. Unsupported direct controller mappings require
51
+ inspection rather than guessing a host path from `/workspace`.
52
+
53
+ ## Close One Connection Safely
54
+
55
+ 1. Retain the identity's consumer binding, session ID and exact container ID.
56
+ 2. Call `runtime_drain(confirm=true)`. The backend stops admitting new operations.
57
+ 3. Close that stdio connection. Bounded active work finishes before its idle
58
+ session resources are released.
59
+ 4. Use the installed `session-status` command to confirm resource termination.
60
+
61
+ ```bash
62
+ unaltraweb-mcp-docker session-status --project /absolute/site \
63
+ --session-id "$SESSION_ID" --container-id "$CONTAINER_ID"
64
+ ```
65
+
66
+ `connected`, `busy`, `orphaned` and `unknown` do not mean resources are free.
67
+ Only `stopped` with `resources_released=true` establishes observed absence.
68
+ After a crash, `reap-session` with the same retained tuple can recover eligible
69
+ idle leftovers. It preserves live backends, active jobs, other sessions, prepared
70
+ images, volumes and authored files. Disk cleanup remains explicit and separate.
71
+
72
+ The older `down` command is workspace-wide, and `mcp-down-all` is factory-wide.
73
+ Use them only for those intended scopes, not as a substitute for closing one
74
+ client. The managed stdio profile has one connection per backend; it does not
75
+ claim shared-HTTP backend reattachment semantics.
76
+
77
+ ## Workers And Helpers
78
+
79
+ Worker references are fixed at startup. Managed rendering requires those exact
80
+ images to be prepared; it refuses a fallback pull/build or a conflicting authored
81
+ computation-image choice. The identity reports resource bounds and image
82
+ observations without running a renderer.
83
+
84
+ Visual helpers are separate MCP processes. Their versions and immutable package
85
+ selections describe the accepted rendering closure, not their current live
86
+ instances. The composing controller must obtain each helper's own live identity.
87
+ The selected Diavisuals 0.5.0 lacks full live-process identity. Diavisuals 0.6.0
88
+ publishes the provider correction, but is outside unaltraweb 0.7.0's tested helper
89
+ combination. Composing-owner compatibility validation and a new reviewed selection
90
+ are required before accepting that corrected helper in the managed closure.
91
+ Existing 0.4.0 static provider receipts remain subject to full integrity checks
92
+ and do not force regeneration of authored figures during an upgrade.
@@ -0,0 +1,209 @@
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
+ Delivery: [0.7.0 is published](https://github.com/dosquartsdedocs/unaltraweb/releases/tag/v0.7.0).
10
+ The [signed-byte delivery report](owner-closeout-85.md) supersedes the chronological
11
+ development/candidate state below. It retains the full managed-closure blocker and
12
+ the partial legacy identity gate; publication alone does not close them.
13
+
14
+ ## Native API mapping
15
+
16
+ The containing 0.7.0 increment adds `runtime_identity` and
17
+ `web://runtime-identity` on the actual serving MCP instance. Both use one
18
+ startup-created object, not a helper CLI. It records a random backend instance,
19
+ process PID/start ticks/PID namespace, start time, interpreter, loaded package
20
+ version and startup package fingerprint. Current bounded package bytes and
21
+ metadata are separate observations; changing metadata cannot rename the loaded
22
+ version. Only engine code/contracts and allowlisted runtime selections are read,
23
+ not site content or arbitrary environment values.
24
+
25
+ The identity's component/profile/selection hashes bind the fixed requirements,
26
+ startup BOM, behavioral profile, worker selections and consumer mapping. The
27
+ package fingerprint is a startup code-content observation, not a wheel checksum
28
+ or a permanent process attestation. The live container's image ID, source label,
29
+ limits and mount mapping are inspected separately. Its daemon-host init PID is
30
+ not compared numerically with the inner serving PID. Session ID, exact container
31
+ ID, factory/role/project labels and mapping correlate those namespaces.
32
+
33
+ `runtime_drain(confirm=true)` freezes admission on that connection. Ordinary
34
+ tools execute in a bounded one-operation lane, leaving identity/drain responsive
35
+ while a worker runs. Closing stdio waits for active work and releases that
36
+ session's idle preview/capture resources. A new connection creates a new backend
37
+ instance. This profile is **one stdio connection per backend**, not a shared HTTP
38
+ service: shared-backend reattachment/idle leases are not claimed.
39
+
40
+ Host-side installed API:
41
+
42
+ ```text
43
+ unaltraweb-mcp-docker prepare --image REF [--expected-image-id SHA256_ID]
44
+ unaltraweb-mcp-docker serve --project ROOT --image REF --expected-image-id SHA256_ID --managed
45
+ unaltraweb-mcp-docker session-status --project ROOT --session-id SESSION --container-id CONTAINER
46
+ unaltraweb-mcp-docker reap-session --project ROOT --session-id SESSION --container-id CONTAINER
47
+ ```
48
+
49
+ Preparation may acquire the explicitly selected image. Launch/check/smoke never
50
+ build or pull; execution uses its inspected exact configuration ID with
51
+ `--pull never`. Managed mutable aliases require the expected full image ID.
52
+ Full local IDs and repository digests are immutable selections. Ordinary mutable
53
+ local selections without an expected ID remain an explicitly weaker mode.
54
+ Archive hashes, repository/index digests and Docker configuration IDs are distinct.
55
+
56
+ `--offline` disables controller networking; the explicitly mounted local Docker
57
+ socket still permits image/owned-container inspection. Preview HTTP probing and
58
+ intentional external metrics calls need their documented network access.
59
+ `--worker-images` accepts bounded JSON mapping supported worker names to exact
60
+ `reference` / `expected_image_id` pairs. Otherwise startup BOM/dedicated image
61
+ environment selections apply. Managed execution refuses missing/mismatched
62
+ workers and never substitutes a preparation build/pull. Authored computation
63
+ image choices must match the approved startup identity before execution.
64
+
65
+ The normal host launcher canonicalizes the consumer and binds it at its canonical
66
+ path and `/workspace`. A containerized launcher must supply `--host-project` (or
67
+ its explicit inherited daemon mapping); the child uses that verified canonical
68
+ mirror. Identity reports launcher-visible, daemon-host and effective paths.
69
+ Other direct controller layouts are not silently inferred. In particular,
70
+ [issue 31](https://github.com/dosquartsdedocs/unaltraweb/issues/31) remains a separate
71
+ boundary for arbitrary direct `/workspace` controllers and is not automatically
72
+ closed by this profile.
73
+
74
+ ## Resource ownership
75
+
76
+ Each launch has a 32-hex session ID and a uniquely named owned stdio container.
77
+ Previews are per-session for these backends. Worker invocation tokens are retained
78
+ and augmented with session labels. Cleanup validates full IDs and ownership and
79
+ confirms absence before claiming release. Image and volume removal is outside
80
+ these APIs.
81
+
82
+ After EOF or a crash, the caller uses the **retained** binding/session/container
83
+ tuple with `session-status`. A live backend is `connected`; a running one-shot
84
+ worker is `busy`; idle leftovers are `orphaned`; only proven absence is `stopped`
85
+ with `resources_released=true`. Unavailable/changed ownership is `unknown` and
86
+ does not authorize removal. `reap-session` preserves a live backend or running
87
+ job, and recovers only that retired session's idle resources. Occupied or foreign
88
+ networks fail closed. No fresh-helper PID is presented as the backend's PID.
89
+
90
+ The legacy `down` / `make mcp-down` is an explicit **workspace-wide** shutdown;
91
+ `mcp-down-all` is maintainer/factory-wide. Neither is the hub's per-client toggle
92
+ operation. The managed sequence is live drain, close this transport, inspect its
93
+ exact retained identity, and recover eligible orphans when necessary.
94
+
95
+ The profile reports controller limits (2 CPUs, 4 GiB, 512 PIDs), preview/PDF/capture
96
+ limits (2 CPUs, 2 GiB, 256 PIDs), and managed computation limits (4 CPUs, 8 GiB,
97
+ 512 PIDs). Existing per-invocation time bounds remain 1800 seconds for PDF/compute
98
+ and 900 for captures; requests may compose several bounded jobs. Per-backend
99
+ operation concurrency is one. A drain does not falsely claim immediate RAM/CPU
100
+ release while a job continues.
101
+
102
+ ## Accepted visual-helper points and remaining closure blocker
103
+
104
+ Release 0.7.0 selects the published Diavisuals 0.5.0 and Vega 0.5.1 packages:
105
+
106
+ | Helper | Wheel SHA-256 | Renderer configuration ID |
107
+ | --- | --- | --- |
108
+ | Diavisuals 0.5.0 | `f52e20f20f1fb3a2418f07adb8d6a68a5567d0c321fb7c0ccc0f4db04917b96b` | `sha256:5a6887b372a0e1c386a7b54981d11ae1910215baeb6a12dfd0706b3e85ef0846` |
109
+ | Vega 0.5.1 | `5aba4f267a37179c520b3cd164e1cec62ac5561872aa33b069cce73442dc52b1` | `sha256:695125943d0fbc3aa7c877babb9a11a6501bbc7ac265b0975bb5657c60439d98` |
110
+
111
+ Native selector mapping is Diavisuals `--runtime-image` plus
112
+ `--runtime-expected-id`, and Vega `--renderer-image-id`. Published metadata,
113
+ wheel/acceptance hashes and locally prepared renderer IDs were verified. Actual
114
+ Mermaid, PlantUML, Vega-Lite/CSV and Vega rendering passed native receipt checks,
115
+ tamper refusal and consumer relocation without rewriting renderer aliases.
116
+ Retained evidence: `/tmp/opencode/unaltraweb-d0-85/helpers-proof/evidence.json`.
117
+
118
+ Previously accepted **0.4.0 static receipts remain valid** under the unchanged
119
+ input/output/request integrity rules. This is an exact legacy point, not a
120
+ continuous version interval or permission to overwrite edited outputs. New work
121
+ uses the selected helper points. No existing client or real consumer is migrated
122
+ by this source change.
123
+
124
+ The coordinator does not claim to observe another MCP's serving process. Its live
125
+ identity returns the helper selections and requires their independent connection
126
+ observations. **Selected Diavisuals 0.5.0 lacks the full live-instance identity**.
127
+ [Diavisuals 14](https://github.com/dosquartsdedocs/diavisuals/issues/14#issuecomment-5987114002)
128
+ already records the provider correction in published **0.6.0**; the issue remains
129
+ open for intake. That newer provider is outside unaltraweb 0.7.0's tested helper
130
+ point. The remaining gate is composing-owner compatibility acceptance and a new
131
+ reviewed selection of the corrected helper, followed by independent live
132
+ observations. It is not an unpublished provider implementation. Rendering
133
+ compatibility alone does not make the coordinator dependency graph managed-ready.
134
+
135
+ ## Acceptance and delivery state
136
+
137
+ `test/d0_runtime_smoke.py` exercises installed launchers, actual images, tool/resource
138
+ agreement, independent consumers, reconnect, running-container metadata drift,
139
+ busy drain, offline launch, wrong/missing image refusal, manual/web work and
140
+ 0.6.0 → containing 0.7.0 → 0.6.0 activation with retained authored/generated state.
141
+ The published 0.6.0 point accurately remains **partial** for live identity; no
142
+ fixture or relabelled package is counted as a second D0-capable release.
143
+ Backend-crash/orphan recovery is exercised separately from graceful disconnect.
144
+ The existing Carta and populated Bundler acceptance drivers remain release gates.
145
+
146
+ This is owner development evidence until reviewed source, containing release
147
+ receipts, installed signed-byte acceptance and remaining blockers are returned to
148
+ the central issue. Published 0.6.0 and its active checkout launcher pin remain
149
+ unchanged during candidate development. The worker/data choices and external
150
+ Diavisuals identity blocker must remain visible in the hub's adapter decision.
151
+
152
+ ## Retained local acceptance — 2026-10-05
153
+
154
+ The owner explicitly authorized the full 0.7.0 review/PR/integration, gated
155
+ publication and post-release pin flow. No other checkout is a write workspace.
156
+
157
+ The installed local wheel
158
+ `67689b76225511439175c82b6df033005d84e990b147b8fa4875f3adbd7d684f` and owned MCP
159
+ image `sha256:d8eafba61a2e1f02bc22b244610d8174879e04d9ea36b47a71e8cd7f993a54b1`
160
+ passed eight stages: reconnect/scope, loaded-versus-disk, busy drain, backend
161
+ crash recovery, offline launch, explicit daemon mapping, wrong worker and missing
162
+ worker. The crash record observed a real PDF job still **busy** after backend
163
+ death, then confirmed eligible recovery and resource absence. The other live
164
+ instance was preserved. The published 0.6.0 A/B/A point remained explicitly
165
+ partial for live identity; authored files and its old cache entries kept their
166
+ hashes. This is prepared development evidence, not a signed release identity.
167
+
168
+ | Local retained evidence under `/tmp/opencode/unaltraweb-d0-85/` | SHA-256 |
169
+ | --- | --- |
170
+ | `acceptance-final/evidence.json` | `e35457153c5ffe98b4bd231f608735a2c4ad07e9db756699d7446e06e6b0b9c7` |
171
+ | `helpers-proof/evidence.json` | `df994ccd8afaff45a7e3cfa9b6a29b650c9d01d63db2c9c36e59c31834273473` |
172
+ | `carta-proof/evidence.json` | `ac305ad222a792291ebd27679a72a37a3ff29ab4746301ed9db7f64705ca4755` |
173
+ | `bundler-proof/evidence.json` | `b304c4c5abe45ae9295f6eba86eae36be92e348e6be33463fcb50e119550d341` |
174
+
175
+ The Carta proof retains the published sender seal and unchanged original PDF,
176
+ removes the copied producer, relocates the receiver and forces another PDF build.
177
+ Both 11-page manuals have SHA-256
178
+ `46e50f815c007a97ac59898194023de3fa4e916e77e7eac21b73f8792244713c`; the letter is
179
+ on page 10. The four-profile populated Bundler regression passed 0.4.0 → prepared
180
+ 0.7.0 → 0.4.0, preserving all six tracked author/cache checksums and separately
181
+ reproducing the known unpatched 0.5.0 failure. No caches were cleared.
182
+
183
+ Review additionally tightened Docker absence classification: an unavailable
184
+ daemon socket is **unknown**, not evidence that a container was removed. That
185
+ source-only correction has a dedicated regression; final release acceptance must
186
+ be repeated against the actual source-bound candidates after integration.
187
+
188
+ The local suite passes 608 tests with 30 optional/environment skips. Distribution,
189
+ workflow, fresh-wheel and extracted-gem gates pass, as do the real MCP smoke,
190
+ manual preparation, docs build, prose checks and whitespace checks. These checks
191
+ do not override the separate signed-candidate/publication gates or the external
192
+ helper-process blocker.
193
+
194
+ ## Reviewed core selection
195
+
196
+ Implementation `0c87e8c276e58ac9c747833df69cdb439aa6132b` was reviewed and
197
+ integrated through [PR 87](https://github.com/dosquartsdedocs/unaltraweb/pull/87)
198
+ as `216ab2e8b6b8b45a5bb7da0a54bffd10edee895d`. Protected PR CI
199
+ [37271200816](https://github.com/dosquartsdedocs/unaltraweb/actions/runs/37271200816)
200
+ and CodeQL [37271200817](https://github.com/dosquartsdedocs/unaltraweb/actions/runs/37271200817)
201
+ passed. The recorded review is agent-attributed.
202
+
203
+ The next candidate source pins that integrated core and authorizes gem, wheel,
204
+ runtime and MCP as `ready` for same-source candidate preparation. The selected
205
+ signed PDF 0.6.0 and computation/capture 0.4.0 workers remain unchanged: the new
206
+ selection/lifecycle behavior is controller-owned. Strict receipt, ancestry,
207
+ candidate, installed-byte and publication gates still apply. This readiness is
208
+ for the containing owner release, not approval of the full managed coordinator
209
+ closure while the external Diavisuals identity gap remains.