================================================================================
Card 13: Migrate EmbeddingGemma pilot Verification & Test Evidence
Date: 2026-11-01
Platform: Linux x86-64 AMD Strix Halo (gfx1151)
================================================================================

1. Extension API Check & Surface Verification:
--------------------------------------------------------------------------------
$ python3 tools/ci/check-extension-api.py --write
PASS: extension API surface (99 paths)

$ python3 tests/tools/check_extension_api_test.py
.......
----------------------------------------------------------------------
Ran 7 tests in 0.002s

OK

2. Extension Metadata & Discovery Test Suite:
--------------------------------------------------------------------------------
$ nix develop -c python3 tests/extensions/metadata_test.py
............
----------------------------------------------------------------------
Ran 12 tests in 10.424s

OK

$ nix develop -c python3 tests/extensions/discovery_test.py
.............
----------------------------------------------------------------------
Ran 13 tests in 46.992s

OK

3. Extension Isolation & Boundary Verification:
--------------------------------------------------------------------------------
$ python3 tests/tools/check_extension_isolation_test.py
..........................
----------------------------------------------------------------------
Ran 26 tests in 22.926s

OK

$ python3 tools/ci/check-extension-isolation.py --fail-on-core-model-includes --fail-on-serving-boundary --fail-on-family-graph --fail-on-target-ownership --fail-on-model-core-includes --fail-on-extension-boundary
[check-extension-isolation] REPORT ONLY (coupling does not fail this check)
  files: 1327
  includes: 8603
  cross_owner_includes: 1297
  namespace_references: 1373
  name_references: 15351
  configuration_mentions: 1879
  qwen_headers: 61
  family_libraries: 6
  family_edges: 7
...
[check-extension-isolation] PASS: core boundary (no src/core -> src/models|src/families includes)
[check-extension-isolation] PASS: serving boundary (no src/cli include from models, families, cache, src/ext or the public extension API)
[check-extension-isolation] PASS: model core boundary (no production src/models -> src/core|src/cache includes)
[check-extension-isolation] PASS: extension boundary (no src/cli -> src/models/embedding_gemma2 includes)
[check-extension-isolation] PASS: target ownership (17 libraries, 170 dependency edges)
[check-extension-isolation] PASS: family graph (6 libraries, 7 declared edges, acyclic)

4. CMake Build for Discovered Extension Targets and Tests:
--------------------------------------------------------------------------------
$ nix develop -c cmake --preset gpu-test
-- gufo: extension mode=discovery; included=[embedding_gemma2]; excluded=[]
-- gufo: HIP target gfx1151
-- Configuring done (0.3s)
-- Generating done (0.3s)
-- Build files have been written to: /home/mixer/gufo/build/gpu-test

$ nix develop -c cmake --build --preset gpu-test --target embedding_gemma2_config_test embedding_gemma2_loader_test embedding_gemma2_batch_scheduler_test embedding_gemma2_tokenizer_test embedding_gemma2_embeddings_api_test embedding_gemma2_image_processor_test embedding_gemma2_audio_processor_test embedding_gemma2_audio_decoder_test embedding_gemma2_video_processor_test embedding_gemma2_attention_hip_test embedding_gemma2_encoder_hip_test embedding_gemma2_embedding_golden_hip_test embedding_gemma2_gemm_bench_hip_test embedding_gemma2_image_golden_hip_test embedding_gemma2_audio_golden_hip_test ext_runtime_neutral_contracts_test gufo
[36/37] Linking HIP executable tests/models/embedding_gemma2/embedding_gemma2_embeddings_api_test
[37/37] Linking HIP executable gufo

