summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-04-11 22:36:15 +0300
committerPaul Buetow <paul@buetow.org>2026-04-11 22:36:15 +0300
commitaac7d87cc5325d70c4cad51fff2671e10f2405b4 (patch)
tree09346a8825a58017f3ba68d7bbdfa8291ce1fb38
parent2e08ff74e94b87fe7c0bdb339c12e93f3f1a2523 (diff)
update prompts
-rw-r--r--prompts/skills/agent-task-management/SKILL.md32
-rw-r--r--prompts/skills/agent-task-management/references/00-context.md4
-rw-r--r--prompts/skills/agent-task-management/references/1-create-task.md28
-rw-r--r--prompts/skills/agent-task-management/references/2-start-task.md6
-rw-r--r--prompts/skills/agent-task-management/references/3-complete-task.md10
-rw-r--r--prompts/skills/agent-task-management/references/4-annotate-update-task.md14
-rw-r--r--prompts/skills/agent-task-management/references/5-review-overview-tasks.md16
-rw-r--r--prompts/skills/music-collection/SKILL.md217
8 files changed, 272 insertions, 55 deletions
diff --git a/prompts/skills/agent-task-management/SKILL.md b/prompts/skills/agent-task-management/SKILL.md
index f51e903..d89e44b 100644
--- a/prompts/skills/agent-task-management/SKILL.md
+++ b/prompts/skills/agent-task-management/SKILL.md
@@ -1,33 +1,33 @@
---
name: agent-task-management
-description: "Manage agent tasks scoped to the current git project using the `~/go/bin/do` CLI. Use when asked to list, add, start, complete, annotate, or organize tasks for the project. Prefer compaction over starting a new context when beginning a new task. May start work in parallel (e.g. multiple sub-agents on different tasks) as long as agents do not conflict with each other. Triggers on: tasks, todo, task list, pick next task, what's next."
+description: "Manage agent tasks scoped to the current git project using the `~/go/bin/ask` CLI. Use when asked to list, add, start, complete, annotate, or organize tasks for the project. Prefer compaction over starting a new context when beginning a new task. May start work in parallel (e.g. multiple sub-agents on different tasks) as long as agents do not conflict with each other. Triggers on: tasks, todo, task list, pick next task, what's next."
---
# Agent Task Management
-Tasks are scoped to the current git repository via the `~/go/bin/do` CLI. **Load only the files you need** for the current action so the whole skill does not need to be in context.
+Tasks are scoped to the current git repository via the `~/go/bin/ask` CLI. **Load only the files you need** for the current action so the whole skill does not need to be in context.
-The task CLI at `~/go/bin/do` provides subcommands (`list`, `ready`, `add`, `info`, `start`, `stop`, `done`, `annotate`, `modify`, `tag`, `priority`, `dep`, `delete`, `urgency`) that operate on agent-managed tasks in the current project. It is not a natural-language interface and does not understand skill names. Use normal subcommand syntax only.
+The task CLI at `~/go/bin/ask` provides subcommands (`list`, `ready`, `add`, `info`, `start`, `stop`, `done`, `annotate`, `modify`, `tag`, `priority`, `dep`, `delete`, `urgency`) that operate on agent-managed tasks in the current project. It is not a natural-language interface and does not understand skill names. Use normal subcommand syntax only.
Valid examples:
-- `~/go/bin/do list`
-- `~/go/bin/do ready`
-- `~/go/bin/do add +cli "Add feature X"` # prints `created task <alias-id>`
-- `~/go/bin/do add +cli depends:0,1 "Add feature X"`
-- `~/go/bin/do info <id>`
-- `~/go/bin/do start <id>`
-- `~/go/bin/do annotate <id> "progress note"`
-- `~/go/bin/do done <id>`
+- `~/go/bin/ask list`
+- `~/go/bin/ask ready`
+- `~/go/bin/ask add +cli "Add feature X"` # prints `created task <alias-id>`
+- `~/go/bin/ask add +cli depends:0,1 "Add feature X"`
+- `~/go/bin/ask info <id>`
+- `~/go/bin/ask start <id>`
+- `~/go/bin/ask annotate <id> "progress note"`
+- `~/go/bin/ask done <id>`
Invalid examples:
-- `~/go/bin/do agent-task-management ...`
-- `~/go/bin/do list tasks`
-- `~/go/bin/do show task 298`
-- any other natural-language phrasing passed to `~/go/bin/do`
+- `~/go/bin/ask agent-task-management ...`
+- `~/go/bin/ask list tasks`
+- `~/go/bin/ask show task 298`
+- any other natural-language phrasing passed to `~/go/bin/ask`
-**Alias IDs are the selectors to use for task work.** `~/go/bin/do add` prints `created task <alias-id>`, and subsequent task commands in this workflow should keep using that alias ID throughout the workflow.
+**Alias IDs are the selectors to use for task work.** `~/go/bin/ask add` prints `created task <alias-id>`, and subsequent task commands in this workflow should keep using that alias ID throughout the workflow.
## Context and compaction
diff --git a/prompts/skills/agent-task-management/references/00-context.md b/prompts/skills/agent-task-management/references/00-context.md
index c4f3110..6d9d008 100644
--- a/prompts/skills/agent-task-management/references/00-context.md
+++ b/prompts/skills/agent-task-management/references/00-context.md
@@ -6,7 +6,7 @@ Load this with any of the action files (1–5) when working with tasks. It defin
## Rules that apply to all task commands
-- **Always use `~/go/bin/do <subcommand>` for all task operations.** The task CLI is installed at `~/go/bin/do` and provides subcommands (`list`, `ready`, `add`, `info`, `start`, `stop`, `done`, `annotate`, `modify`, `tag`, `priority`, `dep`, `delete`, `urgency`) that operate on agent-managed tasks. It is not a natural-language interface and does not understand skill names.
-- **Shell note:** The full path avoids zsh treating `do` as a reserved word. If you invoke a copy on `PATH` named `do`, use `command do …` or `\do …` from an interactive zsh shell.
+- **Always use `~/go/bin/ask <subcommand>` for all task operations.** The task CLI is installed at `~/go/bin/ask` and provides subcommands (`list`, `ready`, `add`, `info`, `start`, `stop`, `done`, `annotate`, `modify`, `tag`, `priority`, `dep`, `delete`, `urgency`) that operate on agent-managed tasks. It is not a natural-language interface and does not understand skill names.
+- **Shell note:** Prefer `~/go/bin/ask` (full path) so the correct binary is used regardless of `PATH`. The binary name is `ask` (not a zsh reserved word).
- **One task in progress per project.** Do not start a second task while another is started and not completed, unless the user explicitly asks.
- **Parallel work via sub-agents** — the agent may spawn sub-agents to work on tasks in parallel if those tasks would not conflict each other.
diff --git a/prompts/skills/agent-task-management/references/1-create-task.md b/prompts/skills/agent-task-management/references/1-create-task.md
index ad7b11a..5755475 100644
--- a/prompts/skills/agent-task-management/references/1-create-task.md
+++ b/prompts/skills/agent-task-management/references/1-create-task.md
@@ -9,7 +9,7 @@ Use with `00-context.md`. Project name and global rules apply. New tasks get `+a
- **Every task MUST have at least one tag** for sub-project/feature/area (e.g. `+integrationtests`, `+flamegraph`, `+bpf`, `+cli`, `+refactor`, `+bugfix`).
- **After creating a task, add annotation** — one with the agent workflow reminder:
```
- ~/go/bin/do annotate <id> "Agent workflow: load the agent-task-management skill as instructions only, not as a shell command. Use only normal ~/go/bin/do subcommand syntax. Also load and apply: (1) the best-practices skill for the programming language used in the project, (2) solid-principles. When all tests and sub-agent reviews pass, commit and automatically progress to the next ready task."
+ ~/go/bin/ask annotate <id> "Agent workflow: load the agent-task-management skill as instructions only, not as a shell command. Use only normal ~/go/bin/ask subcommand syntax. Also load and apply: (1) the best-practices skill for the programming language used in the project, (2) solid-principles. When all tests and sub-agent reviews pass, commit and automatically progress to the next ready task."
```
- **Include references to all context required** to work on the task. So that work can be done with a fresh context, every task must list or link everything needed: relevant files, docs, specs, other tasks, or project guidelines (e.g. paths, doc links, `AGENTS.md`, `README` sections). Put these in the task description or in an initial annotation so that an agent starting with no prior conversation has everything they need in the task itself.
@@ -17,28 +17,28 @@ Use with `00-context.md`. Project name and global rules apply. New tasks get `+a
## Add a task
-`~/go/bin/do add` already injects `project:<name> +agent`, so only add the extra feature tag(s), optional priority, optional `depends:` modifier, and description.
+`~/go/bin/ask add` already injects `project:<name> +agent`, so only add the extra feature tag(s), optional priority, optional `depends:` modifier, and description.
**Each part must be a separate shell argument — never quote tag and description together:**
```bash
-~/go/bin/do add +<tag> "Description"
-~/go/bin/do add priority:H +<tag> "Description"
-~/go/bin/do add priority:M +<tag> "Description"
-~/go/bin/do add +<tag> depends:<id1>,<id2> "Description"
+~/go/bin/ask add +<tag> "Description"
+~/go/bin/ask add priority:H +<tag> "Description"
+~/go/bin/ask add priority:M +<tag> "Description"
+~/go/bin/ask add +<tag> depends:<id1>,<id2> "Description"
```
Do NOT do this (causes tag/priority to appear in the description instead of being applied):
```bash
-~/go/bin/do add "+<tag> Description" # wrong: tag and desc in one quoted string
-~/go/bin/do add "+<tag> -p M Description" # wrong: everything in one quoted arg
+~/go/bin/ask add "+<tag> Description" # wrong: tag and desc in one quoted string
+~/go/bin/ask add "+<tag> -p M Description" # wrong: everything in one quoted arg
```
-`~/go/bin/do add` prints `created task <alias-id>`. Reuse that alias ID directly for follow-up commands:
+`~/go/bin/ask add` prints `created task <alias-id>`. Reuse that alias ID directly for follow-up commands:
```bash
-id=$(~/go/bin/do add +<tag> "Description" | sed -n 's/^created task //p')
-~/go/bin/do annotate "$id" "Agent workflow: load the agent-task-management skill as instructions only, not as a shell command. Never run ~/go/bin/do agent-task-management ... or other natural-language ~/go/bin/do commands. Use only normal ~/go/bin/do subcommand syntax. Also load and apply: (1) the best-practices skill for the programming language used in the project, (2) solid-principles, and (3) beyond-solid-principles. When all tests and sub-agent reviews pass, commit and automatically progress to the next ready task."
+id=$(~/go/bin/ask add +<tag> "Description" | sed -n 's/^created task //p')
+~/go/bin/ask annotate "$id" "Agent workflow: load the agent-task-management skill as instructions only, not as a shell command. Never run ~/go/bin/ask agent-task-management ... or other natural-language ~/go/bin/ask commands. Use only normal ~/go/bin/ask subcommand syntax. Also load and apply: (1) the best-practices skill for the programming language used in the project, (2) solid-principles, and (3) beyond-solid-principles. When all tests and sub-agent reviews pass, commit and automatically progress to the next ready task."
```
## With dependency
@@ -46,13 +46,13 @@ id=$(~/go/bin/do add +<tag> "Description" | sed -n 's/^created task //p')
Add dependencies inline during task creation:
```bash
-id=$(~/go/bin/do add +<tag> depends:<dep-id> "Description" | sed -n 's/^created task //p')
+id=$(~/go/bin/ask add +<tag> depends:<dep-id> "Description" | sed -n 's/^created task //p')
```
Multiple dependencies:
```bash
-id=$(~/go/bin/do add +<tag> depends:<dep-id1>,<dep-id2> "Description" | sed -n 's/^created task //p')
+id=$(~/go/bin/ask add +<tag> depends:<dep-id1>,<dep-id2> "Description" | sed -n 's/^created task //p')
```
After adding (with or without dependency), run the same annotations using that alias ID directly.
@@ -61,6 +61,6 @@ After adding (with or without dependency), run the same annotations using that a
- **Keep tasks small:** each task should be a chunk that fits in the context window (description + refs + work to do). Split large efforts into multiple dependent tasks.
- Pick or create a meaningful tag for the sub-project or feature.
-- **Always check for dependencies:** before adding a task, determine if it depends on other tasks in the project; if so, add `depends:<id>,...` during `~/go/bin/do add`.
+- **Always check for dependencies:** before adding a task, determine if it depends on other tasks in the project; if so, add `depends:<id>,...` during `~/go/bin/ask add`.
- Add dependencies when one task must complete before another can start.
- When creating a task, add references to all required context (files, docs, specs) so the task is self-contained for fresh-context work.
diff --git a/prompts/skills/agent-task-management/references/2-start-task.md b/prompts/skills/agent-task-management/references/2-start-task.md
index 074ed2d..45a67a9 100644
--- a/prompts/skills/agent-task-management/references/2-start-task.md
+++ b/prompts/skills/agent-task-management/references/2-start-task.md
@@ -15,7 +15,7 @@ The task itself should already contain references to all required context (added
## Finding a task
```bash
-~/go/bin/do ready | head
+~/go/bin/ask ready | head
```
## Mark task as started
@@ -23,7 +23,7 @@ The task itself should already contain references to all required context (added
When you begin working on a task, **always mark it as started** so current work is visible:
```bash
-~/go/bin/do start <id>
+~/go/bin/ask start <id>
```
Do this as soon as you start work on the task.
@@ -31,6 +31,6 @@ Do this as soon as you start work on the task.
## Conventions
- Start each new task with a fresh context; rely on the task's description and annotations for all required context.
-- Run `~/go/bin/do start <id>` when you start working on the task, not only when listing or completing.
+- Run `~/go/bin/ask start <id>` when you start working on the task, not only when listing or completing.
- Do not start a second task for the same project while one is already started and not done, unless the user explicitly asks.
- When a task is selected via the review/overview step, use the alias ID from the list or task details for subsequent `start` operations.
diff --git a/prompts/skills/agent-task-management/references/3-complete-task.md b/prompts/skills/agent-task-management/references/3-complete-task.md
index 3e18125..065613b 100644
--- a/prompts/skills/agent-task-management/references/3-complete-task.md
+++ b/prompts/skills/agent-task-management/references/3-complete-task.md
@@ -45,19 +45,19 @@ If the answer suggests improvements or inconsistencies, address them first. Only
6. Only then:
```bash
-~/go/bin/do done <id>
+~/go/bin/ask done <id>
```
Use the alias ID from the selection step or current task details when marking the task complete.
-7. **Automatically progress to the next task in the list.** After marking the task done, if there are more agent-managed tasks in the project (e.g. `~/go/bin/do list` shows pending/ready tasks), start the next one: load `00-context.md` and `2-start-task.md`, pick the next task from the list (respecting dependencies and "one task in progress" rule), and begin work on it. Do not stop after completing a task when a next task is available — continue to the next task in the list.
+7. **Automatically progress to the next task in the list.** After marking the task done, if there are more agent-managed tasks in the project (e.g. `~/go/bin/ask list` shows pending/ready tasks), start the next one: load `00-context.md` and `2-start-task.md`, pick the next task from the list (respecting dependencies and "one task in progress" rule), and begin work on it. Do not stop after completing a task when a next task is available — continue to the next task in the list.
## Conventions
- When creating or changing tests, add negative tests (invalid input, errors, failure paths) wherever plausible; the review sub-agent will check for this.
- A task is not done until: best practices met, code compiles, all tests pass, negative tests included where plausible, and all first-round review comments are addressed (including coverage and test-quality checks), **and all changes are committed to git**. If code changed after review comments, a second sub-agent review must confirm the updated code.
- Before every sub-agent review handoff, do the self-review: "Did it all make sense? Is there a better way?" Fix anything that comes up, then hand off.
-- **On completion, commit all changes to git** before running `~/go/bin/do done <id>`; do not leave uncommitted work when marking a task complete.
-- Complete with `~/go/bin/do done <id>` only after completion criteria, self-review(s), first review, addressing all comments, and git commit are satisfied. Add a follow-up sub-agent review only when code changed after review comments.
+- **On completion, commit all changes to git** before running `~/go/bin/ask done <id>`; do not leave uncommitted work when marking a task complete.
+- Complete with `~/go/bin/ask done <id>` only after completion criteria, self-review(s), first review, addressing all comments, and git commit are satisfied. Add a follow-up sub-agent review only when code changed after review comments.
- When completing a task, note which tasks were unblocked (dependents that became ready), if any.
-- **After completing a task, automatically progress to the next task in the list** (when all tests and required sub-agent review(s) pass and the task is done). Start the next ready task from `~/go/bin/do ready`; do not stop unless no next task is available or the user asks to stop.
+- **After completing a task, automatically progress to the next task in the list** (when all tests and required sub-agent review(s) pass and the task is done). Start the next ready task from `~/go/bin/ask ready`; do not stop unless no next task is available or the user asks to stop.
diff --git a/prompts/skills/agent-task-management/references/4-annotate-update-task.md b/prompts/skills/agent-task-management/references/4-annotate-update-task.md
index b32f90f..6911910 100644
--- a/prompts/skills/agent-task-management/references/4-annotate-update-task.md
+++ b/prompts/skills/agent-task-management/references/4-annotate-update-task.md
@@ -9,13 +9,13 @@ When working on a task, **always read the full context:** description, summary,
View full task (including annotations):
```bash
-~/go/bin/do info <id>
+~/go/bin/ask info <id>
```
## Annotate a task
```bash
-~/go/bin/do annotate <id> "Note about progress or context"
+~/go/bin/ask annotate <id> "Note about progress or context"
```
While making progress, **add annotations** to reflect progress, challenges, or decisions. You may refer to files, documents, or other resources (paths, doc links, snippets) so the task history stays useful for later work and for the pre-completion review.
@@ -25,17 +25,17 @@ Whenever you mention another task inside an annotation (for example, as a depend
## Modify a task
```bash
-~/go/bin/do modify <id> +<tag>
-~/go/bin/do dep add <id> <dep-id>
-~/go/bin/do modify <id> priority:H
+~/go/bin/ask modify <id> +<tag>
+~/go/bin/ask dep add <id> <dep-id>
+~/go/bin/ask modify <id> priority:H
```
-Use the alias ID shown by `~/go/bin/do list`, `~/go/bin/do ready`, or `~/go/bin/do info` when modifying tasks selected earlier or referenced from annotations or other docs.
+Use the alias ID shown by `~/go/bin/ask list`, `~/go/bin/ask ready`, or `~/go/bin/ask info` when modifying tasks selected earlier or referenced from annotations or other docs.
## Delete a task
```bash
-~/go/bin/do delete <id>
+~/go/bin/ask delete <id>
```
## Conventions
diff --git a/prompts/skills/agent-task-management/references/5-review-overview-tasks.md b/prompts/skills/agent-task-management/references/5-review-overview-tasks.md
index 3ad76a2..9045a65 100644
--- a/prompts/skills/agent-task-management/references/5-review-overview-tasks.md
+++ b/prompts/skills/agent-task-management/references/5-review-overview-tasks.md
@@ -7,13 +7,13 @@ Use with `00-context.md`. Project name and global rules apply.
Only list tasks that have `+agent` (project + tag matching). When listing, order by **priority first, then urgency**:
```bash
-~/go/bin/do list sort:priority-,urgency-
+~/go/bin/ask list sort:priority-,urgency-
```
By tag (keep `+agent`, same order):
```bash
-~/go/bin/do list +<tag> sort:priority-,urgency-
+~/go/bin/ask list +<tag> sort:priority-,urgency-
```
## Picking what to work on (next task)
@@ -23,14 +23,14 @@ By tag (keep `+agent`, same order):
**Check already-started tasks first.** Before suggesting or starting a new task:
```bash
-~/go/bin/do list start.any: sort:priority-,urgency-
+~/go/bin/ask list start.any: sort:priority-,urgency-
```
- If any tasks are already started, **use one of those** (pick by priority, then urgency) — do not start a second task unless the user explicitly asks.
- Only if no tasks are in progress, show the next actionable (READY) task, ordered by priority then urgency:
```bash
-~/go/bin/do ready
+~/go/bin/ask ready
```
Once you have chosen a task from one of these lists, **use its alias ID** from the list output for all subsequent operations and handoffs. When returning or recording the chosen task for another agent or a later step, **include its alias ID**.
@@ -38,7 +38,7 @@ Once you have chosen a task from one of these lists, **use its alias ID** from t
## View task details
```bash
-~/go/bin/do info <id>
+~/go/bin/ask info <id>
```
Always read description, summary, and **all annotations** when working on or reviewing a task.
@@ -48,14 +48,14 @@ Always read description, summary, and **all annotations** when working on or rev
Dependency tree (all agent tasks):
```bash
-~/go/bin/do list
+~/go/bin/ask list
```
Blocked vs ready (with `+agent`):
```bash
-~/go/bin/do list +BLOCKED sort:priority-,urgency-
-~/go/bin/do ready
+~/go/bin/ask list +BLOCKED sort:priority-,urgency-
+~/go/bin/ask ready
```
## Conventions
diff --git a/prompts/skills/music-collection/SKILL.md b/prompts/skills/music-collection/SKILL.md
new file mode 100644
index 0000000..8bdca34
--- /dev/null
+++ b/prompts/skills/music-collection/SKILL.md
@@ -0,0 +1,217 @@
+---
+name: music-collection
+description: >-
+ Organizes, deduplicates, and tags local music with beets; triggers Navidrome
+ library rescans (including Kubernetes); re-indexes cmus; downloads from Tidal
+ with tiddl. Use when the user works on a music library, Navidrome, cmus, beets,
+ duplicate tracks, folder layout, full scan, or Tidal downloads (tiddl).
+---
+
+# Music collection (beets, Navidrome, cmus, tiddl)
+
+## Principles
+
+- **Sort/organize** = consistent tags + path templates + `beet move` (or import with `move`).
+- **Dedup** = find candidates by audio fingerprint or metadata keys, then delete or merge deliberately—never bulk-delete without confirming criteria.
+- **Navidrome** picks up changes after a **library scan** (paths and tags on disk).
+- **cmus** stores paths in `lib.pl` (text, not Perl) and tags in `cache`; re-index after path churn (see **cmus** section).
+- **tiddl** is third-party; personal-use only; respect Tidal ToS and local law.
+
+---
+
+## Beets: layout and “sorting”
+
+1. Point `directory` at the library root (the folder Navidrome mounts as music).
+2. Define `paths` (e.g. genre → album artist → album → track). Use `$albumartist`, `$album%aunique{}`, `$track`, `$title`.
+3. **Stable genre folders**: use the **inline** plugin with a computed field (e.g. `safe_genre`) that returns `Miscellaneous` when `genre` is empty and applies `.title()` so `electronic` and `Electronic` share one folder on case-sensitive filesystems.
+4. **Import** (non-interactive batch): `beet import -A -m -q --quiet-fallback=asis PATH` (`-m` move, `-A` skip autotag for speed, `-q` no prompts). For MusicBrainz tagging, omit `-A` (slower).
+5. After changing `paths` or inline fields: `beet move` to apply templates to items already in the DB.
+6. **Permissions**: if the music volume is not writable as the current user, run `beet` with elevated permissions or fix ownership; keep the **beets database** under the user’s home (e.g. `-c /path/to/config.yaml` and `library:` in that file).
+
+---
+
+## Beets: deduplication
+
+Enable the **duplicates** plugin in config (`plugins: duplicates`) and configure how “same track” is defined.
+
+- **By audio content (strong)**: use `duplicates: checksum: ffmpeg` (or another backend per beets docs) so identical audio is detected even if tags differ.
+- **By metadata (weaker)**: keys such as `mb_trackid` or `fingerprint`—fast but misses true dupes with bad tags.
+
+Workflow:
+
+1. `beet duplicates -c` (or equivalent) to **count** / preview groups—consult `beet duplicates --help` for the installed beets version.
+2. Inspect a few groups (paths, tags, bitrate).
+3. Remove or merge only after explicit criteria (e.g. keep highest bitrate, or keep file already under the canonical path template). Prefer `beet remove` / `beet modify` on a **narrow query** over blind `-d` flags.
+
+Optional: **import** with `duplicate_action` / incremental import settings to reduce future dupes.
+
+---
+
+## Navidrome: full rescan
+
+Navidrome reflects **on-disk** paths and embedded tags after a scan.
+
+### Same host as the music volume
+
+If the `navidrome` binary is available and paths match the server:
+
+```bash
+navidrome scan --full --datafolder /path/to/data --musicfolder /path/to/music --cachefolder /path/to/cache -l info -n
+```
+
+Use the same `--datafolder`, `--musicfolder`, and `--cachefolder` as the running server (see process env e.g. `ND_DATAFOLDER`, `ND_MUSICFOLDER`, or deployment mounts).
+
+### Kubernetes (exec into the pod)
+
+Long scans can **outlive `kubectl exec`**; run **detached** inside the container so API disconnects do not kill the scan:
+
+```bash
+kubectl exec -n NAMESPACE POD -- sh -c \
+ 'nohup /app/navidrome scan --full --datafolder /data --musicfolder /music --cachefolder /data/cache -l info -n >> /data/scan-manual.log 2>&1 &'
+```
+
+Monitor:
+
+```bash
+kubectl exec -n NAMESPACE POD -- tail -f /data/scan-manual.log
+```
+
+**Caveat:** scanner and server share the SQLite DB; if corruption or locking appears, run scan with Navidrome stopped (deployment scaled to 0), then start again.
+
+---
+
+## cmus: re-index the library
+
+cmus is a **C** program; it does **not** use Perl. **`lib.pl`** is only a **plain-text list of absolute paths** (one per line)—the suffix is cmus naming, not Perl source.
+
+Library state lives under **`${XDG_CONFIG_HOME:-$HOME/.config}/cmus/`**:
+
+| File | Role |
+|------|------|
+| `lib.pl` | Every track path cmus knows about |
+| `cache` | Binary tag/metadata cache (safe to delete to force rescan) |
+| `autosave` | Options and bindings (do not delete casually) |
+
+After **beets `move`**, **tiddl** downloads, or any **tree reshuffle**, `lib.pl` can still list old paths until you re-index. Use the **same music root** as Navidrome (e.g. `/data/nfs/k3svolumes/navidrome/music`).
+
+### Check before rewriting files
+
+```bash
+cmus-remote -Q 2>/dev/null || true # expect "cmus is not running" for offline rewrite
+```
+
+### Offline re-index (cmus stopped)
+
+Timestamped backup, regenerate `lib.pl`, remove `cache`:
+
+```bash
+set -e
+MUSIC=/data/nfs/k3svolumes/navidrome/music
+CMUS="${XDG_CONFIG_HOME:-$HOME/.config}/cmus"
+TS=$(date +%Y%m%d-%H%M%S)
+
+cp -a "$CMUS/lib.pl" "$CMUS/lib.pl.bak.$TS"
+test -f "$CMUS/cache" && cp -a "$CMUS/cache" "$CMUS/cache.bak.$TS" || true
+
+find "$MUSIC" -type f \( \
+ -iname '*.flac' -o -iname '*.mp3' -o -iname '*.m4a' -o -iname '*.ogg' \
+ -o -iname '*.opus' -o -iname '*.wav' -o -iname '*.wv' -o -iname '*.mpc' \
+ -o -iname '*.aac' \
+\) 2>/dev/null | LC_ALL=C sort -u >"$CMUS/lib.pl.tmp"
+mv "$CMUS/lib.pl.tmp" "$CMUS/lib.pl"
+rm -f "$CMUS/cache"
+```
+
+Start cmus afterward; the **first launch** may take a while while the cache rebuilds.
+
+### Live re-index (`cmus-remote`, cmus already running)
+
+In the cmus `:` prompt, or:
+
+```bash
+cmus-remote -C 'clear -l'
+cmus-remote -C 'add -l /data/nfs/k3svolumes/navidrome/music'
+cmus-remote -C 'update-cache -f'
+```
+
+`update-cache -f` forces a full metadata refresh (same idea as deleting `cache`).
+
+**Note:** the cmus UI wants a real TTY; `cmus-remote` only works when cmus is already running.
+
+### After a full library maintenance pass
+
+Typical order: **beets** (organize/tags) → **Navidrome** full scan → **cmus** re-index (offline script above, or `clear -l` / `add -l` / `update-cache -f`).
+
+---
+
+## tiddl: Tidal downloads
+
+[tiddl](https://github.com/oskvr37/tiddl) is a Python CLI (PyPI: `tiddl`). Requires **ffmpeg** for transcoding.
+
+**Install:** `uv tool install tiddl` or `pip install tiddl` (see project README for current Python version requirements).
+
+**Auth (once):**
+
+```bash
+tiddl auth login
+```
+
+**Download by URL or short id:**
+
+```bash
+tiddl download url 'https://tidal.com/browse/track/...'
+tiddl download url 'album/123456789'
+tiddl download url 'playlist/...' --skip-errors
+```
+
+### Batch download from a list file (`tidal.txt`)
+
+Put one playlist/album/track URL or short id per line (e.g. `playlist/…`, `https://listen.tidal.com/…`).
+
+**Fish outer, bash inner:** The interactive shell is **fish**; each line runs in **`bash -c`** so `source …/bin/activate` works (Python venv activation is bash/POSix-oriented). Fish owns the loop and closes with **`end`**; there is no `do`/`done` in fish—only the inner bash sees a one-shot `-c` script.
+
+```fish
+cat tidal.txt | while read -l playlist
+ bash -c 'source ~/git/upstream/tiddl/.venv/bin/activate && tiddl download url "$1" --skip-errors' _ "$playlist"
+end
+```
+
+- Use **`"$1"`** with a dummy **`$0`** (`_`) so the URL/id is one argument even with spaces.
+- Add `--skip-errors` inside the single-quoted `bash -c` string if you want the batch to continue past bad playlist entries.
+- Optionally skip blanks or `#` lines before calling `bash -c` (e.g. `string trim`, `string match -q '#*'`).
+
+**Pure bash/zsh (optional):** If you are already in bash, activating the venv **once** then looping avoids one bash subprocess per line:
+
+```bash
+source ~/git/upstream/tiddl/.venv/bin/activate
+while IFS= read -r playlist || [[ -n "$playlist" ]]; do
+ [[ -z "${playlist// }" || "$playlist" =~ ^[[:space:]]*# ]] && continue
+ tiddl download url "$playlist" --skip-errors
+done < tidal.txt
+```
+
+**Quality:** configure in `~/.tiddl/config.toml` (LOW / NORMAL / HIGH / MAX → m4a or flac per docs).
+
+**Output layout:** set templates in config so downloads land under the same root beets/Navidrome use (e.g. artist/album/track), reducing later `beet import` churn.
+
+After downloading, run **beets import** (and/or **Navidrome scan**) and **cmus re-index** as above.
+
+---
+
+## Quick reference
+
+| Goal | Tool | Command / note |
+|------|------|----------------|
+| Rename/move to template | beets | `beet move` after `paths` / inline fields |
+| Fix genre folder casing | beets | `safe_genre` with `.title()` + `beet move` |
+| Tag files from DB | beets | `beet write` |
+| Find duplicate files | beets | `duplicates` plugin + `beet duplicates …` |
+| Refresh Navidrome DB | navidrome | `navidrome scan --full` with correct folders |
+| Re-index cmus | cmus | Offline: backup `lib.pl`/`cache`, `find` → `lib.pl`, `rm cache`; live: `cmus-remote -C 'clear -l'` then `add -l ROOT` then `update-cache -f` |
+| Download from Tidal | tiddl | `tiddl auth login` → `tiddl download url …` |
+
+---
+
+## Optional deep dive
+
+For beets duplicate plugin options and checksum backends, read the official beets documentation for the installed version when tuning `duplicates:` in config.