{"record":{"id":"c823380b7f4b42c2","repo":"affaan-m/ECC","slug":"memory-connector-name-path-is-not-a-directory","errorCode":null,"errorMessage":"memory connector {name} path is not a directory: {}","messagePattern":"memory connector (.+?) path is not a directory: (.+?)","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"ecc2/src/main.rs","lineNumber":3126,"sourceCode":"        limit,\n    )?;\n    if stats.records_read < limit {\n        db.upsert_connector_source_checkpoint(name, &source_path, &signature)?;\n    }\n    Ok(stats)\n}\n\nfn sync_jsonl_directory_memory_connector(\n    db: &session::store::StateStore,\n    name: &str,\n    settings: &config::MemoryConnectorJsonlDirectoryConfig,\n    limit: usize,\n) -> Result<GraphConnectorSyncStats> {\n    if settings.path.as_os_str().is_empty() {\n        anyhow::bail!(\"memory connector {name} has no path configured\");\n    }\n    if !settings.path.is_dir() {\n        anyhow::bail!(\n            \"memory connector {name} path is not a directory: {}\",\n            settings.path.display()\n        );\n    }\n\n    let paths = collect_jsonl_paths(&settings.path, settings.recurse)?;\n    let default_session_id = settings\n        .session_id\n        .as_deref()\n        .map(|value| resolve_session_id(db, value))\n        .transpose()?;\n\n    let mut stats = GraphConnectorSyncStats {\n        connector_name: name.to_string(),\n        ..Default::default()\n    };\n\n    let mut remaining = limit;","sourceCodeStart":3108,"sourceCodeEnd":3144,"githubUrl":"https://github.com/affaan-m/ECC/blob/01e15490f04e29cfefe3896951f43db46994d8ee/ecc2/src/main.rs#L3108-L3144","documentation":"Thrown by `sync_jsonl_directory_memory_connector` immediately after the empty-path check: `settings.path` is non-empty but `is_dir()` returns false. The connector expects to walk a directory of JSONL files; pointing it at a regular file (or a non-existent path) is rejected before `collect_jsonl_paths` runs. The message interpolates the offending path via `settings.path.display()`.","triggerScenarios":"Configuring `jsonl_directory` with a path to a single `.jsonl` file rather than a directory. Typo in the directory path. Relative path resolved against an unexpected working directory. The directory was moved/deleted after config was written.","commonSituations":"Confusing the `jsonl_file` and `jsonl_directory` connector types. Stale config after a filesystem reorganization. Relative paths interpreted differently by systemd/launchd vs an interactive shell.","solutions":["Point `path` at a directory: create one and move JSONL files into it if needed.","If you only have one file, switch the connector type to `jsonl_file`.","Use an absolute path to avoid working-directory ambiguity."],"exampleFix":"// before\n[memory_connectors.logs]\ntype = \"jsonl_directory\"\npath = \"/home/user/.ecc/logs/log.jsonl\"\n\n// after\n[memory_connectors.logs]\ntype = \"jsonl_directory\"\npath = \"/home/user/.ecc/logs\"","handlingStrategy":"validation","validationCode":"fn ensure_directory(path: &Path, name: &str) -> Result<()> {\n    if !path.is_dir() {\n        anyhow::bail!(\"connector {name}: not a directory: {}\", path.display());\n    }\n    Ok(())\n}\n\nensure_directory(&settings.path, name)?;","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Distinguish `*_file` vs `*_directory` connector types when configuring.","Use absolute paths and verify the directory exists after deploy.","Add a startup config check that verifies each directory connector's path."],"tags":["connector","config","path","jsonl","directory","filesystem"],"backgroundTag":null,"analyzedSha":"01e15490f04e29cfefe3896951f43db46994d8ee","analyzedAt":"2026-08-13T00:31:08.655Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}