Repository navigation
Clear a removed package's failure without the hook window (4.0.0-B1) - #15
Merged
Merged
Conversation
build --failed queued ethtool-git after it was replaced by the repo ethtool: the failure was only cleared when a reader saw the pacman hook's removal record, and that record can be gone first. A tracked build_state entry that is no longer installed now counts as removed too, through install_reconcile.clear_stale_failures, used by update's reconcile (before the sync prunes the entry), state failed, doctor --state and build --failed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
KeithRaghubar
added a commit
that referenced
this pull request
Oct 30, 2026
## Summary
The `--config` axis flag (3.5.0-F18) and the loaded config both lived on
`args.config`:
- **Bare `sysforge doctor`** read the loaded config as the flag and ran
only the config axis. It printed one section and exited, which looked
like a hang.
- **`sysforge doctor system`** read the flag's `False` as an
already-loaded config and ran every axis against `{}`, so the toolchain,
cache, graphics and storage checks ignored the live config.
The flag now stores to `config_axis`. Its spelling is unchanged, so
completions, the man page and `surface.json` are untouched.
## Test tier
Unit tests are enough here. The bug is argparse wiring plus `pre_check`,
and the new tests drive the real parser (`cli_args`) and `pre_check`
with a non-empty config. The existing `_make_args` helper passes
`config={}`, which is falsy and hid the collision.
## Testing
- 3 new tests in `tests/test_doctor.py`, all failing before the fix
- Full suite: 7722 passed
- A real `sysforge doctor` now renders all 14 default axes in about 13 s
## Merge order
Merge #15 first: it holds `4.0.0-B1`, and until it merges
`check-standards` warns about the gap at B1. Both PRs add a `## Fixed`
section to `docs/release-notes/unreleased.md`, so this branch needs a
small rebase after #15 merges: keep one heading with B1 before B2.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
sysforge build --failedqueuedethtool-gitafter it had been replaced with the repoethtool. The same happened tosane-gitandwlrctl-git, which were removed shortly after their failures were recorded.A removal cleared the recorded failure (3.5.0-B120) only when a reader saw the pacman hook's record of that transaction, and that record can be lost first. A failed package that sysforge tracks but that is no longer installed now counts as removed too. The new
install_reconcile.clear_stale_failuresdoes both checks and is used by:update's reconcile, which runs before the superset sync prunes the entrystate faileddoctor --statebuild --failed, in memory only, the same waystate failedlistsA package whose first build failed was never installed, so it keeps its failure. A split pkgbase keeps its failure while a sibling is installed, checked through
%BASE%in the local DB.Test tier
Unit tests are enough here. The defect is in how sysforge reads its own state (the hook window and the build_state entries), and
tests/test_removed_failures.pyalready uses real sentinel files and a real local pacman DB tree. The hook and the root/user boundary did not change.Testing
tests/test_removed_failures.py; 4 failed before the fixmake lint,check-standards,check-designandcheck-surfacepass🤖 Generated with Claude Code