Context
A compose-based MST/2 acceptance stack exists in this repository:
docker-compose.mst2-e2e.yml # layered on the repo's own docker-compose.yml
tests/mst2-e2e/Dockerfile # bakes the mst2_mount / mst2_sync examples
tests/mst2-e2e/acceptance.sh # the checks
tests/mst2-e2e/run.sh # one-command runner
tests/mst2-e2e/README.md
It builds mega2 from the sibling checkout with the MST/2 surface enabled, seeds a
repository with the shapes that stress the reader, and then checks:
- capabilities gate,
- seeding (small file, empty file, executable, symlink, 2 MiB + 7 B file,
129-entry directory),
- sync + hydrate with the client's own manifest compared against a full walk,
- mount vs git truth — every served byte against a plain
git clone of the
same commit, plus the executable bit and symlink target,
- SYS-01 — after
main advances the mounted view is unchanged and the new file
is absent,
- offline reopen with no server contact,
- incremental reuse meters for the next version.
Checks 1–5 and 7 pass today. Check 6 (offline reopen inside the compose job) is
the open piece, and the job is not wired into CI.
Scope
- Finish the offline reopen check. The store's content lives in a
scope-level cache (DurableStore::open_with_content, shared by every view of
the scope), so a reopen has to open the same content directory rather than a
view-local one. examples/mst2_mount.rs now does that, but it needs to be
exercised by the acceptance run: mount, unmount, remount with M2_STORE_DIR,
and assert the byte listing is identical. The step must print the reopen log
when it fails so a failure names its cause instead of showing an empty mount.
- Make the run CI-able. The job needs
/dev/fuse and a privileged
container; where that is unavailable the runner should skip with a clear
message instead of failing, and CI should run it wherever the device exists.
Document which environments can run it (tests/mst2-e2e/README.md says it
today; CI needs the same statement).
- Keep the stack in step with upstream. The base
docker-compose.yml and
mega2-compose.yml in the sibling repo are the source of truth for the
backend wiring; the override must not fork it beyond enabling MST/2 and
adding the acceptance job.
- Optional but useful: fail the run when the incremental meters regress
(a second version of an unchanged view must not refetch everything), so the
acceptance also guards the reuse claim.
Acceptance
tests/mst2-e2e/run.sh exits 0 with all checks passing, including the offline
reopen.
- The run is idempotent: a second consecutive run from a clean state passes.
- A run with a deliberately broken check fails with a message naming the check
(no silent pass, no head-truncated output hiding a FAIL).
- CI references the job (or a documented command) and the README states the FUSE
prerequisite.
References
tests/mst2-e2e/*, docker-compose.mst2-e2e.yml, deploy/README.md
(FUSE prerequisite), sibling mega2-compose.yml
Context
A compose-based MST/2 acceptance stack exists in this repository:
It builds mega2 from the sibling checkout with the MST/2 surface enabled, seeds a
repository with the shapes that stress the reader, and then checks:
129-entry directory),
git cloneof thesame commit, plus the executable bit and symlink target,
mainadvances the mounted view is unchanged and the new fileis absent,
Checks 1–5 and 7 pass today. Check 6 (offline reopen inside the compose job) is
the open piece, and the job is not wired into CI.
Scope
scope-level cache (
DurableStore::open_with_content, shared by every view ofthe scope), so a reopen has to open the same content directory rather than a
view-local one.
examples/mst2_mount.rsnow does that, but it needs to beexercised by the acceptance run: mount, unmount, remount with
M2_STORE_DIR,and assert the byte listing is identical. The step must print the reopen log
when it fails so a failure names its cause instead of showing an empty mount.
/dev/fuseand a privilegedcontainer; where that is unavailable the runner should skip with a clear
message instead of failing, and CI should run it wherever the device exists.
Document which environments can run it (
tests/mst2-e2e/README.mdsays ittoday; CI needs the same statement).
docker-compose.ymlandmega2-compose.ymlin the sibling repo are the source of truth for thebackend wiring; the override must not fork it beyond enabling MST/2 and
adding the acceptance job.
(a second version of an unchanged view must not refetch everything), so the
acceptance also guards the reuse claim.
Acceptance
tests/mst2-e2e/run.shexits 0 with all checks passing, including the offlinereopen.
(no silent pass, no
head-truncated output hiding aFAIL).prerequisite.
References
tests/mst2-e2e/*,docker-compose.mst2-e2e.yml,deploy/README.md(FUSE prerequisite), sibling
mega2-compose.yml