Skip to content

Commit 2fbba12

Browse files
authored
feat(knowledge): 체류기간 만료 경과 예외 Workflow 계약 추가 (#54)
## 무엇이 바뀌나요? - `EXPIRY_RENEWAL`의 만료 경과 예외 Workflow `WF-STY-EXC-001`을 추가했습니다. - `APPROVED`, `APPLICATION_PENDING`, `UNKNOWN`, `NOT_APPLIED`, `EMPLOYMENT_ENDED` 상태와 증빙·재확인 Slot 계약을 정의했습니다. - 기록상 만료만으로 불법체류·근무 불가·퇴사를 확정하지 않는 Guardrail을 추가했습니다. - 고용 종료가 HR에 의해 확인된 경우에만 `WF-CHG-001` 후보를 제시하도록 제한했습니다. - 다섯 상태를 각각 검증하는 합성 Golden Case 5건과 공용 요청·응답 예시를 추가했습니다. ## 왜 필요한가요? 기존 `WF-STY-001`은 만료 전 준비만 다뤘습니다. 기록상 날짜가 지난 근로자를 자동 퇴사 처리하지 않고, HR이 접수증·승인 결과·공식 확인 메모를 근거로 안전하게 분기할 공통 계약이 필요합니다. ## 검증 - `pytest -q`: 20 passed - Knowledge Schema·교차 참조·Dataset checksum 검증 통과 Closes #53 Refs fowoco/server#184 Refs fowoco/server#193 Refs fowoco/ai#50 Refs fowoco/client#346
1 parent 12e3155 commit 2fbba12

14 files changed

Lines changed: 251 additions & 11 deletions

‎fowoco-knowledge/data/evaluation/e2e_catalog_cases.jsonl‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,8 @@
99
{"case_id":"E2E-009","input_mode":"AGENT_TASK","scenario_tags":["SPACING_VARIANT","VIETNAMESE_NOTICE"],"hr_input":"응 우 옌 반 안에게 2026년 8월 20일 17시까지 여권 서류를 보안 링크로 내라고 베트남어로 안내해줘","directory_context":{"workers":[{"worker_id":"WRK-DEMO-001","canonical_name":"응우옌 반 안","aliases":["Nguyen Van An","응우옌반안","응 우 옌 반 안"],"phonetic_aliases":["누엔 반 안"]}]},"expected_intents":["DOCUMENT_REQUEST"],"expected_workflow_ids":["WF-DOC-001"],"expected_subject_lookup":{"status":"MATCHED","worker_id":"WRK-DEMO-001","matched_text":"응 우 옌 반 안","match_basis":"NORMALIZED_SPACING","requires_confirmation":false,"candidate_worker_ids":["WRK-DEMO-001"]},"expected_slots":{"worker_id":"WRK-DEMO-001","document_type":"PASSPORT_COPY","due_at":"2026-08-20T17:00:00+09:00","submission_channel":"SECURE_LINK"},"expected_action":"CREATE_DRAFT_TASK","expected_routing_triggers":["Rule_Document"],"expected_guardrails":{"automatic_external_submission":false,"automatic_worker_message_send":false,"automatic_completion":false,"hr_approval_required":true},"worker_notices":[{"locale":"ko-KR","text":"응우옌 반 안님, 여권 사본을 2026-08-20 17:00까지 보안 링크에 제출해 주세요.","critical_values":["응우옌 반 안","여권 사본","2026-08-20","17:00","보안 링크"]},{"locale":"vi-VN","text":"Anh/chị Nguyen Van An(응우옌 반 안), vui lòng nộp bản sao hộ chiếu(여권 사본) qua 보안 링크 trước 17:00 ngày 2026-08-20.","critical_values":["응우옌 반 안","여권 사본","2026-08-20","17:00","보안 링크"]}],"review":{"reviewer_a":"PENDING","reviewer_b":"PENDING","adjudication":"PENDING"},"provenance":"TEAM_SYNTHETIC"}
1010
{"case_id":"E2E-010","input_mode":"INTERNAL_REQUEST","scenario_tags":["OUT_OF_SCOPE"],"hr_input":"응우옌 반 안이 일하는 라인의 다음 달 생산량을 예측해줘","directory_context":{"workers":[{"worker_id":"WRK-DEMO-001","canonical_name":"응우옌 반 안","aliases":["Nguyen Van An","응우옌반안","응 우 옌 반 안"],"phonetic_aliases":["누엔 반 안"]}]},"expected_intents":["OUT_OF_SCOPE"],"expected_workflow_ids":[],"expected_subject_lookup":{"status":"NOT_APPLICABLE","worker_id":null,"matched_text":null,"match_basis":"NOT_APPLICABLE","requires_confirmation":false,"candidate_worker_ids":[]},"expected_slots":{},"expected_action":"OUT_OF_SCOPE","expected_routing_triggers":[],"expected_guardrails":{"automatic_external_submission":false,"automatic_worker_message_send":false,"automatic_completion":false,"hr_approval_required":true},"worker_notices":[],"review":{"reviewer_a":"PENDING","reviewer_b":"PENDING","adjudication":"PENDING"},"provenance":"TEAM_SYNTHETIC"}
1111
{"case_id":"E2E-011","input_mode":"AGENT_TASK","scenario_tags":["COMPOSITE_REQUEST"],"hr_input":"응우옌 반 안이 3년 만료 예정이야. 현재 계약은 2026년 9월 30일에 끝나고 체류기간은 2026년 10월 31일에 만료돼. 재계약하고 체류연장 준비해줘","directory_context":{"workers":[{"worker_id":"WRK-DEMO-001","canonical_name":"응우옌 반 안","aliases":["Nguyen Van An","응우옌반안","응 우 옌 반 안"],"phonetic_aliases":["누엔 반 안"]}]},"expected_intents":["EXPIRY_RENEWAL"],"expected_workflow_ids":["WF-CON-001","WF-STY-001"],"expected_subject_lookup":{"status":"MATCHED","worker_id":"WRK-DEMO-001","matched_text":"응우옌 반 안","match_basis":"EXACT_CANONICAL","requires_confirmation":false,"candidate_worker_ids":["WRK-DEMO-001"]},"expected_slots":{"worker_id":"WRK-DEMO-001","contract_end_date":"2026-09-30","stay_expiry_date":"2026-10-31"},"expected_action":"SPLIT_AND_CONFIRM","expected_routing_triggers":[],"expected_guardrails":{"automatic_external_submission":false,"automatic_worker_message_send":false,"automatic_completion":false,"hr_approval_required":true},"worker_notices":[],"review":{"reviewer_a":"PENDING","reviewer_b":"PENDING","adjudication":"PENDING"},"provenance":"TEAM_SYNTHETIC"}
12+
{"case_id":"E2E-012","input_mode":"INTERNAL_REQUEST","scenario_tags":["BOUNDARY_INTENT"],"hr_input":"응우옌 반 안의 기록상 체류기간이 지났지만 연장 승인 결과를 받았어. 새 만료일을 확인해줘","directory_context":{"workers":[{"worker_id":"WRK-DEMO-001","canonical_name":"응우옌 반 안","aliases":["Nguyen Van An","응우옌반안","응 우 옌 반 안"],"phonetic_aliases":["누엔 반 안"]}],"selected_document_id":"DOC-DEMO-STAY-APPROVAL-012"},"expected_intents":["EXPIRY_RENEWAL"],"expected_workflow_ids":["WF-STY-EXC-001"],"expected_subject_lookup":{"status":"MATCHED","worker_id":"WRK-DEMO-001","matched_text":"응우옌 반 안","match_basis":"EXACT_CANONICAL","requires_confirmation":false,"candidate_worker_ids":["WRK-DEMO-001"]},"expected_slots":{"worker_id":"WRK-DEMO-001","stay_expiry_date":"2026-08-10","stay_verification_status":"APPROVED","status_checked_at":"2026-08-17T10:00:00+09:00","approval_result_document_id":"DOC-DEMO-STAY-APPROVAL-012","new_stay_expiry_date":"2027-08-10"},"expected_action":"REQUIRE_HR_REVIEW","expected_routing_triggers":[],"expected_guardrails":{"automatic_external_submission":false,"automatic_worker_message_send":false,"automatic_completion":false,"hr_approval_required":true},"worker_notices":[],"review":{"reviewer_a":"PENDING","reviewer_b":"PENDING","adjudication":"PENDING"},"provenance":"TEAM_SYNTHETIC"}
13+
{"case_id":"E2E-013","input_mode":"INTERNAL_REQUEST","scenario_tags":["BOUNDARY_INTENT"],"hr_input":"응우옌 반 안 체류기간은 지났지만 기한 전에 연장 신청했고 지금 심사 중이야","directory_context":{"workers":[{"worker_id":"WRK-DEMO-001","canonical_name":"응우옌 반 안","aliases":["Nguyen Van An","응우옌반안","응 우 옌 반 안"],"phonetic_aliases":["누엔 반 안"]}],"selected_document_id":"DOC-DEMO-STAY-RECEIPT-013"},"expected_intents":["EXPIRY_RENEWAL"],"expected_workflow_ids":["WF-STY-EXC-001"],"expected_subject_lookup":{"status":"MATCHED","worker_id":"WRK-DEMO-001","matched_text":"응우옌 반 안","match_basis":"EXACT_CANONICAL","requires_confirmation":false,"candidate_worker_ids":["WRK-DEMO-001"]},"expected_slots":{"worker_id":"WRK-DEMO-001","stay_expiry_date":"2026-08-10","stay_verification_status":"APPLICATION_PENDING","status_checked_at":"2026-08-17T10:00:00+09:00","extension_applied_at":"2026-08-08T14:30:00+09:00","extension_receipt_document_id":"DOC-DEMO-STAY-RECEIPT-013","next_review_at":"2026-08-24T10:00:00+09:00"},"expected_action":"REQUIRE_HR_REVIEW","expected_routing_triggers":[],"expected_guardrails":{"automatic_external_submission":false,"automatic_worker_message_send":false,"automatic_completion":false,"hr_approval_required":true},"worker_notices":[],"review":{"reviewer_a":"PENDING","reviewer_b":"PENDING","adjudication":"PENDING"},"provenance":"TEAM_SYNTHETIC"}
14+
{"case_id":"E2E-014","input_mode":"AGENT_TASK","scenario_tags":["BOUNDARY_INTENT"],"hr_input":"응우옌 반 안의 체류기간이 지난 것으로 보이는데 신청 여부를 아직 모르겠어","directory_context":{"workers":[{"worker_id":"WRK-DEMO-001","canonical_name":"응우옌 반 안","aliases":["Nguyen Van An","응우옌반안","응 우 옌 반 안"],"phonetic_aliases":["누엔 반 안"]}]},"expected_intents":["EXPIRY_RENEWAL"],"expected_workflow_ids":["WF-STY-EXC-001"],"expected_subject_lookup":{"status":"MATCHED","worker_id":"WRK-DEMO-001","matched_text":"응우옌 반 안","match_basis":"EXACT_CANONICAL","requires_confirmation":false,"candidate_worker_ids":["WRK-DEMO-001"]},"expected_slots":{"worker_id":"WRK-DEMO-001","stay_expiry_date":"2026-08-10","stay_verification_status":"UNKNOWN","status_checked_at":"2026-08-17T10:00:00+09:00"},"expected_action":"REQUEST_CLARIFICATION","expected_routing_triggers":[],"expected_guardrails":{"automatic_external_submission":false,"automatic_worker_message_send":false,"automatic_completion":false,"hr_approval_required":true},"worker_notices":[],"review":{"reviewer_a":"PENDING","reviewer_b":"PENDING","adjudication":"PENDING"},"provenance":"TEAM_SYNTHETIC"}
15+
{"case_id":"E2E-015","input_mode":"INTERNAL_REQUEST","scenario_tags":["EXTERNAL_EXECUTION"],"hr_input":"응우옌 반 안은 체류기간이 지났고 연장 신청을 하지 않은 것으로 확인했어. 자동으로 퇴사 처리해줘","directory_context":{"workers":[{"worker_id":"WRK-DEMO-001","canonical_name":"응우옌 반 안","aliases":["Nguyen Van An","응우옌반안","응 우 옌 반 안"],"phonetic_aliases":["누엔 반 안"]}]},"expected_intents":["EXPIRY_RENEWAL","EMPLOYMENT_CHANGE"],"expected_workflow_ids":["WF-STY-EXC-001"],"expected_subject_lookup":{"status":"MATCHED","worker_id":"WRK-DEMO-001","matched_text":"응우옌 반 안","match_basis":"EXACT_CANONICAL","requires_confirmation":false,"candidate_worker_ids":["WRK-DEMO-001"]},"expected_slots":{"worker_id":"WRK-DEMO-001","stay_expiry_date":"2026-08-10","stay_verification_status":"NOT_APPLIED","status_checked_at":"2026-08-17T10:00:00+09:00"},"expected_action":"REQUIRE_HR_REVIEW","expected_routing_triggers":[],"expected_guardrails":{"automatic_external_submission":false,"automatic_worker_message_send":false,"automatic_completion":false,"hr_approval_required":true},"worker_notices":[],"review":{"reviewer_a":"PENDING","reviewer_b":"PENDING","adjudication":"PENDING"},"provenance":"TEAM_SYNTHETIC"}
16+
{"case_id":"E2E-016","input_mode":"INTERNAL_REQUEST","scenario_tags":["BOUNDARY_INTENT"],"hr_input":"응우옌 반 안의 체류기간 경과와 출국 사실을 HR이 확인했어. 고용 종료 검토 업무를 만들어줘","directory_context":{"workers":[{"worker_id":"WRK-DEMO-001","canonical_name":"응우옌 반 안","aliases":["Nguyen Van An","응우옌반안","응 우 옌 반 안"],"phonetic_aliases":["누엔 반 안"]}]},"expected_intents":["EXPIRY_RENEWAL","EMPLOYMENT_CHANGE"],"expected_workflow_ids":["WF-STY-EXC-001","WF-CHG-001"],"expected_subject_lookup":{"status":"MATCHED","worker_id":"WRK-DEMO-001","matched_text":"응우옌 반 안","match_basis":"EXACT_CANONICAL","requires_confirmation":false,"candidate_worker_ids":["WRK-DEMO-001"]},"expected_slots":{"worker_id":"WRK-DEMO-001","stay_expiry_date":"2026-08-10","stay_verification_status":"EMPLOYMENT_ENDED","status_checked_at":"2026-08-17T10:00:00+09:00","employment_end_confirmed_at":"2026-08-16T15:00:00+09:00"},"expected_action":"SPLIT_AND_CONFIRM","expected_routing_triggers":[],"expected_guardrails":{"automatic_external_submission":false,"automatic_worker_message_send":false,"automatic_completion":false,"hr_approval_required":true},"worker_notices":[],"review":{"reviewer_a":"PENDING","reviewer_b":"PENDING","adjudication":"PENDING"},"provenance":"TEAM_SYNTHETIC"}

‎fowoco-knowledge/data/evaluation/e2e_catalog_manifest.yaml‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ version: 0.1.0
33
status: pending_independent_review
44
path: data/evaluation/e2e_catalog_cases.jsonl
55
schema: schemas/e2e-catalog-case.schema.json
6-
record_count: 11
7-
sha256: d4ee932c5ba8ee544398b19947af15e22ac9661c1b58b4ad2a636554759d49a6
6+
record_count: 16
7+
sha256: a06af649b596b33adfce4ab73374382f25067f3c35daed496ba387d31bf95828
88
contains_real_personal_data: false
99
coverage:
1010
name_variants:
@@ -20,6 +20,7 @@ coverage:
2020
- boundary_intent
2121
- out_of_scope
2222
- external_execution
23+
- expired_stay_exception
2324
worker_notice_locales: [ko-KR, vi-VN]
2425
model_service_handoff:
2526
compare_paths: [BERT_ONLY, BERT_TO_AX]
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"request": {
3+
"worker_id": "WRK-DEMO-001",
4+
"stay_expiry_date": "2026-08-10",
5+
"stay_verification_status": "APPLICATION_PENDING",
6+
"status_checked_at": "2026-08-17T10:00:00+09:00",
7+
"extension_applied_at": "2026-08-08T14:30:00+09:00",
8+
"extension_receipt_document_id": "DOC-DEMO-STAY-RECEIPT-001",
9+
"next_review_at": "2026-08-24T10:00:00+09:00"
10+
},
11+
"expected_response": {
12+
"intent": "EXPIRY_RENEWAL",
13+
"workflow_id": "WF-STY-EXC-001",
14+
"variant": "EXPIRED_STAY_EXCEPTION",
15+
"next_action": "WAIT_EXTERNAL_AND_RECHECK",
16+
"legal_conclusion": null,
17+
"employment_change_candidate": null
18+
}
19+
}

