shareAI-lab/learn-claude-code · error · ValueError

Memory name cannot be empty

Error message

Memory name cannot be empty

What it means

Raised by write_memory_file() in s09_memory/code.py:151 when the memory record's name is empty after stripping whitespace. Every durable memory record must have a non-empty name because the name is slugified (memory_slug(name)) to produce the record's filename; an empty name would yield an empty or invalid filename. The check runs before any type or content validation and before the store directory is touched.

Solutions

  1. Check that the name is a non-empty string after strip() before calling write_memory_file().
  2. If the name comes from LLM output, validate with validate_memory_record() first — it rejects empty names — or derive a fallback name from the description's first words.
  3. Fix the upstream producer so it never emits an empty name field.

Example fix

# before
write_memory_file(record.get('name', ''), mem_type, description, body)

# after
name = (record.get('name') or '').strip()
if not name:
    raise ValueError('record missing a name')
write_memory_file(name, mem_type, description, body)
Defensive patterns

Strategy: validation

Validate before calling

def has_memory_name(name) -> bool:
    return isinstance(name, str) and bool(name.strip())

Type guard

def is_valid_memory_name(name) -> bool:
    return isinstance(name, str) and len(name.strip()) > 0

Try / catch

try:
    write_memory_file(name, mem_type, description, body)
except ValueError as e:
    if 'cannot be empty' in str(e):
        # fill a default or surface to caller
        name = fallback_name or 'unnamed-record'

Prevention

When it happens

Trigger: Calling write_memory_file('', 'user', 'desc', 'body'), passing a name composed only of whitespace like ' ', or passing a programmatically derived name (e.g. a field extracted from LLM output) that is None/empty after strip. Note None fails too: name.strip() raises AttributeError, so empty strings and whitespace-only strings are the exact triggers.

Common situations: Consolidation or capture pipelines that build the name from optional fields (record.get('name', '')) without a presence check; UI forms submitted empty; LLM-generated record dicts where the name key was omitted or blank.

Related errors


AI-assisted analysis of shareAI-lab/learn-claude-code@985456f4ad (2026-08-14). Data as JSON: /api/errors/f563316ed68c9931. Report an issue: GitHub.

Appendix: source

Thrown at s09_memory/code.py:151

        if _normalized_memory_text(
            str(memory.get("description", ""))
        ) == normalized_description:
            return False
        if _normalized_memory_text(str(memory.get("body", ""))) == normalized_body:
            return False
    return True

def memory_document(name: str, mem_type: str, description: str, body: str) -> str:
    metadata = yaml.safe_dump(
        {"name": name, "description": description, "type": mem_type},
        sort_keys=False,
        allow_unicode=True,
    ).strip()
    return f"---\n{metadata}\n---\n\n{body.strip()}\n"

def write_memory_file(name: str, mem_type: str, description: str, body: str) -> Path:
    if not name.strip():
        raise ValueError("Memory name cannot be empty")
    if mem_type not in MEMORY_TYPES:
        raise ValueError(f"Unknown memory type: {mem_type}")
    if not description.strip() or not body.strip():
        raise ValueError("Memory description and body cannot be empty")

    MEMORY_DIR.mkdir(parents=True, exist_ok=True)
    path = memory_path(f"{memory_slug(name)}.md")
    path.write_text(memory_document(name, mem_type, description, body))
    rebuild_memory_index()
    return path

def rebuild_memory_index() -> None:
    MEMORY_DIR.mkdir(parents=True, exist_ok=True)
    lines = []
    for path in sorted(MEMORY_DIR.glob("*.md")):
        if path.name == MEMORY_INDEX.name:
            continue
        try:

View on GitHub (pinned to 985456f4ad)