Product Kit · 1.0.0

Browser-local · deterministic

API Migration Kit

Turn one bounded schema or selected inline OpenAPI operation change into explicit payload, client, fixture, and caller migration artifacts.

API client maintainers who need deterministic migration evidence without calling a remote API or inferring semantic renames.

Mappings are explicit top-level one-to-one changes only. Fixtures run against the bounded local validator; no remote API is called.

The visible sample was built locally during this static build. Regenerate current input to enable downloads.

Direction-aware compatibility matrix

{
  "direction": "request",
  "operation_selector": null,
  "supported_subset": "Conservative bounded subset: string type only (unions invalid), properties, required, additionalProperties boolean, items, enum, and const. title/description/default are annotation-only. Every changed unsupported keyword is unknown. Output property additions are non-breaking for tolerant consumers unless the previous output schema explicitly closed additionalProperties; then they are breaking.",
  "rows": [
    {
      "path": "request:$.mapping[\"customer_name\"->\"account_name\"]",
      "change": "explicit_field_mapping",
      "classification": "review",
      "from": "customer_name",
      "to": "account_name"
    },
    {
      "path": "request:$.properties[\"account_name\"]",
      "change": "property_added",
      "classification": "non_breaking"
    },
    {
      "path": "request:$.properties[\"count\"]",
      "change": "type_changed",
      "classification": "breaking"
    },
    {
      "path": "request:$.properties[\"customer_name\"]",
      "change": "property_removed",
      "classification": "breaking"
    },
    {
      "path": "request:$.properties[\"region\"]",
      "change": "property_added",
      "classification": "non_breaking"
    },
    {
      "path": "request:$.required[\"account_name\"]",
      "change": "required_added",
      "classification": "breaking"
    },
    {
      "path": "request:$.required[\"customer_name\"]",
      "change": "required_removed",
      "classification": "non_breaking"
    },
    {
      "path": "request:$.required[\"region\"]",
      "change": "required_added",
      "classification": "breaking"
    }
  ],
  "counts": {
    "breaking": 4,
    "non_breaking": 3,
    "unknown": 0,
    "review": 1,
    "total": 8
  }
}

Required caller changes

[
  {
    "code": "ADD_NEW_REQUIRED_FIELD",
    "field": "request:account_name",
    "from": null,
    "to": "account_name",
    "automatic": false
  },
  {
    "code": "ADD_NEW_REQUIRED_FIELD",
    "field": "request:region",
    "from": null,
    "to": "region",
    "automatic": false
  },
  {
    "code": "REMOVE_UNMAPPED_FIELD",
    "field": "request:customer_name",
    "from": "customer_name",
    "to": null,
    "automatic": false
  },
  {
    "code": "RENAME_FIELD_EXPLICITLY",
    "field": "request:account_name",
    "from": "customer_name",
    "to": "account_name",
    "automatic": false
  },
  {
    "code": "REVIEW_TYPE_CHANGE",
    "field": "request:$.properties[\"count\"]",
    "from": null,
    "to": null,
    "automatic": false
  }
]

Complete migration envelope

