ab1e514f78
All four checks pass on the baked 1.6.0 artifact (skills register + precedence, allowed-tools, operator-only sweep/triage, CoWork $ECHO fallback). Caveat noted: allowed-tools globs match literal script names, not the "$ECHO" variable form — re-confirm on the Claude Code CLI if that surface becomes routine. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
80 lines
4.9 KiB
Markdown
80 lines
4.9 KiB
Markdown
# echo-memory — v1.6 TODO
|
||
|
||
> Working list for the next minor release. Started 2026-07-03, right after 1.5.1
|
||
> shipped. **Add findings from 1.5.x live testing to the "Surfaced in testing"
|
||
> section as they come up** — that's what this doc is for.
|
||
|
||
## 1. Migrate the eight slash commands to the skills format
|
||
|
||
The installer flags the plugin's `commands/` directory as the legacy format
|
||
("Both formats work — consider migrating to skills/*/SKILL.md"). Confirmed against
|
||
the official docs (code.claude.com/docs/en/skills.md, plugins.md):
|
||
|
||
- **Non-breaking.** `commands/echo-save.md` → `skills/echo-save/SKILL.md` keeps the
|
||
invocation name: `/echo-save` works identically. No deprecation date on `commands/`;
|
||
this is future-proofing, not a fire.
|
||
- **Do it for the features, not the notice:**
|
||
- [x] `allowed-tools` per skill — **done 1.6.0** (all eight skills pre-authorize
|
||
the resolved `python3`/`python`/`py -3` invocations + the CoWork `ls` probe).
|
||
- [x] `disable-model-invocation: true` on the write-heavy entry points
|
||
(`/echo-sweep`, `/echo-triage`) — **done 1.6.0**; read-side stays
|
||
model-invocable.
|
||
- [x] De-duplicate the CoWork `$ECHO` path-resolution block — **resolved 1.6.0 as
|
||
not-supported**: per the official skills docs, skill directories are
|
||
self-contained (no cross-skill snippet sharing), so the 2-line block stays
|
||
per-skill. Docs confirmed same-name skill takes precedence over the legacy
|
||
command, so coexistence is safe.
|
||
- [x] `argument-hint` carries over as-is; `$ARGUMENTS` substitution unchanged —
|
||
**done 1.6.0** (save/recall/reflect).
|
||
- [x] Verify a migrated build installs cleanly on desktop **and** in a CoWork session
|
||
before deleting `commands/` — **verified 2026-07-28** on the baked 1.6.0-jason
|
||
artifact, all four checks pass: (1) all eight skills register and take
|
||
precedence over the coexisting legacy commands; (2) `allowed-tools` present on
|
||
load/health/recall; (3) `disable-model-invocation` confirmed on exactly
|
||
sweep+triage; (4) CoWork `$ECHO` fallback resolves via
|
||
`/sessions/*/mnt/.remote-plugins/*` and executes. **2.0's `commands/` deletion
|
||
is unblocked.** *Known caveat, accepted (CLI is not a normal operating surface
|
||
here): the `allowed-tools` globs match the literal script names
|
||
(`*echo.py*`/`*vault_lint.py*`) while the bodies invoke via the resolved
|
||
`"$ECHO"` variable — if the Claude Code CLI matches permissions before
|
||
variable expansion, those skills could still prompt there. Re-confirm on the
|
||
CLI if that surface ever matters.*
|
||
|
||
## 2. plugin.json completeness (from the old MAINTENANCE checklist)
|
||
|
||
- [x] Add `homepage` / repository URL — **done 1.6.0**: both `homepage` and
|
||
`repository` set to `https://git.alwisp.com/jason/echo`.
|
||
|
||
## 3. Vault follow-ups (noticed during the 1.5.0 dead-link cleanup)
|
||
|
||
Three of the 27 unwrapped "dead" links were actually **typos pointing at real notes**;
|
||
they were unwrapped per instruction but repointing them would restore real graph edges:
|
||
|
||
- [ ] `projects/active/forgerunner.md` + `_agent/sessions/2026-06-29-2200-forgerunner-v010-ship.md`:
|
||
"Gitea CI Docker jobs run on the host label" → the decision
|
||
`decisions/by-date/2026-06-29-gitea-ci-docker-jobs-run-on-the-host-lab.md` ("lab", not "label").
|
||
- [ ] `projects/active/mpm-brand-voice.md`: "Message Point Media (MPM)" ×3 → the company
|
||
note `resources/companies/mpm.md` (or whatever is canonical for MPM).
|
||
|
||
## 4. Surfaced in 1.5.x testing
|
||
|
||
*(add items here as the new plugin gets real use)*
|
||
|
||
- [x] **Lint blind spot: retired dirs masked by the leaf-README route** (found
|
||
2026-07-03; **fixed 1.6.0** — retired patterns now checked before routes, with
|
||
the `archive/notes/README.md` regression test).
|
||
`archive/` and `_agent/outputs/` are retired/unrouted pre-0.6 leftovers that survived
|
||
in the live vault holding only their seed READMEs — and the permissive `leaf-readme`
|
||
route (`^(.+/)?README\.md$`) matches first, so `vault_lint` never flagged them.
|
||
Fix: in the path-membership check, test the *directory* against retired/unknown
|
||
patterns even when the only file in it is a README (e.g. evaluate `dirname(path) + "/"`
|
||
against retired patterns before letting `leaf-readme` absolve the file), or drop the
|
||
seed-README exemption inside retired trees. Add a lint test seeding
|
||
`archive/notes/README.md` → must flag `retired-path`.
|
||
*Related learning (same cleanup, 2026-07-03):* the REST API **cannot delete
|
||
directories** — removing a folder's last file orphans the empty folder on disk
|
||
(the REST listing 404s, falsely reading as gone; Obsidian still shows it — manual
|
||
deletion required). Documented in `references/api-reference.md` › Deleting Files
|
||
and in the vault's `resources/references/obsidian-local-rest-api.md`. Any future
|
||
"remove retired tree" guidance must include the manual folder-cleanup step.
|