aboutsummaryrefslogtreecommitdiffstats
path: root/docs/superpowers/plans
AgeCommit message (Collapse)AuthorFilesLines
9 hourscompanion: plan for blushing at a listed wallpaperDanilo M.1-0/+655
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 hoursdocs: companion plan: the frames and prep-frames are doneDanilo M.1-1/+6
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
11 hourscompanion: the dress set, a shoved frame, several references per frameDanilo M.1-1/+4
The dress frames are made. What the tries taught is in frames.txt beside each line: klein turns the blindfold into an eye mask under strong expressions, so those take it off (BARE) and the rest name it as one solid band (EYES); standing "shoved" read as walking in four seeds, so it is airborne, edited from the seed-7 attempt kept in candidates/; a back view fits "watch", her watching the screen while the user types; klein would neither draw the game's Virtuous Treaty nor move a sword, nor turn her three-quarters, so muse takes only the arms of her official art. gen-frames now takes several references per frame (a + b): the first is edited, the rest are images the prompt points at. The leotard set loses the blindfold too. shoved gets a frame of its own instead of mad: in the spec's table and the plan's Mood.js and its test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
13 hoursdocs: companion implementation planDanilo M.1-0/+1373
Eleven tasks: the Hyprland events first, since the spec's open checks gate the QML that depends on them; the shared balloon check; Mood.js and Lines.js with node checks; prep-frames; the assistant's replied signal; Sprite and Companion; notes; then the hand checks and the frame list for the user. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
3 daysdocs: plan the sb-builder settings pagesDanilo M.1-0/+1157
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
5 daysassistant: a mic button asks by voiceDanilo M.1-0/+284
Each recording is a pw-record Process of its own, made from a Component like the Do row's runs, so a stopped recording's late exit cannot be read as the next one's. Stopping sets running to false (SIGTERM), which lets pw-record write the WAV header; the audio ask goes out from the process's exit, not from the click. Recording stops itself at 59 s: the daemon refuses over 60 s by file size, and the stop lands a little after the tick. Escape cancels a recording before it does anything else, and closing the card or losing the daemon cancels it too. A pw-record that ends on its own says "recording failed". Checked: a scratch harness saw transcribing, thinking, idle for a 2 s recording; by hand, every case in the spec passed with no pw-record left behind, a desktop shell reload mid-recording included. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
5 daysdocs: plan notification soundsDanilo M.1-0/+696
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
5 daysdocs: plan the notification settings pageDanilo M.1-0/+1153
Ten tasks across notifyd (config loader, timeouts, caps, reload) and this repo (shared resolver with a node check, balloon placement and mute, the settings module). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
7 daysdocs: OBS pill enhancements planDanilo M.1-0/+343
7 daysdocs: the OBS pill opens a controls panelDanilo M.1-102/+123
At rest the pill is a record dot with the elapsed time; a click morphs it into a panel, as the status pill does for sound, with Record/Stop, Pause/Resume, Show/Hide webcam and the scene list. The user preferred it to every control inline: the pill stays small, and scenes are picked by name rather than stepped through, so obsStep is gone. OBS quitting with the panel open clears it, or the island would stay held open. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
7 daysdocs: OBS pill implementation planDanilo M.1-0/+528
Six tasks: logic helpers with their check, the openssl auth helper, the Obs singleton, the pill, island wiring with the sliver pulse, docs. Records two deviations from the spec found while planning: QML's WebSocket hides the close code, so a wrong password is logged as 'closed before Identified'; responses route on the echoed requestType. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
7 daysdocs: notes drawer module spec and planDanilo M.1-0/+415
A drawer tile and page for bash-notes: browse, write, edit and delete notes in the page, sharing notes.sh's store so both tools work on the same notes. Git follows notes.sh's shape, pull before write, commit and push after, with two departures the page needs: an unconfirmed Save leaves db.json uncommitted (write and commit are two clicks here, one invocation there), so the pulls carry --autostash, and lastpull is stamped after the pull rather than before it, which notes.sh does and then ignores the failed pull that follows.
7 daysdocs: plan the entry line, file state, picker and island dropDanilo M.1-0/+1345
Four tasks: file kinds, the three card states with staging and the in-card picker, the island receptacle, and the handover. The card files ran in a scratch harness against the attachment daemon first. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
7 daysdocs: plan the assistant canvasDanilo M.1-0/+1279
Five tasks: the markdown splitter, the canvas components, hosting them in the desktop shell, the switch-over (voice overlay out, hypr-theme bind, autostart and blur), and the user's visual check. Every file was run in a scratch harness against the real daemon before planning. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
8 daysdocs(git): implementation plan for the git config pageDanilo M.1-0/+941
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
8 daysdocs(plan): user details implementation planDanilo M.1-0/+1054
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
9 daysdocs(plan): the updates module, and two spec correctionsDanilo M.1-0/+1196
Drafting the code found two holes in the spec. Awaiting build was limited to the user's own recipes, so an SBo package whose recipe had caught up but was not yet built (nessus) showed in no section; it now covers any recipe. And "the newest ChangeLog line decides" would never call a package new once it had been upgraded after being added; only Added and Removed lines count now. The prefix rule for kernel suffixes is dropped as redundant: version order already ranks a suffixed version newer, which is never behind. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
11 daysdocs(plan): performance panel implementation planDanilo M.1-0/+1518
Nine tasks: two spec corrections, Perf.js with its node test, the pinned IP in Prefs, the Perf service, the panel, the status pill wiring, an on-screen check against the still-running conky widgets, docs, and last the removal of those widgets from conky-theme-udt. The plan's Perf.js was run against its test while planning. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
11 daysdocs(plan): calendar panel implementation planDanilo M.1-0/+2202
Ten tasks: protocol corrections to the spec, calctl in two halves with their CLI tests, the pure Cal.js with its node test, the service, the editor, the panel, the island wiring, a pass with the user and docs. Both test suites were run against the plan's own code before committing, and a read-only list against the live calendars measured 0.11s. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
11 daysdocs(plan): controls panel implementation planDanilo M.1-0/+1063
Nine tasks: two spec corrections found while planning, the pure helpers with their node test, the preferences singleton, the tile, the panel, the island and IPC wiring, the SUPER release bind with its fallback, a visual pass with the user, and docs. The plan's test was run against the plan's Controls.js before committing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07docs(plan): island core implementation planDanilo M.1-0/+1462
Twelve tasks from pure logic to waybar removal. The spec is corrected on two points found while reading the code: Quickshell's PwNode has no running state, so mic and screen detection poll pw-dump like the waybar script did, and the VM dot rule now agrees with its own table on saved VMs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05docs(ai): implementation plan for the AI moduleDanilo M.1-0/+836
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25docs(keybinds): implementation planDanilo M.1-0/+587
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-18docs(status): implementation plan for breaktimer controlDanilo M.1-0/+1259
Nine tasks over two repos. The daemon half gains a sourced config file and a config verb that prints the effective settings, which is what makes the config testable without running a thirty minute work block. The shell half reads the daemon's three runtime files, adds a row and a tile line. Three assumptions were probed rather than trusted while writing it, each with a precedent for biting here: padStart exists in this QML engine (matchAll does not), a Connections resync fires correctly on a singleton property, and the config source line leaves unnamed variables alone. The qs verification steps redirect rather than pipe. Piped output is lost when timeout kills the process, which reads as a silent success, and that failure happened twice while probing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15docs: add the appearance sunset/idle/icons implementation planDanilo M.1-0/+1750
Seven tasks: the hyprsunset model, the hypridle model, the icon/cursor model, then the tab bar and one task per tab, finishing with docs and the cross-repo unhardcode TODOs. Models are built and self-tested first so every commit loads. Records the brace-in-command parsing trap and the sunset-qt byte-for-byte serializer shape.
2026-09-15docs: add the notification images implementation plansDanilo M.2-0/+1218
Two plans, one per subsystem: the notifyd daemon (hint parsing, PNG encode, theme-name resolution, the image field and its cleanup) and the quickshell renderers (the balloon preview and remote inline source stripping). Either can ship first; the renderer tolerates a daemon without the field.
2026-09-15docs: add the notification renderers implementation planDanilo M.1-0/+1380
Plan two of two: the quickshell side of the notification daemon. The Notify singleton reads the daemon's published files, a new notifications/ component draws balloons and owns suppression, the drawer's reserved Item becomes the live queue with a history page, and the Status page gains a snooze row. Suppression lives in the balloon shell so the drawer can list what DND held back, and the drawer flag is the single no-double-show mechanism. Per-id history removal is a tracked TODO in the notifyd repo rather than an untracked spec gap.
2026-09-15docs: fix the expire_timeout direction in the spec and planDanilo M.1-10/+14
The freedesktop spec says -1 means the server decides and 0 means never; the spec and plan had them reversed, which the shipped code inherited and the live handover test caught. Corrected to match the spec, libnotify's -1 default and dunst.
2026-09-15docs: correct the snooze check count to fiveDanilo M.1-1/+1
The check has five assertions, not four.
2026-09-15docs: fix the runtime dir collision in the check scriptDanilo M.1-1/+2
The daemon binary was built at $tmp/notifyd, the same name RuntimeDir() gives under XDG_RUNTIME_DIR, so the two collided. The runtime dir moves to $tmp/run, which is what the shipped script does.
2026-09-15docs: give the plan's test files the GPLv2 headerDanilo M.1-0/+44
The test snippets omitted the header the global constraints require on every .go file, which a task review flagged against the first one shipped. The snippets now carry it, so later tasks do not repeat the gap.
2026-09-15docs: record the notifyd repo as createdDanilo M.1-4/+4
Public under the Linux cgit section, cloned to ~/Programming/GIT/notifyd, so Task 1 Step 1 is done and the executor starts at Step 2.
2026-09-15docs: add the notifyd implementation planDanilo M.1-0/+1780
Plan one of two for the notification daemon: the Go daemon and notifyctl in their own repo. The renderer plan is separate because the daemon is working, testable software on its own, exercised through notifyctl. The policy is pure and tested without a bus; the store's expiry, dismissal and eviction are separate lifetimes, which the store tests pin; and test-notifyctl.sh runs the daemon and CLI on a private session bus against a temporary runtime directory.
2026-09-15docs(status): document the module and record its trapsDanilo M.1-5/+35
A FileView fires its own fileChanged on setText, so a handler that writes in response to a change loops unless it compares first. IdleInhibitor has no window of its own and does nothing without one, so the singleton is handed the keepalive window by shell.qml. Both were read from the documentation while designing and confirmed while implementing.
2026-09-15fix(desktop): keep statusctl quiet when the mode file is absentDanilo M.1-6/+6
read_mode() failed on a missing mode file with a shell redirection error, 'statusctl: line 56: .../status.dnd: No such file or directory', printed to stderr on every get/toggle before the file existed and polluting waybar's exec stderr. The '2>/dev/null' sat on the 'tr' command, but the error is the parent shell's input redirection failure, which that redirect cannot suppress. Guard on '[[ -e "$file" ]]' before reading; a missing file still reads as 0, which was always the contract. Mirror the fix into the plan so plan and script agree.
2026-09-15docs: correct the check count and mirror the statusctl hardeningDanilo M.1-4/+13
Two corrections to the plan, both found by running it rather than reading it. The test script the plan specifies makes nine assertions; the prose around it claimed eight, in both the task step and the final check. An implementer running it would see a passing suite that disagrees with its own expected output, which reads as a failure of either the test or the plan. My arithmetic. The plan's statusctl also swallowed a failed rename and read the mode file through cat piped into tr, so a write that did not land still reported success and an unreadable file fell back to off by accident of pipeline semantics rather than by intent. Review of the implemented script caught both. The plan now carries the same fixes, so a future run of it does not reintroduce them. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A7ThHHh5iTYbVfp3rNAkw2
2026-09-15docs: set atomicWrites explicitly in the plan's ModeFileDanilo M.1-1/+11
Review of the first task caught that the commit message credited atomicWrites while the code never set it. The property is already the documented default in 0.3.1, so the behaviour was right, but statusctl watches close_write,moved_to specifically because an atomic write arrives as a rename, and leaning on a default for something the CLI depends on is weaker than declaring it. Both ModeFile blocks in the plan now set it, so task four does not reintroduce the gap when it adds the second mode. Worth recording: the review asserted atomicWrites defaults to false in 0.3.1 and concluded the shipped writes were not atomic. The v0.3.1 and v0.3.0 documentation both read "If true (default)", so that conclusion was wrong, though the underlying observation about the unset property was right. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A7ThHHh5iTYbVfp3rNAkw2
2026-09-15docs: add the status registry implementation planDanilo M.1-0/+1216
Eight tasks against the registry spec: the singleton with the dnd mode, the statusctl CLI and its check, naming the keepalive window, presentation mode and its three effects, the module and tile, the page and registration, installing the CLI and swapping the waybar module, then the README and traps. The plan carries the facts probed while designing so the implementer does not re-probe them: the runtime directory is tmpfs, elogind runs here with the pam caveat that stops it guaranteeing logout cleanup, the compositor advertises zwp_idle_inhibit_manager_v1, inotifywait is present, and Inconsolata Nerd Font lives under ~/.fonts rather than either share directory. That last one cost a failed cmap search that read as a missing glyph when it was a bad search path. Two claims stay marked unverified because they come from documentation and have not been observed running: that a FileView fires its own fileChanged on setText, and that IdleInhibitor does nothing without a non-null window. The plan handles both and tells the implementer to confirm them and record what actually happens. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A7ThHHh5iTYbVfp3rNAkw2
2026-09-14docs: KDE Connect module design and planDanilo M.1-0/+1224
Absorbs the kdeconnect-indicator into the drawer: status, battery, pairing, ping, clipboard send, file share, refresh and mount. State is polled from a qdbus6 helper script while the drawer is open, since quickshell 0.3.1 has no generic D-Bus module. The spec notes the phone-to-PC clipboard is the daemon's plugin, not the indicator's, so removing the indicator does not touch it.
2026-09-14docs: correct three plan details found during executionDanilo M.1-14/+32
The Connections block needs a typed property on a QtObject, the bluetooth README lines belong to Task 6 so every commit stays self-consistent, and Pairing has no status property. Each was found by a task review and fixed in the plan as well as the code.
2026-09-14docs: plan the network and bluetooth modulesDanilo M.1-0/+1343
Eight tasks, each leaving the tree working: network wired page, wifi section, README, bluetooth module and page, pairing, README, then the waybar removal and the trap notes. The spec's failure section is corrected in the same commit: it claimed forget and disconnect failures would surface inline, but neither backend exposes a failure signal for them, so that is a ceiling rather than a feature. Verified by probe before writing any task: the singletons start empty for about two seconds, the device lists are ObjectModels, signalStrength is 0..1, scanner and discovering are writable, and NMSettings is not in QML scope, which drops the hidden-network join the spec had left conditional.
2026-09-14docs: correct the plan's no-arg ipc open and the head pipeDanilo M.1-6/+20
Quickshell 0.3.1 IPC requires every declared argument, so the plan's `ipc call drawer open` with no page fails; the page-less grid entry is the zero-argument `toggle`. Also records that `... | head` races timeout and kills the shell early, so verification uses a file redirect.
2026-09-14docs: a subdirectory singleton needs no qmldir, drop it from the planDanilo M.1-71/+54
The plan claimed a pragma Singleton outside the config root is invisible until a qmldir names it, and had Task 1 create one plus Tasks 6, 7 and 8 append a line each. That premise was wrong. Tested: a pragma Singleton in modules/sub/, reached by a plain import "modules/sub", resolves with no qmldir anywhere. The control was a reference to a genuinely undefined type, which warns "ReferenceError: <name> is not defined"; the singleton case produced no such warning and the binding evaluated. This matches what AGENTS.md already documented about Theme.qml, which the code review pointed out. Four registration steps removed and the remaining steps renumbered. The AGENTS.md note Task 9 adds now records the tested behaviour rather than the invented one. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01We9zcHEH8ZWHPcQwMaJRNv
2026-09-14docs: warn that the config task's tilde paths must be typed absoluteDanilo M.1-0/+9
The paths are written with a tilde because this file is committed and the repo forbids home paths in committed files. But neither Hyprland's exec_cmd nor waybar's exec goes through a shell, so a tilde there never expands and fails silently, which reads as a broken keybind rather than a bad path. The two rules genuinely conflict here, so the plan now says which form goes where instead of shipping lines that would not run. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01We9zcHEH8ZWHPcQwMaJRNv
2026-09-14docs: implementation plan for the desktop shellDanilo M.1-0/+2817
Ten tasks: skeleton, contract, chrome, drawer, then the four modules in increasing order of risk, then documentation, then the six config edits outside this repo. Appearance goes first among the modules despite being last in the grid, because it is nine lines of substance and puts something in the grid before the three migrations start. Sound, mail and vm follow in that order: sound splits one 302-line file into three, mail is the gentlest move and carries the only automated oracle in the project, and vm is the largest and the one whose polling behaviour actually changes. Each task leaves the repo working, because several delete a component and a half-finished deletion is painful to unpick. Paths in the config task are written with a tilde: the gitleaks hook rejected the absolute form, correctly, since this file is committed and the live Hyprland config it describes is not. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01We9zcHEH8ZWHPcQwMaJRNv
2026-09-13docs: implementation plan for mail arrival notificationsDanilo M.1-0/+924
Six tasks, TDD against one bash check rather than a framework: the script is sourced as a library so the pure functions, the ones that only move text around, are asserted without notmuch, dunstify or inotify in the picture. The two parsing traps that already cost this component a debugging session each get a fixture apiece: a key containing dots, and a folder value containing a bracket. Verification does not wait for mail. Backdating the stored revision by 2000 replays a real window on demand, and the seed run before it proves the anti-storm rule with 101 unread messages on disk. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ZwWrCEbdKzmisfg9bb1nS
2026-09-12docs(window-switcher): focusHistoryID is not on HyprlandToplevelDanilo M.1-2/+12
Implementing the model found it. The property reads undefined, so the planned sort compared NaN and silently did nothing, leaving the list in arbitrary tracker order while looking entirely plausible. It is on lastIpcObject instead. Carried into the plan's later tasks so the grid does not reintroduce the bare property, and into the notes that Task 6 puts in AGENTS.md, since a sort that quietly does nothing is the kind of wrong answer this repo's notes exist to prevent. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SYg4wYHq5XNbiVmMeKRb1S
2026-09-12fix(window-switcher): pick the screen the way the other components doDanilo M.1-1/+4
The screen was found by a name written inline, falling back to null. The other three panels all take a monitor property and fall back to screens[0], so this now does too: a machine without a DP-1 gets its first monitor rather than a null screen, and the name is in one place if it ever needs changing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SYg4wYHq5XNbiVmMeKRb1S
2026-09-12docs(window-switcher): the implementation planDanilo M.1-0/+849
Six tasks, each ending in a commit: the skeleton and the keyboard grab, the window model, one card, the grid and empty state, the Hyprland wiring, and the docs. Two things were checked against the running system while writing it rather than left for the implementation to discover. The keyboard grab works: Keys.onEscapePressed on a focused Item inside the layer surface fires, so the AGENTS.md workaround holds and keyboard navigation is safe to build on. And the dispatcher for sending a key is send_shortcut with the underscore; sendshortcut does not exist, and a test written against that name would have failed in a way that looks exactly like the key never arriving. No qmldir is added. There is none anywhere in this repo and Theme resolves without one, since quickshell scans the config directory itself; the AGENTS.md note about needing one is about singletons outside it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SYg4wYHq5XNbiVmMeKRb1S
2026-09-12docs: the plan does not launch anything on the user's screenDanilo M.1-4/+11
The user works at this machine and runs the shell themselves. An agent executing this plan writes code and runs non-GUI checks, then hands over the command and the numbers to compare against; the four steps that need a running qs are now marked as the user's. Also warns against a bare pkill -x qs, which would take down the three components the user already has running. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WWL8JYHu7yhAdtx5pU9PMU