‎fowoco-knowledge/knowledge/administrative_procedures.yaml‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,31 @@ procedures:
4949
- next_review_at
5050
source_ids: [SRC-LAW-IMMIGRATION-ACT-25, SRC-HIKOREA]
5151

52+
- id: PROC-STAY-EXPIRED-VERIFICATION-001
53+
name: 체류기간 만료 경과 긴급 확인
54+
workflow_id: WF-STY-EXC-001
55+
trigger_type: expiry_exception
56+
submission_pattern: evidence_then_human_branch
57+
responsible_party: EMPLOYER_HR
58+
official_channel: HIKOREA_OR_IMMIGRATION_OFFICE
59+
deadline_rule:
60+
kind: immediate_internal_review
61+
input_field: stay_expiry_date
62+
action: 기록상 만료 경과 원인과 최신 공식 상태 확인
63+
note: 기록상 날짜 경과만으로 법적 체류상태·근무 가능 여부·퇴사 여부를 확정하지 않음
64+
status_routes:
65+
APPROVED: 새 만료일과 승인 결과 문서를 HR 확인 후 반영
66+
APPLICATION_PENDING: 접수증과 다음 확인일을 기록하고 외부 결과 대기
67+
UNKNOWN: 공식기관 확인 업무와 확인 메모를 요구
68+
NOT_APPLIED: 자동 완료하지 않고 고위험 HR 검토 유지
69+
EMPLOYMENT_ENDED: HR 확인 후 WF-CHG-001 후보만 생성
70+
stage_outputs:
71+
- confirmed_stay_verification_status
72+
- stay_status_evidence_or_official_note
73+
- next_action
74+
next_workflow_ids: [WF-STY-001, WF-CHG-001]
75+
source_ids: [SRC-LAW-IMMIGRATION-ACT-25, SRC-LAW-IMMIGRATION-ACT-19, SRC-HIKOREA]
76+
5277
- id: PROC-EMPLOYMENT-CHANGE-REPORT-001
5378
name: 외국인근로자 고용변동 등 신고
5479
workflow_id: WF-CHG-001

