Go to file
Krzysztof kuhy Rudnicki 08f3c764b2
Some checks are pending
Pre-commit checks / pre-commit (push) Waiting to run
Shell tests / shell-tests (push) Waiting to run
Shell tests / arch-tests (push) Waiting to run
check_and_enable_services: a warning must never mask an error
Eight checks assigned status="warning" unconditionally, so a check running
later in the same function overwrote the status="error" an earlier one had
set. The five other sites in this family already guard the assignment with
`if [[ $status != "error" ]]`, so this was an inconsistency, not a design.

Only half of it was load-bearing, and the two halves fail differently:

  services_units.sh (4 sites) reports through report_and_fix, which repairs
  ONLY on "error". A downgrade there meant no repair ran at all. The is-active
  check is the LAST status assignment in each of the three functions, so it
  could mask any error above it -- in check_periodic_systems, three separate
  is-enabled checks. A timer that was both disabled and inactive, which is the
  ordinary shape of a broken timer, was reported and then left broken.

  services_hosts.sh (4 sites) gates its own repair on `status != "ok"`, so the
  repair still ran. There the bug printed a real error as a yellow [!] warning
  and understated the summary row.

Demonstrated rather than argued, against a simulated broken machine (timer
disabled AND inactive, unit files present):

  without the guards:  status=warning, repair ran 0 times
  with the guards:     status=error,   repair ran 1 time

The seven assertions that previously pinned the broken behaviour now assert
the correct behaviour; they were rewritten first and failed, then the guards
made them pass. Two further cases cover the masking shape directly: a broken
guard-lib instance must still be repaired when a later check warns.

`--status --dry-run` output is still byte-identical to rev 6691cb26, because
this machine has no disabled timer and no missing pacman hook -- the buggy
path is never taken here, which is precisely why it went unnoticed. The A/B
above is the evidence the live diff cannot provide.

222 assertions across 10 files. services_units.sh holds 100% coverage;
services_hosts.sh rises from 86.05% to 93.02%. test_services_hosts.sh needed
splitting twice to stay under the 250-line cap (hosts_fix, resolved), and
stage_hosts_ok moved into the harness so both new files can use it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F3PzGc75gBcdxP3PkHXGcV
2026-08-21 14:16:01 +02:00
.github CI: make python-tests.yml self-triggering + add workflow_dispatch 2026-08-18 23:19:43 +02:00
.hippo style: prettier format .hippo memory files 2026-05-28 07:05:24 +02:00
.vscode chore: archive 41 unmaintained directories to testsAndMisc-archive 2026-05-14 20:21:05 +02:00
billsplit billsplit: drop the four unused platform runner directories 2026-08-17 11:14:32 +02:00
bucket_catch bucket_catch: share the must() DOM helper from src/test/ 2026-08-17 11:57:53 +02:00
docs check_and_enable_services: a warning must never mask an error 2026-08-21 14:16:01 +02:00
focus_owner focus_owner: split EnforcementRunner.kt under the 250-line cap 2026-08-21 13:17:59 +02:00
kcd2_dice_solver Split kcd2 App.tsx 306 -> 217 + useInventoryState 2026-08-17 09:46:49 +02:00
linux_configuration check_and_enable_services: a warning must never mask an error 2026-08-21 14:16:01 +02:00
meta focus_ctl: split 1091 -> 171 + 8 siblings, one per enforcer 2026-08-17 17:46:04 +02:00
phone_focus_mode deploy: split 875 -> 241 + 6, finishing phone_focus_mode 2026-08-17 17:53:52 +02:00
poker-stakes Split poker-stakes' four oversized files under the 250-line cap 2026-08-16 15:26:18 +02:00
python_pkg vscode_optimizer: detect Intel iGPUs as Intel, not AMD 2026-08-17 14:49:43 +02:00
reverse_survivors Split reverse_survivors types.ts 295 -> 157 + roster + statuses 2026-08-17 09:57:26 +02:00
third_party/agent-skills style(prettier): apply markdown/json formatting updates 2026-05-07 22:08:00 +02:00
.binary-allowlist billsplit: drop the four unused platform runner directories 2026-08-17 11:14:32 +02:00
.copilotignore chore: archive 41 unmaintained directories to testsAndMisc-archive 2026-05-14 20:21:05 +02:00
.fvmrc chore: consolidate root configs into meta/, drop unused C dir + split/pdfCentered/geo_data 2026-05-14 20:40:12 +02:00
.gitignore CLAUDE.md -> AGENTS.md symlink; add cocoindex_code to gitignore 2026-08-18 20:17:48 +02:00
.pre-commit-config.yaml Gate the no-inline-Python rule instead of asking people to remember it 2026-08-16 15:11:56 +02:00
.prettierignore Exempt the generated policy asset from prettier 2026-08-05 09:40:44 +02:00
.shellcheckrc Fail the build on any shellcheck finding; fix the 222 the old gate hid 2026-08-03 19:49:11 +02:00
AGENTS.md CLAUDE.md -> AGENTS.md symlink; add cocoindex_code to gitignore 2026-08-18 20:17:48 +02:00
CLAUDE.md CLAUDE.md -> AGENTS.md symlink; add cocoindex_code to gitignore 2026-08-18 20:17:48 +02:00
DESIGN_AUDIT_TODO.md Format last three markdown files; cap billsplit's Android build memory 2026-08-03 13:25:48 +02:00
lint_python.sh chore: consolidate root configs into meta/, drop unused C dir + split/pdfCentered/geo_data 2026-05-14 20:40:12 +02:00
NEXT_SESSION_PROMPT.md NEXT_SESSION_PROMPT.md: rewrite for a fresh session, 8 files left 2026-08-21 13:29:17 +02:00
pyproject.toml chore: consolidate root configs into meta/, drop unused C dir + split/pdfCentered/geo_data 2026-05-14 20:40:12 +02:00
README.md Make the geofence tell the truth, and the phone explain itself 2026-08-14 13:43:05 +02:00
refactor_claude_todo_resume.md Retarget the handoff on verifiability; split out the shared-checkout doc 2026-08-16 23:10:25 +02:00
refactor_claude_todo.md Update refactor_claude_todo.md counts after gate exemption fixes 2026-08-14 16:03:01 +02:00
requirements.txt chore: consolidate root configs into meta/, drop unused C dir + split/pdfCentered/geo_data 2026-05-14 20:40:12 +02:00
run.sh chore: consolidate root configs into meta/, drop unused C dir + split/pdfCentered/geo_data 2026-05-14 20:40:12 +02:00

