{
  "slug": "nanochat-python-vs-web",
  "title": "NanoChat: Python vs the web runtime",
  "question": "How much of nanochat survives the move to the browser?",
  "baseline": {
    "spec": "nanochat-python",
    "label": "nanochat (Python)",
    "url": "https://provespec.com/catalog/nanochat-python/spec.json"
  },
  "target": {
    "spec": "nanochat-web",
    "label": "NanoChat Web",
    "url": "https://provespec.com/catalog/nanochat-web/spec.json"
  },
  "parityPct": 33,
  "totals": {
    "considered": 36,
    "baselineHas": 36,
    "targetHas": 12,
    "missing": 4,
    "partial": 18,
    "different": 2,
    "targetOnly": 0
  },
  "byGroup": [],
  "missing": [
    {
      "path": [
        "CUDA, dtype, compilation, and FP8"
      ],
      "key": "catalog:F11",
      "note": "No CUDA training, dtype scaling, compilation, or FP8.",
      "matches": "Diagnostics exist, but training remains CPU-only.",
      "differs": "No CUDA training, dtype scaling, compilation, or FP8.",
      "confidence": 0.98
    },
    {
      "path": [
        "GSM8K rollout policy optimization"
      ],
      "key": "catalog:F18",
      "note": "No rewards, advantages, policy-gradient update, RL resume, or RL package.",
      "matches": "GSM8K evaluation exists but no rollout-policy training path exists.",
      "differs": "No rewards, advantages, policy-gradient update, RL resume, or RL package.",
      "confidence": 0.98
    },
    {
      "path": [
        "DDP training and coordinated overflow and checkpoint state"
      ],
      "key": "catalog:F32",
      "note": "No process group, DDP wrapper, synchronized overflow/metrics/checkpoints.",
      "matches": "Static rank partition helpers exist; no torch.distributed/DDP path exists.",
      "differs": "No process group, DDP wrapper, synchronized overflow/metrics/checkpoints.",
      "confidence": 0.98
    },
    {
      "path": [
        "Official pipeline and run scripts"
      ],
      "key": "catalog:F35",
      "note": "No official speedrun/miniseries/scaling/CPU pipeline orchestration.",
      "matches": "Individual services/workers exist.",
      "differs": "No official speedrun/miniseries/scaling/CPU pipeline orchestration.",
      "confidence": 0.98
    }
  ],
  "partial": [
    {
      "path": [
        "Named prepend and append encoding"
      ],
      "key": "catalog:F02",
      "note": "No isolated general prepend/append encoding contract.",
      "matches": "Named special identities and conversation boundaries exist.",
      "differs": "No isolated general prepend/append encoding contract.",
      "confidence": 0.9,
      "target": "Named prepend and append encoding"
    },
    {
      "path": [
        "Raw integer prepend and append IDs"
      ],
      "key": "catalog:F03",
      "note": "No isolated caller-owned prepend/append ID contract.",
      "matches": "Raw IDs are used internally for boundaries and stopping.",
      "differs": "No isolated caller-owned prepend/append ID contract.",
      "confidence": 0.9,
      "target": "Raw integer prepend and append IDs"
    },
    {
      "path": [
        "Named and raw boundaries on batch input"
      ],
      "key": "catalog:F04",
      "note": "No isolated ordered batch-boundary API.",
      "matches": "Batch generation and boundary-aware conversation paths exist.",
      "differs": "No isolated ordered batch-boundary API.",
      "confidence": 0.9,
      "target": "Named and raw boundaries on batch input"
    },
    {
      "path": [
        "Raw single-token bytes"
      ],
      "key": "catalog:F05",
      "note": "No pinned public single-token byte contract.",
      "matches": "Portable ranks and exact byte metrics exist.",
      "differs": "No pinned public single-token byte contract.",
      "confidence": 0.9,
      "target": "Raw single-token bytes"
    },
    {
      "path": [
        "Supplementary-plane Unicode encoding"
      ],
      "key": "catalog:F06",
      "note": "No shared supplementary-plane trainer/import/bytes fixture.",
      "matches": "UTF-8/tiktoken Unicode paths are tested.",
      "differs": "No shared supplementary-plane trainer/import/bytes fixture.",
      "confidence": 0.9,
      "target": "Supplementary-plane Unicode encoding"
    },
    {
      "path": [
        "Tokenizer training and official data acquisition"
      ],
      "key": "catalog:F07",
      "note": "No ClimbMix acquisition/cache/canonical shard proof.",
      "matches": "Bounded BPE training and local parquet reading exist.",
      "differs": "No ClimbMix acquisition/cache/canonical shard proof.",
      "confidence": 0.9,
      "target": "Tokenizer training and official data acquisition"
    },
    {
      "path": [
        "Best-fit packing and resumable distributed loader"
      ],
      "key": "catalog:F08",
      "note": "No checkpoint or process-group integration.",
      "matches": "Rank partitioning, best-fit packing, epoch cycling, and resume-state emission exist.",
      "differs": "No checkpoint or process-group integration.",
      "confidence": 0.9,
      "target": "Best-fit packing and resumable distributed loader"
    },
    {
      "path": [
        "Best-fit multi-conversation row packing"
      ],
      "key": "catalog:F13",
      "note": "Exact chat_sft best-fit/no-crop row behavior is unverified.",
      "matches": "Local task batching preserves assistant-only masks.",
      "differs": "Exact chat_sft best-fit/no-crop row behavior is unverified.",
      "confidence": 0.9,
      "target": "Best-fit multi-conversation row packing"
    },
    {
      "path": [
        "Upstream SmolTalk and task mixture ordering"
      ],
      "key": "catalog:F14",
      "note": "Upstream HubDataset mixture membership, weights, and order are absent.",
      "matches": "Exact local split-bound task objectives exist.",
      "differs": "Upstream HubDataset mixture membership, weights, and order are absent.",
      "confidence": 0.9,
      "target": "Upstream SmolTalk and task mixture ordering"
    },
    {
      "path": [
        "Ordered task dataset sequences"
      ],
      "key": "catalog:F16",
      "note": "Upstream TaskSequence/HubDataset curriculum semantics are absent.",
      "matches": "Ordered local task pipelines exist.",
      "differs": "Upstream TaskSequence/HubDataset curriculum semantics are absent.",
      "confidence": 0.9,
      "target": "Ordered task dataset sequences"
    },
    {
      "path": [
        "Immutable HubDataset row views"
      ],
      "key": "catalog:F17",
      "note": "Official Arrow-backed HubDataset acquisition is absent.",
      "matches": "Immutable content-preserving local task rows exist.",
      "differs": "Official Arrow-backed HubDataset acquisition is absent.",
      "confidence": 0.9,
      "target": "Immutable HubDataset row views"
    },
    {
      "path": [
        "Real upstream checkpoint and tokenizer interchange"
      ],
      "key": "catalog:F21",
      "note": "No direct .pt reader or authorized real-artifact round trip.",
      "matches": "Pinned non-pickle tensor/tokenizer interchange is tested with synthetic fixtures.",
      "differs": "No direct .pt reader or authorized real-artifact round trip.",
      "confidence": 0.9,
      "target": "Real upstream checkpoint and tokenizer interchange"
    },
    {
      "path": [
        "Token-native chat"
      ],
      "key": "catalog:F23",
      "note": "No authorized upstream artifact token/logit agreement.",
      "matches": "Real token-native resident chat and safe structured parts exist.",
      "differs": "No authorized upstream artifact token/logit agreement.",
      "confidence": 0.9,
      "target": "Token-native chat"
    },
    {
      "path": [
        "Safe calculator evaluator"
      ],
      "key": "catalog:F25",
      "note": "No resident generation/cache/token-budget integration.",
      "matches": "Bounded calculator and token state machine exist.",
      "differs": "No resident generation/cache/token-budget integration.",
      "confidence": 0.9,
      "target": "Safe calculator evaluator"
    },
    {
      "path": [
        "Inference benchmark matrix"
      ],
      "key": "catalog:F31",
      "note": "No CUDA timing, real VRAM, or full CLI matrix.",
      "matches": "Planning, accounting, summaries, and CPU decode timing exist.",
      "differs": "No CUDA timing, real VRAM, or full CLI matrix.",
      "confidence": 0.9,
      "target": "Inference benchmark matrix"
    },
    {
      "path": [
        "Parquet row-group partition and resume planning"
      ],
      "key": "catalog:F33",
      "note": "No training-checkpoint/process-group/device integration.",
      "matches": "Row-group planning/reads, rank partitioning, epochs, and resume-state emission exist.",
      "differs": "No training-checkpoint/process-group/device integration.",
      "confidence": 0.9,
      "target": "Parquet row-group partition and resume planning"
    },
    {
      "path": [
        "Flash Attention 3 and SDPA fallback"
      ],
      "key": "catalog:F34",
      "note": "No FA3 integration or upstream fallback matrix.",
      "matches": "PyTorch SDPA and CPU semantic masks are tested.",
      "differs": "No FA3 integration or upstream fallback matrix.",
      "confidence": 0.9,
      "target": "Flash Attention 3 and SDPA fallback"
    },
    {
      "path": [
        "Canonical headless test baseline"
      ],
      "key": "catalog:F36",
      "note": "Synthetic fixtures and one unrelated failure leave the canonical baseline partial.",
      "matches": "Engine passes 413/414; only the pre-existing Forward Pass visualization contract fails. Prior AI baseline was 157/157 and was not refreshed.",
      "differs": "Synthetic fixtures and one unrelated failure leave the canonical baseline partial.",
      "confidence": 0.9,
      "target": "Canonical headless test baseline"
    }
  ],
  "targetOnly": []
}
