Skip to content

eidetic-memory: refresh wrappers (eidetic 0.10) + memory-discipline convention#11

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

eidetic-memory: refresh wrappers (eidetic 0.10) + memory-discipline convention#11
OriNachum merged 1 commit into
mainfrom
rollout/eidetic-memory-0.10

Conversation

@OriNachum

Copy link
Copy Markdown
Contributor

Added

  • Memory-discipline "Conventions and workflow" section in CLAUDE.md — a
    per-task recall-before / remember-after convention (scope localized to this
    repo's nick) so the vendored remember / recall skills are actually used,
    not just present: /recall before non-trivial work to build on prior
    decisions instead of re-deriving them, and /remember when a non-obvious
    decision, constraint, fix-and-why, or hard-won gotcha surfaces. The section
    documents this repo's memory as in-repo and public — records resolve to
    <repo-root>/.eidetic/memory (committed, team- and mesh-shared). Inserted
    idempotently (skipped if already present), slotted under an existing
    "Conventions and workflow" heading when one exists, else appended.

Changed

  • Refreshed the remember + recall wrappers from eidetic-cli 0.10.0
    (cite-don't-import) — picks up eidetic's project-local store default: the
    files backend now resolves per record by visibility — PUBLIC records inside a
    git repo go to <repo-root>/.eidetic/memory (committed, team-shared), PRIVATE
    records (or any record outside a repo) go to $HOME/.eidetic/memory (never
    committed), an explicit EIDETIC_DATA_DIR still wins, and recall reads both
    stores and merges. Also carries the 0.9.3 hardening (interactive-stdin guard,
    help as a search term, SIGPIPE-safe suffix parsing). Recipe policy
    override (the wrappers here are NOT byte-verbatim):
    the injected default
    visibility is flipped from eidetic's private to public, so a plain
    /remember lands the note in ./.eidetic/memory in this repo, kept as part
    of the repo — pass --visibility private to route a record to $HOME
    instead. remember drives eidetic remember (idempotent upsert of one JSON
    record or an NDJSON batch on stdin); recall drives eidetic recall with
    four search modes (exact / approximate / keyword / hybrid). Each SKILL.md is
    localized only in the illustrative --scope <nick> examples (Provenance keeps
    "First-party to eidetic-cli"). Runtime dep: the eidetic CLI on PATH (else a
    local eidetic-cli checkout with uv) — eidetic >= 0.10.0 for the
    in-repo routing; on an older CLI the public records still work but are stored
    in $HOME/.eidetic/memory instead of in-repo. Propagated by rollout-cli's
    eidetic-memory recipe.

- **Memory-discipline "Conventions and workflow" section in `CLAUDE.md`** — a
  per-task *recall-before / remember-after* convention (scope localized to this
  repo's nick) so the vendored `remember` / `recall` skills are actually used,
  not just present: `/recall` before non-trivial work to build on prior
  decisions instead of re-deriving them, and `/remember` when a non-obvious
  decision, constraint, fix-and-why, or hard-won gotcha surfaces. The section
  documents this repo's memory as **in-repo and public** — records resolve to
  `<repo-root>/.eidetic/memory` (committed, team- and mesh-shared). Inserted
  idempotently (skipped if already present), slotted under an existing
  "Conventions and workflow" heading when one exists, else appended.

### Changed

- **Refreshed the `remember` + `recall` wrappers from eidetic-cli 0.10.0**
  (cite-don't-import) — picks up eidetic's **project-local store default**: the
  files backend now resolves per record by visibility — PUBLIC records inside a
  git repo go to `<repo-root>/.eidetic/memory` (committed, team-shared), PRIVATE
  records (or any record outside a repo) go to `$HOME/.eidetic/memory` (never
  committed), an explicit `EIDETIC_DATA_DIR` still wins, and recall reads both
  stores and merges. Also carries the 0.9.3 hardening (interactive-stdin guard,
  `help` as a search term, SIGPIPE-safe suffix parsing). **Recipe policy
  override (the wrappers here are NOT byte-verbatim):** the injected default
  visibility is flipped from eidetic's `private` to **`public`**, so a plain
  `/remember` lands the note in `./.eidetic/memory` in this repo, kept as part
  of the repo — pass `--visibility private` to route a record to `$HOME`
  instead. `remember` drives `eidetic remember` (idempotent upsert of one JSON
  record or an NDJSON batch on stdin); `recall` drives `eidetic recall` with
  four search modes (exact / approximate / keyword / hybrid). Each `SKILL.md` is
  localized only in the illustrative `--scope <nick>` examples (Provenance keeps
  "First-party to eidetic-cli"). Runtime dep: the `eidetic` CLI on PATH (else a
  local eidetic-cli checkout with `uv`) — **`eidetic >= 0.10.0`** for the
  in-repo routing; on an older CLI the public records still work but are stored
  in `$HOME/.eidetic/memory` instead of in-repo. Propagated by rollout-cli's
  `eidetic-memory` recipe.
@sonarqubecloud

Copy link
Copy Markdown

@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

Refresh eidetic remember/recall wrappers (0.10) and document memory discipline
✨ Enhancement 📝 Documentation ⚙️ Configuration changes 🕐 20-40 Minutes

Grey Divider

Description

• Refresh vendored remember/recall wrappers to align with eidetic-cli 0.10 store routing.
• Default wrapper visibility to public and add safer CLI/TTY/error-handling behavior.
• Document recall-before/remember-after workflow and bump project version + changelog.
Diagram

graph TD
  A([Developer / Agent]) --> B["remember.sh / recall.sh"] --> C(["eidetic CLI (>=0.10)"]) --> D[("Memory stores: .eidetic/memory + $HOME/.eidetic/memory")]
  F["pyproject.toml + CHANGELOG.md"] --> E["CLAUDE.md workflow"] --> B["remember.sh / recall.sh"]

  subgraph Legend
    direction LR
    _actor([Actor]) ~~~ _svc([Service/CLI]) ~~~ _file["File"] ~~~ _store[(Store)]
  end
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Keep upstream default visibility (private)
  • ➕ Matches eidetic-cli upstream expectations; fewer surprises for new users
  • ➕ Reduces risk of accidentally committing sensitive notes
  • ➖ Undermines the stated goal of team/shared in-repo memory by default
  • ➖ Requires more frequent explicit flags for the desired repo-local behavior
2. Make default visibility configurable via repo env/config
  • ➕ Allows repos/teams to choose public vs private default without forking behavior
  • ➕ Reduces policy hard-coding in vendored scripts
  • ➖ More moving parts (config parsing, precedence rules) for simple wrappers
  • ➖ Harder to reason about effective behavior across environments
3. Stop vendoring wrappers; depend on `eidetic` CLI directly
  • ➕ Avoids drift from upstream and reduces maintenance burden
  • ➕ Documentation can point to canonical CLI behavior
  • ➖ Loses repo-specific policy (default public + scope suffix UX)
  • ➖ More friction for users expecting /remember and /recall skills to be turnkey

Recommendation: The current approach is reasonable given the explicit repo goal of committed, team-shared memory: defaulting to --visibility public in the wrappers aligns behavior with the documented workflow and the 0.10 two-store model. The main tradeoff is accidental-public risk; the added stderr warnings when no culture.yaml suffix resolves help, but reviewers should sanity-check that the warning/error paths keep stdout clean for --json use and that the help/usage changes won’t break any existing automation.

Files changed (5) +142 / -27

Enhancement (2) +74 / -26
recall.shAlign recall wrapper with eidetic 0.10 routing and safer CLI behavior +35/-13

Align recall wrapper with eidetic 0.10 routing and safer CLI behavior

• Updates store documentation to describe 0.10’s public repo-local vs private home-dir resolution and merged reads. Tightens CLI-not-found messaging, treats empty query as an error (keeping 'help' as a valid search term), hardens suffix parsing under pipefail, defaults visibility to 'public', and warns when no suffix is resolved and no explicit targeting flags are provided.

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

remember.shDefault remember to public in-repo memory and add interactive-stdin guard +39/-13

Default remember to public in-repo memory and add interactive-stdin guard

• Updates store documentation for eidetic 0.10’s visibility-based routing and simplifies CLI-not-found output. Adds a TTY guard to prevent hanging when no args are provided, hardens suffix parsing against SIGPIPE under pipefail, flips default injected visibility to 'public', and warns when no suffix resolves so records don’t go public silently without an explicit choice.

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

Documentation (2) +67 / -0
CHANGELOG.mdAdd 0.8.0 release notes for eidetic memory discipline + wrapper refresh +39/-0

Add 0.8.0 release notes for eidetic memory discipline + wrapper refresh

• Introduces a 0.8.0 entry describing the new memory-discipline guidance and the refreshed wrappers, including the public-by-default policy and eidetic >= 0.10.0 routing behavior.

CHANGELOG.md

CLAUDE.mdDocument recall-before/remember-after workflow and in-repo public memory policy +28/-0

Document recall-before/remember-after workflow and in-repo public memory policy

• Adds a "Conventions and workflow" section defining a per-task recall/remember discipline and clarifying that this repo’s eidetic memory is committed under .eidetic/memory by default, with private notes requiring an explicit '--visibility private'.

CLAUDE.md

Other (1) +1 / -1
pyproject.tomlBump project version to 0.8.0 +1/-1

Bump project version to 0.8.0

• Updates the package version from 0.7.0 to 0.8.0 to match the new changelog entry.

pyproject.toml

@qodo-code-review

Copy link
Copy Markdown

Code Review by Qodo

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

Context used
✅ Compliance rules (platform): 25 rules

Grey Divider


Action required

1. remember SKILL.md out-of-date 📜 Skill insight ✧ Quality
Description
remember.sh now injects --visibility public by default, but both its usage() output and
.claude/skills/remember/SKILL.md still document an old private/personal default (including the
~/.eidetic/memory home-dir location) and even advise passing --visibility public. This mismatch
can mislead users/agents into relying on incorrect behavior and unintentionally writing records to
the shared public/committed store when they expected private notes.
Code

.claude/skills/remember/scripts/remember.sh[R144-149]

+        # rollout-cli eidetic-memory recipe POLICY OVERRIDE (not eidetic's
+        # upstream private default): default to PUBLIC so a plain remember lands
+        # in <repo>/.eidetic/memory — committed, team- and mesh-shared. Pass
+        # --visibility private to keep a record in $HOME (uncommitted).
+        has_flag --visibility "$@" || SCOPE_ARGS+=(--visibility public)
+    elif ! has_flag --visibility "$@"; then
Relevance

⭐⭐⭐ High

Mismatch in usage/SKILL.md vs new default visibility is high-impact; PR #10 showed attention to
skill docs.

PR-#10

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The compliance rule requires SKILL.md to match actual skill behavior, yet the implementation in
remember.sh has been updated to default to --visibility public (notably when a culture.yaml
suffix is resolved), while the skill documentation and the script’s own usage() text still
describe a private-default scope, the home-directory store (~/.eidetic/memory), and guidance that
--visibility public is an opt-in; additionally, CLAUDE.md documents the intended new default as
public. Together, these cited sources show the runtime behavior has changed but the
documentation/help text has not, creating a clear, proven mismatch that can cause accidental public
writes.

.claude/skills/remember/scripts/remember.sh[139-156]
.claude/skills/remember/SKILL.md[11-17]
.claude/skills/remember/scripts/remember.sh[60-65]
.claude/skills/remember/scripts/remember.sh[139-148]
.claude/skills/remember/SKILL.md[61-66]
CLAUDE.md[298-319]
Skill: doc-test-alignment

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 `remember` skill’s actual default visibility/store behavior has changed (the wrapper now injects `--visibility public` by default), but `.claude/skills/remember/SKILL.md` and the wrapper’s `usage()` output still describe the old behavior (private/personal by default, home-directory store, and suggesting `--visibility public` as opt-in). Update the documentation and help text so they no longer lag the implementation and so users/agents can intentionally choose public vs private storage.

## Issue Context
- `remember.sh` now injects `--visibility public` by default (policy override), especially when it resolves a `culture.yaml` suffix.
- The script’s `usage()` output and `.claude/skills/remember/SKILL.md` still claim the default is private/personal, reference `~/.eidetic/memory`, and advise passing `--visibility public`—which is now reversed.
- CLAUDE.md documents the intended new default as public.
- Expected behavior to document: default is **public** (in-repo when applicable); `--visibility private` should route to `$HOME`/personal storage.

## Fix Focus Areas
- .claude/skills/remember/SKILL.md[1-20]
- .claude/skills/remember/SKILL.md[61-100]
- .claude/skills/remember/scripts/remember.sh[51-67]
- .claude/skills/remember/scripts/remember.sh[88-104]
- .claude/skills/remember/scripts/remember.sh[139-158]

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


2. recall SKILL.md out-of-date 📜 Skill insight ✧ Quality
Description
recall.sh now injects --visibility public by default, but .claude/skills/recall/SKILL.md (and
the script’s own explanatory comments) still describe a personal/private default scope and
home-directory store location. This mismatch can create incorrect operational expectations,
confusingly missing results when private memories aren’t surfaced, and inconsistent behavior across
agents.
Code

.claude/skills/recall/scripts/recall.sh[R139-145]

+        # rollout-cli eidetic-memory recipe POLICY OVERRIDE (not eidetic's
+        # upstream private default): default to PUBLIC, so a plain recall queries
+        # the in-repo public pool (<repo>/.eidetic/memory) this repo writes to.
+        # Pass --visibility private to also surface this agent's private ($HOME)
+        # notes. The two-store read model reads both dirs regardless.
+        has_flag --visibility "$@" || SCOPE_ARGS+=(--visibility public)
+    elif ! has_flag --visibility "$@"; then
Relevance

⭐⭐⭐ High

PR #10 added skills; team likely expects SKILL.md to track wrapper behavior changes.

PR-#10

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The compliance rule requires SKILL.md to reflect current skill behavior, yet the implementation in
recall.sh has been updated to inject --visibility public by default (notably when resolving a
culture.yaml suffix) while the recall documentation and surrounding script commentary still claim
a private/personal default and imply that a no-flag recall returns private records, as well as
referencing the older ~/.eidetic/memory store. These cited locations therefore demonstrate that
the documented defaults and outcomes no longer match the actual invocation semantics.

.claude/skills/recall/scripts/recall.sh[134-152]
.claude/skills/recall/SKILL.md[12-18]
.claude/skills/recall/scripts/recall.sh[82-99]
.claude/skills/recall/scripts/recall.sh[134-145]
.claude/skills/recall/SKILL.md[121-128]
Skill: doc-test-alignment

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 `recall` skill’s runtime behavior changed (it now injects `--visibility public` by default), but `.claude/skills/recall/SKILL.md` and `recall.sh`’s own explanatory comment block still describe the old private/personal-default behavior and legacy store expectations (e.g., `~/.eidetic/memory`). Update the documentation and script comments so they accurately reflect the current default visibility and any relevant routing/store semantics, in line with the requirement that SKILL.md must not lag behind implementation.

## Issue Context
- `recall.sh` now injects `--visibility public` by default, including when it resolves a `culture.yaml` suffix.
- The recall skill documentation (SKILL.md) still states the wrapper defaults to a personal/private scope, implies that a no-flag recall returns private records by default, and references a home-directory store location.
- The script’s comment block still describes the older private-default model, which can mislead users/agents into thinking private memories will be returned without explicitly setting visibility.
- The expected fix is to update SKILL.md (frontmatter + body) to match the new defaults and “two-store routing semantics,” update the recall.sh comment block to match the implemented default, and tighten any warning text that still references a private personal-scope default that no longer applies.

## Fix Focus Areas
- .claude/skills/recall/SKILL.md[1-22]
- .claude/skills/recall/SKILL.md[114-129]
- .claude/skills/recall/scripts/recall.sh[82-99]
- .claude/skills/recall/scripts/recall.sh[134-153]

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



Informational

3. Skill vendoring doc outdated 🐞 Bug ⚙ Maintainability
Description
docs/skill-sources.md states vendored skills do not edit script bodies, but this PR intentionally
modifies the remember/recall wrapper scripts. Without documenting this as an explicit local
divergence, future re-syncs may incorrectly assume these changes are accidental and revert them.
Code

.claude/skills/remember/scripts/remember.sh[R144-148]

+        # rollout-cli eidetic-memory recipe POLICY OVERRIDE (not eidetic's
+        # upstream private default): default to PUBLIC so a plain remember lands
+        # in <repo>/.eidetic/memory — committed, team- and mesh-shared. Pass
+        # --visibility private to keep a record in $HOME (uncommitted).
+        has_flag --visibility "$@" || SCOPE_ARGS+=(--visibility public)
Relevance

⭐⭐ Medium

docs/skill-sources.md not found in repo; no historical evidence this vendoring-doc rule is enforced
here.

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The repo’s vendoring guidance explicitly claims script bodies are not edited, yet this PR edits the
vendored remember/recall wrapper scripts to implement a policy override; that discrepancy should be
reflected in the vendoring documentation.

docs/skill-sources.md[50-57]
.claude/skills/remember/scripts/remember.sh[139-148]
.claude/skills/recall/scripts/recall.sh[134-145]

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 vendoring policy documentation says script bodies are not edited, but remember/recall wrappers now have an intentional policy override (default visibility/public routing). This should be recorded as a documented exception so future maintenance/re-sync work doesn’t inadvertently undo it.

## Issue Context
- docs/skill-sources.md currently asserts “No script bodies are edited”.
- remember/recall wrappers were edited to implement a non-verbatim policy override.

## Fix Focus Areas
- docs/skill-sources.md[50-57]
- .claude/skills/remember/scripts/remember.sh[139-148]
- .claude/skills/recall/scripts/recall.sh[134-145]

## Expected fix
- Update docs/skill-sources.md to list `remember`/`recall` as a tracked local divergence (similar to prior documented exceptions), including the reason (public-by-default policy) and what to preserve during re-sync.

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


Grey Divider

Qodo Logo

Comment on lines +144 to +149
# rollout-cli eidetic-memory recipe POLICY OVERRIDE (not eidetic's
# upstream private default): default to PUBLIC so a plain remember lands
# in <repo>/.eidetic/memory — committed, team- and mesh-shared. Pass
# --visibility private to keep a record in $HOME (uncommitted).
has_flag --visibility "$@" || SCOPE_ARGS+=(--visibility public)
elif ! has_flag --visibility "$@"; then

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. remember skill.md out-of-date 📜 Skill insight ✧ Quality

remember.sh now injects --visibility public by default, but both its usage() output and
.claude/skills/remember/SKILL.md still document an old private/personal default (including the
~/.eidetic/memory home-dir location) and even advise passing --visibility public. This mismatch
can mislead users/agents into relying on incorrect behavior and unintentionally writing records to
the shared public/committed store when they expected private notes.
Agent Prompt
## Issue description
The `remember` skill’s actual default visibility/store behavior has changed (the wrapper now injects `--visibility public` by default), but `.claude/skills/remember/SKILL.md` and the wrapper’s `usage()` output still describe the old behavior (private/personal by default, home-directory store, and suggesting `--visibility public` as opt-in). Update the documentation and help text so they no longer lag the implementation and so users/agents can intentionally choose public vs private storage.

## Issue Context
- `remember.sh` now injects `--visibility public` by default (policy override), especially when it resolves a `culture.yaml` suffix.
- The script’s `usage()` output and `.claude/skills/remember/SKILL.md` still claim the default is private/personal, reference `~/.eidetic/memory`, and advise passing `--visibility public`—which is now reversed.
- CLAUDE.md documents the intended new default as public.
- Expected behavior to document: default is **public** (in-repo when applicable); `--visibility private` should route to `$HOME`/personal storage.

## Fix Focus Areas
- .claude/skills/remember/SKILL.md[1-20]
- .claude/skills/remember/SKILL.md[61-100]
- .claude/skills/remember/scripts/remember.sh[51-67]
- .claude/skills/remember/scripts/remember.sh[88-104]
- .claude/skills/remember/scripts/remember.sh[139-158]

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

Comment on lines +139 to +145
# rollout-cli eidetic-memory recipe POLICY OVERRIDE (not eidetic's
# upstream private default): default to PUBLIC, so a plain recall queries
# the in-repo public pool (<repo>/.eidetic/memory) this repo writes to.
# Pass --visibility private to also surface this agent's private ($HOME)
# notes. The two-store read model reads both dirs regardless.
has_flag --visibility "$@" || SCOPE_ARGS+=(--visibility public)
elif ! has_flag --visibility "$@"; then

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. recall skill.md out-of-date 📜 Skill insight ✧ Quality

recall.sh now injects --visibility public by default, but .claude/skills/recall/SKILL.md (and
the script’s own explanatory comments) still describe a personal/private default scope and
home-directory store location. This mismatch can create incorrect operational expectations,
confusingly missing results when private memories aren’t surfaced, and inconsistent behavior across
agents.
Agent Prompt
## Issue description
The `recall` skill’s runtime behavior changed (it now injects `--visibility public` by default), but `.claude/skills/recall/SKILL.md` and `recall.sh`’s own explanatory comment block still describe the old private/personal-default behavior and legacy store expectations (e.g., `~/.eidetic/memory`). Update the documentation and script comments so they accurately reflect the current default visibility and any relevant routing/store semantics, in line with the requirement that SKILL.md must not lag behind implementation.

## Issue Context
- `recall.sh` now injects `--visibility public` by default, including when it resolves a `culture.yaml` suffix.
- The recall skill documentation (SKILL.md) still states the wrapper defaults to a personal/private scope, implies that a no-flag recall returns private records by default, and references a home-directory store location.
- The script’s comment block still describes the older private-default model, which can mislead users/agents into thinking private memories will be returned without explicitly setting visibility.
- The expected fix is to update SKILL.md (frontmatter + body) to match the new defaults and “two-store routing semantics,” update the recall.sh comment block to match the implemented default, and tighten any warning text that still references a private personal-scope default that no longer applies.

## Fix Focus Areas
- .claude/skills/recall/SKILL.md[1-22]
- .claude/skills/recall/SKILL.md[114-129]
- .claude/skills/recall/scripts/recall.sh[82-99]
- .claude/skills/recall/scripts/recall.sh[134-153]

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

@OriNachum OriNachum merged commit e72b50f into main Jun 24, 2026
8 checks passed
@OriNachum OriNachum deleted the rollout/eidetic-memory-0.10 branch June 24, 2026 12:42
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