{
 "spec": "draft-zambo-aer1-09",
 "kit": "rambozambodotdev/zambo@2307a7fd",
 "generated_by": "ARION neg-corpus generator (kit-submission/generate.js)",
 "review_gate": "each vector isolates exactly one rule; expected rejection is the reference runner's verbatim reason text",
 "runner_columns": {
  "py": "aer-1/conformance.py policy (ensure_ascii: escapes > U+007E AND U+007F; typed JSON)",
  "kitjs": "aer-1/conformance.js policy (jsonAsciiV07: escapes >= U+0080; DEL literal; Number.isInteger)",
  "arion": "deliverables/aer1/verify.js (same escaping policy as kitjs)"
 },
 "vectors": [
  {
   "name": "ax-base64-unpadded",
   "file": "vectors/ax-base64-unpadded.json",
   "kind": "receipt",
   "isolates": "strict base64: padding required (length % 4 == 0)",
   "desc": "canonical_bytes content valid but '=' padding stripped; output_hash still matches the intended decoded bytes",
   "expected": {
    "py": {
     "verdict": "invalid",
     "reason": "canonical_bytes is not valid base64"
    },
    "kitjs": {
     "verdict": "invalid",
     "reason": "canonical_bytes is not valid base64"
    },
    "arion": {
     "verdict": "invalid",
     "reason": "canonical_bytes is not valid base64"
    }
   }
  },
  {
   "name": "ax-feb29-non-leap",
   "file": "vectors/ax-feb29-non-leap.json",
   "kind": "receipt",
   "isolates": "Gregorian leap rule (Feb 29 in a non-leap year)",
   "desc": "29 February 2023: passes the RFC 3339 pattern and the day<=31 bound, fails only the leap rule",
   "expected": {
    "py": {
     "verdict": "invalid",
     "reason": "created_at is not a valid calendar date/time"
    },
    "kitjs": {
     "verdict": "invalid",
     "reason": "created_at is not a valid calendar date/time"
    },
    "arion": {
     "verdict": "invalid",
     "reason": "created_at is not a valid calendar date/time"
    }
   }
  },
  {
   "name": "ax-feb29-1900",
   "file": "vectors/ax-feb29-1900.json",
   "kind": "receipt",
   "isolates": "century rule (1900-02-29 is not a date)",
   "desc": "the %4-only leap shortcut accepts 1900-02-29; the proleptic Gregorian rule does not",
   "expected": {
    "py": {
     "verdict": "invalid",
     "reason": "created_at is not a valid calendar date/time"
    },
    "kitjs": {
     "verdict": "invalid",
     "reason": "created_at is not a valid calendar date/time"
    },
    "arion": {
     "verdict": "invalid",
     "reason": "created_at is not a valid calendar date/time"
    }
   }
  },
  {
   "name": "ax-genesis-single",
   "file": "vectors/ax-genesis-single.json",
   "kind": "chain",
   "isolates": "genesis: entry 0 prev_digest MUST be 64 zero characters",
   "desc": "one closed entry, non-zero prev_digest; no entry-1 link exists to mask the genesis violation (v07-bad-genesis is caught by the link check even with the genesis rule removed)",
   "expected": {
    "py": {
     "verdict": "invalid",
     "reason": "entry 0 prev_digest is not 64 zero characters"
    },
    "kitjs": {
     "verdict": "invalid",
     "reason": "entry 0 prev_digest is not 64 zero characters"
    },
    "arion": {
     "verdict": "invalid",
     "reason": "entry 0 prev_digest is not 64 zero characters"
    }
   }
  },
  {
   "name": "ax-entry-count-float",
   "file": "vectors/ax-entry-count-float.json",
   "kind": "commitment",
   "isolates": "commitment entry_count must be an integer (1.0 is not)",
   "desc": "DIVERGENT: py rejects ('commitment entry_count is not an integer'); double-typed parsers (kit js, arion) see 1 and accept. Isolation is lexical: only the '.0' differs.",
   "expected": {
    "py": {
     "verdict": "invalid",
     "reason": "commitment entry_count is not an integer"
    },
    "kitjs": {
     "verdict": "valid"
    },
    "arion": {
     "verdict": "valid"
    }
   },
   "divergent": true
  },
  {
   "name": "ax-tool-empty-scope",
   "file": "vectors/ax-tool-empty-scope.json",
   "kind": "receipt",
   "isolates": "tool.name/version/scope non-empty strings (scope cell)",
   "desc": "tool.scope is the empty string; complements colonist-one's x-tool-empty-name which covers the name cell",
   "expected": {
    "py": {
     "verdict": "invalid",
     "reason": "tool is not an object with name/version/scope strings"
    },
    "kitjs": {
     "verdict": "invalid",
     "reason": "tool is not an object with name/version/scope strings"
    },
    "arion": {
     "verdict": "invalid",
     "reason": "tool is not an object with name/version/scope strings"
    }
   }
  },
  {
   "name": "ax-esc-del-literal",
   "file": "vectors/ax-esc-del-literal.json",
   "kind": "chain",
   "isolates": "§7.1 escaping detail: U+007F (DEL), draft-literal reading",
   "desc": "DIVERGENT: link digested with DEL literal (draft text read strictly); reference escapes \\u007f -> 'entry 1 prev_digest does not match the digest of entry 0'. kitjs/arion accept.",
   "expected": {
    "py": {
     "verdict": "invalid",
     "reason": "entry 1 prev_digest does not match the digest of entry 0"
    },
    "kitjs": {
     "verdict": "valid"
    },
    "arion": {
     "verdict": "valid"
    }
   },
   "divergent": true
  },
  {
   "name": "ax-esc-hex-upper",
   "file": "vectors/ax-esc-hex-upper.json",
   "kind": "chain",
   "isolates": "§7.1 escaping detail: \\uXXXX hex digit case",
   "desc": "link digested with \\u00E9 (uppercase); every runner recomputes \\u00e9 -> link mismatch. Determinate today: invalid on all.",
   "expected": {
    "py": {
     "verdict": "invalid",
     "reason": "entry 1 prev_digest does not match the digest of entry 0"
    },
    "kitjs": {
     "verdict": "invalid",
     "reason": "entry 1 prev_digest does not match the digest of entry 0"
    },
    "arion": {
     "verdict": "invalid",
     "reason": "entry 1 prev_digest does not match the digest of entry 0"
    }
   }
  },
  {
   "name": "ax-esc-long-escape",
   "file": "vectors/ax-esc-long-escape.json",
   "kind": "chain",
   "isolates": "§7.1 escaping detail: short escapes (\\n vs \\u000a)",
   "desc": "link digested with \\u000a for the LF in tool; every runner recomputes \\n -> link mismatch. Determinate today: invalid on all.",
   "expected": {
    "py": {
     "verdict": "invalid",
     "reason": "entry 1 prev_digest does not match the digest of entry 0"
    },
    "kitjs": {
     "verdict": "invalid",
     "reason": "entry 1 prev_digest does not match the digest of entry 0"
    },
    "arion": {
     "verdict": "invalid",
     "reason": "entry 1 prev_digest does not match the digest of entry 0"
    }
   }
  },
  {
   "name": "ax-esc-del-escaped-ctrl",
   "file": "vectors/ax-esc-del-escaped-ctrl.json",
   "kind": "chain",
   "isolates": "control: U+007F escaped the reference way",
   "desc": "DIVERGENT (control): py accepts; kitjs/arion reject the link (they recompute DEL as literal). The symmetric half of gap 7.",
   "expected": {
    "py": {
     "verdict": "valid"
    },
    "kitjs": {
     "verdict": "invalid",
     "reason": "entry 1 prev_digest does not match the digest of entry 0"
    },
    "arion": {
     "verdict": "invalid",
     "reason": "entry 1 prev_digest does not match the digest of entry 0"
    }
   },
   "divergent": true,
   "control": true
  }
 ]
}
