Product Kit · 1.0.0

Local-only browser generation

Data Migration Prep Kit

Prepare explicitly mapped structured data for a manual import with safe exports, rejected-row evidence, and integrity digests.

Operators and developers preparing caller-owned CSV, TSV, JSON, or JSONL before using a destination system’s importer.

Nothing is uploaded. This page reads the selected file with File.text() and invokes the same deterministic core in your browser. It never imports, connects, or overwrites.

The visible sample was built locally during this static build. Downloads remain disabled until you preview the current input.

Accepted-row preview

[
  {
    "name": "Ada",
    "age": 42,
    "active": true
  }
]

Preparation envelope

{
  "ok": true,
  "schema_version": "utilito.product-kit.v1",
  "kit": {
    "id": "data-migration-prep-kit",
    "version": "1.0.0"
  },
  "result": {
    "status": "review_required",
    "preview": [
      {
        "name": "Ada",
        "age": 42,
        "active": true
      }
    ],
    "profile": {
      "format": "csv",
      "rows": 2,
      "fields": [
        {
          "name": "name",
          "present": 2,
          "nulls": 0,
          "types": {
            "string": 2,
            "number": 0,
            "boolean": 0,
            "object": 0,
            "array": 0
          },
          "unique": 2,
          "unique_truncated": false
        },
        {
          "name": "age",
          "present": 2,
          "nulls": 0,
          "types": {
            "string": 1,
            "number": 1,
            "boolean": 0,
            "object": 0,
            "array": 0
          },
          "unique": 2,
          "unique_truncated": false
        },
        {
          "name": "active",
          "present": 2,
          "nulls": 0,
          "types": {
            "string": 0,
            "number": 0,
            "boolean": 2,
            "object": 0,
            "array": 0
          },
          "unique": 2,
          "unique_truncated": false
        }
      ]
    },
    "converted_file": {
      "name": "migration-converted.csv",
      "mime_type": "text/csv",
      "bytes": 27,
      "rows": 1,
      "formula_cells_protected": 0,
      "content": "name,age,active\nAda,42,true"
    },
    "rejected_file": {
      "name": "migration-rejected.jsonl",
      "mime_type": "application/x-ndjson",
      "bytes": 171,
      "rows": 1,
      "content": "{\"row_number\":3,\"reasons\":[{\"code\":\"TRANSFORM_FAILED\",\"source_field\":\"age\",\"target_field\":\"age\"}],\"original_source_record\":{\"name\":\"Bob\",\"age\":\"unknown\",\"active\":\"false\"}}"
    },
    "diagnostics": {
      "input_rows": 2,
      "accepted_rows": 1,
      "rejected_rows": 1,
      "items": [
        {
          "row_number": 3,
          "code": "TRANSFORM_FAILED",
          "source_field": "age",
          "target_field": "age"
        }
      ]
    },
    "integrity_manifest": {
      "manifest": {
        "version": "utilito.file-integrity.v1",
        "algorithm": "sha256",
        "files": [
          {
            "path": "migration-converted.csv",
            "size": 27,
            "digest": "b8c1780f806008fcd3a0e7659285de1ab705a5406703384a06c3c3807779326a"
          },
          {
            "path": "migration-rejected.jsonl",
            "size": 171,
            "digest": "ca65b97f8b98c04fcb6a37a2e018afee8bc7c02eaedd2216df93a5a2dc9865cf"
          }
        ]
      },
      "text": "# utilito.file-integrity.v1\nalgorithm sha256\nb8c1780f806008fcd3a0e7659285de1ab705a5406703384a06c3c3807779326a  migration-converted.csv\nca65b97f8b98c04fcb6a37a2e018afee8bc7c02eaedd2216df93a5a2dc9865cf  migration-rejected.jsonl"
    },
    "report": {
      "format": "markdown",
      "mime_type": "text/markdown",
      "mode": "details",
      "contains_raw_values": false,
      "content": "# Data Migration Prep report\n\nStatus: **review_required**\nInput rows: 2. Accepted: 1. Rejected: 1.\nFormula-like string cells protected: 0.\n\nPrivacy: details include field names, row numbers, and reason codes; values are omitted.\n\n## Rejections\n\n- row 3: TRANSFORM\\_FAILED (age → age)\n"
    },
    "safety": {
      "input_overwritten": false,
      "import_executed": false,
      "database_connected": false,
      "uploaded": false,
      "formula_protection": true
    },
    "safe_actions": [
      {
        "code": "REVIEW_PREVIEW",
        "message": "Review the preview and diagnostics before downloading migration artifacts.",
        "automatic": false
      },
      {
        "code": "REVIEW_REJECTED_ROWS",
        "message": "Review rejected source rows and fix them in the original source before import.",
        "automatic": false
      },
      {
        "code": "VERIFY_INTEGRITY",
        "message": "Recompute SHA-256 digests before handing artifacts to an importer.",
        "automatic": false
      },
      {
        "code": "IMPORT_MANUALLY",
        "message": "Use your destination importer manually only after review and backup.",
        "automatic": false
      }
    ]
  },
  "receipt": {
    "input_bytes": 646,
    "output_bytes": 2864,
    "operations": 4,
    "omitted_items": 0,
    "warnings": [],
    "input_rows": 2,
    "accepted_rows": 1,
    "rejected_rows": 1,
    "formula_cells_protected": 0
  },
  "provenance": {
    "deterministic": true,
    "model_used": false,
    "network_used": false,
    "storage_used": false,
    "core_versions": {
      "data_migration_prep_kit": "1.0.0",
      "structured_data_inspection": "1.0.0",
      "csv_json_converter": "1.0.0",
      "file_integrity_manifest": "utilito.file-integrity.v1"
    }
  },
  "error": null
}

Free runnable capability

Prepare one bounded migration batch locally in the browser or through the response-only API with no signup.

Builder boundary

The existing Builder Pilot adds higher bounded batch orchestration; it does not add import execution, database access, storage, uploads, or formula-protection bypasses.

See the existing Builder Pilot

Local and response-only privacy

Browser file and text generation runs locally without upload. API and MCP callers use the response-only hosted core; submitted content is not retained, imported, overwritten, or sent to a model.

Limits and trust boundary

  • The kit only prepares artifacts. It never connects to a database, destination API, or importer and never overwrites the source.
  • CSV and TSV are parsed strictly with preserved field whitespace, exact widths, unique non-empty headers, and no silent header renaming. JSON member names must be lexically unique.
  • Only explicit scalar transforms are supported. Nested source values, guessed types, implicit coercion, custom code, and schema inference are rejected.
  • CSV and TSV string cells that begin after optional whitespace with =, +, -, or @ are always prefixed with an apostrophe before RFC quoting; numeric values remain numeric.
  • Rejected-row JSONL and detail reports are explicit raw/detail artifacts. Review and redact them before sharing.