unaltraweb 0.7.1 → 0.7.3

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.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +26 -4
  3. data/docs/_documentation/en/40-distribution.md +33 -10
  4. data/docs/_documentation/en/43-workspace-path-policies.md +13 -0
  5. data/docs/_documentation/en/47-private-practice-pdfs.md +130 -0
  6. data/docs/agents/consolidation-0.7.2.md +97 -0
  7. data/docs/agents/d0-runtime-identity.md +8 -0
  8. data/docs/agents/deployment-integration-0.7.1.md +4 -0
  9. data/docs/agents/manual-authoring-components.md +23 -0
  10. data/docs/agents/mcp-contract.md +109 -4
  11. data/docs/agents/owner-closeout-93.md +185 -0
  12. data/docs/agents/practice-editions-98.md +816 -0
  13. data/docs/agents/practice-pdf-installable-98.md +250 -0
  14. data/docs/agents/practice-runtime-archives-98.md +147 -0
  15. data/docs/agents/private-practice-verifier-98.md +296 -0
  16. data/docs/agents/qgis-0.6.1-adoption-109.md +110 -0
  17. data/docs/agents/source-ci-98.md +148 -0
  18. data/scripts/check_practice_verifier_runtime.py +69 -0
  19. data/scripts/export_practice_runtime_archives.py +138 -0
  20. data/scripts/manual/filters/practice-finish.lua +36 -0
  21. data/scripts/manual/filters/practice-layout.lua +84 -0
  22. data/scripts/manual/practice_pdf.py +31 -0
  23. data/scripts/manual/render_practice.py +125 -0
  24. data/scripts/manual/templates/practice.tex +95 -0
  25. data/scripts/prepare_practice_candidate.py +159 -0
  26. data/scripts/prepare_practice_editions_candidate.py +119 -0
  27. data/scripts/test_wheel_install.py +20 -0
  28. data/scripts/unaltraweb-mcp-bootstrap.sh +1 -1
  29. data/scripts/validate_distribution.py +18 -1
  30. data/src/unaltraweb_mcp/component-contract.json +28 -17
  31. data/src/unaltraweb_mcp/editorial_sources.py +62 -4
  32. metadata +20 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5697f730a670b00edc9d6cda6bb653552470c6c58667d27557e33309203f552c
4
- data.tar.gz: 1fb32fa043262eca9724aed6dc0184246bc6012f2a6261037f03203ef1265945
3
+ metadata.gz: c5280a9154aff314292e2929ee157d6a2ebc7b2ab2b292cf9f7d995f3f147922
4
+ data.tar.gz: ad96a399ed437469d747634a7b5d69aa2958794e5f38395511b811ca99befd40
5
5
  SHA512:
6
- metadata.gz: d43c24786b83d17e9cf8cc238eb12227a3d46581fbc550468c95549f9061cd60b6eb4681021855e646929ca41f6b51de850e2db183d956dfd72876b6e48a8a2e
7
- data.tar.gz: 15c574473f3c71b81b624b08bf4767902deebfc5f0164abc668f43dae6f33f9a0eb8c4a45e1d734a03bd4540b42b81d4e0a77aa8f42ae46566e7cd81cf7af19f
6
+ metadata.gz: bfe3e85558161e19ae69988d40d78179a18ea418d6d932597dfeadb82bbfbfaab5d9d3c8847b0b6245f05ef26bd732dd548dc459e46f674556f10ffa1d977bd1
7
+ data.tar.gz: 6d1fc3cb0ba53b7c6e780bc43f7a93c2c1ca55b3ffa9bab9da773d20f9c56410dedd12f49cb9cfd6e2c529088b76c79a74bf94dbd30abb1dd2982a45ee4866a1
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.7.1
5
- MCP_IMAGE ?= ghcr.io/dosquartsdedocs/unaltraweb-mcp:0.7.1
6
- MCP_RELEASE_IMAGE ?= ghcr.io/dosquartsdedocs/unaltraweb-mcp@sha256:b84cdb404ba7bab5ff0b14fa8a7ee93d7293e829cf32e28ff0dacaa8afff4677
4
+ MCP_RUNTIME_IMAGE ?= ghcr.io/dosquartsdedocs/unaltraweb:0.7.3
5
+ MCP_IMAGE ?= ghcr.io/dosquartsdedocs/unaltraweb-mcp:0.7.3
6
+ MCP_RELEASE_IMAGE ?= ghcr.io/dosquartsdedocs/unaltraweb-mcp@sha256:6aa20cff86c3891a876e37ba0548fa36f3c5633c9f22ba672e9f50123d677cf6
7
7
  MCP_DOCKER_BUILD_NETWORK ?= default
