Commit Graph
39 Commits
Author SHA1 Message Date
thePR0M3TH3ANandClaude Opus 5 e9d49d10bc Stop 13 jobs firing on a README edit, and delete an SBOM check that never ran
Two GitHub-side changes, both about not wasting runs.

PATH FILTERS. tests.yml (nine jobs across three OSes and three Pythons) and
python-ci.yml (four) both triggered on every push and every pull request with
no path restriction, so editing a markdown file spent thirteen jobs. They now
trigger on the Python implementation and the files that pin its environment.
ts-parity keeps triggering on src/** as well as js/**, deliberately: Python is
the reference implementation the port is validated against, so a change there
can break parity even when no TypeScript moved.

THE SBOM STEP IS GONE. It invoked `@cyclonedx/cyclonedx-npm@latest
--package-lock-only`, which is the NPM tool and reads package-lock.json — a
file this pnpm workspace does not have and never will. It could not have
worked on any run. It then swallowed the failure with `|| echo "non-fatal"`
and uploaded with `if-no-files-found: warn`, two independent layers stopping
it from going red, and its log said "No files were found with the provided
path" every time.

Removed rather than pinned. Pinning the version of a tool that cannot read
this repository's lockfile fixes the wrong problem, and a security check that
cannot fail is the same anti-pattern as the pwsh exit-code bug fixed earlier
today — worse than absent, because it is trusted. `pnpm audit --audit-level
moderate` stays and does fail on findings. A real bill of materials wants a
pnpm-native generator, tracked in TODO.md.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_01Vtx94nXDmNgXEeThUZP4QN
2026-08-20 13:26:50 -04:00
thePR0M3TH3ANandClaude Opus 5 01960e9234 Choose the install interpreter by capability, like the test script does
Adding `shell: bash` to the install step in the previous commit was right for
error propagation and wrong about which python it would get: under bash on
Windows a bare `python` resolves to MSYS2's, which has no pip, so the step
died with "No module named pip" where it had previously worked under pwsh.

Same shape as the test-runner fix, so the same answer: try candidates and
keep the first that can actually run pip, including the pythonLocation that
setup-python exports without putting first on PATH, and fail loudly naming
what was tried. It also echoes the interpreter it picked, so the next
surprise of this kind is a line of log rather than a deduction.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_01Vtx94nXDmNgXEeThUZP4QN
2026-08-20 10:45:34 -04:00
thePR0M3TH3ANandClaude Opus 5 527d7be5c5 Make the Tests workflow able to fail on Windows, and skip two POSIX-only tests
The Tests workflow reported SUCCESS on Windows while its own log read
"2 failed, 1114 passed". On Windows a multi-line `run:` block executes under
pwsh, where only the last command decides the step's result -- so
`coverage xml` succeeding hid `pytest` failing. Linux and macOS use bash -e
and did catch it, which is why this was invisible. `shell: bash` on that step
fixes it, and the same hazard is fixed in python-ci.yml's install step. An
audit of every Windows-capable multi-line step found no others; the installer
smoke steps are Unix-guarded and already set -euo pipefail.

A check that cannot go red is worse than no check, because it is trusted --
and this one has been trusted while six Windows tests failed underneath it.

Two of those six are now skipped on Windows: they assert POSIX mode 0o600,
which cannot hold where os.chmod only toggles a read-only flag and st_mode
reads back 0o666. Skipped rather than relaxed, because the property is real
and a weakened assertion would answer it falsely. Whether these files -- the
semantic index among them, which holds stored secrets -- are actually
protected from other users on Windows is an ACL question, now recorded.

The remaining four are TUI tests that assume POSIX paths. They are recorded
rather than patched: reproducing them needs a Windows host, and guessing at
path normalization and palette-argument parsing would mean changing tests to
match an assumption rather than a behaviour. They also interact with the
undeclared-textual finding -- those tests SKIP everywhere except Windows, the
one platform they were not written for.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_01Vtx94nXDmNgXEeThUZP4QN
2026-08-20 10:37:35 -04:00
thePR0M3TH3ANandClaude Opus 5 4503b7eee4 Make requirements.lock universal, so Windows can install it at all
The Windows entry of the CI build job has never been able to install from
this lockfile, and no arrangement of pip-compile can fix that.

The lockfile has to serve Linux, macOS and Windows across Python 3.10-3.12.
pip-compile resolves for the one environment it runs on and emits no markers,
and two dependencies are environment-conditional: aiohttp needs async-timeout
only below 3.11, and portalocker needs pywin32 only on Windows. So every
possible pip-compile output is wrong somewhere. A Linux/3.11 lockfile killed
Windows with "must have their versions pinned" for pywin32; a Windows/3.10
one could never match the diff on the other platforms. Both failure modes
turned up in this session, one after the other, as each fix exposed the next.

`uv pip compile --universal` resolves across all target environments and
emits the markers — `pywin32 ; sys_platform == 'win32'`,
`async-timeout ; python_full_version < '3.11'` — pinned and hashed, so one
file covers everything.

This changes the lock GENERATOR from pip-tools to uv, which is a real tooling
decision and worth saying plainly. What it does not change is the consumer:
the output is an ordinary pip requirements file, and every build job still
installs it with plain `pip install --require-hashes -r requirements.lock`.
Nothing depends on uv at install time, so reverting means regenerating the
file, not unpicking anything. uv is pinned to 0.10.4 so the regenerate-and-
diff stays deterministic.

Verified locally: regenerating produces a byte-identical file, and it
installs under --require-hashes on both 3.10 and 3.11.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_01Vtx94nXDmNgXEeThUZP4QN
2026-08-20 09:43:23 -04:00
thePR0M3TH3ANandClaude Opus 5 c4c1e1dff9 Compile requirements.lock on the lowest supported Python, and verify it once
The Windows job could never install from this lockfile and the Linux/macOS
jobs could never verify it, for the same underlying reason: pip-compile
resolves version-conditional dependencies for the interpreter it runs on and
emits no markers, so 3.10 and 3.11 produce genuinely different files — 135
lines apart, argon2-cffi-bindings among them.

Which direction matters. A 3.10 resolution is a superset: it carries
async-timeout, which aiohttp requires below 3.11, and installs cleanly under
--require-hashes on 3.11. A 3.11 resolution is missing it, so on 3.10 pip
tries to fetch async-timeout unpinned and --require-hashes refuses — which is
exactly how the Windows job died. So the lockfile is now compiled on 3.10,
the minimum in pyproject's `python = ">=3.10,<3.13"`, and verified to install
on both 3.10 and 3.11.

Verification moves out of the build matrix into its own job pinned to that
same interpreter. Regenerate-and-diff answers "did this file really come from
src/requirements.txt", which is one question about one artifact and wants
asking once, on the interpreter that produced it — not once per matrix entry
on whichever Python that entry happens to use. Every platform still installs
with --require-hashes, which is the part that had to stay everywhere.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_01Vtx94nXDmNgXEeThUZP4QN
2026-08-20 09:36:26 -04:00
thePR0M3TH3ANandClaude Opus 5 4204a23cab Fix three CI failures: a stale black, my scratchpad path, an impossible check
First push of this branch in a while, and CI found three things.

BLACK VERSION DRIFT. The repo pins black ^24.3 (24.10.0 locked) and the local
environment has 26.1.0, whose stable style differs. An earlier commit titled
"satisfy the black gate" reformatted five tui_v3 screens with 26.1.0, which
UNformatted them as far as CI was concerned — the fix made the gate worse.
Everything is now formatted with 24.10.0, the pinned version, reproducing
CI's six files exactly before and zero after. scripts/mutation_test.py is in
there because I wrote it this session and never ran black on it at all.

MY SCRATCHPAD PATH IN requirements.lock. pip-compile records the command that
generated a lockfile in its header, and when I regenerated it during the
dependency-vulnerability fix I compiled to a temp path and copied the result
in. That baked an absolute path from my machine into a committed file, so
CI's regenerate-and-diff could never match. Regenerated with CI's exact
command on Python 3.11; only the two header lines change, so the dependency
set was never wrong.

AN UNSATISFIABLE LOCKFILE CHECK. Separately, and not caused by me: the step
regenerated the lockfile and diffed it on every matrix entry, including
Windows on 3.10 while Linux and macOS use 3.11. pip-compile resolves
version-conditional dependencies per interpreter, so those two produce
genuinely different files — 135 lines apart here, argon2-cffi-bindings among
them. One committed lockfile cannot equal both outputs, so whichever version
it was built on, the other job failed. Verification now runs once on
Linux/3.11, the canonical generator; every platform still installs from the
lockfile with --require-hashes, which is the part that had to stay everywhere.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_01Vtx94nXDmNgXEeThUZP4QN
2026-08-20 09:14:19 -04:00
google-labs-jules[bot]andPR0M3TH3AN b61386b928 fix(ci): update requirements.lock and macos build script
- Regenerate requirements.lock using pip-compile to match CI expectation
- Fix brew install command on macOS to handle existing package
- (poetry.lock was already updated in previous commit)

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-26 23:40:52 +00:00
thePR0M3TH3AN f6d7785803 Handle pip-audit advisory alias in CI workflows 2026-02-25 21:18:41 -05:00
thePR0M3TH3AN 88c1974ac6 Harden TUI recovery paths and add release integrity gates 2026-02-25 19:18:54 -05:00
thePR0M3TH3AN 68eaa34d76 Add dependency scanning and optional dependency checks 2025-08-05 21:04:50 -04:00
thePR0M3TH3AN 2c44f51fc4 ci: add secret scanning 2025-08-03 10:27:13 -04:00
thePR0M3TH3AN 6f885bd65e Use hashed requirements lock 2025-08-03 10:08:50 -04:00
thePR0M3TH3AN 715952fba6 Ignore ecdsa advisory 2025-07-30 15:25:47 -04:00
thePR0M3TH3AN 160a8fac51 CI: run desktop GUI tests 2025-07-19 19:11:59 -04:00
thePR0M3TH3AN b88a93df29 Add CI test script and update workflow 2025-07-16 15:57:33 -04:00
thePR0M3TH3AN 3bfbda03b4 Fix stress args step on Windows 2025-07-05 12:19:45 -04:00
thePR0M3TH3AN ba2b0e4ace Add security tooling and password length test 2025-07-01 16:44:18 -04:00
thePR0M3TH3AN f7e05a3bc8 Remove mutation tests from CI 2025-07-01 16:32:05 -04:00
thePR0M3TH3AN d3264d231c speed up mutmut 2025-07-01 16:09:08 -04:00
thePR0M3TH3AN bfd83c818d Fix mutmut usage in CI 2025-07-01 15:55:04 -04:00
thePR0M3TH3AN 9ec12bf19f Add mutation testing and contract test 2025-07-01 15:47:29 -04:00
thePR0M3TH3AN 1d580819e7 Enable parallel and stress testing 2025-07-01 15:37:52 -04:00
thePR0M3TH3AN a83679f00e Add real Nostr integration test 2025-07-01 14:27:57 -04:00
thePR0M3TH3AN 5cd7d264f1 Fix Windows tests and add ClientPool fallback 2025-06-29 21:43:33 -04:00
thePR0M3TH3AN b4055209fb CI: avoid python 3.11 on windows 2025-06-29 20:38:44 -04:00
thePR0M3TH3AN 7653e12ad5 Pin Windows Python version 2025-06-29 20:26:14 -04:00
thePR0M3TH3AN a388e9cc77 Add MSYS2 bin to PATH on Windows 2025-06-29 20:15:00 -04:00
thePR0M3TH3AN 47169157bb Fix Windows build setup 2025-06-29 19:52:50 -04:00
thePR0M3TH3AN 1cbcf6f546 Fix MSYS2 secp256k1 package 2025-06-29 19:44:27 -04:00
thePR0M3TH3AN 5654caed35 Fix Windows toolchain package 2025-06-29 19:32:29 -04:00
thePR0M3TH3AN eec7da1c28 Fix Windows build with msys2 secp256k1 2025-06-29 19:15:53 -04:00
thePR0M3TH3AN 37d6547ecc Fix artifact naming per OS 2025-06-29 19:00:52 -04:00
thePR0M3TH3AN df2a776a0a Fix gitattributes and install build tools for CI 2025-06-29 18:00:04 -04:00
thePR0M3TH3AN c02f8d9c10 Use portalocker for cross-platform locking 2025-06-29 17:44:32 -04:00
thePR0M3TH3AN 49c71254fa Update artifact action 2025-06-29 15:39:37 -04:00
thePR0M3TH3AN e7c6dc4732 Update CI workflow for coverage 2025-06-29 15:34:35 -04:00
thePR0M3TH3AN 786f2c2bc5 Add coverage to CI workflow 2025-06-29 15:20:05 -04:00
thePR0M3TH3AN 1a68c1782f Add config and NostrClient tests 2025-06-28 22:10:41 -04:00
thePR0M3TH3AN 15f2dc7a98 docs: clarify install and add CI 2025-06-28 20:25:35 -04:00