testsAndMisc

A collection of personal projects, scripts, and experiments — from a GPS-based phone focus tool to Linux/Arch automation, with CI, linting, and pre-commit hooks across the board.

Highlights

Phone Focus Mode

Location-based app restriction for rooted Android. Automatically disables non-whitelisted apps within 500 m of home using ADB + Magisk. Features Haversine distance calculation, hysteresis to prevent toggling, fail-safe unlock, and state persistence. Bash, Android ADB.

Linux Configuration

Automated Arch Linux setup: fresh-install scripts, i3 window manager config, LaTeX environment, and system tests. Includes documentation and test result logging.

Scripts

Utility scripts for development workflows — build file validation, secret detection, and custom makepkg helpers.

Repository Layout

Path Description
python_pkg/ Python packages (each maintained subpackage lives here)
billsplit/ Receipt bill-splitting Flutter app — people, groups, per-item assignment, e-paragon import and xlsx export (Dart, 100 % line coverage gate)
linux_configuration/ Arch Linux setup, i3 config, system maintenance scripts
focus_owner/ Device Owner app enforcing focus mode on the unrooted Pixel 6a — geofence + night curfew, hides apps the phone cannot un-hide (Dart/Kotlin)
phone_focus_mode/ GPS-based Android focus enforcer (rooted-era scripts; config.sh is still the policy source of truth for focus_owner/)
reverse_survivors/ Reverse Survivors — React/Vite game where you play the horde against an AI survivor (TypeScript, 100 % coverage gate)
scripts/ Workspace-level helper scripts and pre-commit hooks
docs/ Reference docs and historical reports
third_party/ Vendored upstream skills/agents
meta/ Repo-wide tooling: pyproject.toml, requirements.txt, .pre-commit-config.yaml, run.sh, lint_python.sh, .fvmrc. Symlinked into the repo root so tools that auto-discover from root keep working.

Archived / unmaintained projects live in the sibling repository testsAndMisc-archive.

Tooling

  • Python linting: Ruff with all rules enabled (see meta/pyproject.toml)
  • Dependencies: pip install -r meta/requirements.txt (combined runtime + dev)
  • CI: GitHub Actions — lint, build, and test on push
  • Testing: pytest (Python), custom shell-based test harness for scripts