{
  "ok": true,
  "schema_version": "utilito.product-kit.v1",
  "kit": {
    "id": "api-migration-kit",
    "version": "1.0.0"
  },
  "result": {
    "decision": "block",
    "status": "blocked",
    "compatibility_matrix": {
      "direction": "request",
      "operation_selector": null,
      "supported_subset": "Conservative bounded subset: string type only (unions invalid), properties, required, additionalProperties boolean, items, enum, and const. title/description/default are annotation-only. Every changed unsupported keyword is unknown. Output property additions are non-breaking for tolerant consumers unless the previous output schema explicitly closed additionalProperties; then they are breaking.",
      "rows": [
        {
          "path": "request:$.mapping[\"customer_name\"->\"account_name\"]",
          "change": "explicit_field_mapping",
          "classification": "review",
          "from": "customer_name",
          "to": "account_name"
        },
        {
          "path": "request:$.properties[\"account_name\"]",
          "change": "property_added",
          "classification": "non_breaking"
        },
        {
          "path": "request:$.properties[\"count\"]",
          "change": "type_changed",
          "classification": "breaking"
        },
        {
          "path": "request:$.properties[\"customer_name\"]",
          "change": "property_removed",
          "classification": "breaking"
        },
        {
          "path": "request:$.properties[\"region\"]",
          "change": "property_added",
          "classification": "non_breaking"
        },
        {
          "path": "request:$.required[\"account_name\"]",
          "change": "required_added",
          "classification": "breaking"
        },
        {
          "path": "request:$.required[\"customer_name\"]",
          "change": "required_removed",
          "classification": "non_breaking"
        },
        {
          "path": "request:$.required[\"region\"]",
          "change": "required_added",
          "classification": "breaking"
        }
      ],
      "counts": {
        "breaking": 4,
        "non_breaking": 3,
        "unknown": 0,
        "review": 1,
        "total": 8
      }
    },
    "migrated_payload_examples": [
      {
        "id": "ready",
        "target": "request",
        "source_value": {
          "count": 2,
          "customer_name": "Ada",
          "region": "us"
        },
        "migrated_value": {
          "count": 2,
          "region": "us",
          "account_name": "Ada"
        }
      },
      {
        "id": "missing-region",
        "target": "request",
        "source_value": {
          "customer_name": "Bob"
        },
        "migrated_value": {
          "account_name": "Bob"
        }
      }
    ],
    "generated_client_diff": {
      "language": "typescript",
      "credential_free": true,
      "before": "const payload = {\n  \"count\": 2,\n  \"customer_name\": \"Ada\",\n  \"region\": \"us\"\n};\nconst response = await fetch(\"https://api.example.invalid/your-api-operation\", { method: \"POST\", headers: { \"Content-Type\": \"application/json\" }, body: JSON.stringify(payload) });\nconsole.log(await response.json());",
      "after": "const payload = {\n  \"count\": 2,\n  \"region\": \"us\",\n  \"account_name\": \"Ada\"\n};\nconst response = await fetch(\"https://api.example.invalid/your-api-operation\", { method: \"POST\", headers: { \"Content-Type\": \"application/json\" }, body: JSON.stringify(payload) });\nconsole.log(await response.json());"
    },
    "required_caller_changes": [
      {
        "code": "ADD_NEW_REQUIRED_FIELD",
        "field": "request:account_name",
        "from": null,
        "to": "account_name",
        "automatic": false
      },
      {
        "code": "ADD_NEW_REQUIRED_FIELD",
        "field": "request:region",
        "from": null,
        "to": "region",
        "automatic": false
      },
      {
        "code": "REMOVE_UNMAPPED_FIELD",
        "field": "request:customer_name",
        "from": "customer_name",
        "to": null,
        "automatic": false
      },
      {
        "code": "RENAME_FIELD_EXPLICITLY",
        "field": "request:account_name",
        "from": "customer_name",
        "to": "account_name",
        "automatic": false
      },
      {
        "code": "REVIEW_TYPE_CHANGE",
        "field": "request:$.properties[\"count\"]",
        "from": null,
        "to": null,
        "automatic": false
      }
    ],
    "fixture_assertions": {
      "validator": "utilito-contract-matrix-bounded-validator-v1",
      "remote_calls": 0,
      "results": [
        {
          "id": "ready",
          "target": "request",
          "expected": {
            "outcome": "accepted"
          },
          "actual": {
            "outcome": "accepted"
          },
          "passed": true
        },
        {
          "id": "missing-region",
          "target": "request",
          "expected": {
            "code": "SCHEMA_VALIDATION_FAILED",
            "outcome": "typed_error"
          },
          "actual": {
            "outcome": "typed_error",
            "code": "SCHEMA_VALIDATION_FAILED"
          },
          "passed": true
        }
      ],
      "summary": {
        "passed": 2,
        "failed": 0,
        "total": 2
      }
    },
    "migration_report": {
      "format": "markdown",
      "content": "# API Migration Kit report\n\nDecision: block\n\nCompatibility rows: 8\nFixture assertions passed: 2/2\n\nImplemented subset: closed inline JSON Schema object fragments or one selected inline OpenAPI 3.1 operation with literal paths; top-level explicit one-to-one field mappings only.\nNo remote API was called. Fixtures were checked only with the generated local bounded validator.\n\n## Required caller changes\n\n- ADD\\_NEW\\_REQUIRED\\_FIELD: request:account\\_name\n- ADD\\_NEW\\_REQUIRED\\_FIELD: request:region\n- REMOVE\\_UNMAPPED\\_FIELD: request:customer\\_name\n- RENAME\\_FIELD\\_EXPLICITLY: request:account\\_name\n- REVIEW\\_TYPE\\_CHANGE: request:$\\.properties\\[\"count\"\\]\n"
    },
    "artifact_manifest": [
      {
        "name": "compatibility_matrix",
        "media_type": "application/json",
        "bytes": 1783
      },
      {
        "name": "migrated_payload_examples",
        "media_type": "application/json",
        "bytes": 429
      },
      {
        "name": "generated_client_diff",
        "media_type": "application/json",
        "bytes": 721
      },
      {
        "name": "required_caller_changes",
        "media_type": "application/json",
        "bytes": 755
      },
      {
        "name": "fixture_assertions",
        "media_type": "application/json",
        "bytes": 673
      },
      {
        "name": "migration_report",
        "media_type": "text/markdown",
        "bytes": 657
      }
    ],
    "safety": {
      "remote_api_called": false,
      "credentials_accepted": false,
      "arbitrary_endpoint_accepted": false,
      "arbitrary_headers_accepted": false,
      "auth_injected": false,
      "model_used": false,
      "provider_called": false,
      "network_used": false,
      "storage_used": false,
      "telemetry_used": false,
      "write_back_performed": false,
      "deployment_performed": false
    }
  },
  "receipt": {
    "input_bytes": 1054,
    "output_bytes": 5678,
    "operations": 4,
    "omitted_items": 0,
    "warnings": [],
    "fixtures": 2,
    "mappings": 1,
    "artifacts": 6,
    "matrix_rows": 8
  },
  "provenance": {
    "deterministic": true,
    "model_used": false,
    "network_used": false,
    "storage_used": false,
    "core_versions": {
      "api_migration_kit": "1.0.0",
      "contract_matrix": "1.0.0",
      "fixture_validator": "1.0.0",
      "client_snippet": "credential-free-v1"
    }
  },
  "error": null
}

