feat(inbox): fail-fast on filenames over the 255-byte limit
The slug inherited the whole filename stem with no length bound, so a long dropped name produced a filename the filesystem cannot hold — surfacing as an untyped OSError at the write, with an errno that differs per platform (63 on macOS, 36 on Linux). The inbox contract promises a typed per-file outcome, so the gate belongs in the pure function that forms the name. Refusal, not truncation: truncating is lossy AND collision-prone — two long names sharing a prefix would reduce to one filename and the second write would silently claim the first file. Same posture as `inbox_slug_empty`: the library never invents a filename the operator did not give it. The message carries the actual size and the limit, since the fix is to rename the dropped file. Limit verified empirically on APFS 2026-07-25: a 255-byte component writes, a 258-byte one raises errno 63. ext4 and NTFS cap at the same 255. New MaterializationError code `inbox_slug_too_long`, registered in the errors docstring and in the error-code conformance suite.
This commit is contained in:
parent
6b9b21c602
commit
b7f5ce3800
4 changed files with 102 additions and 2 deletions
|
|
@ -28,7 +28,7 @@ from llm_ingestion_okf.errors import (
|
|||
SourceError,
|
||||
)
|
||||
from llm_ingestion_okf.extract import extract_text
|
||||
from llm_ingestion_okf.inbox import inbox_slug, render_inbox_concept
|
||||
from llm_ingestion_okf.inbox import inbox_filename, inbox_slug, render_inbox_concept
|
||||
from llm_ingestion_okf.manifest import load_manifest, load_manifest_bytes
|
||||
from llm_ingestion_okf.materialize import materialize_bundle
|
||||
from llm_ingestion_okf.render import sql_value_to_text
|
||||
|
|
@ -363,6 +363,12 @@ def test_inbox_slug_empty() -> None:
|
|||
assert code_of(excinfo) == "inbox_slug_empty"
|
||||
|
||||
|
||||
def test_inbox_slug_too_long() -> None:
|
||||
with pytest.raises(MaterializationError) as excinfo:
|
||||
inbox_filename("a" * 247)
|
||||
assert code_of(excinfo) == "inbox_slug_too_long"
|
||||
|
||||
|
||||
def test_inbox_title_invalid() -> None:
|
||||
with pytest.raises(MaterializationError) as excinfo:
|
||||
inbox_concept(title="broken [link]")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue