{
  "systemProfile": "sidecat.system/0.1",
  "appID": "https://example.invalid/sidecat/apps/contacts",
  "appVersion": "1.0.0",
  "purpose": "Keep contacts and replace them when the caller has their current version.",
  "helpPath": "docs/help.md",
  "interfaces": [
    {
      "id": "https://example.invalid/sidecat/interfaces/contacts/v1",
      "major": 1,
      "objects": [
        {
          "type": "https://example.invalid/sidecat/types/contact/v1",
          "protocols": [
            "read-current",
            "conditional-replace"
          ]
        }
      ],
      "operations": [
        {
          "name": "read",
          "inputSchema": "schemas/read-input.json",
          "outputSchema": "schemas/read-output.json",
          "effect": "read",
          "retry": "safe",
          "authority": {
            "action": "https://example.invalid/sidecat/actions/contact-read",
            "resourceField": "/ref"
          },
          "resourceClass": "storage-read",
          "failures": [
            "denied",
            "not-visible-or-missing",
            "unavailable"
          ],
          "atomicScope": "none",
          "concurrency": "none",
          "authorizationAt": "read",
          "supportedGuarantees": []
        },
        {
          "name": "replace",
          "inputSchema": "schemas/replace-input.json",
          "outputSchema": "schemas/replace-output.json",
          "effect": "local-mutation",
          "retry": "deduplicated",
          "retryKeyScope": "owner+enrollment+interface+operation",
          "retryStatusOperation": "replace-status",
          "authority": {
            "action": "https://example.invalid/sidecat/actions/contact-replace",
            "resourceField": "/ref"
          },
          "resourceClass": "storage-write",
          "failures": [
            "conflict",
            "denied",
            "not-visible-or-missing",
            "unavailable",
            "unknown"
          ],
          "atomicScope": "object",
          "concurrency": "compare-at-commit",
          "expectedVersionField": "/expected",
          "authorizationAt": "commit",
          "supportedGuarantees": [
            "https://example.invalid/sidecat/assurance/exact-candidate/v1"
          ],
          "retryHorizonSeconds": 86400
        },
        {
          "name": "replace-status",
          "inputSchema": "schemas/replace-status-input.json",
          "outputSchema": "schemas/replace-status-output.json",
          "effect": "read",
          "retry": "safe",
          "authority": {
            "action": "https://example.invalid/sidecat/actions/contact-replace-status",
            "resourceField": "/ref"
          },
          "resourceClass": "storage-read",
          "failures": [
            "denied",
            "not-visible-or-missing",
            "unavailable"
          ],
          "atomicScope": "none",
          "concurrency": "none",
          "authorizationAt": "read",
          "supportedGuarantees": []
        }
      ],
      "events": [
        {
          "name": "changed",
          "schema": "schemas/contact-changed.json",
          "version": 1,
          "delivery": "retained",
          "orderScope": "contact-owner",
          "minimumRetentionSeconds": 86400,
          "gap": "explicit"
        }
      ],
      "minor": 0,
      "profiles": []
    }
  ],
  "requires": []
}
