Skip to content

[Approval & Audit] 승인·반려·외부제출·증빙·완료·감사 로그 구현 #11

Closed

Description

@hywznn

한 줄 목표

AI가 만든 업무가 사람 승인 없이 전달되지 않게 하고, AI 원본·HR 수정·승인 버전·상태 변경을 개인정보 없이 추적 가능한 감사 기록으로 남깁니다.

HITL 승인에서 저장할 것

  • AI가 제안한 원본 snapshot
  • HR이 수정한 최종 snapshot
  • 변경된 field 목록과 안전한 before/after 요약
  • 승인자, 승인 시각, 승인 대상 Task version
  • 승인/반려 사유와 request_id, trace_id
  • 사용한 agent/model/prompt/context/workflow version reference

날짜, 금액, 대상 근로자, 문서 종류, 안내 내용처럼 업무 결과에 영향을 주는 핵심 field가 승인 뒤 바뀌면 기존 승인을 무효화하고 READY_FOR_REVIEW로 돌려 재승인을 요구합니다.

UserRole과 ActorType 구분

  • ADMIN, HR, VIEWER는 로그인 사용자의 UserRole입니다.
  • HR_USER는 로그인 사용자의 감사 ActorType이며 Audit에 실제 Role snapshot을 함께 남깁니다.
  • WORKER_LINK는 보안 링크를 사용한 근로자 행동입니다.
  • AI_AGENT는 AI Run이 만든 제안의 출처일 뿐 로그인·승인 Role이 아닙니다.
  • SYSTEM_RULE은 만료·재시도·복구 같은 정해진 Server command입니다.

Actor ID가 없거나 공개 token actor인 경우에도 원본 token 대신 안전한 reference만 기록합니다.

소유 API 8개

  • POST /api/v1/tasks/{taskId}/approval-requests
  • POST /api/v1/tasks/{taskId}/approve
  • POST /api/v1/tasks/{taskId}/reject
  • POST /api/v1/tasks/{taskId}/external-submissions
  • POST /api/v1/tasks/{taskId}/evidence
  • POST /api/v1/tasks/{taskId}/complete
  • GET /api/v1/tasks/{taskId}/activities — 한 업무의 화면용 timeline
  • GET /api/v1/audit-events — ADMIN용 사업장 감사 검색

approval-requests는 필수정보가 충족된 Task를 READY_FOR_REVIEW로 옮깁니다. 반려는 현재 승인 요청을 종료하고 사유를 남긴 뒤 READY_FOR_REVIEW → DRAFT로 되돌립니다. 외부 제출은 제출처·시각·안전한 reference를 저장하고 허용 상태에서 WAITING_EXTERNAL로 전이합니다.

activities가 timeline의 canonical API이므로 별도 /timeline을 만들지 않습니다. Audit API는 actor/event/resource/trace/date cursor filter를 제공하되 원문 내부 payload를 그대로 노출하지 않습니다.

감사 이벤트 최소 필드

  • id, company_id, actor_type, 안전한 actor_id, 당시 user_role
  • action, target_type, target_id
  • request_id, trace_id, event_version
  • 마스킹된 change_summary 또는 안전한 snapshot reference
  • created_at
  • IP·User-Agent는 기본 미저장. 필요 시 ADR에서 목적, 접근 역할, 마스킹/hash, 보존기간, 삭제 책임을 함께 확정

JWT, Worker Link 원본 token, 외국인등록번호, 여권번호, 계좌번호, 전화번호, 외부 API Key, 전체 Prompt는 저장하지 않습니다.

