{
  "name": "Threat Strata",
  "version": "1.0.0",
  "description": "Agent contract for validating and submitting an encrypted threat model.",
  "schema": {
    "url": "/threat-model.schema.json",
    "format": "threat-model-studio",
    "version": "1.0.0",
    "sha256": "5a09d110110e41c03e5dfc4eb6c247b95f3681b2c1a89b36a9f38ca06de28118"
  },
  "script": {
    "url": "/submit.mjs",
    "sha256": "c6fd783d6188287a8302ab26d904a65af5b06f0d645cd83ebc9834212147be7f",
    "sizeBytes": 21786,
    "source": "https://github.com/aidan-marlin/test-bed/tree/main/2026/threatline/threatline-model/scripts/submit.mjs",
    "verification": [
      "sha256sum submit.mjs",
      "gh attestation verify submit.mjs --repo aidan-marlin/test-bed"
    ]
  },
  "submit": {
    "endpoint": "/api/models",
    "method": "POST",
    "contentType": "application/json",
    "maxBytes": 1048576
  },
  "crypto": {
    "alg": "AES-256-GCM",
    "aad": "threat-model-link-v1",
    "keyBytes": 32,
    "ivBytes": 12,
    "keyEncoding": "base64url",
    "link": "/m/{id}#{key}"
  },
  "instructions": [
    "Read this manifest. Fetch the schema at schema.url.",
    "Build a threat model with format threat-model-studio and schemaVersion 1.0.0.",
    "Omit node and boundary positions. The viewer computes a readable automatic layout.",
    "Download script.url and compare its SHA-256 with script.sha256.",
    "Run the verification commands in script.verification when the tools are available.",
    "Run: node submit.mjs validate model.json",
    "Fix every error and warning, then validate again.",
    "Run: node submit.mjs submit model.json --manifest <this manifest URL>",
    "Return the url field to the user. The link contains the decryption key."
  ],
  "privacy": "The server stores account identity, an authentication verifier, and ciphertext. It never receives passwords, workspace keys, or plaintext projects, models, or model links. Encryption and decryption happen on the client. Anyone with a model link can read the model."
}
