Skip to content

End-to-end tier, sentinel armed at the first change, terminal-model tests (3.5.0-DEV21, B138, DEV22) - #7

Merged
KeithRaghubar merged 2 commits into
mainfrom
dev/e2e-tier
Oct 24, 2026
Merged

KeithRaghubar merged 2 commits into
mainfrom
dev/e2e-tier

Conversation

@KeithRaghubar

Copy link
Copy Markdown
Owner

Three roadmap items. The end-to-end tier came first and found the bug, then the bug was fixed, then the remaining terminal-bug class got its own tests.

3.5.0-DEV21: make e2e runs the documented paths on a fresh system. Four scenarios under tools/e2e/ run as an unprivileged user, each in a fresh Arch container built from the demo image:

  • the Quick start in one login session
  • a repo package's opt-in prompt
  • flag drift after a profile change
  • a build that fails before installing anything

They assert on exit codes, pacman -Qi, build_state.toml, packages.toml and leftover sentinels. Prompts are answered on a pseudo-terminal (tools/e2e/answer.py). All scenarios except the Quick start use local PKGBUILDs.

  • Built from the commit before B134, the Quick start fails on the lost build record.
  • E2E_COMMIT= runs an older revision against today's scenarios.
  • The demo setup moves into tools/demo/provision.sh and install.sh, so CI runs the same scenarios without podman, as a new e2e job (make e2e E2E_HERE=1).
  • pre-release gains CI_JOBS, and test_ci_tooling holds it to ci.yml.
  • The release preflight exempts e2e, since it needs podman and the network.

3.5.0-B138: a command that fails before changing anything no longer blocks the next run. The verb runner's sentinel_scope still takes the lock on entry, but now writes the record at the first escalation that changes the system. privileged_argv announces each such escalation to on_mutation listeners. Sites that an interruption cannot leave inconsistent pass mutates=False: atomic writes, provisioning, downloads, the sandbox chroot and slice, and recovery display. The table is in §Privilege seam. Pipeline stages keep arming on entry. The e2e B138 scenario was marked as expected to fail; that marker is removed and it now passes.

3.5.0-DEV22: the progress bar is tested on a model terminal. tests/term_model.py models the VT sequences sysforge emits, under xterm's and xterm.js's saved-cursor rules, and raises on any other sequence. tests/test_terminal_model.py replays the bar and update's terminal reset through it. Against the pre-fix progress.py and reset string, six tests fail, matching B132 and B133.

Checklist

  • Release-note entry in docs/release-notes/unreleased.md, led by its roadmap ID (DEV21 and DEV22 under Changed, B138 under Fixed)
  • If a user-facing surface changed: none did (make check-surface passes)
  • If a name was removed or renamed: none was
  • The guide for this feature (docs/guides/) still describes it correctly: no guided surface touched
  • make pre-release passes locally: every gate plus make e2e (7551 tests; e2e 4/4 PASS), on a tree identical to this head

🤖 Generated with Claude Code

KeithRaghubar and others added 2 commits October 23, 2026 13:13
make e2e runs four scenarios as an unprivileged user, each in a fresh
container from the demo image: the Quick start in one login session, a
repo package's opt-in, flag drift after a profile change, and a build
that fails before installing (xfail until 3.5.0-B138 is fixed). They
assert on exit codes, pacman -Qi, the state files and leftover sentinels,
answering prompts on a pseudo-terminal (tools/e2e/answer.py).

Built from 80ccb5b (before B134/B135) the Quick start fails on the lost
build record; HEAD passes. The demo image's setup moves to
tools/demo/provision.sh so CI can run the same scenarios without podman
(make e2e E2E_HERE=1, a job of its own). pre-release gains CI_JOBS, which
the CI parity test checks against ci.yml; the release preflight exempts
e2e (podman, network). The terminal-model helper from the entry is filed
separately as 3.5.0-DEV22.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…5.0-B138, DEV22)

B138: the verb runner's sentinel_scope wrote stage_in_progress.toml before
execute ran, so a failure before anything changed (build on a missing
pkgctl) left stage = "build" behind and the next run refused. The scope now
takes the lock on entry but writes the record at the first escalation that
changes the system: privileged_argv announces each to on_mutation
listeners, and sites that cannot leave the system inconsistent (atomic
config writes, provisioning, downloads, the sandbox chroot and slice,
recovery display) pass mutates=False. Stages keep arming on entry. The
e2e pre-install-failure scenario drops its xfail marker.

DEV22: tests/term_model.py models the VT sequences sysforge emits under
xterm's and xterm.js's saved-cursor rules; tests/test_terminal_model.py
replays the progress bar and update's terminal reset through it. Against
the pre-fix progress.py and reset string it fails six ways, matching
B132 and B133.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@KeithRaghubar
KeithRaghubar merged commit dd30e60 into main Oct 24, 2026
2 checks passed
@KeithRaghubar
KeithRaghubar deleted the dev/e2e-tier branch October 24, 2026 13:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant