# CLIP-style CPU experiment Tested: Python 3.12.14, NumPy 2.3.5, float64 CPU. No model/data download, PyTorch or GPU required. Run from this code directory (Python 3.12 recommended): ```sh python -m venv .venv .venv/bin/python -m pip install -r requirements.txt .venv/bin/python -m py_compile minimal_clip.py audit_results.py .venv/bin/python minimal_clip.py .venv/bin/python audit_results.py ``` Installation commands are instructions, not commands executed during this run. The execution used the existing bundled Python/NumPy runtime. Defaults overwrite only generated results; use `minimal_clip.py --output /your/experiment/path` for a new output folder (audit currently reads the default results directory). Three seeds (71,72,73); each seed changes image noise/position, initial weights and batch sampling. Train: 12 images per each of 9 color-shape classes, total 108. Test: 5 independently generated images per same class, total 45. No unseen-class or compositional holdout claim. No validation set: 400 steps, learning rate .01, Adam betas .9/.999, epsilon 1e-8, fixed logit scale 10, batch 9 with one class each, latent dimension16 are fixed in code. No test-based checkpoint selection. Two arms use identical initialization and sampled image batches; mismatched arm assigns a fixed cyclically shifted caption to each class. Raw RGB is flattened to 768 features, captions use six-word bag-of-words, two bias-free linear maps have 12384 parameters. No original CLIP preprocessing is used in this toy. `summary.json`: full configuration, metrics, gradient and duplicate-label fixtures. `*_data.npz`: actual train/test arrays, captions as features, sampled batches and initialization. `*_aligned.npz` / `*_mismatched.npz`: weights, training loss at every step, mapping and held-out score matrix. `audit.json`: independent scalar recomputation, split hashes, all ranking metrics, and erroneous query indices. Metric contract: i2t has 45 queries/9 gallery captions/1 relevant caption per image; t2i has 9 queries/45 gallery images/5 relevant images per caption. `hit@k` means at least one relevant result; `relevant_recall@k` is the fraction of all relevant items retrieved; MRR uses the first relevant rank. Ties use smaller gallery index first. Both directions use the complete gallery, never a training minibatch. Corpus grouping by class is intentional and fixed; inspect the tie fixture before using row identity as ground truth. Negative controls are part of the experiment, not data to discard. Duplicate fixture uses ideal manually specified similarities for 9 groups of3: semantic Hit@1=1 but exact-row Hit@1=1/3. Positive-mass loss in this fixture is a diagnostic alternative, not an implemented or benchmarked training arm. Temperature is fixed in training; changing a positive global scale in inference preserves ranks only for fixed embeddings and gallery. Original implementation follow-up (not executed): install a compatible torch/torchvision environment, pin the OpenAI CLIP repository commit, load `ViT-B/32` with `clip.load`, apply the returned preprocessing, call `clip.tokenize`, and normalize the outputs of `encode_image`/`encode_text` before matrix multiplication. Record checkpoint SHA256, package versions, image/caption ids, multiple-positive annotations and gallery split. The original training data and full pretraining run are not reproduced here. Do not compare these synthetic scores against the paper's reported natural-image results.