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 +4 -4
- data/Makefile +4 -4
- data/docs/_documentation/en/47-manual-context.md +140 -0
- data/docs/agents/manual-context-121.md +191 -0
- data/docs/agents/manual-context-fix-121.md +130 -0
- data/docs/agents/manual-context-pilot-review-121.md +277 -0
- data/docs/agents/mcp-contract.md +7 -4
- data/docs/agents/scaffold-closeout-118.md +30 -3
- data/scripts/manual/build_pdf.py +5 -2
- data/scripts/review_manual_context_pilots.py +287 -0
- data/scripts/test_manual_context_export.py +145 -0
- data/scripts/unaltraweb-mcp-bootstrap.sh +1 -1
- data/src/unaltraweb_mcp/component-contract.json +15 -15
- metadata +8 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: bc478612d85e4f4f43eb203c048bce25f105fa320a56e66e41922627c1f4b4b3
|
|
4
|
+
data.tar.gz: 0d55b9e3743df94ae89dda1cf008d604873d6938ae3732a2b41edd8f03d64ea0
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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.
|
|
5
|
-
MCP_IMAGE ?= ghcr.io/dosquartsdedocs/unaltraweb-mcp:0.
|
|
6
|
-
MCP_RELEASE_IMAGE ?= ghcr.io/dosquartsdedocs/unaltraweb-mcp@sha256:
|
|
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.
|
|
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.
|