8
8
  INIT_SITE_PROFILE ?= unaltreselfie
9
9
  NEW_WEB_PROFILE ?= unaltreselfie
@@ -40,7 +40,7 @@ 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.7.1
43
+ DOCKER_IMAGE ?= ghcr.io/dosquartsdedocs/unaltraweb:0.7.3
44
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)
@@ -48,6 +48,18 @@ MCP_SMOKE_PROJECT ?=
48
48
  override MCP_SMOKE_PROJECT := $(value MCP_SMOKE_PROJECT)
49
49
  export MCP_SMOKE_PROJECT
50
50
  MANUAL_PDF_LANG ?=
51
+ PRACTICE_SOURCE ?=
52
+ PRACTICE_VERSION ?=
53
+ PRACTICE_RUN ?=
54
+ PRACTICE_DRY_RUN ?= 0
55
+ override PRACTICE_SOURCE := $(value PRACTICE_SOURCE)
56
+ override PRACTICE_VERSION := $(value PRACTICE_VERSION)
57
+ override PRACTICE_RUN := $(value PRACTICE_RUN)
58
+ override PRACTICE_DRY_RUN := $(value PRACTICE_DRY_RUN)
59
+ export PRACTICE_SOURCE PRACTICE_VERSION PRACTICE_RUN PRACTICE_DRY_RUN
60
+ PRACTICE_EDITION_CONFIG ?=
61
+ override PRACTICE_EDITION_CONFIG := $(value PRACTICE_EDITION_CONFIG)
62
+ export PRACTICE_EDITION_CONFIG
51
63
  MANUAL_PDF_PUBLISH_DRY_RUN ?= 1
52
64
  MANUAL_PDF_CONFIRM_PUBLISH ?= 0
53
65
  MANUAL_PDF_PUBLICATION_INTENT_SHA256 ?=
@@ -97,6 +109,8 @@ SCIMAGO_ARGS += --input "$(SCIMAGO_INPUT)"
97
109
  endif
98
110
 
99
111
  .PHONY: distribution-check distribution-release-check distribution-doctor workflow-check wheel-check gem-check reproducible-site-check docs-build docs-serve docs-publish docs-down metrics-scimago-fetch metrics-update metrics-update-all metrics-check manual-pdf-image manual-pdf-image-dev manual-pdf-preflight manual-pdf-status manual-pdf-check manual-pdf-build manual-pdf-publish manual-pdf-publish-worker manual-pdf-sync manual-release-status manual-release-check manual-release-prepare manual-compute-status manual-compute-check manual-compute-render manual-compute-render-figures manual-compute-image-python manual-compute-image-r manual-compute-images manual-compute-rstudio compute-base-image-python compute-base-image-r web-capture-status web-capture-check web-capture-render web-capture-image visualization-status visualization-check visualization-render
112
+ .PHONY: manual-practice-pdf-build
113
+ .PHONY: manual-practice-compose
100
114
  .PHONY: mcp-runtime-image mcp-image mcp-build mcp-check mcp-smoke mcp-smoke-prebuilt mcp-stdio mcp-down mcp-down-all mcp-list-tools mcp-starter-templates mcp-new-web mcp-initialize-site mcp-site-context mcp-profile-check mcp-manual-source-quality-check mcp-manual-editorial-quality-check mcp-manual-authoring-capabilities mcp-manual-computation-status mcp-manual-computation-check mcp-manual-computation-render mcp-manual-computation-render-figures mcp-web-capture-status mcp-web-capture-check mcp-web-capture-render mcp-manual-pdf-status mcp-manual-pdf-build mcp-manual-pdf-preview-prepare mcp-manual-pdf-preview-clean mcp-manual-pdf-publish mcp-manual-release-status mcp-manual-release-check mcp-manual-release-prepare mcp-profile-prune-plan mcp-profile-prune mcp-content-inventory mcp-language-policy mcp-content-approval-inventory mcp-translation-plan mcp-bibliography-inventory mcp-bibliometrics-check mcp-build-health
101
115
 
102
116
  REPOSITORY_CONTEXT_TARGETS := distribution-doctor manual-compute-status manual-compute-check manual-compute-render manual-compute-render-figures manual-compute-image-python manual-compute-image-r manual-compute-images manual-compute-rstudio web-capture-status web-capture-check web-capture-render visualization-status visualization-check visualization-render manual-pdf-preflight manual-pdf-status manual-pdf-check manual-pdf-build manual-pdf-publish manual-pdf-sync manual-release-status manual-release-check manual-release-prepare metrics-scimago-fetch metrics-update metrics-update-all metrics-check
@@ -230,6 +244,14 @@ mcp-manual-pdf-status: ## Inspect manual PDF state for PROJECT
230
244
  mcp-manual-pdf-build: ## Build the manual PDF for PROJECT
231
245
  @PYTHONPATH="$(CURDIR)/src" $(PYTHON) -m unaltraweb_mcp.cli --project "$(PROJECT)" mcp manual-pdf-build --language "$(MANUAL_PDF_LANG)"
232
246
 
247
+ manual-practice-compose: export MANUAL_PDF_IMAGE := $(value MANUAL_PDF_IMAGE)
248
+ manual-practice-compose: ## Compose private recipient ZIPs from a consumer edition configuration
249
+ @PYTHONPATH="$(CURDIR)/src" python3 -m unaltraweb_mcp.cli mcp manual-practice-compose --config "$${PRACTICE_EDITION_CONFIG}" $(if $(filter 1 true TRUE yes YES,$(PRACTICE_DRY_RUN)),--dry-run,)
250
+
251
+ manual-practice-pdf-build: export MANUAL_PDF_IMAGE := $(value MANUAL_PDF_IMAGE)
252
+ manual-practice-pdf-build: ## Build one private practice reading in a retained sandbox job
253
+ @PYTHONPATH="$(CURDIR)/src" $(PYTHON) "$(CURDIR)/scripts/manual/practice_pdf.py" --project "$(PROJECT)"
254
+
233
255
  mcp-manual-pdf-preview-prepare: ## Stage ignored PDF and cover copies for local Jekyll review
234
256
  @PYTHONPATH="$(CURDIR)/src" $(PYTHON) -m unaltraweb_mcp.cli --project "$(PROJECT)" mcp manual-pdf-preview-prepare
235
257
 
@@ -25,7 +25,30 @@ The template is the better place to validate gem consumption, centralized styles
25
25
 
26
26
  ## Component Contract
27
27
 
