{
  "protocolVersion": "v1",
  "fixtureSet": "version",
  "fixture": "additive-compatibility",
  "description": "Release skew in both directions. v1 grows by optional fields only, so an unknown field is discarded and an absent one takes its documented default.",
  "vectors": [
    {
      "name": "new agent sends a v1 field this Connect does not know",
      "direction": "new-agent-to-old-connect",
      "payload": {
        "protocolVersion": "v1",
        "agentVersion": "1.9.0",
        "capabilities": ["heartbeat"],
        "telemetryProfile": "extended"
      },
      "expected": {
        "decision": "ACCEPT",
        "retained": ["protocolVersion", "agentVersion", "capabilities"],
        "discarded": ["telemetryProfile"],
        "defaultsApplied": {},
        "echoedBack": [],
        "stored": []
      }
    },
    {
      "name": "new agent sends several unknown optional fields at once",
      "direction": "new-agent-to-old-connect",
      "payload": {
        "protocolVersion": "v1",
        "capabilities": ["heartbeat", "inventory", "bundle.upload"],
        "telemetryProfile": "extended",
        "regionHint": "eu-west",
        "experimentalFlags": {
          "fastHeartbeat": true
        }
      },
      "expected": {
        "decision": "ACCEPT",
        "retained": ["protocolVersion", "capabilities"],
        "discarded": ["telemetryProfile", "regionHint", "experimentalFlags"],
        "defaultsApplied": {
          "agentVersion": null
        },
        "echoedBack": [],
        "stored": []
      }
    },
    {
      "name": "old agent omits every optional field",
      "direction": "old-agent-to-new-connect",
      "payload": {
        "protocolVersion": "v1"
      },
      "expected": {
        "decision": "ACCEPT",
        "retained": ["protocolVersion"],
        "discarded": [],
        "defaultsApplied": {
          "agentVersion": null,
          "capabilities": []
        },
        "echoedBack": [],
        "stored": []
      }
    },
    {
      "name": "old agent reports no capabilities but names itself",
      "direction": "old-agent-to-new-connect",
      "payload": {
        "protocolVersion": "v1",
        "agentVersion": "1.0.0"
      },
      "expected": {
        "decision": "ACCEPT",
        "retained": ["protocolVersion", "agentVersion"],
        "discarded": [],
        "defaultsApplied": {
          "capabilities": []
        },
        "echoedBack": [],
        "stored": []
      }
    },
    {
      "name": "unknown fields do not rescue an unsupported major version",
      "direction": "new-agent-to-old-connect",
      "payload": {
        "protocolVersion": "v2",
        "agentVersion": "2.0.0",
        "compatibilityShim": "v1"
      },
      "expected": {
        "decision": "REJECT",
        "reason": "UNSUPPORTED_PROTOCOL",
        "httpStatus": 400,
        "retained": [],
        "discarded": [],
        "defaultsApplied": {},
        "echoedBack": [],
        "stored": []
      }
    }
  ]
}
