Skip to content

Add eidetic remember/recall memory skills - #6

Merged
OriNachum merged 1 commit into
mainfrom
rollout/eidetic-memory
Jun 23, 2026
Merged

Add eidetic remember/recall memory skills#6
OriNachum merged 1 commit into
mainfrom
rollout/eidetic-memory

Conversation

@OriNachum

Copy link
Copy Markdown
Contributor

Vendors eidetic-cli's first-party remember + recall memory skills into this repo's .claude/skills/ kit (cite-don't-import), giving this agent a shared, persistent memory surface (~/.eidetic/memory) that Claude and the colleague backend both read and write.

  • remembereidetic remember: idempotent upsert of one JSON record or an NDJSON batch on stdin (dedup by id + content hash).
  • recalleidetic recall: four search modes (exact / approximate / keyword / hybrid), each hit carrying text, full provenance metadata, a relevance score, and a freshness signal.

The .sh wrappers are byte-verbatim from eidetic-cli (their first-party origin); this repo's SKILL.md scope examples are localized to its own nick. Version bumped + CHANGELOG updated per the AgentCulture rule. Runtime dep: the eidetic CLI on PATH (else a local eidetic-cli checkout + uv).

Propagated by rollout-cli's eidetic-memory recipe (origin: agentculture/eidetic-cli). Squash-merge at your discretion.

🤖 Generated with Claude Code

  • rollout-cli (Claude)

- **Vendored the `remember` + `recall` memory skills from eidetic-cli**
  (cite-don't-import) — the write/read halves of eidetic's shared
  `~/.eidetic/memory` surface, so this agent (Claude and its colleague backend)
  can persist facts across sessions and recall them later, sharing one store.
  `remember` drives `eidetic remember` (idempotent upsert of one JSON record or
  an NDJSON batch on stdin, dedup by id + content hash); `recall` drives
  `eidetic recall` with four search modes — exact / approximate / keyword /
  hybrid — each hit carrying text, full provenance metadata, a relevance score,
  and a freshness signal. The `.sh` wrappers are byte-verbatim from eidetic-cli
  (their first-party origin); each `SKILL.md` is localized only in the
  illustrative `--scope <nick>` examples (Provenance keeps "First-party to
  eidetic-cli"). Both default to this agent's PRIVATE scope, reading the suffix
  from `culture.yaml`. Runtime dep: the `eidetic` CLI on PATH (else a local
  eidetic-cli checkout with `uv`). Propagated by rollout-cli's `eidetic-memory`
  recipe.
@sonarqubecloud

Copy link
Copy Markdown

@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

Vendor eidetic remember/recall memory skills into .claude/skills
✨ Enhancement 📝 Documentation ⚙️ Configuration changes 🕐 20-40 Minutes

Grey Divider

Description

• Vendor eidetic-cli’s /remember and /recall skills for shared, persistent memory.
• Add portable wrappers that resolve scope from culture.yaml and run eidetic CLI.
• Bump version to 0.2.0 and record the release in CHANGELOG.
Diagram

graph TD
  A(("Claude + colleague")) --> R["remember.sh"] --> E(["eidetic CLI"]) --> M[("~/.eidetic/memory")]
  A --> C["recall.sh"] --> E --> M
  Y[/"culture.yaml"/] --> R
  Y --> C
  C --> S[/"Embed server"/]
  subgraph Legend
    direction LR
    _agent(("Agent/process")) ~~~ _script["Wrapper script"] ~~~ _cli(["CLI tool"]) ~~~ _store[("Data store")] ~~~ _cfg[/"Config"/]
  end
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Use a Python integration instead of shell wrappers
  • ➕ Avoids shell-quoting/parsing edge cases and duplicated bash logic
  • ➕ Easier to unit test and to provide structured errors
  • ➖ Couples this repo to eidetic internals and packaging, reducing portability
  • ➖ Undermines the “cite-don’t-import” goal of keeping eidetic as an external CLI contract
2. Factor shared wrapper logic into a single common helper script
  • ➕ Reduces duplication (eidetic CLI resolution + culture.yaml scope parsing)
  • ➕ Simplifies future maintenance if defaults change
  • ➖ Not byte-verbatim vendoring unless upstream also ships the helper
  • ➖ Adds another internal coupling point across skills (harder to re-vendor cleanly)
3. Configure default scope via env var instead of parsing culture.yaml
  • ➕ More explicit configuration; avoids YAML parsing heuristics
  • ➕ Works cleanly outside a repo checkout
  • ➖ Requires per-machine setup and increases configuration drift risk
  • ➖ Weakens the ‘worktree-safe shared suffix’ story unless both sides are configured identically

Recommendation: The PR’s approach (vendored skills + thin CLI wrappers + scope derived from culture.yaml) is the best fit for portability and for keeping eidetic-cli as the owner of the memory surface. If duplication becomes a maintenance issue, upstream a shared helper into eidetic-cli first and then re-vendor, rather than diverging locally.

Files changed (6) +599 / -1

Enhancement (2) +279 / -0
recall.shAdd recall wrapper with CLI resolution, default scope, and embed defaults +141/-0

Add recall wrapper with CLI resolution, default scope, and embed defaults

• Introduces a portable bash wrapper that runs 'eidetic recall', preferring an installed 'eidetic' on PATH and falling back to 'uv run' in an eidetic-cli checkout. Injects '--scope <suffix>' and '--visibility private' by default when not explicitly provided (suffix read from nearest culture.yaml), and sets default embed URL/model env vars for embedding modes.

.claude/skills/recall/scripts/recall.sh

remember.shAdd remember wrapper with NDJSON support and default private personal scope +138/-0

Add remember wrapper with NDJSON support and default private personal scope

• Adds a portable wrapper for 'eidetic remember' that supports either a JSON record argument or NDJSON on stdin. Resolves the eidetic CLI similarly to recall.sh, defaults scope/visibility from culture.yaml when not provided, and exports embed endpoint/model defaults.

.claude/skills/remember/scripts/remember.sh

Documentation (3) +319 / -0
SKILL.mdAdd /recall skill documentation and usage examples +181/-0

Add /recall skill documentation and usage examples

• Adds first-party documentation for recalling from the shared eidetic memory store, including the four search modes, output fields, freshness signal, lifecycle filtering, and default scope/visibility behavior. Provides examples and guidance emphasizing provenance and wrapper usage.

.claude/skills/recall/SKILL.md

SKILL.mdAdd /remember skill documentation and record contract +118/-0

Add /remember skill documentation and record contract

• Documents ingesting records into the shared eidetic memory store, including JSON vs NDJSON batch ingest, idempotent upsert/dedup semantics, and lifecycle linking via supersedes/sweep. Explains the default private personal scope (from culture.yaml) and how to intentionally publish to the public pool.

.claude/skills/remember/SKILL.md

CHANGELOG.mdAdd 0.2.0 changelog entry for eidetic memory skills +20/-0

Add 0.2.0 changelog entry for eidetic memory skills

• Prepends a 0.2.0 release note describing the newly vendored remember/recall skills, their semantics, default scoping, and the runtime dependency on the eidetic CLI. Captures the cite-don’t-import provenance intent.

CHANGELOG.md

Other (1) +1 / -1
pyproject.tomlBump package version to 0.2.0 +1/-1

Bump package version to 0.2.0

• Updates the project version from 0.1.0 to 0.2.0 to match the new skills release recorded in the changelog.

pyproject.toml

@qodo-code-review

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (2) 📘 Rule violations (3) 📜 Skill insights (0)

Context used
✅ Compliance rules (platform): 28 rules

Grey Divider


Action required

1. recall.sh lacks dry-run 📘 Rule violation ☼ Reliability
Description
The new recall.sh and remember.sh wrappers unconditionally execute eidetic recall/`eidetic
remember without a default dry-run mode or an explicit --apply gate, even though recall` is
described as performing passive reinforcement writes. This can lead to unintended persistence or
state changes during routine invocations that may appear read-oriented or low-risk.
Code

.claude/skills/recall/scripts/recall.sh[141]

+exec "${EIDETIC[@]}" recall "${SCOPE_ARGS[@]}" "$@"
Evidence
Rule 731643 requires write-capable CLI operations to default to dry-run and require an explicit
apply flag, and the skill documentation describes recall as mutating records (e.g., bumping
last_recall/recall_count) via passive reinforcement. The cited script locations for recall.sh
and remember.sh indicate they primarily forward user flags/args and then always execute `eidetic
recall/eidetic remember with no --apply` gating behavior, demonstrating that write operations
can occur by default without an explicit opt-in.

Rule 731643: CLI write operations must default to dry-run and require explicit apply flag
.claude/skills/recall/SKILL.md[9-10]
.claude/skills/recall/SKILL.md[95-97]
.claude/skills/recall/scripts/recall.sh[50-64]
.claude/skills/recall/scripts/recall.sh[141-141]
.claude/skills/remember/scripts/remember.sh[56-64]
.claude/skills/remember/scripts/remember.sh[138-138]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Both `recall.sh` and `remember.sh` currently run `eidetic recall` / `eidetic remember` unconditionally while forwarding user flags/args, and they do not enforce a safe default (dry-run) or require an explicit `--apply` opt-in for write side effects. Update these wrappers to comply with Rule 731643 by making write-capable behavior require explicit user intent (e.g., defaulting to dry-run and only applying/persisting when `--apply` is provided), especially since `recall` is documented to perform passive reinforcement writes.

## Issue Context
`/recall` and `/remember` are skill entry points intended to be invoked routinely; unsafe defaults increase the chance of unintended persistence, state changes, and test pollution. The recall skill documentation explicitly notes that recall mutates record fields (such as `last_recall`/`recall_count`), so invoking it without an apply gate can cause unexpected writes even when the command seems read-oriented.

## Fix Focus Areas
- .claude/skills/recall/scripts/recall.sh[46-65]
- .claude/skills/recall/scripts/recall.sh[141-141]
- .claude/skills/recall/SKILL.md[9-10]
- .claude/skills/recall/SKILL.md[95-97]
- .claude/skills/remember/scripts/remember.sh[52-66]
- .claude/skills/remember/scripts/remember.sh[125-138]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Skill scripts require external CLI 📘 Rule violation ⚙ Maintainability
Description
The new skill scripts depend on an external eidetic binary on PATH (or an external eidetic-cli
checkout invoked via uv), rather than using only in-repo, vendored dependencies. This breaks the
requirement that skill scripts not depend on resources outside the repository.
Code

.claude/skills/recall/scripts/recall.sh[R18-44]

+resolve_eidetic() {
+    if command -v eidetic >/dev/null 2>&1; then
+        EIDETIC=(eidetic)            # installed console script — the normal case
+        return 0
+    fi
+    # Dev fallback: inside the eidetic-cli checkout, run via uv.
+    local dir
+    dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
+    while [ -n "$dir" ] && [ "$dir" != "/" ]; do
+        if [ -f "$dir/pyproject.toml" ] \
+            && grep -q '^name = "eidetic-cli"' "$dir/pyproject.toml" 2>/dev/null; then
+            if command -v uv >/dev/null 2>&1; then
+                EIDETIC=(uv run --project "$dir" eidetic)
+                return 0
+            fi
+            break
+        fi
+        dir=$(dirname "$dir")
+    done
+    cat >&2 <<'EOF'
+error: eidetic CLI not found.
+hint: install it with `uv tool install eidetic-cli` (or `pipx install eidetic-cli`),
+      or run from inside the eidetic-cli checkout with `uv` available.
+      The console script is `eidetic` (dist name: eidetic-cli).
+EOF
+    return 1
+}
Evidence
Rule 731646 forbids skill scripts from depending on external, non-vendored tools/paths. Both
wrappers resolve eidetic from the system (command -v eidetic) and otherwise instruct running
from an external eidetic-cli checkout via uv, which is outside this repo.

Rule 731646: Skill scripts must not depend on external paths outside the repository
.claude/skills/recall/scripts/recall.sh[18-36]
.claude/skills/remember/scripts/remember.sh[25-42]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The skill entry-point scripts dynamically resolve and execute an external tool (`eidetic`) from `PATH` or via an external checkout (`uv run --project ...`). Compliance requires skill scripts to avoid dependencies that live outside this repository.

## Issue Context
Depending on `PATH`-resolved binaries is both non-reproducible and vulnerable to environment differences or path hijacking.

## Fix Focus Areas
- .claude/skills/recall/scripts/recall.sh[16-44]
- .claude/skills/remember/scripts/remember.sh[23-50]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. Home-dir path committed 📘 Rule violation § Compliance
Description
The PR introduces the per-machine home-directory path ~/.eidetic/memory in tracked documentation
and scripts. Per compliance, machine-specific paths must be confined to git-ignored
.claude/skills.local.yaml rather than committed files.
Code

.claude/skills/recall/SKILL.md[R12-14]

+  --include-shadowed / --include-archived to retrieve them. The store lives at
+  ~/.eidetic/memory (a home-dir path outside any git worktree); the wrapper
+  defaults queries to this agent's PERSONAL, PRIVATE scope (`--scope lecodeur
Evidence
Rule 731655 forbids introducing machine-specific paths into tracked files except local-only config.
The new skills explicitly document and reference the home-dir store path ~/.eidetic/memory in
multiple committed files.

Rule 731655: Per-machine paths must be stored only in git-ignored .claude/skills.local.yaml
.claude/skills/recall/SKILL.md[12-14]
.claude/skills/remember/SKILL.md[11-14]
.claude/skills/recall/scripts/recall.sh[9-12]
.claude/skills/remember/scripts/remember.sh[15-19]
CHANGELOG.md[12-25]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Tracked skill docs/scripts embed a per-machine filesystem location (`~/.eidetic/memory`). Compliance requires that per-machine paths live only in git-ignored `.claude/skills.local.yaml` (or equivalent local-only config), not in committed files.

## Issue Context
Committing home-dir paths reduces portability and can mislead users about correct configuration in different environments.

## Fix Focus Areas
- .claude/skills/recall/SKILL.md[12-14]
- .claude/skills/remember/SKILL.md[11-14]
- .claude/skills/recall/scripts/recall.sh[9-12]
- .claude/skills/remember/scripts/remember.sh[15-19]
- CHANGELOG.md[12-25]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


View more (1)
4. Silent scope fallback 🐞 Bug ⛨ Security
Description
In remember.sh/recall.sh, --scope <suffix> and default --visibility private are only
injected when resolve_scope extracts a non-empty suffix; if culture.yaml exists but doesn’t
match the expected single-line suffix: <token> shape, the wrapper silently falls back to eidetic
CLI defaults (wrong scope/visibility). This can cause writes/reads to land outside the intended
personal private scope, risking incorrect recall behavior and unintended sharing semantics.
Code

.claude/skills/remember/scripts/remember.sh[R94-132]

+resolve_scope() {
+    local dir suffix=""
+    dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
+    while [ -n "$dir" ] && [ "$dir" != "/" ]; do
+        if [ -f "$dir/culture.yaml" ]; then
+            # Capture only the first non-space token after `suffix:` (so an
+            # inline `# comment` or trailing space can't bleed into the scope),
+            # then strip surrounding quotes only — matching the canonical parser
+            # in .claude/skills/cicd/scripts/_resolve-nick.sh.
+            suffix=$(sed -n \
+                's/^[[:space:]]*-\{0,1\}[[:space:]]*suffix:[[:space:]]*\([^[:space:]]*\).*/\1/p' \
+                "$dir/culture.yaml" | head -n1 | tr -d "\"'")
+            break
+        fi
+        dir=$(dirname "$dir")
+    done
+    printf '%s' "$suffix"
+}
+
+has_flag() {
+    local needle=$1
+    shift
+    local a
+    for a in "$@"; do
+        case "$a" in
+            "$needle" | "$needle"=*) return 0 ;;
+        esac
+    done
+    return 1
+}
+
+SCOPE_ARGS=()
+if ! has_flag --scope "$@"; then
+    EIDETIC_SCOPE=$(resolve_scope)
+    if [ -n "$EIDETIC_SCOPE" ]; then
+        SCOPE_ARGS+=(--scope "$EIDETIC_SCOPE")
+        has_flag --visibility "$@" || SCOPE_ARGS+=(--visibility private)
+    fi
+fi
Evidence
Both wrappers only add --scope and default --visibility private when resolve_scope returns a
non-empty string, so any parsing miss results in no injected args and a silent fallback. The repo’s
existing nick resolver explicitly warns on parse failure, showing the expected behavior is not to
silently mask misconfiguration.

.claude/skills/remember/scripts/remember.sh[77-132]
.claude/skills/recall/scripts/recall.sh[76-132]
.claude/skills/cicd/scripts/_resolve-nick.sh[4-40]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`remember.sh` and `recall.sh` silently skip scope injection when `culture.yaml` exists but `suffix` cannot be parsed (empty result). That bypasses the intended default of querying/writing in the agent’s personal scope with private visibility.

## Issue Context
The repo already has a canonical suffix parser (`.claude/skills/cicd/scripts/_resolve-nick.sh`) that warns when parsing fails; the new skills should behave similarly (warn or error) rather than silently falling back.

## Fix Focus Areas
- .claude/skills/remember/scripts/remember.sh[94-132]
- .claude/skills/recall/scripts/recall.sh[94-132]

## Suggested fix
- If a `culture.yaml` is found but the parsed suffix is empty, emit a clear stderr warning and **exit non-zero** (fail closed), or at minimum warn loudly.
- Consider anchoring the search to the git repo root (like `_resolve-nick.sh`) and/or using the same parsing approach (python regex) to reduce drift.
- Optionally validate the parsed suffix (non-empty, does not start with `-`) before using it as the `--scope` value.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

5. Dead provenance link 🐞 Bug ⚙ Maintainability
Description
The new remember and recall SKILL.md files link to ../../../docs/skill-sources.md, but this
repo does not contain that file, so the provenance reference is a dead link for readers/downstream
vendors.
Code

.claude/skills/recall/SKILL.md[R177-181]

+## Provenance
+
+First-party to **eidetic-cli** — eidetic owns its memory surface. Cite, don't
+import: downstream repos copy this skill, they don't symlink it. See
+[`docs/skill-sources.md`](../../../docs/skill-sources.md).
Evidence
Both newly added skill documents include the same link to docs/skill-sources.md as their
provenance pointer; without that file in this repo, the link won’t resolve.

.claude/skills/recall/SKILL.md[177-181]
.claude/skills/remember/SKILL.md[114-118]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`remember` and `recall` SKILL.md files reference `docs/skill-sources.md`, but the target file is not present in this repository, creating a dead link.

## Issue Context
This is purely documentation/provenance hygiene, but it’s user-facing and will confuse maintainers trying to follow the stated provenance chain.

## Fix Focus Areas
- .claude/skills/recall/SKILL.md[177-181]
- .claude/skills/remember/SKILL.md[114-118]

## Suggested fix
Pick one:
- Add `docs/skill-sources.md` to this repo (even a minimal table entry for these skills), or
- Change the Provenance section to point at an existing file/location in this repo (or say “See docs/skill-sources.md if present” and remove the link), so GitHub renders a non-broken reference.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Qodo Logo

: "${EIDETIC_EMBED_MODEL:=Qwen/Qwen3-Embedding-0.6B}"
export EIDETIC_EMBED_URL EIDETIC_EMBED_MODEL

exec "${EIDETIC[@]}" recall "${SCOPE_ARGS[@]}" "$@"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

1. recall.sh lacks dry-run 📘 Rule violation ☼ Reliability

The new recall.sh and remember.sh wrappers unconditionally execute eidetic recall/`eidetic
remember without a default dry-run mode or an explicit --apply gate, even though recall` is
described as performing passive reinforcement writes. This can lead to unintended persistence or
state changes during routine invocations that may appear read-oriented or low-risk.
Agent Prompt
## Issue description
Both `recall.sh` and `remember.sh` currently run `eidetic recall` / `eidetic remember` unconditionally while forwarding user flags/args, and they do not enforce a safe default (dry-run) or require an explicit `--apply` opt-in for write side effects. Update these wrappers to comply with Rule 731643 by making write-capable behavior require explicit user intent (e.g., defaulting to dry-run and only applying/persisting when `--apply` is provided), especially since `recall` is documented to perform passive reinforcement writes.

## Issue Context
`/recall` and `/remember` are skill entry points intended to be invoked routinely; unsafe defaults increase the chance of unintended persistence, state changes, and test pollution. The recall skill documentation explicitly notes that recall mutates record fields (such as `last_recall`/`recall_count`), so invoking it without an apply gate can cause unexpected writes even when the command seems read-oriented.

## Fix Focus Areas
- .claude/skills/recall/scripts/recall.sh[46-65]
- .claude/skills/recall/scripts/recall.sh[141-141]
- .claude/skills/recall/SKILL.md[9-10]
- .claude/skills/recall/SKILL.md[95-97]
- .claude/skills/remember/scripts/remember.sh[52-66]
- .claude/skills/remember/scripts/remember.sh[125-138]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment on lines +18 to +44
resolve_eidetic() {
if command -v eidetic >/dev/null 2>&1; then
EIDETIC=(eidetic) # installed console script — the normal case
return 0
fi
# Dev fallback: inside the eidetic-cli checkout, run via uv.
local dir
dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
while [ -n "$dir" ] && [ "$dir" != "/" ]; do
if [ -f "$dir/pyproject.toml" ] \
&& grep -q '^name = "eidetic-cli"' "$dir/pyproject.toml" 2>/dev/null; then
if command -v uv >/dev/null 2>&1; then
EIDETIC=(uv run --project "$dir" eidetic)
return 0
fi
break
fi
dir=$(dirname "$dir")
done
cat >&2 <<'EOF'
error: eidetic CLI not found.
hint: install it with `uv tool install eidetic-cli` (or `pipx install eidetic-cli`),
or run from inside the eidetic-cli checkout with `uv` available.
The console script is `eidetic` (dist name: eidetic-cli).
EOF
return 1
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

2. Skill scripts require external cli 📘 Rule violation ⚙ Maintainability

The new skill scripts depend on an external eidetic binary on PATH (or an external eidetic-cli
checkout invoked via uv), rather than using only in-repo, vendored dependencies. This breaks the
requirement that skill scripts not depend on resources outside the repository.
Agent Prompt
## Issue description
The skill entry-point scripts dynamically resolve and execute an external tool (`eidetic`) from `PATH` or via an external checkout (`uv run --project ...`). Compliance requires skill scripts to avoid dependencies that live outside this repository.

## Issue Context
Depending on `PATH`-resolved binaries is both non-reproducible and vulnerable to environment differences or path hijacking.

## Fix Focus Areas
- .claude/skills/recall/scripts/recall.sh[16-44]
- .claude/skills/remember/scripts/remember.sh[23-50]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment on lines +12 to +14
--include-shadowed / --include-archived to retrieve them. The store lives at
~/.eidetic/memory (a home-dir path outside any git worktree); the wrapper
defaults queries to this agent's PERSONAL, PRIVATE scope (`--scope lecodeur

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

3. Home-dir path committed 📘 Rule violation § Compliance

The PR introduces the per-machine home-directory path ~/.eidetic/memory in tracked documentation
and scripts. Per compliance, machine-specific paths must be confined to git-ignored
.claude/skills.local.yaml rather than committed files.
Agent Prompt
## Issue description
Tracked skill docs/scripts embed a per-machine filesystem location (`~/.eidetic/memory`). Compliance requires that per-machine paths live only in git-ignored `.claude/skills.local.yaml` (or equivalent local-only config), not in committed files.

## Issue Context
Committing home-dir paths reduces portability and can mislead users about correct configuration in different environments.

## Fix Focus Areas
- .claude/skills/recall/SKILL.md[12-14]
- .claude/skills/remember/SKILL.md[11-14]
- .claude/skills/recall/scripts/recall.sh[9-12]
- .claude/skills/remember/scripts/remember.sh[15-19]
- CHANGELOG.md[12-25]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment on lines +94 to +132
resolve_scope() {
local dir suffix=""
dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
while [ -n "$dir" ] && [ "$dir" != "/" ]; do
if [ -f "$dir/culture.yaml" ]; then
# Capture only the first non-space token after `suffix:` (so an
# inline `# comment` or trailing space can't bleed into the scope),
# then strip surrounding quotes only — matching the canonical parser
# in .claude/skills/cicd/scripts/_resolve-nick.sh.
suffix=$(sed -n \
's/^[[:space:]]*-\{0,1\}[[:space:]]*suffix:[[:space:]]*\([^[:space:]]*\).*/\1/p' \
"$dir/culture.yaml" | head -n1 | tr -d "\"'")
break
fi
dir=$(dirname "$dir")
done
printf '%s' "$suffix"
}

has_flag() {
local needle=$1
shift
local a
for a in "$@"; do
case "$a" in
"$needle" | "$needle"=*) return 0 ;;
esac
done
return 1
}

SCOPE_ARGS=()
if ! has_flag --scope "$@"; then
EIDETIC_SCOPE=$(resolve_scope)
if [ -n "$EIDETIC_SCOPE" ]; then
SCOPE_ARGS+=(--scope "$EIDETIC_SCOPE")
has_flag --visibility "$@" || SCOPE_ARGS+=(--visibility private)
fi
fi

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

4. Silent scope fallback 🐞 Bug ⛨ Security

In remember.sh/recall.sh, --scope <suffix> and default --visibility private are only
injected when resolve_scope extracts a non-empty suffix; if culture.yaml exists but doesn’t
match the expected single-line suffix: <token> shape, the wrapper silently falls back to eidetic
CLI defaults (wrong scope/visibility). This can cause writes/reads to land outside the intended
personal private scope, risking incorrect recall behavior and unintended sharing semantics.
Agent Prompt
## Issue description
`remember.sh` and `recall.sh` silently skip scope injection when `culture.yaml` exists but `suffix` cannot be parsed (empty result). That bypasses the intended default of querying/writing in the agent’s personal scope with private visibility.

## Issue Context
The repo already has a canonical suffix parser (`.claude/skills/cicd/scripts/_resolve-nick.sh`) that warns when parsing fails; the new skills should behave similarly (warn or error) rather than silently falling back.

## Fix Focus Areas
- .claude/skills/remember/scripts/remember.sh[94-132]
- .claude/skills/recall/scripts/recall.sh[94-132]

## Suggested fix
- If a `culture.yaml` is found but the parsed suffix is empty, emit a clear stderr warning and **exit non-zero** (fail closed), or at minimum warn loudly.
- Consider anchoring the search to the git repo root (like `_resolve-nick.sh`) and/or using the same parsing approach (python regex) to reduce drift.
- Optionally validate the parsed suffix (non-empty, does not start with `-`) before using it as the `--scope` value.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

@OriNachum
OriNachum merged commit 4c4971a into main Jun 23, 2026
7 of 8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant