---
name: umbraco-search-compat
description: 'Validate Examine v4 backward compatibility with Umbraco.Cms.Search by cloning the Umbraco.Cms.Search repo, swapping the Examine NuGet package reference to a local project reference, and verifying the build and tests pass. Use when checking API compatibility, verifying breaking changes, or validating that Examine v4 works with Umbraco.Cms.Search. Intended for the examine-compat-validator custom agent.'
compatibility: 'Requires git and dotnet SDK. Requires network access to clone https://github.com/umbraco/Umbraco.Cms.Search.git'
metadata:
author: Examine
version: "1.0"
---
# Umbraco.Cms.Search Compatibility Validator
Validates that the current Examine v4 codebase is backward compatible with Umbraco.Cms.Search by replacing its NuGet package reference for Examine with a project reference pointing to this workspace, then building and testing the solution.
## When to Use This Skill
- After making changes to Examine public APIs
- Before releasing a new version of Examine
- When verifying that Examine v4 does not introduce breaking changes for Umbraco.Cms.Search
- When the user asks to "check search compatibility", "validate search compat", or "test against Umbraco Search"
## Prerequisites
- `git` CLI available on PATH
- `dotnet` SDK installed (must support the target frameworks used by both Examine and Umbraco.Cms.Search)
- Network access to clone from GitHub
## Important Rules
- The `TEMP` folder at the workspace root is **disposable** and must **NEVER** be committed to the Examine repository.
- Ensure `TEMP/` is listed in the root `.gitignore` before proceeding.
- If `TEMP/Umbraco.Cms.Search` already exists, it means the repos skip the clone step and use the existing clone then ensure to run `git pull` to update.
## Repository Structure
The Umbraco.Cms.Search repository has the following relevant layout:
```
Umbraco.Cms.Search/
├── Directory.Packages.props ← Central Package Management (has Examine entry)
├── src/
│ ├── Umbraco.Cms.Search.sln ← Solution file
│ ├── Umbraco.Cms.Search.Core/ ← Core abstractions (no direct Examine ref)
│ ├── Umbraco.Cms.Search.Provider.Examine/ ← Examine provider (references Examine NuGet)
│ ├── Umbraco.Test.Search.Examine.Integration/ ← Integration tests
│ └── ...other projects
```
## Package-to-Project Mapping
Umbraco.Cms.Search uses Central Package Management (`Directory.Packages.props`). The following NuGet package must be swapped to a project reference:
| NuGet Package | Umbraco.Cms.Search Project That References It | Examine Project Reference |
|---|---|---|
| `Examine` (v4.0.0-beta.1) | `src/Umbraco.Cms.Search.Provider.Examine/Umbraco.Cms.Search.Provider.Examine.csproj` | `src/Examine.Host/Examine.csproj` |
> **Note:** `Umbraco.Cms.Search.Core` does NOT directly reference Examine — it references Umbraco CMS packages only.
## Step-by-Step Workflow
### Step 1: Ensure TEMP Is Git-Ignored
Check that the workspace root `.gitignore` contains a `TEMP/` entry. If not, add it:
```
TEMP/
```
### Step 2: Clone Umbraco.Cms.Search (If Needed)
If `TEMP/Umbraco.Cms.Search` does not exist:
```bash
git clone https://github.com/umbraco/Umbraco.Cms.Search.git TEMP/Umbraco.Cms.Search
```
If it already exists, optionally update it:
```bash
cd TEMP/Umbraco.Cms.Search && git pull && cd ../..
```
> **Note:** Do NOT use `--depth 1` as the repo uses Nerdbank.GitVersioning which requires full git history for version calculation. If you must shallow clone, be prepared to `git fetch --unshallow` before building.
### Step 3: Modify Directory.Packages.props
In `TEMP/Umbraco.Cms.Search/Directory.Packages.props`, **remove or comment out** the Examine package version entry:
```xml
```
### Step 4: Swap Package Reference to Project Reference
#### Umbraco.Cms.Search.Provider.Examine.csproj
File: `TEMP/Umbraco.Cms.Search/src/Umbraco.Cms.Search.Provider.Examine/Umbraco.Cms.Search.Provider.Examine.csproj`
Replace:
```xml
```
With:
```xml
```
### Step 5: Restore and Build
From the workspace root, build the Umbraco.Cms.Search solution:
```bash
cd TEMP/Umbraco.Cms.Search
dotnet restore
dotnet build --no-restore
```
**Expected outcome:** Build succeeds with zero errors. Warnings are acceptable.
If the build fails, analyze the error output:
- **Missing type/member errors** indicate a breaking API change in Examine that must be addressed.
- **Nullable annotation warnings promoted to errors** (CS8600, CS8601, CS8602, CS8604, CS8620, CS8765) may be caused by Examine v4 tightening NRT annotations. These can be suppressed in the affected `.csproj` files with `` for compat testing purposes, while still detecting real API shape changes.
- **Target framework mismatches** may require aligning TFMs between Examine and Umbraco.Cms.Search.
- **Transitive dependency conflicts** may require version alignment in Directory.Packages.props.
### Step 6: Run Tests
Run the Examine-specific integration tests:
```bash
cd TEMP/Umbraco.Cms.Search
dotnet test src/Umbraco.Test.Search.Examine.Integration --no-build
```
If that filter doesn't work, run the full test suite:
```bash
dotnet test --no-build
```
**Expected outcome:** All tests pass. Any test failures related to Examine APIs indicate compatibility issues.
### Step 7: Report Results
Summarize the outcome:
1. **Build status:** Pass / Fail (with error details)
2. **Test status:** Pass / Fail (with failure details)
3. **Breaking changes found:** List any Examine API changes that caused build or test failures
4. **Recommended fixes:** For each breaking change, suggest whether to fix in Examine (restore API) or note as an intentional breaking change
## Troubleshooting
| Issue | Solution |
|-------|----------|
| Clone fails | Check network access and git credentials |
| NBGV version height error | Run `git fetch --unshallow` in the clone directory |
| Build fails with TFM errors | Verify both repos target compatible frameworks (check `Directory.Build.props` in both repos) |
| NuGet restore fails after swap | Ensure the PackageVersion entry was fully removed from `Directory.Packages.props` |
| Relative paths are wrong | Verify the workspace structure: Examine repo root must contain both `TEMP/Umbraco.Cms.Search/` and `src/` |
| Tests fail on unrelated Umbraco issues | Focus only on failures that reference Examine namespaces or types |
| Nullable warnings treated as errors | Add `$(NoWarn);CS8600;CS8601;CS8602;CS8604;CS8620;CS8765` to affected project PropertyGroups |
## Cleanup
The `TEMP` folder is disposable. To clean up:
```bash
Remove-Item -Recurse -Force TEMP/Umbraco.Cms.Search
```