구현 범위

  • Approval snapshot/revision, ExternalSubmission, Evidence, AuditEvent 모델과 migration
  • 승인 요청·승인·반려·외부 제출·완료 command와 Workflow guard
  • optimistic lock으로 동시 승인/수정 충돌 차단
  • 중요 field fingerprint와 승인 version 비교
  • 승인 후 중요 변경 시 승인 무효화·재검토 전환 core와 연동 Port ([Task Workflow] 업무카드·체크리스트·상태 전이 구현 #6 PATCH에서 호출)
  • 완료증빙 유형·파일 reference·제출 시각·actor 검증
  • domain 변경과 감사 event를 같은 transaction으로 기록
  • #25의 내구성 있는 publication과 연결
  • activities는 내부 감사 event를 사용자용 안전 DTO로 projection
  • /api/v1/audit-events tenant scope, ADMIN 권한, cursor pagination
  • 감사 기록의 일반 수정·삭제 경로 금지

반드시 기록할 행동

  • Task/AiRun 후보 생성·확정·폐기
  • Task 수정과 핵심값 변경
  • 승인 요청·승인·반려·승인 무효화
  • Worker Link 발급·회전·폐기·조회·응답·문서 제출
  • 외부기관 제출·대기, 증빙 연결, 완료·실패·취소
  • 필요한 인증 실패와 권한 거부

완료 조건

  • 승인 전·승인 무효화 후 완료가 차단됩니다.
  • Worker Link 발급 차단 연동은 #7에서 ApprovalControlPort를 사용해 검증합니다.
  • AI 원본과 HR 수정본, changed fields, 승인 version/reason을 보존합니다.
  • 반려 후 Task가 DRAFT로 돌아가고 이전 승인 요청을 재사용할 수 없습니다.
  • 외부 제출 reference 없이 WAITING_EXTERNAL로 전이할 수 없습니다.
  • 중요 field 변경 뒤 기존 승인을 재사용할 수 없습니다.
  • Task activities로 전체 주요 흐름을 시간순 재구성할 수 있습니다.
  • ADMIN이 사업장 범위의 감사 event를 filter해 조회할 수 있습니다.
  • 타 사업장 감사 기록과 민감 원문을 조회할 수 없습니다.
  • 감사 기록 실패 시 핵심 상태 변경도 함께 실패합니다.
  • 동시 승인 경쟁·stale 수정·완료 guard와 개인정보 차단 테스트가 있습니다.

이번 이슈에서 하지 않는 것

선행/후속 관계

구현 PR

용어 도움말

  • HITL: Human-in-the-loop. 중요한 AI 결과를 사람이 검토·승인하는 구조입니다.
  • Snapshot: 승인 시점의 내용을 나중 변경과 구분해 보존한 값입니다.
  • Projection: 내부 기록에서 화면에 필요한 안전한 field만 골라 만든 조회 모델입니다.

Activity

  1. added
    area:serverSpring Boot API·도메인·DB·tenant·Task Workflow 영역; Prompt·모델·Provider 구현 제외
    priority:P0MVP 진행을 막는 최우선 핵심 작업
    security:privacy개인정보·접근권한·토큰·보안 영향이 있는 작업
    status:backlog해야 하지만 아직 시작 조건이 갖춰지지 않은 작업
    type:feature사용자 또는 Agent가 사용하는 기능 개발
    on Jul 21, 2026
  2. changed the title [-][Audit] HR 승인·발송 통제·감사 로그 구현[/-] [+][Approval & Audit] 승인·반려·증빙·완료·감사 로그 구현[/+] on Jul 21, 2026
  3. added
    status:blocked선행 작업이나 외부 조건 때문에 현재 진행할 수 없는 작업
    and removed
    status:backlog해야 하지만 아직 시작 조건이 갖춰지지 않은 작업
    on Jul 21, 2026
  4. self-assigned this
    on Jul 22, 2026
  5. changed the title [-][Approval & Audit] 승인·반려·증빙·완료·감사 로그 구현[/-] [+][Approval & Audit] 승인·반려·외부제출·증빙·완료·감사 로그 구현[/+] on Jul 22, 2026
  6. added
    status:in-progress담당자가 현재 구현 중인 작업
    and removed
    status:blocked선행 작업이나 외부 조건 때문에 현재 진행할 수 없는 작업
    on Jul 23, 2026
  7. added
    status:in-review구현을 마치고 리뷰 또는 병합을 기다리는 작업
    and removed
    status:in-progress담당자가 현재 구현 중인 작업
    on Jul 23, 2026
  8. hywznn commented on Jul 23, 2026

    @hywznn
    MemberAuthor

    최종 상태 확인: PR #37은 Draft가 아니며 Test and build가 통과했고 mergeable 상태입니다. 저장소 보호 규칙상 남은 조건은 @chaeliki의 승인 리뷰 1건입니다. #6 구현은 #37 위의 stacked PR #39에서 완료해 두었으며, #37이 먼저 Squash Merge되면 #39를 main 기준으로 전환하겠습니다.

  9. removed
    status:in-review구현을 마치고 리뷰 또는 병합을 기다리는 작업
    on Jul 24, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:serverSpring Boot API·도메인·DB·tenant·Task Workflow 영역; Prompt·모델·Provider 구현 제외priority:P0MVP 진행을 막는 최우선 핵심 작업security:privacy개인정보·접근권한·토큰·보안 영향이 있는 작업type:feature사용자 또는 Agent가 사용하는 기능 개발

Type

No type

Projects

No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions