Files
PROJECT-CONTORL/openspec/changes/archive/2025-12-29-fix-audit-trail/specs/audit-trail/spec.md
beabigegg 10db2c9d1f feat: implement audit trail alignment (soft delete & permission audit)
- Task Soft Delete:
  - Add is_deleted, deleted_at, deleted_by fields to Task model
  - Convert DELETE to soft delete with cascade to subtasks
  - Add include_deleted query param (admin only)
  - Add POST /api/tasks/{id}/restore endpoint
  - Exclude deleted tasks from subtask_count

- Permission Change Audit:
  - Add user.role_change event (high sensitivity)
  - Add user.admin_change event (critical, triggers alert)
  - Add PATCH /api/users/{id}/admin endpoint
  - Add role.permission_change event type

- Append-Only Enforcement:
  - Add DB triggers for audit_logs immutability (manual for production)
  - Migration 008 with graceful trigger failure handling

- Tests: 11 new soft delete tests (153 total passing)
- OpenSpec: fix-audit-trail archived, fix-realtime-notifications & fix-weekly-report proposals added

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 06:58:30 +08:00

99 lines
3.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## MODIFIED Requirements
### Requirement: Delete Operations Tracking
系統 SHALL 追蹤所有刪除操作,支援軟刪除與追溯。
#### Scenario: 任務刪除記錄
- **GIVEN** 使用者刪除任務
- **WHEN** 刪除操作執行
- **THEN** 系統執行軟刪除(設定 is_deleted = true, deleted_at, deleted_by
- **AND** 記錄刪除操作至 audit_logs
- **AND** 子任務同步軟刪除
#### Scenario: 附件刪除記錄
- **GIVEN** 使用者刪除附件
- **WHEN** 刪除操作執行
- **THEN** 系統保留檔案於存檔區
- **AND** 記錄刪除操作詳情
#### Scenario: 任務還原
- **GIVEN** 管理員需要還原已刪除任務
- **WHEN** 執行還原操作
- **THEN** 系統設定 is_deleted = false
- **AND** 記錄還原操作
### Requirement: Change Logging
系統 SHALL 記錄所有關鍵變更操作,包含誰在何時改了什麼。
#### Scenario: 任務欄位變更記錄
- **GIVEN** 使用者修改任務的任何欄位(如截止日期、狀態、指派者)
- **WHEN** 變更儲存成功
- **THEN** 系統記錄變更前後的值
- **AND** 記錄操作者、時間、IP 位址
#### Scenario: 專案設定變更記錄
- **GIVEN** 管理者修改專案設定
- **WHEN** 設定變更儲存
- **THEN** 系統記錄所有變更的設定項目
- **AND** 記錄操作者與時間
#### Scenario: 權限變更記錄
- **GIVEN** 管理者修改使用者權限或角色
- **WHEN** 權限變更生效
- **THEN** 系統記錄權限變更詳情
- **AND** 標記為高敏感度操作
#### Scenario: 角色指派變更記錄
- **GIVEN** 管理者變更使用者角色
- **WHEN** role_id 變更儲存
- **THEN** 系統記錄 user.role_change 事件
- **AND** 標記 sensitivity_level = high
#### Scenario: 系統管理員變更記錄
- **GIVEN** 管理者變更使用者 is_system_admin
- **WHEN** 變更生效
- **THEN** 系統記錄 user.admin_change 事件
- **AND** 標記 sensitivity_level = critical
- **AND** 觸發即時警示
### Requirement: Audit Log Immutability
系統 SHALL 確保稽核日誌不可竄改。
#### Scenario: 日誌寫入
- **GIVEN** 需要記錄稽核事件
- **WHEN** 日誌寫入
- **THEN** 日誌記錄不可被修改或刪除
- **AND** 包含校驗碼確保完整性
#### Scenario: 日誌完整性驗證
- **GIVEN** 稽核人員需要驗證日誌完整性
- **WHEN** 執行完整性檢查
- **THEN** 系統驗證所有日誌記錄的校驗碼
- **AND** 報告任何異常
#### Scenario: 防止日誌修改
- **GIVEN** 任何對 audit_logs 表的 UPDATE 操作
- **WHEN** 操作執行
- **THEN** 資料庫 trigger 拒絕操作並拋出錯誤
#### Scenario: 防止日誌刪除
- **GIVEN** 任何對 audit_logs 表的 DELETE 操作
- **WHEN** 操作執行
- **THEN** 資料庫 trigger 拒絕操作並拋出錯誤
## MODIFIED Data Model
```
pjctrl_tasks (新增欄位)
├── is_deleted: BOOLEAN DEFAULT false
├── deleted_at: DATETIME (nullable)
├── deleted_by: UUID (FK -> users, nullable)
└── INDEX idx_task_deleted (is_deleted)
```
## MODIFIED Technical Notes
- 任務刪除改為軟刪除,保留 is_deleted, deleted_at, deleted_by
- 資料庫使用 BEFORE UPDATE/DELETE trigger 強制 append-only
- 查詢 API 預設過濾 is_deleted = true管理員可用 include_deleted 參數