Skip to content

End-to-end scenarios for four med/small DEV items; config merge escalates (4.0.0-B3) - #17

Merged
KeithRaghubar merged 4 commits into
mainfrom
test/e2e-med-small
Oct 31, 2026
Merged

KeithRaghubar merged 4 commits into
mainfrom
test/e2e-med-small

Conversation

@KeithRaghubar

@KeithRaghubar KeithRaghubar commented Oct 30, 2026 •

Copy link
Copy Markdown
Owner

Summary

Implements the four med-priority, small-effort ROADMAP items, all end-to-end scenarios:

Item Scenario Covers
3.5.0-DEV25 96-toolchain-kernel-handoff run toolchain with skip_build saves clang (stock_llvm), then gcc, in pipeline_state.toml; run kernel --dry-run plans with that compiler when kernel.toml names none
3.5.0-DEV28 65-external-install a source-built tree reinstalled with pacman -S is demoted by update, not rebuilt; installing lld makes update -v show the toolchain reminder once. Networked.
3.5.0-DEV30 75-config-merge [ui] merge set to a script; config merge adopts a .sfnew in /etc/sysforge, keeps the user's edit, removes the .sfnew. Removed from uncovered.toml.
3.5.0-DEV31 45-interactive a package conflict stops update and build without --interactive; with it, pacman's question reaches the terminal and a yes swaps the packages. New stand-in pkgs/e2e-hello-alt.

Bug found: 4.0.0-B3

75-config-merge found that config merge's [r]emove and [o]verwrite wrote to the root-owned /etc/sysforge as the user and crashed with PermissionError. Removal now falls back to the privilege seam (rm -f, mutates=False). Overwrite now goes through atomic_write.replace_file, which also keeps the live file's mode and owner.

Test tier: e2e (75-config-merge, root versus the user), plus two unit tests over a read-only dir in tests/test_config_merge.py.

Notes

  • 65-external-install pauses 2 seconds before the user's pacman -S. The reconcile sentinels have one-second resolution, and a tie counts as sysforge's own install by design, so a pacman -S in the same second is not demoted. No person at a prompt can run it that fast.
  • ROADMAP entries removed and the table regenerated. Release notes added: DEV items under Changed, B3 under Fixed. The design doc (§Config Layer) and the e2e README are updated.

Test plan

  • make e2e SCENARIO="interactive external-install config-merge handoff": all four PASS in podman
  • make test: 7729 passed, 4 skipped
  • make lint, make check-standards, make check-design, make check-surface, make check-shipped, make check-roadmap-table
  • CI e2e job (E2E_HERE=1, shared system): not run locally, since it runs as root on the host

🤖 Generated with Claude Code

KeithRaghubar and others added 4 commits October 30, 2026 17:46
…ates (4.0.0-B3)

Four scenarios: 45-interactive (3.5.0-DEV31), 65-external-install
(3.5.0-DEV28), 75-config-merge (3.5.0-DEV30) and
96-toolchain-kernel-handoff (3.5.0-DEV25), plus the e2e-hello-alt
stand-in that conflicts with e2e-hello without providing it. config
merge comes off uncovered.toml.

75-config-merge found 4.0.0-B3: [r]emove and [o]verwrite wrote the
root-owned /etc/sysforge as the user and crashed with PermissionError.
Removal now falls back to the privilege seam; overwrite goes through
atomic_write.replace_file. Tier: e2e (root versus the user), plus unit
tests over a read-only dir.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
AUR cbonsai declares provides=(cbonsai) conflicts=(cbonsai).
pkg_supersedes_installed counted that as a drop-in for the installed
cbonsai, so batch_install_pkgs passed --ask=4, which pacman applies to
every conflict question in the transaction. In CI's 45-interactive, the
non-interactive update rebuilt cbonsai with e2e-hello-alt and removed
e2e-hello without asking; the leftover e2e-hello-alt then failed
50-maintain, 80-inspect and 99-self-uninstall. The package's own
pkgname is now subtracted, as get_installed_substitutes already does.

Tier: e2e (45-interactive under --here, which CI runs), plus a unit test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Under --here the scenarios share one system, and 30-flag-drift leaves a
build record for e2e-hello that a makepkg reinstall does not clear. The
profile change then drifted e2e-hello as well as e2e-hello-alt, putting
both sides of the conflict in one transaction, which pacman rejects as
unresolvable without ever asking "Remove e2e-hello?". Forget the record
first and assert it is gone, so only e2e-hello-alt rebuilds. Isolated
runs start from a fresh snapshot, which is why this passed locally.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@KeithRaghubar
KeithRaghubar merged commit 486306a into main Oct 31, 2026
3 checks passed
@KeithRaghubar
KeithRaghubar deleted the test/e2e-med-small branch October 31, 2026 20:32
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