28
- ### Published 0.7.0 release
28
+ ### Published 0.7.1 release
29
+
30
+ [**0.7.1**](https://github.com/dosquartsdedocs/unaltraweb/releases/tag/v0.7.1)
31
+ consolidates deployment compatibility into the package contract. Core and workflow
32
+ pins are independent; the workflow reads its own revision's approved PDF producer
33
+ records. CI exercises the caller generated by the package and checks that the
34
+ selected core, controller and PDF agree on retained-document verifier bytes.
35
+
36
+ The reviewed issue-86 one-line caller fix can migrate through the normal atomic
37
+ scaffold update plan when its exact baseline and current hashes match. Additional
38
+ author edits retain conflict review. Final installed-byte tests cover fresh and
39
+ upgraded manuals, Carta relocation/PDF, live lifecycle and populated Bundler state.
40
+
41
+ Artifact source: `ae5dab1d99804e7f73da82930199c1e2f3c08f61`.
42
+ Core/workflow selection: `3332e0b93933f12317e05f1ce8d38ce80046feab`.
43
+ Checkout MCP pin:
44
+ `sha256:6aa20cff86c3891a876e37ba0548fa36f3c5633c9f22ba672e9f50123d677cf6`.
45
+ The selected PDF 0.7.1 is
46
+ `sha256:1bb3f2dafd741e96c28639ec1cc8ccaeb81cbaa73e649f787c0b4ef59997bd4b`.
47
+ Public downloads match the receipt. The
48
+ [delivery report](https://github.com/dosquartsdedocs/unaltraweb/blob/main/docs/agents/owner-closeout-93.md)
49
+ records the source/signing/publication chain and consumer acceptance scope.
50
+
51
+ ### Previous 0.7.0 release
29
52
 
30
53
  [**0.7.0**](https://github.com/dosquartsdedocs/unaltraweb/releases/tag/v0.7.0)
31
54
  adds [live instance identity and session-scoped
@@ -42,7 +65,7 @@ helper selection.
42
65
  Gem, wheel, base runtime and MCP were produced from
43
66
  `b44818c67eecef159f7aa0f825b0416cd511bc43`; receipt integration and tag target
44
67
  `9fc84ac7fd01c78c6fe15fe862beb6a5d1633a9e` bind the same-source candidates.
45
- The post-release checkout launcher selects
68
+ That release's post-release checkout launcher selected
46
69
  `sha256:b84cdb404ba7bab5ff0b14fa8a7ee93d7293e829cf32e28ff0dacaa8afff4677`.
47
70
  Signed-byte D0 acceptance, the retained-letter relocation/rebuild and all four
48
71
  populated Bundler roundtrips passed. Public downloads match the receipt.
@@ -121,25 +144,25 @@ candidate, receipt, tag and package evidence.
121
144
 
122
145
  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`.
123
146
 
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.
147
+ The selected public core release is `0.7.1`; earlier distributions remain immutable. Its BOM selects the verified PDF 0.7.1 specialization, reuses immutable 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.
125
148
 
126
149
  ## Docker-First Hybrid Policy
127
150
 
128
- ### 0.7.0 component selection
151
+ ### 0.7.1 component selection
129
152
 
130
- The coordinated core identity is **0.7.0**: gem, wheel, base runtime and MCP
153
+ The coordinated core identity is **0.7.1**: gem, wheel, base runtime and MCP
131
154
  images were published together. The installed host launcher and runtime-aware
132
155
  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
156
+ 0.7.1 digest, alongside the 0.4.0 computation/capture workers and the accepted
134
157
  Diavisuals 0.5.0 / Vega 0.5.1 rendering combination. A released PDF can be reused
135
158
  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;
159
+ Earlier receipts remain unchanged. Signed image/package evidence is recorded in the 0.7.1 receipt;
137
160
  promotion and anonymous-download checks passed before the post-release launcher
138
161
  pin was advanced.
139
162
 
140
163
  ### Local delivery
141
164
 
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.
165
+ GHCR is the canonical delivery channel for normal local use. The released package scaffold selects `ghcr.io/dosquartsdedocs/unaltraweb-mcp:0.7.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.
143
166
 
144
167
  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.
145
168
 
@@ -169,7 +192,7 @@ unaltraweb-mcp-docker serve --project /absolute/consumer
169
192
  ```
170
193
 
171
194
  The installed default selects its package's full MCP release image, currently
172
- `ghcr.io/dosquartsdedocs/unaltraweb-mcp:0.7.0`. It resolves that selection to the
195
+ `ghcr.io/dosquartsdedocs/unaltraweb-mcp:0.7.1`. It resolves that selection to the
173
196
  local immutable image ID before executing. The checkout's `MCP_RELEASE_IMAGE`
174
197
  is a separate digest pin advanced only after publication; it is not the installed
175
198
  wheel's default. This avoids sending a new package back to an older MCP while
@@ -314,7 +337,7 @@ For that reason:
314
337
 
315
338
  ## Docker Runtime
316
339
 
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`.
340
+ Release `0.7.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`.
318
341
 
319
342
  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.
320
343
 
@@ -43,6 +43,9 @@ which is not evidence that a future Git repository is compliant.
43
43
  | --- | --- | --- | --- | --- |
44
44
  | `_site` | directory | jekyll-build-output | ignored | disposable |
45
45
  | `tmp` | directory | build-staging-and-local-release-evidence | ignored | explicit |
46
+ | `practiques` | directory | private-practice-sources | versioned | never |
47
+ | `sandbox/practiques` | directory | retained-private-practice-jobs | ignored | explicit |
48
+ | `dist/practiques` | directory | private-practice-deliveries | ignored | explicit |
46
49
  | `.cache/scimago` | directory | external-bibliometrics-input-cache | ignored | explicit |
47
50
  | `.cache/unaltraweb/manual-pdf-publication-intent.json` | file | pdf-publication-recovery-intent | ignored | explicit |
48
51
  | `.cache/unaltraweb/manual-pdf-publication.json` | file | pdf-publication-provenance | ignored | explicit |
@@ -84,6 +87,16 @@ identity; it is generated metadata, not a disposable execution lock. Consumers
84
87
  usually version it with generated Markdown/figures, but this rollout does not
85
88
  force that choice.
86
89
 
90
+ Practice source control and web exclusion are separate checks. A manual using
91
+ `practiques/` must exclude `practiques/`, `sandbox/` and `dist/` from Jekyll;
92
+ `profile_check` rejects missing exclusions and conflicting explicit includes.
93
+ New manual scaffolds provide these exclusions. Existing sites retain their
94
+ configuration during scaffold synchronization, so review this small configuration
95
+ addition in the consumer workspace. The shared ignore template covers
96
+ `sandbox/` and `dist/practiques/`; local conflicts still stop synchronization.
97
+ Retained practice jobs and deliveries require explicit preservation decisions,
98
+ even when they can be regenerated.
99
+
87
100
  ## PDF Recovery Is Not Disposable Cache
88
101
 
89
102
  `src/unaltraweb_mcp/manual_pdf_preview.py` owns the five fixed PDF-state paths:
@@ -0,0 +1,130 @@
1
+ ---
2
+ title: Private Practice PDFs
3
+ description: Build landscape practice readings with shared manual typography, course metadata and retained private outputs.
4
+ lang: en
5
+ ref: private_practice_pdfs
6
+ profiles:
7
+ - unaltredocs
8
+ documentation_profiles:
9
+ - core-developers
10
+ section: Core Development
11
+ weight: 665
12
+ permalink: "/private-practice-pdfs/"
13
+ nav_title: Practice PDFs
14
+ ---
15
+
16
+ The `manual_practice_pdf_build` tool creates a private A4-landscape reading from
17
+ one Markdown source. It uses the manual's typography and site metadata, including
18
+ the course name, degree, instructors and configured logos. The first page includes
19
+ the course codes in parentheses beside the subject and the practice version.
20
+ The academic year is omitted. Logos appear only on the first page.
21
+
22
+ ## Prepare a reading
23
+
24
+ Keep editable sources in the manual repository:
25
+
26
+ ```text
27
+ practiques/accessibility/ca/alumnat/LLEGIU-ME.md
28
+ practiques/accessibility/ca/docent/LLEGIU-ME.md
29
+ ```
30
+
31
+ Use `LEEME.md` for Spanish and `README.md` for English. The language must be
32
+ enabled in the site configuration. `alumnat` and `docent` identify separate
33
+ readings; the tool does not infer or produce a teacher solution.
34
+
35
+ ```markdown
36
+ ---
37
+ title: Compare two routes
38
+ lang: en
39
+ content_status: draft
40
+ ---
41
+
42
+ # Open the project
43
+
44
+ 1. Open the prepared project.
45
+ 2. Compare the routes between the same origin and destination.
46
+
47
+ ![The two routes on the same map](assets/img/routes.png "Open and closed crossing scenarios")
48
+
49
+ | Scenario | Crossing |
50
+ | --- | --- |
51
+ | Open | Available |
52
+ | Closed | Unavailable |
53
+
54
+ Table: Conditions used in each scenario.
55
+ ```
56
+
57
+ The initial reading format supports ordinary Pandoc Markdown, links, maths,
58
+ fenced code, captioned tables and standalone PNG, JPEG or PDF images. Image paths
59
+ are project-relative, with a fallback to the source directory. Absolute paths,
60
+ parent traversal, symlinks and remote images are rejected. Render other visual
61
+ formats through their owning provider and select a printable output first.
62
+ Liquid, manual-only component wrappers and automatic bibliography assembly are
63
+ not part of this standalone reading format.
64
+
65
+ Figures keep their original proportions and fit the usable page automatically.
66
+ Their captions are measured before allocating image height. A complete figure
67
+ moves to the next page when it cannot fit; it is not reduced to fill a small
68
+ space at the bottom. Tables are centred, with repeated headers and captions on
69
+ continued pages. Review long tables and dense screenshots at the intended size.
70
+
71
+ ## Keep the material private
72
+
73
+ Merge these entries into the existing `exclude` list in `_config.yml`:
74
+
75
+ ```yaml
76
+ exclude:
77
+ - practiques/
78
+ - sandbox/
79
+ - dist/
80
+ ```
81
+
82
+ Keep the existing exclusions. Add `sandbox/practiques/` and `dist/practiques/`
83
+ to `.gitignore` if broader rules do not already cover them. Version the editable
84
+ practice sources. Git ignore rules do not exclude files from Jekyll by themselves.
85
+ The profile check rejects missing web exclusions when practice sources exist.
86
+
87
+ ## Build with MCP or the CLI
88
+
89
+ Use a runtime whose tool inventory advertises `manual_practice_pdf_build`.
90
+ Existing connections keep their loaded code until the client reconnects to an
91
+ updated runtime. Prepare the selected PDF image explicitly before the first run.
92
+
93
+ ```text
94
+ manual_practice_pdf_build(
95
+ source="practiques/accessibility/en/alumnat/README.md",
96
+ version="2026-10-r1"
97
+ )
98
+ ```
99
+
100
+ The equivalent factory-backed CLI command is:
101
+
102
+ ```bash
103
+ unaltraweb-mcp --project "$PWD" mcp manual-practice-pdf-build \
104
+ --source practiques/accessibility/en/alumnat/README.md \
105
+ --version 2026-10-r1
106
+ ```
107
+
108
+ Use `--dry-run` for a read-only plan. `--run review-2` selects a named review or
109
+ retry while retaining an earlier attempt. The result gives the PDF, first-page
110
+ preview, receipt and job paths under `sandbox/practiques/<slug>/`.
111
+
112
+ For a maintainer testing a core checkout, the corresponding factory target is:
113
+
114
+ ```bash
115
+ MCP_CONSUMER_WORKSPACE="$PWD" make -C /path/to/unaltraweb \
116
+ manual-practice-pdf-build \
117
+ PRACTICE_SOURCE=practiques/accessibility/en/alumnat/README.md \
118
+ PRACTICE_VERSION=2026-10-r1
119
+ ```
120
+
121
+ The worker runs without network access, with a read-only input snapshot and one
122
+ writable output directory. A repeated request verifies and reuses an unchanged
123
+ sealed job. Changed inputs produce another job; edited or incomplete attempts
124
+ are retained. Updating only the MCP package version does not invalidate a reading
125
+ whose effective inputs and rendering controls are unchanged.
126
+
127
+ The command returns `publishes: false`. Review the PDF before distributing it.
128
+ Practice versions are independent of the manual's `latest` or stable release
129
+ selectors. Compiling a reading does not analyse GIS data, assemble Moodle ZIPs,
130
+ upload files or publish material on the website.
@@ -0,0 +1,97 @@
1
+ # Web #98 / gaContExt #32 — 0.7.2 source checkpoint
2
+
3
+ This is a draft consolidation, not a published release or an installed 0.7.2
4
+ cohort. It includes private reading/PDF composition, portable bindings and author
5
+ resources, independent PDF/ZIP delivery, the host reaper correction, the shared
6
+ source-CI control, and preparation of runtime archives for the existing hub loader.
7
+ Earlier candidate reports describe their historical checkpoints; their source
8
+ snapshots, images, wheels, receipts and retained evidence remain unchanged.
9
+
10
+ **Current private-runtime decision:** QGIS 0.6.0 is released but private. The earlier
11
+ wheel-install plan below is superseded by [native private-runtime delegation](private-practice-verifier-98.md).
12
+ Public Web builds now contain only the Web bridge/metadata; the hub prepares the
13
+ private QGIS controller. No published/private wheel is downloaded into Web.
14
+ The three independent review P2 findings are reproduced and corrected in this
15
+ source delta; a new source review and independent runtime check are still required
16
+ on its committed HEAD. The H2 contract declares the private producer's hash-bound
17
+ `release.json` externally; public runtime archives contain only Web-only and PDF
18
+ images. Local acceptance and the external receipt are documented in the linked
19
+ bridge and archive contracts.
20
+
21
+ ## Blockers recorded at the original draft checkpoint
22
+
23
+ The first two entries describe the superseded installer plan at `88dd2518`, not
24
+ current requirements to make QGIS public or embed its wheel:
25
+
26
+ - The final **published QGIS wheel URL and SHA-256 are still missing**. The owner
27
+ reports prepared source `a660dfa54ea6bc6cf5d3d3fbeb12593f62c726e1` and wheel
28
+ `dde653f7a719d8dbb20b4471e3cdb7f9c99cbdfcb116647caba5a08e710c7b76`
29
+ pending re-review. This is not an accepted published pin and is not installed
30
+ or inserted into the BOM by this checkpoint.
31
+ - `Dockerfile.mcp` deliberately refuses its verifier installation until that
32
+ released owner component is declared. Docker CI may stop at this gate; no
33
+ check, job or refusal is disabled to manufacture a green result.
34
+ - Select the new permanent reviewed core commit after integration. The current
35
+ `consumer_integration.core_sha` remains the previous reviewed `3332e0b…`
36
+ point during this draft, not a claim that it already contains the new tools.
37
+ - Final same-source package/image candidates, their acceptance and a new
38
+ receipt-only release checkpoint remain pending. `release-candidates.json`
39
+ still belongs to published 0.7.1 and is not a 0.7.2 authorization.
40
+
41
+ The coordinated gem/wheel/runtime/MCP declarations now name **0.7.2**. Nothing
42
+ re-emits 0.7.1 with new bytes. The checkout launcher and source-checker lane keep
43
+ their previously published MCP digest until a new published digest is reviewed.
44
+
45
+ ## Preserved tuple
46
+
47
+ - Workflow: `3332e0b93933f12317e05f1ce8d38ce80046feab`.
48
+ - PDF 0.7.1:
49
+ `ghcr.io/dosquartsdedocs/unaltraweb-manual-pdf@sha256:1bb3f2dafd741e96c28639ec1cc8ccaeb81cbaa73e649f787c0b4ef59997bd4b`.
50
+ - Actual PDF producer: `b7ec1d7a139c65b3b0b88699cdbeb19080f13be1`.
51
+ - PDF configuration ID:
52
+ `sha256:618163d3f924439792b2306617bd9612f566c5881166102fa544b4e782d569fa`.
53
+ - All nine retained-document checkers remain byte-identical to the reviewed
54
+ core/PDF point. Diavisuals/Vega compatibility is not widened.
55
+
56
+ ## Reproducibility and retained evidence
57
+
58
+ The publishable wheel carries the source-CI runner, policy schema, common workflow
59
+ template and native private-runtime bridge/descriptor. The normal MCP image runs
60
+ the factory-owned compositor/scripts and delegates verification to the prepared
61
+ private QGIS controller. Neither public entrypoint requires consumers to copy
62
+ generic code or inspect a mutable provider checkout.
63
+
64
+ `prepare_practice_candidate.py`, `prepare_practice_editions_candidate.py` and
65
+ their pinned rc fixture defaults are historical acceptance/preparation tools.
66
+ They do not replace the normal release pipeline, and their old local candidates
67
+ must not be regenerated or relabelled as the final release. Archived source and
68
+ image hashes identify those exact historical bytes.
69
+
70
+ Source-CI/composition tests and synthetic fixture recipes are versioned here.
71
+ Datasets, rendered PDFs/ZIPs, Docker-save archives and retained job outputs stay
72
+ outside Git. Detailed evidence and transfer hashes are recorded in:
73
+
74
+ - [Practice editions and bindings](practice-editions-98.md).
75
+ - [Runtime archives and independent PDF producer identity](practice-runtime-archives-98.md).
76
+ - [Shared public-source CI](source-ci-98.md).
77
+ - [Installable practice-PDF acceptance](practice-pdf-installable-98.md).
78
+
79
+ The source validation before this version declaration passed 706 tests
80
+ (679 passed / 27 optional skips), fresh-wheel installation, source/workflow
81
+ checks and native bounded source-checker execution. After declaring 0.7.2,
82
+ the suite passes 706 cases (678 passed / 28 skips): the additional skipped
83
+ Docker mount-parser test requires the not-yet-prepared 0.7.2 MCP image. It was
84
+ not redirected to an older image to claim a new-runtime pass. A fresh 0.7.2 wheel
85
+ build/install and distribution/workflow/whitespace checks passed at that original
86
+ checkpoint; its publication readiness was false because the QGIS pin was absent.
87
+
88
+ The later private-runtime/P2 checkpoint passes **720 tests (692 passed / 28
89
+ skips)** and fresh-wheel installation. Native local evidence verifies Web package
90
+ absence, v1/v2 delegation, sealed PDF/ZIP pairs, selected-resource-only engine
91
+ mounts and exact teardown. Distribution metadata is now structurally ready while
92
+ private checks remain explicitly `not_run` in public CI. The final source's hosted
93
+ CI and independent re-review are tracked on PR #104; local evidence is not
94
+ relabeled as those gates. The receipt-only H2 addition leaves executable bytes and
95
+ selected image/schema identities unchanged, so retained native renders are reused.
96
+ None of this publishes or approves the manuals' draft teaching content. W1 draft
97
+ PR #103 is outside this consolidation.
@@ -87,6 +87,14 @@ does not authorize removal. `reap-session` preserves a live backend or running
87
87
  job, and recovers only that retired session's idle resources. Occupied or foreign
88
88
  networks fail closed. No fresh-helper PID is presented as the backend's PID.
89
89
 
90
+ Exited-resource recovery compares complete Docker observations while canonicalizing
91
+ only the order of mount records. Every mount field, field type and duplicate record
92
+ remains significant; a real identity/state/mount change still refuses removal.
93
+ Removal failure or timeout is reported separately from observation drift, and
94
+ the exact container ID must be absent before release is confirmed. This recovery
95
+ code runs in the installed host adapter: selecting a controller image does not
96
+ update an already installed adapter.
97
+
90
98
  The legacy `down` / `make mcp-down` is an explicit **workspace-wide** shutdown;
91
99
  `mcp-down-all` is maintainer/factory-wide. Neither is the hub's per-client toggle
92
100
  operation. The managed sequence is live drain, close this transport, inspect its
@@ -1,5 +1,9 @@
1
1
  # Consolidated deployment integration — 0.7.1
2
2
 
3
+ Published [v0.7.1](https://github.com/dosquartsdedocs/unaltraweb/releases/tag/v0.7.1)
4
+ on 2026-10-07. The [final delivery report](owner-closeout-93.md) supersedes the
5
+ chronological preparation states below and binds the accepted published bytes.
6
+
3
7
  Owner: [issue 93](https://github.com/dosquartsdedocs/unaltraweb/issues/93), following
4
8
  the workflow-only [issue 86 correction](deploy-provenance-86.md). The owner
5
9
  authorized implementation, review/integration and gated 0.7.1 publication.
@@ -2,6 +2,29 @@
2
2
 
3
3
  This is the component contract for MCP agents drafting or reviewing `unaltremanual` content. Read it together with the consumer site's `context/writing-profile.md`.
4
4
 
5
+ ## Private practice readings
6
+
7
+ Standalone practice readings live in `practiques/<slug>/<lang>/<alumnat|docent>/`,
8
+ using `LLEGIU-ME.md` (ca), `LEEME.md` (es) or `README.md` (en). Use
9
+ `manual_practice_pdf_build` with an explicit practice version to produce a
10
+ private A4-landscape PDF under an ignored, retained `sandbox/practiques/` job.
11
+ The source requires front-matter `title`; `lang` must agree with the path.
12
+ Use `#` for body sections and `##` for subsections. Keep a table's `Table:`
13
+ caption and each standalone image's descriptive caption with its source.
14
+
15
+ The practice wrapper reuses site metadata and manual typography. Course codes
16
+ appear in parentheses beside the subject; the practice version is shown without
17
+ the academic year. Logos occur only on the first page. Figures are centred and
18
+ automatically fit the usable page after reserving the caption and its spacing.
19
+
20
+ The initial reading API accepts ordinary Pandoc Markdown, local PNG/JPEG/PDF
21
+ images, links, maths, fenced code and captioned tables. Use provider-rendered
22
+ printable images rather than executable or remote visual sources. Liquid,
23
+ manual-only component wrappers and automatic bibliography assembly are outside
24
+ this reading syntax. Its private source paths are not added to the public
25
+ editorial/translation inventories. Review the returned PDF explicitly; a layout
26
+ approval does not change source `content_status` or authorize publication.
27
+
5
28
  ## Paragraph development
6
29
 
7
30
  Diagnose paragraph function before polishing sentences. A paragraph should normally have one primary job and, when the material warrants it, develop this sequence: