Original lab · Engine-derived evidence
26 adversarial redirect-map scenarios, measured against the real migration engine
Exact and prefix moves, ambiguous candidates, collisions, chains, loops, query loss, case and slash behavior, excluded URLs, missing destinations, cross-domain handoffs, unsafe config bytes, adapter semantics and rollback gaps are tested as separate decisions.
Publisher and review: FastTool product engineering · the engine-backed fixture matrix was rechecked against exact hashes on 2026-07-27.
Measured result for this exact engine and fixture
Engine SHA-256
d15ecb8b4a8363d7e4e27d0b887764ddb2fc710365fbac09164e27367e9456d8Fixture SHA-256
b6119f07bea5376a009f57eac48826f0472cd8d5dda637c1abc82a8d1c71aa17Method: engine output, not editorial arithmetic
- Build each case from reserved
.testURLs plus four stable exact-path controls. - Enter old inventory, status-aware new inventory and manual overrides through the real browser renderer UI.
- Read the generated machine receipt and redirect ledger; compare actual decision, risk codes, deployable rows and warnings with the fixture assertion.
- Recompute SHA-256 for all ten per-run artifacts, verify the receipt core, and prove review-only rows do not leak into the Cloudflare deployment adapter.
- For the 308 case, prove the status-aware adapter keeps 308 while the Webflow 301-only export excludes it.
- Report unsupported rollback evidence as INDETERMINATE; never manufacture a PASS finding.
node scripts/test_website_migration_benchmark_20260717.jsAll 26 scenarios and measured decisions
READY means only that the current browser policy admitted the fixture rows to staged QA. REVIEW means at least one row was withheld. INDETERMINATE means the required evidence is outside the current engine contract.
| # | Scenario | Surface | Actual decision | Engine evidence | Assertion |
|---|---|---|---|---|---|
| 01 | Exact one-to-one paths | Mapping | READY | 4 deployable; 0 review | PASS |
| 02 | Prefix directory move is not assumed | Mapping | REVIEW | medium_confidence_review | PASS |
| 03 | Two near-tie destinations | Ambiguity | REVIEW | candidate_collision | PASS |
| 04 | Two sources compete for one target | Collision | REVIEW | duplicate_target; target_already_assigned | PASS |
| 05 | Manual many-to-one collision | Collision | REVIEW | duplicate_target | PASS |
| 06 | Two-hop redirect chain | Graph | REVIEW | redirect_chain | PASS |
| 07 | Closed redirect loop | Graph | REVIEW | redirect_loop | PASS |
| 08 | Meaningful query key is lost | Query | REVIEW | query_parameter_loss | PASS |
| 09 | Preserved query still needs policy review | Query | REVIEW | query_specific_redirect_review | PASS |
| 10 | Tracking parameter removed only for matching | Query | REVIEW | No false meaningful-query-loss finding | PASS |
| 11 | Path case change | Normalization | REVIEW | medium_confidence_review | PASS |
| 12 | Exact trailing slash is preserved | Normalization | READY | Exact source and target bytes remain in adapter | PASS |
| 13 | Double slash remains visible and blocked | Normalization | REVIEW | unsupported_double_slash_path | PASS |
| 14 | Removed URL gets no fabricated destination | Coverage | REVIEW | orphan_source | PASS |
| 15 | Override source excluded from inventory | Coverage | READY + warning | Override ignored; baseline rows remain ready | PASS |
| 16 | No destination candidate | Coverage | REVIEW | orphan_source | PASS |
| 17 | Unexpected cross-domain handoff | Origin | REVIEW | unexpected_cross_domain_target | PASS |
| 18 | Manual target absent from new inventory | Coverage | REVIEW | target_not_in_new_inventory | PASS |
| 19 | Target crawl row is another redirect | Runtime evidence | REVIEW | target_redirect_status | PASS |
| 20 | Target crawl row is an HTTP error | Runtime evidence | REVIEW | target_http_error_status | PASS |
| 21 | Invalid override status is rejected | Input validation | READY + warning | Invalid 200 override ignored; exact row rematched | PASS |
| 22 | Tracking-only source variants make override ambiguous | Ambiguity | REVIEW | Normalization warning + collision risks | PASS |
| 23 | Server-config metacharacters | Security | REVIEW | unsupported_config_metacharacter | PASS |
| 24 | 308 kept in status-aware exports, excluded from Webflow | Adapter | READY + warning | Webflow exclusion count = 1 | PASS |
| 25 | No previous redirect configuration supplied | Rollback | INDETERMINATE | No rollback-baseline input in engine contract | PASS boundary |
| 26 | No rollback artifact generated | Rollback | INDETERMINATE | Runbook requests external retention; packet cannot hash it | PASS boundary |
What this benchmark changes in a real migration review
Similarity never silently resolves uncertainty
Prefix changes, case changes and near ties are held for review. Exact syntax is not treated as proof of content equivalence.
Warnings are part of the decision
An invalid or excluded override can be ignored while other rows remain READY. The operator must review parser warnings; a top-level ready state is not permission to discard them.
Deployment adapters are narrower than the ledger
Only admitted rows enter adapters. Webflow excludes 308 because its import is 301-only; the status-aware outputs retain 308.
Rollback remains a blocker outside this packet
The engine tells the operator to retain the previous configuration but does not ingest or hash it. Release approval therefore needs a separate rollback artifact.
Downloadable evidence and exact SHA-256
Use the receipt to recompute the core hash, then recompute each downloaded artifact. Hash parity proves byte equality only; it does not prove source authority or production behavior.
Machine results
Download JSONf5d0f4185f1b490d846f7cdf86841f20ef1422b3d8cdd2d0a05cb41b43088731Formula-safe scenario ledger
Download CSV778e3db7aaea79c22d55a73ee95a6c707fa494b34f6c7e8a044269df952b9f54Reproduction methodology
Download Markdown3a76bc308ccd98327020225984ea6dd5ed2f0911f46b4a02104213cffab43fc4Coverage visual
Download SVGd1d49c86da284dfba39be1a91bc084447f0e01ca422107077a647c99efbe41ceHash-backed benchmark receipt
Download receipt JSON98eb5297d757ae721625514eb6de4d03c10257f10ac55a3a29a4f43e9c9be619Receipt-core SHA-256
86cbe063adcbdec980bef48ea469e768b80108d9439c6d909faddcd9b882a0edLimits, privacy and release boundary
What this proves
- The 24 engine assertions passed for the exact renderer and fixture hashes shown above.
- Every generated per-run artifact matched its advertised SHA-256.
- Every receipt core verified and review-only rows stayed out of the Cloudflare adapter.
What this does not prove
- No live crawl, server syntax check, CDN priority check, link update, canonical audit, ranking preservation or traffic guarantee.
- No content-owner equivalence decision, authenticated URL handling, server-log truth or Search Console state.
- No rollback coverage until the prior configuration and restore procedure are captured and hashed separately.
Privacy: all benchmark URLs use reserved .test domains. The harness serves local files to a local browser. Do not replace fixtures with credentials, customer identifiers, preview tokens or authenticated URLs.
Primary sources
- Google Search Central: Site moves with URL changes — inventory, mapping, testing and monitoring.
- Google Search Central: Redirects and Google Search — redirect types and interpretation.
- Google Search Central: Canonicalization — signals and duplicate-URL boundaries.
- RFC 9110 section 15.4 — HTTP redirection semantics.
- Cloudflare Bulk Redirects, Nginx rewrite module, and Apache mod_alias — adapter targets that require their own validation.
Corrections and reproducibility
FastTool is responsible for this benchmark. Report a stale hash, unsupported claim, fixture defect or engine/ledger mismatch to contact@fasttool.app. Include the scenario ID, exact statement, reproduction output and proposed correction.
Benchmark fixture: website-migration-benchmark-20260717 · Engine version: 20260709a · Local QA result: 26/26 assertions passed, blocker 0.