Free runnable capability

Build and download one bounded browser-local API migration packet with no signup.

Builder capability

The existing Builder Pilot can coordinate higher bounded review volume; it does not add API execution, credentials, write-back, deployment, storage, monitoring, or inferred migrations.

See the existing Builder Pilot

Privacy boundary

Browser generation runs locally. API and MCP are response-only; no endpoint, arbitrary header, authentication value, credential, remote call, model, network, storage, telemetry, write-back, or deployment is accepted or used.

Implemented subset and limits

  • Implemented compatibility is limited to the existing conservative type, properties, required, boolean additionalProperties, items, enum, and const subset on closed inline JSON Schema fragments or one selected inline OpenAPI 3.1 operation with literal paths only. OpenAPI 3.0 documents and templated paths are rejected because parameter declarations are outside this subset. References and unsupported semantics fail closed or become explicit review rows where the shared matrix supports that classification.
  • Field mappings are explicit one-to-one top-level request or response mappings only. Semantic renames, nested paths, transforms, defaults, coercion, and inferred values are never guessed. Removed, newly required, and type-changed fields produce deterministic block or review evidence.
  • Fixtures are migrated in memory and validated only with the generated bounded local validator against the selected current schema. No application behavior, remote endpoint, server response, or authentication flow is executed.
  • Generated clients use the fixed non-routable `https://api.example.invalid/your-api-operation` placeholder and Content-Type only when a body is allowed. GET, HEAD, and TRACE omit request bodies and Content-Type; JavaScript and TypeScript use the Node.js node:https fallback for TRACE. Arbitrary endpoints, headers, auth, credentials, models, providers, network, storage, telemetry, write-back, deployment, and pipeline execution are outside the contract.
  • Plain JSON safety inspection rejects credential-shaped keys and values, dangerous keys, accessors, cycles, custom or null prototypes, symbols, BigInt, non-finite values, excessive depth/nodes, oversized input, and complete success above 262,144 UTF-8 bytes. Node runtimes reject Proxy inputs without invoking their traps when util.types.isProxy is available. Browser-local product calls use JSON-derived plain data; a hostile Proxy passed directly through JavaScript fails generically, but JavaScript provides no trap-free browser API for identifying a Proxy.