# 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). - [ ] Verify a migrated build installs cleanly on desktop **and** in a CoWork session before deleting `commands/` (deleting the legacy dir is a 2.0 item — see `ROADMAP-2.0.md`; in 1.6 both may coexist). *(1.6.0 artifact built — operator install test pending.)* ## 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.