From d232942ad56bc38a49e821d2751cfeaaa659e0a2 Mon Sep 17 00:00:00 2001 From: pauldelucia Date: Mon, 1 Jun 2026 17:55:32 +0700 Subject: [PATCH] feat: deferred_completeness manifest field Mirrors willow-types WillowManifest.deferred_completeness (monorepo): opt into deferred completeness verification. Default off; serialize omits it when false so existing manifests stay byte-identical; parse tolerates absence. Required here because parse rejects unknown top-level keys. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/willow/manifest.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/willow/manifest.py b/src/willow/manifest.py index 751205a..de6ebb4 100644 --- a/src/willow/manifest.py +++ b/src/willow/manifest.py @@ -156,6 +156,7 @@ class WillowManifest: spec_version: str = MANIFEST_SPEC_VERSION data_sources: List[DataSource] = field(default_factory=list) description: Optional[str] = None + deferred_completeness: bool = False _EVENT_NAME_RE = re.compile(r"^[A-Za-z_][A-Za-z0-9_]*$") @@ -362,6 +363,8 @@ def serialize_manifest(manifest: WillowManifest) -> bytes: } if manifest.description is not None: payload["description"] = manifest.description + if manifest.deferred_completeness: + payload["deferred_completeness"] = True return json.dumps(payload, separators=(",", ":")).encode("utf-8") @@ -377,7 +380,12 @@ def parse_manifest(data: Union[bytes, str]) -> WillowManifest: if not isinstance(parsed, dict): raise ManifestValidationError("manifest must be a JSON object", "") - extra_keys = set(parsed.keys()) - {"spec_version", "description", "data_sources"} + extra_keys = set(parsed.keys()) - { + "spec_version", + "description", + "data_sources", + "deferred_completeness", + } if extra_keys: raise ManifestValidationError( f"manifest has unknown top-level fields: {sorted(extra_keys)!r}", "" @@ -438,6 +446,7 @@ def parse_manifest(data: Union[bytes, str]) -> WillowManifest: spec_version=parsed["spec_version"], data_sources=data_sources, description=parsed.get("description"), + deferred_completeness=bool(parsed.get("deferred_completeness", False)), ) validate_manifest(manifest) return manifest