{
  "schema_version": 1,
  "evidence_type": "executed synthetic operations",
  "command": "python acceptance.py",
  "passed": true,
  "checks": [
    {
      "id": "classifications",
      "description": "Final fixture classification matches an independent expected table",
      "expected": {
        "new failure": 2,
        "repeated failure": 1,
        "failure without baseline": 0,
        "retry pass": 1,
        "recovered": 1,
        "pass": 14,
        "skipped": 1,
        "not reported": 1
      },
      "observed": {
        "new failure": 2,
        "repeated failure": 1,
        "failure without baseline": 0,
        "retry pass": 1,
        "recovered": 1,
        "pass": 14,
        "skipped": 1,
        "not reported": 1
      },
      "passed": true,
      "method": "Five synthetic builds use known fixture statuses and explicit full/partial modes."
    },
    {
      "id": "retained-history",
      "description": "Earlier attempts remain inspectable after partial retry",
      "expected": 12,
      "observed": 12,
      "passed": true,
      "method": "Original artifacts are retained as immutable BLOBs; twelve ingested job attempts."
    },
    {
      "id": "idempotent-reimport",
      "description": "Repeating all twelve imports adds no observations",
      "expected": [
        true,
        102
      ],
      "observed": [
        true,
        102
      ],
      "passed": true,
      "method": "Repeat exact basename/content/mode identities against the committed database."
    },
    {
      "id": "immutable-attempt",
      "description": "A different artifact cannot overwrite an existing attempt",
      "expected": [
        true,
        true
      ],
      "observed": [
        true,
        true
      ],
      "passed": true,
      "method": "Attempt key is build/job/attempt; complete artifact fingerprint and mode must agree."
    },
    {
      "id": "malformed-input",
      "description": "Malformed XML has no database side effects",
      "expected": [
        true,
        true
      ],
      "observed": [
        true,
        true
      ],
      "passed": true,
      "method": "Parse and validate every artifact before beginning the ingestion transaction."
    },
    {
      "id": "oversized-input",
      "description": "An actual file above 10 MiB is rejected by the CLI",
      "expected": [
        2,
        true
      ],
      "observed": [
        2,
        true
      ],
      "passed": true,
      "method": "Bounded file read and combined-attempt size check, using the production limit."
    },
    {
      "id": "abrupt-exit",
      "description": "Abrupt exit after a case insert leaves no partial build or artifact",
      "expected": [
        86,
        true
      ],
      "observed": [
        86,
        true
      ],
      "passed": true,
      "method": "A subprocess calls os._exit(86) inside the transaction, before COMMIT. SQLite recovers the journal on reopen; this is not a physical power-loss test."
    },
    {
      "id": "resume-after-exit",
      "description": "The interrupted identity can be imported once after restart",
      "expected": [
        true,
        6
      ],
      "observed": [
        true,
        6
      ],
      "passed": true,
      "method": "Normal ingestion after recovery and read-only analysis."
    },
    {
      "id": "concurrent-identical-import",
      "description": "Two concurrent importers commit one attempt and return one duplicate",
      "expected": [
        1,
        1,
        1
      ],
      "observed": [
        1,
        1,
        1
      ],
      "passed": true,
      "method": "Two real Python processes write the same database; BEGIN IMMEDIATE serializes comparison and insertion."
    },
    {
      "id": "embedded-artifact-roundtrip",
      "description": "Every embedded XML download reproduces its committed SHA-256",
      "expected": true,
      "observed": true,
      "passed": true,
      "method": "Parse the exact generated HTML JSON payload, decode all artifact bytes and recompute digests."
    },
    {
      "id": "deterministic-export",
      "description": "Unchanged committed history produces identical HTML",
      "expected": "f433e32970570adba9892b42daff89a84ae02446b976e039b5f6b0ff2be24ee7",
      "observed": "f433e32970570adba9892b42daff89a84ae02446b976e039b5f6b0ff2be24ee7",
      "passed": true,
      "method": "No wall-clock timestamp, random IDs or network state enters report generation."
    },
    {
      "id": "ci-exit-code",
      "description": "Check returns a failing job status for final failures",
      "expected": [
        1,
        3
      ],
      "observed": [
        1,
        3
      ],
      "passed": true,
      "method": "The CLI independently reports final failure/error count, without making XML ingestion itself a release gate."
    },
    {
      "id": "large-batch-count",
      "description": "Ten thousand synthetic results retain identities and ten failures",
      "expected": [
        10000,
        10
      ],
      "observed": [
        10000,
        10
      ],
      "passed": true,
      "method": "One generated XML file, actual local SQLite ingest and full analysis. Timing is an observation, not a service-level commitment."
    }
  ],
  "source_sha256": {
    "triage.py": "bfcc952e76356235cc3bea2c21eef86bf922174c35c29e4fdefd36b420e795de",
    "report.py": "7fbf3791eda164768368fcee5abe0508996e12f826f2b7d30578a550ac23a9bd",
    "fixtures.py": "0596fc732696d46a68d3739bcc6ef1d28c5d33fd6ea8876b4640d05651ff4704",
    "run_demo.py": "089bfa99e450b3a8ce67a04fca44167779342cae5ac7f929818fc9ea4c37f12d",
    "acceptance.py": "1416d4f48df5ce8c568053beeb7949cdf772a4245f2773bf4251cbc73a00caf3",
    "test_triage.py": "42dc6e1e24917b233f055fde70b60793871aaf3f7758a6ce23a9a8e942278f31",
    "verify.py": "68d39256a2ee8363fa0d8109162f3c9785bc28d6fcf0c157f0024ac1cbec4321",
    "README.md": "95e45bf27300e53977068de3edb928816481bee2fea89f8992c02d76be231b25"
  },
  "report": "completion/report.html",
  "limitations": [
    "Synthetic local fixtures, not production CI data.",
    "No provider API connector, automatic branch/commit comparison, root-cause diagnosis, or release certification.",
    "Abrupt process exit tests transaction recovery, not physical power-loss durability.",
    "Per-attempt resource limits do not impose an unlimited-history database or browser capacity guarantee."
  ],
  "results": {
    "tests": 10000,
    "input_bytes": 1051391,
    "ingest_seconds": 0.130844,
    "analysis_seconds": 0.084038,
    "database_bytes": 4542464,
    "python": "3.12.14",
    "sqlite": "3.53.1"
  }
}
