affaan-m/ECC · error · ValueError
Only local filesystem paths are supported
Error message
Only local filesystem paths are supported
What it means
_path rejects any path containing a URL scheme ("://") or starting with file:, http:, or https:. The tasteforge asset pipeline only accepts local filesystem paths so it can hash, fingerprint, and verify files on disk. Remote or URI-style references are refused with this ValueError.
Solutions
- Download/copy the asset to the local filesystem and pass its local path.
- Strip the file:// scheme and pass the plain absolute path.
- If inputs come from URLs, add a fetch step that materializes files locally first.
- Sanitize manifests to contain only local paths before ingestion.
Example fix
// before
ingest_assets(sp, paths=["https://cdn.example.com/clip.mp4"])
// after
local = download_to_tmp("https://cdn.example.com/clip.mp4") # e.g. /tmp/clip.mp4
ingest_assets(sp, paths=[local]) Defensive patterns
Strategy: validation
Validate before calling
from urllib.parse import urlparse
def is_local_path(p: str) -> bool:
return not ("://" in p or p.startswith(("file:", "http:", "https:"))) Type guard
def is_filesystem_path(v) -> bool:
return isinstance(v, (str, Path)) and "://" not in str(v) and not str(v).startswith(("file:", "http:", "https:")) Try / catch
try:
assets = ingest_assets(sp, paths=paths)
except ValueError as e:
if "Only local filesystem paths" in str(e):
paths = [materialize(p) for p in paths] # download URLs to disk
assets = ingest_assets(sp, paths=paths)
else:
raise Prevention
- Keep a download/materialization step between URL sources and asset ingestion.
- Store plain absolute paths, not file:// URIs, in manifests.
- Lint configs for http(s):// in path fields.
When it happens
Trigger: Passing 'https://cdn.example.com/clip.mp4', 'file:///data/clip.mp4', or any URI-scheme path to _fingerprint/_provenance/ingest_assets/validate_assets/_bundle.
Common situations: Reusing asset URLs from a web app config; storing references as file:// URIs in a manifest; copying path values from a browser or cloud storage console.
Related errors
- download requires HTTPS on an approved fal.media host
- invalid Discord webhook URL
- Invalid issue number
- Invalid managed hook handler at
- exceeds the -byte limit
AI-assisted analysis of affaan-m/ECC@8321021c54 (2026-09-16).
Data as JSON: /api/errors/0460759e9e177380.
Report an issue: GitHub.
Appendix: source
Thrown at skills/taste-application/scripts/tasteforge/assets.py:32
import struct
from pathlib import Path
from typing import Any
SCHEMA = 'tasteforge.assets.v1'
MODALITIES = {'image', 'video', '3d_asset'}
ORIGINS = {'local_passthrough', 'external_result', 'recovered_unverified'}
def _text(value: Any, name: str) -> str:
if not isinstance(value, str) or not value.strip():
raise ValueError(f'{name} must be a nonempty string')
return value
def _path(value: Any, base: Path) -> Path:
raw = _text(str(value) if isinstance(value, Path) else value, 'path')
if '://' in raw or raw.startswith(('file:', 'http:', 'https:')):
raise ValueError('Only local filesystem paths are supported')
path = Path(raw).expanduser()
if not path.is_absolute():
path = base / path
# Check before resolving '..' to avoid hiding a symlink in the path.
for part in (path, *path.parents):
if part.is_symlink():
raise ValueError(f'Symlinks are not accepted: {part}')
return path.resolve()
def _fingerprint(path: Path, modality: str | None = None) -> dict[str, Any]:
_path(path, Path.cwd())
try:
before = path.stat()
if not stat.S_ISREG(before.st_mode):
raise ValueError(f'Not a regular file: {path}')
flags = os.O_RDONLY | getattr(os, 'O_NOFOLLOW', 0) | os.O_NONBLOCK
fd = os.open(path, flags)View on GitHub (pinned to 8321021c54)