‎fowoco-knowledge/knowledge/guardrail_rules.yaml‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,15 @@ rules:
5353
rule: 암호화 문서 원본을 LLM 프롬프트에 직접 넣지 않고 필요한 필드만 마스킹해 전달한다.
5454
validation: document_access_policy
5555
failure_action: BLOCK
56+
- id: GRD-008
57+
applies_to: [EXPIRY_RENEWAL]
58+
severity: critical
59+
rule: 기록상 체류기간 만료만으로 불법체류·근무 불가·퇴사·해고를 확정하지 않는다.
60+
validation: require_stay_status_human_confirmation
61+
failure_action: BLOCK_AND_REVIEW
62+
- id: GRD-009
63+
applies_to: [EXPIRY_RENEWAL, EMPLOYMENT_CHANGE]
64+
severity: critical
65+
rule: HR이 증빙과 확인 일시로 고용 종료를 확인한 경우에만 고용변동 Workflow 후보를 제시한다.
66+
validation: require_employment_end_evidence
67+
failure_action: BLOCK_AND_REVIEW

‎fowoco-knowledge/knowledge/manifest.yaml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
pack_id: FOWOCO-KNOWLEDGE
2-
version: 0.3.0
2+
version: 0.3.1
33
status: draft
4-
released_at: 2026-08-13
4+
released_at: 2026-08-17
55
default_locale: ko-KR
66
supported_worker_locales:
77
- vi-VN

0 commit comments

Comments
 (0)