unaltraweb 0.7.4 → 0.8.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: 66c0a140c30b1c7d9f1353efc62b28eb3c379649160ba68ad6b262d1f91ec90a
4
- data.tar.gz: f6d0c69a53d4b1a5de92777335c6cd1705f4946fb6390cac260fcbeac7db3361
3
+ metadata.gz: bc478612d85e4f4f43eb203c048bce25f105fa320a56e66e41922627c1f4b4b3
4
+ data.tar.gz: 0d55b9e3743df94ae89dda1cf008d604873d6938ae3732a2b41edd8f03d64ea0
5
5
  SHA512:
6
- metadata.gz: d3dff0655f66a91f8a56c301c2da3fd395ef4b2ef7cd33e80a2c858a86cb3a734058480d62bdfc7753663d93b44f2906076c8ce74a2504de1295856ae2b1cf04
7
- data.tar.gz: 9e8ffdb6047bde3d209f47fe339dcb97fe3d60ca365468cc7a056860b041c7e1823b9c47e7974da3f20e7be0e0c0719f986a617318876f64556e551c169a71e6
6
+ metadata.gz: 2ee71521b81afc077773b375120d39ca2e00fbaa926f287ee6df2e2c6356c10524f4b67346298f0dd647ee182f2c0fb2e45940faadaf9a0e4c336eab697aa85a
7
+ data.tar.gz: fc0f4072ce20853d839c46b0cab1c305f5dfc43bf61d83d58ebb13e552f708ad2d16e4473f4f454829c9206857b66b3279d38ba7f7e110845053fa0942d8497a
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.4
5
- MCP_IMAGE ?= ghcr.io/dosquartsdedocs/unaltraweb-mcp:0.7.4
6
- MCP_RELEASE_IMAGE ?= ghcr.io/dosquartsdedocs/unaltraweb-mcp@sha256:8183e7117f5902fc0ad4d930b757d874b2da1f93d5ef4db102ae4c1b03e357a3
4
+ MCP_RUNTIME_IMAGE ?= ghcr.io/dosquartsdedocs/unaltraweb:0.8.1
5
+ MCP_IMAGE ?= ghcr.io/dosquartsdedocs/unaltraweb-mcp:0.8.1
6
+ MCP_RELEASE_IMAGE ?= ghcr.io/dosquartsdedocs/unaltraweb-mcp@sha256:8b41abacad9ca2894755db7f3587a6b47c8fa8f536d88a151bdfc4ae53ba7f08
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.4
43
+ DOCKER_IMAGE ?= ghcr.io/dosquartsdedocs/unaltraweb:0.8.1
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)
@@ -0,0 +1,140 @@
1
+ ---
2
+ title: Export Manual Context for Itemarium
3
+ description: Portable, producer-resolved manual text and figures with immutable provenance.
4
+ lang: en
5
+ ref: manual_context_export
6
+ profiles:
7
+ - unaltredocs
8
+ documentation_profiles:
9
+ - site-authors
10
+ - core-developers
11
+ section: Manuals
12
+ weight: 470
13
+ permalink: /manual-context/
14
+ ---
15
+
16
+ Version **0.8.0** introduces `manual_context_export`. Version 0.7.4 and
17
+ already-running MCP sessions do not acquire it from a checkout edit.
18
+ Implementation and interoperability are tracked in
19
+ [issue #121](https://github.com/dosquartsdedocs/unaltraweb/issues/121).
20
+
21
+ ## Select the manual
22
+
23
+ Use a connection bound to the manual workspace. Set a stable, author-owned
24
+ `unaltraweb.manual.id` in `_config.yml`; retain it across revisions and relocation.
25
+ The title is `unaltraweb.manual.title`, falling back to the site title. Each
26
+ chapter needs a unique `ref`, a title, and its configured language. Explicit
27
+ heading IDs such as `## Method {#method}` remain stable across title edits.
28
+
29
+ ```python
30
+ manual_context_export(name="itemarium-review-01", language="ca", chapters=["first"])
31
+ ```
32
+
33
+ The equivalent factory-backed CLI is:
34
+
35
+ ```bash
36
+ unaltraweb-mcp --project /absolute/manual mcp manual-context-export \
37
+ --name itemarium-review-01 --language ca --chapter first
38
+ ```
39
+
40
+ `--chapter` is repeatable and preserves manual order. `--section first#method`
41
+ selects one **exact block**, not its descendants; repeat it for additional blocks.
42
+ The MCP arguments are `chapters` and `sections` arrays. Omitting them selects all
43
+ chapters/blocks in the requested language. Unknown or duplicate selections fail.
44
+
45
+ ## Delivery and retention
46
+
47
+ Exports are retained under `tmp/manual-context/<name>/`: `content/`, the flat
48
+ `manual-context.tar.gz` and a receipt sealed last. This directory must be ignored
49
+ by Git. An existing name is never replaced, even after a failed or interrupted
50
+ export. The result returns the workspace-relative `path`, actual `sha256`, receipt
51
+ path/hash, producer/manual identities and counts. Only the tar and its SHA are
52
+ needed by Itemarium; no source checkout access is necessary.
53
+
54
+ The archive contains exactly `manual-context.json`, `sections/...md`, and
55
+ `figures/...`. Image references use `/figures/...`. The schema is available at
56
+ `web://manual-context-schema`. Each heading's file ends before the next heading,
57
+ so parent blocks do not duplicate descendant prose. Order is explicit rather
58
+ than inferred from filenames. Numbered chapters precede reference chapters, as
59
+ in the native manual resolver; public `pdf: false` chapters remain available.
60
+
61
+ The exporter resolves native figures, localized variants/fallback and the
62
+ existing output precedence on a bounded no-follow snapshot. It reuses native
63
+ computation status (including generated chapters), complete companion receipts
64
+ for diagrams/Vega, and web-capture status. These project-wide completeness checks
65
+ also reject unrelated stale/orphaned records; selecting a chapter cannot bypass
66
+ a required producer gate. Unmanaged generated outputs are not freshness evidence.
67
+
68
+ Literal Markdown/HTML includes without parameters, manual bibliography includes,
69
+ `cite` tags, tables, subfigures, listings, callouts and definition lists are
70
+ projected to portable prose. Captions, credits and bibliography fields/links are
71
+ retained; the exporter does not emulate a CSL citation style. Code examples stay
72
+ literal. HTML comments are not reader-facing context. Arbitrary Liquid, dynamic
73
+ includes and active/interactive HTML need an explicitly prepared portable source
74
+ and fail with a diagnostic rather than disappearing.
75
+
76
+ No renderer or download runs implicitly. Standalone PNG/JPEG/GIF/WebP/SVG images
77
+ are accepted. The current receiver rejects SVG `<image>`, even embedded PNG data
78
+ in capture SVGs, and excludes PDF. A current native web-capture SVG can pass only
79
+ if its effective bytes meet this standalone boundary. QGIS capture provenance
80
+ has no native context-v1 adapter in this increment: recognizable QGIS captures
81
+ are refused with a diagnostic, not relabelled as static. Its profile/receipt
82
+ integration and receiver support for raster-bearing SVG require coordinated
83
+ follow-up. Edited captures are never silently substituted with original rasters.
84
+
85
+ ### Candidate 0.8.1: check-only computation dependencies
86
+
87
+ The 0.8.1 source candidate separates explicitly declared native computation
88
+ inputs/environment fingerprints from public content selection. Durable literal
89
+ project-relative inputs, including `_practices/<project>/data/...` and root-level
90
+ `Dockerfile.compute-*` / `requirements-compute.*`, are checked through the same
91
+ bounded no-follow reader and native freshness checks. They do not become public
92
+ image/include/output sources. Hidden paths, broad private roots and transient or
93
+ dependency-installation roots (`tmp`, `sandbox`, `dist`, `node_modules`, `vendor`)
94
+ remain refused. Reader and transport byte limits are unchanged.
95
+
96
+ Only their hashes participate in the source fingerprint and external producer
97
+ receipt. Private input bytes and paths do not enter the transport. Global
98
+ completeness, stale-input checks and final rechecks still apply when selecting a
99
+ single chapter. The candidate also restores inline-code tokens in HTML image
100
+ alt/title/credits before recording metadata and figure identity. Published 0.8.0
101
+ does not contain these repairs; use the newly qualified release after publication
102
+ and explicit adoption. The v1 schema and SVG/PDF/QGIS restrictions remain unchanged.
103
+
104
+ Diagrams use the provider's exact effective-artifact receipt. Vega uses exactly
105
+ the output declared in `.vegavisuals.yml` (including an edited output only when
106
+ that is the declared, verified output). Computation SVG overrides must postdate
107
+ their current source and generated base. Web captures use their native embedded
108
+ PNG/fingerprint checks. The exporter records fresh resolution evidence binding
109
+ the native check **and the actual effective bytes**; `receipt_sha256` refers to
110
+ that evidence in the retained export receipt, not an older renderer receipt
111
+ misattributed to new edited bytes.
112
+
113
+ `manual.revision` is the actual Git HEAD and `dirty` is explicit. Clean source
114
+ dates use the commit date; dirty snapshots use the latest consumed file mtime,
115
+ with an explicit timezone. The source fingerprint is SHA256 of canonical UTF-8
116
+ JSON (sorted keys, compact separators, no trailing newline) mapping consumed
117
+ project-relative paths to their hashes: configuration, manual collection inputs,
118
+ referenced includes/bibliography, original and effective visuals, dependency
119
+ files, native locks and complete provider check inventories. Only resolved text
120
+ and registered images enter the transport archive; executable/data/check inputs
121
+ are represented by fingerprints in the producer receipt. Absent variant probes are retained in
122
+ the external producer receipt and rechecked before sealing. The package's direct
123
+ file hashes independently bind every delivered byte. Producer revision is a
124
+ code fingerprint of the package and native resolver/check scripts, not a claim
125
+ that a development build is a published release.
126
+
127
+ ## Interoperability test
128
+
129
+ Core maintainers can produce retained synthetic manuals through the actual MCP:
130
+
131
+ ```bash
132
+ python scripts/test_manual_context_export.py --output /absolute/unaltraweb/tmp/context-run-01
133
+ ```
134
+
135
+ The script emits first/next package paths and sender hashes. Pass those exact
136
+ files to Itemarium's `tools/desktop/manual_package_conformance.py`, using an
137
+ Itemarium-capable Python and a new output directory under unaltraweb's `tmp/`.
138
+ The producer receipt proves exporter invocation; the independent consumer receipt
139
+ proves schema/closure, import, preservation and backup/reopening. Neither test
140
+ creates questions or certifies a teaching bank's quality.
@@ -0,0 +1,191 @@
1
+ # Manual context producer — #121
2
+
3
+ Workspace: `/home/benizar/git/unaltraweb`; branch `feat/121-manual-context-export`.
4
+ The initial [PR122](https://github.com/dosquartsdedocs/unaltraweb/pull/122) contained the
5
+ post-release pin (`59bd62b`), first bound exporter (`cbf7260`) and resolver/check
6
+ continuation. That initial delivery preceded the authorized integration and
7
+ publication recorded below.
8
+
9
+ ## Interface and contract
10
+
11
+ - MCP: `manual_context_export(name, language="", chapters=None, sections=None)`.
12
+ - CLI: `unaltraweb-mcp --project /absolute/manual mcp manual-context-export
13
+ --name RUN [--language ca] [--chapter REF ...] [--section REF#ANCHOR ...]`.
14
+ - Resource: `web://manual-context-schema`.
15
+ - The export uses its connection's workspace; the MCP has no root argument.
16
+ - `unaltraweb.manual.id` is an explicit stable logical identity. Text selection
17
+ preserves refs, native order and exact non-overlapping blocks; section selection
18
+ is exact, not an implicit subtree expansion.
19
+ - The schema bytes match Itemarium's supplied v1 exactly:
20
+ `e099d6f01af87a9f95ae828a8abc5ef69fb61f8d3fdfb8e5886d478cb60bd1c8`.
21
+ - Production has no Itemarium dependency. Native factory helpers are required,
22
+ as declared by the wheel/CLI contract. A bounded snapshot, native statuses,
23
+ complete provider receipts and final source/identity rechecks precede sealing.
24
+
25
+ See the [author guide](../_documentation/en/47-manual-context.md) for supported
26
+ components, fingerprint closure, retention, limits and refusal remediation.
27
+
28
+ ## Acceptance evidence
29
+
30
+ First actual exporter invocation (one chapter, three blocks, one static PNG):
31
+
32
+ - `tmp/manual-context-121-first/manual-fixture/tmp/manual-context/v1/manual-context.tar.gz`
33
+ - SHA256 `414327f240684aa3e66f609d00017d9e1b8d6ced5a0ec7de4d0d0dd53e0bb256`.
34
+ - `tmp/manual-context-121-first-conformance/receipt.json`: consumer check, import
35
+ and backup/reopening passed. This early artifact predates the additional guards
36
+ and generated-resource adapter; it is retained separately from final evidence.
37
+
38
+ Final producer test used the installed package in an explicitly built, network-
39
+ disabled, read-only-root Docker MCP, with only its synthetic manual mounted:
40
+
41
+ - Image ID `sha256:f01c5e220ad635588d0e545eb3294e8550da71c90a59eaab9a91ad7d334c8873`.
42
+ - Producer version **0.8.0 development**; code revision
43
+ `sha256:322eb2f79d7c275c0dc9e6ce554a7d4fa82f63cb8a259cdd4b3413ecc5b3ca56`.
44
+ The host source fingerprint matches this observed installed producer exactly.
45
+ - Both stdio instances expose the bound tool, refuse a second use of the export
46
+ name, drain, close and leave their exact fixture container absent.
47
+ - The real CLI also exported one selected block with its figure successfully.
48
+ - Producer receipt: `tmp/manual-context-121-final/producer-receipt.json`, SHA256
49
+ `8482b2c44dc5885a683a94314f59c0077f104e58c0f6312f2c2454c8512b41a0`.
50
+
51
+ Packages below `tmp/manual-context-121-final/manual-fixture/`:
52
+
53
+ | Version | Path | SHA256 |
54
+ | --- | --- | --- |
55
+ | First: 1 chapter / 3 blocks / 1 figure | `tmp/manual-context/v1/manual-context.tar.gz` | `4ecb3014dc57c66962bead52c8ab42a1233e23c8ddc29c3bb5cecf82cc6801b3` |
56
+ | Next: 2 chapters / 4 blocks / 1 figure | `tmp/manual-context/v2/manual-context.tar.gz` | `b60909760352c74b921d077924a05f873d3cf144ae6aabf906e100b9b3a824d4` |
57
+
58
+ Both have manual ID `fixture-manual-121`, language `ca`, `dirty:false`; source
59
+ revisions are `4f507b56ba2fcdb3fc59f727066427639776841d` and
60
+ `5165919651d1140b7382d5f148e84fa54feb67fc`. Fingerprints change with the sources;
61
+ refs and the prior bank remain stable.
62
+
63
+ Itemarium's independent runner consumed **these exact two exporter archives**:
64
+
65
+ - Engine 0.6.2, source SHA256
66
+ `1a8983100c4b0c72bac74912fdde7a4d8ad14ce9970e188f13aae611dbeee813`.
67
+ - Receipt: `tmp/manual-context-121-final-conformance/receipt.json`, SHA256
68
+ `f5a5579377f3513f6b1d2e796cb8c99723dabe530f9de6425da517f36e13aad3`.
69
+ - PASS: schema/integrity/resource closure; isolated import; preservation of all
70
+ existing bank state when the second version adds one bank; backup reopening in
71
+ a second app after removal of the first fixture app.
72
+ - Backup SHA256 `ed8062db688001911bcdca68c23d33135208bfdc89375e1f3a7c1df843016bd0`.
73
+ - The consumer's `producer_export_invoked:false` correctly describes its own
74
+ runner; the separate producer receipt proves actual MCP export invocation.
75
+ No manual checkout was supplied to Itemarium. No questions or real teacher data
76
+ were used; functional conformance is not teaching-bank quality certification.
77
+
78
+ ## Checks and observations
79
+
80
+ - Full suite: **763 cases, 735 passed, 28 expected skips** with the prepared Python
81
+ environment (`PATH=.../public-env/bin:$PATH PYTHONPATH=src python3 -m unittest
82
+ discover -s test -p 'test_*.py'`). The bare system Python lacks existing pypdf /
83
+ tinycss2 dependencies; that failed attempt is not a passing suite.
84
+ - 21 exporter cases cover static/HTML figures, language fallback and translated
85
+ diagrams, components/includes/citations, generated chapter/computation checks,
86
+ edited byte evidence, Vega local-data receipts, web captures, stale/modified/
87
+ unmanaged/missing outputs, unsafe resources, concurrent changes and retention.
88
+ Generated-resource unit fixtures carry synthetic native records; they do not
89
+ claim fresh renderer execution.
90
+ - `distribution-check`, `workflow-check`, clean installed `wheel-check`: PASS.
91
+ - `make mcp-check`, `make mcp-smoke`: PASS.
92
+ - `make docs-build DOCKER_IMAGE=unaltraweb:dev`: PASS; prose check of the new guide:
93
+ no findings. The initial default-image docs command refused unpublished 0.8.0.
94
+ - Gem build/package inspection: PASS inside the prepared MCP image with its Ruby,
95
+ network disabled and source mounted read-only. The host-only default attempt
96
+ refused the unpublished 0.8.0 runtime rather than pulling it.
97
+ - `git diff --check`: PASS. Initial CI's old hardcoded 0.7.3 launcher expectation
98
+ was updated to the verified 0.7.4 digest; no release gate was relaxed.
99
+
100
+ ## Remaining integration boundaries
101
+
102
+ The receiver refuses all SVG `<image>` nodes, including embedded PNGs, and PDF.
103
+ Native capture freshness is checked, but such effective assets are refused rather
104
+ than rasterized or substituted. QGIS context-v1 provenance has no adapter in this
105
+ increment; recognizable QGIS captures get an explicit unsupported diagnostic.
106
+ Interactive/arbitrary Liquid and undeclared outputs also fail closed. These
107
+ limitations are recorded on #121 for producer/receiver coordination.
108
+
109
+ At initial source delivery, version 0.8.0 had publication status **pending**. The checkout
110
+ launcher then selected published 0.7.4; observation of this conversation's existing
111
+ MCP still showed installed **0.7.3**, instance `ecac06618bd3436794e89c31746b8914`,
112
+ bound to this checkout. It was not hot-reloaded or rebound. Hub admission belongs
113
+ to gaContExt #52, and real-manual selection/author review remain separate.
114
+
115
+ The #116 checkpoint remains on `feat/116-common-practice-sdk`; it is not included
116
+ in this branch or attributed to these exports.
117
+
118
+ ## Authorized publication follow-up — 2026-11-03
119
+
120
+ After the source delivery above, the user authorized continuing toward hub
121
+ integration. PR122's final source and both CI runs remain green. Itemarium also
122
+ independently rechecked the exact exporter archives in network-disabled isolation
123
+ with no manual checkout: all four conformance checks passed, receiver receipt
124
+ `15b8561e1e55899b57d8e45b8d19b7a8eeaa669808cf729d29eac3589a3231fb`
125
+ ([receiver return](https://github.com/dosquartsdedocs/unaltraweb/issues/121#issuecomment-6597815786)).
126
+
127
+ The four new Web components were marked release-ready for the normal signed
128
+ candidate, receipt-only merge/tag and trusted publication workflow. Independent
129
+ core/gem, workflow, PDF and QGIS selections retain their previously verified
130
+ identities. This source readiness is not a claim of published bytes or admission.
131
+
132
+ GaContExt #52 specifically concerns admitting newer **Itemarium** native builds.
133
+ The new Web tuple must also be delivered to the hub owner after publication;
134
+ neither publication alone nor the existing consumer conformance receipt proves
135
+ hub admission, selected-client activation or an export of a real teaching manual.
136
+
137
+ ## Published 0.8.0 and verified intake
138
+
139
+ [Release v0.8.0](https://github.com/dosquartsdedocs/unaltraweb/releases/tag/v0.8.0)
140
+ is published. PR122 supplies source `54afe7588c36e959a7eb75d5f52763a7456108d7`;
141
+ receipt-only PR123 supplies tag target `f71aeea75e11f4c2b15df4451f47ddd8a161bd8b`.
142
+ Annotated tag object: `eca74d75783bd6630a47376bd1a3076912a1a087`.
143
+ Receipt SHA256: `a2bf883ea62a4f164c925fa477e756378d0590f8dc6bbcdc54c17b645a7896da`.
144
+
145
+ - Wheel: `4dcec737596b4e4742e04b50a70b81d04ffadf993139e6ba1d1bce665ece4816`.
146
+ - Gem: `bbc3dbbc106b69d7a677608c46bf1d4f64d7016a48b27301022ec71e5a378f79`.
147
+ - Controller OCI: `ghcr.io/dosquartsdedocs/unaltraweb-mcp@sha256:8b41abacad9ca2894755db7f3587a6b47c8fa8f536d88a151bdfc4ae53ba7f08`.
148
+ - Controller config ID: `sha256:e0502369c85c59f9e512fbd9fdb17dbc128845d057a1423375425e68ce2e79a2`.
149
+ - Runtime OCI: `ghcr.io/dosquartsdedocs/unaltraweb@sha256:d58d8f68cf08a76e9b9f3ef238a0917b856cf7152aa5cc4a6f54ca109e1ac3fe`.
150
+ - Runtime config ID: `sha256:c0ec72478618c3e7a9444cd7ae9120317a18757019b2fbf8f0438ca451695731`.
151
+
152
+ Complete [release-handoff.json](https://github.com/dosquartsdedocs/unaltraweb/releases/download/v0.8.0/release-handoff.json),
153
+ SHA256 `7a7cab1d48e3302af5f21309e57b540d7ca81eb4d8c0f36c7a5da7099538a53a`,
154
+ lists every asset, untagged Docker archive, independent worker and native profile.
155
+ Core `9d97197` / gem 0.7.3, workflow `3332e0b`, PDF 0.7.1 and classic QGIS 0.6.1 are preserved.
156
+
157
+ Signed candidate run `41641425949`, package preparation `41641430158`, Trusted
158
+ Publishing `41687937608`, OCI promotion `41687938131` and tag CI `41687888720`
159
+ passed. The exact controller's 40 package modules match the CI wheel. Its new
160
+ code fingerprint is `sha256:a678d2b2649e3479d0049ca0ca8a500aba5bb3f0a59b070cd7aaf5c0c6b466d0`;
161
+ the earlier development image/receipts above are retained as their own evidence.
162
+
163
+ The exact installed release controller exported two new fixture packages:
164
+ `9bc3b4506a3f04c66631e7bcc3617b558879af95ee29f6c3b8fead870826afa7` and
165
+ `7225f7c00f0992c922048608b622eec9a9d6d4b6a1c18049b32c2b5ffba7eb40`.
166
+ Itemarium 0.6.2 again passed all four checks on these exact bytes. Release assets
167
+ `producer-acceptance.json` and `consumer-conformance.json` have SHA256
168
+ `4a8ae9db55757b584b24b9b1602ffe94e566cd4531016a073c7afc31e78f4e48` and
169
+ `af73eba0cee0c447072df269572c22164dd8aca2eb0ea73e2416170056cd4e63`.
170
+
171
+ All 18 original assets were downloaded anonymously and hash/size checked,
172
+ including both image archives; PyPI/RubyGems copies and OCI aliases matched.
173
+ [verification.json](https://github.com/dosquartsdedocs/unaltraweb/releases/download/v0.8.0/verification.json)
174
+ has SHA256 `ec04ac1714a1b00c2f8e14f415e0fb0e21a195e42c5848ce53694ce0b85ed403`.
175
+ The downloaded public wheel was installed in a fresh environment: actual MCP
176
+ discovery reports 65 tools, its bound exporter produces a valid package, and
177
+ Itemarium's independent check passes without importing it.
178
+ [public-installation.json](https://github.com/dosquartsdedocs/unaltraweb/releases/download/v0.8.0/public-installation.json)
179
+ has SHA256 `b94920fd618d50ba384207d3e2a126ccd4b1cf98b697760d4d27c09f6b80cf75`.
180
+
181
+ Post-release verification of the updated checkout pin passes distribution/workflow
182
+ checks, the public-image bootstrap check/smoke and the full local suite: 763 cases,
183
+ 736 passed and 27 skips in that prepared environment.
184
+
185
+ The post-release checkout pin now selects the published 0.8.0 controller. The
186
+ configured hub's immutable `cbb753e4…` controls still admit Web only through 0.7.4;
187
+ this is an observed admission boundary, not a missing producer release. The full
188
+ intake is [gaContExt #54](https://github.com/dosquartsdedocs/gacontext/issues/54),
189
+ alongside Itemarium's separate #52. No hub registry, other client registration or
190
+ real manual was changed here. Source selection, hub admission and live client
191
+ activation remain distinct.
@@ -0,0 +1,130 @@
1
+ # Minimal #121 producer repair: P1 + P2
2
+
3
+ Coordination request:
4
+ `gacontext-itemarium-readiness-20261104-unaltraweb-02290003fd784c20a1659f4f803839ef`.
5
+
6
+ Authoritative workspace: `/home/benizar/git/unaltraweb`. Branch
7
+ `fix/121-context-inputs-html` starts from the preserved review125 at
8
+ `b67a51292f680d3bc0058b272c68116c3fd75bc4`; clean preflight was ELIGIBLE.
9
+ The review branch and experimental116 at
10
+ `6a8cd85ff75c8ad41dc67f8fb1c3c5a8f8919e53` remain intact. No other checkout,
11
+ registry, real manual or teacher bank is modified by this unit.
12
+
13
+ ## Implemented repairs
14
+
15
+ **P1:** `Snapshot.computation_input` validates declared check-only dependencies
16
+ separately from public sources. Only native computation input/environment
17
+ declarations use this path. Existing descriptor-relative no-follow reads,
18
+ per-file/total budgets, complete native status checks and final input/inventory
19
+ rechecks are reused. No rendering or native source execution is introduced.
20
+
21
+ The private practice root stays forbidden to images/includes/outputs, even if a
22
+ caller attempts to name it as the manual collection. Opaque inputs remain outside
23
+ the archive; fingerprints and external retained receipts bind their exact bytes.
24
+ The same role correction supports TIGIT's explicitly declared root environment
25
+ files `Dockerfile.compute-python`, `Dockerfile.compute-r`,
26
+ `requirements-compute.txt` and `requirements-compute.R`. This avoids merely moving
27
+ the first private-data error to the next environment-file error.
28
+
29
+ **P2:** HTML `alt`, `title` and `data-caption-source` values are restored before
30
+ `figure()` stores metadata and computes the ID, just as Markdown attributes were.
31
+ Tests assert exact text and identity stability when unrelated inline code is added.
32
+
33
+ No general Liquid extension, SVG raster policy, QGIS provenance adapter, W1
34
+ integration or Geo collector is included. Existing typed refusal envelopes and
35
+ v1 schema remain unchanged.
36
+
37
+ ## Tests and actual producer/receiver execution
38
+
39
+ - 30 targeted context cases, including private input success, no private payload
40
+ or path leakage, global checking for an unrelated selected chapter, missing/
41
+ changed data, root environment fingerprints, symlink/traversal/hidden-root
42
+ refusals, unchanged 10 MiB reader limit and private-collection refusal.
43
+ - Full local suite during implementation: **771 cases, 743 passed, 28 skips**;
44
+ the final declaration-type regression is additionally covered in the 30-case
45
+ targeted pass. Final-head CI retains the repository-wide gate.
46
+ - `distribution-check`, `workflow-check`, `make mcp-check`, `make mcp-smoke`: PASS.
47
+ Base runtime and PDF toolchain layers were cached; only MCP/package layers and
48
+ small metadata were rebuilt for the successive fixes.
49
+ Disk observation: 15 GiB before, 14 GiB after verification. No global cleanup.
50
+ - The acceptance runner has an explicit `--private-inputs-html` fixture mode.
51
+ It uses synthetic native computation records (not a claim of computation
52
+ rendering), a private input sentinel and the formerly broken HTML caption.
53
+ The **real MCP exporter** creates both transport archives. Assertions inspect
54
+ their exact manifests/closure, restored attributes, absence of private bytes/
55
+ paths/tokens and create-only behavior. A real CLI selects one block as well.
56
+
57
+ Installed candidate controller:
58
+ `sha256:b5b6c1e7816623a63c3340b97195253ff612458cf4b96ed443fafad2a1369bac`.
59
+ Producer version **0.8.1 candidate**, fingerprint
60
+ `sha256:2f82f9adb62a7111229e270772f00c1276ec546e9e42e4ad54e32e86e2a8ebdf`.
61
+ The isolated stdio containers have read-only rootfs, disabled network, no Docker
62
+ socket, and only their synthetic manual mounted. Both close and are confirmed absent.
63
+
64
+ Evidence below `tmp/context-p1p2-acceptance-qualified/`:
65
+
66
+ | Artifact | SHA256 |
67
+ | --- | --- |
68
+ | `producer-receipt.json` | `a610e07bc6a369079406ea93edc02581b2ec6dcbe82506ad314ed0920fec46b6` |
69
+ | `manual-fixture/tmp/manual-context/v1/manual-context.tar.gz` | `8a53b2721e24544ba45ee18b8535f298691cb857054cd7ed12189d610007c971` |
70
+ | `manual-fixture/tmp/manual-context/v2/manual-context.tar.gz` | `971d22218e3b407825643f63e524c6438a378e6a90db624afa689e4b1d66a8b9` |
71
+
72
+ Itemarium's independent source runner 0.6.2 (engine
73
+ `1a8983100c4b0c72bac74912fdde7a4d8ad14ce9970e188f13aae611dbeee813`) consumes
74
+ these exact exporter archives and passes all four checks: integrity/closure,
75
+ isolated import, existing-bank preservation and backup/reopening. Receipt:
76
+ `tmp/context-p1p2-conformance-qualified/receipt.json`, SHA256
77
+ `1660f7c576aa52e6f9fbcb39ec7d15a3a6b3c56b3a8dd63b4e2d1017d24bd9b9`.
78
+ The source-mode preliminary run remains separately retained under
79
+ `tmp/context-p1p2-acceptance-01` / `tmp/context-p1p2-conformance-01`; it predates
80
+ the 0.8.1 metadata and is not relabelled as installed-candidate proof. Intermediate
81
+ `-081` and `-081-final` runs are also retained; the qualified run includes the
82
+ HTML entity-decoding and typed-declaration corrections. Protected HTML entities
83
+ are decoded once without double-decoding surrounding attribute text.
84
+
85
+ ## Reproduction and next intake
86
+
87
+ From this checkout with a prepared Python environment and the candidate image:
88
+
89
+ ```bash
90
+ python scripts/test_manual_context_export.py \
91
+ --output /absolute/unaltraweb/tmp/new-p1p2-acceptance \
92
+ --private-inputs-html --image <exact-prepared-controller-ID>
93
+ ```
94
+
95
+ Feed its returned first/next paths and hashes directly to Itemarium's documented
96
+ `manual_package_conformance.py`, with a fresh output below Web's `tmp/`. Never
97
+ manufacture replacement archives. These tests qualify the implementation; they
98
+ do not substitute for the real TIGIT owner's subsequent export and bank workflow.
99
+
100
+ Source metadata proposes **0.8.1** for package/gem artifact/controller/runtime,
101
+ with publication status `ready` after explicit closeout authorization. The existing public checkout pin stays on
102
+ 0.8.0 until a new immutable publication is verified. Independent selections:
103
+
104
+ - Native Git core `9d97197dec5fc9346ab795191a3afd18884c27fb`, gem **0.7.3**.
105
+ - Workflow `3332e0b93933f12317e05f1ce8d38ce80046feab`.
106
+ - PDF **0.7.1**, OCI `sha256:1bb3f2dafd741e96c28639ec1cc8ccaeb81cbaa73e649f787c0b4ef59997bd4b`.
107
+ - Classic QGIS **0.6.1**, descriptor and controller/engine IDs unchanged.
108
+
109
+ Required next gates: review/integration, exact signed candidates and receipt-only
110
+ publication, cold installed proof, then a new reviewed hub intake. The local image
111
+ is not a published or admitted point. TIGIT keeps its current activated0.8.0
112
+ selection until explicit adoption, and must report a real export's path/SHA/receipt
113
+ or the next exact blocker. No real TIGIT package is claimed by this fixture proof.
114
+
115
+ ## Follow-up review: opaque YAML dependencies
116
+
117
+ PR126 discussion `4471006805` was reproduced on `b582c998`: a declared
118
+ `_practices/course/data/parameters.yml` with valid YAML anchors and a current
119
+ synthetic native computation receipt failed in `Snapshot.copy`. Check-only
120
+ dependencies now pass `opaque=True`; Reader confinement, budgets, hashes and
121
+ final source checks remain shared. Configuration reads still scan YAML even
122
+ when a previous opaque read has already staged the file.
123
+
124
+ The regression exports the anchored dataset without transporting its private
125
+ bytes/path, then rejects its changed fingerprint. A separate regression refuses
126
+ anchors on a configuration read after an opaque copy and in `_config.yml`.
127
+ The installed-export harness also includes anchored YAML alongside the CSV
128
+ input. Full local suite: 774 tests, OK (28 skipped). Earlier candidate hashes
129
+ above remain historical; the changed source requires fresh installed-candidate
130
+ and receiver evidence before publication.