| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
Twelve scripts plus a README covering the persist-write cache corruption:
the no-dirvish root cause, the buffer-list ordering dependency, a faithful
replay of the file-manager preview path, and the two fixes I tried and
reverted.
The README says which scripts are weak evidence and why, so the next reader
doesn't rebuild an argument on the one whose control varied three things at
once.
Also holds the upstream bug report and its reproduction, verified to run
standalone under emacs -Q.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
- The override never fired once since it shipped.
- Its guard wanted org-category to already equal "todo".
- Org leaves that nil and derives the name later.
- So the condition was false in every real buffer.
The guard now tests for nil, and the hook runs at depth -100. That depth is
load-bearing. org-get-category resolves a deferred value the element cache
then holds, so any hook reading it first freezes "todo" and leaves the
override inert. add-hook prepends, and three hooks already run ahead.
The old tests set org-category by hand to a value org never produces, so
they passed while the feature did nothing. They now visit real files and
assert on what the agenda reads.
The two todo.org agenda files show their project name. Files with
distinctive names keep theirs, and an explicit category still wins.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
- The tests anchored on tomorrow, whose day varies by run date.
- A series on the 31st correctly skips months without one.
- That gave seven occurrences against an assertion of ten.
- The suite went red on the 30th and aborted the run.
A relative offset is not a date-independent anchor, which is what the file
header claimed it was. I added a helper that walks forward to the first day
at or below the 28th, and pointed the three cadence tests at it.
One assertion was also too weak to notice. It checked that each occurrence
fell on or before the anchor day, which a skipped month satisfies without
ever landing on the right day. It now checks equality.
Verified across 400 simulated run dates: no anchor past the 28th and no
count outside the expected band. The old anchor fails nine of those days.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
- The old assertion checked a value the module just set.
- It couldn't fail even if the fork inverted the flag.
- Three behavioral tests now drive real windows and minibuffer.
- One pins the working half, one the flag-is-t boundary.
- The third pins a known fork gap as an expected failure.
adob--rescan-windows ignores the flag, so a completion popup dims every
window. I handed that fix to the fork, which owns the code. When the fork
honors the flag, the pinned test reports an unexpected pass and can go.
Each test asserts the other window is still dimmed. Without that control,
three broken implementations look exactly like a working fix.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
- A dead telega-server now raises a persistent desktop notification.
- The container image is pinned by digest, not by tag.
- A clean telega exit stays silent, so quitting never pages.
telega reports an abnormal server exit through the echo area, where it scrolls away unseen. That's how a dead server reads as a quiet Telegram. The scan stops partway, and the chats it never reached look empty. It's happened twice. Both times something downstream caught it rather than the failure announcing itself.
telega pins its image only when its TDLib min and max versions match. Here the max is nil, so the image was always the latest tag. A floating tag against a fixed elpa package means the server can change underneath it with nothing announcing that either.
Neither change fixes the crash. The root cause is still open. The assertion is a plist parse failure. Its coredump shows a smashed stack, which reads more like memory corruption than a parse rejection.
I didn't pull a newer image, which was the other half of the plan. The pull was meant to test whether an old server was failing against newer elisp. The frozen image ships libtdjson 1.8.64, exactly the version this telega requires. That theory no longer holds, so pulling would trade a matched server for an unknown one.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
- F8 now fills the whole frame instead of three quarters.
- The agenda rebuilds itself on every five-minute wall-clock mark.
- Quitting restores the window layout it took over.
- The dedicated agenda frame and its tests are gone.
- S-<f8> returns to the force-rescan.
The frame bought live shared state. It paid for that with a read-only deny policy, engage-routing and a snapshot failure path. All of it existed only because the agenda shared a process with my working frames. A full-frame F8 needs none of it.
The refresh rebuilds only a visible agenda. It keeps point on its line. The body is guarded, because a signal in a repeating timer resignals every tick.
|
| |
|
|
| |
I restored controlled agenda task mutations and filtered completed items from the dedicated frame. I replaced the treesit-auto revision setter that aborted startup with a runtime slot lookup.
|
| | |
|
| |
|
|
|
|
|
|
|
| |
- The sync timer body ran unguarded from an hourly run-at-time timer.
- A signal in the timezone check or the sync fan-out errored every tick.
- The same error, once an hour, indefinitely.
- Wrapped the body in condition-case; an error is logged, not propagated.
- Also demoted the timezone-change message to the silent log, like the
module's other timer-path notices — an hourly timer shouldn't spam the echo area.
|
| |
|
|
|
|
|
|
| |
- cj/log-comp-warning is :before-until advice on display-warning.
- Its append-to-file was unguarded, so an unwritable log path signalled.
- That signal propagated out and broke warning display for every comp notice.
- Wrapped the write so a failure is swallowed and the warning stays suppressed.
- The log also grew without bound; added a 512KB cap that resets it on overflow.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
- The read-only shadow walk keeps a key only when the frame map binds it commandp.
- It ran from with-eval-after-load partway up the file.
- The day/week/redo handlers are defined further down.
- With org-agenda already loaded, the walk fired before those defuns existed.
- So it read them as non-commands and denied d/w/g/r — the keys the allowlist grants.
- That is the normal startup order and every module reload.
- Moved the walk to the end of the file, after all the handlers are defined.
- A subprocess test loads org-agenda first and pins d/w/g/r surviving, t denied.
- Retitled the t-test to assert the deny outcome, not the pre-walk unbound state.
|
| |
|
|
|
|
|
|
|
| |
- Both were anonymous lambdas advising org-refile and org-refile-get-targets.
- An anonymous advice can't be advice-removed by reference.
- So deleting one from source left a live daemon still running it.
- Extracted both to named defuns and installed them remove-then-add.
- Now each reloads to a single copy and is removable by reference.
- Added unit tests for the target-visiting logic, which had no coverage.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
- org-agenda-frame declared two of its own functions with declare-function.
- Same-file forward refs resolve at end of compile, so those were redundant.
- Worse, the declared empty arglist overrode safe-redo's real (&optional frame).
- That silently disabled arg-count checking on it; removed both declarations.
- music-config and video-audio-recording referenced three vars before their defvars.
- Added forward declarations so each compiles as a dynamic binding.
- dashboard declared el special, which made the section macro's own binding shadow it.
- Removed that declaration; el is the macro's lexical binding and resolves cleanly.
- Declared wttrin, the last undefined-function reference in the launcher table.
|
| |
|
|
|
|
|
|
| |
- It was a one-time post-provisioning step to set repo remotes.
- Both repos already carry the correct cjennings.net origins.
- Neither uses the direct github remote it re-added.
- It also cd'd to a path that doesn't exist and ran on regardless.
- Deleted rather than hardened, since the end-state is already in place.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
- They cleared the module's state hash on entry, not on exit.
- One marks "proton" syncing to exercise the dispatcher's in-flight guard.
- A sibling dispatch test uses a calendar also named "proton".
- ERT runs them in that order, so the dispatch became a no-op and it failed.
- Now each test let-binds a private hash, matching the sibling test files.
- Added a test that pins the isolation itself.
The failure was invisible from both directions. make test runs each file in its
own Emacs, and the editor hook skipped this family for exceeding its file cap.
It only appears when the 63 calendar-sync files run in one process.
|
| |
|
|
|
|
|
|
|
| |
- The scan piped git diff into grep and swallowed failures with || true.
- grep exits 1 on no matches, which is normal, so the guard had to stay.
- But it also hid a git failure, leaving nothing to scan and reporting clean.
- Now the diff is read on its own and a git failure aborts the commit.
- The staged-file list feeding the paren check had the same hole.
- New bats tests drive a broken git and pin both paths.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
- yt-dlp downloads claimed completion when tsp had merely queued them.
- A fresh machine opened org links in EWW, not Chrome.
- ArchWiki search raised a raw error instead of the install hint.
- The pre-commit hook kept running when its cd failed.
- Removed a second device-grouping implementation nothing called.
- Removed a redundant epub advice that ran on every file visit.
- Removed a buffer-burying clause naming a mode Emacs doesn't define.
- Moved the Hugo bindings onto the custom prefix map.
- The ArchWiki docs path is now a variable, making it testable.
|
| |
|
|
|
|
|
| |
- Opening the minibuffer dimmed whatever window you had just left.
- Dimming follows selection, and the minibuffer takes selection.
- auto-dim-other-buffers-dim-on-switch-to-minibuffer sat at its package default of t.
- Set it to nil, so minibuffer entry leaves the dim state alone.
|
| |
|
|
|
|
| |
The frame's read-only policy leaned on a [t] catch-all, but a keymap's default binding never shadows an explicit binding in a lower-priority map. So every key org-agenda-mode-map binds sailed through the catch-all and could mutate source files from the "read-only" frame: t (todo), I (clock-in), k (capture), z (add-note), s (save-all), the C-c schedule/deadline/clock mutators, C-x C-s.
Walk org-agenda-mode-map recursively on load and explicitly deny every sequence not on the frame's allowlist, so the catch-all's intent holds. Navigation, engage, refresh, d/w, and C-c C-o still work, and M-x is unaffected.
|
| |
|
|
| |
In the playlist buffer, single-track mode moves off s onto 1 and save moves off v onto s. The stop key (S) is gone, since SPC/pause already covers stopping. The Mode/Keys header legend follows, and v is now unbound. Stop is still reachable from the global music prefix (C-; m s).
|
| |
|
|
| |
The frame was locked to the 7-day span, with d and w denied as view-changes. The span is now a variable the F command reads. Org re-evaluates custom-command settings on every build and redo, so a day view survives the 5-minute refresh tick. d shows today's single day, w restores the 7-day view, and each spawn resets to 7 so a fresh frame opens at the default. The remaining date-navigation keys (y/f/b/j) stay denied to keep the frame today-anchored.
|
| |
|
|
| |
M-SPC and M-S-SPC (the ai-term agent-swap chords) are bound in the global map, so pressing them inside the read-only frame jumped to ai-term instead of being contained. The frame's [t] catch-all can't deny them: a keymap's default binding doesn't shadow an explicit binding in a lower-priority map. Deny both explicitly in the frame keymap.
|
| |
|
|
| |
The frame's default-deny policy classed g as a view-change and denied it, so the muscle-memory refresh key printed the fixed-view message instead of rebuilding. Bind g to the same frame-scoped safe redo as r. C-M-<f8> stays the force-rescan.
|
| |
|
|
| |
Completion rarely wants to fire on a pause, and the popup is a distraction mid-thought (especially in org-mode). A 4-second idle delay keeps it out of the way while still surfacing on a deliberate wait.
|
| |
|
|
| |
The DOING came from a legacy status retrofit with no build tasks ever decomposed, and the primary work has not started: the key-translation layer is still live and the M-S- bindings are still global. READY is the honest state, design settled and awaiting decomposition.
|
| |
|
|
| |
No production caller existed, and the v binding already plays entries through mpv, which resolves YouTube pages via its own yt-dlp hook internally, so the manual stream-URL extraction was fully superseded. Its tests go with it; the process-entries coverage stays.
|
| |
|
|
| |
lockscreen-cmd baked (env-wayland-p) into a defvar at load, so a daemon started before WAYLAND_DISPLAY reached its environment froze the locker to slock and Lock failed silently on Wayland. The lock command now resolves per call, with lockscreen-cmd kept as an explicit override. Craig confirmed the fix over the decline option since it also makes the systemd unit path safe to revive.
|
| |
|
|
| |
The calendar test's range ended at midnight Dec 31, excluding that day's occurrence, and the org-roam test asserted special-variable-p, which answers differently in the package-loaded hook env versus bare batch (a bare defvar is a file-local declaration). The recurrence test now ends the range past the year and the insert test asserts the binding behaviorally.
|
| |
|
|
| |
The launch path spawned tmux list-sessions up to three times: in the project picker's sorting, in the launcher's fresh check, and again inside show-or-create. The list is now fetched once and threaded through; the cycling path still fetches its own.
|
| |
|
|
| |
The command nested six levels deep. The title-case vocabulary (reset chars, separators, minor words) is now defconsts, and bounds resolution, last-word location, and the per-word capitalization step are their own functions. The 34 existing title-case tests pin the behavior unchanged.
|
| |
|
|
| |
The content-comparison scan reads hundreds of zoneinfo files and ran first on every call. TZ, /etc/timezone, and the symlink target are O(1) and answer on almost every system; the scan is now the last resort for a copied /etc/localtime. Verified the symlink and scan agree on this machine.
|
| |
|
|
| |
Four commands repeated the bounds/delete/goto/insert triad; cj/--replace-region-or-buffer now owns it. The replacement is computed before the delete, preserving the old error behavior (a failed transform leaves the buffer untouched).
|
| |
|
|
| |
The comment-start/comment-end resolution was copied into six command wrappers. One cj/--comment-read-syntax now owns it; the block-banner wrapper keeps its own block-specific prompt.
|
| |
|
|
| |
The language detector classifies js/jsx and the test-file detector recognizes JS tests, but the dispatch had no javascript arm, so C-F6 on a JS test errored though the typescript npx path runs it fine. javascript now shares that arm.
|
| |
|
|
| |
The stepper kept day-of-month verbatim, so Jan 31 stepped to Feb 31 and encode-time normalized it into a phantom Mar 3 occurrence. Plain monthly rules now advance to the next month that has the day, per RFC 5545.
|
| |
|
|
| |
available-width omitted the doubled semicolon and the space after comment-start that the emit path adds, so dividers rendered LENGTH+2 (elisp) or LENGTH+1 wide. The budget now mirrors every term min-length already counts.
|
| |
|
|
|
|
| |
cj/music-add-dired-selection gated dired-get-marked-files behind use-region-p, so files marked with m fell to the single-file branch and only the point file was queued. dired-get-marked-files already honors marks, a region, or point on its own.
The header-refresh advice on the four EMMS toggles was an anonymous lambda, which can't be advice-removed and stacked a copy on every :config reload. It's now a named function installed remove-then-add.
|
| |
|
|
| |
The delegated cj/kill-buffer-or-bury-alive reads current-prefix-arg, so a prefixed wrapper call took the add-to-undead-list branch for every buffer: nothing killed, list spammed. The four wrappers now bind the prefix to nil around the delegate.
|
| |
|
|
| |
The top-level defun was clobbered when use-package reloaded dashboard-widgets, so the override never ran. Deferring it kept it alive but exposed a second bug: dashboard-insert-section is a macro, unknown at module compile time, so the body compiled as a function call and crashed void-variable at render. The override now registers after dashboard-widgets and compiles with the macro known.
|
| |
|
|
| |
Without the defvar, the byte-compiled let-binding in cj/org-roam-node-insert-immediate is a dead lexical binding and :immediate-finish never reaches org-roam-node-insert, so the immediate insert opened a capture buffer.
|
| |
|
|
| |
An unmatched choice made the assoc lookup nil, which crashed the index arithmetic with wrong-type-argument. The jump prompt now gives a user-error and the remove prompt cancels.
|
| |
|
|
| |
The command fires via the find-file advice, so visiting a video without mpv on PATH threw an opaque call-process error mid-visit.
|
| |
|
|
| |
slack-current-buffer is declared but void until slack.el loads, so a cold C-; S ! signaled void-variable instead of the not-in-a-Slack-buffer message.
|
| |
|
|
| |
The skip entry used "#+" (one-or-more #), which matches no real begin_src line, so ispell spell-checked inside every org code block.
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|