feat(stage1-part2): close C-1~C-11 with registry projection; add Default_Agent deployment tree
Part 2 v.8 개정 — 해결방안 §4 전건 실행: - R0: project_to_bo_surface 신설 (v2 화이트리스트 ALLOWED_SEED_KEYS 제거, 반환 17키 고정), 검토 채널을 v3 review_items/unknown_or_unrouted_reviews로 연결 (원본 review_code 보존), seed 되쓰기 삭제 (기록자=워커 단독 선언 준수), status 5종 정책 게이트 + fan-out 계획 slice/prompt sha 대조 - F0: BOType 폴백을 registry 합집합(bo_types_union)으로, 정규화 3종을 review_handoff에 보고, 투영 정책 sha 검증 반입 - A0: PART2_REQUIRED_ASSETS 10건 (배포 게이트 18경로) - 신규 자산: Default_Agent/stage1_runtime/bo_surface_projection_policy.v1.json - 공통 계약 한 문장으로 오버레이 legacy 지시 무력화 (색인·Part 1 봉인 무변) - 빌더 manifest roots 6→10 (C-9), remedy 문구 현행화 (C-10) Default_Agent/: 배포 원본 트리 신설 (실행 자산 154종 + runtime_manifest 371항). 검증: 함수 추출 before/after 재현, 예행 2패스 9단계 PASS (BO 2건 각 Evidence 2건, seed 무변, M-n 바이트 동일, E-999 BLOCK), 적대 검증 2회 (지적 5건 중 3건 반영·2건 조립본 동기화 회차로 이월) — 잔여 필수 수정 없음. 문서: 해결방안 v2 재검토판 (C-11 신규 확정), 해결내역서, 자산 배포 대응표, MONITOR_SERVER_LOG 가이드. 구본은 outdated/에 보존. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1364,3 +1364,70 @@ R0 안 한 자리에 **레지스트리 근거 투영기**(`project_to_bo_surface
|
|||||||
3. **계약 판본을 올렸으면 소비자의 키 집합 차집합을 낸다.** v2→v3 에서 같은 함수를 두 번 고치면서(`DOMAIN_LABELS`·`CANDIDATE_REF_RE`) 한 번도 차집합을 내지 않았다. 냈으면 R0 가 읽는 v2 키 18 · 읽지 않는 v3 키 22 가 그 자리에서 나왔다.
|
3. **계약 판본을 올렸으면 소비자의 키 집합 차집합을 낸다.** v2→v3 에서 같은 함수를 두 번 고치면서(`DOMAIN_LABELS`·`CANDIDATE_REF_RE`) 한 번도 차집합을 내지 않았다. 냈으면 R0 가 읽는 v2 키 18 · 읽지 않는 v3 키 22 가 그 자리에서 나왔다.
|
||||||
4. **범위를 좁혀 재고 결론을 넓히지 말 것 — 세 회차 연속 같은 실수.** 부재 주장(⑩) · 방언 리더(⑯) · 이번 `--include=*.py`. **검색 범위를 결론 문장 안에 적는다.**
|
4. **범위를 좁혀 재고 결론을 넓히지 말 것 — 세 회차 연속 같은 실수.** 부재 주장(⑩) · 방언 리더(⑯) · 이번 `--include=*.py`. **검색 범위를 결론 문장 안에 적는다.**
|
||||||
5. **정정은 범위를 줄이기도 한다.** signal 경로가 살아 있다는 확인이 "BO.json 에 v3 배열을 실어야 한다"는 잘못된 작업을 통째로 없앴다. 과장을 잡는 일이 곧 작업량을 줄이는 일이었다.
|
5. **정정은 범위를 줄이기도 한다.** signal 경로가 살아 있다는 확인이 "BO.json 에 v3 배열을 실어야 한다"는 잘못된 작업을 통째로 없앴다. 과장을 잡는 일이 곧 작업량을 줄이는 일이었다.
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2026-08-19 ⑲ — Part 1|2 실행 자산 배포 위치 ↔ 작업 폴더 위치 대응표
|
||||||
|
|
||||||
|
산출 `extension_research/stage_1_2_assets_distfolder_location.md` (43,419 B · 표 154행).
|
||||||
|
|
||||||
|
### 실측
|
||||||
|
- 실행이 읽는 자산 **154건** = 리터럴(P1 20 · P2 22) + 폐포(색인 → config 26 → 오버레이 조각 26(EC-00 은 `common_fragment.md`) · signal registry → `$ref` 폐포 17) + 모듈 미러(`stage1_runtime/` 10 · `signals/` 24, 각 `.py`+`.txt`).
|
||||||
|
- 작업 폴더 `ver_8_yaml_candidates/Default_Agent_Stage_1/`(560)에 있는 것 **45건**, 없는 것 **109건**. 있는 45건은 조립본과 sha 동일. 조립본 `선행구축/Default_Agent_Stage_1/`(1,322)에는 154건 전부.
|
||||||
|
- 없는 109 = 색인 1 · config 26 · 오버레이 26 · 공통 계약 1 · 조립 정책 1 · signal registry 1 · 실행 계약 1 · signal 스키마 17 · `.py` 정본 30 · 활성 단서 사전 1 · 참조 카탈로그 2 · 결정론 계약 1 · 회귀 matrix 1.
|
||||||
|
- 서버 `Default_Agent/` = `{MCP_LOCALDOCS_PATH}/users/{h(uid)}/{h(wid)}/Default_Agent/` (pre_loads 자동 복사, SKILL.md §0.3).
|
||||||
|
|
||||||
|
### 교훈
|
||||||
|
**작업 폴더의 `Default_Agent_Stage_1` 은 델타 오버레이지 배포본이 아니다.** 그것만 옮기면 Part 1 첫 task(T0-01 preflight `activation_cue_digest.md`)에서 선다. 배포 원본은 조립본 하나이고, 후보 트리는 부분집합 확인용이다. 표를 만들 때 "리터럴만" 세면 폐포(config 26 · 오버레이 26 · signal 스키마 17)가 통째로 빠진다 — 색인·registry 가 지목하는 것까지 따라가서 세어야 한다.
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2026-08-19 ⑲ — 해결방안 문서 엄격 재검토·재작성 v2 (실행 재현 + sub-agent 2회 · 지적 13건)
|
||||||
|
|
||||||
|
산출 `extension_research/stage_1_part_2_여전히남은문제해결방안.md` **v2 전면 재작성** (47,653 → 55,293 B). 구본은 `ver_8_yaml_candidates/outdated/stage_1_part_2_여전히남은문제해결방안_old.md` 보존. 판정 기준을 사용자 제시 작업성공기준(완주가 아니라 **산출물 정합 + 상하류 consistency**)으로 바꿔 열 건을 전건 재검증했다.
|
||||||
|
|
||||||
|
### 재검증 결과
|
||||||
|
- **C-1~C-10 전건 CONFIRMED, 사실 반전 0.** C-1~C-4는 함수 원문 추출 실행 재현으로 독립 재확인(E-13/E-02 이질 v3 후보 둘 → 중복 키 `((),(),None,None,None,'','','')` 동일 · payload 워커 유래 `extensions` 하나 · provenance 3갈래 공백 · meeting_only 전건 발화). 조립본 주장은 전수 대조(오버레이 5건 · bo_types 이탈 8도메인 · 선언표 34건 · 빌더 뿌리 밖 등재 = 필수 자산 6건 정확 일치 · 후보 트리 560파일 바이트 동일 부분집합).
|
||||||
|
- **재분류**: 실행 결손 8(C-1~C-8) + 잠복 계약 결손 1(**C-11 신규** — R0 1301행 status 게이트가 v3 enum 5종 중 2종만 허용, 적법한 NO_SUPPORT가 R0 전체 중단; 같은 함수의 slice_guard 신선도 검사는 워커가 실을 수 없는 키를 읽는 죽은 검사, v3의 `slice_sha256`은 R0 참조 0회) + 비실행 2(C-9 신선 재빌드 시에만 · C-10 처방 문구 노후 — 실행 산출물 무영향).
|
||||||
|
- 신규 확정: C-3 파급(BO는 Evidence 0 · signal 번들은 증거 연계 보유 — 하류 두 산출물 모순), F0 2516행에 `action_summary` 대체 체인 기존재.
|
||||||
|
|
||||||
|
### §4 재작성의 핵심 변경
|
||||||
|
1. **C-8 해결책 교체**: 오버레이 5건 직접 수정(→색인 `prompt_overlay_sha256` 5값→연방 색인→Part 1 봉인 3중 파급) 폐기 → **`domains/_common/common_worker_contract.md` 한 문장 추가**. 근거 4겹 실측(색인 등장 0회 · prompt_compiler 227행 주입 · rank 10<30 + "narrow not widen" · runtime_manifest 한 항목 sha 갱신으로 파급 폐쇄, A0가 sha까지 대조하므로 갱신 누락은 소리 내어 선다). **Part 1 봉인 불변**이 v1과의 최대 차이. 오버레이 낡은 문장은 부채로 남겨 색인 갱신 회차에 정리(§8 판단 4).
|
||||||
|
2. R0-6 신설: status_policy(NO_SUPPORT는 빈 후보+review 수용, BLOCKED/FAILED 경성) + 죽은 slice_guard를 fanout plan의 `slice_sha256`·`compiled_prompt_sha256` 대조로 교체(planner 132·134행 실재, v3 루트 required라 워커 필수 echo).
|
||||||
|
3. 투영기 배선 명시: `ensure_candidate_ref` 존치(1245행), 투영기는 1495행 자리에서 호출, 결과는 `projected_candidates` 별도 보관(seed_objects는 워커 원본 유지), 원장 루프가 그것을 읽음 — 미명시 시 `invalid candidate_ref` 즉사.
|
||||||
|
4. 고아 헬퍼 4종 제거(`_domain_label`·`_task_instance_id`·`digest_summary`·`DOMAIN_PAYLOAD_CANON+_canon_payload`(B1~B4 키뿐이라 전건 no-op)), F0 정책 반입 명시, 비실행 결손 처방 분리(§4.6), 회귀 M-q(status 5종)·M-r(slice_sha256 변조) 추가 — 필수 관측점 아홉.
|
||||||
|
|
||||||
|
### 이번에 얻은 것 (교훈)
|
||||||
|
1. **파일을 고치는 대신 우선순위 층에서 이기는 경로를 먼저 잰다.** 수정 대상의 해시를 누가 붙들고 있는지(색인·봉인·매니페스트)를 실측하면 최소 파급 경로가 보인다 — 오버레이 5건 수정(3중 파급)이 공통 계약 1문장(매니페스트 1항목)으로 줄었다.
|
||||||
|
2. **전임 문서의 존치 근거도 재검증 대상이다.** v1의 "`_domain_label`은 `domain_label_resolution` 기록에 쓰이므로 남긴다"는 허위였다(그 문자열은 명세서에 없다 — grep 0회). 내가 쓴 문서의 근거를 다음 회차가 무검증 승계하는 것이 오류 전파의 주 경로다.
|
||||||
|
3. **"대체한다"는 방안은 배선(호출 지점·데이터 보관처·소비자)까지 적어야 실행 가능하다.** 투영기 신설만 적고 원장 루프가 무엇을 읽는지 안 적은 초안은 검증에서 "구현 시 즉사" 판정을 받았다.
|
||||||
|
4. **계약 판본 전환의 잔재는 층마다 따로 남는다.** v2→v3에서 값 층(C-1)·검토 층(C-6)·상태 층(C-11)이 각각 따로 남았다 — 키 차집합에 status·enum 어휘 대조까지 포함해야 한다.
|
||||||
|
|
||||||
|
### 남은 것
|
||||||
|
해결방안 실행(P-0~P-9) 자체가 미착수 — 다음 회차. §8 판단 4건(Action 성격 · ActionType 기본값 · 후보 트리 운명 · 오버레이 부채 시점)은 사용자 결정 대기.
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2026-08-19 ⑳ — 해결방안 §4 실행 완료: 투영기 탑재·Part 2 완수 (예행 전 사슬 + 적대 검증 2회)
|
||||||
|
|
||||||
|
산출: 통합본 `stage_1_part_2_v.8.yml` 개정(193,933→195,938 B; 구본 `outdated/stage_1_part_2_v.8.pre_bo_projection.yml`), 개별 P2-A0·R0·F0·S0 바이트 동일 동기화, **신규 자산 `Default_Agent/stage1_runtime/bo_surface_projection_policy.v1.json`**, 공통 계약 문장 1 추가, `Default_Agent/runtime_manifest.json` 370→371(델타 정확히 2), 빌더 roots 6→10, remedy 3곳 현행화. 내역서 `extension_research/stage_1_part_2_여전히남은문제해결내역.md`.
|
||||||
|
|
||||||
|
### 무엇이 닫혔나 (실측)
|
||||||
|
- C-1~C-8·C-11 실행 결손 전건 폐쇄: `project_to_bo_surface`(반환 17키 고정, 투영본은 `projected_candidates` 분리 보관 — seed_objects 는 워커 원본), 검토 채널 v3 두 키 연결(원본 `review_code`→`source_review_code` 보존·`reason`→template_note), 되쓰기 삭제(+고아 `_domain_label`·`_task_instance_id`·`digest_summary`·`DOMAIN_LABELS`·`DOMAIN_PAYLOAD_CANON` 제거 — R0 의 B1~B5 의존 0), status 5종 정책 + 계획 행 `slice_sha256`·`compiled_prompt_sha256` 대조(죽은 slice_guard 대체), F0 `bo_types` 합집합 + 정규화 handoff 보고, A0 필수 자산 10(18경로 sha 검사), 공통 계약 한 문장(오버레이·색인·Part 1 봉인 전부 무변 실측).
|
||||||
|
- 예행 2패스 9단계 (asset root = **extension_research/Default_Agent** 배포 트리): pass1 6/45 · seed 3 · pass2 3/**29**(구 32 − 되쓰기 3 — 정확한 감소). BO 2건 각 Evidence 2건·registry 토큰 어휘·레코드 키 18 무변, seed 3종 바이트 무변, handoff 13건(워커 6 원본 코드째 + 투영 6 + near-dup 1), signal↔BO 증거 모순 해소, M-n 바이트 동일(signal 43 포함), M-o `BLOCK: E-999`, near-dup 클러스터 첫 생성.
|
||||||
|
- 함수 추출 before/after: 중복 키 동일→상이, payload `extensions` 하나→전 필드, 출처 0→실값, NO_SUPPORT 중단→정책 수용, sha 변조 통과→경성.
|
||||||
|
|
||||||
|
### 검증 루프 (지시 방법 3)
|
||||||
|
sub-agent 1차가 **신규 결손 2건을 실측으로 잡았다**: ① 투영기가 v3 `amount_facts` 에 없는 `value_text` 를 읽어 영구 null → R0 근접중복 amount 충돌 검출(value_text 참조) 사망 — `value_text=decimal_value` 원문으로 수정, ② `source_review_code` 가 원본 필수 키 `review_code` 가 아닌 `unresolved_type` 을 실어 정책 선언("원본을 잃지 않기 위해")과 모순 — 수정. +P2-S0 개별본 remedy 미동기 수정. 재검증 sub-agent: **잔여 필수 수정 없음** — 조립본 없이 배포 원본만으로 R0·F0·S0 재실행해 바이트 동일 독립 재현(실행 경로의 조립본 참조 0건 실증).
|
||||||
|
|
||||||
|
### 이월 (조립본 동기화 회차 — 사용자 지시 "자산은 Default_Agent 에만" 준수)
|
||||||
|
정책·계약의 조립본 반영 + 빌더 `PART2_ASSEMBLY_AUTHORED` 등록(파일 없이 등록만 하면 `MISSING_SELECTED_SOURCE` 즉사 — 한 벌), release_manifest/copy_map 재생성, 후보 트리 지위 정리(§8 판단 3), 오버레이 부채 정리(§8 판단 4), 분석 문서 갱신.
|
||||||
|
|
||||||
|
### 교훈
|
||||||
|
1. **닫힌 스키마가 투영 규칙의 어휘를 검증한다.** `value_text` 결손은 정책 산문("value_text 는 decimal_value")을 코드로 옮길 때 원천 필드 존재를 스키마로 확인하지 않아 생겼다 — 투영 규칙의 sources 는 반드시 스키마 properties 와 대조할 것.
|
||||||
|
2. **"원본 보존" 키는 원본의 정본 키에서 채워야 한다.** additive_keys 의 목적문("review_code 를 잃지 않기 위해")과 구현이 어긋난 것을 검증자가 목적문 대조로 잡았다 — 선언의 목적문은 그 자체가 검사 오라클이다.
|
||||||
|
3. **기록 수의 증감은 편집의 지문이다.** pass2 32→29 = 되쓰기 3건 소멸. 산출 계수의 델타를 편집 내역과 대조하면 의도 밖 변화가 즉시 드러난다.
|
||||||
|
4. **배포 원천 이관은 실행 경로의 참조 0 실측으로 닫는다.** "조립본을 안 고쳐도 되는가"는 명세서 전수 grep(참조 0) + 배포 트리 단독 재실행(바이트 동일)로 증명했다 — 선언이 아니라 실행으로.
|
||||||
|
|||||||
@@ -0,0 +1,273 @@
|
|||||||
|
# 서버 로그 확인 가이드 (ssh hpserver)
|
||||||
|
|
||||||
|
운영 서버(`hpserver` = `eroomaiserver`, Tailscale `100.93.221.71`)에서 로그와 상태를
|
||||||
|
확인하는 방법. **모든 명령은 읽기 전용**이며, 상태를 바꾸는 명령은 §8 에 따로 모아
|
||||||
|
경고와 함께 표시했다.
|
||||||
|
|
||||||
|
> ⚠️ **주의:** `eroom-server`(100.94.165.81) 와 `eroomaiserver`(100.93.221.71) 는
|
||||||
|
> **서로 다른 머신**이다. AgentBackend 는 `eroomaiserver`(= `hpserver`) 에 있다.
|
||||||
|
> 엉뚱한 호스트에 붙으면 "데이터가 없다"는 오해를 하게 된다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 서버 구성 한눈에
|
||||||
|
|
||||||
|
프로젝트 경로: `/home/eroom/Works/AgentBackend`
|
||||||
|
|
||||||
|
| 컨테이너 | 포트 | 역할 |
|
||||||
|
|---|---|---|
|
||||||
|
| `agent-backend` | 8800 → 8000 | **백엔드 API/SSE** (가장 자주 볼 로그) |
|
||||||
|
| `agent-web-client` | 8880 → 80 | 웹 프론트엔드 (nginx) |
|
||||||
|
| `eroom-postgres` | 5432 | DB (user=`eroom`, db=`eroom`) |
|
||||||
|
| `agent-redis` | 6379 | Redis |
|
||||||
|
| `mcp-localdocs` | 8012 | 파일 read/write MCP |
|
||||||
|
| `mcp-docparser` | 8015 | PDF/이미지 파싱 MCP |
|
||||||
|
| `mcp-redis` | 8014 | Redis MCP |
|
||||||
|
| `mcp-weaviate` | 8801 | Weaviate MCP |
|
||||||
|
| `weaviate` | 7080 / 50051 | 벡터 DB |
|
||||||
|
| `code-executor-code-executor-1` | 8383 / 8991 | 코드 실행 샌드박스 |
|
||||||
|
| `lawreg` | (traefik 경유) | lawreg.eroomai.com 서비스 |
|
||||||
|
| `traefik` | 80 / 443 | 리버스 프록시 |
|
||||||
|
|
||||||
|
전체 목록:
|
||||||
|
```bash
|
||||||
|
ssh hpserver 'docker ps --format "{{.Names}}|{{.Status}}|{{.Ports}}"'
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 기본 로그 보기
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 최근 100줄
|
||||||
|
ssh hpserver 'docker logs --tail 100 agent-backend'
|
||||||
|
|
||||||
|
# 최근 30분 (시간 기준이 대체로 더 유용)
|
||||||
|
ssh hpserver 'docker logs --since 30m agent-backend'
|
||||||
|
|
||||||
|
# 실시간 추적 (Ctrl+C 로 종료)
|
||||||
|
ssh hpserver 'docker logs -f --tail 50 agent-backend'
|
||||||
|
|
||||||
|
# 타임스탬프 붙여서
|
||||||
|
ssh hpserver 'docker logs -t --since 10m agent-backend'
|
||||||
|
```
|
||||||
|
|
||||||
|
`--since` 는 `10m`, `2h`, `2026-08-07T10:00:00` 형식을 받는다.
|
||||||
|
|
||||||
|
> **따옴표 주의:** 원격 명령 안에서 `"` 를 쓰면 로컬 셸이 먼저 해석한다.
|
||||||
|
> 전체를 `'...'` 로 감싸고 내부는 `"` 를 쓰거나, 내부 `"` 를 `\"` 로 escape 한다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 자주 쓰는 필터
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 에러만
|
||||||
|
ssh hpserver 'docker logs --since 1h agent-backend 2>&1 | grep -iE "error|exception|traceback|failed"'
|
||||||
|
|
||||||
|
# HTTP 4xx/5xx 만
|
||||||
|
ssh hpserver 'docker logs --since 1h agent-backend 2>&1 | grep -E " (4[0-9][0-9]|5[0-9][0-9]) "'
|
||||||
|
|
||||||
|
# 파이썬 traceback 전문 (앞뒤 문맥 포함)
|
||||||
|
ssh hpserver 'docker logs --since 1h agent-backend 2>&1 | grep -A 25 "Traceback" | tail -60'
|
||||||
|
|
||||||
|
# 특정 엔드포인트
|
||||||
|
ssh hpserver 'docker logs --since 1h agent-backend 2>&1 | grep "/auth/login"'
|
||||||
|
|
||||||
|
# 상태코드 분포 집계
|
||||||
|
ssh hpserver 'docker logs agent-backend 2>&1 | grep "POST /auth/login" | awk "{print \$NF, \$(NF-1)}" | sort | uniq -c'
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 에이전트 실행(DAG) 추적
|
||||||
|
|
||||||
|
백엔드는 task 단위로 상세 로그를 남긴다.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 현재 어떤 task 가 도는지
|
||||||
|
ssh hpserver 'docker logs --since 5m agent-backend 2>&1 | grep -E "\[TASK:|\[EXECUTOR\]|iteration" | tail -30'
|
||||||
|
|
||||||
|
# 특정 task 만
|
||||||
|
ssh hpserver 'docker logs --since 1h agent-backend 2>&1 | grep "Task_B1_map_doc"'
|
||||||
|
|
||||||
|
# SSE 이벤트 흐름
|
||||||
|
ssh hpserver 'docker logs --since 10m agent-backend 2>&1 | grep "SSE_EMIT" | tail -20'
|
||||||
|
|
||||||
|
# 토큰 사용량 / 컨텍스트 임계값
|
||||||
|
ssh hpserver 'docker logs --since 30m agent-backend 2>&1 | grep -E "token count|TOKEN_MANAGEMENT|Summarizing"'
|
||||||
|
|
||||||
|
# task 자동 재시도 발생 여부
|
||||||
|
ssh hpserver 'docker logs --since 1h agent-backend 2>&1 | grep -E "attempt [0-9]+/|retrying in"'
|
||||||
|
```
|
||||||
|
|
||||||
|
주요 로그 태그: `[TASK:<이름>]`, `[EXECUTOR]`, `[THREAD]`, `[BRIDGE]`,
|
||||||
|
`[SSE_EMIT]`, `[RUN_WRITER]`, `[HISTORY]`, `[SIGNUP_NOTIFY]`, `[GEMINI_CACHE]`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 인증 관련 (401/403 진단)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 401/403 경로별 집계
|
||||||
|
ssh hpserver 'docker logs --since 1h agent-backend 2>&1 | grep -E " (401|403) " | tail -25'
|
||||||
|
|
||||||
|
# 인증 환경변수가 주입됐는지 — 값 노출 없이 길이만 확인 (권장)
|
||||||
|
ssh hpserver 'for v in SESSION_SECRET ADMIN_API_TOKEN LOCALDOCS_MASTER_SECRET; do
|
||||||
|
n=$(docker exec agent-backend printenv $v 2>/dev/null | wc -c)
|
||||||
|
echo "$v: len=$n"
|
||||||
|
done'
|
||||||
|
```
|
||||||
|
|
||||||
|
판정 기준:
|
||||||
|
- `len=0` → **미설정**. `.env` 에 값이 없거나 Gitea Secret 이름이 다른 것
|
||||||
|
(예: 워크플로우는 `ADMIN_API_TOKEN` 을 읽는데 Secret 은 `AGENT_ADMIN_TOKEN` 으로 등록된 경우)
|
||||||
|
- `SESSION_SECRET` 이 `len=0` 이면 인증 게이트가 **비활성**이다(모든 API 무인증 통과)
|
||||||
|
|
||||||
|
> 🔐 **비밀값은 절대 그대로 출력하지 말 것.** 길이나 `sha256sum | cut -c1-12`
|
||||||
|
> 같은 지문만 비교한다. 같은 값인지 확인은 지문 비교로 충분하다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 배포 문제 진단
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 컨테이너가 언제 만들어졌나 (env 는 생성 시점에 주입됨 → .env 만 고쳐도 반영 안 됨)
|
||||||
|
ssh hpserver 'docker inspect agent-backend --format "started={{.State.StartedAt}}"'
|
||||||
|
|
||||||
|
# 배포가 기록한 .env 의 키 목록 (값은 보지 않는다)
|
||||||
|
ssh hpserver 'sed "s/=.*/=***/" /home/eroom/Works/AgentBackend/.env'
|
||||||
|
|
||||||
|
# .env 수정 시각 = 마지막 배포 시점
|
||||||
|
ssh hpserver 'stat -c "%y %n" /home/eroom/Works/AgentBackend/.env'
|
||||||
|
|
||||||
|
# 컨테이너가 기동 실패로 재시작 루프인지
|
||||||
|
ssh hpserver 'docker ps -a --filter name=agent-backend --format "{{.Status}}"'
|
||||||
|
|
||||||
|
# 기동 실패 원인 (import 에러 등은 로그 맨 앞에 나온다)
|
||||||
|
ssh hpserver 'docker logs agent-backend 2>&1 | head -50'
|
||||||
|
```
|
||||||
|
|
||||||
|
**헬스체크 직접 확인** (배포 스크립트가 쓰는 것과 동일):
|
||||||
|
```bash
|
||||||
|
ssh hpserver 'curl -fsS -m 5 -o /dev/null -w "backend → %{http_code}\n" http://localhost:8800/'
|
||||||
|
```
|
||||||
|
|
||||||
|
`curl (56) Recv failure` = 포트는 열렸지만 uvicorn 이 아직 기동 중.
|
||||||
|
`curl (7) Connection refused` = 컨테이너가 아예 안 떴음. 이 둘은 원인이 다르다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. DB 조회 (읽기 전용)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 최근 실행 세션
|
||||||
|
ssh hpserver 'docker exec eroom-postgres psql -U eroom -d eroom -tA -c \
|
||||||
|
"SELECT substring(session_hash,1,8), status, to_char(created_at,'"'"'MM-DD HH24:MI'"'"') \
|
||||||
|
FROM sessions ORDER BY created_at DESC LIMIT 10;"'
|
||||||
|
|
||||||
|
# 특정 세션의 task 상태 분포
|
||||||
|
ssh hpserver 'docker exec eroom-postgres psql -U eroom -d eroom -tA -c \
|
||||||
|
"SELECT final_status, count(*) FROM task_runs \
|
||||||
|
WHERE session_hash LIKE '"'"'aaf9544a%'"'"' GROUP BY final_status;"'
|
||||||
|
|
||||||
|
# 테이블 목록 / 컬럼 확인
|
||||||
|
ssh hpserver 'docker exec eroom-postgres psql -U eroom -d eroom -c "\dt"'
|
||||||
|
ssh hpserver 'docker exec eroom-postgres psql -U eroom -d eroom -tA -c \
|
||||||
|
"SELECT column_name FROM information_schema.columns WHERE table_name='"'"'sessions'"'"';"'
|
||||||
|
```
|
||||||
|
|
||||||
|
> `SELECT` 만 사용한다. `UPDATE`/`DELETE`/`ALTER` 는 데이터 손상 위험이 있으니
|
||||||
|
> 운영 담당자 확인 후 실행할 것.
|
||||||
|
>
|
||||||
|
> 암호화 컬럼(`*_encrypted`)은 `LOCALDOCS_MASTER_SECRET` 로만 복호화되므로 psql 로는
|
||||||
|
> 원문이 보이지 않는다(정상).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. ⚠️ 상태를 바꾸는 명령 (주의)
|
||||||
|
|
||||||
|
여기까지는 모두 읽기 전용이었다. 아래는 **서비스에 영향을 준다** — 진행 중인 SSE
|
||||||
|
세션이 끊기므로 필요성을 확인하고 실행할 것.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 백엔드만 재생성 (.env 변경 반영. 다른 서비스는 안 건드림)
|
||||||
|
cd /home/eroom/Works/AgentBackend && docker compose up -d --no-deps backend
|
||||||
|
|
||||||
|
# 특정 서비스 재시작 (env 재주입은 안 됨 — 프로세스만 재시작)
|
||||||
|
docker restart agent-backend
|
||||||
|
```
|
||||||
|
|
||||||
|
`.env` 를 고쳤다면 `restart` 로는 반영되지 않는다. **환경변수는 컨테이너 생성
|
||||||
|
시점에 주입**되므로 `up -d` 로 재생성해야 한다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. 실전 진단 레시피
|
||||||
|
|
||||||
|
이 프로젝트에서 실제로 겪은 문제와 확인 순서.
|
||||||
|
|
||||||
|
### 로그인이 안 된다
|
||||||
|
```bash
|
||||||
|
# 1) 응답 형태로 원인 구분 — 없는 계정은 401 이 정상
|
||||||
|
ssh hpserver 'curl -s -m 8 -o /tmp/l.txt -w "HTTP %{http_code}\n" -X POST \
|
||||||
|
http://localhost:8800/auth/login -H "Content-Type: application/json" \
|
||||||
|
-d "{\"user_id\":\"__probe__\",\"password\":\"x\"}"; cat /tmp/l.txt'
|
||||||
|
# 2) 500 이면 traceback 확인
|
||||||
|
ssh hpserver 'docker logs --since 30m agent-backend 2>&1 | grep -A 20 Traceback | tail -40'
|
||||||
|
```
|
||||||
|
- `401 User not found` → 정상 동작(자격증명 문제)
|
||||||
|
- `500` → traceback 을 봐야 한다. 과거 사례: MCP ImportError 로 모듈 로딩이
|
||||||
|
깨진 상태에서 크립토 경로가 어긋나 `InvalidTag` 로 표출됨
|
||||||
|
|
||||||
|
### 백엔드가 안 뜬다 / 배포가 실패한다
|
||||||
|
```bash
|
||||||
|
ssh hpserver 'docker logs agent-backend 2>&1 | head -50' # import 에러는 맨 앞
|
||||||
|
```
|
||||||
|
과거 사례: `mcp` 패키지 무핀(`mcp>=0.1.0`)으로 2.0.0 이 설치되어
|
||||||
|
`ImportError: cannot import name 'streamablehttp_client'` → 기동 실패.
|
||||||
|
의존성 버전 확인:
|
||||||
|
```bash
|
||||||
|
ssh hpserver 'docker exec agent-backend python -c "import importlib.metadata as m; print(m.version(\"mcp\"))"'
|
||||||
|
```
|
||||||
|
|
||||||
|
### MCP 호출이 실패한다 (421 등)
|
||||||
|
```bash
|
||||||
|
ssh hpserver 'docker logs --since 30m mcp-localdocs 2>&1 | tail -40'
|
||||||
|
ssh hpserver 'docker logs --since 30m agent-backend 2>&1 | grep -iE "mcp|421|Misdirected"'
|
||||||
|
```
|
||||||
|
과거 사례: fastmcp 3.4.3 의 Host-guard 가 docker 서비스명(`mcp-localdocs`) 접근을
|
||||||
|
`421 Misdirected Request` 로 거부.
|
||||||
|
|
||||||
|
### 가입 알림 메일이 안 온다
|
||||||
|
```bash
|
||||||
|
ssh hpserver 'docker logs --since 1h agent-backend 2>&1 | grep SIGNUP_NOTIFY'
|
||||||
|
```
|
||||||
|
`sent to ...` = 발송 성공 / `send failed ...` = SMTP 오류(사유가 함께 표시됨).
|
||||||
|
로그가 아예 없으면 신규 가입 자체가 없었던 것.
|
||||||
|
|
||||||
|
### CI 배포가 이미지 pull 에서 실패한다
|
||||||
|
`docker.gitea.com` 은 Gitea 사의 **외부** 레지스트리다. 우리 인프라가 아니다.
|
||||||
|
```bash
|
||||||
|
ssh hpserver 'curl -4 -sS -m 10 -o /dev/null -w "%{http_code}\n" https://docker.gitea.com/v2/'
|
||||||
|
```
|
||||||
|
`200` 이면 정상(재실행하면 됨), 타임아웃이면 그쪽 장애다. runner 설정이
|
||||||
|
`force_pull: true` 라 매 job 마다 받으러 나가므로 블립에 취약하다.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. 빠른 참조
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 전체 상태 한 번에
|
||||||
|
ssh hpserver 'docker ps --format "{{.Names}}|{{.Status}}" | grep -vE "GITEA-ACTIONS|dag-"'
|
||||||
|
|
||||||
|
# 백엔드 최근 에러
|
||||||
|
ssh hpserver 'docker logs --since 30m agent-backend 2>&1 | grep -iE "error|traceback" | tail -20'
|
||||||
|
|
||||||
|
# 헬스체크
|
||||||
|
ssh hpserver 'curl -fsS -m 5 -o /dev/null -w "%{http_code}\n" http://localhost:8800/'
|
||||||
|
|
||||||
|
# 디스크 여유 (로그·이미지가 쌓인다)
|
||||||
|
ssh hpserver 'df -h / | tail -1; docker system df'
|
||||||
|
```
|
||||||
+49
@@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
"canonical_writer_count": 1,
|
||||||
|
"domain_literal_policy": {
|
||||||
|
"dispatch_literals_forbidden": true,
|
||||||
|
"loader_validation_patterns_allowed": [
|
||||||
|
"^[EXC]-?[A-Z0-9]{1,4}$"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"e13_extension_domains": [
|
||||||
|
{
|
||||||
|
"domain_id": "E-13",
|
||||||
|
"extension_key": "actio_case_signals.v2",
|
||||||
|
"reason": "legacy actio compatibility"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fail_open_policy": {
|
||||||
|
"candidate_downgrade_forbidden": true,
|
||||||
|
"negative_cue_blocks_activation": false,
|
||||||
|
"silent_fallback_forbidden": true,
|
||||||
|
"unrouted_to_residual_collector": true
|
||||||
|
},
|
||||||
|
"registry": "Default_Agent/signals/signal_registry.v2.json",
|
||||||
|
"runtime_case_name_lookup_forbidden": true,
|
||||||
|
"runtime_party_or_date_lookup_forbidden": true,
|
||||||
|
"schema_version": "s5_execution_contract.v2",
|
||||||
|
"sg08_liability_fanout_domains": [
|
||||||
|
{
|
||||||
|
"domain_id": "E-05",
|
||||||
|
"reason": "liability, causation, or damage candidate may be material"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"domain_id": "E-07",
|
||||||
|
"reason": "liability, causation, or damage candidate may be material"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"domain_id": "E-08",
|
||||||
|
"reason": "liability, causation, or damage candidate may be material"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"domain_id": "E-14",
|
||||||
|
"reason": "liability, causation, or damage candidate may be material"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"domain_id": "E-17",
|
||||||
|
"reason": "liability, causation, or damage candidate may be material"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"writer": "Default_Agent/signals/compiler/transaction_writer.py"
|
||||||
|
}
|
||||||
+220
@@ -0,0 +1,220 @@
|
|||||||
|
{
|
||||||
|
"schema_version": "stage1_domain_config.v1",
|
||||||
|
"domain_id": "E-00",
|
||||||
|
"label_ko": "잔여·미분류 쟁점 수집기",
|
||||||
|
"slug": "residual_collector",
|
||||||
|
"kind": "residual",
|
||||||
|
"status": "active",
|
||||||
|
"execution_policy": {
|
||||||
|
"runnable": true,
|
||||||
|
"always_on": true,
|
||||||
|
"model_tier": "flash",
|
||||||
|
"output_mode": "strict_json",
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"max_instances": 1
|
||||||
|
},
|
||||||
|
"depends_on": [],
|
||||||
|
"special_law_profiles": [],
|
||||||
|
"activation_cues": {
|
||||||
|
"positive_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E00-P01",
|
||||||
|
"cue_type": "other",
|
||||||
|
"match_value": "source_universe에서 활성·monitor 도메인의 selected·support·review-only membership에 보존되지 않은 원천",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": null,
|
||||||
|
"strength": "strong",
|
||||||
|
"weight": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E00-P02",
|
||||||
|
"cue_type": "other",
|
||||||
|
"match_value": "추출된 법률효과·방어·계산 후보가 registry의 어느 도메인에도 안정적으로 매핑되지 않음",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": null,
|
||||||
|
"strength": "strong",
|
||||||
|
"weight": 1.0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"negative_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E00-N01",
|
||||||
|
"cue_type": "other",
|
||||||
|
"match_value": "동일 source_id와 쟁점이 활성 leaf에서 완전히 보존되고 membership이 확인됨",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "중복 seed는 생성하지 않음",
|
||||||
|
"effect": "confidence_downrank_only",
|
||||||
|
"weight": 0.6
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"conflict_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E00-C01",
|
||||||
|
"rule": "동일 source_id가 routed와 unrouted로 동시 표지됨",
|
||||||
|
"left_refs": [],
|
||||||
|
"right_refs": [],
|
||||||
|
"effect": "hard_review",
|
||||||
|
"review_code": "E00_MEMBERSHIP_CONFLICT_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E00-C02",
|
||||||
|
"rule": "입력 합집합과 selected·support·review-only·unrouted 합집합이 보존되지 않음",
|
||||||
|
"left_refs": [],
|
||||||
|
"right_refs": [],
|
||||||
|
"effect": "hard_review",
|
||||||
|
"review_code": "E00_CONSERVATION_FAILURE"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"routing_policy": {
|
||||||
|
"fail_open": true,
|
||||||
|
"candidate_downgrade_forbidden": true,
|
||||||
|
"minimum_primary_evidence": 0,
|
||||||
|
"leaf_activation_threshold": 1.0,
|
||||||
|
"monitor_threshold": 0.5,
|
||||||
|
"unknown_review_code": "UNROUTED_ISSUE_REVIEW"
|
||||||
|
},
|
||||||
|
"element_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "e00.el01",
|
||||||
|
"label": "잔여 source의 증거기반 사실 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E00_CONSERVATION_FAILURE"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e00.el02",
|
||||||
|
"label": "시도된 route와 미분류 사유",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"routing_audit",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"missing_review_code": "UNROUTED_ISSUE_REVIEW"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"opposing_fact_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "e00.op01",
|
||||||
|
"label": "기존 활성 route에서 완전 보존되었다는 반대 membership 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"routing_audit",
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"evidence_components": [
|
||||||
|
{
|
||||||
|
"component_id": "e00.unclaimed_source",
|
||||||
|
"label": "어느 활성 route에도 소속되지 않은 원천",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"proof_role": "residual_fact"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "e00.routing_audit",
|
||||||
|
"label": "router membership·count·집합 보존 audit",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"routing_audit"
|
||||||
|
],
|
||||||
|
"proof_role": "unrouted_reason"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"defense_map": [
|
||||||
|
{
|
||||||
|
"defense_id": "e00.existing_route",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"e00.op01"
|
||||||
|
],
|
||||||
|
"review_code": "E00_FALSE_UNROUTED_REVIEW"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"calculation_bindings": [],
|
||||||
|
"emits_signals": [
|
||||||
|
"SG-01",
|
||||||
|
"SG-10",
|
||||||
|
"SG-13"
|
||||||
|
],
|
||||||
|
"bo_types": [
|
||||||
|
"event",
|
||||||
|
"state"
|
||||||
|
],
|
||||||
|
"structure_types": [
|
||||||
|
{
|
||||||
|
"type_id": "general_legal_effect",
|
||||||
|
"priority_rank": 11,
|
||||||
|
"module": "legal_effect",
|
||||||
|
"role_projection": "legal_effect_roles"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"effect_projection": {
|
||||||
|
"schema_ref": "Default_Agent/domains/E-00/effect_projection.schema.json",
|
||||||
|
"module": "legal_effect",
|
||||||
|
"role_projection": "legal_effect_roles"
|
||||||
|
},
|
||||||
|
"gates": [
|
||||||
|
{
|
||||||
|
"gate_id": "E00-G01",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-00/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E00_CONSERVATION_FAILURE",
|
||||||
|
"E00_MEMBERSHIP_CONFLICT_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E00-G02",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-00/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"UNROUTED_ISSUE_REVIEW",
|
||||||
|
"E00_FALSE_UNROUTED_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E00-G03",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-00/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E00_SILENT_FALLBACK_FORBIDDEN"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"review_codes": [
|
||||||
|
"UNROUTED_ISSUE_REVIEW",
|
||||||
|
"E00_CONSERVATION_FAILURE",
|
||||||
|
"E00_MEMBERSHIP_CONFLICT_REVIEW",
|
||||||
|
"E00_FALSE_UNROUTED_REVIEW",
|
||||||
|
"E00_SILENT_FALLBACK_FORBIDDEN"
|
||||||
|
],
|
||||||
|
"contract_guards": {
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"unknown_values_require_review": true,
|
||||||
|
"source_membership_required": true,
|
||||||
|
"strict_json_output": true,
|
||||||
|
"meeting_only_evidence_promotion_forbidden": true
|
||||||
|
},
|
||||||
|
"prompt_overlay_ref": "seed_prompt_overlay.md",
|
||||||
|
"profile_schema_ref": "profile.schema.json",
|
||||||
|
"extension_schema_ref": "domain_extension.schema.json",
|
||||||
|
"runtime_activation_from_legacy_alias_forbidden": true,
|
||||||
|
"case_kind_name_runtime_lookup_forbidden": true,
|
||||||
|
"removed_noncanonical_signal_aliases": [
|
||||||
|
"domain_signal"
|
||||||
|
]
|
||||||
|
}
|
||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
# E-00 잔여·미분류 쟁점 수집기 S2 overlay
|
||||||
|
|
||||||
|
B5의 불명한 승계·통지·유치권·목적물·항변 연계를 분해한 후 어느 책임 도메인에도 라우팅되지 않은 원천을 삭제하지 않고 보존한다. E-00은 포괄적 법리를 적용하는 폴백이 아니라 residual collector이다.
|
||||||
|
|
||||||
|
1. 전체 source universe와 selected·support·review-only·unrouted 합집합을 비교하여 보존 여부를 결정론적으로 검사한다.
|
||||||
|
2. 미분류 항목은 `UNROUTED_ISSUE_REVIEW`와 attempted route를 반드시 보존한다.
|
||||||
|
3. `general_legal_effect`는 등록된 실체법 결론의 대체제가 아니며, 미등록 효과는 `unregistered_effect_type`과 review로 보낸다.
|
||||||
|
4. 동일 source가 routed와 unrouted로 중복되거나 합집합이 보존되지 않으면 최종 기안을 차단하는 review를 낸다.
|
||||||
|
5. 사건명·당사자명·개별 날짜를 runtime route로 사용하지 않는다.
|
||||||
|
|
||||||
|
출력은 seed v3 엄격 JSON이며 최종 법률효과 단정은 금지된다.
|
||||||
+1
File diff suppressed because one or more lines are too long
+49
@@ -0,0 +1,49 @@
|
|||||||
|
# E-01 seed prompt overlay — 법률행위 효력·대리
|
||||||
|
|
||||||
|
## 임무와 법리 경계
|
||||||
|
|
||||||
|
이 overlay의 범위는 의사표시의 성립·해석, 반사회질서·불공정·비진의·통정허위표시, 착오·사기·강박, 무효·취소·추인, 대리권·무권대리·표현대리, 조건·기한이다. 계약상 급부 불이행은 EC-00 및 해당 계약 leaf, 등기 말소·이전은 E-09, 소송행위의 효력은 X3와 분리한다.
|
||||||
|
|
||||||
|
`final_conclusion_forbidden=true`이다. Stage 1은 청구권 성립, 무효·취소·책임·소지인 자격, 분할방법, 손해액, 기간 도과 또는 특별법 적용의 최종 결론을 내리지 않는다. 판례는 추출 질문과 쟁점 구조를 만드는 통제자료이고 사건별 결론을 복제하는 routing 규칙이 아니다.
|
||||||
|
|
||||||
|
## Part 1 라우팅 — fail-open 3-tier
|
||||||
|
|
||||||
|
1. **active**: 독립된 evidence source가 두 개 이상의 핵심 증거구성요소를 지지하고 source membership을 통과한다.
|
||||||
|
2. **monitor**: meeting-only, event candidate-only 또는 사건명·평가어·법률명만 있는 경우 후보를 보존하되 증거로 승격하지 않는다.
|
||||||
|
3. **active_with_review**: positive source가 있으나 필수 원천이 누락되거나 서로 충돌하면 후보를 삭제하지 않고 hard review와 함께 실행한다.
|
||||||
|
|
||||||
|
negative cue는 confidence 강등 또는 monitor 전환 근거일 뿐 이미 확인된 positive evidence를 삭제하지 않는다. 사건명·청구명·당사자명·과거 fixture 문구를 runtime lookup key로 쓰지 않는다. 어느 leaf에도 닫히지 않는 중요한 사실은 E-00의 `UNROUTED_ISSUE_REVIEW`로 가시화한다.
|
||||||
|
|
||||||
|
## 증거기반 추출 순서
|
||||||
|
|
||||||
|
1. 법률행위의 유형·당사자·객체·표시 내용·행위일 특정을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
2. 청약·승낙 또는 단독 의사표시의 형성과 해석 자료을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
3. 반사회질서·불공정·비진의·통정허위 등 무효사유 후보을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
4. 착오·사기·강박 등 취소사유와 귀책·상대방 인식 후보을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
5. 취소권자·취소 의사표시·상대방·발송·도달 후보을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
6. 대리권 수여·범위·소멸과 대리행위 특정을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
7. 대리권 외관·본인 귀책·상대방 선의무과실 후보을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
8. 본인의 추인·거절과 상대방 철회·최고 후보을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
9. 선의 제3자의 취득 원인·시기·새로운 법률상 이해관계을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
10. 조건·기한 약정과 성취·도래·방해 사실을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
|
||||||
|
모든 후보는 `source_refs`, `negative_or_conflicting_refs`, `status`, 관련 slot을 갖는다. meeting clause만 있는 후보의 documentary `evidence_refs`는 비워 두며 `proof_grade=client_statement` 경계를 보존한다. 원천에 없는 당사자·일자·금액·법률행위를 추정하지 않는다.
|
||||||
|
|
||||||
|
## 특별법·전문 profile
|
||||||
|
|
||||||
|
특별법 또는 제외 트랙 접점이 발견되면 적용을 단정하지 않고 SG-04와 profile/review queue에 보존한다. 공법 접점에는 `PUBLIC_LAW_NEXUS_REVIEW`, 가사·행정·보전신청 등 범위 경계에는 `TRACK_BOUNDARY_REVIEW`를 발행한다.
|
||||||
|
|
||||||
|
## 계산·법령 version 경계
|
||||||
|
|
||||||
|
CE-03에는 계산값이나 법적 기준의 최종 선택을 보내지 않는다. operand, source refs, `ready|partial|blocked`, unresolved legal input, 필요한 law-version 후보만 SG-04·SG-11로 전달한다. 법정률·기간·한도·정족수·산식·반올림 수치를 이 prompt나 Python에 상수로 두지 않는다. 결과를 바꾸는 operand가 없으면 단일값 대신 scenario 또는 `BLOCKED`를 보존한다. Stage 2만 최종 계산·청구금액을 확정한다.
|
||||||
|
|
||||||
|
## Part 3·Part 4·Stage 2 closure
|
||||||
|
|
||||||
|
- canonical root: `stage_b_domain_bo_seed_output`
|
||||||
|
- schema: `task_c_bo_stage_b_domain_bo_seed.v3`
|
||||||
|
- BO type: `event|state`; 등록된 structure type만 사용
|
||||||
|
- Part 4는 `effect_projection.schema.json`, `module_role_projection.json`, `gates.json`으로 투영하고 미등록 효과의 침묵 fallback을 금지한다.
|
||||||
|
- Stage 2 handoff에는 요소·반대사실·방어·source provenance·evidence slot·calculation state·미해결 review를 보존한다.
|
||||||
|
- 출력은 strict JSON이며 complaint prose와 최종 법률결론을 생성하지 않는다.
|
||||||
|
|
||||||
|
최종 법률결론과 최종 청구액을 확정하지 않는다. 원천 참조와 미해결 review code를 보존한다.
|
||||||
+334
@@ -0,0 +1,334 @@
|
|||||||
|
{
|
||||||
|
"schema_version": "stage1_domain_config.v1",
|
||||||
|
"domain_id": "E-02",
|
||||||
|
"label_ko": "계약상 금전채권",
|
||||||
|
"slug": "contract_money_claim",
|
||||||
|
"kind": "leaf",
|
||||||
|
"status": "active",
|
||||||
|
"execution_policy": {
|
||||||
|
"runnable": true,
|
||||||
|
"always_on": false,
|
||||||
|
"model_tier": "pro",
|
||||||
|
"output_mode": "strict_json",
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"max_instances": 1
|
||||||
|
},
|
||||||
|
"depends_on": [
|
||||||
|
"EC-00",
|
||||||
|
"E-01"
|
||||||
|
],
|
||||||
|
"special_law_profiles": [],
|
||||||
|
"activation_cues": {
|
||||||
|
"positive_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E02-P01",
|
||||||
|
"cue_type": "evidence_component",
|
||||||
|
"match_value": "계약상 금전급부의 원인·금액·이행기가 기재된 처분문서",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "사건명이 아닌 증거 구성요소로 활성",
|
||||||
|
"strength": "strong",
|
||||||
|
"weight": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E02-P02",
|
||||||
|
"cue_type": "evidence_component",
|
||||||
|
"match_value": "송금·부분변제·잔액확인의 연결 자료",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "사건명이 아닌 증거 구성요소로 활성",
|
||||||
|
"strength": "strong",
|
||||||
|
"weight": 1.0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"negative_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E02-N01",
|
||||||
|
"cue_type": "legal_relation",
|
||||||
|
"match_value": "반환·대금지급 약정 없이 금전 이동만 존재",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "인접 도메인과 경계 검토",
|
||||||
|
"effect": "monitor_review",
|
||||||
|
"weight": 0.7
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"conflict_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E02-C01",
|
||||||
|
"rule": "계약서·이체내역·정산서의 금액, 이행기 또는 완제 여부가 불일치",
|
||||||
|
"left_refs": [],
|
||||||
|
"right_refs": [],
|
||||||
|
"effect": "hard_review",
|
||||||
|
"review_code": "E02_AMOUNT_OR_DUE_DATE_CONFLICT"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"routing_policy": {
|
||||||
|
"fail_open": true,
|
||||||
|
"candidate_downgrade_forbidden": true,
|
||||||
|
"minimum_primary_evidence": 1,
|
||||||
|
"leaf_activation_threshold": 1.0,
|
||||||
|
"monitor_threshold": 0.5,
|
||||||
|
"unknown_review_code": "UNROUTED_ISSUE_REVIEW"
|
||||||
|
},
|
||||||
|
"element_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "contract_money_claim.el01",
|
||||||
|
"label": "채권 발생원인",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E02_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "contract_money_claim.el02",
|
||||||
|
"label": "계약 당사자·지위",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E02_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "contract_money_claim.el03",
|
||||||
|
"label": "급부 내용·금액",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E02_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "contract_money_claim.el04",
|
||||||
|
"label": "이행기·이행청구",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E02_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "contract_money_claim.el05",
|
||||||
|
"label": "이행·부분이행·미이행",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E02_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"opposing_fact_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "contract_money_claim.op01",
|
||||||
|
"label": "변제·대물변제·공탁",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "contract_money_claim.op02",
|
||||||
|
"label": "상계",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "contract_money_claim.op03",
|
||||||
|
"label": "소멸시효·기한미도래·동시이행",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"evidence_components": [
|
||||||
|
{
|
||||||
|
"component_id": "contract_money_claim.ev01",
|
||||||
|
"label": "계약서·차용증·정산합의서",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "legacy_successor_evidence"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "contract_money_claim.ev02",
|
||||||
|
"label": "계좌이체·영수증·거래내역",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "legacy_successor_evidence"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "contract_money_claim.ev03",
|
||||||
|
"label": "최고서·청구서·도달자료",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "legacy_successor_evidence"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"defense_map": [
|
||||||
|
{
|
||||||
|
"defense_id": "contract_money_claim.defense01",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"contract_money_claim.op01"
|
||||||
|
],
|
||||||
|
"review_code": "E02_AMOUNT_OR_DUE_DATE_CONFLICT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defense_id": "contract_money_claim.defense02",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"contract_money_claim.op02"
|
||||||
|
],
|
||||||
|
"review_code": "E02_PAYMENT_STATUS_CONFLICT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defense_id": "contract_money_claim.defense03",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"contract_money_claim.op03"
|
||||||
|
],
|
||||||
|
"review_code": "E02_SET_OFF_REVIEW"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"calculation_bindings": [
|
||||||
|
"CE-01",
|
||||||
|
"CE-02",
|
||||||
|
"CE-03"
|
||||||
|
],
|
||||||
|
"emits_signals": [
|
||||||
|
"SG-04",
|
||||||
|
"SG-05",
|
||||||
|
"SG-06",
|
||||||
|
"SG-09",
|
||||||
|
"SG-10",
|
||||||
|
"SG-11",
|
||||||
|
"SG-13"
|
||||||
|
],
|
||||||
|
"bo_types": [
|
||||||
|
"event",
|
||||||
|
"state"
|
||||||
|
],
|
||||||
|
"structure_types": [
|
||||||
|
{
|
||||||
|
"type_id": "money_claim",
|
||||||
|
"priority_rank": 1,
|
||||||
|
"module": "money_claim",
|
||||||
|
"role_projection": "claim_chain_ref"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_id": "general_legal_effect",
|
||||||
|
"priority_rank": 11,
|
||||||
|
"module": "legal_effect",
|
||||||
|
"role_projection": "legal_effect_roles"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"effect_projection": {
|
||||||
|
"schema_ref": "Default_Agent/domains/E-02/effect_projection.schema.json",
|
||||||
|
"module": "money_claim",
|
||||||
|
"role_projection": "claim_chain_ref"
|
||||||
|
},
|
||||||
|
"gates": [
|
||||||
|
{
|
||||||
|
"gate_id": "E02-G01",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-02/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E02_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E02-G02",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-02/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E02_AMOUNT_OR_DUE_DATE_CONFLICT"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E02-G03",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-02/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E02_PAYMENT_STATUS_CONFLICT"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E02-G04",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-02/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E02_SET_OFF_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E02-G05",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-02/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E02_LIMITATION_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E02-G06",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-02/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"CALCULATION_PREEMPTION_BLOCKED"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"review_codes": [
|
||||||
|
"E02_REQUIRED_ELEMENT_GAP_REVIEW",
|
||||||
|
"E02_AMOUNT_OR_DUE_DATE_CONFLICT",
|
||||||
|
"E02_PAYMENT_STATUS_CONFLICT",
|
||||||
|
"E02_SET_OFF_REVIEW",
|
||||||
|
"E02_LIMITATION_REVIEW",
|
||||||
|
"CALCULATION_PREEMPTION_BLOCKED"
|
||||||
|
],
|
||||||
|
"contract_guards": {
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"unknown_values_require_review": true,
|
||||||
|
"source_membership_required": true,
|
||||||
|
"strict_json_output": true,
|
||||||
|
"meeting_only_evidence_promotion_forbidden": true
|
||||||
|
},
|
||||||
|
"prompt_overlay_ref": "seed_prompt_overlay.md",
|
||||||
|
"profile_schema_ref": "profile.schema.json",
|
||||||
|
"extension_schema_ref": "domain_extension.schema.json",
|
||||||
|
"runtime_activation_from_legacy_alias_forbidden": true,
|
||||||
|
"case_kind_name_runtime_lookup_forbidden": true,
|
||||||
|
"removed_noncanonical_signal_aliases": [
|
||||||
|
"domain_signal"
|
||||||
|
]
|
||||||
|
}
|
||||||
+51
@@ -0,0 +1,51 @@
|
|||||||
|
# E-02 seed prompt overlay — 계약상 금전채권
|
||||||
|
|
||||||
|
## 승계 원칙
|
||||||
|
|
||||||
|
이 overlay는 `B1_Money_Successor`의 DOMAIN_SCOPE·WORKFLOW·payload 필드를 삭제하지 않고 E-02으로 분해한다. 이 도메인의 지원이 있는 범위는 `소비대차·매매·위임·임치·정산 등의 금전급부 원인, 이행기, 청구·통지, 부분변제·채무승인·잔액`이다. 반대사실·불확실성·교차 도메인 필요성을 review로 보존한다.
|
||||||
|
|
||||||
|
## Legacy DOMAIN_SCOPE 무손실 보존
|
||||||
|
|
||||||
|
<DOMAIN_SCOPE>
|
||||||
|
Create separate seeds when supported for:
|
||||||
|
- money claim origin: loan, sale price, deposit, settlement, construction price, unpaid balance
|
||||||
|
- due date, acceleration, demand, notice, payment deadline, or delayed performance
|
||||||
|
- partial payment, debt admission, payment memorandum, balance confirmation, account statement, or settlement confirmation
|
||||||
|
- business transfer, trade-name continuation, transferee liability, debt non-assumption clause, or commercial successor liability
|
||||||
|
- uncertain creditor/debtor/successor linkage that must be preserved for downstream review
|
||||||
|
</DOMAIN_SCOPE>
|
||||||
|
|
||||||
|
## Legacy WORKFLOW 무손실 보존
|
||||||
|
|
||||||
|
<WORKFLOW>
|
||||||
|
1. Read `selected_event_candidates`, `selected_evidence_authority`, `selected_meeting_clauses`, `hazard_subset`, and `part1_review_items_relevant` from the current B0 slice only.
|
||||||
|
2. Group sources by legal event/state seed. Do not make one seed per evidence item if several sources support the same event.
|
||||||
|
3. Split money claim origin, maturity/demand, payment/admission, and successor liability when they are distinct legal-effect seeds.
|
||||||
|
4. Preserve payment history, demand/notice hints, admission hints, successor liability hints, and successor-link uncertainty in `extensions.domain_payload`. Preserve agreed interest rate and agreed delay damage rate as literal strings from B1 `loan_components`/`secured_debt_components` (`component_details` of `selected_evidence_authority`) when present; never substitute statutory rates, and keep the supporting evidence indexes in `interest_rate_source_evidence_refs`.
|
||||||
|
5. Use `domain_review_queue` for missing amount/date, uncertain creditor/debtor identity, conflicting payment status, or cross-domain successor merge need.
|
||||||
|
6. Project each seed only to BO target-schema-compatible fields.
|
||||||
|
7. Put domain-specific details under `extensions.domain_payload`.
|
||||||
|
8. Keep all unsupported or uncertain values as null or [] and route review needs to `domain_review_queue`.
|
||||||
|
9. Use `legal_theory_required` for fields this stage must not decide (e.g., lien violation, notice sender standing, possession cause resolution); use `review_required` for extractable-but-unclear facts.
|
||||||
|
</WORKFLOW>
|
||||||
|
|
||||||
|
## S2 분해 적용
|
||||||
|
|
||||||
|
1. slice의 source universe와 selected sources 안에 있는 source ID만 사용한다.
|
||||||
|
2. 증거 하나당 seed 하나가 아니라, 동일한 법적 행위·상태를 지원하는 원천을 그룹화한다.
|
||||||
|
3. 원인·성립, 이행·변동, 소멸·항변, 제3자·승계 관계가 다르면 별도 seed로 분리한다.
|
||||||
|
4. legacy payload 필드를 `extensions.domain_payload.payload`에 그대로 보존하고, S2 필드만 additive로 추가한다.
|
||||||
|
5. 등기 지분·이율·충당·배당액을 정규화하거나 계산하지 않고 operand 상태만 CE에 전달한다.
|
||||||
|
6. 통지·도달, 자산·지분, 소송법상 경계는 필요한 X1·X2·X3 dependency ref로 보존한다.
|
||||||
|
|
||||||
|
## 금지규칙
|
||||||
|
|
||||||
|
- 사건명·파일명·단일 키워드로 활성·법적 성격을 확정하지 말 것.
|
||||||
|
- 미팅 진술을 직접증거로 승격하지 말 것.
|
||||||
|
- 채권·담보권·등기·승계책임의 성립, 항변 배척, 청구인용 가능성을 최종 판단하지 말 것.
|
||||||
|
- 법정이율·시효완성일·배당액·잔액을 추정하지 말 것.
|
||||||
|
- 반대자료나 불명확성을 빈 배열로 소거하지 말 것.
|
||||||
|
|
||||||
|
## 출력 계약
|
||||||
|
|
||||||
|
root는 `stage_b_domain_bo_seed_output`, schema version은 `task_c_bo_stage_b_domain_bo_seed.v3`이다. final BO ID를 생성하지 않고 `final_conclusion_forbidden=true`를 유지한다. `bo_seed_candidates`, 요건·반대사실·항변·계산요청·dependency·review를 additive로 출력한다. 도메인 페이로드는 `E-02.domain_extension.v2`를 따른다.
|
||||||
+322
@@ -0,0 +1,322 @@
|
|||||||
|
{
|
||||||
|
"schema_version": "stage1_domain_config.v1",
|
||||||
|
"domain_id": "E-03",
|
||||||
|
"label_ko": "다수당사자·보증·승계",
|
||||||
|
"slug": "parties_liability_succession",
|
||||||
|
"kind": "leaf",
|
||||||
|
"status": "active",
|
||||||
|
"execution_policy": {
|
||||||
|
"runnable": true,
|
||||||
|
"always_on": false,
|
||||||
|
"model_tier": "pro",
|
||||||
|
"output_mode": "strict_json",
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"max_instances": 1
|
||||||
|
},
|
||||||
|
"depends_on": [
|
||||||
|
"EC-00",
|
||||||
|
"E-01",
|
||||||
|
"E-02"
|
||||||
|
],
|
||||||
|
"special_law_profiles": [],
|
||||||
|
"activation_cues": {
|
||||||
|
"positive_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E03-P01",
|
||||||
|
"cue_type": "evidence_component",
|
||||||
|
"match_value": "보증·연대채무·채무인수·채권양도의 당사자와 의사표시가 기록된 문서",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "사건명이 아닌 증거 구성요소로 활성",
|
||||||
|
"strength": "strong",
|
||||||
|
"weight": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E03-P02",
|
||||||
|
"cue_type": "evidence_component",
|
||||||
|
"match_value": "영업양도, 상호 계속사용, 책임배제 등기·통지 자료",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "사건명이 아닌 증거 구성요소로 활성",
|
||||||
|
"strength": "strong",
|
||||||
|
"weight": 1.0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"negative_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E03-N01",
|
||||||
|
"cue_type": "legal_relation",
|
||||||
|
"match_value": "단순한 회사명 유사성만 있고 영업양도·보증·승계 사실이 없음",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "인접 도메인과 경계 검토",
|
||||||
|
"effect": "monitor_review",
|
||||||
|
"weight": 0.7
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"conflict_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E03-C01",
|
||||||
|
"rule": "채무 승계·보증 범위나 책임배제 등기·통지 여부가 불일치",
|
||||||
|
"left_refs": [],
|
||||||
|
"right_refs": [],
|
||||||
|
"effect": "hard_review",
|
||||||
|
"review_code": "E03_SUCCESSION_SCOPE_CONFLICT"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"routing_policy": {
|
||||||
|
"fail_open": true,
|
||||||
|
"candidate_downgrade_forbidden": true,
|
||||||
|
"minimum_primary_evidence": 1,
|
||||||
|
"leaf_activation_threshold": 1.0,
|
||||||
|
"monitor_threshold": 0.5,
|
||||||
|
"unknown_review_code": "UNROUTED_ISSUE_REVIEW"
|
||||||
|
},
|
||||||
|
"element_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "parties_liability_succession.el01",
|
||||||
|
"label": "주채무·원채권",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E03_PARTY_LINK_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "parties_liability_succession.el02",
|
||||||
|
"label": "보증·연대의 성립·범위",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E03_PARTY_LINK_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "parties_liability_succession.el03",
|
||||||
|
"label": "영업양도·상호속용",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E03_PARTY_LINK_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "parties_liability_succession.el04",
|
||||||
|
"label": "채권양도·통지",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E03_PARTY_LINK_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "parties_liability_succession.el05",
|
||||||
|
"label": "다수 채무자의 책임 관계",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E03_PARTY_LINK_GAP_REVIEW"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"opposing_fact_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "parties_liability_succession.op01",
|
||||||
|
"label": "보증한도·조건",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "parties_liability_succession.op02",
|
||||||
|
"label": "책임배제 등기·통지",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "parties_liability_succession.op03",
|
||||||
|
"label": "구상채권 범위·변제",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"evidence_components": [
|
||||||
|
{
|
||||||
|
"component_id": "parties_liability_succession.ev01",
|
||||||
|
"label": "보증서·채무인수계약",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "legacy_successor_evidence"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "parties_liability_succession.ev02",
|
||||||
|
"label": "영업양도계약·사업자·상호 자료",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "legacy_successor_evidence"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "parties_liability_succession.ev03",
|
||||||
|
"label": "채권양도통지·도달자료",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "legacy_successor_evidence"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"defense_map": [
|
||||||
|
{
|
||||||
|
"defense_id": "parties_liability_succession.defense01",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"parties_liability_succession.op01"
|
||||||
|
],
|
||||||
|
"review_code": "E03_SUCCESSION_SCOPE_CONFLICT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defense_id": "parties_liability_succession.defense02",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"parties_liability_succession.op02"
|
||||||
|
],
|
||||||
|
"review_code": "E03_NOTICE_EFFECT_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defense_id": "parties_liability_succession.defense03",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"parties_liability_succession.op03"
|
||||||
|
],
|
||||||
|
"review_code": "E03_MULTIPARTY_ALLOCATION_REVIEW"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"calculation_bindings": [
|
||||||
|
"CE-01",
|
||||||
|
"CE-02"
|
||||||
|
],
|
||||||
|
"emits_signals": [
|
||||||
|
"SG-04",
|
||||||
|
"SG-05",
|
||||||
|
"SG-08",
|
||||||
|
"SG-09",
|
||||||
|
"SG-10",
|
||||||
|
"SG-11",
|
||||||
|
"SG-13"
|
||||||
|
],
|
||||||
|
"bo_types": [
|
||||||
|
"event",
|
||||||
|
"state"
|
||||||
|
],
|
||||||
|
"structure_types": [
|
||||||
|
{
|
||||||
|
"type_id": "money_claim",
|
||||||
|
"priority_rank": 1,
|
||||||
|
"module": "money_claim",
|
||||||
|
"role_projection": "claim_chain_ref"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_id": "commercial_successor",
|
||||||
|
"priority_rank": 2,
|
||||||
|
"module": "commercial_successor",
|
||||||
|
"role_projection": "claim_chain_ref"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_id": "general_legal_effect",
|
||||||
|
"priority_rank": 11,
|
||||||
|
"module": "legal_effect",
|
||||||
|
"role_projection": "legal_effect_roles"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"effect_projection": {
|
||||||
|
"schema_ref": "Default_Agent/domains/E-03/effect_projection.schema.json",
|
||||||
|
"module": "commercial_successor",
|
||||||
|
"role_projection": "claim_chain_ref"
|
||||||
|
},
|
||||||
|
"gates": [
|
||||||
|
{
|
||||||
|
"gate_id": "E03-G01",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-03/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E03_PARTY_LINK_GAP_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E03-G02",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-03/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E03_SUCCESSION_SCOPE_CONFLICT"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E03-G03",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-03/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E03_NOTICE_EFFECT_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E03-G04",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-03/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E03_MULTIPARTY_ALLOCATION_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"review_codes": [
|
||||||
|
"E03_PARTY_LINK_GAP_REVIEW",
|
||||||
|
"E03_SUCCESSION_SCOPE_CONFLICT",
|
||||||
|
"E03_NOTICE_EFFECT_REVIEW",
|
||||||
|
"E03_MULTIPARTY_ALLOCATION_REVIEW"
|
||||||
|
],
|
||||||
|
"contract_guards": {
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"unknown_values_require_review": true,
|
||||||
|
"source_membership_required": true,
|
||||||
|
"strict_json_output": true,
|
||||||
|
"meeting_only_evidence_promotion_forbidden": true
|
||||||
|
},
|
||||||
|
"prompt_overlay_ref": "seed_prompt_overlay.md",
|
||||||
|
"profile_schema_ref": "profile.schema.json",
|
||||||
|
"extension_schema_ref": "domain_extension.schema.json",
|
||||||
|
"runtime_activation_from_legacy_alias_forbidden": true,
|
||||||
|
"case_kind_name_runtime_lookup_forbidden": true,
|
||||||
|
"removed_noncanonical_signal_aliases": [
|
||||||
|
"domain_signal"
|
||||||
|
]
|
||||||
|
}
|
||||||
+51
@@ -0,0 +1,51 @@
|
|||||||
|
# E-03 seed prompt overlay — 다수당사자·보증·승계
|
||||||
|
|
||||||
|
## 승계 원칙
|
||||||
|
|
||||||
|
이 overlay는 `B1_Money_Successor`의 DOMAIN_SCOPE·WORKFLOW·payload 필드를 삭제하지 않고 E-03으로 분해한다. 이 도메인의 지원이 있는 범위는 `보증·연대보증, 연대·부진정연대, 채무인수, 구상, 채권양도, 영업양도·상호속용, 법인격 남용 후보`이다. 반대사실·불확실성·교차 도메인 필요성을 review로 보존한다.
|
||||||
|
|
||||||
|
## Legacy DOMAIN_SCOPE 무손실 보존
|
||||||
|
|
||||||
|
<DOMAIN_SCOPE>
|
||||||
|
Create separate seeds when supported for:
|
||||||
|
- money claim origin: loan, sale price, deposit, settlement, construction price, unpaid balance
|
||||||
|
- due date, acceleration, demand, notice, payment deadline, or delayed performance
|
||||||
|
- partial payment, debt admission, payment memorandum, balance confirmation, account statement, or settlement confirmation
|
||||||
|
- business transfer, trade-name continuation, transferee liability, debt non-assumption clause, or commercial successor liability
|
||||||
|
- uncertain creditor/debtor/successor linkage that must be preserved for downstream review
|
||||||
|
</DOMAIN_SCOPE>
|
||||||
|
|
||||||
|
## Legacy WORKFLOW 무손실 보존
|
||||||
|
|
||||||
|
<WORKFLOW>
|
||||||
|
1. Read `selected_event_candidates`, `selected_evidence_authority`, `selected_meeting_clauses`, `hazard_subset`, and `part1_review_items_relevant` from the current B0 slice only.
|
||||||
|
2. Group sources by legal event/state seed. Do not make one seed per evidence item if several sources support the same event.
|
||||||
|
3. Split money claim origin, maturity/demand, payment/admission, and successor liability when they are distinct legal-effect seeds.
|
||||||
|
4. Preserve payment history, demand/notice hints, admission hints, successor liability hints, and successor-link uncertainty in `extensions.domain_payload`. Preserve agreed interest rate and agreed delay damage rate as literal strings from B1 `loan_components`/`secured_debt_components` (`component_details` of `selected_evidence_authority`) when present; never substitute statutory rates, and keep the supporting evidence indexes in `interest_rate_source_evidence_refs`.
|
||||||
|
5. Use `domain_review_queue` for missing amount/date, uncertain creditor/debtor identity, conflicting payment status, or cross-domain successor merge need.
|
||||||
|
6. Project each seed only to BO target-schema-compatible fields.
|
||||||
|
7. Put domain-specific details under `extensions.domain_payload`.
|
||||||
|
8. Keep all unsupported or uncertain values as null or [] and route review needs to `domain_review_queue`.
|
||||||
|
9. Use `legal_theory_required` for fields this stage must not decide (e.g., lien violation, notice sender standing, possession cause resolution); use `review_required` for extractable-but-unclear facts.
|
||||||
|
</WORKFLOW>
|
||||||
|
|
||||||
|
## S2 분해 적용
|
||||||
|
|
||||||
|
1. slice의 source universe와 selected sources 안에 있는 source ID만 사용한다.
|
||||||
|
2. 증거 하나당 seed 하나가 아니라, 동일한 법적 행위·상태를 지원하는 원천을 그룹화한다.
|
||||||
|
3. 원인·성립, 이행·변동, 소멸·항변, 제3자·승계 관계가 다르면 별도 seed로 분리한다.
|
||||||
|
4. legacy payload 필드를 `extensions.domain_payload.payload`에 그대로 보존하고, S2 필드만 additive로 추가한다.
|
||||||
|
5. 등기 지분·이율·충당·배당액을 정규화하거나 계산하지 않고 operand 상태만 CE에 전달한다.
|
||||||
|
6. 통지·도달, 자산·지분, 소송법상 경계는 필요한 X1·X2·X3 dependency ref로 보존한다.
|
||||||
|
|
||||||
|
## 금지규칙
|
||||||
|
|
||||||
|
- 사건명·파일명·단일 키워드로 활성·법적 성격을 확정하지 말 것.
|
||||||
|
- 미팅 진술을 직접증거로 승격하지 말 것.
|
||||||
|
- 채권·담보권·등기·승계책임의 성립, 항변 배척, 청구인용 가능성을 최종 판단하지 말 것.
|
||||||
|
- 법정이율·시효완성일·배당액·잔액을 추정하지 말 것.
|
||||||
|
- 반대자료나 불명확성을 빈 배열로 소거하지 말 것.
|
||||||
|
|
||||||
|
## 출력 계약
|
||||||
|
|
||||||
|
root는 `stage_b_domain_bo_seed_output`, schema version은 `task_c_bo_stage_b_domain_bo_seed.v3`이다. final BO ID를 생성하지 않고 `final_conclusion_forbidden=true`를 유지한다. `bo_seed_candidates`, 요건·반대사실·항변·계산요청·dependency·review를 additive로 출력한다. 도메인 페이로드는 `E-03.domain_extension.v2`를 따른다.
|
||||||
+382
@@ -0,0 +1,382 @@
|
|||||||
|
{
|
||||||
|
"schema_version": "stage1_domain_config.v1",
|
||||||
|
"domain_id": "E-04",
|
||||||
|
"label_ko": "부당이득·원상회복·사용이익",
|
||||||
|
"slug": "unjust_enrichment",
|
||||||
|
"kind": "leaf",
|
||||||
|
"status": "active",
|
||||||
|
"execution_policy": {
|
||||||
|
"runnable": true,
|
||||||
|
"always_on": false,
|
||||||
|
"model_tier": "flash",
|
||||||
|
"output_mode": "strict_json",
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"max_instances": 1
|
||||||
|
},
|
||||||
|
"depends_on": [
|
||||||
|
"EC-00",
|
||||||
|
"E-01",
|
||||||
|
"X2"
|
||||||
|
],
|
||||||
|
"special_law_profiles": [],
|
||||||
|
"activation_cues": {
|
||||||
|
"positive_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E04-P01",
|
||||||
|
"cue_type": "legal_relation",
|
||||||
|
"match_value": "급부 또는 재산·노무 제공과 대응하는 이익 귀속 자료",
|
||||||
|
"source_field": "source_universe",
|
||||||
|
"note": null,
|
||||||
|
"strength": "strong",
|
||||||
|
"weight": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E04-P02",
|
||||||
|
"cue_type": "event_kind",
|
||||||
|
"match_value": "점유·사용·수익과 임료 상당액 또는 사용이익 산정 자료",
|
||||||
|
"source_field": "source_universe",
|
||||||
|
"note": null,
|
||||||
|
"strength": "strong",
|
||||||
|
"weight": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E04-P03",
|
||||||
|
"cue_type": "event_subkind",
|
||||||
|
"match_value": "무효·취소·해제·목적 소멸 뒤 반환 또는 원상회복 자료",
|
||||||
|
"source_field": "source_universe",
|
||||||
|
"note": null,
|
||||||
|
"strength": "support",
|
||||||
|
"weight": 0.5
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"negative_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E04-N01",
|
||||||
|
"cue_type": "other",
|
||||||
|
"match_value": "유효한 계약상 대금·차임의 이행만 문제되고 반환 원인이나 초과수익 쟁점이 없음",
|
||||||
|
"source_field": "source_universe",
|
||||||
|
"note": "E-02 또는 E-08 중심으로 라우팅하되 후보를 삭제하지 않는다",
|
||||||
|
"effect": "confidence_downrank_only",
|
||||||
|
"weight": 1.0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"conflict_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E04-C01",
|
||||||
|
"rule": "이익 귀속·손실 또는 법률상 원인 자료가 서로 충돌함",
|
||||||
|
"left_refs": [],
|
||||||
|
"right_refs": [],
|
||||||
|
"effect": "hard_review",
|
||||||
|
"review_code": "E04_CAUSE_OR_GAIN_CONFLICT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E04-C02",
|
||||||
|
"rule": "사용기간·면적·임료 기준 또는 공제 항목이 서로 충돌함",
|
||||||
|
"left_refs": [],
|
||||||
|
"right_refs": [],
|
||||||
|
"effect": "hard_review",
|
||||||
|
"review_code": "E04_USE_VALUE_CONFLICT"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"routing_policy": {
|
||||||
|
"fail_open": true,
|
||||||
|
"candidate_downgrade_forbidden": true,
|
||||||
|
"minimum_primary_evidence": 1,
|
||||||
|
"leaf_activation_threshold": 1.0,
|
||||||
|
"monitor_threshold": 0.5,
|
||||||
|
"unknown_review_code": "UNROUTED_ISSUE_REVIEW"
|
||||||
|
},
|
||||||
|
"element_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "e04.el01",
|
||||||
|
"label": "상대방의 이익 귀속",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E04_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e04.el02",
|
||||||
|
"label": "원고의 손실 또는 비용 부담",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E04_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e04.el03",
|
||||||
|
"label": "이익과 손실의 대응관계",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E04_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e04.el04",
|
||||||
|
"label": "법률상 원인과 그 존부·소멸 경위",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E04_CAUSE_OR_GAIN_CONFLICT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e04.el05",
|
||||||
|
"label": "점유·사용·수익 기간과 대상",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e04.el06",
|
||||||
|
"label": "임료·시가·면적·가치평가 입력",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e04.el07",
|
||||||
|
"label": "원물·가액 반환 및 이자·과실 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"opposing_fact_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "e04.op01",
|
||||||
|
"label": "유효한 계약·법률상 원인 존속 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e04.op02",
|
||||||
|
"label": "이익·손실·인과관계 부존재 또는 범위 감축 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e04.op03",
|
||||||
|
"label": "비용·개량·상계·동시이행·불법원인급여 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"evidence_components": [
|
||||||
|
{
|
||||||
|
"component_id": "e04.transfer_or_payment",
|
||||||
|
"label": "급부·송금·지급·비용 지출 자료",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "gain_and_loss"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "e04.contract_or_termination",
|
||||||
|
"label": "계약·무효·취소·해제·종료 자료",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "legal_basis"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "e04.use_and_possession",
|
||||||
|
"label": "점유·사용·수익 기간과 대상 자료",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "use_benefit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "e04.valuation",
|
||||||
|
"label": "감정·시세·임료·면적·산정기초 자료",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "valuation_operand"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"defense_map": [
|
||||||
|
{
|
||||||
|
"defense_id": "e04.legal_basis",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"e04.op01"
|
||||||
|
],
|
||||||
|
"review_code": "E04_CAUSE_OR_GAIN_CONFLICT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defense_id": "e04.scope_reduction",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"e04.op02",
|
||||||
|
"e04.op03"
|
||||||
|
],
|
||||||
|
"review_code": "E04_DEFENSE_OR_OFFSET_REVIEW"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"calculation_bindings": [
|
||||||
|
"CE-01",
|
||||||
|
"CE-04",
|
||||||
|
"CE-07"
|
||||||
|
],
|
||||||
|
"emits_signals": [
|
||||||
|
"SG-04",
|
||||||
|
"SG-05",
|
||||||
|
"SG-06",
|
||||||
|
"SG-07",
|
||||||
|
"SG-08",
|
||||||
|
"SG-09",
|
||||||
|
"SG-10",
|
||||||
|
"SG-11",
|
||||||
|
"SG-12",
|
||||||
|
"SG-13"
|
||||||
|
],
|
||||||
|
"bo_types": [
|
||||||
|
"event",
|
||||||
|
"state"
|
||||||
|
],
|
||||||
|
"structure_types": [
|
||||||
|
{
|
||||||
|
"type_id": "land_use_gain",
|
||||||
|
"priority_rank": 5,
|
||||||
|
"module": "land_use_gain",
|
||||||
|
"role_projection": "legal_calculation_object"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_id": "valuation",
|
||||||
|
"priority_rank": 6,
|
||||||
|
"module": "valuation",
|
||||||
|
"role_projection": "legal_calculation_object"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_id": "unjust_enrichment",
|
||||||
|
"priority_rank": 12,
|
||||||
|
"module": "unjust_enrichment",
|
||||||
|
"role_projection": "restitution_roles"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"effect_projection": {
|
||||||
|
"schema_ref": "Default_Agent/domains/E-04/effect_projection.schema.json",
|
||||||
|
"module": "unjust_enrichment",
|
||||||
|
"role_projection": "restitution_roles"
|
||||||
|
},
|
||||||
|
"gates": [
|
||||||
|
{
|
||||||
|
"gate_id": "E04-G01",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-04/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E04_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E04-G02",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-04/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E04_USE_VALUE_CONFLICT"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E04-G03",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-04/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E04_CAUSE_OR_GAIN_CONFLICT",
|
||||||
|
"E04_DEFENSE_OR_OFFSET_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E04-G04",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-04/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"FINAL_LEGAL_CONCLUSION_BLOCKED"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"review_codes": [
|
||||||
|
"E04_REQUIRED_ELEMENT_GAP_REVIEW",
|
||||||
|
"E04_CAUSE_OR_GAIN_CONFLICT",
|
||||||
|
"E04_USE_VALUE_CONFLICT",
|
||||||
|
"E04_DEFENSE_OR_OFFSET_REVIEW",
|
||||||
|
"FINAL_LEGAL_CONCLUSION_BLOCKED"
|
||||||
|
],
|
||||||
|
"contract_guards": {
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"unknown_values_require_review": true,
|
||||||
|
"source_membership_required": true,
|
||||||
|
"strict_json_output": true,
|
||||||
|
"meeting_only_evidence_promotion_forbidden": true
|
||||||
|
},
|
||||||
|
"prompt_overlay_ref": "seed_prompt_overlay.md",
|
||||||
|
"profile_schema_ref": "profile.schema.json",
|
||||||
|
"extension_schema_ref": "domain_extension.schema.json",
|
||||||
|
"runtime_activation_from_legacy_alias_forbidden": true,
|
||||||
|
"case_kind_name_runtime_lookup_forbidden": true,
|
||||||
|
"removed_noncanonical_signal_aliases": [
|
||||||
|
"domain_signal"
|
||||||
|
]
|
||||||
|
}
|
||||||
+48
@@ -0,0 +1,48 @@
|
|||||||
|
# E-04 seed prompt overlay — 부당이득·원상회복·사용이익
|
||||||
|
|
||||||
|
## 임무와 입력 경계
|
||||||
|
|
||||||
|
현재 `stage_b_domain_slice.v2`의 `selected_sources`, `support_refs`, `review_only_refs`와 그 source ID가 가리키는 slice 내부 원천만 사용한다. 전체 사건 파일, 사건명, 당사자명 또는 특정 날짜를 이용해 도메인을 확정하지 않는다. 동일 사건·상태를 지지하는 원천은 하나의 seed로 묶되 법률효과가 다른 사건과 상태는 분리한다.
|
||||||
|
|
||||||
|
## legacy `B3` 의미 보존 범위
|
||||||
|
|
||||||
|
- 사용·점유로 얻은 이익과 상대방 손실
|
||||||
|
- 사용기간과 임료 상당액·가치 기준
|
||||||
|
- 무효·취소·해제 등 급부 원인의 소멸과 원상회복
|
||||||
|
- 반환 방식과 공제·상계 후보
|
||||||
|
|
||||||
|
위 범위는 기능 확장이 아니라 legacy delta의 무손실 분해다. legacy field는 `extensions.domain_payload.payload`의 명시 필드와 `legacy_*_projection`에 source refs를 포함하여 보존한다.
|
||||||
|
|
||||||
|
## 사실 슬롯
|
||||||
|
|
||||||
|
- `e04.el01`: 상대방의 이익 귀속
|
||||||
|
- `e04.el02`: 원고의 손실 또는 비용 부담
|
||||||
|
- `e04.el03`: 이익과 손실의 대응관계
|
||||||
|
- `e04.el04`: 법률상 원인과 그 존부·소멸 경위
|
||||||
|
- `e04.el05`: 점유·사용·수익 기간과 대상
|
||||||
|
- `e04.el06`: 임료·시가·면적·가치평가 입력
|
||||||
|
- `e04.el07`: 원물·가액 반환 및 이자·과실 후보
|
||||||
|
- `e04.op01`: 유효한 계약·법률상 원인 존속 후보
|
||||||
|
- `e04.op02`: 이익·손실·인과관계 부존재 또는 범위 감축 후보
|
||||||
|
- `e04.op03`: 비용·개량·상계·동시이행·불법원인급여 후보
|
||||||
|
|
||||||
|
## 실행 workflow
|
||||||
|
|
||||||
|
1. 각 source가 slice membership 안에 있는지 검증하고 meeting-only 진술을 증거로 승격하지 않는다.
|
||||||
|
2. 법률행위·사실행위·상태·평가 입력을 분리하되 동일 event의 증거를 문서별 seed로 과분할하지 않는다.
|
||||||
|
3. 원고에게 유리한 사실과 반대사실·항변·충돌 자료를 같은 proof grade로 병렬 보존한다.
|
||||||
|
4. legacy payload 의미와 source provenance를 extension에 투영하고, 신규 필드는 additive로만 사용한다.
|
||||||
|
5. 계산 `CE-01·CE-04·CE-07`에는 결과값이나 법정 수치를 쓰지 않고 operand·기준일·누락·scenario 필요성만 전달한다.
|
||||||
|
6. Part 3에는 등록 structure type 후보와 source refs를 보내고, Part 4에는 이 pack의 effect projection과 gate 결과를 전달한다.
|
||||||
|
7. 최종 법률평가·청구선택·책임범위·계산값은 생성하지 않는다.
|
||||||
|
|
||||||
|
## 금지규칙
|
||||||
|
|
||||||
|
- 사건 종류명·단일 법률용어·문서 제목만으로 활성하지 않는다.
|
||||||
|
- 반대증거, 불리한 사실, 누락 operand, 상충하는 날짜·금액·자산 표시를 삭제하거나 빈 배열로 위장하지 않는다.
|
||||||
|
- 법정률·기간·상한 숫자를 프롬프트에 고정하지 않는다. SG-04와 해당 계산 registry가 정하는 versioned input만 참조한다.
|
||||||
|
- 미등록 효과를 `general_legal_effect`로 침묵 강등하지 않고 `UNROUTED_ISSUE_REVIEW` 또는 등록 gate로 보낸다.
|
||||||
|
|
||||||
|
## 출력 계약
|
||||||
|
|
||||||
|
root는 `stage_b_domain_bo_seed_output`, schema version은 `task_c_bo_stage_b_domain_bo_seed.v3`이다. `final_conclusion_forbidden=true`와 source membership, strict JSON, review 비감소 규칙을 지킨다. domain payload는 `extensions.domain_payload.payload`에만 기록하고 `domain_extension.schema.json`을 통과해야 한다.
|
||||||
+576
@@ -0,0 +1,576 @@
|
|||||||
|
{
|
||||||
|
"schema_version": "stage1_domain_config.v1",
|
||||||
|
"domain_id": "E-05",
|
||||||
|
"label_ko": "불법행위 일반",
|
||||||
|
"slug": "tort_general",
|
||||||
|
"kind": "leaf",
|
||||||
|
"status": "active",
|
||||||
|
"execution_policy": {
|
||||||
|
"runnable": true,
|
||||||
|
"always_on": false,
|
||||||
|
"model_tier": "pro",
|
||||||
|
"output_mode": "strict_json",
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"max_instances": 1
|
||||||
|
},
|
||||||
|
"depends_on": [
|
||||||
|
"E-01",
|
||||||
|
"X3"
|
||||||
|
],
|
||||||
|
"special_law_profiles": [],
|
||||||
|
"activation_cues": {
|
||||||
|
"positive_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E05-P01",
|
||||||
|
"cue_type": "evidence_component",
|
||||||
|
"match_value": "특정 행위 또는 부작위, 당시 주의의무·예견가능성·회피가능성을 연결하는 자료",
|
||||||
|
"source_field": "source_universe",
|
||||||
|
"note": "청구명이나 사건명 대신 행위와 귀책의 증거구성요소를 본다",
|
||||||
|
"strength": "strong",
|
||||||
|
"weight": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E05-P02",
|
||||||
|
"cue_type": "evidence_component",
|
||||||
|
"match_value": "보호이익 침해, 재산·신체·정신 손해와 행위 사이의 시간·기전·범위를 잇는 자료",
|
||||||
|
"source_field": "source_universe",
|
||||||
|
"note": "손해 존재와 상당인과관계 후보를 분리 추출한다",
|
||||||
|
"strength": "strong",
|
||||||
|
"weight": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E05-P03",
|
||||||
|
"cue_type": "party_role",
|
||||||
|
"match_value": "피용자 업무수행과 사용자의 선임·지휘감독 또는 사무집행 관련성을 나타내는 자료",
|
||||||
|
"source_field": "source_universe",
|
||||||
|
"note": "민법 제756조 후보일 뿐 사용자책임 성립을 확정하지 않는다",
|
||||||
|
"strength": "support",
|
||||||
|
"weight": 0.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E05-P04",
|
||||||
|
"cue_type": "evidence_component",
|
||||||
|
"match_value": "공작물의 설치·보존상 하자, 점유자·소유자 지위와 방지조치 자료",
|
||||||
|
"source_field": "source_universe",
|
||||||
|
"note": "민법 제758조 후보와 전문 건설 profile 경계를 함께 보존한다",
|
||||||
|
"strength": "support",
|
||||||
|
"weight": 0.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E05-P05",
|
||||||
|
"cue_type": "party_role",
|
||||||
|
"match_value": "복수 행위자의 공동 가공·교사·방조 또는 행위 관련성과 각 행위 시점 자료",
|
||||||
|
"source_field": "source_universe",
|
||||||
|
"note": "민법 제760조 후보로서 개별 인과관계와 책임범위를 유지한다",
|
||||||
|
"strength": "support",
|
||||||
|
"weight": 0.5
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"negative_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E05-N01",
|
||||||
|
"cue_type": "legal_relation",
|
||||||
|
"match_value": "계약상 급부의 미이행만 제시되고 독립된 보호의무 위반·권리침해·손해 기전 자료가 없음",
|
||||||
|
"source_field": "source_universe",
|
||||||
|
"note": "계약책임 도메인을 우선하되 독립 불법행위 자료가 있으면 E-05 후보를 삭제하지 않는다",
|
||||||
|
"effect": "confidence_downrank_only",
|
||||||
|
"weight": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E05-N02",
|
||||||
|
"cue_type": "term",
|
||||||
|
"match_value": "자동차·산재·국가배상·의료·제조물·건설·언론 등 사건명 또는 법명만 있고 적용요건 자료가 없음",
|
||||||
|
"source_field": "source_universe",
|
||||||
|
"note": "전문 특별법 명칭 단독 활성화를 금지하고 profile candidate review로 보낸다",
|
||||||
|
"effect": "monitor_review",
|
||||||
|
"weight": 0.7
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"conflict_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E05-C01",
|
||||||
|
"rule": "행위·주의의무 위반 자료와 적법행위·주의의무 이행 자료가 병존하거나 행위자 특정이 충돌함",
|
||||||
|
"left_refs": [],
|
||||||
|
"right_refs": [],
|
||||||
|
"effect": "hard_review",
|
||||||
|
"review_code": "E05_CONDUCT_OR_FAULT_CONFLICT_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E05-C02",
|
||||||
|
"rule": "손해 발생 기전·범위·시점 또는 행위와 손해 사이 인과관계 자료가 상충함",
|
||||||
|
"left_refs": [],
|
||||||
|
"right_refs": [],
|
||||||
|
"effect": "hard_review",
|
||||||
|
"review_code": "E05_CAUSATION_OR_DAMAGE_CONFLICT_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E05-C03",
|
||||||
|
"rule": "침해일·손해 발생일·손해 및 가해자 인지일·청구권 행사일 자료가 상충함",
|
||||||
|
"left_refs": [],
|
||||||
|
"right_refs": [],
|
||||||
|
"effect": "hard_review",
|
||||||
|
"review_code": "E05_LIMITATION_DATE_CONFLICT_REVIEW"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"routing_policy": {
|
||||||
|
"fail_open": true,
|
||||||
|
"candidate_downgrade_forbidden": true,
|
||||||
|
"minimum_primary_evidence": 1,
|
||||||
|
"leaf_activation_threshold": 1.0,
|
||||||
|
"monitor_threshold": 0.5,
|
||||||
|
"unknown_review_code": "UNROUTED_ISSUE_REVIEW"
|
||||||
|
},
|
||||||
|
"element_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "e05.el01",
|
||||||
|
"label": "가해 행위·부작위와 행위자 특정",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E05_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e05.el02",
|
||||||
|
"label": "고의·과실 및 주의의무·예견·회피 가능성 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E05_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e05.el03",
|
||||||
|
"label": "침해이익과 위법성 판단의 기초사실",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E05_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e05.el04",
|
||||||
|
"label": "손해 항목·발생시점·범위 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E05_DAMAGE_SOURCE_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e05.el05",
|
||||||
|
"label": "행위와 손해 사이 사실적·규범적 인과관계 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E05_CAUSATION_SOURCE_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e05.el06",
|
||||||
|
"label": "사용관계·사무집행 관련성·선임감독 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e05.el07",
|
||||||
|
"label": "공작물 하자·점유자·소유자·방지조치 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e05.el08",
|
||||||
|
"label": "공동가공·교사·방조와 행위자별 관여 시점 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e05.el09",
|
||||||
|
"label": "침해일·손해 발생일·인지일·권리행사일 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E05_LIMITATION_INPUT_GAP_REVIEW"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"opposing_fact_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "e05.op01",
|
||||||
|
"label": "주의의무 이행·불가항력·제3자 원인 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e05.op02",
|
||||||
|
"label": "피해자의 과실·손해 확대·손익상계 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e05.op03",
|
||||||
|
"label": "인과관계 단절·기왕증·대체 원인 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e05.op04",
|
||||||
|
"label": "사용관계·사무집행 관련성 부정 또는 상당한 주의 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e05.op05",
|
||||||
|
"label": "소멸시효 완성·권리행사 제한 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e05.op06",
|
||||||
|
"label": "정당행위·동의·위법성 조각 또는 책임제한 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"evidence_components": [
|
||||||
|
{
|
||||||
|
"component_id": "e05.conduct_record",
|
||||||
|
"label": "행위·부작위의 일시·장소·방법을 나타내는 문서·영상·기록",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "conduct_and_actor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "e05.duty_fault_record",
|
||||||
|
"label": "주의기준·업무절차·경고·예견 및 회피 가능성 자료",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "fault_and_wrongfulness"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "e05.damage_record",
|
||||||
|
"label": "진료·수리·회계·소득·평가 등 손해 발생·범위 자료",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "damage"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "e05.causation_record",
|
||||||
|
"label": "사고경위·감정·의학·기술·시간순서 등 인과관계 자료",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "causation"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "e05.relationship_record",
|
||||||
|
"label": "고용·지휘감독·업무수행·점유·소유·공동관여 지위 자료",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "attribution_and_multiple_parties"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "e05.time_bar_record",
|
||||||
|
"label": "침해·손해발생·인지·권리행사 기준시점 자료",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "limitation_operands"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"defense_map": [
|
||||||
|
{
|
||||||
|
"defense_id": "e05.due_care_or_force_majeure",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"e05.op01"
|
||||||
|
],
|
||||||
|
"review_code": "E05_CONDUCT_OR_FAULT_CONFLICT_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defense_id": "e05.contributory_fault_or_mitigation",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"e05.op02"
|
||||||
|
],
|
||||||
|
"review_code": "E05_DAMAGE_ALLOCATION_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defense_id": "e05.causation_break",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"e05.op03"
|
||||||
|
],
|
||||||
|
"review_code": "E05_CAUSATION_OR_DAMAGE_CONFLICT_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defense_id": "e05.attribution_denial",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"e05.op04"
|
||||||
|
],
|
||||||
|
"review_code": "E05_ATTRIBUTION_RELATION_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defense_id": "e05.limitations",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"e05.op05"
|
||||||
|
],
|
||||||
|
"review_code": "E05_LIMITATION_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defense_id": "e05.justification_or_cap",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"e05.op06"
|
||||||
|
],
|
||||||
|
"review_code": "E05_JUSTIFICATION_OR_LIMIT_REVIEW"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"calculation_bindings": [
|
||||||
|
"CE-01",
|
||||||
|
"CE-03",
|
||||||
|
"CE-05"
|
||||||
|
],
|
||||||
|
"emits_signals": [
|
||||||
|
"SG-02",
|
||||||
|
"SG-03",
|
||||||
|
"SG-04",
|
||||||
|
"SG-05",
|
||||||
|
"SG-06",
|
||||||
|
"SG-07",
|
||||||
|
"SG-08",
|
||||||
|
"SG-09",
|
||||||
|
"SG-10",
|
||||||
|
"SG-11",
|
||||||
|
"SG-12",
|
||||||
|
"SG-13",
|
||||||
|
"domain_signal"
|
||||||
|
],
|
||||||
|
"bo_types": [
|
||||||
|
"event",
|
||||||
|
"state"
|
||||||
|
],
|
||||||
|
"structure_types": [
|
||||||
|
{
|
||||||
|
"type_id": "tort_liability",
|
||||||
|
"priority_rank": 20,
|
||||||
|
"module": "tort",
|
||||||
|
"role_projection": "tort_liability_roles"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_id": "joint_tort_liability",
|
||||||
|
"priority_rank": 21,
|
||||||
|
"module": "tort",
|
||||||
|
"role_projection": "joint_tort_roles"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_id": "vicarious_liability",
|
||||||
|
"priority_rank": 22,
|
||||||
|
"module": "tort",
|
||||||
|
"role_projection": "employer_employee_roles"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_id": "structure_liability",
|
||||||
|
"priority_rank": 23,
|
||||||
|
"module": "tort",
|
||||||
|
"role_projection": "possessor_owner_roles"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_id": "tort_damage_extent",
|
||||||
|
"priority_rank": 24,
|
||||||
|
"module": "damages",
|
||||||
|
"role_projection": "damage_causation_roles"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"effect_projection": {
|
||||||
|
"schema_ref": "Default_Agent/domains/E-05/effect_projection.schema.json",
|
||||||
|
"module": "tort",
|
||||||
|
"role_projection": "tort_liability_roles"
|
||||||
|
},
|
||||||
|
"gates": [
|
||||||
|
{
|
||||||
|
"gate_id": "E05-G01",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-05/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E05_REQUIRED_ELEMENT_GAP_REVIEW",
|
||||||
|
"E05_DAMAGE_SOURCE_GAP_REVIEW",
|
||||||
|
"E05_CAUSATION_SOURCE_GAP_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E05-G02",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-05/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E05_CONDUCT_OR_FAULT_CONFLICT_REVIEW",
|
||||||
|
"E05_CAUSATION_OR_DAMAGE_CONFLICT_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E05-G03",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-05/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E05_LIMITATION_INPUT_GAP_REVIEW",
|
||||||
|
"E05_LIMITATION_DATE_CONFLICT_REVIEW",
|
||||||
|
"E05_LIMITATION_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E05-G04",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-05/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"SPECIAL_LAW_PROFILE_REQUIRED_REVIEW",
|
||||||
|
"PUBLIC_LAW_NEXUS_REVIEW",
|
||||||
|
"TRACK_BOUNDARY_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E05-G05",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-05/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E05_CALCULATION_OPERAND_PARTIAL_REVIEW",
|
||||||
|
"E05_CALCULATION_OPERAND_BLOCKED_REVIEW",
|
||||||
|
"CALCULATION_PREEMPTION_BLOCKED"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E05-G06",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-05/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E05_MEETING_ONLY_SUPPORT_REVIEW",
|
||||||
|
"FINAL_LEGAL_CONCLUSION_BLOCKED"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"review_codes": [
|
||||||
|
"E05_REQUIRED_ELEMENT_GAP_REVIEW",
|
||||||
|
"E05_DAMAGE_SOURCE_GAP_REVIEW",
|
||||||
|
"E05_CAUSATION_SOURCE_GAP_REVIEW",
|
||||||
|
"E05_CONDUCT_OR_FAULT_CONFLICT_REVIEW",
|
||||||
|
"E05_CAUSATION_OR_DAMAGE_CONFLICT_REVIEW",
|
||||||
|
"E05_LIMITATION_INPUT_GAP_REVIEW",
|
||||||
|
"E05_LIMITATION_DATE_CONFLICT_REVIEW",
|
||||||
|
"E05_LIMITATION_REVIEW",
|
||||||
|
"E05_DAMAGE_ALLOCATION_REVIEW",
|
||||||
|
"E05_ATTRIBUTION_RELATION_REVIEW",
|
||||||
|
"E05_JUSTIFICATION_OR_LIMIT_REVIEW",
|
||||||
|
"E05_MEETING_ONLY_SUPPORT_REVIEW",
|
||||||
|
"E05_CALCULATION_OPERAND_PARTIAL_REVIEW",
|
||||||
|
"E05_CALCULATION_OPERAND_BLOCKED_REVIEW",
|
||||||
|
"SPECIAL_LAW_PROFILE_REQUIRED_REVIEW",
|
||||||
|
"PUBLIC_LAW_NEXUS_REVIEW",
|
||||||
|
"TRACK_BOUNDARY_REVIEW",
|
||||||
|
"CALCULATION_PREEMPTION_BLOCKED",
|
||||||
|
"FINAL_LEGAL_CONCLUSION_BLOCKED",
|
||||||
|
"UNROUTED_ISSUE_REVIEW"
|
||||||
|
],
|
||||||
|
"contract_guards": {
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"unknown_values_require_review": true,
|
||||||
|
"source_membership_required": true,
|
||||||
|
"strict_json_output": true,
|
||||||
|
"meeting_only_evidence_promotion_forbidden": true
|
||||||
|
},
|
||||||
|
"prompt_overlay_ref": "seed_prompt_overlay.md",
|
||||||
|
"profile_schema_ref": "Default_Agent/domains/E-05/profile.schema.json",
|
||||||
|
"extension_schema_ref": "domain_extension.schema.json"
|
||||||
|
}
|
||||||
+42
@@ -0,0 +1,42 @@
|
|||||||
|
# E-05 seed prompt overlay — 불법행위 일반
|
||||||
|
|
||||||
|
## 임무와 경계
|
||||||
|
|
||||||
|
이 overlay는 민법상 일반 불법행위의 공통 책임 골격을 증거기반 후보로 추출한다. 특정 사건명, 법률명 또는 “손해배상”이라는 표현만으로 활성화하지 않는다. 행위·부작위, 고의·과실, 침해이익·위법성, 손해와 인과관계의 자료 결합을 식별하고, 사용자책임·공작물책임·공동불법행위의 귀속 및 복수행위자 구조를 별도 후보로 보존한다.
|
||||||
|
|
||||||
|
`final_conclusion_forbidden=true`이다. Stage 1은 책임 성립, 과실비율, 손해배상액, 소멸시효 완성, 특별법 적용을 확정하지 않는다.
|
||||||
|
|
||||||
|
## 라우팅 — fail-open 3-tier
|
||||||
|
|
||||||
|
1. **active**: 서로 다른 증거구성요소가 특정 행위·귀책과 손해·인과관계 후보를 함께 지지하고, source ID가 slice에 속하면 worker 후보를 활성화한다.
|
||||||
|
2. **monitor**: meeting-only, 사건명·법률명 단독, 또는 event candidate만 있어 직접 증거가 없으면 후보를 버리지 않고 monitor와 review를 발행한다. meeting clause를 documentary evidence로 승격하지 않는다.
|
||||||
|
3. **active_with_review**: 핵심 원천이 누락되거나 행위·귀책·인과·손해·기간 자료가 충돌해도 active 후보를 강등·삭제하지 않고 hard review를 붙인다. 어떤 leaf에도 충분히 배정되지 않는 자료는 E-00과 `UNROUTED_ISSUE_REVIEW`에 연결한다.
|
||||||
|
|
||||||
|
negative cue는 confidence downrank 또는 review만 허용한다. 이미 존재하는 positive evidence candidate를 삭제하지 않는다.
|
||||||
|
|
||||||
|
## 추출 순서
|
||||||
|
|
||||||
|
1. 행위자별 행위·부작위의 시점·장소·방법과 근거 source ID를 분리한다.
|
||||||
|
2. 당시의 주의기준, 예견가능성, 회피가능성, 고의·과실 후보와 반대자료를 함께 기록한다.
|
||||||
|
3. 침해된 이익과 위법성 판단의 기초사실을 기록하되 위법성을 확정하지 않는다.
|
||||||
|
4. 재산·신체·정신 손해를 항목별로 분리하고, 발생시점·기전·범위·증거등급을 보존한다.
|
||||||
|
5. 각 행위와 각 손해 사이의 시간적·사실적·규범적 인과관계 후보 및 대체 원인을 병렬 보존한다.
|
||||||
|
6. 피용자·사용자, 공작물 점유자·소유자, 공동가공·교사·방조 관계를 별도 구조로 만들고 행위자별 source를 섞지 않는다.
|
||||||
|
7. 피해자 과실, 손해확대 방지, 손익상계, 기왕증, 정당행위, 책임제한, 시효 자료를 opposing fact·defense candidate로 보존한다.
|
||||||
|
8. 침해일·손해발생일·손해와 가해자 인지일·권리행사일을 사실 후보로만 수집하고 SG-04·SG-06 및 CE-03에 전달한다.
|
||||||
|
|
||||||
|
## 전문사건·특별법 profile 경계
|
||||||
|
|
||||||
|
자동차, 산업재해, 국가배상, 의료, 제조물, 건설, 지식재산, 언론·인격권 또는 운송·해상 단서가 있으면 E-05의 공통 골격은 유지하되 해당 특별법 profile 또는 전문 leaf를 `profile_candidates`와 `SPECIAL_LAW_PROFILE_REQUIRED_REVIEW`로 요청한다. 이 overlay가 profile의 적용요건·면책·한도·특칙을 대신 생성하거나 적용을 확정해서는 안 된다. 공법 접점에는 `PUBLIC_LAW_NEXUS_REVIEW`, 가사·행정 등 제외 트랙 경계에는 `TRACK_BOUNDARY_REVIEW`를 발행한다.
|
||||||
|
|
||||||
|
## 계산 경계
|
||||||
|
|
||||||
|
CE-01·CE-03·CE-05에는 계산값이나 산식을 보내지 않고 operand와 `ready|partial|blocked` 상태, source refs, law-version 필요 여부만 보낸다. 법정률·기간·한도·호프만 계수·책임비율을 프롬프트에 상수로 두거나 추정하지 않는다. 결과를 바꾸는 operand가 빠지면 단일 금액을 만들지 말고 scenario 또는 BLOCKED review를 유지한다.
|
||||||
|
|
||||||
|
## 출력 계약
|
||||||
|
|
||||||
|
- canonical root는 `stage_b_domain_bo_seed_output`, schema는 `task_c_bo_stage_b_domain_bo_seed.v3`이다.
|
||||||
|
- slice에 없는 source ID를 만들지 않는다. meeting-only 값의 `evidence_refs`는 비워 둔다.
|
||||||
|
- `element_fact_candidates`, `opposing_fact_candidates`, `defense_trigger_candidates`, `calculation_requests`, `dependency_refs`, `domain_review_queue`를 sparse emit한다.
|
||||||
|
- E-05 고유 자료는 `extensions.domain_payload.payload`에만 두고 `E-05.domain_extension.v1`을 따른다.
|
||||||
|
- 최종 BO ID, 최종 청구권, 책임 인정·부정, 최종 과실비율·손해액, 소장 문구를 작성하지 않는다.
|
||||||
+1
File diff suppressed because one or more lines are too long
+49
@@ -0,0 +1,49 @@
|
|||||||
|
# E-06 seed prompt overlay — 전문가·제조물 책임
|
||||||
|
|
||||||
|
## 임무와 법리 경계
|
||||||
|
|
||||||
|
이 overlay의 범위는 의료과실·의료 설명의무, 변호사·회계사·건축사 등 전문직 주의의무, 제조물의 제조·설계·표시상 결함과 손해·인과관계이다. 일반 불법행위 골격은 E-05와 조립하며, 제조물 사건은 SLP-PRODUCT-LIABILITY 없이 종결하지 않는다. 단순 품질하자·하자보수는 계약형 leaf와 구별한다.
|
||||||
|
|
||||||
|
`final_conclusion_forbidden=true`이다. Stage 1은 청구권 성립, 무효·취소·책임·소지인 자격, 분할방법, 손해액, 기간 도과 또는 특별법 적용의 최종 결론을 내리지 않는다. 판례는 추출 질문과 쟁점 구조를 만드는 통제자료이고 사건별 결론을 복제하는 routing 규칙이 아니다.
|
||||||
|
|
||||||
|
## Part 1 라우팅 — fail-open 3-tier
|
||||||
|
|
||||||
|
1. **active**: 독립된 evidence source가 두 개 이상의 핵심 증거구성요소를 지지하고 source membership을 통과한다.
|
||||||
|
2. **monitor**: meeting-only, event candidate-only 또는 사건명·평가어·법률명만 있는 경우 후보를 보존하되 증거로 승격하지 않는다.
|
||||||
|
3. **active_with_review**: positive source가 있으나 필수 원천이 누락되거나 서로 충돌하면 후보를 삭제하지 않고 hard review와 함께 실행한다.
|
||||||
|
|
||||||
|
negative cue는 confidence 강등 또는 monitor 전환 근거일 뿐 이미 확인된 positive evidence를 삭제하지 않는다. 사건명·청구명·당사자명·과거 fixture 문구를 runtime lookup key로 쓰지 않는다. 어느 leaf에도 닫히지 않는 중요한 사실은 E-00의 `UNROUTED_ISSUE_REVIEW`로 가시화한다.
|
||||||
|
|
||||||
|
## 증거기반 추출 순서
|
||||||
|
|
||||||
|
1. 전문가·의료기관·제조업자 등 책임주체와 업무·제품 관계을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
2. 수임·진료·자문 범위와 당시 전문수준·주의기준 후보을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
3. 구체적 작위·부작위와 주의의무 위반 후보을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
4. 업무·의료·제품 사용 전후 상태와 손해 항목·발생시점을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
5. 위반·결함과 손해의 개연성·인과관계 및 대체원인을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
6. 질환·방법·필요성·위험·대안·설명 시점·동의 후보을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
7. 환자의 선택 가능성·시간적 여유·응급 등 예외 후보을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
8. 제조물 특정·제조업자·공급·유통·사용·보존 계보을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
9. 제조·설계·표시상 결함과 정상 사용·대체설계·경고 후보을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
10. 행위·유통·손해·인지·청구 시점과 적용법 version 후보을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
|
||||||
|
모든 후보는 `source_refs`, `negative_or_conflicting_refs`, `status`, 관련 slot을 갖는다. meeting clause만 있는 후보의 documentary `evidence_refs`는 비워 두며 `proof_grade=client_statement` 경계를 보존한다. 원천에 없는 당사자·일자·금액·법률행위를 추정하지 않는다.
|
||||||
|
|
||||||
|
## 특별법·전문 profile
|
||||||
|
|
||||||
|
제조물 단서가 있으면 canonical `SLP-PRODUCT-LIABILITY`를 profile candidate로 요구하고, profile 없이 제조물책임 분석을 종결하지 않는다. 의료·그 밖의 전문가 사건에는 이 profile을 기계적으로 부착하지 않는다. 공법 접점에는 `PUBLIC_LAW_NEXUS_REVIEW`, 가사·행정·보전신청 등 범위 경계에는 `TRACK_BOUNDARY_REVIEW`를 발행한다.
|
||||||
|
|
||||||
|
## 계산·법령 version 경계
|
||||||
|
|
||||||
|
CE-03, CE-05에는 계산값이나 법적 기준의 최종 선택을 보내지 않는다. operand, source refs, `ready|partial|blocked`, unresolved legal input, 필요한 law-version 후보만 SG-04·SG-11로 전달한다. 법정률·기간·한도·정족수·산식·반올림 수치를 이 prompt나 Python에 상수로 두지 않는다. 결과를 바꾸는 operand가 없으면 단일값 대신 scenario 또는 `BLOCKED`를 보존한다. Stage 2만 최종 계산·청구금액을 확정한다.
|
||||||
|
|
||||||
|
## Part 3·Part 4·Stage 2 closure
|
||||||
|
|
||||||
|
- canonical root: `stage_b_domain_bo_seed_output`
|
||||||
|
- schema: `task_c_bo_stage_b_domain_bo_seed.v3`
|
||||||
|
- BO type: `event|state`; 등록된 structure type만 사용
|
||||||
|
- Part 4는 `effect_projection.schema.json`, `module_role_projection.json`, `gates.json`으로 투영하고 미등록 효과의 침묵 fallback을 금지한다.
|
||||||
|
- Stage 2 handoff에는 요소·반대사실·방어·source provenance·evidence slot·calculation state·미해결 review를 보존한다.
|
||||||
|
- 출력은 strict JSON이며 complaint prose와 최종 법률결론을 생성하지 않는다.
|
||||||
|
|
||||||
|
최종 법률결론과 최종 청구액을 확정하지 않는다. 원천 참조와 미해결 review code를 보존한다.
|
||||||
+530
@@ -0,0 +1,530 @@
|
|||||||
|
{
|
||||||
|
"schema_version": "stage1_domain_config.v1",
|
||||||
|
"domain_id": "E-07",
|
||||||
|
"label_ko": "도급·건설·하자",
|
||||||
|
"slug": "construction_defect",
|
||||||
|
"kind": "leaf",
|
||||||
|
"status": "active",
|
||||||
|
"execution_policy": {
|
||||||
|
"runnable": true,
|
||||||
|
"always_on": false,
|
||||||
|
"model_tier": "pro",
|
||||||
|
"output_mode": "strict_json",
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"max_instances": 3
|
||||||
|
},
|
||||||
|
"depends_on": [
|
||||||
|
"EC-00",
|
||||||
|
"E-01"
|
||||||
|
],
|
||||||
|
"special_law_profiles": [],
|
||||||
|
"activation_cues": {
|
||||||
|
"positive_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E07-P01",
|
||||||
|
"cue_type": "evidence_component",
|
||||||
|
"match_value": "도급계약서·공사계약서·발주서에서 일의 완성, 공사범위, 보수 또는 지급조건이 함께 확인됨",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "사건명·파일명이 아닌 증거 구성요소 결합으로 판정",
|
||||||
|
"strength": "strong",
|
||||||
|
"weight": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E07-P02",
|
||||||
|
"cue_type": "evidence_component",
|
||||||
|
"match_value": "기성검사·공정표·작업일보·준공 또는 인수 자료와 공사대금 청구·지급 자료가 연결됨",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "사건명·파일명이 아닌 증거 구성요소 결합으로 판정",
|
||||||
|
"strength": "strong",
|
||||||
|
"weight": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E07-P03",
|
||||||
|
"cue_type": "evidence_component",
|
||||||
|
"match_value": "하자 항목·발생 부위·보수 요구·보수 방법 또는 비용 자료가 목적물과 연결됨",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "사건명·파일명이 아닌 증거 구성요소 결합으로 판정",
|
||||||
|
"strength": "support",
|
||||||
|
"weight": 0.7
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"negative_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E07-N01",
|
||||||
|
"cue_type": "legal_relation",
|
||||||
|
"match_value": "일의 완성 의무 없이 물품 매매·공급대금 자료만 존재하여 E-02 검토가 중심임",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "후보를 삭제하지 않고 monitor 또는 인접 도메인 overlap review",
|
||||||
|
"effect": "monitor_review",
|
||||||
|
"weight": 0.7
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E07-N02",
|
||||||
|
"cue_type": "legal_relation",
|
||||||
|
"match_value": "소유권 이전 또는 등기 원인만 다투고 공사 이행·하자 사실은 존재하지 않아 E-09가 중심임",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "후보를 삭제하지 않고 monitor 또는 인접 도메인 overlap review",
|
||||||
|
"effect": "monitor_review",
|
||||||
|
"weight": 0.7
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E07-N03",
|
||||||
|
"cue_type": "legal_relation",
|
||||||
|
"match_value": "점유·인도·철거 사실만 다투고 도급상 보수·하자 관계가 없어 E-11이 중심임",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "후보를 삭제하지 않고 monitor 또는 인접 도메인 overlap review",
|
||||||
|
"effect": "monitor_review",
|
||||||
|
"weight": 0.7
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"conflict_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E07-C01",
|
||||||
|
"rule": "계약서·견적서·변경지시·정산서 사이 공사범위, 공사대금 또는 추가공사 승인 여부가 불일치",
|
||||||
|
"left_refs": [],
|
||||||
|
"right_refs": [],
|
||||||
|
"effect": "hard_review",
|
||||||
|
"review_code": "E07_SCOPE_AMOUNT_CONFLICT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E07-C02",
|
||||||
|
"rule": "작업일보·기성검사·준공·인수 자료 사이 공정률, 완성 또는 인도 시점이 불일치",
|
||||||
|
"left_refs": [],
|
||||||
|
"right_refs": [],
|
||||||
|
"effect": "hard_review",
|
||||||
|
"review_code": "E07_PROGRESS_COMPLETION_CONFLICT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E07-C03",
|
||||||
|
"rule": "하자 감정·현장사진·보수견적·당사자 진술 사이 하자 존재, 원인, 중요성, 보수방법 또는 비용이 불일치",
|
||||||
|
"left_refs": [],
|
||||||
|
"right_refs": [],
|
||||||
|
"effect": "hard_review",
|
||||||
|
"review_code": "E07_DEFECT_CAUSATION_COST_CONFLICT"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"routing_policy": {
|
||||||
|
"fail_open": true,
|
||||||
|
"candidate_downgrade_forbidden": true,
|
||||||
|
"minimum_primary_evidence": 1,
|
||||||
|
"leaf_activation_threshold": 1.0,
|
||||||
|
"monitor_threshold": 0.5,
|
||||||
|
"unknown_review_code": "UNROUTED_ISSUE_REVIEW"
|
||||||
|
},
|
||||||
|
"element_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "construction_defect.el01",
|
||||||
|
"label": "도급계약 성립·당사자·수급인 지위",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E07_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "construction_defect.el02",
|
||||||
|
"label": "약정 공사범위·설계·사양·보수·지급조건",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E07_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "construction_defect.el03",
|
||||||
|
"label": "공정 진행·기성·완성·인도·검사",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E07_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "construction_defect.el04",
|
||||||
|
"label": "추가·변경·중단 공사의 지시·승인·가격합의",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E07_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "construction_defect.el05",
|
||||||
|
"label": "하자의 항목·부위·원인·중요성·보수 가능성",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E07_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "construction_defect.el06",
|
||||||
|
"label": "보수 요구·상당기간·보수 결과·손해 항목",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E07_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "construction_defect.el07",
|
||||||
|
"label": "공사대금 지급·선급금·공제·정산·상계 주장",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E07_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"opposing_fact_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "construction_defect.op01",
|
||||||
|
"label": "변제·선급금·기성금·정산합의",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "construction_defect.op02",
|
||||||
|
"label": "추가공사 승인 부존재·약정 범위 포함 주장",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "construction_defect.op03",
|
||||||
|
"label": "하자 부존재·도급인 제공재료·지시·사용상 과실 주장",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "construction_defect.op04",
|
||||||
|
"label": "하자보수비·지체상금·손해배상 상계",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "construction_defect.op05",
|
||||||
|
"label": "소멸시효·제척기간·면책 또는 책임제한 주장",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"evidence_components": [
|
||||||
|
{
|
||||||
|
"component_id": "construction_defect.ev01",
|
||||||
|
"label": "도급계약서·공사계약서·설계도서·시방서·견적서",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "element_or_opposing_fact_support"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "construction_defect.ev02",
|
||||||
|
"label": "발주서·변경지시서·추가공사 합의·회의록",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "element_or_opposing_fact_support"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "construction_defect.ev03",
|
||||||
|
"label": "공정표·작업일보·기성검사서·준공검사·인수증",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "element_or_opposing_fact_support"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "construction_defect.ev04",
|
||||||
|
"label": "세금계산서·기성청구서·계좌거래·정산서",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "element_or_opposing_fact_support"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "construction_defect.ev05",
|
||||||
|
"label": "하자목록·현장사진·감정서·보수견적·보수이력",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "element_or_opposing_fact_support"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "construction_defect.ev06",
|
||||||
|
"label": "하자보수 요구·최고·도달 및 대응 자료",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "element_or_opposing_fact_support"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"defense_map": [
|
||||||
|
{
|
||||||
|
"defense_id": "construction_defect.defense01",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"construction_defect.op01"
|
||||||
|
],
|
||||||
|
"review_code": "E07_SCOPE_AMOUNT_CONFLICT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defense_id": "construction_defect.defense02",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"construction_defect.op02"
|
||||||
|
],
|
||||||
|
"review_code": "E07_ADDITIONAL_WORK_AUTHORIZATION_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defense_id": "construction_defect.defense03",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"construction_defect.op03"
|
||||||
|
],
|
||||||
|
"review_code": "E07_DEFECT_CAUSATION_COST_CONFLICT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defense_id": "construction_defect.defense04",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"construction_defect.op04"
|
||||||
|
],
|
||||||
|
"review_code": "E07_DEFECT_CAUSATION_COST_CONFLICT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defense_id": "construction_defect.defense05",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"construction_defect.op05"
|
||||||
|
],
|
||||||
|
"review_code": "E07_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"calculation_bindings": [
|
||||||
|
"CE-01",
|
||||||
|
"CE-06"
|
||||||
|
],
|
||||||
|
"emits_signals": [
|
||||||
|
"SG-01",
|
||||||
|
"SG-02",
|
||||||
|
"SG-03",
|
||||||
|
"SG-04",
|
||||||
|
"SG-05",
|
||||||
|
"SG-06",
|
||||||
|
"SG-08",
|
||||||
|
"SG-09",
|
||||||
|
"SG-10",
|
||||||
|
"SG-11",
|
||||||
|
"SG-13",
|
||||||
|
"domain_signal"
|
||||||
|
],
|
||||||
|
"bo_types": [
|
||||||
|
"event",
|
||||||
|
"state",
|
||||||
|
"communication",
|
||||||
|
"calculation_request"
|
||||||
|
],
|
||||||
|
"structure_types": [
|
||||||
|
{
|
||||||
|
"type_id": "construction_payment_claim",
|
||||||
|
"priority_rank": 1,
|
||||||
|
"module": "construction_contract",
|
||||||
|
"role_projection": "construction_payment_roles"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_id": "construction_progress_settlement",
|
||||||
|
"priority_rank": 2,
|
||||||
|
"module": "construction_contract",
|
||||||
|
"role_projection": "construction_progress_roles"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_id": "construction_defect_remedy",
|
||||||
|
"priority_rank": 3,
|
||||||
|
"module": "construction_defect",
|
||||||
|
"role_projection": "construction_defect_roles"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_id": "construction_defect_setoff",
|
||||||
|
"priority_rank": 4,
|
||||||
|
"module": "construction_defect",
|
||||||
|
"role_projection": "construction_setoff_roles"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_id": "general_legal_effect",
|
||||||
|
"priority_rank": 11,
|
||||||
|
"module": "legal_effect",
|
||||||
|
"role_projection": "legal_effect_roles"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"effect_projection": {
|
||||||
|
"schema_ref": "Default_Agent/domains/E-07/effect_projection.schema.json",
|
||||||
|
"module": "construction_contract",
|
||||||
|
"role_projection": "construction_payment_roles"
|
||||||
|
},
|
||||||
|
"gates": [
|
||||||
|
{
|
||||||
|
"gate_id": "E07-G01",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-07/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E07_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E07-G02",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-07/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E07_SCOPE_AMOUNT_CONFLICT"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E07-G03",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-07/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E07_PROGRESS_COMPLETION_CONFLICT"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E07-G04",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-07/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E07_DEFECT_CAUSATION_COST_CONFLICT"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E07-G05",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-07/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E07_ADDITIONAL_WORK_AUTHORIZATION_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E07-G06",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-07/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E07_BOUNDARY_OVERLAP_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E07-G07",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-07/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E07_MEETING_ONLY_MONITOR_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E07-G08",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-07/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E07_SPECIAL_LAW_PROFILE_REQUIRED_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E07-G09",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-07/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E07_CALCULATION_PARTIAL_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E07-G10",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-07/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E07_SOURCE_MEMBERSHIP_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E07-G11",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-07/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"CALCULATION_PREEMPTION_BLOCKED"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"review_codes": [
|
||||||
|
"E07_REQUIRED_ELEMENT_GAP_REVIEW",
|
||||||
|
"E07_SCOPE_AMOUNT_CONFLICT",
|
||||||
|
"E07_PROGRESS_COMPLETION_CONFLICT",
|
||||||
|
"E07_DEFECT_CAUSATION_COST_CONFLICT",
|
||||||
|
"E07_ADDITIONAL_WORK_AUTHORIZATION_REVIEW",
|
||||||
|
"E07_BOUNDARY_OVERLAP_REVIEW",
|
||||||
|
"E07_MEETING_ONLY_MONITOR_REVIEW",
|
||||||
|
"E07_SPECIAL_LAW_PROFILE_REQUIRED_REVIEW",
|
||||||
|
"E07_CALCULATION_PARTIAL_REVIEW",
|
||||||
|
"E07_SOURCE_MEMBERSHIP_REVIEW",
|
||||||
|
"CALCULATION_PREEMPTION_BLOCKED"
|
||||||
|
],
|
||||||
|
"contract_guards": {
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"unknown_values_require_review": true,
|
||||||
|
"source_membership_required": true,
|
||||||
|
"strict_json_output": true,
|
||||||
|
"meeting_only_evidence_promotion_forbidden": true
|
||||||
|
},
|
||||||
|
"prompt_overlay_ref": "seed_prompt_overlay.md",
|
||||||
|
"profile_schema_ref": "profile_schema.json",
|
||||||
|
"extension_schema_ref": "domain_extension.schema.json"
|
||||||
|
}
|
||||||
+55
@@ -0,0 +1,55 @@
|
|||||||
|
# E-07 도급·건설·하자 — Stage 1 leaf overlay
|
||||||
|
|
||||||
|
## 임무와 금지
|
||||||
|
|
||||||
|
선택된 source universe 안에서 도급·건설·하자 법률효과의 **후보 사실**만 구조화한다. 최종 청구권·승패·법적 결론을 확정하지 않는다. source membership 없는 사실을 생성하지 않으며, 상담문서만 있는 진술은 `meeting_only`로 남겨 active의 유일한 근거로 승격하지 않는다.
|
||||||
|
|
||||||
|
## SG-01 3-tier fail-open routing
|
||||||
|
|
||||||
|
- `active`: strong positive cue가 evidence 또는 event_candidate에 연결되고 필수 source가 존재한다.
|
||||||
|
- `active_with_review`: positive cue는 있으나 필수 source 누락, 충돌, 계산 partial/blocked 또는 인접 도메인 overlap이 있다. 후보를 삭제하지 않는다.
|
||||||
|
- `monitor`: meeting-only 또는 support/negative cue만 있다. 추가 증거와 인접 도메인을 요청한다.
|
||||||
|
- `not_active`: positive cue가 없고 명시적인 negative cue만 있다. 미분류 중요 이슈는 E-00/`UNROUTED_ISSUE_REVIEW`로 보존한다.
|
||||||
|
|
||||||
|
### positive evidence-component cues
|
||||||
|
- `E07-P01`: 도급계약서·공사계약서·발주서에서 일의 완성, 공사범위, 보수 또는 지급조건이 함께 확인됨
|
||||||
|
- `E07-P02`: 기성검사·공정표·작업일보·준공 또는 인수 자료와 공사대금 청구·지급 자료가 연결됨
|
||||||
|
- `E07-P03`: 하자 항목·발생 부위·보수 요구·보수 방법 또는 비용 자료가 목적물과 연결됨
|
||||||
|
|
||||||
|
### negative/boundary cues
|
||||||
|
- `E07-N01`: 일의 완성 의무 없이 물품 매매·공급대금 자료만 존재하여 E-02 검토가 중심임
|
||||||
|
- `E07-N02`: 소유권 이전 또는 등기 원인만 다투고 공사 이행·하자 사실은 존재하지 않아 E-09가 중심임
|
||||||
|
- `E07-N03`: 점유·인도·철거 사실만 다투고 도급상 보수·하자 관계가 없어 E-11이 중심임
|
||||||
|
|
||||||
|
### conflict cues
|
||||||
|
- `E07-C01` / `E07_SCOPE_AMOUNT_CONFLICT`: 계약서·견적서·변경지시·정산서 사이 공사범위, 공사대금 또는 추가공사 승인 여부가 불일치
|
||||||
|
- `E07-C02` / `E07_PROGRESS_COMPLETION_CONFLICT`: 작업일보·기성검사·준공·인수 자료 사이 공정률, 완성 또는 인도 시점이 불일치
|
||||||
|
- `E07-C03` / `E07_DEFECT_CAUSATION_COST_CONFLICT`: 하자 감정·현장사진·보수견적·당사자 진술 사이 하자 존재, 원인, 중요성, 보수방법 또는 비용이 불일치
|
||||||
|
|
||||||
|
## 요소사실 후보 슬롯
|
||||||
|
- `construction_defect.el01`: 도급계약 성립·당사자·수급인 지위
|
||||||
|
- `construction_defect.el02`: 약정 공사범위·설계·사양·보수·지급조건
|
||||||
|
- `construction_defect.el03`: 공정 진행·기성·완성·인도·검사
|
||||||
|
- `construction_defect.el04`: 추가·변경·중단 공사의 지시·승인·가격합의
|
||||||
|
- `construction_defect.el05`: 하자의 항목·부위·원인·중요성·보수 가능성
|
||||||
|
- `construction_defect.el06`: 보수 요구·상당기간·보수 결과·손해 항목
|
||||||
|
- `construction_defect.el07`: 공사대금 지급·선급금·공제·정산·상계 주장
|
||||||
|
|
||||||
|
## 반대사실·항변 후보 슬롯
|
||||||
|
- `construction_defect.op01`: 변제·선급금·기성금·정산합의
|
||||||
|
- `construction_defect.op02`: 추가공사 승인 부존재·약정 범위 포함 주장
|
||||||
|
- `construction_defect.op03`: 하자 부존재·도급인 제공재료·지시·사용상 과실 주장
|
||||||
|
- `construction_defect.op04`: 하자보수비·지체상금·손해배상 상계
|
||||||
|
- `construction_defect.op05`: 소멸시효·제척기간·면책 또는 책임제한 주장
|
||||||
|
|
||||||
|
## 인접 도메인 경계
|
||||||
|
|
||||||
|
`E-02, E-05, E-09, E-11`와 중첩 가능하다. 복합사건에서는 한 도메인으로 흡수하지 말고 동일 source를 각 slice에 provenance와 함께 투영한다. 도급상 건설 손해라면 E-05 병행 후보를 보존하고, 임대차 종료 후 인도·사용이익이면 E-11/E-04 병행 후보를 보존한다.
|
||||||
|
|
||||||
|
## 계산·법령 버전
|
||||||
|
|
||||||
|
계산 binding은 `CE-01, CE-06`이다. 이 팩은 operand 후보와 `ready|partial|blocked`만 출력한다. 산식·이율·한도·법정 수치를 하드코딩하지 않으며 S4 calculator 결과를 가장하지 않는다. 특별법 후보는 `profile_schema.json`에 따라 review만 생성하고, SG-04가 사건 기준일의 법률 버전을 고정하기 전에는 적용 결론을 내리지 않는다.
|
||||||
|
|
||||||
|
## 출력
|
||||||
|
|
||||||
|
공통 seed v3와 `domain_extension.schema.json`, `domain_signal_extension.schema.json`을 엄격히 따른다. 모든 candidate와 review에는 source refs를 붙이고, 서로 모순되는 자료는 어느 한쪽을 제거하지 않는다. Part 3 structure type 및 Part 4 effect projection 후보를 함께 전달한다.
|
||||||
+536
@@ -0,0 +1,536 @@
|
|||||||
|
{
|
||||||
|
"schema_version": "stage1_domain_config.v1",
|
||||||
|
"domain_id": "E-08",
|
||||||
|
"label_ko": "임대차·보증금",
|
||||||
|
"slug": "lease_deposit",
|
||||||
|
"kind": "leaf",
|
||||||
|
"status": "active",
|
||||||
|
"execution_policy": {
|
||||||
|
"runnable": true,
|
||||||
|
"always_on": false,
|
||||||
|
"model_tier": "pro",
|
||||||
|
"output_mode": "strict_json",
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"max_instances": 3
|
||||||
|
},
|
||||||
|
"depends_on": [
|
||||||
|
"EC-00",
|
||||||
|
"E-01"
|
||||||
|
],
|
||||||
|
"special_law_profiles": [],
|
||||||
|
"activation_cues": {
|
||||||
|
"positive_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E08-P01",
|
||||||
|
"cue_type": "evidence_component",
|
||||||
|
"match_value": "임대차계약서에서 목적물, 사용·수익, 임대인·임차인, 보증금·차임 또는 기간이 연결됨",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "사건명·파일명이 아닌 증거 구성요소 결합으로 판정",
|
||||||
|
"strength": "strong",
|
||||||
|
"weight": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E08-P02",
|
||||||
|
"cue_type": "evidence_component",
|
||||||
|
"match_value": "보증금 지급 자료와 기간 만료·해지·해제·갱신 또는 반환 요구·도달 자료가 연결됨",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "사건명·파일명이 아닌 증거 구성요소 결합으로 판정",
|
||||||
|
"strength": "strong",
|
||||||
|
"weight": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E08-P03",
|
||||||
|
"cue_type": "evidence_component",
|
||||||
|
"match_value": "목적물 인도·점유·열쇠 반환·퇴거와 연체차임·관리비·원상회복 공제 자료가 연결됨",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "사건명·파일명이 아닌 증거 구성요소 결합으로 판정",
|
||||||
|
"strength": "support",
|
||||||
|
"weight": 0.7
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"negative_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E08-N01",
|
||||||
|
"cue_type": "legal_relation",
|
||||||
|
"match_value": "사용·수익 약정 없이 금전 교부와 반환 약정만 있어 E-02 검토가 중심임",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "후보를 삭제하지 않고 monitor 또는 인접 도메인 overlap review",
|
||||||
|
"effect": "monitor_review",
|
||||||
|
"weight": 0.7
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E08-N02",
|
||||||
|
"cue_type": "legal_relation",
|
||||||
|
"match_value": "임대차 관계 없이 사용이익 반환만 다투어 E-04 검토가 중심임",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "후보를 삭제하지 않고 monitor 또는 인접 도메인 overlap review",
|
||||||
|
"effect": "monitor_review",
|
||||||
|
"weight": 0.7
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E08-N03",
|
||||||
|
"cue_type": "legal_relation",
|
||||||
|
"match_value": "보증금·차임·종료 관계 없이 소유권에 기한 인도·퇴거만 다투어 E-11 검토가 중심임",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "후보를 삭제하지 않고 monitor 또는 인접 도메인 overlap review",
|
||||||
|
"effect": "monitor_review",
|
||||||
|
"weight": 0.7
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"conflict_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E08-C01",
|
||||||
|
"rule": "계약서·갱신자료·통지자료 사이 임대차 기간, 갱신, 종료 원인 또는 도달 시점이 불일치",
|
||||||
|
"left_refs": [],
|
||||||
|
"right_refs": [],
|
||||||
|
"effect": "hard_review",
|
||||||
|
"review_code": "E08_TERM_RENEWAL_CONFLICT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E08-C02",
|
||||||
|
"rule": "보증금 지급·차임·관리비·원상회복 견적·정산서 사이 반환액 또는 공제액이 불일치",
|
||||||
|
"left_refs": [],
|
||||||
|
"right_refs": [],
|
||||||
|
"effect": "hard_review",
|
||||||
|
"review_code": "E08_DEPOSIT_DEDUCTION_CONFLICT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E08-C03",
|
||||||
|
"rule": "인도확인·점유자료·열쇠반환·전출 또는 영업종료 자료 사이 목적물 반환 시점이 불일치",
|
||||||
|
"left_refs": [],
|
||||||
|
"right_refs": [],
|
||||||
|
"effect": "hard_review",
|
||||||
|
"review_code": "E08_POSSESSION_DELIVERY_CONFLICT"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"routing_policy": {
|
||||||
|
"fail_open": true,
|
||||||
|
"candidate_downgrade_forbidden": true,
|
||||||
|
"minimum_primary_evidence": 1,
|
||||||
|
"leaf_activation_threshold": 1.0,
|
||||||
|
"monitor_threshold": 0.5,
|
||||||
|
"unknown_review_code": "UNROUTED_ISSUE_REVIEW"
|
||||||
|
},
|
||||||
|
"element_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "lease_deposit.el01",
|
||||||
|
"label": "임대차 성립·당사자·목적물 특정",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E08_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "lease_deposit.el02",
|
||||||
|
"label": "보증금·차임·관리비 약정과 지급",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E08_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "lease_deposit.el03",
|
||||||
|
"label": "기간·갱신·묵시 갱신·해지·해제·종료",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E08_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "lease_deposit.el04",
|
||||||
|
"label": "목적물 인도·점유·사용수익·반환 제공",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E08_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "lease_deposit.el05",
|
||||||
|
"label": "연체차임·관리비·원상회복·손해 공제 항목",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E08_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "lease_deposit.el06",
|
||||||
|
"label": "보증금 반환 요구·이행기·동시이행 관계",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E08_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "lease_deposit.el07",
|
||||||
|
"label": "임대인 지위 승계·권리변동 및 자산 동일성",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E08_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"opposing_fact_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "lease_deposit.op01",
|
||||||
|
"label": "연체차임·관리비·공과금 공제",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "lease_deposit.op02",
|
||||||
|
"label": "훼손·원상회복비·손해배상 공제",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "lease_deposit.op03",
|
||||||
|
"label": "임대차 갱신·기간 미종료 주장",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "lease_deposit.op04",
|
||||||
|
"label": "목적물 미반환·동시이행·지체책임 부정 주장",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "lease_deposit.op05",
|
||||||
|
"label": "임대인 지위·대항력·우선변제·특별법 적용 부정 주장",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"evidence_components": [
|
||||||
|
{
|
||||||
|
"component_id": "lease_deposit.ev01",
|
||||||
|
"label": "임대차계약서·갱신계약·특약·목적물 표시 자료",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "element_or_opposing_fact_support"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "lease_deposit.ev02",
|
||||||
|
"label": "보증금·차임·관리비 계좌거래·영수증·정산서",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "element_or_opposing_fact_support"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "lease_deposit.ev03",
|
||||||
|
"label": "해지·갱신거절·반환 요구 통지와 도달 자료",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "element_or_opposing_fact_support"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "lease_deposit.ev04",
|
||||||
|
"label": "인도확인서·열쇠반환·점유·전입·사업자등록 관련 자료",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "element_or_opposing_fact_support"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "lease_deposit.ev05",
|
||||||
|
"label": "원상회복 목록·현장사진·견적·수리비·관리비 자료",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "element_or_opposing_fact_support"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "lease_deposit.ev06",
|
||||||
|
"label": "등기·소유권 변동·임대인 지위 승계 관련 자료",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "element_or_opposing_fact_support"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"defense_map": [
|
||||||
|
{
|
||||||
|
"defense_id": "lease_deposit.defense01",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"lease_deposit.op01"
|
||||||
|
],
|
||||||
|
"review_code": "E08_DEPOSIT_DEDUCTION_CONFLICT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defense_id": "lease_deposit.defense02",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"lease_deposit.op02"
|
||||||
|
],
|
||||||
|
"review_code": "E08_DEPOSIT_DEDUCTION_CONFLICT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defense_id": "lease_deposit.defense03",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"lease_deposit.op03"
|
||||||
|
],
|
||||||
|
"review_code": "E08_TERM_RENEWAL_CONFLICT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defense_id": "lease_deposit.defense04",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"lease_deposit.op04"
|
||||||
|
],
|
||||||
|
"review_code": "E08_CONCURRENT_PERFORMANCE_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defense_id": "lease_deposit.defense05",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"lease_deposit.op05"
|
||||||
|
],
|
||||||
|
"review_code": "E08_SPECIAL_LAW_PROFILE_REQUIRED_REVIEW"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"calculation_bindings": [
|
||||||
|
"CE-01",
|
||||||
|
"CE-07"
|
||||||
|
],
|
||||||
|
"emits_signals": [
|
||||||
|
"SG-01",
|
||||||
|
"SG-02",
|
||||||
|
"SG-03",
|
||||||
|
"SG-04",
|
||||||
|
"SG-05",
|
||||||
|
"SG-06",
|
||||||
|
"SG-07",
|
||||||
|
"SG-09",
|
||||||
|
"SG-10",
|
||||||
|
"SG-11",
|
||||||
|
"SG-13",
|
||||||
|
"domain_signal"
|
||||||
|
],
|
||||||
|
"bo_types": [
|
||||||
|
"event",
|
||||||
|
"state",
|
||||||
|
"communication",
|
||||||
|
"calculation_request"
|
||||||
|
],
|
||||||
|
"structure_types": [
|
||||||
|
{
|
||||||
|
"type_id": "lease_deposit_return",
|
||||||
|
"priority_rank": 1,
|
||||||
|
"module": "lease_contract",
|
||||||
|
"role_projection": "lease_deposit_return_roles"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_id": "lease_rent_payment",
|
||||||
|
"priority_rank": 2,
|
||||||
|
"module": "lease_contract",
|
||||||
|
"role_projection": "lease_rent_roles"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_id": "lease_termination",
|
||||||
|
"priority_rank": 3,
|
||||||
|
"module": "lease_lifecycle",
|
||||||
|
"role_projection": "lease_termination_roles"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_id": "lease_delivery_concurrent_performance",
|
||||||
|
"priority_rank": 4,
|
||||||
|
"module": "lease_lifecycle",
|
||||||
|
"role_projection": "lease_concurrent_performance_roles"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_id": "lease_attached_property_purchase",
|
||||||
|
"priority_rank": 5,
|
||||||
|
"module": "lease_contract",
|
||||||
|
"role_projection": "lease_purchase_claim_roles"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_id": "general_legal_effect",
|
||||||
|
"priority_rank": 11,
|
||||||
|
"module": "legal_effect",
|
||||||
|
"role_projection": "legal_effect_roles"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"effect_projection": {
|
||||||
|
"schema_ref": "Default_Agent/domains/E-08/effect_projection.schema.json",
|
||||||
|
"module": "lease_contract",
|
||||||
|
"role_projection": "lease_deposit_return_roles"
|
||||||
|
},
|
||||||
|
"gates": [
|
||||||
|
{
|
||||||
|
"gate_id": "E08-G01",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-08/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E08_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E08-G02",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-08/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E08_TERM_RENEWAL_CONFLICT"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E08-G03",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-08/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E08_DEPOSIT_DEDUCTION_CONFLICT"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E08-G04",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-08/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E08_POSSESSION_DELIVERY_CONFLICT"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E08-G05",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-08/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E08_CONCURRENT_PERFORMANCE_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E08-G06",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-08/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E08_SPECIAL_LAW_PROFILE_REQUIRED_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E08-G07",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-08/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E08_BOUNDARY_OVERLAP_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E08-G08",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-08/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E08_MEETING_ONLY_MONITOR_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E08-G09",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-08/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E08_CALCULATION_PARTIAL_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E08-G10",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-08/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E08_SOURCE_MEMBERSHIP_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E08-G11",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-08/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"CALCULATION_PREEMPTION_BLOCKED"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"review_codes": [
|
||||||
|
"E08_REQUIRED_ELEMENT_GAP_REVIEW",
|
||||||
|
"E08_TERM_RENEWAL_CONFLICT",
|
||||||
|
"E08_DEPOSIT_DEDUCTION_CONFLICT",
|
||||||
|
"E08_POSSESSION_DELIVERY_CONFLICT",
|
||||||
|
"E08_CONCURRENT_PERFORMANCE_REVIEW",
|
||||||
|
"E08_SPECIAL_LAW_PROFILE_REQUIRED_REVIEW",
|
||||||
|
"E08_BOUNDARY_OVERLAP_REVIEW",
|
||||||
|
"E08_MEETING_ONLY_MONITOR_REVIEW",
|
||||||
|
"E08_CALCULATION_PARTIAL_REVIEW",
|
||||||
|
"E08_SOURCE_MEMBERSHIP_REVIEW",
|
||||||
|
"CALCULATION_PREEMPTION_BLOCKED"
|
||||||
|
],
|
||||||
|
"contract_guards": {
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"unknown_values_require_review": true,
|
||||||
|
"source_membership_required": true,
|
||||||
|
"strict_json_output": true,
|
||||||
|
"meeting_only_evidence_promotion_forbidden": true
|
||||||
|
},
|
||||||
|
"prompt_overlay_ref": "seed_prompt_overlay.md",
|
||||||
|
"profile_schema_ref": "profile_schema.json",
|
||||||
|
"extension_schema_ref": "domain_extension.schema.json"
|
||||||
|
}
|
||||||
+55
@@ -0,0 +1,55 @@
|
|||||||
|
# E-08 임대차·보증금 — Stage 1 leaf overlay
|
||||||
|
|
||||||
|
## 임무와 금지
|
||||||
|
|
||||||
|
선택된 source universe 안에서 임대차·보증금 법률효과의 **후보 사실**만 구조화한다. 최종 청구권·승패·법적 결론을 확정하지 않는다. source membership 없는 사실을 생성하지 않으며, 상담문서만 있는 진술은 `meeting_only`로 남겨 active의 유일한 근거로 승격하지 않는다.
|
||||||
|
|
||||||
|
## SG-01 3-tier fail-open routing
|
||||||
|
|
||||||
|
- `active`: strong positive cue가 evidence 또는 event_candidate에 연결되고 필수 source가 존재한다.
|
||||||
|
- `active_with_review`: positive cue는 있으나 필수 source 누락, 충돌, 계산 partial/blocked 또는 인접 도메인 overlap이 있다. 후보를 삭제하지 않는다.
|
||||||
|
- `monitor`: meeting-only 또는 support/negative cue만 있다. 추가 증거와 인접 도메인을 요청한다.
|
||||||
|
- `not_active`: positive cue가 없고 명시적인 negative cue만 있다. 미분류 중요 이슈는 E-00/`UNROUTED_ISSUE_REVIEW`로 보존한다.
|
||||||
|
|
||||||
|
### positive evidence-component cues
|
||||||
|
- `E08-P01`: 임대차계약서에서 목적물, 사용·수익, 임대인·임차인, 보증금·차임 또는 기간이 연결됨
|
||||||
|
- `E08-P02`: 보증금 지급 자료와 기간 만료·해지·해제·갱신 또는 반환 요구·도달 자료가 연결됨
|
||||||
|
- `E08-P03`: 목적물 인도·점유·열쇠 반환·퇴거와 연체차임·관리비·원상회복 공제 자료가 연결됨
|
||||||
|
|
||||||
|
### negative/boundary cues
|
||||||
|
- `E08-N01`: 사용·수익 약정 없이 금전 교부와 반환 약정만 있어 E-02 검토가 중심임
|
||||||
|
- `E08-N02`: 임대차 관계 없이 사용이익 반환만 다투어 E-04 검토가 중심임
|
||||||
|
- `E08-N03`: 보증금·차임·종료 관계 없이 소유권에 기한 인도·퇴거만 다투어 E-11 검토가 중심임
|
||||||
|
|
||||||
|
### conflict cues
|
||||||
|
- `E08-C01` / `E08_TERM_RENEWAL_CONFLICT`: 계약서·갱신자료·통지자료 사이 임대차 기간, 갱신, 종료 원인 또는 도달 시점이 불일치
|
||||||
|
- `E08-C02` / `E08_DEPOSIT_DEDUCTION_CONFLICT`: 보증금 지급·차임·관리비·원상회복 견적·정산서 사이 반환액 또는 공제액이 불일치
|
||||||
|
- `E08-C03` / `E08_POSSESSION_DELIVERY_CONFLICT`: 인도확인·점유자료·열쇠반환·전출 또는 영업종료 자료 사이 목적물 반환 시점이 불일치
|
||||||
|
|
||||||
|
## 요소사실 후보 슬롯
|
||||||
|
- `lease_deposit.el01`: 임대차 성립·당사자·목적물 특정
|
||||||
|
- `lease_deposit.el02`: 보증금·차임·관리비 약정과 지급
|
||||||
|
- `lease_deposit.el03`: 기간·갱신·묵시 갱신·해지·해제·종료
|
||||||
|
- `lease_deposit.el04`: 목적물 인도·점유·사용수익·반환 제공
|
||||||
|
- `lease_deposit.el05`: 연체차임·관리비·원상회복·손해 공제 항목
|
||||||
|
- `lease_deposit.el06`: 보증금 반환 요구·이행기·동시이행 관계
|
||||||
|
- `lease_deposit.el07`: 임대인 지위 승계·권리변동 및 자산 동일성
|
||||||
|
|
||||||
|
## 반대사실·항변 후보 슬롯
|
||||||
|
- `lease_deposit.op01`: 연체차임·관리비·공과금 공제
|
||||||
|
- `lease_deposit.op02`: 훼손·원상회복비·손해배상 공제
|
||||||
|
- `lease_deposit.op03`: 임대차 갱신·기간 미종료 주장
|
||||||
|
- `lease_deposit.op04`: 목적물 미반환·동시이행·지체책임 부정 주장
|
||||||
|
- `lease_deposit.op05`: 임대인 지위·대항력·우선변제·특별법 적용 부정 주장
|
||||||
|
|
||||||
|
## 인접 도메인 경계
|
||||||
|
|
||||||
|
`E-02, E-04, E-11, X1, X2`와 중첩 가능하다. 복합사건에서는 한 도메인으로 흡수하지 말고 동일 source를 각 slice에 provenance와 함께 투영한다. 도급상 건설 손해라면 E-05 병행 후보를 보존하고, 임대차 종료 후 인도·사용이익이면 E-11/E-04 병행 후보를 보존한다.
|
||||||
|
|
||||||
|
## 계산·법령 버전
|
||||||
|
|
||||||
|
계산 binding은 `CE-01, CE-07`이다. 이 팩은 operand 후보와 `ready|partial|blocked`만 출력한다. 산식·이율·한도·법정 수치를 하드코딩하지 않으며 S4 calculator 결과를 가장하지 않는다. 특별법 후보는 `profile_schema.json`에 따라 review만 생성하고, SG-04가 사건 기준일의 법률 버전을 고정하기 전에는 적용 결론을 내리지 않는다.
|
||||||
|
|
||||||
|
## 출력
|
||||||
|
|
||||||
|
공통 seed v3와 `domain_extension.schema.json`, `domain_signal_extension.schema.json`을 엄격히 따른다. 모든 candidate와 review에는 source refs를 붙이고, 서로 모순되는 자료는 어느 한쪽을 제거하지 않는다. Part 3 structure type 및 Part 4 effect projection 후보를 함께 전달한다.
|
||||||
+314
@@ -0,0 +1,314 @@
|
|||||||
|
{
|
||||||
|
"schema_version": "stage1_domain_config.v1",
|
||||||
|
"domain_id": "E-09",
|
||||||
|
"label_ko": "소유권이전 원인·등기청구",
|
||||||
|
"slug": "registry_transfer_claims",
|
||||||
|
"kind": "leaf",
|
||||||
|
"status": "active",
|
||||||
|
"execution_policy": {
|
||||||
|
"runnable": true,
|
||||||
|
"always_on": false,
|
||||||
|
"model_tier": "pro",
|
||||||
|
"output_mode": "strict_json",
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"max_instances": 1
|
||||||
|
},
|
||||||
|
"depends_on": [
|
||||||
|
"EC-00",
|
||||||
|
"E-01"
|
||||||
|
],
|
||||||
|
"special_law_profiles": [],
|
||||||
|
"activation_cues": {
|
||||||
|
"positive_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E09-P01",
|
||||||
|
"cue_type": "evidence_component",
|
||||||
|
"match_value": "등기원인·연월일·접수번호·순위가 기재된 등기기록",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "사건명이 아닌 증거 구성요소로 활성",
|
||||||
|
"strength": "strong",
|
||||||
|
"weight": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E09-P02",
|
||||||
|
"cue_type": "evidence_component",
|
||||||
|
"match_value": "이전·말소·회복·경정·본등기의 원인 계약·판결 자료",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "사건명이 아닌 증거 구성요소로 활성",
|
||||||
|
"strength": "strong",
|
||||||
|
"weight": 1.0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"negative_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E09-N01",
|
||||||
|
"cue_type": "legal_relation",
|
||||||
|
"match_value": "담보권 설정·소멸과 경매·배당만이 주요 쟁점",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "인접 도메인과 경계 검토",
|
||||||
|
"effect": "monitor_review",
|
||||||
|
"weight": 0.7
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"conflict_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E09-C01",
|
||||||
|
"rule": "원인행위의 당사자·날짜·목적물과 등기부 기재가 불일치",
|
||||||
|
"left_refs": [],
|
||||||
|
"right_refs": [],
|
||||||
|
"effect": "hard_review",
|
||||||
|
"review_code": "E09_REGISTRY_SEQUENCE_CONFLICT"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"routing_policy": {
|
||||||
|
"fail_open": true,
|
||||||
|
"candidate_downgrade_forbidden": true,
|
||||||
|
"minimum_primary_evidence": 1,
|
||||||
|
"leaf_activation_threshold": 1.0,
|
||||||
|
"monitor_threshold": 0.5,
|
||||||
|
"unknown_review_code": "UNROUTED_ISSUE_REVIEW"
|
||||||
|
},
|
||||||
|
"element_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "registry_transfer_claims.el01",
|
||||||
|
"label": "이전·말소의 실체법상 원인",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E09_CAUSE_REGISTRY_MISMATCH_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "registry_transfer_claims.el02",
|
||||||
|
"label": "등기의 목적물·지분",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E09_CAUSE_REGISTRY_MISMATCH_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "registry_transfer_claims.el03",
|
||||||
|
"label": "등기의무자·권리자 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E09_CAUSE_REGISTRY_MISMATCH_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "registry_transfer_claims.el04",
|
||||||
|
"label": "등기순위·접수번호",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E09_CAUSE_REGISTRY_MISMATCH_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "registry_transfer_claims.el05",
|
||||||
|
"label": "제3자 승낙 필요성 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E09_CAUSE_REGISTRY_MISMATCH_REVIEW"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"opposing_fact_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "registry_transfer_claims.op01",
|
||||||
|
"label": "원인무효·취소·해제",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "registry_transfer_claims.op02",
|
||||||
|
"label": "이행불능·이중양도",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "registry_transfer_claims.op03",
|
||||||
|
"label": "제3자 등기·승낙 거절",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"evidence_components": [
|
||||||
|
{
|
||||||
|
"component_id": "registry_transfer_claims.ev01",
|
||||||
|
"label": "등기사항증명서·접수정보",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "legacy_successor_evidence"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "registry_transfer_claims.ev02",
|
||||||
|
"label": "매매·증여·화해 등 원인문서",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "legacy_successor_evidence"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "registry_transfer_claims.ev03",
|
||||||
|
"label": "말소·회복·승낙 관련 문서",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "legacy_successor_evidence"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"defense_map": [
|
||||||
|
{
|
||||||
|
"defense_id": "registry_transfer_claims.defense01",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"registry_transfer_claims.op01"
|
||||||
|
],
|
||||||
|
"review_code": "E09_REGISTRY_SEQUENCE_CONFLICT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defense_id": "registry_transfer_claims.defense02",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"registry_transfer_claims.op02"
|
||||||
|
],
|
||||||
|
"review_code": "E09_THIRD_PARTY_CONSENT_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defense_id": "registry_transfer_claims.defense03",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"registry_transfer_claims.op03"
|
||||||
|
],
|
||||||
|
"review_code": "E09_FRACTION_UNRESOLVED_REVIEW"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"calculation_bindings": [
|
||||||
|
"CE-03",
|
||||||
|
"CE-04"
|
||||||
|
],
|
||||||
|
"emits_signals": [
|
||||||
|
"SG-04",
|
||||||
|
"SG-05",
|
||||||
|
"SG-07",
|
||||||
|
"SG-10",
|
||||||
|
"SG-11",
|
||||||
|
"SG-13"
|
||||||
|
],
|
||||||
|
"bo_types": [
|
||||||
|
"event",
|
||||||
|
"state"
|
||||||
|
],
|
||||||
|
"structure_types": [
|
||||||
|
{
|
||||||
|
"type_id": "registry_invalidity",
|
||||||
|
"priority_rank": 4,
|
||||||
|
"module": "registry_invalidity",
|
||||||
|
"role_projection": "linked_structures"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_id": "general_legal_effect",
|
||||||
|
"priority_rank": 11,
|
||||||
|
"module": "legal_effect",
|
||||||
|
"role_projection": "legal_effect_roles"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"effect_projection": {
|
||||||
|
"schema_ref": "Default_Agent/domains/E-09/effect_projection.schema.json",
|
||||||
|
"module": "registry_invalidity",
|
||||||
|
"role_projection": "linked_structures"
|
||||||
|
},
|
||||||
|
"gates": [
|
||||||
|
{
|
||||||
|
"gate_id": "E09-G01",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-09/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E09_CAUSE_REGISTRY_MISMATCH_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E09-G02",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-09/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E09_REGISTRY_SEQUENCE_CONFLICT"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E09-G03",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-09/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E09_THIRD_PARTY_CONSENT_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E09-G04",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-09/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E09_FRACTION_UNRESOLVED_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"review_codes": [
|
||||||
|
"E09_CAUSE_REGISTRY_MISMATCH_REVIEW",
|
||||||
|
"E09_REGISTRY_SEQUENCE_CONFLICT",
|
||||||
|
"E09_THIRD_PARTY_CONSENT_REVIEW",
|
||||||
|
"E09_FRACTION_UNRESOLVED_REVIEW"
|
||||||
|
],
|
||||||
|
"contract_guards": {
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"unknown_values_require_review": true,
|
||||||
|
"source_membership_required": true,
|
||||||
|
"strict_json_output": true,
|
||||||
|
"meeting_only_evidence_promotion_forbidden": true
|
||||||
|
},
|
||||||
|
"prompt_overlay_ref": "seed_prompt_overlay.md",
|
||||||
|
"profile_schema_ref": "profile.schema.json",
|
||||||
|
"extension_schema_ref": "domain_extension.schema.json",
|
||||||
|
"runtime_activation_from_legacy_alias_forbidden": true,
|
||||||
|
"case_kind_name_runtime_lookup_forbidden": true,
|
||||||
|
"removed_noncanonical_signal_aliases": [
|
||||||
|
"domain_signal"
|
||||||
|
]
|
||||||
|
}
|
||||||
+51
@@ -0,0 +1,51 @@
|
|||||||
|
# E-09 seed prompt overlay — 소유권이전 원인·등기청구
|
||||||
|
|
||||||
|
## 승계 원칙
|
||||||
|
|
||||||
|
이 overlay는 `B2_Secured_Registry`의 DOMAIN_SCOPE·WORKFLOW·payload 필드를 삭제하지 않고 E-09으로 분해한다. 이 도메인의 지원이 있는 범위는 `매매·증여·교환·대물변제·명의신탁·취득시효 등 이전원인과 이전·말소·회복·경정·가등기·승낙의 사표시`이다. 반대사실·불확실성·교차 도메인 필요성을 review로 보존한다.
|
||||||
|
|
||||||
|
## Legacy DOMAIN_SCOPE 무손실 보존
|
||||||
|
|
||||||
|
<DOMAIN_SCOPE>
|
||||||
|
Create separate seeds when supported for:
|
||||||
|
- secured debt creation, change, repayment, payment allocation, and secured obligation balance
|
||||||
|
- mortgage, pledge, collateral security, registration, cancellation, correction, or invalidity chain
|
||||||
|
- auction, distribution, dividend, satisfaction, or residual balance facts
|
||||||
|
- derivative invalidity, registry error, title defect, or secured property dispute
|
||||||
|
- uncertain registry sequence or security/right-holder linkage that must be preserved for downstream review
|
||||||
|
</DOMAIN_SCOPE>
|
||||||
|
|
||||||
|
## Legacy WORKFLOW 무손실 보존
|
||||||
|
|
||||||
|
<WORKFLOW>
|
||||||
|
1. Read `selected_event_candidates`, `selected_evidence_authority`, `selected_meeting_clauses`, `hazard_subset`, and `part1_review_items_relevant` from the current B0 slice only.
|
||||||
|
2. Group sources by legal event/state seed. Do not make one seed per evidence item if several sources support the same event.
|
||||||
|
3. Split secured debt chain, registry act, payment allocation, auction step, dividend distribution, and derivative invalidity when they are distinct legal-effect seeds.
|
||||||
|
4. Preserve registry rows, secured debt chain, payment allocation, auction step, dividend distribution hints, derivative invalidity hints, and registry display values in `extensions.domain_payload`. Carry `fraction_ref` from source event candidates unchanged; do not merge or renumber. Populate `fractional_effect_events` as an event-reference list only (fraction-bearing setting/extinguishment/transfer events); never fold fraction states or normalize/reduce fractions (that is Stage 2 work).
|
||||||
|
5. Use `domain_review_queue` for missing registry date, unclear secured obligation balance, conflicting registration sequence, or cross-domain property merge need.
|
||||||
|
6. Project each seed only to BO target-schema-compatible fields.
|
||||||
|
7. Put domain-specific details under `extensions.domain_payload`.
|
||||||
|
8. Keep all unsupported or uncertain values as null or [] and route review needs to `domain_review_queue`.
|
||||||
|
9. Use `legal_theory_required` for fields this stage must not decide (e.g., lien violation, notice sender standing, possession cause resolution); use `review_required` for extractable-but-unclear facts.
|
||||||
|
</WORKFLOW>
|
||||||
|
|
||||||
|
## S2 분해 적용
|
||||||
|
|
||||||
|
1. slice의 source universe와 selected sources 안에 있는 source ID만 사용한다.
|
||||||
|
2. 증거 하나당 seed 하나가 아니라, 동일한 법적 행위·상태를 지원하는 원천을 그룹화한다.
|
||||||
|
3. 원인·성립, 이행·변동, 소멸·항변, 제3자·승계 관계가 다르면 별도 seed로 분리한다.
|
||||||
|
4. legacy payload 필드를 `extensions.domain_payload.payload`에 그대로 보존하고, S2 필드만 additive로 추가한다.
|
||||||
|
5. 등기 지분·이율·충당·배당액을 정규화하거나 계산하지 않고 operand 상태만 CE에 전달한다.
|
||||||
|
6. 통지·도달, 자산·지분, 소송법상 경계는 필요한 X1·X2·X3 dependency ref로 보존한다.
|
||||||
|
|
||||||
|
## 금지규칙
|
||||||
|
|
||||||
|
- 사건명·파일명·단일 키워드로 활성·법적 성격을 확정하지 말 것.
|
||||||
|
- 미팅 진술을 직접증거로 승격하지 말 것.
|
||||||
|
- 채권·담보권·등기·승계책임의 성립, 항변 배척, 청구인용 가능성을 최종 판단하지 말 것.
|
||||||
|
- 법정이율·시효완성일·배당액·잔액을 추정하지 말 것.
|
||||||
|
- 반대자료나 불명확성을 빈 배열로 소거하지 말 것.
|
||||||
|
|
||||||
|
## 출력 계약
|
||||||
|
|
||||||
|
root는 `stage_b_domain_bo_seed_output`, schema version은 `task_c_bo_stage_b_domain_bo_seed.v3`이다. final BO ID를 생성하지 않고 `final_conclusion_forbidden=true`를 유지한다. `bo_seed_candidates`, 요건·반대사실·항변·계산요청·dependency·review를 additive로 출력한다. 도메인 페이로드는 `E-09.domain_extension.v2`를 따른다.
|
||||||
+366
@@ -0,0 +1,366 @@
|
|||||||
|
{
|
||||||
|
"schema_version": "stage1_domain_config.v1",
|
||||||
|
"domain_id": "E-10",
|
||||||
|
"label_ko": "담보물권·경매·배당·유치권",
|
||||||
|
"slug": "secured_registry",
|
||||||
|
"kind": "leaf",
|
||||||
|
"status": "active",
|
||||||
|
"execution_policy": {
|
||||||
|
"runnable": true,
|
||||||
|
"always_on": false,
|
||||||
|
"model_tier": "pro",
|
||||||
|
"output_mode": "strict_json",
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"max_instances": 1
|
||||||
|
},
|
||||||
|
"depends_on": [
|
||||||
|
"E-01",
|
||||||
|
"E-02",
|
||||||
|
"E-09"
|
||||||
|
],
|
||||||
|
"special_law_profiles": [],
|
||||||
|
"activation_cues": {
|
||||||
|
"positive_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E10-P01",
|
||||||
|
"cue_type": "evidence_component",
|
||||||
|
"match_value": "담보권·피담보채무·채권최고액·순위가 나타난 계약·등기",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "사건명이 아닌 증거 구성요소로 활성",
|
||||||
|
"strength": "strong",
|
||||||
|
"weight": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E10-P02",
|
||||||
|
"cue_type": "evidence_component",
|
||||||
|
"match_value": "경매개시·매각·배당표·배당요구 자료",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "사건명이 아닌 증거 구성요소로 활성",
|
||||||
|
"strength": "strong",
|
||||||
|
"weight": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E10-P03",
|
||||||
|
"cue_type": "evidence_component",
|
||||||
|
"match_value": "유치권의 채권·목적물·점유·견련성 자료",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "사건명이 아닌 증거 구성요소로 활성",
|
||||||
|
"strength": "strong",
|
||||||
|
"weight": 1.0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"negative_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E10-N01",
|
||||||
|
"cue_type": "legal_relation",
|
||||||
|
"match_value": "담보권이 아닌 소유권이전·말소 원인만이 주요 쟁점",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "인접 도메인과 경계 검토",
|
||||||
|
"effect": "monitor_review",
|
||||||
|
"weight": 0.7
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"conflict_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E10-C01",
|
||||||
|
"rule": "피담보채무 잔액·변제충당·담보순위·배당표가 불일치",
|
||||||
|
"left_refs": [],
|
||||||
|
"right_refs": [],
|
||||||
|
"effect": "hard_review",
|
||||||
|
"review_code": "E10_REGISTRY_SEQUENCE_CONFLICT"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"routing_policy": {
|
||||||
|
"fail_open": true,
|
||||||
|
"candidate_downgrade_forbidden": true,
|
||||||
|
"minimum_primary_evidence": 1,
|
||||||
|
"leaf_activation_threshold": 1.0,
|
||||||
|
"monitor_threshold": 0.5,
|
||||||
|
"unknown_review_code": "UNROUTED_ISSUE_REVIEW"
|
||||||
|
},
|
||||||
|
"element_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "secured_registry.el01",
|
||||||
|
"label": "담보권 성립·공시",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E10_SECURED_BALANCE_CONFLICT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "secured_registry.el02",
|
||||||
|
"label": "피담보채무 발생·확정·잔액",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E10_SECURED_BALANCE_CONFLICT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "secured_registry.el03",
|
||||||
|
"label": "변제충당·소멸",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E10_SECURED_BALANCE_CONFLICT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "secured_registry.el04",
|
||||||
|
"label": "경매·배당 절차·순위",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E10_SECURED_BALANCE_CONFLICT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "secured_registry.el05",
|
||||||
|
"label": "유치권 채권·견련성·점유",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E10_SECURED_BALANCE_CONFLICT"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"opposing_fact_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "secured_registry.op01",
|
||||||
|
"label": "피담보채무 부존재·소멸",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "secured_registry.op02",
|
||||||
|
"label": "위법한 경매·배당순위",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "secured_registry.op03",
|
||||||
|
"label": "점유 상실·불법점유·견련성 부정",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"evidence_components": [
|
||||||
|
{
|
||||||
|
"component_id": "secured_registry.ev01",
|
||||||
|
"label": "담보계약·채권확정서류",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "legacy_successor_evidence"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "secured_registry.ev02",
|
||||||
|
"label": "등기사항증명서·변제내역",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "legacy_successor_evidence"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "secured_registry.ev03",
|
||||||
|
"label": "경매기록·배당표",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "legacy_successor_evidence"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "secured_registry.ev04",
|
||||||
|
"label": "유치권신고·점유자료",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "legacy_successor_evidence"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"defense_map": [
|
||||||
|
{
|
||||||
|
"defense_id": "secured_registry.defense01",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"secured_registry.op01"
|
||||||
|
],
|
||||||
|
"review_code": "E10_REGISTRY_SEQUENCE_CONFLICT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defense_id": "secured_registry.defense02",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"secured_registry.op02"
|
||||||
|
],
|
||||||
|
"review_code": "E10_AUCTION_DISTRIBUTION_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defense_id": "secured_registry.defense03",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"secured_registry.op03"
|
||||||
|
],
|
||||||
|
"review_code": "E10_LIEN_CAUSE_POSSESSION_REVIEW"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"calculation_bindings": [
|
||||||
|
"CE-01",
|
||||||
|
"CE-02",
|
||||||
|
"CE-11"
|
||||||
|
],
|
||||||
|
"emits_signals": [
|
||||||
|
"SG-04",
|
||||||
|
"SG-05",
|
||||||
|
"SG-07",
|
||||||
|
"SG-08",
|
||||||
|
"SG-09",
|
||||||
|
"SG-10",
|
||||||
|
"SG-11",
|
||||||
|
"SG-13"
|
||||||
|
],
|
||||||
|
"bo_types": [
|
||||||
|
"event",
|
||||||
|
"state"
|
||||||
|
],
|
||||||
|
"structure_types": [
|
||||||
|
{
|
||||||
|
"type_id": "secured_debt",
|
||||||
|
"priority_rank": 3,
|
||||||
|
"module": "secured_property",
|
||||||
|
"role_projection": "linked_structures"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_id": "registry_invalidity",
|
||||||
|
"priority_rank": 4,
|
||||||
|
"module": "registry_invalidity",
|
||||||
|
"role_projection": "linked_structures"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_id": "succession_notice_lien_asset_defense",
|
||||||
|
"priority_rank": 10,
|
||||||
|
"module": "succession_notice_lien_asset_defense",
|
||||||
|
"role_projection": "linked_structures"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_id": "general_legal_effect",
|
||||||
|
"priority_rank": 11,
|
||||||
|
"module": "legal_effect",
|
||||||
|
"role_projection": "legal_effect_roles"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"effect_projection": {
|
||||||
|
"schema_ref": "Default_Agent/domains/E-10/effect_projection.schema.json",
|
||||||
|
"module": "secured_property",
|
||||||
|
"role_projection": "linked_structures"
|
||||||
|
},
|
||||||
|
"gates": [
|
||||||
|
{
|
||||||
|
"gate_id": "E10-G01",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-10/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E10_SECURED_BALANCE_CONFLICT"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E10-G02",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-10/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E10_REGISTRY_SEQUENCE_CONFLICT"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E10-G03",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-10/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E10_AUCTION_DISTRIBUTION_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E10-G04",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-10/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E10_LIEN_CAUSE_POSSESSION_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E10-G05",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-10/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"POSSESSION_CAUSE_CONFLICT"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E10-G06",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-10/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"LIEN_ASSERTED_AFTER_EXTINCTION_NOTICE_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"review_codes": [
|
||||||
|
"E10_SECURED_BALANCE_CONFLICT",
|
||||||
|
"E10_REGISTRY_SEQUENCE_CONFLICT",
|
||||||
|
"E10_AUCTION_DISTRIBUTION_REVIEW",
|
||||||
|
"E10_LIEN_CAUSE_POSSESSION_REVIEW",
|
||||||
|
"POSSESSION_CAUSE_CONFLICT",
|
||||||
|
"LIEN_ASSERTED_AFTER_EXTINCTION_NOTICE_REVIEW"
|
||||||
|
],
|
||||||
|
"contract_guards": {
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"unknown_values_require_review": true,
|
||||||
|
"source_membership_required": true,
|
||||||
|
"strict_json_output": true,
|
||||||
|
"meeting_only_evidence_promotion_forbidden": true
|
||||||
|
},
|
||||||
|
"prompt_overlay_ref": "seed_prompt_overlay.md",
|
||||||
|
"profile_schema_ref": "profile.schema.json",
|
||||||
|
"extension_schema_ref": "domain_extension.schema.json",
|
||||||
|
"runtime_activation_from_legacy_alias_forbidden": true,
|
||||||
|
"case_kind_name_runtime_lookup_forbidden": true,
|
||||||
|
"removed_noncanonical_signal_aliases": [
|
||||||
|
"domain_signal"
|
||||||
|
]
|
||||||
|
}
|
||||||
+51
@@ -0,0 +1,51 @@
|
|||||||
|
# E-10 seed prompt overlay — 담보물권·경매·배당·유치권
|
||||||
|
|
||||||
|
## 승계 원칙
|
||||||
|
|
||||||
|
이 overlay는 `B2_Secured_Registry`의 DOMAIN_SCOPE·WORKFLOW·payload 필드를 삭제하지 않고 E-10으로 분해한다. 이 도메인의 지원이 있는 범위는 `저당·근저당·질권·전세권, 피담보채무의 성립·확정·소멸, 담보실행경매·배당, 가등기담보·양도담보, 유치권·점유·견련성`이다. 반대사실·불확실성·교차 도메인 필요성을 review로 보존한다.
|
||||||
|
|
||||||
|
## Legacy DOMAIN_SCOPE 무손실 보존
|
||||||
|
|
||||||
|
<DOMAIN_SCOPE>
|
||||||
|
Create separate seeds when supported for:
|
||||||
|
- secured debt creation, change, repayment, payment allocation, and secured obligation balance
|
||||||
|
- mortgage, pledge, collateral security, registration, cancellation, correction, or invalidity chain
|
||||||
|
- auction, distribution, dividend, satisfaction, or residual balance facts
|
||||||
|
- derivative invalidity, registry error, title defect, or secured property dispute
|
||||||
|
- uncertain registry sequence or security/right-holder linkage that must be preserved for downstream review
|
||||||
|
</DOMAIN_SCOPE>
|
||||||
|
|
||||||
|
## Legacy WORKFLOW 무손실 보존
|
||||||
|
|
||||||
|
<WORKFLOW>
|
||||||
|
1. Read `selected_event_candidates`, `selected_evidence_authority`, `selected_meeting_clauses`, `hazard_subset`, and `part1_review_items_relevant` from the current B0 slice only.
|
||||||
|
2. Group sources by legal event/state seed. Do not make one seed per evidence item if several sources support the same event.
|
||||||
|
3. Split secured debt chain, registry act, payment allocation, auction step, dividend distribution, and derivative invalidity when they are distinct legal-effect seeds.
|
||||||
|
4. Preserve registry rows, secured debt chain, payment allocation, auction step, dividend distribution hints, derivative invalidity hints, and registry display values in `extensions.domain_payload`. Carry `fraction_ref` from source event candidates unchanged; do not merge or renumber. Populate `fractional_effect_events` as an event-reference list only (fraction-bearing setting/extinguishment/transfer events); never fold fraction states or normalize/reduce fractions (that is Stage 2 work).
|
||||||
|
5. Use `domain_review_queue` for missing registry date, unclear secured obligation balance, conflicting registration sequence, or cross-domain property merge need.
|
||||||
|
6. Project each seed only to BO target-schema-compatible fields.
|
||||||
|
7. Put domain-specific details under `extensions.domain_payload`.
|
||||||
|
8. Keep all unsupported or uncertain values as null or [] and route review needs to `domain_review_queue`.
|
||||||
|
9. Use `legal_theory_required` for fields this stage must not decide (e.g., lien violation, notice sender standing, possession cause resolution); use `review_required` for extractable-but-unclear facts.
|
||||||
|
</WORKFLOW>
|
||||||
|
|
||||||
|
## S2 분해 적용
|
||||||
|
|
||||||
|
1. slice의 source universe와 selected sources 안에 있는 source ID만 사용한다.
|
||||||
|
2. 증거 하나당 seed 하나가 아니라, 동일한 법적 행위·상태를 지원하는 원천을 그룹화한다.
|
||||||
|
3. 원인·성립, 이행·변동, 소멸·항변, 제3자·승계 관계가 다르면 별도 seed로 분리한다.
|
||||||
|
4. legacy payload 필드를 `extensions.domain_payload.payload`에 그대로 보존하고, S2 필드만 additive로 추가한다.
|
||||||
|
5. 등기 지분·이율·충당·배당액을 정규화하거나 계산하지 않고 operand 상태만 CE에 전달한다.
|
||||||
|
6. 통지·도달, 자산·지분, 소송법상 경계는 필요한 X1·X2·X3 dependency ref로 보존한다.
|
||||||
|
|
||||||
|
## 금지규칙
|
||||||
|
|
||||||
|
- 사건명·파일명·단일 키워드로 활성·법적 성격을 확정하지 말 것.
|
||||||
|
- 미팅 진술을 직접증거로 승격하지 말 것.
|
||||||
|
- 채권·담보권·등기·승계책임의 성립, 항변 배척, 청구인용 가능성을 최종 판단하지 말 것.
|
||||||
|
- 법정이율·시효완성일·배당액·잔액을 추정하지 말 것.
|
||||||
|
- 반대자료나 불명확성을 빈 배열로 소거하지 말 것.
|
||||||
|
|
||||||
|
## 출력 계약
|
||||||
|
|
||||||
|
root는 `stage_b_domain_bo_seed_output`, schema version은 `task_c_bo_stage_b_domain_bo_seed.v3`이다. final BO ID를 생성하지 않고 `final_conclusion_forbidden=true`를 유지한다. `bo_seed_candidates`, 요건·반대사실·항변·계산요청·dependency·review를 additive로 출력한다. 도메인 페이로드는 `E-10.domain_extension.v2`를 따른다.
|
||||||
+368
@@ -0,0 +1,368 @@
|
|||||||
|
{
|
||||||
|
"schema_version": "stage1_domain_config.v1",
|
||||||
|
"domain_id": "E-11",
|
||||||
|
"label_ko": "점유·인도·방해배제·상린",
|
||||||
|
"slug": "possession_vindication",
|
||||||
|
"kind": "leaf",
|
||||||
|
"status": "active",
|
||||||
|
"execution_policy": {
|
||||||
|
"runnable": true,
|
||||||
|
"always_on": false,
|
||||||
|
"model_tier": "flash",
|
||||||
|
"output_mode": "strict_json",
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"max_instances": 1
|
||||||
|
},
|
||||||
|
"depends_on": [
|
||||||
|
"E-01",
|
||||||
|
"X2"
|
||||||
|
],
|
||||||
|
"special_law_profiles": [],
|
||||||
|
"activation_cues": {
|
||||||
|
"positive_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E11-P01",
|
||||||
|
"cue_type": "object",
|
||||||
|
"match_value": "특정 자산의 현재 또는 과거 점유·사용·점유이전 자료",
|
||||||
|
"source_field": "source_universe",
|
||||||
|
"note": null,
|
||||||
|
"strength": "strong",
|
||||||
|
"weight": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E11-P02",
|
||||||
|
"cue_type": "relief",
|
||||||
|
"match_value": "인도·명도·퇴거·철거·수거·방해제거 또는 방해예방 대상 자료",
|
||||||
|
"source_field": "source_universe",
|
||||||
|
"note": null,
|
||||||
|
"strength": "strong",
|
||||||
|
"weight": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E11-P03",
|
||||||
|
"cue_type": "legal_relation",
|
||||||
|
"match_value": "점유 권원·소유권·점유보호·상린관계의 상충 주장",
|
||||||
|
"source_field": "source_universe",
|
||||||
|
"note": null,
|
||||||
|
"strength": "support",
|
||||||
|
"weight": 0.5
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"negative_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E11-N01",
|
||||||
|
"cue_type": "other",
|
||||||
|
"match_value": "단순 소유권이전등기만 문제되고 현실 점유·인도·방해 상태가 없음",
|
||||||
|
"source_field": "source_universe",
|
||||||
|
"note": "E-09 중심으로 라우팅하고 X2는 계속 실행한다",
|
||||||
|
"effect": "confidence_downrank_only",
|
||||||
|
"weight": 1.0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"conflict_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E11-C01",
|
||||||
|
"rule": "동일 자산·중첩 기간에 양립하지 않는 점유원인 주장이 존재",
|
||||||
|
"left_refs": [],
|
||||||
|
"right_refs": [],
|
||||||
|
"effect": "hard_review",
|
||||||
|
"review_code": "POSSESSION_CAUSE_CONFLICT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E11-C02",
|
||||||
|
"rule": "인도·철거·방해제거 대상 또는 경계가 서로 다르게 특정됨",
|
||||||
|
"left_refs": [],
|
||||||
|
"right_refs": [],
|
||||||
|
"effect": "hard_review",
|
||||||
|
"review_code": "E11_OBJECT_OR_SCOPE_CONFLICT"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"routing_policy": {
|
||||||
|
"fail_open": true,
|
||||||
|
"candidate_downgrade_forbidden": true,
|
||||||
|
"minimum_primary_evidence": 1,
|
||||||
|
"leaf_activation_threshold": 1.0,
|
||||||
|
"monitor_threshold": 0.5,
|
||||||
|
"unknown_review_code": "UNROUTED_ISSUE_REVIEW"
|
||||||
|
},
|
||||||
|
"element_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "e11.el01",
|
||||||
|
"label": "반환·배제를 구하는 권리 또는 점유보호 관계 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E11_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e11.el02",
|
||||||
|
"label": "상대방의 점유·방해·침해 상태",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E11_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e11.el03",
|
||||||
|
"label": "대상 자산·범위·수량·별지목록 결합",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E11_OBJECT_OR_SCOPE_CONFLICT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e11.el04",
|
||||||
|
"label": "점유·방해의 개시·변경·종료 시점",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e11.el05",
|
||||||
|
"label": "인도·퇴거·철거·수거·방해제거 행위 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e11.el06",
|
||||||
|
"label": "점유의 사실 경위와 주장 법적 원인",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"opposing_fact_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "e11.op01",
|
||||||
|
"label": "임대차·유치권·사용대차·동시이행 등 점유권원 주장",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e11.op02",
|
||||||
|
"label": "점유 종료·인도 완료·대상 불특정 주장",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e11.op03",
|
||||||
|
"label": "상린관계상 수인의무 또는 권리남용 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"evidence_components": [
|
||||||
|
{
|
||||||
|
"component_id": "e11.asset_identity",
|
||||||
|
"label": "등기·대장·도면·별지목록 등 자산 특정 자료",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "object_identity"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "e11.possession_record",
|
||||||
|
"label": "점유·사용·출입·열쇠·시설관리 자료",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "possession_state"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "e11.legal_cause_assertion",
|
||||||
|
"label": "임대차·유치권·사용대차·동시이행 등 주장 자료",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "asserted_cause"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "e11.delivery_or_removal",
|
||||||
|
"label": "인도·퇴거·철거·수거·방해 상태 자료",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "relief_object"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"defense_map": [
|
||||||
|
{
|
||||||
|
"defense_id": "e11.possession_title",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"e11.op01"
|
||||||
|
],
|
||||||
|
"review_code": "POSSESSION_CAUSE_CONFLICT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defense_id": "e11.performance_or_scope",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"e11.op02",
|
||||||
|
"e11.op03"
|
||||||
|
],
|
||||||
|
"review_code": "E11_OBJECT_OR_SCOPE_CONFLICT"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"calculation_bindings": [
|
||||||
|
"CE-04",
|
||||||
|
"CE-07"
|
||||||
|
],
|
||||||
|
"emits_signals": [
|
||||||
|
"SG-02",
|
||||||
|
"SG-05",
|
||||||
|
"SG-06",
|
||||||
|
"SG-07",
|
||||||
|
"SG-09",
|
||||||
|
"SG-10",
|
||||||
|
"SG-11",
|
||||||
|
"SG-12",
|
||||||
|
"SG-13"
|
||||||
|
],
|
||||||
|
"bo_types": [
|
||||||
|
"event",
|
||||||
|
"state"
|
||||||
|
],
|
||||||
|
"structure_types": [
|
||||||
|
{
|
||||||
|
"type_id": "possession_vindication",
|
||||||
|
"priority_rank": 5,
|
||||||
|
"module": "possession_vindication",
|
||||||
|
"role_projection": "linked_structures"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_id": "land_use_gain",
|
||||||
|
"priority_rank": 6,
|
||||||
|
"module": "land_use_gain",
|
||||||
|
"role_projection": "legal_calculation_object"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_id": "succession_notice_lien_asset_defense",
|
||||||
|
"priority_rank": 10,
|
||||||
|
"module": "succession_notice_lien_asset_defense",
|
||||||
|
"role_projection": "linked_structures"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"effect_projection": {
|
||||||
|
"schema_ref": "Default_Agent/domains/E-11/effect_projection.schema.json",
|
||||||
|
"module": "possession_vindication",
|
||||||
|
"role_projection": "linked_structures"
|
||||||
|
},
|
||||||
|
"gates": [
|
||||||
|
{
|
||||||
|
"gate_id": "E11-G01",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-11/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"POSSESSION_CAUSE_CONFLICT",
|
||||||
|
"LEGAL_CAUSE_STATE_UNKNOWN_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E11-G02",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-11/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E11_OBJECT_OR_SCOPE_CONFLICT",
|
||||||
|
"E11_ASSET_BINDING_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E11-G03",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-11/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E11_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E11-G04",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-11/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"FINAL_LEGAL_CONCLUSION_BLOCKED"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"review_codes": [
|
||||||
|
"E11_REQUIRED_ELEMENT_GAP_REVIEW",
|
||||||
|
"POSSESSION_CAUSE_CONFLICT",
|
||||||
|
"LEGAL_CAUSE_STATE_UNKNOWN_REVIEW",
|
||||||
|
"E11_OBJECT_OR_SCOPE_CONFLICT",
|
||||||
|
"E11_ASSET_BINDING_REVIEW",
|
||||||
|
"FINAL_LEGAL_CONCLUSION_BLOCKED"
|
||||||
|
],
|
||||||
|
"contract_guards": {
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"unknown_values_require_review": true,
|
||||||
|
"source_membership_required": true,
|
||||||
|
"strict_json_output": true,
|
||||||
|
"meeting_only_evidence_promotion_forbidden": true
|
||||||
|
},
|
||||||
|
"prompt_overlay_ref": "seed_prompt_overlay.md",
|
||||||
|
"profile_schema_ref": "profile.schema.json",
|
||||||
|
"extension_schema_ref": "domain_extension.schema.json",
|
||||||
|
"runtime_activation_from_legacy_alias_forbidden": true,
|
||||||
|
"case_kind_name_runtime_lookup_forbidden": true,
|
||||||
|
"removed_noncanonical_signal_aliases": [
|
||||||
|
"domain_signal"
|
||||||
|
]
|
||||||
|
}
|
||||||
+52
@@ -0,0 +1,52 @@
|
|||||||
|
# E-11 seed prompt overlay — 점유·인도·방해배제·상린
|
||||||
|
|
||||||
|
## 임무와 입력 경계
|
||||||
|
|
||||||
|
현재 `stage_b_domain_slice.v2`의 `selected_sources`, `support_refs`, `review_only_refs`와 그 source ID가 가리키는 slice 내부 원천만 사용한다. 전체 사건 파일, 사건명, 당사자명 또는 특정 날짜를 이용해 도메인을 확정하지 않는다. 동일 사건·상태를 지지하는 원천은 하나의 seed로 묶되 법률효과가 다른 사건과 상태는 분리한다.
|
||||||
|
|
||||||
|
## legacy `B3` 의미 보존 범위
|
||||||
|
|
||||||
|
- 점유·사용 상태와 개시·종료
|
||||||
|
- 인도·퇴거·철거·방해제거 대상
|
||||||
|
- 점유의 사실 경위와 주장 법적 원인의 분리
|
||||||
|
- 동일 자산의 상충 점유원인과 기간
|
||||||
|
|
||||||
|
위 범위는 기능 확장이 아니라 legacy delta의 무손실 분해다. legacy field는 `extensions.domain_payload.payload`의 명시 필드와 `legacy_*_projection`에 source refs를 포함하여 보존한다.
|
||||||
|
|
||||||
|
## 사실 슬롯
|
||||||
|
|
||||||
|
- `e11.el01`: 반환·배제를 구하는 권리 또는 점유보호 관계 후보
|
||||||
|
- `e11.el02`: 상대방의 점유·방해·침해 상태
|
||||||
|
- `e11.el03`: 대상 자산·범위·수량·별지목록 결합
|
||||||
|
- `e11.el04`: 점유·방해의 개시·변경·종료 시점
|
||||||
|
- `e11.el05`: 인도·퇴거·철거·수거·방해제거 행위 후보
|
||||||
|
- `e11.el06`: 점유의 사실 경위와 주장 법적 원인
|
||||||
|
- `e11.op01`: 임대차·유치권·사용대차·동시이행 등 점유권원 주장
|
||||||
|
- `e11.op02`: 점유 종료·인도 완료·대상 불특정 주장
|
||||||
|
- `e11.op03`: 상린관계상 수인의무 또는 권리남용 후보
|
||||||
|
|
||||||
|
## 실행 workflow
|
||||||
|
|
||||||
|
1. 각 source가 slice membership 안에 있는지 검증하고 meeting-only 진술을 증거로 승격하지 않는다.
|
||||||
|
2. 법률행위·사실행위·상태·평가 입력을 분리하되 동일 event의 증거를 문서별 seed로 과분할하지 않는다.
|
||||||
|
3. 원고에게 유리한 사실과 반대사실·항변·충돌 자료를 같은 proof grade로 병렬 보존한다.
|
||||||
|
4. legacy payload 의미와 source provenance를 extension에 투영하고, 신규 필드는 additive로만 사용한다.
|
||||||
|
5. 계산 `CE-04·CE-07`에는 결과값이나 법정 수치를 쓰지 않고 operand·기준일·누락·scenario 필요성만 전달한다.
|
||||||
|
6. Part 3에는 등록 structure type 후보와 source refs를 보내고, Part 4에는 이 pack의 effect projection과 gate 결과를 전달한다.
|
||||||
|
7. 최종 법률평가·청구선택·책임범위·계산값은 생성하지 않는다.
|
||||||
|
|
||||||
|
## 금지규칙
|
||||||
|
|
||||||
|
- 사건 종류명·단일 법률용어·문서 제목만으로 활성하지 않는다.
|
||||||
|
- 반대증거, 불리한 사실, 누락 operand, 상충하는 날짜·금액·자산 표시를 삭제하거나 빈 배열로 위장하지 않는다.
|
||||||
|
- 법정률·기간·상한 숫자를 프롬프트에 고정하지 않는다. SG-04와 해당 계산 registry가 정하는 versioned input만 참조한다.
|
||||||
|
- 미등록 효과를 `general_legal_effect`로 침묵 강등하지 않고 `UNROUTED_ISSUE_REVIEW` 또는 등록 gate로 보낸다.
|
||||||
|
|
||||||
|
## 점유 2-track 규칙
|
||||||
|
|
||||||
|
- 현실 점유·사용의 사건과 당사자가 주장하는 법적 원인을 별도 배열로 보존한다.
|
||||||
|
- 동일 자산·중첩 기간에 `유치권행사중`과 `무권원주장` 등 양립 곤란한 원인이 있으면 `POSSESSION_CAUSE_CONFLICT`를 발행하되 어느 원인이 우선하는지는 판단하지 않는다.
|
||||||
|
|
||||||
|
## 출력 계약
|
||||||
|
|
||||||
|
root는 `stage_b_domain_bo_seed_output`, schema version은 `task_c_bo_stage_b_domain_bo_seed.v3`이다. `final_conclusion_forbidden=true`와 source membership, strict JSON, review 비감소 규칙을 지킨다. domain payload는 `extensions.domain_payload.payload`에만 기록하고 `domain_extension.schema.json`을 통과해야 한다.
|
||||||
+1
File diff suppressed because one or more lines are too long
+49
@@ -0,0 +1,49 @@
|
|||||||
|
# E-12 seed prompt overlay — 공유·경계·분할·집합건물
|
||||||
|
|
||||||
|
## 임무와 법리 경계
|
||||||
|
|
||||||
|
이 overlay의 범위는 공유지분·공유물의 보존·관리·변경·처분, 사용수익·지료, 협의·재판상 공유물분할, 경계확정, 집합건물의 전유·공용부분·대지사용권·관리단·관리비이다. 소유권 반환·방해배제는 E-11, 부당이득은 E-04, 등기원인은 E-09와 병행한다. 경계확정은 소유권 범위확인과 구별한다.
|
||||||
|
|
||||||
|
`final_conclusion_forbidden=true`이다. Stage 1은 청구권 성립, 무효·취소·책임·소지인 자격, 분할방법, 손해액, 기간 도과 또는 특별법 적용의 최종 결론을 내리지 않는다. 판례는 추출 질문과 쟁점 구조를 만드는 통제자료이고 사건별 결론을 복제하는 routing 규칙이 아니다.
|
||||||
|
|
||||||
|
## Part 1 라우팅 — fail-open 3-tier
|
||||||
|
|
||||||
|
1. **active**: 독립된 evidence source가 두 개 이상의 핵심 증거구성요소를 지지하고 source membership을 통과한다.
|
||||||
|
2. **monitor**: meeting-only, event candidate-only 또는 사건명·평가어·법률명만 있는 경우 후보를 보존하되 증거로 승격하지 않는다.
|
||||||
|
3. **active_with_review**: positive source가 있으나 필수 원천이 누락되거나 서로 충돌하면 후보를 삭제하지 않고 hard review와 함께 실행한다.
|
||||||
|
|
||||||
|
negative cue는 confidence 강등 또는 monitor 전환 근거일 뿐 이미 확인된 positive evidence를 삭제하지 않는다. 사건명·청구명·당사자명·과거 fixture 문구를 runtime lookup key로 쓰지 않는다. 어느 leaf에도 닫히지 않는 중요한 사실은 E-00의 `UNROUTED_ISSUE_REVIEW`로 가시화한다.
|
||||||
|
|
||||||
|
## 증거기반 추출 순서
|
||||||
|
|
||||||
|
1. 공유자·구분소유자·승계인과 지분·권리변동 특정을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
2. 공유물·필지·전유·공용·대지사용권 객체와 계보을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
3. 점유·사용·수익·비용부담과 배타사용 경위을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
4. 보존·관리·변경·처분행위의 내용·시점·주체을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
5. 동의·집회·결의·규약·소집·의결권 자료을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
6. 분할금지 약정·특별법 제한·협의 경과와 공동소유 존속을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
7. 현물·대금·가격배상 후보와 형상·이용·가치·담보 자료을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
8. 지적공부·도면·측량성과·기술적 오류·현황경계 자료을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
9. 관리단·관리인·규약·관리비 항목·부과·승계 자료을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
10. 가치·임료·관리비·분할 기준일과 법령 version 후보을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
|
||||||
|
모든 후보는 `source_refs`, `negative_or_conflicting_refs`, `status`, 관련 slot을 갖는다. meeting clause만 있는 후보의 documentary `evidence_refs`는 비워 두며 `proof_grade=client_statement` 경계를 보존한다. 원천에 없는 당사자·일자·금액·법률행위를 추정하지 않는다.
|
||||||
|
|
||||||
|
## 특별법·전문 profile
|
||||||
|
|
||||||
|
특별법 또는 제외 트랙 접점이 발견되면 적용을 단정하지 않고 SG-04와 profile/review queue에 보존한다. 공법 접점에는 `PUBLIC_LAW_NEXUS_REVIEW`, 가사·행정·보전신청 등 범위 경계에는 `TRACK_BOUNDARY_REVIEW`를 발행한다.
|
||||||
|
|
||||||
|
## 계산·법령 version 경계
|
||||||
|
|
||||||
|
CE-04, CE-11에는 계산값이나 법적 기준의 최종 선택을 보내지 않는다. operand, source refs, `ready|partial|blocked`, unresolved legal input, 필요한 law-version 후보만 SG-04·SG-11로 전달한다. 법정률·기간·한도·정족수·산식·반올림 수치를 이 prompt나 Python에 상수로 두지 않는다. 결과를 바꾸는 operand가 없으면 단일값 대신 scenario 또는 `BLOCKED`를 보존한다. Stage 2만 최종 계산·청구금액을 확정한다.
|
||||||
|
|
||||||
|
## Part 3·Part 4·Stage 2 closure
|
||||||
|
|
||||||
|
- canonical root: `stage_b_domain_bo_seed_output`
|
||||||
|
- schema: `task_c_bo_stage_b_domain_bo_seed.v3`
|
||||||
|
- BO type: `event|state`; 등록된 structure type만 사용
|
||||||
|
- Part 4는 `effect_projection.schema.json`, `module_role_projection.json`, `gates.json`으로 투영하고 미등록 효과의 침묵 fallback을 금지한다.
|
||||||
|
- Stage 2 handoff에는 요소·반대사실·방어·source provenance·evidence slot·calculation state·미해결 review를 보존한다.
|
||||||
|
- 출력은 strict JSON이며 complaint prose와 최종 법률결론을 생성하지 않는다.
|
||||||
|
|
||||||
|
최종 법률결론과 최종 청구액을 확정하지 않는다. 원천 참조와 미해결 review code를 보존한다.
|
||||||
+422
@@ -0,0 +1,422 @@
|
|||||||
|
{
|
||||||
|
"schema_version": "stage1_domain_config.v1",
|
||||||
|
"domain_id": "E-13",
|
||||||
|
"label_ko": "책임재산 보전·채권자대위·채권자취소",
|
||||||
|
"slug": "creditor_preservation",
|
||||||
|
"kind": "leaf",
|
||||||
|
"status": "active",
|
||||||
|
"execution_policy": {
|
||||||
|
"runnable": true,
|
||||||
|
"always_on": false,
|
||||||
|
"model_tier": "flash",
|
||||||
|
"output_mode": "strict_json",
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"max_instances": 1
|
||||||
|
},
|
||||||
|
"depends_on": [
|
||||||
|
"E-01",
|
||||||
|
"E-02",
|
||||||
|
"X1",
|
||||||
|
"X2",
|
||||||
|
"X3"
|
||||||
|
],
|
||||||
|
"special_law_profiles": [],
|
||||||
|
"activation_cues": {
|
||||||
|
"positive_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E13-P01",
|
||||||
|
"cue_type": "legal_relation",
|
||||||
|
"match_value": "피보전채권과 채무자의 제3자 권리 또는 재산권 목적 행위가 함께 제시됨",
|
||||||
|
"source_field": "source_universe",
|
||||||
|
"note": null,
|
||||||
|
"strength": "strong",
|
||||||
|
"weight": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E13-P02",
|
||||||
|
"cue_type": "event_kind",
|
||||||
|
"match_value": "처분 전후 적극재산·소극재산·선순위권·실현가치 자료",
|
||||||
|
"source_field": "source_universe",
|
||||||
|
"note": null,
|
||||||
|
"strength": "strong",
|
||||||
|
"weight": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E13-P03",
|
||||||
|
"cue_type": "party_role",
|
||||||
|
"match_value": "수익자·전득자·대가·관계·인지 상태 자료",
|
||||||
|
"source_field": "source_universe",
|
||||||
|
"note": null,
|
||||||
|
"strength": "support",
|
||||||
|
"weight": 0.5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E13-P04",
|
||||||
|
"cue_type": "relief",
|
||||||
|
"match_value": "원물반환·말소·가액배상·회복범위 산정 입력",
|
||||||
|
"source_field": "source_universe",
|
||||||
|
"note": null,
|
||||||
|
"strength": "support",
|
||||||
|
"weight": 0.5
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"negative_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E13-N01",
|
||||||
|
"cue_type": "other",
|
||||||
|
"match_value": "단순 채무불이행 또는 담보설정만 있고 책임재산 보전 목적·처분 전후 재산상태 자료가 없음",
|
||||||
|
"source_field": "source_universe",
|
||||||
|
"note": "E-02·E-10을 우선하되 E-13 monitor 후보를 삭제하지 않는다",
|
||||||
|
"effect": "confidence_downrank_only",
|
||||||
|
"weight": 1.0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"conflict_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E13-C01",
|
||||||
|
"rule": "처분 전후 자산·부채·선순위권·가치 자료가 충돌함",
|
||||||
|
"left_refs": [],
|
||||||
|
"right_refs": [],
|
||||||
|
"effect": "hard_review",
|
||||||
|
"review_code": "E13_BALANCE_SHEET_CONFLICT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E13-C02",
|
||||||
|
"rule": "대가 지급·정상거래·선의 자료와 해함 인식 자료가 충돌함",
|
||||||
|
"left_refs": [],
|
||||||
|
"right_refs": [],
|
||||||
|
"effect": "hard_review",
|
||||||
|
"review_code": "E13_CONSIDERATION_OR_GOOD_FAITH_CONFLICT"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"routing_policy": {
|
||||||
|
"fail_open": true,
|
||||||
|
"candidate_downgrade_forbidden": true,
|
||||||
|
"minimum_primary_evidence": 1,
|
||||||
|
"leaf_activation_threshold": 1.0,
|
||||||
|
"monitor_threshold": 0.5,
|
||||||
|
"unknown_review_code": "UNROUTED_ISSUE_REVIEW"
|
||||||
|
},
|
||||||
|
"element_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "e13.el01",
|
||||||
|
"label": "피보전채권 발생원인·금액·이행기",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E13_PRESERVED_CLAIM_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e13.el02",
|
||||||
|
"label": "피대위권리·채무자의 불행사·보전 필요성 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e13.el03",
|
||||||
|
"label": "채무자의 재산권 목적 처분행위와 시점",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E13_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e13.el04",
|
||||||
|
"label": "처분 전후 공동담보·적극재산·소극재산·선순위권",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E13_BALANCE_SHEET_INCOMPLETE_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e13.el05",
|
||||||
|
"label": "수익자·전득자 chain과 인식·대가 자료",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e13.el06",
|
||||||
|
"label": "원물반환·가액배상 대상과 상한 입력",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e13.el07",
|
||||||
|
"label": "행위일·원인 인지일·기간 기준 사실",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"opposing_fact_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "e13.op01",
|
||||||
|
"label": "충분한 잔존 책임재산·자력 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e13.op02",
|
||||||
|
"label": "정상거래·상당한 대가·수익자 또는 전득자 선의 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e13.op03",
|
||||||
|
"label": "피보전채권 부존재·후발성·기간 도과 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"evidence_components": [
|
||||||
|
{
|
||||||
|
"component_id": "e13.preserved_claim",
|
||||||
|
"label": "채권 발생·금액·이행기·채무승인 자료",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "preserved_claim"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "e13.disposition",
|
||||||
|
"label": "계약·등기·송금·담보설정 등 처분 자료",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "debtor_act"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "e13.balance_sheet",
|
||||||
|
"label": "처분 전후 재산·채무·선순위권·가치 자료",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "insolvency_operand"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "e13.beneficiary_chain",
|
||||||
|
"label": "수익자·전득자·대가·관계·인식 자료",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "knowledge_and_defense"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "e13.remedy_value",
|
||||||
|
"label": "원물반환 가능성·가액·담보부담·상한 자료",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "remedy_operand"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"defense_map": [
|
||||||
|
{
|
||||||
|
"defense_id": "e13.solvency",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"e13.op01"
|
||||||
|
],
|
||||||
|
"review_code": "E13_BALANCE_SHEET_CONFLICT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defense_id": "e13.good_faith",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"e13.op02"
|
||||||
|
],
|
||||||
|
"review_code": "E13_CONSIDERATION_OR_GOOD_FAITH_CONFLICT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defense_id": "e13.time_or_claim",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"e13.op03"
|
||||||
|
],
|
||||||
|
"review_code": "E13_TIME_BAR_DATE_CONFLICT"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"calculation_bindings": [
|
||||||
|
"CE-03",
|
||||||
|
"CE-04",
|
||||||
|
"CE-10"
|
||||||
|
],
|
||||||
|
"emits_signals": [
|
||||||
|
"SG-02",
|
||||||
|
"SG-04",
|
||||||
|
"SG-05",
|
||||||
|
"SG-06",
|
||||||
|
"SG-07",
|
||||||
|
"SG-08",
|
||||||
|
"SG-09",
|
||||||
|
"SG-10",
|
||||||
|
"SG-11",
|
||||||
|
"SG-12",
|
||||||
|
"SG-13"
|
||||||
|
],
|
||||||
|
"bo_types": [
|
||||||
|
"event",
|
||||||
|
"state"
|
||||||
|
],
|
||||||
|
"structure_types": [
|
||||||
|
{
|
||||||
|
"type_id": "fraudulent_transfer",
|
||||||
|
"priority_rank": 7,
|
||||||
|
"module": "actio",
|
||||||
|
"role_projection": "actio_roles"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_id": "preserved_claim",
|
||||||
|
"priority_rank": 8,
|
||||||
|
"module": "actio",
|
||||||
|
"role_projection": "claim_chain_ref"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_id": "actio_remedy_or_cap",
|
||||||
|
"priority_rank": 9,
|
||||||
|
"module": "actio",
|
||||||
|
"role_projection": "linked_actio_structures"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"effect_projection": {
|
||||||
|
"schema_ref": "Default_Agent/domains/E-13/effect_projection.schema.json",
|
||||||
|
"module": "actio",
|
||||||
|
"role_projection": "actio_roles"
|
||||||
|
},
|
||||||
|
"gates": [
|
||||||
|
{
|
||||||
|
"gate_id": "E13-G01",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-13/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E13_REQUIRED_ELEMENT_GAP_REVIEW",
|
||||||
|
"E13_PRESERVED_CLAIM_GAP_REVIEW",
|
||||||
|
"E13_BALANCE_SHEET_INCOMPLETE_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E13-G02",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-13/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E13_BALANCE_SHEET_CONFLICT"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E13-G03",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-13/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E13_CONSIDERATION_OR_GOOD_FAITH_CONFLICT"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E13-G04",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-13/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E13_TIME_BAR_DATE_CONFLICT"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E13-G05",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-13/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E13_THEORY_TRACK_MERGE_BLOCKED",
|
||||||
|
"FINAL_LEGAL_CONCLUSION_BLOCKED"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"review_codes": [
|
||||||
|
"E13_REQUIRED_ELEMENT_GAP_REVIEW",
|
||||||
|
"E13_PRESERVED_CLAIM_GAP_REVIEW",
|
||||||
|
"E13_BALANCE_SHEET_INCOMPLETE_REVIEW",
|
||||||
|
"E13_BALANCE_SHEET_CONFLICT",
|
||||||
|
"E13_CONSIDERATION_OR_GOOD_FAITH_CONFLICT",
|
||||||
|
"E13_TIME_BAR_DATE_CONFLICT",
|
||||||
|
"E13_THEORY_TRACK_MERGE_BLOCKED",
|
||||||
|
"FINAL_LEGAL_CONCLUSION_BLOCKED"
|
||||||
|
],
|
||||||
|
"contract_guards": {
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"unknown_values_require_review": true,
|
||||||
|
"source_membership_required": true,
|
||||||
|
"strict_json_output": true,
|
||||||
|
"meeting_only_evidence_promotion_forbidden": true
|
||||||
|
},
|
||||||
|
"prompt_overlay_ref": "seed_prompt_overlay.md",
|
||||||
|
"profile_schema_ref": "profile.schema.json",
|
||||||
|
"extension_schema_ref": "domain_extension.schema.json",
|
||||||
|
"runtime_activation_from_legacy_alias_forbidden": true,
|
||||||
|
"case_kind_name_runtime_lookup_forbidden": true,
|
||||||
|
"removed_noncanonical_signal_aliases": [
|
||||||
|
"domain_signal"
|
||||||
|
]
|
||||||
|
}
|
||||||
+56
@@ -0,0 +1,56 @@
|
|||||||
|
# E-13 seed prompt overlay — 책임재산 보전·채권자대위·채권자취소
|
||||||
|
|
||||||
|
## 임무와 입력 경계
|
||||||
|
|
||||||
|
현재 `stage_b_domain_slice.v2`의 `selected_sources`, `support_refs`, `review_only_refs`와 그 source ID가 가리키는 slice 내부 원천만 사용한다. 전체 사건 파일, 사건명, 당사자명 또는 특정 날짜를 이용해 도메인을 확정하지 않는다. 동일 사건·상태를 지지하는 원천은 하나의 seed로 묶되 법률효과가 다른 사건과 상태는 분리한다.
|
||||||
|
|
||||||
|
## legacy `B4` 의미 보존 범위
|
||||||
|
|
||||||
|
- 피보전채권 bundle
|
||||||
|
- 채무자 처분행위와 책임재산 감소
|
||||||
|
- 처분 전후 balance sheet·담보·평가
|
||||||
|
- 수익자·전득자·선의·악의·대가
|
||||||
|
- 원물반환·가액배상·회복 범위·상한
|
||||||
|
- 제척기간과 방어·재항변 후보
|
||||||
|
|
||||||
|
위 범위는 기능 확장이 아니라 legacy delta의 무손실 분해다. legacy field는 `extensions.domain_payload.payload`의 명시 필드와 `legacy_*_projection`에 source refs를 포함하여 보존한다.
|
||||||
|
|
||||||
|
## 사실 슬롯
|
||||||
|
|
||||||
|
- `e13.el01`: 피보전채권 발생원인·금액·이행기
|
||||||
|
- `e13.el02`: 피대위권리·채무자의 불행사·보전 필요성 후보
|
||||||
|
- `e13.el03`: 채무자의 재산권 목적 처분행위와 시점
|
||||||
|
- `e13.el04`: 처분 전후 공동담보·적극재산·소극재산·선순위권
|
||||||
|
- `e13.el05`: 수익자·전득자 chain과 인식·대가 자료
|
||||||
|
- `e13.el06`: 원물반환·가액배상 대상과 상한 입력
|
||||||
|
- `e13.el07`: 행위일·원인 인지일·기간 기준 사실
|
||||||
|
- `e13.op01`: 충분한 잔존 책임재산·자력 후보
|
||||||
|
- `e13.op02`: 정상거래·상당한 대가·수익자 또는 전득자 선의 후보
|
||||||
|
- `e13.op03`: 피보전채권 부존재·후발성·기간 도과 후보
|
||||||
|
|
||||||
|
## 실행 workflow
|
||||||
|
|
||||||
|
1. 각 source가 slice membership 안에 있는지 검증하고 meeting-only 진술을 증거로 승격하지 않는다.
|
||||||
|
2. 법률행위·사실행위·상태·평가 입력을 분리하되 동일 event의 증거를 문서별 seed로 과분할하지 않는다.
|
||||||
|
3. 원고에게 유리한 사실과 반대사실·항변·충돌 자료를 같은 proof grade로 병렬 보존한다.
|
||||||
|
4. legacy payload 의미와 source provenance를 extension에 투영하고, 신규 필드는 additive로만 사용한다.
|
||||||
|
5. 계산 `CE-03·CE-04·CE-10`에는 결과값이나 법정 수치를 쓰지 않고 operand·기준일·누락·scenario 필요성만 전달한다.
|
||||||
|
6. Part 3에는 등록 structure type 후보와 source refs를 보내고, Part 4에는 이 pack의 effect projection과 gate 결과를 전달한다.
|
||||||
|
7. 최종 법률평가·청구선택·책임범위·계산값은 생성하지 않는다.
|
||||||
|
|
||||||
|
## 금지규칙
|
||||||
|
|
||||||
|
- 사건 종류명·단일 법률용어·문서 제목만으로 활성하지 않는다.
|
||||||
|
- 반대증거, 불리한 사실, 누락 operand, 상충하는 날짜·금액·자산 표시를 삭제하거나 빈 배열로 위장하지 않는다.
|
||||||
|
- 법정률·기간·상한 숫자를 프롬프트에 고정하지 않는다. SG-04와 해당 계산 registry가 정하는 versioned input만 참조한다.
|
||||||
|
- 미등록 효과를 `general_legal_effect`로 침묵 강등하지 않고 `UNROUTED_ISSUE_REVIEW` 또는 등록 gate로 보낸다.
|
||||||
|
|
||||||
|
## B4 전량 승계 규칙
|
||||||
|
|
||||||
|
- `preserved_claim_bundle`, `fraudulent_transfer_facts`, `debtor_act_hints`, `balance_sheet`, `encumbrance_timeline`, `valuation_matrix`, `remedy_mode_hints`, `value_compensation_cap_hints`, `beneficiary_transferee_hints`, `bad_faith_good_faith_hints`, `defense_rebuttal`을 값이 있는 한 누락하지 않는다.
|
||||||
|
- 채권자대위와 채권자취소를 별도 `theory_tracks`로 유지하고, 사해성·무자력·악의·선의·제척기간·취소범위를 최종 판단하지 않는다.
|
||||||
|
- `actio_remedy_or_cap`은 Part 4의 `actio / linked_actio_structures`로 명시 투영하여 S0 누락을 해소한다.
|
||||||
|
|
||||||
|
## 출력 계약
|
||||||
|
|
||||||
|
root는 `stage_b_domain_bo_seed_output`, schema version은 `task_c_bo_stage_b_domain_bo_seed.v3`이다. `final_conclusion_forbidden=true`와 source membership, strict JSON, review 비감소 규칙을 지킨다. domain payload는 `extensions.domain_payload.payload`에만 기록하고 `domain_extension.schema.json`을 통과해야 한다.
|
||||||
+399
@@ -0,0 +1,399 @@
|
|||||||
|
{
|
||||||
|
"schema_version": "stage1_domain_config.v1",
|
||||||
|
"domain_id": "E-14",
|
||||||
|
"label_ko": "채권집행 연계 본안",
|
||||||
|
"slug": "execution_linked_claims",
|
||||||
|
"kind": "leaf",
|
||||||
|
"status": "active",
|
||||||
|
"execution_policy": {
|
||||||
|
"runnable": true,
|
||||||
|
"always_on": false,
|
||||||
|
"model_tier": "pro",
|
||||||
|
"output_mode": "strict_json",
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"max_instances": 8
|
||||||
|
},
|
||||||
|
"depends_on": [
|
||||||
|
"E-01"
|
||||||
|
],
|
||||||
|
"special_law_profiles": [],
|
||||||
|
"activation_cues": {
|
||||||
|
"positive_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E14-P01",
|
||||||
|
"cue_type": "evidence_component",
|
||||||
|
"match_value": "채권압류·추심명령·전부명령의 정본, 사건표시, 송달 및 확정 상태를 식별하는 원천",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "사건명 단일 키워드가 아니라 원천 조합으로 평가",
|
||||||
|
"weight": 1.0,
|
||||||
|
"strength": "strong"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E14-P02",
|
||||||
|
"cue_type": "legal_relation",
|
||||||
|
"match_value": "집행채권·피압류채권·채무자·제3채무자·전부채권자 또는 추심채권자의 동일성을 연결하는 원천",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "사건명 단일 키워드가 아니라 원천 조합으로 평가",
|
||||||
|
"weight": 1.0,
|
||||||
|
"strength": "strong"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E14-P03",
|
||||||
|
"cue_type": "relief",
|
||||||
|
"match_value": "전부금·추심금·압류채권대금·공탁금 출급/회수권 확인 또는 청구이의·제3자이의·배당이의의 실체 사유",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "사건명 단일 키워드가 아니라 원천 조합으로 평가",
|
||||||
|
"weight": 1.0,
|
||||||
|
"strength": "strong"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E14-P04",
|
||||||
|
"cue_type": "event_kind",
|
||||||
|
"match_value": "변제·상계·면제·시효·소유권·담보순위 등 집행 또는 배당 결과에 영향을 줄 실체법상 발생·변경·소멸 사실",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "사건명 단일 키워드가 아니라 원천 조합으로 평가",
|
||||||
|
"weight": 0.7,
|
||||||
|
"strength": "support"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"negative_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E14-N01",
|
||||||
|
"cue_type": "other",
|
||||||
|
"match_value": "압류·추심·전부 또는 집행 신청 절차의 안내만 있고 집행권원·피압류채권·실체 사유 원천이 없는 자료",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "사건명 단일 키워드가 아니라 원천 조합으로 평가",
|
||||||
|
"weight": 0.7,
|
||||||
|
"effect": "monitor_review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E14-N02",
|
||||||
|
"cue_type": "relief",
|
||||||
|
"match_value": "가압류·가처분 등 보전신청 또는 집행신청 자체만을 최종 목표로 하는 자료",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "사건명 단일 키워드가 아니라 원천 조합으로 평가",
|
||||||
|
"weight": 0.6,
|
||||||
|
"effect": "confidence_downrank_only"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E14-N03",
|
||||||
|
"cue_type": "term",
|
||||||
|
"match_value": "일상적 의미의 집행·압류라는 단어만 있고 법원 명령·채권·배당 관계가 없는 자료",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "사건명 단일 키워드가 아니라 원천 조합으로 평가",
|
||||||
|
"weight": 0.8,
|
||||||
|
"effect": "confidence_downrank_only"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"conflict_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E14-C01",
|
||||||
|
"rule": "명령의 종류·사건표시·송달일·확정 여부 또는 압류 경합 자료가 서로 불일치",
|
||||||
|
"left_refs": [],
|
||||||
|
"right_refs": [],
|
||||||
|
"effect": "hard_review",
|
||||||
|
"review_code": "E14_ORDER_SERVICE_FINALITY_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E14-C02",
|
||||||
|
"rule": "피압류채권의 발생 원인·당사자·금액·소멸 또는 이의 사유의 기준시점이 서로 불일치",
|
||||||
|
"left_refs": [],
|
||||||
|
"right_refs": [],
|
||||||
|
"effect": "hard_review",
|
||||||
|
"review_code": "E14_SOURCE_CONFLICT_REVIEW"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"routing_policy": {
|
||||||
|
"fail_open": true,
|
||||||
|
"candidate_downgrade_forbidden": true,
|
||||||
|
"minimum_primary_evidence": 0,
|
||||||
|
"leaf_activation_threshold": 1.0,
|
||||||
|
"monitor_threshold": 0.5,
|
||||||
|
"unknown_review_code": "UNROUTED_ISSUE_REVIEW"
|
||||||
|
},
|
||||||
|
"element_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "e14.el01",
|
||||||
|
"label": "집행권원·집행채권과 당사자 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E14_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e14.el02",
|
||||||
|
"label": "압류·추심·전부명령의 사건표시·주문·송달·확정 상태",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E14_ORDER_SERVICE_FINALITY_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e14.el03",
|
||||||
|
"label": "피압류채권의 발생 원인·채무자·제3채무자·범위·존속 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E14_ATTACHED_CLAIM_IDENTITY_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e14.el04",
|
||||||
|
"label": "공탁 원인·공탁물·피공탁자·출급/회수권 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e14.el05",
|
||||||
|
"label": "청구이의·제3자이의·배당이의의 실체 사유와 발생 시점 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E14_SUBSTANTIVE_GROUND_TIMING_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e14.el06",
|
||||||
|
"label": "CE-01·CE-02 operand 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "MISSING_REQUIRED_OPERAND"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"opposing_fact_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "e14.op01",
|
||||||
|
"label": "피압류채권 부존재·소멸·상계·동시이행·시효 항변 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e14.op02",
|
||||||
|
"label": "압류 경합·선행 양도·우선권·배당순위·제3자 권리 항변 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e14.op03",
|
||||||
|
"label": "이의 사유의 기준시 후 발생 여부·소의 이익·당사자적격 다툼 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"evidence_components": [
|
||||||
|
{
|
||||||
|
"component_id": "e14.execution_title",
|
||||||
|
"label": "집행권원과 집행채권 원천",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "execution_title"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "e14.court_order",
|
||||||
|
"label": "압류·추심·전부명령 정본과 송달·확정 원천",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "order_scope_and_effect"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "e14.attached_claim",
|
||||||
|
"label": "피압류채권의 발생·범위·존속 원천",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "attached_claim_identity"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "e14.deposit",
|
||||||
|
"label": "공탁서·공탁통지·출급/회수 청구 원천",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "deposit_right"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "e14.substantive_ground",
|
||||||
|
"label": "변제·상계·소유권·순위 등 이의의 실체 사유 원천",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "substantive_ground"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "e14.distribution",
|
||||||
|
"label": "배당표·배당기일조서·배당요구·이의 원천",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "distribution_entitlement"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"defense_map": [
|
||||||
|
{
|
||||||
|
"defense_id": "e14.attached_claim_nonexistence",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"e14.op01"
|
||||||
|
],
|
||||||
|
"review_code": "E14_ATTACHED_CLAIM_IDENTITY_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defense_id": "e14.priority_or_third_party_right",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"e14.op02"
|
||||||
|
],
|
||||||
|
"review_code": "E14_EXECUTION_OVERLAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defense_id": "e14.procedural_posture",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"e14.op03"
|
||||||
|
],
|
||||||
|
"review_code": "E14_RELIEF_POSTURE_REVIEW"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"calculation_bindings": [
|
||||||
|
"CE-01",
|
||||||
|
"CE-02"
|
||||||
|
],
|
||||||
|
"emits_signals": [
|
||||||
|
"SG-01",
|
||||||
|
"SG-02",
|
||||||
|
"SG-03",
|
||||||
|
"SG-04",
|
||||||
|
"SG-05",
|
||||||
|
"SG-06",
|
||||||
|
"SG-07",
|
||||||
|
"SG-09",
|
||||||
|
"SG-10",
|
||||||
|
"SG-11",
|
||||||
|
"SG-12",
|
||||||
|
"SG-13",
|
||||||
|
"domain_signal"
|
||||||
|
],
|
||||||
|
"bo_types": [
|
||||||
|
"event",
|
||||||
|
"state",
|
||||||
|
"claim"
|
||||||
|
],
|
||||||
|
"structure_types": [
|
||||||
|
{
|
||||||
|
"type_id": "execution_linked_claim",
|
||||||
|
"priority_rank": 14,
|
||||||
|
"module": "execution_linked_claims",
|
||||||
|
"role_projection": "linked_execution_claims"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"effect_projection": {
|
||||||
|
"schema_ref": "Default_Agent/domains/E-14/effect_projection.schema.json",
|
||||||
|
"module": "execution_linked_claims",
|
||||||
|
"role_projection": "linked_execution_claims"
|
||||||
|
},
|
||||||
|
"gates": [
|
||||||
|
{
|
||||||
|
"gate_id": "E14-G01",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-14/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E14_REQUIRED_ELEMENT_GAP_REVIEW",
|
||||||
|
"E14_ORDER_SERVICE_FINALITY_REVIEW",
|
||||||
|
"E14_ATTACHED_CLAIM_IDENTITY_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E14-G02",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-14/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E14_EXECUTION_OVERLAP_REVIEW",
|
||||||
|
"E14_PROCEDURE_ONLY_REVIEW",
|
||||||
|
"TRACK_BOUNDARY_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E14-G03",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-14/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"MISSING_REQUIRED_OPERAND",
|
||||||
|
"CALCULATION_BLOCKED_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"review_codes": [
|
||||||
|
"E14_REQUIRED_ELEMENT_GAP_REVIEW",
|
||||||
|
"E14_ORDER_SERVICE_FINALITY_REVIEW",
|
||||||
|
"E14_ATTACHED_CLAIM_IDENTITY_REVIEW",
|
||||||
|
"E14_SUBSTANTIVE_GROUND_TIMING_REVIEW",
|
||||||
|
"E14_EXECUTION_OVERLAP_REVIEW",
|
||||||
|
"E14_PROCEDURE_ONLY_REVIEW",
|
||||||
|
"E14_SOURCE_CONFLICT_REVIEW",
|
||||||
|
"E14_RELIEF_POSTURE_REVIEW",
|
||||||
|
"MISSING_REQUIRED_OPERAND",
|
||||||
|
"CALCULATION_BLOCKED_REVIEW",
|
||||||
|
"MEETING_ONLY_PROOF_REVIEW",
|
||||||
|
"TRACK_BOUNDARY_REVIEW",
|
||||||
|
"UNROUTED_ISSUE_REVIEW"
|
||||||
|
],
|
||||||
|
"contract_guards": {
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"unknown_values_require_review": true,
|
||||||
|
"source_membership_required": true,
|
||||||
|
"strict_json_output": true,
|
||||||
|
"meeting_only_evidence_promotion_forbidden": true
|
||||||
|
},
|
||||||
|
"prompt_overlay_ref": "seed_prompt_overlay.md",
|
||||||
|
"profile_schema_ref": "Default_Agent/domains/E-14/domain_profile.schema.json",
|
||||||
|
"extension_schema_ref": "domain_extension.schema.json"
|
||||||
|
}
|
||||||
+27
@@ -0,0 +1,27 @@
|
|||||||
|
# E-14 채권집행 연계 본안 S3 seed overlay
|
||||||
|
|
||||||
|
## 목적
|
||||||
|
|
||||||
|
이 overlay는 137종 민사 본안에 재사용되는 evidence/cue 기반 leaf worker 계약이다. 사건명·당사자·특정 날짜를 runtime 분기로 사용하지 않으며, 활성 여부는 SG-01의 source-backed cue 조합으로만 판단한다.
|
||||||
|
|
||||||
|
## 공통 추론 규칙
|
||||||
|
|
||||||
|
1. slice에 포함된 `source_id`만 읽고 각 후보의 `source_refs`를 보존한다.
|
||||||
|
2. 증거, event candidate, meeting clause를 구분한다. meeting-only 진술은 documentary evidence로 승격하지 않고 `MEETING_ONLY_PROOF_REVIEW`를 유지한다.
|
||||||
|
3. 지지·반대·충돌·누락 사실을 함께 출력하고, unknown을 추정하거나 review를 침묵 삭제하지 않는다.
|
||||||
|
4. root는 `stage_b_domain_bo_seed_output`, schema는 `task_c_bo_stage_b_domain_bo_seed.v3`이며 strict JSON만 출력한다.
|
||||||
|
5. 계산 binding CE-01, CE-02은 operand 완전성·scenario 요청만 생성한다. 법정 수치·최종액은 S4/Stage 2 권한이다.
|
||||||
|
|
||||||
|
## 도메인 규칙
|
||||||
|
|
||||||
|
1. 전부금·추심금·압류채권대금은 집행권원, 집행채권, 압류/추심/전부명령, 피압류채권, 채무자와 제3채무자, 송달·확정 자료를 별도 사실 후보로 분해한다.
|
||||||
|
2. 공탁금 출급·회수청구권은 공탁 원인·공탁물·피공탁자·반대청구와 공탁서 원천을 분리하며 권리 귀속을 단정하지 않는다.
|
||||||
|
3. 청구이의·제3자이의·배당이의는 이의의 실체 사유와 발생시점, 권리귀속·우선순위 자료를 보존하되 소의 적법성·집행 배제·배당 결과를 확정하지 않는다.
|
||||||
|
4. 변제·상계·채권 존부는 E-02, 소유권·등기는 E-09, 담보·배당은 E-10, 채권자보전은 E-13, 청구형태·적격·신청절차 경계는 X3에 source-backed handoff한다. 동일 사실의 원천을 삭제하거나 중복 결론으로 바꾸지 않는다.
|
||||||
|
5. 압류·추심·전부·배당 신청 또는 집행절차 자체를 최종 결론으로 만들지 않는다. 절차 자료만 있으면 E14_PROCEDURE_ONLY_REVIEW와 Part 1/Part 4 review를 보존한다.
|
||||||
|
|
||||||
|
## 금지 및 stop rule
|
||||||
|
|
||||||
|
- 신청·집행 절차, 청구권 성립, 당사자적격, 법률효과 또는 금액을 최종 결론으로 확정하지 않는다.
|
||||||
|
- 필수 원천이 없거나 상충하면 `READY_WITH_REVIEW`; 계산 operand가 결과를 바꾸는 수준으로 없으면 `MISSING_REQUIRED_OPERAND` 또는 `CALCULATION_BLOCKED_REVIEW`를 발행한다.
|
||||||
|
- Part 1 및 Part 4의 review는 해결 원천과 resolution record 없이 감소시키지 않는다.
|
||||||
+337
@@ -0,0 +1,337 @@
|
|||||||
|
{
|
||||||
|
"schema_version": "stage1_domain_config.v1",
|
||||||
|
"domain_id": "E-15",
|
||||||
|
"label_ko": "상속·유류분",
|
||||||
|
"slug": "succession_family_property",
|
||||||
|
"kind": "leaf",
|
||||||
|
"status": "active",
|
||||||
|
"execution_policy": {
|
||||||
|
"runnable": true,
|
||||||
|
"always_on": false,
|
||||||
|
"model_tier": "pro",
|
||||||
|
"output_mode": "strict_json",
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"max_instances": 8
|
||||||
|
},
|
||||||
|
"depends_on": [
|
||||||
|
"E-01"
|
||||||
|
],
|
||||||
|
"special_law_profiles": [],
|
||||||
|
"activation_cues": {
|
||||||
|
"positive_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E15-P01",
|
||||||
|
"cue_type": "legal_relation",
|
||||||
|
"match_value": "피상속인의 사망과 상속개시·상속순위·대습상속·법정상속분에 관한 원천",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": null,
|
||||||
|
"strength": "strong",
|
||||||
|
"weight": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E15-P02",
|
||||||
|
"cue_type": "event_kind",
|
||||||
|
"match_value": "상속포기·한정승인·유언·유증·상속회복에 관한 행위 및 재판·수리 자료",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": null,
|
||||||
|
"strength": "strong",
|
||||||
|
"weight": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E15-P03",
|
||||||
|
"cue_type": "relief",
|
||||||
|
"match_value": "유류분 반환·상속회복·상속원인 등기에 필요한 사실 및 재산·가액 원천",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": null,
|
||||||
|
"strength": "support",
|
||||||
|
"weight": 0.6
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"negative_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E15-N01",
|
||||||
|
"cue_type": "term",
|
||||||
|
"match_value": "사망이나 상속관계와 무관한 일반적 영업양수·채권양도",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "사건명 단어가 아니라 법률관계와 원천을 기준으로 분리",
|
||||||
|
"effect": "confidence_downrank_only",
|
||||||
|
"weight": 0.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E15-N02",
|
||||||
|
"cue_type": "other",
|
||||||
|
"match_value": "혼인·이혼·친권 등 가사소송 고유 신분행위",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "제외 track과 상속재산 민사부분의 경계를 X3로 보전",
|
||||||
|
"effect": "monitor_review",
|
||||||
|
"weight": 0.6
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"conflict_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E15-C01",
|
||||||
|
"rule": "피상속인·상속인·상속분을 지지하는 가족관계·신분·유언 원천이 불일치",
|
||||||
|
"left_refs": [],
|
||||||
|
"right_refs": [],
|
||||||
|
"effect": "hard_review",
|
||||||
|
"review_code": "E15_HEIR_SCOPE_CONFLICT_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E15-C02",
|
||||||
|
"rule": "포기·한정승인·유증·사전증여의 날짜·범위·효력 근거가 불일치",
|
||||||
|
"left_refs": [],
|
||||||
|
"right_refs": [],
|
||||||
|
"effect": "hard_review",
|
||||||
|
"review_code": "E15_LIFECYCLE_CONFLICT_REVIEW"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"routing_policy": {
|
||||||
|
"fail_open": true,
|
||||||
|
"candidate_downgrade_forbidden": true,
|
||||||
|
"minimum_primary_evidence": 0,
|
||||||
|
"leaf_activation_threshold": 1.0,
|
||||||
|
"monitor_threshold": 0.5,
|
||||||
|
"unknown_review_code": "UNROUTED_ISSUE_REVIEW"
|
||||||
|
},
|
||||||
|
"element_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "e15.el01",
|
||||||
|
"label": "피상속인·상속개시 및 상속순위 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E15_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e15.el02",
|
||||||
|
"label": "상속인·대습상속인·상속분 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E15_HEIR_SCOPE_CONFLICT_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e15.el03",
|
||||||
|
"label": "상속재산·채무·지분·특별수익·기여분 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E15_ASSET_SCOPE_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e15.el04",
|
||||||
|
"label": "상속포기·한정승인·유언·유증·상속회복 상태",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e15.el05",
|
||||||
|
"label": "유류분 계산 operand와 기준일·법령 버전 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "MISSING_REQUIRED_OPERAND"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"opposing_fact_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "e15.op01",
|
||||||
|
"label": "상속결격·포기·한정승인·제증·소멸시효 항변 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e15.op02",
|
||||||
|
"label": "유언 방식·능력·해석 또는 유류분 산입 범위 다툼 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"evidence_components": [
|
||||||
|
{
|
||||||
|
"component_id": "e15.family_status",
|
||||||
|
"label": "기본증명·제적·사망·가족관계 원천",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "succession_order"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "e15.estate_inventory",
|
||||||
|
"label": "상속재산·채무·등기·거래·감정 원천",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "estate_scope"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "e15.will_gift",
|
||||||
|
"label": "유언서·유증·사전증여 원천",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "disposition_or_benefit"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "e15.court_acceptance",
|
||||||
|
"label": "상속포기·한정승인·상속회복 재판·수리 자료",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "status_change"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"defense_map": [
|
||||||
|
{
|
||||||
|
"defense_id": "e15.disqualification_or_renunciation",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"e15.op01"
|
||||||
|
],
|
||||||
|
"review_code": "E15_SUCCESSION_STATUS_DEFENSE_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defense_id": "e15.will_or_reserved_share",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"e15.op02"
|
||||||
|
],
|
||||||
|
"review_code": "E15_WILL_RESERVED_SHARE_REVIEW"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"calculation_bindings": [
|
||||||
|
"CE-03",
|
||||||
|
"CE-08"
|
||||||
|
],
|
||||||
|
"emits_signals": [
|
||||||
|
"SG-01",
|
||||||
|
"SG-03",
|
||||||
|
"SG-04",
|
||||||
|
"SG-05",
|
||||||
|
"SG-06",
|
||||||
|
"SG-07",
|
||||||
|
"SG-09",
|
||||||
|
"SG-10",
|
||||||
|
"SG-11",
|
||||||
|
"SG-13"
|
||||||
|
],
|
||||||
|
"bo_types": [
|
||||||
|
"event",
|
||||||
|
"state"
|
||||||
|
],
|
||||||
|
"structure_types": [
|
||||||
|
{
|
||||||
|
"type_id": "succession_notice_lien_asset_defense",
|
||||||
|
"priority_rank": 10,
|
||||||
|
"module": "succession_notice_lien_asset_defense",
|
||||||
|
"role_projection": "linked_structures"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_id": "general_legal_effect",
|
||||||
|
"priority_rank": 11,
|
||||||
|
"module": "legal_effect",
|
||||||
|
"role_projection": "legal_effect_roles"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"effect_projection": {
|
||||||
|
"schema_ref": "Default_Agent/domains/E-15/effect_projection.schema.json",
|
||||||
|
"module": "succession_notice_lien_asset_defense",
|
||||||
|
"role_projection": "linked_structures"
|
||||||
|
},
|
||||||
|
"gates": [
|
||||||
|
{
|
||||||
|
"gate_id": "E15-G01",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-15/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E15_REQUIRED_ELEMENT_GAP_REVIEW",
|
||||||
|
"E15_HEIR_SCOPE_CONFLICT_REVIEW",
|
||||||
|
"E15_ASSET_SCOPE_GAP_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E15-G02",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-15/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E15_LIFECYCLE_CONFLICT_REVIEW",
|
||||||
|
"E15_SUCCESSION_STATUS_DEFENSE_REVIEW",
|
||||||
|
"E15_WILL_RESERVED_SHARE_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E15-G03",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-15/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E15_LAW_VERSION_REVIEW",
|
||||||
|
"MISSING_REQUIRED_OPERAND",
|
||||||
|
"TRACK_BOUNDARY_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"review_codes": [
|
||||||
|
"E15_REQUIRED_ELEMENT_GAP_REVIEW",
|
||||||
|
"E15_HEIR_SCOPE_CONFLICT_REVIEW",
|
||||||
|
"E15_ASSET_SCOPE_GAP_REVIEW",
|
||||||
|
"E15_LIFECYCLE_CONFLICT_REVIEW",
|
||||||
|
"E15_SUCCESSION_STATUS_DEFENSE_REVIEW",
|
||||||
|
"E15_WILL_RESERVED_SHARE_REVIEW",
|
||||||
|
"E15_LAW_VERSION_REVIEW",
|
||||||
|
"MISSING_REQUIRED_OPERAND",
|
||||||
|
"TRACK_BOUNDARY_REVIEW",
|
||||||
|
"UNROUTED_ISSUE_REVIEW"
|
||||||
|
],
|
||||||
|
"contract_guards": {
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"unknown_values_require_review": true,
|
||||||
|
"source_membership_required": true,
|
||||||
|
"strict_json_output": true,
|
||||||
|
"meeting_only_evidence_promotion_forbidden": true
|
||||||
|
},
|
||||||
|
"prompt_overlay_ref": "seed_prompt_overlay.md",
|
||||||
|
"profile_schema_ref": "profile.schema.json",
|
||||||
|
"extension_schema_ref": "domain_extension.schema.json",
|
||||||
|
"runtime_activation_from_legacy_alias_forbidden": true,
|
||||||
|
"case_kind_name_runtime_lookup_forbidden": true,
|
||||||
|
"removed_noncanonical_signal_aliases": [
|
||||||
|
"domain_signal"
|
||||||
|
]
|
||||||
|
}
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
# E-15 상속·유류분 seed overlay
|
||||||
|
|
||||||
|
## 승계 목적과 legacy 보존
|
||||||
|
|
||||||
|
B5의 승계·상속·자산별 승계 상태를 E-15의 상속 실체법 pack으로 무손실 이관한다. 피상속인·상속인·상속순위·상속분·포기·한정승인·유언·유증·상속회복·유류분 operand를 서로 다른 fact candidate로 보존한다.
|
||||||
|
|
||||||
|
## 작업 규칙
|
||||||
|
|
||||||
|
1. 오직 slice에 소속된 `source_id`만 사용하고 가족관계·사망·유언·재산·재판 원천을 분리한다.
|
||||||
|
2. 일반승계와 특정승계, 상속개시, 상속순위·지분, 포기·한정승인, 유언·유증, 상속회복, 유류분을 서로 다른 seed로 분할할 수 있다.
|
||||||
|
3. 상속재산·채무·특별수익·기여분·증여 가액을 CE-08 operand 후보로만 보존하고 연산 결과를 단정하지 않는다.
|
||||||
|
4. 상속순위·지분·유류분 규칙은 SG-04의 사건 기준일별 법령 버전을 받아야 하며 현행법 숫자를 prompt에 영구 하드코딩하지 않는다.
|
||||||
|
5. 신분관계의 존부나 유언 효력, 상속인 결격·포기, 유류분 부족분을 최종 판단하지 않고 충돌·누락을 review로 유지한다.
|
||||||
|
6. 상속 원인 등기 대상의 asset alias·schedule·registry ref는 X2/E-09로 연결하되 원천 표시를 변경하지 않는다.
|
||||||
|
|
||||||
|
## 출력·금지
|
||||||
|
|
||||||
|
root는 `stage_b_domain_bo_seed_output`, schema는 v3이다. 최종 청구권·상속분·유류분액·적격을 단정하지 말고, meeting-only 진술을 증거로 승격하지 말며, 필수 operand가 없으면 `MISSING_REQUIRED_OPERAND`와 review를 생성한다.
|
||||||
+1
File diff suppressed because one or more lines are too long
+49
@@ -0,0 +1,49 @@
|
|||||||
|
# E-16 seed prompt overlay — 어음·수표
|
||||||
|
|
||||||
|
## 임무와 법리 경계
|
||||||
|
|
||||||
|
이 overlay의 범위는 환어음·약속어음·수표의 형식·발행·인수·보증·배서·교부·소지인 자격·백지보충·지급제시·지급거절·소구·이득상환과 원인관계 항변이다. 예금·카드·신용장·일반 대여금은 E-02, 보증 일반은 E-03과 분리한다. 어음상 책임과 원인채무·담보 목적을 자동 동일시하지 않는다.
|
||||||
|
|
||||||
|
`final_conclusion_forbidden=true`이다. Stage 1은 청구권 성립, 무효·취소·책임·소지인 자격, 분할방법, 손해액, 기간 도과 또는 특별법 적용의 최종 결론을 내리지 않는다. 판례는 추출 질문과 쟁점 구조를 만드는 통제자료이고 사건별 결론을 복제하는 routing 규칙이 아니다.
|
||||||
|
|
||||||
|
## Part 1 라우팅 — fail-open 3-tier
|
||||||
|
|
||||||
|
1. **active**: 독립된 evidence source가 두 개 이상의 핵심 증거구성요소를 지지하고 source membership을 통과한다.
|
||||||
|
2. **monitor**: meeting-only, event candidate-only 또는 사건명·평가어·법률명만 있는 경우 후보를 보존하되 증거로 승격하지 않는다.
|
||||||
|
3. **active_with_review**: positive source가 있으나 필수 원천이 누락되거나 서로 충돌하면 후보를 삭제하지 않고 hard review와 함께 실행한다.
|
||||||
|
|
||||||
|
negative cue는 confidence 강등 또는 monitor 전환 근거일 뿐 이미 확인된 positive evidence를 삭제하지 않는다. 사건명·청구명·당사자명·과거 fixture 문구를 runtime lookup key로 쓰지 않는다. 어느 leaf에도 닫히지 않는 중요한 사실은 E-00의 `UNROUTED_ISSUE_REVIEW`로 가시화한다.
|
||||||
|
|
||||||
|
## 증거기반 추출 순서
|
||||||
|
|
||||||
|
1. 증권 종류·원본/전자기록·발행인·지급인·수취인·금액·발행·만기·지급지 특정을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
2. 법정 기재·서명·날인과 백지 여부·보충 경위을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
3. 발행·교부·인수·보증과 당사자별 행위 시점을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
4. 배서문언·배서인·피배서인·백지식·교부·연속성을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
5. 소지 경로·취득시기·정당한 소지인·악의 또는 중과실 후보을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
6. 지급제시의 시점·장소·상대방·지급거절과 증명 자료을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
7. 소구·재소구 대상·통지·보전행위·시점 후보을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
8. 보충권 수여·범위·보충 내용·남용·취득자 인식 후보을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
9. 원인채권·융통·담보 목적·변제·항변과 어음상 책임의 관계을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
10. 발행·취득·만기·제시·거절·청구 시점과 적용법 version 후보을 source ID·반대자료와 함께 후보로 추출한다.
|
||||||
|
|
||||||
|
모든 후보는 `source_refs`, `negative_or_conflicting_refs`, `status`, 관련 slot을 갖는다. meeting clause만 있는 후보의 documentary `evidence_refs`는 비워 두며 `proof_grade=client_statement` 경계를 보존한다. 원천에 없는 당사자·일자·금액·법률행위를 추정하지 않는다.
|
||||||
|
|
||||||
|
## 특별법·전문 profile
|
||||||
|
|
||||||
|
특별법 또는 제외 트랙 접점이 발견되면 적용을 단정하지 않고 SG-04와 profile/review queue에 보존한다. 공법 접점에는 `PUBLIC_LAW_NEXUS_REVIEW`, 가사·행정·보전신청 등 범위 경계에는 `TRACK_BOUNDARY_REVIEW`를 발행한다.
|
||||||
|
|
||||||
|
## 계산·법령 version 경계
|
||||||
|
|
||||||
|
CE-01, CE-03, CE-R4에는 계산값이나 법적 기준의 최종 선택을 보내지 않는다. operand, source refs, `ready|partial|blocked`, unresolved legal input, 필요한 law-version 후보만 SG-04·SG-11로 전달한다. 법정률·기간·한도·정족수·산식·반올림 수치를 이 prompt나 Python에 상수로 두지 않는다. 결과를 바꾸는 operand가 없으면 단일값 대신 scenario 또는 `BLOCKED`를 보존한다. Stage 2만 최종 계산·청구금액을 확정한다.
|
||||||
|
|
||||||
|
## Part 3·Part 4·Stage 2 closure
|
||||||
|
|
||||||
|
- canonical root: `stage_b_domain_bo_seed_output`
|
||||||
|
- schema: `task_c_bo_stage_b_domain_bo_seed.v3`
|
||||||
|
- BO type: `event|state`; 등록된 structure type만 사용
|
||||||
|
- Part 4는 `effect_projection.schema.json`, `module_role_projection.json`, `gates.json`으로 투영하고 미등록 효과의 침묵 fallback을 금지한다.
|
||||||
|
- Stage 2 handoff에는 요소·반대사실·방어·source provenance·evidence slot·calculation state·미해결 review를 보존한다.
|
||||||
|
- 출력은 strict JSON이며 complaint prose와 최종 법률결론을 생성하지 않는다.
|
||||||
|
|
||||||
|
최종 법률결론과 최종 청구액을 확정하지 않는다. 원천 참조와 미해결 review code를 보존한다.
|
||||||
+431
@@ -0,0 +1,431 @@
|
|||||||
|
{
|
||||||
|
"schema_version": "stage1_domain_config.v1",
|
||||||
|
"domain_id": "E-17",
|
||||||
|
"label_ko": "노무·임금",
|
||||||
|
"slug": "labor_wage_claims",
|
||||||
|
"kind": "leaf",
|
||||||
|
"status": "active",
|
||||||
|
"execution_policy": {
|
||||||
|
"runnable": true,
|
||||||
|
"always_on": false,
|
||||||
|
"model_tier": "pro",
|
||||||
|
"output_mode": "strict_json",
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"max_instances": 8
|
||||||
|
},
|
||||||
|
"depends_on": [
|
||||||
|
"E-01"
|
||||||
|
],
|
||||||
|
"special_law_profiles": [],
|
||||||
|
"activation_cues": {
|
||||||
|
"positive_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E17-P01",
|
||||||
|
"cue_type": "legal_relation",
|
||||||
|
"match_value": "업무 내용·지휘감독·근무시간/장소·보수 성격·사업 편입 등 근로자성 지표를 확인하는 원천",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "사건명 단일 키워드가 아니라 원천 조합으로 평가",
|
||||||
|
"weight": 1.0,
|
||||||
|
"strength": "strong"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E17-P02",
|
||||||
|
"cue_type": "evidence_component",
|
||||||
|
"match_value": "근로계약·취업규칙·급여대장·임금명세·계좌·근태·근로시간·수당·퇴직 자료",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "사건명 단일 키워드가 아니라 원천 조합으로 평가",
|
||||||
|
"weight": 1.0,
|
||||||
|
"strength": "strong"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E17-P03",
|
||||||
|
"cue_type": "relief",
|
||||||
|
"match_value": "임금·수당·퇴직금 또는 근로자/근로관계 지위 확인의 사실 원천",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "사건명 단일 키워드가 아니라 원천 조합으로 평가",
|
||||||
|
"weight": 1.0,
|
||||||
|
"strength": "strong"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E17-P04",
|
||||||
|
"cue_type": "event_kind",
|
||||||
|
"match_value": "업무상 재해와 사업주의 민사책임·산재보험급여·손해 항목이 경합하는 원천",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "사건명 단일 키워드가 아니라 원천 조합으로 평가",
|
||||||
|
"weight": 0.7,
|
||||||
|
"strength": "support"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"negative_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E17-N01",
|
||||||
|
"cue_type": "legal_relation",
|
||||||
|
"match_value": "독립 사업자가 자기 계산과 위험으로 업무를 수행한다는 원천만 있고 사용종속 지표가 없는 관계",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "사건명 단일 키워드가 아니라 원천 조합으로 평가",
|
||||||
|
"weight": 0.7,
|
||||||
|
"effect": "confidence_downrank_only"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E17-N02",
|
||||||
|
"cue_type": "other",
|
||||||
|
"match_value": "노동위원회 재심판정 취소 등 행정소송만을 최종 목표로 하는 자료",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "사건명 단일 키워드가 아니라 원천 조합으로 평가",
|
||||||
|
"weight": 0.8,
|
||||||
|
"effect": "monitor_review"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E17-N03",
|
||||||
|
"cue_type": "term",
|
||||||
|
"match_value": "일상적 의미의 급여·퇴직·직원 표현만 있고 노무 제공·사용자·임금 원천이 없는 자료",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "사건명 단일 키워드가 아니라 원천 조합으로 평가",
|
||||||
|
"weight": 0.6,
|
||||||
|
"effect": "confidence_downrank_only"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"conflict_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "E17-C01",
|
||||||
|
"rule": "계약 명칭과 실제 지휘감독·사업 편입·보수·대체 가능성 등 근로자성 지표가 서로 불일치",
|
||||||
|
"left_refs": [],
|
||||||
|
"right_refs": [],
|
||||||
|
"effect": "hard_review",
|
||||||
|
"review_code": "E17_WORKER_STATUS_CONFLICT_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "E17-C02",
|
||||||
|
"rule": "근로시간·지급 임금·수당 항목·퇴직일 또는 정산 내역이 원천별로 불일치",
|
||||||
|
"left_refs": [],
|
||||||
|
"right_refs": [],
|
||||||
|
"effect": "hard_review",
|
||||||
|
"review_code": "E17_WAGE_ITEM_CONFLICT_REVIEW"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"routing_policy": {
|
||||||
|
"fail_open": true,
|
||||||
|
"candidate_downgrade_forbidden": true,
|
||||||
|
"minimum_primary_evidence": 0,
|
||||||
|
"leaf_activation_threshold": 1.0,
|
||||||
|
"monitor_threshold": 0.5,
|
||||||
|
"unknown_review_code": "UNROUTED_ISSUE_REVIEW"
|
||||||
|
},
|
||||||
|
"element_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "e17.el01",
|
||||||
|
"label": "노무제공자·상대방·업무·계약관계 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E17_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e17.el02",
|
||||||
|
"label": "근로자성 실질 지표와 반대 지표",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E17_WORKER_STATUS_CONFLICT_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e17.el03",
|
||||||
|
"label": "임금 구성항목·산정기간·지급기일·기지급액 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E17_WAGE_ITEM_CONFLICT_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e17.el04",
|
||||||
|
"label": "근로시간·휴일·휴가·수당 발생 사실 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e17.el05",
|
||||||
|
"label": "근로관계 성립·변경·종료·지위확인 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E17_EMPLOYMENT_STATUS_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e17.el06",
|
||||||
|
"label": "퇴직금·평균/통상임금·법정수당 CE operand 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "MISSING_REQUIRED_OPERAND"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e17.el07",
|
||||||
|
"label": "산재보험급여·손해항목·사업주/제3자 책임 경합 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "E17_INDUSTRIAL_ACCIDENT_OVERLAP_REVIEW"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"opposing_fact_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "e17.op01",
|
||||||
|
"label": "근로자성 부인·도급/위임·독립사업자 항변 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e17.op02",
|
||||||
|
"label": "임금성 부인·포괄임금·고정급/성과급·근로시간 항변 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e17.op03",
|
||||||
|
"label": "변제·공제·상계·시효·퇴직 정산 항변 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "e17.op04",
|
||||||
|
"label": "산재보험급여와 민사 손해 항목의 동일성·공제·과실상계 항변 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"evidence_components": [
|
||||||
|
{
|
||||||
|
"component_id": "e17.relationship",
|
||||||
|
"label": "근로계약·도급/위임계약과 실제 노무제공 관계 원천",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "worker_status"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "e17.direction_control",
|
||||||
|
"label": "업무지시·평가·징계·근무편성·대체 제한 원천",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "subordination_indicators"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "e17.payroll",
|
||||||
|
"label": "급여대장·임금명세·계좌·원천징수 원천",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "wage_items_and_payment"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "e17.timekeeping",
|
||||||
|
"label": "출퇴근·근태·근로시간·휴일·휴가 원천",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "worktime"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "e17.lifecycle",
|
||||||
|
"label": "채용·배치·휴직·해고·사직·퇴직 원천",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "employment_lifecycle"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "e17.accident",
|
||||||
|
"label": "재해·요양·보험급여·손해항목·과실 원천",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "industrial_accident_overlap"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"defense_map": [
|
||||||
|
{
|
||||||
|
"defense_id": "e17.worker_status_denial",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"e17.op01"
|
||||||
|
],
|
||||||
|
"review_code": "E17_WORKER_STATUS_CONFLICT_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defense_id": "e17.wage_or_worktime_denial",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"e17.op02"
|
||||||
|
],
|
||||||
|
"review_code": "E17_WAGE_ITEM_CONFLICT_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defense_id": "e17.payment_or_limitation",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"e17.op03"
|
||||||
|
],
|
||||||
|
"review_code": "E17_LAW_VERSION_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defense_id": "e17.accident_benefit_adjustment",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"e17.op04"
|
||||||
|
],
|
||||||
|
"review_code": "E17_INDUSTRIAL_ACCIDENT_OVERLAP_REVIEW"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"calculation_bindings": [
|
||||||
|
"CE-01",
|
||||||
|
"CE-03",
|
||||||
|
"CE-09"
|
||||||
|
],
|
||||||
|
"emits_signals": [
|
||||||
|
"SG-01",
|
||||||
|
"SG-02",
|
||||||
|
"SG-03",
|
||||||
|
"SG-04",
|
||||||
|
"SG-05",
|
||||||
|
"SG-06",
|
||||||
|
"SG-08",
|
||||||
|
"SG-09",
|
||||||
|
"SG-10",
|
||||||
|
"SG-11",
|
||||||
|
"SG-12",
|
||||||
|
"SG-13",
|
||||||
|
"domain_signal"
|
||||||
|
],
|
||||||
|
"bo_types": [
|
||||||
|
"event",
|
||||||
|
"state",
|
||||||
|
"claim"
|
||||||
|
],
|
||||||
|
"structure_types": [
|
||||||
|
{
|
||||||
|
"type_id": "labor_wage_claim",
|
||||||
|
"priority_rank": 17,
|
||||||
|
"module": "labor_wage_claims",
|
||||||
|
"role_projection": "linked_labor_claims"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"effect_projection": {
|
||||||
|
"schema_ref": "Default_Agent/domains/E-17/effect_projection.schema.json",
|
||||||
|
"module": "labor_wage_claims",
|
||||||
|
"role_projection": "linked_labor_claims"
|
||||||
|
},
|
||||||
|
"gates": [
|
||||||
|
{
|
||||||
|
"gate_id": "E17-G01",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-17/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E17_REQUIRED_ELEMENT_GAP_REVIEW",
|
||||||
|
"E17_WORKER_STATUS_CONFLICT_REVIEW",
|
||||||
|
"E17_WAGE_ITEM_CONFLICT_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E17-G02",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-17/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"E17_INDUSTRIAL_ACCIDENT_OVERLAP_REVIEW",
|
||||||
|
"E17_PROCEDURE_BOUNDARY_REVIEW",
|
||||||
|
"TRACK_BOUNDARY_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "E17-G03",
|
||||||
|
"implementation_ref": "Default_Agent/domains/E-17/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"MISSING_REQUIRED_OPERAND",
|
||||||
|
"CALCULATION_BLOCKED_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"review_codes": [
|
||||||
|
"E17_REQUIRED_ELEMENT_GAP_REVIEW",
|
||||||
|
"E17_WORKER_STATUS_CONFLICT_REVIEW",
|
||||||
|
"E17_WAGE_ITEM_CONFLICT_REVIEW",
|
||||||
|
"E17_EMPLOYMENT_STATUS_REVIEW",
|
||||||
|
"E17_INDUSTRIAL_ACCIDENT_OVERLAP_REVIEW",
|
||||||
|
"E17_LAW_VERSION_REVIEW",
|
||||||
|
"E17_PROCEDURE_BOUNDARY_REVIEW",
|
||||||
|
"MISSING_REQUIRED_OPERAND",
|
||||||
|
"CALCULATION_BLOCKED_REVIEW",
|
||||||
|
"MEETING_ONLY_PROOF_REVIEW",
|
||||||
|
"TRACK_BOUNDARY_REVIEW",
|
||||||
|
"PUBLIC_LAW_NEXUS_REVIEW",
|
||||||
|
"UNROUTED_ISSUE_REVIEW"
|
||||||
|
],
|
||||||
|
"contract_guards": {
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"unknown_values_require_review": true,
|
||||||
|
"source_membership_required": true,
|
||||||
|
"strict_json_output": true,
|
||||||
|
"meeting_only_evidence_promotion_forbidden": true
|
||||||
|
},
|
||||||
|
"prompt_overlay_ref": "seed_prompt_overlay.md",
|
||||||
|
"profile_schema_ref": "Default_Agent/domains/E-17/domain_profile.schema.json",
|
||||||
|
"extension_schema_ref": "domain_extension.schema.json"
|
||||||
|
}
|
||||||
+27
@@ -0,0 +1,27 @@
|
|||||||
|
# E-17 노무·임금 S3 seed overlay
|
||||||
|
|
||||||
|
## 목적
|
||||||
|
|
||||||
|
이 overlay는 137종 민사 본안에 재사용되는 evidence/cue 기반 leaf worker 계약이다. 사건명·당사자·특정 날짜를 runtime 분기로 사용하지 않으며, 활성 여부는 SG-01의 source-backed cue 조합으로만 판단한다.
|
||||||
|
|
||||||
|
## 공통 추론 규칙
|
||||||
|
|
||||||
|
1. slice에 포함된 `source_id`만 읽고 각 후보의 `source_refs`를 보존한다.
|
||||||
|
2. 증거, event candidate, meeting clause를 구분한다. meeting-only 진술은 documentary evidence로 승격하지 않고 `MEETING_ONLY_PROOF_REVIEW`를 유지한다.
|
||||||
|
3. 지지·반대·충돌·누락 사실을 함께 출력하고, unknown을 추정하거나 review를 침묵 삭제하지 않는다.
|
||||||
|
4. root는 `stage_b_domain_bo_seed_output`, schema는 `task_c_bo_stage_b_domain_bo_seed.v3`이며 strict JSON만 출력한다.
|
||||||
|
5. 계산 binding CE-01, CE-03, CE-09은 operand 완전성·scenario 요청만 생성한다. 법정 수치·최종액은 S4/Stage 2 권한이다.
|
||||||
|
|
||||||
|
## 도메인 규칙
|
||||||
|
|
||||||
|
1. 근로자성은 계약 명칭이 아니라 업무 내용, 지휘·감독, 근무시간·장소, 사업 편입, 보수의 성격, 대체 가능성, 장비·위험 부담 등 지표를 양방향으로 수집한다. 근로자 여부를 Stage 1에서 단정하지 않는다.
|
||||||
|
2. 임금·수당·퇴직금은 항목, 산정기간, 근로시간, 지급기일, 기지급·공제 내역과 원천을 분리한다. 평균·통상임금 및 퇴직금 산정값은 CE-09로 넘기며 숫자·법정률을 프롬프트에 고정하지 않는다.
|
||||||
|
3. 지위확인은 근로관계 성립·변경·종료, 해고·사직·퇴직, 확인의 이익 후보를 분리하고 행정소송 경계는 X3 review로 보존한다.
|
||||||
|
4. 산업재해 민사 경합은 재해·과실·손해항목·산재보험급여·귀속주체를 분리하고 E-05 및 X3로 source-backed handoff한다. 공제·과실상계 순서나 최종 배상액을 확정하지 않는다.
|
||||||
|
5. 통상임금 판례변경과 근로기준법·퇴직급여법의 시행 버전은 SG-04로 pinning하고 Part 1/Part 4 review를 근거 없이 감소시키지 않는다.
|
||||||
|
|
||||||
|
## 금지 및 stop rule
|
||||||
|
|
||||||
|
- 신청·집행 절차, 청구권 성립, 당사자적격, 법률효과 또는 금액을 최종 결론으로 확정하지 않는다.
|
||||||
|
- 필수 원천이 없거나 상충하면 `READY_WITH_REVIEW`; 계산 operand가 결과를 바꾸는 수준으로 없으면 `MISSING_REQUIRED_OPERAND` 또는 `CALCULATION_BLOCKED_REVIEW`를 발행한다.
|
||||||
|
- Part 1 및 Part 4의 review는 해결 원천과 resolution record 없이 감소시키지 않는다.
|
||||||
+1
File diff suppressed because one or more lines are too long
+25
@@ -0,0 +1,25 @@
|
|||||||
|
# E-18 단체·회사 결의/지위 S6 seed overlay
|
||||||
|
|
||||||
|
## 공통 계약
|
||||||
|
|
||||||
|
- 입력 slice의 source_id만 사용하고 모든 후보의 source_refs를 보존한다.
|
||||||
|
- 사건명 runtime lookup과 단일 키워드 활성화를 금지한다. SG-01의 positive/negative/conflict source 조합으로만 라우팅한다.
|
||||||
|
- meeting-only 진술을 documentary evidence로 승격하지 않고 반대·충돌·누락·unknown을 review와 함께 보존한다.
|
||||||
|
- strict JSON `task_c_bo_stage_b_domain_bo_seed.v3`만 출력하며 권리 성립·위법성·당사자적격·금액의 최종 결론을 금지한다.
|
||||||
|
- 법정 수치·기간·한도는 프롬프트에 고정하지 않고 SG-04 법령 버전 registry에서 주입한다.
|
||||||
|
|
||||||
|
## 도메인별 추론 규칙
|
||||||
|
|
||||||
|
1. 회사·비법인사단·조합을 먼저 구별하고 정관·규약·법률상 기관 구조를 원천별 후보로 보존한다.
|
||||||
|
2. 결의의 부존재·무효·취소를 동일 범주로 합치지 말고 소집·통지·정족수·의결·내용 하자와 기준시점을 분리한다.
|
||||||
|
3. 주주명부·회원명부·명의개서·대표권과 실질 권리관계를 구분하고 지위 또는 확인의 이익을 단정하지 않는다.
|
||||||
|
4. CE-R2는 deferred 계산이다. 출자·지분·손익·청산 operand만 보존하고 실행 가능 또는 최종 정산액으로 표시하지 않는다.
|
||||||
|
|
||||||
|
## Part 3·4 및 Stage 2 stop rule
|
||||||
|
|
||||||
|
- 등록 structure type `org_resolution_status_relation`만 `org_resolution_status/resolution_status_roles`로 투영한다.
|
||||||
|
- 미등록 법률효과는 `UNREGISTERED_EFFECT_TYPE_REVIEW`, 경계는 `TRACK_BOUNDARY_REVIEW`로 보존한다.
|
||||||
|
- 계산은 operand completeness와 scenario route만 작성한다. 최종액·최종 청구권 판단은 Stage 2 권한이다.
|
||||||
|
- Part 1·Part 4 review는 해결 source_refs와 resolution record 없이 감소시키지 않는다.
|
||||||
|
|
||||||
|
최종 법률결론과 최종 청구액을 확정하지 않는다. 원천 참조와 미해결 review code를 보존한다.
|
||||||
+1
File diff suppressed because one or more lines are too long
+25
@@ -0,0 +1,25 @@
|
|||||||
|
# E-19 보험 S6 seed overlay
|
||||||
|
|
||||||
|
## 공통 계약
|
||||||
|
|
||||||
|
- 입력 slice의 source_id만 사용하고 모든 후보의 source_refs를 보존한다.
|
||||||
|
- 사건명 runtime lookup과 단일 키워드 활성화를 금지한다. SG-01의 positive/negative/conflict source 조합으로만 라우팅한다.
|
||||||
|
- meeting-only 진술을 documentary evidence로 승격하지 않고 반대·충돌·누락·unknown을 review와 함께 보존한다.
|
||||||
|
- strict JSON `task_c_bo_stage_b_domain_bo_seed.v3`만 출력하며 권리 성립·위법성·당사자적격·금액의 최종 결론을 금지한다.
|
||||||
|
- 법정 수치·기간·한도는 프롬프트에 고정하지 않고 SG-04 법령 버전 registry에서 주입한다.
|
||||||
|
|
||||||
|
## 도메인별 추론 규칙
|
||||||
|
|
||||||
|
1. 보험증권·청약서·특약·적용 약관판을 구분하고 체결일·사고일·갱신일에 따른 SG-04 version pin을 요구한다.
|
||||||
|
2. 담보위험, 보험사고, 인과, 면책, 고지·통지의무, 명시·설명의무를 별도 후보로 보존한다.
|
||||||
|
3. 수익자 변경과 보험자대위는 통지·도달·지급·제3자 권리의 시점을 나누고 귀속을 확정하지 않는다.
|
||||||
|
4. E-19에는 별도 profile을 억지로 부착하지 않는다. 약관법·보험업법 특별 쟁점은 E19_SPECIAL_TERMS_INSURANCE_BUSINESS_REVIEW로 보존한다.
|
||||||
|
|
||||||
|
## Part 3·4 및 Stage 2 stop rule
|
||||||
|
|
||||||
|
- 등록 structure type `insurance_claim_relation`만 `insurance_claims/insurance_relation_roles`로 투영한다.
|
||||||
|
- 미등록 법률효과는 `UNREGISTERED_EFFECT_TYPE_REVIEW`, 경계는 `TRACK_BOUNDARY_REVIEW`로 보존한다.
|
||||||
|
- 계산은 operand completeness와 scenario route만 작성한다. 최종액·최종 청구권 판단은 Stage 2 권한이다.
|
||||||
|
- Part 1·Part 4 review는 해결 source_refs와 resolution record 없이 감소시키지 않는다.
|
||||||
|
|
||||||
|
최종 법률결론과 최종 청구액을 확정하지 않는다. 원천 참조와 미해결 review code를 보존한다.
|
||||||
+1
File diff suppressed because one or more lines are too long
+25
@@ -0,0 +1,25 @@
|
|||||||
|
# E-20 지식재산 S6 seed overlay
|
||||||
|
|
||||||
|
## 공통 계약
|
||||||
|
|
||||||
|
- 입력 slice의 source_id만 사용하고 모든 후보의 source_refs를 보존한다.
|
||||||
|
- 사건명 runtime lookup과 단일 키워드 활성화를 금지한다. SG-01의 positive/negative/conflict source 조합으로만 라우팅한다.
|
||||||
|
- meeting-only 진술을 documentary evidence로 승격하지 않고 반대·충돌·누락·unknown을 review와 함께 보존한다.
|
||||||
|
- strict JSON `task_c_bo_stage_b_domain_bo_seed.v3`만 출력하며 권리 성립·위법성·당사자적격·금액의 최종 결론을 금지한다.
|
||||||
|
- 법정 수치·기간·한도는 프롬프트에 고정하지 않고 SG-04 법령 버전 registry에서 주입한다.
|
||||||
|
|
||||||
|
## 도메인별 추론 규칙
|
||||||
|
|
||||||
|
1. SLP-IP를 반드시 합성하고 적용 법률·권리 종류·행위기간별 버전을 SG-04로 pin한다.
|
||||||
|
2. 권리 특정·유효성 후보와 귀속·양도·실시허락을 분리하고, 등록원부·공보·계약 원천을 교차검증한다.
|
||||||
|
3. 피고 실시물을 권리별 비교 구조로 분해하되 침해·유사성·의거성·혼동 또는 영업비밀성을 최종 확정하지 않는다.
|
||||||
|
4. CE-R1은 deferred 계산이다. 손해 추정·실시료 operand와 법률 버전만 보존하고 공식 formula pin 전 실행하지 않는다.
|
||||||
|
|
||||||
|
## Part 3·4 및 Stage 2 stop rule
|
||||||
|
|
||||||
|
- 등록 structure type `ip_right_claim_relation`만 `ip_claims/ip_right_infringement_roles`로 투영한다.
|
||||||
|
- 미등록 법률효과는 `UNREGISTERED_EFFECT_TYPE_REVIEW`, 경계는 `TRACK_BOUNDARY_REVIEW`로 보존한다.
|
||||||
|
- 계산은 operand completeness와 scenario route만 작성한다. 최종액·최종 청구권 판단은 Stage 2 권한이다.
|
||||||
|
- Part 1·Part 4 review는 해결 source_refs와 resolution record 없이 감소시키지 않는다.
|
||||||
|
|
||||||
|
최종 법률결론과 최종 청구액을 확정하지 않는다. 원천 참조와 미해결 review code를 보존한다.
|
||||||
+1
File diff suppressed because one or more lines are too long
+25
@@ -0,0 +1,25 @@
|
|||||||
|
# E-21 언론·인격권 S6 seed overlay
|
||||||
|
|
||||||
|
## 공통 계약
|
||||||
|
|
||||||
|
- 입력 slice의 source_id만 사용하고 모든 후보의 source_refs를 보존한다.
|
||||||
|
- 사건명 runtime lookup과 단일 키워드 활성화를 금지한다. SG-01의 positive/negative/conflict source 조합으로만 라우팅한다.
|
||||||
|
- meeting-only 진술을 documentary evidence로 승격하지 않고 반대·충돌·누락·unknown을 review와 함께 보존한다.
|
||||||
|
- strict JSON `task_c_bo_stage_b_domain_bo_seed.v3`만 출력하며 권리 성립·위법성·당사자적격·금액의 최종 결론을 금지한다.
|
||||||
|
- 법정 수치·기간·한도는 프롬프트에 고정하지 않고 SG-04 법령 버전 registry에서 주입한다.
|
||||||
|
|
||||||
|
## 도메인별 추론 규칙
|
||||||
|
|
||||||
|
1. SLP-MEDIA-MEDIATION을 반드시 합성하고 대상 매체·보도 유형·구제수단·기준시점별 법률 버전을 SG-04로 pin한다.
|
||||||
|
2. 원문·수정본·캡처·URL·게시시각을 버전별로 보존하고 피해자 식별가능성과 전파범위를 별도 후보로 둔다.
|
||||||
|
3. 사실 적시·의견, 진실성·상당성·공익성, 동의·사생활·개인정보를 분리하며 위법성을 최종 확정하지 않는다.
|
||||||
|
4. 정정·반론·추후보도·삭제·금지·손해배상은 요건과 기간이 다르므로 합치지 않고 기간 기준사실 누락을 review로 남긴다.
|
||||||
|
|
||||||
|
## Part 3·4 및 Stage 2 stop rule
|
||||||
|
|
||||||
|
- 등록 structure type `media_personality_claim_relation`만 `media_personality_rights/publication_personality_roles`로 투영한다.
|
||||||
|
- 미등록 법률효과는 `UNREGISTERED_EFFECT_TYPE_REVIEW`, 경계는 `TRACK_BOUNDARY_REVIEW`로 보존한다.
|
||||||
|
- 계산은 operand completeness와 scenario route만 작성한다. 최종액·최종 청구권 판단은 Stage 2 권한이다.
|
||||||
|
- Part 1·Part 4 review는 해결 source_refs와 resolution record 없이 감소시키지 않는다.
|
||||||
|
|
||||||
|
최종 법률결론과 최종 청구액을 확정하지 않는다. 원천 참조와 미해결 review code를 보존한다.
|
||||||
+30
@@ -0,0 +1,30 @@
|
|||||||
|
# EC-00 contract-general common fragment v1
|
||||||
|
|
||||||
|
`fragment_id`: `EC-00`
|
||||||
|
|
||||||
|
`execution_mode`: `dependency_fragment_only`
|
||||||
|
|
||||||
|
## Mission
|
||||||
|
|
||||||
|
Supply the common contract-law questions needed by an activated contract leaf. EC-00 never creates a standalone worker and never activates from a case name.
|
||||||
|
|
||||||
|
## Candidate frame
|
||||||
|
|
||||||
|
For each assigned transaction or obligation, preserve evidence-grounded candidates for:
|
||||||
|
|
||||||
|
1. parties, offer/acceptance or other formation facts, object, consideration, and incorporated terms;
|
||||||
|
2. interpretation conflicts, conditions, time for performance, simultaneous-performance linkage, and performance/tender;
|
||||||
|
3. non-performance mode, attributable-cause facts and counterfacts, notice or cure steps, rescission/termination communication, and restoration facts;
|
||||||
|
4. deposit, penalty, liquidated-damages, limitation, settlement, waiver, release, novation, acknowledgment, payment, setoff, and other defense triggers;
|
||||||
|
5. amount components and calculation operands, without selecting an unsupported legal rate or final amount.
|
||||||
|
|
||||||
|
## Proof and conflict rules
|
||||||
|
|
||||||
|
- Distinguish contract documents and transaction records from party assertions and later summaries.
|
||||||
|
- Preserve inconsistent versions, amendments, signatures/seals, authority, delivery, acceptance, and performance history as separate candidates with source references.
|
||||||
|
- A clause label is not a legal conclusion. Record the text and context needed for downstream interpretation.
|
||||||
|
- If formation, validity, authority, or declaration-of-intent issues are material, add an E-01 dependency candidate. If notice arrival or condition timing is material, retain the X1/SG-06 linkage.
|
||||||
|
|
||||||
|
## Boundary
|
||||||
|
|
||||||
|
This fragment supplies shared questions only. The activated leaf controls domain-specific elements, defenses, calculations, and extensions. Final legal conclusions and complaint drafting are forbidden.
|
||||||
+93
@@ -0,0 +1,93 @@
|
|||||||
|
{
|
||||||
|
"schema_version": "stage1_domain_config.v1",
|
||||||
|
"domain_id": "EC-00",
|
||||||
|
"label_ko": "계약총론 공통층",
|
||||||
|
"slug": "contract_general",
|
||||||
|
"kind": "common",
|
||||||
|
"status": "active",
|
||||||
|
"execution_policy": {
|
||||||
|
"runnable": false,
|
||||||
|
"always_on": false,
|
||||||
|
"model_tier": "none",
|
||||||
|
"output_mode": "strict_json",
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"max_instances": 0
|
||||||
|
},
|
||||||
|
"depends_on": [],
|
||||||
|
"special_law_profiles": [],
|
||||||
|
"activation_cues": {
|
||||||
|
"positive_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "EC00.contract_relation",
|
||||||
|
"cue_type": "legal_relation",
|
||||||
|
"match_value": "contractual_obligation",
|
||||||
|
"strength": "support"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"negative_cues": [],
|
||||||
|
"conflict_cues": []
|
||||||
|
},
|
||||||
|
"routing_policy": {
|
||||||
|
"fail_open": true,
|
||||||
|
"candidate_downgrade_forbidden": true,
|
||||||
|
"minimum_primary_evidence": 0,
|
||||||
|
"unknown_review_code": "UNROUTED_ISSUE_REVIEW"
|
||||||
|
},
|
||||||
|
"element_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "ec00.contract_formation",
|
||||||
|
"label": "계약 성립과 내용 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "ec00.performance_lifecycle",
|
||||||
|
"label": "이행·불이행·종료 lifecycle 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"opposing_fact_slots": [],
|
||||||
|
"evidence_components": [
|
||||||
|
{
|
||||||
|
"component_id": "contract_instrument",
|
||||||
|
"label": "계약 내용과 변경을 보여 주는 문서",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "formation_and_terms"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"defense_map": [],
|
||||||
|
"calculation_bindings": [
|
||||||
|
"CE-01"
|
||||||
|
],
|
||||||
|
"emits_signals": [
|
||||||
|
"SG-05",
|
||||||
|
"SG-09",
|
||||||
|
"SG-13"
|
||||||
|
],
|
||||||
|
"bo_types": [
|
||||||
|
"event",
|
||||||
|
"state"
|
||||||
|
],
|
||||||
|
"structure_types": [],
|
||||||
|
"effect_projection": {
|
||||||
|
"schema_ref": "Default_Agent/domains/_common/non_runnable_fragment.schema.json",
|
||||||
|
"module": "none",
|
||||||
|
"role_projection": "none"
|
||||||
|
},
|
||||||
|
"gates": [],
|
||||||
|
"review_codes": [],
|
||||||
|
"contract_guards": {
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"unknown_values_require_review": true,
|
||||||
|
"source_membership_required": true,
|
||||||
|
"strict_json_output": true,
|
||||||
|
"meeting_only_evidence_promotion_forbidden": true
|
||||||
|
},
|
||||||
|
"prompt_overlay_ref": "common_fragment.md",
|
||||||
|
"profile_schema_ref": "Default_Agent/domains/_common/non_runnable_fragment.schema.json",
|
||||||
|
"extension_schema_ref": "Default_Agent/domains/_common/non_runnable_fragment.schema.json"
|
||||||
|
}
|
||||||
+327
@@ -0,0 +1,327 @@
|
|||||||
|
{
|
||||||
|
"schema_version": "stage1_domain_config.v1",
|
||||||
|
"domain_id": "X1",
|
||||||
|
"label_ko": "통지·의사표시 도달 lifecycle",
|
||||||
|
"slug": "notice_expression_lifecycle",
|
||||||
|
"kind": "always_on",
|
||||||
|
"status": "active",
|
||||||
|
"execution_policy": {
|
||||||
|
"runnable": true,
|
||||||
|
"always_on": true,
|
||||||
|
"model_tier": "flash",
|
||||||
|
"output_mode": "strict_json",
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"max_instances": 1
|
||||||
|
},
|
||||||
|
"depends_on": [],
|
||||||
|
"special_law_profiles": [],
|
||||||
|
"activation_cues": {
|
||||||
|
"positive_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "X1-P01",
|
||||||
|
"cue_type": "evidence_component",
|
||||||
|
"match_value": "발신자·수신자·내용·작성 또는 발송 시점이 식별되는 통지나 의사표시 자료",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": null,
|
||||||
|
"strength": "strong",
|
||||||
|
"weight": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "X1-P02",
|
||||||
|
"cue_type": "event_kind",
|
||||||
|
"match_value": "작성·발송·도달·수령·수령거절·반송 중 하나 이상의 lifecycle 사건",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": null,
|
||||||
|
"strength": "strong",
|
||||||
|
"weight": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "X1-P03",
|
||||||
|
"cue_type": "evidence_component",
|
||||||
|
"match_value": "우편조회·송달내역·전자전송기록·수신확인·회신",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": null,
|
||||||
|
"strength": "support",
|
||||||
|
"weight": 0.5
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"negative_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "X1-N01",
|
||||||
|
"cue_type": "other",
|
||||||
|
"match_value": "외부 발신 또는 전달 정황이 전혀 없는 내부 초안",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "작성과 발송·도달을 혼동하지 않음",
|
||||||
|
"effect": "confidence_downrank_only",
|
||||||
|
"weight": 0.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "X1-N02",
|
||||||
|
"cue_type": "date_pattern",
|
||||||
|
"match_value": "통신행위와 연결되지 않은 단순 날짜",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "날짜만으로 lifecycle 상태를 생성하지 않음",
|
||||||
|
"effect": "monitor_review",
|
||||||
|
"weight": 0.6
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"conflict_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "X1-C01",
|
||||||
|
"rule": "발송일·도달일·수령일을 지지하는 원천의 시점이 서로 불일치",
|
||||||
|
"left_refs": [],
|
||||||
|
"right_refs": [],
|
||||||
|
"effect": "hard_review",
|
||||||
|
"review_code": "X1_LIFECYCLE_DATE_CONFLICT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "X1-C02",
|
||||||
|
"rule": "주소·수신자 권한·문서 내용 또는 버전 원천이 불일치",
|
||||||
|
"left_refs": [],
|
||||||
|
"right_refs": [],
|
||||||
|
"effect": "hard_review",
|
||||||
|
"review_code": "X1_RECIPIENT_OR_CONTENT_CONFLICT"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"routing_policy": {
|
||||||
|
"fail_open": true,
|
||||||
|
"candidate_downgrade_forbidden": true,
|
||||||
|
"minimum_primary_evidence": 0,
|
||||||
|
"leaf_activation_threshold": 1.0,
|
||||||
|
"monitor_threshold": 0.5,
|
||||||
|
"unknown_review_code": "UNROUTED_ISSUE_REVIEW"
|
||||||
|
},
|
||||||
|
"element_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "x1.el01",
|
||||||
|
"label": "의사표시 주체·내용·대상 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "X1_REQUIRED_ELEMENT_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "x1.el02",
|
||||||
|
"label": "발신자·수신자·주소·권한 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "X1_RECIPIENT_OR_CONTENT_CONFLICT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "x1.el03",
|
||||||
|
"label": "작성·발송 시점과 방식",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "x1.el04",
|
||||||
|
"label": "도달·접근 가능 시점 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "X1_ARRIVAL_UNPROVEN_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "x1.el05",
|
||||||
|
"label": "수령·거절·반송·미배달 상태",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"opposing_fact_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "x1.op01",
|
||||||
|
"label": "미도달·반송·수신 불가능 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "x1.op02",
|
||||||
|
"label": "수신자·주소·대리권 흠결 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"evidence_components": [
|
||||||
|
{
|
||||||
|
"component_id": "x1.notice_instrument",
|
||||||
|
"label": "통지서·최고서·해제·해지 통보·전자메시지",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence"
|
||||||
|
],
|
||||||
|
"proof_role": "expression_content"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "x1.dispatch_record",
|
||||||
|
"label": "우편접수증·전자전송기록·발송로그",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "dispatch"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "x1.delivery_tracking",
|
||||||
|
"label": "배송조회·송달내역·반송기록",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "arrival_or_nonarrival"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "x1.recipient_acknowledgement",
|
||||||
|
"label": "수신확인·회신·후속행위",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "receipt_or_access"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"defense_map": [
|
||||||
|
{
|
||||||
|
"defense_id": "x1.nonarrival",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"x1.op01"
|
||||||
|
],
|
||||||
|
"review_code": "X1_ARRIVAL_UNPROVEN_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defense_id": "x1.recipient_authority",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"x1.op02"
|
||||||
|
],
|
||||||
|
"review_code": "X1_RECIPIENT_OR_CONTENT_CONFLICT"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"calculation_bindings": [
|
||||||
|
"CE-03"
|
||||||
|
],
|
||||||
|
"emits_signals": [
|
||||||
|
"SG-04",
|
||||||
|
"SG-05",
|
||||||
|
"SG-06",
|
||||||
|
"SG-09",
|
||||||
|
"SG-10",
|
||||||
|
"SG-13"
|
||||||
|
],
|
||||||
|
"bo_types": [
|
||||||
|
"event",
|
||||||
|
"state"
|
||||||
|
],
|
||||||
|
"structure_types": [
|
||||||
|
{
|
||||||
|
"type_id": "succession_notice_lien_asset_defense",
|
||||||
|
"priority_rank": 10,
|
||||||
|
"module": "succession_notice_lien_asset_defense",
|
||||||
|
"role_projection": "linked_structures"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_id": "general_legal_effect",
|
||||||
|
"priority_rank": 11,
|
||||||
|
"module": "legal_effect",
|
||||||
|
"role_projection": "legal_effect_roles"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"effect_projection": {
|
||||||
|
"schema_ref": "Default_Agent/domains/X1/effect_projection.schema.json",
|
||||||
|
"module": "succession_notice_lien_asset_defense",
|
||||||
|
"role_projection": "linked_structures"
|
||||||
|
},
|
||||||
|
"gates": [
|
||||||
|
{
|
||||||
|
"gate_id": "X1-G01",
|
||||||
|
"implementation_ref": "Default_Agent/domains/X1/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"X1_REQUIRED_ELEMENT_GAP_REVIEW",
|
||||||
|
"X1_ARRIVAL_UNPROVEN_REVIEW",
|
||||||
|
"NOTICE_RECEIPT_UNVERIFIED",
|
||||||
|
"BLOCK_FINAL_DRAFTING_NOTICE_RECEIPT_MISSING"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "X1-G02",
|
||||||
|
"implementation_ref": "Default_Agent/domains/X1/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"X1_LIFECYCLE_DATE_CONFLICT",
|
||||||
|
"X1_RECIPIENT_OR_CONTENT_CONFLICT",
|
||||||
|
"NOTICE_RECEIPT_EVIDENCE_WEAK_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "X1-G03",
|
||||||
|
"implementation_ref": "Default_Agent/domains/X1/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"CALCULATION_PREEMPTION_BLOCKED"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"review_codes": [
|
||||||
|
"X1_REQUIRED_ELEMENT_GAP_REVIEW",
|
||||||
|
"X1_ARRIVAL_UNPROVEN_REVIEW",
|
||||||
|
"X1_LIFECYCLE_DATE_CONFLICT",
|
||||||
|
"X1_RECIPIENT_OR_CONTENT_CONFLICT",
|
||||||
|
"NOTICE_RECEIPT_UNVERIFIED",
|
||||||
|
"NOTICE_RECEIPT_EVIDENCE_WEAK_REVIEW",
|
||||||
|
"BLOCK_FINAL_DRAFTING_NOTICE_RECEIPT_MISSING",
|
||||||
|
"CALCULATION_PREEMPTION_BLOCKED",
|
||||||
|
"UNROUTED_ISSUE_REVIEW"
|
||||||
|
],
|
||||||
|
"contract_guards": {
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"unknown_values_require_review": true,
|
||||||
|
"source_membership_required": true,
|
||||||
|
"strict_json_output": true,
|
||||||
|
"meeting_only_evidence_promotion_forbidden": true
|
||||||
|
},
|
||||||
|
"prompt_overlay_ref": "seed_prompt_overlay.md",
|
||||||
|
"profile_schema_ref": "profile.schema.json",
|
||||||
|
"extension_schema_ref": "domain_extension.schema.json",
|
||||||
|
"runtime_activation_from_legacy_alias_forbidden": true,
|
||||||
|
"case_kind_name_runtime_lookup_forbidden": true,
|
||||||
|
"removed_noncanonical_signal_aliases": [
|
||||||
|
"domain_signal"
|
||||||
|
]
|
||||||
|
}
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
# X1 통지·의사표시 lifecycle S2 overlay
|
||||||
|
|
||||||
|
B5의 notice lifecycle payload(작성·발송·도달·수령·거절·반송·법적 효과일 후보)와 `notice_id`, 수신자·발신자, receipt evidence, 미도달 review를 무손실 이관한다.
|
||||||
|
|
||||||
|
1. slice membership의 `source_id`만 사용하고 하나의 notice lifecycle당 하나의 seed를 생성한다.
|
||||||
|
2. 작성·발송·도달·수령·거절·반송을 서로 다른 사실 후보로 보존한다.
|
||||||
|
3. 발송만으로 도달·수령·효력발생을 확정하지 않는다. 도달일이 없으면 `NOTICE_RECEIPT_UNVERIFIED`와 `BLOCK_FINAL_DRAFTING_NOTICE_RECEIPT_MISSING`을 유지한다.
|
||||||
|
4. received/arrival 날짜가 있어도 receipt evidence나 수신자 인정이 없으면 `NOTICE_RECEIPT_EVIDENCE_WEAK_REVIEW`를 낸다.
|
||||||
|
5. B5 legacy의 `legal_sender_after_resolution.party` 최종값은 Stage 1에서 채우지 않고 상태·승계 참조만 보존한다.
|
||||||
|
6. 법령·판례는 도달 판단 기준의 버전을 고정하는 메타데이터일 뿐 증거에 없는 도달 사실을 보충하지 않는다.
|
||||||
|
|
||||||
|
출력은 seed v3 엄격 JSON이며 최종 효력·발신자 적격·도달 판단은 금지된다.
|
||||||
+359
@@ -0,0 +1,359 @@
|
|||||||
|
{
|
||||||
|
"schema_version": "stage1_domain_config.v1",
|
||||||
|
"domain_id": "X2",
|
||||||
|
"label_ko": "자산 특정·계보·상태",
|
||||||
|
"slug": "asset_identity_lineage_state",
|
||||||
|
"kind": "always_on",
|
||||||
|
"status": "active",
|
||||||
|
"execution_policy": {
|
||||||
|
"runnable": true,
|
||||||
|
"always_on": true,
|
||||||
|
"model_tier": "flash",
|
||||||
|
"output_mode": "strict_json",
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"max_instances": 1
|
||||||
|
},
|
||||||
|
"depends_on": [],
|
||||||
|
"special_law_profiles": [],
|
||||||
|
"activation_cues": {
|
||||||
|
"positive_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "X2-P01",
|
||||||
|
"cue_type": "object",
|
||||||
|
"match_value": "둘 이상의 문서가 동일 또는 연관 자산을 서로 다른 표시·alias로 지칭",
|
||||||
|
"source_field": "source_universe",
|
||||||
|
"note": null,
|
||||||
|
"strength": "strong",
|
||||||
|
"weight": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "X2-P02",
|
||||||
|
"cue_type": "evidence_component",
|
||||||
|
"match_value": "등기·대장·계약·도면·목록에 자산 식별자·지분·순위·상태가 존재",
|
||||||
|
"source_field": "source_universe",
|
||||||
|
"note": null,
|
||||||
|
"strength": "strong",
|
||||||
|
"weight": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "X2-P03",
|
||||||
|
"cue_type": "event_kind",
|
||||||
|
"match_value": "자산의 소유·점유·사용·수익 또는 담보·처분 상태 변화",
|
||||||
|
"source_field": "source_universe",
|
||||||
|
"note": null,
|
||||||
|
"strength": "support",
|
||||||
|
"weight": 0.5
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"negative_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "X2-N01",
|
||||||
|
"cue_type": "other",
|
||||||
|
"match_value": "자산 객체가 없는 순수 인적·금전 관계 자료",
|
||||||
|
"source_field": "source_universe",
|
||||||
|
"note": "해당 원천의 X2 seed 생성을 생략하되 다른 도메인 라우팅은 유지",
|
||||||
|
"effect": "confidence_downrank_only",
|
||||||
|
"weight": 1.0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"conflict_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "X2-C01",
|
||||||
|
"rule": "동일 alias가 상이한 자산 식별자 또는 지분·면적과 연결됨",
|
||||||
|
"left_refs": [],
|
||||||
|
"right_refs": [],
|
||||||
|
"effect": "hard_review",
|
||||||
|
"review_code": "X2_ASSET_IDENTITY_CONFLICT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "X2-C02",
|
||||||
|
"rule": "동일 기준시점의 소유·점유·사용·수익 또는 등기 상태가 충돌함",
|
||||||
|
"left_refs": [],
|
||||||
|
"right_refs": [],
|
||||||
|
"effect": "hard_review",
|
||||||
|
"review_code": "X2_STATE_OR_LINEAGE_CONFLICT"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"routing_policy": {
|
||||||
|
"fail_open": true,
|
||||||
|
"candidate_downgrade_forbidden": true,
|
||||||
|
"minimum_primary_evidence": 1,
|
||||||
|
"leaf_activation_threshold": 1.0,
|
||||||
|
"monitor_threshold": 0.5,
|
||||||
|
"unknown_review_code": "UNROUTED_ISSUE_REVIEW"
|
||||||
|
},
|
||||||
|
"element_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "x2.el01",
|
||||||
|
"label": "canonical asset identifier와 표시",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": "X2_ASSET_IDENTITY_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "x2.el02",
|
||||||
|
"label": "문서별 alias·주소·지번·동호수·면적",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "x2.el03",
|
||||||
|
"label": "등기·담보·처분·승계 lineage",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "x2.el04",
|
||||||
|
"label": "지분·공유·목적물 범위",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "x2.el05",
|
||||||
|
"label": "소유·점유·사용·수익 4축 상태와 기준시점",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "x2.el06",
|
||||||
|
"label": "감정·시가·임료의 평가대상과 기준시점",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"opposing_fact_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "x2.op01",
|
||||||
|
"label": "별개 자산이라는 반대 동일성 자료",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "x2.op02",
|
||||||
|
"label": "상이한 지분·면적·순위·상태 자료",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause",
|
||||||
|
"law_version"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"evidence_components": [
|
||||||
|
{
|
||||||
|
"component_id": "x2.registry",
|
||||||
|
"label": "등기사항·담보·처분·말소·회복 기록",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "lineage"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "x2.ledger_map",
|
||||||
|
"label": "토지·건축물대장·도면·별지목록",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "identity"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "x2.contract_description",
|
||||||
|
"label": "계약·공정증서·인도목록의 목적물 표시",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "alias"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "x2.state_evidence",
|
||||||
|
"label": "점유·사용·수익·관리·임대 상태 자료",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "state_axis"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "x2.valuation_binding",
|
||||||
|
"label": "감정·시세·임료 자료의 대상과 기준시점",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "valuation_binding"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"defense_map": [
|
||||||
|
{
|
||||||
|
"defense_id": "x2.separate_asset",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"x2.op01"
|
||||||
|
],
|
||||||
|
"review_code": "X2_ASSET_IDENTITY_CONFLICT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defense_id": "x2.state_conflict",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"x2.op02"
|
||||||
|
],
|
||||||
|
"review_code": "X2_STATE_OR_LINEAGE_CONFLICT"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"calculation_bindings": [
|
||||||
|
"CE-04",
|
||||||
|
"CE-11"
|
||||||
|
],
|
||||||
|
"emits_signals": [
|
||||||
|
"SG-01",
|
||||||
|
"SG-05",
|
||||||
|
"SG-07",
|
||||||
|
"SG-10",
|
||||||
|
"SG-11",
|
||||||
|
"SG-12",
|
||||||
|
"SG-13"
|
||||||
|
],
|
||||||
|
"bo_types": [
|
||||||
|
"event",
|
||||||
|
"state"
|
||||||
|
],
|
||||||
|
"structure_types": [
|
||||||
|
{
|
||||||
|
"type_id": "asset_state",
|
||||||
|
"priority_rank": 4,
|
||||||
|
"module": "asset_state",
|
||||||
|
"role_projection": "asset_state_projection"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_id": "valuation",
|
||||||
|
"priority_rank": 6,
|
||||||
|
"module": "valuation",
|
||||||
|
"role_projection": "legal_calculation_object"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"effect_projection": {
|
||||||
|
"schema_ref": "Default_Agent/domains/X2/effect_projection.schema.json",
|
||||||
|
"module": "asset_state",
|
||||||
|
"role_projection": "asset_state_projection"
|
||||||
|
},
|
||||||
|
"gates": [
|
||||||
|
{
|
||||||
|
"gate_id": "X2-G01",
|
||||||
|
"implementation_ref": "Default_Agent/domains/X2/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"X2_ASSET_IDENTITY_GAP_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "X2-G02",
|
||||||
|
"implementation_ref": "Default_Agent/domains/X2/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"X2_ASSET_IDENTITY_CONFLICT",
|
||||||
|
"X2_SHARE_OR_AREA_CONFLICT"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "X2-G03",
|
||||||
|
"implementation_ref": "Default_Agent/domains/X2/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"X2_STATE_OR_LINEAGE_CONFLICT"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "X2-G04",
|
||||||
|
"implementation_ref": "Default_Agent/domains/X2/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"X2_VALUATION_BINDING_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "X2-G05",
|
||||||
|
"implementation_ref": "Default_Agent/domains/X2/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"FINAL_LEGAL_CONCLUSION_BLOCKED"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"review_codes": [
|
||||||
|
"X2_ASSET_IDENTITY_GAP_REVIEW",
|
||||||
|
"X2_ASSET_IDENTITY_CONFLICT",
|
||||||
|
"X2_STATE_OR_LINEAGE_CONFLICT",
|
||||||
|
"X2_SHARE_OR_AREA_CONFLICT",
|
||||||
|
"X2_VALUATION_BINDING_REVIEW",
|
||||||
|
"FINAL_LEGAL_CONCLUSION_BLOCKED"
|
||||||
|
],
|
||||||
|
"contract_guards": {
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"unknown_values_require_review": true,
|
||||||
|
"source_membership_required": true,
|
||||||
|
"strict_json_output": true,
|
||||||
|
"meeting_only_evidence_promotion_forbidden": true
|
||||||
|
},
|
||||||
|
"prompt_overlay_ref": "seed_prompt_overlay.md",
|
||||||
|
"profile_schema_ref": "profile.schema.json",
|
||||||
|
"extension_schema_ref": "domain_extension.schema.json",
|
||||||
|
"runtime_activation_from_legacy_alias_forbidden": true,
|
||||||
|
"case_kind_name_runtime_lookup_forbidden": true,
|
||||||
|
"removed_noncanonical_signal_aliases": [
|
||||||
|
"domain_signal"
|
||||||
|
]
|
||||||
|
}
|
||||||
+52
@@ -0,0 +1,52 @@
|
|||||||
|
# X2 seed prompt overlay — 자산 특정·계보·상태
|
||||||
|
|
||||||
|
## 임무와 입력 경계
|
||||||
|
|
||||||
|
현재 `stage_b_domain_slice.v2`의 `selected_sources`, `support_refs`, `review_only_refs`와 그 source ID가 가리키는 slice 내부 원천만 사용한다. 전체 사건 파일, 사건명, 당사자명 또는 특정 날짜를 이용해 도메인을 확정하지 않는다. 동일 사건·상태를 지지하는 원천은 하나의 seed로 묶되 법률효과가 다른 사건과 상태는 분리한다.
|
||||||
|
|
||||||
|
## legacy `B3` 의미 보존 범위
|
||||||
|
|
||||||
|
- 주소·지번·동호수·면적 등 value-bearing object
|
||||||
|
- asset alias와 동일성
|
||||||
|
- 등기·담보·처분 lineage
|
||||||
|
- 소유·점유·사용·수익 4축
|
||||||
|
- 평가기준시점과 자산 binding
|
||||||
|
|
||||||
|
위 범위는 기능 확장이 아니라 legacy delta의 무손실 분해다. legacy field는 `extensions.domain_payload.payload`의 명시 필드와 `legacy_*_projection`에 source refs를 포함하여 보존한다.
|
||||||
|
|
||||||
|
## 사실 슬롯
|
||||||
|
|
||||||
|
- `x2.el01`: canonical asset identifier와 표시
|
||||||
|
- `x2.el02`: 문서별 alias·주소·지번·동호수·면적
|
||||||
|
- `x2.el03`: 등기·담보·처분·승계 lineage
|
||||||
|
- `x2.el04`: 지분·공유·목적물 범위
|
||||||
|
- `x2.el05`: 소유·점유·사용·수익 4축 상태와 기준시점
|
||||||
|
- `x2.el06`: 감정·시가·임료의 평가대상과 기준시점
|
||||||
|
- `x2.op01`: 별개 자산이라는 반대 동일성 자료
|
||||||
|
- `x2.op02`: 상이한 지분·면적·순위·상태 자료
|
||||||
|
|
||||||
|
## 실행 workflow
|
||||||
|
|
||||||
|
1. 각 source가 slice membership 안에 있는지 검증하고 meeting-only 진술을 증거로 승격하지 않는다.
|
||||||
|
2. 법률행위·사실행위·상태·평가 입력을 분리하되 동일 event의 증거를 문서별 seed로 과분할하지 않는다.
|
||||||
|
3. 원고에게 유리한 사실과 반대사실·항변·충돌 자료를 같은 proof grade로 병렬 보존한다.
|
||||||
|
4. legacy payload 의미와 source provenance를 extension에 투영하고, 신규 필드는 additive로만 사용한다.
|
||||||
|
5. 계산 `CE-04·CE-11`에는 결과값이나 법정 수치를 쓰지 않고 operand·기준일·누락·scenario 필요성만 전달한다.
|
||||||
|
6. Part 3에는 등록 structure type 후보와 source refs를 보내고, Part 4에는 이 pack의 effect projection과 gate 결과를 전달한다.
|
||||||
|
7. 최종 법률평가·청구선택·책임범위·계산값은 생성하지 않는다.
|
||||||
|
|
||||||
|
## 금지규칙
|
||||||
|
|
||||||
|
- 사건 종류명·단일 법률용어·문서 제목만으로 활성하지 않는다.
|
||||||
|
- 반대증거, 불리한 사실, 누락 operand, 상충하는 날짜·금액·자산 표시를 삭제하거나 빈 배열로 위장하지 않는다.
|
||||||
|
- 법정률·기간·상한 숫자를 프롬프트에 고정하지 않는다. SG-04와 해당 계산 registry가 정하는 versioned input만 참조한다.
|
||||||
|
- 미등록 효과를 `general_legal_effect`로 침묵 강등하지 않고 `UNROUTED_ISSUE_REVIEW` 또는 등록 gate로 보낸다.
|
||||||
|
|
||||||
|
## 자산 4축 규칙
|
||||||
|
|
||||||
|
- 동일 자산의 `ownership`, `possession`, `use`, `benefit` 상태를 하나로 압축하지 않는다.
|
||||||
|
- alias·등기 lineage·지분·면적·기준시점의 충돌을 해소했다고 가정하지 말고 conflict group으로 유지한다.
|
||||||
|
|
||||||
|
## 출력 계약
|
||||||
|
|
||||||
|
root는 `stage_b_domain_bo_seed_output`, schema version은 `task_c_bo_stage_b_domain_bo_seed.v3`이다. `final_conclusion_forbidden=true`와 source membership, strict JSON, review 비감소 규칙을 지킨다. domain payload는 `extensions.domain_payload.payload`에만 기록하고 `domain_extension.schema.json`을 통과해야 한다.
|
||||||
+353
@@ -0,0 +1,353 @@
|
|||||||
|
{
|
||||||
|
"schema_version": "stage1_domain_config.v1",
|
||||||
|
"domain_id": "X3",
|
||||||
|
"label_ko": "절차·청구형태·당사자적격·track 경계",
|
||||||
|
"slug": "procedure_relief_standing_boundary",
|
||||||
|
"kind": "always_on",
|
||||||
|
"status": "active",
|
||||||
|
"execution_policy": {
|
||||||
|
"runnable": true,
|
||||||
|
"always_on": true,
|
||||||
|
"model_tier": "flash",
|
||||||
|
"output_mode": "strict_json",
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"max_instances": 1
|
||||||
|
},
|
||||||
|
"depends_on": [],
|
||||||
|
"special_law_profiles": [],
|
||||||
|
"activation_cues": {
|
||||||
|
"positive_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "X3-P01",
|
||||||
|
"cue_type": "relief",
|
||||||
|
"match_value": "이행·확인·형성·장래이행·일부청구·병합 중 하나 이상의 청구형태 단서",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": null,
|
||||||
|
"strength": "strong",
|
||||||
|
"weight": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "X3-P02",
|
||||||
|
"cue_type": "party_role",
|
||||||
|
"match_value": "권리귀속·원고적격·피고적격·당사자능력·대표권·승계·공동소송 자료",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": null,
|
||||||
|
"strength": "strong",
|
||||||
|
"weight": 1.0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "X3-P03",
|
||||||
|
"cue_type": "other",
|
||||||
|
"match_value": "관할·소가·인지·제소기간·재심·준재심 또는 민사·가사·행정 track 경계 자료",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": null,
|
||||||
|
"strength": "support",
|
||||||
|
"weight": 0.6
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"negative_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "X3-N01",
|
||||||
|
"cue_type": "term",
|
||||||
|
"match_value": "사건명·접수부호·지원명만 있고 청구나 당사자·절차 사실이 없음",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "사건명 하나로 적격·track을 확정하지 않음",
|
||||||
|
"effect": "monitor_review",
|
||||||
|
"weight": 0.6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "X3-N02",
|
||||||
|
"cue_type": "other",
|
||||||
|
"match_value": "상대방 또는 법원에 제출되지 않은 내부 초안",
|
||||||
|
"source_field": "selected_sources.payload",
|
||||||
|
"note": "소송행위로 승격하지 않음",
|
||||||
|
"effect": "confidence_downrank_only",
|
||||||
|
"weight": 0.6
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"conflict_cues": [
|
||||||
|
{
|
||||||
|
"cue_id": "X3-C01",
|
||||||
|
"rule": "동일 권리의 귀속자·대표자·승계인 원천이 불일치",
|
||||||
|
"left_refs": [],
|
||||||
|
"right_refs": [],
|
||||||
|
"effect": "hard_review",
|
||||||
|
"review_code": "X3_PARTY_STANDING_CONFLICT_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cue_id": "X3-C02",
|
||||||
|
"rule": "하나의 쟁점이 민사·가사·행정·보전집행 track으로 서로 다르게 지시됨",
|
||||||
|
"left_refs": [],
|
||||||
|
"right_refs": [],
|
||||||
|
"effect": "hard_review",
|
||||||
|
"review_code": "TRACK_BOUNDARY_REVIEW"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"routing_policy": {
|
||||||
|
"fail_open": true,
|
||||||
|
"candidate_downgrade_forbidden": true,
|
||||||
|
"minimum_primary_evidence": 0,
|
||||||
|
"leaf_activation_threshold": 1.0,
|
||||||
|
"monitor_threshold": 0.5,
|
||||||
|
"unknown_review_code": "UNROUTED_ISSUE_REVIEW"
|
||||||
|
},
|
||||||
|
"element_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "x3.el01",
|
||||||
|
"label": "원고·피고 후보와 권리귀속·당사자적격 근거",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "X3_PARTY_STANDING_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "x3.el02",
|
||||||
|
"label": "이행·확인·형성 및 확인의 이익·장래이행·일부청구 사실",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "X3_RELIEF_FORM_GAP_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "x3.el03",
|
||||||
|
"label": "관할·병합·소가·인지·제소기간 산정 operand",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "MISSING_REQUIRED_OPERAND"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "x3.el04",
|
||||||
|
"label": "당사자능력·소송능력·법정대리·대표권·승계 상태",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "x3.el05",
|
||||||
|
"label": "재심대상·재심사유·불변기간·준재심 근거 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "X3_EXTRAORDINARY_REMEDY_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "x3.el06",
|
||||||
|
"label": "민사·가사·행정·보전집행 track 경계 근거",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": true,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": "TRACK_BOUNDARY_REVIEW"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"opposing_fact_slots": [
|
||||||
|
{
|
||||||
|
"slot_id": "x3.op01",
|
||||||
|
"label": "확인의 이익·당사자적격·관할·제소기간 흠결 항변 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"slot_id": "x3.op02",
|
||||||
|
"label": "공법상 법률관계 또는 가사 고유사항이라는 반대 track 후보",
|
||||||
|
"cardinality": "many",
|
||||||
|
"required_for_analysis": false,
|
||||||
|
"allowed_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate",
|
||||||
|
"meeting_clause"
|
||||||
|
],
|
||||||
|
"missing_review_code": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"evidence_components": [
|
||||||
|
{
|
||||||
|
"component_id": "x3.party_authority",
|
||||||
|
"label": "당사자·법인·대표자·승계인 권한·귀속 원천",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "capacity_or_standing"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "x3.relief_instrument",
|
||||||
|
"label": "청구취지·청구원인·재판·합의·집행권원 원천",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "relief_form"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "x3.procedure_record",
|
||||||
|
"label": "소장·송달·확정증명·재판절차·재심 원천",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "procedural_posture"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"component_id": "x3.valuation_fee_input",
|
||||||
|
"label": "청구금액·목적물 가액·병합·소가·인지 입력",
|
||||||
|
"accepted_source_kinds": [
|
||||||
|
"evidence",
|
||||||
|
"event_candidate"
|
||||||
|
],
|
||||||
|
"proof_role": "court_fee_operand"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"defense_map": [
|
||||||
|
{
|
||||||
|
"defense_id": "x3.no_standing",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"x3.op01"
|
||||||
|
],
|
||||||
|
"review_code": "X3_PARTY_STANDING_CONFLICT_REVIEW"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"defense_id": "x3.track_boundary",
|
||||||
|
"trigger_slot_ids": [
|
||||||
|
"x3.op02"
|
||||||
|
],
|
||||||
|
"review_code": "TRACK_BOUNDARY_REVIEW"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"calculation_bindings": [
|
||||||
|
"CE-03",
|
||||||
|
"CE-13"
|
||||||
|
],
|
||||||
|
"emits_signals": [
|
||||||
|
"SG-01",
|
||||||
|
"SG-02",
|
||||||
|
"SG-03",
|
||||||
|
"SG-04",
|
||||||
|
"SG-06",
|
||||||
|
"SG-10",
|
||||||
|
"SG-11",
|
||||||
|
"SG-12",
|
||||||
|
"SG-13"
|
||||||
|
],
|
||||||
|
"bo_types": [
|
||||||
|
"event",
|
||||||
|
"state"
|
||||||
|
],
|
||||||
|
"structure_types": [
|
||||||
|
{
|
||||||
|
"type_id": "succession_notice_lien_asset_defense",
|
||||||
|
"priority_rank": 10,
|
||||||
|
"module": "succession_notice_lien_asset_defense",
|
||||||
|
"role_projection": "linked_structures"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type_id": "general_legal_effect",
|
||||||
|
"priority_rank": 11,
|
||||||
|
"module": "legal_effect",
|
||||||
|
"role_projection": "legal_effect_roles"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"effect_projection": {
|
||||||
|
"schema_ref": "Default_Agent/domains/X3/effect_projection.schema.json",
|
||||||
|
"module": "succession_notice_lien_asset_defense",
|
||||||
|
"role_projection": "linked_structures"
|
||||||
|
},
|
||||||
|
"gates": [
|
||||||
|
{
|
||||||
|
"gate_id": "X3-G01",
|
||||||
|
"implementation_ref": "Default_Agent/domains/X3/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"X3_PARTY_STANDING_GAP_REVIEW",
|
||||||
|
"X3_PARTY_STANDING_CONFLICT_REVIEW",
|
||||||
|
"X3_CAPACITY_AUTHORITY_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "X3-G02",
|
||||||
|
"implementation_ref": "Default_Agent/domains/X3/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"X3_RELIEF_FORM_GAP_REVIEW",
|
||||||
|
"X3_EXTRAORDINARY_REMEDY_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "X3-G03",
|
||||||
|
"implementation_ref": "Default_Agent/domains/X3/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"TRACK_BOUNDARY_REVIEW",
|
||||||
|
"PUBLIC_LAW_NEXUS_REVIEW"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"gate_id": "X3-G04",
|
||||||
|
"implementation_ref": "Default_Agent/domains/X3/gates.json",
|
||||||
|
"review_codes": [
|
||||||
|
"MISSING_REQUIRED_OPERAND",
|
||||||
|
"CALCULATION_PREEMPTION_BLOCKED"
|
||||||
|
],
|
||||||
|
"blocks_final_drafting": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"review_codes": [
|
||||||
|
"X3_PARTY_STANDING_GAP_REVIEW",
|
||||||
|
"X3_PARTY_STANDING_CONFLICT_REVIEW",
|
||||||
|
"X3_RELIEF_FORM_GAP_REVIEW",
|
||||||
|
"X3_CAPACITY_AUTHORITY_REVIEW",
|
||||||
|
"X3_EXTRAORDINARY_REMEDY_REVIEW",
|
||||||
|
"TRACK_BOUNDARY_REVIEW",
|
||||||
|
"PUBLIC_LAW_NEXUS_REVIEW",
|
||||||
|
"MISSING_REQUIRED_OPERAND",
|
||||||
|
"CALCULATION_PREEMPTION_BLOCKED",
|
||||||
|
"UNROUTED_ISSUE_REVIEW"
|
||||||
|
],
|
||||||
|
"contract_guards": {
|
||||||
|
"final_conclusion_forbidden": true,
|
||||||
|
"unknown_values_require_review": true,
|
||||||
|
"source_membership_required": true,
|
||||||
|
"strict_json_output": true,
|
||||||
|
"meeting_only_evidence_promotion_forbidden": true
|
||||||
|
},
|
||||||
|
"prompt_overlay_ref": "seed_prompt_overlay.md",
|
||||||
|
"profile_schema_ref": "profile.schema.json",
|
||||||
|
"extension_schema_ref": "domain_extension.schema.json",
|
||||||
|
"runtime_activation_from_legacy_alias_forbidden": true,
|
||||||
|
"case_kind_name_runtime_lookup_forbidden": true,
|
||||||
|
"removed_noncanonical_signal_aliases": [
|
||||||
|
"domain_signal"
|
||||||
|
]
|
||||||
|
}
|
||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
# X3 절차·청구형태·당사자적격·track 경계 S2 overlay
|
||||||
|
|
||||||
|
B5의 party-status succession·주요 항변·교차 도메인 merge review를 절차적 시각으로 이관하고, ensemble_v2의 이행/확인/형성·적격·관할·소가·재심·track 경계 규칙을 가산한다.
|
||||||
|
|
||||||
|
1. 청구형태, 확인의 이익, 장래이행·일부청구·병합, 당사자적격·능력·대표권·승계를 서로 다른 slot으로 보존한다.
|
||||||
|
2. 관할·소가·인지·제소기간·재심은 적용 법령 버전과 필수 operand를 수집하되 Stage 1에서 최종 소송요건 판단을 하지 않는다.
|
||||||
|
3. 민사·가사·행정·보전집행 중 어느 track인지 애매하거나 공법적 접점이 있으면 `TRACK_BOUNDARY_REVIEW` 또는 `PUBLIC_LAW_NEXUS_REVIEW`를 반드시 낸다.
|
||||||
|
4. 재심·준재심은 대상 재판, 확정, 사유, 기간, 안 날 후 경과를 개별 후보로 보존하며, 사유의 존부를 최종 판단하지 않는다.
|
||||||
|
5. 사건명·접수부호·당사자명·개별 날짜를 라우팅 규칙으로 하드코딩하지 않는다.
|
||||||
|
|
||||||
|
출력은 seed v3 엄격 JSON이며 최종 적격·관할·적법·track 결론은 금지된다.
|
||||||
+42
@@ -0,0 +1,42 @@
|
|||||||
|
# Stage 1 dynamic domain worker contract v1
|
||||||
|
|
||||||
|
`contract_id`: `stage1_dynamic_domain_worker.v1`
|
||||||
|
|
||||||
|
## Authority and scope
|
||||||
|
|
||||||
|
- This worker receives exactly one compiled `stage_b_domain_slice.v2`, one active domain configuration, its dependency fragments, and the compiler-injected `task_c_bo_stage_b_domain_bo_seed.v3` output contract.
|
||||||
|
- The slice, registry state, injected schemas, and writer boundary control. A fragment may narrow the work but may not widen the authorized input, output, legal domain, or writer surface.
|
||||||
|
- Stage 1 preserves evidence-grounded candidates for downstream legal analysis. It does not draft complaint prose, choose a final cause of action, decide ultimate liability, or fix a final amount.
|
||||||
|
- `final_conclusion_forbidden` is always `true`. A domain overlay cannot override this rule.
|
||||||
|
|
||||||
|
## Source and hallucination guard
|
||||||
|
|
||||||
|
- Use only records present in the assigned slice and compiler-injected registry material. Do not import parties, facts, dates, amounts, evidence meanings, legal conclusions, or procedural history from memory.
|
||||||
|
- Preserve source IDs. Keep client statements, evidence-supported facts, inferences, conflicts, legal signals, and review decisions distinct.
|
||||||
|
- Meeting-only content never becomes evidence. Unsupported, missing, stale, or conflicting content must use the schema's missing, contested, review, or blocked path.
|
||||||
|
- Do not resolve a material conflict silently. Negative and conflict cues lower routing confidence or cause review; they never erase a supported screening candidate.
|
||||||
|
|
||||||
|
## Read diet and routing
|
||||||
|
|
||||||
|
- Read only the assigned slice fields. Do not reconstruct the full Stage A universe or use a case-kind label as factual authority.
|
||||||
|
- Runtime activation is based on structured cues, evidence components, element slots, and provenance. Case-kind names are allowed only in offline regression catalogs and are forbidden as runtime routing keys.
|
||||||
|
- Inspect every selected item assigned to this worker. Preserve shared or ambiguous items and dependency references.
|
||||||
|
|
||||||
|
## Candidate and calculation boundary
|
||||||
|
|
||||||
|
- Emit fact candidates, opposing candidates, defense triggers, calculation requests, dependency references, and review items only when supported by the slice.
|
||||||
|
- A calculation request records operands, missing operands, source references, the applicable calculator ID, and law-version needs. Stage 1 does not select an unsupported legal rate, infer a missing operand, or declare a final claim amount.
|
||||||
|
- Sparse output is permitted only for optional empty values. Meaningful `false`, `0`, conflicts, missing-required status, and review flags must be preserved.
|
||||||
|
|
||||||
|
## Output and writer boundary
|
||||||
|
|
||||||
|
- Emit one strict JSON object only. No markdown fence, heading, explanatory tail, or extra file.
|
||||||
|
- The root key is exactly `stage_b_domain_bo_seed_output`; `schema_version` is exactly `task_c_bo_stage_b_domain_bo_seed.v3`.
|
||||||
|
- Do not invent keys outside the injected schema. The worker is not authorized to normalize or merge IDs across workers.
|
||||||
|
- Route every review need only to the per-candidate `review_items` array and the root `unknown_or_unrouted_reviews` array. Do not use any other review key name (including `domain_review_queue` — a legacy name some domain overlays still mention). The only valid key for defense candidates is `defense_candidates`.
|
||||||
|
- When hard input or contract validation fails, use `FAILED`. When a review item exists without a hard failure, use `READY_WITH_REVIEW`; otherwise use `READY`.
|
||||||
|
- Stop when the schema is complete and safe. Keep private reasoning private.
|
||||||
|
|
||||||
|
## Mandatory echo
|
||||||
|
|
||||||
|
Every worker output must preserve the compiled task instance ID, domain ID, source slice digest, registry version, and `final_conclusion_forbidden: true` so that R0 can verify exact membership and provenance.
|
||||||
+1
File diff suppressed because one or more lines are too long
+1
@@ -0,0 +1 @@
|
|||||||
|
{"comparison_exclusions": {"routing/domain_screening_draft.json": "llm_nondeterministic_draft", "run_meta.json": "execution metadata differs by design", "validation_and_manifest": "post-product evidence would create a circular comparison"}, "deterministic_product_set": ["compiled_raw/E-00.md", "compiled_raw/E-02.md", "compiled_raw/E-13.md", "compiled_raw/X1.md", "fanout/domain_fanout_plan.json", "fanout/r0_barrier_report.json", "fanout/r0_expected_set.json", "prompt_manifests/E-00.json", "prompt_manifests/E-02.json", "prompt_manifests/E-13.json", "prompt_manifests/X1.json", "routing/candidate_profile_vocabulary.md", "routing/domain_activation_manifest.json", "routing/domain_screening.json", "routing/domain_screening_draft.json", "run_summary.json", "seeds/E-00.json", "seeds/E-02.json", "seeds/E-13.json", "seeds/X1.json", "slice_compilation_summary.json", "slices/E-00.json", "slices/E-02.json", "slices/E-13.json", "slices/X1.json", "worker_validation/E-00.json", "worker_validation/E-02.json", "worker_validation/E-13.json", "worker_validation/X1.json"], "evidence_set": ["e2e/run_a/run_meta.json", "e2e/run_b/run_meta.json", "e2e/two_run_comparison.v2.json", "validation/s1_validation_report.v2.json", "release_manifest.v2.json", "smoke/capability_probe.json"], "schema_version": "s1_determinism_scope_contract.v2", "scope_declaration_phase": "before_release_comparison", "status": "ACTIVE", "unclassified_file_policy": "DETERMINISM_SCOPE_UNCLASSIFIED_FILE"}
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
{"catalog_id":"calculation_domains","entries":[{"calculation_id":"CE-01","status":"ready","tier":"core"},{"calculation_id":"CE-02","status":"ready","tier":"core"},{"calculation_id":"CE-03","status":"ready","tier":"core"},{"calculation_id":"CE-04","status":"ready","tier":"core"},{"calculation_id":"CE-05","status":"ready","tier":"core"},{"calculation_id":"CE-06","status":"ready","tier":"core"},{"calculation_id":"CE-07","status":"ready","tier":"core"},{"calculation_id":"CE-08","status":"ready","tier":"core"},{"calculation_id":"CE-09","status":"ready","tier":"core"},{"calculation_id":"CE-10","status":"ready","tier":"core"},{"calculation_id":"CE-11","status":"ready","tier":"core"},{"calculation_id":"CE-12","status":"ready","tier":"core"},{"calculation_id":"CE-13","status":"ready","tier":"core"},{"calculation_id":"CE-R1","status":"deferred","tier":"deferred"},{"calculation_id":"CE-R2","status":"deferred","tier":"deferred"},{"calculation_id":"CE-R3","status":"deferred","tier":"deferred"},{"calculation_id":"CE-R4","status":"deferred","tier":"deferred"}],"expected_count":17,"schema_version":"stage1_assembly_reference_catalog.v1"}
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
{"domain_ids":["E-00","E-01","E-02","E-03","E-04","E-05","E-06","E-07","E-08","E-09","E-10","E-11","E-12","E-13","E-14","E-15","E-16","E-17","E-18","E-19","E-20","E-21","EC-00","X1","X2","X3"],"expected_count":26,"schema_version":"stage1_assembly_domain_id_catalog.v1"}
|
||||||
+321
@@ -0,0 +1,321 @@
|
|||||||
|
{
|
||||||
|
"description": "client_goal_domain_profiles.v1 — 사건군 하나에서 활성 후보로 오른 법리 도메인마다, 그 도메인이 앞으로 필요로 할 재료가 상담록에 어떤 상태로 존재하는지를 적는 준비물 점검층이다. 법률 판단이 아니다. 부착 위치는 client_goal.json 의 issue_clusters[*].domain_profiles 이며, 키는 도메인 ID다. 축은 ensemble_v2 §2.1 이 정한 registry 선언 8종 중 상담록 단계에 대응물이 있는 다섯이다 — element_slots, opposing_fact_slots, evidence_components, defense_map, calculation_bindings. 나머지 셋은 여기에 오지 않는다: activation_cues 는 domain_screening.json 이 이미 쓰고, emits_signals 와 gates 는 Part 2 이후의 산출·게이트라 상담록 단계의 준비물이 아니다.",
|
||||||
|
"$comment": "배치 경로: Default_Agent/platform/schemas/client_goal_domain_profiles.schema.json ($id 는 두지 않는다.) 계약 가드(스키마 밖에서 강제): (1) final_conclusion_forbidden — 이 층은 법률효과·승패·금액을 확정하지 않는다. (2) meeting_only_evidence_promotion_forbidden — 모든 값의 근거는 상담록 서술뿐이며 증거 참조 필드를 두지 않는다. status=observed 는 '상담록에 직접 서술됨'이지 '증거로 입증됨'이 아니다. (3) source_membership_required — source_refs 의 모든 원소는 domain_screening.json 의 source_document_refs 에 있는 값이어야 한다. (4) 각 배열 안에서 slot_id / component_id / defense_id / calculation_id 는 중복되지 않는다. (5) 도메인 키와 그 안의 ID는 해당 도메인의 domain_config.json 선언에 실재해야 한다. (6) 특별법 프로필(SLP-*)은 이 층의 대상이 아니다 — registry 의 profile.schema.json 소관이다. (7) operand_state_not_emitted — 이 층은 operand_state 를 산출하지 않는다. s4_calculation_input.schema.json 의 ready|partial|blocked|deferred 를 유도할 책임은 Part 2 에 있다.",
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"minProperties": 1,
|
||||||
|
"maxProperties": 26,
|
||||||
|
"propertyNames": {
|
||||||
|
"pattern": "^(?:(?:EC|E)-[A-Z0-9]{2,8}|X[A-Z0-9]{1,8})$"
|
||||||
|
},
|
||||||
|
"patternProperties": {
|
||||||
|
"^(?:(?:EC|E)-[A-Z0-9]{2,8}|X[A-Z0-9]{1,8})$": {
|
||||||
|
"$ref": "#/$defs/domain_profile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"$defs": {
|
||||||
|
"meeting_status": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "상담록 기준 상태. ensemble_v2 §4.1 signal status 어휘를 그대로 쓴다. observed=상담록에 직접 서술됨(증거 입증이 아님), inferred=다른 서술에서 추론됨, contested=상반 서술이 함께 있음, missing_required=필수인데 서술 없음, review=판단 보류. 이 다섯 값은 상담록 단계 전용이다. 증거 단계 정본 signals/_common/evidence_slot_status.schema.json 의 filled|partial|missing|conflicted 와 다른 층이며, 변환은 stage_1_update_strategy.md §0.3.1 매핑표를 따르고 단방향(상담록→증거)이다. 이 층에서는 filled 를 쓸 수 없다.",
|
||||||
|
"enum": [
|
||||||
|
"observed",
|
||||||
|
"inferred",
|
||||||
|
"contested",
|
||||||
|
"missing_required",
|
||||||
|
"review"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"slot_status": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"slot_id",
|
||||||
|
"slot_kind",
|
||||||
|
"status",
|
||||||
|
"source_refs"
|
||||||
|
],
|
||||||
|
"description": "registry 의 element_slots(요건사실 슬롯) 및 opposing_fact_slots(상대사실 슬롯) 한 칸의 상담록 충족 상태. 실측 기준 도메인당 요건 슬롯 2~10개, 상대사실 슬롯 0~6개다.",
|
||||||
|
"properties": {
|
||||||
|
"slot_id": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[a-z][a-z0-9_]{0,62}(?:\\.[a-z0-9_]{1,62}){0,2}$",
|
||||||
|
"description": "domain_config.element_slots 또는 opposing_fact_slots 의 slot_id 를 그대로 쓴다."
|
||||||
|
},
|
||||||
|
"slot_kind": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"element",
|
||||||
|
"opposing"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"status": {
|
||||||
|
"$ref": "#/$defs/meeting_status"
|
||||||
|
},
|
||||||
|
"source_refs": {
|
||||||
|
"type": "array",
|
||||||
|
"uniqueItems": true,
|
||||||
|
"maxItems": 64,
|
||||||
|
"description": "이 판단의 근거가 된 상담록 단위 식별자.",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z][A-Za-z0-9_.:/-]{0,255}$"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"note": {
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 1,
|
||||||
|
"maxLength": 300,
|
||||||
|
"description": "무엇이 있고 무엇이 비었는지에 대한 짧은 기술. 법률 판단을 쓰지 않는다."
|
||||||
|
},
|
||||||
|
"missing_review_code": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Z][A-Z0-9_]{2,127}$",
|
||||||
|
"description": "status=missing_required 일 때, 그 슬롯이 선언한 missing_review_code 를 그대로 옮긴다."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"evidence_component_status": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"component_id",
|
||||||
|
"status",
|
||||||
|
"source_refs"
|
||||||
|
],
|
||||||
|
"description": "registry 의 evidence_components 한 칸에 대해, 그 자료가 존재한다고 상담록이 말하고 있는지를 적는다. 자료를 확보했다는 뜻이 아니라 언급되었다는 뜻이다. 실제 확보 여부는 증거 색인 단계의 일이다.",
|
||||||
|
"properties": {
|
||||||
|
"component_id": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[a-z][a-z0-9_]{0,62}(?:\\.[a-z0-9_]{1,62}){0,2}$"
|
||||||
|
},
|
||||||
|
"status": {
|
||||||
|
"$ref": "#/$defs/meeting_status"
|
||||||
|
},
|
||||||
|
"source_refs": {
|
||||||
|
"type": "array",
|
||||||
|
"uniqueItems": true,
|
||||||
|
"maxItems": 64,
|
||||||
|
"description": "자료의 존재를 언급한 상담록 단위 식별자.",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z][A-Za-z0-9_.:/-]{0,255}$"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"note": {
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 1,
|
||||||
|
"maxLength": 300
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"defense_signal_status": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"defense_id",
|
||||||
|
"raised_by",
|
||||||
|
"status",
|
||||||
|
"source_refs"
|
||||||
|
],
|
||||||
|
"description": "registry 의 defense_map 한 항목에 대응하는 항변 단서가 상담록에 나타났는지를 적는다. 상담록의 상대방 주장 절이 주된 출처다. 항변의 당부는 판단하지 않는다.",
|
||||||
|
"properties": {
|
||||||
|
"defense_id": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[a-z][a-z0-9_]{0,62}(?:\\.[a-z0-9_]{1,62}){0,2}$"
|
||||||
|
},
|
||||||
|
"raised_by": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"opposing_party",
|
||||||
|
"client",
|
||||||
|
"unclear"
|
||||||
|
],
|
||||||
|
"description": "누구의 서술에서 나온 단서인가. 의뢰인이 스스로 예상한 항변도 보존한다."
|
||||||
|
},
|
||||||
|
"status": {
|
||||||
|
"$ref": "#/$defs/meeting_status"
|
||||||
|
},
|
||||||
|
"source_refs": {
|
||||||
|
"type": "array",
|
||||||
|
"uniqueItems": true,
|
||||||
|
"maxItems": 64,
|
||||||
|
"description": "항변 단서가 나타난 상담록 단위 식별자.",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z][A-Za-z0-9_.:/-]{0,255}$"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"note": {
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 1,
|
||||||
|
"maxLength": 300
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"operand_gap": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"operand_label",
|
||||||
|
"gap_kind"
|
||||||
|
],
|
||||||
|
"description": "계산에 필요한 값 중 상담록만으로는 확정되지 않는 것.",
|
||||||
|
"properties": {
|
||||||
|
"operand_label": {
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 1,
|
||||||
|
"maxLength": 120,
|
||||||
|
"description": "예: 약정 이율, 변제기, 처분 당시 목적물 가액."
|
||||||
|
},
|
||||||
|
"gap_kind": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"not_stated",
|
||||||
|
"ambiguous",
|
||||||
|
"conflicting"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"calculation_readiness": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"calculation_id",
|
||||||
|
"need_basis",
|
||||||
|
"operand_gaps",
|
||||||
|
"source_refs"
|
||||||
|
],
|
||||||
|
"description": "registry 의 calculation_bindings 에 묶인 계산 도메인 하나에 대해, 이 사건군에서 그 계산이 필요해 보이는 근거와 상담록만으로 채워지지 않는 피연산자를 적는다. 계산 ID 목록 자체는 domain_screening.json 과 domain_activation_manifest 가 이미 들고 있으므로 여기서는 목록을 다시 만드는 것이 아니라 피연산자 상태를 담는 것이 목적이다. ensemble_v2 §3.1 에 따라 Stage 1 은 operand 완전성 검증까지만 하고 값을 산정하지 않는다. operand_state(ready|partial|blocked|deferred)는 여기에 두지 않는다. additionalProperties:false 가 그 키의 삽입을 이미 구조로 차단한다.",
|
||||||
|
"properties": {
|
||||||
|
"calculation_id": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^CE-[A-Z0-9][A-Z0-9-]{0,15}$",
|
||||||
|
"description": "그 도메인의 calculation_bindings 안에 있는 값만 쓴다."
|
||||||
|
},
|
||||||
|
"need_basis": {
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 1,
|
||||||
|
"maxLength": 300,
|
||||||
|
"description": "왜 이 계산이 필요해 보이는지. 상담록 서술에 근거한 한 문장."
|
||||||
|
},
|
||||||
|
"operand_gaps": {
|
||||||
|
"type": "array",
|
||||||
|
"maxItems": 24,
|
||||||
|
"uniqueItems": true,
|
||||||
|
"items": {
|
||||||
|
"$ref": "#/$defs/operand_gap"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"source_refs": {
|
||||||
|
"type": "array",
|
||||||
|
"uniqueItems": true,
|
||||||
|
"maxItems": 64,
|
||||||
|
"description": "계산 필요성이 읽히는 상담록 단위 식별자.",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z][A-Za-z0-9_.:/-]{0,255}$"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"review_item": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"review_code",
|
||||||
|
"severity",
|
||||||
|
"reason",
|
||||||
|
"source_refs"
|
||||||
|
],
|
||||||
|
"description": "이 도메인 profile 수준의 재검토 표지. review_code 는 새로 만들지 않고 그 도메인의 domain_config.review_codes 또는 슬롯의 missing_review_code 에 있는 값을 쓴다.",
|
||||||
|
"properties": {
|
||||||
|
"review_code": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Z][A-Z0-9_]{2,127}$"
|
||||||
|
},
|
||||||
|
"severity": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"info",
|
||||||
|
"review",
|
||||||
|
"hard_warning"
|
||||||
|
],
|
||||||
|
"description": "block 은 쓰지 않는다. 실행 차단은 하류 게이트의 권한이다."
|
||||||
|
},
|
||||||
|
"reason": {
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 1,
|
||||||
|
"maxLength": 1000
|
||||||
|
},
|
||||||
|
"source_refs": {
|
||||||
|
"type": "array",
|
||||||
|
"uniqueItems": true,
|
||||||
|
"maxItems": 64,
|
||||||
|
"description": "근거가 된 상담록 단위 식별자.",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z][A-Za-z0-9_.:/-]{0,255}$"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"blocks_final_drafting": {
|
||||||
|
"type": "boolean"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"domain_profile": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"slot_status",
|
||||||
|
"evidence_component_status",
|
||||||
|
"defense_signal_status",
|
||||||
|
"calculation_readiness",
|
||||||
|
"review_items"
|
||||||
|
],
|
||||||
|
"description": "한 도메인의 준비물 점검표. 다섯 배열이 모두 필수이며, 해당 사항이 없으면 빈 배열로 둔다. 빈 배열과 키 누락을 구분하는 이유는 하류가 '점검했으나 없음'과 '점검하지 않음'을 구별할 수 있어야 하기 때문이다.",
|
||||||
|
"properties": {
|
||||||
|
"slot_status": {
|
||||||
|
"type": "array",
|
||||||
|
"maxItems": 32,
|
||||||
|
"uniqueItems": true,
|
||||||
|
"items": {
|
||||||
|
"$ref": "#/$defs/slot_status"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"evidence_component_status": {
|
||||||
|
"type": "array",
|
||||||
|
"maxItems": 16,
|
||||||
|
"uniqueItems": true,
|
||||||
|
"items": {
|
||||||
|
"$ref": "#/$defs/evidence_component_status"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"defense_signal_status": {
|
||||||
|
"type": "array",
|
||||||
|
"maxItems": 16,
|
||||||
|
"uniqueItems": true,
|
||||||
|
"items": {
|
||||||
|
"$ref": "#/$defs/defense_signal_status"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"calculation_readiness": {
|
||||||
|
"type": "array",
|
||||||
|
"maxItems": 8,
|
||||||
|
"uniqueItems": true,
|
||||||
|
"items": {
|
||||||
|
"$ref": "#/$defs/calculation_readiness"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"review_items": {
|
||||||
|
"type": "array",
|
||||||
|
"maxItems": 32,
|
||||||
|
"uniqueItems": true,
|
||||||
|
"items": {
|
||||||
|
"$ref": "#/$defs/review_item"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+370
@@ -0,0 +1,370 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||||
|
"$id": "https://schemas.liti-agent.local/stage1/s1/domain_fanout_plan.schema.json",
|
||||||
|
"title": "Liti-agent Domain Fan-out Plan",
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"domain_fanout_plan"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"domain_fanout_plan": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"schema_version",
|
||||||
|
"registry_version",
|
||||||
|
"registry_index_sha256",
|
||||||
|
"activation_manifest_sha256",
|
||||||
|
"plan_id",
|
||||||
|
"status",
|
||||||
|
"task_instances",
|
||||||
|
"barrier_contract",
|
||||||
|
"review_items",
|
||||||
|
"unknown_or_unrouted_reviews",
|
||||||
|
"contract_guards"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"schema_version": {
|
||||||
|
"const": "domain_fanout_plan.v1"
|
||||||
|
},
|
||||||
|
"registry_version": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z][A-Za-z0-9_.-]{2,127}$"
|
||||||
|
},
|
||||||
|
"registry_index_sha256": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[a-f0-9]{64}$"
|
||||||
|
},
|
||||||
|
"activation_manifest_sha256": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[a-f0-9]{64}$"
|
||||||
|
},
|
||||||
|
"plan_id": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^FANOUT-[A-Za-z0-9][A-Za-z0-9._-]{0,127}$"
|
||||||
|
},
|
||||||
|
"status": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"READY",
|
||||||
|
"READY_WITH_REVIEW",
|
||||||
|
"BLOCKED",
|
||||||
|
"FAILED"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"task_instances": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"task_instance_id",
|
||||||
|
"domain_id",
|
||||||
|
"activation_status",
|
||||||
|
"execution_status",
|
||||||
|
"model_tier",
|
||||||
|
"slice_path",
|
||||||
|
"slice_sha256",
|
||||||
|
"compiled_prompt_path",
|
||||||
|
"compiled_prompt_sha256",
|
||||||
|
"expected_output_path",
|
||||||
|
"contract_guards"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"task_instance_id": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^DOMAIN-[A-Za-z0-9][A-Za-z0-9._-]{0,127}$"
|
||||||
|
},
|
||||||
|
"domain_id": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^(?:(?:EC|E)-[A-Z0-9]{2,8}|X[A-Z0-9]{1,8})$"
|
||||||
|
},
|
||||||
|
"activation_status": {
|
||||||
|
"type": "string",
|
||||||
|
"$comment": "S1-D-3_S2-D-6_decision.md §1.3 규칙표의 6종. active_with_review·review 는 게이트가 낼 수 있으나 종래 enum 이 거부하던 값이며 additive 로 넓혔다.",
|
||||||
|
"enum": [
|
||||||
|
"active",
|
||||||
|
"active_with_review",
|
||||||
|
"monitor",
|
||||||
|
"residual",
|
||||||
|
"review",
|
||||||
|
"supporting"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_status": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"scheduled",
|
||||||
|
"monitor_only",
|
||||||
|
"skipped",
|
||||||
|
"blocked"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"model_tier": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"flash",
|
||||||
|
"pro"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"slice_path": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$)).+"
|
||||||
|
},
|
||||||
|
"slice_sha256": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[a-f0-9]{64}$"
|
||||||
|
},
|
||||||
|
"compiled_prompt_path": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$)).+"
|
||||||
|
},
|
||||||
|
"compiled_prompt_sha256": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[a-f0-9]{64}$"
|
||||||
|
},
|
||||||
|
"expected_output_path": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$)).+"
|
||||||
|
},
|
||||||
|
"dependency_domain_ids": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^(?:(?:EC|E)-[A-Z0-9]{2,8}|X[A-Z0-9]{1,8})$"
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"contract_guards": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"final_conclusion_forbidden",
|
||||||
|
"unknown_values_require_review",
|
||||||
|
"source_membership_required",
|
||||||
|
"strict_json_output"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"final_conclusion_forbidden": {
|
||||||
|
"const": true
|
||||||
|
},
|
||||||
|
"unknown_values_require_review": {
|
||||||
|
"const": true
|
||||||
|
},
|
||||||
|
"source_membership_required": {
|
||||||
|
"const": true
|
||||||
|
},
|
||||||
|
"strict_json_output": {
|
||||||
|
"const": true
|
||||||
|
},
|
||||||
|
"meeting_only_evidence_promotion_forbidden": {
|
||||||
|
"type": "boolean",
|
||||||
|
"default": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"barrier_contract": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"r0_exact_set_required",
|
||||||
|
"expected_domain_ids",
|
||||||
|
"expected_task_instance_ids",
|
||||||
|
"expected_output_paths",
|
||||||
|
"missing_policy",
|
||||||
|
"extra_policy",
|
||||||
|
"duplicate_policy"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"r0_exact_set_required": {
|
||||||
|
"const": true
|
||||||
|
},
|
||||||
|
"expected_domain_ids": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^(?:(?:EC|E)-[A-Z0-9]{2,8}|X[A-Z0-9]{1,8})$"
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"expected_task_instance_ids": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^DOMAIN-[A-Za-z0-9][A-Za-z0-9._-]{0,127}$"
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"expected_output_paths": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$)).+"
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"missing_policy": {
|
||||||
|
"const": "FAIL"
|
||||||
|
},
|
||||||
|
"extra_policy": {
|
||||||
|
"const": "FAIL"
|
||||||
|
},
|
||||||
|
"duplicate_policy": {
|
||||||
|
"const": "FAIL"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"review_items": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"review_code",
|
||||||
|
"severity",
|
||||||
|
"reason",
|
||||||
|
"source_refs"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"review_code": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Z][A-Z0-9_]{2,127}$"
|
||||||
|
},
|
||||||
|
"severity": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"info",
|
||||||
|
"review",
|
||||||
|
"hard_warning",
|
||||||
|
"block"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"reason": {
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 1,
|
||||||
|
"maxLength": 1000
|
||||||
|
},
|
||||||
|
"source_refs": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z][A-Za-z0-9_.:/-]{0,255}$"
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"domain_ids": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^(?:(?:EC|E)-[A-Z0-9]{2,8}|X[A-Z0-9]{1,8})$"
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"unresolved_type": {
|
||||||
|
"type": [
|
||||||
|
"string",
|
||||||
|
"null"
|
||||||
|
],
|
||||||
|
"maxLength": 200
|
||||||
|
},
|
||||||
|
"blocks_final_drafting": {
|
||||||
|
"type": "boolean"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"unknown_or_unrouted_reviews": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"review_code",
|
||||||
|
"severity",
|
||||||
|
"reason",
|
||||||
|
"source_refs"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"review_code": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Z][A-Z0-9_]{2,127}$"
|
||||||
|
},
|
||||||
|
"severity": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"info",
|
||||||
|
"review",
|
||||||
|
"hard_warning",
|
||||||
|
"block"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"reason": {
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 1,
|
||||||
|
"maxLength": 1000
|
||||||
|
},
|
||||||
|
"source_refs": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z][A-Za-z0-9_.:/-]{0,255}$"
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"domain_ids": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^(?:(?:EC|E)-[A-Z0-9]{2,8}|X[A-Z0-9]{1,8})$"
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"unresolved_type": {
|
||||||
|
"type": [
|
||||||
|
"string",
|
||||||
|
"null"
|
||||||
|
],
|
||||||
|
"maxLength": 200
|
||||||
|
},
|
||||||
|
"blocks_final_drafting": {
|
||||||
|
"type": "boolean"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"contract_guards": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"final_conclusion_forbidden",
|
||||||
|
"unknown_values_require_review",
|
||||||
|
"source_membership_required",
|
||||||
|
"strict_json_output"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"final_conclusion_forbidden": {
|
||||||
|
"const": true
|
||||||
|
},
|
||||||
|
"unknown_values_require_review": {
|
||||||
|
"const": true
|
||||||
|
},
|
||||||
|
"source_membership_required": {
|
||||||
|
"const": true
|
||||||
|
},
|
||||||
|
"strict_json_output": {
|
||||||
|
"const": true
|
||||||
|
},
|
||||||
|
"meeting_only_evidence_promotion_forbidden": {
|
||||||
|
"type": "boolean",
|
||||||
|
"default": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+676
@@ -0,0 +1,676 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||||
|
"$id": "https://schemas.liti-agent.local/stage1/s1/domain_seed_output.schema.v3.json",
|
||||||
|
"title": "Liti-agent Stage B Domain Seed Output v3",
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"stage_b_domain_bo_seed_output"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"stage_b_domain_bo_seed_output": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"schema_version",
|
||||||
|
"status",
|
||||||
|
"task_instance_id",
|
||||||
|
"domain_id",
|
||||||
|
"registry_version",
|
||||||
|
"registry_index_sha256",
|
||||||
|
"domain_config_sha256",
|
||||||
|
"slice_sha256",
|
||||||
|
"compiled_prompt_sha256",
|
||||||
|
"bo_seed_candidates",
|
||||||
|
"unknown_or_unrouted_reviews",
|
||||||
|
"completion_receipt",
|
||||||
|
"contract_guards"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"schema_version": {
|
||||||
|
"const": "task_c_bo_stage_b_domain_bo_seed.v3"
|
||||||
|
},
|
||||||
|
"status": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"READY",
|
||||||
|
"READY_WITH_REVIEW",
|
||||||
|
"NO_SUPPORT",
|
||||||
|
"BLOCKED",
|
||||||
|
"FAILED"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"task_instance_id": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^DOMAIN-[A-Za-z0-9][A-Za-z0-9._-]{0,127}$"
|
||||||
|
},
|
||||||
|
"domain_id": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^(?:(?:EC|E)-[A-Z0-9]{2,8}|X[A-Z0-9]{1,8})$"
|
||||||
|
},
|
||||||
|
"registry_version": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z][A-Za-z0-9_.-]{2,127}$"
|
||||||
|
},
|
||||||
|
"registry_index_sha256": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[a-f0-9]{64}$"
|
||||||
|
},
|
||||||
|
"domain_config_sha256": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[a-f0-9]{64}$"
|
||||||
|
},
|
||||||
|
"slice_sha256": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[a-f0-9]{64}$"
|
||||||
|
},
|
||||||
|
"compiled_prompt_sha256": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[a-f0-9]{64}$"
|
||||||
|
},
|
||||||
|
"bo_seed_candidates": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"seed_id",
|
||||||
|
"bo_type",
|
||||||
|
"source_refs",
|
||||||
|
"element_fact_candidates",
|
||||||
|
"opposing_fact_candidates",
|
||||||
|
"defense_candidates",
|
||||||
|
"evidence_slot_status",
|
||||||
|
"calculation_requests",
|
||||||
|
"dependency_refs",
|
||||||
|
"legal_effect_candidates",
|
||||||
|
"review_items",
|
||||||
|
"extensions"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"seed_id": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z][A-Za-z0-9._-]{0,127}$"
|
||||||
|
},
|
||||||
|
"bo_type": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[a-z][a-z0-9_]{1,127}$"
|
||||||
|
},
|
||||||
|
"registry_component_ids": {
|
||||||
|
"$comment": "P0 설계판정 B. Part 1 T3 가 evidence_indexed_parts 에 실은 registry 증거 구성요소 ID 중 이 seed 가 근거로 인용한 것. 원소는 Default_Agent/routing/evidence_component_union.md 의 component_id 만 쓴다(112종). required 에 넣지 않는다 — 기본은 '해당 없음'이 아니라 '이 문서 범위에서 판단하지 않음'이다.",
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[a-z0-9_]+(?:\\.[a-z0-9_]+)?$"
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"juristic_act_type": {
|
||||||
|
"type": [
|
||||||
|
"string",
|
||||||
|
"null"
|
||||||
|
],
|
||||||
|
"maxLength": 200
|
||||||
|
},
|
||||||
|
"source_refs": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z][A-Za-z0-9_.:/-]{0,255}$"
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"party_roles": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"role",
|
||||||
|
"party_refs"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"role": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[a-z][a-z0-9_]{1,127}$"
|
||||||
|
},
|
||||||
|
"party_refs": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z][A-Za-z0-9_.:/-]{0,255}$"
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"object_refs": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z][A-Za-z0-9_.:/-]{0,255}$"
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"time_facts": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"fact_type",
|
||||||
|
"value",
|
||||||
|
"source_refs"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"fact_type": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[a-z][a-z0-9_]{1,127}$"
|
||||||
|
},
|
||||||
|
"value": {
|
||||||
|
"type": [
|
||||||
|
"string",
|
||||||
|
"null"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"source_refs": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z][A-Za-z0-9_.:/-]{0,255}$"
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"amount_facts": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"amount_type",
|
||||||
|
"decimal_value",
|
||||||
|
"currency",
|
||||||
|
"source_refs"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"amount_type": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[a-z][a-z0-9_]{1,127}$"
|
||||||
|
},
|
||||||
|
"decimal_value": {
|
||||||
|
"type": [
|
||||||
|
"string",
|
||||||
|
"null"
|
||||||
|
],
|
||||||
|
"pattern": "^-?[0-9]+(?:\\.[0-9]+)?$"
|
||||||
|
},
|
||||||
|
"currency": {
|
||||||
|
"type": [
|
||||||
|
"string",
|
||||||
|
"null"
|
||||||
|
],
|
||||||
|
"pattern": "^[A-Z]{3}$"
|
||||||
|
},
|
||||||
|
"source_refs": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z][A-Za-z0-9_.:/-]{0,255}$"
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"element_fact_candidates": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"source_id",
|
||||||
|
"source_kind"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"source_id": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z][A-Za-z0-9_.:/-]{0,255}$"
|
||||||
|
},
|
||||||
|
"source_kind": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"meeting_clause",
|
||||||
|
"event_candidate",
|
||||||
|
"evidence",
|
||||||
|
"bo",
|
||||||
|
"fact",
|
||||||
|
"signal",
|
||||||
|
"registry",
|
||||||
|
"law_version",
|
||||||
|
"calculation",
|
||||||
|
"other"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"excerpt": {
|
||||||
|
"type": [
|
||||||
|
"string",
|
||||||
|
"null"
|
||||||
|
],
|
||||||
|
"maxLength": 1200
|
||||||
|
},
|
||||||
|
"payload": {
|
||||||
|
"type": "object"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"opposing_fact_candidates": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"source_id",
|
||||||
|
"source_kind"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"source_id": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z][A-Za-z0-9_.:/-]{0,255}$"
|
||||||
|
},
|
||||||
|
"source_kind": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"meeting_clause",
|
||||||
|
"event_candidate",
|
||||||
|
"evidence",
|
||||||
|
"bo",
|
||||||
|
"fact",
|
||||||
|
"signal",
|
||||||
|
"registry",
|
||||||
|
"law_version",
|
||||||
|
"calculation",
|
||||||
|
"other"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"excerpt": {
|
||||||
|
"type": [
|
||||||
|
"string",
|
||||||
|
"null"
|
||||||
|
],
|
||||||
|
"maxLength": 1200
|
||||||
|
},
|
||||||
|
"payload": {
|
||||||
|
"type": "object"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"defense_candidates": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"source_id",
|
||||||
|
"source_kind"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"source_id": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z][A-Za-z0-9_.:/-]{0,255}$"
|
||||||
|
},
|
||||||
|
"source_kind": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"meeting_clause",
|
||||||
|
"event_candidate",
|
||||||
|
"evidence",
|
||||||
|
"bo",
|
||||||
|
"fact",
|
||||||
|
"signal",
|
||||||
|
"registry",
|
||||||
|
"law_version",
|
||||||
|
"calculation",
|
||||||
|
"other"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"excerpt": {
|
||||||
|
"type": [
|
||||||
|
"string",
|
||||||
|
"null"
|
||||||
|
],
|
||||||
|
"maxLength": 1200
|
||||||
|
},
|
||||||
|
"payload": {
|
||||||
|
"type": "object"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"evidence_slot_status": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"slot_id",
|
||||||
|
"status",
|
||||||
|
"source_refs"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"slot_id": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[a-z][a-z0-9_.-]{1,127}$"
|
||||||
|
},
|
||||||
|
"status": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"filled",
|
||||||
|
"partial",
|
||||||
|
"missing",
|
||||||
|
"conflicted"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"source_refs": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z][A-Za-z0-9_.:/-]{0,255}$"
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"review_code": {
|
||||||
|
"type": [
|
||||||
|
"string",
|
||||||
|
"null"
|
||||||
|
],
|
||||||
|
"pattern": "^[A-Z][A-Z0-9_]{2,127}$"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"calculation_requests": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"calculation_domain",
|
||||||
|
"completeness",
|
||||||
|
"source_refs"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"calculation_domain": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^CE-[A-Z0-9][A-Z0-9-]{0,15}$"
|
||||||
|
},
|
||||||
|
"completeness": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"ready",
|
||||||
|
"partial",
|
||||||
|
"blocked",
|
||||||
|
"deferred"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"source_refs": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z][A-Za-z0-9_.:/-]{0,255}$"
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"review_code": {
|
||||||
|
"type": [
|
||||||
|
"string",
|
||||||
|
"null"
|
||||||
|
],
|
||||||
|
"pattern": "^[A-Z][A-Z0-9_]{2,127}$"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"dependency_refs": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^(?:(?:EC|E)-[A-Z0-9]{2,8}|X[A-Z0-9]{1,8})$"
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"legal_effect_candidates": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"type_id",
|
||||||
|
"source_refs",
|
||||||
|
"registered"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"type_id": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[a-z][a-z0-9_]{1,127}$"
|
||||||
|
},
|
||||||
|
"source_refs": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z][A-Za-z0-9_.:/-]{0,255}$"
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"registered": {
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"review_code": {
|
||||||
|
"type": [
|
||||||
|
"string",
|
||||||
|
"null"
|
||||||
|
],
|
||||||
|
"pattern": "^[A-Z][A-Z0-9_]{2,127}$"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"review_items": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"review_code",
|
||||||
|
"severity",
|
||||||
|
"reason",
|
||||||
|
"source_refs"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"review_code": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Z][A-Z0-9_]{2,127}$"
|
||||||
|
},
|
||||||
|
"severity": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"info",
|
||||||
|
"review",
|
||||||
|
"hard_warning",
|
||||||
|
"block"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"reason": {
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 1,
|
||||||
|
"maxLength": 1000
|
||||||
|
},
|
||||||
|
"source_refs": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z][A-Za-z0-9_.:/-]{0,255}$"
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"domain_ids": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^(?:(?:EC|E)-[A-Z0-9]{2,8}|X[A-Z0-9]{1,8})$"
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"unresolved_type": {
|
||||||
|
"type": [
|
||||||
|
"string",
|
||||||
|
"null"
|
||||||
|
],
|
||||||
|
"maxLength": 200
|
||||||
|
},
|
||||||
|
"blocks_final_drafting": {
|
||||||
|
"type": "boolean"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"extensions": {
|
||||||
|
"type": "object"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"unknown_or_unrouted_reviews": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"review_code",
|
||||||
|
"severity",
|
||||||
|
"reason",
|
||||||
|
"source_refs"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"review_code": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Z][A-Z0-9_]{2,127}$"
|
||||||
|
},
|
||||||
|
"severity": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"info",
|
||||||
|
"review",
|
||||||
|
"hard_warning",
|
||||||
|
"block"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"reason": {
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 1,
|
||||||
|
"maxLength": 1000
|
||||||
|
},
|
||||||
|
"source_refs": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z][A-Za-z0-9_.:/-]{0,255}$"
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"domain_ids": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^(?:(?:EC|E)-[A-Z0-9]{2,8}|X[A-Z0-9]{1,8})$"
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"unresolved_type": {
|
||||||
|
"type": [
|
||||||
|
"string",
|
||||||
|
"null"
|
||||||
|
],
|
||||||
|
"maxLength": 200
|
||||||
|
},
|
||||||
|
"blocks_final_drafting": {
|
||||||
|
"type": "boolean"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"completion_receipt": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"task_instance_id",
|
||||||
|
"domain_id",
|
||||||
|
"seed_count",
|
||||||
|
"emitted_seed_ids",
|
||||||
|
"r0_membership_key"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"task_instance_id": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^DOMAIN-[A-Za-z0-9][A-Za-z0-9._-]{0,127}$"
|
||||||
|
},
|
||||||
|
"domain_id": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^(?:(?:EC|E)-[A-Z0-9]{2,8}|X[A-Z0-9]{1,8})$"
|
||||||
|
},
|
||||||
|
"seed_count": {
|
||||||
|
"type": "integer",
|
||||||
|
"minimum": 0
|
||||||
|
},
|
||||||
|
"emitted_seed_ids": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z][A-Za-z0-9._-]{0,127}$"
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"r0_membership_key": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{1,255}$"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"contract_guards": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"final_conclusion_forbidden",
|
||||||
|
"unknown_values_require_review",
|
||||||
|
"source_membership_required",
|
||||||
|
"strict_json_output"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"final_conclusion_forbidden": {
|
||||||
|
"const": true
|
||||||
|
},
|
||||||
|
"unknown_values_require_review": {
|
||||||
|
"const": true
|
||||||
|
},
|
||||||
|
"source_membership_required": {
|
||||||
|
"const": true
|
||||||
|
},
|
||||||
|
"strict_json_output": {
|
||||||
|
"const": true
|
||||||
|
},
|
||||||
|
"meeting_only_evidence_promotion_forbidden": {
|
||||||
|
"type": "boolean",
|
||||||
|
"default": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
+553
@@ -0,0 +1,553 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||||
|
"$id": "https://schemas.liti-agent.local/stage1/s1/domain_slice.schema.v2.json",
|
||||||
|
"title": "Liti-agent Stage B Domain Slice v2",
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"stage_b_domain_slice"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"stage_b_domain_slice": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"schema_version",
|
||||||
|
"stage",
|
||||||
|
"router_task",
|
||||||
|
"router_status",
|
||||||
|
"domain_id",
|
||||||
|
"domain_registry",
|
||||||
|
"activation",
|
||||||
|
"allowed_legal_effect_bo_types",
|
||||||
|
"source_universe",
|
||||||
|
"selected_sources",
|
||||||
|
"support_refs",
|
||||||
|
"review_only_refs",
|
||||||
|
"part1_review_guard",
|
||||||
|
"unknown_or_unrouted_reviews",
|
||||||
|
"compiled_prompt",
|
||||||
|
"task_instance",
|
||||||
|
"stage_b_worker_contract",
|
||||||
|
"routing_audit",
|
||||||
|
"contract_guards"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"schema_version": {
|
||||||
|
"const": "task_c_bo_stage_b_domain_slice.v2"
|
||||||
|
},
|
||||||
|
"stage": {
|
||||||
|
"const": "Stage_B"
|
||||||
|
},
|
||||||
|
"router_task": {
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 1
|
||||||
|
},
|
||||||
|
"router_status": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"READY",
|
||||||
|
"READY_WITH_REVIEW",
|
||||||
|
"NO_SUPPORT",
|
||||||
|
"FAILED"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"domain_id": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^(?:(?:EC|E)-[A-Z0-9]{2,8}|X[A-Z0-9]{1,8})$"
|
||||||
|
},
|
||||||
|
"domain_label": {
|
||||||
|
"type": [
|
||||||
|
"string",
|
||||||
|
"null"
|
||||||
|
],
|
||||||
|
"maxLength": 200
|
||||||
|
},
|
||||||
|
"domain_registry": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"registry_version",
|
||||||
|
"registry_index_sha256",
|
||||||
|
"domain_config_sha256",
|
||||||
|
"domain_config_path"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"registry_version": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z][A-Za-z0-9_.-]{2,127}$"
|
||||||
|
},
|
||||||
|
"registry_index_sha256": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[a-f0-9]{64}$"
|
||||||
|
},
|
||||||
|
"domain_config_sha256": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[a-f0-9]{64}$"
|
||||||
|
},
|
||||||
|
"domain_config_path": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$)).+"
|
||||||
|
},
|
||||||
|
"depends_on": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^(?:(?:EC|E)-[A-Z0-9]{2,8}|X[A-Z0-9]{1,8})$"
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"special_law_profiles": {
|
||||||
|
"$comment": "special_law_profiles/_registry_index.json 의 어휘는 SLP-<대문자·하이픈> 9종이다(SLP-AUTO-DAMAGE … SLP-STATE-COMPENSATION). 소문자 패턴은 그중 하나도 받지 못해 E-06·E-20·E-21 의 slice 가 SCHEMA_PATTERN 으로 거부됐다 — emits_signals 와 같은 종류의 결함이며 실측으로 확인했다.",
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^(?:SLP-[A-Z][A-Z0-9-]{1,63}|[a-z][a-z0-9_]{1,127})$"
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"activation": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"status",
|
||||||
|
"positive_refs",
|
||||||
|
"negative_refs",
|
||||||
|
"conflict_refs",
|
||||||
|
"confidence",
|
||||||
|
"activation_manifest_sha256"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"status": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"active",
|
||||||
|
"supporting",
|
||||||
|
"monitor",
|
||||||
|
"residual"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"positive_refs": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z][A-Za-z0-9_.:/-]{0,255}$"
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"negative_refs": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z][A-Za-z0-9_.:/-]{0,255}$"
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"conflict_refs": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z][A-Za-z0-9_.:/-]{0,255}$"
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"confidence": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"high",
|
||||||
|
"medium",
|
||||||
|
"low"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"activation_manifest_sha256": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[a-f0-9]{64}$"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"allowed_legal_effect_bo_types": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[a-z][a-z0-9_]{1,127}$"
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"source_universe": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"source_id",
|
||||||
|
"source_kind"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"source_id": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z][A-Za-z0-9_.:/-]{0,255}$"
|
||||||
|
},
|
||||||
|
"source_kind": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"meeting_clause",
|
||||||
|
"event_candidate",
|
||||||
|
"evidence",
|
||||||
|
"bo",
|
||||||
|
"fact",
|
||||||
|
"signal",
|
||||||
|
"registry",
|
||||||
|
"law_version",
|
||||||
|
"calculation",
|
||||||
|
"other"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"excerpt": {
|
||||||
|
"type": [
|
||||||
|
"string",
|
||||||
|
"null"
|
||||||
|
],
|
||||||
|
"maxLength": 1200
|
||||||
|
},
|
||||||
|
"payload": {
|
||||||
|
"type": "object"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"selected_sources": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"source_id",
|
||||||
|
"source_kind"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"source_id": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z][A-Za-z0-9_.:/-]{0,255}$"
|
||||||
|
},
|
||||||
|
"source_kind": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"meeting_clause",
|
||||||
|
"event_candidate",
|
||||||
|
"evidence",
|
||||||
|
"bo",
|
||||||
|
"fact",
|
||||||
|
"signal",
|
||||||
|
"registry",
|
||||||
|
"law_version",
|
||||||
|
"calculation",
|
||||||
|
"other"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"excerpt": {
|
||||||
|
"type": [
|
||||||
|
"string",
|
||||||
|
"null"
|
||||||
|
],
|
||||||
|
"maxLength": 1200
|
||||||
|
},
|
||||||
|
"payload": {
|
||||||
|
"type": "object"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"support_refs": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z][A-Za-z0-9_.:/-]{0,255}$"
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"review_only_refs": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z][A-Za-z0-9_.:/-]{0,255}$"
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"part1_review_guard": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"review_item_ids",
|
||||||
|
"candidate_downgrade_forbidden",
|
||||||
|
"meeting_only_promotion_forbidden"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"review_item_ids": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z][A-Za-z0-9_.:/-]{0,255}$"
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"candidate_downgrade_forbidden": {
|
||||||
|
"const": true
|
||||||
|
},
|
||||||
|
"meeting_only_promotion_forbidden": {
|
||||||
|
"const": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"unknown_or_unrouted_reviews": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"review_code",
|
||||||
|
"severity",
|
||||||
|
"reason",
|
||||||
|
"source_refs"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"review_code": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Z][A-Z0-9_]{2,127}$"
|
||||||
|
},
|
||||||
|
"severity": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"info",
|
||||||
|
"review",
|
||||||
|
"hard_warning",
|
||||||
|
"block"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"reason": {
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 1,
|
||||||
|
"maxLength": 1000
|
||||||
|
},
|
||||||
|
"source_refs": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[A-Za-z][A-Za-z0-9_.:/-]{0,255}$"
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"domain_ids": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^(?:(?:EC|E)-[A-Z0-9]{2,8}|X[A-Z0-9]{1,8})$"
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"unresolved_type": {
|
||||||
|
"type": [
|
||||||
|
"string",
|
||||||
|
"null"
|
||||||
|
],
|
||||||
|
"maxLength": 200
|
||||||
|
},
|
||||||
|
"blocks_final_drafting": {
|
||||||
|
"type": "boolean"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"compiled_prompt": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"path",
|
||||||
|
"sha256",
|
||||||
|
"composition_policy_sha256",
|
||||||
|
"final_conclusion_forbidden"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"path": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$)).+"
|
||||||
|
},
|
||||||
|
"sha256": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[a-f0-9]{64}$"
|
||||||
|
},
|
||||||
|
"hash_kind": {
|
||||||
|
"$comment": "domain_slice_compiler 가 X1~X3 교차도메인 slice 에 싣는 해시 종류 표기다. 실측으로 확인했고 스키마가 선언하지 않아 SCHEMA_ADDITIONAL_PROPERTY 로 떨어졌다. 값 등가를 깨지 않는 신규 키 추가다(P0 설계판정 C 형태).",
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[a-z0-9_]{2,64}$"
|
||||||
|
},
|
||||||
|
"composition_policy_sha256": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^[a-f0-9]{64}$"
|
||||||
|
},
|
||||||
|
"final_conclusion_forbidden": {
|
||||||
|
"const": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"task_instance": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"task_instance_id",
|
||||||
|
"domain_id",
|
||||||
|
"expected_output_path"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"task_instance_id": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^DOMAIN-[A-Za-z0-9][A-Za-z0-9._-]{0,127}$"
|
||||||
|
},
|
||||||
|
"domain_id": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^(?:(?:EC|E)-[A-Z0-9]{2,8}|X[A-Z0-9]{1,8})$"
|
||||||
|
},
|
||||||
|
"expected_output_path": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$)).+"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"stage_b_worker_contract": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"read_slice_only",
|
||||||
|
"sparse_emit",
|
||||||
|
"strict_json_output",
|
||||||
|
"final_conclusion_forbidden"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"read_slice_only": {
|
||||||
|
"const": true
|
||||||
|
},
|
||||||
|
"sparse_emit": {
|
||||||
|
"const": true
|
||||||
|
},
|
||||||
|
"strict_json_output": {
|
||||||
|
"const": true
|
||||||
|
},
|
||||||
|
"final_conclusion_forbidden": {
|
||||||
|
"const": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"domain_declarations": {
|
||||||
|
"$comment": "R-1. registry 26 도메인이 선언한 어휘를 ID 목록으로만 싣는다. 라벨·설명은 overlay 산문과 evidence_component_union.md 가 담당하고 이 블록은 기계가 대조할 수 있는 어휘만 담는다. 137종 일반성은 사건 이름이 아니라 이 어휘에서 나온다. 기존 20키의 값 등가를 깨지 않는 신규 키 추가다(P0 설계판정 C 형태).",
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": ["source", "element_slot_ids", "opposing_fact_slot_ids", "evidence_component_ids", "defense_ids", "structure_type_ids", "emits_signals", "calculation_domains"],
|
||||||
|
"properties": {
|
||||||
|
"source": { "type": "string", "const": "registry_domain_config" },
|
||||||
|
"element_slot_ids": {
|
||||||
|
"type": "array",
|
||||||
|
"items": { "type": "string", "pattern": "^[a-z0-9_.-]{2,128}$" },
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"opposing_fact_slot_ids": {
|
||||||
|
"type": "array",
|
||||||
|
"items": { "type": "string", "pattern": "^[a-z0-9_.-]{2,128}$" },
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"evidence_component_ids": {
|
||||||
|
"$comment": "Default_Agent/routing/evidence_component_union.md 의 component_id 만 쓴다(112종).",
|
||||||
|
"type": "array",
|
||||||
|
"items": { "type": "string", "pattern": "^[a-z0-9_]+(?:\\.[a-z0-9_]+)?$" },
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"defense_ids": {
|
||||||
|
"type": "array",
|
||||||
|
"items": { "type": "string", "pattern": "^[a-z0-9_.-]{2,128}$" },
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"structure_type_ids": {
|
||||||
|
"type": "array",
|
||||||
|
"items": { "type": "string", "pattern": "^[A-Za-z0-9_.-]{2,128}$" },
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"emits_signals": {
|
||||||
|
"$comment": "domain_config.schema.json 이 정한 어휘를 그대로 받는다 — SG 코드 또는 리터럴 domain_signal. 13개 도메인이 domain_signal 을 선언하므로 SG 패턴만 걸면 그 도메인들의 slice 가 전부 거부된다. 실측으로 확인했다.",
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"anyOf": [
|
||||||
|
{ "type": "string", "pattern": "^SG-[0-9]{2}$" },
|
||||||
|
{ "type": "string", "const": "domain_signal" }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"calculation_domains": {
|
||||||
|
"$comment": "도메인의 calculation_bindings 와 Part 1 screener 가 이미 검증해 낸 requested_calculation_domains 의 교집합. 어휘 정본은 platform/reference_catalogs/calculation_ids.json(17종)이며 computations/calculation_registry.json 은 적재하지 않는다 — authority_boundary.stage1 이 실행 권한을 막는다.",
|
||||||
|
"type": "array",
|
||||||
|
"items": { "type": "string", "pattern": "^CE-[A-Z0-9][A-Z0-9-]{0,15}$" },
|
||||||
|
"uniqueItems": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"routing_audit": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"selected_count",
|
||||||
|
"support_count",
|
||||||
|
"review_only_count",
|
||||||
|
"unrouted_material_count"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"selected_count": {
|
||||||
|
"type": "integer",
|
||||||
|
"minimum": 0
|
||||||
|
},
|
||||||
|
"support_count": {
|
||||||
|
"type": "integer",
|
||||||
|
"minimum": 0
|
||||||
|
},
|
||||||
|
"review_only_count": {
|
||||||
|
"type": "integer",
|
||||||
|
"minimum": 0
|
||||||
|
},
|
||||||
|
"unrouted_material_count": {
|
||||||
|
"type": "integer",
|
||||||
|
"minimum": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"contract_guards": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"final_conclusion_forbidden",
|
||||||
|
"unknown_values_require_review",
|
||||||
|
"source_membership_required",
|
||||||
|
"strict_json_output"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"final_conclusion_forbidden": {
|
||||||
|
"const": true
|
||||||
|
},
|
||||||
|
"unknown_values_require_review": {
|
||||||
|
"const": true
|
||||||
|
},
|
||||||
|
"source_membership_required": {
|
||||||
|
"const": true
|
||||||
|
},
|
||||||
|
"strict_json_output": {
|
||||||
|
"const": true
|
||||||
|
},
|
||||||
|
"meeting_only_evidence_promotion_forbidden": {
|
||||||
|
"type": "boolean",
|
||||||
|
"default": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
+280
@@ -0,0 +1,280 @@
|
|||||||
|
# ACTIVATION_CUE_DIGEST
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## LEGEND
|
||||||
|
|
||||||
|
도메인 헤더: `### <domain_id> | <label_ko> | kind=<kind> | ao=<0|1> | dep=<depends_on csv|-> | calc=<calculation_bindings csv|->`
|
||||||
|
`ao` = execution_policy.always_on. `dep` = depends_on. `calc` = calculation_bindings (이 도메인이 요청할 수 있는 계산의 전체 집합; 이 목록 밖의 CE는 요청 금지).
|
||||||
|
|
||||||
|
단서 줄 형식 (한 줄 = 단서 하나):
|
||||||
|
- 긍정: `P|<cue_id>|<cue_type>|<strength>|<weight>|<src>|<match_value>|<note>`
|
||||||
|
- 부정: `N|<cue_id>|<cue_type>|<effect>|<weight>|<src>|<match_value>|<note>`
|
||||||
|
- 충돌: `C|<cue_id>|<rule>|<review_code>`
|
||||||
|
- 재정의: `OVR|<key>=<value>|...` (해당 도메인이 GLOBAL_DEFAULTS를 벗어나는 경우에만 등장)
|
||||||
|
|
||||||
|
코드표:
|
||||||
|
- `<src>` (source_field): `SP`=selected_sources.payload, `SU`=source_universe, `-`=없음
|
||||||
|
- `<effect>` (부정 단서): `DR`=confidence_downrank_only, `MR`=monitor_review
|
||||||
|
- `<strength>`: `strong` | `support`
|
||||||
|
- 값이 없으면 `-`. match_value/rule/note 안의 `|`는 `/`로 치환되어 있다.
|
||||||
|
- `OVR` 값 `absent` = 원본 routing_policy에 그 키 자체가 없다는 뜻이다 (기본값 적용이 아니라 미정의).
|
||||||
|
|
||||||
|
## GLOBAL_DEFAULTS
|
||||||
|
|
||||||
|
아래는 26개 전부에 공통이다. 도메인 절에 `OVR` 줄이 없으면 이 값이 그대로 적용된다.
|
||||||
|
|
||||||
|
- `routing_policy.fail_open` = true (26/26)
|
||||||
|
- `routing_policy.candidate_downgrade_forbidden` = true (26/26)
|
||||||
|
- `routing_policy.unknown_review_code` = `UNROUTED_ISSUE_REVIEW` (26/26)
|
||||||
|
- `routing_policy.leaf_activation_threshold` = 1.0 (25/26; EC-00은 키 자체가 absent)
|
||||||
|
- `routing_policy.monitor_threshold` = 0.5 (25/26; EC-00은 키 자체가 absent)
|
||||||
|
- `routing_policy.minimum_primary_evidence` = 1 (15/26; 나머지 11개는 OVR로 0)
|
||||||
|
- 모든 충돌 단서의 `effect` = `hard_review` (49/49). 그래서 C 줄에서 생략했다.
|
||||||
|
- 모든 충돌 단서의 `left_refs` / `right_refs` = `[]` (49/49). 짝지어진 참조가 없으므로 생략했다.
|
||||||
|
- 모든 도메인의 `status` = `active` (26/26)
|
||||||
|
|
||||||
|
## USAGE
|
||||||
|
|
||||||
|
- 긍정 단서의 `weight`를 합산해 `leaf_activation_threshold` 이상이면 활성 후보, `monitor_threshold` 이상이면 감시 후보로 본다. 두 임계값은 registry가 참고값으로 정한 것이지 확정 권한이 없다.
|
||||||
|
- 부정 단서 `DR`은 확신도만 낮춘다. `MR`은 검토 상태로 옮긴다. 어느 쪽도 지지된 후보를 삭제하지 않는다 (`candidate_downgrade_forbidden`=true).
|
||||||
|
- 충돌 단서가 걸리면 후보를 유지한 채 그 줄의 `review_code`를 검토 항목에 남긴다.
|
||||||
|
- 어느 단서에도 걸리지 않은 쟁점은 `UNROUTED_ISSUE_REVIEW`를 달아 미분류로 보존한다.
|
||||||
|
- `ao=1`인 도메인(E-00, X1, X2, X3)은 단서 판정과 무관하게 상시 활성 대상이다.
|
||||||
|
- `match_value`는 상담 자료에서 찾아야 할 대상의 서술이다. 이 사전의 문구 자체가 사건에 존재하는 사실은 아니다.
|
||||||
|
|
||||||
|
## DOMAINS
|
||||||
|
|
||||||
|
### E-00 | 잔여·미분류 쟁점 수집기 | kind=residual | ao=1 | dep=- | calc=-
|
||||||
|
OVR|minimum_primary_evidence=0
|
||||||
|
P|E00-P01|other|strong|1.0|SP|source_universe에서 활성·monitor 도메인의 selected·support·review-only membership에 보존되지 않은 원천|-
|
||||||
|
P|E00-P02|other|strong|1.0|SP|추출된 법률효과·방어·계산 후보가 registry의 어느 도메인에도 안정적으로 매핑되지 않음|-
|
||||||
|
N|E00-N01|other|DR|0.6|SP|동일 source_id와 쟁점이 활성 leaf에서 완전히 보존되고 membership이 확인됨|중복 seed는 생성하지 않음
|
||||||
|
C|E00-C01|동일 source_id가 routed와 unrouted로 동시 표지됨|E00_MEMBERSHIP_CONFLICT_REVIEW
|
||||||
|
C|E00-C02|입력 합집합과 selected·support·review-only·unrouted 합집합이 보존되지 않음|E00_CONSERVATION_FAILURE
|
||||||
|
|
||||||
|
### E-01 | 법률행위 효력·대리 | kind=common_and_leaf | ao=0 | dep=X3 | calc=CE-03
|
||||||
|
P|E01-P01|evidence_component|strong|1.0|SU|법률행위의 당사자·객체·표시 내용과 성립 경위를 나타내는 처분문서·통신·행동 자료|법률행위 자체의 특정
|
||||||
|
P|E01-P02|evidence_component|strong|1.0|SU|비진의·통정·착오·기망·강박·반사회성·현저한 불균형 등 효력 하자 기초사실 자료|무효·취소 사유 후보
|
||||||
|
P|E01-P03|evidence_component|support|0.5|SU|본인·대리인·상대방, 위임 범위, 대리권 외관, 선의·무과실, 추인·거절 자료|대리와 거래안전 구조
|
||||||
|
P|E01-P04|evidence_component|support|0.5|SU|조건·기한의 약정, 성취·불성취, 도래·불도래와 방해 자료|조건·기한 lifecycle
|
||||||
|
N|E01-N01|legal_relation|DR|1.0|SU|유효한 계약의 단순 미이행·대금 미지급 자료만 있고 법률행위 효력 또는 대리 하자 자료가 없음|계약형 leaf를 우선하고 E-01 leaf confidence만 낮춘다
|
||||||
|
N|E01-N02|legal_relation|MR|0.7|SU|무효·취소라는 평가적 표현만 있고 당사자·표시·하자 발생 경위의 source가 없음|사건명·평가어 단독 활성화를 금지한다
|
||||||
|
C|E01-C01|표시 내용·상대방·행위일 또는 진정성립 자료가 서로 충돌함|E01_DECLARATION_IDENTITY_CONFLICT_REVIEW
|
||||||
|
C|E01-C02|하자의 존재·중요성·귀책 또는 취소 의사표시와 도달 자료가 충돌함|E01_VALIDITY_OR_CANCELLATION_CONFLICT_REVIEW
|
||||||
|
C|E01-C03|대리권 범위·외관 형성·선의무과실·추인 여부 자료가 충돌함|E01_AGENCY_OR_RATIFICATION_CONFLICT_REVIEW
|
||||||
|
|
||||||
|
### E-02 | 계약상 금전채권 | kind=leaf | ao=0 | dep=EC-00,E-01 | calc=CE-01,CE-02,CE-03
|
||||||
|
P|E02-P01|evidence_component|strong|1.0|SP|계약상 금전급부의 원인·금액·이행기가 기재된 처분문서|사건명이 아닌 증거 구성요소로 활성
|
||||||
|
P|E02-P02|evidence_component|strong|1.0|SP|송금·부분변제·잔액확인의 연결 자료|사건명이 아닌 증거 구성요소로 활성
|
||||||
|
N|E02-N01|legal_relation|MR|0.7|SP|반환·대금지급 약정 없이 금전 이동만 존재|인접 도메인과 경계 검토
|
||||||
|
C|E02-C01|계약서·이체내역·정산서의 금액, 이행기 또는 완제 여부가 불일치|E02_AMOUNT_OR_DUE_DATE_CONFLICT
|
||||||
|
|
||||||
|
### E-03 | 다수당사자·보증·승계 | kind=leaf | ao=0 | dep=EC-00,E-01,E-02 | calc=CE-01,CE-02
|
||||||
|
P|E03-P01|evidence_component|strong|1.0|SP|보증·연대채무·채무인수·채권양도의 당사자와 의사표시가 기록된 문서|사건명이 아닌 증거 구성요소로 활성
|
||||||
|
P|E03-P02|evidence_component|strong|1.0|SP|영업양도, 상호 계속사용, 책임배제 등기·통지 자료|사건명이 아닌 증거 구성요소로 활성
|
||||||
|
N|E03-N01|legal_relation|MR|0.7|SP|단순한 회사명 유사성만 있고 영업양도·보증·승계 사실이 없음|인접 도메인과 경계 검토
|
||||||
|
C|E03-C01|채무 승계·보증 범위나 책임배제 등기·통지 여부가 불일치|E03_SUCCESSION_SCOPE_CONFLICT
|
||||||
|
|
||||||
|
### E-04 | 부당이득·원상회복·사용이익 | kind=leaf | ao=0 | dep=EC-00,E-01,X2 | calc=CE-01,CE-04,CE-07
|
||||||
|
P|E04-P01|legal_relation|strong|1.0|SU|급부 또는 재산·노무 제공과 대응하는 이익 귀속 자료|-
|
||||||
|
P|E04-P02|event_kind|strong|1.0|SU|점유·사용·수익과 임료 상당액 또는 사용이익 산정 자료|-
|
||||||
|
P|E04-P03|event_subkind|support|0.5|SU|무효·취소·해제·목적 소멸 뒤 반환 또는 원상회복 자료|-
|
||||||
|
N|E04-N01|other|DR|1.0|SU|유효한 계약상 대금·차임의 이행만 문제되고 반환 원인이나 초과수익 쟁점이 없음|E-02 또는 E-08 중심으로 라우팅하되 후보를 삭제하지 않는다
|
||||||
|
C|E04-C01|이익 귀속·손실 또는 법률상 원인 자료가 서로 충돌함|E04_CAUSE_OR_GAIN_CONFLICT
|
||||||
|
C|E04-C02|사용기간·면적·임료 기준 또는 공제 항목이 서로 충돌함|E04_USE_VALUE_CONFLICT
|
||||||
|
|
||||||
|
### E-05 | 불법행위 일반 | kind=leaf | ao=0 | dep=E-01,X3 | calc=CE-01,CE-03,CE-05
|
||||||
|
P|E05-P01|evidence_component|strong|1.0|SU|특정 행위 또는 부작위, 당시 주의의무·예견가능성·회피가능성을 연결하는 자료|청구명이나 사건명 대신 행위와 귀책의 증거구성요소를 본다
|
||||||
|
P|E05-P02|evidence_component|strong|1.0|SU|보호이익 침해, 재산·신체·정신 손해와 행위 사이의 시간·기전·범위를 잇는 자료|손해 존재와 상당인과관계 후보를 분리 추출한다
|
||||||
|
P|E05-P03|party_role|support|0.5|SU|피용자 업무수행과 사용자의 선임·지휘감독 또는 사무집행 관련성을 나타내는 자료|민법 제756조 후보일 뿐 사용자책임 성립을 확정하지 않는다
|
||||||
|
P|E05-P04|evidence_component|support|0.5|SU|공작물의 설치·보존상 하자, 점유자·소유자 지위와 방지조치 자료|민법 제758조 후보와 전문 건설 profile 경계를 함께 보존한다
|
||||||
|
P|E05-P05|party_role|support|0.5|SU|복수 행위자의 공동 가공·교사·방조 또는 행위 관련성과 각 행위 시점 자료|민법 제760조 후보로서 개별 인과관계와 책임범위를 유지한다
|
||||||
|
N|E05-N01|legal_relation|DR|1.0|SU|계약상 급부의 미이행만 제시되고 독립된 보호의무 위반·권리침해·손해 기전 자료가 없음|계약책임 도메인을 우선하되 독립 불법행위 자료가 있으면 E-05 후보를 삭제하지 않는다
|
||||||
|
N|E05-N02|term|MR|0.7|SU|자동차·산재·국가배상·의료·제조물·건설·언론 등 사건명 또는 법명만 있고 적용요건 자료가 없음|전문 특별법 명칭 단독 활성화를 금지하고 profile candidate review로 보낸다
|
||||||
|
C|E05-C01|행위·주의의무 위반 자료와 적법행위·주의의무 이행 자료가 병존하거나 행위자 특정이 충돌함|E05_CONDUCT_OR_FAULT_CONFLICT_REVIEW
|
||||||
|
C|E05-C02|손해 발생 기전·범위·시점 또는 행위와 손해 사이 인과관계 자료가 상충함|E05_CAUSATION_OR_DAMAGE_CONFLICT_REVIEW
|
||||||
|
C|E05-C03|침해일·손해 발생일·손해 및 가해자 인지일·청구권 행사일 자료가 상충함|E05_LIMITATION_DATE_CONFLICT_REVIEW
|
||||||
|
|
||||||
|
### E-06 | 전문가·제조물 책임 | kind=leaf | ao=0 | dep=E-01,E-05,X3 | calc=CE-03,CE-05
|
||||||
|
P|E06-P01|evidence_component|strong|1.0|SU|전문가의 업무수임·진료·검사·설계·자문 범위와 당시 전문수준·주의기준을 나타내는 자료|전문가 주의의무와 업무범위
|
||||||
|
P|E06-P02|evidence_component|strong|1.0|SU|전문행위 전후 상태, 구체적 과실행위, 손해 발생 기전과 대체원인을 잇는 기록·감정 자료|과실·손해·개연성·인과관계
|
||||||
|
P|E06-P03|evidence_component|support|0.5|SU|의료행위의 내용·위험·대안·설명 시점·동의·응급성·자기결정 기회 자료|의료 설명의무 독립 구조
|
||||||
|
P|E06-P04|evidence_component|support|0.5|SU|제조물의 제조·설계·표시, 정상 사용, 유통 당시 상태, 결함·사고·대체원인 자료|제조물책임 profile 활성 후보
|
||||||
|
N|E06-N01|legal_relation|DR|1.0|SU|전문가 또는 제품 명칭만 있고 구체적 업무·행위·결함·손해 연결 자료가 없음|직업명·제품명 단독 활성화를 금지한다
|
||||||
|
N|E06-N02|legal_relation|MR|0.7|SU|안전성 침해가 아닌 단순 품질불만·수선 요구 또는 계약상 성능 미달 자료만 있음|계약·하자 도메인을 우선하고 제조물책임 profile은 monitor한다
|
||||||
|
C|E06-C01|당시 전문수준·진료경과·업무지시·주의의무 이행 자료가 충돌함|E06_PROFESSIONAL_STANDARD_OR_BREACH_CONFLICT_REVIEW
|
||||||
|
C|E06-C02|손해의 발생시점·의학적 또는 기술적 기전·대체원인 자료가 충돌함|E06_CAUSATION_OR_DAMAGE_CONFLICT_REVIEW
|
||||||
|
C|E06-C03|설명 내용·시기·동의·응급성 또는 제조물 사용상태·결함 유형 자료가 충돌함|E06_DISCLOSURE_OR_PRODUCT_DEFECT_CONFLICT_REVIEW
|
||||||
|
|
||||||
|
### E-07 | 도급·건설·하자 | kind=leaf | ao=0 | dep=EC-00,E-01 | calc=CE-01,CE-06
|
||||||
|
P|E07-P01|evidence_component|strong|1.0|SP|도급계약서·공사계약서·발주서에서 일의 완성, 공사범위, 보수 또는 지급조건이 함께 확인됨|사건명·파일명이 아닌 증거 구성요소 결합으로 판정
|
||||||
|
P|E07-P02|evidence_component|strong|1.0|SP|기성검사·공정표·작업일보·준공 또는 인수 자료와 공사대금 청구·지급 자료가 연결됨|사건명·파일명이 아닌 증거 구성요소 결합으로 판정
|
||||||
|
P|E07-P03|evidence_component|support|0.7|SP|하자 항목·발생 부위·보수 요구·보수 방법 또는 비용 자료가 목적물과 연결됨|사건명·파일명이 아닌 증거 구성요소 결합으로 판정
|
||||||
|
N|E07-N01|legal_relation|MR|0.7|SP|일의 완성 의무 없이 물품 매매·공급대금 자료만 존재하여 E-02 검토가 중심임|후보를 삭제하지 않고 monitor 또는 인접 도메인 overlap review
|
||||||
|
N|E07-N02|legal_relation|MR|0.7|SP|소유권 이전 또는 등기 원인만 다투고 공사 이행·하자 사실은 존재하지 않아 E-09가 중심임|후보를 삭제하지 않고 monitor 또는 인접 도메인 overlap review
|
||||||
|
N|E07-N03|legal_relation|MR|0.7|SP|점유·인도·철거 사실만 다투고 도급상 보수·하자 관계가 없어 E-11이 중심임|후보를 삭제하지 않고 monitor 또는 인접 도메인 overlap review
|
||||||
|
C|E07-C01|계약서·견적서·변경지시·정산서 사이 공사범위, 공사대금 또는 추가공사 승인 여부가 불일치|E07_SCOPE_AMOUNT_CONFLICT
|
||||||
|
C|E07-C02|작업일보·기성검사·준공·인수 자료 사이 공정률, 완성 또는 인도 시점이 불일치|E07_PROGRESS_COMPLETION_CONFLICT
|
||||||
|
C|E07-C03|하자 감정·현장사진·보수견적·당사자 진술 사이 하자 존재, 원인, 중요성, 보수방법 또는 비용이 불일치|E07_DEFECT_CAUSATION_COST_CONFLICT
|
||||||
|
|
||||||
|
### E-08 | 임대차·보증금 | kind=leaf | ao=0 | dep=EC-00,E-01 | calc=CE-01,CE-07
|
||||||
|
P|E08-P01|evidence_component|strong|1.0|SP|임대차계약서에서 목적물, 사용·수익, 임대인·임차인, 보증금·차임 또는 기간이 연결됨|사건명·파일명이 아닌 증거 구성요소 결합으로 판정
|
||||||
|
P|E08-P02|evidence_component|strong|1.0|SP|보증금 지급 자료와 기간 만료·해지·해제·갱신 또는 반환 요구·도달 자료가 연결됨|사건명·파일명이 아닌 증거 구성요소 결합으로 판정
|
||||||
|
P|E08-P03|evidence_component|support|0.7|SP|목적물 인도·점유·열쇠 반환·퇴거와 연체차임·관리비·원상회복 공제 자료가 연결됨|사건명·파일명이 아닌 증거 구성요소 결합으로 판정
|
||||||
|
N|E08-N01|legal_relation|MR|0.7|SP|사용·수익 약정 없이 금전 교부와 반환 약정만 있어 E-02 검토가 중심임|후보를 삭제하지 않고 monitor 또는 인접 도메인 overlap review
|
||||||
|
N|E08-N02|legal_relation|MR|0.7|SP|임대차 관계 없이 사용이익 반환만 다투어 E-04 검토가 중심임|후보를 삭제하지 않고 monitor 또는 인접 도메인 overlap review
|
||||||
|
N|E08-N03|legal_relation|MR|0.7|SP|보증금·차임·종료 관계 없이 소유권에 기한 인도·퇴거만 다투어 E-11 검토가 중심임|후보를 삭제하지 않고 monitor 또는 인접 도메인 overlap review
|
||||||
|
C|E08-C01|계약서·갱신자료·통지자료 사이 임대차 기간, 갱신, 종료 원인 또는 도달 시점이 불일치|E08_TERM_RENEWAL_CONFLICT
|
||||||
|
C|E08-C02|보증금 지급·차임·관리비·원상회복 견적·정산서 사이 반환액 또는 공제액이 불일치|E08_DEPOSIT_DEDUCTION_CONFLICT
|
||||||
|
C|E08-C03|인도확인·점유자료·열쇠반환·전출 또는 영업종료 자료 사이 목적물 반환 시점이 불일치|E08_POSSESSION_DELIVERY_CONFLICT
|
||||||
|
|
||||||
|
### E-09 | 소유권이전 원인·등기청구 | kind=leaf | ao=0 | dep=EC-00,E-01 | calc=CE-03,CE-04
|
||||||
|
P|E09-P01|evidence_component|strong|1.0|SP|등기원인·연월일·접수번호·순위가 기재된 등기기록|사건명이 아닌 증거 구성요소로 활성
|
||||||
|
P|E09-P02|evidence_component|strong|1.0|SP|이전·말소·회복·경정·본등기의 원인 계약·판결 자료|사건명이 아닌 증거 구성요소로 활성
|
||||||
|
N|E09-N01|legal_relation|MR|0.7|SP|담보권 설정·소멸과 경매·배당만이 주요 쟁점|인접 도메인과 경계 검토
|
||||||
|
C|E09-C01|원인행위의 당사자·날짜·목적물과 등기부 기재가 불일치|E09_REGISTRY_SEQUENCE_CONFLICT
|
||||||
|
|
||||||
|
### E-10 | 담보물권·경매·배당·유치권 | kind=leaf | ao=0 | dep=E-01,E-02,E-09 | calc=CE-01,CE-02,CE-11
|
||||||
|
P|E10-P01|evidence_component|strong|1.0|SP|담보권·피담보채무·채권최고액·순위가 나타난 계약·등기|사건명이 아닌 증거 구성요소로 활성
|
||||||
|
P|E10-P02|evidence_component|strong|1.0|SP|경매개시·매각·배당표·배당요구 자료|사건명이 아닌 증거 구성요소로 활성
|
||||||
|
P|E10-P03|evidence_component|strong|1.0|SP|유치권의 채권·목적물·점유·견련성 자료|사건명이 아닌 증거 구성요소로 활성
|
||||||
|
N|E10-N01|legal_relation|MR|0.7|SP|담보권이 아닌 소유권이전·말소 원인만이 주요 쟁점|인접 도메인과 경계 검토
|
||||||
|
C|E10-C01|피담보채무 잔액·변제충당·담보순위·배당표가 불일치|E10_REGISTRY_SEQUENCE_CONFLICT
|
||||||
|
|
||||||
|
### E-11 | 점유·인도·방해배제·상린 | kind=leaf | ao=0 | dep=E-01,X2 | calc=CE-04,CE-07
|
||||||
|
P|E11-P01|object|strong|1.0|SU|특정 자산의 현재 또는 과거 점유·사용·점유이전 자료|-
|
||||||
|
P|E11-P02|relief|strong|1.0|SU|인도·명도·퇴거·철거·수거·방해제거 또는 방해예방 대상 자료|-
|
||||||
|
P|E11-P03|legal_relation|support|0.5|SU|점유 권원·소유권·점유보호·상린관계의 상충 주장|-
|
||||||
|
N|E11-N01|other|DR|1.0|SU|단순 소유권이전등기만 문제되고 현실 점유·인도·방해 상태가 없음|E-09 중심으로 라우팅하고 X2는 계속 실행한다
|
||||||
|
C|E11-C01|동일 자산·중첩 기간에 양립하지 않는 점유원인 주장이 존재|POSSESSION_CAUSE_CONFLICT
|
||||||
|
C|E11-C02|인도·철거·방해제거 대상 또는 경계가 서로 다르게 특정됨|E11_OBJECT_OR_SCOPE_CONFLICT
|
||||||
|
|
||||||
|
### E-12 | 공유·경계·분할·집합건물 | kind=leaf | ao=0 | dep=E-01,X2,X3 | calc=CE-04,CE-11
|
||||||
|
P|E12-P01|evidence_component|strong|1.0|SU|등기·대장·규약·약정에서 복수 권리자·공유지분·전유·공용·대지사용권을 특정하는 자료|권리관계와 객체 계보
|
||||||
|
P|E12-P02|evidence_component|strong|1.0|SU|공유물의 점유·사용·수익·보존·관리·변경·처분과 동의·결의 자료|공유 governance와 사용수익
|
||||||
|
P|E12-P03|evidence_component|support|0.5|SU|분할협의·불성립, 형상·이용·가치·담보·점유와 현물·대금·가격배상 방식 자료|공유물분할 형성 구조
|
||||||
|
P|E12-P04|evidence_component|support|0.5|SU|지적공부·도면·측량·현황경계·경계표 또는 집합건물 관리단·규약·관리비 부과 자료|경계·집합건물 subtype
|
||||||
|
N|E12-N01|legal_relation|DR|1.0|SU|단독소유 물건의 단순 인도·철거·방해배제 자료만 있고 공유·경계·집합건물 관계가 없음|E-11을 우선하고 E-12 leaf confidence를 낮춘다
|
||||||
|
N|E12-N02|legal_relation|MR|0.7|SU|공유물분할·관리비라는 사건명만 있고 지분·객체·규약·결의·부과 근거 source가 없음|사건명 단독 활성화를 금지한다
|
||||||
|
C|E12-C01|등기·약정·승계자료 사이 공유자·지분·전유·공용·대지 범위가 충돌함|E12_TITLE_SHARE_OR_OBJECT_CONFLICT_REVIEW
|
||||||
|
C|E12-C02|보존·관리·변경·처분의 성격, 동의·결의 정족 또는 규약 효력 자료가 충돌함|E12_GOVERNANCE_OR_RESOLUTION_CONFLICT_REVIEW
|
||||||
|
C|E12-C03|지적도·측량성과·현황경계 또는 분할가치·분할가능성 자료가 충돌함|E12_BOUNDARY_OR_PARTITION_CONFLICT_REVIEW
|
||||||
|
|
||||||
|
### E-13 | 책임재산 보전·채권자대위·채권자취소 | kind=leaf | ao=0 | dep=E-01,E-02,X1,X2,X3 | calc=CE-03,CE-04,CE-10
|
||||||
|
P|E13-P01|legal_relation|strong|1.0|SU|피보전채권과 채무자의 제3자 권리 또는 재산권 목적 행위가 함께 제시됨|-
|
||||||
|
P|E13-P02|event_kind|strong|1.0|SU|처분 전후 적극재산·소극재산·선순위권·실현가치 자료|-
|
||||||
|
P|E13-P03|party_role|support|0.5|SU|수익자·전득자·대가·관계·인지 상태 자료|-
|
||||||
|
P|E13-P04|relief|support|0.5|SU|원물반환·말소·가액배상·회복범위 산정 입력|-
|
||||||
|
N|E13-N01|other|DR|1.0|SU|단순 채무불이행 또는 담보설정만 있고 책임재산 보전 목적·처분 전후 재산상태 자료가 없음|E-02·E-10을 우선하되 E-13 monitor 후보를 삭제하지 않는다
|
||||||
|
C|E13-C01|처분 전후 자산·부채·선순위권·가치 자료가 충돌함|E13_BALANCE_SHEET_CONFLICT
|
||||||
|
C|E13-C02|대가 지급·정상거래·선의 자료와 해함 인식 자료가 충돌함|E13_CONSIDERATION_OR_GOOD_FAITH_CONFLICT
|
||||||
|
|
||||||
|
### E-14 | 채권집행 연계 본안 | kind=leaf | ao=0 | dep=E-01 | calc=CE-01,CE-02
|
||||||
|
OVR|minimum_primary_evidence=0
|
||||||
|
P|E14-P01|evidence_component|strong|1.0|SP|채권압류·추심명령·전부명령의 정본, 사건표시, 송달 및 확정 상태를 식별하는 원천|사건명 단일 키워드가 아니라 원천 조합으로 평가
|
||||||
|
P|E14-P02|legal_relation|strong|1.0|SP|집행채권·피압류채권·채무자·제3채무자·전부채권자 또는 추심채권자의 동일성을 연결하는 원천|사건명 단일 키워드가 아니라 원천 조합으로 평가
|
||||||
|
P|E14-P03|relief|strong|1.0|SP|전부금·추심금·압류채권대금·공탁금 출급/회수권 확인 또는 청구이의·제3자이의·배당이의의 실체 사유|사건명 단일 키워드가 아니라 원천 조합으로 평가
|
||||||
|
P|E14-P04|event_kind|support|0.7|SP|변제·상계·면제·시효·소유권·담보순위 등 집행 또는 배당 결과에 영향을 줄 실체법상 발생·변경·소멸 사실|사건명 단일 키워드가 아니라 원천 조합으로 평가
|
||||||
|
N|E14-N01|other|MR|0.7|SP|압류·추심·전부 또는 집행 신청 절차의 안내만 있고 집행권원·피압류채권·실체 사유 원천이 없는 자료|사건명 단일 키워드가 아니라 원천 조합으로 평가
|
||||||
|
N|E14-N02|relief|DR|0.6|SP|가압류·가처분 등 보전신청 또는 집행신청 자체만을 최종 목표로 하는 자료|사건명 단일 키워드가 아니라 원천 조합으로 평가
|
||||||
|
N|E14-N03|term|DR|0.8|SP|일상적 의미의 집행·압류라는 단어만 있고 법원 명령·채권·배당 관계가 없는 자료|사건명 단일 키워드가 아니라 원천 조합으로 평가
|
||||||
|
C|E14-C01|명령의 종류·사건표시·송달일·확정 여부 또는 압류 경합 자료가 서로 불일치|E14_ORDER_SERVICE_FINALITY_REVIEW
|
||||||
|
C|E14-C02|피압류채권의 발생 원인·당사자·금액·소멸 또는 이의 사유의 기준시점이 서로 불일치|E14_SOURCE_CONFLICT_REVIEW
|
||||||
|
|
||||||
|
### E-15 | 상속·유류분 | kind=leaf | ao=0 | dep=E-01 | calc=CE-03,CE-08
|
||||||
|
OVR|minimum_primary_evidence=0
|
||||||
|
P|E15-P01|legal_relation|strong|1.0|SP|피상속인의 사망과 상속개시·상속순위·대습상속·법정상속분에 관한 원천|-
|
||||||
|
P|E15-P02|event_kind|strong|1.0|SP|상속포기·한정승인·유언·유증·상속회복에 관한 행위 및 재판·수리 자료|-
|
||||||
|
P|E15-P03|relief|support|0.6|SP|유류분 반환·상속회복·상속원인 등기에 필요한 사실 및 재산·가액 원천|-
|
||||||
|
N|E15-N01|term|DR|0.6|SP|사망이나 상속관계와 무관한 일반적 영업양수·채권양도|사건명 단어가 아니라 법률관계와 원천을 기준으로 분리
|
||||||
|
N|E15-N02|other|MR|0.6|SP|혼인·이혼·친권 등 가사소송 고유 신분행위|제외 track과 상속재산 민사부분의 경계를 X3로 보전
|
||||||
|
C|E15-C01|피상속인·상속인·상속분을 지지하는 가족관계·신분·유언 원천이 불일치|E15_HEIR_SCOPE_CONFLICT_REVIEW
|
||||||
|
C|E15-C02|포기·한정승인·유증·사전증여의 날짜·범위·효력 근거가 불일치|E15_LIFECYCLE_CONFLICT_REVIEW
|
||||||
|
|
||||||
|
### E-16 | 어음·수표 | kind=leaf | ao=0 | dep=E-01,X3 | calc=CE-01,CE-03,CE-R4
|
||||||
|
P|E16-P01|evidence_component|strong|1.0|SU|어음·수표 원본·전자기록 또는 사본에 증권 종류·필수기재·발행·만기·지급지·금액·서명 자료|증권 형식과 발행인 책임
|
||||||
|
P|E16-P02|evidence_component|strong|1.0|SU|배서·교부·소지 경로, 배서 연속, 백지식·기한후배서와 취득 시점 자료|권리이전과 소지인 자격
|
||||||
|
P|E16-P03|evidence_component|support|0.5|SU|지급제시·지급거절·거절증서·통지와 시점·장소·상대방 자료|제시·소구 lifecycle
|
||||||
|
P|E16-P04|evidence_component|support|0.5|SU|백지보충권 수여·범위·보충 내용·취득자 인식 또는 원인채권·융통·담보 관계 자료|백지보충과 인적항변 경계
|
||||||
|
N|E16-N01|legal_relation|DR|1.0|SU|예금반환·카드대금·신용장·일반 채권양도 자료만 있고 어음·수표 증권 또는 전자기록이 없음|E-02·E-03을 우선하고 E-16을 활성화하지 않는다
|
||||||
|
N|E16-N02|legal_relation|MR|0.7|SU|약속어음금·수표금이라는 사건명 또는 회계 메모만 있고 증권면·배서·제시 source가 없음|사건명 단독 활성화를 금지한다
|
||||||
|
C|E16-C01|증권면 기재·원본성·서명·발행·금액·만기 또는 백지보충 내용이 충돌함|E16_INSTRUMENT_FORM_OR_COMPLETION_CONFLICT_REVIEW
|
||||||
|
C|E16-C02|배서 연속·교부·취득시점·소지인 자격 또는 선의취득 관련 자료가 충돌함|E16_ENDORSEMENT_OR_HOLDER_CONFLICT_REVIEW
|
||||||
|
C|E16-C03|지급제시·거절·통지의 시점·장소·상대방 또는 원인관계 항변 자료가 충돌함|E16_PRESENTMENT_RECOURSE_OR_CAUSE_CONFLICT_REVIEW
|
||||||
|
|
||||||
|
### E-17 | 노무·임금 | kind=leaf | ao=0 | dep=E-01 | calc=CE-01,CE-03,CE-09
|
||||||
|
OVR|minimum_primary_evidence=0
|
||||||
|
P|E17-P01|legal_relation|strong|1.0|SP|업무 내용·지휘감독·근무시간/장소·보수 성격·사업 편입 등 근로자성 지표를 확인하는 원천|사건명 단일 키워드가 아니라 원천 조합으로 평가
|
||||||
|
P|E17-P02|evidence_component|strong|1.0|SP|근로계약·취업규칙·급여대장·임금명세·계좌·근태·근로시간·수당·퇴직 자료|사건명 단일 키워드가 아니라 원천 조합으로 평가
|
||||||
|
P|E17-P03|relief|strong|1.0|SP|임금·수당·퇴직금 또는 근로자/근로관계 지위 확인의 사실 원천|사건명 단일 키워드가 아니라 원천 조합으로 평가
|
||||||
|
P|E17-P04|event_kind|support|0.7|SP|업무상 재해와 사업주의 민사책임·산재보험급여·손해 항목이 경합하는 원천|사건명 단일 키워드가 아니라 원천 조합으로 평가
|
||||||
|
N|E17-N01|legal_relation|DR|0.7|SP|독립 사업자가 자기 계산과 위험으로 업무를 수행한다는 원천만 있고 사용종속 지표가 없는 관계|사건명 단일 키워드가 아니라 원천 조합으로 평가
|
||||||
|
N|E17-N02|other|MR|0.8|SP|노동위원회 재심판정 취소 등 행정소송만을 최종 목표로 하는 자료|사건명 단일 키워드가 아니라 원천 조합으로 평가
|
||||||
|
N|E17-N03|term|DR|0.6|SP|일상적 의미의 급여·퇴직·직원 표현만 있고 노무 제공·사용자·임금 원천이 없는 자료|사건명 단일 키워드가 아니라 원천 조합으로 평가
|
||||||
|
C|E17-C01|계약 명칭과 실제 지휘감독·사업 편입·보수·대체 가능성 등 근로자성 지표가 서로 불일치|E17_WORKER_STATUS_CONFLICT_REVIEW
|
||||||
|
C|E17-C02|근로시간·지급 임금·수당 항목·퇴직일 또는 정산 내역이 원천별로 불일치|E17_WAGE_ITEM_CONFLICT_REVIEW
|
||||||
|
|
||||||
|
### E-18 | 단체·회사 결의/지위 | kind=leaf | ao=0 | dep=E-01,X3 | calc=CE-03,CE-R2
|
||||||
|
OVR|minimum_primary_evidence=0
|
||||||
|
P|E18-P01|evidence_component|strong|1.0|SP|정관·규약·의사록·소집통지·주주명부 등 단체 구성과 결의 절차를 연결하는 원천|사건명 단일 키워드가 아니라 source-backed 원천 조합으로 평가
|
||||||
|
P|E18-P02|legal_relation|strong|1.0|SP|결의 무효·부존재·취소 또는 임원·회원·주주 지위의 확인을 구하는 구제 원천|사건명 단일 키워드가 아니라 source-backed 원천 조합으로 평가
|
||||||
|
P|E18-P03|relief|strong|1.0|SP|주식·지분·출자·조합재산·분담금과 권리행사 주체를 연결하는 원천|사건명 단일 키워드가 아니라 source-backed 원천 조합으로 평가
|
||||||
|
N|E18-N01|other|DR|0.8|SP|회사·조합이라는 단어만 있고 단체 구성, 결의, 지위 또는 지분 관계 원천이 없는 자료|키워드 단독 활성화 금지
|
||||||
|
C|E18-C01|정관·명부·의사록·소집 및 의결 자료 사이에 결의 일시·정족수·권리자·대표권이 불일치|E18_SOURCE_CONFLICT_REVIEW
|
||||||
|
|
||||||
|
### E-19 | 보험 | kind=leaf | ao=0 | dep=E-01 | calc=CE-01,CE-12
|
||||||
|
OVR|minimum_primary_evidence=0
|
||||||
|
P|E19-P01|evidence_component|strong|1.0|SP|보험증권·청약서·약관·상품설명서와 계약자·피보험자·수익자를 연결하는 원천|사건명 단일 키워드가 아니라 source-backed 원천 조합으로 평가
|
||||||
|
P|E19-P02|legal_relation|strong|1.0|SP|보험사고·손해사정·진단·면책 또는 보험금·공제금 지급거절을 연결하는 원천|사건명 단일 키워드가 아니라 source-backed 원천 조합으로 평가
|
||||||
|
P|E19-P03|relief|strong|1.0|SP|고지·통지·명시·설명의무, 수익자 변경 또는 보험자대위의 통지·도달 원천|사건명 단일 키워드가 아니라 source-backed 원천 조합으로 평가
|
||||||
|
N|E19-N01|other|DR|0.8|SP|보험이라는 단어만 있고 보험계약·담보위험·사고·급부 관계 원천이 없는 자료|키워드 단독 활성화 금지
|
||||||
|
C|E19-C01|청약서·보험증권·적용 약관판·손해사정서 사이에 담보 범위·사고일·수익자·지급기준이 불일치|E19_SOURCE_CONFLICT_REVIEW
|
||||||
|
|
||||||
|
### E-20 | 지식재산 | kind=leaf | ao=0 | dep=E-01,E-05 | calc=CE-01,CE-R1
|
||||||
|
OVR|minimum_primary_evidence=0
|
||||||
|
P|E20-P01|evidence_component|strong|1.0|SP|등록원부·공보·저작물 원본·권리양도·실시허락 자료와 권리자를 연결하는 원천|사건명 단일 키워드가 아니라 source-backed 원천 조합으로 평가
|
||||||
|
P|E20-P02|legal_relation|strong|1.0|SP|청구항·저작물·표장·디자인·영업비밀과 피고 실시물·사용행위를 비교할 원천|사건명 단일 키워드가 아니라 source-backed 원천 조합으로 평가
|
||||||
|
P|E20-P03|relief|strong|1.0|SP|침해금지·폐기·손해배상·실시료·이용료·통상실시권 확인을 구하는 원천|사건명 단일 키워드가 아니라 source-backed 원천 조합으로 평가
|
||||||
|
N|E20-N01|other|DR|0.8|SP|특허·저작권·상표라는 단어만 있고 권리 특정·귀속·피고 실시행위 원천이 없는 자료|키워드 단독 활성화 금지
|
||||||
|
C|E20-C01|등록원부·계약·공보·버전 자료 사이에 권리자·보호범위·존속기간·실시허락이 불일치|E20_SOURCE_CONFLICT_REVIEW
|
||||||
|
|
||||||
|
### E-21 | 언론·인격권 | kind=leaf | ao=0 | dep=E-01,E-05 | calc=CE-05
|
||||||
|
OVR|minimum_primary_evidence=0
|
||||||
|
P|E21-P01|evidence_component|strong|1.0|SP|보도·게시물·영상·사진·방송 원본과 작성자·편집자·언론사·플랫폼·게시시점을 연결하는 원천|사건명 단일 키워드가 아니라 source-backed 원천 조합으로 평가
|
||||||
|
P|E21-P02|legal_relation|strong|1.0|SP|명예·신용·초상·사생활·개인정보 침해와 식별가능성·전파범위·공익성을 다투는 원천|사건명 단일 키워드가 아니라 source-backed 원천 조합으로 평가
|
||||||
|
P|E21-P03|relief|strong|1.0|SP|정정·반론·추후보도·삭제·금지·손해배상 청구와 요청·조정·송달 시점을 연결하는 원천|사건명 단일 키워드가 아니라 source-backed 원천 조합으로 평가
|
||||||
|
N|E21-N01|other|DR|0.8|SP|보도·명예·개인정보라는 단어만 있고 대상 표현·게시 주체·피해자 식별 원천이 없는 자료|키워드 단독 활성화 금지
|
||||||
|
C|E21-C01|원문·수정본·캡처·URL·게시시각·정정보도 요청 자료 사이에 표현 내용·도달범위·시점이 불일치|E21_SOURCE_CONFLICT_REVIEW
|
||||||
|
|
||||||
|
### EC-00 | 계약총론 공통층 | kind=common | ao=0 | dep=- | calc=CE-01
|
||||||
|
OVR|leaf_activation_threshold=absent|monitor_threshold=absent|minimum_primary_evidence=0
|
||||||
|
P|EC00.contract_relation|legal_relation|support|-|-|contractual_obligation|-
|
||||||
|
|
||||||
|
### X1 | 통지·의사표시 도달 lifecycle | kind=always_on | ao=1 | dep=- | calc=CE-03
|
||||||
|
OVR|minimum_primary_evidence=0
|
||||||
|
P|X1-P01|evidence_component|strong|1.0|SP|발신자·수신자·내용·작성 또는 발송 시점이 식별되는 통지나 의사표시 자료|-
|
||||||
|
P|X1-P02|event_kind|strong|1.0|SP|작성·발송·도달·수령·수령거절·반송 중 하나 이상의 lifecycle 사건|-
|
||||||
|
P|X1-P03|evidence_component|support|0.5|SP|우편조회·송달내역·전자전송기록·수신확인·회신|-
|
||||||
|
N|X1-N01|other|DR|0.6|SP|외부 발신 또는 전달 정황이 전혀 없는 내부 초안|작성과 발송·도달을 혼동하지 않음
|
||||||
|
N|X1-N02|date_pattern|MR|0.6|SP|통신행위와 연결되지 않은 단순 날짜|날짜만으로 lifecycle 상태를 생성하지 않음
|
||||||
|
C|X1-C01|발송일·도달일·수령일을 지지하는 원천의 시점이 서로 불일치|X1_LIFECYCLE_DATE_CONFLICT
|
||||||
|
C|X1-C02|주소·수신자 권한·문서 내용 또는 버전 원천이 불일치|X1_RECIPIENT_OR_CONTENT_CONFLICT
|
||||||
|
|
||||||
|
### X2 | 자산 특정·계보·상태 | kind=always_on | ao=1 | dep=- | calc=CE-04,CE-11
|
||||||
|
P|X2-P01|object|strong|1.0|SU|둘 이상의 문서가 동일 또는 연관 자산을 서로 다른 표시·alias로 지칭|-
|
||||||
|
P|X2-P02|evidence_component|strong|1.0|SU|등기·대장·계약·도면·목록에 자산 식별자·지분·순위·상태가 존재|-
|
||||||
|
P|X2-P03|event_kind|support|0.5|SU|자산의 소유·점유·사용·수익 또는 담보·처분 상태 변화|-
|
||||||
|
N|X2-N01|other|DR|1.0|SU|자산 객체가 없는 순수 인적·금전 관계 자료|해당 원천의 X2 seed 생성을 생략하되 다른 도메인 라우팅은 유지
|
||||||
|
C|X2-C01|동일 alias가 상이한 자산 식별자 또는 지분·면적과 연결됨|X2_ASSET_IDENTITY_CONFLICT
|
||||||
|
C|X2-C02|동일 기준시점의 소유·점유·사용·수익 또는 등기 상태가 충돌함|X2_STATE_OR_LINEAGE_CONFLICT
|
||||||
|
|
||||||
|
### X3 | 절차·청구형태·당사자적격·track 경계 | kind=always_on | ao=1 | dep=- | calc=CE-03,CE-13
|
||||||
|
OVR|minimum_primary_evidence=0
|
||||||
|
P|X3-P01|relief|strong|1.0|SP|이행·확인·형성·장래이행·일부청구·병합 중 하나 이상의 청구형태 단서|-
|
||||||
|
P|X3-P02|party_role|strong|1.0|SP|권리귀속·원고적격·피고적격·당사자능력·대표권·승계·공동소송 자료|-
|
||||||
|
P|X3-P03|other|support|0.6|SP|관할·소가·인지·제소기간·재심·준재심 또는 민사·가사·행정 track 경계 자료|-
|
||||||
|
N|X3-N01|term|MR|0.6|SP|사건명·접수부호·지원명만 있고 청구나 당사자·절차 사실이 없음|사건명 하나로 적격·track을 확정하지 않음
|
||||||
|
N|X3-N02|other|DR|0.6|SP|상대방 또는 법원에 제출되지 않은 내부 초안|소송행위로 승격하지 않음
|
||||||
|
C|X3-C01|동일 권리의 귀속자·대표자·승계인 원천이 불일치|X3_PARTY_STANDING_CONFLICT_REVIEW
|
||||||
|
C|X3-C02|하나의 쟁점이 민사·가사·행정·보전집행 track으로 서로 다르게 지시됨|TRACK_BOUNDARY_REVIEW
|
||||||
+216
@@ -0,0 +1,216 @@
|
|||||||
|
# EVIDENCE_COMPONENT_UNION
|
||||||
|
component_count=112
|
||||||
|
domain_count=26
|
||||||
|
proof_role_count=77
|
||||||
|
conflict_count=0
|
||||||
|
registry_version=Stage1.Assembly.2026-08-10.v1
|
||||||
|
registry_index_sha256=9f177ebf8860e20e05483967a2037f3baa09c2ac92c69ddeb260c04ca31ebf39
|
||||||
|
line_format=<component_id>|<proof_role>|<label>|<owner_domain_ids>|<accepted_source_kinds>
|
||||||
|
sort=component_id ascending
|
||||||
|
generator=Default_Agent/routing/_build_evidence_component_union.py
|
||||||
|
|
||||||
|
## USAGE
|
||||||
|
- 증거 구성요소는 이 파일의 component_id 만 쓴다. 목록에 없는 이름을 만들지 않는다.
|
||||||
|
- 이 ID 는 registry 증거 구성요소 식별자다(`<도메인슬러그>.<번호>` 꼴).
|
||||||
|
v3 프롬프트가 쓰던 문서 추출 구조 이름과는 계층이 다르며 교집합이 없다.
|
||||||
|
옛 이름을 기억해 두었다가 섞어 쓰지 않는다.
|
||||||
|
- owner 열은 참고 정보다. 그 도메인이 활성인지 여부로 구성요소를 배제하지 않는다.
|
||||||
|
- 문서 추출은 도메인 가설과 무관하게 전량 수행한다. 활성 후보만 뽑지 않는다.
|
||||||
|
- accepted_source_kinds 는 그 구성요소를 실을 수 있는 원천 종류다.
|
||||||
|
목록에 없는 원천에서 그 구성요소를 붙이지 않는다.
|
||||||
|
- 구성요소를 붙이기 어려우면 비워 두고 review 로 남긴다. 억지로 가까운 것을 고르지 않는다.
|
||||||
|
- 이 층은 자료의 존재를 색인하는 층이다. 요건 충족 여부를 판정하지 않는다.
|
||||||
|
|
||||||
|
## COMPONENTS
|
||||||
|
construction_defect.ev01|element_or_opposing_fact_support|도급계약서·공사계약서·설계도서·시방서·견적서|E-07|event_candidate,evidence
|
||||||
|
construction_defect.ev02|element_or_opposing_fact_support|발주서·변경지시서·추가공사 합의·회의록|E-07|event_candidate,evidence
|
||||||
|
construction_defect.ev03|element_or_opposing_fact_support|공정표·작업일보·기성검사서·준공검사·인수증|E-07|event_candidate,evidence
|
||||||
|
construction_defect.ev04|element_or_opposing_fact_support|세금계산서·기성청구서·계좌거래·정산서|E-07|event_candidate,evidence
|
||||||
|
construction_defect.ev05|element_or_opposing_fact_support|하자목록·현장사진·감정서·보수견적·보수이력|E-07|event_candidate,evidence
|
||||||
|
construction_defect.ev06|element_or_opposing_fact_support|하자보수 요구·최고·도달 및 대응 자료|E-07|event_candidate,evidence
|
||||||
|
contract_instrument|formation_and_terms|계약 내용과 변경을 보여 주는 문서|EC-00|event_candidate,evidence
|
||||||
|
contract_money_claim.ev01|legacy_successor_evidence|계약서·차용증·정산합의서|E-02|event_candidate,evidence
|
||||||
|
contract_money_claim.ev02|legacy_successor_evidence|계좌이체·영수증·거래내역|E-02|event_candidate,evidence
|
||||||
|
contract_money_claim.ev03|legacy_successor_evidence|최고서·청구서·도달자료|E-02|event_candidate,evidence
|
||||||
|
e00.routing_audit|unrouted_reason|router membership·count·집합 보존 audit|E-00|routing_audit
|
||||||
|
e00.unclaimed_source|residual_fact|어느 활성 route에도 소속되지 않은 원천|E-00|event_candidate,evidence,law_version,meeting_clause
|
||||||
|
e01.identity_record|identity_and_relation|당사자·객체·관계·행위를 특정하는 원문 자료|E-01|event_candidate,evidence
|
||||||
|
e01.opposing_record|opposition_and_defense|반대사실·항변·예외·면책 후보 자료|E-01|event_candidate,evidence
|
||||||
|
e01.primary_elements|elements|주요 요건사실 후보를 뒷받침하는 처분문서·기록·감정 자료|E-01|event_candidate,evidence
|
||||||
|
e01.timeline_record|law_version_and_period_operands|행위·효력·손해·권리행사의 기준시점 자료|E-01|event_candidate,evidence
|
||||||
|
e04.contract_or_termination|legal_basis|계약·무효·취소·해제·종료 자료|E-04|event_candidate,evidence
|
||||||
|
e04.transfer_or_payment|gain_and_loss|급부·송금·지급·비용 지출 자료|E-04|event_candidate,evidence
|
||||||
|
e04.use_and_possession|use_benefit|점유·사용·수익 기간과 대상 자료|E-04|event_candidate,evidence
|
||||||
|
e04.valuation|valuation_operand|감정·시세·임료·면적·산정기초 자료|E-04|event_candidate,evidence
|
||||||
|
e05.causation_record|causation|사고경위·감정·의학·기술·시간순서 등 인과관계 자료|E-05|event_candidate,evidence
|
||||||
|
e05.conduct_record|conduct_and_actor|행위·부작위의 일시·장소·방법을 나타내는 문서·영상·기록|E-05|event_candidate,evidence
|
||||||
|
e05.damage_record|damage|진료·수리·회계·소득·평가 등 손해 발생·범위 자료|E-05|event_candidate,evidence
|
||||||
|
e05.duty_fault_record|fault_and_wrongfulness|주의기준·업무절차·경고·예견 및 회피 가능성 자료|E-05|event_candidate,evidence
|
||||||
|
e05.relationship_record|attribution_and_multiple_parties|고용·지휘감독·업무수행·점유·소유·공동관여 지위 자료|E-05|event_candidate,evidence
|
||||||
|
e05.time_bar_record|limitation_operands|침해·손해발생·인지·권리행사 기준시점 자료|E-05|event_candidate,evidence
|
||||||
|
e06.identity_record|identity_and_relation|당사자·객체·관계·행위를 특정하는 원문 자료|E-06|event_candidate,evidence
|
||||||
|
e06.opposing_record|opposition_and_defense|반대사실·항변·예외·면책 후보 자료|E-06|event_candidate,evidence
|
||||||
|
e06.primary_elements|elements|주요 요건사실 후보를 뒷받침하는 처분문서·기록·감정 자료|E-06|event_candidate,evidence
|
||||||
|
e06.timeline_record|law_version_and_period_operands|행위·효력·손해·권리행사의 기준시점 자료|E-06|event_candidate,evidence
|
||||||
|
e11.asset_identity|object_identity|등기·대장·도면·별지목록 등 자산 특정 자료|E-11|event_candidate,evidence
|
||||||
|
e11.delivery_or_removal|relief_object|인도·퇴거·철거·수거·방해 상태 자료|E-11|event_candidate,evidence
|
||||||
|
e11.legal_cause_assertion|asserted_cause|임대차·유치권·사용대차·동시이행 등 주장 자료|E-11|event_candidate,evidence
|
||||||
|
e11.possession_record|possession_state|점유·사용·출입·열쇠·시설관리 자료|E-11|event_candidate,evidence
|
||||||
|
e12.identity_record|identity_and_relation|당사자·객체·관계·행위를 특정하는 원문 자료|E-12|event_candidate,evidence
|
||||||
|
e12.opposing_record|opposition_and_defense|반대사실·항변·예외·면책 후보 자료|E-12|event_candidate,evidence
|
||||||
|
e12.primary_elements|elements|주요 요건사실 후보를 뒷받침하는 처분문서·기록·감정 자료|E-12|event_candidate,evidence
|
||||||
|
e12.timeline_record|law_version_and_period_operands|행위·효력·손해·권리행사의 기준시점 자료|E-12|event_candidate,evidence
|
||||||
|
e13.balance_sheet|insolvency_operand|처분 전후 재산·채무·선순위권·가치 자료|E-13|event_candidate,evidence
|
||||||
|
e13.beneficiary_chain|knowledge_and_defense|수익자·전득자·대가·관계·인식 자료|E-13|event_candidate,evidence
|
||||||
|
e13.disposition|debtor_act|계약·등기·송금·담보설정 등 처분 자료|E-13|event_candidate,evidence
|
||||||
|
e13.preserved_claim|preserved_claim|채권 발생·금액·이행기·채무승인 자료|E-13|event_candidate,evidence
|
||||||
|
e13.remedy_value|remedy_operand|원물반환 가능성·가액·담보부담·상한 자료|E-13|event_candidate,evidence
|
||||||
|
e14.attached_claim|attached_claim_identity|피압류채권의 발생·범위·존속 원천|E-14|event_candidate,evidence
|
||||||
|
e14.court_order|order_scope_and_effect|압류·추심·전부명령 정본과 송달·확정 원천|E-14|event_candidate,evidence
|
||||||
|
e14.deposit|deposit_right|공탁서·공탁통지·출급/회수 청구 원천|E-14|event_candidate,evidence
|
||||||
|
e14.distribution|distribution_entitlement|배당표·배당기일조서·배당요구·이의 원천|E-14|event_candidate,evidence
|
||||||
|
e14.execution_title|execution_title|집행권원과 집행채권 원천|E-14|event_candidate,evidence
|
||||||
|
e14.substantive_ground|substantive_ground|변제·상계·소유권·순위 등 이의의 실체 사유 원천|E-14|event_candidate,evidence
|
||||||
|
e15.court_acceptance|status_change|상속포기·한정승인·상속회복 재판·수리 자료|E-15|event_candidate,evidence
|
||||||
|
e15.estate_inventory|estate_scope|상속재산·채무·등기·거래·감정 원천|E-15|event_candidate,evidence
|
||||||
|
e15.family_status|succession_order|기본증명·제적·사망·가족관계 원천|E-15|event_candidate,evidence
|
||||||
|
e15.will_gift|disposition_or_benefit|유언서·유증·사전증여 원천|E-15|event_candidate,evidence
|
||||||
|
e16.identity_record|identity_and_relation|당사자·객체·관계·행위를 특정하는 원문 자료|E-16|event_candidate,evidence
|
||||||
|
e16.opposing_record|opposition_and_defense|반대사실·항변·예외·면책 후보 자료|E-16|event_candidate,evidence
|
||||||
|
e16.primary_elements|elements|주요 요건사실 후보를 뒷받침하는 처분문서·기록·감정 자료|E-16|event_candidate,evidence
|
||||||
|
e16.timeline_record|law_version_and_period_operands|행위·효력·손해·권리행사의 기준시점 자료|E-16|event_candidate,evidence
|
||||||
|
e17.accident|industrial_accident_overlap|재해·요양·보험급여·손해항목·과실 원천|E-17|event_candidate,evidence
|
||||||
|
e17.direction_control|subordination_indicators|업무지시·평가·징계·근무편성·대체 제한 원천|E-17|event_candidate,evidence
|
||||||
|
e17.lifecycle|employment_lifecycle|채용·배치·휴직·해고·사직·퇴직 원천|E-17|event_candidate,evidence
|
||||||
|
e17.payroll|wage_items_and_payment|급여대장·임금명세·계좌·원천징수 원천|E-17|event_candidate,evidence
|
||||||
|
e17.relationship|worker_status|근로계약·도급/위임계약과 실제 노무제공 관계 원천|E-17|event_candidate,evidence
|
||||||
|
e17.timekeeping|worktime|출퇴근·근태·근로시간·휴일·휴가 원천|E-17|event_candidate,evidence
|
||||||
|
e18.entity_constitution|entity_constitution|단체 법형태·정관·규약·기관 및 대표권 후보|E-18|event_candidate,evidence
|
||||||
|
e18.equity_settlement|equity_settlement|출자·지분·손익·청산 operand 후보|E-18|event_candidate,evidence
|
||||||
|
e18.relief_and_period|relief_and_period|무효·부존재·취소·지위확인 구별과 제소기간 기준사실 후보|E-18|event_candidate,evidence
|
||||||
|
e18.resolution_procedure|resolution_procedure|소집권자·통지·의안·정족수·의결 결과 후보|E-18|event_candidate,evidence
|
||||||
|
e18.status_entitlement|status_entitlement|주주·임원·회원·조합원·지분권자의 지위 및 명부 후보|E-18|event_candidate,evidence
|
||||||
|
e19.beneficiary_subrogation|beneficiary_subrogation|수익자 변경·보험금 귀속·보험자대위 후보|E-19|event_candidate,evidence
|
||||||
|
e19.benefit_operands|benefit_operands|보험금·공제금 CE-12 및 지연손해 CE-01 operand 후보|E-19|event_candidate,evidence
|
||||||
|
e19.coverage_exclusion|coverage_exclusion|담보위험·면책·고지·통지·설명의무 후보|E-19|event_candidate,evidence
|
||||||
|
e19.insured_event|insured_event|보험사고의 발생·우연성·담보기간·인과 후보|E-19|event_candidate,evidence
|
||||||
|
e19.policy_identity|policy_identity|보험계약·증권·약관판·특약·계약 당사자 후보|E-19|event_candidate,evidence
|
||||||
|
e20.infringing_act|infringing_act|피고 실시물·사용행위·유통경로·기간 후보|E-20|event_candidate,evidence
|
||||||
|
e20.ownership_license|ownership_license|원시·승계 귀속, 양도, 전용·통상실시권 및 이용허락 후보|E-20|event_candidate,evidence
|
||||||
|
e20.remedy_damage_operands|remedy_damage_operands|금지·폐기·신용회복·손해·실시료와 CE-R1 operand 후보|E-20|event_candidate,evidence
|
||||||
|
e20.right_identity|right_identity|특허·저작권·상표·디자인·영업비밀의 특정 및 존속 후보|E-20|event_candidate,evidence
|
||||||
|
e20.scope_comparison|scope_comparison|청구항 구성·저작물 의거성/실질적 유사성·표장 유사·비밀관리 비교 후보|E-20|event_candidate,evidence
|
||||||
|
e21.content_character|content_character|사실 적시·의견·진실성·상당성·공익성 후보|E-21|event_candidate,evidence
|
||||||
|
e21.personality_privacy|personality_privacy|명예·신용·초상·사생활·개인정보 침해 및 동의 후보|E-21|event_candidate,evidence
|
||||||
|
e21.publication_identity|publication_identity|보도·게시물·영상·사진의 원본·버전·게시 주체·시점 후보|E-21|event_candidate,evidence
|
||||||
|
e21.remedy_timing_damage|remedy_timing_damage|정정·반론·추후보도·삭제·금지·손해와 기간·CE-05 operand 후보|E-21|event_candidate,evidence
|
||||||
|
e21.subject_identifiability|subject_identifiability|피해자 특정·식별가능성·전파범위 후보|E-21|event_candidate,evidence
|
||||||
|
lease_deposit.ev01|element_or_opposing_fact_support|임대차계약서·갱신계약·특약·목적물 표시 자료|E-08|event_candidate,evidence
|
||||||
|
lease_deposit.ev02|element_or_opposing_fact_support|보증금·차임·관리비 계좌거래·영수증·정산서|E-08|event_candidate,evidence
|
||||||
|
lease_deposit.ev03|element_or_opposing_fact_support|해지·갱신거절·반환 요구 통지와 도달 자료|E-08|event_candidate,evidence
|
||||||
|
lease_deposit.ev04|element_or_opposing_fact_support|인도확인서·열쇠반환·점유·전입·사업자등록 관련 자료|E-08|event_candidate,evidence
|
||||||
|
lease_deposit.ev05|element_or_opposing_fact_support|원상회복 목록·현장사진·견적·수리비·관리비 자료|E-08|event_candidate,evidence
|
||||||
|
lease_deposit.ev06|element_or_opposing_fact_support|등기·소유권 변동·임대인 지위 승계 관련 자료|E-08|event_candidate,evidence
|
||||||
|
parties_liability_succession.ev01|legacy_successor_evidence|보증서·채무인수계약|E-03|event_candidate,evidence
|
||||||
|
parties_liability_succession.ev02|legacy_successor_evidence|영업양도계약·사업자·상호 자료|E-03|event_candidate,evidence
|
||||||
|
parties_liability_succession.ev03|legacy_successor_evidence|채권양도통지·도달자료|E-03|event_candidate,evidence
|
||||||
|
registry_transfer_claims.ev01|legacy_successor_evidence|등기사항증명서·접수정보|E-09|event_candidate,evidence
|
||||||
|
registry_transfer_claims.ev02|legacy_successor_evidence|매매·증여·화해 등 원인문서|E-09|event_candidate,evidence
|
||||||
|
registry_transfer_claims.ev03|legacy_successor_evidence|말소·회복·승낙 관련 문서|E-09|event_candidate,evidence
|
||||||
|
secured_registry.ev01|legacy_successor_evidence|담보계약·채권확정서류|E-10|event_candidate,evidence
|
||||||
|
secured_registry.ev02|legacy_successor_evidence|등기사항증명서·변제내역|E-10|event_candidate,evidence
|
||||||
|
secured_registry.ev03|legacy_successor_evidence|경매기록·배당표|E-10|event_candidate,evidence
|
||||||
|
secured_registry.ev04|legacy_successor_evidence|유치권신고·점유자료|E-10|event_candidate,evidence
|
||||||
|
x1.delivery_tracking|arrival_or_nonarrival|배송조회·송달내역·반송기록|X1|event_candidate,evidence
|
||||||
|
x1.dispatch_record|dispatch|우편접수증·전자전송기록·발송로그|X1|event_candidate,evidence
|
||||||
|
x1.notice_instrument|expression_content|통지서·최고서·해제·해지 통보·전자메시지|X1|evidence
|
||||||
|
x1.recipient_acknowledgement|receipt_or_access|수신확인·회신·후속행위|X1|event_candidate,evidence
|
||||||
|
x2.contract_description|alias|계약·공정증서·인도목록의 목적물 표시|X2|event_candidate,evidence
|
||||||
|
x2.ledger_map|identity|토지·건축물대장·도면·별지목록|X2|event_candidate,evidence
|
||||||
|
x2.registry|lineage|등기사항·담보·처분·말소·회복 기록|X2|event_candidate,evidence
|
||||||
|
x2.state_evidence|state_axis|점유·사용·수익·관리·임대 상태 자료|X2|event_candidate,evidence
|
||||||
|
x2.valuation_binding|valuation_binding|감정·시세·임료 자료의 대상과 기준시점|X2|event_candidate,evidence
|
||||||
|
x3.party_authority|capacity_or_standing|당사자·법인·대표자·승계인 권한·귀속 원천|X3|event_candidate,evidence
|
||||||
|
x3.procedure_record|procedural_posture|소장·송달·확정증명·재판절차·재심 원천|X3|event_candidate,evidence
|
||||||
|
x3.relief_instrument|relief_form|청구취지·청구원인·재판·합의·집행권원 원천|X3|event_candidate,evidence
|
||||||
|
x3.valuation_fee_input|court_fee_operand|청구금액·목적물 가액·병합·소가·인지 입력|X3|event_candidate,evidence
|
||||||
|
|
||||||
|
## PROOF_ROLES
|
||||||
|
line_format=<proof_role>|<component_count>
|
||||||
|
alias|1
|
||||||
|
arrival_or_nonarrival|1
|
||||||
|
asserted_cause|1
|
||||||
|
attached_claim_identity|1
|
||||||
|
attribution_and_multiple_parties|1
|
||||||
|
beneficiary_subrogation|1
|
||||||
|
benefit_operands|1
|
||||||
|
capacity_or_standing|1
|
||||||
|
causation|1
|
||||||
|
conduct_and_actor|1
|
||||||
|
content_character|1
|
||||||
|
court_fee_operand|1
|
||||||
|
coverage_exclusion|1
|
||||||
|
damage|1
|
||||||
|
debtor_act|1
|
||||||
|
deposit_right|1
|
||||||
|
dispatch|1
|
||||||
|
disposition_or_benefit|1
|
||||||
|
distribution_entitlement|1
|
||||||
|
element_or_opposing_fact_support|12
|
||||||
|
elements|4
|
||||||
|
employment_lifecycle|1
|
||||||
|
entity_constitution|1
|
||||||
|
equity_settlement|1
|
||||||
|
estate_scope|1
|
||||||
|
execution_title|1
|
||||||
|
expression_content|1
|
||||||
|
fault_and_wrongfulness|1
|
||||||
|
formation_and_terms|1
|
||||||
|
gain_and_loss|1
|
||||||
|
identity|1
|
||||||
|
identity_and_relation|4
|
||||||
|
industrial_accident_overlap|1
|
||||||
|
infringing_act|1
|
||||||
|
insolvency_operand|1
|
||||||
|
insured_event|1
|
||||||
|
knowledge_and_defense|1
|
||||||
|
law_version_and_period_operands|4
|
||||||
|
legacy_successor_evidence|13
|
||||||
|
legal_basis|1
|
||||||
|
limitation_operands|1
|
||||||
|
lineage|1
|
||||||
|
object_identity|1
|
||||||
|
opposition_and_defense|4
|
||||||
|
order_scope_and_effect|1
|
||||||
|
ownership_license|1
|
||||||
|
personality_privacy|1
|
||||||
|
policy_identity|1
|
||||||
|
possession_state|1
|
||||||
|
preserved_claim|1
|
||||||
|
procedural_posture|1
|
||||||
|
publication_identity|1
|
||||||
|
receipt_or_access|1
|
||||||
|
relief_and_period|1
|
||||||
|
relief_form|1
|
||||||
|
relief_object|1
|
||||||
|
remedy_damage_operands|1
|
||||||
|
remedy_operand|1
|
||||||
|
remedy_timing_damage|1
|
||||||
|
residual_fact|1
|
||||||
|
resolution_procedure|1
|
||||||
|
right_identity|1
|
||||||
|
scope_comparison|1
|
||||||
|
state_axis|1
|
||||||
|
status_change|1
|
||||||
|
status_entitlement|1
|
||||||
|
subject_identifiability|1
|
||||||
|
subordination_indicators|1
|
||||||
|
substantive_ground|1
|
||||||
|
succession_order|1
|
||||||
|
unrouted_reason|1
|
||||||
|
use_benefit|1
|
||||||
|
valuation_binding|1
|
||||||
|
valuation_operand|1
|
||||||
|
wage_items_and_payment|1
|
||||||
|
worker_status|1
|
||||||
|
worktime|1
|
||||||
+1
File diff suppressed because one or more lines are too long
+1491
File diff suppressed because it is too large
Load Diff
+67
@@ -0,0 +1,67 @@
|
|||||||
|
{
|
||||||
|
"$id": "https://schemas.liti-agent.local/stage1/s5/evidence_slot_status.schema.json",
|
||||||
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"evidence_refs": {
|
||||||
|
"items": {
|
||||||
|
"minLength": 1,
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"type": "array",
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"meeting_clause_refs": {
|
||||||
|
"items": {
|
||||||
|
"minLength": 1,
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"type": "array",
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"negative_or_conflicting_refs": {
|
||||||
|
"items": {
|
||||||
|
"minLength": 1,
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"type": "array",
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"review_code": {
|
||||||
|
"type": [
|
||||||
|
"string",
|
||||||
|
"null"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"slot_id": {
|
||||||
|
"minLength": 1,
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"source_fact_ids": {
|
||||||
|
"items": {
|
||||||
|
"minLength": 1,
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"type": "array",
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"status": {
|
||||||
|
"enum": [
|
||||||
|
"filled",
|
||||||
|
"partial",
|
||||||
|
"missing",
|
||||||
|
"conflicted"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"slot_id",
|
||||||
|
"status",
|
||||||
|
"source_fact_ids",
|
||||||
|
"evidence_refs",
|
||||||
|
"meeting_clause_refs",
|
||||||
|
"negative_or_conflicting_refs",
|
||||||
|
"review_code"
|
||||||
|
],
|
||||||
|
"type": "object"
|
||||||
|
}
|
||||||
+129
@@ -0,0 +1,129 @@
|
|||||||
|
{
|
||||||
|
"$id": "https://schemas.liti-agent.local/stage1/s5/signal_item.schema.json",
|
||||||
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"confidence": {
|
||||||
|
"enum": [
|
||||||
|
"high",
|
||||||
|
"medium",
|
||||||
|
"low"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"details": {
|
||||||
|
"type": "object"
|
||||||
|
},
|
||||||
|
"domain_ids": {
|
||||||
|
"items": {
|
||||||
|
"minLength": 1,
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"type": "array",
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"evidence_refs": {
|
||||||
|
"items": {
|
||||||
|
"minLength": 1,
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"type": "array",
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"issue_cluster_ids": {
|
||||||
|
"items": {
|
||||||
|
"minLength": 1,
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"type": "array",
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"law_version_refs": {
|
||||||
|
"items": {
|
||||||
|
"minLength": 1,
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"type": "array",
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"meeting_clause_refs": {
|
||||||
|
"items": {
|
||||||
|
"minLength": 1,
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"type": "array",
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"negative_or_conflicting_refs": {
|
||||||
|
"items": {
|
||||||
|
"minLength": 1,
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"type": "array",
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"proof_grade": {
|
||||||
|
"enum": [
|
||||||
|
"document_direct",
|
||||||
|
"document_indirect",
|
||||||
|
"corroborated",
|
||||||
|
"client_statement",
|
||||||
|
"ungraded"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"record_type": {
|
||||||
|
"pattern": "^[a-z][a-z0-9_.-]{1,127}$",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"review_required": {
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"signal_id": {
|
||||||
|
"minLength": 1,
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"source_bo_ids": {
|
||||||
|
"items": {
|
||||||
|
"minLength": 1,
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"type": "array",
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"source_fact_ids": {
|
||||||
|
"items": {
|
||||||
|
"minLength": 1,
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"type": "array",
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"status": {
|
||||||
|
"enum": [
|
||||||
|
"observed",
|
||||||
|
"inferred",
|
||||||
|
"contested",
|
||||||
|
"missing_required",
|
||||||
|
"review"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"signal_id",
|
||||||
|
"record_type",
|
||||||
|
"status",
|
||||||
|
"issue_cluster_ids",
|
||||||
|
"domain_ids",
|
||||||
|
"source_bo_ids",
|
||||||
|
"source_fact_ids",
|
||||||
|
"evidence_refs",
|
||||||
|
"meeting_clause_refs",
|
||||||
|
"negative_or_conflicting_refs",
|
||||||
|
"law_version_refs",
|
||||||
|
"confidence",
|
||||||
|
"proof_grade",
|
||||||
|
"review_required",
|
||||||
|
"details"
|
||||||
|
],
|
||||||
|
"title": "Stage 1 common signal item",
|
||||||
|
"type": "object"
|
||||||
|
}
|
||||||
+117
@@ -0,0 +1,117 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Adapt S3 seed-v3 envelopes into deterministic signal candidates and domain envelopes."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from copy import deepcopy
|
||||||
|
import json
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
from adapters.s3_envelope_migration_adapter import migrate_deprecated_envelope
|
||||||
|
|
||||||
|
|
||||||
|
_SIGNALS_ROOT = Path(__file__).resolve().parents[1]
|
||||||
|
|
||||||
|
|
||||||
|
def _liability_fanout_domains() -> set[str]:
|
||||||
|
contract = json.loads((_SIGNALS_ROOT.parents[1] / "contracts" / "s5_execution_contract.v2.json").read_text(encoding="utf-8"))
|
||||||
|
return {item["domain_id"] for item in contract["sg08_liability_fanout_domains"]}
|
||||||
|
|
||||||
|
|
||||||
|
def _source_fields(refs: list[str], universe: dict[str, Any]) -> tuple[list[str], list[str]]:
|
||||||
|
evidence = set(universe.get("evidence_ids", []))
|
||||||
|
meeting = set(universe.get("meeting_clause_ids", []))
|
||||||
|
return sorted(set(refs) & evidence), sorted(set(refs) & meeting)
|
||||||
|
|
||||||
|
|
||||||
|
def _candidate(domain_id: str, seed_id: str, record_type: str, source_refs: list[str], details: dict[str, Any], universe: dict[str, Any], status: str = "inferred") -> dict[str, Any]:
|
||||||
|
evidence, meeting = _source_fields(source_refs, universe)
|
||||||
|
return {
|
||||||
|
"record_type": record_type, "status": status, "domain_ids": [domain_id], "source_bo_ids": [],
|
||||||
|
"source_fact_ids": [], "evidence_refs": evidence, "meeting_clause_refs": meeting,
|
||||||
|
"negative_or_conflicting_refs": sorted(set(details.get("negative_or_conflicting_refs", []))),
|
||||||
|
"law_version_refs": [], "confidence": "medium", "proof_grade": "client_statement" if meeting and not evidence else ("document_indirect" if evidence else "ungraded"),
|
||||||
|
"review_required": status in {"contested", "missing_required", "review"},
|
||||||
|
"details": {"source_seed_id": seed_id, **deepcopy(details)},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def adapt(inputs: dict[str, Any]) -> dict[str, Any]:
|
||||||
|
adapted = deepcopy(inputs)
|
||||||
|
candidates = adapted.setdefault("signal_candidates", {})
|
||||||
|
domains = adapted.setdefault("domain_signal_envelopes", {})
|
||||||
|
universe = adapted.get("source_universe", {})
|
||||||
|
raw_outputs = adapted.get("domain_seed_outputs", {})
|
||||||
|
deprecated_envelopes = adapted.get("deprecated_domain_signal_envelopes", {})
|
||||||
|
wrappers = list(raw_outputs.values()) if isinstance(raw_outputs, dict) else list(raw_outputs or [])
|
||||||
|
for wrapper in wrappers:
|
||||||
|
if not isinstance(wrapper, dict) or not isinstance(wrapper.get("stage_b_domain_bo_seed_output"), dict):
|
||||||
|
continue
|
||||||
|
root = wrapper["stage_b_domain_bo_seed_output"]
|
||||||
|
if root.get("schema_version") != "task_c_bo_stage_b_domain_bo_seed.v3":
|
||||||
|
raise ValueError("S3_SEED_SCHEMA_VERSION_MISMATCH")
|
||||||
|
domain_id = str(root.get("domain_id") or "")
|
||||||
|
element_rows: list[Any] = []
|
||||||
|
opposing_rows: list[Any] = []
|
||||||
|
defense_rows: list[Any] = []
|
||||||
|
slot_rows: list[Any] = []
|
||||||
|
calculation_refs: list[str] = []
|
||||||
|
dependencies: set[str] = set()
|
||||||
|
review_items: list[Any] = list(root.get("unknown_or_unrouted_reviews", []))
|
||||||
|
for seed in root.get("bo_seed_candidates", []):
|
||||||
|
if not isinstance(seed, dict):
|
||||||
|
continue
|
||||||
|
seed_id = str(seed.get("seed_id") or "unknown-seed")
|
||||||
|
seed_refs = [str(ref) for ref in seed.get("source_refs", [])]
|
||||||
|
for fact in seed.get("element_fact_candidates", []):
|
||||||
|
if isinstance(fact, dict):
|
||||||
|
refs = [str(fact.get("source_id"))] if fact.get("source_id") else seed_refs
|
||||||
|
candidates.setdefault("SG-05", []).append(_candidate(domain_id, seed_id, "domain_relation_atom", refs, fact, universe, str(fact.get("payload", {}).get("status") or "inferred")))
|
||||||
|
if domain_id in _liability_fanout_domains():
|
||||||
|
candidates.setdefault("SG-08", []).append(_candidate(domain_id, seed_id, "liability_element", refs, fact, universe, str(fact.get("payload", {}).get("status") or "inferred")))
|
||||||
|
element_rows.append(deepcopy(fact))
|
||||||
|
for fact in seed.get("opposing_fact_candidates", []):
|
||||||
|
if isinstance(fact, dict):
|
||||||
|
opposing_rows.append(deepcopy(fact))
|
||||||
|
for defense in seed.get("defense_candidates", []):
|
||||||
|
if isinstance(defense, dict):
|
||||||
|
refs = [str(ref) for ref in defense.get("source_refs", seed_refs)]
|
||||||
|
candidates.setdefault("SG-09", []).append(_candidate(domain_id, seed_id, "defense_trigger", refs, defense, universe, str(defense.get("status") or "inferred")))
|
||||||
|
defense_rows.append(deepcopy(defense))
|
||||||
|
for request in seed.get("calculation_requests", []):
|
||||||
|
if isinstance(request, dict):
|
||||||
|
adapted.setdefault("calculation_requests", []).append(deepcopy(request))
|
||||||
|
if request.get("request_id"):
|
||||||
|
calculation_refs.append(str(request["request_id"]))
|
||||||
|
for effect in seed.get("legal_effect_candidates", []):
|
||||||
|
if isinstance(effect, dict):
|
||||||
|
refs = [str(ref) for ref in effect.get("source_refs", seed_refs)]
|
||||||
|
status = "review" if effect.get("registered") is False else "inferred"
|
||||||
|
candidates.setdefault("SG-13", []).append(_candidate(domain_id, seed_id, "legal_effect_route", refs, effect, universe, status))
|
||||||
|
for slot in seed.get("evidence_slot_status", []):
|
||||||
|
if not isinstance(slot, dict):
|
||||||
|
continue
|
||||||
|
refs = [str(ref) for ref in slot.get("source_refs", [])]
|
||||||
|
evidence, meeting = _source_fields(refs, universe)
|
||||||
|
slot_rows.append({
|
||||||
|
"slot_id": str(slot.get("slot_id") or "unknown_slot"), "status": slot.get("status", "missing"),
|
||||||
|
"source_fact_ids": [], "evidence_refs": evidence, "meeting_clause_refs": meeting,
|
||||||
|
"negative_or_conflicting_refs": [], "review_code": slot.get("review_code"),
|
||||||
|
})
|
||||||
|
dependencies.update(str(value) for value in seed.get("dependency_refs", []))
|
||||||
|
review_items.extend(deepcopy(seed.get("review_items", [])))
|
||||||
|
extensions: dict[str, Any] = {}
|
||||||
|
if isinstance(deprecated_envelopes, dict) and domain_id in deprecated_envelopes:
|
||||||
|
extensions["s3_roundtrip"] = migrate_deprecated_envelope(deprecated_envelopes[domain_id])
|
||||||
|
domains[domain_id] = {"domain_signal_envelope": {
|
||||||
|
"schema_version": "stage1_domain_signals.v2", "domain_id": domain_id,
|
||||||
|
"domain_registry_version": root.get("registry_version", "UNKNOWN"),
|
||||||
|
"registry_index_sha256": root.get("registry_index_sha256", "0" * 64),
|
||||||
|
"status": "READY_WITH_REVIEW" if review_items else ("READY" if root.get("bo_seed_candidates") else "NO_SUPPORT"),
|
||||||
|
"element_fact_candidates": element_rows, "opposing_fact_candidates": opposing_rows,
|
||||||
|
"defense_candidates": defense_rows, "evidence_slot_status": slot_rows,
|
||||||
|
"calculation_refs": sorted(set(calculation_refs)), "dependency_refs": sorted(dependencies),
|
||||||
|
"review_items": review_items, "extensions": extensions,
|
||||||
|
}}
|
||||||
|
return adapted
|
||||||
+117
@@ -0,0 +1,117 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Adapt S3 seed-v3 envelopes into deterministic signal candidates and domain envelopes."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from copy import deepcopy
|
||||||
|
import json
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
from adapters.s3_envelope_migration_adapter import migrate_deprecated_envelope
|
||||||
|
|
||||||
|
|
||||||
|
_SIGNALS_ROOT = Path(__file__).resolve().parents[1]
|
||||||
|
|
||||||
|
|
||||||
|
def _liability_fanout_domains() -> set[str]:
|
||||||
|
contract = json.loads((_SIGNALS_ROOT.parents[1] / "contracts" / "s5_execution_contract.v2.json").read_text(encoding="utf-8"))
|
||||||
|
return {item["domain_id"] for item in contract["sg08_liability_fanout_domains"]}
|
||||||
|
|
||||||
|
|
||||||
|
def _source_fields(refs: list[str], universe: dict[str, Any]) -> tuple[list[str], list[str]]:
|
||||||
|
evidence = set(universe.get("evidence_ids", []))
|
||||||
|
meeting = set(universe.get("meeting_clause_ids", []))
|
||||||
|
return sorted(set(refs) & evidence), sorted(set(refs) & meeting)
|
||||||
|
|
||||||
|
|
||||||
|
def _candidate(domain_id: str, seed_id: str, record_type: str, source_refs: list[str], details: dict[str, Any], universe: dict[str, Any], status: str = "inferred") -> dict[str, Any]:
|
||||||
|
evidence, meeting = _source_fields(source_refs, universe)
|
||||||
|
return {
|
||||||
|
"record_type": record_type, "status": status, "domain_ids": [domain_id], "source_bo_ids": [],
|
||||||
|
"source_fact_ids": [], "evidence_refs": evidence, "meeting_clause_refs": meeting,
|
||||||
|
"negative_or_conflicting_refs": sorted(set(details.get("negative_or_conflicting_refs", []))),
|
||||||
|
"law_version_refs": [], "confidence": "medium", "proof_grade": "client_statement" if meeting and not evidence else ("document_indirect" if evidence else "ungraded"),
|
||||||
|
"review_required": status in {"contested", "missing_required", "review"},
|
||||||
|
"details": {"source_seed_id": seed_id, **deepcopy(details)},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def adapt(inputs: dict[str, Any]) -> dict[str, Any]:
|
||||||
|
adapted = deepcopy(inputs)
|
||||||
|
candidates = adapted.setdefault("signal_candidates", {})
|
||||||
|
domains = adapted.setdefault("domain_signal_envelopes", {})
|
||||||
|
universe = adapted.get("source_universe", {})
|
||||||
|
raw_outputs = adapted.get("domain_seed_outputs", {})
|
||||||
|
deprecated_envelopes = adapted.get("deprecated_domain_signal_envelopes", {})
|
||||||
|
wrappers = list(raw_outputs.values()) if isinstance(raw_outputs, dict) else list(raw_outputs or [])
|
||||||
|
for wrapper in wrappers:
|
||||||
|
if not isinstance(wrapper, dict) or not isinstance(wrapper.get("stage_b_domain_bo_seed_output"), dict):
|
||||||
|
continue
|
||||||
|
root = wrapper["stage_b_domain_bo_seed_output"]
|
||||||
|
if root.get("schema_version") != "task_c_bo_stage_b_domain_bo_seed.v3":
|
||||||
|
raise ValueError("S3_SEED_SCHEMA_VERSION_MISMATCH")
|
||||||
|
domain_id = str(root.get("domain_id") or "")
|
||||||
|
element_rows: list[Any] = []
|
||||||
|
opposing_rows: list[Any] = []
|
||||||
|
defense_rows: list[Any] = []
|
||||||
|
slot_rows: list[Any] = []
|
||||||
|
calculation_refs: list[str] = []
|
||||||
|
dependencies: set[str] = set()
|
||||||
|
review_items: list[Any] = list(root.get("unknown_or_unrouted_reviews", []))
|
||||||
|
for seed in root.get("bo_seed_candidates", []):
|
||||||
|
if not isinstance(seed, dict):
|
||||||
|
continue
|
||||||
|
seed_id = str(seed.get("seed_id") or "unknown-seed")
|
||||||
|
seed_refs = [str(ref) for ref in seed.get("source_refs", [])]
|
||||||
|
for fact in seed.get("element_fact_candidates", []):
|
||||||
|
if isinstance(fact, dict):
|
||||||
|
refs = [str(fact.get("source_id"))] if fact.get("source_id") else seed_refs
|
||||||
|
candidates.setdefault("SG-05", []).append(_candidate(domain_id, seed_id, "domain_relation_atom", refs, fact, universe, str(fact.get("payload", {}).get("status") or "inferred")))
|
||||||
|
if domain_id in _liability_fanout_domains():
|
||||||
|
candidates.setdefault("SG-08", []).append(_candidate(domain_id, seed_id, "liability_element", refs, fact, universe, str(fact.get("payload", {}).get("status") or "inferred")))
|
||||||
|
element_rows.append(deepcopy(fact))
|
||||||
|
for fact in seed.get("opposing_fact_candidates", []):
|
||||||
|
if isinstance(fact, dict):
|
||||||
|
opposing_rows.append(deepcopy(fact))
|
||||||
|
for defense in seed.get("defense_candidates", []):
|
||||||
|
if isinstance(defense, dict):
|
||||||
|
refs = [str(ref) for ref in defense.get("source_refs", seed_refs)]
|
||||||
|
candidates.setdefault("SG-09", []).append(_candidate(domain_id, seed_id, "defense_trigger", refs, defense, universe, str(defense.get("status") or "inferred")))
|
||||||
|
defense_rows.append(deepcopy(defense))
|
||||||
|
for request in seed.get("calculation_requests", []):
|
||||||
|
if isinstance(request, dict):
|
||||||
|
adapted.setdefault("calculation_requests", []).append(deepcopy(request))
|
||||||
|
if request.get("request_id"):
|
||||||
|
calculation_refs.append(str(request["request_id"]))
|
||||||
|
for effect in seed.get("legal_effect_candidates", []):
|
||||||
|
if isinstance(effect, dict):
|
||||||
|
refs = [str(ref) for ref in effect.get("source_refs", seed_refs)]
|
||||||
|
status = "review" if effect.get("registered") is False else "inferred"
|
||||||
|
candidates.setdefault("SG-13", []).append(_candidate(domain_id, seed_id, "legal_effect_route", refs, effect, universe, status))
|
||||||
|
for slot in seed.get("evidence_slot_status", []):
|
||||||
|
if not isinstance(slot, dict):
|
||||||
|
continue
|
||||||
|
refs = [str(ref) for ref in slot.get("source_refs", [])]
|
||||||
|
evidence, meeting = _source_fields(refs, universe)
|
||||||
|
slot_rows.append({
|
||||||
|
"slot_id": str(slot.get("slot_id") or "unknown_slot"), "status": slot.get("status", "missing"),
|
||||||
|
"source_fact_ids": [], "evidence_refs": evidence, "meeting_clause_refs": meeting,
|
||||||
|
"negative_or_conflicting_refs": [], "review_code": slot.get("review_code"),
|
||||||
|
})
|
||||||
|
dependencies.update(str(value) for value in seed.get("dependency_refs", []))
|
||||||
|
review_items.extend(deepcopy(seed.get("review_items", [])))
|
||||||
|
extensions: dict[str, Any] = {}
|
||||||
|
if isinstance(deprecated_envelopes, dict) and domain_id in deprecated_envelopes:
|
||||||
|
extensions["s3_roundtrip"] = migrate_deprecated_envelope(deprecated_envelopes[domain_id])
|
||||||
|
domains[domain_id] = {"domain_signal_envelope": {
|
||||||
|
"schema_version": "stage1_domain_signals.v2", "domain_id": domain_id,
|
||||||
|
"domain_registry_version": root.get("registry_version", "UNKNOWN"),
|
||||||
|
"registry_index_sha256": root.get("registry_index_sha256", "0" * 64),
|
||||||
|
"status": "READY_WITH_REVIEW" if review_items else ("READY" if root.get("bo_seed_candidates") else "NO_SUPPORT"),
|
||||||
|
"element_fact_candidates": element_rows, "opposing_fact_candidates": opposing_rows,
|
||||||
|
"defense_candidates": defense_rows, "evidence_slot_status": slot_rows,
|
||||||
|
"calculation_refs": sorted(set(calculation_refs)), "dependency_refs": sorted(dependencies),
|
||||||
|
"review_items": review_items, "extensions": extensions,
|
||||||
|
}}
|
||||||
|
return adapted
|
||||||
+32
@@ -0,0 +1,32 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Lossless S3 deprecated-envelope migration and reverse materialization."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from copy import deepcopy
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
|
||||||
|
ROUNDTRIP_FIELDS = (
|
||||||
|
"records",
|
||||||
|
"unknown_or_unrouted_reviews",
|
||||||
|
"contract_guards",
|
||||||
|
"registry_version",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def migrate_deprecated_envelope(source: dict[str, Any]) -> dict[str, Any]:
|
||||||
|
if not isinstance(source, dict):
|
||||||
|
raise ValueError("S3_ENVELOPE_OBJECT_REQUIRED")
|
||||||
|
missing = [field for field in ROUNDTRIP_FIELDS if field not in source]
|
||||||
|
if missing:
|
||||||
|
raise ValueError("S3_ENVELOPE_FIELD_MISSING:" + ",".join(missing))
|
||||||
|
return {field: deepcopy(source[field]) for field in ROUNDTRIP_FIELDS}
|
||||||
|
|
||||||
|
|
||||||
|
def reverse_migrated_envelope(canonical: dict[str, Any]) -> dict[str, Any]:
|
||||||
|
root = canonical.get("domain_signal_envelope", canonical)
|
||||||
|
extension = root.get("extensions", {}).get("s3_roundtrip")
|
||||||
|
if not isinstance(extension, dict):
|
||||||
|
raise ValueError("S3_ROUNDTRIP_EXTENSION_REQUIRED")
|
||||||
|
return migrate_deprecated_envelope(extension)
|
||||||
+32
@@ -0,0 +1,32 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Lossless S3 deprecated-envelope migration and reverse materialization."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from copy import deepcopy
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
|
||||||
|
ROUNDTRIP_FIELDS = (
|
||||||
|
"records",
|
||||||
|
"unknown_or_unrouted_reviews",
|
||||||
|
"contract_guards",
|
||||||
|
"registry_version",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def migrate_deprecated_envelope(source: dict[str, Any]) -> dict[str, Any]:
|
||||||
|
if not isinstance(source, dict):
|
||||||
|
raise ValueError("S3_ENVELOPE_OBJECT_REQUIRED")
|
||||||
|
missing = [field for field in ROUNDTRIP_FIELDS if field not in source]
|
||||||
|
if missing:
|
||||||
|
raise ValueError("S3_ENVELOPE_FIELD_MISSING:" + ",".join(missing))
|
||||||
|
return {field: deepcopy(source[field]) for field in ROUNDTRIP_FIELDS}
|
||||||
|
|
||||||
|
|
||||||
|
def reverse_migrated_envelope(canonical: dict[str, Any]) -> dict[str, Any]:
|
||||||
|
root = canonical.get("domain_signal_envelope", canonical)
|
||||||
|
extension = root.get("extensions", {}).get("s3_roundtrip")
|
||||||
|
if not isinstance(extension, dict):
|
||||||
|
raise ValueError("S3_ROUNDTRIP_EXTENSION_REQUIRED")
|
||||||
|
return migrate_deprecated_envelope(extension)
|
||||||
+28
@@ -0,0 +1,28 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Read-only adapter for S4 calculation request/result envelopes."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from copy import deepcopy
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
|
||||||
|
def calculation_requests(inputs: dict[str, Any]) -> list[dict[str, Any]]:
|
||||||
|
direct = inputs.get("calculation_requests", [])
|
||||||
|
out = [deepcopy(item) for item in direct if isinstance(item, dict)]
|
||||||
|
bundle = inputs.get("s4_calculation_bundle", {})
|
||||||
|
if isinstance(bundle, dict):
|
||||||
|
for key in ("calculation_requests", "results"):
|
||||||
|
for item in bundle.get(key, []):
|
||||||
|
if not isinstance(item, dict):
|
||||||
|
continue
|
||||||
|
normalized = deepcopy(item)
|
||||||
|
normalized.setdefault("request_id", item.get("result_id") or item.get("calculation_request_id"))
|
||||||
|
normalized.setdefault("calculation_id", item.get("calculator_id") or item.get("calculation_domain"))
|
||||||
|
normalized.setdefault("operand_state", item.get("state") or item.get("status"))
|
||||||
|
out.append(normalized)
|
||||||
|
deduped: dict[str, dict[str, Any]] = {}
|
||||||
|
for index, item in enumerate(out):
|
||||||
|
key = str(item.get("request_id") or f"anonymous-{index:04d}")
|
||||||
|
deduped[key] = item
|
||||||
|
return [deduped[key] for key in sorted(deduped)]
|
||||||
+28
@@ -0,0 +1,28 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Read-only adapter for S4 calculation request/result envelopes."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from copy import deepcopy
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
|
||||||
|
def calculation_requests(inputs: dict[str, Any]) -> list[dict[str, Any]]:
|
||||||
|
direct = inputs.get("calculation_requests", [])
|
||||||
|
out = [deepcopy(item) for item in direct if isinstance(item, dict)]
|
||||||
|
bundle = inputs.get("s4_calculation_bundle", {})
|
||||||
|
if isinstance(bundle, dict):
|
||||||
|
for key in ("calculation_requests", "results"):
|
||||||
|
for item in bundle.get(key, []):
|
||||||
|
if not isinstance(item, dict):
|
||||||
|
continue
|
||||||
|
normalized = deepcopy(item)
|
||||||
|
normalized.setdefault("request_id", item.get("result_id") or item.get("calculation_request_id"))
|
||||||
|
normalized.setdefault("calculation_id", item.get("calculator_id") or item.get("calculation_domain"))
|
||||||
|
normalized.setdefault("operand_state", item.get("state") or item.get("status"))
|
||||||
|
out.append(normalized)
|
||||||
|
deduped: dict[str, dict[str, Any]] = {}
|
||||||
|
for index, item in enumerate(out):
|
||||||
|
key = str(item.get("request_id") or f"anonymous-{index:04d}")
|
||||||
|
deduped[key] = item
|
||||||
|
return [deduped[key] for key in sorted(deduped)]
|
||||||
+83
@@ -0,0 +1,83 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""SG-01 adapter/validator. It never generates activation decisions."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from copy import deepcopy
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
|
||||||
|
FAIL_OPEN_POLICY = {
|
||||||
|
"candidate_downgrade_forbidden": True,
|
||||||
|
"negative_cue_blocks_activation": False,
|
||||||
|
"silent_fallback_forbidden": True,
|
||||||
|
"unrouted_to_residual_collector": True,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def adapt_and_validate(inputs: dict[str, Any]) -> dict[str, Any]:
|
||||||
|
raw = inputs.get("domain_activation_manifest") or inputs.get("part1_activation_gate_output")
|
||||||
|
if not isinstance(raw, dict):
|
||||||
|
raise ValueError("SG01_INPUT_REQUIRED: Part 1 activation gate output is required")
|
||||||
|
wrapped = deepcopy(raw)
|
||||||
|
manifest = wrapped.get("domain_activation_manifest")
|
||||||
|
if not isinstance(manifest, dict):
|
||||||
|
raise ValueError("SG01_WRAPPER_REQUIRED")
|
||||||
|
required = {
|
||||||
|
"schema_version",
|
||||||
|
"signal_id",
|
||||||
|
"status",
|
||||||
|
"registry_version",
|
||||||
|
"domain_entries",
|
||||||
|
"active_domain_ids",
|
||||||
|
"supporting_domain_ids",
|
||||||
|
"monitor_domain_ids",
|
||||||
|
"required_calculation_domains",
|
||||||
|
"unrouted_material",
|
||||||
|
"conservation_gate",
|
||||||
|
"fail_open_policy",
|
||||||
|
"review_items",
|
||||||
|
"contract_guards",
|
||||||
|
}
|
||||||
|
missing = sorted(required - set(manifest))
|
||||||
|
if missing:
|
||||||
|
raise ValueError(f"SG01_REQUIRED_FIELDS_MISSING:{','.join(missing)}")
|
||||||
|
if manifest.get("signal_id") != "SG-01":
|
||||||
|
raise ValueError("SG01_SIGNAL_ID_MISMATCH")
|
||||||
|
if manifest.get("schema_version") != "stage1_domain_activation_manifest.v1":
|
||||||
|
raise ValueError("SG01_SCHEMA_VERSION_MISMATCH")
|
||||||
|
gate = manifest.get("conservation_gate", {})
|
||||||
|
if gate.get("conservation_pass") is not True:
|
||||||
|
raise ValueError("SG01_CONSERVATION_GATE_FAILED")
|
||||||
|
if gate.get("candidate_count") != gate.get("classified_count") + gate.get("unrouted_count"):
|
||||||
|
raise ValueError("SG01_CONSERVATION_ARITHMETIC_MISMATCH")
|
||||||
|
policy = manifest.get("fail_open_policy")
|
||||||
|
if not isinstance(policy, dict) or set(policy) != set(FAIL_OPEN_POLICY):
|
||||||
|
raise ValueError("FAIL_OPEN_POLICY_KEYSET_MISMATCH")
|
||||||
|
if any(type(policy[key]) is not bool or policy[key] is not expected for key, expected in FAIL_OPEN_POLICY.items()):
|
||||||
|
raise ValueError("FAIL_OPEN_POLICY_VALUE_MISMATCH")
|
||||||
|
# D-3 확정(S1-D-3_S2-D-6_decision.md §1.2): execution_eligible 이 유일한 결정 필드다.
|
||||||
|
# activation_status 는 서술 라벨이며 실행 판정에 쓰지 않는다.
|
||||||
|
active = sorted(set(manifest.get("active_domain_ids", [])))
|
||||||
|
eligible = sorted(
|
||||||
|
{
|
||||||
|
entry.get("domain_id")
|
||||||
|
for entry in manifest.get("domain_entries", [])
|
||||||
|
if entry.get("execution_eligible") is True
|
||||||
|
}
|
||||||
|
)
|
||||||
|
# expected_runnable_domain_ids 는 스키마 필수 필드다. 부재는 폴백이 아니라 실패가 맞다.
|
||||||
|
expected = sorted(set(manifest.get("expected_runnable_domain_ids", [])))
|
||||||
|
if eligible != expected:
|
||||||
|
raise ValueError("SG01_EXPECTED_RUNNABLE_SET_MISMATCH")
|
||||||
|
# active == eligible 등식을 active ⊆ eligible 포함 관계로 약화한다.
|
||||||
|
# 활성인데 실행 대상이 아닌 것은 금지하되, 실행 대상인데 active 라벨이 아닌 것
|
||||||
|
# (X1~X3 의 residual, active_with_review)은 허용한다.
|
||||||
|
if not set(active) <= set(eligible):
|
||||||
|
raise ValueError("SG01_ACTIVE_NOT_ELIGIBLE")
|
||||||
|
guards = manifest.get("contract_guards", {})
|
||||||
|
if guards.get("source_membership_required") is not True:
|
||||||
|
raise ValueError("SG01_SOURCE_MEMBERSHIP_GUARD_REQUIRED")
|
||||||
|
if guards.get("meeting_only_evidence_promotion_forbidden") is not True:
|
||||||
|
raise ValueError("SG01_MEETING_PROMOTION_GUARD_REQUIRED")
|
||||||
|
return wrapped
|
||||||
+83
@@ -0,0 +1,83 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""SG-01 adapter/validator. It never generates activation decisions."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from copy import deepcopy
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
|
||||||
|
FAIL_OPEN_POLICY = {
|
||||||
|
"candidate_downgrade_forbidden": True,
|
||||||
|
"negative_cue_blocks_activation": False,
|
||||||
|
"silent_fallback_forbidden": True,
|
||||||
|
"unrouted_to_residual_collector": True,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def adapt_and_validate(inputs: dict[str, Any]) -> dict[str, Any]:
|
||||||
|
raw = inputs.get("domain_activation_manifest") or inputs.get("part1_activation_gate_output")
|
||||||
|
if not isinstance(raw, dict):
|
||||||
|
raise ValueError("SG01_INPUT_REQUIRED: Part 1 activation gate output is required")
|
||||||
|
wrapped = deepcopy(raw)
|
||||||
|
manifest = wrapped.get("domain_activation_manifest")
|
||||||
|
if not isinstance(manifest, dict):
|
||||||
|
raise ValueError("SG01_WRAPPER_REQUIRED")
|
||||||
|
required = {
|
||||||
|
"schema_version",
|
||||||
|
"signal_id",
|
||||||
|
"status",
|
||||||
|
"registry_version",
|
||||||
|
"domain_entries",
|
||||||
|
"active_domain_ids",
|
||||||
|
"supporting_domain_ids",
|
||||||
|
"monitor_domain_ids",
|
||||||
|
"required_calculation_domains",
|
||||||
|
"unrouted_material",
|
||||||
|
"conservation_gate",
|
||||||
|
"fail_open_policy",
|
||||||
|
"review_items",
|
||||||
|
"contract_guards",
|
||||||
|
}
|
||||||
|
missing = sorted(required - set(manifest))
|
||||||
|
if missing:
|
||||||
|
raise ValueError(f"SG01_REQUIRED_FIELDS_MISSING:{','.join(missing)}")
|
||||||
|
if manifest.get("signal_id") != "SG-01":
|
||||||
|
raise ValueError("SG01_SIGNAL_ID_MISMATCH")
|
||||||
|
if manifest.get("schema_version") != "stage1_domain_activation_manifest.v1":
|
||||||
|
raise ValueError("SG01_SCHEMA_VERSION_MISMATCH")
|
||||||
|
gate = manifest.get("conservation_gate", {})
|
||||||
|
if gate.get("conservation_pass") is not True:
|
||||||
|
raise ValueError("SG01_CONSERVATION_GATE_FAILED")
|
||||||
|
if gate.get("candidate_count") != gate.get("classified_count") + gate.get("unrouted_count"):
|
||||||
|
raise ValueError("SG01_CONSERVATION_ARITHMETIC_MISMATCH")
|
||||||
|
policy = manifest.get("fail_open_policy")
|
||||||
|
if not isinstance(policy, dict) or set(policy) != set(FAIL_OPEN_POLICY):
|
||||||
|
raise ValueError("FAIL_OPEN_POLICY_KEYSET_MISMATCH")
|
||||||
|
if any(type(policy[key]) is not bool or policy[key] is not expected for key, expected in FAIL_OPEN_POLICY.items()):
|
||||||
|
raise ValueError("FAIL_OPEN_POLICY_VALUE_MISMATCH")
|
||||||
|
# D-3 확정(S1-D-3_S2-D-6_decision.md §1.2): execution_eligible 이 유일한 결정 필드다.
|
||||||
|
# activation_status 는 서술 라벨이며 실행 판정에 쓰지 않는다.
|
||||||
|
active = sorted(set(manifest.get("active_domain_ids", [])))
|
||||||
|
eligible = sorted(
|
||||||
|
{
|
||||||
|
entry.get("domain_id")
|
||||||
|
for entry in manifest.get("domain_entries", [])
|
||||||
|
if entry.get("execution_eligible") is True
|
||||||
|
}
|
||||||
|
)
|
||||||
|
# expected_runnable_domain_ids 는 스키마 필수 필드다. 부재는 폴백이 아니라 실패가 맞다.
|
||||||
|
expected = sorted(set(manifest.get("expected_runnable_domain_ids", [])))
|
||||||
|
if eligible != expected:
|
||||||
|
raise ValueError("SG01_EXPECTED_RUNNABLE_SET_MISMATCH")
|
||||||
|
# active == eligible 등식을 active ⊆ eligible 포함 관계로 약화한다.
|
||||||
|
# 활성인데 실행 대상이 아닌 것은 금지하되, 실행 대상인데 active 라벨이 아닌 것
|
||||||
|
# (X1~X3 의 residual, active_with_review)은 허용한다.
|
||||||
|
if not set(active) <= set(eligible):
|
||||||
|
raise ValueError("SG01_ACTIVE_NOT_ELIGIBLE")
|
||||||
|
guards = manifest.get("contract_guards", {})
|
||||||
|
if guards.get("source_membership_required") is not True:
|
||||||
|
raise ValueError("SG01_SOURCE_MEMBERSHIP_GUARD_REQUIRED")
|
||||||
|
if guards.get("meeting_only_evidence_promotion_forbidden") is not True:
|
||||||
|
raise ValueError("SG01_MEETING_PROMOTION_GUARD_REQUIRED")
|
||||||
|
return wrapped
|
||||||
+121
@@ -0,0 +1,121 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Pure, deterministic helpers shared by Stage 1 signal emitters."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import hashlib
|
||||||
|
import json
|
||||||
|
from copy import deepcopy
|
||||||
|
from typing import Any, Iterable
|
||||||
|
|
||||||
|
|
||||||
|
ITEM_STATUS = {"observed", "inferred", "contested", "missing_required", "review"}
|
||||||
|
PROOF_GRADES = {
|
||||||
|
"document_direct",
|
||||||
|
"document_indirect",
|
||||||
|
"corroborated",
|
||||||
|
"client_statement",
|
||||||
|
"ungraded",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def stable_json(value: Any) -> str:
|
||||||
|
return json.dumps(value, ensure_ascii=False, sort_keys=True, separators=(",", ":"))
|
||||||
|
|
||||||
|
|
||||||
|
def unique_strings(values: Iterable[Any] | None) -> list[str]:
|
||||||
|
out: list[str] = []
|
||||||
|
for value in values or []:
|
||||||
|
text = str(value).strip()
|
||||||
|
if text and text not in out:
|
||||||
|
out.append(text)
|
||||||
|
return sorted(out)
|
||||||
|
|
||||||
|
|
||||||
|
def stable_id(prefix: str, value: Any) -> str:
|
||||||
|
digest = hashlib.sha256(stable_json(value).encode("utf-8")).hexdigest()[:16]
|
||||||
|
return f"{prefix.lower().replace('-', '')}-{digest}"
|
||||||
|
|
||||||
|
|
||||||
|
def normalize_item(signal_code: str, raw: dict[str, Any], index: int) -> dict[str, Any]:
|
||||||
|
"""Normalize a candidate without inventing evidence or deleting conflicts."""
|
||||||
|
candidate = deepcopy(raw)
|
||||||
|
evidence_refs = unique_strings(candidate.get("evidence_refs"))
|
||||||
|
meeting_refs = unique_strings(candidate.get("meeting_clause_refs"))
|
||||||
|
proof_grade = str(candidate.get("proof_grade") or "ungraded")
|
||||||
|
if meeting_refs and not evidence_refs:
|
||||||
|
proof_grade = "client_statement"
|
||||||
|
if proof_grade not in PROOF_GRADES:
|
||||||
|
proof_grade = "ungraded"
|
||||||
|
status = str(candidate.get("status") or "inferred")
|
||||||
|
if status not in ITEM_STATUS:
|
||||||
|
status = "review"
|
||||||
|
negative_refs = unique_strings(candidate.get("negative_or_conflicting_refs"))
|
||||||
|
review_required = bool(candidate.get("review_required")) or status in {
|
||||||
|
"contested",
|
||||||
|
"missing_required",
|
||||||
|
"review",
|
||||||
|
} or bool(negative_refs)
|
||||||
|
details = candidate.get("details")
|
||||||
|
if not isinstance(details, dict):
|
||||||
|
excluded = {
|
||||||
|
"signal_id",
|
||||||
|
"record_type",
|
||||||
|
"status",
|
||||||
|
"issue_cluster_ids",
|
||||||
|
"domain_ids",
|
||||||
|
"source_bo_ids",
|
||||||
|
"source_fact_ids",
|
||||||
|
"evidence_refs",
|
||||||
|
"meeting_clause_refs",
|
||||||
|
"negative_or_conflicting_refs",
|
||||||
|
"law_version_refs",
|
||||||
|
"confidence",
|
||||||
|
"proof_grade",
|
||||||
|
"review_required",
|
||||||
|
}
|
||||||
|
details = {key: deepcopy(value) for key, value in candidate.items() if key not in excluded}
|
||||||
|
basis = {"signal_code": signal_code, "index": index, "candidate": candidate}
|
||||||
|
return {
|
||||||
|
"signal_id": str(candidate.get("signal_id") or stable_id(signal_code, basis)),
|
||||||
|
"record_type": str(candidate.get("record_type") or "generic_candidate"),
|
||||||
|
"status": status,
|
||||||
|
"issue_cluster_ids": unique_strings(candidate.get("issue_cluster_ids")),
|
||||||
|
"domain_ids": unique_strings(candidate.get("domain_ids")),
|
||||||
|
"source_bo_ids": unique_strings(candidate.get("source_bo_ids")),
|
||||||
|
"source_fact_ids": unique_strings(candidate.get("source_fact_ids")),
|
||||||
|
"evidence_refs": evidence_refs,
|
||||||
|
"meeting_clause_refs": meeting_refs,
|
||||||
|
"negative_or_conflicting_refs": negative_refs,
|
||||||
|
"law_version_refs": unique_strings(candidate.get("law_version_refs")),
|
||||||
|
"confidence": str(candidate.get("confidence") or "low"),
|
||||||
|
"proof_grade": proof_grade,
|
||||||
|
"review_required": review_required,
|
||||||
|
"details": details,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def envelope(signal_code: str, candidates: list[dict[str, Any]]) -> dict[str, Any]:
|
||||||
|
records = [normalize_item(signal_code, item, idx) for idx, item in enumerate(candidates)]
|
||||||
|
records.sort(key=lambda item: (item["record_type"], item["signal_id"]))
|
||||||
|
statuses = {item["status"] for item in records}
|
||||||
|
if not records:
|
||||||
|
status = "EMPTY"
|
||||||
|
elif "missing_required" in statuses:
|
||||||
|
status = "BLOCKED"
|
||||||
|
elif statuses.intersection({"contested", "review"}) or any(item["review_required"] for item in records):
|
||||||
|
status = "READY_WITH_REVIEW"
|
||||||
|
else:
|
||||||
|
status = "READY"
|
||||||
|
number = signal_code.split("-")[1]
|
||||||
|
return {
|
||||||
|
"schema_version": f"stage1_signal_sg{number}.v1",
|
||||||
|
"signal_id": signal_code,
|
||||||
|
"status": status,
|
||||||
|
"records": records,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def candidate_list(inputs: dict[str, Any], signal_code: str) -> list[dict[str, Any]]:
|
||||||
|
source = inputs.get("signal_candidates", {}).get(signal_code, [])
|
||||||
|
return [deepcopy(item) for item in source if isinstance(item, dict)]
|
||||||
+121
@@ -0,0 +1,121 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Pure, deterministic helpers shared by Stage 1 signal emitters."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import hashlib
|
||||||
|
import json
|
||||||
|
from copy import deepcopy
|
||||||
|
from typing import Any, Iterable
|
||||||
|
|
||||||
|
|
||||||
|
ITEM_STATUS = {"observed", "inferred", "contested", "missing_required", "review"}
|
||||||
|
PROOF_GRADES = {
|
||||||
|
"document_direct",
|
||||||
|
"document_indirect",
|
||||||
|
"corroborated",
|
||||||
|
"client_statement",
|
||||||
|
"ungraded",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def stable_json(value: Any) -> str:
|
||||||
|
return json.dumps(value, ensure_ascii=False, sort_keys=True, separators=(",", ":"))
|
||||||
|
|
||||||
|
|
||||||
|
def unique_strings(values: Iterable[Any] | None) -> list[str]:
|
||||||
|
out: list[str] = []
|
||||||
|
for value in values or []:
|
||||||
|
text = str(value).strip()
|
||||||
|
if text and text not in out:
|
||||||
|
out.append(text)
|
||||||
|
return sorted(out)
|
||||||
|
|
||||||
|
|
||||||
|
def stable_id(prefix: str, value: Any) -> str:
|
||||||
|
digest = hashlib.sha256(stable_json(value).encode("utf-8")).hexdigest()[:16]
|
||||||
|
return f"{prefix.lower().replace('-', '')}-{digest}"
|
||||||
|
|
||||||
|
|
||||||
|
def normalize_item(signal_code: str, raw: dict[str, Any], index: int) -> dict[str, Any]:
|
||||||
|
"""Normalize a candidate without inventing evidence or deleting conflicts."""
|
||||||
|
candidate = deepcopy(raw)
|
||||||
|
evidence_refs = unique_strings(candidate.get("evidence_refs"))
|
||||||
|
meeting_refs = unique_strings(candidate.get("meeting_clause_refs"))
|
||||||
|
proof_grade = str(candidate.get("proof_grade") or "ungraded")
|
||||||
|
if meeting_refs and not evidence_refs:
|
||||||
|
proof_grade = "client_statement"
|
||||||
|
if proof_grade not in PROOF_GRADES:
|
||||||
|
proof_grade = "ungraded"
|
||||||
|
status = str(candidate.get("status") or "inferred")
|
||||||
|
if status not in ITEM_STATUS:
|
||||||
|
status = "review"
|
||||||
|
negative_refs = unique_strings(candidate.get("negative_or_conflicting_refs"))
|
||||||
|
review_required = bool(candidate.get("review_required")) or status in {
|
||||||
|
"contested",
|
||||||
|
"missing_required",
|
||||||
|
"review",
|
||||||
|
} or bool(negative_refs)
|
||||||
|
details = candidate.get("details")
|
||||||
|
if not isinstance(details, dict):
|
||||||
|
excluded = {
|
||||||
|
"signal_id",
|
||||||
|
"record_type",
|
||||||
|
"status",
|
||||||
|
"issue_cluster_ids",
|
||||||
|
"domain_ids",
|
||||||
|
"source_bo_ids",
|
||||||
|
"source_fact_ids",
|
||||||
|
"evidence_refs",
|
||||||
|
"meeting_clause_refs",
|
||||||
|
"negative_or_conflicting_refs",
|
||||||
|
"law_version_refs",
|
||||||
|
"confidence",
|
||||||
|
"proof_grade",
|
||||||
|
"review_required",
|
||||||
|
}
|
||||||
|
details = {key: deepcopy(value) for key, value in candidate.items() if key not in excluded}
|
||||||
|
basis = {"signal_code": signal_code, "index": index, "candidate": candidate}
|
||||||
|
return {
|
||||||
|
"signal_id": str(candidate.get("signal_id") or stable_id(signal_code, basis)),
|
||||||
|
"record_type": str(candidate.get("record_type") or "generic_candidate"),
|
||||||
|
"status": status,
|
||||||
|
"issue_cluster_ids": unique_strings(candidate.get("issue_cluster_ids")),
|
||||||
|
"domain_ids": unique_strings(candidate.get("domain_ids")),
|
||||||
|
"source_bo_ids": unique_strings(candidate.get("source_bo_ids")),
|
||||||
|
"source_fact_ids": unique_strings(candidate.get("source_fact_ids")),
|
||||||
|
"evidence_refs": evidence_refs,
|
||||||
|
"meeting_clause_refs": meeting_refs,
|
||||||
|
"negative_or_conflicting_refs": negative_refs,
|
||||||
|
"law_version_refs": unique_strings(candidate.get("law_version_refs")),
|
||||||
|
"confidence": str(candidate.get("confidence") or "low"),
|
||||||
|
"proof_grade": proof_grade,
|
||||||
|
"review_required": review_required,
|
||||||
|
"details": details,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def envelope(signal_code: str, candidates: list[dict[str, Any]]) -> dict[str, Any]:
|
||||||
|
records = [normalize_item(signal_code, item, idx) for idx, item in enumerate(candidates)]
|
||||||
|
records.sort(key=lambda item: (item["record_type"], item["signal_id"]))
|
||||||
|
statuses = {item["status"] for item in records}
|
||||||
|
if not records:
|
||||||
|
status = "EMPTY"
|
||||||
|
elif "missing_required" in statuses:
|
||||||
|
status = "BLOCKED"
|
||||||
|
elif statuses.intersection({"contested", "review"}) or any(item["review_required"] for item in records):
|
||||||
|
status = "READY_WITH_REVIEW"
|
||||||
|
else:
|
||||||
|
status = "READY"
|
||||||
|
number = signal_code.split("-")[1]
|
||||||
|
return {
|
||||||
|
"schema_version": f"stage1_signal_sg{number}.v1",
|
||||||
|
"signal_id": signal_code,
|
||||||
|
"status": status,
|
||||||
|
"records": records,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def candidate_list(inputs: dict[str, Any], signal_code: str) -> list[dict[str, Any]]:
|
||||||
|
source = inputs.get("signal_candidates", {}).get(signal_code, [])
|
||||||
|
return [deepcopy(item) for item in source if isinstance(item, dict)]
|
||||||
+113
@@ -0,0 +1,113 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Deterministic read-only compatibility projections from canonical signals."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from copy import deepcopy
|
||||||
|
import json
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
|
||||||
|
_COMPATIBILITY_KEY_PATTERN = r"legacy-liability-[0-9]{4}"
|
||||||
|
|
||||||
|
|
||||||
|
def _assert_unique_orders(orders: list[int]) -> None:
|
||||||
|
if len(orders) != len(set(orders)):
|
||||||
|
raise ValueError("COMPATIBILITY_DUPLICATE_ORDER")
|
||||||
|
|
||||||
|
|
||||||
|
_SIGNALS_ROOT = Path(__file__).resolve().parents[1]
|
||||||
|
|
||||||
|
|
||||||
|
def _actio_extensions() -> list[tuple[str, str]]:
|
||||||
|
contract = json.loads((_SIGNALS_ROOT.parents[1] / "contracts" / "s5_execution_contract.v2.json").read_text(encoding="utf-8"))
|
||||||
|
return [(item["domain_id"], item["extension_key"]) for item in contract["e13_extension_domains"]]
|
||||||
|
|
||||||
|
|
||||||
|
def project_actio(domain_signals: dict[str, dict[str, Any]]) -> dict[str, Any]:
|
||||||
|
extension: dict[str, Any] = {}
|
||||||
|
for domain_id, extension_key in _actio_extensions():
|
||||||
|
envelope = domain_signals.get(domain_id, {}).get("domain_signal_envelope", {})
|
||||||
|
candidate = envelope.get("extensions", {}).get(extension_key, {})
|
||||||
|
if candidate:
|
||||||
|
extension = candidate
|
||||||
|
break
|
||||||
|
records = deepcopy(extension.get("records", []))
|
||||||
|
status = str(extension.get("legacy_status") or ("EMPTY" if not records else "READY"))
|
||||||
|
return {"schema_version": "actio_case_signals.v1", "status": status, "actio_case_signals": records}
|
||||||
|
|
||||||
|
|
||||||
|
def project_case_liability(sg05: dict[str, Any], sg08: dict[str, Any]) -> dict[str, Any]:
|
||||||
|
relation: dict[str, dict[str, Any]] = {}
|
||||||
|
liability: dict[str, dict[str, Any]] = {}
|
||||||
|
statuses: set[str] = set()
|
||||||
|
order05: list[int] = []
|
||||||
|
order08: list[int] = []
|
||||||
|
for item in sg05.get("records", []):
|
||||||
|
details = item.get("details", {})
|
||||||
|
key = details.get("compatibility_key")
|
||||||
|
if key and "relation_component" in details:
|
||||||
|
if __import__("re").fullmatch(_COMPATIBILITY_KEY_PATTERN, str(key)) is None:
|
||||||
|
raise ValueError("COMPATIBILITY_KEY_PATTERN_INVALID")
|
||||||
|
order05.append(int(details["compatibility_order"]))
|
||||||
|
relation[str(key)] = details
|
||||||
|
statuses.add(str(item.get("status")))
|
||||||
|
for item in sg08.get("records", []):
|
||||||
|
details = item.get("details", {})
|
||||||
|
key = details.get("compatibility_key")
|
||||||
|
if key and "liability_component" in details:
|
||||||
|
if __import__("re").fullmatch(_COMPATIBILITY_KEY_PATTERN, str(key)) is None:
|
||||||
|
raise ValueError("COMPATIBILITY_KEY_PATTERN_INVALID")
|
||||||
|
order08.append(int(details["compatibility_order"]))
|
||||||
|
liability[str(key)] = details
|
||||||
|
statuses.add(str(item.get("status")))
|
||||||
|
_assert_unique_orders(order05)
|
||||||
|
_assert_unique_orders(order08)
|
||||||
|
if set(relation) != set(liability):
|
||||||
|
raise ValueError("COMPATIBILITY_LIABILITY_COMPONENT_MISMATCH")
|
||||||
|
rows: list[tuple[int, dict[str, Any]]] = []
|
||||||
|
for key in relation:
|
||||||
|
rel = relation[key]
|
||||||
|
lia = liability[key]
|
||||||
|
order = int(rel["compatibility_order"])
|
||||||
|
if order != int(lia["compatibility_order"]):
|
||||||
|
raise ValueError("COMPATIBILITY_ORDER_MISMATCH")
|
||||||
|
rc = rel["relation_component"]
|
||||||
|
lc = lia["liability_component"]
|
||||||
|
rows.append((order, {
|
||||||
|
"liability_candidate_type": deepcopy(lc.get("liability_candidate_type")),
|
||||||
|
"related_bo_ids": deepcopy(rc.get("related_bo_ids", [])),
|
||||||
|
"related_evidence_indexes": deepcopy(lc.get("related_evidence_indexes", [])),
|
||||||
|
"party_roles": deepcopy(rc.get("party_roles", [])),
|
||||||
|
"claim_group_id": deepcopy(rc.get("claim_group_id")),
|
||||||
|
"liability_group_id": deepcopy(lc.get("liability_group_id")),
|
||||||
|
"linked_structure_ids": deepcopy(rc.get("linked_structure_ids", [])),
|
||||||
|
}))
|
||||||
|
records = [row for _, row in sorted(rows, key=lambda value: value[0])]
|
||||||
|
if not records:
|
||||||
|
status = "EMPTY"
|
||||||
|
elif statuses.intersection({"review", "contested", "missing_required"}):
|
||||||
|
status = "READY_WITH_REVIEW"
|
||||||
|
else:
|
||||||
|
status = "READY"
|
||||||
|
return {"schema_version": "case_liability_signals.v1", "status": status, "case_liability_signals": records}
|
||||||
|
|
||||||
|
|
||||||
|
def project_legal_effect(sg13: dict[str, Any]) -> dict[str, Any]:
|
||||||
|
rows: list[tuple[int, dict[str, Any]]] = []
|
||||||
|
statuses: set[str] = set()
|
||||||
|
for item in sg13.get("records", []):
|
||||||
|
details = item.get("details", {})
|
||||||
|
if "compatibility_route" in details:
|
||||||
|
rows.append((int(details["compatibility_order"]), deepcopy(details["compatibility_route"])))
|
||||||
|
statuses.add(str(item.get("status")))
|
||||||
|
_assert_unique_orders([order for order, _ in rows])
|
||||||
|
routes = [row for _, row in sorted(rows, key=lambda value: value[0])]
|
||||||
|
if not routes:
|
||||||
|
status = "EMPTY"
|
||||||
|
elif statuses.intersection({"review", "contested", "missing_required"}):
|
||||||
|
status = "READY_WITH_REVIEW"
|
||||||
|
else:
|
||||||
|
status = "READY"
|
||||||
|
return {"schema_version": "legal_effect_signals.v1", "status": status, "bo_legal_effect_routes": routes}
|
||||||
+113
@@ -0,0 +1,113 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Deterministic read-only compatibility projections from canonical signals."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from copy import deepcopy
|
||||||
|
import json
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
|
||||||
|
_COMPATIBILITY_KEY_PATTERN = r"legacy-liability-[0-9]{4}"
|
||||||
|
|
||||||
|
|
||||||
|
def _assert_unique_orders(orders: list[int]) -> None:
|
||||||
|
if len(orders) != len(set(orders)):
|
||||||
|
raise ValueError("COMPATIBILITY_DUPLICATE_ORDER")
|
||||||
|
|
||||||
|
|
||||||
|
_SIGNALS_ROOT = Path(__file__).resolve().parents[1]
|
||||||
|
|
||||||
|
|
||||||
|
def _actio_extensions() -> list[tuple[str, str]]:
|
||||||
|
contract = json.loads((_SIGNALS_ROOT.parents[1] / "contracts" / "s5_execution_contract.v2.json").read_text(encoding="utf-8"))
|
||||||
|
return [(item["domain_id"], item["extension_key"]) for item in contract["e13_extension_domains"]]
|
||||||
|
|
||||||
|
|
||||||
|
def project_actio(domain_signals: dict[str, dict[str, Any]]) -> dict[str, Any]:
|
||||||
|
extension: dict[str, Any] = {}
|
||||||
|
for domain_id, extension_key in _actio_extensions():
|
||||||
|
envelope = domain_signals.get(domain_id, {}).get("domain_signal_envelope", {})
|
||||||
|
candidate = envelope.get("extensions", {}).get(extension_key, {})
|
||||||
|
if candidate:
|
||||||
|
extension = candidate
|
||||||
|
break
|
||||||
|
records = deepcopy(extension.get("records", []))
|
||||||
|
status = str(extension.get("legacy_status") or ("EMPTY" if not records else "READY"))
|
||||||
|
return {"schema_version": "actio_case_signals.v1", "status": status, "actio_case_signals": records}
|
||||||
|
|
||||||
|
|
||||||
|
def project_case_liability(sg05: dict[str, Any], sg08: dict[str, Any]) -> dict[str, Any]:
|
||||||
|
relation: dict[str, dict[str, Any]] = {}
|
||||||
|
liability: dict[str, dict[str, Any]] = {}
|
||||||
|
statuses: set[str] = set()
|
||||||
|
order05: list[int] = []
|
||||||
|
order08: list[int] = []
|
||||||
|
for item in sg05.get("records", []):
|
||||||
|
details = item.get("details", {})
|
||||||
|
key = details.get("compatibility_key")
|
||||||
|
if key and "relation_component" in details:
|
||||||
|
if __import__("re").fullmatch(_COMPATIBILITY_KEY_PATTERN, str(key)) is None:
|
||||||
|
raise ValueError("COMPATIBILITY_KEY_PATTERN_INVALID")
|
||||||
|
order05.append(int(details["compatibility_order"]))
|
||||||
|
relation[str(key)] = details
|
||||||
|
statuses.add(str(item.get("status")))
|
||||||
|
for item in sg08.get("records", []):
|
||||||
|
details = item.get("details", {})
|
||||||
|
key = details.get("compatibility_key")
|
||||||
|
if key and "liability_component" in details:
|
||||||
|
if __import__("re").fullmatch(_COMPATIBILITY_KEY_PATTERN, str(key)) is None:
|
||||||
|
raise ValueError("COMPATIBILITY_KEY_PATTERN_INVALID")
|
||||||
|
order08.append(int(details["compatibility_order"]))
|
||||||
|
liability[str(key)] = details
|
||||||
|
statuses.add(str(item.get("status")))
|
||||||
|
_assert_unique_orders(order05)
|
||||||
|
_assert_unique_orders(order08)
|
||||||
|
if set(relation) != set(liability):
|
||||||
|
raise ValueError("COMPATIBILITY_LIABILITY_COMPONENT_MISMATCH")
|
||||||
|
rows: list[tuple[int, dict[str, Any]]] = []
|
||||||
|
for key in relation:
|
||||||
|
rel = relation[key]
|
||||||
|
lia = liability[key]
|
||||||
|
order = int(rel["compatibility_order"])
|
||||||
|
if order != int(lia["compatibility_order"]):
|
||||||
|
raise ValueError("COMPATIBILITY_ORDER_MISMATCH")
|
||||||
|
rc = rel["relation_component"]
|
||||||
|
lc = lia["liability_component"]
|
||||||
|
rows.append((order, {
|
||||||
|
"liability_candidate_type": deepcopy(lc.get("liability_candidate_type")),
|
||||||
|
"related_bo_ids": deepcopy(rc.get("related_bo_ids", [])),
|
||||||
|
"related_evidence_indexes": deepcopy(lc.get("related_evidence_indexes", [])),
|
||||||
|
"party_roles": deepcopy(rc.get("party_roles", [])),
|
||||||
|
"claim_group_id": deepcopy(rc.get("claim_group_id")),
|
||||||
|
"liability_group_id": deepcopy(lc.get("liability_group_id")),
|
||||||
|
"linked_structure_ids": deepcopy(rc.get("linked_structure_ids", [])),
|
||||||
|
}))
|
||||||
|
records = [row for _, row in sorted(rows, key=lambda value: value[0])]
|
||||||
|
if not records:
|
||||||
|
status = "EMPTY"
|
||||||
|
elif statuses.intersection({"review", "contested", "missing_required"}):
|
||||||
|
status = "READY_WITH_REVIEW"
|
||||||
|
else:
|
||||||
|
status = "READY"
|
||||||
|
return {"schema_version": "case_liability_signals.v1", "status": status, "case_liability_signals": records}
|
||||||
|
|
||||||
|
|
||||||
|
def project_legal_effect(sg13: dict[str, Any]) -> dict[str, Any]:
|
||||||
|
rows: list[tuple[int, dict[str, Any]]] = []
|
||||||
|
statuses: set[str] = set()
|
||||||
|
for item in sg13.get("records", []):
|
||||||
|
details = item.get("details", {})
|
||||||
|
if "compatibility_route" in details:
|
||||||
|
rows.append((int(details["compatibility_order"]), deepcopy(details["compatibility_route"])))
|
||||||
|
statuses.add(str(item.get("status")))
|
||||||
|
_assert_unique_orders([order for order, _ in rows])
|
||||||
|
routes = [row for _, row in sorted(rows, key=lambda value: value[0])]
|
||||||
|
if not routes:
|
||||||
|
status = "EMPTY"
|
||||||
|
elif statuses.intersection({"review", "contested", "missing_required"}):
|
||||||
|
status = "READY_WITH_REVIEW"
|
||||||
|
else:
|
||||||
|
status = "READY"
|
||||||
|
return {"schema_version": "legal_effect_signals.v1", "status": status, "bo_legal_effect_routes": routes}
|
||||||
+88
@@ -0,0 +1,88 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Dependency-free JSON Schema subset validator with relative-file $ref support."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import json
|
||||||
|
import re
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
|
||||||
|
def _type_ok(value: Any, expected: str) -> bool:
|
||||||
|
checks = {
|
||||||
|
"null": lambda v: v is None,
|
||||||
|
"boolean": lambda v: isinstance(v, bool),
|
||||||
|
"integer": lambda v: isinstance(v, int) and not isinstance(v, bool),
|
||||||
|
"number": lambda v: isinstance(v, (int, float)) and not isinstance(v, bool),
|
||||||
|
"string": lambda v: isinstance(v, str),
|
||||||
|
"array": lambda v: isinstance(v, list),
|
||||||
|
"object": lambda v: isinstance(v, dict),
|
||||||
|
}
|
||||||
|
return expected in checks and checks[expected](value)
|
||||||
|
|
||||||
|
|
||||||
|
def validate_file(instance: Any, schema_path: Path) -> list[dict[str, str]]:
|
||||||
|
cache: dict[Path, Any] = {}
|
||||||
|
|
||||||
|
def load(path: Path) -> Any:
|
||||||
|
path = path.resolve()
|
||||||
|
if path not in cache:
|
||||||
|
cache[path] = json.loads(path.read_text(encoding="utf-8"))
|
||||||
|
return cache[path]
|
||||||
|
|
||||||
|
errors: list[dict[str, str]] = []
|
||||||
|
|
||||||
|
def add(code: str, at: str, message: str) -> None:
|
||||||
|
errors.append({"code": code, "path": at, "message": message})
|
||||||
|
|
||||||
|
def visit(value: Any, rule: Any, base: Path, at: str) -> None:
|
||||||
|
if not isinstance(rule, dict):
|
||||||
|
return
|
||||||
|
if "$ref" in rule:
|
||||||
|
ref = str(rule["$ref"])
|
||||||
|
if ref.startswith("#"):
|
||||||
|
add("UNSUPPORTED_LOCAL_REF", at, ref)
|
||||||
|
return
|
||||||
|
target = (base.parent / ref).resolve()
|
||||||
|
visit(value, load(target), target, at)
|
||||||
|
return
|
||||||
|
if "const" in rule and value != rule["const"]:
|
||||||
|
add("CONST", at, f"expected {rule['const']!r}")
|
||||||
|
if "enum" in rule and value not in rule["enum"]:
|
||||||
|
add("ENUM", at, "outside enum")
|
||||||
|
expected = rule.get("type")
|
||||||
|
if expected is not None:
|
||||||
|
options = expected if isinstance(expected, list) else [expected]
|
||||||
|
if not any(_type_ok(value, item) for item in options):
|
||||||
|
add("TYPE", at, f"expected {options}, got {type(value).__name__}")
|
||||||
|
return
|
||||||
|
if isinstance(value, dict):
|
||||||
|
for key in rule.get("required", []):
|
||||||
|
if key not in value:
|
||||||
|
add("REQUIRED", f"{at}.{key}", "missing")
|
||||||
|
props = rule.get("properties", {})
|
||||||
|
for key, child in props.items():
|
||||||
|
if key in value:
|
||||||
|
visit(value[key], child, base, f"{at}.{key}")
|
||||||
|
if rule.get("additionalProperties") is False:
|
||||||
|
for key in value:
|
||||||
|
if key not in props:
|
||||||
|
add("ADDITIONAL", f"{at}.{key}", "forbidden")
|
||||||
|
if isinstance(value, list):
|
||||||
|
if rule.get("uniqueItems") and len({json.dumps(item, ensure_ascii=False, sort_keys=True) for item in value}) != len(value):
|
||||||
|
add("UNIQUE", at, "duplicate item")
|
||||||
|
for index, item in enumerate(value):
|
||||||
|
if isinstance(rule.get("items"), dict):
|
||||||
|
visit(item, rule["items"], base, f"{at}[{index}]")
|
||||||
|
if isinstance(value, str):
|
||||||
|
if len(value) < int(rule.get("minLength", 0)):
|
||||||
|
add("MIN_LENGTH", at, "too short")
|
||||||
|
if "pattern" in rule and not re.search(str(rule["pattern"]), value):
|
||||||
|
add("PATTERN", at, "pattern mismatch")
|
||||||
|
if isinstance(value, int) and not isinstance(value, bool) and value < int(rule.get("minimum", value)):
|
||||||
|
add("MINIMUM", at, "below minimum")
|
||||||
|
|
||||||
|
root = schema_path.resolve()
|
||||||
|
visit(instance, load(root), root, "$")
|
||||||
|
return errors
|
||||||
+88
@@ -0,0 +1,88 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Dependency-free JSON Schema subset validator with relative-file $ref support."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import json
|
||||||
|
import re
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
|
||||||
|
def _type_ok(value: Any, expected: str) -> bool:
|
||||||
|
checks = {
|
||||||
|
"null": lambda v: v is None,
|
||||||
|
"boolean": lambda v: isinstance(v, bool),
|
||||||
|
"integer": lambda v: isinstance(v, int) and not isinstance(v, bool),
|
||||||
|
"number": lambda v: isinstance(v, (int, float)) and not isinstance(v, bool),
|
||||||
|
"string": lambda v: isinstance(v, str),
|
||||||
|
"array": lambda v: isinstance(v, list),
|
||||||
|
"object": lambda v: isinstance(v, dict),
|
||||||
|
}
|
||||||
|
return expected in checks and checks[expected](value)
|
||||||
|
|
||||||
|
|
||||||
|
def validate_file(instance: Any, schema_path: Path) -> list[dict[str, str]]:
|
||||||
|
cache: dict[Path, Any] = {}
|
||||||
|
|
||||||
|
def load(path: Path) -> Any:
|
||||||
|
path = path.resolve()
|
||||||
|
if path not in cache:
|
||||||
|
cache[path] = json.loads(path.read_text(encoding="utf-8"))
|
||||||
|
return cache[path]
|
||||||
|
|
||||||
|
errors: list[dict[str, str]] = []
|
||||||
|
|
||||||
|
def add(code: str, at: str, message: str) -> None:
|
||||||
|
errors.append({"code": code, "path": at, "message": message})
|
||||||
|
|
||||||
|
def visit(value: Any, rule: Any, base: Path, at: str) -> None:
|
||||||
|
if not isinstance(rule, dict):
|
||||||
|
return
|
||||||
|
if "$ref" in rule:
|
||||||
|
ref = str(rule["$ref"])
|
||||||
|
if ref.startswith("#"):
|
||||||
|
add("UNSUPPORTED_LOCAL_REF", at, ref)
|
||||||
|
return
|
||||||
|
target = (base.parent / ref).resolve()
|
||||||
|
visit(value, load(target), target, at)
|
||||||
|
return
|
||||||
|
if "const" in rule and value != rule["const"]:
|
||||||
|
add("CONST", at, f"expected {rule['const']!r}")
|
||||||
|
if "enum" in rule and value not in rule["enum"]:
|
||||||
|
add("ENUM", at, "outside enum")
|
||||||
|
expected = rule.get("type")
|
||||||
|
if expected is not None:
|
||||||
|
options = expected if isinstance(expected, list) else [expected]
|
||||||
|
if not any(_type_ok(value, item) for item in options):
|
||||||
|
add("TYPE", at, f"expected {options}, got {type(value).__name__}")
|
||||||
|
return
|
||||||
|
if isinstance(value, dict):
|
||||||
|
for key in rule.get("required", []):
|
||||||
|
if key not in value:
|
||||||
|
add("REQUIRED", f"{at}.{key}", "missing")
|
||||||
|
props = rule.get("properties", {})
|
||||||
|
for key, child in props.items():
|
||||||
|
if key in value:
|
||||||
|
visit(value[key], child, base, f"{at}.{key}")
|
||||||
|
if rule.get("additionalProperties") is False:
|
||||||
|
for key in value:
|
||||||
|
if key not in props:
|
||||||
|
add("ADDITIONAL", f"{at}.{key}", "forbidden")
|
||||||
|
if isinstance(value, list):
|
||||||
|
if rule.get("uniqueItems") and len({json.dumps(item, ensure_ascii=False, sort_keys=True) for item in value}) != len(value):
|
||||||
|
add("UNIQUE", at, "duplicate item")
|
||||||
|
for index, item in enumerate(value):
|
||||||
|
if isinstance(rule.get("items"), dict):
|
||||||
|
visit(item, rule["items"], base, f"{at}[{index}]")
|
||||||
|
if isinstance(value, str):
|
||||||
|
if len(value) < int(rule.get("minLength", 0)):
|
||||||
|
add("MIN_LENGTH", at, "too short")
|
||||||
|
if "pattern" in rule and not re.search(str(rule["pattern"]), value):
|
||||||
|
add("PATTERN", at, "pattern mismatch")
|
||||||
|
if isinstance(value, int) and not isinstance(value, bool) and value < int(rule.get("minimum", value)):
|
||||||
|
add("MINIMUM", at, "below minimum")
|
||||||
|
|
||||||
|
root = schema_path.resolve()
|
||||||
|
visit(instance, load(root), root, "$")
|
||||||
|
return errors
|
||||||
+182
@@ -0,0 +1,182 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Canonical Stage 1 signal compiler with a single transactional writer."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import hashlib
|
||||||
|
import importlib
|
||||||
|
import json
|
||||||
|
from copy import deepcopy
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
from adapters.sg01_activation_adapter import adapt_and_validate
|
||||||
|
from adapters.s3_domain_seed_adapter import adapt as adapt_s3_domain_seeds
|
||||||
|
from compiler.projections import project_actio, project_case_liability, project_legal_effect
|
||||||
|
from compiler.transaction_writer import WRITER_ID, write_transaction
|
||||||
|
|
||||||
|
|
||||||
|
_SIGNALS_ROOT = Path(__file__).resolve().parents[1]
|
||||||
|
|
||||||
|
|
||||||
|
def _load_contracts() -> tuple[dict[str, Any], dict[str, Any]]:
|
||||||
|
registry = json.loads((_SIGNALS_ROOT / "signal_registry.v2.json").read_text(encoding="utf-8"))
|
||||||
|
execution = json.loads((_SIGNALS_ROOT.parents[1] / "contracts" / "s5_execution_contract.v2.json").read_text(encoding="utf-8"))
|
||||||
|
return registry, execution
|
||||||
|
|
||||||
|
|
||||||
|
_REGISTRY, _EXECUTION = _load_contracts()
|
||||||
|
SIGNAL_FILES = {item["signal_id"]: item["file"] for item in _REGISTRY["entries"]}
|
||||||
|
COMPATIBILITY_FILES = {
|
||||||
|
"actio": "compatibility_views/actio_case_signals.json",
|
||||||
|
"liability": "compatibility_views/case_liability_signals.json",
|
||||||
|
"effect": "compatibility_views/legal_effect_signals.json",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def _json_bytes(value: Any) -> bytes:
|
||||||
|
return (json.dumps(value, ensure_ascii=False, sort_keys=True, indent=2) + "\n").encode("utf-8")
|
||||||
|
|
||||||
|
|
||||||
|
def _compatibility_json_bytes(value: Any) -> bytes:
|
||||||
|
"""Preserve legacy insertion order so frozen compatibility bytes also replay."""
|
||||||
|
return (json.dumps(value, ensure_ascii=False, sort_keys=False, indent=2) + "\n").encode("utf-8")
|
||||||
|
|
||||||
|
|
||||||
|
def _sha(data: bytes) -> str:
|
||||||
|
return hashlib.sha256(data).hexdigest()
|
||||||
|
|
||||||
|
|
||||||
|
def _domain_envelopes(inputs: dict[str, Any], sg01: dict[str, Any]) -> dict[str, dict[str, Any]]:
|
||||||
|
manifest = sg01["domain_activation_manifest"]
|
||||||
|
active = sorted(set(manifest.get("active_domain_ids", [])))
|
||||||
|
supplied = inputs.get("domain_signal_envelopes", {})
|
||||||
|
legacy_actio = inputs.get("legacy_signals", {}).get("actio_case_signals", {})
|
||||||
|
out: dict[str, dict[str, Any]] = {}
|
||||||
|
registry_sha = str(manifest.get("registry_index_sha256") or "0" * 64)
|
||||||
|
extension_domains = {item["domain_id"]: item["extension_key"] for item in _EXECUTION["e13_extension_domains"]}
|
||||||
|
for domain_id in active:
|
||||||
|
provided = deepcopy(supplied.get(domain_id)) if isinstance(supplied, dict) else None
|
||||||
|
if isinstance(provided, dict):
|
||||||
|
envelope = provided
|
||||||
|
else:
|
||||||
|
extensions: dict[str, Any] = {}
|
||||||
|
if domain_id in extension_domains and isinstance(legacy_actio, dict):
|
||||||
|
extensions[extension_domains[domain_id]] = {
|
||||||
|
"legacy_status": legacy_actio.get("status", "EMPTY"),
|
||||||
|
"records": deepcopy(legacy_actio.get("actio_case_signals", [])),
|
||||||
|
}
|
||||||
|
envelope = {
|
||||||
|
"domain_signal_envelope": {
|
||||||
|
"schema_version": "stage1_domain_signals.v2",
|
||||||
|
"domain_id": domain_id,
|
||||||
|
"domain_registry_version": manifest.get("registry_version", "UNKNOWN"),
|
||||||
|
"registry_index_sha256": registry_sha,
|
||||||
|
"status": "READY" if extensions else "NO_SUPPORT",
|
||||||
|
"element_fact_candidates": [],
|
||||||
|
"opposing_fact_candidates": [],
|
||||||
|
"defense_candidates": [],
|
||||||
|
"evidence_slot_status": [],
|
||||||
|
"calculation_refs": [],
|
||||||
|
"dependency_refs": [],
|
||||||
|
"review_items": [],
|
||||||
|
"extensions": extensions,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out[domain_id] = envelope
|
||||||
|
return out
|
||||||
|
|
||||||
|
|
||||||
|
def _file_state(payload: Any, *, signal_code: str | None = None) -> tuple[str, int, str]:
|
||||||
|
if signal_code == "SG-01":
|
||||||
|
inner = payload["domain_activation_manifest"]
|
||||||
|
return ("review" if inner.get("status") == "READY_WITH_REVIEW" else "ready", len(inner.get("domain_entries", [])), inner["schema_version"])
|
||||||
|
if signal_code:
|
||||||
|
status = payload.get("status", "EMPTY")
|
||||||
|
state = "blocked" if status == "BLOCKED" else ("review" if status == "READY_WITH_REVIEW" else ("empty" if status == "EMPTY" else "ready"))
|
||||||
|
return state, len(payload.get("records", [])), payload["schema_version"]
|
||||||
|
if "domain_signal_envelope" in payload:
|
||||||
|
inner = payload["domain_signal_envelope"]
|
||||||
|
state = "review" if inner.get("status") == "READY_WITH_REVIEW" else ("empty" if inner.get("status") == "NO_SUPPORT" else "ready")
|
||||||
|
count = sum(len(inner.get(key, [])) for key in ("element_fact_candidates", "opposing_fact_candidates", "defense_candidates"))
|
||||||
|
return state, count, inner["schema_version"]
|
||||||
|
list_keys = [key for key, value in payload.items() if isinstance(value, list)]
|
||||||
|
count = len(payload[list_keys[0]]) if list_keys else 0
|
||||||
|
status = payload.get("status", "EMPTY")
|
||||||
|
state = "review" if status == "READY_WITH_REVIEW" else ("empty" if status == "EMPTY" else "ready")
|
||||||
|
return state, count, payload["schema_version"]
|
||||||
|
|
||||||
|
|
||||||
|
def compile_transaction(inputs: dict[str, Any], output_dir: Path) -> dict[str, Any]:
|
||||||
|
inputs = adapt_s3_domain_seeds(inputs)
|
||||||
|
sg01 = adapt_and_validate(inputs)
|
||||||
|
canonical: dict[str, Any] = {"SG-01": sg01}
|
||||||
|
for number in range(2, 14):
|
||||||
|
code = f"SG-{number:02d}"
|
||||||
|
module = importlib.import_module(f"emitters.emit_sg{number:02d}")
|
||||||
|
canonical[code] = module.emit(inputs)
|
||||||
|
domains = _domain_envelopes(inputs, sg01)
|
||||||
|
views = {
|
||||||
|
"actio": project_actio(domains),
|
||||||
|
"liability": project_case_liability(canonical["SG-05"], canonical["SG-08"]),
|
||||||
|
"effect": project_legal_effect(canonical["SG-13"]),
|
||||||
|
}
|
||||||
|
objects: dict[str, Any] = {SIGNAL_FILES[code]: value for code, value in canonical.items()}
|
||||||
|
objects.update({f"domain_signals/{domain_id}.json": value for domain_id, value in domains.items()})
|
||||||
|
objects.update({COMPATIBILITY_FILES[key]: value for key, value in views.items()})
|
||||||
|
compatibility_paths = set(COMPATIBILITY_FILES.values())
|
||||||
|
encoded = {
|
||||||
|
path: (_compatibility_json_bytes(value) if path in compatibility_paths else _json_bytes(value))
|
||||||
|
for path, value in objects.items()
|
||||||
|
}
|
||||||
|
files = []
|
||||||
|
for path in sorted(encoded):
|
||||||
|
signal_code = next((code for code, filename in SIGNAL_FILES.items() if filename == path), None)
|
||||||
|
state, count, schema_version = _file_state(objects[path], signal_code=signal_code)
|
||||||
|
kind = "canonical" if signal_code else ("domain_signal" if path.startswith("domain_signals/") else "compatibility_view")
|
||||||
|
files.append({
|
||||||
|
"path": path,
|
||||||
|
"schema_version": schema_version,
|
||||||
|
"record_count": count,
|
||||||
|
"file_sha256": _sha(encoded[path]),
|
||||||
|
"hash_kind": "raw_file_sha256",
|
||||||
|
"writer": WRITER_ID,
|
||||||
|
"kind": kind,
|
||||||
|
"state": state,
|
||||||
|
"lifecycle": "active",
|
||||||
|
})
|
||||||
|
sg01_manifest = sg01["domain_activation_manifest"]
|
||||||
|
states = {entry["state"] for entry in files}
|
||||||
|
overall = "BLOCKED" if "blocked" in states else ("READY_WITH_REVIEW" if "review" in states else "READY")
|
||||||
|
source_universe = inputs.get("source_universe", {})
|
||||||
|
manifest = {
|
||||||
|
"schema_version": "signal_manifest.v2",
|
||||||
|
"transaction_id": "S5TX-" + _sha(_json_bytes(files))[:20],
|
||||||
|
"status": overall,
|
||||||
|
"files": files,
|
||||||
|
"domain_signal_files": sorted(path for path in objects if path.startswith("domain_signals/")),
|
||||||
|
"compatibility_views": sorted(COMPATIBILITY_FILES.values()),
|
||||||
|
"active_domains": sorted(sg01_manifest.get("active_domain_ids", [])),
|
||||||
|
"active_calculations": sorted(sg01_manifest.get("required_calculation_domains", [])),
|
||||||
|
"unrouted_counts": {
|
||||||
|
"issues": len(sg01_manifest.get("unrouted_material", [])),
|
||||||
|
"evidence": int(source_universe.get("unrouted_evidence_count", 0)),
|
||||||
|
"operands": sum(1 for item in canonical["SG-11"].get("records", []) if item.get("status") in {"missing_required", "review"}),
|
||||||
|
},
|
||||||
|
"downstream_read_sets": {
|
||||||
|
"part3_L0": ["SG-02", "SG-05", "SG-07", "SG-11", "SG-13"],
|
||||||
|
"part4_F0": ["SG-04", "SG-06", "SG-07", "SG-10", "SG-11"],
|
||||||
|
"stage2": ["ALL"],
|
||||||
|
},
|
||||||
|
"writer": WRITER_ID,
|
||||||
|
"transaction_guards": {
|
||||||
|
"canonical_writer_count": 1,
|
||||||
|
"compatibility_views_are_projections": True,
|
||||||
|
"source_membership_required": True,
|
||||||
|
"meeting_only_evidence_promotion_forbidden": True,
|
||||||
|
"negative_conflict_preservation_required": True,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
encoded["signal_manifest.json"] = _json_bytes(manifest)
|
||||||
|
write_transaction(output_dir, encoded)
|
||||||
|
return manifest
|
||||||
+182
@@ -0,0 +1,182 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Canonical Stage 1 signal compiler with a single transactional writer."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import hashlib
|
||||||
|
import importlib
|
||||||
|
import json
|
||||||
|
from copy import deepcopy
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
from adapters.sg01_activation_adapter import adapt_and_validate
|
||||||
|
from adapters.s3_domain_seed_adapter import adapt as adapt_s3_domain_seeds
|
||||||
|
from compiler.projections import project_actio, project_case_liability, project_legal_effect
|
||||||
|
from compiler.transaction_writer import WRITER_ID, write_transaction
|
||||||
|
|
||||||
|
|
||||||
|
_SIGNALS_ROOT = Path(__file__).resolve().parents[1]
|
||||||
|
|
||||||
|
|
||||||
|
def _load_contracts() -> tuple[dict[str, Any], dict[str, Any]]:
|
||||||
|
registry = json.loads((_SIGNALS_ROOT / "signal_registry.v2.json").read_text(encoding="utf-8"))
|
||||||
|
execution = json.loads((_SIGNALS_ROOT.parents[1] / "contracts" / "s5_execution_contract.v2.json").read_text(encoding="utf-8"))
|
||||||
|
return registry, execution
|
||||||
|
|
||||||
|
|
||||||
|
_REGISTRY, _EXECUTION = _load_contracts()
|
||||||
|
SIGNAL_FILES = {item["signal_id"]: item["file"] for item in _REGISTRY["entries"]}
|
||||||
|
COMPATIBILITY_FILES = {
|
||||||
|
"actio": "compatibility_views/actio_case_signals.json",
|
||||||
|
"liability": "compatibility_views/case_liability_signals.json",
|
||||||
|
"effect": "compatibility_views/legal_effect_signals.json",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def _json_bytes(value: Any) -> bytes:
|
||||||
|
return (json.dumps(value, ensure_ascii=False, sort_keys=True, indent=2) + "\n").encode("utf-8")
|
||||||
|
|
||||||
|
|
||||||
|
def _compatibility_json_bytes(value: Any) -> bytes:
|
||||||
|
"""Preserve legacy insertion order so frozen compatibility bytes also replay."""
|
||||||
|
return (json.dumps(value, ensure_ascii=False, sort_keys=False, indent=2) + "\n").encode("utf-8")
|
||||||
|
|
||||||
|
|
||||||
|
def _sha(data: bytes) -> str:
|
||||||
|
return hashlib.sha256(data).hexdigest()
|
||||||
|
|
||||||
|
|
||||||
|
def _domain_envelopes(inputs: dict[str, Any], sg01: dict[str, Any]) -> dict[str, dict[str, Any]]:
|
||||||
|
manifest = sg01["domain_activation_manifest"]
|
||||||
|
active = sorted(set(manifest.get("active_domain_ids", [])))
|
||||||
|
supplied = inputs.get("domain_signal_envelopes", {})
|
||||||
|
legacy_actio = inputs.get("legacy_signals", {}).get("actio_case_signals", {})
|
||||||
|
out: dict[str, dict[str, Any]] = {}
|
||||||
|
registry_sha = str(manifest.get("registry_index_sha256") or "0" * 64)
|
||||||
|
extension_domains = {item["domain_id"]: item["extension_key"] for item in _EXECUTION["e13_extension_domains"]}
|
||||||
|
for domain_id in active:
|
||||||
|
provided = deepcopy(supplied.get(domain_id)) if isinstance(supplied, dict) else None
|
||||||
|
if isinstance(provided, dict):
|
||||||
|
envelope = provided
|
||||||
|
else:
|
||||||
|
extensions: dict[str, Any] = {}
|
||||||
|
if domain_id in extension_domains and isinstance(legacy_actio, dict):
|
||||||
|
extensions[extension_domains[domain_id]] = {
|
||||||
|
"legacy_status": legacy_actio.get("status", "EMPTY"),
|
||||||
|
"records": deepcopy(legacy_actio.get("actio_case_signals", [])),
|
||||||
|
}
|
||||||
|
envelope = {
|
||||||
|
"domain_signal_envelope": {
|
||||||
|
"schema_version": "stage1_domain_signals.v2",
|
||||||
|
"domain_id": domain_id,
|
||||||
|
"domain_registry_version": manifest.get("registry_version", "UNKNOWN"),
|
||||||
|
"registry_index_sha256": registry_sha,
|
||||||
|
"status": "READY" if extensions else "NO_SUPPORT",
|
||||||
|
"element_fact_candidates": [],
|
||||||
|
"opposing_fact_candidates": [],
|
||||||
|
"defense_candidates": [],
|
||||||
|
"evidence_slot_status": [],
|
||||||
|
"calculation_refs": [],
|
||||||
|
"dependency_refs": [],
|
||||||
|
"review_items": [],
|
||||||
|
"extensions": extensions,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out[domain_id] = envelope
|
||||||
|
return out
|
||||||
|
|
||||||
|
|
||||||
|
def _file_state(payload: Any, *, signal_code: str | None = None) -> tuple[str, int, str]:
|
||||||
|
if signal_code == "SG-01":
|
||||||
|
inner = payload["domain_activation_manifest"]
|
||||||
|
return ("review" if inner.get("status") == "READY_WITH_REVIEW" else "ready", len(inner.get("domain_entries", [])), inner["schema_version"])
|
||||||
|
if signal_code:
|
||||||
|
status = payload.get("status", "EMPTY")
|
||||||
|
state = "blocked" if status == "BLOCKED" else ("review" if status == "READY_WITH_REVIEW" else ("empty" if status == "EMPTY" else "ready"))
|
||||||
|
return state, len(payload.get("records", [])), payload["schema_version"]
|
||||||
|
if "domain_signal_envelope" in payload:
|
||||||
|
inner = payload["domain_signal_envelope"]
|
||||||
|
state = "review" if inner.get("status") == "READY_WITH_REVIEW" else ("empty" if inner.get("status") == "NO_SUPPORT" else "ready")
|
||||||
|
count = sum(len(inner.get(key, [])) for key in ("element_fact_candidates", "opposing_fact_candidates", "defense_candidates"))
|
||||||
|
return state, count, inner["schema_version"]
|
||||||
|
list_keys = [key for key, value in payload.items() if isinstance(value, list)]
|
||||||
|
count = len(payload[list_keys[0]]) if list_keys else 0
|
||||||
|
status = payload.get("status", "EMPTY")
|
||||||
|
state = "review" if status == "READY_WITH_REVIEW" else ("empty" if status == "EMPTY" else "ready")
|
||||||
|
return state, count, payload["schema_version"]
|
||||||
|
|
||||||
|
|
||||||
|
def compile_transaction(inputs: dict[str, Any], output_dir: Path) -> dict[str, Any]:
|
||||||
|
inputs = adapt_s3_domain_seeds(inputs)
|
||||||
|
sg01 = adapt_and_validate(inputs)
|
||||||
|
canonical: dict[str, Any] = {"SG-01": sg01}
|
||||||
|
for number in range(2, 14):
|
||||||
|
code = f"SG-{number:02d}"
|
||||||
|
module = importlib.import_module(f"emitters.emit_sg{number:02d}")
|
||||||
|
canonical[code] = module.emit(inputs)
|
||||||
|
domains = _domain_envelopes(inputs, sg01)
|
||||||
|
views = {
|
||||||
|
"actio": project_actio(domains),
|
||||||
|
"liability": project_case_liability(canonical["SG-05"], canonical["SG-08"]),
|
||||||
|
"effect": project_legal_effect(canonical["SG-13"]),
|
||||||
|
}
|
||||||
|
objects: dict[str, Any] = {SIGNAL_FILES[code]: value for code, value in canonical.items()}
|
||||||
|
objects.update({f"domain_signals/{domain_id}.json": value for domain_id, value in domains.items()})
|
||||||
|
objects.update({COMPATIBILITY_FILES[key]: value for key, value in views.items()})
|
||||||
|
compatibility_paths = set(COMPATIBILITY_FILES.values())
|
||||||
|
encoded = {
|
||||||
|
path: (_compatibility_json_bytes(value) if path in compatibility_paths else _json_bytes(value))
|
||||||
|
for path, value in objects.items()
|
||||||
|
}
|
||||||
|
files = []
|
||||||
|
for path in sorted(encoded):
|
||||||
|
signal_code = next((code for code, filename in SIGNAL_FILES.items() if filename == path), None)
|
||||||
|
state, count, schema_version = _file_state(objects[path], signal_code=signal_code)
|
||||||
|
kind = "canonical" if signal_code else ("domain_signal" if path.startswith("domain_signals/") else "compatibility_view")
|
||||||
|
files.append({
|
||||||
|
"path": path,
|
||||||
|
"schema_version": schema_version,
|
||||||
|
"record_count": count,
|
||||||
|
"file_sha256": _sha(encoded[path]),
|
||||||
|
"hash_kind": "raw_file_sha256",
|
||||||
|
"writer": WRITER_ID,
|
||||||
|
"kind": kind,
|
||||||
|
"state": state,
|
||||||
|
"lifecycle": "active",
|
||||||
|
})
|
||||||
|
sg01_manifest = sg01["domain_activation_manifest"]
|
||||||
|
states = {entry["state"] for entry in files}
|
||||||
|
overall = "BLOCKED" if "blocked" in states else ("READY_WITH_REVIEW" if "review" in states else "READY")
|
||||||
|
source_universe = inputs.get("source_universe", {})
|
||||||
|
manifest = {
|
||||||
|
"schema_version": "signal_manifest.v2",
|
||||||
|
"transaction_id": "S5TX-" + _sha(_json_bytes(files))[:20],
|
||||||
|
"status": overall,
|
||||||
|
"files": files,
|
||||||
|
"domain_signal_files": sorted(path for path in objects if path.startswith("domain_signals/")),
|
||||||
|
"compatibility_views": sorted(COMPATIBILITY_FILES.values()),
|
||||||
|
"active_domains": sorted(sg01_manifest.get("active_domain_ids", [])),
|
||||||
|
"active_calculations": sorted(sg01_manifest.get("required_calculation_domains", [])),
|
||||||
|
"unrouted_counts": {
|
||||||
|
"issues": len(sg01_manifest.get("unrouted_material", [])),
|
||||||
|
"evidence": int(source_universe.get("unrouted_evidence_count", 0)),
|
||||||
|
"operands": sum(1 for item in canonical["SG-11"].get("records", []) if item.get("status") in {"missing_required", "review"}),
|
||||||
|
},
|
||||||
|
"downstream_read_sets": {
|
||||||
|
"part3_L0": ["SG-02", "SG-05", "SG-07", "SG-11", "SG-13"],
|
||||||
|
"part4_F0": ["SG-04", "SG-06", "SG-07", "SG-10", "SG-11"],
|
||||||
|
"stage2": ["ALL"],
|
||||||
|
},
|
||||||
|
"writer": WRITER_ID,
|
||||||
|
"transaction_guards": {
|
||||||
|
"canonical_writer_count": 1,
|
||||||
|
"compatibility_views_are_projections": True,
|
||||||
|
"source_membership_required": True,
|
||||||
|
"meeting_only_evidence_promotion_forbidden": True,
|
||||||
|
"negative_conflict_preservation_required": True,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
encoded["signal_manifest.json"] = _json_bytes(manifest)
|
||||||
|
write_transaction(output_dir, encoded)
|
||||||
|
return manifest
|
||||||
+201
@@ -0,0 +1,201 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Signal acceptance gate: schema, provenance, transaction, and projection checks."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import hashlib
|
||||||
|
import json
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
from compiler.projections import project_actio, project_case_liability, project_legal_effect
|
||||||
|
from compiler.schema_validator import validate_file
|
||||||
|
from compiler.signal_compiler import COMPATIBILITY_FILES, SIGNAL_FILES
|
||||||
|
from compiler.writer_boundary import detect_writer_modules
|
||||||
|
|
||||||
|
|
||||||
|
SCHEMA_FILES = {
|
||||||
|
"SG-01": "domain_activation_manifest.schema.json",
|
||||||
|
"SG-02": "procedural_posture_relief_signals.schema.json",
|
||||||
|
"SG-03": "party_capacity_standing_signals.schema.json",
|
||||||
|
"SG-04": "governing_law_version_signals.schema.json",
|
||||||
|
"SG-05": "legal_relation_lifecycle_signals.schema.json",
|
||||||
|
"SG-06": "timeline_notice_condition_signals.schema.json",
|
||||||
|
"SG-07": "asset_right_state_signals.schema.json",
|
||||||
|
"SG-08": "liability_causation_damage_signals.schema.json",
|
||||||
|
"SG-09": "defense_exception_signals.schema.json",
|
||||||
|
"SG-10": "evidence_proof_conflict_signals.schema.json",
|
||||||
|
"SG-11": "calculation_requirements.schema.json",
|
||||||
|
"SG-12": "remedy_enforcement_signals.schema.json",
|
||||||
|
"SG-13": "legal_effect_routes.schema.json",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def _load(path: Path) -> Any:
|
||||||
|
return json.loads(path.read_text(encoding="utf-8"))
|
||||||
|
|
||||||
|
|
||||||
|
def _sha(path: Path) -> str:
|
||||||
|
return hashlib.sha256(path.read_bytes()).hexdigest()
|
||||||
|
|
||||||
|
|
||||||
|
def validate_output(inputs: dict[str, Any], output_dir: Path, signals_root: Path) -> dict[str, Any]:
|
||||||
|
errors: list[dict[str, Any]] = []
|
||||||
|
schema_results: dict[str, Any] = {}
|
||||||
|
canonical: dict[str, Any] = {}
|
||||||
|
for code, filename in SIGNAL_FILES.items():
|
||||||
|
path = output_dir / filename
|
||||||
|
payload = _load(path)
|
||||||
|
canonical[code] = payload
|
||||||
|
schema_path = signals_root / "schemas" / SCHEMA_FILES[code]
|
||||||
|
found = validate_file(payload, schema_path)
|
||||||
|
schema_results[code] = {"error_count": len(found), "errors": found}
|
||||||
|
errors.extend({"gate": "schema", "signal": code, **item} for item in found)
|
||||||
|
domain_payloads: dict[str, Any] = {}
|
||||||
|
for path in sorted((output_dir / "domain_signals").glob("*.json")):
|
||||||
|
payload = _load(path)
|
||||||
|
domain_payloads[path.stem] = payload
|
||||||
|
found = validate_file(payload, signals_root / "schemas" / "domain_signal_envelope.schema.v2.json")
|
||||||
|
schema_results[f"domain:{path.stem}"] = {"error_count": len(found), "errors": found}
|
||||||
|
errors.extend({"gate": "schema", "signal": f"domain:{path.stem}", **item} for item in found)
|
||||||
|
manifest = _load(output_dir / "signal_manifest.json")
|
||||||
|
found = validate_file(manifest, signals_root / "schemas" / "signal_manifest.schema.json")
|
||||||
|
schema_results["manifest"] = {"error_count": len(found), "errors": found}
|
||||||
|
errors.extend({"gate": "schema", "signal": "manifest", **item} for item in found)
|
||||||
|
|
||||||
|
universe = inputs.get("source_universe", {})
|
||||||
|
memberships = {
|
||||||
|
"source_bo_ids": set(universe.get("bo_ids", [])),
|
||||||
|
"source_fact_ids": set(universe.get("fact_ids", [])),
|
||||||
|
"evidence_refs": set(universe.get("evidence_ids", [])),
|
||||||
|
"meeting_clause_refs": set(universe.get("meeting_clause_ids", [])),
|
||||||
|
"law_version_refs": set(universe.get("law_version_ids", [])),
|
||||||
|
}
|
||||||
|
all_refs = set(universe.get("all_source_refs", []))
|
||||||
|
for refs in memberships.values():
|
||||||
|
all_refs.update(refs)
|
||||||
|
all_refs.update(universe.get("event_ids", []))
|
||||||
|
for code in [f"SG-{number:02d}" for number in range(2, 14)]:
|
||||||
|
for item in canonical[code].get("records", []):
|
||||||
|
for field, allowed in memberships.items():
|
||||||
|
missing = sorted(set(item.get(field, [])) - allowed)
|
||||||
|
if missing:
|
||||||
|
errors.append({"gate": "source_membership", "signal": code, "field": field, "missing": missing})
|
||||||
|
missing = sorted(set(item.get("negative_or_conflicting_refs", [])) - all_refs)
|
||||||
|
if missing:
|
||||||
|
errors.append({"gate": "source_membership", "signal": code, "field": "negative_or_conflicting_refs", "missing": missing})
|
||||||
|
if item.get("proof_grade") == "client_statement" and item.get("evidence_refs"):
|
||||||
|
errors.append({"gate": "meeting_only_promotion", "signal": code, "signal_id": item.get("signal_id")})
|
||||||
|
if item.get("meeting_clause_refs") and not item.get("evidence_refs") and item.get("proof_grade") != "client_statement":
|
||||||
|
errors.append({"gate": "meeting_only_grade", "signal": code, "signal_id": item.get("signal_id")})
|
||||||
|
activation = canonical["SG-01"]["domain_activation_manifest"]
|
||||||
|
for entry in activation.get("domain_entries", []):
|
||||||
|
for field in ("positive_refs", "negative_refs", "conflict_refs"):
|
||||||
|
missing = sorted(set(entry.get(field, [])) - all_refs)
|
||||||
|
if missing:
|
||||||
|
errors.append({"gate": "sg01_source_membership", "domain_id": entry.get("domain_id"), "field": field, "missing": missing})
|
||||||
|
|
||||||
|
for code, candidates in inputs.get("signal_candidates", {}).items():
|
||||||
|
expected_negative = {ref for item in candidates if isinstance(item, dict) for ref in item.get("negative_or_conflicting_refs", [])}
|
||||||
|
actual_negative = {ref for item in canonical.get(code, {}).get("records", []) for ref in item.get("negative_or_conflicting_refs", [])}
|
||||||
|
if not expected_negative.issubset(actual_negative):
|
||||||
|
errors.append({"gate": "negative_conflict_preservation", "signal": code, "missing": sorted(expected_negative - actual_negative)})
|
||||||
|
|
||||||
|
domain_membership_fields = {
|
||||||
|
"source_bo_ids": memberships["source_bo_ids"],
|
||||||
|
"related_bo_ids": memberships["source_bo_ids"],
|
||||||
|
"source_fact_ids": memberships["source_fact_ids"],
|
||||||
|
"evidence_refs": memberships["evidence_refs"],
|
||||||
|
"related_evidence_indexes": memberships["evidence_refs"],
|
||||||
|
"meeting_clause_refs": memberships["meeting_clause_refs"],
|
||||||
|
"law_version_refs": memberships["law_version_refs"],
|
||||||
|
"source_refs": all_refs,
|
||||||
|
"negative_or_conflicting_refs": all_refs,
|
||||||
|
}
|
||||||
|
|
||||||
|
def check_domain_node(node: Any, domain_id: str, at: str) -> None:
|
||||||
|
if isinstance(node, dict):
|
||||||
|
for key, value in node.items():
|
||||||
|
child_at = f"{at}.{key}"
|
||||||
|
if key in domain_membership_fields and isinstance(value, list):
|
||||||
|
missing = sorted({str(ref) for ref in value} - domain_membership_fields[key])
|
||||||
|
if missing:
|
||||||
|
errors.append({"gate": "domain_source_membership", "domain_id": domain_id, "path": child_at, "missing": missing})
|
||||||
|
elif key == "source_id" and value is not None and str(value) not in all_refs:
|
||||||
|
errors.append({"gate": "domain_source_membership", "domain_id": domain_id, "path": child_at, "missing": [str(value)]})
|
||||||
|
elif key == "bo_id" and value is not None and str(value) not in memberships["source_bo_ids"]:
|
||||||
|
errors.append({"gate": "domain_source_membership", "domain_id": domain_id, "path": child_at, "missing": [str(value)]})
|
||||||
|
check_domain_node(value, domain_id, child_at)
|
||||||
|
elif isinstance(node, list):
|
||||||
|
for index, value in enumerate(node):
|
||||||
|
check_domain_node(value, domain_id, f"{at}[{index}]")
|
||||||
|
|
||||||
|
for domain_id, payload in domain_payloads.items():
|
||||||
|
check_domain_node(payload.get("domain_signal_envelope", {}), domain_id, f"domain_signals.{domain_id}")
|
||||||
|
|
||||||
|
forbidden_conclusion_keys = {"final_conclusion", "final_legal_conclusion", "final_claim_amount"}
|
||||||
|
|
||||||
|
def check_forbidden_keys(node: Any, owner: str, at: str) -> None:
|
||||||
|
if isinstance(node, dict):
|
||||||
|
for key, value in node.items():
|
||||||
|
child_at = f"{at}.{key}"
|
||||||
|
if key in forbidden_conclusion_keys:
|
||||||
|
errors.append({"gate": "forbidden_conclusion_key", "error_code": "FORBIDDEN_CONCLUSION_KEY", "owner": owner, "path": child_at, "forbidden_key": key})
|
||||||
|
check_forbidden_keys(value, owner, child_at)
|
||||||
|
elif isinstance(node, list):
|
||||||
|
for index, value in enumerate(node):
|
||||||
|
check_forbidden_keys(value, owner, f"{at}[{index}]")
|
||||||
|
|
||||||
|
for code, payload in canonical.items():
|
||||||
|
check_forbidden_keys(payload, code, code)
|
||||||
|
for domain_id, payload in domain_payloads.items():
|
||||||
|
check_forbidden_keys(payload, f"domain:{domain_id}", f"domain_signals.{domain_id}")
|
||||||
|
|
||||||
|
views = {
|
||||||
|
"actio": _load(output_dir / COMPATIBILITY_FILES["actio"]),
|
||||||
|
"liability": _load(output_dir / COMPATIBILITY_FILES["liability"]),
|
||||||
|
"effect": _load(output_dir / COMPATIBILITY_FILES["effect"]),
|
||||||
|
}
|
||||||
|
derived = {
|
||||||
|
"actio": project_actio(domain_payloads),
|
||||||
|
"liability": project_case_liability(canonical["SG-05"], canonical["SG-08"]),
|
||||||
|
"effect": project_legal_effect(canonical["SG-13"]),
|
||||||
|
}
|
||||||
|
for key in views:
|
||||||
|
if views[key] != derived[key]:
|
||||||
|
errors.append({"gate": "compatibility_projection", "view": key})
|
||||||
|
|
||||||
|
listed_paths = set()
|
||||||
|
for entry in manifest.get("files", []):
|
||||||
|
relative = entry["path"]
|
||||||
|
listed_paths.add(relative)
|
||||||
|
path = output_dir / relative
|
||||||
|
if not path.exists() or _sha(path) != entry["file_sha256"]:
|
||||||
|
errors.append({"gate": "manifest_hash", "path": relative})
|
||||||
|
actual_paths = {
|
||||||
|
path.relative_to(output_dir).as_posix()
|
||||||
|
for path in output_dir.rglob("*.json")
|
||||||
|
if path.name != "signal_manifest.json"
|
||||||
|
}
|
||||||
|
if listed_paths != actual_paths:
|
||||||
|
errors.append({"gate": "manifest_file_set", "missing": sorted(actual_paths - listed_paths), "extra": sorted(listed_paths - actual_paths)})
|
||||||
|
|
||||||
|
writer_modules = detect_writer_modules(signals_root)
|
||||||
|
if writer_modules != ["compiler/transaction_writer.py"]:
|
||||||
|
errors.append({"gate": "canonical_writer_uniqueness", "writer_modules": writer_modules})
|
||||||
|
|
||||||
|
return {
|
||||||
|
"status": "PASS" if not errors else "FAIL",
|
||||||
|
"error_count": len(errors),
|
||||||
|
"errors": errors,
|
||||||
|
"schema_results": schema_results,
|
||||||
|
"canonical_writer_modules": writer_modules,
|
||||||
|
"manifest_entry_count": len(manifest.get("files", [])),
|
||||||
|
"source_membership_pass": not any(item.get("gate") in {"source_membership", "sg01_source_membership", "domain_source_membership"} for item in errors),
|
||||||
|
"domain_source_membership_pass": not any(item.get("gate") == "domain_source_membership" for item in errors),
|
||||||
|
"meeting_only_promotion_pass": not any(item.get("gate", "").startswith("meeting_only") for item in errors),
|
||||||
|
"negative_conflict_preservation_pass": not any(item.get("gate") == "negative_conflict_preservation" for item in errors),
|
||||||
|
"compatibility_projection_pass": not any(item.get("gate") == "compatibility_projection" for item in errors),
|
||||||
|
"manifest_hash_pass": not any(item.get("gate", "").startswith("manifest_") for item in errors),
|
||||||
|
"forbidden_conclusion_key_pass": not any(item.get("gate") == "forbidden_conclusion_key" for item in errors),
|
||||||
|
}
|
||||||
+201
@@ -0,0 +1,201 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Signal acceptance gate: schema, provenance, transaction, and projection checks."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import hashlib
|
||||||
|
import json
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
from compiler.projections import project_actio, project_case_liability, project_legal_effect
|
||||||
|
from compiler.schema_validator import validate_file
|
||||||
|
from compiler.signal_compiler import COMPATIBILITY_FILES, SIGNAL_FILES
|
||||||
|
from compiler.writer_boundary import detect_writer_modules
|
||||||
|
|
||||||
|
|
||||||
|
SCHEMA_FILES = {
|
||||||
|
"SG-01": "domain_activation_manifest.schema.json",
|
||||||
|
"SG-02": "procedural_posture_relief_signals.schema.json",
|
||||||
|
"SG-03": "party_capacity_standing_signals.schema.json",
|
||||||
|
"SG-04": "governing_law_version_signals.schema.json",
|
||||||
|
"SG-05": "legal_relation_lifecycle_signals.schema.json",
|
||||||
|
"SG-06": "timeline_notice_condition_signals.schema.json",
|
||||||
|
"SG-07": "asset_right_state_signals.schema.json",
|
||||||
|
"SG-08": "liability_causation_damage_signals.schema.json",
|
||||||
|
"SG-09": "defense_exception_signals.schema.json",
|
||||||
|
"SG-10": "evidence_proof_conflict_signals.schema.json",
|
||||||
|
"SG-11": "calculation_requirements.schema.json",
|
||||||
|
"SG-12": "remedy_enforcement_signals.schema.json",
|
||||||
|
"SG-13": "legal_effect_routes.schema.json",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def _load(path: Path) -> Any:
|
||||||
|
return json.loads(path.read_text(encoding="utf-8"))
|
||||||
|
|
||||||
|
|
||||||
|
def _sha(path: Path) -> str:
|
||||||
|
return hashlib.sha256(path.read_bytes()).hexdigest()
|
||||||
|
|
||||||
|
|
||||||
|
def validate_output(inputs: dict[str, Any], output_dir: Path, signals_root: Path) -> dict[str, Any]:
|
||||||
|
errors: list[dict[str, Any]] = []
|
||||||
|
schema_results: dict[str, Any] = {}
|
||||||
|
canonical: dict[str, Any] = {}
|
||||||
|
for code, filename in SIGNAL_FILES.items():
|
||||||
|
path = output_dir / filename
|
||||||
|
payload = _load(path)
|
||||||
|
canonical[code] = payload
|
||||||
|
schema_path = signals_root / "schemas" / SCHEMA_FILES[code]
|
||||||
|
found = validate_file(payload, schema_path)
|
||||||
|
schema_results[code] = {"error_count": len(found), "errors": found}
|
||||||
|
errors.extend({"gate": "schema", "signal": code, **item} for item in found)
|
||||||
|
domain_payloads: dict[str, Any] = {}
|
||||||
|
for path in sorted((output_dir / "domain_signals").glob("*.json")):
|
||||||
|
payload = _load(path)
|
||||||
|
domain_payloads[path.stem] = payload
|
||||||
|
found = validate_file(payload, signals_root / "schemas" / "domain_signal_envelope.schema.v2.json")
|
||||||
|
schema_results[f"domain:{path.stem}"] = {"error_count": len(found), "errors": found}
|
||||||
|
errors.extend({"gate": "schema", "signal": f"domain:{path.stem}", **item} for item in found)
|
||||||
|
manifest = _load(output_dir / "signal_manifest.json")
|
||||||
|
found = validate_file(manifest, signals_root / "schemas" / "signal_manifest.schema.json")
|
||||||
|
schema_results["manifest"] = {"error_count": len(found), "errors": found}
|
||||||
|
errors.extend({"gate": "schema", "signal": "manifest", **item} for item in found)
|
||||||
|
|
||||||
|
universe = inputs.get("source_universe", {})
|
||||||
|
memberships = {
|
||||||
|
"source_bo_ids": set(universe.get("bo_ids", [])),
|
||||||
|
"source_fact_ids": set(universe.get("fact_ids", [])),
|
||||||
|
"evidence_refs": set(universe.get("evidence_ids", [])),
|
||||||
|
"meeting_clause_refs": set(universe.get("meeting_clause_ids", [])),
|
||||||
|
"law_version_refs": set(universe.get("law_version_ids", [])),
|
||||||
|
}
|
||||||
|
all_refs = set(universe.get("all_source_refs", []))
|
||||||
|
for refs in memberships.values():
|
||||||
|
all_refs.update(refs)
|
||||||
|
all_refs.update(universe.get("event_ids", []))
|
||||||
|
for code in [f"SG-{number:02d}" for number in range(2, 14)]:
|
||||||
|
for item in canonical[code].get("records", []):
|
||||||
|
for field, allowed in memberships.items():
|
||||||
|
missing = sorted(set(item.get(field, [])) - allowed)
|
||||||
|
if missing:
|
||||||
|
errors.append({"gate": "source_membership", "signal": code, "field": field, "missing": missing})
|
||||||
|
missing = sorted(set(item.get("negative_or_conflicting_refs", [])) - all_refs)
|
||||||
|
if missing:
|
||||||
|
errors.append({"gate": "source_membership", "signal": code, "field": "negative_or_conflicting_refs", "missing": missing})
|
||||||
|
if item.get("proof_grade") == "client_statement" and item.get("evidence_refs"):
|
||||||
|
errors.append({"gate": "meeting_only_promotion", "signal": code, "signal_id": item.get("signal_id")})
|
||||||
|
if item.get("meeting_clause_refs") and not item.get("evidence_refs") and item.get("proof_grade") != "client_statement":
|
||||||
|
errors.append({"gate": "meeting_only_grade", "signal": code, "signal_id": item.get("signal_id")})
|
||||||
|
activation = canonical["SG-01"]["domain_activation_manifest"]
|
||||||
|
for entry in activation.get("domain_entries", []):
|
||||||
|
for field in ("positive_refs", "negative_refs", "conflict_refs"):
|
||||||
|
missing = sorted(set(entry.get(field, [])) - all_refs)
|
||||||
|
if missing:
|
||||||
|
errors.append({"gate": "sg01_source_membership", "domain_id": entry.get("domain_id"), "field": field, "missing": missing})
|
||||||
|
|
||||||
|
for code, candidates in inputs.get("signal_candidates", {}).items():
|
||||||
|
expected_negative = {ref for item in candidates if isinstance(item, dict) for ref in item.get("negative_or_conflicting_refs", [])}
|
||||||
|
actual_negative = {ref for item in canonical.get(code, {}).get("records", []) for ref in item.get("negative_or_conflicting_refs", [])}
|
||||||
|
if not expected_negative.issubset(actual_negative):
|
||||||
|
errors.append({"gate": "negative_conflict_preservation", "signal": code, "missing": sorted(expected_negative - actual_negative)})
|
||||||
|
|
||||||
|
domain_membership_fields = {
|
||||||
|
"source_bo_ids": memberships["source_bo_ids"],
|
||||||
|
"related_bo_ids": memberships["source_bo_ids"],
|
||||||
|
"source_fact_ids": memberships["source_fact_ids"],
|
||||||
|
"evidence_refs": memberships["evidence_refs"],
|
||||||
|
"related_evidence_indexes": memberships["evidence_refs"],
|
||||||
|
"meeting_clause_refs": memberships["meeting_clause_refs"],
|
||||||
|
"law_version_refs": memberships["law_version_refs"],
|
||||||
|
"source_refs": all_refs,
|
||||||
|
"negative_or_conflicting_refs": all_refs,
|
||||||
|
}
|
||||||
|
|
||||||
|
def check_domain_node(node: Any, domain_id: str, at: str) -> None:
|
||||||
|
if isinstance(node, dict):
|
||||||
|
for key, value in node.items():
|
||||||
|
child_at = f"{at}.{key}"
|
||||||
|
if key in domain_membership_fields and isinstance(value, list):
|
||||||
|
missing = sorted({str(ref) for ref in value} - domain_membership_fields[key])
|
||||||
|
if missing:
|
||||||
|
errors.append({"gate": "domain_source_membership", "domain_id": domain_id, "path": child_at, "missing": missing})
|
||||||
|
elif key == "source_id" and value is not None and str(value) not in all_refs:
|
||||||
|
errors.append({"gate": "domain_source_membership", "domain_id": domain_id, "path": child_at, "missing": [str(value)]})
|
||||||
|
elif key == "bo_id" and value is not None and str(value) not in memberships["source_bo_ids"]:
|
||||||
|
errors.append({"gate": "domain_source_membership", "domain_id": domain_id, "path": child_at, "missing": [str(value)]})
|
||||||
|
check_domain_node(value, domain_id, child_at)
|
||||||
|
elif isinstance(node, list):
|
||||||
|
for index, value in enumerate(node):
|
||||||
|
check_domain_node(value, domain_id, f"{at}[{index}]")
|
||||||
|
|
||||||
|
for domain_id, payload in domain_payloads.items():
|
||||||
|
check_domain_node(payload.get("domain_signal_envelope", {}), domain_id, f"domain_signals.{domain_id}")
|
||||||
|
|
||||||
|
forbidden_conclusion_keys = {"final_conclusion", "final_legal_conclusion", "final_claim_amount"}
|
||||||
|
|
||||||
|
def check_forbidden_keys(node: Any, owner: str, at: str) -> None:
|
||||||
|
if isinstance(node, dict):
|
||||||
|
for key, value in node.items():
|
||||||
|
child_at = f"{at}.{key}"
|
||||||
|
if key in forbidden_conclusion_keys:
|
||||||
|
errors.append({"gate": "forbidden_conclusion_key", "error_code": "FORBIDDEN_CONCLUSION_KEY", "owner": owner, "path": child_at, "forbidden_key": key})
|
||||||
|
check_forbidden_keys(value, owner, child_at)
|
||||||
|
elif isinstance(node, list):
|
||||||
|
for index, value in enumerate(node):
|
||||||
|
check_forbidden_keys(value, owner, f"{at}[{index}]")
|
||||||
|
|
||||||
|
for code, payload in canonical.items():
|
||||||
|
check_forbidden_keys(payload, code, code)
|
||||||
|
for domain_id, payload in domain_payloads.items():
|
||||||
|
check_forbidden_keys(payload, f"domain:{domain_id}", f"domain_signals.{domain_id}")
|
||||||
|
|
||||||
|
views = {
|
||||||
|
"actio": _load(output_dir / COMPATIBILITY_FILES["actio"]),
|
||||||
|
"liability": _load(output_dir / COMPATIBILITY_FILES["liability"]),
|
||||||
|
"effect": _load(output_dir / COMPATIBILITY_FILES["effect"]),
|
||||||
|
}
|
||||||
|
derived = {
|
||||||
|
"actio": project_actio(domain_payloads),
|
||||||
|
"liability": project_case_liability(canonical["SG-05"], canonical["SG-08"]),
|
||||||
|
"effect": project_legal_effect(canonical["SG-13"]),
|
||||||
|
}
|
||||||
|
for key in views:
|
||||||
|
if views[key] != derived[key]:
|
||||||
|
errors.append({"gate": "compatibility_projection", "view": key})
|
||||||
|
|
||||||
|
listed_paths = set()
|
||||||
|
for entry in manifest.get("files", []):
|
||||||
|
relative = entry["path"]
|
||||||
|
listed_paths.add(relative)
|
||||||
|
path = output_dir / relative
|
||||||
|
if not path.exists() or _sha(path) != entry["file_sha256"]:
|
||||||
|
errors.append({"gate": "manifest_hash", "path": relative})
|
||||||
|
actual_paths = {
|
||||||
|
path.relative_to(output_dir).as_posix()
|
||||||
|
for path in output_dir.rglob("*.json")
|
||||||
|
if path.name != "signal_manifest.json"
|
||||||
|
}
|
||||||
|
if listed_paths != actual_paths:
|
||||||
|
errors.append({"gate": "manifest_file_set", "missing": sorted(actual_paths - listed_paths), "extra": sorted(listed_paths - actual_paths)})
|
||||||
|
|
||||||
|
writer_modules = detect_writer_modules(signals_root)
|
||||||
|
if writer_modules != ["compiler/transaction_writer.py"]:
|
||||||
|
errors.append({"gate": "canonical_writer_uniqueness", "writer_modules": writer_modules})
|
||||||
|
|
||||||
|
return {
|
||||||
|
"status": "PASS" if not errors else "FAIL",
|
||||||
|
"error_count": len(errors),
|
||||||
|
"errors": errors,
|
||||||
|
"schema_results": schema_results,
|
||||||
|
"canonical_writer_modules": writer_modules,
|
||||||
|
"manifest_entry_count": len(manifest.get("files", [])),
|
||||||
|
"source_membership_pass": not any(item.get("gate") in {"source_membership", "sg01_source_membership", "domain_source_membership"} for item in errors),
|
||||||
|
"domain_source_membership_pass": not any(item.get("gate") == "domain_source_membership" for item in errors),
|
||||||
|
"meeting_only_promotion_pass": not any(item.get("gate", "").startswith("meeting_only") for item in errors),
|
||||||
|
"negative_conflict_preservation_pass": not any(item.get("gate") == "negative_conflict_preservation" for item in errors),
|
||||||
|
"compatibility_projection_pass": not any(item.get("gate") == "compatibility_projection" for item in errors),
|
||||||
|
"manifest_hash_pass": not any(item.get("gate", "").startswith("manifest_") for item in errors),
|
||||||
|
"forbidden_conclusion_key_pass": not any(item.get("gate") == "forbidden_conclusion_key" for item in errors),
|
||||||
|
}
|
||||||
+30
@@ -0,0 +1,30 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""The only runtime file writer for canonical signals, views, and manifest."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import os
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Mapping
|
||||||
|
|
||||||
|
|
||||||
|
WRITER_ID = "Task_C_BO_S0_canonical_signal_compiler"
|
||||||
|
|
||||||
|
|
||||||
|
def write_transaction(output_dir: Path, payloads: Mapping[str, bytes]) -> None:
|
||||||
|
"""Write one deterministic transaction; emitters and projections perform no I/O."""
|
||||||
|
if len(payloads) != len(set(payloads)):
|
||||||
|
raise ValueError("DUPLICATE_TRANSACTION_PATH")
|
||||||
|
output_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
staged: list[tuple[Path, Path]] = []
|
||||||
|
for relative in sorted(payloads):
|
||||||
|
target = output_dir / relative
|
||||||
|
target.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
temporary = target.with_name(target.name + ".signal-tmp")
|
||||||
|
with temporary.open("wb") as handle:
|
||||||
|
handle.write(payloads[relative])
|
||||||
|
handle.flush()
|
||||||
|
os.fsync(handle.fileno())
|
||||||
|
staged.append((temporary, target))
|
||||||
|
for temporary, target in staged:
|
||||||
|
os.replace(temporary, target)
|
||||||
+30
@@ -0,0 +1,30 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""The only runtime file writer for canonical signals, views, and manifest."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import os
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Mapping
|
||||||
|
|
||||||
|
|
||||||
|
WRITER_ID = "Task_C_BO_S0_canonical_signal_compiler"
|
||||||
|
|
||||||
|
|
||||||
|
def write_transaction(output_dir: Path, payloads: Mapping[str, bytes]) -> None:
|
||||||
|
"""Write one deterministic transaction; emitters and projections perform no I/O."""
|
||||||
|
if len(payloads) != len(set(payloads)):
|
||||||
|
raise ValueError("DUPLICATE_TRANSACTION_PATH")
|
||||||
|
output_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
staged: list[tuple[Path, Path]] = []
|
||||||
|
for relative in sorted(payloads):
|
||||||
|
target = output_dir / relative
|
||||||
|
target.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
temporary = target.with_name(target.name + ".signal-tmp")
|
||||||
|
with temporary.open("wb") as handle:
|
||||||
|
handle.write(payloads[relative])
|
||||||
|
handle.flush()
|
||||||
|
os.fsync(handle.fileno())
|
||||||
|
staged.append((temporary, target))
|
||||||
|
for temporary, target in staged:
|
||||||
|
os.replace(temporary, target)
|
||||||
+81
@@ -0,0 +1,81 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Shared AST write-boundary detector used by the runtime gate and probes."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import ast
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
|
||||||
|
WRITE_FLAGS = frozenset("wax+")
|
||||||
|
|
||||||
|
|
||||||
|
def _name(node: ast.AST) -> str:
|
||||||
|
if isinstance(node, ast.Name):
|
||||||
|
return node.id
|
||||||
|
if isinstance(node, ast.Attribute):
|
||||||
|
prefix = _name(node.value)
|
||||||
|
return f"{prefix}.{node.attr}" if prefix else node.attr
|
||||||
|
return ""
|
||||||
|
|
||||||
|
|
||||||
|
def _constant_mode(call: ast.Call, *, builtin: bool) -> str | None:
|
||||||
|
positional_index = 1 if builtin else 0
|
||||||
|
if len(call.args) > positional_index:
|
||||||
|
value = call.args[positional_index]
|
||||||
|
if isinstance(value, ast.Constant) and isinstance(value.value, str):
|
||||||
|
return value.value
|
||||||
|
for keyword in call.keywords:
|
||||||
|
if keyword.arg == "mode" and isinstance(keyword.value, ast.Constant) and isinstance(keyword.value.value, str):
|
||||||
|
return keyword.value.value
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def classify_call(call: ast.Call) -> str | None:
|
||||||
|
name = _name(call.func)
|
||||||
|
if isinstance(call.func, ast.Name) and name == "open":
|
||||||
|
mode = _constant_mode(call, builtin=True)
|
||||||
|
return "open_write" if mode and WRITE_FLAGS.intersection(mode) else None
|
||||||
|
if isinstance(call.func, ast.Attribute) and (name == "open" or name.endswith(".open")):
|
||||||
|
mode = _constant_mode(call, builtin=False)
|
||||||
|
return "path_open_write" if mode and WRITE_FLAGS.intersection(mode) else None
|
||||||
|
if name == "write_text" or name.endswith(".write_text"):
|
||||||
|
return "write_text"
|
||||||
|
if name == "write_bytes" or name.endswith(".write_bytes"):
|
||||||
|
return "write_bytes"
|
||||||
|
exact = {
|
||||||
|
"os.replace": "os_replace", "os.rename": "os_rename", "os.write": "os_write",
|
||||||
|
"shutil.copy": "shutil_copy", "shutil.copy2": "shutil_copy2",
|
||||||
|
"shutil.copyfile": "shutil_copyfile", "shutil.move": "shutil_move",
|
||||||
|
}
|
||||||
|
if name in exact:
|
||||||
|
return exact[name]
|
||||||
|
if name.endswith(".commit") and ("temp" in name.lower() or "atomic" in name.lower()):
|
||||||
|
return "temp_commit"
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def scan_source(source: str, filename: str = "<memory>") -> list[dict[str, Any]]:
|
||||||
|
tree = ast.parse(source, filename=filename)
|
||||||
|
hits = []
|
||||||
|
for node in ast.walk(tree):
|
||||||
|
if isinstance(node, ast.Call):
|
||||||
|
family = classify_call(node)
|
||||||
|
if family:
|
||||||
|
hits.append({"family": family, "line": node.lineno, "column": node.col_offset})
|
||||||
|
return hits
|
||||||
|
|
||||||
|
|
||||||
|
def scan_tree(root: Path) -> list[dict[str, Any]]:
|
||||||
|
hits = []
|
||||||
|
for path in sorted(root.rglob("*.py")):
|
||||||
|
if "__pycache__" in path.parts:
|
||||||
|
continue
|
||||||
|
for hit in scan_source(path.read_text(encoding="utf-8"), str(path)):
|
||||||
|
hits.append({"path": path.relative_to(root).as_posix(), **hit})
|
||||||
|
return hits
|
||||||
|
|
||||||
|
|
||||||
|
def detect_writer_modules(root: Path) -> list[str]:
|
||||||
|
return sorted({hit["path"] for hit in scan_tree(root)})
|
||||||
+81
@@ -0,0 +1,81 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Shared AST write-boundary detector used by the runtime gate and probes."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import ast
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
|
||||||
|
WRITE_FLAGS = frozenset("wax+")
|
||||||
|
|
||||||
|
|
||||||
|
def _name(node: ast.AST) -> str:
|
||||||
|
if isinstance(node, ast.Name):
|
||||||
|
return node.id
|
||||||
|
if isinstance(node, ast.Attribute):
|
||||||
|
prefix = _name(node.value)
|
||||||
|
return f"{prefix}.{node.attr}" if prefix else node.attr
|
||||||
|
return ""
|
||||||
|
|
||||||
|
|
||||||
|
def _constant_mode(call: ast.Call, *, builtin: bool) -> str | None:
|
||||||
|
positional_index = 1 if builtin else 0
|
||||||
|
if len(call.args) > positional_index:
|
||||||
|
value = call.args[positional_index]
|
||||||
|
if isinstance(value, ast.Constant) and isinstance(value.value, str):
|
||||||
|
return value.value
|
||||||
|
for keyword in call.keywords:
|
||||||
|
if keyword.arg == "mode" and isinstance(keyword.value, ast.Constant) and isinstance(keyword.value.value, str):
|
||||||
|
return keyword.value.value
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def classify_call(call: ast.Call) -> str | None:
|
||||||
|
name = _name(call.func)
|
||||||
|
if isinstance(call.func, ast.Name) and name == "open":
|
||||||
|
mode = _constant_mode(call, builtin=True)
|
||||||
|
return "open_write" if mode and WRITE_FLAGS.intersection(mode) else None
|
||||||
|
if isinstance(call.func, ast.Attribute) and (name == "open" or name.endswith(".open")):
|
||||||
|
mode = _constant_mode(call, builtin=False)
|
||||||
|
return "path_open_write" if mode and WRITE_FLAGS.intersection(mode) else None
|
||||||
|
if name == "write_text" or name.endswith(".write_text"):
|
||||||
|
return "write_text"
|
||||||
|
if name == "write_bytes" or name.endswith(".write_bytes"):
|
||||||
|
return "write_bytes"
|
||||||
|
exact = {
|
||||||
|
"os.replace": "os_replace", "os.rename": "os_rename", "os.write": "os_write",
|
||||||
|
"shutil.copy": "shutil_copy", "shutil.copy2": "shutil_copy2",
|
||||||
|
"shutil.copyfile": "shutil_copyfile", "shutil.move": "shutil_move",
|
||||||
|
}
|
||||||
|
if name in exact:
|
||||||
|
return exact[name]
|
||||||
|
if name.endswith(".commit") and ("temp" in name.lower() or "atomic" in name.lower()):
|
||||||
|
return "temp_commit"
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def scan_source(source: str, filename: str = "<memory>") -> list[dict[str, Any]]:
|
||||||
|
tree = ast.parse(source, filename=filename)
|
||||||
|
hits = []
|
||||||
|
for node in ast.walk(tree):
|
||||||
|
if isinstance(node, ast.Call):
|
||||||
|
family = classify_call(node)
|
||||||
|
if family:
|
||||||
|
hits.append({"family": family, "line": node.lineno, "column": node.col_offset})
|
||||||
|
return hits
|
||||||
|
|
||||||
|
|
||||||
|
def scan_tree(root: Path) -> list[dict[str, Any]]:
|
||||||
|
hits = []
|
||||||
|
for path in sorted(root.rglob("*.py")):
|
||||||
|
if "__pycache__" in path.parts:
|
||||||
|
continue
|
||||||
|
for hit in scan_source(path.read_text(encoding="utf-8"), str(path)):
|
||||||
|
hits.append({"path": path.relative_to(root).as_posix(), **hit})
|
||||||
|
return hits
|
||||||
|
|
||||||
|
|
||||||
|
def detect_writer_modules(root: Path) -> list[str]:
|
||||||
|
return sorted({hit["path"] for hit in scan_tree(root)})
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Pure external emitter for SG-02; it performs no file I/O."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
from emitters.emitter_runtime import emit_code
|
||||||
|
|
||||||
|
|
||||||
|
def emit(inputs: dict[str, Any]) -> dict[str, Any]:
|
||||||
|
return emit_code("SG-02", inputs)
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Pure external emitter for SG-02; it performs no file I/O."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
from emitters.emitter_runtime import emit_code
|
||||||
|
|
||||||
|
|
||||||
|
def emit(inputs: dict[str, Any]) -> dict[str, Any]:
|
||||||
|
return emit_code("SG-02", inputs)
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Pure external emitter for SG-03; it performs no file I/O."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
from emitters.emitter_runtime import emit_code
|
||||||
|
|
||||||
|
|
||||||
|
def emit(inputs: dict[str, Any]) -> dict[str, Any]:
|
||||||
|
return emit_code("SG-03", inputs)
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Pure external emitter for SG-03; it performs no file I/O."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
from emitters.emitter_runtime import emit_code
|
||||||
|
|
||||||
|
|
||||||
|
def emit(inputs: dict[str, Any]) -> dict[str, Any]:
|
||||||
|
return emit_code("SG-03", inputs)
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Pure external emitter for SG-04; it performs no file I/O."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
from emitters.emitter_runtime import emit_code
|
||||||
|
|
||||||
|
|
||||||
|
def emit(inputs: dict[str, Any]) -> dict[str, Any]:
|
||||||
|
return emit_code("SG-04", inputs)
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Pure external emitter for SG-04; it performs no file I/O."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
from emitters.emitter_runtime import emit_code
|
||||||
|
|
||||||
|
|
||||||
|
def emit(inputs: dict[str, Any]) -> dict[str, Any]:
|
||||||
|
return emit_code("SG-04", inputs)
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Pure external emitter for SG-05; it performs no file I/O."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
from emitters.emitter_runtime import emit_code
|
||||||
|
|
||||||
|
|
||||||
|
def emit(inputs: dict[str, Any]) -> dict[str, Any]:
|
||||||
|
return emit_code("SG-05", inputs)
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Pure external emitter for SG-05; it performs no file I/O."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
from emitters.emitter_runtime import emit_code
|
||||||
|
|
||||||
|
|
||||||
|
def emit(inputs: dict[str, Any]) -> dict[str, Any]:
|
||||||
|
return emit_code("SG-05", inputs)
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user