{
  "schema_version": 1,
  "contract_id": "first-release-b3-agent-migration-scenarios-v1",
  "updated_at_utc": "2026-10-20T09:47:40.622187+00:00",
  "delivery_model": "three repository-local scenario skills with native/agent inventories, validated candidates, retained reference journeys and private resumable cases",
  "completion_scope": "Repository migration-kit delivery and exercised reference scenarios; not completion or approval of any actual customer migration",
  "skills": [
    "migration/skills/migrate-mosquitto/SKILL.md",
    "migration/skills/migrate-emqx/SKILL.md",
    "migration/skills/migration-cutover/SKILL.md"
  ],
  "workflow": "migration/references/case-workflow.md",
  "case_template": "migration/templates/case.json",
  "cli_contract": "migration/contracts/cli-report-v1.json",
  "cli_source_ReleaseSafe_qualified": true,
  "CLI_in_existing_images_qualified": false,
  "source_gate": "migration/evidence/b3.3/source-ReleaseSafe-reconciled.json",
  "current_source_continuity": "migration/evidence/b3.6/source-continuity.json",
  "reference_profiles": [
    {
      "id": "mosquitto-accepted-memory",
      "label": "Mosquitto accepted-memory",
      "source": "Mosquitto 2.1.2",
      "status": "both-existing-base-variants-reference-profile-pass",
      "customer_status": "requires-own-effective-inventory-traffic-and-compatibility-decisions",
      "receipt": "migration/evidence/b3.3/result.json",
      "report": "migration/evidence/b3.3/report.md",
      "required_variants": [
        "alpine",
        "debian"
      ],
      "final_variant_passes": 2,
      "limits": [
        "Explicit allowed client filters; B3-MOSQ-ACL-001",
        "No restart durability or native state import",
        "Historical source listener isolation corrected in B3.5"
      ]
    },
    {
      "id": "emqx-accepted-memory",
      "label": "EMQX accepted-memory",
      "source": "EMQX 6.3.2",
      "status": "both-existing-base-variants-reference-profile-pass",
      "customer_status": "requires-own-effective-inventory-traffic-and-compatibility-decisions",
      "receipt": "migration/evidence/emqx-accepted-memory-20261020/result.json",
      "report": "migration/evidence/emqx-accepted-memory-20261020/report.md",
      "required_variants": [
        "alpine",
        "debian"
      ],
      "final_variant_passes": 2,
      "limits": [
        "Source RAM retained and nondurable sessions",
        "B3-EMQX-LIMIT-001 and B3-EMQX-DENY-001",
        "No integration or cluster equivalence"
      ]
    },
    {
      "id": "mosquitto-durable-recovery",
      "label": "Mosquitto checkpoints and target durable recovery",
      "source": "Mosquitto 2.1.2",
      "status": "both-existing-base-variants-reference-profile-pass",
      "customer_status": "requires-own-effective-inventory-traffic-and-compatibility-decisions",
      "receipt": "migration/evidence/b3.4/result.json",
      "report": "migration/evidence/b3.4/report.md",
      "required_variants": [
        "alpine",
        "debian"
      ],
      "final_variant_passes": 2,
      "limits": [
        "Source clean checkpoint and target durable ACK are distinct",
        "Target/PostgreSQL process crash recovery, not power-loss or state-file conversion",
        "Historical source listener isolation corrected in B3.5"
      ]
    },
    {
      "id": "mosquitto-outbound-mqtt",
      "label": "Mosquitto outbound MQTT bridge",
      "source": "Mosquitto 2.1.2",
      "status": "both-existing-base-variants-reference-profile-pass",
      "customer_status": "requires-own-effective-inventory-traffic-and-compatibility-decisions",
      "receipt": "migration/evidence/b3.5/result.json",
      "report": "migration/evidence/b3.5/report.md",
      "required_variants": [
        "alpine",
        "debian"
      ],
      "final_variant_passes": 2,
      "limits": [
        "One outbound topic-prefix path and one owner",
        "B3-MOSQ-BRIDGE-RETRY-001 remains a customer decision",
        "Controlled duplicate means two actual sink deliveries; no idempotency inferred"
      ]
    },
    {
      "id": "emqx-rule-action-mqtt",
      "label": "EMQX SQL/action/MQTT connector",
      "source": "EMQX 6.3.2",
      "status": "both-existing-base-variants-reference-profile-pass",
      "customer_status": "requires-own-effective-inventory-traffic-and-compatibility-decisions",
      "receipt": "migration/evidence/b3.6/result.json",
      "report": "migration/evidence/b3.6/report.md",
      "required_variants": [
        "alpine",
        "debian"
      ],
      "final_variant_passes": 2,
      "limits": [
        "Topic-only SQL identity projection; explicit payload/QoS/retain templates",
        "B3-EMQX-ACTION-POLICY-001; source TTL/drop differs from target quarantine",
        "No source RAM buffer restart durability or arbitrary SQL conversion"
      ]
    }
  ],
  "installed_target_subjects": {
    "source_revision": "27d83a3a200d3166fa97c31f4c869870ec6153f0",
    "packaged_lane": "Integration and Edge",
    "alpine": "sha256:531b74e2a537f22e810283334a3d8af5bbc2c08056eb054815c0c65d0b9d01a2",
    "debian": "sha256:f333614f005d7c42158b97fa26b8d2d13b671f0155028836d842e22f99092b00",
    "runtime_profile_note": "Memory cases use evaluation settings; durable/integration cases run production_core settings within those Integration and Edge packages. No separate demo/core/enterprise image qualification is inferred."
  },
  "mandatory_customer_case_gates": [
    "Exact source/target identity and complete effective inventory, including plugins, includes, overrides, topology and dependencies",
    "Every required semantic has a defined mapping or an explicit accepted change; unresolved requirements block cutover",
    "Actual required traffic and limits replayed on the exact candidate; reference traffic is not a substitute",
    "All seven state-policy families resolved with receipts; source and sink frontiers reconciled",
    "Native candidate validation and full-stack route readiness; one side-effect owner with valid deployment authority",
    "Canary, bounded observation, failed-drain handling and post-write rollback or forward recovery exercised",
    "Private raw material retained and reviewed redacted evidence bound by hashes; no secret disclosure"
  ],
  "open_decisions": [
    {
      "id": "B3-MOSQ-ACL-001",
      "status": "open-for-general-source-migration",
      "description": "Mosquitto grants broad subscriptions and filters delivery; target rejects subscriptions outside explicit ACL coverage. The supported lab profile uses explicit allowed filters; do not claim transparent general migration."
    },
    {
      "id": "B3-EMQX-LIMIT-001",
      "status": "open-for-general-source-migration",
      "description": "Source packet, inflight, client-ID, alias, depth and subscription/session limits require explicit customer mappings; small-message lab coverage does not establish parity."
    },
    {
      "id": "B3-EMQX-DENY-001",
      "status": "open-for-general-source-migration",
      "description": "EMQX ACKs unauthorized MQTT 3.1.1 publication without delivery; target closes without delivery. Actual client reply contracts require a compatibility decision."
    },
    {
      "id": "B3-MOSQ-BRIDGE-RETRY-001",
      "status": "open-for-general-source-migration",
      "description": "Source automatic reconnect is not equivalent to finite target application retry/dead-letter. Bounded lab outage recovery and terminal quarantine do not accept a production delivery-policy change."
    },
    {
      "id": "B3-EMQX-ACTION-POLICY-001",
      "status": "open-for-general-source-migration",
      "description": "Source async memory_only buffer with elapsed request TTL/drop differs from target durable intent, finite retry attempts and durable terminal quarantine. Buffer byte/count/concurrency equivalence and customer delivery policy need an explicit deployment decision; no change accepted by lab."
    }
  ],
  "decision_workflow": "migration/references/compatibility-decisions.md",
  "outside_reference_qualification": [
    "Custom auth plugins/backends/chains and mTLS identity mappings",
    "Arbitrary SQL predicates/transforms, multiple actions/fallback ordering and other connectors",
    "Bidirectional MQTT links, MQTT 5 bridge lineage and persistent remote bridge session migration",
    "Clustered source-to-target ownership conversion or distributed fencing",
    "Automatic native database/session/queue/packet-ID import",
    "General capacity/performance equivalence, default image-user access or every product image tier",
    "Actual customer cutover, universal compatibility, exactly-once effects or lossless automatic migration"
  ],
  "later_release_obligations": [
    {
      "item": "Image-contained agent discovery and installed CLI command acceptance",
      "ledger_batch": "B4/B7",
      "status": "pending; no B3 installed command proof inferred"
    },
    {
      "item": "Installed acceptance of B3.3 Kafka SDK repair",
      "ledger_batch": "later owner-built affected image batch / B7",
      "status": "pending; source-qualified and unrelated to completed MQTT reference cases"
    }
  ],
  "general_customer_compatibility_proven": false,
  "customer_migration_completed": false,
  "release_authority": false,
  "status": "migration-kit-delivery-complete-reference-profiles-customer-gated",
  "delivery_acceptance": "migration/evidence/b3.7/acceptance.json"
}
