Matcher passes.
Three passes, deterministic, no surprises. Each row carries its reasoning.
Pass 1 · Exact
If the old slug exists verbatim on the new site, accept it at confidence 1.00. Roughly 60% of a typical run resolves in this pass.
Pass 2 · Fuzzy
Levenshtein on the slug, semantic cosine on the title. Confidence is a weighted blend. Anything below the fuzzy threshold (default 0.72) does not match in this pass and falls through to wildcard.
Why the title cosine matters
Slug-only matching breaks on rebrands (/our-team-page to /about/team). Pulling the title vector lets us catch human-readable continuity even when the URL shape diverges.
Pass 3 · Wildcards
The matcher looks for path patterns: date archives (/blog/2014/*), product slugs (/products/*), paginated trees. When at least N URLs share a stem (default 12) and they all fuzzy-match into the same target stem, they collapse into a single regex line.
/blog/2014/* → /journal/$1 (612 URLs) /old-blog/2019/* → /resources/* (84 URLs)Confidence bands
| Band | Range | Recommended action |
|---|---|---|
| High | ≥ 0.85 | Auto-accept |
| Mid | 0.6 to 0.85 | Spot-check 10% |
| Low | < 0.6 | Review every row |
| Wildcard | any | Verify children before export |
Reasoning panel
Click any row in the super-table. The drawer shows which pass produced the match, every signal that fired, weights, runner-ups, and any human override. The matcher never silently maps; the case is always visible.