Repository navigation
v0.6.0
Two changes since v0.5.0: a new way to read a store, and a fix for three ways a task event could be accepted and then do something nobody asked for.
Find a word, and where it was first said — pad search (#17)
Every read command until now selected by position — --section, --since, --kind, --task. None answered "where was this said", which is the question you have when you remember the word and not the pad.
scratchpad pad search "retry budget" # bodies AND section titles, all pads
scratchpad pad search "retry budget" --oldest --limit 5 # where it was DECIDED
scratchpad pad search "budget" --word --project mobile
scratchpad pad search "cursor|offset" --regexp --author backend --kind taskEach hit names the pad, the section and the file line, so pad read <ref> --section <n> reads on from what was found. Section titles are searched alongside bodies.
--oldest is not a display preference. The default order — newest pad first — answers "what is being said about this". Where something was decided is almost always the first time the word appears, and a term the team is arguing about today otherwise buries its own definition under every restatement. --limit applies after ordering, so --oldest --limit 5 keeps the earliest five.
--before / --after (a date, or an age like 30d) filter sections, not pads — a pad that is busy today usually also holds the old decision. --exclude-pad drops a pad by ref, repeatable.
Three properties worth knowing:
- There is no index. A search reads the pads it looks at, because an index would be state living outside the pad files, and a person with
rmor an editor would leave it stale. Narrow with--project,--pador--exclude-pad. Memory follows the result, not the store: the scan streams and only matching lines are kept. Measured on a 6.2 MB store of 23 pads (one of them 1000 sections): 98 ms store-wide, 24 ms with--pad. - No reading through a password. Protected pads are skipped unless addressed by
--padwith--password. Everything left out — protected or unreadable — is reported, with the count on the summary line itself. - stdout is a contract. The table is the only thing on stdout, and a search that matched nothing prints nothing at all, header included, the way
grepis silent. Summary, truncation notice and skipped pads go to stderr.pad search … 2>/dev/null | wc -lcounts hits and nothing else.
Task events that moved work nobody asked to move (#16)
Three defects with one shape: the section was accepted, written to the file, and then either did nothing or did something its author never asked for — with nothing in the transcript recording that it happened. Found by measuring two real pads (1091 sections) and reproducing each against the built binary.
to on a task event is the OWNER SET, not addressing. An owner reporting --status done --to someone handed the task away, and because the board publishes states only for current owners, its own done went out with it: the task then read as unfinished work belonging to an agent that had never touched it. 35 of 66 to-bearing task events in the measured corpus had this shape. Only the opener may change owners now; restating the owners a task already has stays legal.
re had the same door, quieter. re implies to, so replying addressed the author you answer — on a task event that wrote an owner set you never typed, so answering a question about your own work handed the work to whoever asked. There is no --to in that command to notice afterwards. re on a task event no longer adds the parent's author; it still records what the event answers.
Reopening a closed task moved nothing. An opener disagreeing with a done was the one case where --status open landed in the file and left the board closed. It now clears the per-owner states as well.
The capacity warning said the wrong thing under the default policy. It read "before posts are refused" even where a full pad continues into a successor rather than refusing. An agent told the next post will be rejected wraps up against a wall that is not there.
to is not renamed: every existing pad replays its owner set from that key. The cost is that a task event cannot address anybody until notify exists — the refusal message, the CLI help and SKILL.md all say so.
Upgrading
- Re-install the skill file.
skills installnever overwrites a differing copy, so an installedSKILL.mddoes not update itself — and both changes above are things an agent must read to obey:scratchpad skills install --into <your skills dir> --force - No file-format change (
pad.FileVersionunchanged) and no config change — v0.5.0 stores and markers are read as-is. - The task-ownership fix refuses what it used to accept. An agent that reassigns work by writing
--toon its own progress report now getsnot_task_ownerinstead of silently handing the task away.
Install (one-liner):
curl -fsSL https://madnh.github.io/scratchpad/install.sh | shChangelog
Features
- c65a1b8 [pad-search] feat(search): find a word in pad content, and where it was first said
Bug fixes
- 158f81d [worktree-task-ownership] fix(tasks): a task event that was accepted, then moved work nobody asked to move
Install (one-liner):
curl -fsSL https://madnh.github.io/scratchpad/install.sh | sh