4.2 KiB
4.2 KiB
Research — Legacy Purge (Runs / Routes / UI / Test Shims)
Date: 2026-02-14
This document resolves planning unknowns by grounding the spec in current repository reality (routes, views, tests, and job payload constraints).
Decisions
1) Legacy deep links return 404 Not Found
- Decision: Legacy run endpoints and legacy tenant-scoped redirect shims MUST return
404 Not Found(no redirect). - Rationale: The spec’s clarifications explicitly choose fail-fast behavior for old bookmarks, and removing redirects eliminates long-term maintenance of compatibility shims.
- Alternatives considered:
- Keep redirects indefinitely → rejected (ongoing maintenance + encourages legacy URLs).
- Redirect with warnings → rejected (still maintains shim surface).
Evidence in repo:
- Legacy run endpoints are already asserted as
404intests/Feature/Operations/LegacyRunRoutesNotFoundTest.php. - A legacy operations list redirect shim exists in
routes/web.php(/admin/t/{tenant:external_id}/operations) and is currently tested as302intests/Feature/078/TenantListRedirectTest.php.
2) Context chrome must not infer tenant scope from URL prefixes
- Decision: Remove URL-prefix heuristics (e.g.,
str_starts_with($path, '/admin/t/')) and infer tenant scope from route parameters + workspace/tenant context helpers. - Rationale: URL heuristics are brittle and conflict with the “single canonical mental model” objective.
- Alternatives considered:
- Keep URL-prefix checks as a fallback → rejected (per spec FR-006).
Evidence in repo:
- URL-prefix detection is currently present in
resources/views/filament/partials/context-bar.blade.php.
3) Inventory entry point is the Inventory Items index (canonical)
- Decision: Remove redirect-only Inventory landing entry points and route Inventory navigation directly to Inventory Items.
- Rationale: Redirect-only pages create dead views and increase cognitive overhead; the spec clarifies Inventory Items as the canonical target.
- Alternatives considered:
- Keep landing page as a “hub” → rejected (not needed; creates dead/duplicate UI).
4) Drift copy uses canonical terminology “operation runs”
- Decision: Replace the legacy phrase “inventory sync runs” with “operation runs”.
- Rationale: Consolidates terminology around the canonical Operations mental model.
- Alternatives considered:
- “inventory sync operations” / “sync operations” → rejected (still perpetuates legacy specificity).
5) Guard scope and exclusions
- Decision: Add/extend guard tests scanning for removed legacy identifiers/patterns. Exclude
database/migrations/**,references/**, anddocs/**. - Rationale: Migrations are immutable; references/docs are allowed to mention legacy for historical context.
- Alternatives considered:
- Scan entire repo including migrations → rejected (would fail on immutable history).
Staged rollout rationale (queued job payload)
- Decision: Deliver the queued job payload shape change in two deployments:
- Deploy A: accept/ignore the legacy field while new dispatches stop sending it.
- Deploy B: remove the legacy field/property entirely once the queue is drained.
- Rationale: Laravel queue payloads are serialized; removing a property/constructor argument prematurely can break deserialization of previously queued jobs.
Legacy hotspot inventory (confirmed current matches)
app/Jobs/RunBackupScheduleJob.php(legacy queued payload field compatibility/purge target)app/Notifications/BackupScheduleRunDispatchedNotification.php(dead legacy notification target)app/Filament/Pages/InventoryLanding.php(redirect-only landing removal target)resources/views/filament/partials/context-bar.blade.php(URL-prefix heuristic removal target)routes/web.php(legacy redirect shim endpoint removal target)tests/Pest.php(legacy test shim bootstrap require removal target)tests/Support/LegacyModels/InventorySyncRun.php(legacy test shim file removal target)
Open Questions
None identified that block Phase 1 design. Any newly discovered legacy identifiers during implementation should be added to the guard list only if they are truly “must be purged” (and should respect the exclusions).