{
  "schema_version": 1,
  "evidence_type": "executed synthetic operations and theoretical deployment",
  "command": "node complete.mjs",
  "passed": true,
  "checks": [
    {
      "id": "author-session",
      "description": "Load actual author client session",
      "expected": "Author workspace shown",
      "observed": "author · author  ",
      "passed": true,
      "method": "Actual static/app.js event handlers in Node vm with minimal DOM adapter, native WebCrypto, real HTTP and SQLite"
    },
    {
      "id": "client-upload",
      "description": "Hash and upload PDF through actual client submit handler",
      "expected": "Verified revision 2 with source file SHA-256",
      "observed": {
        "status": "verified",
        "sha256": "39b9e35fbe3954d7963b7ae0f0a13052da058808f31427d92e6b7b0771f4e939"
      },
      "passed": true,
      "method": "Actual static/app.js event handlers in Node vm with minimal DOM adapter, native WebCrypto, real HTTP and SQLite"
    },
    {
      "id": "control-release",
      "description": "Finish upload without leaving form disabled",
      "expected": "Submit enabled and change field cleared",
      "observed": {
        "disabled": false,
        "note": ""
      },
      "passed": true,
      "method": "Actual static/app.js event handlers in Node vm with minimal DOM adapter, native WebCrypto, real HTTP and SQLite"
    },
    {
      "id": "upload-interruption",
      "description": "Lose network after pending revision creation",
      "expected": "Revision 3 stays pending and retry control appears",
      "observed": {
        "status": "pending",
        "retry": true
      },
      "passed": true,
      "method": "Actual static/app.js event handlers in Node vm with minimal DOM adapter, native WebCrypto, real HTTP and SQLite"
    },
    {
      "id": "retry-integrity",
      "description": "Retry pending upload with wrong bytes",
      "expected": "Rejected without verification",
      "observed": "pending",
      "passed": true,
      "method": "Actual static/app.js event handlers in Node vm with minimal DOM adapter, native WebCrypto, real HTTP and SQLite"
    },
    {
      "id": "retry-original",
      "description": "Retry pending upload using original file",
      "expected": "Revision 3 verified once",
      "observed": "verified",
      "passed": true,
      "method": "Actual static/app.js event handlers in Node vm with minimal DOM adapter, native WebCrypto, real HTTP and SQLite"
    },
    {
      "id": "review-release",
      "description": "Review and release latest uploaded file through client controls",
      "expected": "Revision 3 released, prior release superseded",
      "observed": [
        {
          "number": 3,
          "status": "released"
        },
        {
          "number": 2,
          "status": "verified"
        },
        {
          "number": 1,
          "status": "superseded"
        }
      ],
      "passed": true,
      "method": "Actual static/app.js event handlers in Node vm with minimal DOM adapter, native WebCrypto, real HTTP and SQLite"
    },
    {
      "id": "client-export",
      "description": "Prepare export through actual client click handler",
      "expected": "Attached download anchor, JSON MIME and valid bundle",
      "observed": {
        "filename": "drawing-register-export.json",
        "mime": "application/json",
        "bytes": 1081182,
        "attached": true
      },
      "passed": true,
      "method": "Actual static/app.js event handlers in Node vm with minimal DOM adapter, native WebCrypto, real HTTP and SQLite"
    },
    {
      "id": "download-byte-restore",
      "description": "Restore exact JSON bytes produced by client export",
      "expected": "History and released file hash preserved",
      "observed": {
        "drawings": 2,
        "revisions": 4,
        "objects": 4,
        "release": "2009e2a0-48c9-4b4a-a187-86929567fea3"
      },
      "passed": true,
      "method": "Actual static/app.js event handlers in Node vm with minimal DOM adapter, native WebCrypto, real HTTP and SQLite"
    },
    {
      "id": "reader-ui",
      "description": "Load reader session after release",
      "expected": "Upload/release operations hidden and latest release readable",
      "observed": {
        "upload_hidden": true,
        "operator_hidden": true
      },
      "passed": true,
      "method": "Actual static/app.js event handlers in Node vm with minimal DOM adapter, native WebCrypto, real HTTP and SQLite"
    },
    {
      "id": "session-restart",
      "description": "Kill process and reuse prior session",
      "expected": "401; restart invalidates session cookies",
      "observed": 401,
      "passed": true,
      "method": "Real child process, HTTP, native SQLite and local files with synthetic documents"
    },
    {
      "id": "pending-durability",
      "description": "Abrupt process loss after file upload before finalization",
      "expected": "One pending stored file, no missing verified files",
      "observed": {
        "pending": 1,
        "missing": 0
      },
      "passed": true,
      "method": "Real child process, HTTP, native SQLite and local files with synthetic documents"
    },
    {
      "id": "finalize-after-crash",
      "description": "Finalize durable pending file after restart",
      "expected": "200 verified",
      "observed": "verified",
      "passed": true,
      "method": "Real child process, HTTP, native SQLite and local files with synthetic documents"
    },
    {
      "id": "release-durability",
      "description": "Kill after release transaction and restart",
      "expected": "Revision pointer, review and prior history survive",
      "observed": {
        "release_version": 2,
        "current": "8d7a214c-beed-4059-91d5-b9b4db3b2409",
        "revisions": 2
      },
      "passed": true,
      "method": "Real child process, HTTP, native SQLite and local files with synthetic documents"
    },
    {
      "id": "file-after-crash",
      "description": "Read released file after abrupt process loss",
      "expected": "Original SHA-256 retained",
      "observed": "39b9e35fbe3954d7963b7ae0f0a13052da058808f31427d92e6b7b0771f4e939",
      "passed": true,
      "method": "Real child process, HTTP, native SQLite and local files with synthetic documents"
    },
    {
      "id": "restore-rehearsal",
      "description": "Export after restart and restore into a new directory",
      "expected": "3 objects and matching release, database integrity ok",
      "observed": {
        "drawings": 2,
        "revisions": 3,
        "objects": 3,
        "integrity": "ok",
        "elapsed_ms": 17.559
      },
      "passed": true,
      "method": "Real child process, HTTP, native SQLite and local files with synthetic documents"
    },
    {
      "id": "tamper",
      "description": "Change exported metadata without changing manifest",
      "expected": "Restore refuses corrupt bundle",
      "observed": true,
      "passed": true,
      "method": "Real child process, HTTP, native SQLite and local files with synthetic documents"
    },
    {
      "id": "restore-destination",
      "description": "Restore cannot replace existing directory",
      "expected": "Existing file preserved",
      "observed": "preserve",
      "passed": true,
      "method": "Real child process, HTTP, native SQLite and local files with synthetic documents"
    },
    {
      "id": "recovery-window",
      "description": "Evaluate selected backup and restore schedule",
      "expected": "RPO <=15 min and RTO <=15 min under declared timings",
      "observed": {
        "rpo_minutes": 15,
        "rto_minutes": 8
      },
      "passed": true,
      "method": "Deterministic theoretical deployment calculation with declared inputs; no remote infrastructure is provisioned"
    },
    {
      "id": "stale-backup-rejected",
      "description": "Evaluate an old daily snapshot against 15 min target",
      "expected": "Daily snapshot rejected",
      "observed": {
        "rpo_minutes": 1440,
        "accepted": false
      },
      "passed": true,
      "method": "Deterministic theoretical deployment calculation with declared inputs; no remote infrastructure is provisioned"
    },
    {
      "id": "slow-restore-rejected",
      "description": "Evaluate slow operator recovery",
      "expected": "RTO breach visible",
      "observed": {
        "rto_minutes": 33,
        "accepted": false
      },
      "passed": true,
      "method": "Deterministic theoretical deployment calculation with declared inputs; no remote infrastructure is provisioned"
    },
    {
      "id": "single-host-availability",
      "description": "Combine independent illustrative network, proxy and host availabilities",
      "expected": "Product below 99.9%; no high-availability claim",
      "observed": {
        "component_availability": [
          0.999,
          0.999,
          0.995
        ],
        "series_availability": 0.993010995,
        "expected_minutes_per_30_days": 301.9250159999997
      },
      "passed": true,
      "method": "Deterministic theoretical deployment calculation with declared inputs; no remote infrastructure is provisioned"
    },
    {
      "id": "boundary-4",
      "description": "loopback reference with demo identities",
      "expected": "Policy decision true",
      "observed": {
        "allowed": true,
        "scope": "Theoretical deployment policy, separate from the localhost application"
      },
      "passed": true,
      "method": "Deterministic theoretical deployment calculation with declared inputs; no remote infrastructure is provisioned"
    },
    {
      "id": "boundary-5",
      "description": "public listener with demo identities",
      "expected": "Policy decision false",
      "observed": {
        "allowed": false,
        "scope": "Theoretical deployment policy, separate from the localhost application"
      },
      "passed": true,
      "method": "Deterministic theoretical deployment calculation with declared inputs; no remote infrastructure is provisioned"
    },
    {
      "id": "boundary-6",
      "description": "public listener without TLS",
      "expected": "Policy decision false",
      "observed": {
        "allowed": false,
        "scope": "Theoretical deployment policy, separate from the localhost application"
      },
      "passed": true,
      "method": "Deterministic theoretical deployment calculation with declared inputs; no remote infrastructure is provisioned"
    },
    {
      "id": "boundary-7",
      "description": "modeled private authenticated gateway",
      "expected": "Policy decision true",
      "observed": {
        "allowed": true,
        "scope": "Theoretical deployment policy, separate from the localhost application"
      },
      "passed": true,
      "method": "Deterministic theoretical deployment calculation with declared inputs; no remote infrastructure is provisioned"
    },
    {
      "id": "export-capacity",
      "description": "Evaluate 12 two-MiB PDF revisions",
      "expected": "Fits 48 MiB export content limit",
      "observed": {
        "raw_bytes": 25165824,
        "base64_json_bound": 34603008,
        "estimated_working_bytes": 94371840
      },
      "passed": true,
      "method": "Deterministic theoretical deployment calculation with declared inputs; no remote infrastructure is provisioned"
    },
    {
      "id": "large-export-rejected",
      "description": "Seven maximum-size PDF revisions",
      "expected": "Reference export limit rejects the aggregate",
      "observed": {
        "raw_bytes": 73400320,
        "accepted": false
      },
      "passed": true,
      "method": "Deterministic theoretical deployment calculation with declared inputs; no remote infrastructure is provisioned"
    }
  ],
  "source_sha256": {
    "app.ts": "ed041f88264c032aa52fc3031fa23dac1a406009dfa43de6533d0bd7531b7a31",
    "schema.sql": "a691f6e4d60c67f72289720d273c83adac03d1f4747a158fda29c0ea4b660ca6",
    "static/app.js": "80a8187670ba0bb6d7154f358fd243b4bd8dafdc6114530190228819a3ad7091",
    "static/index.html": "5cd4e7ddcc377c99d94b830c7df25c4b52b8a06a39ff424dd2cea8415acbb711",
    "client-rehearsal.mjs": "370f02b6e7cfd27ca8c557a204f408905498603ff29683cf9cc0fb661550a4d8",
    "operations.mjs": "e19cce35ccede06d9caa5d8d745b8c371e656b1863efafc96258da3c8e07cea4",
    "deployment-model.mjs": "a8c82d057ce97c33abbdac358c3320cb530f4dffe632de72ae943030124b570f",
    "deployment-inputs.json": "cc9d5db79e141e58ab6f70093dc8e1cc7a5491d12808a55865d308b5c1496beb",
    "complete.mjs": "e4c85da580bcf00459d313113fd204ca2af51308d1df4dd541c4b99cf72da6a2"
  },
  "report": "completion-report.html",
  "limitations": [
    "The client rehearsal models DOM events and download delivery; it does not claim an observed Chrome file-picker upload or operating-system download.",
    "The earlier Chrome run covers login, seeded release browsing and reconciliation.",
    "Remote identity, TLS and hosting are modeled as a deployment boundary. Public exposure of the demo server is rejected by the selected configuration.",
    "SIGKILL tests process failure, not sudden storage hardware loss. File and manifest digests detect corruption; they do not authenticate an untrusted export author."
  ],
  "generated_at": "2026-10-27T23:45:30.733Z"
}