5. EmbeddingGemma & Neutral Runtime Test Execution:
--------------------------------------------------------------------------------
$ nix develop -c ctest --preset gpu-full -R '^embedding_gemma2_.*' --output-on-failure
Test project /home/mixer/gufo/build/gpu-test
      Start 211: embedding_gemma2_config_test
 1/15 Test #211: embedding_gemma2_config_test .................   Passed    0.03 sec
      Start 212: embedding_gemma2_loader_test
 2/15 Test #212: embedding_gemma2_loader_test .................***Skipped   0.03 sec
      Start 213: embedding_gemma2_attention_hip_test
 3/15 Test #213: embedding_gemma2_attention_hip_test ..........   Passed    0.65 sec
      Start 214: embedding_gemma2_encoder_hip_test
 4/15 Test #214: embedding_gemma2_encoder_hip_test ............***Skipped   0.05 sec
      Start 215: embedding_gemma2_embedding_golden_hip_test
 5/15 Test #215: embedding_gemma2_embedding_golden_hip_test ...***Skipped   0.05 sec
      Start 216: embedding_gemma2_gemm_bench_hip_test
 6/15 Test #216: embedding_gemma2_gemm_bench_hip_test .........   Passed    1.49 sec
      Start 217: embedding_gemma2_batch_scheduler_test
 7/15 Test #217: embedding_gemma2_batch_scheduler_test ........   Passed    0.17 sec
      Start 218: embedding_gemma2_tokenizer_test
 8/15 Test #218: embedding_gemma2_tokenizer_test ..............***Skipped   0.03 sec
      Start 219: embedding_gemma2_embeddings_api_test
 9/15 Test #219: embedding_gemma2_embeddings_api_test .........   Passed    0.23 sec
      Start 220: embedding_gemma2_image_processor_test
10/15 Test #220: embedding_gemma2_image_processor_test ........   Passed    0.40 sec
      Start 221: embedding_gemma2_image_golden_hip_test
11/15 Test #221: embedding_gemma2_image_golden_hip_test .......***Skipped   0.06 sec
      Start 222: embedding_gemma2_audio_processor_test
12/15 Test #222: embedding_gemma2_audio_processor_test ........   Passed    0.03 sec
      Start 223: embedding_gemma2_audio_golden_hip_test
13/15 Test #223: embedding_gemma2_audio_golden_hip_test .......***Skipped   0.05 sec
      Start 224: embedding_gemma2_audio_decoder_test
14/15 Test #224: embedding_gemma2_audio_decoder_test ..........   Passed    0.03 sec
      Start 225: embedding_gemma2_video_processor_test
15/15 Test #225: embedding_gemma2_video_processor_test ........   Passed    0.76 sec

100% tests passed out of 15 (9 passed, 6 skipped missing external model weights, 0 failed)

$ nix develop -c ctest --preset gpu-full -R '^ext_runtime_neutral_contracts_test$' --output-on-failure
Test project /home/mixer/gufo/build/gpu-test
    Start 153: ext_runtime_neutral_contracts_test
1/1 Test #153: ext_runtime_neutral_contracts_test ...   Passed    0.00 sec

100% tests passed out of 1

6. Gufo Diagnostics Output (Discovery Mode):
--------------------------------------------------------------------------------
$ build/gpu-test/gufo diagnose
Extension API: 0.1.3
Extension selection: discovery
Built extensions:
  embedding_gemma2 0.1.0 (src/models/embedding_gemma2)
  provider embeddinggemma-2: available

7. Lock Mode Build & Diagnostics:
--------------------------------------------------------------------------------
$ nix develop -c cmake -S . -B /tmp/card13-lock-test -DGUFO_EXTENSIONS_FROM_LOCK=ON
-- gufo: extension mode=lock; included=[embedding_gemma2]; excluded=[]
$ nix develop -c cmake --build /tmp/card13-lock-test --target gufo --parallel 4
$ /tmp/card13-lock-test/gufo diagnose
Extension API: 0.1.3
Extension selection: lock
Built extensions:
  embedding_gemma2 0.1.0 (src/models/embedding_gemma2)
  provider embeddinggemma-2: available

8. Excluded Mode Build & Diagnostics:
--------------------------------------------------------------------------------
$ nix develop -c cmake -S . -B /tmp/card13-exclude-test -DGUFO_EXTENSIONS=""
-- gufo: extension mode=explicit; included=[]; excluded=[embedding_gemma2]
$ nix develop -c cmake --build /tmp/card13-exclude-test --target gufo --parallel 4
$ /tmp/card13-exclude-test/gufo diagnose
Extension API: 0.1.3
Extension selection: explicit
Built extensions: none
  excluded embedding_gemma2 0.1.0 (src/models/embedding_gemma2): not selected in explicit mode

9. Code Formatting:
--------------------------------------------------------------------------------
$ nix shell --inputs-from . nixpkgs#clang-tools -c python3 tools/ci/check-format.py
PASS: Checked 792 C++ files
