fix(skills): harden remember/recall wrappers against downstream Qodo findings (0.9.3)#22
Conversation
…findings (0.9.3) The remember/recall skill wrappers fan out byte-verbatim (via rollout-cli's eidetic-memory recipe) into 57 AgentCulture repos. Qodo's 215 findings across those PRs collapse to a handful of root causes that can only be fixed upstream here — a fix anywhere else is overwritten on the next rollout. Eight fixes, confined to the two wrapper scripts + their SKILL.md (no Python/schema/storage): - FIX-1/7 resolve_eidetic: drop the unreachable uv-checkout fallback claim in vendored copies; not-found prints one honest single-line `hint:`. - FIX-2 remember.sh: guard the no-arg interactive invocation ([ -t 0 ]) so it prints usage and exits instead of blocking on stdin; batch NDJSON unchanged. - FIX-3 SKILL.md + descriptions: $HOME/.eidetic/memory (was ~/.eidetic/memory) so downstream cicd portability-lint stops failing. - FIX-4 remember.sh usage: replace stale "Public data only." with the actual private-by-default behavior. - FIX-5 scope resolution: warn on stderr instead of silently downgrading an expected-private record to the public default scope. - FIX-6 recall.sh: treat bareword `help` as a query; empty query is now a hint:+non-zero error, not exit 0. - FIX-8 resolve_scope: `|| true` guards the suffix parse against pipefail SIGPIPE. Deferred (parked): parent-dir traversal guard, SKILL.md line length. Rollout-recipe issues (provenance ledger / uv.lock / CHANGELOG) are out of scope here and belong to rollout-cli. Spec + frame from /think included under docs/specs and .devague. Verified: shellcheck clean; pty test proves no TTY hang; rubric green; 304 tests pass. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VH4e7v8VZNcKHy4tzrJUVm
PR Summary by QodoHarden remember/recall skill wrappers for downstream vendoring (0.9.3) Description
Diagram
High-Level Assessment
Files changed (9)
|
Code Review by Qodo
Context used✅ Compliance rules (platform):
27 rules 1.
|
…g 1) The FIX-5 warning fired on `! has_flag --scope` alone, which made it both inaccurate and misleading: - with `--visibility private` but no `--scope`, the record actually lands in default/private, yet the warning claimed "public"; - the text said `--visibility` could silence it, but only `--scope` did. Now warn ONLY when neither `--scope` nor `--visibility` is supplied (the sole case where the fallback truly is the public default), and the message matches: either flag is a deliberate, honored choice and silences the warning. Verified across all five flag combinations; shellcheck clean. Finding 2 (TTY stdin guard blocks interactive typing) is intentional: this is an agent-first tool, the documented stdin mode is piped (unaffected), and fail-fast prevents the far more common accidental agent hang. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VH4e7v8VZNcKHy4tzrJUVm
|
Thanks Qodo — both findings triaged. Finding 1 (Misleading scope warning) — valid, fixed in Finding 2 (TTY stdin ingest blocked) — acknowledged, intentional (won't change). This is an agent-first tool: the dominant caller is an agent/automation, and the dominant failure mode is an accidental no-arg invocation that blocks forever on Both wrapper scripts:
|
Thanks for the clear triage.
The wrapper scripts sound good overall: shellcheck clean, rubric green, and tests passing. |
|



What
The
remember/recallskill wrappers fan out byte-verbatim (via rollout-cli'seidetic-memoryrecipe) into 57 AgentCulture repos. Qodo's 215 findings across those PRs collapse to a handful of root causes — and because the copies are byte-identical, the only durable fix is upstream here; a fix anywhere downstream is overwritten on the next rollout (~57× leverage).Triaged via
/think→ converged spec atdocs/specs/2026-06-23-…wrappers-are-h.md(frame under.devague/). Eight fixes, confined to the two wrapper scripts + their SKILL.md — no eidetic Python, schema, ranking, or storage touched.resolve_eidetic's uv-checkout fallback can never fire in a vendored copy, yet the hint implied it couldhint:remember.shblocks forever on a no-arg interactive invocation (no guard;recall.shhad one)[ -t 0 ]→ print usage + exit; piped NDJSON batch path unchanged~/.eidetic/memory×5 in SKILL.md trips downstream cicdportability-lint(~/\.[A-Za-z], no carve-out)$HOME/.eidetic/memory(also fixes the loaded skill descriptions)--helpsaid "Public data only." but the wrapper defaults to--visibility private(stale since the private-default flip)--visibility publicoverrides--jsonrecall.sh "help"printed usage instead of searching; empty query exited 0helpis a query; only-h/--help= usage; empty query =hint:+ non-zeroresolve_scopesuffix parse could SIGPIPE underset -o pipefail|| trueguardDeferred (parked, non-blocking): parent-dir traversal guard, SKILL.md line length.
Out of scope → rollout-cli (recipe PR, not this repo): recipe not updating the consumer provenance ledger /
skill-sources.md/ README skill-count,uv.lockrefresh, CHANGELOG ordering, delta-check note.Won't-fix false positives: exit-codes-0/1/2 (conflicts with eidetic's own 0/1/2/3+ contract + intentional
execpassthrough),--apply/dry-run (ingest isn't destructive), "requires external CLI" (the subprocess boundary is the design).Verification
shellcheckclean on both scripts;bash -nOKremember.shon a real TTY exits cleanly (no hang); piped batch path bypasses the guardrecall.sh "help"→ searches (no usage);recall.sh ""→hint:+ exit 1;--help→ usage + exit 0culture.yamlresolves (silent inside this repo)grep -nE '~/\.[A-Za-z]'over both SKILL.md → clean (portability-lint passes)teken cli doctor . --strictrubric → PASS;pytest -n auto→ 304 passed, 2 skippeduv.lockrelocked to 0.9.3 (also cleared pre-existing 0.9.0 drift)Follow-up
After merge: re-sync the rollout-cli
eidetic-memoryrecipe (re-vendor the corrected bytes) and re-run the fan-out to refresh the 57 open PRs.🤖 Generated with Claude Code