Parent: #447
Depends on: Phase 5/9
Delivery branch: codex/issue-447-immutable-job-ids
Delivery model: This phase is committed to the shared #447 integration branch and the single draft pull request against main. It is not merged or released independently.
Objective
Convert all status-derived read models and user-facing operational summaries to job_id. The configured job inventory becomes authoritative, historical descriptors remain visible, and editing a job can no longer create duplicate dashboard identities or split its reports.
Dashboard
- Start from configured canonical jobs keyed by
job_id.
- Overlay latest completed status, active runtime state, schedule, repository and restore-proof data by ID.
- Show exactly one card per configured job.
- Do not create active cards or counters from orphaned historical status files.
- Where unambiguous, show the latest migrated legacy status until the first ID-native run, with an appropriate indicator.
- Ensure active runtime state takes display precedence over the last completed run.
Widgets
- Rebuild the Unraid dashboard widget cache from ID-based canonical data.
- Convert the Homepage widget API and any persistent widget state to IDs.
- Preserve friendly display labels and bounded diagnostic descriptors.
- Ensure widget counts and in-app dashboard counts follow the same configured-job authority rule.
History and Reports
- Group and filter time series by
job_id.
- Keep the current job name for navigation.
- Retain run-time name, archive prefix, repository and location snapshots on historical rows.
- Keep one continuous report when name, prefix, repository or storage changes.
- Preserve deleted-job history without adding the job to the active inventory.
- Show ambiguous or orphaned records as unassigned legacy history rather than attaching them by guesswork.
- Convert weekly repository snapshots and merge same-job/same-period values deterministically.
- Update report mail joins to IDs.
Overdue state
- Join configured jobs, schedules and latest statuses by
job_id.
- Preserve due markers during migration.
- Prevent false overdue or duplicate reminder behavior after descriptor changes.
Regression scenario
The config to pfsense Type ID fixture must result in:
- one configured job card;
- the previous successful status associated with that same job when unambiguous;
- one continuous History and Reports identity;
- no separate
config and pfsense active dashboard locations;
- preserved historical labels for the old run.
Tests
- one card and consistent counters per configured ID;
- edits across every mutable descriptor;
- legacy status continuity and first ID-native run precedence;
- deleted and unassigned history behavior;
- weekly snapshot conversion without duplicates;
- report mail and overdue joins;
- Unraid and Homepage widget cache behavior;
- German and English labels for migration/legacy indicators.
Test-channel policy
Do not publish a test-channel version yet. Restore workflows, transfer/lifecycle handling and startup migration activation are still incomplete.
Acceptance criteria
- Dashboard and widgets never split a job after an edit.
- History and Reports remain continuous by ID.
- Historical descriptors remain accurate.
- Orphaned legacy records cannot affect current job counters.
- Overdue and report-mail logic use the same canonical identity.
Parent: #447
Depends on: Phase 5/9
Delivery branch:
codex/issue-447-immutable-job-idsDelivery model: This phase is committed to the shared #447 integration branch and the single draft pull request against
main. It is not merged or released independently.Objective
Convert all status-derived read models and user-facing operational summaries to
job_id. The configured job inventory becomes authoritative, historical descriptors remain visible, and editing a job can no longer create duplicate dashboard identities or split its reports.Dashboard
job_id.Widgets
History and Reports
job_id.Overdue state
job_id.Regression scenario
The
configtopfsenseType ID fixture must result in:configandpfsenseactive dashboard locations;Tests
Test-channel policy
Do not publish a test-channel version yet. Restore workflows, transfer/lifecycle handling and startup migration activation are still incomplete.
Acceptance criteria