| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
| |
README gains a widget-library section covering the GW builder contract, GW_CSS styling, the tick contract for live meters, named style options, and the CDP probes. The stray waybar-redesign bullet moves back to the prototypes list. todo.org Phase 1 closes as a dated entry.
|
| |
|
|
| |
spec-review passed with three findings, all pre-agreed and folded in the same pass: the option-1 approval superseded the demand-gated extraction order (extraction now covers the full catalogue ungated, phases 1-2 swapped, decisions 4 and 8 re-scoped), the card-record refactor is now named in phase 1, and stale counts were refreshed (109 cards, R56). Lifecycle DRAFT -> READY -> DOING; phase tasks live under the Retro widget catalogue parent with the spec UUID stamped as :SPEC_ID:.
|
| |
|
|
| |
Craig approved the classic-script widgets.js with a GW namespace as part of the componentization go-ahead. All eight decisions resolved; the spec is ready for review. The build itself waits on his per-card validation pass.
|
| |
|
|
| |
Every card gets a status lamp at the upper-right for the pre-componentization validation pass: click cycles not-done, in-progress, done, and the state persists per card in localStorage. Below the stage the card now reads readout, then options, then descriptive text, with separators between the zones and no labels — chips moved into a generic options container that future selectors share.
|
| |
|
|
|
|
| |
default size M
The palette stops being a token dump: 36 named colors grouped by role (materials, faces and inks, lamps and jewels, phosphors, needles), each naming where it appears on the instruments. No hex codes render anywhere on the page, and page chrome is deliberately excluded — the card documents what the widgets are made of, not how the page is styled. Default widget size drops to M.
|
| |
|
|
|
|
| |
widgets
A bounding-box audit over all 109 cards caught the voice-loop monitor bars streaking across the card: Chrome's CSS zoom miscomputes absolute insets, fr tracks, and stretched widths inside zoomed stages, so the keyset now uses fixed pixel tracks and bars, which zoom scales correctly. Seven intrinsically tiny widgets (toggle, chip, arm-to-fire, mini signal, ladder, thermometer, status lamp) get a boost zoom so they stop floating in oversized stages.
|
| |
|
|
|
|
|
|
|
|
| |
25 new cards, grammar note
Squash of the gallery-upgrades branch (25 commits). Usability: widget stages scale S/M/L (2.4x default), reading text at 12-13pt, a live palette section parsed from the generated :root block, screen-color families with per-card chips on the five screen widgets, and a collapsible spec sheet on every card (input model, solves, use, limits, origin, difficulty, prefer-when, period on the non-timeless).
Collection grew 84 → 109 cards, all CDP-verified: reference cards R32-R36 (mechanical timer, four-way rocker, four-way toggle, day-date discs, LED dot matrix), the takuzu-survey build R37-R47 plus the N23 alarm lifecycle (pin matrix, dead-man, rotary dial, breaker panel, DSKY, cam timer, attitude indicator, heading bug, flip-disc, dekatron, landing gear), the promoted banked six R48-R53 (knife switch, decade box, two-hand control, voice-loop keyset, blinkenlights, circular chart), and the Ki-57/comfort-meter trio R54-R56 (vertical tape, twin-needle, comfort-zone crossed needles).
Also: docs/design control-grammars reference note (taxonomy sources and proposed axes for the classification work), nine reference photos filed, and a component cleanup pass (dial digits above the finger wheel, legible demo defaults, unified captions).
|
| | |
|
| |
|
|
| |
The collection phase closed at 84 verified cards, so porting needs a decision procedure before consumer work starts. The spec carries the agreed five phases (demand inventory, web library extraction, Emacs ports, waybar audio pilot, Level-2 generator go/no-go) and records the baked architecture decisions. I left the web library's packaging shape as the one open decision, tracked as a VERIFY in todo.org. The gallery is the prototype evidence, with the R-series history as the iteration record.
|
| | |
|
| | |
|
| | |
|
| |
|
|
| |
All v1 phases of both specs shipped on dotfiles main in the 2026-07-11 build run (net: 21ca3ff, d73eba6, c9f8604, be15a81, 12e3e76; bt: d19fdca, f05a9b4, d7d859f), fake-verified green. The live halves stay on the VM live-verification task and the manual-testing checklist. vNext items from both specs are now logged as [#D] tasks.
|
| |
|
|
| |
and spec outline
|
| |
|
|
|
|
|
|
|
|
|
| |
I built four widgets as inline SVG (the substrate that ports to svg.el), modeled on 1950s-60s lab and console hardware from the reference photos now filed in the catalogue's working directory:
- R01 moving-coil VU meter: cream face, authentic nonlinear dB arc (-20 to +3), red zone, ballistic needle on the live signal.
- R02 calibrated vernier dial: rotating tick-ring disc with radial numerals under a fixed hairline, fluted bakelite knob, reads to a tenth.
- R03 bat-handle toggle: chrome lever on a hex bushing, snaps ON/OFF with lit legends.
- R04 bakelite fluted knob: scalloped skirt, glossy dome, amber index over a printed 0-10 scale.
I verified all four in headless Chrome: the VU animates with ballistics, the dial and knob track drags, the toggle throws, no console exceptions. The gallery now carries 57 cards.
|
| |
|
|
| |
Filed two archsetup tasks from the roam inbox (net panel enterprise-error banner that never dismisses, notification popup sizing). Archived three resolved subtrees into task-archive and ran the todo-cleanup passes (convert-subtasks, archive-done, child-priority sync).
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
| |
I ran spec-response Phase 6 on both READY specs. Each gets a SPEC_ID-bound parent task in todo.org with one child per implementation phase. Both specs flip from READY to DOING.
Only the read-only detection phases are buildable now, so they're marked solo: net Phase 0 (the control-plane probe) and bt Phases 0-1 (the two probes plus the firmware-hint Guide verdict). The privileged phases stay lower priority and carry a note: they're gated on the shared cross-panel run-time privilege model that doesn't exist yet. Shipping them before the Confirm floor would let --fix run root ops via passwordless sudo ungated.
I held off writing the manual-testing checklists. The phases that need live or reboot verification are the blocked ones, so their checklists would be planning work that can't start yet.
|
| |
|
|
| |
Split out of the net-doctor-expansion spec review: connection names and SSIDs leak into the copyable report and --json engine-wide, so it wants one systemic pass rather than being solved per-verdict.
|
| |
|
|
|
|
|
|
| |
The input and output doctor reaches firmware, ALSA saved state, modprobe, and packages, which need root. The parent spec decided "no sudo anywhere," correct when the feature was user-scope PipeWire. This supersedes that.
The doctor resolves its privilege at run time from three signals: passwordless sudo (sudo -n true, which never hangs), a tty to prompt at, and whether it is the GUI panel. Four remedy classes follow. Auto is user-scope and runs anywhere. Privileged needs sudo, so it runs where passwordless sudo exists, prompts on a CLI, and degrades to Guide otherwise. Reboot-tail runs the applicable part, then instructs the reboot. Guide is physical, BIOS, or wait-for-upstream. Passwordless sudo is not consequence-free, so every Privileged and Reboot-tail remedy defaults to Confirm or Arm, never silent Auto.
This was Craig's call, and he wants it as a cross-panel standard. I filed a task to factor the privilege resolution into a shared helper the net, bluetooth, maint, and audio doctors all use.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
The doctor never examines the microphone. diag collects default_source and default_source_present, the classifier reads neither, so a muted mic, a stale default source, and a mic the sound server can't see all classify as healthy. Chrome losing the mic this morning surfaced it: the stack was genuinely fine and the doctor had nothing useful to say.
The design grew past the gap in one conversation. An empty source list is normal on a mic-less desktop and a failure on a machine that should have one, and no probe can tell those apart. The missing fact comes from the user's finger: a doctor key on each of the OUTPUTS and INPUTS section headers, where pressing the input one asserts a mic should exist. That retires the DOCTOR header key I shipped hours earlier, and it dissolves the precedence question a single classifier would have faced.
A new probe tier sits below PipeWire. /proc/asound lists capture-capable cards, needs no package, spawns no process, and can't hang, so it separates "the software lost a microphone the kernel sees" from "nothing is plugged in".
Push-to-talk stays as it is. It mutes the source, the one state where the server guarantees nothing is captured. A link-based push-to-talk fails open, and a crash mid-hold is a hot mic reading as muted. The doctor reads ptt.read_state() instead of guessing.
Four decisions are open. Three are closed.
|
| |
|
|
|
|
|
|
| |
The doctor shipped end to end, so the spec goes to IMPLEMENTED and the task closes with a dated record of what landed.
Three things the Decisions did not anticipate are written into the history rather than left for a reader to infer. A tenth verdict for missing tooling, because an absent pactl is an unobserved stack and not a broken one. A re-probed marker between a fix run's two row blocks. And DIAGNOSE as the read-only key's name, which Craig settled after asking why this panel carries two keys where the net panel carries one.
I filed the wall-controls convergence as its own task. Craig wants the net panel's copy and close pair on every output wall, and today no two of the four agree.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
All eight decisions resolved. DOCTOR is a section-header key; CLI-first with
the GUI as a face; hung and dead are two verdicts sharing one remedy; the
remedy tiers stand as drafted; a stream-active guard refuses the audible
remedies and is overridable by pressing again; xruns stay out of v1.
Two consequences the questions did not make obvious. Taking the guard is what
lets the pipewire-pulse restart stay at Confirm — the danger lives in the state
of the machine, not the identity of the remedy. And the guard must read stream
state from pw-dump rather than pactl: the remedies it protects are the ones you
reach for when the Pulse layer is dead, so a pactl-fed guard would go blind
exactly when it is needed.
Tier 4 drops its xrun probe to match the decision, rather than leaving the
probe list contradicting the answer.
|
| |
|
|
|
| |
Fixed in dotfiles c6a7878. Recorded that the test asserts the tier invariant
rather than the file, since a per-file fix is what missed the tier.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
Seven tasks walked. Three carried a topic tag but no type tag, so they were
invisible to any filter that asks what kind of work they are.
The net/bt realtime-lamp retrofit gains :solo:. Its scope question was settled
in July, and what remains is buildable and testable without a decision.
Priorities held on review. The zsh PATH gap and the zfs base-image failure both
already sit where the severity-by-frequency read puts them, and the keybinding
family still turns on a design choice nobody has made.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
The maintenance console's in-person checklist was a second top-level "Manual
testing and validation" task. It is now a child of the one parent, so the
pending checks live in a single place rather than two the agenda shows apart.
The audio doctor moves to [#B]. Its spec is written and Phase 0 shipped; six
decisions are all that stand between it and a build, which is active backlog
rather than parking lot.
Four dated artifacts still credited a co-author who is not a person. They are
records, but they are tracked and would publish, so they carry one author now
like everything else.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Archived the nine tasks that shipped today. Verified the rest against the
world rather than against memory, and recorded what moved.
The telega watch item has not recurred: zero assertions in the server log, and
the newest coredump predates the fix. It is a watch item with no defect behind
it, so it drops to [#D] per the severity-by-frequency read.
The net module's Phase 4 is filed and waiting on the dotfiles project, which
already tracks it — tagged blocked rather than re-sent.
The manual-testing container carried no priority and no type tag, which kept
the project's largest live collection of pending checks out of the agenda
entirely. It has both now, plus a check for the one thing today's work cannot
verify without a reboot.
The release epic gained what the docs scrub landed, and what it uncovered: four
tracked files still name a co-author who is not a person.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
The draft said build_status had no pactl timeout and froze the panel. Driving
it disproved that: pactl.run defaults to timeout=8 and raises PactlTimeout, so
the panel degrades.
The real defect was narrower and is now fixed. Two of build_status's four reads
sat outside its degrade guard, so a server that answered the device lists and
then stopped answering raised out of a function contracted to return ok:False,
and waybar's audio module died rather than dimming.
Corrected in place with the reasoning, rather than dropped, since a spec that
quietly loses a wrong claim teaches nothing about why it was wrong.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Answers the four questions the request asked, from a live survey rather than
from memory. There is no PulseAudio: the stack is pipewire, wireplumber, and
pipewire-pulse, all user-scope, so no remedy in this feature needs sudo — which
is why it mirrors the net panel's doctor rather than the maintenance console's
privileged verb table.
Two findings shape the design. pactl hangs against a server that accepts and
never answers, which is exactly the fault a doctor exists to diagnose, so every
probe is bounded. And the panel cannot diagnose itself, because pactl is the
layer most likely to be down — the probes read systemctl and pw-dump before
they touch it.
Filed the panel's own missing timeout as a separate bug. It freezes the audio
panel today, independently of any doctor.
Seven decisions left open; the spec is DRAFT and nothing gets built until they
close.
|
| |
|
|
|
|
| |
Eight tasks from the 2026-07-09 roam sweep, each with what landed and where.
The signal-count task turned out to be a semantics bug rather than a counting
one, and the session-identifier task was tmux, not waybar.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The four host capability inventories, the TrueNAS hardware specs, and the
ratio USB/xHCI record now live as roam nodes under ~/org/roam/hardware/,
linked from the Homelab Hardware Inventory index. The copies here are gone.
Carried rather than pointed at. A pointer keeps one canonical copy, but a
third project that discovers a durable hardware fact would then have to write
into this repo to record it, which the cross-project rules forbid — so the
fact would land in an inbox instead of on the device's page. Moving keeps one
canonical copy without closing the write path.
system-health-check.org resolves a host's inventory by its #+HOSTNAME: keyword
under ${ROAM_DIR:-$HOME/org/roam}/hardware/, never by filename: a node's
timestamp prefix does not survive a rename. A host with no roam clone takes the
same NO INVENTORY FILE path it always did.
strix-soak-watch.org lands here from home, beside the workflow whose Phase 3
invokes it. It is a workflow, not an inventory page.
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|