MAS v0.2 final (MAS-WP-0009 finished); residual MAS-WP-0014

Founder decision after the second implementation: close the two open gaps,
then declare v0.2 final. Section 13: parsers MUST reject over 64 octets
(fixtures p1-050/051); section 8: equivalence is between targets, key format
not normative. Draft markers removed, CHANGELOG dated 2026-10-19,
MAS_VERSION 0.2, mas_conformance vendors the v0.2 addresses.json. Mode
contract v0.1 stays draft: MAS-WP-0014 (independent email side).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 5787@bnt-lap001
Assistant-Session: 5db26b82-138b-40cc-9856-4d5eb0f752fd
This commit is contained in:
tegwick 2026-10-19 13:35:10 +02:00
parent a841ceec73
commit f07576451a
16 changed files with 178 additions and 40 deletions

View file

@ -1,5 +1,5 @@
#!/usr/bin/env python3
"""Non-normative MAS v0.1 canonical ASCII reference parser."""
"""Non-normative MAS canonical ASCII reference parser (grammar unchanged since v0.1.1)."""
import argparse
import json
@ -21,7 +21,7 @@ def parse(local_part, profile="p1"):
try:
local_part.encode("ascii")
except UnicodeEncodeError:
raise ValueError("non-ASCII outside canonical MAS v0.1")
raise ValueError("non-ASCII outside canonical MAS")
if '"' in local_part or "\\" in local_part or "@" in local_part:
raise ValueError("quoted/escaped/full address outside canonical local-part grammar")
@ -114,7 +114,7 @@ def self_test():
if failures:
print(json.dumps(failures, indent=2))
raise SystemExit(1)
print(f"PASS: {len(fixtures)} MAS v0.1 fixtures")
print(f"PASS: {len(fixtures)} MAS v0.2 fixtures")
if __name__ == "__main__":
ap = argparse.ArgumentParser()