teleo-infrastructure/ops/shard_corpus_extraction_work.py

1023 lines
42 KiB
Python

#!/usr/bin/env python3
"""Build or verify deterministic shards for a verified corpus work index.
This command reads only inventory metadata. It does not read source snapshots,
extract claims, create proposals, admit knowledge, or write to a database.
"""
from __future__ import annotations
import argparse
import copy
import hashlib
import json
import os
import re
import stat
from collections.abc import Mapping, Sequence
from dataclasses import dataclass
from pathlib import Path, PurePosixPath
from typing import Any
try:
from . import run_local_corpus_knowledge_rebuild as inventory
except ImportError: # pragma: no cover - direct script execution
import run_local_corpus_knowledge_rebuild as inventory
SHARD_SCHEMA = "livingip.localCorpusExtractionWorkShard.v1"
MANIFEST_SCHEMA = "livingip.localCorpusExtractionShardManifest.v1"
RECEIPT_SCHEMA = "livingip.localCorpusExtractionShardReceipt.v1"
STATUS_SCHEMA = "livingip.localCorpusExtractionShardStatus.v1"
INVENTORY_BINDING_SCHEMA = "livingip.localCorpusInventoryBinding.v1"
MODE = "semantic-extraction-work-sharding"
ASSIGNMENT_ALGORITHM = "sha256_utf8_work_item_id_modulo_v1"
SHARDS_DIR = "shards"
MANIFEST_PATH = "shard-manifest.json"
RECEIPT_PATH = "receipt.json"
INCOMPLETE_MARKER = ".incomplete"
MIN_SHARD_COUNT = 1
MAX_SHARD_COUNT = 1024
MAX_METADATA_BYTES = inventory.MAX_METADATA_FILE_BYTES
SHA256_RE = re.compile(r"^[0-9a-f]{64}$")
NO_WRITE_FLAGS = dict(inventory.NO_WRITE_FLAGS)
WORK_ITEM_KEYS = {
"admission_performed",
"artifact_sha256",
"database_write_performed",
"locator",
"relative_path",
"semantic_claim_extraction_performed",
"snapshot_path",
"work_item_id",
"work_type",
}
LOCATOR_KEYS = {
"line_end",
"line_start",
"quote_sha256",
"section_ordinal",
"utf8_byte_end",
"utf8_byte_start",
}
class ShardError(RuntimeError):
"""Fail-closed sharding error with a stable, non-sensitive code."""
def __init__(self, code: str, safe_message: str) -> None:
super().__init__(safe_message)
self.code = code
self.safe_message = safe_message
@dataclass(frozen=True)
class InventoryView:
root: Path
binding: dict[str, Any]
items: list[dict[str, Any]]
@dataclass(frozen=True)
class ReservedOutput:
path: Path
name: str
parent_fd: int
root_fd: int
device: int
inode: int
def canonical_json_bytes(value: Any) -> bytes:
try:
return json.dumps(
value,
allow_nan=False,
ensure_ascii=True,
separators=(",", ":"),
sort_keys=True,
).encode("utf-8")
except (TypeError, ValueError) as exc:
raise ShardError("invalid_json_value", "shard data is not deterministic JSON") from exc
def canonical_sha256(value: Any) -> str:
return hashlib.sha256(canonical_json_bytes(value)).hexdigest()
def rendered_json_bytes(value: Any) -> bytes:
try:
rendered = json.dumps(
value,
allow_nan=False,
ensure_ascii=True,
indent=2,
sort_keys=True,
)
except (TypeError, ValueError) as exc:
raise ShardError("invalid_json_value", "shard data is not deterministic JSON") from exc
return (rendered + "\n").encode("utf-8")
def sha256_bytes(value: bytes) -> str:
return hashlib.sha256(value).hexdigest()
def _absolute_path(path: Path) -> Path:
expanded = path.expanduser()
return expanded if expanded.is_absolute() else Path.cwd() / expanded
def _directory_flags() -> int:
return os.O_RDONLY | getattr(os, "O_DIRECTORY", 0) | getattr(os, "O_CLOEXEC", 0) | getattr(os, "O_NOFOLLOW", 0)
def _assert_exact_keys(value: Mapping[str, Any], expected: set[str], *, label: str) -> None:
if set(value) != expected:
raise ShardError("invalid_shard_schema", f"{label} fields do not match the supported schema")
def _assert_no_write_flags(value: Mapping[str, Any], *, label: str) -> None:
for key, expected in NO_WRITE_FLAGS.items():
if value.get(key) is not expected:
raise ShardError("false_sharding_claim", f"{label} contains an unsupported side-effect claim")
def _assert_no_absolute_strings(value: Any) -> None:
if isinstance(value, dict):
for child in value.values():
_assert_no_absolute_strings(child)
elif isinstance(value, list):
for child in value:
_assert_no_absolute_strings(child)
elif isinstance(value, str) and (value.startswith(("/", "\\")) or re.match(r"^[A-Za-z]:[\\/]", value)):
raise ShardError("absolute_path_disclosure", "shard metadata must not contain absolute paths")
def _duplicate_free_json_object(raw: bytes, *, label: str) -> dict[str, Any]:
def pairs_hook(pairs: list[tuple[str, Any]]) -> dict[str, Any]:
value: dict[str, Any] = {}
for key, child in pairs:
if key in value:
raise ShardError("duplicate_json_key", f"{label} contains a duplicate JSON key")
value[key] = child
return value
def reject_constant(_value: str) -> None:
raise ShardError("invalid_json_value", f"{label} contains a non-finite JSON number")
try:
parsed = json.loads(raw.decode("utf-8"), object_pairs_hook=pairs_hook, parse_constant=reject_constant)
except ShardError:
raise
except (UnicodeError, json.JSONDecodeError) as exc:
raise ShardError("invalid_json", f"{label} is not valid duplicate-free UTF-8 JSON") from exc
if not isinstance(parsed, dict):
raise ShardError("invalid_json", f"{label} must be a JSON object")
return parsed
def _read_regular_bytes(path: Path, *, label: str) -> bytes:
try:
before = path.lstat()
except OSError as exc:
raise ShardError("missing_bundle_entry", f"{label} is missing") from exc
if stat.S_ISLNK(before.st_mode) or not stat.S_ISREG(before.st_mode):
raise ShardError("unsafe_bundle_entry", f"{label} must be a regular non-symlink file")
if before.st_size > MAX_METADATA_BYTES:
raise ShardError("metadata_limit_exceeded", f"{label} exceeds the metadata byte limit")
flags = os.O_RDONLY | getattr(os, "O_CLOEXEC", 0) | getattr(os, "O_NOFOLLOW", 0)
try:
descriptor = os.open(path, flags)
except OSError as exc:
raise ShardError("unsafe_bundle_entry", f"{label} could not be opened safely") from exc
try:
opened = os.fstat(descriptor)
if not stat.S_ISREG(opened.st_mode) or opened.st_dev != before.st_dev or opened.st_ino != before.st_ino:
raise ShardError("bundle_entry_changed", f"{label} changed while it was opened")
chunks: list[bytes] = []
total = 0
while True:
chunk = os.read(descriptor, 1024 * 1024)
if not chunk:
break
total += len(chunk)
if total > MAX_METADATA_BYTES:
raise ShardError("metadata_limit_exceeded", f"{label} exceeds the metadata byte limit")
chunks.append(chunk)
after = os.fstat(descriptor)
before_signature = (before.st_size, before.st_mtime_ns, before.st_ctime_ns)
after_signature = (after.st_size, after.st_mtime_ns, after.st_ctime_ns)
if before_signature != after_signature or total != after.st_size:
raise ShardError("bundle_entry_changed", f"{label} changed while it was read")
return b"".join(chunks)
finally:
os.close(descriptor)
def _inventory_status_signature(value: Mapping[str, Any]) -> tuple[Any, ...]:
return (
str(value.get("bundle_path")),
value.get("bundle_tree_sha256"),
value.get("receipt_file_sha256"),
value.get("source_count"),
value.get("unique_snapshot_count"),
value.get("work_item_count"),
)
def _load_verified_inventory(bundle: Path) -> InventoryView:
try:
first = inventory.verify_bundle(bundle)
except inventory.RebuildError as exc:
raise ShardError("inventory_verification_failed", exc.safe_message) from exc
root = Path(first["bundle_path"])
source_raw = _read_regular_bytes(root / inventory.SOURCE_MANIFEST_PATH, label="inventory source manifest")
work_raw = _read_regular_bytes(
root / inventory.EXTRACTION_WORK_INDEX_PATH,
label="inventory extraction-work index",
)
receipt_raw = _read_regular_bytes(root / inventory.RECEIPT_PATH, label="inventory receipt")
source_manifest = _duplicate_free_json_object(source_raw, label="inventory source manifest")
work_index = _duplicate_free_json_object(work_raw, label="inventory extraction-work index")
receipt = _duplicate_free_json_object(receipt_raw, label="inventory receipt")
try:
second = inventory.verify_bundle(root)
except inventory.RebuildError as exc:
raise ShardError("inventory_verification_failed", exc.safe_message) from exc
if _inventory_status_signature(first) != _inventory_status_signature(second):
raise ShardError("inventory_changed", "inventory metadata changed during verification")
items = work_index.get("items")
if not isinstance(items, list) or not items:
raise ShardError("invalid_inventory_work", "inventory must contain at least one extraction work item")
for item in items:
_validate_work_item(item, label="inventory work item")
source_hash = sha256_bytes(source_raw)
work_hash = sha256_bytes(work_raw)
receipt_hash = sha256_bytes(receipt_raw)
receipt_hashes = receipt.get("hashes")
if not isinstance(receipt_hashes, dict):
raise ShardError("inventory_hash_mismatch", "inventory receipt hashes are malformed")
if source_hash != receipt_hashes.get("source_manifest_file_sha256"):
raise ShardError("inventory_hash_mismatch", "inventory source-manifest hash does not match")
if work_hash != receipt_hashes.get("extraction_work_index_file_sha256"):
raise ShardError("inventory_hash_mismatch", "inventory extraction-work hash does not match")
if receipt_hash != first.get("receipt_file_sha256"):
raise ShardError("inventory_hash_mismatch", "inventory receipt file hash does not match")
binding_core = {
"schema": INVENTORY_BINDING_SCHEMA,
"mode": inventory.MODE_SOURCE_INVENTORY_ONLY,
"work_type": inventory.WORK_TYPE,
"source_manifest_schema": source_manifest.get("schema"),
"extraction_work_index_schema": work_index.get("schema"),
"inventory_receipt_schema": receipt.get("schema"),
"source_count": first.get("source_count"),
"work_item_count": first.get("work_item_count"),
"inventory_bundle_tree_sha256": first.get("bundle_tree_sha256"),
"source_manifest_file_sha256": source_hash,
"extraction_work_index_file_sha256": work_hash,
"inventory_receipt_file_sha256": receipt_hash,
}
binding = {
**binding_core,
"inventory_bundle_binding_sha256": canonical_sha256(
{
"inventory_bundle_tree_sha256": binding_core["inventory_bundle_tree_sha256"],
"inventory_receipt_file_sha256": receipt_hash,
}
),
}
binding["inventory_metadata_sha256"] = canonical_sha256(binding)
_validate_inventory_binding(binding, expected=binding)
return InventoryView(root=root, binding=binding, items=items)
def _validate_inventory_binding(value: Any, *, expected: Mapping[str, Any]) -> dict[str, Any]:
if not isinstance(value, dict):
raise ShardError("inventory_mismatch", "inventory binding must be an object")
expected_keys = {
"schema",
"mode",
"work_type",
"source_manifest_schema",
"extraction_work_index_schema",
"inventory_receipt_schema",
"source_count",
"work_item_count",
"inventory_bundle_tree_sha256",
"source_manifest_file_sha256",
"extraction_work_index_file_sha256",
"inventory_receipt_file_sha256",
"inventory_bundle_binding_sha256",
"inventory_metadata_sha256",
}
_assert_exact_keys(value, expected_keys, label="inventory binding")
preimage = dict(value)
metadata_hash = preimage.pop("inventory_metadata_sha256", None)
if metadata_hash != canonical_sha256(preimage):
raise ShardError("inventory_mismatch", "inventory metadata hash does not verify")
bundle_binding = canonical_sha256(
{
"inventory_bundle_tree_sha256": value.get("inventory_bundle_tree_sha256"),
"inventory_receipt_file_sha256": value.get("inventory_receipt_file_sha256"),
}
)
if value.get("inventory_bundle_binding_sha256") != bundle_binding:
raise ShardError("inventory_mismatch", "inventory bundle binding hash does not verify")
if value != expected:
raise ShardError("inventory_mismatch", "shards do not bind the supplied inventory bundle")
return value
def _validate_work_item(value: Any, *, label: str) -> dict[str, Any]:
if not isinstance(value, dict):
raise ShardError("invalid_work_item", f"{label} must be an object")
_assert_exact_keys(value, WORK_ITEM_KEYS, label=label)
_assert_no_write_flags(value, label=label)
if value.get("work_type") != inventory.WORK_TYPE:
raise ShardError("invalid_work_item", f"{label} has an unsupported work type")
work_id = value.get("work_item_id")
artifact_hash = value.get("artifact_sha256")
if not isinstance(work_id, str) or not SHA256_RE.fullmatch(work_id):
raise ShardError("invalid_work_item", f"{label} has a malformed work-item ID")
if not isinstance(artifact_hash, str) or not SHA256_RE.fullmatch(artifact_hash):
raise ShardError("invalid_work_item", f"{label} has a malformed artifact hash")
locator = value.get("locator")
if not isinstance(locator, dict):
raise ShardError("invalid_work_item", f"{label} has a malformed locator")
_assert_exact_keys(locator, LOCATOR_KEYS, label=f"{label} locator")
if not isinstance(locator.get("quote_sha256"), str) or not SHA256_RE.fullmatch(locator["quote_sha256"]):
raise ShardError("invalid_work_item", f"{label} has a malformed quote hash")
relative_path = value.get("relative_path")
snapshot_path = value.get("snapshot_path")
for candidate in (relative_path, snapshot_path):
if not isinstance(candidate, str):
raise ShardError("invalid_work_item", f"{label} has a malformed relative path")
path = PurePosixPath(candidate)
if path.is_absolute() or not path.parts or any(part in {"", ".", ".."} for part in path.parts):
raise ShardError("absolute_path_disclosure", f"{label} must contain only safe relative paths")
return value
def assignment_for(work_item_id: str, shard_count: int) -> int:
digest = hashlib.sha256(work_item_id.encode("utf-8")).digest()
return int.from_bytes(digest, "big") % shard_count
def _assignment_contract(shard_count: int) -> dict[str, Any]:
return {
"algorithm": ASSIGNMENT_ALGORITHM,
"hash": "sha256",
"input": "utf8(work_item_id)",
"reduction": "unsigned_big_endian_modulo_shard_count",
"shard_count": shard_count,
}
def _validate_shard_count(value: Any, *, work_item_count: int) -> int:
if isinstance(value, bool) or not isinstance(value, int):
raise ShardError("invalid_shard_count", "shard count must be an integer")
if not MIN_SHARD_COUNT <= value <= MAX_SHARD_COUNT:
raise ShardError("invalid_shard_count", "shard count must be between 1 and 1024")
if value > work_item_count:
raise ShardError("invalid_shard_count", "shard count must not exceed the work-item count")
return value
def _prepare_output(output: Path, *, inventory_root: Path) -> Path:
absolute = _absolute_path(output)
if absolute.name in {"", ".", ".."}:
raise ShardError("unsafe_output", "output-dir must name a new directory")
try:
parent = absolute.parent.resolve(strict=True)
except OSError as exc:
raise ShardError("unsafe_output_parent", "output-dir parent must be an existing directory") from exc
try:
parent_metadata = parent.lstat()
except OSError as exc:
raise ShardError("unsafe_output_parent", "output-dir parent could not be inspected") from exc
if stat.S_ISLNK(parent_metadata.st_mode) or not stat.S_ISDIR(parent_metadata.st_mode):
raise ShardError("unsafe_output_parent", "output-dir parent must be a real directory")
prepared = parent / absolute.name
try:
prepared.lstat()
except FileNotFoundError:
pass
except OSError as exc:
raise ShardError("unsafe_output", "output-dir could not be inspected safely") from exc
else:
raise ShardError("output_exists", "output-dir must not already exist")
inventory_resolved = inventory_root.resolve()
common = Path(os.path.commonpath((str(prepared), str(inventory_resolved))))
if common in {prepared, inventory_resolved}:
raise ShardError("overlapping_paths", "output-dir and inventory-bundle must not overlap")
return prepared
def _write_bytes_at(directory_fd: int, name: str, payload: bytes) -> None:
if not name or "/" in name or name in {".", ".."}:
raise ShardError("unsafe_output_entry", "output artifact name is unsafe")
flags = os.O_WRONLY | os.O_CREAT | os.O_EXCL | getattr(os, "O_CLOEXEC", 0) | getattr(os, "O_NOFOLLOW", 0)
try:
descriptor = os.open(name, flags, 0o600, dir_fd=directory_fd)
except OSError as exc:
raise ShardError("output_write_failed", "output artifact could not be created exclusively") from exc
try:
view = memoryview(payload)
while view:
written = os.write(descriptor, view)
if written <= 0:
raise ShardError("output_write_failed", "output artifact write did not complete")
view = view[written:]
os.fsync(descriptor)
finally:
os.close(descriptor)
def _write_json_at(directory_fd: int, name: str, value: Any) -> bytes:
payload = rendered_json_bytes(value)
_write_bytes_at(directory_fd, name, payload)
return payload
def _reserve_output(output: Path) -> ReservedOutput:
try:
parent_fd = os.open(output.parent, _directory_flags())
except OSError as exc:
raise ShardError("output_reservation_failed", "output parent could not be opened safely") from exc
try:
os.mkdir(output.name, mode=0o700, dir_fd=parent_fd)
except FileExistsError as exc:
os.close(parent_fd)
raise ShardError("output_exists", "output-dir must not already exist") from exc
except OSError as exc:
os.close(parent_fd)
raise ShardError("output_reservation_failed", "output-dir could not be reserved") from exc
root_fd: int | None = None
try:
root_fd = os.open(output.name, _directory_flags(), dir_fd=parent_fd)
metadata = os.fstat(root_fd)
reserved = ReservedOutput(
path=output,
name=output.name,
parent_fd=parent_fd,
root_fd=root_fd,
device=metadata.st_dev,
inode=metadata.st_ino,
)
_write_bytes_at(root_fd, INCOMPLETE_MARKER, b"corpus extraction sharding incomplete\n")
return reserved
except Exception:
if root_fd is not None:
try:
_remove_tree_contents(root_fd)
except OSError:
pass
os.close(root_fd)
try:
os.rmdir(output.name, dir_fd=parent_fd)
except OSError:
pass
os.close(parent_fd)
raise
def _assert_output_binding(reserved: ReservedOutput) -> None:
try:
opened = os.fstat(reserved.root_fd)
linked = os.stat(reserved.name, dir_fd=reserved.parent_fd, follow_symlinks=False)
except OSError as exc:
raise ShardError("output_binding_changed", "reserved output directory is no longer available") from exc
for metadata in (opened, linked):
if (
not stat.S_ISDIR(metadata.st_mode)
or stat.S_ISLNK(metadata.st_mode)
or metadata.st_dev != reserved.device
or metadata.st_ino != reserved.inode
):
raise ShardError("output_binding_changed", "reserved output directory identity changed")
if stat.S_IMODE(opened.st_mode) != 0o700:
raise ShardError("unsafe_private_permissions", "reserved output directory permissions changed")
def _remove_tree_contents(directory_fd: int) -> None:
for name in os.listdir(directory_fd):
try:
metadata = os.stat(name, dir_fd=directory_fd, follow_symlinks=False)
except FileNotFoundError:
continue
if stat.S_ISDIR(metadata.st_mode) and not stat.S_ISLNK(metadata.st_mode):
child_fd = os.open(name, _directory_flags(), dir_fd=directory_fd)
try:
_remove_tree_contents(child_fd)
finally:
os.close(child_fd)
os.rmdir(name, dir_fd=directory_fd)
else:
os.unlink(name, dir_fd=directory_fd)
def _release_reserved(reserved: ReservedOutput) -> None:
os.close(reserved.root_fd)
os.close(reserved.parent_fd)
def _cleanup_reserved(reserved: ReservedOutput) -> None:
try:
_remove_tree_contents(reserved.root_fd)
except OSError:
pass
try:
linked = os.stat(reserved.name, dir_fd=reserved.parent_fd, follow_symlinks=False)
if (
stat.S_ISDIR(linked.st_mode)
and not stat.S_ISLNK(linked.st_mode)
and linked.st_dev == reserved.device
and linked.st_ino == reserved.inode
):
os.rmdir(reserved.name, dir_fd=reserved.parent_fd)
except OSError:
pass
_release_reserved(reserved)
def _mkdir_at(directory_fd: int, name: str) -> int:
try:
os.mkdir(name, mode=0o700, dir_fd=directory_fd)
return os.open(name, _directory_flags(), dir_fd=directory_fd)
except OSError as exc:
raise ShardError("output_write_failed", "private shard directory could not be created") from exc
def _shard_path(index: int, shard_count: int) -> str:
return f"{SHARDS_DIR}/shard-{index:04d}-of-{shard_count:04d}.json"
def _artifact_records(root: Path, paths: Sequence[str]) -> list[dict[str, Any]]:
records: list[dict[str, Any]] = []
for relative in sorted(paths, key=lambda value: value.encode("utf-8")):
posix = PurePosixPath(relative)
if posix.is_absolute() or any(part in {"", ".", ".."} for part in posix.parts):
raise ShardError("unsafe_bundle_entry", "bundle artifact path is unsafe")
raw = _read_regular_bytes(root / Path(relative), label="shard artifact")
records.append({"bytes": len(raw), "path": relative, "sha256": sha256_bytes(raw)})
return records
def _after_output_reservation(_reserved: ReservedOutput) -> None:
"""Test seam after exclusive reservation; production does nothing."""
def _before_final_publication(_inventory_root: Path) -> None:
"""Test seam before final inventory revalidation; production does nothing."""
def _before_receipt_publication(_reserved: ReservedOutput) -> None:
"""Test seam while the incomplete marker must still exist."""
def build_shard_bundle(inventory_bundle: Path, output_dir: Path, shard_count: int) -> dict[str, Any]:
view = _load_verified_inventory(inventory_bundle)
checked_count = _validate_shard_count(shard_count, work_item_count=len(view.items))
output = _prepare_output(output_dir, inventory_root=view.root)
reserved = _reserve_output(output)
success = False
try:
_after_output_reservation(reserved)
_assert_output_binding(reserved)
assignments: list[list[dict[str, Any]]] = [[] for _ in range(checked_count)]
for item in sorted(view.items, key=lambda row: row["work_item_id"].encode("utf-8")):
assignments[assignment_for(item["work_item_id"], checked_count)].append(item)
shards_fd = _mkdir_at(reserved.root_fd, SHARDS_DIR)
shard_records: list[dict[str, Any]] = []
try:
for index, items in enumerate(assignments):
_assert_output_binding(reserved)
work_ids = [item["work_item_id"] for item in items]
shard_document = {
"schema": SHARD_SCHEMA,
"mode": MODE,
"deterministic": True,
**NO_WRITE_FLAGS,
"work_type": inventory.WORK_TYPE,
"inventory": view.binding,
"assignment": {**_assignment_contract(checked_count), "shard_index": index},
"work_item_count": len(items),
"work_item_ids_sha256": canonical_sha256(work_ids),
"items": items,
}
filename = Path(_shard_path(index, checked_count)).name
payload = _write_json_at(shards_fd, filename, shard_document)
shard_records.append(
{
"bytes": len(payload),
"index": index,
"path": _shard_path(index, checked_count),
"sha256": sha256_bytes(payload),
"work_item_count": len(items),
"work_item_ids_sha256": canonical_sha256(work_ids),
}
)
finally:
os.close(shards_fd)
assignment_contract = _assignment_contract(checked_count)
manifest = {
"schema": MANIFEST_SCHEMA,
"mode": MODE,
"deterministic": True,
**NO_WRITE_FLAGS,
"work_type": inventory.WORK_TYPE,
"inventory": view.binding,
"assignment": assignment_contract,
"shard_count": checked_count,
"work_item_count": len(view.items),
"shards": shard_records,
}
_assert_output_binding(reserved)
_write_json_at(reserved.root_fd, MANIFEST_PATH, manifest)
_before_final_publication(view.root)
fresh_view = _load_verified_inventory(view.root)
if fresh_view.binding != view.binding or fresh_view.items != view.items:
raise ShardError("inventory_changed", "inventory changed before shard publication")
artifact_paths = [MANIFEST_PATH, *(record["path"] for record in shard_records)]
artifacts = _artifact_records(output, artifact_paths)
receipt = {
"schema": RECEIPT_SCHEMA,
"status": "pass",
"result": "extraction_work_shards_ready",
"mode": MODE,
"deterministic": True,
**NO_WRITE_FLAGS,
"work_type": inventory.WORK_TYPE,
"inventory": view.binding,
"assignment": assignment_contract,
"shard_count": checked_count,
"work_item_count": len(view.items),
"outputs": {
"artifact_count": len(artifacts),
"artifacts": artifacts,
"manifest_path": MANIFEST_PATH,
},
"hashes": {
"bundle_tree_sha256": canonical_sha256(artifacts),
"manifest_file_sha256": next(
record["sha256"] for record in artifacts if record["path"] == MANIFEST_PATH
),
},
}
receipt["hashes"]["receipt_content_sha256"] = canonical_sha256(receipt)
_before_receipt_publication(reserved)
_assert_output_binding(reserved)
_write_json_at(reserved.root_fd, RECEIPT_PATH, receipt)
os.fsync(reserved.root_fd)
os.unlink(INCOMPLETE_MARKER, dir_fd=reserved.root_fd)
os.fsync(reserved.root_fd)
_assert_output_binding(reserved)
verified = verify_shard_bundle(view.root, output)
_assert_output_binding(reserved)
success = True
return {"bundle_path": output, "verification": verified}
finally:
if success:
_release_reserved(reserved)
else:
_cleanup_reserved(reserved)
def _validate_shard_root(bundle: Path) -> Path:
absolute = _absolute_path(bundle)
try:
metadata = absolute.lstat()
except OSError as exc:
raise ShardError("missing_shard_bundle", "shard bundle must be an existing directory") from exc
if stat.S_ISLNK(metadata.st_mode) or not stat.S_ISDIR(metadata.st_mode):
raise ShardError("unsafe_shard_bundle", "shard bundle must be a real non-symlink directory")
root = absolute.resolve()
if stat.S_IMODE(metadata.st_mode) != 0o700:
raise ShardError("unsafe_private_permissions", "shard bundle directory permissions must be 0700")
marker = root / INCOMPLETE_MARKER
if marker.exists() or marker.is_symlink():
raise ShardError("incomplete_shard_bundle", "shard bundle retains its incomplete marker")
return root
def _scan_bundle_tree(root: Path) -> tuple[set[str], set[str]]:
files: set[str] = set()
directories: set[str] = set()
def visit(directory: Path, relative_parent: PurePosixPath) -> None:
for child in sorted(directory.iterdir(), key=lambda path: path.name.encode("utf-8")):
relative = (relative_parent / child.name).as_posix()
metadata = child.lstat()
if stat.S_ISLNK(metadata.st_mode):
raise ShardError("unsafe_bundle_entry", "shard bundle contains a symlink")
if stat.S_ISDIR(metadata.st_mode):
if stat.S_IMODE(metadata.st_mode) != 0o700:
raise ShardError("unsafe_private_permissions", "shard directory permissions must be 0700")
directories.add(relative)
visit(child, relative_parent / child.name)
elif stat.S_ISREG(metadata.st_mode):
if stat.S_IMODE(metadata.st_mode) != 0o600:
raise ShardError("unsafe_private_permissions", "shard file permissions must be 0600")
files.add(relative)
else:
raise ShardError("unsafe_bundle_entry", "shard bundle contains a special file")
visit(root, PurePosixPath())
return files, directories
def _validate_common_document(
value: Any,
*,
expected_keys: set[str],
label: str,
expected_inventory: Mapping[str, Any],
) -> dict[str, Any]:
if not isinstance(value, dict):
raise ShardError("invalid_shard_schema", f"{label} must be an object")
_assert_exact_keys(value, expected_keys, label=label)
_assert_no_write_flags(value, label=label)
if value.get("mode") != MODE or value.get("deterministic") is not True:
raise ShardError("invalid_shard_schema", f"{label} mode or deterministic flag is unsupported")
if value.get("work_type") != inventory.WORK_TYPE:
raise ShardError("invalid_shard_schema", f"{label} work type is unsupported")
_validate_inventory_binding(value.get("inventory"), expected=expected_inventory)
_assert_no_absolute_strings(value)
return value
def verify_shard_bundle(inventory_bundle: Path, shard_bundle: Path) -> dict[str, Any]:
view = _load_verified_inventory(inventory_bundle)
root = _validate_shard_root(shard_bundle)
manifest_raw = _read_regular_bytes(root / MANIFEST_PATH, label="shard manifest")
receipt_raw = _read_regular_bytes(root / RECEIPT_PATH, label="shard receipt")
manifest = _duplicate_free_json_object(manifest_raw, label="shard manifest")
receipt = _duplicate_free_json_object(receipt_raw, label="shard receipt")
manifest_keys = {
"schema",
"mode",
"deterministic",
*NO_WRITE_FLAGS,
"work_type",
"inventory",
"assignment",
"shard_count",
"work_item_count",
"shards",
}
receipt_keys = {
"schema",
"status",
"result",
"mode",
"deterministic",
*NO_WRITE_FLAGS,
"work_type",
"inventory",
"assignment",
"shard_count",
"work_item_count",
"outputs",
"hashes",
}
_validate_common_document(
manifest,
expected_keys=manifest_keys,
label="shard manifest",
expected_inventory=view.binding,
)
_validate_common_document(
receipt,
expected_keys=receipt_keys,
label="shard receipt",
expected_inventory=view.binding,
)
if manifest.get("schema") != MANIFEST_SCHEMA or receipt.get("schema") != RECEIPT_SCHEMA:
raise ShardError("invalid_shard_schema", "shard manifest or receipt schema is unsupported")
if receipt.get("status") != "pass" or receipt.get("result") != "extraction_work_shards_ready":
raise ShardError("invalid_shard_schema", "receipt does not represent a completed shard bundle")
shard_count = _validate_shard_count(manifest.get("shard_count"), work_item_count=len(view.items))
if receipt.get("shard_count") != shard_count:
raise ShardError("invalid_shard_cardinality", "receipt shard count differs from the manifest")
assignment = _assignment_contract(shard_count)
if manifest.get("assignment") != assignment or receipt.get("assignment") != assignment:
raise ShardError("invalid_assignment", "shard assignment contract is unsupported")
if manifest.get("work_item_count") != len(view.items) or receipt.get("work_item_count") != len(view.items):
raise ShardError("invalid_shard_cardinality", "shard work-item count differs from the inventory")
shard_records = manifest.get("shards")
if not isinstance(shard_records, list) or len(shard_records) != shard_count:
raise ShardError("invalid_shard_cardinality", "manifest must contain one record per shard")
expected_files = {MANIFEST_PATH, RECEIPT_PATH}
expected_files.update(_shard_path(index, shard_count) for index in range(shard_count))
actual_files, actual_directories = _scan_bundle_tree(root)
if actual_directories != {SHARDS_DIR} or actual_files != expected_files:
raise ShardError("unexpected_bundle_entry", "shard bundle contains missing or unexpected entries")
expected_by_id = {item["work_item_id"]: item for item in view.items}
seen: set[str] = set()
expected_shard_records: list[dict[str, Any]] = []
shard_paths: list[str] = []
for index, record in enumerate(shard_records):
if not isinstance(record, dict):
raise ShardError("invalid_shard_schema", "shard record must be an object")
_assert_exact_keys(
record,
{"bytes", "index", "path", "sha256", "work_item_count", "work_item_ids_sha256"},
label="shard record",
)
path = _shard_path(index, shard_count)
if record.get("index") != index or record.get("path") != path:
raise ShardError("invalid_shard_order", "shard records are not in deterministic index order")
raw = _read_regular_bytes(root / Path(path), label="shard file")
document = _duplicate_free_json_object(raw, label="shard file")
shard_keys = {
"schema",
"mode",
"deterministic",
*NO_WRITE_FLAGS,
"work_type",
"inventory",
"assignment",
"work_item_count",
"work_item_ids_sha256",
"items",
}
_validate_common_document(
document,
expected_keys=shard_keys,
label="shard file",
expected_inventory=view.binding,
)
if document.get("schema") != SHARD_SCHEMA:
raise ShardError("invalid_shard_schema", "shard file schema is unsupported")
expected_assignment = {**assignment, "shard_index": index}
if document.get("assignment") != expected_assignment:
raise ShardError("invalid_assignment", "shard file assignment metadata is unsupported")
items = document.get("items")
if not isinstance(items, list):
raise ShardError("invalid_shard_schema", "shard items must be an array")
ids: list[str] = []
previous_id: str | None = None
for item in items:
_validate_work_item(item, label="shard work item")
work_id = item["work_item_id"]
if previous_id is not None and work_id.encode("utf-8") <= previous_id.encode("utf-8"):
raise ShardError("invalid_shard_order", "shard work items are not in deterministic order")
previous_id = work_id
if work_id in seen:
raise ShardError("duplicate_work_item", "a work-item ID appears more than once across shards")
if work_id not in expected_by_id:
raise ShardError("unknown_work_item", "a shard contains a work-item ID absent from the inventory")
if item != expected_by_id[work_id]:
raise ShardError("inventory_mismatch", "a shard work item differs from the verified inventory row")
if assignment_for(work_id, shard_count) != index:
raise ShardError("invalid_assignment", "a work item is assigned to the wrong hash shard")
seen.add(work_id)
ids.append(work_id)
ids_hash = canonical_sha256(ids)
if document.get("work_item_count") != len(items) or document.get("work_item_ids_sha256") != ids_hash:
raise ShardError("invalid_shard_cardinality", "shard item count or ID hash is incorrect")
expected_record = {
"bytes": len(raw),
"index": index,
"path": path,
"sha256": sha256_bytes(raw),
"work_item_count": len(items),
"work_item_ids_sha256": ids_hash,
}
if record != expected_record:
raise ShardError("invalid_shard_hash", "manifest shard record does not match shard bytes")
expected_shard_records.append(expected_record)
shard_paths.append(path)
missing = set(expected_by_id) - seen
if missing:
raise ShardError("missing_work_item", "one or more inventory work items are absent from all shards")
if shard_records != expected_shard_records:
raise ShardError("invalid_shard_hash", "manifest shard records are not reproducible")
artifacts = _artifact_records(root, [MANIFEST_PATH, *shard_paths])
outputs = receipt.get("outputs")
hashes = receipt.get("hashes")
if not isinstance(outputs, dict) or not isinstance(hashes, dict):
raise ShardError("invalid_shard_schema", "receipt outputs or hashes are malformed")
_assert_exact_keys(outputs, {"artifact_count", "artifacts", "manifest_path"}, label="receipt outputs")
_assert_exact_keys(
hashes,
{"bundle_tree_sha256", "manifest_file_sha256", "receipt_content_sha256"},
label="receipt hashes",
)
if outputs.get("manifest_path") != MANIFEST_PATH:
raise ShardError("invalid_shard_schema", "receipt manifest path is unsupported")
if outputs.get("artifacts") != artifacts or outputs.get("artifact_count") != len(artifacts):
raise ShardError("invalid_shard_hash", "receipt artifact inventory does not match bundle bytes")
expected_hashes = {
"bundle_tree_sha256": canonical_sha256(artifacts),
"manifest_file_sha256": sha256_bytes(manifest_raw),
}
for key, expected in expected_hashes.items():
if hashes.get(key) != expected:
raise ShardError("invalid_shard_hash", f"receipt {key} does not match bundle bytes")
receipt_preimage = copy.deepcopy(receipt)
preimage_hashes = receipt_preimage.get("hashes")
if not isinstance(preimage_hashes, dict):
raise ShardError("invalid_shard_schema", "receipt hash object is malformed")
recorded_receipt_hash = preimage_hashes.pop("receipt_content_sha256", None)
if recorded_receipt_hash != canonical_sha256(receipt_preimage):
raise ShardError("invalid_receipt_hash", "receipt content hash does not verify")
return {
"bundle_path": root,
"bundle_tree_sha256": expected_hashes["bundle_tree_sha256"],
"inventory_bundle_binding_sha256": view.binding["inventory_bundle_binding_sha256"],
"receipt_file_sha256": sha256_bytes(receipt_raw),
"shard_count": shard_count,
"status": "pass",
"work_item_count": len(seen),
}
def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--inventory-bundle", type=Path, required=True)
parser.add_argument("--output-dir", type=Path, help="new directory for deterministic shard artifacts")
parser.add_argument("--shard-count", type=int, help="number of stable hash shards, from 1 through 1024")
parser.add_argument("--verify-bundle", type=Path, help="read-only validation of an existing shard bundle")
return parser.parse_args(argv)
def _print_status(
status: str,
*,
operation: str,
reason: str | None = None,
message: str | None = None,
result: Mapping[str, Any] | None = None,
) -> None:
payload: dict[str, Any] = {
"schema": STATUS_SCHEMA,
"status": status,
"operation": operation,
"mode": MODE,
**NO_WRITE_FLAGS,
}
if reason is not None:
payload["reason"] = reason
if message is not None:
payload["message"] = message
if result is not None:
payload.update(
{
"bundle_tree_sha256": result["bundle_tree_sha256"],
"inventory_bundle_binding_sha256": result["inventory_bundle_binding_sha256"],
"receipt_file_sha256": result["receipt_file_sha256"],
"shard_count": result["shard_count"],
"work_item_count": result["work_item_count"],
}
)
print(json.dumps(payload, ensure_ascii=True, sort_keys=True))
def main(argv: list[str] | None = None) -> int:
args = parse_args(argv)
operation = "verify" if args.verify_bundle is not None else "build"
try:
if args.verify_bundle is not None:
if args.output_dir is not None or args.shard_count is not None:
raise ShardError("invalid_arguments", "verify mode accepts only inventory-bundle and verify-bundle")
result = verify_shard_bundle(args.inventory_bundle, args.verify_bundle)
else:
if args.output_dir is None or args.shard_count is None:
raise ShardError("invalid_arguments", "build mode requires output-dir and shard-count")
built = build_shard_bundle(args.inventory_bundle, args.output_dir, args.shard_count)
result = built["verification"]
except ShardError as exc:
_print_status("rejected", operation=operation, reason=exc.code, message=exc.safe_message)
return 2
except OSError:
_print_status(
"rejected",
operation=operation,
reason="filesystem_operation_failed",
message="a fail-closed filesystem operation did not complete",
)
return 2
_print_status("pass", operation=operation, result=result)
return 0
if __name__ == "__main__":
raise SystemExit(main())