diff --git a/.gitignore b/.gitignore index 2350b67b14..2afcdb8397 100644 --- a/.gitignore +++ b/.gitignore @@ -546,3 +546,8 @@ scratchpad-jas-nzxt-acl.md toolchain/tapes/.tape-cache/ toolchain/tapes/.jam-shots/ crm/.cache/ + +# Canonical checkout of the private, GPG-encrypted credentials repository. +# It lives inside this workspace on every machine but remains a separate Git +# history; only ciphertext from that repository is ever pushed. +/vault/ diff --git a/cancelok/lineage.json b/cancelok/lineage.json index 8cdbe0cdb6..c0323c549d 100644 --- a/cancelok/lineage.json +++ b/cancelok/lineage.json @@ -490,11 +490,11 @@ "born": "2026-07-17T20:01:19.264Z" }, "ripplo": { - "parent": "nuxo", - "second": null, - "mutation": "eye", - "trait": "pond ripple rings (expanding, interfering, per-pitch) x plucked-harp/bell/sub-bass", - "born": "2026-07-17T21:07:59.333Z" + "parent": "ploo", + "second": "wandro", + "mutation": "cross", + "trait": "radial shockwave/starburst bloom (ploo) x independent just-intonation pendulum voices (wandro)", + "born": "2026-08-10T04:45:03.201Z" }, "arvo": { "parent": "varo", @@ -597,9 +597,9 @@ "reedo": { "parent": "nuxo", "second": null, - "mutation": "eye", - "trait": "growing meadow of wind-swayed reeds x pentatonic harp (pluck/bell/sub)", - "born": "2026-07-18T17:46:06.368Z" + "mutation": "voice", + "trait": "peg-and-thread string art x breath-swelled flute & bubble physical models", + "born": "2026-08-09T20:03:35.426Z" }, "glorp": { "parent": "ploo", @@ -694,10 +694,10 @@ }, "shivo": { "parent": "varo", - "second": null, - "mutation": "push", - "trait": "a live moir grid that follows your finger x continuously-detuned pad voice, its beat rate set by drag speed", - "born": "2026-07-19T01:37:03.205Z" + "second": "nuxo", + "mutation": "cross", + "trait": "moir ring-grid (varo) x plucked harp/bell/sub voice (nuxo)", + "born": "2026-08-09T17:46:04.695Z" }, "cogwo": { "parent": null, @@ -833,11 +833,11 @@ "born": "2026-07-20T02:02:55.405Z" }, "harko": { - "parent": "varo", - "second": null, - "mutation": "voice", - "trait": "moir ring interference x plucked-harp arpeggio with echo tail", - "born": "2026-07-20T02:06:22.654Z" + "parent": "wandro", + "second": "nuxo", + "mutation": "cross", + "trait": "pendulum-wave visual (wandro) x harp pluck/bell/sub voice (nuxo)", + "born": "2026-08-09T22:19:00.294Z" }, "welmo": { "parent": "ploo", @@ -1055,5 +1055,96 @@ "mutation": "push", "trait": "drag-comet trail of petal light x continuous theremin glide", "born": "2026-08-08T23:41:32.580Z" + }, + "flendro": { + "parent": "wandro", + "second": null, + "mutation": "voice", + "trait": "pendulum-wave (bob length traces melody, swing period = just-intonation ratio) x physically-modeled flute + bubble voice", + "born": "2026-08-09T17:49:42.296Z" + }, + "pingo": { + "parent": null, + "second": null, + "mutation": "blind", + "trait": "rotating sonar-scope sweep revealing decaying echo blips x two-tone chirp/pluck ping with reverberant return", + "born": "2026-08-09T18:56:25.714Z" + }, + "kopno": { + "parent": null, + "second": null, + "mutation": "blind", + "trait": "heat-threshold kernel-pop field (grid of kernels heating in a pan, popping into ballistic arcs, settling into a growing pile) x percussive pluck/crack pop voice, pentatonic by pan column", + "born": "2026-08-09T19:01:02.919Z" + }, + "cambro": { + "parent": null, + "second": null, + "mutation": "blind", + "trait": "circular knitting-machine cam ring (needles cycling through a cam track, banking stitch rows into a scrolling flattened fabric) x pluck-clack stitch voice with a droning motor hum and row-complete chime", + "born": "2026-08-09T20:08:15.786Z" + }, + "orlo": { + "parent": "wandro", + "second": null, + "mutation": "eye", + "trait": "rotating just-intonation orrery (hand length = melody contour, hands cross top/bottom to pluck, conjunction blooms) x wandro's pluck/bell/sub voice", + "born": "2026-08-09T21:10:59.347Z" + }, + "yanko": { + "parent": "wandro", + "second": null, + "mutation": "push", + "trait": "grabbed-pendulum drag control (kinematic pull spring release) x bent-string squeak / true-pitch snap voice", + "born": "2026-08-09T21:16:15.201Z" + }, + "wilmo": { + "parent": "wandro", + "second": null, + "mutation": "invert", + "trait": "a struck unison pendulum row that decays into stillness x a mallet chord that dies note-by-note into silence", + "born": "2026-08-10T01:24:46.666Z" + }, + "vozo": { + "parent": "nuxo", + "second": null, + "mutation": "invert", + "trait": "unstringing string-art harp (full web erodes to bare pegs each pass, then quietly restrings) x fraying Karplus-Strong pluck that thins to silence as the pass wears down", + "born": "2026-08-10T01:29:10.985Z" + }, + "phaso": { + "parent": "varo", + "second": null, + "mutation": "voice", + "trait": "moir interference (two ring grids) x Reich-style rhythmic phasing with a plucky bubble voice", + "born": "2026-08-10T02:32:04.180Z" + }, + "dwindo": { + "parent": "ploo", + "second": null, + "mutation": "invert", + "trait": "imploding vortex bloom (contracting rings + petals swallowed toward a black-hole core) x descending drain voice (falling riser, muffled sink instead of a gong drop)", + "born": "2026-08-10T02:36:02.988Z" + }, + "brumo": { + "parent": null, + "second": null, + "mutation": "blind", + "trait": "ideal-gas Brownian particle box (wall-collision kinetic theory, no orbits/pendulums/looms) x ambient drone chord + steam-tick percussion sonifying collision energy", + "born": "2026-08-10T03:40:38.647Z" + }, + "brumek": { + "parent": null, + "second": null, + "mutation": "blind", + "trait": "rock-paper-scissors cyclic-dominance reaction-diffusion (Lotka-Volterra-May rune lattice, three species eating in a loop, spiral fronts) x three-note round-robin drone chord that tracks which species dominates the field", + "born": "2026-08-10T03:41:49.586Z" + }, + "krendo": { + "parent": null, + "second": null, + "mutation": "blind", + "trait": "independent stochastic decay-chain particle field (a renewal process no neighbors, no orbit, no automaton rule) x Geiger-click percussion sonifying each decay event, position-panned and generation-pitched", + "born": "2026-08-10T04:50:59.525Z" } } diff --git a/slab/juked/bin/juked b/slab/juked/bin/juked index 755666a752..4831f2d35d 100755 --- a/slab/juked/bin/juked +++ b/slab/juked/bin/juked @@ -23,6 +23,20 @@ daemon_pids() { /usr/bin/pgrep -f "^${engine} --config-folder ${config_dir} --cache-folder ${cache_dir} --daemon$" 2>/dev/null \ | grep -v "^${listener}$" || true } +# At login launchd starts us before Wi-Fi is up. The engine reads a transport +# error from its token refresh as an expired refresh token and drops into +# interactive re-auth, opening a browser login whose 127.0.0.1 callback server +# dies with this process — so the redirect lands on a dead port. Let the +# network arrive before handing the engine its cached token. +await_auth_host() { + for _ in {1..60}; do + if /usr/bin/curl -s -o /dev/null -m 2 https://accounts.spotify.com/; then + return 0 + fi + sleep 1 + done + echo "juked: accounts.spotify.com unreachable after 60s; starting anyway" >&2 +} start() { [[ -n "$(daemon_pid)" ]] && return 0 stale="$(daemon_pids)" @@ -30,6 +44,7 @@ start() { while read -r pid; do [[ -z "$pid" ]] || kill "$pid" 2>/dev/null || true; done <<< "$stale" sleep 0.25 fi + await_auth_host "$engine" "${base[@]}" --daemon for _ in {1..50}; do [[ -n "$(daemon_pid)" ]] && return 0 diff --git a/slab/juked/install.sh b/slab/juked/install.sh index 9563a741e7..cae678b460 100755 --- a/slab/juked/install.sh +++ b/slab/juked/install.sh @@ -17,7 +17,14 @@ mkdir -p "$install_root" "$bin_dir" "$config_dir" "$cache_dir" chmod 700 "$config_dir" "$cache_dir" cargo install spotify_player --version "$version" --locked \ --root "$install_root" --no-default-features --features daemon,rodio-backend -install -m 0755 "$root/bin/juked" "$bin_dir/juked" +# A machine with the checkout can symlink this at the repo so edits to the +# script take effect without reinstalling. Copying over that link would put +# the drift back, so leave a link the way we found it. +if [[ -L "$bin_dir/juked" ]]; then + echo "juked: $bin_dir/juked is a symlink — leaving it pointed at $(readlink "$bin_dir/juked")" +else + install -m 0755 "$root/bin/juked" "$bin_dir/juked" +fi if [[ ! -f "$config_dir/app.toml" ]]; then install -m 0600 "$root/config/app.toml" "$config_dir/app.toml" fi diff --git a/slab/menuband/fastlane/report.xml b/slab/menuband/fastlane/report.xml index c9a5cfb42f..6a69e7562b 100644 --- a/slab/menuband/fastlane/report.xml +++ b/slab/menuband/fastlane/report.xml @@ -5,12 +5,12 @@ - + - + diff --git a/slab/tracktramp/Sources/TrackDrumIcon.swift b/slab/tracktramp/Sources/TrackDrumIcon.swift index b47436bb79..2293ea1d64 100644 --- a/slab/tracktramp/Sources/TrackDrumIcon.swift +++ b/slab/tracktramp/Sources/TrackDrumIcon.swift @@ -118,45 +118,8 @@ enum TrackDrumIcon { raised(kick, in: kickBox, top: umberTop, bottom: umberBottom, shadowY: -7, blur: 10) - // Two restrained registration points make this read as the live - // touch surface, not a cassette, even at Dock size. - let touches = [ - NSPoint(x: pad.minX + pad.width * 0.36, - y: pad.minY + pad.height * 0.68), - NSPoint(x: pad.minX + pad.width * 0.65, - y: pad.minY + pad.height * 0.36), - ] - let tether = NSBezierPath() - tether.move(to: touches[0]) - tether.line(to: touches[1]) - NSGraphicsContext.saveGraphicsState() - let tetherShadow = NSShadow() - tetherShadow.shadowColor = NSColor.black.withAlphaComponent(0.55) - tetherShadow.shadowBlurRadius = s(8) - tetherShadow.shadowOffset = NSSize(width: 0, height: -s(5)) - tetherShadow.set() - accent.withAlphaComponent(0.64).setStroke() - tether.lineWidth = s(12) - tether.stroke() - NSGraphicsContext.restoreGraphicsState() - for point in touches { - let radius = s(20) - let dot = NSBezierPath(ovalIn: NSRect( - x: point.x - radius, y: point.y - radius, - width: radius * 2, height: radius * 2 - )) - NSGraphicsContext.saveGraphicsState() - let glow = NSShadow() - glow.shadowColor = accent.withAlphaComponent(0.80) - glow.shadowBlurRadius = s(12) - glow.shadowOffset = .zero - glow.set() - NSColor.white.withAlphaComponent(0.98).setFill() - dot.fill() - NSGraphicsContext.restoreGraphicsState() - accent.setStroke() - dot.lineWidth = s(5) - dot.stroke() - } + // No touch dots or finger tether yet — the icon is the drum surface + // alone. Live-contact indicators come back once the trackpad plugin + // actually drives them, rather than being painted in as decoration. } } diff --git a/vault/.gitignore b/vault/.gitignore deleted file mode 100644 index b073731ee6..0000000000 --- a/vault/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -# vault — sensitive credentials, never commit -*.env -*.secrets -*.key -*.pem