Skip to content

Phase 6/9: Cut over dashboard, widgets, History, Reports, and overdue state to job_id #476

Description

@borg-codex-bot

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area::diagnosticsLogging, support bundles, diagnostics, and troubleshootingarea::uiUser interface, visual design, and frontend interaction patternsimpact::user-visibleVisible effect for plugin userspriority::1-criticalHighest priority; address firstrelease-note::yesInclude in user-facing release notestype::featureNew user-facing or plugin feature

    Type

    No type

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions