Skip to content

Stop the enrolment log message arriving with a gap in the middle - #23

Merged
EarMaster merged 10 commits into
mainfrom
develop
Sep 24, 2026
Merged

EarMaster merged 10 commits into
mainfrom
develop

Conversation

@EarMaster

Copy link
Copy Markdown
Owner

The sentence was split across two source lines with a backslash continuation,
which keeps the indentation inside the string - so what reached the log had a run
of spaces in the middle of it. concat! joins the pieces with nothing between them
and cannot do that whatever the surrounding formatting is.

Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_01P4Pn5YzK5yErCEZkV47WmN

EarMaster and others added 10 commits September 24, 2026 13:20
The sentence was split across two source lines with a backslash continuation,
which keeps the indentation inside the string - so what reached the log had a run
of spaces in the middle of it. concat! joins the pieces with nothing between them
and cannot do that whatever the surrounding formatting is.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P4Pn5YzK5yErCEZkV47WmN
Three things about letting a second installation in, all of them in the way.

The code had to be read off one screen and typed into the other before the
approve button appeared. The eye had already done the comparing; the typing only
added a chance to mistype sixteen characters and be told the codes did not match
when they did. It is a checkbox now - the person either compared the two screens
or decided not to, and that is their call to make either way.

Nothing about the security changed with it. The fingerprint still travels to the
backend, which recomputes it from the key it fetches at that moment, so a key
swapped between the card being drawn and the button being pressed is still
caught. That check was never the typing.

The card itself now looks like the rest of the panel: the code sits in the same
inset block the recovery code uses, large enough to read across a desk, the
heading carries the shield the other headings do, and the action is a primary
button with a spinner rather than an outline one that read as disabled.

And the installation that was waiting now notices when it has been let in. It
polled nothing, so it went on saying it was waiting until Settings was closed and
reopened - which reads as the approval having failed. The panel already had a
poll for the conversion sweep; it now also runs while this installation cannot
open the key, and e2ee_status picks the key up opportunistically, so asking is
also the act of unlocking. Waiting to be let in takes priority over watching the
sweep, because an installation that cannot open the key can do nothing about the
sweep anyway.

The poll is quiet: it touches neither the busy flag nor the error line, so it
cannot grey out a button under the cursor or wipe a message still being read.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P4Pn5YzK5yErCEZkV47WmN
test:unit and test:integration both passed --testPathPattern, which is Jest's
flag, not vitest's. Vitest takes file filters as positional arguments and its CLI
parser rejects unknown options outright, so both died with `Unknown option
--testPathPattern` before collecting a single file. They were introduced that way
in f4b229e alongside vitest 4, which is the version that throws, so neither has
ever run.

Removed rather than repaired, because the split they describe does not exist.
Every test file is named *.test.ts, so test:unit would match all fourteen and be
a slower spelling of npm test, and test:integration would match none - the config
only collects src/**/*.{test,spec}.{js,ts}, so an integration file would need a
naming convention and an include change before a script could select it.

CI never used either one: test.yml runs npm run test and npm run test:coverage,
so nothing has been silently skipped. TESTING.md documented both and no longer
does.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P4Pn5YzK5yErCEZkV47WmN
A plan filed through the MCP server, or a stash after AI enhancement,
could run to several screens, and scrolling past one to reach the next
item was most of the work of using the queue.

A stash whose content is clearly taller than a fixed cap (not just a
line or two over) now clamps to that height with a fade at the bottom,
and a Show more / Show less button toggles it. Short stashes are
unaffected. Collapsing a stash scrolled past its top brings the card
back into view instead of leaving the reader stranded below it.

Checked: svelte-check reports 0 errors, all 218 vitest tests pass, and
I verified the clamp, toggle and no-accidental-copy behavior against
the screenshot demo with a synthetic long stash (reverted after).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Measured one run: the rust matrix leg of codeql.yml took 6m36s against
javascript-typescript's 1m1s and actions' 46s. Inside it, the extractor's own
duration log breaks the 2m28s Extract phase down as LoadManifest (44.7s) and
ExtractLibrary (46.0s) - resolving the dependency graph and its signatures
for the 799 crates in src-tauri/Cargo.lock, the same crate count that made
release.yml's own rust-cache entry worth adding. The remaining ~3m of the job
is query evaluation shared across every query, security and diagnostic alike,
and does not look reducible without shrinking the dependency graph itself or
the query suite - out of scope here.

Adding Swatinem/rust-cache before Initialize CodeQL, same as test.yml and
release.yml already do, in case LoadManifest/ExtractLibrary are what it warms.
Unverified: nothing in this run's log names a network fetch, so this may warm
nothing the extractor reads. save-if mirrors release.yml's reasoning - this
workflow's only run against main is the weekly schedule, so that is the only
write, and everything else only restores.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Temporary, to be reverted after: save-if is normally main-only, and this
run's whole point is to populate the develop-scoped cache so a follow-up
dispatch can measure a hit against the baseline already recorded.
Two dispatched runs on develop, one cold and one on a full cache hit, 190 MB
of ~/.cargo/registry restored in three seconds. The extractor's own timings
barely moved: LoadManifest 58.2s to 50.6s, ExtractLibrary 57.2s to 55.1s,
extraction as a whole 3m01s to 2m49s, and the rust job 8m37s to 8m16s. That
is inside the spread between two uncached runs earlier the same evening
(6m36s and 8m23s), so the cache is not what those phases are waiting on. It
is not worth 190 MB of a 10 GB budget that release.yml and test.yml already
fill to three quarters.

This also undoes the temporary save-if override the measurement needed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The rust leg is the whole length of codeql.yml - six to eight minutes, against
about one each for actions and javascript-typescript - and almost none of it
is this repository's code. The extractor spends it resolving the 799 crates in
Cargo.lock, and the queries spend it on one shared pass over the database that
builds, which is why all 37 finish within seconds of each other. Caching the
cargo registry was measured and saved nothing, so the remaining lever is not
running it when it cannot find anything new.

A small job now asks the pull request's file list whether anything under
src-tauri/, or this workflow itself, changed. When nothing did, the rust leg
still runs as a job but skips its steps and says so in its summary, so the
check reads as skipped rather than disappearing. Every doubt resolves to
analysing: a failed lookup, an empty list, or a list at the endpoint's
3000-file cap. The weekly schedule and a manual dispatch always analyse
everything, which keeps the Security tab's baseline for main complete.

Checked the lookup against real pull requests: #16 and #18 (npm only) skip,
#19 and #21 (cargo) analyse, #23 (develop) analyses, a missing PR analyses,
and a scheduled run analyses.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Dependabot's 20 open alerts were all Rust, all in Cargo.lock and all
shipping in the binary. Most were in crates the app only pulls in through
other crates, which the grouped version-update PRs never touch. The
cargo one fixed none of them.

- tauri 2.10.2 -> 2.11.6 (floor raised to 2.11.1): is_local_url() let a
  remote origin pass as app:// on Windows/Android. Not reachable today,
  since the webview never leaves its bundle.
  @tauri-apps/api and cli follow to 2.11, which the build requires.
- openssl 0.10.81, rustls-webpki 0.103.15, tar 0.4.46,
  serde_with 3.22.0, rand 0.8.8 / 0.9.5

Still open: glib 0.18 (gtk-rs 0.18 pins it until Tauri moves off it)
and rand 0.7.3, which is build-time only (phf_codegen via tauri-utils).

dependabot.yml drops the npm and cargo version updates: dependencies
are now refreshed by hand before a release, and alerts stay on.

cargo test 147 passed, vitest 218 passed, tsc clean.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@EarMaster
EarMaster merged commit 34d658d into main Sep 24, 2026
21 checks passed
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