Ticket archival system implementation with cascade and auto-archive functionality:
**Model Changes (app/models/ticket.rb):**
- Added `archived` (boolean) and `archived_at` (timestamp) columns via migration
- Added `archive!` method that only works for done/cancelled tickets
- Added `unarchive!` method with optional cascade to subtasks
- Added `auto_archive_if_cancelled` callback that auto-archives cancelled tickets
- Cascade logic: archiving an epic archives all subtasks; archiving all subtasks archives parent epic
- Added `active` scope (excludes archived) and `archived` scope (only archived)
**MCP Tools (app/controllers/api/v1/mcp_controller.rb):**
- `archive_ticket` - archive a single ticket
- `archive_tickets` - archive multiple tickets at once
- `list_archived_tickets` - list only archived tickets
- `unarchive_ticket` - unarchive a ticket (with unarchive_subtasks option)
- Updated `handle_list_tickets` to add `include_archived` filter (default: false)
**API Changes:**
- Updated `/api/v1/tickets` index to support `include_archived` filter
- Updated TicketSerializer to expose `archived` and `archived_at`
**Query Updates:**
- ProjectSerializer: `open_ticket_count` and `ticket_count` exclude archived
- DashboardController: `kanban` action excludes archived by default, supports `show_archived` param
- McpController: `handle_get_status` excludes archived tickets
- DashboardController: `calculate_agent_stats` excludes archived from counts
**UI Changes:**
- Kanban board: removed `cancelled` status from @all_statuses
- Kanban board: added "Show Archived" toggle (show_archived parameter)
- Avo admin: added `archived` and `archived_at` fields to Ticket resource
- Avo admin: added ArchiveTicket and UnarchiveTicket actions
- JavaScript: added `toggleArchived` action to kanban-filter controller
**Tests (spec/models/ticket_spec.rb):**
- Tests for archive! with done/cancelled/non-done tickets
- Tests for cascade logic (epic -> subtasks, all subtasks -> epic)
- Tests for unarchive! with and without subtasks option
- Test for auto-archive callback
- Tests for active and archived scopes
**Important Implementation Details:**
- Fixed infinite recursion in archive! by marking ticket as archived FIRST, then cascading
- Used `update_columns` for parent epic archiving to avoid callbacks and infinite loops
- Auto-archive uses `update_column` to avoid triggering additional callbacks