docs(stage1): part 1~4 작업분석서 4종 작성 (Stage 2 명세 설계 입력) + MEMORY ㊳㊴
- Analysis_Doc_stage_1_part_{1..4}_investrigation_final.md:
DAG ASCII·task별 IO 전수·자산 표(.py/.txt 미러 병기)·sub-task 명칭/내역/목적·
upstream-downstream 연결 이유/방식/필드 소비
- part별 독립 검증자 전수 대조 통과(라운드 p1=2·p2=3·p3=1·p4=2, 최종 결함 0)
- MEMORY.md: ㊳ Part 4 신작 검증 왕복, ㊴ 분석서 4종 작성 기록
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1565,3 +1565,241 @@ v.2 §2 의 지정 4건만 수행. 산출:
|
||||
### 교훈
|
||||
1. **이력 절은 개서하지 않고 시효 주석으로 닫는다** — §8 라운드 기록의 현재형 서술이 낡았을 때 원문 교체는 이력 위조, 방치는 오독 — "(…는 2026-08-20 회차에서 삭제됐다)" 부가가 정답.
|
||||
2. **주석 확장(+2)과 코드 삭제(−2)가 상쇄돼도 중간 블록 행 범위는 이동한다** — A0/B 는 +2, R0 는 시작 +2·끝 0, R1 이후 무변. 파일 총행 무변을 "행 범위 무변"으로 착각하지 말 것.
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 2026-08-20 ㉗ — Default_Agent 프롬프트 크기 limit 삭제 (remove_limit_on_assets.md)
|
||||
|
||||
한 줄 요약: `Default_Agent/` 자산에서 `utf8_bytes`·`unicode_scalars` 상한만 삭제 — 보유 파일은 `stage1_runtime/` 3본뿐(정책 JSON 2행 + 컴파일러 py/txt 각 17행, 총 삭제 36행·추가 0), 구본은 `extension_research/assets_outdated/*_old.*` 보존, sub-agent 검증 1회차 PASS·결함 0.
|
||||
|
||||
- **삭제**: JSON `max_utf8_bytes: 96000` / `max_unicode_scalars: 24000` 2행. 컴파일러는 상한 조회 3행 + 판정·`raise PROMPT_SIZE_GUARD_EXCEEDED` 11행 + 매니페스트 `max_*` 2행·`"pass": not exceeded` 1행.
|
||||
- **존치**: 계측(`scalar_count`·`estimate`·매니페스트 `utf8_bytes`/`unicode_scalars`/`legacy_advisory_estimate`), 고지 문구 2종, 그리고 **실패코드 레지스트리**(`overflow_fail_code`·`fail_codes.prompt_size_guard_exceeded`) — 수치 상한이 아니므로 "limit 외 무단절" 제약상 사문으로 남김.
|
||||
- **검증**: `git diff --numstat` 세 파일 모두 insertions 0(삭제 전용·변경 헝크 0) · 구본에서 해당 행만 지운 결과가 개정본과 sha 완전 일치 · sub-agent가 scratchpad 사본에 한글 40,000자를 실제 투입해 구본 예외 발생 / 개정본 정상 완료를 실행 대조.
|
||||
- **미처리 이월 2건**: ① `Default_Agent/runtime_manifest.json` 1644–1653행이 개정 전 sha를 물고 있어 무결성 재계산 시 3건 실패(읽는 코드는 현재 없음, 갱신은 제약 위반이라 보류) ② 형제 배포 트리 3곳(`ver_8_yaml_candidates/Default_Agent_Stage_1`·`00_배포트리/…`·`선행구축/…`)은 limit 존치 — 지정 경로 밖이라 범위 제외.
|
||||
|
||||
### 교훈
|
||||
1. **설정 파일의 한도를 지워도 코드의 fallback 기본값이 한도를 되살린다.** 정책 JSON만 고쳤다면 `guard.get("max_utf8_bytes", 96000)`이 그대로 96,000을 강제했을 것 — "limit 삭제" 요청은 선언부와 강제부를 함께 훑어야 완결된다.
|
||||
2. **삭제 요청에서 "계측"과 "한도"를 가르는 선을 먼저 긋는다.** `utf8_bytes` 값 산출은 남기고 `max_utf8_bytes` 비교만 없애는 것이 관측성을 지키면서 요청을 정확히 이행하는 지점 — 이름이 비슷하다고 함께 지우면 무단 축소가 된다.
|
||||
3. **파생 필드는 원본 삭제 시 존치가 불가능할 수 있다.** `"pass": not exceeded`처럼 삭제 대상에만 의존하는 값은 남기려면 값을 **새로 지어내야** 하므로, 오히려 삭제가 "손대지 않는다" 제약의 준수 경로가 된다.
|
||||
4. **sha 장부(`runtime_manifest.json`)를 둔 트리에서는 어떤 파일 편집도 장부를 시효 만료시킨다.** 제약이 장부 갱신을 막으면 그 사실 자체를 이월 항목으로 명시해야 한다 — 조용히 두면 다음 무결성 검사에서 원인 불명 실패로 나타난다.
|
||||
|
||||
## 2026-08-20 ㉘ — runtime_manifest sha 갱신으로 limit 삭제 회차 봉인 (㉗ 이월 1건 해소)
|
||||
|
||||
한 줄 요약: ㉗에서 이월했던 `Default_Agent/runtime_manifest.json` 시효 만료를 해소 — 개정된 3본의 sha256만 재계산해 교체(3행 치환, 추가·삭제 0), 전체 432항목 재계산 결과 **해시 불일치 0**으로 복귀.
|
||||
|
||||
- **갱신 3건**: `stage1_runtime/prompt_compiler.py`·`.txt` `6922aa52…` → `d2f02564…`, `stage1_runtime/prompt_composition_policy.json` `06dbc4de…` → `8d3f003e…`. 값은 신뢰 없이 실물에서 재계산(스크립트가 `hashlib`로 직접 산출).
|
||||
- **편집 방식**: 절대 행번호가 아니라 `"path": "<rel>"` 앵커로 위치를 찾아 **바로 다음 sha256 행의 값 문자열만** 치환 — `git diff --numstat` 3/3(값 교체분), 다른 필드·순서·서식 무변. `entries` 432 / `runtime_artifact_count` 432 / `program_release_status` 전부 그대로.
|
||||
- **검증**: JSON 파싱 OK. 432항목 전수 재계산 → 일치 155 · **불일치 0** · 파일 없음 277. 155/0/277은 ㉖에서 기록한 트리 구성(교집합 155·불일치 0·277 무변)과 정확히 일치 — 즉 이번 갱신은 기존 장부 상태를 되돌린 것이지 새로 흔든 것이 아니다.
|
||||
- **백업 미생성(의도)**: 이 파일은 git 추적 중이고 편집 전 HEAD와 동일했으므로 `HEAD`가 원본 보존판이다. ㉗과 달리 사용자 지시에 백업 요건이 없어 `assets_outdated/`에 사본을 만들지 않았다.
|
||||
|
||||
### 교훈
|
||||
1. **sha 장부 갱신은 기존 값을 옮겨 적지 말고 실물에서 재계산한다.** 앞 회차 보고서·sub-agent 리포트에 적힌 해시를 복사하면 그 값이 틀렸을 때 장부가 틀린 채로 봉인된다 — 장부의 존재 이유(실물 대조)를 스스로 무력화하는 실수.
|
||||
2. **JSON 장부 편집은 파싱→재직렬화 대신 앵커 기반 행 치환으로 한다.** `json.load` 후 `json.dump`는 들여쓰기·키 순서·공백을 재작성해 무관한 400여 행을 diff에 올린다 — 값 하나 바꾸려다 리뷰 불가능한 변경이 된다.
|
||||
3. **장부 갱신 후에는 갱신 대상만이 아니라 전수 재계산으로 상태를 확인한다.** 155/0/277이 이전 회차 기록과 일치하는 것을 봐야 "되돌렸다"가 증명되고, 다른 항목까지 흔들렸는지도 같은 한 번에 걸러진다.
|
||||
|
||||
## 2026-08-21 special_law_profiles 자산 부재 판단서 (assets_special_law_problem.md)
|
||||
한 줄 요약: `stage_1_part_2_v.8.yml` 첫 task 실패의 유일한 실행 차단 원인은 **`Default_Agent/special_law_profiles/` 실물 부재 1건**이며, 함께 지적된 "인덱스 `[]` 불일치"와 "스키마 소문자 패턴"은 각각 미소비 필드·이미 수정된 과거 이력이어서 실행 차단이 아님을 실측으로 확정 — 산출물 `extension_research/assets_special_law_problem.md`.
|
||||
|
||||
- **실사용 SLP는 3종뿐**: `SLP-PRODUCT-LIABILITY`(E-06)·`SLP-IP`(E-20)·`SLP-MEDIA-MEDIATION`(E-21). `SLP-AUTO-DAMAGE`·`SLP-STATE-COMPENSATION` 은 `domain_slice.schema.v2.json:101` **주석 안에만** 존재하고, 주석이 말하는 "9종"과 `special_law_profiles/_registry_index.json` 은 릴리스에 실체가 없다 → "9종" 추종 금지, 3종만 신설.
|
||||
- **런타임이 이미 경로를 못박아 두었다**: `Stage_1_Registry_Runtime_v1.yml:473,492` 가 `Default_Agent/special_law_profiles/<ID>/prompt_overlay.md` 로 `--profile` 을 조립한다. 신설 자산은 이 경로·릴리스 루트 하위(`compile_fragments` 의 `relative_to(release_root)` 검사)·정규화 sha 상이(중복 시 dedup 탈락)를 지켜야 한다.
|
||||
- **raise 완화(2안) 기각 근거**: E-06 `seed_prompt_overlay.md:5,:34` 가 "제조물 사건은 이 profile 없이 종결 금지"를 프롬프트 본문에 명시 → 건너뛰면 프롬프트가 스스로 금지한 산출물이 나온다. 크기 가드(추정치 기반 보수 차단)와 달리 이 raise 는 법리 완결성 계약.
|
||||
- **콘텐츠 부담은 작다**: `ensemble_v2.md` 상 특별법은 도메인 payload 플래그이고 시행일·경과규정·버전 pinning 은 SG-04 가 흡수 → overlay 는 조문·요율·기간 상수 없이 식별단서/요건슬롯/review code/SG-04 경계선언만 담는 얇은 조각으로 족하다.
|
||||
|
||||
### 교훈
|
||||
1. **`registry_loader` 는 `config`(실물 로드본)와 `index_entry`(인덱스 원문)를 분리해 담고, 실행 경로는 전부 `config` 만 읽는다.** 인덱스 필드 불일치를 보고 "이것 때문에 죽는다"고 결론내기 전에 어느 쪽을 소비하는지부터 확인할 것 — 이번 건에서 인덱스의 `special_law_profiles: []` 는 아무 데서도 읽히지 않았다.
|
||||
2. **스키마의 `$comment` 는 결함 기록이지 현재 상태가 아니다.** `:101` 주석은 "소문자 패턴이라 거부됐다"지만 바로 아래 `:104` 패턴은 이미 `SLP-[A-Z]…` 를 받는다 — 주석을 근거로 수정 대상을 정하지 말고 패턴을 실제 값으로 매치 테스트해서 판정할 것.
|
||||
3. **선언·스키마·런타임 경로가 모두 갖춰졌는데 실물만 없는 유형의 장애는, 가드 완화가 아니라 자산 생성으로 닫는다.** 세 층이 일치한다는 것은 설계 의도가 확정돼 있다는 뜻이므로, 가드를 푸는 순간 세 층이 함께 거짓말을 하게 된다.
|
||||
|
||||
## 2026-08-21 special_law_profiles 검증·전략·실행 3연속 (v.2 리포트 → 전략서 → 자산 신설)
|
||||
한 줄 요약: v.1 판단서를 독립 재검증해 오류 3건을 정정한 `assets_special_law_problem_v.2.md`, DAG 기반 `special_law_profile_update.md` 전략서, 그리고 그 전략의 실제 실행(자산 5건 신설 + manifest 433) 까지 마쳐 **`stage_1_part_2_v.8.yml` 의 유일한 실행 차단이던 SLP 자산 부재를 해소**했다 — 조립·검증·봉인 스모크 전건 PASS.
|
||||
|
||||
- **v.2 가 정정한 v.1 오류 3건**: ① 카탈로그 위치 — `special_law_profiles/_registry_index.json` 을 "두면 경고 해소"가 아니다. validator 는 인덱스 `reference_catalogs` 맵이나 CLI 주입으로만 카탈로그를 알며, 참조본 A0 가 이미 `platform/reference_catalogs/profile_ids.json` 로 정본 위치를 확정해 뒀다. ② 봉인 위치 — manifest 는 `domain_config.json`·`seed_prompt_overlay.md`·`domains/_registry_index.json` 을 **원래 싣지 않는다**(domains/ 51건은 module_role_projection 25 + structure_types 25 + common_worker_contract 1). 봉인 동형 위치는 자산군 자체 인덱스의 `prompt_overlay_sha256`. ③ "3개 파일 sha 상이"는 하드 계약이 아니다 — dedup 스코프는 도메인 1개 컴파일 내부.
|
||||
- **신설 자산 5건**: overlay 3종(`SLP-PRODUCT-LIABILITY` 5652B / `SLP-IP` 5720B / `SLP-MEDIA-MEDIATION` 5605B), `special_law_profiles/_registry_index.json`(sha 봉인), `platform/reference_catalogs/profile_ids.json`(manifest 등재 +1, count 432→433). overlay 는 4절 골격(식별 단서 / 고유 요건 슬롯·증거 component / review code 발행 규칙 / SG-04 경계)으로 통일하고 법령 조문·요율·기간 상수는 0건(grep 검증).
|
||||
- **검증 실측**: E-06·E-20·E-21 컴파일 `rc=0`·profile 조각 rank 40 부착·dedup 탈락 0·마커 검증(회귀 대조 E-05 도 rc=0), validator closure `missing: []`·경고 54→51, manifest 전수 재계산 **156/0/277**(직전 155/0/277 +카탈로그 1).
|
||||
- **보류·별건**: G(절단 문자열 `SLP-PRODUCT-LIABI` 조사)는 `/Users/jsahn` 부재로 이 머신에서 수행 불가. H(인덱스 값 채움·스키마 주석)는 회귀 위험·드리프트 이유로 보류. 참조본 A0 요구 자산 3종(`registry_index.schema.json`·`domain_config.schema.json`·`signal_ids.json`) 여전히 부재.
|
||||
|
||||
### 교훈
|
||||
1. **프롬프트 조각을 새로 쓸 때 "어느 출력 key 에 담아라"는 도메인별로 확인해야 한다.** `routing/extension_payload_key_declarations.v1.json` 이 도메인별 key 화이트리스트이고 `additional_properties_allowed: false` 인데, `special_law_profile_candidates` 를 선언하는 건 **E-06 뿐**이다(E-20·E-21 미선언). 세 profile 에 같은 key 를 지시했으면 두 도메인 worker 출력이 스키마 위반이 됐다 — 조각의 문장 하나가 스키마 계약을 깨뜨릴 수 있다.
|
||||
2. **카탈로그·장부는 "파일을 만들었다"로 배선되지 않는다.** validator 의 kind 문자열은 `REFERENCE_FIELDS` 값(`special_law_profiles`)이어야 하며, 참조본 A0 의 `--reference-catalog profile=…` 표기로는 실제 주입해도 `unverified` 가 유지된다(경고 54 불변). 배선 성립 여부는 경고 개수 대조 같은 **실행 실측**으로만 확인된다.
|
||||
3. **위생 작업이 회귀를 만들 수 있으면 실행 이득과 비교해 보류한다.** 인덱스의 `special_law_profiles: []` 채움은 실행 경로에서 읽히지 않아 이득 0인데, 워크스페이스 `registry_index.schema.json` 이 slice 스키마와 같은 소문자 패턴 결함을 가지면 `[]` 로 통과하던 A0 검증이 새로 깨진다 — "고쳐 두면 좋은 것"이 순이익이 아닐 수 있다.
|
||||
|
||||
## 2026-08-21 ㉙ — Stage 1 Part 4 개정전략서 작성 (적대적 검증 12라운드 · 자발 중단)
|
||||
|
||||
한 줄 요약: `extension_research/stage_1_part_4_개정전략서.md`(1,363행 · 175KB) 신규 작성 — Part 4는 diff가 아니라 **신작**(구본 F0가 기대하는 LES 계약과 P3 v.8 실산출이 배열키·색인·레코드 필드 전부 불일치), 게이트는 **조립본 사이드카 25개(127규칙 · registry 121 전건 커버)를 바이트 복사 배포**해 창작 0으로 켠다. 적대적 sub-agent **12라운드** 후 **자발 중단** — 종료 조건이 도달 불가능함을 인지하고 미해결분을 §9 이월 14건 · §10 결선 4건으로 넘겼다.
|
||||
|
||||
- **핵심 설계**: task 3(F0 code · F1 LLM 조건부 · F2 code) · `Task_C_FL_*` 명명(P2 `Task_C_BO_*` · P3 `Task_C_LE_*` 계열) · 로직은 신설 모듈 `fact_ledger_compiler.py` + 정책 `fact_ledger_policy.v1.json`, YAML은 반입·게이트·봉인·기록만. 행 = **BO 1건당 1행**(`fact_id` = `F-{idx:03d}` 연속·경성 단언) · 구 4필드 → `domain_effects{도메인ID}` + `calculation_requests[]`(구 4필드는 한 버전 별칭 병기 = 29키).
|
||||
- **게이트**: registry 121 = **구현 25 · 가시화 96**(str 90 + boundary 6) · 사이드카 고아 6. dict `condition`은 6종 키(any_review 13 · required_slots 6 · calc_operand 6 · boundary 6 · `*_attempted` 6). 사이드카 방언 **17축** — 정규화 리더를 먼저 만들고 그 리더로 잰 값만 근거로 삼는다.
|
||||
- **골든 등가는 필드 4부류로 판정**: (가) BO 유래 **9** 값등가 · (나) LES·구signal 유래 **15** 재산출 대조 · (다) 증거 유래 **2** 값등가 · (라) 스켈레톤·게이트 **1** 차분 = 27, 무분류 0(`must_consider`는 (나)∩(라) 겸용). `EXPECTED_DELTA` **5건** 등록.
|
||||
- **결정적 실측 6건**: ① 구본 LES 계약 ≠ P3 v.8(배열키 `legal_effect_structures`→`structure_records` · 색인 5종→3종) ② `downstream_read_sets.part4_F0` = SG-04·06·07·10·11(`signal_compiler.py` 168행 ↔ 전략서 163행 2중 근거) ③ 사이드카 25가 **조립본에 실재**(dangling 아니라 미배포) ④ **골든 BO의 `Legal_Keywords`가 한국어 법률용어라 registry `type_id`와 교집합 0** → 부착 0/59 ⑤ **골든-S2에 SG-01(11도메인)·봉인 `signal_manifest`·SG 13종·봉투 11이 실물로 존재**(손합성 불필요) ⑥ `legacy_declaration_mismatches`는 파생 목록이고 **실제 자기선언 누락은 4건**(E-09·X2·X1·X3).
|
||||
|
||||
### 교훈
|
||||
1. **"검증 100% 통과까지 반복"은 종료 조건이 될 수 없다.** 적대적 검증자에게 "지적 0이라 쓰려면 25건 검증하라"고 요구하면 매 라운드 무언가가 나온다 — 종료는 **지적의 심각도 추이**로 판단해야 한다. 8~12라운드에서 BLOCKER가 3~5로 평평했던 것은 수렴이 아니라 **정체** 신호였고, 그때 멈췄어야 했다.
|
||||
2. **큰 문서는 고칠수록 새 불일치가 생긴다.** 1,300행을 넘기자 한 절의 수정이 그 절을 참조하는 다른 절과 어긋나는 국면이 왔다. 그래서 규율 14(처방이 닿을 자리를 전수로 훑는다)와 규율 5(같은 수치·이름의 모든 출현을 기계 대조)를 세웠고, 실제로 라운드 지적의 절반가량이 그 기계 대조만으로 사전 차단 가능한 것이었다.
|
||||
3. **자산이 이미 답을 갖고 있는데 요약본·이웃 파일만 보는 실수가 반복됐다** — 사이드카 "없음"(배포 트리만 봄) · 골든-S2 "손합성"(`ls` 안 함) · `legacy_declaration_mismatches`(파생 1건을 원본으로). **파생 목록을 근거로 쓰기 전에 원본을 전수로 다시 만들고, 픽스처를 합성하기 전에 그 디렉터리를 `ls` 한다.**
|
||||
4. **규칙을 문서에 실었으면 "그 문서만 보고 재구현했을 때 기준선이 재현되는가"를 재야 한다.** (다) 증거력 산정을 4갈래로 옮겨 적었다가 29/59, 발췌만 쟀다가 54/59가 나왔다. 최종적으로 (가) 531/531 · (다) 59/59 재현을 실측으로 확인하고서야 규칙이 닫혔다 — 이 확인을 §8 0c-1 단계로 넣었다.
|
||||
5. **등식은 차원을, 규칙은 피연산자의 단위를 확인하고 세운다.** 보존 등식이 "Σ 도메인 키 + BO 수 == 도달 총수"로 차원이 섞여 공집합 입력에서 즉사했고, 계산 등식은 행 항목 수와 원천 레코드 수를 한 식에 넣어 정상 실행에서 발화했다. 최종 5종으로 분리했다.
|
||||
|
||||
## 2026-08-21 ㉚ — 특별법 profile 배선 장애 수정 (A0 즉시 실패 → 26도메인 조립 성공)
|
||||
|
||||
한 줄 요약: 백엔드 `stage_1_part_2_v.8.yml` 첫 task `Task_C_BO_A0` 가 `RuntimeContractError: special-law profile prompt path missing: SLP-PRODUCT-LIABILITY` 로 즉사한 장애를 수정 — 원인은 **파일 부재가 아니라 인자 미전달**이었다. `collect_domain_fragments` 의 특별법 검사는 디스크를 보지 않고 호출자가 넘긴 `profile_paths` 에 키가 있는지만 보는데, YAML 이 그 인자를 아예 넘기지 않았다(전 파일에서 `profile_paths`·`special_law`·`SLP-` 출현 0). 적대적 sub-agent 2라운드(1차 FAIL → 2차 PASS·결함 0).
|
||||
|
||||
- **YAML 3곳**(`ver_8_yaml_candidates/stage_1_part_2_v.8.yml`, 35+/1-): ① 상수 `SPECIAL_LAW_INDEX` ② `stage_text(COMMON_CONTRACT)` 직전에 지도 구축 블록 27행 — profile registry 를 읽어 각 항목이 선언한 `prompt_overlay_path` 를 따라가 `stage_text` 로 반입하고 `{profile_id: 논리경로}` 를 채운다. 파일 이름을 짓지 않고 기존 도메인 overlay 루프의 규약(`startswith("Default_Agent/")` 가드 + `posixpath.join(dirname(...))` + NFC)을 그대로 복제 ③ 호출부 `profile_paths=profile_paths`.
|
||||
- **컴파일러**(`Default_Agent/stage1_runtime/prompt_compiler.py` + 바이트 동일 `.txt`, 13+/2-): 단일 모호 메시지를 두 갈래로 — 키 미전달(`not supplied by caller`, details 에 `supplied_profile_ids`) / 파일 부재(`file missing`, details 에 `resolved_path`, `is_file()` 신설).
|
||||
- **매니페스트 2줄**: `prompt_compiler.py|.txt` sha `d2f02564…` → `bfd80e90…`. **1차 검증 FAIL 의 유일한 사유가 이것이었다.**
|
||||
- **실측**: `assert_deployment()` 18자산 `unregistered/hash_mismatch/unreadable` 전부 공집합 PASS · `MODULE_MIRROR_HASH_MISMATCH` 없음 · 매니페스트 전수 **156/0/277**(직전 154/2/277) · **26 도메인 collect+compile 예외 0** · warn 0 · E-06 조각 6개(rank 40 에 `special_law_profile:SLP-PRODUCT-LIABILITY`) 조립 24,960 B, 조립 sha `29c0a24e…` · 무프로필 23 도메인 `specs`·`prompt_sha` 전건 불변 · E-20→SLP-IP, E-21→SLP-MEDIA-MEDIATION 부착.
|
||||
- **배치**: 수정본은 배포 위치에 제자리 overwrite, 수정 전 원본 4종은 `ver_8_yaml_candidates/outdated/*.pre_special_law_wiring.*`.
|
||||
- **이월**: ① **(높음) SLP 자산 4건이 `runtime_manifest.json` 미등재**(`grep -c special_law_profiles` → 0) — 훼손이 `assert_deployment()` sha 대조망에 안 걸린다. 등재 시 433→437 ② (중) 레지스트리 JSON 파손 시 `json.loads` 예외 미포착(480~481행, `try` 밖) — fail-closed 라 ①과 묶어 판단 ③ (낮음) 형제 배포 트리 드리프트: `ver_8_yaml_candidates/Default_Agent_Stage_1`·`00_배포트리/…` 는 `special_law_profiles/` 자체가 없고, `선행구축/Default_Agent_Stage_1` 은 46파일의 구 SLP 자산군(현행 3-profile 과 불일치) ④ (낮음) `stage1_runtime/__pycache__.zip` 릴리스 트리 오염, 556행 낡은 주석(상한 96,000 B) ⑤ 백엔드 `read_docs` 가 `special_law_profiles/` 를 실제 서빙하는지는 **실주행 1회로만 닫힌다**.
|
||||
|
||||
### 교훈
|
||||
1. **"파일이 있는데 없다고 한다"는 대개 경로 문제가 아니라 배선 문제다.** 검사 코드가 디스크를 보는지 인자를 보는지 먼저 읽어야 한다. `collect_domain_fragments` 는 `if profile not in profile_map` 이었고 `profile_map` 은 호출자가 채우는 dict 였다 — 파일 존재 여부는 애초에 검사 대상이 아니었으므로, 배포 트리를 아무리 확인해도 원인이 나오지 않는다. **에러 문구("path missing")가 가리키는 곳과 실제 검사 대상이 다를 수 있다.**
|
||||
2. **sha 장부를 둔 트리에서 파일 편집과 장부 갱신은 하나의 원자적 작업이다.** ㉗ 교훈 4를 알고 있었는데도 또 놓쳤고, 그 결과 **장애를 고친 게 아니라 더 이른 지점의 다른 장애로 바꿔 놓은** 상태로 1차 검증에 들어갔다(`assert_deployment()` 가 A0 `main()` 첫 문장이라 새 코드는 한 줄도 실행되지 않았다). "원인 해결 외 금지" 같은 좁은 지시 아래서도 **장부 갱신은 범위 밖이 아니라 원인 해결의 구성요소**다.
|
||||
3. **검증자에게 "고친 것"이 아니라 "고쳐졌다고 주장하는 것"을 주고 반증시켜야 한다.** 이번 1차 라운드는 내가 검증 항목에 넣지도 않은 매니페스트를 검증자가 스스로 의심해 잡아냈다. 반대로 2차에서는 검증자가 YAML 함수를 **AST 로 원문 추출해 그대로 실행**했다 — 손으로 옮겨 적은 재현은 옮겨 적는 과정에서 결함을 지울 수 있다.
|
||||
4. **회귀 검증의 대조군은 "안 건드린 것"에서 고른다.** 프로필 미선언 23개 도메인의 `specs`·`prompt_sha` 를 수정 전/후로 대조한 것이 이번 변경이 특별법 경로 밖으로 새지 않았음을 보인 가장 강한 증거였다. 고친 대상만 보면 "되더라"밖에 말할 수 없다.
|
||||
|
||||
## 2026-08-21 ㉛ — A0 fan-out 전달 계약 수정 (B worker 0개 생성 → 26개)
|
||||
|
||||
한 줄 요약: 실주행에서 A0 통과 후 `Task_C_BO_R0` 가 `read_docs failed for runtime/domain_seed_outputs/E-00.json` 로 죽은 장애를 수정 — 원인은 seed 파일 유실이 아니라 **도메인 worker 가 애초에 0개 생성된 것**. A0 반환 dict 에 `dynamic_fanout` 키 한 개 추가.
|
||||
|
||||
- **서버 로그 실측**(ssh hpserver `docker logs agent-backend`): `[TASK:*]` 태그가 A0·R0·R1 **셋뿐**, `Task_C_B_domain_worker_*` 인스턴스 0개. 결정적 한 줄 — `WARNING [FANOUT] 'Task_C_BO_A0…' produced no fan-out items; setting aggregate events for ['Task_C_B_domain_worker_*'] to unblock downstream`.
|
||||
- **원인**: 오케스트레이터 `agent.py:2328 _extract_fanout_items` 는 원천 task **반환 JSON 최상위 `dynamic_fanout` 리스트**(또는 최상위가 list)만 fan-out 항목으로 인정하고 파일은 보지 않는다. A0 는 계획을 `fanout/domain_fanout_plan.json` 에 쓰고 반환에는 `fanout_instance_count` 라는 **개수만** 실었다 → 항목 0 → 교착 회피 설계에 따라 wildcard 를 expanded 로 표시하고 aggregate event 를 set 해 **R0 를 그냥 통과**시켰다. R0 는 아무도 만들 지시를 받지 않은 seed 26개를 읽으러 가 첫 항목 E-00 에서 멈춘 것 — E-00 은 특별하지 않고 나머지 25개도 동일 부재.
|
||||
- **수정 1곳**(`ver_8_yaml_candidates/stage_1_part_2_v.8.yml` 739~750행, A0 `main()` 반환문): `"dynamic_fanout": plan_root.get("task_instances") or []` 추가 + 사유 주석 3행. 계획 파일 기록·스키마 검증·`fanout_instance_count` 는 불변. 새 로직 0 — `domain_fanout_planner.py:125-138` 의 `task_instances` 원소가 B 템플릿 참조 5필드(`task_instance_id`·`domain_id`·`slice_path`·`compiled_prompt_path`·`expected_output_path`)를 이미 정확히 채우고 `EXPECTED_OUTPUT_PATH_MISMATCH` 경성 검사까지 갖췄다.
|
||||
- **검증**: `code:` 블록 4개 전건 `ast.parse` PASS, A0 반환 dict 키를 **문자열 검색이 아니라 AST 로** 확인(10키, `dynamic_fanout` 포함).
|
||||
- **배치**: 수정본 제자리 overwrite, 수정 전 원본 → `ver_8_yaml_candidates/outdated/stage_1_part_2_v.8_Aug_21.yml`(sha `f1d8d043…`).
|
||||
- **미검증**: R0 이후 R1·F0·S0 는 이 워크스페이스에서 한 번도 실행된 적이 없다. 이 수정은 fan-out 장애를 제거할 뿐 Part 2 완주를 보장하지 않는다. Part 3 은 wildcard 가 없어 자체 결함은 없고, 입력(`BO.json`·`signals/*`)이 F0·S0 산출이라 Part 2 완주에 종속된다.
|
||||
|
||||
### 교훈
|
||||
1. **"파일이 없다"는 오류가 실제로는 "그 파일을 만들 작업이 실행된 적 없다"일 수 있다.** 소비자(R0)가 내는 메시지는 생산자 부재를 가리키지 못한다. 산출물 부재를 만나면 소비자 코드를 파기 전에 **생산자 task 가 로그에 실재하는지 먼저 세어야 한다** — `[TASK:*]` 태그 uniq -c 한 번이 이번 진단의 전부였다.
|
||||
2. **오케스트레이터가 task 간에 무엇을 어떻게 전달하는지는 YAML 이 아니라 백엔드 코드가 정한다.** A0 는 계획을 완벽히 만들어 파일로 남겼고 스키마 검증까지 통과했지만, 런타임 계약은 **반환 JSON 의 특정 키**였다. 자산·산출물 정합성만 검사하는 게이트는 이 종류의 불일치를 원리상 잡지 못한다.
|
||||
3. **교착 회피 설계는 실패를 성공처럼 보이게 만든다.** `unblock downstream` 은 멈추지 않기 위한 합리적 선택이지만, 그 결과 A0 는 성공으로 기록되고 장애는 두 task 뒤에서 무관해 보이는 모습으로 터졌다. 경고 로그가 유일한 단서였다 — **WARNING 을 읽지 않으면 원인 지점과 발현 지점이 영영 연결되지 않는다.**
|
||||
|
||||
## 2026-08-21 ㉜ — B worker 프롬프트 키 오선언 수정 (`prompt` → `prompts`, use_tools 추가)
|
||||
|
||||
한 줄 요약: ㉛ 수정으로 fan-out 은 성공(14항목→14인스턴스)했으나 `Task_C_B_domain_worker_0~13` 전건이 `LLM API 오류: contents are required` 로 즉사 — 원인은 B worker task 가 프롬프트를 **단수 `prompt:` 스칼라**로 선언한 것. 백엔드는 **복수 `prompts:` 리스트**만 읽는다.
|
||||
|
||||
- **서버 로그 실측**: `[FANOUT] produced 14 fan-out items → expanding` · `Expanded → 14 instances` (㉛ 수정 성립 확인). 이어 전 인스턴스 `ValueError: contents are required`, 그리고 `Current token count: 388 / 360,000` — 수백 행짜리 worker 프롬프트가 한 토큰도 안 실렸다는 증거.
|
||||
- **원인**: `agent.py` 1957·2903·3739행 모두 `prompts=config.get("prompts", [])`. 단수 `prompt` 를 읽는 코드는 **없다** → `contents` 빈 배열 → Gemini 거부. 같은 파일 R1 은 `prompts:` 형식이라 정상 동작했다.
|
||||
- **수정 2곳**(`ver_8_yaml_candidates/stage_1_part_2_v.8.yml` B worker 블록 758~889행): ① `prompt: |-` → `prompts:` / `- role: user` / `content: |-` (본문 115행은 +2 들여쓰기만, 공백 제외 전건 일치 확인 — 내용 불변) ② `use_tools: [localdocs]` 를 R1 과 동일 위치(llm_verbosity 다음)에 추가.
|
||||
- **use_tools 를 함께 넣은 이유**: `agent.py:2893-2897` — `use_tools` 리스트도 `tools: true` 도 없으면 `task_mcp_manager = None` 이라 MCP 도구가 **아예 전달되지 않는다**. worker 의 본무가 `write_file(overwrite=true)` 로 `{{item.expected_output_path}}` 를 쓰는 것이므로, 이것 없이는 `contents` 오류만 넘기고 R0 의 seed 부재로 되돌아간다.
|
||||
- **`preflight: true` 는 넣지 않았다**: `config.get("preflight", True)` — 기본값이 이미 True. 직전 답변에서 R1 대비 "세 가지가 없다"고 했으나 실제로 조치가 필요한 것은 두 가지였다.
|
||||
- **검증**: YAML 파싱 OK · B worker 키 10종 · 단수 `prompt` 잔존 false · `prompts` 1항목(role=user, content 5,492 B/115행) · `{{item.*}}` 5종 보존 · 전 task 중 단수 `prompt` 사용 0건 · `code:` 블록 4개 AST PASS.
|
||||
- **배치**: 제자리 overwrite, 수정 전 원본 → `outdated/stage_1_part_2_v.8_Aug_21_11pm.yml`(sha `abeaa8e7…`).
|
||||
- **미검증**: worker 가 실제로 산출 파일을 쓰는지, R1·F0·S0 가 도는지는 다음 실주행에서만 확인된다. 인스턴스 14개(도메인 26개 아님)는 활성화 도메인 수로 보이며 별건.
|
||||
|
||||
### 교훈
|
||||
1. **오케스트레이터가 읽는 키 이름은 YAML 작성자의 직관과 다를 수 있고, 틀려도 조용하다.** `prompt` 는 문법상 완전히 유효한 YAML 키라 파싱·스키마 검사를 전부 통과하고, 백엔드는 모르는 키를 그냥 무시했다. 발현은 두 단계 뒤 LLM 공급자의 `contents are required` 였다. **같은 파일에서 정상 동작하는 동종 task 와 키를 대조하는 것이 가장 빠른 판별법이다** — R1 과 나란히 놓자 즉시 드러났다.
|
||||
2. **토큰 카운트는 프롬프트 전달 여부의 직접 증거다.** `Current token count: 388` 한 줄이 "프롬프트가 안 실렸다"를 확정했다. 수백 행 프롬프트를 선언해 놓고 세 자리 토큰이면 렌더링·전달 어딘가가 끊긴 것이다.
|
||||
3. **기본값을 확인하지 않고 "없으니 추가"하면 불필요한 변경이 섞인다.** `preflight` 는 기본 True 라 추가가 무의미했다. 반대로 `use_tools` 는 없으면 도구가 0개가 되는 **의미 있는 부재**였다. 부재를 발견하면 그 필드의 **기본값부터 코드에서 확인**해야 추가할 것과 둘 것이 갈린다.
|
||||
|
||||
## 2026-08-22 ㉝ — 산출물 빈약 원인 2건 수정 (worker 모델 복원 + 프롬프트↔투영정책 정렬)
|
||||
|
||||
한 줄 요약: Part 2 실주행 성공했으나 결과물이 구버전보다 빈약(BO.json 11,602 B vs 이전 173,546 B, `Action`이 전부 `"event"|"state"`, `Legal_Keywords` 9건 모두 `[]`). 원인 두 가지를 실측으로 특정해 수정 — ① worker 모델이 최하위 등급 ② worker 프롬프트 출력 골격이 투영 정책의 1순위 출처 필드를 요구하지 않음.
|
||||
|
||||
- **실측 경로**: 문서는 저장 시 암호화라 디스크 직독 불가 → localdocs MCP 를 `clientInfo.user_id|workspace_id` 해시로 호출해 복호화본을 읽었다(워크스페이스는 `find -newermt` 로 특정: `31d5b916…/8b14bcb4…`).
|
||||
- **원인 ①**: v3 는 도메인 worker 5개가 전부 `gemini-3.1-pro-preview`(reasoning high). v.8 은 `Task_C_B_domain_worker_*` 가 `gemini-3.1-flash-lite` — v3 에서 flash-lite 는 단순 판정 R1(reasoning low) 전용 등급이었다. 실측: worker seed 13개 총합 **21,669 B**(이전 BO.json 하나의 1/8), 도메인당 후보 0~2건, **6개 도메인(E-06·E-07·E-08·E-11·X2·X3)은 후보 0건**, signal_manifest 29항목 중 record 보유 3개뿐(E-15:2·X1:4·lifecycle:6).
|
||||
- **원인 ② — 내가 앞서 낸 진단을 정정한다.** "F0 투영이 v3 시절 필드명을 읽어 스키마와 어긋난다"는 **틀렸다**. 매핑은 `bo_surface_projection_policy.v1.json` 에 새 스키마 기준(`bo_type`·`juristic_act_type`·`legal_effect_candidates[].type_id`·`time_facts`·`object_refs`·`amount_facts`)으로 이미 선언돼 있고, R0(1459·1546행)·F0(2142행)가 실제로 불러 정상 작동했다 — 실주행 review_handoff 에 `schema_field_fallback` **22건**이 규정대로 발행된 것이 증거다. 진짜 어긋난 곳은 **worker 프롬프트의 출력 골격**이었다: 스키마 18필드 중 `juristic_act_type`·`party_roles`·`time_facts`·`object_refs`·`amount_facts` 5종이 골격에 없고 `extensions` 는 `{}` 로만 제시돼, `action_summary`·`action_type` 을 요구하는 문장이 프롬프트 전체에 **0회**였다. 모델이 채울 자리를 안내받지 못했으니 폴백은 필연이었다.
|
||||
- **수정 2곳**(`ver_8_yaml_candidates/stage_1_part_2_v.8.yml`): ① 764행 모델 `flash-lite` → `pro-preview`(reasoning high 유지, 다른 task 모델 불변 — R1 은 flash-lite 그대로) ② worker 프롬프트 골격에 5필드 추가 + `extensions.domain_payload{action_summary, action_type}` 명시 + "투영 1순위 출처" 지시문(각 필드의 JSON 형태와 투영 대상 표기, 근거 없으면 비우고 review 남기라는 단서 포함).
|
||||
- **검증**: YAML 파싱 OK · 골격을 JSON 으로 파싱해 스키마 대조 → **후보 필드 18종, 스키마 밖 0, 누락 0** · 투영 1순위 출처 8종 **전건 포함** · `code:` 블록 4개 AST PASS · 프롬프트 7,167 B/132행.
|
||||
- **배치**: 제자리 overwrite, 수정 전 원본 → `outdated/stage_1_part_2_v.8_Aug_22_12am.yml`(sha `1f0b9a52…`).
|
||||
- **미검증**: 실주행 전. pro-preview 는 flash-lite 대비 비용·지연이 크므로 `max_concurrency: 8` 에서의 실행 시간과 rate limit 을 다음 회차에 관측할 것.
|
||||
|
||||
### 교훈
|
||||
1. **"어긋났다"를 코드에서 찾기 전에 그 계약을 선언한 자산이 있는지부터 확인한다.** F0 코드의 대체 체인(`seed.Action → action_summary → Action_proposal`)만 보고 스키마 불일치라 단정했으나, 그것은 정책이 명시한 **방어선**이었고 정본 매핑은 별도 JSON 자산에 있었다. 정책 파일을 먼저 읽었으면 오진을 피했다.
|
||||
2. **폴백이 조용하지 않게 설계돼 있으면 그 로그가 곧 진단서다.** `schema_field_fallback` 22건은 "투영기가 돌았고, 출처가 비었음을 알고 있다"를 동시에 말해 준다. 결과물만 보고 원인을 추정하기 전에 **파이프라인이 스스로 남긴 검토 기록을 먼저 세어야 한다.**
|
||||
3. **스키마가 필드를 정의해도 프롬프트가 보여주지 않으면 LLM 은 채우지 않는다.** 스키마·정책·프롬프트 세 곳이 같은 필드 집합을 말하는지 기계로 대조할 수 있다(이번에 골격 JSON ↔ 스키마 properties ↔ 정책 sources 3자 대조로 0/0/0 확인). 이 대조를 개정 절차에 넣으면 같은 종류의 누락이 재발하지 않는다.
|
||||
4. **모델 등급 강등은 스키마·게이트를 전부 통과하면서 품질만 떨어뜨린다.** 파이프라인은 "성공"으로 끝났고 무결성 검사도 전부 통과했다. 산출물 크기를 구버전과 대조하지 않았으면 발견되지 않았을 종류의 회귀다 — **개정 시 모델 배정표를 구버전과 나란히 비교하는 항목을 두어야 한다.**
|
||||
|
||||
## 2026-08-22 ㉞ — slice event 식별자를 정본으로 교체 (R0 오차단 해소)
|
||||
|
||||
한 줄 요약: R0 가 `BLOCK: E-01.E-01:001: source_refs outside Stage A universe: ['event:unidentified:0003','event:unidentified:0010']` 로 실패. 워커 잘못이 아니라 **A0 가 같은 자료를 두 산출물에 다른 식별자로 적어 놓은 것** — slice 는 `event:unidentified:NNNN`, manifest 는 `EVT-001-01`, **교집합 0**.
|
||||
|
||||
- **실측 진단**: 문제의 두 ref 는 워커가 받은 slice 의 `source_universe` 안에 **실재**했다(event_candidate 30건 전부 그 형식). 반면 R0 가 대조하는 `source_universe_manifest.event_candidate_ids` 는 84건 전부 `EVT-...-NN`. 30 vs 84 라는 숫자가 결정적 단서였다 — **30 은 증거 문서 수, 84 는 실제 event 후보 수**. 즉 slice 의 "event 후보"는 후보가 아니라 **문서 레코드가 후보로 오인된 것**이었다.
|
||||
- **기전**: A0 가 `compile_domain_slices(..., events_document)` 로 원시 `evidence_event_candidates.json` 을 넘겼고, `domain_slice_compiler._records` 가 문서-단위 `items` 30건을 후보로 집었다. 그 문서 객체에는 `candidate_id` 가 없으므로 `_record_id`(42행)의 폴백 `f"{kind}:unidentified:{index:04d}"` 가 30번 발화했다.
|
||||
- **왜 이제야 터졌나**: flash-lite 시절 워커는 event 후보를 거의 인용하지 못했다. pro-preview 로 바꿔 산출이 실해지자 곧바로 드러났다 — **신규 결함이 아니라 가려져 있던 결함의 노출**이다.
|
||||
- **수정 3곳**(`ver_8_yaml_candidates/stage_1_part_2_v.8.yml`, A0): ① `stage_a`·`source_manifest` 계산을 slice 컴파일 **앞으로** 이동(P-2a 주석) — slice 가 인용할 식별자의 정본이 `event_candidate_map` 이기 때문. 원래 자리에는 `write_doc` 2건만 남겼다(중복 계산 0, 호출 각 1회 확인) ② 후보 레코드 평탄화 `event_candidate_records = [... by_candidate_id.values() ...]` + 공집합 시 `PART2_EVENT_CANDIDATE_MAP_EMPTY` 경성 검사 ③ 컴파일러 인자를 `events_document` → `event_candidate_records`.
|
||||
- **맵을 통째로 넘기면 안 되는 이유(실측)**: `_records` 는 dict 를 받으면 `("by_evidence_index","by_event_candidate_id","by_id")` 순으로 보는데, 맵의 실제 키는 **`by_candidate_id`** 이고 `by_evidence_index` 는 값이 id 리스트라 먼저 걸려 **빈 목록**을 돌려준다(첫 시도에서 0건 재현). 평탄화 목록으로 넘겨야 한다.
|
||||
- **검증(서버 실행)**: 정본 84 · 평탄화 84 · `_records` 84 · `_record_id` → `EVT-001-01…` · **정본과 교집합 84/84** · `unidentified` 잔존 0 · **R0 검사 재현 `set(ids) <= canon` = True**. YAML 파싱 OK, `code:` 블록 4개 AST PASS, 정의/사용 순서 633·641 → 645 → 707·708.
|
||||
- **부수 이득**: 후보 레코드는 문서 레코드보다 훨씬 풍부하고 **84/84 가 `action_summary` 를 보유**한다 — ㉝에서 프롬프트에 요구를 추가한 투영 `Action` 의 1순위 출처가 이제 slice 안에 실제로 존재한다.
|
||||
- **배치**: 제자리 overwrite, 수정 전 원본 → `outdated/stage_1_part_2_v.8_Aug_22_1am.yml`(sha `eb713b19…`).
|
||||
|
||||
### 교훈
|
||||
1. **"universe 밖" 오류를 만나면 워커를 의심하기 전에 두 universe 가 같은 것인지부터 본다.** 검사자와 피검사자가 서로 다른 목록을 보고 있으면, 규율을 완벽히 지킨 산출물도 100% 차단된다. 이번엔 워커가 받은 slice 안의 값을 인용했는데도 차단됐다.
|
||||
2. **개수 불일치는 형식 불일치보다 먼저 눈에 띄는 단서다.** 30 vs 84 를 보고 "형식이 다르다"가 아니라 "**차원이 다르다**(문서 vs 후보)"를 읽어야 진짜 기전에 닿는다. 형식만 맞추려 했으면 문서 30건에 EVT 번호를 붙이는 잘못된 수정을 했을 것이다.
|
||||
3. **식별자 폴백은 침묵하는 오염원이다.** `f"{kind}:unidentified:{index:04d}"` 는 예외를 던지지 않고 그럴듯한 문자열을 만들어 하류로 흘린다. 정본이 없으면 만들어 내지 말고 멈추는 편이 낫다 — 이번 수정에 공집합 경성 검사를 함께 넣은 이유다.
|
||||
4. **모델을 강화하면 숨어 있던 계약 위반이 드러난다.** 능력이 낮은 모델은 계약을 적게 건드리므로 결함도 적게 노출한다. **품질 개선 직후의 새 실패는 회귀가 아니라 발굴일 가능성을 먼저 검토해야 한다.**
|
||||
|
||||
## 2026-08-22 ㉟ — worker 프롬프트에 스키마 어휘·객체 형태 명시 (S0 enum 게이트 실패 해소)
|
||||
|
||||
한 줄 요약: S0 가 `S0_SIGNAL_GATE_FAILED` 로 실패(E-13 4건·X3 2건, `evidence_slot_status[].status` outside enum). 원인은 ㉝와 같은 계열 — **스키마가 값을 정의해도 프롬프트가 보여 주지 않으면 모델이 지어낸다.** 전수 대조로 enum 8곳·엄격 객체 6종을 한 번에 안내했다.
|
||||
|
||||
- **실측**: 정본 enum 은 `filled|partial|missing|conflicted`. 워커 산출은 E-13 이 `supported`·`missing_required`(소문자), X3 가 `SUPPORTED`(대문자) — **도메인마다 제각각**이고 6건 전부 enum 밖. 프롬프트 본문에서 `filled`·`partial`·`conflicted` 각 **0회**.
|
||||
- **R0 를 통과한 이유**: R0 검증기가 `schema_subset_validator`, 곧 스키마 **부분집합만** 본다. enum·additionalProperties 위반은 마지막 S0 게이트에서야 걸린다.
|
||||
- **전수 대조로 드러난 더 큰 구멍**: 시드 스키마 enum 선언 **8곳 전부** 안내 누락이었다. 나아가 `element_fact_candidates`·`opposing_fact_candidates`·`defense_candidates` 는 `additionalProperties: false` 에 필수 키가 `source_id`·`source_kind` 인데, 워커는 `{slot_id, fact, source_refs}` 를 내고 있었다 — **키 3개 전부 스키마 밖, 필수 2개 전부 누락**. enum 만 고쳤으면 다음 회차에 확실히 다시 실패했을 자리다.
|
||||
- **수정 1곳**(`ver_8_yaml_candidates/stage_1_part_2_v.8.yml`, worker 프롬프트 — ㉝의 "투영 1순위 출처" 블록 뒤): ① 스키마 고정 어휘 5종(seed `status` 5값 · `evidence_slot_status.status` 4값 + 판단 기준 · `calculation_requests.completeness` 4값 · `severity` 4값 · `source_kind` 10값) ② `additionalProperties: false` 인 객체 6종의 정확한 형태와 필수 키 — 특히 세 후보 배열에 "`slot_id`·`fact` 같은 키는 없다, 슬롯 판정은 `evidence_slot_status[]` 가 맡는다"를 명시 ③ "R0 검증기는 부분집합만 보므로 여기서 틀려도 그 단계에서는 안 걸린다"를 프롬프트에 적어 모델이 R0 통과를 안전신호로 오해하지 않게 했다.
|
||||
- **검증(기계 대조)**: 스키마에서 enum 선언을 전수 추출해 프롬프트 포함 여부 대조 → **8/8 안내, 누락 0**. 엄격 객체 6종의 `required` 키 전건 포함(1차 수정 후 `calculation_domain`·`reason` 2개가 남아 2차로 보완). YAML 파싱 OK, `code:` 블록 4개 AST PASS. 프롬프트 7,167 → **9,198 B / 157행**.
|
||||
- **배치**: 제자리 overwrite, 수정 전 원본 → `outdated/stage_1_part_2_v.8_Aug_22_9_45am.yml`(sha `5e2166ee…`).
|
||||
- **이월**: R0 검증을 부분집합이 아니라 전체 스키마 검증으로 올리면 이 계열 결함이 워커 단계에서 즉시 잡힌다. 다만 R0 의 실패 정책·재시도 설계를 함께 바꿔야 하므로 별건이다.
|
||||
|
||||
### 교훈
|
||||
1. **같은 결함이 세 번 반복됐다(㉜ 키 이름 · ㉝ 필드 누락 · ㉟ 어휘·형태 누락).** 공통 뿌리는 "계약을 선언한 자산과 그 계약을 이행할 프롬프트가 따로 관리된다"는 것이다. 개별 수정이 아니라 **스키마에서 프롬프트 안내를 기계로 대조하는 절차**가 필요하다 — 이번에 쓴 대조(enum 전수 추출 → 프롬프트 포함 여부, `required` 키 → 포함 여부)를 개정 체크리스트로 고정할 것.
|
||||
2. **한 건이 보고되면 같은 종류를 전수로 훑고 나서 고친다.** 보고된 것은 `evidence_slot_status.status` 하나였지만 실제로는 enum 8곳 + 객체 형태 6종이 뚫려 있었다. 보고된 것만 고쳤으면 최소 두 회차를 더 돌았다.
|
||||
3. **느슨한 검증기는 결함을 없애지 않고 뒤로 미룬다.** `schema_subset_validator` 가 R0 에서 통과시킨 값이 S0 에서 경성으로 막혔다. 검증을 어디서 얼마나 하느냐가 곧 "결함이 어느 task 에서 터지느냐"를 정한다 — 원인 지점과 발현 지점이 멀어질수록 진단 비용이 커진다.
|
||||
|
||||
## 2026-08-22 ㊱ — R0 시드 수용(admission) 도입: 전체 스키마 검증에 등급을 주다
|
||||
|
||||
한 줄 요약: "R0 검증을 부분집합에서 전체로 올린다"는 이월을 실행했는데 **전제가 틀렸다 — 전체 검증은 이미 돌고 있었다.** `worker_output_validator` 가 `schema_subset_validator.validate` 로 전 계약을 검사하고, R0 가 그 결과를 `guard_warnings` 로 강등하고 있었다(14도메인 실측 **1,151건**). 그래서 한 일은 검증을 켜는 것이 아니라 **이미 나오던 결과에 처분을 주는 것**이었다. 적대적 sub-agent **3라운드**(FAIL 결함 8 → FAIL 결함 4 → PASS 결함 0).
|
||||
|
||||
- **신설 자산** `Default_Agent/stage1_runtime/seed_admission_policy.v1.json`(매니페스트 433→434, A0 `PART2_REQUIRED_ASSETS` 등재로 게이트 19자산): 처분표 38코드 · `enum_synonyms` 8경로 · `required_derivation` 29 · `surplus_sink` · `quarantine_budget` · `enforcement: shadow|enforce`. 정책 선언·코드 실행 분리는 `bo_surface_projection_policy` 관용을 따랐다.
|
||||
- **R0 수용 기계**(약 300행): 검증 → 처분(block·quarantine·review·repair) → 복구 → 재검증을 수렴까지(최대 12패스, 실측 12=40 동일 수렴). 복구 4종 — `normalize`(동의어+대소문자 접기) · `derive`(constant/from_context/universe 조회/패턴/**rename_sibling**) · `harvest`(자유 공간 이관 + **별칭 승격**) · `evict`.
|
||||
- **최종 실측(14도메인 실데이터)**: 위반 1,151 → **잔여 24건, 전부 `review` 로 선언된 것**. 후보 48 전건 수용 · 격리 0 · 중단 0 · **선언 48 = 수용 48 + 격리 0** · 정보 소실 **3건**(전부 enum 정규화 원값으로 `received` 보존) · 결정적 · 전 도메인 0.08s.
|
||||
- **파괴 시험 6종 전부 의도대로**: `bo_type=dict` → 그 후보만 격리하고 47건 투영 완주 / `seed_id` 위반 → 삭제 아닌 격리 / 뿌리 `schema_version` 훼손 → block / 표에 없는 enum → 회차 계속 / 격리율 0.9375 → `BUDGET_EXCEEDED` / shadow → 원본 14/14 불변.
|
||||
- **하류 실질 보존(어댑터 실행 대조)**: `s3_domain_seed_adapter` SG-05 status `{inferred:133}` → `{inferred:104, supported:13, active:7}`, `slot_id=unknown_slot` 8 → **0**. 개정 전에는 어댑터가 아무것도 못 읽었다.
|
||||
- **1차가 잡은 치명 2건**(둘 다 개정의 존재 이유를 무너뜨렸다): ① `admit_seed` 가 `worker_validator` 를 전역으로 읽는데 그 이름은 `main()` 지역 → 정상 배포에서 첫 도메인 `NameError` 즉사(인자 주입으로 해소) ② `sink[norm]=moved` 가 인덱스를 접은 경로를 키로 써 같은 경로 두 번째 값부터 조용히 덮음 → **정보 74건 소실**(오국한·김선웅·흑석동 상가·포천시 임야…). 후보 보관을 `{path, source_path, value}` **덧붙이기 전용 목록**으로 바꾸고 보관처가 없으면 지우지 않도록 해 **74 → 3건**.
|
||||
- **2차가 잡은 4건**: `VALIDATOR_CRASHED` 의 path 가 뿌리라 격리가 집행되지 않고 투영에서 다시 죽던 것(후보별 재검증으로 범인을 좁히고, 못 좁히면 `VALIDATOR_CRASHED_ROOT`→block) / 회계 검사가 수용 **후** 배열을 "선언 수"로 세어 **항등식**이 된 죽은 검사(후보 36개가 사라져도 무반응 → 기준을 수용 전으로) / 보관 항목에 원본 경로 부재로 역할 결합(채권자↔채무자) 복원 불가 / `registered` 상수 파생이 registry 로 판정 가능한 사실을 단언.
|
||||
- **3차가 잡은 1건**: 회계 누적이 `if worker_validator is not None:` 안에 있어 검증기 부재 시 `lost:-48` 헛발동. 분기 밖으로 이동.
|
||||
- **검토 등급 분리**: 기계적 키 이동 1,207건(SOFT)과 **객체째 밀려난 실질 서술 13건(HARD, `seed_admission_content_evicted`)** 을 나눴다. 판정을 `isinstance(moved, dict)` 로 좁힌 것이 핵심 — 스칼라까지 포함하면 467건(38%)이 걸려 등급이 신호를 잃는다. 스칼라 329건은 `source_path` 100% 보유라 기계 복원이 되므로 사람 검토가 불필요하다.
|
||||
- **자진 신고**: 투영부 방어를 넣을 때 `replace(..., 1)` 로 첫 출현을 쳐서 **F0 에 들어갔다**. 실제 사망 지점은 R0 `project_to_bo_surface` 였고, 스스로 발견해 R0 에도 넣었다(F0 것도 같은 잠재 결함이 있어 존치, 정상 문자열 경로 48/48 불변 확인).
|
||||
- **배치**: 제자리 overwrite, 수정 전 원본 → `outdated/stage_1_part_2_v.8_Aug_22_15_35am.yml`(sha `39e5e151…`). 변경 A0 1헝크 · F0 1헝크(+7행) · R0 7헝크, **worker·R1·S0 추가삭제 0행**.
|
||||
- **이월**: ① **서버 배포 필요** — 새 정책과 434 매니페스트를 올려야 A0 게이트를 지난다(서버 433, 자산 미배포) ② **첫 실전은 `shadow`** 로 기록만 받고 확인 후 `enforce` ③ **스키마 개정**: `party_refs` 패턴 `^[A-Za-z]…$` 가 한글을 배제해 `party_roles` 66/66 이 빈 배열로 남고 하류 `projections.py:82` 가 "당사자 없음"을 읽는다 — 복구기가 아니라 스키마 문제 ④ SOFT 1,207건을 도메인·경로별 집계로 접는 것은 다음 회차 의제.
|
||||
|
||||
### 교훈
|
||||
1. **"켜야 한다"고 말하기 전에 이미 켜져 있는지 본다.** 나는 두 번이나 "부분집합 검증을 전체로 올리자"고 답했지만 전체 검증은 처음부터 돌고 있었고 결과가 버려지고 있었다. 검증기 이름(`schema_subset_validator`)이 실제 능력(enum·additionalProperties 지원)과 달라 오해를 굳혔다 — **이름이 아니라 호출부와 반환값 처리를 읽어야 한다.**
|
||||
2. **엄격하게 만드는 개정은 "그냥 켜면" 100% 실패한다.** 켜기 전에 위반을 전수로 세어야 규모를 안다(1,151건). 그 수를 몰랐으면 복구 계층 없이 켰을 것이고 전 도메인이 즉사했다.
|
||||
3. **정보 보존은 "옮겼다"로 끝나지 않는다 — 옮긴 자리를 하류가 읽어야 보존이다.** 첫 판은 바이트를 옮기면서도 어댑터가 못 읽는 키를 썼고, 같은 키로 덮어써 74건을 실제로 잃었다. **덧붙이기 전용 자료구조는 이 계열 사고를 규율이 아니라 형태로 막는다.**
|
||||
4. **지표가 0이면 좋아할 것이 아니라 그 경로가 도달 가능한지부터 확인한다.** 1차 판에서 "격리 0"은 안전이 아니라 격리 경로가 죽어 있고 `evict` 가 후보를 조용히 지우고 있다는 신호였다. **회계 항등식(선언 = 수용 + 격리)** 을 두면 이런 누수가 드러난다 — 단, 그 항등식이 양변에 같은 값을 놓지 않는지도 확인해야 한다(2차 결함이 정확히 그것이었다).
|
||||
5. **등급으로 덮을 문제와 스키마로 고칠 문제를 섞지 않는다.** 당사자 이름 85건을 HARD 로 올려도 `party_refs: []` 레코드는 고쳐지지 않는다. 복구기가 감당할 수 있는 것과 계약 자체를 고쳐야 하는 것의 경계를 그어야 검토 채널이 소음이 되지 않는다.
|
||||
6. **`replace(..., 1)` 은 같은 패턴이 여러 task 에 있는 파일에서 위험하다.** 투영부 방어가 F0 로 갔고, 스스로 잡지 않았으면 "적용 완료"로 보고했을 것이다. **치환 후에는 들어간 줄이 어느 task 범위인지 기계로 대조**한다(헝크 행번호 ↔ task 경계).
|
||||
|
||||
## 2026-08-22 ㊲ — 시드 신선도를 워커 자기신고에서 실물 근거로 (echo 4등급 분리)
|
||||
|
||||
한 줄 요약: R0 가 `ValueError: E-00: stale seed output: slice_sha256 mismatch` 로 회차 전체를 죽였다. **시드는 낡지 않았다** — 모델을 거치지 않는 실물 두 값(계획서 sha ↔ R0 가 직접 읽은 문서 sha)이 `54ae4e6b…` 로 일치했다. 워커 한 명의 전사 실수가 회차를 죽인 것. 신선도 판정을 실물로 옮기고 echo 불일치를 4등급으로 갈랐다. 적대적 sub-agent **4라운드**(FAIL BLOCKER → FAIL 4건 → FAIL 1건 → PASS 결함 0).
|
||||
|
||||
- **원인 확정**: E-00 이 낸 `de582c93…b15d` 는 슬라이스의 `.stage_b_domain_slice.activation.activation_manifest_sha256`(전체 64자 경로 탐색). 프롬프트는 `"slice_sha256": "{{item.slice_sha256}}"` 로 **정답을 직접 주고 13/14 가 그대로 복사**했다. 결정적 사실 — **그 값은 14개 슬라이스 전부에 같은 값**이라 어느 도메인에서든 재발 가능했다(내 첫 진단은 "E-00 슬라이스에 마침 있었다"로 위험을 과소평가했다).
|
||||
- **수정 3곳**(`ver_8_yaml_candidates/stage_1_part_2_v.8.yml`, R0 3헝크 + worker 프롬프트 1헝크): ① `validate_seed_object` 의 `raise ValueError` 제거 → `echo_mismatches` 수집 ② 호출부에 **R0-7a 실물 대조**(`plan.slice_sha256` ↔ `hashlib.sha256(read_raw(slice))`) → 어긋나면 `PART2_SLICE_STALE` 경성 ③ **R0-7b echo 4등급**.
|
||||
- **4등급(분기 순서가 곧 설계다)**: `FOREIGN_SLICE`(남의 slice·compiled sha → **block**, 실물 대조로는 원리상 못 잡는 "엉뚱한 자료로 작업") → `UNVERIFIABLE`(원문 못 읽음 → **quarantine**) → `SHA_MISMATCH`(그 도메인 `activation_manifest_sha256` = 값으로 식별되는 알려진 오집합 → **review**) → `UNEXPLAINED`(설명 안 됨 → **quarantine**). 정책 `disposition_by_code` 등재 + 코드 내 동일 안전 기본값.
|
||||
- **실측(14도메인, 주입 0·배포본 그대로)**: 기준선 완주 14/14 · 중단 0 · E-00 만 review. 파괴 10종 전수 — 슬라이스 변조/계획서 변조 → `PART2_SLICE_STALE`, 남의 slice·compiled sha → block(읽기 상태 3종 모두 유지), 부재 → quarantine, 정책 승격·강등 양방향 작동. sha 28개 전부 고유(오탐 0).
|
||||
- **정본 기준선(회귀 감시용 고정값)**: `input 40 · ledger 40 · declared 40 = admitted 40 + quarantined 0 · 소실 0 · review_items 624 · exception 1 · admission_records 498(review 252/derive 130/harvest 116) · echo 1`. 매니페스트 434 · 157/0/277. A0·R1·F0·S0 IDENTICAL.
|
||||
- **4라운드가 잡은 것**: D1 **BLOCKER — `sha_text` 가 A0 전용인데 R0 에서 호출**(정상 배포에서 첫 도메인 즉사) / D2 슬라이스 부재 시 신선도 무방비 / D3 봉투 변경 시 `allowed_bo_types` 조용한 소실 / D4·D6 시그니처 기본값 보고 불일치 / D5 프롬프트 값 자리 자기모순 / D7 sha 중복 오탐 / D8 등급 순서 역전 / D9 분기 순서 충돌. 전부 닫혔다.
|
||||
- **배치**: 제자리 overwrite, 수정 전 원본 → `outdated/stage_1_part_2_v.8_Aug_22_21h_30m.yml`(sha `457213002af84759`).
|
||||
- **이월**: ① **서버 배포**(policy + manifest 434) — 코드는 구 policy 로도 안전 기본값으로 완주하나, 정책으로 등급을 조정하려면 선결 ② 실주행 첫 회차에 `SEED_ECHO_*` 4종 분포 확인 — 프롬프트 개정이 먹혔으면 echo 0 이어야 하고, 여러 도메인에 `UNEXPLAINED` 가 뜨면 골격 해석이 흔들린 것 ③ 집계 시 `UNVERIFIABLE` 과 `UNEXPLAINED` 는 합산해 읽을 것(원문을 못 읽으면 원인을 단정하지 않으므로).
|
||||
|
||||
### 교훈
|
||||
1. **내 검증 하네스가 결함을 가렸다 — 이번 회차 최대 실패.** `sha_text` 가 배포본에 없는데 하네스가 그 이름을 주입해 놓고 "동작 확인"이라고 보고했다. `ast.parse` 는 이 계열을 **원리적으로** 못 잡는다. 두 가지를 규약으로 못박았다 — **주입 없이 배포본을 그대로 태울 것**, **미정의 전역명 검사(symtable)를 AST 와 나란히 돌릴 것**. 뒤이은 라운드에서 이 검사가 즉시 0/1 을 판정했다.
|
||||
2. **모델의 자기 신고를 게이트의 유일한 근거로 쓰면 전사 실수가 곧 회차 사망이다.** 같은 사실을 확인할 **물리적 경로가 있는데도** 신고에 의존하고 있었다. 게이트를 세울 때 "이 값을 모델을 거치지 않고 확인할 수 있는가"를 먼저 물어야 한다.
|
||||
3. **그렇다고 신고를 버리면 안 된다 — 강등이지 폐기가 아니다.** 실물 대조는 "무엇이 거기 있는가"만 답하고, echo 는 "워커가 무엇을 읽었는가"에 대한 **유일한 증거**다. 워커가 남의 슬라이스를 읽고 정직하게 echo 하면 실물 대조로는 원리상 못 잡는다. 그래서 echo 를 경성 게이트에서 검토 신호로 내리되 **남의 자료 sha 는 block 으로 남겼다.**
|
||||
4. **판정 근거의 정보량을 따져야 등급이 선다.** `activation_manifest_sha256` 은 전 도메인이 공유해 "어느 슬라이스를 읽었는지"에 **0비트도 기여하지 않는다.** 그래서 실물 대조가 불가한 상태에서는 그것을 근거로 강등할 수 없다(D9). 등급 체계에서 분기 **순서**가 곧 "무엇을 더 신뢰하는가"의 선언이다.
|
||||
5. **프롬프트에 규칙을 값 자리에 복제하지 않는다.** 정답 리터럴 옆에 "그대로 옮겨라"를 붙인 것은 자기모순이었다 — 지시를 충실히 따르는 워커일수록 문자열 전체를 값으로 낼 유인이 생긴다. **골격은 모양, 제약 목록은 규칙** — 이 분업이 이 파일의 관례이고 어긴 것이 위험의 원천이었다(D5).
|
||||
6. **`replace(..., 1)` 과 assert 뒤 write 는 이 파일에서 위험하다.** 이번에도 D1~D3 수정이 뒤이은 assert 실패로 **기록되기 전에 통째로 날아갔는데** 성공 로그만 보고 넘어갈 뻔했다. 치환 후에는 **파일을 다시 읽어 확인**하고, 다중 편집은 앵커가 아니라 확인된 행범위로 처리한다.
|
||||
|
||||
## 2026-08-23 ㊳ — Part 4 yaml 신작 (사실원장 3-task, 검증 2회 왕복 PASS)
|
||||
- **산출**: `ver_8_yaml_candidates/stage_1_part_4_v.8.yml`(sha fc60011042f1159a·69,004B, 구 v3와 무관 신작) — F0 code 리듀서(배포게이트 13·봉인 3종·컴파일러 13인자 호출) → F1 flash-lite 예외 재정판정(amount 한정) → F2 code 최종 게이트/작성자(등식 5종 재계수·닫힌 29키·handoff FINALIZED), 완전 직렬 DAG.
|
||||
- **신설 자산 6종** 배포 위치 저장 + 조립본 동기화(빌더 등록 없음): fact_ledger_compiler.py(+.txt 미러, f6c4b476)·fact_ledger_policy.v1.json·스키마 3종. 게이트 사이드카 25종 조립본 바이트 동일 복사. 매니페스트 434→465(+31), 전수 match 188·MISMATCH 0·absent 277. 인계면 45→55행(신설 10·갱신 12, 구 signal 3종 Part_4 소비 제거 = C-7 폐쇄).
|
||||
- **검증 1차 FAIL의 MAJOR**: 검사기 출력에서 존재하지 않는 `findings` 키를 읽어 falsy 0을 "통과"로 오독 + 소비 3건이 `try_read_json` 래퍼라 U4 비가시. 교훈 두 겹 — ① 검사기류 출력은 키 존재 단언 후 소비(`assert "finding_count" in r`), ② 소비 선언은 `read_json(경로상수)` 직접 호출이어야 실측 가능(부재 의미론은 try/except로 보존).
|
||||
- 재검증 PASS(DEFECTS 0): 4-yaml finding 0·골든 11필드×59행 불일치 0·26-A 121/25/90/6/6·F2 파괴 8종·부재 의미론 실측. D3는 전략서 §7.4 사실 정정으로 처리 — 골든-S2 SG-01 사본의 registry_index_sha256(a47a76aa…)≠현 배포(9f177ebf…), 재봉인은 그 1필드만 치환(요약서 §5 레시피).
|
||||
- 이월: 실주행(서버에 신설 31자산+매니페스트 배포 필요)·F1 실 LLM 품질·(나) 기준선 G-r2/26-B·G-w2·SUPP-calc6·F2 사문 try_read_json 정리(v.9). 요약서: `extension_research/part_4_yaml_construction_summary.md`.
|
||||
|
||||
## 2026-08-23 ㊴ — Stage 1 part 1~4 작업분석서 4종 작성 (Stage 2 명세 설계 입력용, 검증 전건 PASS)
|
||||
- **산출**: `extension_research/Analysis_Doc_stage_1_part_{1,2,3,4}_investrigation_final.md` (74.9/80.5/50.5/55.9 KB). 각 문서: DAG ASCII art(task_procedure 실물 일치) · task별 IO 전수 표(포맷·생산자/소비자) · 자산 표(배포 경로 + .py/.txt 미러 병기) · sub-task 명칭/내역/목적(code task 내부 단계·실패 코드 전수, LLM task 모델/산출 계약) · upstream-downstream 연결 쌍별 이유/방식/필드 소비.
|
||||
- **방법**: Workflow 16 agents — part별 분석 4 병렬 → 독립 검증자(적대적, YAML에서 task/IO/자산 직접 추출해 양방향 전수 대조) → FAIL 시 수정→재검증 루프. 통과 라운드: p1=2, p2=3, p3=1, p4=2. 최종 결함 0.
|
||||
- **분석 대상 실측 기준**: p1 sha 195b43ed·467,668B·task 13종(fan-out B1/B2 포함, 자산 45파일) / p2 sha f0a22394·249,809B·task 6종(worker ×14, 자산 152파일) / p3 sha 9a163a03·52,878B·task 2종(L0/L2, 자산 92파일) / p4 sha fc600110·69,004B·task 3종(F0/F1/F2). 인계면 55행·stage_chain 4구간과 전건 대조 일치.
|
||||
- 검증자 미확인 잔여(문서에 명시됨, 결함 아님): 실주행 기록(서버측)·R1 v3 바이트 대조·part4 "17축" 명칭은 계약 문언 승계(정책 실물은 축 그룹 10+노트 1).
|
||||
|
||||
+393
@@ -0,0 +1,393 @@
|
||||
# Stage 1 Part 1 (선별/Screening) 작업분석서 — 최종 실측본
|
||||
|
||||
> **분석 대상 정본**: `extension_research/ver_8_yaml_candidates/stage_1_part_1_v.8.yml`
|
||||
> **sha256 (첫 16자)**: `195b43edfaf1df14`
|
||||
> **바이트 크기**: 467,668 bytes (6,667행)
|
||||
> **분석 기준일**: 2026-08-23
|
||||
> **용도**: Stage 2 작업명세서 설계의 입력 문서. 전 항목 실물 정독 기반이며 추정 서술이 없다.
|
||||
|
||||
---
|
||||
|
||||
## 0. 개요 (실측 요약)
|
||||
|
||||
- Agent 선언: `Liti-agent_Civil_Suit_Plaintiff_Stage_1_Part_1` (version `v.2`), Stage 1개: `stage1_사건개요파악_기초작업`.
|
||||
- Stage 기본 LLM: `llm_provider: openai` / `llm_model: gpt-4o-2024-08-06` (단, 모든 LLM task가 task 수준에서 `google` / `gemini-3.1-flash-lite`로 재정의한다).
|
||||
- mcpServers 2종: `localdocs` (`http://mcp-localdocs:8012/mcp`, streamable-http), `code-executor` (`https://code-executor.mcp.eroomai.com/mcp`, streamable-http, Bearer 헤더).
|
||||
- task 총 **13종** (LLM 5종 + code-executor/run_code 8종). 이 중 `Task_B1_map_doc_*`, `Task_B2_map_events_*` 2종은 planner의 `dynamic_fanout`으로 N개 인스턴스로 확장되는 템플릿 task다(`max_concurrency: 12`).
|
||||
- 두 사슬 구조: **스크리너 사슬**(T0-01→T0-02→T0-03→T1)과 **증거 사슬**(T2→B1/B2 fan-out→게이트 3종→감사)이 `IN`에서 병렬 분기하고, `Task_D0_domain_activation_gate`에서 합류한 뒤 `Task_B2_SHA256_soft_gate_handoff_writer`가 봉인하여 `OUT`으로 나간다.
|
||||
- 헤더 주석의 구성 선언(실물과 일치 확인): 신설 4(`Task_A0_domain_screener_01/02/03`, `Task_D0_domain_activation_gate`), 개정 3(`Task_A_client_goal`, `Task_B1_map_doc_*`, `Task_B2_SHA256_soft_gate_handoff_writer`), 무변경 6(나머지).
|
||||
|
||||
---
|
||||
|
||||
## 1. 전체 작업 DAG flow (ASCII — `task_procedure` 실물과 1:1 일치)
|
||||
|
||||
`task_procedure`(YAML 6589~6667행)의 노드 13개(IN/OUT 포함 15개)와 `nexts`/`wait_until` 전량을 그대로 옮긴 것이다.
|
||||
|
||||
```
|
||||
┌────┐
|
||||
│ IN │
|
||||
└─┬──┘
|
||||
nexts ┌──────────────┴───────────────────┐ nexts
|
||||
▼ ▼
|
||||
┌────────────────────────────┐ ┌───────────────────────────────┐
|
||||
│ Task_A0_domain_screener_01 │ │ Task_Evidence_shard_planner │
|
||||
│ (LLM: 스크리닝 초안) │ │ (code: shard 분리+fan-out 계획)│
|
||||
└─────────────┬──────────────┘ └──────────────┬────────────────┘
|
||||
▼ ▼ (dynamic_fanout ×N)
|
||||
┌────────────────────────────┐ ┌───────────────────────────────┐
|
||||
│ Task_A0_domain_screener_02 │ │ Task_B1_map_doc_* (×N, LLM) │
|
||||
│ (code: 초안 봉인+검증) │ │ wait: Task_Evidence_shard_ │
|
||||
└─────────────┬──────────────┘ │ planner │
|
||||
│ └───┬──────────────────┬────────┘
|
||||
▼ │ {same_ordinal} │ all
|
||||
┌────────────────────────────┐ ▼ ▼
|
||||
│ Task_A0_domain_screener_03 │ ┌────────────────────┐ ┌──────────────────────────────┐
|
||||
│ (code: 후보 어휘 발췌) │ │ Task_B2_map_events │ │ Task_B1_quality_gate_ │
|
||||
└─────────────┬──────────────┘ │ _* (×N, LLM) │ │ evidence_indexed (code) │
|
||||
▼ │ wait: B1_map_doc_ │ │ wait: all Task_B1_map_doc_* │
|
||||
┌────────────────────────────┐ │ {same_ordinal} │ └───────────────┬──────────────┘
|
||||
│ Task_A_client_goal (LLM) │ └─────────┬──────────┘ │
|
||||
│ nexts: [] (사슬의 끝. │ │ all │
|
||||
│ D0의 선행이 아님) │ ▼ ▼
|
||||
└────────────────────────────┘ ┌──────────────────────────────────────────────┐
|
||||
│ │ Task_B2_quality_gate_event_candidates (code) │
|
||||
│ │ wait: all Task_B2_map_events_*, │
|
||||
│ │ Task_B1_quality_gate_evidence_indexed │
|
||||
│ └───────────────────────┬──────────────────────┘
|
||||
│ ▼
|
||||
│ ┌──────────────────────────────────────────────┐
|
||||
│ │ Task_B12_gate_llm_adjudicator (LLM) │
|
||||
│ └───────────────────────┬──────────────────────┘
|
||||
│ ▼
|
||||
│ ┌──────────────────────────────────────────────┐
|
||||
│ │ Task_B12_gate_audit_finalizer (code) │
|
||||
│ └───────────────────────┬──────────────────────┘
|
||||
│ (02 완료 대기) │
|
||||
└──────────────────────┐ │
|
||||
▼ ▼
|
||||
┌──────────────────────────────────────────────────────────┐
|
||||
│ Task_D0_domain_activation_gate (code) — 두 사슬의 합류점 │
|
||||
│ wait_until: [Task_B12_gate_audit_finalizer, │
|
||||
│ Task_A0_domain_screener_02] │
|
||||
│ ※ 03이 아니라 02를 기다린다 — D0는 │
|
||||
│ candidate_profile_vocabulary.md 를 쓰지 않는다 │
|
||||
└───────────────────────────┬──────────────────────────────┘
|
||||
▼
|
||||
┌──────────────────────────────────────────────────────────┐
|
||||
│ Task_B2_SHA256_soft_gate_handoff_writer (code) │
|
||||
└───────────────────────────┬──────────────────────────────┘
|
||||
▼
|
||||
┌─────┐
|
||||
│ OUT │
|
||||
└─────┘
|
||||
```
|
||||
|
||||
`task_procedure` 원문 엣지 전수(문자 단위 일치):
|
||||
|
||||
| 노드 | nexts | wait_until |
|
||||
|---|---|---|
|
||||
| `IN` | `["Task_A0_domain_screener_01", "Task_Evidence_shard_planner"]` | `[]` |
|
||||
| `Task_A0_domain_screener_01` | `["Task_A0_domain_screener_02"]` | `["IN"]` |
|
||||
| `Task_A0_domain_screener_02` | `["Task_A0_domain_screener_03"]` | `["Task_A0_domain_screener_01"]` |
|
||||
| `Task_A0_domain_screener_03` | `["Task_A_client_goal"]` | `["Task_A0_domain_screener_02"]` |
|
||||
| `Task_A_client_goal` | `[]` | `["Task_A0_domain_screener_03"]` |
|
||||
| `Task_Evidence_shard_planner` | `["Task_B1_map_doc_*"]` | `["IN"]` |
|
||||
| `Task_B1_map_doc_*` | `["Task_B2_map_events_{same_ordinal}", "Task_B1_quality_gate_evidence_indexed"]` | `["Task_Evidence_shard_planner"]` |
|
||||
| `Task_B2_map_events_*` | `["Task_B2_quality_gate_event_candidates"]` | `["Task_B1_map_doc_{same_ordinal}"]` |
|
||||
| `Task_B1_quality_gate_evidence_indexed` | `["Task_B2_quality_gate_event_candidates"]` | `["all Task_B1_map_doc_*"]` |
|
||||
| `Task_B2_quality_gate_event_candidates` | `["Task_B12_gate_llm_adjudicator"]` | `["all Task_B2_map_events_*", "Task_B1_quality_gate_evidence_indexed"]` |
|
||||
| `Task_B12_gate_llm_adjudicator` | `["Task_B12_gate_audit_finalizer"]` | `["Task_B2_quality_gate_event_candidates"]` |
|
||||
| `Task_B12_gate_audit_finalizer` | `["Task_D0_domain_activation_gate"]` | `["Task_B12_gate_llm_adjudicator"]` |
|
||||
| `Task_D0_domain_activation_gate` | `["Task_B2_SHA256_soft_gate_handoff_writer"]` | `["Task_B12_gate_audit_finalizer", "Task_A0_domain_screener_02"]` |
|
||||
| `Task_B2_SHA256_soft_gate_handoff_writer` | `["OUT"]` | `["Task_D0_domain_activation_gate"]` |
|
||||
| `OUT` | `[]` | `["Task_B2_SHA256_soft_gate_handoff_writer"]` |
|
||||
|
||||
fan-out 토큰 3종(무변경 실물): `Task_B1_map_doc_*` / `Task_B2_map_events_{same_ordinal}` / `all Task_B1_map_doc_*` 계열. `Task_B2_map_events_*`의 실행 컨텍스트는 planner stdout의 `dynamic_fanout` 리스트(각 항목 `{{item.*}}`)이며, B1→B2 same-ordinal 관계는 plan의 `streaming_edges`(`condition: {file_exists: b1_output}`)로도 이중 선언된다.
|
||||
|
||||
---
|
||||
|
||||
## 2. IO — task별 입력·출력 파일 전수 표
|
||||
|
||||
포맷 표기: json / md / py·txt(코드 미러) / yml. `※정적`은 `Default_Agent/` 아래 배포 정적 자산(생산자는 빌드/배포 파이프라인, Part 1 런타임은 읽기 전용).
|
||||
|
||||
### 2.1 외부 사건 입력 (Part 1 어느 task도 생산하지 않음)
|
||||
|
||||
| 경로 | 포맷 | 소비자 (Part 1 내) | 비고 (인계면 정본 기준) |
|
||||
|---|---|---|---|
|
||||
| `client_meeting.md` | md | `Task_A0_domain_screener_01`, `Task_A0_domain_screener_02`, `Task_A_client_goal`, `Task_B1_map_doc_*`, `Task_B2_map_events_*` | 유일한 사실 원천. Part 2의 `Task_C_BO_A0_context_and_domain_slice_compiler`도 직접 읽는다(C-8) |
|
||||
| `evidence_all.json` | json | `Task_Evidence_shard_planner` | 인계면 required_keys: `documents`, `source_files`, `total_count`. planner 코드는 `items/documents/evidences/evidence/docs` 키 또는 순수 배열을 수용 (`source_selector: "$.items || $"`) |
|
||||
|
||||
### 2.2 Part 1 내부 생산/소비 파일 전수
|
||||
|
||||
| # | 경로 | 포맷 | 생산자 | Part 1 내 소비자 | Part 1 밖 소비자 (인계면 실측) |
|
||||
|---|---|---|---|---|---|
|
||||
| 1 | `routing/domain_screening_draft.json` | json | `Task_A0_domain_screener_01` | `Task_A0_domain_screener_02` | (없음) |
|
||||
| 2 | `routing/domain_screening.json` | json | `Task_A0_domain_screener_02` | `Task_A0_domain_screener_03`, `Task_A_client_goal`, `Task_D0_domain_activation_gate`, `Task_B2_SHA256_soft_gate_handoff_writer` | `Task_C_BO_A0_context_and_domain_slice_compiler` (Part 2). `screening_sha256`의 원문 — 재직렬화 금지 |
|
||||
| 3 | `routing/candidate_profile_vocabulary.md` | md | `Task_A0_domain_screener_03` | `Task_A_client_goal` | (없음) |
|
||||
| 4 | `client_goal.json` | json | `Task_A_client_goal` | (Part 1 내 없음) | Part 3 이후 스테이지 (인계면 note: "task 이름은 그 착수 시 기입") |
|
||||
| 5 | `evidence_shards/E-{ordinal:03d}.json` ×N | json | `Task_Evidence_shard_planner` | `Task_B1_map_doc_*`(자기 ordinal), `Task_B2_map_events_*`(자기 ordinal), `Task_B1_quality_gate_evidence_indexed`(drift spot-check 발췌용) | (없음) |
|
||||
| 6 | `evidence_shard_plan.json` | json | `Task_Evidence_shard_planner` | `Task_B1_quality_gate_evidence_indexed`, `Task_B2_quality_gate_event_candidates` (B1/B2 mapper는 파일이 아니라 `{{item.*}}` runtime parameter로 소비) | (없음) |
|
||||
| 7 | `evidence_indexed_parts/E-{ordinal:03d}.json` ×N | json | `Task_B1_map_doc_*` (인스턴스별 1개) | `Task_B2_map_events_*`(same ordinal, authority metadata), `Task_B1_quality_gate_evidence_indexed`(전수) | (없음) |
|
||||
| 8 | `evidence_event_candidate_parts/E-{ordinal:03d}.json` ×N | json | `Task_B2_map_events_*` (인스턴스별 1개) | `Task_B2_quality_gate_event_candidates`(전수) | (없음) |
|
||||
| 9 | `evidence_indexed.json` | json | `Task_B1_quality_gate_evidence_indexed` | `Task_D0_domain_activation_gate`, `Task_B2_SHA256_soft_gate_handoff_writer` | `Task_C_BO_A0_context_and_domain_slice_compiler`, `Task_C_FL_F0_fact_ledger_reducer` (Part 2). `registry_component_ids`가 여기를 통과(C-1) |
|
||||
| 10 | `stage1_tmp/quality_gate/finalized_evidence_id_manifest.json` | json | `Task_B1_quality_gate_evidence_indexed` | `Task_B2_quality_gate_event_candidates` | (없음) |
|
||||
| 11 | `stage1_tmp/quality_gate/B1_precheck.json` | json | `Task_B1_quality_gate_evidence_indexed` | `Task_B2_quality_gate_event_candidates`, `Task_B12_gate_audit_finalizer` | (없음) |
|
||||
| 12 | `evidence_event_candidates.json` | json | `Task_B2_quality_gate_event_candidates` | `Task_D0_domain_activation_gate`, `Task_B2_SHA256_soft_gate_handoff_writer` | `Task_C_BO_A0_context_and_domain_slice_compiler` (Part 2) |
|
||||
| 13 | `stage1_tmp/quality_gate/B2_precheck.json` | json | `Task_B2_quality_gate_event_candidates` | `Task_B12_gate_audit_finalizer` | (없음) |
|
||||
| 14 | `stage1_tmp/quality_gate/B12_exception_pack.json` | json | `Task_B2_quality_gate_event_candidates` | `Task_B12_gate_llm_adjudicator`, `Task_B12_gate_audit_finalizer` | (없음) |
|
||||
| 15 | `stage1_tmp/quality_gate/B12_adjudication_decisions.json` | json | `Task_B12_gate_llm_adjudicator` | `Task_B12_gate_audit_finalizer` | (없음) |
|
||||
| 16 | `quality_gates/B1_evidence_indexed_gate.json` | json | `Task_B12_gate_audit_finalizer` | `Task_D0_domain_activation_gate`, `Task_B2_SHA256_soft_gate_handoff_writer` | (없음) |
|
||||
| 17 | `quality_gates/B2_event_candidates_gate.json` | json | `Task_B12_gate_audit_finalizer` | `Task_D0_domain_activation_gate`, `Task_B2_SHA256_soft_gate_handoff_writer` | (없음) |
|
||||
| 18 | `routing/domain_activation_manifest.json` | json | `Task_D0_domain_activation_gate` (실제 문서 조립은 반입된 `activation_gate.py` 모듈; task는 바이트 그대로 업로드) | `Task_B2_SHA256_soft_gate_handoff_writer` | Part 2/3의 `Task_C_BO_A0…`, `Task_C_BO_S0_signal_bundle_writer`, `Task_C_LE_L0…`, `Task_C_LE_L2…`, `Task_C_FL_F0…`, `Task_C_FL_F2…` (인계면 17 required_keys) |
|
||||
| 19 | `quality_gates/stage1_part1_soft_gate_handoff.json` | json | `Task_B2_SHA256_soft_gate_handoff_writer` | (Part 1 내 없음) | `Task_C_BO_A0_context_and_domain_slice_compiler` (Part 2). required_keys: `digest_guard`, `handoff_status`, `review_items`, `schema_version`, `source_stage` |
|
||||
|
||||
### 2.3 task별 IO 매트릭스 (읽기 R / 쓰기 W, 실행 코드·프롬프트 실측)
|
||||
|
||||
| task | R (전수) | W (전수) |
|
||||
|---|---|---|
|
||||
| Task_A0_domain_screener_01 | `client_meeting.md`, `Default_Agent/routing/activation_cue_digest.md` (둘 다 preflight inline) | `routing/domain_screening_draft.json` (write_file 1회) |
|
||||
| Task_A0_domain_screener_02 | `routing/domain_screening_draft.json`, `client_meeting.md`, `Default_Agent/domains/_registry_index.json`(read_raw), `Default_Agent/routing/activation_cue_digest.md`(read_raw) | `routing/domain_screening.json` |
|
||||
| Task_A0_domain_screener_03 | `routing/domain_screening.json`(read_raw), `Default_Agent/domains/_registry_index.json`(read_raw), `Default_Agent/platform/reference_catalogs/domain_ids.json`, `Default_Agent/platform/reference_catalogs/calculation_ids.json`, `Default_Agent/domains/<후보 domain_id>/domain_config.json`(read_raw, 후보 수만큼) | `routing/candidate_profile_vocabulary.md` |
|
||||
| Task_A_client_goal | `client_meeting.md`, `routing/domain_screening.json`, `Default_Agent/platform/schemas/client_goal_domain_profiles.schema.json`, `routing/candidate_profile_vocabulary.md` | `client_goal.json` (write_file 1회, final writer) |
|
||||
| Task_Evidence_shard_planner | `evidence_all.json`; list_docs: `evidence_indexed_parts/ E-*.json`, `evidence_event_candidate_parts/ E-*.json` (stale 검사) | `evidence_shards/E-{nnn}.json` ×N, `evidence_shard_plan.json`; stdout `dynamic_fanout` |
|
||||
| Task_B1_map_doc_* (인스턴스) | `{{item.shard_doc_path}}`, `client_meeting.md`, `Default_Agent/routing/evidence_component_union.md`(preflight inline); runtime param `{{item.assigned_ordinal/evidence_index_candidate/source_document_ref/b1_output_path}}` | `evidence_indexed_parts/E-{ordinal:03d}.json` 1개 |
|
||||
| Task_B2_map_events_* (인스턴스) | `{{item.b1_output_path}}`, `{{item.shard_doc_path}}`, `client_meeting.md`; runtime param `{{item.*}}` | `evidence_event_candidate_parts/E-{ordinal:03d}.json` 1개 |
|
||||
| Task_B1_quality_gate_evidence_indexed | `evidence_shard_plan.json`, `evidence_indexed_parts/E-{o}.json` 전수(expected_ordinals 순회), drift 의심 시 해당 `evidence_shards/…` 발췌(EXCERPT_LIMIT 1500); list_docs로 초과 part 탐지 | `evidence_indexed.json`, `stage1_tmp/quality_gate/finalized_evidence_id_manifest.json`, `stage1_tmp/quality_gate/B1_precheck.json` |
|
||||
| Task_B2_quality_gate_event_candidates | `evidence_shard_plan.json`, `stage1_tmp/quality_gate/finalized_evidence_id_manifest.json`, `stage1_tmp/quality_gate/B1_precheck.json`, `evidence_event_candidate_parts/E-{o}.json` 전수 | `evidence_event_candidates.json`, `stage1_tmp/quality_gate/B2_precheck.json`, `stage1_tmp/quality_gate/B12_exception_pack.json` |
|
||||
| Task_B12_gate_llm_adjudicator | `stage1_tmp/quality_gate/B12_exception_pack.json` (유일 입력, preflight) | `stage1_tmp/quality_gate/B12_adjudication_decisions.json` |
|
||||
| Task_B12_gate_audit_finalizer | `stage1_tmp/quality_gate/B1_precheck.json`, `…/B2_precheck.json`, `…/B12_adjudication_decisions.json`, `…/B12_exception_pack.json` | `quality_gates/B1_evidence_indexed_gate.json`, `quality_gates/B2_event_candidates_gate.json` |
|
||||
| Task_D0_domain_activation_gate | 모듈 미러 5종(.txt) + `Default_Agent/runtime_manifest.json`(해시 대조) + CASE_INPUTS 5종(`routing/domain_screening.json`, `evidence_indexed.json`, `evidence_event_candidates.json`, `quality_gates/B1_evidence_indexed_gate.json`, `quality_gates/B2_event_candidates_gate.json`) + `Default_Agent/domains/_registry_index.json` + 26개 `Default_Agent/domains/<config_path>` + `Default_Agent/signals/schemas/domain_activation_manifest.schema.json`(반입만; 실패 시 warn) | `routing/domain_activation_manifest.json` (모듈 산출 바이트 그대로; `/tmp/s1` 실행 뿌리에 스테이징 파일 다수) |
|
||||
| Task_B2_SHA256_soft_gate_handoff_writer | INPUT_PATHS 7종(read_raw): `evidence_indexed.json`, `evidence_event_candidates.json`, `quality_gates/B1_evidence_indexed_gate.json`, `quality_gates/B2_event_candidates_gate.json`, `routing/domain_screening.json`, `routing/domain_activation_manifest.json`, `Default_Agent/domains/_registry_index.json` | `quality_gates/stage1_part1_soft_gate_handoff.json` |
|
||||
|
||||
### 2.4 Part 경계 인계 (stage1_stage_chain.v1.json 의 Part 1 구간, 실측)
|
||||
|
||||
- **requires**: `client_meeting.md`, `evidence_all.json`
|
||||
- **produces** (Part 2가 requires로 전수 소비): `routing/domain_activation_manifest.json`, `quality_gates/stage1_part1_soft_gate_handoff.json`, `routing/domain_screening.json`, `evidence_indexed.json`, `evidence_event_candidates.json`
|
||||
- **yaml**: `stage_1_part_1_v.8.yml`, order 1
|
||||
- enforcement 선언: "Task_C_BO_A0 가 봉인 세 해시를 대조하므로 Part 1 미수행 시 SEAL_FAILED 로 멈춘다" (순서 강제는 파일 부재 실패 + 해시 봉인으로 이루어진다).
|
||||
|
||||
---
|
||||
|
||||
## 3. 작업용 assets — 배포 위치 포함 전수 표
|
||||
|
||||
배포 루트: `BASE/extension_research/Default_Agent/` (BASE = `…/YAML_Prompts/1. Stage_1/v.7`). 크기는 실측 바이트. **python 자산은 `.py` 정본과 바이트 동일 `.txt` 미러가 같은 디렉터리에 병존**한다(빌더 규칙, 예외는 `build_default_agent_stage1.py` 하나 — YAML 헤더 명문).
|
||||
|
||||
### 3.1 라우팅/어휘 사전 (md)
|
||||
|
||||
| 자산 | 배포 위치 | 크기 | 소비 task | 성격 |
|
||||
|---|---|---|---|---|
|
||||
| `activation_cue_digest.md` | `Default_Agent/routing/` | 35,110 B | T0-01(preflight inline), T0-02(read_raw) | 26개 도메인 라우팅 단서 사전. `## LEGEND`/`## GLOBAL_DEFAULTS`/`## USAGE`/`## DOMAINS`(`### ` 절 26개). 단서 줄 `P|N|C|OVR` 4형식. **실물 머리말에 `registry_version:`/`registry_index:` 줄 없음** — T0-02는 `DIGEST_HEADER_ABSENT` 경고로 낡음 대조를 건너뛰고 정본(`_registry_index.json`)에서 값을 취한다 |
|
||||
| `evidence_component_union.md` | `Default_Agent/routing/` | 17,593 B | B1 mapper(preflight inline) | 증거 구성요소 합집합. 실측 헤더: `component_count=112`, `domain_count=26`, `proof_role_count=77`, `registry_version=Stage1.Assembly.2026-08-10.v1`, `registry_index_sha256=9f177ebf…`. 줄 형식 `<component_id>|<proof_role>|<label>|<owner_domain_ids>|<accepted_source_kinds>`. B1 part의 `registry_component_ids` 채움에만 쓰는 어휘(P0 판정 A: v3 구조 어휘와 병존, 교집합 0) |
|
||||
|
||||
### 3.2 도메인 레지스트리 (json)
|
||||
|
||||
| 자산 | 배포 위치 | 크기 | 소비 task | 성격 |
|
||||
|---|---|---|---|---|
|
||||
| `_registry_index.json` | `Default_Agent/domains/` | 18,921 B | T0-02, T0-03, D0, T9 (전부 read_raw — 원문 sha256 대상) | 정본 색인. 실측: `registry_version=Stage1.Assembly.2026-08-10.v1`, entries 26개(E-00~E-21, EC-00, X1, X2, X3), entry마다 `config_path`·`config_sha256` |
|
||||
| `<domain_id>/domain_config.json` ×26 | `Default_Agent/domains/E-00/` … `X3/` | 예: E-13 11,654 B | T0-03(스크리닝 후보만, read_raw + `config_sha256` 대조), D0(index의 `config_path`를 따라 26개 전량 스테이징) | 도메인 정의 원본. T0-03이 발췌하는 7항목: `label_ko`·`kind`, `element_slots`, `opposing_fact_slots`, `evidence_components`, `defense_map`, `calculation_bindings`, `review_codes`. ※ 각 도메인 폴더의 `gates.json`, `module_role_projection.json`, `seed_prompt_overlay.md`, `structure_types.json`, EC-00의 `common_fragment.md`, `_common/common_worker_contract.md`는 배포되어 있으나 **Part 1은 읽지 않는다**(Part 2 이후 소비) |
|
||||
|
||||
### 3.3 platform 자산 (json)
|
||||
|
||||
| 자산 | 배포 위치 | 크기 | 소비 task | 성격 |
|
||||
|---|---|---|---|---|
|
||||
| `client_goal_domain_profiles.schema.json` | `Default_Agent/platform/schemas/` | 13,082 B | Task_A_client_goal (preflight_files 등재 + read_docs) | `domain_profiles` 각 칸(도메인 ID 키 개방형)의 닫힌 스키마. 다섯 배열(`slot_status`·`evidence_component_status`·`defense_signal_status`·`calculation_readiness`·`review_items`) 필수 |
|
||||
| `reference_catalogs/domain_ids.json` | `Default_Agent/platform/reference_catalogs/` | 270 B | T0-03 | 도메인 ID 화이트리스트 26개 (`domain_ids`, `expected_count`, `schema_version`) |
|
||||
| `reference_catalogs/calculation_ids.json` | `Default_Agent/platform/reference_catalogs/` | 1,139 B | T0-03 | 계산 ID 카탈로그 17 entries (`calculation_id`+`status`; `status!="ready"`는 `CALC_DEFERRED` 경고) |
|
||||
| `contracts/determinism_scope_contract.json` | `Default_Agent/platform/contracts/` | 1,473 B | (런타임 read 없음) | YAML 헤더 "정적 자산 선행 조건" 5종 중 하나로 명시된 배포 전제 자산 |
|
||||
|
||||
### 3.4 signals 자산 (schema + 어댑터)
|
||||
|
||||
| 자산 | 배포 위치 | 크기 | 소비 task | 성격 |
|
||||
|---|---|---|---|---|
|
||||
| `domain_activation_manifest.schema.json` | `Default_Agent/signals/schemas/` | 3,535 B | D0 (SCHEMA_DOC — 실행 뿌리에 스테이징만; 반입 실패 시 `SCHEMA_DOC_STAGE_SKIPPED` 경고 후 진행. "스키마는 모듈이 읽지 않는다" 주석 실측) | 활성화 매니페스트 스키마 |
|
||||
| `sg01_activation_adapter.py` | `Default_Agent/signals/adapters/` | 3,738 B | (정본 — 미러의 원본) | SG-01 어댑터 정본 |
|
||||
| `sg01_activation_adapter.txt` | `Default_Agent/signals/adapters/` | 3,738 B (바이트 동일 확인) | D0 (`MODULE_MIRRORS` 반입, `runtime_manifest` 해시 대조) | **미러가 `stage1_runtime/`이 아니라 `signals/adapters/`에 있다** — 형제 미러 규칙(M-1). YAML 헤더가 이 사실을 명문으로 경고 |
|
||||
|
||||
### 3.5 stage1_runtime python 모듈 (D0 반입 대상 — `.py`·`.txt` 쌍 전부 기재)
|
||||
|
||||
| 논리 모듈명 | `.py` 정본 | `.txt` 미러 (D0가 실제 반입하는 쪽) | 크기(양쪽 동일) |
|
||||
|---|---|---|---|
|
||||
| `runtime_common` | `Default_Agent/stage1_runtime/runtime_common.py` | `Default_Agent/stage1_runtime/runtime_common.txt` | 4,496 B |
|
||||
| `schema_subset_validator` | `Default_Agent/stage1_runtime/schema_subset_validator.py` | `Default_Agent/stage1_runtime/schema_subset_validator.txt` | 7,442 B |
|
||||
| `registry_loader` | `Default_Agent/stage1_runtime/registry_loader.py` | `Default_Agent/stage1_runtime/registry_loader.txt` | 6,404 B |
|
||||
| `activation_gate` | `Default_Agent/stage1_runtime/activation_gate.py` | `Default_Agent/stage1_runtime/activation_gate.txt` | 66,715 B |
|
||||
| `sg01_activation_adapter` | `Default_Agent/signals/adapters/sg01_activation_adapter.py` | `Default_Agent/signals/adapters/sg01_activation_adapter.txt` | 3,738 B |
|
||||
|
||||
- D0 코드의 `MODULE_MIRRORS` 사전이 위 5개 `.txt` 논리 경로를 그대로 담고 있고(문자 단위 일치 확인), `MODULES` 순서는 `runtime_common → schema_subset_validator → registry_loader → activation_gate → sg01_activation_adapter`다.
|
||||
- 반입 절차: read_raw → `runtime_manifest.json`의 `entries[].{path, sha256}`(path는 `Default_Agent/` 접두 제거형)와 대조 → 불일치 시 `MODULE_MIRROR_HASH_MISMATCH`, 미등재 시 `MODULE_MIRROR_UNREGISTERED`로 즉시 실패(실행 안 함) → `/tmp/s1/_rt/<모듈명>.py`로 기록 후 `sys.path` 삽입.
|
||||
- ※ `stage1_runtime/`에는 이외에 `domain_fanout_planner`, `domain_slice_compiler`, `fact_ledger_compiler`, `prompt_compiler`, `registry_validator`, `stage_a_context_builder`, `structure_index_compiler`, `worker_output_validator`(각 .py/.txt)와 정책 json 5종이 배포되어 있으나 **Part 1은 반입하지 않는다**(Part 2/3 소비).
|
||||
|
||||
### 3.6 매니페스트·금지 자산
|
||||
|
||||
| 자산 | 배포 위치 | 크기 | 소비 task | 성격 |
|
||||
|---|---|---|---|---|
|
||||
| `runtime_manifest.json` | `Default_Agent/` | 72,161 B | D0 | 실측: `schema_version=stage1_runtime_manifest.v1`, entries 465개. 모듈 미러 5종의 sha256 대조 기준. T9 봉인의 `registry_index_sha256`과는 별개 |
|
||||
| `validation_assets/routing/case_kind_domain_matrix.v2.json` | (현 배포 트리에 **부재** — 오프라인 회귀 전용) | — | **읽기 금지 자산** | T0-01·Task_A 프롬프트의 `<ABSOLUTE_FORBIDDEN>`에 명시: "사건유형 이름을 담은 오프라인 회귀 전용 자산이며 런타임 입력이 금지되어 있다" |
|
||||
|
||||
### 3.7 자산 집계
|
||||
|
||||
- Part 1 YAML이 실제 참조하는 정적 자산: **경로 계열 16종** (md 2, registry json 1+26, platform json 4, signals schema 1, python 모듈 5쌍=10파일, runtime_manifest 1, 금지 자산 1).
|
||||
- 실파일 수(금지 자산 제외): 2 + 27 + 4 + 1 + 10 + 1 = **45개**.
|
||||
- 헤더 "정적 자산 선행 조건" 5종 전부 배포 실측 확인: `stage1_runtime/activation_gate.py`, `platform/schemas/client_goal_domain_profiles.schema.json`, `routing/activation_cue_digest.md`, `routing/evidence_component_union.md`, `platform/contracts/determinism_scope_contract.json`.
|
||||
|
||||
---
|
||||
|
||||
## 4. 개별 소작업(sub-task) 전수 — 명칭 · 목적 · 작업 내역
|
||||
|
||||
### 4.1 Task_A0_domain_screener_01 — 도메인 스크리닝 초안 (LLM)
|
||||
|
||||
- **유형/설정**: LLM. `llm_provider: google`, `llm_model: 'gemini-3.1-flash-lite'`, `llm_reasoning: high`, `llm_verbosity: low`, `cache_control: {mode: auto, ttl: 1h}`, `use_tools: [localdocs]`, `preflight: true` + `preflight_files: [Default_Agent/routing/activation_cue_digest.md, client_meeting.md]` (화이트리스트 preflight — 프롬프트 본문 regex 스캔 off, 35KB 사전을 캐시 공유 영역에 inline).
|
||||
- **목적**: "이 사건이 137종 사건유형 중 무엇인가"가 아니라 **"registry의 26개 법리 렌즈 중 어느 것이 켜지는가"**의 가설 초안을 만든다. 확정은 하류 D0의 결정론 몫.
|
||||
- **작업 내역** (`<EXECUTION_SEQUENCE>` 실측 9단계): ① list_docs로 입력 2종 존재 확인 → ② preflight 내용 사용(미제공 시에만 read_docs 1회) → ③ 상담록을 source unit으로 채번(`MTG.<SECTION>.<사건군2>.<항2>`; SECTION은 FACT/OPP/WISH, 머리표는 `MTG.META.01`, 불일치 문단은 `MTG.RAW.<3자리>`+`SCREENING_SOURCE_UNIT_FALLBACK`) → ④ 사전 해석(`P|N|C|OVR` 줄, effect `DR`/`MR`) → ⑤ 단서 매칭→점수→부정/충돌→미분류→계산요청 순으로 **판단 4종**(`status`, `candidates`, `unmatched_issue_refs`, `review_items`) 생성 → ⑥ 정규화(NFC/LF/정렬)+`<VALIDATION_GATES>` 자기점검(16항) → ⑦ `write_file(overwrite=true)` 1회 → ⑧ list_docs 존재 확인(재읽기 금지) → ⑨ 정확히 `"도메인 스크리닝 초안 생성 완료"` 출력.
|
||||
- **산출 계약**: 루트 키 `domain_screening_draft` 하나. `draft_schema_version: "stage1_domain_screening_draft.v1"`, `produced_by`, `source_document_code: "MTG"` 등 고정값 5종 + `source_unit_index`(unit_id+gist 60자) + 판단 4종. 후보 원소는 닫힌 스키마와 동일한 9키(`domain_id, provisional_status, positive_refs, negative_refs, conflict_refs, confidence, reasoning_summary, final_determination_forbidden(=true 고정), requested_calculation_domains`).
|
||||
- **핵심 규율**: 비판단 6종(`schema_version, registry_version, registry_index_sha256, source_document_refs, screening_policy, contract_guards`) 생성 금지(후속 02 몫). 금지 필드명 6종(`track_hypothesis` 등). 단서 1개만으로 후보 금지(single_keyword_activation_forbidden). 부정 단서는 강등만(`DR`: confidence 1단계, `MR`: monitor 이동), 삭제 금지. `ao=1` 4종(E-00, X1, X2, X3)은 서술이 없어도 monitor/low로 보존. `status`는 READY / READY_WITH_REVIEW / BLOCKED / FAILED — 본 task는 제안일 뿐, 후속이 올릴 수는 있어도 내릴 수 없다.
|
||||
- **실패 정책**: 필수 입력 누락 시 파일 안 쓰고 채팅 보고. 사전 이상 시 `FAILED: activation_cue_digest`. tool 오류 1회 재시도 후 `FAILED: <step>`.
|
||||
|
||||
### 4.2 Task_A0_domain_screener_02 — 스크리닝 봉인·검증 (code)
|
||||
|
||||
- **유형/설정**: `mcp: code-executor`, `tool_name: run_code`, python, `requirements: "httpx"`, `network: "agent-network"`, `timeout: 180`.
|
||||
- **목적**: 01의 판단 4종을 받아 **비판단 6종을 registry에서 직접 읽어 붙이고**, 멤버십·보존 등식을 결정론으로 검증해 닫힌 스키마 `stage1_domain_screening.v1`의 `routing/domain_screening.json`을 기록한다. "판단은 하지 않는다. 상태를 올릴 수는 있어도 내리지 않는다."
|
||||
- **내부 단계 순서** (main 실측): ① `_init`(localdocs MCP 초기화, `{{__user_hash__}}`/`{{__workspace_hash__}}` clientInfo 필수) → ② 입력 4종 적재(초안 read_json / 상담록·registry·사전은 **read_raw** — 원문 바이트 보존) → ③ 초안 금지필드·비판단필드 검사 → ④ registry 원문 sha256 계산(재직렬화 금지) + `registry_version`·도메인 ID 목록 추출 → ⑤ 사전 파싱(`parse_digest`: 도메인 26절, calc/dep/ao, `C`줄 review_code, 머리말 registry_version·sha) — 머리말 부재는 **경고**(`DIGEST_HEADER_ABSENT`), 존재하는데 불일치면 **실패**(`REGISTRY_INDEX_SHA_MISMATCH`/`REGISTRY_VERSION_MISMATCH`) → ⑥ **source unit 독립 재산출**(`mint_source_units` — 01의 채번 규칙을 코드로 재구현, LLM 채번 불신뢰 대조; 어긋나면 재산출본이 정본 + `E00_MEMBERSHIP_CONFLICT_REVIEW`) → ⑦ 후보 전수 검증(키 구성, 도메인 실재·중복, enum, reasoning 길이 1~1200, ref 패턴·`REF_NOT_IN_SOURCE_UNIVERSE` 멤버십, calc가 사전 `calc=` 부분집합) + 정렬 정규화; ao 누락은 `ALWAYS_ON_NOT_IN_DRAFT` 경고(후보를 만들어내지 않음 — D0 게이트 보장 사항) → ⑧ 검토항목 검증(허용 코드 = 사전 C줄 ∪ {UNROUTED_ISSUE_REVIEW, SCREENING_SOURCE_UNIT_FALLBACK, E00_MEMBERSHIP_CONFLICT_REVIEW, E00_FALSE_UNROUTED_REVIEW, E00_CONSERVATION_FAILURE}) → ⑨ **보존 등식**: unmatched를 재계산(universe−cited)하고 초안과 다르면 `E00_FALSE_UNROUTED_REVIEW` 추가, `|universe| = |cited|+|unmatched|` 위반 시 `CONSERVATION_FAILED` → ⑩ 상태 승격(검토 있으면 최소 READY_WITH_REVIEW) → ⑪ ERRORS 있으면 미기록 종료; 없으면 비판단 6종(`SCREENING_POLICY`·`CONTRACT_GUARDS`는 스키마 const 사본) 조립 → ⑫ `self_check`(닫힌 스키마 형태 재확인; 실패 시 `OUTPUT_SCHEMA_SELF_CHECK_FAILED`) → ⑬ write + list_docs 확인 → stdout 단일 JSON(성공: `screening_sha256`, 카운트류; 실패: `{"status":"FAILED", errors, warnings}`).
|
||||
- **주요 실패 코드** (전수): `DRAFT_UNREADABLE, MEETING_UNREADABLE, REGISTRY_INDEX_UNREADABLE, DIGEST_UNREADABLE, DRAFT_ROOT_KEY_INVALID, FORBIDDEN_FIELD_PRESENT, NONJUDGMENT_FIELD_IN_DRAFT, DIGEST_MALFORMED, DIGEST_DOMAIN_SET_MISMATCH, REGISTRY_INDEX_SHA_MISMATCH, REGISTRY_VERSION_MISMATCH, SOURCE_UNIT_SET_EMPTY, SOURCE_UNIT_DUPLICATE, REF_PATTERN_INVALID, DRAFT_FIELD_MISSING, CANDIDATE_KEY_INVALID, DOMAIN_ID_UNKNOWN, DOMAIN_ID_DUPLICATE, ENUM_INVALID, REASONING_SUMMARY_LENGTH, FINAL_DETERMINATION_FLAG_INVALID, REF_NOT_IN_SOURCE_UNIVERSE, CALC_PATTERN_INVALID, CALC_NOT_IN_BINDINGS, REVIEW_ITEM_KEY_INVALID, REVIEW_CODE_PATTERN_INVALID, REVIEW_CODE_UNKNOWN, CONSERVATION_FAILED, OUTPUT_SCHEMA_SELF_CHECK_FAILED, UNHANDLED_EXCEPTION`.
|
||||
|
||||
### 4.3 Task_A0_domain_screener_03 — 후보 프로필 어휘 발췌 (code)
|
||||
|
||||
- **유형/설정**: run_code python, `timeout: 240` (주석 근거: 후보 15개면 도구 호출 4+15+1+1=21회, 26개까지 여유).
|
||||
- **목적**: 스크리닝 후보 도메인의 `domain_config.json`에서 **7개 항목만 발췌**한 낱말 목록 `routing/candidate_profile_vocabulary.md`를 만든다. Task_A가 `domain_profiles`를 채울 때 쓸 사전이며 "판단은 하지 않는다. registry 원문이 정본이고 이 파일은 파생본이다."
|
||||
- **내부 단계**: ① 입력 4종 적재(스크리닝·registry는 read_raw로 sha 계산) → ② **스냅숏 대조**: 스크리닝의 `registry_version`·`registry_index_sha256`이 현재 registry 원문 계산값과 다르면 실패(낡은 스냅숏 위 발췌 금지) → ③ 후보 목록 확정(패턴·카탈로그 멤버십, 중복 제거, 오름차순; 0개면 `NO_CANDIDATE_DOMAIN`) → ④ 후보별 `Default_Agent/domains/%s/domain_config.json` read_raw → registry entry의 `config_sha256`과 대조(`DOMAIN_CONFIG_HASH_MISMATCH`), `domain_id` 일치 검사, `calculation_bindings`의 카탈로그 멤버십(`CALC_NOT_IN_CATALOG`)·`status!="ready"`는 `CALC_DEFERRED` 경고 → ⑤ 원천 단위 목록 = 스크리닝 `source_document_refs` → ⑥ **출력 예산 관리**: `MAX_OUTPUT_BYTES=28000`(Task_A 프롬프트 잔여 예산), `LABEL_TIERS`(full→60→40→24→none) 사다리로 라벨을 단계 축약, 축약 사용 시 `LABEL_TRUNCATED`/초과 시 `OUTPUT_BUDGET_EXCEEDED` 경고 — 조용히 자르지 않고 `label_tier`를 파일 머리에 기록 → ⑦ write + list_docs 확인 → stdout 단일 JSON(`output_sha256`, `candidate_domains`, slot/component/defense 카운트, 3종 sha 등).
|
||||
- **산출 형식** (render 실측): `# CANDIDATE_PROFILE_VOCABULARY` / `digest_schema: candidate_profile_vocabulary.v1` / 머리 메타(registry_version·registry_index_sha256·screening_sha256·candidate_count·label_tier) / `## LEGEND`(E·O·V·D·R 5줄 형식) / `## USAGE` / `## SOURCE_UNITS`(스크리닝 refs 전수) / `## DOMAINS`(`### <domain_id>|<label>|kind=|calc=` + E/O/V/D/R 줄).
|
||||
- **실패 코드**: `SCREENING_UNREADABLE, REGISTRY_INDEX_UNREADABLE, DOMAIN_CATALOG_UNREADABLE, CALC_CATALOG_UNREADABLE, REGISTRY_VERSION_MISMATCH, REGISTRY_INDEX_SHA_MISMATCH, DOMAIN_ID_PATTERN_INVALID, DOMAIN_ID_NOT_IN_CATALOG, NO_CANDIDATE_DOMAIN, DOMAIN_CONFIG_UNREADABLE, DOMAIN_CONFIG_HASH_MISMATCH, DOMAIN_CONFIG_ID_MISMATCH, CALC_PATTERN_INVALID, CALC_NOT_IN_CATALOG, SOURCE_REF_PATTERN_INVALID, SOURCE_DOCUMENT_REFS_EMPTY, UNHANDLED_EXCEPTION`.
|
||||
|
||||
### 4.4 Task_A_client_goal — 고객 목표 구조화 (LLM, final writer)
|
||||
|
||||
- **유형/설정**: LLM. google `gemini-3.1-flash-lite`, `llm_reasoning: high`, `llm_verbosity: medium`, `cache_control: {mode: auto, ttl: 20m}`, `use_tools: [localdocs]`, `preflight: false` + `preflight_files` 4종 등재(`client_meeting.md`, `routing/domain_screening.json`, `Default_Agent/platform/schemas/client_goal_domain_profiles.schema.json`, `routing/candidate_profile_vocabulary.md`).
|
||||
- **목적**: 고객의 소송 목적·명시적 제약·핵심 사건군·당사자 universe를 Stage 1 최앞단에서 구조화한 `client_goal.json`을 **final writer로서 직접 작성**. v.4 개정 요지 둘: ① `domain_profiles`를 고정 4키에서 **도메인 ID 키 개방형**으로(칸 열기=스크리닝, 형태=스키마, 낱말=어휘 목록), ② 추적용 top-level `domain_screening_ref` 추가.
|
||||
- **작업 내역** (EXECUTION_SEQUENCE 12단계): 입력 4종 확인·독해 → 기존 필수 층 추출(primary_goal / constraints / summary_key_incidents(≤4문장·각 100자) / key_facts(≤5·각 60자) / claim_type_candidates(enum 6종) / parties / aliases) → 사건군별 `domain_profiles` 작성(`<ISSUE_CLUSTER_DOMAIN_PROFILE_RULES>`) → `domain_screening_ref` 작성(**전부 스크리닝에서 복사, sha256 계산·추정 절대 금지**) → VALIDATION_GATES(약 40항) + NEW_VALIDATION_GATES_V4(18항) 자기점검 → write 1회 → 존재 확인 → `"고객의사 초안 생성 완료"` 출력.
|
||||
- **산출 계약 요점**: optional additive 층 — `defendant_target_matrix`(target_status/execution_risk/future_recovery_signal 분리), `issue_clusters`(1~6개; `candidate_plaintiffs`/`legal_entitlement_candidates`/`preferred_plaintiffs_for_complaint`/`succession_resolution_needed` 분리 — 상속형 과잉 일반화 방지), `plaintiff_capacity_matrix`(capacity_basis+certainty), `current_control_map`(4 role), `current_control_map_4axis`, `standing_watchpoints`, hint 층 9종 유지(`liability_group_hint` 등 — `domain_profiles`가 흡수 금지). `domain_profiles` 각 칸: 다섯 배열 필수(빈 배열≠키 누락 — "점검했으나 없음"/"점검 안 함" 구분), `status` 5값은 **상담록 단계 전용 어휘**(`observed|inferred|contested|missing_required|review`; 증거 단계 어휘 `filled|partial|missing|conflicted` 금지 — 변환은 Part 2 책임), `calculation_readiness`는 `operand_gaps` 결손 열거만(`operand_state` 금지 — 준비도 판정은 Part 2 소관), `severity`에 `block` 금지(차단은 하류 게이트 권한). 폐지된 고정 4 profile(`monetary_claim_profile`→E-02, `secured_property_dispute_profile`→E-10, `actio_property_transfer_profile`→E-13, `possession_lien_succession_profile`→E-11/E-10/E-15 3분할) 이름 사용 금지.
|
||||
- **실패 정책**: 스크리닝 루트 키·후보 공백 시 `FAILED: domain_screening`, 어휘 목록 도메인 절 수와 후보 수 불일치 시 `FAILED: candidate_profile_vocabulary`.
|
||||
|
||||
### 4.5 Task_Evidence_shard_planner — 증거 샤딩·fan-out 계획 (code)
|
||||
|
||||
- **유형/설정**: run_code python, `timeout: 180`. (v3 무변경)
|
||||
- **목적**: `evidence_all.json`의 문서 N건을 세어 문서별 shard 파일을 분리 기록하고, B1/B2 mapper fan-out·배리어·streaming edge를 결정론으로 계획한다. 법률 판단 0 (`non_legal_assertions` 7항 전부 true).
|
||||
- **내부 단계**: ① `evidence_all.json` 적재(`_items`: 배열 또는 items/documents/… 키; 0건이면 예외) → ② 기존 part 열거(list_docs; `evidence_indexed_parts/`·`evidence_event_candidate_parts/`의 `E-*.json`)와 **stale part 검출**(허용 ordinal 1..N 밖 파일) → ③ 문서별로 `evidence_shards/E-{nnn}.json` 기록 + shard 디스크립터 생성(`assigned_ordinal`(1-based 배열 순서 — `no_legal_sorting`·`no_content_based_reordering`), `evidence_index_candidate: E-{nnn}`, `b1_task_id`/`b2_task_id`, `b1_output_path`/`b2_output_path`, `shard_doc_path`, `source_document_ref`(doc_uid/title 후보 + `content_sha256`), `runtime_bindings`(`__assigned_ordinal__` 등)) → ④ `streaming_edges`(B1→B2 same-ordinal, `condition: {file_exists: b1_output}`) → ⑤ plan 조립: `schema_version: evidence_shard_plan.v1`, `expected_ordinals`/`expected_evidence_ids`, `ordinal_policy`, `shards`, `dynamic_fanout`(=shards), `fanout_meta`(B1_evidence_doc_fanout / B2_event_candidate_fanout — instance_id·output_path 템플릿·`wait_until_template`), `barriers`(B1_all_parts_barrier → `Task_B1_quality_gate_evidence_indexed`; B2_all_parts_barrier(+B1 게이트) → `Task_B2_quality_gate_event_candidates`), `stale_part_policy`(mode block + downstream 게이트 지시문) → ⑥ stale이 있으면 `planner_status: BLOCKED_BY_STALE_PARTS` + `mapper_execution_allowed: false`, 아니면 `READY`/`true` → ⑦ `evidence_shard_plan.json` 기록 → ⑧ stdout에 `{"dynamic_fanout": <READY일 때만 shards, 아니면 []>, "planner_status", "mapper_execution_allowed"}` — 백엔드 wildcard fan-out이 이 stdout을 읽어 인스턴스를 만든다.
|
||||
|
||||
### 4.6 Task_B1_map_doc_* — 문서별 authority/component mapper (LLM ×N)
|
||||
|
||||
- **유형/설정**: LLM 템플릿, `max_concurrency: 12`, preflight_files: `{{item.shard_doc_path}}`, `client_meeting.md`, `Default_Agent/routing/evidence_component_union.md`. google `gemini-3.1-flash-lite`, high/medium, cache 20m.
|
||||
- **목적**: 배정된 단일 증거문서에서 authority component·document component envelope·legal component envelope을 추출한 part 파일 1개를 작성. N 계산·ordinal 배정·fan-out 설계·최종 파일 작성은 전부 금지(planner/게이트 권한).
|
||||
- **작업 내역**: shard 1건 + 상담록(보조: asset_id·property_label 등 9목적 한정) 독해 → 단일 item object 생성 → `write_file`로 `evidence_indexed_parts/E-{ordinal:03d}.json` → 존재 확인 → `"E-{ordinal:03d} mapper part 작성 완료"` 출력. 충돌 규칙: 현재 문서 우선(예외: 등기원인 `매매`라도 실질 대물변제 직접 서술 시 `대물변제` 허용).
|
||||
- **산출 계약** (`<PART_FILE_OUTPUT_SCHEMA>`): 필수 `evidence_index_proposed(E-{ordinal:03d})`, `doc_uid(DOC-{ordinal}-{title normal})`, `title`, `title_normalized`, `doc_type`(6 enum), `key_facts/dates/amounts/parties`, `source_pointer` + optional 컴포넌트 층 약 25종(`registry_row_components`(row별 `registry_ref: REG-{ordinal}-{seq}`, `fraction_ref: FR-…`), `secured_debt_components`, `loan_components`(named schema, 이율 원문 문자열만·환산 금지), `notice_components`(5 lifecycle 날짜 분리 — drafted/dispatch/arrival/received/legal_effect_date_candidate; 민법 제111조 도달주의 주석), `claim_document_components`, `business_transfer_components`, `valuation_object`/`valuation_rows`/`valuation_matrix`, `contract_components`, `admission_components`/`defense_components`/`defense_assertions`, `schedule_items`(`SCH-{ordinal}-{seq}`), `succession_document_components`, `legal_calculation_object(s)` 등) + **`registry_component_ids`**(P0 판정 B — 합집합 파일 component_id만, `accepted_source_kinds` 제한, 빈 배열의 의미는 "이 문서 범위에서 판단하지 않음") + `mapper_meta{mapper_task, schema_contract_version: "evidence_indexed_part.v4", self_isolation_attested: true}`.
|
||||
- **금지(전수)**: 타 ordinal 처리/사실 주입(authority drift), N 재계산, ordinal 재정렬, fan-out 설계, 최종 `evidence_indexed.json` 작성, 타 part 읽기, root 탐색, 자기 part 재읽기, cross-document 결론, 사실 창작.
|
||||
- VALIDATION_GATES는 self-warning/self-error 27항(예: 등기부 접수번호 누락=self-error, 별지목록 `schedule_items` 누락=self-error, 사후 말소 row release role 누락=self-error) — part에 남겨도 되며 최종 severity는 게이트 판정.
|
||||
|
||||
### 4.7 Task_B2_map_events_* — 문서별 event/state candidate mapper (LLM ×N)
|
||||
|
||||
- **유형/설정**: LLM 템플릿, `max_concurrency: 12`, preflight_files: `{{item.shard_doc_path}}`, `{{item.b1_output_path}}`, `client_meeting.md`. 모델 설정 B1과 동일.
|
||||
- **목적**: 같은 ordinal의 raw event + legal-effect event 후보를 추출해 part 1개 작성. same-ordinal B1 part 완료 후 시작(planner streaming edge 소비).
|
||||
- **작업 내역**: B1 part(authority metadata) + shard + 상담록(보조 6목적 한정) 독해 → 후보 추출(EXTRACTION_SCOPE 9범주; 특화 루틴 6종: REGISTRY(갑구/을구 row별)·MIXED_CONTRACT(계약성립/대가수수/인도/관리·사용 4종 분리)·NOTICE_AND_RESPONSE·VALUATION(0건 판단 금지)·STATUS_DOCUMENT·SUCCESSION(`succession_candidate` 하위 5배열)) → **`<PART_SCHEMA_SELF_VALIDATION_AND_CORRECTION>`**: write 전 6 invariant 검증, 불량 시 내부 보정, 보정 실패 시 **part 미작성** + `FAILED: E-{ordinal:03d} event candidate part schema invariant violation` 보고 → 통과 시에만 write → 존재 확인 → `"E-{ordinal:03d} event candidates part 작성 완료"`.
|
||||
- **산출 계약**: 단일 item. `event_candidates`(각: `candidate_id_proposed: EVT-{ordinal:03d}-{seq:02d}`, `event_or_state`, `event_kind`(32 enum), `event_subkind`(REQUIRED_EVENT_SUBKINDS — 금전채권 9종/담보부 부동산 12종/사해행위취소 12종/유치권·상속·통지 계열; `*_by_fraction`은 `fraction_ref` 필수), `action_type_candidate`(6 enum), `participants` 4배열, `current_state_candidate`(4축: possessor/user/benefit_holder/right_holder + interval + `possession_legal_cause_asserted`), `legal_effect_candidate`, `defense_candidate`, `commercial_successor_candidates`, `meeting_clause_refs`(`1-가` 형식), `actio_relevance_candidates`(role tag 9종), `identity_signature`(중복 제거용 정규화 문자열), `confidence`) — 0건이면 `zero_event_reason` 4 enum(`NO_LEGAL_EVENT_FOUND|REFERENCE_ONLY_DOC|PARSE_INSUFFICIENT|ORDINAL_MATCH_FAILED`) 필수. `mapper_meta.schema_contract_version: "evidence_event_candidate_part.v4"`.
|
||||
|
||||
### 4.8 Task_B1_quality_gate_evidence_indexed — B1 결정론 게이트 리듀서 GA-1 (code)
|
||||
|
||||
- **유형/설정**: run_code python, `timeout: 240`.
|
||||
- **목적**: B1 part 전수를 결정론 검사로 통합해 최종 `evidence_indexed.json`을 finalize하고, 의심 항목은 suspects로 좁혀 후속 LLM 판정(GB)에 넘긴다.
|
||||
- **내부 단계 순서**: ① plan 적재, `planner_status`≠READY면 FAILED 출력+예외(下流 진행 금지) → ② CHECK 1 **shard completeness**: stale part=hard finding, expected_ordinals 전수 read(누락/파싱 실패 시 최종 파일 미작성 FAILED), list_docs로 plan 밖 초과 part 검출(`unexpected_ordinal` hard) → ③ CHECK 2 **evidence index determinism**: `evidence_index_proposed`가 정확히 `E-{o}`인지(위반=hard `evidence_index_format_mismatch`) → ④ CHECK 3 **duplicate document alias**: exact 일치(doc_uid 또는 title_normalized+key 3종 joint identity)만 자동 dedup(canonical=최소 ordinal; `dropped_aliases` 기록), 유사쌍(제목만 동일 또는 키 3종만 동일)은 삭제 없이 `R-ALIAS` suspect 등록 → ⑤ CHECK 4 **document component coverage**: COVERAGE_RULES 표 7행(registry/claim/schedule/business_transfer/valuation/succession/defense) + notice_dates + loan_rates 규칙 위반 → `R-COVERAGE` suspect → ⑥ CHECK 5 **authority drift**(전역 상시검사에서 의심신호 spot-check로 강등): 신호 3종(핵심 doc type의 key_dates·amounts 공백 / `source_pointer.ordinal` 불일치(escalation) / mapper self-warning의 drift 문구) 감지 시 해당 shard 원문 1500자 발췌 포함 `R-DRIFT` suspect → ⑦ finalize: `evidence_index_proposed`→`evidence_index` 개명, `mapper_meta` 제거, dropped 제외 → envelope `{"schema_contract_version": "evidence_indexed.v3", "items": [...]}` → ⑧ **보존 불변식**(개수/ID 집합/정렬; 위반 시 미기록 FAILED) + 직렬화 후 재검증(자기 파일 재읽기 없이 문자열 기준) → ⑨ 기록 3종: `evidence_indexed.json`, `finalized_evidence_id_manifest.json`(`finalized_evidence_id_manifest.v1`; finalized ids + dropped_aliases), `B1_precheck.json`(`B1_precheck.v1`; deterministic_checks 5종, hard_gate_findings, review_candidates, suspects, conservation, block) → ⑩ stdout 단일 JSON `status: B1_DETERMINISTIC_GATE_DONE`(+ `pending_adjudication: PENDING_ADJUDICATION|NO_SUSPECTS`).
|
||||
|
||||
### 4.9 Task_B2_quality_gate_event_candidates — B2 결정론 게이트 리듀서 GA-2 (code)
|
||||
|
||||
- **유형/설정**: run_code python, `timeout: 240`.
|
||||
- **목적**: B2 part 전수를 결정론 검사로 통합해 `evidence_event_candidates.json`을 finalize하고, B1 suspects·review candidates와 자기 suspects를 묶은 **B12 exception pack**을 만든다.
|
||||
- **내부 단계**: ① plan + `finalized_evidence_id_manifest.json`(B1 최종 ID 집합; 없으면 예외) + `B1_precheck.json`(suspects·review_candidates 인수) 적재 → ② **schema invariant gate**: part별 `evidence_index_proposed` 일치, `event_candidates`/`zero_event_reason` invariant, 후보 필수 3필드(`candidate_id_proposed, source_evidence_index_proposed, identity_signature`) — 위반 part는 BLOCK finding + `rerun_target_task: Task_B2_map_events_{ordinal}` 지정, 최종 items에서 제외 → ③ CHECK 2 **evidence reference integrity**: 후보의 `source_evidence_index_proposed`가 manifest 집합 밖이면 hard `invalid_evidence_reference` → ④ CHECK 3 **candidate id collision**: `EVT-{o}-{seq}` 형식·ordinal 일치·part 내 유일성(위반=hard) + **cross-document exact `identity_signature` dedup**(canonical_rank: raw>derived, confidence, support_locators 수, 이른 ordinal; drop은 `dedup_findings`에 전수 기록) → ⑤ CHECK 4 **chronological ordering**: CHRONO_RULES 11쌍(예: `underlying_claim_arising < first_demand`, `preserved_claim_arising < fraudulent_transfer`)의 명시 날짜 역전 스캔 → `R-CHRONO` suspect(역전=escalation), chain 관여 null 날짜도 suspect → ⑥ CHECK 5 **legal_effect_event_coverage**: REQUIRED_EVENT_SUBKINDS rule table 9규칙(business_transfer↔successor liability, claim doc↔demand/acknowledgement, 사후말소↔`value_compensation_exception_trigger`, auction chain, 미등기 cue, lien dispatch↔receipt, succession flag, cap calculation, fraction null) → `R-EVTCOV` suspects → ⑦ **R-SELFWARN**: 항변 신호(`defense_candidate`/`defense_assertion` subkind/`effect_type=defense_assertion`) 결정적 재현 → suspect → ⑧ finalize: `candidate_id_proposed`→`candidate_id`, `source_evidence_index_proposed`→`source_evidence_index`, dedup drop 반영, B1 dropped alias ordinal·schema BLOCK ordinal 제외 → envelope `{"schema_version": "evidence_event_candidates.v1", "items": [...]}` → ⑨ **후보 보존 산술**(input = final + dedup + blocked + b1_dropped; silent loss 검출) + 직렬화 후 재검증 → ⑩ 기록 3종: 최종 파일, `B2_precheck.json`(`B2_precheck.v1`), **`B12_exception_pack.json`**(`B12_exception_pack.v1`; B1 suspects + B1 review_candidates(→`B1-RC-*` R-SELFWARN 항목화) + B2 suspects, 예산: exception당 evidence 2·candidate 8·발췌 1500자, 초과는 overflow_items) → stdout `status: B2_DETERMINISTIC_GATE_DONE`.
|
||||
|
||||
### 4.10 Task_B12_gate_llm_adjudicator — 예외 국소 판정기 GB (LLM)
|
||||
|
||||
- **유형/설정**: LLM. google `gemini-3.1-flash-lite`, `llm_reasoning: low`, `llm_verbosity: low`, cache 20m, preflight_files: `stage1_tmp/quality_gate/B12_exception_pack.json`. 역할 프리픽스는 `VALIDATION_GATE`.
|
||||
- **목적**: 결정적 리듀서가 좁힌 suspect만 pack 내장 payload/excerpt로 항목별 판정. 병합·집계·최종 파일 작성 금지(전부 결정적 task 소관).
|
||||
- **작업 내역**: pack 1개만 read(추가 read 전면 금지) → `exception_count==0`이면 `{"schema_version":"B12_adjudication_decisions.v1","decisions":[],"no_suspects":true}` 기록 후 `"NO_SUSPECTS"` 출력 종료 → 아니면 exception마다 decision 1개: `DISMISS` / `SOFT_WARNING_REVIEW` / `HARD_WARNING_REVIEW` / `CONFIRM_BLOCK`(provenance 오염·source trace 상실·identity collision 실확인만) / `ESCALATE_TO_REVIEW`(escalation_flag+pack만으로 확정 불가 — 인간 변호사 검토 큐 라우팅) → decisions 파일 기록(스키마: exception_id, decision, severity(PASS|SOFT_WARNING|HARD_WARNING|BLOCK), issue_type(snake_case), `source_refs`는 **named object 강제**(`evidence_indexes/event_candidate_ids/meeting_clause_refs/doc_titles` — 배열형 출력 금지), review_instruction ≤120자, candidate_use_policy 3값, concise_basis ≤120자) → `"B12 예외 판정 완료 (decisions=<건수>)"` 출력.
|
||||
- **rule_id별 판정 기준** (ADJUDICATION_LEGAL_STANDARDS 전수): R-ALIAS(동일 확정+trace 위험=CONFIRM_BLOCK / 의심=HARD / 별개=DISMISS), R-COVERAGE(실존 개연성 있는 공백=HARD / 자연스러운 부재=DISMISS), R-DRIFT(주입 확인=CONFIRM_BLOCK / 불가=ESCALATE / 무근거=DISMISS), R-CHRONO(같은 chain 실질 모순=HARD 또는 ESCALATE / 우연 교차=DISMISS), R-EVTCOV(실질 누락=SOFT/HARD / 기계적 공백=DISMISS), R-SELFWARN(원칙 SOFT + `preserve_as_needs_review`).
|
||||
|
||||
### 4.11 Task_B12_gate_audit_finalizer — 결정론 감사 확정기 GC (code)
|
||||
|
||||
- **유형/설정**: run_code python, `timeout: 120`.
|
||||
- **목적**: precheck 2종 + 판정 + pack을 병합해 최종 audit 2종(`quality_gates/B1_evidence_indexed_gate.json`, `quality_gates/B2_event_candidates_gate.json`)을 결정론으로 기록.
|
||||
- **내부 단계**: 입력 4종 적재(pack/decisions는 실패 시 빈 기본값 허용) → 게이트별 `build_audit`: deterministic_checks 인계 → hard finding 채번(`{gate}-HARD-{nnn}`) → exception×decision 병합 — **판정 누락 exception은 보수적으로 `ESCALATE_TO_REVIEW`/HARD_WARNING 승격(silent pass 금지)**, `DISMISS` 탈락, `CONFIRM_BLOCK`은 hard로 승격(+drift check에 반영), 나머지는 review_findings(`{gate}-REV-{nnn}`, `MAX_REVIEW_ITEMS=40`, `target_stage_hints: ["Stage_2"]`) → check severity를 worst로 상향 → B2에는 `schema_invariant_findings`·`rerun_targets`·`dedup_findings`·`conservation` 포함 → `overall_severity`(BLOCK/HARD_WARNING/SOFT_WARNING/PASS), `downstream_progression`(BLOCKED/ALLOWED/ALLOWED_WITH_WARNING), `stage2_auto_progression_allowed`, `handoff_export_summary`(handoff writer task·경로·`handoff_status_candidate` 선언) → `schema_contract_version`: `B1_quality_gate.v3` / `B2_quality_gate.v3`, B2의 `review_gate_summary`에 b1/b2 count 병기 → 기록 2종 → stdout `status: GATE_AUDITS_FINALIZED`(BLOCK 발생 시 message에 명시).
|
||||
|
||||
### 4.12 Task_D0_domain_activation_gate — 도메인 활성화 게이트 (code, 모듈 위임)
|
||||
|
||||
- **유형/설정**: run_code python, `timeout: 240`. **판정 로직을 YAML에 쓰지 않는다** — `stage1_runtime/activation_gate.py`를 반입해 호출하고 `signals/adapters/sg01_activation_adapter.py`로 자기검증한다(헤더 명문). 결정 필드는 `execution_eligible` 하나(D-3 넓은 정의).
|
||||
- **내부 단계 순서 (배포 게이트 → 적재 → 계산 → 검사 → 기록)**:
|
||||
1. **자산 반입(materialize)**: `runtime_manifest.json` 적재 → 모듈 미러 5종(`.txt`)을 read_raw → **sha256을 manifest entries와 대조**(`MODULE_MIRROR_UNREGISTERED` / `MODULE_MIRROR_HASH_MISMATCH` → 실행하지 않음) → `/tmp/s1/_rt/<name>.py` 기록 → CASE_INPUTS 5종·`_registry_index.json` 스테이징 → **index가 선언한 `config_path`만 따라** 26개 domain_config 스테이징("목록을 이 코드가 만들지 않는다") → 스키마 문서 스테이징(실패는 `SCHEMA_DOC_STAGE_SKIPPED` 경고) → `sys.path` 삽입 + `os.chdir(/tmp/s1)`.
|
||||
2. **모듈 호출(run_module)**: `activation_gate.main(["--asset-root","Default_Agent/","--execution-root","/tmp/s1","--logical-root","/tmp/s1"])` — 실행 뿌리 3개는 D-5 §2.4 0-c-2 확정값, argv로만 전달. stdout 격리(redirect_stdout), 모듈 stdout JSON 파싱(`MODULE_STDOUT_NOT_JSON`), rc≠0 또는 FAILED면 모듈의 실패 코드를 그대로 실어 예외(`ACTIVATION_GATE_FAILED` 폴백).
|
||||
3. **어댑터 자기검증(self_validate)**: 산출 파일(`/tmp/s1/routing/domain_activation_manifest.json`, 부재 시 `ARTIFACT_NOT_WRITTEN`)을 읽어 `sg01_activation_adapter.adapt_and_validate({"part1_activation_gate_output": document})` 호출 — 실패 시 **아무것도 기록하지 않는다**.
|
||||
4. **기록**: 모듈이 만든 **바이트를 그대로** `routing/domain_activation_manifest.json`으로 업로드(재직렬화 금지) + list_docs 확인.
|
||||
- **stdout 계약** (성공): manifest 발췌 — `status, signal_id, schema_version, registry_version, registry_index_sha256, screening_sha256, activation_manifest_sha256(원문 바이트 해시), canonicalization_profile_id, domain_entry_count, expected_runnable_domain_ids, active/supporting/monitor count, required_calculation_domains, review_item_count, conservation_gate(unrouted_count/conservation_pass), staged 카운트, adapter_self_validation: "PASS"`. 실패: `{"status":"FAILED","written":false,"adapter_self_validation":"NOT_REACHED","errors":[{code,…}]}` — "실패 코드를 손대지 않고 그대로 싣는다. 조용한 폴백을 두지 않는다."
|
||||
- **산출 인계 계약** (인계면 required_keys 17): `active_domain_ids, conservation_gate, contract_guards, domain_entries, expected_runnable_domain_ids, fail_open_policy, monitor_domain_ids, registry_index_sha256, registry_version, required_calculation_domains, review_items, schema_version, screening_sha256, signal_id, status, supporting_domain_ids, unrouted_material` — "필수 키는 그 모듈이 만든다", `active ⊆ eligible`.
|
||||
|
||||
### 4.13 Task_B2_SHA256_soft_gate_handoff_writer — 봉인·소프트게이트 인계 기록자 T9 (code)
|
||||
|
||||
- **유형/설정**: run_code python, `timeout: 180`.
|
||||
- **목적**: Part 1 최종 산출 원문의 sha256 봉인 사전(`digest_guard`)과 검토 항목 통합 큐를 담은 sidecar `quality_gates/stage1_part1_soft_gate_handoff.json`을 기록해 Part 2로 넘긴다. v4에서 봉인 3종(`screening / activation_manifest / registry_index`)이 추가되었다(헤더 명문).
|
||||
- **내부 단계**: ① INPUT_PATHS **7종 전부 read_raw**(재직렬화 금지 — digest는 원문 바이트 sha256; `digest()`가 64-hex 검증) → ② B1/B2 audit에서 review_findings 추출 → 압축 review item(`P1RG-{nnnn}`; severity 정규화, `lawyer_workflow_role` 8종(`claim_right_identification`~`actio_value_compensation_check`) 키워드 라우팅, `source_refs` named object 재구성, `candidate_use_policy` 검증, `negative_instruction: "사실 확정 또는 자동 차단으로 취급하지 말 것"`, 상한 40) → ③ **활성화 매니페스트 봉인 교차검증**(`verify_seal_consistency`): 매니페스트가 자기 기록한 `screening_sha256`·`registry_index_sha256`과 본 task 원문 계산값 불일치 시 `SEAL_FAILED` 예외 → ④ **D0 review_items 병합**(`P1DA-{nnnn}`; 규칙 셋 — 코드 무변형(clean_enum 미통과), `blocks_final_drafting=true` 항목을 큐 상단에, 하류 감축 금지 floor 명시) → 최종 순서: blocking D0 items → P1RG items → non-blocking D0 items → ⑤ `routing_index` 7버킷(by_evidence_index / by_event_candidate_id / by_meeting_clause_ref / by_issue_type / by_domain_hint / by_target_stage / by_lawyer_workflow_role)과 `lawyer_workflow_queues`(8역할) 구축 → ⑥ hard findings 집계(audit의 hard + BLOCK 상태 게이트) → `handoff_status`: `BLOCKED` / `READY_WITH_REVIEW` / `READY_NO_REVIEW`, `stage2_auto_progression_allowed = not blocked` → ⑦ sidecar 기록(루트 래핑 없이): `schema_version: "stage1_part1_soft_gate_handoff.v1"`, `source_stage: "Stage_1.Part_1"`, `source_gate_files`, `hard_gate_summary`, `review_gate_summary`(b1/b2/d0 count + `blocks_final_drafting_count`), `review_item_conservation`(`review_count_floor`, policy `downstream_must_not_reduce_without_recorded_basis`), `activation_seal_crosscheck`, **`digest_guard`**(7키: `evidence_indexed_sha256, evidence_event_candidates_sha256, b1_gate_sha256, b2_gate_sha256, screening_sha256, activation_manifest_sha256, registry_index_sha256`), `review_items`, `routing_index`, `lawyer_workflow_queues` → stdout `status: SOFT_GATE_HANDOFF_WRITTEN`.
|
||||
|
||||
---
|
||||
|
||||
## 5. upstream–downstream 연결 전수 — 연결 이유 · 방식 · 자료 사용 방식
|
||||
|
||||
### 5.1 스크리너 사슬
|
||||
|
||||
| 연결 (up → down) | 연결 이유 | 연결 방식 | 자료 사용 방식 |
|
||||
|---|---|---|---|
|
||||
| IN → Task_A0_domain_screener_01 | 사건 입력만으로 개시 가능한 최앞단 LLM 가설 | 상태 게이트(wait IN) + 파일(`client_meeting.md` preflight) | 상담록 전 문단을 source unit으로 채번, 사전 단서와 매칭해 판단 4종 생성 |
|
||||
| 01 → 02 | LLM 초안은 신뢰 불가 — 결정론 코드가 봉인·검증해야 닫힌 스키마가 됨 | 파일 handoff(`routing/domain_screening_draft.json`) + 순서 게이트 | 02는 초안의 판단 4종만 인수. `source_unit_index`는 **독립 재산출로 대조**(불신뢰 원칙), unmatched는 재계산으로 대체, 비판단 6종은 registry 원문에서 직접 취득. 상태는 올리기만 가능 |
|
||||
| 02 → 03 | 후보가 확정되어야 후보별 config 발췌 대상이 정해짐 | 파일 handoff(`routing/domain_screening.json`) + 순서 게이트 | 03은 `candidates[].domain_id`(발췌 대상 선정)와 `source_document_refs`(SOURCE_UNITS 절 구성), `registry_version`·`registry_index_sha256`(스냅숏 sha 대조 — 낡은 스크리닝 위 발췌 차단)을 소비 |
|
||||
| 03 → Task_A_client_goal | Task_A의 `domain_profiles`는 어휘 목록 없이는 채울 수 없음(원본 26 config 직접 읽기 금지) | 파일 handoff(`routing/candidate_profile_vocabulary.md`) + 순서 게이트 | Task_A는 E/O/V/D/R 줄의 식별자만 사용(목록 밖 ID 생성 금지), `## SOURCE_UNITS`를 `source_refs` 멤버십 기준으로 사용, `## DOMAINS` 절 수와 스크리닝 후보 수 불일치 시 FAILED |
|
||||
| 02 → Task_A_client_goal | 어떤 도메인 칸을 열지는 스크리닝이 정함 + 추적층 필요 | 파일 handoff(`routing/domain_screening.json`) | `candidates[].domain_id`로 칸 개방 화이트리스트, `source_document_refs`로 ref 멤버십, `domain_screening_ref`층에 schema_version/status/registry_version/**registry_index_sha256(글자 그대로 복사, 계산 금지)**/candidate_domain_ids 복사 |
|
||||
| 03 → (Task_A) → 사슬 종료 | T1은 사슬의 끝. `client_goal.json`은 D0 입력 6종에 안 들어감(task_procedure 근거 4 명문) | `Task_A_client_goal.nexts: []` | Part 3 이후 스테이지가 `client_goal.json`을 읽는다(인계면 note) |
|
||||
|
||||
### 5.2 증거 사슬
|
||||
|
||||
| 연결 (up → down) | 연결 이유 | 연결 방식 | 자료 사용 방식 |
|
||||
|---|---|---|---|
|
||||
| IN → Task_Evidence_shard_planner | 증거 입력만으로 개시 — 스크리너 사슬과 완전 병렬 | 상태 게이트 + 파일(`evidence_all.json`) | 배열 순서 그대로 1-based ordinal 부여(법적 정렬·내용 재정렬 금지), 문서별 shard 분리, `content_sha256` 스탬프 |
|
||||
| planner → Task_B1_map_doc_* (×N) | 문서 수 N과 ordinal은 planner 단독 권한 — mapper는 소비만 | **동적 fan-out**(stdout `dynamic_fanout` → 인스턴스별 `{{item.*}}` runtime parameter) + 파일(`evidence_shards/E-{nnn}.json`) + `planner_status==READY`/`mapper_execution_allowed==true` 게이트(BLOCKED_BY_STALE_PARTS면 fanout 빈 배열) | mapper는 `{{item.assigned_ordinal / evidence_index_candidate / b1_output_path / shard_doc_path / source_document_ref}}`를 단일 source of truth로 소비(plan 파일 재읽기 불요), `content_sha256`/`doc_uid_candidate` 충돌 시 part 미작성 |
|
||||
| B1_map_doc_{o} → B2_map_events_{o} | B2는 same-ordinal B1 part의 authority metadata(`evidence_index_proposed`, `title`, `doc_type`, `source_pointer.ordinal`) 필요 | **streaming edge**(plan `streaming_edges[]`: `condition {file_exists: b1_output}`) + task_procedure `wait_until: ["Task_B1_map_doc_{same_ordinal}"]` + 파일(`{{item.b1_output_path}}`) | B2는 B1 part를 authority로만 참조(예: `registry_row_components[*].fraction_ref` 동일값 인계, `contract_components` 우선 참고)하되 raw shard 확인 생략 금지. 타 ordinal 참조는 authority drift 금지 |
|
||||
| all B1_map_doc_* → B1 quality gate | 전 part가 모여야 완전성·중복·표류를 전수 검사 가능 | **배리어**(plan `barriers.B1_all_parts_barrier`: wait_for_tasks + require_files; task_procedure `wait_until: ["all Task_B1_map_doc_*"]`) + 파일(part 전수) | expected_ordinals 전수 read, plan의 `expected_evidence_ids`·`stale_part_policy.detected_stale_parts`·`shards[].shard_doc_path`(drift 발췌용) 소비 |
|
||||
| B1 gate → B2 gate | B2 후보의 evidence 참조는 B1이 finalize한 ID 집합 안에 있어야 함 + B1 suspects를 pack으로 전달 | 파일 handoff 3종(`finalized_evidence_id_manifest.json` → 멤버십 검사, `B1_precheck.json` → suspects/review 인수, 순서상 `evidence_indexed.json` 선행) + 상태 게이트(B2_all_parts_barrier의 `plus: ["Task_B1_quality_gate_evidence_indexed"]`) | manifest의 `finalized_evidence_indexes`로 `source_evidence_index_proposed` 집합 멤버십 검사(위반=hard), `dropped_aliases`의 ordinal은 B2 최종 items에서도 제외(`dropped_by_b1_alias`), B1 suspects·review_candidates를 exception pack으로 승계 |
|
||||
| all B2_map_events_* → B2 gate | 상동(전수 검사) | 배리어 + 파일(part 전수) | schema invariant 위반 part는 BLOCK + `rerun_target_task` 지정 후 제외 |
|
||||
| B2 gate → B12 adjudicator | 결정론이 좁힌 의심만 LLM이 국소 판정(read-diet) | 파일 handoff(`B12_exception_pack.json` — payload·excerpt 내장, 예산 통제) + 순서 게이트 | adjudicator는 pack **하나만** 읽고 exception_id 전수에 1:1 decision 부여(누락·창작 금지) |
|
||||
| adjudicator → audit finalizer | 판정(비결정론)과 감사 확정(결정론)의 권한 분리 | 파일 handoff(`B12_adjudication_decisions.json`) + 순서 게이트 | finalizer는 decision을 severity로 map(DISMISS 탈락, CONFIRM_BLOCK→hard 승격), **판정 누락 exception은 HARD_WARNING으로 보수 승격** |
|
||||
| B1/B2 precheck·pack → audit finalizer | 결정적 검사 결과와 판정을 병합해 최종 audit 확정 | 파일 handoff(`B1_precheck.json`, `B2_precheck.json`, `B12_exception_pack.json`) | deterministic_checks 인계 후 severity worst 상향, B2 audit에 `schema_invariant_findings`/`rerun_targets`/`conservation` 이관 |
|
||||
|
||||
### 5.3 합류·봉인 구간
|
||||
|
||||
| 연결 (up → down) | 연결 이유 | 연결 방식 | 자료 사용 방식 |
|
||||
|---|---|---|---|
|
||||
| audit finalizer → D0 | D0의 입력 6종 중 게이트 audit 2종이 여기서 확정됨(v3는 T9로 직행 — v8에서 D0 삽입, 헤더 근거 3) | 파일 handoff(`quality_gates/B1…gate.json`, `B2…gate.json`) + 순서 게이트 | D0가 CASE_INPUTS로 스테이징 — 게이트 상태는 반입된 activation_gate 모듈이 소비 |
|
||||
| screener_02 → D0 | **두 사슬의 합류점.** D0의 결정론 판정은 스크리닝 원문 필요. 03이 아닌 02를 기다린다 — D0는 `candidate_profile_vocabulary.md`를 쓰지 않으므로 03 대기는 불필요한 직렬화(task_procedure 명문) | 상태 게이트(`wait_until: [...,"Task_A0_domain_screener_02"]`) + 파일(`routing/domain_screening.json`) | 스크리닝 원문 바이트를 스테이징 — 모듈이 후보·`registry_index_sha256` 등을 읽고 매니페스트에 `screening_sha256`을 자기 기록 |
|
||||
| B1/B2 gate 최종 산출 → D0 | 활성 판정은 증거 최종본(`evidence_indexed.json`, `evidence_event_candidates.json`) 위에서 수행 | 파일 handoff(CASE_INPUTS) | 모듈이 소비(`registry_component_ids` 층 포함). D0 task 자체는 바이트 스테이징만 |
|
||||
| registry 자산 → D0 | 판정 어휘·설정의 정본은 registry — YAML에 판정 로직 금지 | **모듈 반입 + sha 봉인**(`runtime_manifest.json` 해시 대조, 불일치 시 실행 거부) + index `config_path` 추종 | `_registry_index.json`과 26 config를 스테이징, `activation_gate.main(argv)` 결정론 판정, `sg01_activation_adapter`로 산출 자기검증(실패 시 무기록) |
|
||||
| D0 → T9 (handoff writer) | 봉인 사전에 활성화 매니페스트 해시가 들어가야 하고, D0 review_items가 검토 큐에 병합되어야 함(v4 개정 §3.4) | 파일 handoff(`routing/domain_activation_manifest.json`) + 순서 게이트 | T9는 read_raw 원문으로 `activation_manifest_sha256` 계산, **봉인 교차검증**(매니페스트 내부 `screening_sha256`·`registry_index_sha256` vs 자기 계산값 — 불일치는 `SEAL_FAILED`), `review_items`를 `P1DA-*`로 병합(blocks_final_drafting 상단, review_code 무변형) |
|
||||
| B1/B2 최종본 + audit + 스크리닝 + registry → T9 | Part 2가 입력 무결성을 해시로 검증할 수 있어야 함 | **read_raw 원문 sha256 봉인**(digest_guard 7키; 재직렬화 절대 금지) | 7 파일 원문을 해시하여 sidecar에 기록. Part 2 A0가 세 해시를 대조하므로 Part 1 미수행/변조 시 `SEAL_FAILED`로 정지(stage chain enforcement 명문) |
|
||||
| T9 → OUT → Part 2 | Part 1의 인계면 완결 | 파일 handoff(`quality_gates/stage1_part1_soft_gate_handoff.json` + produces 5종) | Part 2 `Task_C_BO_A0…`가 sidecar(digest_guard·review_items·handoff_status)와 produces 4종을 소비. `review_count_floor` 아래로 하류가 근거 없이 검토 항목을 줄일 수 없음 |
|
||||
|
||||
### 5.4 연결 방식 유형 요약
|
||||
|
||||
- **파일 handoff**: 위 표의 전 구간 — 산출 파일이 다음 task의 유일한 자료 통로(콘텍스트 이월 없음, 각 task는 자기 산출 재읽기 금지).
|
||||
- **상태 게이트**: `task_procedure`의 `wait_until` + planner의 `planner_status`/`mapper_execution_allowed` + 게이트의 `downstream_progression`/`stage2_auto_progression_allowed`.
|
||||
- **배리어/스트리밍 엣지**: plan의 `barriers` 2종(require_files 포함), `streaming_edges`(same-ordinal file_exists).
|
||||
- **봉인/sha 검증**: ① 02·03의 registry 스냅숏 대조, ② 03의 `config_sha256` 대조, ③ D0의 모듈 미러 `runtime_manifest` 해시 대조, ④ D0 매니페스트의 자기 기록 해시, ⑤ T9의 digest_guard 7종 + 봉인 교차검증(SEAL_FAILED), ⑥ Part 2 A0의 세 해시 대조(사슬 강제 장치).
|
||||
- **receipt/ID 규약**: `E-{ordinal:03d}`(planner 부여→B1 propose→B1 게이트 finalize), `EVT-{ordinal:03d}-{seq:02d}`(B2 propose→B2 게이트 finalize·dedup), `B1-SUS/B2-SUS/B1-RC-*`(suspect), `{gate}-HARD/REV-*`(audit), `P1RG-*`/`P1DA-*`(review 큐), `MTG.*`(source unit), `REG-/FR-/SCH-/DOC-/IC-*`(문서 내부 참조).
|
||||
|
||||
---
|
||||
|
||||
## 6. 특기사항 (검증 대조 시 유의)
|
||||
|
||||
1. **`activation_cue_digest.md` 실물 머리말에 `registry_version:`/`registry_index:` 줄이 없다.** T0-01 프롬프트의 FAILURE_POLICY는 "머리말에 registry_version이 없으면 `FAILED: activation_cue_digest`"를 지시하는 반면, T0-02 코드는 부재를 `DIGEST_HEADER_ABSENT` 경고로 처리하고 정본(`_registry_index.json`)에서 값을 취한다. 도메인 절(`### `)은 26개로 정합. 프롬프트-자산 간 긴장 지점이므로 Stage 2 명세에서 명시적으로 다뤄야 한다.
|
||||
2. **`Task_A_client_goal`의 OUTPUT_SCHEMA 예시 JSON에 문법 결함이 실물로 존재**한다: `"standing_watchpoints": ["string"]` 뒤 콤마 누락 상태로 `"domain_screening_ref"` 블록이 이어지고 객체가 `},` 로 닫힌다(YAML 2115~2124행 부근). 프롬프트 내 예시라 실행은 되지만 검증자가 "실물과 문자 일치" 대조 시 참고.
|
||||
3. **D0 미러는 5종 전량 반입**이다(`MODULE_MIRRORS` 실측). MEMORY.md의 "자립화로 필수 미러 5→2종" 서술은 과거 개선 계획/중간 상태이며 현재 v.8 실물과 다르다 — 본 문서는 실물(5종)을 기준으로 기재했다.
|
||||
4. `special_law_profiles/`는 배포 트리에 존재하나 **Part 1 YAML의 참조는 0건**이다(grep 실측). Part 1의 자산 소비는 §3 표의 16계열이 전부다.
|
||||
5. `evidence_all.json`의 인계면 required_keys(`documents, source_files, total_count`)와 planner 코드의 수용 키(`items/documents/evidences/evidence/docs` 또는 순수 배열, selector `$.items || $`)는 교집합(documents)으로 정합하나 완전 일치는 아니다.
|
||||
6. LLM 5종의 실효 모델은 전부 `google/gemini-3.1-flash-lite`(Stage 기본 openai/gpt-4o 선언을 task 수준에서 전량 재정의). reasoning/verbosity/cache TTL은 task별 차등(T0-01: high/low/1h, T1·B1·B2: high/medium|medium/20m, GB: low/low/20m).
|
||||
7. `stage1_tmp/` 및 part 디렉터리 산출물은 Part 1 내부 소비 전용이며 Part 경계 인계면(produces 5종 + sidecar)에 포함되지 않는다.
|
||||
8. B1 게이트의 최종 envelope은 `schema_contract_version: "evidence_indexed.v3"`(items 키 우선 소비, Q-3), B1 part는 `evidence_indexed_part.v4`, B2 part는 `evidence_event_candidate_part.v4`, 최종 이벤트 파일은 `evidence_event_candidates.v1` — **버전 문자열이 층마다 다르며 전부 additive 유지가 v8 개정의 핵심 제약**(헤더: "schema_contract_version은 evidence_indexed_part.v4 유지 — 순수 additive다", T9 "stage1_part1_soft_gate_handoff.v1 유지 — 역시 additive다").
|
||||
+699
@@ -0,0 +1,699 @@
|
||||
# Stage 1 Part 2 (BO 생성·시그널 생성) 작업분석서 — 최종 실측판
|
||||
|
||||
> **분석 대상 정본**: `extension_research/ver_8_yaml_candidates/stage_1_part_2_v.8.yml`
|
||||
> **sha256 (첫 16자)**: `f0a22394b26f91ac`
|
||||
> **바이트 크기**: 249,809 B (4,065행)
|
||||
> **분석 기준일**: 2026-08-23
|
||||
> **용도**: Stage 2 작업명세서 설계의 입력. 모든 기재는 YAML 원문·조립본 자산 트리·인계면 정본
|
||||
> (`선행구축/Default_Agent_Stage_1/handoffs/stage1_part_interface.v1.json`, `stage1_stage_chain.v1.json`)·
|
||||
> `MEMORY.md` 개정 내역의 실측에 근거한다. 추측 기재 없음.
|
||||
|
||||
---
|
||||
|
||||
## 0. 스테이지 선언부 요약 (YAML 39~61행 실측)
|
||||
|
||||
| 항목 | 값 |
|
||||
|---|---|
|
||||
| Agent name | `Liti-agent_Civil_Suit_Plaintiff_Stage_1_Part_2` |
|
||||
| Agent version | `v.2` |
|
||||
| Stage name | `stage1_BO_시그널_생성` (1개 스테이지, task_procedure 1벌, tasks 1벌) |
|
||||
| Stage description | BO 생성, 시그널 생성 |
|
||||
| 스테이지 기본 LLM | `llm_provider: openai` / `llm_model: gpt-4o-2024-08-06` (개별 task 가 전부 override) |
|
||||
| MCP 서버 1 | `localdocs` — streamable-http, `http://mcp-localdocs:8012/mcp` (문서 읽기/쓰기) |
|
||||
| MCP 서버 2 | `code-executor` — streamable-http, `https://code-executor.mcp.eroomai.com/mcp` (Python 실행, Bearer 인증 헤더) |
|
||||
| task 구성 | 6종: code 4 (A0·R0·F0·S0) + LLM 2 (domain_worker 템플릿·R1) |
|
||||
| 실행 뿌리 3종 | `--asset-root Default_Agent/` · `--execution-root /tmp/s1` · `--logical-root /tmp/s1` (R0 만 `/tmp/s1_r0`) |
|
||||
| 삭제 승계 | 구 정적 worker `Task_C_BO_Stage_B_B1~B5` 5개(v3 1502~2826행, 1,325행)는 템플릿 fan-out 으로 대체 완료 상태를 전제 |
|
||||
|
||||
머리말(1~38행)이 선언한 확정 계약:
|
||||
|
||||
- slice: `runtime/domain_slices/<domain_id>.json` — `task_c_bo_stage_b_domain_slice.v2`
|
||||
- worker 산출: `runtime/domain_seed_outputs/<domain_id>.json` — `task_c_bo_stage_b_domain_bo_seed.v3`
|
||||
- fan-out 계획: `fanout/domain_fanout_plan.json` — `domain_fanout_plan.v1`
|
||||
- worker 이름: `Task_C_B_domain_worker_*`, 인스턴스 `DOMAIN-<도메인ID>`
|
||||
- 구 slice/seed 경로(`stage1_tmp/task_c_bo/domain_slices|domain_seed_outputs`) 사용 금지(legacy_paths_forbidden)
|
||||
- `stage_a_context`·`source_universe_manifest`(P-1 복귀)와 postb_* 3종은 `stage1_tmp/task_c_bo/` 를 정본 경로로 유지
|
||||
- 모듈 반입: Part 1 D0 규약 R-1~R-5 — `.txt` 미러를 read_raw 로 읽어 `runtime_manifest.json` sha256 과 대조 후 `/tmp/s1/_rt` 에 `.py` 기록, `sys.path` 삽입
|
||||
|
||||
---
|
||||
|
||||
## 1. 전체 작업 DAG flow (task_procedure 4027~4065행 실물과 일치)
|
||||
|
||||
```
|
||||
[Part 1 산출물 (선행 스테이지)]
|
||||
client_meeting.md · evidence_indexed.json · evidence_event_candidates.json
|
||||
routing/domain_screening.json · routing/domain_activation_manifest.json
|
||||
routing/candidate_profile_vocabulary.md · quality_gates/stage1_part1_soft_gate_handoff.json
|
||||
|
|
||||
v
|
||||
IN ──────────────────────────────────────┐
|
||||
v
|
||||
┌──────────────────────────────────────────────────────────┐
|
||||
│ Task_C_BO_A0_context_and_domain_slice_compiler [code] │
|
||||
│ 배포게이트 → 모듈반입 → 봉인검증 → registry 적재/검증 │
|
||||
│ → 프롬프트 조립 → stage_a/universe → slice 컴파일 │
|
||||
│ → fan-out 계획 → 영수증 기록 → dynamic_fanout 반환 │
|
||||
└──────────────────────────────────────────────────────────┘
|
||||
|
|
||||
dynamic_fanout (반환 JSON, agent.py _extract_fanout_items)
|
||||
+ 파일 handoff: compiled_prompts/<id>.md · domain_slices/<id>.json
|
||||
|
|
||||
┌───────────────────────────┼───────────────────────────┐
|
||||
v v v
|
||||
┌────────────────────┐ ┌────────────────────┐ ┌────────────────────┐
|
||||
│ Task_C_B_domain_ │ │ Task_C_B_domain_ │ ... │ Task_C_B_domain_ │
|
||||
│ worker_* (LLM) │ │ worker_* (LLM) │ │ worker_* (LLM) │
|
||||
│ DOMAIN-<id> 인스턴스│ │ 활성 도메인 병렬 xM │ │ max_concurrency 8 │
|
||||
└────────────────────┘ └────────────────────┘ └────────────────────┘
|
||||
| | |
|
||||
└───────────── seed 파일: runtime/domain_seed_outputs/<id>.json ────┘
|
||||
|
|
||||
barrier — "all Task_C_B_domain_worker_*" 정확 일치
|
||||
(누락·초과·중복 모두 실패. 기대집합 = fan-out 계획)
|
||||
v
|
||||
┌──────────────────────────────────────────────────────────┐
|
||||
│ Task_C_BO_R0_seed_reducer_and_exception_planner [code] │
|
||||
│ seed 수용(admission)·투영·원장 구성·예외 계획 │
|
||||
└──────────────────────────────────────────────────────────┘
|
||||
|
|
||||
파일 handoff: exception_pack (preflight)
|
||||
v
|
||||
┌──────────────────────────────────────────────────────────┐
|
||||
│ Task_C_BO_R1_exception_adjudicator [LLM] │
|
||||
│ 조건부 — has_exceptions=false 면 no-exception 객체만 기록│
|
||||
└──────────────────────────────────────────────────────────┘
|
||||
|
|
||||
파일 handoff: postb_adjudication_decisions.json (조건부 필수)
|
||||
v
|
||||
┌──────────────────────────────────────────────────────────┐
|
||||
│ Task_C_BO_F0_final_bo_compiler_gate_writer [code] │
|
||||
│ ledger+decisions → BO.json 컴파일 · 6게이트 · 기록 │
|
||||
└──────────────────────────────────────────────────────────┘
|
||||
|
|
||||
파일 handoff: BO.json (bh# 확정)
|
||||
v
|
||||
┌──────────────────────────────────────────────────────────┐
|
||||
│ Task_C_BO_S0_signal_bundle_writer [code] │
|
||||
│ signal 모듈 24종 반입 → 정본 signal 거래 1건 기록 │
|
||||
└──────────────────────────────────────────────────────────┘
|
||||
|
|
||||
v
|
||||
OUT
|
||||
(Part 3/4·Stage 2 로: BO.json · signals/* · review_handoff 등)
|
||||
```
|
||||
|
||||
task_procedure 원문 대조표 (4027~4065행):
|
||||
|
||||
| 노드 | nexts | wait_until |
|
||||
|---|---|---|
|
||||
| `IN` | `["Task_C_BO_A0_context_and_domain_slice_compiler"]` | `[]` |
|
||||
| `Task_C_BO_A0_context_and_domain_slice_compiler` | `["Task_C_B_domain_worker_*"]` | `["IN"]` |
|
||||
| `Task_C_B_domain_worker_*` | `["Task_C_BO_R0_seed_reducer_and_exception_planner"]` | `["Task_C_BO_A0_context_and_domain_slice_compiler"]` |
|
||||
| `Task_C_BO_R0_seed_reducer_and_exception_planner` | `["Task_C_BO_R1_exception_adjudicator"]` | `["all Task_C_B_domain_worker_*"]` (barrier — 정확 일치) |
|
||||
| `Task_C_BO_R1_exception_adjudicator` | `["Task_C_BO_F0_final_bo_compiler_gate_writer"]` | `["Task_C_BO_R0_seed_reducer_and_exception_planner"]` |
|
||||
| `Task_C_BO_F0_final_bo_compiler_gate_writer` | `["Task_C_BO_S0_signal_bundle_writer"]` | `["Task_C_BO_R1_exception_adjudicator"]` |
|
||||
| `Task_C_BO_S0_signal_bundle_writer` | `["OUT"]` | `["Task_C_BO_F0_final_bo_compiler_gate_writer"]` |
|
||||
| `OUT` | `[]` | `["Task_C_BO_S0_signal_bundle_writer"]` |
|
||||
|
||||
스테이지 수준 `prevs: []` / `nexts: []` (이 파일 단독으로 한 스테이지).
|
||||
worker 인스턴스 수 M 은 상수가 아니라 `domain_fanout_plan.task_instances[]` 가 정한다
|
||||
(활성화 매니페스트의 `expected_runnable_domain_ids`; 실주행 실측 14인스턴스 — MEMORY ㉛·㉜).
|
||||
|
||||
---
|
||||
|
||||
## 2. IO — task 별 입력·출력 파일 전수
|
||||
|
||||
경로는 전부 워크스페이스(localdocs) 논리 경로. `Default_Agent/…` 는 조립본(읽기 전용 자산),
|
||||
그 외는 사건 산출물. `/tmp/s1…` 는 code-executor 컨테이너 로컬 스테이징(워크스페이스 밖)이다.
|
||||
|
||||
### 2.1 Task_C_BO_A0_context_and_domain_slice_compiler
|
||||
|
||||
**입력 (읽기 전수)**
|
||||
|
||||
| 경로 | 포맷 | 생산자 | 용도 |
|
||||
|---|---|---|---|
|
||||
| `Default_Agent/runtime_manifest.json` | json | 배포 파이프라인 | 배포 게이트·미러 해시 대조 (schema `stage1_runtime_manifest.v1`, 실측 465 entries) |
|
||||
| `Default_Agent/stage1_runtime/{runtime_common,schema_subset_validator,registry_loader,registry_validator,prompt_compiler,domain_slice_compiler,domain_fanout_planner,stage_a_context_builder}.txt` | txt(py 미러) 8종 | 조립본 | MODULE_MIRRORS — R-1~R-5 반입 |
|
||||
| `PART2_REQUIRED_ASSETS` 11종 (§3.2 표) | json/md/txt | 조립본 | F-2 배포 완전성 게이트 (등재+해시, 읽기만) |
|
||||
| `quality_gates/stage1_part1_soft_gate_handoff.json` | json | Part 1 `Task_B2_SHA256_soft_gate_handoff_writer` | `digest_guard` 봉인 3해시 원천 |
|
||||
| `routing/domain_screening.json` | json | Part 1 `Task_A0_domain_screener_02` | 봉인 원문 바이트(screening_sha256) + `candidates[].requested_calculation_domains` 파싱(R-2) |
|
||||
| `routing/domain_activation_manifest.json` | json | Part 1 `Task_D0_domain_activation_gate` (module `activation_gate.py`) | 봉인 원문 + `execution_eligible`/`expected_runnable_domain_ids` (D-3: execution_eligible 이 유일 결정 필드) |
|
||||
| `Default_Agent/domains/_registry_index.json` | json | 조립본 | 봉인 원문(registry_index_sha256) + registry 적재 시작점 (26 도메인) |
|
||||
| `Default_Agent/domains/<domain_id>/domain_config.json` (26종) | json | 조립본 | registry 적재 — index 의 `config_path` 를 따라감 |
|
||||
| `Default_Agent/domains/<domain_id>/seed_prompt_overlay.md` (25종: E-00~E-21·X1~X3) + `Default_Agent/domains/EC-00/common_fragment.md` | md | 조립본 | 프롬프트 조각 — config 의 `prompt_overlay_ref` 선언을 따라감 (이름을 짓지 않음) |
|
||||
| `Default_Agent/special_law_profiles/_registry_index.json` | json | 조립본 | 특별법 profile registry (부재는 경고 후 진행) |
|
||||
| `Default_Agent/special_law_profiles/{SLP-IP,SLP-MEDIA-MEDIATION,SLP-PRODUCT-LIABILITY}/prompt_overlay.md` | md 3종 | 조립본 | profile 조각 — index 의 `prompt_overlay_path` 를 따라 `profile_paths` dict 구성 (MEMORY ㉚: 인자 미전달이 즉사 원인이었음) |
|
||||
| `Default_Agent/domains/_common/common_worker_contract.md` | md | 조립본 | rank 10 공통 계약 조각 |
|
||||
| `Default_Agent/stage1_runtime/prompt_composition_policy.json` | json | 조립본 | 조립 정책 (`prompt_composition_policy.v2`, rank 10→20→30→40→50, size guard — 실물 정책·컴파일러에 수치 상한 없음, 관측 전용. '상한 96,000 B / 24,000 자'는 YAML 556행 낡은 주석 표기(MEMORY ㉚ 이월 ④ 실측)) |
|
||||
| `Default_Agent/platform/schemas/domain_slice.schema.v2.json` | json | 조립본 | slice 스키마 + F-3 능력 검사 대상 |
|
||||
| `Default_Agent/platform/schemas/domain_fanout_plan.schema.json` | json | 조립본 | fan-out 계획 스키마 |
|
||||
| `routing/candidate_profile_vocabulary.md` | md | Part 1 screener 03 | R-3 어휘 사전 → `candidate_profile_vocabulary` 조각(category `common_dependency`). 부재는 경고 진행 |
|
||||
| `evidence_indexed.json` | json | Part 1 `Task_B1_quality_gate_evidence_indexed` | evidence authority map (C-1: `registry_component_ids` 통과) + digest |
|
||||
| `evidence_event_candidates.json` | json | Part 1 `Task_B2_quality_gate_event_candidates` | event 후보 원천 + digest |
|
||||
| `client_meeting.md` | md | 사건 입력 (producer_task null) | meeting_clause_ids 원천 — 원문을 읽어야 나옴 (실측 확인 주석) |
|
||||
|
||||
**출력 (쓰기 전수)**
|
||||
|
||||
| 경로 | 포맷 | 스키마/root | 소비자 |
|
||||
|---|---|---|---|
|
||||
| `runtime/compiled_prompts/<domain_id>.md` | md (패턴) | rank 합성 프롬프트 | `Task_C_B_domain_worker_*` (재조립 금지, `compiled_prompt_sha256` 일치 요구) |
|
||||
| `runtime/domain_slices/<domain_id>.json` | json (패턴) | root `stage_b_domain_slice` / `task_c_bo_stage_b_domain_slice.v2` | worker · R0(검증·allowed_bo_types·신선도) · S0(`domain_declarations.emits_signals`) · (Part 3 `Task_C_LE_L0`) |
|
||||
| `fanout/domain_fanout_plan.json` | json | root `domain_fanout_plan` / `domain_fanout_plan.v1` | worker(오케스트레이터 경유) · R0 · S0 |
|
||||
| `stage1_tmp/task_c_bo/stage_a_context.json` | json | root `stage_a_context` / `task_c_bo_stage_a_context.v1` (module `stage_a_context_builder.py` 산) | R0 · F0 |
|
||||
| `stage1_tmp/task_c_bo/source_universe_manifest.json` | json | `task_c_bo_source_universe_manifest.v2` (필수 키: `event_candidate_ids`·`evidence_index_set`·`meeting_clause_ids`·`schema_version`) | R0 · S0 |
|
||||
| `validation_assets/routing/stage_receipt.json` | json | `stage1_stage_receipt.v2`, stage `P2-A0` | 소비 task 없음(원인 분리 영수증; 동결기가 `slice_sha256_by_domain` 참조) |
|
||||
| (반환 JSON) `dynamic_fanout` 리스트 | — | planner 의 `task_instances[]` 그대로 | 오케스트레이터 (`agent.py _extract_fanout_items`) — 계획 파일을 읽지 않으므로 이 키가 wildcard 확장의 유일 경로 (MEMORY ㉛) |
|
||||
| (로컬) `/tmp/s1/_rt/*.py` 8종, `/tmp/s1/` 아래 staged 자산·slice·prompt 사본 | py/json/md | — | 같은 task 내 모듈 import·컴파일 입력 |
|
||||
|
||||
### 2.2 Task_C_B_domain_worker_* (fan-out 인스턴스, 도메인당 1)
|
||||
|
||||
**입력**
|
||||
|
||||
| 경로 | 포맷 | 생산자 | 비고 |
|
||||
|---|---|---|---|
|
||||
| `{{item.compiled_prompt_path}}` = `runtime/compiled_prompts/<domain_id>.md` | md | A0 | preflight_files 로 선적재 |
|
||||
| `{{item.slice_path}}` = `runtime/domain_slices/<domain_id>.json` | json | A0 | preflight_files 로 선적재. 최상위 키 `stage_b_domain_slice` |
|
||||
| 주입 파라미터: `item.domain_id`·`item.task_instance_id`·`item.slice_sha256`·`item.compiled_prompt_sha256`·`item.expected_output_path` | runtime param | A0 fan-out 계획 행 | sha 두 개는 **글자 그대로 echo** 하는 자리 (슬라이스에서 읽는 sha 는 `registry_index_sha256`·`domain_config_sha256` 둘뿐) |
|
||||
|
||||
금지 입력: 다른 도메인 slice/seed, 프롬프트 재조립, slice `source_universe` 밖 출처.
|
||||
(`Default_Agent/routing/evidence_component_union.md` 의 component_id 어휘는 조립 프롬프트에 실려 전달된다 — 워커가 직접 읽는 파일은 위 2개뿐.)
|
||||
|
||||
**출력**
|
||||
|
||||
| 경로 | 포맷 | 스키마/root | 소비자 |
|
||||
|---|---|---|---|
|
||||
| `{{item.expected_output_path}}` = `runtime/domain_seed_outputs/<domain_id>.json` | json (패턴) | root `stage_b_domain_bo_seed_output` / `task_c_bo_stage_b_domain_bo_seed.v3` | R0 · S0 |
|
||||
|
||||
기록 방식: localdocs `write_file(overwrite=true)` 1파일만. 이 파일의 기록자는 워커 하나다
|
||||
(선언표 R0-5 — R0 는 seed 파일에 되쓰기하지 않는다).
|
||||
|
||||
### 2.3 Task_C_BO_R0_seed_reducer_and_exception_planner
|
||||
|
||||
**입력**
|
||||
|
||||
| 경로 | 포맷 | 생산자 | 용도 |
|
||||
|---|---|---|---|
|
||||
| `Default_Agent/runtime_manifest.json` | json | 배포 | F-4 자기 입력 무결성 (task 당 1회 캐시) |
|
||||
| `Default_Agent/platform/schemas/domain_seed_output.schema.v3.json` | json | 조립본 | F-4a 경성 검증 후 seed 전계약 검증 스키마 |
|
||||
| `Default_Agent/stage1_runtime/bo_surface_projection_policy.v1.json` | json | 조립본 | R0-1 투영 정책 (schema `stage1_bo_surface_projection_policy.v1`) — 경성 |
|
||||
| `Default_Agent/stage1_runtime/seed_admission_policy.v1.json` | json | 조립본 | R0-6 수용 정책 (schema `stage1_seed_admission_policy.v1`; 실측: enforcement=enforce, repair_order 4단, max_repair_passes 12, disposition_by_code 42종, quarantine_budget max_ratio 0.34/min_admitted 1) — 경성 |
|
||||
| `Default_Agent/stage1_runtime/{runtime_common,schema_subset_validator,registry_loader,worker_output_validator}.txt` | txt 4종 | 조립본 | VALIDATOR_MIRRORS — F-4b(미등재·불일치만 경성, 부재는 통과) + 반입(실패 시 `WORKER_VALIDATOR_UNAVAILABLE` 경고로 강등, R0 본체는 진행) |
|
||||
| `fanout/domain_fanout_plan.json` | json | A0 | seed 경로·순서·기대 sha(slice_sha256·compiled_prompt_sha256) 의 정본. DOMAIN_ORDER = 계획 등재 순서 |
|
||||
| `stage1_tmp/task_c_bo/stage_a_context.json` | json | A0 | READY + `task_c_bo_stage_a_context.v1` 필수 |
|
||||
| `stage1_tmp/task_c_bo/source_universe_manifest.json` | json | A0 | universe 3집합 (evidence 비면 경성 중단) |
|
||||
| `runtime/domain_seed_outputs/<domain_id>.json` (전 활성 도메인) | json | worker | 수용·투영 대상 |
|
||||
| `runtime/domain_slices/<domain_id>.json` (전 활성 도메인) | json | A0 | `allowed_legal_effect_bo_types` + R0-7a 신선도 실물 대조(원문 sha ↔ 계획 sha) |
|
||||
|
||||
**출력**
|
||||
|
||||
| 경로 | 포맷 | 스키마/root | 소비자 |
|
||||
|---|---|---|---|
|
||||
| `stage1_tmp/task_c_bo/postb_seed_ledger.json` | json | root `postb_seed_ledger` / `task_c_bo_postb_seed_ledger.v1` | F0 |
|
||||
| `quality_gates/stage1_part2_exception_pack.json` | json | `stage1_part2_exception_pack.v1` | R1(preflight) · F0(exception_count 로 R1 필수 여부 판정) |
|
||||
| `quality_gates/stage1_part2_review_handoff.json` | json | `stage1_part2_review_handoff.v1`, status `PENDING_FINALIZE` | F0(FINALIZED 갱신 공동 기록자) · Part 4 `Task_C_FL_F0_fact_ledger_reducer` |
|
||||
| (stdout) 결과 JSON | — | status/candidate_counts/review_item_count | 오케스트레이터 |
|
||||
| (로컬) `/tmp/s1_r0/_rt/*.py` 4종 | py | — | 같은 task 내 import |
|
||||
|
||||
### 2.4 Task_C_BO_R1_exception_adjudicator
|
||||
|
||||
**입력**: `quality_gates/stage1_part2_exception_pack.json` (json, R0 산, preflight 로 제공 — **유일한 입력**.
|
||||
Stage A context·ledger 전문·raw evidence·meeting 원문 읽기 금지, `has_exceptions=true` 시 추가 read 금지,
|
||||
판정은 `compact_candidate_payload` 만으로).
|
||||
|
||||
**출력**: `stage1_tmp/task_c_bo/postb_adjudication_decisions.json` (json,
|
||||
root `postb_exception_adjudication` / `task_c_bo_postb_exception_adjudication.v1`,
|
||||
status `READY` 또는 `READY_NO_EXCEPTIONS`) → 소비자 F0. **이 파일 하나만** 기록
|
||||
(BO.json·ledger·review handoff·signal 파일 작성 금지). 인계면 선언상 optional=true (조건부).
|
||||
|
||||
### 2.5 Task_C_BO_F0_final_bo_compiler_gate_writer
|
||||
|
||||
**입력**
|
||||
|
||||
| 경로 | 포맷 | 생산자 | 용도 |
|
||||
|---|---|---|---|
|
||||
| `Default_Agent/routing/extension_payload_key_declarations.v1.json` | json | 조립본 (생성기 `routing/_build_extension_payload_declarations.py`, registry 53파일을 배포 시점에 접어 둔 것) | BOType 어휘(`bo_types_union` = registry 합집합)·확장 payload 키 선언·`legacy_alias_targets`. sha256 대조 후 사용 |
|
||||
| `Default_Agent/stage1_runtime/bo_surface_projection_policy.v1.json` | json | 조립본 | F0-2 `f0_normalization` 기본값 정본 (R0 와 같은 자산) |
|
||||
| `Default_Agent/runtime_manifest.json` | json | 배포 | 위 두 자산 해시 대조 |
|
||||
| `stage1_tmp/task_c_bo/stage_a_context.json` | json | A0 | universe·`evidence_authority_map`(Evidence 항목 구성) |
|
||||
| `stage1_tmp/task_c_bo/postb_seed_ledger.json` | json | R0 | 후보 원장 (READY 필수) |
|
||||
| `quality_gates/stage1_part2_exception_pack.json` | json | R0 | `exception_count` → R1 산출 필수 여부(P-11) |
|
||||
| `stage1_tmp/task_c_bo/postb_adjudication_decisions.json` | json | R1 | 조건부: count>0 인데 못 읽으면 실패, 0 이면 `R1_SKIPPED` 합성 no-exception 으로 진행 |
|
||||
| `quality_gates/stage1_part2_review_handoff.json` | json | R0 | FINALIZED 갱신 대상 (부재 시 빈 골격 생성) |
|
||||
| `BO.json` (기록 직후 재읽기) | json | F0 자신 | post-write 검증 |
|
||||
|
||||
**출력**
|
||||
|
||||
| 경로 | 포맷 | 스키마/root | 소비자 |
|
||||
|---|---|---|---|
|
||||
| `BO.json` | json (배열) | BO 레코드 배열, `BO_ID`=`bh<n>` (`^bh[1-9][0-9]*$`) | S0 · Stage_2 · Part 3/4 (`Task_C_LE_L0`·`Task_C_LE_L2`·`Task_C_FL_F0`·`Task_C_FL_F2`) — 최대 호환면, 레코드 구조 불변 |
|
||||
| `stage1_tmp/task_c_bo/postb_compiled_bundle_compact.json` | json | `task_c_bo_postb_compiled_bundle_compact.v1` | 현재 소비자 없음 (Part 4 착수 시 재평가 — 인계면 note) |
|
||||
| `quality_gates/stage1_part2_review_handoff.json` (재기록) | json | status `FINALIZED` + `bo_item_count` + F0 추가 review 3계열(extension_key·prior·normalization) | Part 4 `Task_C_FL_F0` (인계면 consumer_tasks 정본 — Stage 2 소비 선언 없음) |
|
||||
| (stdout) PASS JSON | — | gate_results 포함 | 오케스트레이터 |
|
||||
|
||||
### 2.6 Task_C_BO_S0_signal_bundle_writer
|
||||
|
||||
**입력**
|
||||
|
||||
| 경로 | 포맷 | 생산자 | 용도 |
|
||||
|---|---|---|---|
|
||||
| `Default_Agent/runtime_manifest.json` | json | 배포 | F-4 (task 당 1회 캐시 — $ref 폐포 walk 에서만 19회 절약) |
|
||||
| `Default_Agent/signals/compiler/{common,projections,schema_validator,signal_compiler,signal_gate,transaction_writer,writer_boundary}.txt` | txt 7종 | 조립본 | COMPILER_MODULES 반입 |
|
||||
| `Default_Agent/signals/adapters/{s3_domain_seed_adapter,s3_envelope_migration_adapter,s4_calculation_adapter,sg01_activation_adapter}.txt` | txt 4종 | 조립본 | ADAPTER_MODULES 반입 |
|
||||
| `Default_Agent/signals/emitters/{emitter_runtime,emit_sg02..emit_sg13}.txt` | txt 13종 | 조립본 | EMITTER_MODULES 반입 (생성기 12 + 런타임) |
|
||||
| `Default_Agent/signals/signal_registry.v2.json` | json | 조립본 | SG-01~SG-13 13종 선언·envelope·manifest 스키마 지목 |
|
||||
| `Default_Agent/contracts/signals/s5_execution_contract.v2.json` | json | 조립본 | 실행 계약 — `<ANCHOR>/contracts/` 에 재현 배치 |
|
||||
| `Default_Agent/signals/schemas/*.schema.json` + `Default_Agent/signals/_common/*.schema.json` ($ref 폐포, 실측 17종) | json | 조립본 | registry 참조에서 출발한 상대 $ref 폐포 walk — 목록을 상수로 두지 않음, 각각 `_verify_asset` |
|
||||
| `routing/domain_activation_manifest.json` | json | Part 1 D0 | SG-01 원천 (`sg01_activation_adapter`; 부재 시 `SG01_INPUT_REQUIRED`) |
|
||||
| `fanout/domain_fanout_plan.json` | json | A0 | seed 경로·도메인 목록의 정본 |
|
||||
| `runtime/domain_seed_outputs/<domain_id>.json` (전 인스턴스) | json | worker | S3 adapter 입력. schema v3·domain_id 재검증 |
|
||||
| `runtime/domain_slices/<domain_id>.json` | json | A0 | R-5 — `domain_declarations.emits_signals` 선언 대조 (부재는 조용히 통과) |
|
||||
| `stage1_tmp/task_c_bo/source_universe_manifest.json` | json | A0 | source_universe (evidence/event/meeting; fact·law_version 은 의도적으로 빈 목록) |
|
||||
| `BO.json` | json | F0 | `bo_ids` universe 구성 |
|
||||
| `signals/signal_manifest.json` (기록 직후 재읽기) | json | S0 자신 | post-write 해시 대조 |
|
||||
|
||||
**출력** (transaction_writer 가 `/tmp/s1/_signal_out` 에 낸 *.json 전부를 `signals/` 접두로 반출 — 재직렬화 없음)
|
||||
|
||||
| 경로 | 포맷 | 스키마 | 소비자 (인계면 실측) |
|
||||
|---|---|---|---|
|
||||
| `signals/signal_manifest.json` | json | `signal_manifest.v2` (`transaction_id` `^S5TX-[a-f0-9]{20}$`, `downstream_read_sets` 선언) | Stage_2 · `Task_C_LE_L0` · `Task_C_FL_F0` |
|
||||
| `signals/domain_activation_manifest.json` (SG-01 사본) | json | `schemas/domain_activation_manifest.schema.json` | 거래 내 포함 (adapter 재검증 산) |
|
||||
| `signals/procedural_posture_relief_signals.json` (SG-02) | json | `stage1_signal_sg02.v1` | `Task_C_LE_L0` (레코드 0 정상) |
|
||||
| `signals/party_capacity_standing_signals.json` (SG-03) | json | registry 선언 | 하류 재평가 대상 |
|
||||
| `signals/governing_law_version_signals.json` (SG-04) | json | `stage1_signal_sg04.v1` | `Task_C_FL_F0` |
|
||||
| `signals/legal_relation_lifecycle_signals.json` (SG-05) | json | `stage1_signal_sg05.v1` | `Task_C_LE_L0` |
|
||||
| `signals/timeline_notice_condition_signals.json` (SG-06) | json | `stage1_signal_sg06.v1` | `Task_C_FL_F0` |
|
||||
| `signals/asset_right_state_signals.json` (SG-07) | json | `stage1_signal_sg07.v1` | `Task_C_LE_L0` · `Task_C_FL_F0` (0 정상) |
|
||||
| `signals/liability_causation_damage_signals.json` (SG-08) | json | registry 선언 | 사영(case_liability) 원천 |
|
||||
| `signals/defense_exception_signals.json` (SG-09) | json | registry 선언 | 하류 재평가 대상 |
|
||||
| `signals/evidence_proof_conflict_signals.json` (SG-10) | json | `stage1_signal_sg10.v1` | `Task_C_FL_F0` |
|
||||
| `signals/calculation_requirements.json` (SG-11) | json | `stage1_signal_sg11.v1` | `Task_C_LE_L0` · `Task_C_FL_F0` · `Task_C_FL_F2` |
|
||||
| `signals/remedy_enforcement_signals.json` (SG-12) | json | registry 선언 | 하류 재평가 대상 |
|
||||
| `signals/legal_effect_routes.json` (SG-13) | json | `stage1_signal_sg13.v1` | `Task_C_LE_L0` · `Task_C_LE_L2` |
|
||||
| `signals/domain_signals/<domain_id>.json` | json (패턴) | root `domain_signal_envelope` / `stage1_domain_signals.v2` | `Task_C_LE_L0` · `Task_C_FL_F0` (부재는 영수증 계수) |
|
||||
| `signals/compatibility_views/actio_case_signals.json` | json | 사영 (원천 없음 — projections.py 서명) | (정본 위치) |
|
||||
| `signals/compatibility_views/case_liability_signals.json` | json | SG-05·SG-08 사영 | (정본 위치) |
|
||||
| `signals/compatibility_views/legal_effect_signals.json` | json | SG-13 사영 | (정본 위치) |
|
||||
| `actio_case_signals.json` (루트 별칭) | json | `actio_case_signals.v1` — compatibility_views 와 바이트 동일 | 소비자 없음 (Part 3 정본 집합 이관 완료 — C-7) |
|
||||
| `case_liability_signals.json` (루트 별칭) | json | `case_liability_signals.v1` | 소비자 없음 (동일) |
|
||||
| `legal_effect_signals.json` (루트 별칭) | json | `legal_effect_signals.v1` | 소비자 없음 (동일) |
|
||||
| (stdout) READY/READY_WITH_REVIEW JSON | — | `stage1_canonical_signal_writer.v1` | 오케스트레이터 |
|
||||
| (로컬) `/tmp/s1/_sig/pkg/signals/**` 모듈 24종 py + registry + 스키마 17종, `/tmp/s1/_sig/contracts/s5_execution_contract.v2.json`, `/tmp/s1/_signal_out/*.json` | py/json | — | 같은 task 내 |
|
||||
|
||||
거래당 signal 파일 구성(signal_compiler.compile_transaction 실측): 정본 13(SG-01~SG-13) +
|
||||
`domain_signals/<id>.json` xN + 호환 뷰 3 + `signal_manifest.json`, 여기에 루트 별칭 3을 반출 시 추가.
|
||||
|
||||
### 2.7 IO 요약 계수
|
||||
|
||||
- 워크스페이스 사건 산출물 경로: Part 1 유래 입력 7종 + Part 2 생산 고정명 13종 + signals 계열 21종
|
||||
(고정명 20 + 패턴 1) — 도메인별 패턴(`compiled_prompts/<id>`, `domain_slices/<id>`,
|
||||
`domain_seed_outputs/<id>`, `domain_signals/<id>`)을 각 1로 계수했을 때 **총 41경로**.
|
||||
- 조립본 읽기 자산: §3 전수표 참조 (F-2 게이트 대조 19경로 + S0 반입 43경로 + registry 문서군).
|
||||
|
||||
---
|
||||
|
||||
## 3. 작업용 assets — 배포 위치 전수
|
||||
|
||||
배포 원본: `BASE/extension_research/Default_Agent/` → 서버 `Default_Agent/` 에 **통째 배포**
|
||||
(부분 복사 금지 — `PART2_DEPLOYMENT_REMEDY` 원문). 장부: `Default_Agent/runtime_manifest.json`
|
||||
(`stage1_runtime_manifest.v1`, 실측 `runtime_artifact_count` = 465 = entries 수, 중복 0).
|
||||
Python 자산은 정본 `.py` 와 **같은 폴더의 `.txt` 미러** 두 벌이 실물로 존재함을 전수 확인했다
|
||||
(런타임은 `.txt` 를 read_raw → sha256 대조 → 로컬 `.py` 화하여 import).
|
||||
|
||||
### 3.1 stage1_runtime 모듈 (A0·R0 반입 대상) — 배포 폴더 `Default_Agent/stage1_runtime/`
|
||||
|
||||
| 자산 | .py 정본 | .txt 미러 | 소비 task |
|
||||
|---|---|---|---|
|
||||
| `runtime_common` | `runtime_common.py` | `runtime_common.txt` | A0 (MODULE_MIRRORS) · R0 (VALIDATOR_MIRRORS) |
|
||||
| `schema_subset_validator` | `schema_subset_validator.py` | `schema_subset_validator.txt` | A0 · R0 |
|
||||
| `registry_loader` | `registry_loader.py` | `registry_loader.txt` | A0 · R0 |
|
||||
| `registry_validator` | `registry_validator.py` | `registry_validator.txt` | A0 |
|
||||
| `prompt_compiler` | `prompt_compiler.py` | `prompt_compiler.txt` | A0 (`collect_domain_fragments`·`compile_fragments`·`FragmentSpec`; `profile_paths`·`extra_specs` 인자) |
|
||||
| `domain_slice_compiler` | `domain_slice_compiler.py` | `domain_slice_compiler.txt` | A0 (`compile_domain_slices`; `screening_calculation_domains` 신인자) |
|
||||
| `domain_fanout_planner` | `domain_fanout_planner.py` | `domain_fanout_planner.txt` | A0 (`build_fanout_plan`) |
|
||||
| `stage_a_context_builder` | `stage_a_context_builder.py` | `stage_a_context_builder.txt` | A0 (`build_stage_a_context`·`build_source_universe_manifest`) |
|
||||
| `worker_output_validator` | `worker_output_validator.py` | `worker_output_validator.txt` | R0 (`validate_worker_output` — 전 계약 검증) |
|
||||
|
||||
(같은 폴더의 `activation_gate`·`fact_ledger_compiler`·`structure_index_compiler` py/txt 와
|
||||
`fact_ledger_policy.v1.json`·`structure_index_policy.v1.json` 은 Part 1·3 소관 — Part 2 비소비.)
|
||||
|
||||
### 3.2 정책·스키마·선언 자산 (A0 `PART2_REQUIRED_ASSETS` 11종 = F-2 게이트 대조 목록)
|
||||
|
||||
| 배포 경로 | 포맷 | 소비 task | 실측 내용 |
|
||||
|---|---|---|---|
|
||||
| `Default_Agent/platform/schemas/domain_slice.schema.v2.json` | json | A0 | slice 스키마. F-3 능력 검사: `stage_b_domain_slice.properties.domain_declarations` + `compiled_prompt.hash_kind` 선언 필수 |
|
||||
| `Default_Agent/platform/schemas/domain_fanout_plan.schema.json` | json | A0 | fan-out 계획 스키마 |
|
||||
| `Default_Agent/domains/_common/common_worker_contract.md` | md | A0 | rank 10 공통 계약 프레임 |
|
||||
| `Default_Agent/stage1_runtime/prompt_composition_policy.json` | json | A0 | `prompt_composition_policy.v2` — fragment_priority 5계층(10 common_contract / 20 common_dependency / 30 domain / 40 special_law_profile / 50 runtime_guard), dedup(sha256), byte_contract(UTF-8·LF·separator `\n\n`), size guard |
|
||||
| `Default_Agent/platform/schemas/domain_seed_output.schema.v3.json` | json | R0 (+worker 프롬프트가 계약으로 지목) | seed v3 — 봉인(additionalProperties:false) 계약 |
|
||||
| `Default_Agent/signals/signal_registry.v2.json` | json | S0 | SG-01~SG-13 13종 entries + `domain_envelope`=`schemas/domain_signal_envelope.schema.v2.json` + `manifest_schema`=`schemas/signal_manifest.schema.json` + compatibility_views + writer 선언 |
|
||||
| `Default_Agent/contracts/signals/s5_execution_contract.v2.json` | json | S0 | 실행 계약 (모듈 디렉터리 산술상 `<ANCHOR>/contracts/` 에 재배치) |
|
||||
| `Default_Agent/routing/extension_payload_key_declarations.v1.json` | json | F0 | `stage1_extension_payload_key_declarations.v1` — `bo_types_union`·`declared_key_union`·`domains[].declared_keys`·`legacy_alias_targets` |
|
||||
| `Default_Agent/stage1_runtime/worker_output_validator.txt` | txt | R0 | 전용 미러 (게이트 목록에는 .txt 만 등재; .py 정본은 §3.1) |
|
||||
| `Default_Agent/stage1_runtime/bo_surface_projection_policy.v1.json` | json | R0 · F0 | `stage1_bo_surface_projection_policy.v1` — status_policy·source_partition·fields·not_projected·review_item_projection·`f0_normalization`(bo_type_default "event"·action_type_default "사실행위(factual acts)"·enum 5종·action_default_template) |
|
||||
| `Default_Agent/stage1_runtime/seed_admission_policy.v1.json` | json | R0 | `stage1_seed_admission_policy.v1` — enforcement(enforce)·repair_order[normalize→derive→harvest→evict]·max_repair_passes 12·disposition_by_code 42·surplus_sink·enum_synonyms(+case_fold)·required_derivation·quarantine_budget(비율 0.34·최소수용 1)·review·residual_root_disposition |
|
||||
|
||||
F-2 게이트 대조 총수: MODULE_MIRRORS 8 + 위 11 = **19경로** (`deployment_gate.checked_count`).
|
||||
|
||||
### 3.3 도메인 registry (A0 적재·조각 반입) — 배포 폴더 `Default_Agent/domains/`
|
||||
|
||||
| 배포 경로 | 포맷 | 내용 |
|
||||
|---|---|---|
|
||||
| `Default_Agent/domains/_registry_index.json` | json | `domain_registry_index` — registry_version `Stage1.Assembly.2026-08-10.v1`, entries 26종: `E-00`~`E-21`(22) + `EC-00` + `X1`·`X2`·`X3` |
|
||||
| `Default_Agent/domains/<id>/domain_config.json` (26) | json | config — `prompt_overlay_ref`·`special_law_profiles`·allowed BOType·emits_signals 등 선언 |
|
||||
| `Default_Agent/domains/<id>/seed_prompt_overlay.md` (25) + `Default_Agent/domains/EC-00/common_fragment.md` (1) | md | rank 30 도메인 overlay 조각 — config 선언을 따라 반입 |
|
||||
| `Default_Agent/domains/<id>/{gates,module_role_projection,structure_types}.json` (25 도메인 x3) | json | registry 동반 선언 (registry_loader/validator·배포 단위의 일부; A0 코드가 직접 지명하지는 않음) |
|
||||
|
||||
### 3.4 특별법 profile (A0 반입 — MEMORY 무번호 항목 「special_law_profiles 검증·전략·실행 3연속」으로 신설, ㉚ 로 배선) — 배포 폴더 `Default_Agent/special_law_profiles/`
|
||||
|
||||
| 배포 경로 | 포맷 | 내용 |
|
||||
|---|---|---|
|
||||
| `Default_Agent/special_law_profiles/_registry_index.json` | json | `special_law_profile_registry_index` — entries 3, 각 `prompt_overlay_sha256` 봉인 |
|
||||
| `Default_Agent/special_law_profiles/SLP-IP/prompt_overlay.md` | md | 지식재산 특별법 profile (attached: E-20) — rank 40 조각 |
|
||||
| `Default_Agent/special_law_profiles/SLP-MEDIA-MEDIATION/prompt_overlay.md` | md | 언론피해 구제 특별법 profile (attached: E-21) |
|
||||
| `Default_Agent/special_law_profiles/SLP-PRODUCT-LIABILITY/prompt_overlay.md` | md | 제조물책임 profile (attached: E-06) |
|
||||
|
||||
### 3.5 signal 자산 (S0 반입 — 모듈 24종은 py+txt 두 벌) — 배포 폴더 `Default_Agent/signals/`
|
||||
|
||||
| 배포 폴더 | 자산 | py/txt |
|
||||
|---|---|---|
|
||||
| `Default_Agent/signals/compiler/` | `common` · `projections` · `schema_validator` · `signal_compiler` · `signal_gate` · `transaction_writer` · `writer_boundary` (7) | 각 `.py` + `.txt` |
|
||||
| `Default_Agent/signals/adapters/` | `s3_domain_seed_adapter` · `s3_envelope_migration_adapter` · `s4_calculation_adapter` · `sg01_activation_adapter` (4) | 각 `.py` + `.txt` |
|
||||
| `Default_Agent/signals/emitters/` | `emitter_runtime` · `emit_sg02` ~ `emit_sg13` (13) | 각 `.py` + `.txt` |
|
||||
| `Default_Agent/signals/schemas/` | signal 스키마 15종: `domain_activation_manifest` · `procedural_posture_relief_signals` · `party_capacity_standing_signals` · `governing_law_version_signals` · `legal_relation_lifecycle_signals` · `timeline_notice_condition_signals` · `asset_right_state_signals` · `liability_causation_damage_signals` · `defense_exception_signals` · `evidence_proof_conflict_signals` · `calculation_requirements` · `remedy_enforcement_signals` · `legal_effect_routes` (13, SG-01~13 대응) + `domain_signal_envelope.schema.v2.json` + `signal_manifest.schema.json` | json |
|
||||
| `Default_Agent/signals/_common/` | `signal_item.schema.json` · `evidence_slot_status.schema.json` | json |
|
||||
|
||||
S0 의 스키마 폐포는 registry 참조에서 출발한 $ref walk 로 결정된다(상수 목록 없음) — A0 머리말이
|
||||
말한 "S0 의 signal 스키마 폐포 17종·미러 24종은 F-2 목록에 넣지 않는다(경계 의도)"의 실물이 위
|
||||
표다(모듈 24 = compiler 7 + adapters 4 + emitters 13, 폐포 17 = signal 13 + envelope + manifest + _common 2).
|
||||
|
||||
### 3.6 기타 참조 자산
|
||||
|
||||
| 배포 경로 | 포맷 | 소비 |
|
||||
|---|---|---|
|
||||
| `Default_Agent/routing/evidence_component_union.md` | md | worker 프롬프트 규율 — component_id 어휘의 정본 (P0 판정 A·B) |
|
||||
| `Default_Agent/runtime_manifest.json` | json | A0·R0·F0·S0 전부 — 등재·sha256 장부 |
|
||||
| `Default_Agent/platform/reference_catalogs/{domain_ids,calculation_ids,profile_ids}.json` | json | registry_validator 계열 참조 목록 (A0 의 validate_registry 경유) |
|
||||
| (참고) `Default_Agent/platform/schemas/` 의 나머지 스키마(`fact_*` 3종·`structure_seed_bundle`·`legal_effect_structures`·`client_goal_domain_profiles`)와 `Default_Agent/platform/contracts/determinism_scope_contract.json`, `Default_Agent/routing/activation_cue_digest.md` | json/md | Part 1·3·4 소관 — Part 2 비소비 |
|
||||
|
||||
자산 계수(Part 2 소비 기준): 반입 python 모듈 **33종**(stage1_runtime 9 + signals 24; py+txt 66파일)
|
||||
+ 정책/선언 json 5종(prompt_composition·seed_admission·bo_surface_projection·extension_payload_key_declarations·runtime_manifest)
|
||||
+ 스키마 json 20종(slice·fanout·seed v3 + signal 폐포 17) + registry 문서군(도메인 index 1 + config 26
|
||||
+ overlay 조각 26 + SLP index 1 + SLP overlay 3) + 계약/어휘 md 2종(common_worker_contract·evidence_component_union)
|
||||
+ signal registry·실행 계약 json 2종 = **경로 기준 총 119종** (py+txt 이중 계수 시 152파일).
|
||||
|
||||
---
|
||||
|
||||
## 4. 개별 소작업(sub-task) 전수 — 명칭·목적·작업 내역
|
||||
|
||||
### 4.1 Task_C_BO_A0_context_and_domain_slice_compiler (code, v4)
|
||||
|
||||
- **유형/설정**: `mcp: code-executor` · `tool_name: run_code` · python · requirements `httpx` · network `agent-network` · timeout 300
|
||||
- **목적**: Part 1 산출을 봉인 검증 하에 수용하고, 도메인 registry 로부터 활성 도메인별
|
||||
실행 재료(조립 프롬프트 + slice + fan-out 계획)와 공유 문맥(stage_a_context·source_universe_manifest)을
|
||||
결정적으로 컴파일한다. 도메인 상수를 코드에 두지 않는다 — 라우팅 판정은 모듈 안에서만.
|
||||
- **내부 단계 순서** (코드 주석 번호 실측):
|
||||
1. **(0) 배포 완전성 게이트 F-2** `assert_deployment()` — runtime_manifest schema/계수/중복 검사 후 19경로의 등재·sha256·가독성을 **전부 모아** 판정 (첫 실패에서 멈추지 않음 — 배포는 한 번에 고친다).
|
||||
2. **(1) 모듈 반입 R-1~R-5** `materialize_modules()` — 8미러 → `/tmp/s1/_rt/*.py` → `sys.path` 삽입.
|
||||
3. **(2) 봉인 검증** `verify_seal()` — handoff `digest_guard` 의 `screening_sha256`·`activation_manifest_sha256`·`registry_index_sha256` 를 read_raw 원문 바이트 해시와 대조 (§6.1-3, 재직렬화 절대 금지).
|
||||
4. **(3) registry 적재·검증** — index→config 26→overlay 조각·특별법 profile 조각 staging(`profile_paths` 구성), `registry_loader.load_registry` + `registry_validator.validate_registry`; overlay 4코드만 경성 승격(F-4d: `PROMPT_OVERLAY_HASH_MISMATCH`·`PROMPT_OVERLAY_NOT_FOUND`·`PROMPT_OVERLAY_PATH_INVALID`·`PROMPT_OVERLAY_REFERENCE_DIVERGENCE`), 그 외 상태는 경고. eligible(=execution_eligible)=expected_runnable 일치 검사. C-1 `evidence_authority_map` 구성(evidence_index → doc_uid·doc_type·source_pointer·registry_component_ids).
|
||||
5. **(4) 프롬프트 조립** — 정책 rank 10→50, R-3 어휘 조각(extra_specs), 도메인별 `collect_domain_fragments`(profile_paths 전달) → `compile_fragments` → `runtime/compiled_prompts/<id>.md` 기록 + manifest 행(`compiled_prompt_sha256`·`composition_policy_sha256`). R-2 screening 재파싱 → `screening_calc` (파싱 실패=경고 / 계약 위반=경성으로 분리 — try 통합 금지 주석).
|
||||
6. **(P-2a) stage_a 선행 구축** — slice 가 인용할 event 식별자의 정본(`event_candidate_map.by_candidate_id`, EVT-… 84건 실측)을 slice 컴파일보다 먼저 만든다 (순서 역전 시 `event:unidentified:NNNN` 오염 → R0 BLOCK, MEMORY ㉞ 실장애의 교정). event 후보 맵은 dict 가 아니라 **후보 레코드 목록으로 평탄화**해 컴파일러에 넘긴다.
|
||||
7. **(5) slice 컴파일** — `compile_domain_slices(manifest, registry, evidence_document, event_candidate_records, manifest_sha256, evidence_sha256, events_sha256, slice_schema, compiled_prompt_manifests, expected_output_dir=SEED_DIR, screening_calculation_domains)`; TypeError → `PART2_COMPILER_STALE`(signature_mismatch); F-3b 출력 능력 검사(각 slice 에 `domain_declarations`·`compiled_prompt.hash_kind` 실재) 후 canonical 직렬화(정렬 키·compact 구분자·꼬리 개행 1)로 기록, `slice_hashes` 수집.
|
||||
8. **(6) fan-out 계획** — `build_fanout_plan(manifest, registry, activation_manifest_sha256, slice_dir, seed_output_dir, fanout_schema)`; planned 도메인 == expected_runnable 정확 일치; `fanout/domain_fanout_plan.json` 기록. barrier 기대 집합은 expected_runnable (active 아님).
|
||||
9. **(7) 기록** — stage_a_context·source_universe_manifest(P-2: 계산은 P-2a 에서 끝났고 여기서는 기록만)·stage_receipt(P-13: `schema_injection` 블록으로 "스키마를 넘긴 사실과 대상 수"를 명시 — 상수 PASS 는 증거가 아니다) → 반환 JSON에 `dynamic_fanout`(planner 항목 그대로)·`digest_guard`·`modules`·경고 목록. stdout 은 결과 JSON 한 줄(작업 중 출력은 StringIO 로 흡수).
|
||||
- **주요 실패 코드**: `PART2_RUNTIME_MANIFEST_INVALID` · `PART2_ASSET_DEPLOYMENT_INCOMPLETE`(+detail `prompt_overlay`) · `MODULE_MIRROR_UNREGISTERED` · `MODULE_MIRROR_HASH_MISMATCH` · `SEAL_KEY_MISSING` · `SEAL_FAILED` · `REGISTRY_CONFIG_PATH_MISSING` · `PART2_SLICE_SCHEMA_STALE` · `A0_EXPECTED_RUNNABLE_SET_MISMATCH` · `SCREENING_ROOT_INVALID` · `SCREENING_CANDIDATES_EMPTY` · `SCREENING_CANDIDATE_INVALID` · `PART2_EVENT_CANDIDATE_MAP_EMPTY` · `PART2_COMPILER_STALE` · `A0_FANOUT_SET_MISMATCH` · (MCP 계층) `MCP_CALL_FAILED`/`EMPTY_RESPONSE`/`EMPTY_CONTENT`/`UNEXPECTED_READ_DOCS_ENVELOPE`
|
||||
- **경고 코드**: `PROMPT_OVERLAY_STAGE_SKIPPED` · `SPECIAL_LAW_INDEX_ABSENT` · `SPECIAL_LAW_OVERLAY_PATH_MISSING` · `SPECIAL_LAW_OVERLAY_STAGE_SKIPPED` · `REGISTRY_VALIDATION_NOT_PASS` · `SCREENING_CALC_PARSE_SKIPPED` · `VOCABULARY_FRAGMENT_ABSENT`
|
||||
|
||||
### 4.2 Task_C_B_domain_worker_* (LLM, 신설 템플릿 — 정적 worker B1~B5 대체)
|
||||
|
||||
- **유형/설정**: `max_concurrency: 8` · `preflight_files: [{{item.compiled_prompt_path}}, {{item.slice_path}}]` ·
|
||||
`llm_provider: google` · `llm_model: 'gemini-3.1-pro-preview'` · `llm_reasoning: high` ·
|
||||
`llm_verbosity: low` · `use_tools: [localdocs]` · `cache_control: {mode: auto, ttl: 15m}` ·
|
||||
prompts: user 1개 (복수형 `prompts:` 리스트 — 단수 `prompt:` 스칼라는 백엔드가 읽지 않음, MEMORY ㉜)
|
||||
- **목적**: 오케스트레이터가 주입한 단일 도메인 `{{item.domain_id}}` 하나에 대해 BO seed 후보를
|
||||
생성한다. 최종 청구권 선택·최종 요건충족 판단·BO 식별자 확정 금지 — 후보만 남긴다.
|
||||
- **작업 내역 (프롬프트 계약 실측)**:
|
||||
- 읽기는 조립 프롬프트 + slice 두 파일뿐. 조립 프롬프트 본문(rank 10 공통계약 → 20 의존공통층 → 30 도메인 overlay → 40 특별법 overlay → 50 실행 가드 합성)이 실질 지시이고 래퍼는 입출력 계약만 규정. 프롬프트·slice 상충은 임의 선택 금지 — `review_items` 에 남긴다.
|
||||
- 근거 규율: 모든 근거는 slice `source_universe[*].source_id` 안. 증거 구성요소 이름은 `Default_Agent/routing/evidence_component_union.md` 의 component_id 만(목록 밖 이름 창작 금지 — P0 판정 A·B). 인용 component_id 는 후보 `registry_component_ids` 에 적재(비어 있지 않으면 R0 에서 증거 유래 인정). 직접 읽히지 않는 근거는 비우고 review.
|
||||
- 산출 스키마: root `stage_b_domain_bo_seed_output` 단일 키 / `task_c_bo_stage_b_domain_bo_seed.v3` 고정. `bo_seed_candidates[]` 골격 18필드(`seed_id` `<도메인슬러그-001>` 꼴, `bo_type` ∈ slice.allowed_legal_effect_bo_types, 5배열 이름 고정: element_fact_candidates·opposing_fact_candidates·defense_candidates·calculation_requests·dependency_refs; dependency_refs 는 연결만 — 의존 도메인 결론 복사 금지). 후보 불능 시 빈 배열 + review_items (억지 충전이 더 나쁘다).
|
||||
- BO 투영 1순위 출처 필드 명시(MEMORY ㉝ 개정): `juristic_act_type`→JuristicAct.label, `extensions.domain_payload.action_summary`→Action, `action_type`→ActionType, `legal_effect_candidates[]`→Legal_Keywords, `time_facts[]`→BehaviorTime·TimeText, `object_refs[]`→core_field_base.Object, `amount_facts[]`→amount, `party_roles[]`(스키마 필드). 비우면 BO.json 폴백 + schema_field_fallback 검토 발행. 근거 없으면 비우고 사유 — 추측 금지, 사건종류 이름 금지.
|
||||
- sha echo 규율(MEMORY ㊲ 개정): `slice_sha256`·`compiled_prompt_sha256` 은 주입값 전사 전용. slice 에서 읽는 sha 는 `registry_index_sha256`·`domain_config_sha256` 둘뿐. `activation.activation_manifest_sha256` 을 집으면 전사 실수(검토 표시), 남의 도메인 sha 는 "남의 자료로 작업" 판정으로 회차 중단, 미상 sha 는 후보 격리 — 값 창작이 최악.
|
||||
- 어휘 5종 고정(MEMORY ㉟ 개정 — S0 게이트가 경성으로 막고 R0 부분집합 검증은 못 잡는 자리): status 5종(READY/READY_WITH_REVIEW/NO_SUPPORT/BLOCKED/FAILED) · evidence_slot_status 4종(filled/partial/missing/conflicted) · completeness 4종(ready/partial/blocked/deferred) · severity 4종(info/review/hard_warning/block) · source_kind 10종(meeting_clause/event_candidate/evidence/bo/fact/signal/registry/law_version/calculation/other). 엄격 객체 4종(additionalProperties:false) 키 명세 포함(element/opposing/defense 후보는 source_id·source_kind 필수, slot 판정은 evidence_slot_status 소관).
|
||||
- 자기 검증 게이트: root 단일 키 · `domain_id`/`task_instance_id` 주입값 일치 · source_refs 소속 · bo_type 소속 · registry_component_ids 소속 · 금지 키(BO_ID·Evidence·EvidenceTitles·final_*) 부재.
|
||||
- 종료: `write_file(overwrite=true)` 로 `{{item.expected_output_path}}` 하나만 기록.
|
||||
|
||||
### 4.3 Task_C_BO_R0_seed_reducer_and_exception_planner (code, v3 — publisher + domain_join + PostB_1 통합 결정적 reducer)
|
||||
|
||||
- **유형/설정**: code-executor · run_code · python · httpx · network agent-network · timeout 240 · EXECUTION_ROOT `/tmp/s1_r0`
|
||||
- **목적**: 워커 seed 를 계약대로 수용(admission)하고 BO 호환면으로 투영, 결정적 defer 정책(개선전략서 X-2)으로
|
||||
원장(ledger)을 만들며, 결정 불가 예외만 compact pack(X-3)으로 추려 R1 에 넘긴다. LLM 판정 금지(defer 정책).
|
||||
- **내부 단계 순서**:
|
||||
1. `_init` → **F-4a** 정적 입력 경성 검증(try 밖 — 구판 폴백의 침묵 차단): seed 스키마 v3 `_verify_asset` + 투영 정책(schema `stage1_bo_surface_projection_policy.v1`) + 수용 정책(schema `stage1_seed_admission_policy.v1`).
|
||||
2. **F-4b** VALIDATOR_MIRRORS 4종 일관성(부재 통과 · 미등재/불일치 경성) → `materialize_validator()` 반입(실패는 `WORKER_VALIDATOR_UNAVAILABLE` 경고 강등, 본체 진행 — 덧붙이는 층).
|
||||
3. fan-out 계획 적재 `_seed_docs_from_plan` → `SEED_DOCS`/`PLAN_ROWS`/`DOMAIN_ORDER` (v4: seed 목록·순서는 계획이 정함, 상수·구 이름표 없음).
|
||||
4. stage_a_context READY + `task_c_bo_stage_a_context.v1` 검사 → source_universe_manifest → universe 3집합(evidence 비면 경성).
|
||||
5. 도메인별 루프:
|
||||
- seed 읽기(root 부재 즉사) → `validate_seed_object`: schema_version·domain_id 일치, status 5종 정책 판정(BLOCKED/FAILED 즉사 — 실패의 침묵 흡수 금지; NO_SUPPORT+후보 존재 모순 즉사; enum 밖 즉사), echo sha 2종 수집.
|
||||
- slice 원문+문서 이중 읽기(D3 — 원문 실패에도 문서는 재시도, allowed_bo_types 침묵 공집합 방지).
|
||||
- **R0-7a 신선도 실물 대조**: 계획 행 `slice_sha256` ↔ 지금 읽은 slice 원문 sha (모델 비경유 두 실물값). 불일치 = `PART2_SLICE_STALE`.
|
||||
- **R0-7b echo 4등급 처분**(정책 disposition_by_code 우선): `SEED_ECHO_FOREIGN_SLICE`(남의 자료 sha — block) / `SEED_ECHO_SHA_UNVERIFIABLE`(원문 없어 실물 대조 불가 — quarantine) / `SEED_ECHO_SHA_MISMATCH`(알려진 slip=activation sha — review) / `SEED_ECHO_SHA_UNEXPLAINED`(미상 — quarantine). D7: 자기 sha 를 foreign 집합에서 제외.
|
||||
- 전 계약 검증(worker_output_validator) warnings → `WORKER_OUTPUT_REVIEW` 채집.
|
||||
- **R0-6 admission** `admit_seed()`: 검증→오류를 처분 버킷으로(block / review / repair_normalize / repair_derive / repair_harvest / repair_evict / quarantine), 수리 순서는 정책 repair_order(제거 처분은 경로 내림차순·충전 처분은 오름차순), 최대 12패스 수렴 루프; 검증기 자체 crash 는 후보 단위로 좁혀 `VALIDATOR_CRASHED`(`_ROOT`) path 부여(D9); 잔여 위반은 후보 격리·뿌리 잔여는 정책 처분(residual_root_disposition). harvest 는 자유 공간 2곳(컨테이너 지역 payload + 후보 `extensions.worker_surplus[]` 덧붙이기 목록)으로 값 보존 + alias 승격(`excerpt`↔`value`·`content` 표류 교정); evict 는 후보 자체를 pop 하지 않고 격리로 전환(D4·D8 — 인덱스 밀림·침묵 소실 방지); content_bearing dict 는 검토 무게 상향.
|
||||
6. 후보별 `ensure_candidate_ref`(`<domain>:NNN` 결정적 부여) → `validate_candidate`(정규식 `^[A-Za-z][A-Za-z0-9_.-]{0,63}:[0-9]{3}$`·prefix·금지 필드 BO_ID/id/Evidence/EvidenceTitles·Reason/PriorAct/ReasonRefs null 강제) → membership hard BLOCK(slice universe 밖 source_refs) → `project_to_bo_surface`(정책 선언 규칙으로 v3→BO 호환면 고정 키 집합; 폴백은 반드시 note→review 발행; bo_type 비문자열 방어).
|
||||
7. 검토 채널 통합(R0-4): 후보 review_items + 루트 unknown_or_unrouted_reviews + NO_SUPPORT 합성 항목 + 투영 review(`R0:projection:NNN`, Action 폴백은 `action_source` 동반) + admission review(`R0:admission:NNN`, 처분·경로·규칙·원값 명시) — `expand_review_item` 이 v3 항목을 handoff 형으로 사상(REVIEW_ISSUE_ENUM 11종 · DOWNSTREAM_OWNER_ENUM 10종 · additive key `source_review_code`).
|
||||
8. **R0-6b 수용 결산** — 회계 보존 declared = admitted + quarantined (어긋나면 `SEED_ADMISSION_ACCOUNTING_DRIFT` 경고, D13: 검증기 유무 무관 누적), 뿌리 계약 파손 `PART2_SEED_ADMISSION_BLOCKED`, 격리 예산 초과 `PART2_SEED_ADMISSION_BUDGET_EXCEEDED`(비율>0.34), 공수용 `PART2_SEED_ADMISSION_EMPTY`, `SEED_ADMISSION_SUMMARY` 관측 경고.
|
||||
9. **원장 구성** — 투영본만 사용(R0-2 배선; 워커 원본 무수정 — R0-5). candidate_ref 유일성·universe 방어적 재검사(hard BLOCK) · 결정적 defer 플래그 3종(meeting_only_evidence_gap[C-2: registry_component_ids 있으면 증거 유래로 면제] · schema_field_fallback · prior_link_ambiguous) · exact duplicate 8성분 키 canonical merge(`EXACT_DUPLICATE_MERGE`, provenance 무손실) · near-dup 4성분 클러스터 KEEP_SEPARATE + `near-dup-NNN` + review · **non-deferrable 판정(X-3)**: 같은 클러스터 BehaviorTime/amount 상충 → `field_conflict` 예외 수록(예산: 후보 8·payload 2,000자).
|
||||
10. **보존 불변식** — ledger 계수 == 입력 계수, candidate_ref 보존 → 기록 3종(ledger[정렬: BehaviorTime→domain_order→BOType→ActionType→JuristicActLabel→Action→candidate_ref]·exception pack·review handoff PENDING_FINALIZE) + stdout 결산(candidate_counts·review_item_count·salvage_count).
|
||||
- **주요 실패 코드**: `R0_FANOUT_PLAN_EMPTY` · `PART2_PROJECTION_POLICY_INVALID` · `PART2_SEED_ADMISSION_POLICY_INVALID` · `PART2_ASSET_DEPLOYMENT_INCOMPLETE`(unregistered/hash_mismatch) · `MODULE_MIRROR_UNREGISTERED`/`MODULE_MIRROR_HASH_MISMATCH` · "Stage A context must be READY …" · "source universe manifest has no evidence indexes" · "…: stage_b_domain_bo_seed_output missing" · seed 계약 ValueError 군 · `PART2_SLICE_STALE` · `PART2_SEED_ECHO_FOREIGN_SLICE` 등 echo block 계열 · "BLOCK: … source_refs outside Stage A universe" · "invalid candidate_ref" · "duplicate candidate_ref" · `PART2_SEED_ADMISSION_BLOCKED` · `PART2_SEED_ADMISSION_BUDGET_EXCEEDED` · `PART2_SEED_ADMISSION_EMPTY` · "no seed candidate from Stage B workers" · 보존 불변식 2종. 실패 시 stdout `{"status":"FAILED","message":"R0 seed reducer 실패: downstream 진행 금지",…}` 후 re-raise.
|
||||
|
||||
### 4.4 Task_C_BO_R1_exception_adjudicator (LLM, v3 원문 바이트 동일 — 무변경)
|
||||
|
||||
- **유형/설정**: `llm_provider: google` · `llm_model: gemini-3.1-flash-lite` · `llm_reasoning: low` ·
|
||||
`llm_verbosity: low` · `max_iterations: 1` · `use_tools: [localdocs]` ·
|
||||
`cache_control: {mode: auto, ttl: 20m}` · `preflight: true` · preflight_files: `quality_gates/stage1_part2_exception_pack.json` ·
|
||||
프롬프트 = `COMMON_CACHE_PREFIX_STAGE_1`(공통 캐시 프리픽스 6절: PRECEDENCE_AND_SCOPE·SOURCE_AND_HALLUCINATION_GUARD·PROVENANCE_AND_UNCERTAINTY_CORE·SCHEMA_AND_WRITER_BOUNDARY·READ_DIET_AND_CACHE_RULES·OUTPUT_COMPACTNESS) + STATIC_BLOCK
|
||||
- **목적**: R0 가 non-deferrable 로 판정한 compact exception 만 판정한다 (Part 1 v3 GB 패턴).
|
||||
병합 실행·최종 파일 작성·사실 창작 금지.
|
||||
- **작업 내역**:
|
||||
1. pack `has_exceptions` 확인. false → no-exception 객체(`status: READY_NO_EXCEPTIONS`, exception_count 0, canonical/field/link/semantic_gate/blocked 5배열 빈 값) 기록 후 `"NO_EXCEPTIONS"` 만 출력 즉시 종료(다른 파일 읽기 금지).
|
||||
2. true → 각 exception 을 `compact_candidate_payload` 만으로 판정(추가 read 금지): canonical(KEEP_SEPARATE/MERGE[+`input_candidate_refs`·`merge_target_ref`]/SPLIT/DROP/BLOCK_REVIEW) · field(제공된 conflicting_values 중 `selected_value` 선택 또는 BLOCK_REVIEW — 임의 값 창작 금지) · link(나열 후보 선택/NO_LINK/BLOCK_REVIEW) · semantic(PASS/WARNING/BLOCK_REVIEW) · 확정 불가 → `blocked_review_items`(확신 없는 확정 금지 — 인간 검토 라우팅).
|
||||
3. 법리 기준: 같은 source 상충값(BehaviorTime·amount)은 원문 기재가 더 완전한 후보 선택, 우열 불가 시 BLOCK_REVIEW; KEEP_SEPARATE 가 provenance 보존 기본값; MERGE 는 provenance 합집합 무손실일 때만; DROP 은 source 유일 후보에 절대 금지. Stage 1 은 법률효과·청구원인을 확정하지 않는다.
|
||||
4. `write_file(overwrite=true)` 로 decisions 기록(root `postb_exception_adjudication`, schema `task_c_bo_postb_exception_adjudication.v1`, status READY, exception_count = 판정 수, 모든 decision 이 pack `exception_id` 인용) 후 `"R1 예외 판정 완료 (decisions=<건수>)"` 출력 종료.
|
||||
- **실패 정책**: pack 부재·파싱 불가 → 즉시 중단, 채팅 보고만(decisions 파일 미작성 — F0 의 P-11 이 이 부재를 "R1 미수행/실패"로 판독). tool 오류 1회 재시도, 재실패 시 `FAILED: <step>` 보고 종료.
|
||||
|
||||
### 4.5 Task_C_BO_F0_final_bo_compiler_gate_writer (code, v3 — PostB_3 final compiler + PostB_4 final gate/writer 통합)
|
||||
|
||||
- **유형/설정**: code-executor · run_code · python · httpx · network agent-network · timeout 240
|
||||
- **목적**: ledger + R1 decisions 를 합쳐 최종 `BO.json`(bh# 확정)을 컴파일하고, 기록 전·후 게이트로
|
||||
계약을 강제한다. BOType 어휘의 정본은 registry 합집합 — 코드 하드코딩 금지(C-5 교정: `{"event","state"}` 침묵 덮어쓰기 제거).
|
||||
- **내부 단계 순서**:
|
||||
1. 선언 자산 2종 sha256 대조 적재 — `_load_declarations()`(`bo_types_union`·`declared_key_union` 비면 즉사) + `_load_projection_policy()`(`f0_normalization` 필수).
|
||||
2. stage_a READY 검사("Stage A freshness guard") → `_stage_a_universe`(event/evidence/meeting 3집합) · `_evidence_map_from_stage_a`(by_evidence_index).
|
||||
3. ledger READY 검사(`task_c_bo_postb_seed_ledger.v1`).
|
||||
4. **P-11 R1 조건부 판정** — exception pack `exception_count`>0 인데 decisions 미가독 → 실패("R1 이 돌지 않았거나 실패"와 "예외 없음"을 가름); 0 이면 `R1_SKIPPED` 합성 no-exception 진행. decisions schema/status 검사. `blocked_review_items` 또는 BLOCK_REVIEW canonical 잔존 → 전체 실패(인간 검토 필요).
|
||||
5. 결정 적용 — ledger 의 EXACT_DUPLICATE_MERGE + R1 DROP/MERGE → dropped/merge_into; 생존자 결정적 정렬(`_sort_tuple`: BehaviorTime null 후순→BehaviorTime→domain_order→BOType→ActionType→JuristicActLabel→Action→candidate_ref) → `bh1..bhN` 부여, merge 원본도 대상 bh 매핑.
|
||||
6. 레코드 컴파일 — field_decisions 우선 적용; **F0-1 정규화**(BOType 비문자열/합집합 밖 → 정책 `bo_type_default` + normalization_note; ActionType∉enum 5종 → `action_type_default`; Action 공백 → `action_default_template` 치환); Evidence 항목은 evidence_authority_map 조회(`_evidence_item` 7키; relevant_content 부재 → evidence_gaps); Legal_Keywords = seed Legal_Keywords + domain_payload.legal_effect_tags + JuristicAct.label 중복 제거; core_field_base 10키(`Action_proposal`·`StatementType`·`Perspective` 폴백); ReasonRefs/PriorAct 매핑(**R-5 defer**: prior 후보 복수 → null 보존 + prior_link_note — blocker 아님); Reason 정문 2종.
|
||||
7. **기록 전 게이트 5종** — `candidate_conservation`(BO+absorbed==ledger) · `bo_items_array_non_empty` · `bo_schema_and_reference_validation`(`_validate_item`: ALLOWED_TOP_LEVEL 18키/REQUIRED_TOP_LEVEL 16키 집합, `bh#` 순번·id 일치(`^bh[1-9][0-9]*$`), BOType∈registry 합집합, ActionType∈enum 5종, JuristicAct {label}, core_field_base 10키 정확 일치, amount 키 제한, Evidence 7키 정확 일치, EvidenceTitles 파생 일치, source_evidence_indexes==Evidence[].evidence_index, universe 부분집합 3종, provenance 3키, downstream_seed_refs 3키, extensions 제한) · `extension_payload_key_declaration_check`(v4 신설 — 선언 밖 키는 실패가 아니라 review 로 남기고 값 보존; 구 이름 도메인은 `legacy_alias_targets` 로 해소, 미해소 시 `declared_key_union` 폴백 — 좁히지 못한 것을 위반으로 세지 않음) · (r1_decision_presence 포함 6게이트) → 실패 시 `_fail`(stdout FAILED + `sys.exit(1)`).
|
||||
8. `BO.json` 기록 → 재읽기 `post_write_json_parse` 게이트.
|
||||
9. `postb_compiled_bundle_compact.json` 기록(candidate_ref→bo_id 맵·normalization_notes·evidence_gap_items·prior_link_notes·extension_key_reviews).
|
||||
10. review handoff `FINALIZED` 갱신 + F0 review 3계열 추가(`F0:extension_key:<bo_id>` · `F0:prior:<candidate_ref>` · `F0:normalization:<candidate_ref>:<field>`) — F0-2: 침묵 폴백과 선언된 기본값의 차이는 관측 가능성(M-f 관측점).
|
||||
- **주요 실패 코드/게이트**: `F0_EXTENSION_DECLARATIONS_UNREGISTERED/HASH_MISMATCH/SCHEMA_MISMATCH` · `F0_REGISTRY_BO_TYPES_EMPTY` · `F0_EXTENSION_DECLARED_KEYS_EMPTY` · `F0_PROJECTION_POLICY_UNREGISTERED/HASH_MISMATCH/SCHEMA_MISMATCH/NORMALIZATION_MISSING` · `_fail` 사유: "Stage A freshness guard failed" · "R0 seed ledger not READY" · "R1 adjudication decisions required but unreadable" · "R1 adjudication schema mismatch" · "R1 adjudication status invalid" · "R1 returned BLOCK_REVIEW items: 인간 검토 필요" · "no surviving BO candidates after decisions" · "pre-write gate failed" · "post-write verification failed". 게이트 키 6종: `r1_decision_presence` · `candidate_conservation` · `bo_items_array_non_empty` · `bo_schema_and_reference_validation` · `extension_payload_key_declaration_check` · `post_write_json_parse`.
|
||||
|
||||
### 4.6 Task_C_BO_S0_signal_bundle_writer (code, v4 — 인라인 모듈 → 조립본 모듈 반입)
|
||||
|
||||
- **유형/설정**: code-executor · run_code · python · httpx · network agent-network · timeout 300 ·
|
||||
ANCHOR `/tmp/s1/_sig` (`pkg/signals` + `contracts` — 모듈의 `parents[1]` 디렉터리 산술을 반입 배치로 재현, 모듈 원문 무수정)
|
||||
- **목적**: 정본 signal 거래(transaction) 1건을 기록한다. 생성기 12(emit_sg02~13)·사영기 3(projections)·
|
||||
단일 기록기(transaction_writer)는 조립본 모듈이며 이 task 는 반입·호출·반출만 담당.
|
||||
- **내부 단계 순서**:
|
||||
1. **(1) 자산 반입** `materialize()` — 모듈 24종(compiler 7 · adapters 4 · emitters 13) 해시 대조 반입 + `signal_registry.v2.json`·`s5_execution_contract.v2.json` + registry 참조발 상대 $ref 폐포 스키마 전부 `_verify_asset` 반입(F-4c: 목록 상수화 금지 — registry 가 바뀌면 조용히 어긋나는 것을 차단).
|
||||
2. **(2) 입력 조립** `build_inputs()` — activation manifest(root 검사, `SG01_INPUT_REQUIRED`) · fan-out 계획 → 인스턴스별 seed 재검증(schema v3 · domain_id) · slice `domain_declarations.emits_signals` 채집(R-5, 부재 조용히 통과) · source_universe_manifest → universe(fact_ids·law_version_ids 는 의도적 빈 목록 — 조용한 통과 금지, 게이트가 잡게 둠) · BO.json → `bo_ids` · `unrouted_evidence_count`. `legacy_signals`·`signal_candidates` 는 빈 dict(v4 — 구 signal 원문 미주입).
|
||||
3. **(3) 컴파일·게이트** `compile_and_validate()` — `signal_compiler.compile_transaction(inputs, OUTPUT_DIR)`: S3 seed adapter → SG-01 adapter → SG-02~13 emitter 동적 import 순회 → domain envelope xN → 사영 3종(actio: 원천 없음 / case_liability: SG-05+SG-08 / legal_effect: SG-13) → manifest 인코딩; 이어 `signal_gate.validate_output` → transaction_id 패턴(`^S5TX-[a-f0-9]{20}$`) · canonical writer 유일성(`compiler/transaction_writer.py` 하나 — 실행기 내 파일 기록 주체 단일화 강제) · gate status PASS 검사.
|
||||
4. **(4) 반출** `publish()` — OUTPUT_DIR 의 *.json 바이트 그대로 `signals/` 접두 기록(재직렬화 금지) + 루트 별칭 3종(compatibility_views 와 바이트 동일 — 두 번째 생산자가 아니라 운반) + `signals/signal_manifest.json` 재읽기 해시 대조.
|
||||
5. **통지** — `compatibility_notices`(뷰 empty + 정본 populated → `COMPATIBILITY_VIEW_EMPTY`; Part 3·4 는 `signal_manifest.downstream_read_sets` 정본 집합으로 이관해야 함을 사실로만 기록) + `emission_notices`(선언 밖 signal 에 기록 → `SIGNAL_EMISSION_NOT_DECLARED`; 선언보다 적게 나오는 것은 정상). 통지 있으면 status `READY_WITH_REVIEW`.
|
||||
- **주요 실패 코드**: `MODULE_MIRROR_UNREGISTERED`/`MODULE_MIRROR_HASH_MISMATCH` · `PART2_ASSET_DEPLOYMENT_INCOMPLETE` · `SG01_INPUT_REQUIRED` · `S0_FANOUT_PLAN_EMPTY` · `S0_FANOUT_INSTANCE_INVALID` · `S0_SEED_ROOT_MISSING` · `S3_SEED_SCHEMA_VERSION_MISMATCH` · `S0_SEED_DOMAIN_MISMATCH` · `S0_SOURCE_UNIVERSE_EMPTY` · `S0_TRANSACTION_ID_PATTERN` · `S0_CANONICAL_WRITER_NOT_UNIQUE` · `S0_SIGNAL_GATE_FAILED` · `S0_COMPATIBILITY_VIEW_MISSING` · `S0_POST_WRITE_MANIFEST_HASH_MISMATCH`. 실패 시 stdout `{"status":"FAILED","message":"S0 signal bundle writer 실패",…}` 후 re-raise.
|
||||
- **게이트 관측 항목**(stdout gate 블록): status · error_count · canonical_writer_modules · source_membership_pass · domain_source_membership_pass · meeting_only_promotion_pass · negative_conflict_preservation_pass · compatibility_projection_pass · manifest_hash_pass · forbidden_conclusion_key_pass.
|
||||
|
||||
---
|
||||
|
||||
## 5. upstream-downstream 연결 — 연결 쌍별 이유·방식·자료 소비
|
||||
|
||||
### 5.1 Part 1 → A0 (스테이지 경계)
|
||||
|
||||
- **연결 이유**: Part 2 는 Part 1 의 라우팅·색인 산출 위에서만 실행 가능하다 (stage_chain Part 2 구간 requires 5종).
|
||||
- **연결 방식**: 파일 handoff + **digest 봉인**. `quality_gates/stage1_part1_soft_gate_handoff.json` 의 `digest_guard`
|
||||
3해시(screening·activation_manifest·registry_index)를 A0 가 read_raw 원문 바이트 해시와 대조 —
|
||||
Part 1 미수행/변조 시 `SEAL_FAILED` 로 스테이지 초입 정지 (stage_chain `enforcement.runtime_guard` 선언과 일치).
|
||||
- **자료 소비**: activation manifest 의 `execution_eligible` 행 집합과 `expected_runnable_domain_ids`(활성 집합의 정본),
|
||||
screening 의 `candidates[].requested_calculation_domains`(R-2 — Part 1 screener 02 가 CALC_NOT_IN_BINDINGS 로 이미 검증한 값을 재적재 없이 슬라이스로 통과),
|
||||
evidence_indexed 의 `items[].evidence_index`·`doc_uid`·`doc_type`·`source_pointer`·`registry_component_ids`(C-1 authority map),
|
||||
event candidates + meeting 원문(stage_a 3맵 원천), vocabulary(R-3 프롬프트 조각).
|
||||
|
||||
### 5.2 A0 → Task_C_B_domain_worker_* (fan-out)
|
||||
|
||||
- **연결 이유**: worker 인스턴스는 정적으로 존재하지 않는다 — A0 의 계획이 나와야 생긴다 (task_procedure 주석 "그래서 직렬이다").
|
||||
- **연결 방식**: 3중 — ① **반환 JSON `dynamic_fanout`**(오케스트레이터 `agent.py _extract_fanout_items` 가
|
||||
이 리스트로만 wildcard 확장; 계획 파일은 읽지 않음), ② **파일 handoff**: `runtime/compiled_prompts/<id>.md` +
|
||||
`runtime/domain_slices/<id>.json` 을 `preflight_files` 로 선적재, ③ **runtime parameter 주입**:
|
||||
`item.domain_id`·`task_instance_id`·`slice_sha256`·`compiled_prompt_sha256`·`expected_output_path`.
|
||||
- **자료 소비**: worker 는 조립 프롬프트를 실질 지시로, slice 의 `source_universe`(인용 가능 출처 전체)·
|
||||
`allowed_legal_effect_bo_types`(bo_type 어휘)·`domain_registry`(echo 용 sha 2종) 를 재료·경계로 소비.
|
||||
주입 sha 2종은 echo 전용(전사 자리).
|
||||
|
||||
### 5.3 Task_C_B_domain_worker_* → R0 (barrier 합류)
|
||||
|
||||
- **연결 이유**: reducer 는 전 도메인 seed 가 나와야 결정적으로 접을 수 있다.
|
||||
- **연결 방식**: DAG `wait_until: ["all Task_C_B_domain_worker_*"]` — **정확 일치 barrier**(누락·초과·중복 실패).
|
||||
기대 집합·경로·순서는 `{{prev}}` 참조가 아니라 **`fanout/domain_fanout_plan.json` 파일 계약**이 정한다
|
||||
(v4: 구 `{{prev.Task_C_BO_Stage_B_B*}}` 5개 제거 — worker 산출은 wildcard 인스턴스가 파일로 남김).
|
||||
- **자료 소비**: seed 루트에서 — 계약 판정(schema_version·domain_id·status 5종), echo sha 2종
|
||||
(계획 행 기대값과 대조 → R0-7b 4등급 처분), `bo_seed_candidates[]`(admission→투영→원장),
|
||||
`review_items[]`·`unknown_or_unrouted_reviews[]`(handoff 사상), NO_SUPPORT 상태(합성 review).
|
||||
|
||||
### 5.4 A0 → R0 (공유 문맥)
|
||||
|
||||
- **연결 이유**: R0 의 source membership·신선도·허용 어휘 판정의 실물 근거가 전부 A0 산출이다.
|
||||
- **연결 방식**: 파일 handoff 4계열 — fan-out 계획(기대 집합 + seed 경로 + sha 기대값),
|
||||
stage_a_context(**상태 게이트**: READY + schema v1), source_universe_manifest(universe 3집합),
|
||||
slice(도메인별 `allowed_legal_effect_bo_types` + **실물 sha 대조** `PART2_SLICE_STALE`).
|
||||
- **자료 소비**: universe 3집합은 hard BLOCK 기준(밖 참조 즉사), 계획 행 sha 는 모델 비경유
|
||||
신선도 판정(R0-7a), slice 의 `activation.activation_manifest_sha256` 은 알려진 slip 식별용.
|
||||
|
||||
### 5.5 R0 → R1 (조건부 예외 위임)
|
||||
|
||||
- **연결 이유**: 결정 규칙으로 defer 불가한 field_conflict(X-3 4중 조건)만 LLM 판정이 필요하다.
|
||||
- **연결 방식**: 파일 handoff `quality_gates/stage1_part2_exception_pack.json` 을 R1 **preflight** 로 제공 —
|
||||
R1 의 유일한 입력. `has_exceptions` 플래그가 실행 분기(false 면 no-exception 객체 기록 후 즉시 종료).
|
||||
- **자료 소비**: exception 별 `exception_id`·`exception_type`·`candidate_refs`·`conflicting_values`·
|
||||
`compact_candidate_payload`(후보 8·2,000자 예산)·`allowed_decisions` 만으로 판정 — ledger 전문·원자료 접근 금지.
|
||||
|
||||
### 5.6 R0 → F0 (원장 handoff)
|
||||
|
||||
- **연결 이유**: 최종 컴파일러는 워커 원본이 아니라 투영·정렬·플래그가 끝난 원장을 읽는다.
|
||||
- **연결 방식**: 파일 handoff `stage1_tmp/task_c_bo/postb_seed_ledger.json` + **상태 게이트**
|
||||
(schema `task_c_bo_postb_seed_ledger.v1` + status READY 필수).
|
||||
- **자료 소비**: `ledger_candidates[]` 의 `candidate_ref`·`seed_payload`(투영본)·`source_refs`·
|
||||
`deterministic_sort_key`(bh# 부여 순서의 정본)·`flags`; `deterministic_decisions[]` 의
|
||||
EXACT_DUPLICATE_MERGE(dropped/merge_into 구성); `exception_pack` 블록(참고).
|
||||
|
||||
### 5.7 R1 → F0 (조건부 판정 handoff — P-11)
|
||||
|
||||
- **연결 이유**: 예외가 있으면 final writer 는 단일 값을 R1 판정으로만 고를 수 있다.
|
||||
- **연결 방식**: 파일 handoff `stage1_tmp/task_c_bo/postb_adjudication_decisions.json` + **조건부 필수 규칙**:
|
||||
exception pack `exception_count`>0 이면 부재=실패("R1 미수행/실패"와 "예외 없음"을 가름 — 종전 무조건
|
||||
fallback 의 침묵 삼킴 교정), 0 이면 부재 허용하되 `R1_SKIPPED` 기록. BLOCK_REVIEW 잔존 시 F0 전체
|
||||
실패(인간 검토 라우팅) — 침묵 통과 금지.
|
||||
- **자료 소비**: `canonical_decisions`(DROP/MERGE → 생존자 집합·병합 맵), `field_decisions`
|
||||
((candidate_ref, field) → selected_value 우선 적용), `link_decisions`(reason_refs/prior 후보),
|
||||
`blocked_review_items`(정지 신호), status/schema(상태 게이트).
|
||||
|
||||
### 5.8 A0 → F0 (문맥 재사용)
|
||||
|
||||
- **연결 이유**: Evidence 블록 구성과 universe 검증의 정본이 stage_a_context 다.
|
||||
- **연결 방식**: 파일 handoff `stage1_tmp/task_c_bo/stage_a_context.json` (READY 게이트 재확인 — "Stage A freshness guard").
|
||||
- **자료 소비**: `evidence_authority_map.by_evidence_index`(Evidence 7키 항목·EvidenceTitles 구성),
|
||||
`event_candidate_map`·`meeting_clause_map`(universe 부분집합 검증), `input_digests_sha256`(ledger 경유 보존).
|
||||
|
||||
### 5.9 F0 → S0 (최종 BO handoff)
|
||||
|
||||
- **연결 이유**: signal 의 `bo_ids` universe 는 확정 BO 식별자(bh#)에서만 나온다.
|
||||
- **연결 방식**: 파일 handoff `BO.json` + F0 의 post-write reread 게이트가 선행 보증.
|
||||
- **자료 소비**: `BO_ID` 집합만 추출(`bo_ids` → source_universe.all_source_refs 편입) — 레코드 본문은
|
||||
S3 adapter 가 seed 원본에서 읽는다.
|
||||
|
||||
### 5.10 A0·worker → S0 (재료 재검증 소비)
|
||||
|
||||
- **연결 이유**: S0 는 개별 재실행 가능 task 라(F-4 주석 — 예행 하네스가 task 단위로 돌림) 자기 입력을 스스로 재검증한다.
|
||||
- **연결 방식**: fan-out 계획으로 seed 경로 열람 → seed 루트 schema_version·domain_id 재검사(상태 게이트);
|
||||
slice 의 `domain_declarations.emits_signals` 선언 대조(R-5 — 선언 밖 방출만 지목, 미달 방출은 정상);
|
||||
source_universe_manifest 로 universe 구성.
|
||||
- **자료 소비**: seed 전문(S3 domain seed adapter 입력 — 도메인 envelope·emitter 원료) · slice 선언 블록 ·
|
||||
universe 3목록(`event_candidate_ids`·`evidence_index_set`·`meeting_clause_ids`).
|
||||
|
||||
### 5.11 Part 1 → S0 (SG-01 직결)
|
||||
|
||||
- **연결 이유**: SG-01(활성화 매니페스트 signal)의 원천은 Part 1 D0 산출이다.
|
||||
- **연결 방식**: 파일 handoff `routing/domain_activation_manifest.json` → `sg01_activation_adapter` 가
|
||||
root 검사 후 거래에 편입 (`SG01_INPUT_REQUIRED` 경성). `unrouted_material` 계수가 universe 의
|
||||
`unrouted_evidence_count` 로 실린다.
|
||||
|
||||
### 5.12 Part 2 → Part 3/4·Stage 2 (하류 반출면 — 인계면 정본 실측)
|
||||
|
||||
- `BO.json` → Stage_2 · `Task_C_LE_L0_structure_seed_reducer` · `Task_C_LE_L2_final_structure_index_writer` ·
|
||||
`Task_C_FL_F0_fact_ledger_reducer` · `Task_C_FL_F2_final_fact_ledger_gate_and_writer`
|
||||
(최대 호환면 — 레코드 구조 불변 계약).
|
||||
- `signals/signal_manifest.json` 의 `downstream_read_sets` 가 하류 정본 signal 집합을 선언(`part3_L0` 등) —
|
||||
구 이름 루트 별칭 3종(`actio_case_signals.json`·`case_liability_signals.json`·`legal_effect_signals.json`)은
|
||||
소비자 0 (C-7 이관 완료, 바이트 동일 운반만 지속).
|
||||
- `quality_gates/stage1_part2_review_handoff.json`(FINALIZED) → Part 4 `Task_C_FL_F0`
|
||||
(R0 생산 + F0 공동 기록 — 인계면 `also_written_by` 선언. Stage 2 소비 선언은 인계면·chain 어디에도 없음 —
|
||||
chain 상 Part 4 requires 에만 등재).
|
||||
- 개별 signal 파일 소비(§2.6 표): SG-05·SG-13 → LE 트랙, SG-04·SG-06·SG-07·SG-10·SG-11 → FL 트랙
|
||||
(SG-11 조인 키는 레코드 signal_id — worker request_id 승계), `signals/domain_signals/<id>.json` → 양 트랙
|
||||
(부재는 영수증 계수), SG-02·SG-07 은 레코드 0 이 정상.
|
||||
- `validation_assets/routing/stage_receipt.json`·`stage1_tmp/task_c_bo/postb_compiled_bundle_compact.json` 은
|
||||
현재 소비자 없음(감사·동결·Part 4 재평가 대기 — 인계면 note).
|
||||
|
||||
### 5.13 봉인·해시 체인 총괄 (연결 방식의 유형학)
|
||||
|
||||
| 연결 방식 유형 | 사용처 |
|
||||
|---|---|
|
||||
| digest 봉인 (원문 바이트 sha256 3종) | Part1→A0 (`digest_guard`: screening·activation_manifest·registry_index) |
|
||||
| 배포 게이트 (runtime_manifest 등재+sha) | A0 F-2(19경로 일괄) · R0 F-4a/b(정책 3 + 미러 4) · F0(선언 자산 2종) · S0(모듈 24 + registry/계약 + 스키마 폐포 17) |
|
||||
| sha 주입·echo 대조 | A0→worker(계획 행 sha 2종 주입) → R0(전사 검증 R0-7b 4등급) |
|
||||
| 실물 sha 대조 (모델 비경유) | R0-7a(계획 sha ↔ slice 원문 sha) · S0 post-write manifest 해시 · F0 post-write reread |
|
||||
| 상태 게이트 (schema_version + status) | stage_a READY · ledger READY · decisions READY/READY_NO_EXCEPTIONS · seed status 5종 정책 · SLP registry status |
|
||||
| 집합 정확 일치 | A0(eligible==expected_runnable, planned==expected_runnable) · worker barrier(all) · F0 conservation(BO+absorbed==ledger) · R0 회계(declared==admitted+quarantined) |
|
||||
| receipt (관측 기록, 비강제) | A0 stage_receipt(P-13) · R0 stdout 결산 · S0 input_receipt/gate 블록 |
|
||||
| 조건부 필수 (P-11) | R1 decisions ↔ exception pack `exception_count` |
|
||||
| 공동 기록자 선언 | review_handoff (R0 생산 `PENDING_FINALIZE` → F0 `FINALIZED` 재기록) |
|
||||
|
||||
---
|
||||
|
||||
## 6. 특기사항 (Stage 2 명세서 설계 시 주의점)
|
||||
|
||||
1. **worker seed 파일의 기록자는 워커 하나** (R0-5). R0 는 수용·투영을 메모리에서만 수행하고 seed
|
||||
파일에 되쓰기하지 않는다 — 인계면 선언표가 기록자를 못박았다. S0 는 같은 파일을 원본으로 다시 읽는다
|
||||
(v3 적합 원본 소비).
|
||||
2. **오케스트레이터 결합점은 반환 JSON**: A0 의 최상위 `dynamic_fanout` 키가 wildcard 확장의 유일
|
||||
경로다 (`agent.py _extract_fanout_items`; 계획 파일은 읽지 않음 — MEMORY ㉛ 실장애 교정).
|
||||
LLM task 는 반드시 복수형 `prompts:` 리스트로 선언한다 (단수 `prompt:` 스칼라는 백엔드가 무시 — MEMORY ㉜).
|
||||
3. **어휘·정책의 정본은 코드 밖 선언 자산**: BOType=registry 합집합(`extension_payload_key_declarations.v1.json`),
|
||||
투영 규칙=`bo_surface_projection_policy.v1.json`, 수용 처분=`seed_admission_policy.v1.json`, 조립 규칙=
|
||||
`prompt_composition_policy.json`. 코드에 어휘 상수를 두지 않는 것이 v4 개정의 일관 원칙 (C-5·R0-1·F0-1).
|
||||
예외적으로 F0 의 `ACTION_TYPE_ENUM` 5종·`CORE_KEYS` 10종·`ALLOWED/REQUIRED_TOP_LEVEL` 은 BO.json
|
||||
구조 불변 계약의 일부로 코드에 남아 있다.
|
||||
4. **R1 은 v3 원문 바이트 동일(무변경)** — 머리말 선언. 나머지는 개정(A0 v4 · R0 v3+R0-1~7 ·
|
||||
F0 v3+F0-1~2 · S0 v4) 또는 신설(worker 템플릿).
|
||||
5. **특별법 profile 은 인자 전달이 관건**: `prompt_compiler.collect_domain_fragments` 는 디스크가 아니라
|
||||
호출자가 넘긴 `profile_paths` dict 만 본다 — A0 가 SLP registry 를 따라 dict 를 구성해 넘긴다
|
||||
(MEMORY ㉚ 장애 교정: `RuntimeContractError: special-law profile prompt path missing`).
|
||||
profile 3종: SLP-IP→E-20, SLP-MEDIA-MEDIATION→E-21, SLP-PRODUCT-LIABILITY→E-06.
|
||||
6. **신선도 판정의 원칙**: 워커의 echo sha 는 판정 근거가 아니다(전사 실수 하나가 회차 전체를 죽인
|
||||
실측 — MEMORY ㊲). 실물 두 값(계획서 sha ↔ R0 가 직접 읽은 문서 sha)이 정본이고, echo 불일치는
|
||||
4등급(남의 자료=block / 검증불가=quarantine / 알려진 slip=review / 미상=quarantine)으로 정책 처분된다.
|
||||
7. **후보 소실 경로는 격리 하나뿐** (D4 회계 불변식): declared = admitted + quarantined. 격리 예산
|
||||
(비율 0.34 · 최소 수용 1)을 넘으면 모델 잡음이 아니라 계약 파손으로 보고 경성 중단. 한 도메인 전부
|
||||
격리는 NO_SUPPORT 강등으로 회차 지속(정책 note).
|
||||
8. **호환 뷰 3종은 사영이며 빌 수 있다**: v4 는 구 signal 원문을 주입하지 않으므로 compatibility 표식이
|
||||
없어 뷰가 empty 일 수 있고, 이는 `COMPATIBILITY_VIEW_EMPTY` 통지로만 남는다. Part 3·4 는
|
||||
`signal_manifest.downstream_read_sets` 의 정본 집합으로 읽는다(이관 완료 — C-7).
|
||||
9. **runtime_manifest 는 465 entries** (실측; MEMORY 시점 432→433 에서 SLP·정책 자산 신설 등으로 증가).
|
||||
배포는 `extension_research/Default_Agent` 트리 통째 배포만 허용 — A0·R0·S0 3개 code task 의
|
||||
`PART2_DEPLOYMENT_REMEDY` 문자열이 동일하게 이를 강제한다(F0 는 remedy 문자열 없이
|
||||
`F0_EXTENSION_DECLARATIONS_UNREGISTERED` 등 자체 실패코드로 배포 대조만 수행).
|
||||
10. **인계면 정본과 YAML 의 정합**: `stage1_part_interface.v1.json`(handoff 55행) 중 Part 2 관련 32행
|
||||
(Part 2 생산 26 · Part 2 소비 입력 6)이 본 문서 §2 표와 문자 단위로 일치함을 대조 완료.
|
||||
`stage1_stage_chain.v1.json` Part 2 구간(order 2, yaml `stage_1_part_2_v.8.yml`, requires 5 ·
|
||||
produces 6)도 일치.
|
||||
11. **worker 는 결론 금지 계약**: 최종 청구권·요건충족·BO_ID·Evidence·EvidenceTitles·final_* 금지.
|
||||
"빈 배열 + review 가 억지 충전보다 낫다"는 규율이 프롬프트·R0 admission·F0 게이트 3층에서 반복
|
||||
강제된다. Reason/PriorAct/ReasonRefs 는 R0 단계까지 null/빈 값이어야 하며 F0 만 채운다.
|
||||
12. **로컬 스테이징 경로 분리**: A0·S0 는 `/tmp/s1`(S0 anchor `/tmp/s1/_sig`, 산출 `/tmp/s1/_signal_out`),
|
||||
R0 는 `/tmp/s1_r0` — 같은 컨테이너 재사용 시 충돌 방지. S0 의 계약 파일 배치는 모듈 디렉터리 산술
|
||||
(`_SIGNALS_ROOT.parents[1]/contracts`)의 재현이며 모듈 원문은 한 글자도 고치지 않는다.
|
||||
13. **MEMORY 개정 배경(현재형 아님 — 배경으로만)**: 무번호 항목(special_law_profiles 검증·전략·실행
|
||||
3연속) SLP 자산 신설·㉚ profile_paths 전달, ㉛ dynamic_fanout
|
||||
키 추가, ㉜ prompts 리스트화, ㉝ worker 모델 상향 + 투영 1순위 출처 필드 프롬프트 명시, ㉞ P-2a 순서
|
||||
교정(event 식별자 정본화), ㉟ S0 enum 8곳·엄격 객체 6종 프롬프트 안내, ㊱ R0-6 수용 정책(이미 돌던
|
||||
전 계약 검증 결과에 처분 부여), ㊲ R0-7 신선도 실물화 + echo 4등급.
|
||||
+368
@@ -0,0 +1,368 @@
|
||||
# Stage 1 Part 3 작업분석서 (LES/구조 색인) — Stage 2 작업명세서 설계 입력용
|
||||
|
||||
- 분석 대상 정본: `extension_research/ver_8_yaml_candidates/stage_1_part_3_v.8.yml`
|
||||
- **sha256 (첫 16자): `9a163a03262bfbad` · 크기: 52,878 bytes · 1,037행** (2026-08-23 실측)
|
||||
- Agent 선언: `Liti-agent_Civil_Suit_Plaintiff_Stage_1_Part_3` (version `v.2`) · Stage 1개: `stage1_법률효과구조_생성` ("법률효과 구조 생성, 색인 작성")
|
||||
- 구성: **task 2개 — 전부 code task**(code-executor MCP `run_code`, python, requirements `httpx`, network `agent-network`, timeout 240). LLM task 0개 — 스테이지 선언부의 `llm_provider: openai` / `llm_model: gpt-4o-2024-08-06` 은 선언만 있고 이를 소비하는 LLM task 가 없다. L1(판정자)은 의도적으로 두지 않았다(YAML 10행 주석: "L1 은 두지 않는다 — LLM 이 판정할 예외 부류가 없다. 신전략서 §4.1").
|
||||
- 진입 계약(YAML 7~8행 주석): `signals/signal_manifest.json` 의 `downstream_read_sets.part3_L0` = **SG-02 · SG-05 · SG-07 · SG-11 · SG-13** + **SG-01**(`routing/domain_activation_manifest.json`) + **`BO.json`**.
|
||||
- 실행 뿌리: 자산 논리 루트 `Default_Agent/`(localdocs 워크스페이스 기준) · 실행 샌드박스 `/tmp/s1`(`EXECUTION_ROOT`), 모듈 반입처 `/tmp/s1/_rt`.
|
||||
- 물리 배포 원본: `extension_research/Default_Agent` 트리 → 서버 `Default_Agent/` 에 **통째 배포**(양 task 의 `PART3_DEPLOYMENT_REMEDY` 문구: "부분 복사는 허용되지 않는다").
|
||||
|
||||
목차
|
||||
1. 전체 작업 DAG flow (ASCII)
|
||||
2. IO — task 별 입력·출력 파일 전수 표
|
||||
3. 작업용 assets — 배포 위치 포함 전수 표
|
||||
4. 개별 소작업(sub-task) 명칭·작업 내역·작업 목적
|
||||
5. upstream-downstream 연결
|
||||
6. 특기사항
|
||||
|
||||
---
|
||||
|
||||
## 1. 전체 작업 DAG flow
|
||||
|
||||
`task_procedure`(YAML 1,017~1,034행) 실물과 일치하는 완전 직렬 4노드 체인이다. 스테이지 말단 `prevs: []` · `nexts: []`(1,036~1,037행).
|
||||
|
||||
```
|
||||
Stage: stage1_법률효과구조_생성 (stage_1_part_3_v.8.yml)
|
||||
|
||||
┌────┐ ┌─────────────────────────────────────┐ ┌──────────────────────────────────────────┐ ┌─────┐
|
||||
│ IN │──────▶│ Task_C_LE_L0_structure_seed_reducer │──────▶│ Task_C_LE_L2_final_structure_index_writer │──────▶│ OUT │
|
||||
└────┘ │ (code · P3-L0 · 50~605행) │ │ (code · P3-L2 · 607~1,015행) │ └─────┘
|
||||
│ Θ 조립 · 구조 seed · 조인 · 검토 │ │ 보존 등식 셋 · 역인덱스 셋 · 최종 기록 │
|
||||
└─────────────────────────────────────┘ └──────────────────────────────────────────┘
|
||||
│ wait_until: ["IN"] │ wait_until: ["Task_C_LE_L0_structure_seed_reducer"]
|
||||
│ │
|
||||
│ (L0 ↔ L2 사이 — L1 자리 공백. │
|
||||
│ 1,027행 주석: "판정 부류가 생기면 │
|
||||
│ 이 사이에 끼운다(신전략서 §4.1)") ▼
|
||||
│ OUT wait_until:
|
||||
▼ ["Task_C_LE_L2_final_structure_index_writer"]
|
||||
파일 인계(hand-off):
|
||||
stage1_tmp/task_le/structure_seed_bundle.json ──────▶ L2 입력
|
||||
quality_gates/stage1_part3_review_handoff.json ──────▶ L2 입력(OPEN) → L2 갱신(FINALIZED)
|
||||
```
|
||||
|
||||
task_procedure 원문 대조표:
|
||||
|
||||
| 노드 | nexts | wait_until |
|
||||
|---|---|---|
|
||||
| `IN` | `["Task_C_LE_L0_structure_seed_reducer"]` | `[]` |
|
||||
| `Task_C_LE_L0_structure_seed_reducer` | `["Task_C_LE_L2_final_structure_index_writer"]` | `["IN"]` |
|
||||
| `Task_C_LE_L2_final_structure_index_writer` | `["OUT"]` | `["Task_C_LE_L0_structure_seed_reducer"]` |
|
||||
| `OUT` | `[]` | `["Task_C_LE_L2_final_structure_index_writer"]` |
|
||||
|
||||
상·하류를 포함한 데이터 흐름(스테이지 체인 `stage1_stage_chain.v1.json` order 3 구간과 일치):
|
||||
|
||||
```
|
||||
[Part 1] Task_D0_domain_activation_gate ──▶ routing/domain_activation_manifest.json (SG-01) ──┬──▶ L0, L2
|
||||
[Part 2] Task_C_BO_S0_signal_bundle_writer ──▶ signals/signal_manifest.json ──────────────────┼──▶ L0 (봉인 검증)
|
||||
Task_C_BO_S0_signal_bundle_writer ──▶ signals/legal_effect_routes.json (SG-13) ──────┼──▶ L0, L2
|
||||
Task_C_BO_S0_signal_bundle_writer ──▶ SG-05·SG-11·SG-02·SG-07 4파일 ─────────────────┼──▶ L0
|
||||
Task_C_BO_S0_signal_bundle_writer ──▶ signals/domain_signals/<domain_id>.json ───────┼──▶ L0
|
||||
Task_C_BO_F0_final_bo_compiler_gate_writer ──▶ BO.json ──────────────────────────────┼──▶ L0, L2
|
||||
Task_C_BO_A0_context_and_domain_slice_compiler ──▶ runtime/domain_slices/<id>.json ──┴──▶ L0
|
||||
│
|
||||
▼
|
||||
L0 ──▶ structure_seed_bundle.json · review_handoff(OPEN) · part3_receipt.json
|
||||
│
|
||||
▼
|
||||
L2 ──▶ legal_effect_structures.json · review_handoff(FINALIZED)
|
||||
│
|
||||
▼
|
||||
[Part 4] Task_C_FL_F0_fact_ledger_reducer · Task_C_FL_F2_final_fact_ledger_gate_and_writer · [Stage 2]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. IO — task 별 입력·출력 파일 전수 표
|
||||
|
||||
모든 읽기·쓰기는 localdocs MCP(`http://mcp-localdocs:8012/mcp`)의 `read_docs` / `write_file` 호출로 수행된다(워크스페이스 루트 기준 논리 경로). `<domain_id>` 는 SG-01 의 `expected_runnable_domain_ids` 원소를 뜻한다.
|
||||
|
||||
### 2.1 Task_C_LE_L0_structure_seed_reducer — 입력
|
||||
|
||||
| # | 경로 | 포맷 | 생산자 | 읽기 방식·용도 |
|
||||
|---|---|---|---|---|
|
||||
| I-1 | `signals/signal_manifest.json` | json | Part 2 `Task_C_BO_S0_signal_bundle_writer` | `read_json` — 진입 봉인 1: `transaction_id` 정규식 `^S5TX-[a-f0-9]{20}$` + `files[]` 전수 sha256 대조. `files[].path` 에 `signals/` 접두사가 없어 붙여서 재독한다 |
|
||||
| I-1' | `signals/` + manifest `files[].path` (전수) | json | 〃 | `read_raw` — 봉인 대조용 원문 재독(재직렬화 금지) |
|
||||
| I-2 | `signals/legal_effect_routes.json` (SG-13) | json | 〃 (`signals/compiler/common.py` 경유) | `read_json` → `records[]` — 효과 경로 조인 원천 |
|
||||
| I-3 | `signals/legal_relation_lifecycle_signals.json` (SG-05) | json | 〃 | `read_json` → `records[]` — 근거 refs(evidence_refs·meeting_clause_refs) 합집합 |
|
||||
| I-4 | `signals/calculation_requirements.json` (SG-11) | json | 〃 | `read_json` → `records[]` — 계산 조인(키: 레코드 `signal_id`) |
|
||||
| I-5 | `signals/procedural_posture_relief_signals.json` (SG-02) | json | 〃 | `read_json` — 조인 없이 읽되 비어 있음을 `empty_read_set` 으로 형식화 기록(레코드 0 정상) |
|
||||
| I-6 | `signals/asset_right_state_signals.json` (SG-07) | json | 〃 | `read_json` — SG-02 와 동일 처리 |
|
||||
| I-7 | `signals/domain_signals/<domain_id>.json` | json (패턴) | 〃 | `try_read_json` — expected_runnable 중 실재하는 것만; 부재는 `audit.input_gaps`(`domain_envelope_absent`) 계수. `calculation_refs` 가 SG-11 조인 상대 |
|
||||
| I-8 | `routing/domain_activation_manifest.json` (SG-01) | json | Part 1 `Task_D0_domain_activation_gate` (`stage1_runtime/activation_gate.py` 경유) | `read_json` — `expected_runnable_domain_ids`(Θ 정의역) · `registry_index_sha256`(진입 봉인 2) |
|
||||
| I-9 | `BO.json` | json | Part 2 `Task_C_BO_F0_final_bo_compiler_gate_writer` | `try_read_json` + `read_raw` — BO 부착 조인(`BO_ID`/`id` · `provenance.source_domain` · `Legal_Keywords`). 무봉인 입력 — 영수증에 sha·계수만 관찰 기록 |
|
||||
| I-10 | `runtime/domain_slices/<domain_id>.json` | json (패턴) | Part 2 `Task_C_BO_A0_context_and_domain_slice_compiler` | `try_read_json` — 슬라이스 `domain_declarations.structure_type_ids` ↔ config 선언 정합 검토; 부재는 `input_gaps`(`slice_absent`) |
|
||||
| I-11 | `Default_Agent/runtime_manifest.json` | json | 배포 자산(장부) | `read_raw`+parse — 배포 게이트·`_verify_asset` 의 등재/sha 기준. `schema_version` = `stage1_runtime_manifest.v1` 강제 |
|
||||
| I-12 | `Default_Agent/domains/_registry_index.json` | json | 배포 자산(레지스트리 색인) | `read_raw` — SG-01 의 `registry_index_sha256` 과 대조(봉인 2) 후 파싱. `entries[]` 배열 위치가 전순서 둘째 키. 매니페스트 미등재 자산 — SG-01 봉인이 단독 방어 |
|
||||
| I-13 | `Default_Agent/stage1_runtime/structure_index_policy.v1.json` | json | 배포 자산(정책) | `_verify_asset` — `schema_version` = `stage1_structure_index_policy.v1` 강제 |
|
||||
| I-14 | `Default_Agent/platform/schemas/structure_seed_bundle.schema.json` | json | 배포 자산(스키마) | `_verify_asset` — 의미 검사(`theta` · `structure_records[].admission_policy` 인지) 후 L0 산출 자기 검증에 사용 |
|
||||
| I-15 | `Default_Agent/routing/extension_payload_key_declarations.v1.json` | json | 배포 자산(별칭표) | `_verify_asset` — `legacy_alias_targets`(B1~B5 구 이름 → registry 도메인 목록) 를 BO 부착 조인에 사용 |
|
||||
| I-16 | `Default_Agent/domains/<domain_id>/domain_config.json` | json (패턴) | 배포 자산(레지스트리) | `read_raw` — `_registry_index` 의 `config_sha256` 사슬 대조 후 파싱. `structure_types[]` 가 Θ·레코드의 원천 |
|
||||
| I-17 | `Default_Agent/domains/<domain_id>/structure_types.json` | json (패턴) | 배포 자산(사이드카) | `_verify_asset` — `structure_types` 선언이 있는 도메인만. 선언 있는 도메인의 부재·미등재는 경성 실패 |
|
||||
| I-18 | `Default_Agent/domains/<domain_id>/module_role_projection.json` | json (패턴) | 배포 자산(사이드카) | `_verify_asset` — I-17 과 쌍으로 읽음 |
|
||||
| I-19 | `Default_Agent/stage1_runtime/runtime_common.txt` | txt (py 미러) | 배포 자산(모듈 미러) | `read_raw` — 등재·sha 검증 후 `/tmp/s1/_rt/runtime_common.py` 로 반입 |
|
||||
| I-20 | `Default_Agent/stage1_runtime/schema_subset_validator.txt` | txt (py 미러) | 〃 | 〃 → `_rt/schema_subset_validator.py` — L0 산출 닫힌 스키마 검증에 import |
|
||||
| I-21 | `Default_Agent/stage1_runtime/registry_loader.txt` | txt (py 미러) | 〃 | 〃 → `_rt/registry_loader.py` (반입·검증만 — L0 코드가 직접 import 하지는 않음) |
|
||||
| I-22 | `Default_Agent/stage1_runtime/structure_index_compiler.txt` | txt (py 미러) | 〃 | 〃 → `_rt/structure_index_compiler.py` — `compile_structure_seeds` import 호출(조립 본체) |
|
||||
| I-23 | `Default_Agent/platform/schemas/legal_effect_structures.schema.json` | json | 배포 자산(스키마) | **게이트 전용** — `PART3_REQUIRED_ASSETS` 로 등재·sha·가독 검사만 받고 L0 에서 파싱 소비 없음 |
|
||||
| I-24 | `Default_Agent/signals/signal_registry.v2.json` | json | 배포 자산(레지스트리) | **게이트 전용** — 검사만, 파싱 소비 없음 |
|
||||
| I-25 | `Default_Agent/contracts/signals/s5_execution_contract.v2.json` | json | 배포 자산(계약) | **게이트 전용** — 검사만. E-13 `extension_key` 값 자체는 정책 파일의 `extension_key_rule` 로 소비 |
|
||||
|
||||
### 2.2 Task_C_LE_L0_structure_seed_reducer — 출력
|
||||
|
||||
| # | 경로 | 포맷 | 루트 키 / schema_version | 소비자 |
|
||||
|---|---|---|---|---|
|
||||
| O-1 | `stage1_tmp/task_le/structure_seed_bundle.json` | json (canonical: `sort_keys` · 최소 구분자 · 개행 종결) | `structure_seed_bundle` / `stage1_structure_seed_bundle.v1` | `Task_C_LE_L2_final_structure_index_writer` |
|
||||
| O-2 | `quality_gates/stage1_part3_review_handoff.json` | json (canonical) | `stage1_part3_review_handoff` / `stage1_part3_review_handoff.v1` · `status: "OPEN"` | L2 (읽고 FINALIZED 로 갱신 — 공동 기록자) |
|
||||
| O-3 | `validation_assets/routing/part3_receipt.json` | json (canonical) | `stage1_part3_receipt.v1` · `stage: "P3-L0"` | 소비 task 없음 — 검증 전용(인계면 선언과 일치) |
|
||||
| O-4 | (stdout) `RESULT` JSON | json | — | 오케스트레이터 로그 (status · modules · expected_runnable_domain_ids · theta_count · structure_record_count · review_item_count · counts · errors · warnings) |
|
||||
| (로컬) | `/tmp/s1/_rt/{runtime_common,schema_subset_validator,registry_loader,structure_index_compiler}.py` | py | 미러 반입본 | 실행 컨테이너 내부 전용(워크스페이스 밖) |
|
||||
|
||||
### 2.3 Task_C_LE_L2_final_structure_index_writer — 입력
|
||||
|
||||
| # | 경로 | 포맷 | 생산자 | 읽기 방식·용도 |
|
||||
|---|---|---|---|---|
|
||||
| I-1 | `stage1_tmp/task_le/structure_seed_bundle.json` | json | L0 | `read_json` — 레코드·theta·unattached_routes·unattached_bo·`signal_manifest_transaction_id` 승계원 |
|
||||
| I-2 | `quality_gates/stage1_part3_review_handoff.json` | json | L0 | `read_json` — `review_items[]` 를 (review_code, severity) 로 묶어 `review_queue` 재산정. 갱신 대상이기도 함 |
|
||||
| I-3 | `routing/domain_activation_manifest.json` | json | Part 1 `Task_D0_domain_activation_gate` | `read_json` — `expected_runnable_domain_ids` · `registry_index_sha256` 재대조 + 최종본에 `activation_manifest_sha256` 실측 기재 |
|
||||
| I-4 | `Default_Agent/domains/_registry_index.json` | json | 배포 자산 | `read_raw` — 봉인 재검(`PART3_REGISTRY_INDEX_SEAL_FAILED` stage L2) + `config_sha256` 사슬 + `registry_index_sha256` 실측 기재 |
|
||||
| I-5 | `Default_Agent/domains/<domain_id>/domain_config.json` | json (패턴) | 배포 자산 | `read_raw` — **선언 보존 등식의 바깥 수**: Σ(expected_runnable 도메인 `structure_types` 개수) 직접 계수 |
|
||||
| I-6 | `signals/legal_effect_routes.json` (SG-13) | json | Part 2 S0 | `read_json` — **근거 보존 등식의 바깥 수**: `record_type == "legal_effect_route"` 총수 직접 계수 |
|
||||
| I-7 | `BO.json` | json | Part 2 F0 | `read_json` — **BO 보존 등식의 바깥 수**: 레코드 총수 직접 계수 |
|
||||
| I-8 | `Default_Agent/runtime_manifest.json` | json | 배포 자산(장부) | `read_raw`+parse — `_verify_asset`·모듈 미러 검증 기준 |
|
||||
| I-9 | `Default_Agent/stage1_runtime/structure_index_policy.v1.json` | json | 배포 자산(정책) | `_verify_asset` — 판본 강제(`stage1_structure_index_policy.v1`) |
|
||||
| I-10 | `Default_Agent/platform/schemas/legal_effect_structures.schema.json` | json | 배포 자산(스키마) | `_verify_asset` — 의미 검사(`by_module`·`by_bo_id` 인지) + 최종본 닫힌 스키마 검증 |
|
||||
| I-11 | `Default_Agent/stage1_runtime/runtime_common.txt` | txt (py 미러) | 배포 자산(모듈 미러) | 등재·sha 검증 후 `/tmp/s1/_rt/` 반입 |
|
||||
| I-12 | `Default_Agent/stage1_runtime/schema_subset_validator.txt` | txt (py 미러) | 〃 | 〃 — 닫힌 스키마 검증에 import |
|
||||
| I-13 | `legal_effect_structures.json` | json | L2 자신 | `read_raw` — 기록 직후 재읽기 sha 대조(`PART3_WRITE_REREAD_MISMATCH`) |
|
||||
|
||||
L2 는 `signals/signal_manifest.json` 을 **읽지 않는다** — 거래 식별자는 L0 가 bundle 에 부착한 값을 승계한다(YAML 531~533행 주석: "L2 는 signal_manifest 를 다시 읽지 않고(§4.3 입력 계약 밖) 이 값을 승계한다").
|
||||
|
||||
### 2.4 Task_C_LE_L2_final_structure_index_writer — 출력
|
||||
|
||||
| # | 경로 | 포맷 | 루트 키 / schema_version | 소비자 |
|
||||
|---|---|---|---|---|
|
||||
| O-1 | `legal_effect_structures.json` | json (canonical) | 루트 평면 문서 / `stage1_legal_effect_structures.v1` | Part 4 `Task_C_FL_F0_fact_ledger_reducer` · `Task_C_FL_F2_final_fact_ledger_gate_and_writer` · Stage 2 (인계면 선언) |
|
||||
| O-2 | `quality_gates/stage1_part3_review_handoff.json` | json (canonical) | `stage1_part3_review_handoff` — `status: "FINALIZED"` · `finalized_by` 추가, 항목 불감소 | 검토 채널 종결 표기 |
|
||||
| O-3 | (stdout) `RESULT` JSON | json | — | 오케스트레이터 로그 (status · modules · structure_record_count · theta_count · index_bucket_counts · quality_gate_pass · review_queue_count) |
|
||||
|
||||
### 2.5 IO 경로 집계
|
||||
|
||||
- 입력 고정 경로 20종(사건 산출 8 + 정적 자산 12) + 입력 패턴 5종(`domain_signals/<id>` · `domain_slices/<id>` · `domain_config` · `structure_types` · `module_role_projection`) = **입력 경로 클래스 25종**
|
||||
- 산출 4종(`structure_seed_bundle.json` · `stage1_part3_review_handoff.json` · `part3_receipt.json` · `legal_effect_structures.json`)
|
||||
- 합계 **29개 경로 클래스** (stdout RESULT 2건·`/tmp/s1/_rt` 반입본 4건은 워크스페이스 밖이라 불산입)
|
||||
|
||||
---
|
||||
|
||||
## 3. 작업용 assets — 배포 위치 포함 전수 표
|
||||
|
||||
물리 원본: `BASE/extension_research/Default_Agent/` (BASE = `…/YAML_Prompts/1. Stage_1/v.7`). 서버 배포 시 워크스페이스 `Default_Agent/` 로 통째 배포. 장부 `runtime_manifest.json` 실측: `schema_version: stage1_runtime_manifest.v1` · `runtime_artifact_count: 465` · `entries: 465`.
|
||||
|
||||
### 3.1 실행 모듈 (python — .py 와 .txt 미러 복제 쌍, 4쌍 전부 sha256 동일 실측)
|
||||
|
||||
| 모듈 | .py 경로 | .txt 미러 경로 (YAML 이 읽는 쪽) | 사용 task | 역할 |
|
||||
|---|---|---|---|---|
|
||||
| runtime_common | `Default_Agent/stage1_runtime/runtime_common.py` | `Default_Agent/stage1_runtime/runtime_common.txt` | L0 · L2 (반입) | 공용 유틸(RuntimeContractError·load_json·sha256_file 등). L0/L2 코드가 직접 import 하지는 않으나 반입·검증 대상 |
|
||||
| schema_subset_validator | `Default_Agent/stage1_runtime/schema_subset_validator.py` | `Default_Agent/stage1_runtime/schema_subset_validator.txt` | L0 · L2 (import) | 닫힌 스키마 부분집합 검증기 — L0 bundle·L2 최종본 검증 |
|
||||
| registry_loader | `Default_Agent/stage1_runtime/registry_loader.py` | `Default_Agent/stage1_runtime/registry_loader.txt` | L0 (반입만) | 레지스트리 적재기(`from runtime_common import …` 의존). L0 코드 직접 import 없음 — 게이트·반입 대상 |
|
||||
| structure_index_compiler | `Default_Agent/stage1_runtime/structure_index_compiler.py` (529행) | `Default_Agent/stage1_runtime/structure_index_compiler.txt` | L0 (import) | **Part 3 조립 본체** — 순수 함수 `compile_structure_seeds(…)` 12인자, 파일 IO·시각·난수 없음(결정론) |
|
||||
|
||||
미러 규율: MODULE_MIRRORS 는 `.txt` 논리 경로만 담고, 반입 시 `runtime_manifest` 의 sha 와 대조 후 `/tmp/s1/_rt/<이름>.py` 로 기록·`sys.path` 삽입. 미등재는 `MODULE_MIRROR_UNREGISTERED`, 불일치는 `MODULE_MIRROR_HASH_MISMATCH`.
|
||||
|
||||
### 3.2 정책·스키마·별칭표·계약 (단일 파일 자산)
|
||||
|
||||
| 자산 | 배포 경로 | 포맷 | 사용 task·용도 |
|
||||
|---|---|---|---|
|
||||
| 구조 색인 정책 | `Default_Agent/stage1_runtime/structure_index_policy.v1.json` (`stage1_structure_index_policy.v1` · 7,032 B) | json | L0(컴파일러 인자·판본 검사) · L2(판본 검사). Θ 정의·record_identity(`LES-<domain_id>-<type_id>`)·전순서 3키·admission_policy 2단·보존 등식 셋·검토 코드 7종·경성 실패 코드 14종·E-00/E-13/EC-00 특칙을 코드 밖에 선언 |
|
||||
| seed 번들 스키마 | `Default_Agent/platform/schemas/structure_seed_bundle.schema.json` (title `stage1_structure_seed_bundle.v1`) | json | L0 — 의미 검사(`theta`·`structure_records[].admission_policy`) + 산출 자기 검증. 레코드 필수 16필드 |
|
||||
| 최종 색인 스키마 | `Default_Agent/platform/schemas/legal_effect_structures.schema.json` (title `stage1_legal_effect_structures.v1`) | json | L0(게이트 전용) · L2(의미 검사 `by_module`·`by_bo_id` + 최종 검증). 루트 필수 9키, `structure_index` 필수 3색인 |
|
||||
| 확장 payload 키 선언표(별칭표) | `Default_Agent/routing/extension_payload_key_declarations.v1.json` | json | L0 — `legacy_alias_targets` 5키(`B1_Money_Successor`·`B2_Secured_Registry`·`B3_Land_Valuation`·`B4_Actio`·`B5_Succession_Notice_Lien_Asset_Defense` → registry 도메인 목록) 로 BO `source_domain` 해소 |
|
||||
| 신호 레지스트리 | `Default_Agent/signals/signal_registry.v2.json` | json | L0 — **게이트 전용**(등재·sha·가독 검사만) |
|
||||
| S5 실행 계약 | `Default_Agent/contracts/signals/s5_execution_contract.v2.json` | json | L0 — **게이트 전용**. `e13_extension_domains` = [{domain_id: E-13, extension_key: `actio_case_signals.v2`}] 선언 원천이나 Part 3 실행 시 소비는 정책 파일 `extension_key_rule` 경유 |
|
||||
|
||||
### 3.3 장부·레지스트리
|
||||
|
||||
| 자산 | 배포 경로 | 포맷 | 용도 |
|
||||
|---|---|---|---|
|
||||
| 런타임 매니페스트 | `Default_Agent/runtime_manifest.json` | json | L0·L2 — 등재·sha256 장부(실측 465건). 배포 게이트와 `_verify_asset`·미러 검증의 기준 |
|
||||
| 도메인 레지스트리 색인 | `Default_Agent/domains/_registry_index.json` | json | L0·L2 — 26 entries(순서: E-00…E-21, EC-00, X1, X2, X3) · `registry_version: Stage1.Assembly.2026-08-10.v1` · entry 별 `config_sha256`. **매니페스트 미등재 실측 확인** — SG-01 의 `registry_index_sha256` 봉인이 단독 방어(YAML 222~223행 주석과 일치). entries 배열 위치가 전순서 둘째 키 |
|
||||
|
||||
### 3.4 도메인 가족 자산 (26 도메인)
|
||||
|
||||
| 자산 | 배포 경로 패턴 | 개수(실측) | 사용 |
|
||||
|---|---|---|---|
|
||||
| 도메인 설정 | `Default_Agent/domains/<domain_id>/domain_config.json` | 26 (E-00~E-21 · EC-00 · X1~X3) | L0(structure_types → Θ·레코드) · L2(선언 보존 바깥 수). 무결성: SG-01 봉인 → `_registry_index` → `config_sha256` 사슬 |
|
||||
| 구조 유형 사이드카 | `Default_Agent/domains/<domain_id>/structure_types.json` | **25** (EC-00 없음 — 선언 0 도메인) | L0 — admission_policy 재료·유형 집합 교차 검증. 매니페스트에 사이드카 50건 등재 실측 |
|
||||
| 모듈·역할 투영 사이드카 | `Default_Agent/domains/<domain_id>/module_role_projection.json` | **25** (EC-00 없음) | L0 — 투영(config ↔ 사이드카) 교차 검증·default_projection 운반 |
|
||||
|
||||
사이드카 방언(컴파일러 `read_sidecar_types`/`read_sidecar_projection` 이 정규화 — 실측 표본):
|
||||
- canonical 형: 목록 키 `structure_types` + 파일 정책 `admission_rules` + 투영 `mappings` (예: E-01, E-13)
|
||||
- legacy 형: 목록 키 `entries` + `legacy_contract`/`noncanonical_preservation`/`ordering_preserved` + 투영 `structure_type_to_projection` (예: E-00, X1)
|
||||
- 인정 목록 키 3종(`entries`·`structure_types`·`types`) · 투영 키 3종(`projections`·`mappings`·`structure_type_to_projection`) · 파일 정책 키 3종(`admission_rules`·`unregistered_effect_policy`·`fallback_policy`)
|
||||
|
||||
### 3.5 배포 게이트 대상 집합 (L0 `PART3_REQUIRED_ASSETS` 10 리터럴 — YAML 224~235행)
|
||||
|
||||
```
|
||||
Default_Agent/platform/schemas/structure_seed_bundle.schema.json
|
||||
Default_Agent/platform/schemas/legal_effect_structures.schema.json
|
||||
Default_Agent/stage1_runtime/structure_index_policy.v1.json
|
||||
Default_Agent/routing/extension_payload_key_declarations.v1.json
|
||||
Default_Agent/signals/signal_registry.v2.json
|
||||
Default_Agent/contracts/signals/s5_execution_contract.v2.json
|
||||
Default_Agent/stage1_runtime/structure_index_compiler.txt
|
||||
Default_Agent/stage1_runtime/runtime_common.txt
|
||||
Default_Agent/stage1_runtime/schema_subset_validator.txt
|
||||
Default_Agent/stage1_runtime/registry_loader.txt
|
||||
```
|
||||
게이트 검사 집합 = `set(MODULE_MIRRORS.values()) ∪ PART3_REQUIRED_ASSETS` = 10 (미러 4종이 목록에 이미 포함, receipt `checked_count` 도 이 값). 사이드카 50 은 여기 넣지 않고 읽는 시점의 `_verify_asset` 으로 지키며, `_registry_index.json` 은 SG-01 봉인이 지킨다(YAML 220~223행 주석 그대로).
|
||||
|
||||
### 3.6 자산 집계
|
||||
|
||||
- 모듈 미러 8파일(4쌍) + 단일 자산 8파일(정책 1 · 스키마 2 · 별칭표 1 · 신호 레지스트리 1 · S5 계약 1 · 매니페스트 1 · 레지스트리 색인 1) + `domain_config` 26 + 사이드카 50 = **정적 자산 총 92파일** (논리 자산 종류로는 모듈 4종 + 단일 8종 + 도메인 가족 3종 = 15종)
|
||||
|
||||
---
|
||||
|
||||
## 4. 개별 소작업(sub-task) 명칭·작업 내역·작업 목적
|
||||
|
||||
### 4.1 Task_C_LE_L0_structure_seed_reducer (P3-L0)
|
||||
|
||||
- **작업 명칭**: `Task_C_LE_L0_structure_seed_reducer` (v1) — YAML 50~605행, 임베디드 python code 58~605행
|
||||
- **실행 형태**: `mcp: code-executor` · `tool_name: run_code` · `language: python` · `requirements: "httpx"` · `network: "agent-network"` · `timeout: 240`
|
||||
- **작업 목적**: SG-01 이 확정한 `expected_runnable_domain_ids` 를 정의역으로 **Θ(사건의 구조 유형 합집합)를 조립**하고, (도메인, type_id) 쌍마다 하나씩 **구조 seed 레코드**를 만들며, SG-13(효과 경로)·SG-11(계산)·SG-05(근거)·BO(기초 객체) 를 레코드에 **조인/부착**하고, 판정 불가 사항을 **검토 항목**으로 넘긴다. 판정 규칙은 코드에 두지 않고 정책 자산과 컴파일러 모듈에 위임한다(YAML 515행 주석 "판정 규칙을 이 파일에 쓰지 않는다").
|
||||
- **YAML 래퍼 내부 단계 순서**(코드 61~63행 주석 = 실물 실행 순서):
|
||||
1. **(0) 배포 게이트** `assert_deployment()` — 매니페스트 판본 검사(`PART3_RUNTIME_MANIFEST_INVALID`) 후 10개 자산의 등재·sha256·가독을 한 벌로 검사. 첫 실패에서 멈추지 않고 `unregistered`/`hash_mismatch`/`unreadable` 를 모아 `PART3_ASSET_DEPLOYMENT_INCOMPLETE` 로 일괄 보고(remedy 문구 동반)
|
||||
2. **(1) 모듈 반입** `materialize_modules()` — 미러 4종을 sha 대조 후 `/tmp/s1/_rt/*.py` 로 기록, `sys.path` 삽입, `import structure_index_compiler`
|
||||
3. **(2) 정책 반입** — `_verify_asset(POLICY)` + `schema_version` 불일치 시 `PART3_POLICY_INVALID`
|
||||
4. **(3) 의미 검사(입력 쪽)** `assert_seed_schema_capability` — seed 스키마가 `theta`·`structure_records[].admission_policy` 를 아는지(모르면 `PART3_STRUCTURE_SCHEMA_STALE` — 개정 전 판본 배포 탐지)
|
||||
5. **(4) 진입 봉인 둘** — ① `verify_signal_seal()`: `transaction_id` 정규식 + manifest `files[]` 전수 sha 대조(`PART3_SIGNAL_SEAL_FAILED`) ② `verify_registry_index_seal()`: SG-01 의 `registry_index_sha256` ↔ 색인 원문 실측(`PART3_REGISTRY_INDEX_SEAL_FAILED`)
|
||||
6. **(5) 입력 적재** — `config_sha256` 사슬 검증하며 `domain_config` 적재, 선언 있는 도메인의 사이드카 쌍 `_verify_asset` 적재, 별칭표 적재, SG-13/05/11 records 적재, SG-02/07 은 읽되 `empty_read_set` 형식화(조인 코드 없음 — "closed schema declares no claim-form vocabulary"), 도메인 봉투·BO·슬라이스는 `try_read_json`(부재 허용 — 부재는 audit 계수). 경로 상수를 `read_json` 에 직접 넘겨 선언표 검사기(U4)가 읽기를 실측할 수 있는 형태 유지(482~483행 주석)
|
||||
7. **(6) 모듈 호출** — `structure_index_compiler.compile_structure_seeds(activation_doc, registry_index, domain_configs, domain_sidecars, policy, alias_declarations, sg13_records, sg05_records, sg11_records, domain_envelopes, bo_records, slice_documents)`. `TypeError` 는 `PART3_COMPILER_STALE`(signature_mismatch) 변환. 산출 의미 검사 `assert_compiler_capability`(theta·order_key 부재 시 `PART3_COMPILER_STALE`). 봉인 거래 식별자를 `bundle["signal_manifest_transaction_id"]` 로 부착(L2 승계용). `schema_subset_validator.validate` 로 자기 산출 닫힌 스키마 검증(`PART3_FINAL_SCHEMA_VALIDATION_FAILED` stage L0)
|
||||
8. **(7) 기록** — bundle(canonical) · review handoff(`status: OPEN` · `counts.review_items`) · receipt(실측값 — "상수 PASS 는 증거가 아니다": `deployment_gate`(checked_count·runtime_manifest_sha256·runtime_artifact_count·schema_capability_checked·compiler_output_checked·policy_schema_version), `entry_seals`(signal_manifest_transaction_id·signal_files_checked·registry_index_sha256·config_sha256_chain_checked), `join_counts`, `empty_read_set_signals`, `sidecar_dialects`, `unlinked_sg11`, `dangling_calculation_refs`, `input_gaps`, `bo_input`(무봉인 비대칭 관찰), `resolved_order_table`(`rank|domain|type|module|admission` 문자열 표))
|
||||
- **컴파일러 내부 단계**(structure_index_compiler.py 실물 실행 순서 — 신전략서 번호와 배열이 다름에 주의: L0-2c 가 L0-2 앞):
|
||||
- L0-1 Θ 조립: `expected_runnable` 각 도메인의 `structure_types[].type_id` 합집합(정렬). 도메인이 색인에 없으면 `PART3_DOMAIN_NOT_IN_REGISTRY`, 목록이 비면 `PART3_EXPECTED_RUNNABLE_EMPTY`
|
||||
- L0-2c 사이드카 교차 검증(레코드 생성보다 앞 — admission_policy 재료): 방언 정규화 리더로 읽고 유형 집합·투영(config ↔ 사이드카) 불일치를 `PART3_REGISTRY_SIDECAR_MISMATCH`(HARD_WARNING) 검토로. 선언 있는 도메인의 사이드카 부재는 `PART3_SIDECAR_ABSENT_FOR_DECLARING_DOMAIN` 경성 실패, 선언 0 도메인(EC-00)의 부재는 정상 — audit 기록
|
||||
- L0-2 구조 레코드 생성: (도메인, type_id) 쌍마다 `structure_id: LES-<domain_id>-<type_id>` · `order_key: [priority_rank, 색인 위치, type_id]` · `admission_policy`(2단: `file:<키>` → `item:admission_rule` → `absent`) · E-13 `extension_key`(`actio_case_signals.v2`) 부여 · **E-00 특칙: `review_required: true` 강제**
|
||||
- L0-2b 슬라이스 투영 정합: slice `structure_type_ids` ↔ config 선언 차집합을 `PART3_SLICE_PROJECTION_DIVERGENCE` 검토로; slice 부재는 `input_gaps`
|
||||
- L0-3/L0-4 SG-13 조인 + 도메인 소속: Θ 밖 유형은 버리지 않고 `UNREGISTERED_EFFECT_TYPE_REVIEW` + `unattached_routes`(사이드카 `default_projection` 동반 운반). 자기 도메인 미선언 유형은 선언 도메인 전부에 부착 + `PART3_EFFECT_TYPE_CROSS_DOMAIN` 검토. `registered:false` route 는 **붙은 채로** 검토 꼬리표(분할은 부착 여부로만 — 이중 계상 금지). 사이드카 `registered` ↔ route `registered` 플래그 불일치는 `PART3_REGISTRY_SIDECAR_MISMATCH`
|
||||
- (L0-5 module 부여는 L0-2 에서 config 원문으로 종료 — 코드 410행 주석)
|
||||
- L0-6 SG-11 계산 조인: 키 = SG-11 레코드 `signal_id` ↔ 도메인 봉투 `calculation_refs`. dangling(봉투에 있는데 SG-11 에 없음)은 `PART3_CALCULATION_REF_DANGLING` 검토, 미연결 SG-11 은 구조에 싣지 않고 `audit.unlinked_sg11` 형식화. 봉투 부재는 `input_gaps` 계수(침묵 스킵 금지)
|
||||
- L0-7 SG-05 근거 refs: `domain_ids` 별 `evidence_refs`·`meeting_clause_refs` 합집합 병합
|
||||
- L0-7b BO 부착 조인: ① `provenance.source_domain` 해소(registry ID → [값] / 별칭표 목록 — 다중 타깃 실재·단일 primary 없음 / 실패 시 `PART3_BO_DOMAIN_UNRESOLVED` 격리) ② 해소 도메인 × `Legal_Keywords` 의 (d, t) 레코드에 `source_bo_ids` 부착 ③ 부착 실패는 `PART3_BO_UNATTACHED` 검토(침묵 금지)
|
||||
- 마감: order_key 3키 정렬(비정수 rank 는 999), route 정렬·계수, review_codes 정렬, `status: READY | READY_WITH_REVIEW`, counts 11종(structure_records · declared_structure_types_total · sg13_route_total · routes_attached · routes_unattached · bo_total · bo_attached · bo_unattached · sg11_total · sg11_linked · sg11_unlinked) 산출
|
||||
- **주요 실패 코드**(L0): `PART3_RUNTIME_MANIFEST_INVALID` · `PART3_ASSET_DEPLOYMENT_INCOMPLETE` · `MODULE_MIRROR_UNREGISTERED` · `MODULE_MIRROR_HASH_MISMATCH` · `PART3_POLICY_INVALID` · `PART3_STRUCTURE_SCHEMA_STALE` · `PART3_SIGNAL_SEAL_FAILED`(transaction_id/file_sha256) · `PART3_REGISTRY_INDEX_SEAL_FAILED`(선언 대조/config_sha256) · `PART3_EXPECTED_RUNNABLE_EMPTY` · `PART3_DOMAIN_NOT_IN_REGISTRY` · `PART3_SIDECAR_ABSENT_FOR_DECLARING_DOMAIN` · `PART3_COMPILER_STALE`(capability/signature_mismatch) · `PART3_FINAL_SCHEMA_VALIDATION_FAILED`(stage L0) · MCP 배관: `MCP_CALL_FAILED` · `EMPTY_RESPONSE` · `EMPTY_CONTENT` · `UNEXPECTED_READ_DOCS_ENVELOPE`
|
||||
|
||||
### 4.2 Task_C_LE_L2_final_structure_index_writer (P3-L2)
|
||||
|
||||
- **작업 명칭**: `Task_C_LE_L2_final_structure_index_writer` (v1) — YAML 607~1,015행, 임베디드 python code 615~1,015행
|
||||
- **실행 형태**: L0 과 동일(code-executor · run_code · python · httpx · agent-network · timeout 240)
|
||||
- **작업 목적**: L0 seed 번들을 받아 **보존 등식 셋을 원본 파일에서 직접 계수한 바깥 수와 대조**(bundle 수치와 비교하면 항등식으로 퇴행 — 정책 `conservation_equations.note`)하고, **역인덱스 셋**(by_domain_id · by_module · by_bo_id — ID 목록만, 본문 복제 금지, `by_claim_form` 금지 = D-4 라) 을 만들어 **최종 구조 색인 `legal_effect_structures.json`** 을 닫힌 스키마 검증·기록·재읽기 검증까지 마치고, 검토 채널을 FINALIZED 로 닫는다. 입력은 전부 파일 계약 — 판정 파일 없음(L1 부재, 코드 833행 주석)
|
||||
- **내부 단계 순서**(코드 618~620행 주석 = 실물):
|
||||
1. **게이트·정책·의미 검사** — `materialize_modules()`(미러 2종: runtime_common · schema_subset_validator), `_verify_asset(POLICY)` 판본 검사, `_verify_asset(INDEX_SCHEMA)` + `assert_index_schema_capability`(`by_module`·`by_bo_id` 모르면 `PART3_INDEX_SCHEMA_STALE`). L0 식 10-자산 일괄 게이트는 없다 — 읽는 자산마다 `_verify_asset` 단건 검증
|
||||
2. **적재** — bundle · handoff · activation manifest 적재, `expected_runnable` 확보
|
||||
3. **보존 등식 셋(바깥 수 직접 계수)** —
|
||||
(1) 선언 보존: 색인 봉인 재검(`PART3_REGISTRY_INDEX_SEAL_FAILED` stage L2) + `config_sha256` 사슬 재검 후 각 `domain_config` 원본에서 `structure_types` 개수 합산 → `len(records) == declared_total` 아니면 `PART3_STRUCTURE_COUNT_BROKEN`
|
||||
(2) 근거 보존: SG-13 원본에서 `legal_effect_route` 총수 직접 계수, 붙은 route 는 레코드 `routes[].signal_id` 집합으로 **재계수**(bundle counts 불신) → `붙은 + unattached_routes == sg13_total` 아니면 `PART3_ROUTE_CONSERVATION_BROKEN`
|
||||
(3) BO 보존: BO.json 원본 총수 직접 계수, 붙은 BO 는 레코드 `source_bo_ids` 집합 재계수 → `붙은 + unattached_bo == bo_total` 아니면 `PART3_BO_CONSERVATION_BROKEN`
|
||||
— 셋을 `conservation_failures` 배열로 모아 일괄 RuntimeError
|
||||
4. **역인덱스 셋** — 레코드 순회로 `by_domain_id`/`by_module`(module 있는 것만)/`by_bo_id` 에 `structure_id` 수집 후 각 버킷 `sorted(set(...))`
|
||||
5. **검토 재산정** — handoff `review_items` 를 (review_code, severity[기본 SOFT_WARNING]) 로 묶어 `review_queue`(count 포함, 정렬). `status` = `READY_WITH_REVIEW`(queue 또는 record.review_required 존재 시) | `READY`. "review 는 근거 없이 줄지 않는다"(929행 주석)
|
||||
6. **최종 문서 조립·검증·기록·재읽기** — `stage1_legal_effect_structures.v1` 문서(status · registry_version · registry_index_sha256 실측 · activation_manifest_sha256 실측 · signal_manifest_transaction_id 승계 · expected_runnable_domain_ids · theta · structure_records · structure_index · quality_gate(등식 3 + review_queue) · created_by) → `schema_subset_validator.validate`(`PART3_FINAL_SCHEMA_VALIDATION_FAILED` stage L2) → canonical 기록 → 재읽기 sha 대조(`PART3_WRITE_REREAD_MISMATCH`)
|
||||
7. **handoff FINALIZED** — `status: FINALIZED` · `finalized_by` 기입 재기록(공동 기록자 · 항목 불감소)
|
||||
- **주요 실패 코드**(L2): `MODULE_MIRROR_UNREGISTERED` · `MODULE_MIRROR_HASH_MISMATCH` · `PART3_ASSET_DEPLOYMENT_INCOMPLETE`(단건) · `PART3_POLICY_INVALID` · `PART3_INDEX_SCHEMA_STALE` · `PART3_REGISTRY_INDEX_SEAL_FAILED`(stage L2/config_sha256) · `PART3_STRUCTURE_COUNT_BROKEN` · `PART3_ROUTE_CONSERVATION_BROKEN` · `PART3_BO_CONSERVATION_BROKEN` · `PART3_FINAL_SCHEMA_VALIDATION_FAILED`(stage L2) · `PART3_WRITE_REREAD_MISMATCH` · MCP 배관 4종(동일)
|
||||
|
||||
### 4.3 검토(review) 코드·경성 실패 코드 총람 (정책 자산 선언과 코드 실물 일치 실측)
|
||||
|
||||
| 구분 | 코드 |
|
||||
|---|---|
|
||||
| 검토 7종 | `UNREGISTERED_EFFECT_TYPE_REVIEW` · `PART3_SLICE_PROJECTION_DIVERGENCE` · `PART3_REGISTRY_SIDECAR_MISMATCH` · `PART3_EFFECT_TYPE_CROSS_DOMAIN` · `PART3_CALCULATION_REF_DANGLING` · `PART3_BO_UNATTACHED` · `PART3_BO_DOMAIN_UNRESOLVED` |
|
||||
| 경성 14종 | `PART3_ASSET_DEPLOYMENT_INCOMPLETE` · `PART3_POLICY_INVALID` · `PART3_STRUCTURE_SCHEMA_STALE` · `PART3_COMPILER_STALE` · `PART3_INDEX_SCHEMA_STALE` · `PART3_SIGNAL_SEAL_FAILED` · `PART3_REGISTRY_INDEX_SEAL_FAILED` · `PART3_DOMAIN_NOT_IN_REGISTRY` · `PART3_STRUCTURE_COUNT_BROKEN` · `PART3_ROUTE_CONSERVATION_BROKEN` · `PART3_BO_CONSERVATION_BROKEN` · `PART3_FINAL_SCHEMA_VALIDATION_FAILED` · `PART3_EXPECTED_RUNNABLE_EMPTY` · `PART3_SIDECAR_ABSENT_FOR_DECLARING_DOMAIN` |
|
||||
|
||||
---
|
||||
|
||||
## 5. upstream-downstream 연결
|
||||
|
||||
연결된 작업 쌍마다 — 연결 이유 · 연결 방식 · 자료 사용 방식. (인계면 정본 `선행구축/Default_Agent_Stage_1/handoffs/stage1_part_interface.v1.json` 55행 중 Part 3 관련 14행과 전건 대조 완료 — §5.9 참조.)
|
||||
|
||||
### 5.1 Part 1 `Task_D0_domain_activation_gate` → L0 · L2
|
||||
|
||||
- **이유**: Θ 의 정의역이 SG-01 의 `expected_runnable_domain_ids` 다(D-3 넓은 정의 — `active_domain_ids` 아님. 좁히면 감시·상시 도메인의 효과가 전부 검토로 쓸려 들어가도 커버리지 등식은 통과하는 침묵 오류 경로 — 정책 `theta_definition.note`).
|
||||
- **방식**: 파일 handoff `routing/domain_activation_manifest.json`(루트 키 `domain_activation_manifest` · `stage1_domain_activation_manifest.v1`) + **봉인 승계** — manifest 의 `registry_index_sha256` 필드가 `domains/_registry_index.json` 원문 sha 와 일치해야 진입(`PART3_REGISTRY_INDEX_SEAL_FAILED`). L0·L2 각자 재검.
|
||||
- **자료 사용**: `expected_runnable_domain_ids` → Θ 정의역·입력 적재 루프·선언 보존 등식 분모. `registry_index_sha256` → 색인 봉인. L2 는 manifest 원문 sha 를 최종본 `activation_manifest_sha256` 로 실측 기재.
|
||||
|
||||
### 5.2 Part 2 `Task_C_BO_S0_signal_bundle_writer` → L0 (신호 5종 + 봉투 + 매니페스트)
|
||||
|
||||
- **이유**: 구조 레코드에 붙일 근거가 전부 S5 신호 계열이다 — 효과 경로(SG-13), 근거 refs(SG-05), 계산 요건(SG-11), 형식화 대상(SG-02·SG-07), 도메인별 봉투(calculation_refs).
|
||||
- **방식**: **거래 봉인 handoff** — `signals/signal_manifest.json` 의 `transaction_id`(`^S5TX-[a-f0-9]{20}$`) 와 `files[].file_sha256` 전수 대조를 통과해야 신호 파일을 소비한다(`PART3_SIGNAL_SEAL_FAILED`). 정본 읽기 집합은 manifest 의 `downstream_read_sets.part3_L0` 선언(SG-02·05·07·11·13)과 일치 — 구 호환면 3파일(`actio_case_signals.json` 등)은 더 이상 읽지 않는다(인계면 C-7 이관 완료 명기).
|
||||
- **자료 사용**: SG-13 `records[]`(record_type `legal_effect_route`) 의 `details.type_id`·`domain_ids`·`signal_id`·`evidence_refs`·`meeting_clause_refs`·`details.registered`·`details.source_seed_id`·`status` → route 부착·검토. SG-05 `records[].domain_ids`+refs → 근거 합집합. SG-11 `records[].signal_id` → 봉투 `calculation_refs` 와 조인. SG-02/07 → 레코드 수만 `empty_read_set` 형식화. 봉투 → `calculation_refs` 만 소비, 부재는 `input_gaps`.
|
||||
|
||||
### 5.3 Part 2 `Task_C_BO_F0_final_bo_compiler_gate_writer` → L0 · L2 (`BO.json`)
|
||||
|
||||
- **이유**: BO(기초 객체)와 구조 레코드의 연결(`source_bo_ids` · `by_bo_id` 색인)을 세우기 위해 — SG 층의 `source_bo_ids` 가 비어 있어도 이 조인이 BO↔구조 연결을 세운다(정책 `bo_attachment.purpose`).
|
||||
- **방식**: **무봉인 파일 handoff**(인계면 노트 "최대 호환면. 레코드 구조를 바꾸지 않는다"). L0 는 신호 5종(I-1 봉인)·registry(SG-01 봉인)와의 비대칭을 receipt `bo_input` 에 관찰로 남긴다(YAML 583~586행).
|
||||
- **자료 사용**: L0 — `provenance.source_domain`(별칭 해소) × `Legal_Keywords`(=type_id) 결정론 조인으로 `source_bo_ids` 부착, 실패는 검토 2종(`PART3_BO_DOMAIN_UNRESOLVED`·`PART3_BO_UNATTACHED`). L2 — 레코드 총수만 직접 계수(BO 보존 등식 분모).
|
||||
|
||||
### 5.4 Part 2 `Task_C_BO_A0_context_and_domain_slice_compiler` → L0 (`runtime/domain_slices/<domain_id>.json`)
|
||||
|
||||
- **이유**: 슬라이스가 워커에게 선언했던 `structure_type_ids` 와 registry 선언이 갈라졌는지 탐지(드리프트 검출).
|
||||
- **방식**: 패턴 파일 handoff(루트 키 `stage_b_domain_slice` · `task_c_bo_stage_b_domain_slice.v2`), `try_read_json` — 부재 허용(audit 계수).
|
||||
- **자료 사용**: `domain_declarations.structure_type_ids` ↔ config `structure_types` 차집합 → `PART3_SLICE_PROJECTION_DIVERGENCE`(HARD_WARNING) 검토.
|
||||
|
||||
### 5.5 L0 → L2 (`stage1_tmp/task_le/structure_seed_bundle.json`)
|
||||
|
||||
- **이유**: Part 3 내부 유일한 생산 체인 — L0 의 조립 결과 전체(Θ·레코드·미부착 목록·counts)가 L2 최종화의 원료다.
|
||||
- **방식**: 파일 handoff + **닫힌 스키마 이중 검증**(L0 기록 전 자기 검증, L2 는 최종본을 다시 검증) + **거래 식별자 승계** — L0 가 봉인 검증한 `transaction_id` 를 bundle 에 부착하고 L2 는 signal_manifest 를 재독하지 않고 이 값을 승계한다(재독은 계약 밖 읽기이자 봉인 우회 여지 — MEMORY ㉓ 교훈 3). 실행 순서는 task_procedure 의 `wait_until` 상태 게이트가 강제.
|
||||
- **자료 사용**: `structure_records`(레코드·routes·source_bo_ids 재계수) · `theta` · `unattached_routes`/`unattached_bo`(등식 좌변) · `registry_version` · `signal_manifest_transaction_id`(승계) — counts 는 **믿지 않고** 재계수한다.
|
||||
|
||||
### 5.6 L0 → L2 (`quality_gates/stage1_part3_review_handoff.json`, 공동 기록)
|
||||
|
||||
- **이유**: L1(판정자)이 없는 설계에서 검토 항목을 잃지 않고 하류에 보이게 하는 채널 — 예외 pack 을 두지 않는 대신(판정자 없는 pack = 침묵 삼킴 또는 상시 실패 — MEMORY ⑯) 검토는 흘려보내되 상태로 봉한다.
|
||||
- **방식**: 상태 게이트형 파일 handoff — L0 가 `status: OPEN` 으로 생성, L2 가 읽고 `FINALIZED` + `finalized_by` 로 갱신(인계면에 `also_written_by` 로 공동 기록자 선언). 항목을 줄이지 않는다.
|
||||
- **자료 사용**: `review_items[]` 의 (review_code, severity) 를 그룹 계수해 최종본 `quality_gate.review_queue` 로, 존재 여부로 `status: READY_WITH_REVIEW` 판정.
|
||||
|
||||
### 5.7 배포 자산 → L0 · L2 (게이트·봉인 사슬)
|
||||
|
||||
- **이유**: 코드가 판정 규칙·어휘를 갖지 않는 설계(137종 일반성 — 사건 이름·도메인 목록·유형 열거를 코드에 두지 않는다, YAML 24행)에서 정책·스키마·레지스트리·컴파일러가 판의 정본이므로, 개정 전 판본이 배포되면 조용히 틀린다 — 이를 실행 시점에 잡는다.
|
||||
- **방식**: 3중 — ① 일괄 배포 게이트(L0, 10 리터럴) ② 소비 시점 `_verify_asset`(등재+sha; 사이드카 50 포함) ③ 의미 검사(장부 검사만으로 닫히지 않는 자리 — seed 스키마 `theta`/`admission_policy`, 색인 스키마 `by_module`/`by_bo_id`, 컴파일러 산출 `theta`/`order_key`). `_registry_index.json` 만 예외적으로 매니페스트 미등재 → SG-01 봉인 단독 방어(전순서 둘째 키가 이 색인 배열 위치에 걸려 있어 색인 교체 탐지가 필수 — YAML 412~413행 주석, 회귀 L-d2).
|
||||
- **자료 사용**: 정책 → 컴파일러 인자·판본 게이트. 스키마 2종 → 검증기 입력. 별칭표 → BO 조인. `domain_config`/사이드카 → Θ·레코드·admission_policy·교차 검증. 매니페스트 → 모든 검증의 sha 기준.
|
||||
|
||||
### 5.8 L2 → Part 4 (`Task_C_FL_F0_fact_ledger_reducer` · `Task_C_FL_F2_final_fact_ledger_gate_and_writer`) · Stage 2
|
||||
|
||||
- **이유**: `legal_effect_structures.json` 이 Part 3 의 유일한 대외 최종 산출 — Part 4 사실 원장과 Stage 2 가 구조 색인을 소비한다(스테이지 체인 order 4 의 `requires` 에 명시).
|
||||
- **방식**: 파일 handoff. 인계면 필수 키 선언: `schema_version` · `status` · `structure_records` · `structure_index` · `quality_gate` · `signal_manifest_transaction_id`. 인계면 노트: "F0 는 signal_manifest_transaction_id 승계를 두 갈래(불일치 경성/부재 검토)로 대조한다" — 거래 식별자 사슬이 Part 2→3→4 로 이어진다.
|
||||
- **자료 사용**(하류 계약): 구조 레코드·3색인·품질 게이트 수치·거래 식별자. `part3_receipt.json` 은 소비 task 없음(검증 전용) — 인계면 선언과 일치.
|
||||
|
||||
### 5.9 인계면 정본 대조 요약 (stage1_part_interface.v1.json 55행 중 Part 3 관련 14행)
|
||||
|
||||
| 경로 | 생산자 | Part 3 역할 | 비고 |
|
||||
|---|---|---|---|
|
||||
| `routing/domain_activation_manifest.json` | Task_D0_domain_activation_gate | L0·L2 소비 | required_keys 17종 선언 · `produced_by_module: stage1_runtime/activation_gate.py` |
|
||||
| `runtime/domain_slices/<domain_id>.json` | Task_C_BO_A0_context_and_domain_slice_compiler | L0 소비 | 패턴 · `task_c_bo_stage_b_domain_slice.v2` |
|
||||
| `BO.json` | Task_C_BO_F0_final_bo_compiler_gate_writer | L0·L2 소비 | schema_version 미선언(최대 호환면) |
|
||||
| `signals/signal_manifest.json` | Task_C_BO_S0_signal_bundle_writer | L0 소비 | `signal_manifest.v2` |
|
||||
| `signals/legal_effect_routes.json` | 〃 | L0·L2 소비 | `stage1_signal_sg13.v1` · `produced_by_module: signals/compiler/common.py` |
|
||||
| `signals/legal_relation_lifecycle_signals.json` | 〃 | L0 소비 | `stage1_signal_sg05.v1` |
|
||||
| `signals/calculation_requirements.json` | 〃 | L0 소비 | `stage1_signal_sg11.v1` |
|
||||
| `signals/procedural_posture_relief_signals.json` | 〃 | L0 소비 | `stage1_signal_sg02.v1` · optional — 레코드 0 정상 |
|
||||
| `signals/asset_right_state_signals.json` | 〃 | L0 소비 | `stage1_signal_sg07.v1` · optional — 레코드 0 정상 |
|
||||
| `signals/domain_signals/<domain_id>.json` | 〃 | L0 소비 | `stage1_domain_signals.v2` · optional·패턴 — 부재는 영수증 계수 |
|
||||
| `stage1_tmp/task_le/structure_seed_bundle.json` | **Task_C_LE_L0_structure_seed_reducer** | L2 소비 | `produced_by_module: stage1_runtime/structure_index_compiler.py` |
|
||||
| `quality_gates/stage1_part3_review_handoff.json` | **Task_C_LE_L0** (`also_written_by` L2) | L2 소비·갱신 | 검토 채널 — 예외 pack 없음(L1 부재) |
|
||||
| `legal_effect_structures.json` | **Task_C_LE_L2_final_structure_index_writer** | 대외 산출 | 소비: Part 4 F0·F2 · Stage_2 |
|
||||
| `validation_assets/routing/part3_receipt.json` | **Task_C_LE_L0** | 대외 산출 | 소비 task 없음(검증 전용) |
|
||||
|
||||
(그 밖의 인계면 행 4건 — `stage1_tmp/task_c_bo/postb_compiled_bundle_compact.json` · 구 호환면 3파일(`actio_case_signals.json`·`case_liability_signals.json`·`legal_effect_signals.json`) — 은 노트에 "Part 3 는 읽지 않는다" 가 명기된 부(不)소비 선언이다. YAML 실물에도 해당 경로 참조가 없음을 전수 경로 스캔으로 확인했다.)
|
||||
|
||||
---
|
||||
|
||||
## 6. 특기사항 (실측 기반)
|
||||
|
||||
1. **LLM task 0** — Part 1·2 와 달리 Part 3 는 순수 code 2-task 다. 스테이지 선언의 `llm_provider`/`llm_model` 은 미사용 선언이다. L1 자리는 task_procedure 주석으로 예약만 되어 있다.
|
||||
2. **결정론** — 조립 본체 `structure_index_compiler` 는 파일 IO·시각·난수가 없는 순수 모듈(모듈 docstring: "같은 입력이면 같은 출력이다(L-n)"), 기록은 canonical JSON(`sort_keys`·최소 구분자·개행 종결)이라 재실행 바이트 동일성이 성립한다.
|
||||
3. **매니페스트 실측 465건** — `runtime_manifest.json` 은 현재 465 entries(=`runtime_artifact_count`)다. MEMORY.md 의 426→432 서술은 과거 회차 값이다. Part 3 게이트 10 리터럴·사이드카 50 전건 등재 확인. `domains/_registry_index.json` 은 의도적 미등재(SG-01 봉인 단독 방어).
|
||||
4. **미러 무결** — 4 모듈 쌍 전부 .py ↔ .txt sha256 동일 실측. `registry_loader`·`runtime_common` 은 L0/L2 가 직접 import 하지 않지만 반입·게이트 대상이다(`registry_loader` 는 `runtime_common` 에 import 의존 — 반입 세트가 한 벌인 이유).
|
||||
5. **게이트 전용 자산 구분** — `signal_registry.v2.json` · `s5_execution_contract.v2.json` · (L0 에서의) `legal_effect_structures.schema.json` 은 등재·sha·가독 검사만 받고 파싱 소비가 없다. 의존 관계 서술 시 "(게이트만)" 구분이 필요하다(MEMORY ㉕ 교훈 2 승계).
|
||||
6. **BO.json 무봉인 비대칭** — 신호 5종은 manifest 봉인, registry 는 SG-01 봉인이 지키는데 BO.json 은 봉인이 없다. L0 는 이를 고치지 않고 receipt `bo_input.note` 에 관찰로 남긴다(YAML 585~586행 원문).
|
||||
7. **code-executor Authorization Bearer 토큰이 YAML 47~48행에 평문**으로 실려 있다(Part 1·2 통합본과 동일 패턴 — MEMORY 8.8b: 로테이션이 본질).
|
||||
8. **Θ 실주행 표본**(MEMORY ㉓ 예행 3패스 실측, 배경 참고): Θ 4종 · 레코드 6 · SG-13 6/6 부착 · BO 2/2 부착 · `legal_effect_structures.json` 실생성. 26 도메인 합성: Θ 56 · 구조 73 · by_module 34.
|
||||
9. **스키마 필수 키** — seed 레코드 필수 16필드(§3.2), 최종본 루트 필수 9키·`structure_index` 필수 3색인. 인계면 required_keys 선언(6키)은 스키마 필수 9키의 부분집합으로 모순 없다.
|
||||
+393
@@ -0,0 +1,393 @@
|
||||
# Stage 1 Part 4 (사실원장 · Fact Ledger) 작업분석서 — investigation final
|
||||
|
||||
- **분석 대상 YAML**: `extension_research/ver_8_yaml_candidates/stage_1_part_4_v.8.yml`
|
||||
- **sha256 (첫 16자)**: `fc60011042f1159a`
|
||||
- **바이트 크기**: 69,004 B (1,279 행)
|
||||
- **분석 기준일**: 2026-08-23 (전 항목 실측 — YAML 전문 정독 · `Default_Agent/` 자산 트리 find 전수 · `runtime_manifest.json` 465 항목 대조 · `stage1_part_interface.v1.json` 55행 중 Part 4 관련 19행 · `stage1_stage_chain.v1.json` Part 4 구간 · `MEMORY.md` ㉙·㊳ 항목)
|
||||
- **용도**: Stage 2 작업명세서 설계의 입력. 완전성 최우선.
|
||||
|
||||
Agent 선언(실측): `Agent.name: Liti-agent_Civil_Suit_Plaintiff_Stage_1_Part_4` · `version: v.2` · Stage 1개 `stage1_사실원장_생성` · 스테이지 기본 LLM `openai / gpt-4o-2024-08-06`(단 유일 LLM task F1 은 task 레벨에서 `google / gemini-3.1-flash-lite` 로 재정의) · MCP 2종 — `localdocs`(`http://mcp-localdocs:8012/mcp`) · `code-executor`(`https://code-executor.mcp.eroomai.com/mcp`).
|
||||
|
||||
Part 4 확정 계약(YAML 머리 주석 + 정책 실측):
|
||||
- 행 카디널리티 **BO 1건 = 1행**, `fact_id = F-{idx:03d}` (BO_ID 사전순 1-기반 연속 — F2 가 경성 단언).
|
||||
- 행 스키마 **29키 = 구 27키(이름·순서 불변) + `domain_effects` + `calculation_requests`** (신규 2키는 required 로 올리지 않음 — Stage 2 호환).
|
||||
- 게이트는 **사이드카 25 배포본을 17축 정규화 리더로 읽는다 — 판정식 창작 0**. registry 선언 121 = 구현 25(dict 3부류) · 가시화 96(str 90 + boundary 6) · 사이드카 고아 6 검토.
|
||||
- `operand_state` 는 Part 2 산출을 승계 — 재산정 금지(D-P4-6).
|
||||
- 최종 산출 `Fact_Ledger_base.json` 은 **래핑 없는 배열**.
|
||||
- 로직 거처: `stage1_runtime/fact_ledger_compiler.py`, 규칙 정본: `fact_ledger_policy.v1.json` (YAML 은 반입·게이트·봉인·기록만).
|
||||
- 제약: 구 Part 4 명세의 어떤 파일도, 구 signal 3종 뿌리 이름도 읽지 않는다. 137종 사건 이름·도메인 목록·유형 열거를 코드에 두지 않는다.
|
||||
|
||||
---
|
||||
|
||||
## 1. 전체 작업 DAG flow
|
||||
|
||||
`task_procedure` 실물(YAML 1255~1279행)과 문자 단위 일치. **완전 직렬 · fan-out 없음 · task 3종**.
|
||||
|
||||
```
|
||||
┌────────────────────────────────────────────────────────────┐
|
||||
│ 선행 조건 (Part 1·2·3 실산출이 서버 문서공간에 존재) │
|
||||
│ BO.json · legal_effect_structures.json · │
|
||||
│ signals/* · routing/domain_activation_manifest.json · │
|
||||
│ quality_gates/stage1_part2_review_handoff.json · │
|
||||
│ evidence_indexed.json + Default_Agent/ 배포 트리 │
|
||||
└────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
[IN] nexts: ["Task_C_FL_F0_fact_ledger_reducer"] · wait_until: []
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Task_C_FL_F0_fact_ledger_reducer (code · run_code · py 3.12) │
|
||||
│ mcp: code-executor · requirements: httpx · network: agent-network · timeout 300│
|
||||
│ 0) 배포 게이트(자산 13·미러 5 포함 sha 대조) → 1) 모듈 5종 반입(/tmp/s1/_rt) │
|
||||
│ → 2) 정책 반입 → 3) 의미 검사 둘 → 4) 진입 봉인 셋 → 5) 입력 적재 │
|
||||
│ → 6) fact_ledger_compiler.compile_fact_ledger_candidates(13인자) │
|
||||
│ → 7) bundle · exception pack · review handoff(OPEN) · receipt 기록 │
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
│ │
|
||||
│ 파일 handoff │ 파일 handoff
|
||||
│ stage1_tmp/fact_ledger/ │ stage1_tmp/fact_ledger/
|
||||
│ fact_ledger_candidate_bundle.json│ fact_exception_pack.json ──────┐
|
||||
│ (F2 가 소비) │ (F1 preflight + F2 커버리지 대조)│
|
||||
▼ ▼ │
|
||||
nexts: ["Task_C_FL_F1_fact_exception_adjudicator"] · wait_until: ["IN"] │
|
||||
│ │
|
||||
▼ │
|
||||
┌─────────────────────────────────────────────────────────────────────────────┴───┐
|
||||
│ Task_C_FL_F1_fact_exception_adjudicator (LLM · 유일 비-code) │
|
||||
│ llm: google / gemini-3.1-flash-lite · reasoning low · verbosity low │
|
||||
│ max_iterations 1 · use_tools [localdocs] · cache_control auto/20m │
|
||||
│ preflight: true · preflight_files: │
|
||||
│ [stage1_tmp/fact_ledger/fact_exception_pack.json] │
|
||||
│ 예외 0 이어도 READY_NO_EXCEPTIONS 를 기록하고 종료 — 그래프상 무조건 노드 │
|
||||
│ 판정 부류는 legal_calculation_required(계산 근거 다중성) 하나뿐 │
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
│ 파일 handoff: stage1_tmp/fact_ledger/fact_adjudication.json
|
||||
▼
|
||||
nexts: ["Task_C_FL_F2_final_fact_ledger_gate_and_writer"]
|
||||
wait_until: ["Task_C_FL_F0_fact_ledger_reducer"]
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Task_C_FL_F2_final_fact_ledger_gate_and_writer (code · run_code · py 3.12) │
|
||||
│ mcp: code-executor · requirements: httpx · network: agent-network · timeout 240│
|
||||
│ 1) 게이트·정책·의미 검사 → 2) bundle·pack·판정·원본 적재 │
|
||||
│ → 3) 판정 커버리지·패치 적용(허용 필드 amount 만) │
|
||||
│ → 4) 보존 등식 다섯(바깥 수를 원본에서 직접 계수) │
|
||||
│ → 5) domain_effects ⊆ 활성 · fact_id 연속 · BO 보존 → 6) 닫힌 스키마 │
|
||||
│ → 7) Fact_Ledger_base.json 기록·재읽기 → 8) writer report · handoff FINALIZED │
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
nexts: ["OUT"] · wait_until: ["Task_C_FL_F1_fact_exception_adjudicator"]
|
||||
│
|
||||
[OUT] nexts: [] · wait_until: ["Task_C_FL_F2_final_fact_ledger_gate_and_writer"]
|
||||
│
|
||||
▼
|
||||
Stage 2 소비면: Fact_Ledger_base.json ·
|
||||
stage1_tmp/fact_ledger/fact_ledger_writer_report.json ·
|
||||
quality_gates/stage1_part4_review_handoff.json(FINALIZED) ·
|
||||
BO.json · legal_effect_structures.json (인계면 표 실측)
|
||||
```
|
||||
|
||||
스테이지 레벨 `prevs: []` · `nexts: []` (Part 간 순서는 선언이 아니라 **F0 의 입력 파일 부재 실패로 사실상 강제** — `stage1_stage_chain.v1.json` 의 purpose 문구 실측).
|
||||
|
||||
---
|
||||
|
||||
## 2. IO — task 별 입력·출력 파일 전수 표
|
||||
|
||||
경로는 서버 문서공간 논리 경로(localdocs `read_docs`/`write_file` 인자 그대로). `Default_Agent/` 는 배포 트리(원본: `BASE/extension_research/Default_Agent/`).
|
||||
|
||||
### 2.1 Task_C_FL_F0_fact_ledger_reducer — 입력
|
||||
|
||||
| # | 경로 | 포맷 | 생산자 | 접근 함수 / 검증 | 부재 시 |
|
||||
|---|---|---|---|---|---|
|
||||
| 1 | `Default_Agent/runtime_manifest.json` | json | 배포 파이프라인 (`stage1_runtime_manifest.v1` · entries 465) | `read_raw` — 배포 게이트의 기준 장부 | 경성 (`PART4_RUNTIME_MANIFEST_INVALID` / MCP 실패) |
|
||||
| 2 | `Default_Agent/platform/schemas/fact_ledger_candidate_bundle.schema.json` | json | Part 4 신설 자산 | `_verify_asset`(등재+sha) + 의미 검사 | 경성 (`PART4_ASSET_DEPLOYMENT_INCOMPLETE` / `PART4_LEDGER_SCHEMA_STALE`) |
|
||||
| 3 | `Default_Agent/platform/schemas/fact_ledger_base.schema.json` | json | Part 4 신설 자산 | 배포 게이트 한 벌 검사(F0 는 적재 안 함 — F2 가 소비) | 경성 (배포 게이트) |
|
||||
| 4 | `Default_Agent/platform/schemas/fact_exception_pack.schema.json` | json | Part 4 신설 자산 | `_verify_asset` + pack 산출 검증에 사용 | 경성 |
|
||||
| 5 | `Default_Agent/platform/schemas/legal_effect_structures.schema.json` | json | Part 3 계약 자산 | 배포 게이트 한 벌 검사(적재는 안 함) | 경성 (배포 게이트) |
|
||||
| 6 | `Default_Agent/stage1_runtime/fact_ledger_policy.v1.json` | json | Part 4 신설 자산 (규칙 정본) | `_verify_asset` + `schema_version == stage1_fact_ledger_policy.v1` | 경성 (`PART4_POLICY_INVALID`) |
|
||||
| 7 | `Default_Agent/routing/extension_payload_key_declarations.v1.json` | json | registry 층 자산 | `_verify_asset` → `resolve_alias_table` 입력 | 경성 |
|
||||
| 8 | `Default_Agent/signals/signal_registry.v2.json` | json | registry 층 자산 | 배포 게이트 한 벌 검사(코드 내 직접 적재 없음) | 경성 (배포 게이트) |
|
||||
| 9 | `Default_Agent/contracts/signals/s5_execution_contract.v2.json` | json | registry 층 자산 | 배포 게이트 한 벌 검사(코드 내 직접 적재 없음) | 경성 (배포 게이트) |
|
||||
| 10 | `Default_Agent/stage1_runtime/runtime_common.txt` | txt(py 미러) | Part 2 검증 승계 모듈 | `materialize_modules` — sha 대조 후 `/tmp/s1/_rt/runtime_common.py` 로 전개 | 경성 (`MODULE_MIRROR_UNREGISTERED`/`MODULE_MIRROR_HASH_MISMATCH`) |
|
||||
| 11 | `Default_Agent/stage1_runtime/schema_subset_validator.txt` | txt(py 미러) | 〃 | 〃 (`schema_subset_validator.py`) | 경성 |
|
||||
| 12 | `Default_Agent/stage1_runtime/registry_loader.txt` | txt(py 미러) | 〃 | 〃 (`registry_loader.py`) | 경성 |
|
||||
| 13 | `Default_Agent/stage1_runtime/structure_index_compiler.txt` | txt(py 미러) | Part 3 모듈 | 〃 (`structure_index_compiler.py`) | 경성 |
|
||||
| 14 | `Default_Agent/stage1_runtime/fact_ledger_compiler.txt` | txt(py 미러) | **Part 4 신설 로직 본체** | 〃 (`fact_ledger_compiler.py`) — 13인자 호출 대상 | 경성 |
|
||||
| 15 | `Default_Agent/domains/_registry_index.json` | json | registry 층 자산 | `read_raw` — **manifest 미등재(실측 registered=False)**. SG-01 의 `registry_index_sha256` 봉인으로 검증 | 경성 (`PART4_REGISTRY_INDEX_SEAL_FAILED`) |
|
||||
| 16 | `Default_Agent/domains/<domain_id>/domain_config.json` × expected_runnable | json | registry 층 자산 | `read_raw` + **`_registry_index` 의 `config_sha256` 사슬 대조** (manifest 미등재 — 실측 0/465) | 경성 (`PART4_REGISTRY_INDEX_SEAL_FAILED` detail=config_sha256) |
|
||||
| 17 | `Default_Agent/domains/<domain_id>/gates.json` × expected_runnable (배포본 25종) | json | 조립본 바이트 복사 사이드카 | `_verify_asset` — 실패는 `sidecar_gaps` 계수(게이트별 `GATE_SPEC_NOT_DEPLOYED_REVIEW` 로 가시화) | 연성 (계수) |
|
||||
| 18 | `Default_Agent/domains/<domain_id>/structure_types.json` × expected_runnable (배포본 25종) | json | 〃 | `_verify_asset` — 실패는 `sidecar_gaps` 계수 | 연성 (계수) |
|
||||
| 19 | `signals/signal_manifest.json` | json | Part 2 `Task_C_BO_S0_signal_bundle_writer` (`signal_manifest.v2`) | `read_json` → `verify_signal_seal` (`transaction_id` 정규식 `^S5TX-[a-f0-9]{20}$` + `files[].file_sha256` 전수 대조) | 경성 (`PART4_SIGNAL_SEAL_FAILED`) |
|
||||
| 20 | `signals/governing_law_version_signals.json` (SG-04) | json | Part 2 S0 | `read_json` → `signal_documents["SG-04"]` | 경성 (read 실패 시) |
|
||||
| 21 | `signals/timeline_notice_condition_signals.json` (SG-06) | json | Part 2 S0 | `read_json` → `signal_documents["SG-06"]` | 경성 |
|
||||
| 22 | `signals/asset_right_state_signals.json` (SG-07) | json | Part 2 S0 (optional — 레코드 0 정상) | `read_json` → `signal_documents["SG-07"]` | 경성(파일 자체 부재 시) |
|
||||
| 23 | `signals/evidence_proof_conflict_signals.json` (SG-10) | json | Part 2 S0 | `read_json` → `signal_documents["SG-10"]` | 경성 |
|
||||
| 24 | `signals/calculation_requirements.json` (SG-11) | json | Part 2 S0 (`stage1_signal_sg11.v1`) | `read_json` — 계산 조인의 우변 원천 | 경성 |
|
||||
| 25 | `signals/domain_signals/<domain_id>.json` × expected_runnable | json | Part 2 S0 (`stage1_domain_signals.v2` · root `domain_signal_envelope`) | `try_read_json` — 부재는 `envelope_absent` 계수 | 연성 (계수) |
|
||||
| 26 | `routing/domain_activation_manifest.json` | json | Part 1 `Task_D0_domain_activation_gate` (모듈 `stage1_runtime/activation_gate.py` 위임) | `read_json` — `expected_runnable_domain_ids`·`registry_index_sha256` 소비 | 경성 |
|
||||
| 27 | `BO.json` | json | Part 2 `Task_C_BO_F0_final_bo_compiler_gate_writer` (래핑 없는 배열) | `read_json` — 행 생성의 좌변 원천 | 경성 |
|
||||
| 28 | `legal_effect_structures.json` | json | Part 3 `Task_C_LE_L2_final_structure_index_writer` (`stage1_legal_effect_structures.v1`) | `read_json` → `verify_les_transaction` 두 갈래 | 경성(불일치)/연성(키 부재 → `PART4_LES_TRANSACTION_UNSEALED_REVIEW` warn) |
|
||||
| 29 | `quality_gates/stage1_part2_review_handoff.json` | json | Part 2 `Task_C_BO_R0_seed_reducer_and_exception_planner` (F0 이 FINALIZED 갱신한 판) | `read_json` 상수 경로 직접 호출(U4 가시성) — 부재 try 계수 | 연성 (warn `P2_HANDOFF_ABSENT`) |
|
||||
| 30 | `evidence_indexed.json` | json | Part 1 `Task_B1_quality_gate_evidence_indexed` | `read_json` — 증거력 산정 우주 | 연성 (warn `EVIDENCE_INDEXED_ABSENT`) |
|
||||
|
||||
### 2.2 Task_C_FL_F0_fact_ledger_reducer — 출력
|
||||
|
||||
| # | 경로 | 포맷 | 루트 키 / schema_version | 소비자 |
|
||||
|---|---|---|---|---|
|
||||
| 1 | `stage1_tmp/fact_ledger/fact_ledger_candidate_bundle.json` | json | `fact_ledger_candidate_bundle` / `stage1_fact_ledger_candidate_bundle.v1` | Task_C_FL_F2 |
|
||||
| 2 | `stage1_tmp/fact_ledger/fact_exception_pack.json` | json | `fact_exception_pack` / `stage1_fact_exception_pack.v1` | Task_C_FL_F1 (preflight) · Task_C_FL_F2 (커버리지 대조) |
|
||||
| 3 | `quality_gates/stage1_part4_review_handoff.json` | json | `stage1_part4_review_handoff` / `stage1_part4_review_handoff.v1` · `status: "OPEN"` | Task_C_FL_F2 (재기록) · Stage_2 |
|
||||
| 4 | `validation_assets/routing/part4_receipt.json` | json | (루트 래핑 없음) / `stage1_part4_receipt.v1` · `stage: "P4-F0"` | (소비자 없음 — 감사 기록. 인계면 표 실측 `consumer_tasks: []`) |
|
||||
| 5 | `/tmp/s1/_rt/{runtime_common,schema_subset_validator,registry_loader,structure_index_compiler,fact_ledger_compiler}.py` | py | 실행장 스테이징 (5종) | F0 자기 자신의 import |
|
||||
| 6 | stdout JSON (status·modules·expected_runnable_domain_ids·row_count·gates{declared/implemented/fired}·exception_count·review_item_count·errors·warnings) | json | — | 오케스트레이터 반환 계약 |
|
||||
|
||||
기록은 전부 `canonical()`(ensure_ascii=False · sort_keys · `,`/`:` 구분자 · 말미 개행) 직렬화 + `write_file(overwrite=true)`.
|
||||
|
||||
### 2.3 Task_C_FL_F1_fact_exception_adjudicator — IO
|
||||
|
||||
| 방향 | 경로 | 포맷 | 비고 |
|
||||
|---|---|---|---|
|
||||
| 입력 | `stage1_tmp/fact_ledger/fact_exception_pack.json` | json | **유일한 입력** — `preflight_files` 로 프롬프트에 선공급. 추가 read 는 프롬프트 계약으로 금지 |
|
||||
| 출력 | `stage1_tmp/fact_ledger/fact_adjudication.json` | json | **유일한 출력** — 루트 `fact_exception_adjudication` / `stage1_fact_exception_adjudication.v1`. 도구는 `write_file` 하나만 허용 |
|
||||
| 출력(stdout) | `"NO_EXCEPTIONS"` 또는 `"F1 예외 판정 완료 (decisions=<건수>)"` 또는 `"FAILED: <step>"` | text | 채팅 보고 계약 |
|
||||
|
||||
BO.json·후보 bundle·최종 원장·review handoff·signal 파일의 읽기/쓰기는 프롬프트 `<ABSOLUTE_SYSTEM_RULES>` 로 명시 금지.
|
||||
|
||||
### 2.4 Task_C_FL_F2_final_fact_ledger_gate_and_writer — 입력
|
||||
|
||||
| # | 경로 | 포맷 | 생산자 | 접근 / 검증 | 부재 시 |
|
||||
|---|---|---|---|---|---|
|
||||
| 1 | `Default_Agent/runtime_manifest.json` | json | 배포 파이프라인 | `_manifest_map` (F2 는 전수 배포 게이트 없음 — 소비 자산만 `_verify_asset`) | 경성 |
|
||||
| 2 | `Default_Agent/stage1_runtime/runtime_common.txt` | txt(py 미러) | 모듈 미러 | `materialize_modules` (F2 는 2종만) | 경성 |
|
||||
| 3 | `Default_Agent/stage1_runtime/schema_subset_validator.txt` | txt(py 미러) | 〃 | 〃 | 경성 |
|
||||
| 4 | `Default_Agent/stage1_runtime/fact_ledger_policy.v1.json` | json | Part 4 정책 정본 | `_verify_asset` + schema_version 대조 | 경성 (`PART4_POLICY_INVALID`) |
|
||||
| 5 | `Default_Agent/platform/schemas/fact_ledger_base.schema.json` | json | Part 4 최종 스키마 | `_verify_asset` + `assert_base_schema_capability`(items.properties 에 신규 2키) | 경성 (`PART4_LEDGER_SCHEMA_STALE`) |
|
||||
| 6 | `stage1_tmp/fact_ledger/fact_ledger_candidate_bundle.json` | json | Task_C_FL_F0 | `read_json` — rows·gate_report·status·counts 소비 | 경성 |
|
||||
| 7 | `stage1_tmp/fact_ledger/fact_exception_pack.json` | json | Task_C_FL_F0 | `read_json` — `exceptions[].exception_id` 가 커버리지 기대집합 | 경성 |
|
||||
| 8 | `stage1_tmp/fact_ledger/fact_adjudication.json` | json | Task_C_FL_F1 | `read_json` 상수 경로 직접(U4) · 부재 try — **exception_count>0 인데 부재면 경성**, 0이면 READY_NO_EXCEPTIONS 합성 | 조건부 경성 (`PART4_ADJUDICATION_MISSING`) |
|
||||
| 9 | `quality_gates/stage1_part4_review_handoff.json` | json | Task_C_FL_F0 (OPEN) | `read_json` — review_items 계수 후 FINALIZED 재기록 | 경성 |
|
||||
| 10 | `routing/domain_activation_manifest.json` | json | Part 1 D0 | `read_json` — `expected_runnable_domain_ids` 로 domain_effects 부분집합 검사 | 경성 |
|
||||
| 11 | `BO.json` | json | Part 2 F0 | `read_json` — 보존 등식 바깥 수 직접 계수(bundle counts 불신) | 경성 |
|
||||
| 12 | `legal_effect_structures.json` | json | Part 3 L2 | `read_json` — `structure_records`·`structure_index.by_bo_id` 재계수 | 경성 |
|
||||
| 13 | `signals/calculation_requirements.json` (SG-11) | json | Part 2 S0 | `read_json` — 등식 ⑤ 원천 차원 재계수 | 경성 |
|
||||
| 14 | `Fact_Ledger_base.json` (자기 산출 재읽기) | json | Task_C_FL_F2 자신 | `read_raw` — 기록 직후 sha 재대조 | 경성 (`PART4_WRITE_REREAD_MISMATCH`) |
|
||||
|
||||
### 2.5 Task_C_FL_F2_final_fact_ledger_gate_and_writer — 출력
|
||||
|
||||
| # | 경로 | 포맷 | 루트 키 / schema_version | 소비자 |
|
||||
|---|---|---|---|---|
|
||||
| 1 | `Fact_Ledger_base.json` | json | **래핑 없는 배열** / `stage1_fact_ledger_base.v1` (행 29키 · additionalProperties:false) | Stage_2 |
|
||||
| 2 | `stage1_tmp/fact_ledger/fact_ledger_writer_report.json` | json | (루트 래핑 없음) / `stage1_fact_ledger_writer_report.v1` | Stage_2 |
|
||||
| 3 | `quality_gates/stage1_part4_review_handoff.json` | json | `stage1_part4_review_handoff` · `status: "FINALIZED"` · `finalized_by` 추가 (항목 감축 금지 — 공동 기록자) | Stage_2 |
|
||||
| 4 | `/tmp/s1/_rt/{runtime_common,schema_subset_validator}.py` | py | 실행장 스테이징 (2종) | F2 자기 자신의 import |
|
||||
| 5 | stdout JSON (status·modules·row_count·patched_count·blocked_count·conservation_pass·final_sha256) | json | — | 오케스트레이터 반환 계약 |
|
||||
|
||||
F2 는 **receipt 를 쓰지 않는다** (`validation_assets/routing/part4_receipt.json` 은 F0 단독 기록 — 코드 주석·인계면 표 양쪽 실측).
|
||||
|
||||
### 2.6 Part 간 인계면 (stage1_part_interface.v1.json 55행 중 Part 4 관련 19행 실측 요약)
|
||||
|
||||
| 파일 | 생산자 → Part 4 소비자 | optional |
|
||||
|---|---|---|
|
||||
| `evidence_indexed.json` | Task_B1_quality_gate_evidence_indexed → F0 | 아니오 (F0 코드는 부재 warn 처리) |
|
||||
| `routing/domain_activation_manifest.json` | Task_D0_domain_activation_gate → F0·F2 | 아니오 |
|
||||
| `quality_gates/stage1_part2_review_handoff.json` | Task_C_BO_R0 (F0-P2 공동 기록) → F0 | 아니오 (F0 코드는 부재 warn 처리) |
|
||||
| `BO.json` | Task_C_BO_F0_final_bo_compiler_gate_writer → F0·F2 | 아니오 |
|
||||
| `signals/signal_manifest.json` | Task_C_BO_S0_signal_bundle_writer → F0 | 아니오 |
|
||||
| `signals/calculation_requirements.json` (SG-11) | Task_C_BO_S0 → F0·F2 | 아니오 |
|
||||
| `signals/asset_right_state_signals.json` (SG-07) | Task_C_BO_S0 → F0 | 예 (레코드 0 정상) |
|
||||
| `signals/governing_law_version_signals.json` (SG-04) | Task_C_BO_S0 → F0 | 아니오 |
|
||||
| `signals/timeline_notice_condition_signals.json` (SG-06) | Task_C_BO_S0 → F0 | 아니오 |
|
||||
| `signals/evidence_proof_conflict_signals.json` (SG-10) | Task_C_BO_S0 → F0 | 아니오 |
|
||||
| `signals/domain_signals/<domain_id>.json` | Task_C_BO_S0 → F0 | 예 (부재는 영수증 계수) |
|
||||
| `legal_effect_structures.json` | Task_C_LE_L2_final_structure_index_writer → F0·F2·Stage_2 | 아니오 |
|
||||
| `stage1_tmp/fact_ledger/fact_ledger_candidate_bundle.json` | F0 → F2 | 아니오 |
|
||||
| `stage1_tmp/fact_ledger/fact_exception_pack.json` | F0 → F1·F2 | 아니오 |
|
||||
| `stage1_tmp/fact_ledger/fact_adjudication.json` | F1 → F2 | 예 (exception_count>0 인데 부재면 경성) |
|
||||
| `Fact_Ledger_base.json` | F2 → Stage_2 | 아니오 |
|
||||
| `stage1_tmp/fact_ledger/fact_ledger_writer_report.json` | F2 → Stage_2 | 아니오 |
|
||||
| `quality_gates/stage1_part4_review_handoff.json` | F0 (also_written_by F2) → Stage_2 | 아니오 |
|
||||
| `validation_assets/routing/part4_receipt.json` | F0 → (소비자 없음) | 아니오 |
|
||||
|
||||
`stage1_stage_chain.v1.json` Part 4 구간(order 4): requires = `BO.json` · `signals/signal_manifest.json` · `legal_effect_structures.json` · `routing/domain_activation_manifest.json` · `evidence_indexed.json` · `signals/domain_signals/<domain_id>.json` · `quality_gates/stage1_part2_review_handoff.json` / produces = `Fact_Ledger_base.json` · `stage1_tmp/fact_ledger/fact_ledger_writer_report.json` · `quality_gates/stage1_part4_review_handoff.json` · `validation_assets/routing/part4_receipt.json` / yaml = `stage_1_part_4_v.8.yml`.
|
||||
|
||||
---
|
||||
|
||||
## 3. 작업용 assets — 배포 위치 포함 전수 표
|
||||
|
||||
배포 원본 폴더: `BASE/extension_research/Default_Agent/` → 서버 논리 접두사 `Default_Agent/` 로 통째 배포(부분 복사 불허 — `PART4_DEPLOYMENT_REMEDY` 문구 실측). 장부: `Default_Agent/runtime_manifest.json` (`stage1_runtime_manifest.v1` · `runtime_artifact_count` 465 · entries 465 — 실측 일치).
|
||||
|
||||
### 3.1 python 실행 모듈 (.py 정본 + .txt 미러 — 5쌍 전부 바이트 동일 실측)
|
||||
|
||||
| 자산 | 배포 위치 (.py / .txt) | manifest 등재 | 소비 task | 역할 |
|
||||
|---|---|---|---|---|
|
||||
| fact_ledger_compiler | `Default_Agent/stage1_runtime/fact_ledger_compiler.py` · `Default_Agent/stage1_runtime/fact_ledger_compiler.txt` | 등재 · HASH_OK | F0 | **Part 4 로직 본체** (910행 순수 함수 — 공개 API 3종: `normalize_gate_rules` · `resolve_alias_table` · `compile_fact_ledger_candidates`) |
|
||||
| runtime_common | `Default_Agent/stage1_runtime/runtime_common.py` · `.txt` | 등재 · HASH_OK | F0 · F2 | 공용 런타임 (0층) |
|
||||
| schema_subset_validator | `Default_Agent/stage1_runtime/schema_subset_validator.py` · `.txt` | 등재 · HASH_OK | F0 · F2 | 닫힌 스키마 검증기 (bundle·pack·최종 배열) |
|
||||
| registry_loader | `Default_Agent/stage1_runtime/registry_loader.py` · `.txt` | 등재 · HASH_OK | F0 (반입만 — fact_ledger_compiler 의존 계층) | registry 적재 (1층) |
|
||||
| structure_index_compiler | `Default_Agent/stage1_runtime/structure_index_compiler.py` · `.txt` | 등재 · HASH_OK | F0 (반입만) | Part 3 색인 컴파일러 (의존 계층) |
|
||||
|
||||
미러 규약: `read_raw(<.txt>)` 원문의 sha256 이 manifest 의 해당 경로 sha 와 일치해야 `/tmp/s1/_rt/<이름>.py` 로 전개·import (`MODULE_MIRROR_UNREGISTERED` / `MODULE_MIRROR_HASH_MISMATCH`). 실행 뿌리 `/tmp/s1` 은 Part 3 규율 공유 — 새 뿌리 금지.
|
||||
|
||||
### 3.2 정책·스키마·계약 (json)
|
||||
|
||||
| 자산 | 배포 위치 | manifest 등재 | 소비 task | 역할 |
|
||||
|---|---|---|---|---|
|
||||
| fact_ledger_policy.v1.json | `Default_Agent/stage1_runtime/fact_ledger_policy.v1.json` | 등재 · HASH_OK | F0 · F2 | **규칙 선언 정본** (`stage1_fact_ledger_policy.v1`) — 27필드 목록·신규 2필드·BO 정규화·증거력 5갈래·스켈레톤 3코드 순서·게이트 17축/구현 3키·별칭 약어표·P2 handoff 규칙·계산 조인·보존 등식 5·예외 pack(문자 상한 2000·unreachable 2종)·adjudication(accepted_status 3종·allowed_patch_fields=["amount"])·soft 19/hard 23 코드·루트 래핑표 19경로 |
|
||||
| fact_ledger_candidate_bundle.schema.json | `Default_Agent/platform/schemas/fact_ledger_candidate_bundle.schema.json` | 등재 · HASH_OK | F0 | 후보 bundle 닫힌 스키마 — required 7키(schema_version·status·rows·gate_report·counts·signal_manifest_transaction_id·created_by) · rows[].properties 에 신규 2키 |
|
||||
| fact_ledger_base.schema.json | `Default_Agent/platform/schemas/fact_ledger_base.schema.json` | 등재 · HASH_OK | F2 (F0 은 배포 게이트만) | 최종 원장 스키마 — 래핑 없는 배열 · items.properties 29키 · required 27키(신규 2키 제외) · additionalProperties:false |
|
||||
| fact_exception_pack.schema.json | `Default_Agent/platform/schemas/fact_exception_pack.schema.json` | 등재 · HASH_OK | F0 | pack 닫힌 스키마 — required 5키(schema_version·has_exceptions·exception_count·exceptions·budget) |
|
||||
| legal_effect_structures.schema.json | `Default_Agent/platform/schemas/legal_effect_structures.schema.json` | 등재 · HASH_OK | (F0 배포 게이트 한 벌 검사 대상 — 적재 없음) | Part 3 산출 계약 스키마 |
|
||||
| extension_payload_key_declarations.v1.json | `Default_Agent/routing/extension_payload_key_declarations.v1.json` | 등재 · HASH_OK | F0 | legacy 별칭 선언(`legacy_alias_targets`·`legacy_declaration_mismatches`) — `resolve_alias_table` 입력 |
|
||||
| signal_registry.v2.json | `Default_Agent/signals/signal_registry.v2.json` | 등재 · HASH_OK | F0 (배포 게이트 한 벌) | signal 정의 registry |
|
||||
| s5_execution_contract.v2.json | `Default_Agent/contracts/signals/s5_execution_contract.v2.json` | 등재 · HASH_OK | F0 (배포 게이트 한 벌) | S5 실행 계약 |
|
||||
| runtime_manifest.json | `Default_Agent/runtime_manifest.json` | (자기 자신이 장부) | F0 · F2 | 배포 봉인 장부 — `{path, sha256}` 465 항목 |
|
||||
|
||||
### 3.3 도메인 registry·사이드카 (`domains/<id>/...`)
|
||||
|
||||
배포본 도메인 26 폴더 = 실체 `E-00`~`E-21` (22) + 확장 `X1`·`X2`·`X3` (3) + 공통 `EC-00` (1 — gates/structure_types 사이드카 없음).
|
||||
|
||||
| 자산 | 배포 위치 | 개수 | manifest 등재 | 소비 task | 무결성 경로 |
|
||||
|---|---|---|---|---|---|
|
||||
| gates.json (게이트 사이드카) | `Default_Agent/domains/<domain_id>/gates.json` | **25** (E-00~E-21 · X1~X3) | **25 등재** | F0 | `_verify_asset` (manifest sha) — 실패 시 `sidecar_gaps` 계수 |
|
||||
| structure_types.json (유형 사이드카) | `Default_Agent/domains/<domain_id>/structure_types.json` | **25** | **25 등재** | F0 | 〃 (별칭 자기선언 스캔 원천) |
|
||||
| domain_config.json | `Default_Agent/domains/<domain_id>/domain_config.json` | 26 (EC-00 포함 — F0 는 expected_runnable 만 읽음) | **미등재 (0/465 실측)** | F0 | **SG-01 봉인 → `_registry_index` → `config_sha256` 사슬** (manifest 아님) |
|
||||
| _registry_index.json | `Default_Agent/domains/_registry_index.json` | 1 | **미등재 (실측)** | F0 | SG-01(`domain_activation_manifest`) 의 `registry_index_sha256` 선언과 원문 sha 대조 |
|
||||
| module_role_projection.json | `Default_Agent/domains/<domain_id>/module_role_projection.json` | 25 | 25 등재 | (Part 4 직접 소비 없음 — Part 3 계열) | — |
|
||||
|
||||
즉 Part 4 무결성 검증은 **이중 트랙**: ① 정적 자산·사이드카·모듈 = `runtime_manifest.json` sha 장부, ② registry index·domain_config = Part 1 SG-01 봉인 사슬. 두 트랙이 겹치지 않는다.
|
||||
|
||||
### 3.4 사건 산출물(자산 아님 — 선행 Part 실산출, §2 IO 표 참조)
|
||||
|
||||
`BO.json` · `legal_effect_structures.json` · `evidence_indexed.json` · `routing/domain_activation_manifest.json` · `quality_gates/stage1_part2_review_handoff.json` · `signals/signal_manifest.json` · `signals/{governing_law_version,timeline_notice_condition,asset_right_state,evidence_proof_conflict}_signals.json` · `signals/calculation_requirements.json` · `signals/domain_signals/<domain_id>.json`.
|
||||
|
||||
---
|
||||
|
||||
## 4. 개별 소작업(sub-task) 명칭 · 작업 내역 · 작업 목적
|
||||
|
||||
### 4.1 Task_C_FL_F0_fact_ledger_reducer — code 리듀서 (YAML 52~648행)
|
||||
|
||||
- **성격**: `mcp: code-executor` · `tool_name: run_code` · `language: python` · `requirements: "httpx"` · `network: "agent-network"` · `timeout: 300`. localdocs 보일러플레이트는 Part 3 L0 검증 완료본 복사(clientInfo 에 `{{__user_hash__}}`/`{{__workspace_hash__}}` 필수).
|
||||
- **목적**: 결정적(비 LLM) 행 생성·조인·게이트 실행·예외 pack 산출. 판정 규칙은 이 파일에 쓰지 않고 정책·모듈에 위임.
|
||||
|
||||
**내부 단계 순서 (배포 게이트 → 적재 → 계산 → 검사 → 기록):**
|
||||
|
||||
| 단계 | 함수/구간 | 내용 | 실패 코드 |
|
||||
|---|---|---|---|
|
||||
| 0 | `assert_deployment()` | manifest schema_version 대조 후 **MODULE_MIRRORS 5 + PART4_REQUIRED_ASSETS 13 합집합**을 등재·sha256·가독 3축으로 한 벌 검사. 첫 실패에서 멈추지 않고 unregistered/hash_mismatch/unreadable 을 모아 일괄 보고 | `PART4_RUNTIME_MANIFEST_INVALID` · `PART4_ASSET_DEPLOYMENT_INCOMPLETE` |
|
||||
| 1 | `materialize_modules()` | 모듈 5종 미러 sha 대조 → `/tmp/s1/_rt/*.py` 전개 → `sys.path` 선두 삽입 → `fact_ledger_compiler`·`schema_subset_validator` import | `MODULE_MIRROR_UNREGISTERED` · `MODULE_MIRROR_HASH_MISMATCH` |
|
||||
| 2 | 정책 반입 | `_verify_asset(POLICY)` + `schema_version == "stage1_fact_ledger_policy.v1"` | `PART4_POLICY_INVALID` |
|
||||
| 3 | `assert_bundle_schema_capability()` | bundle 스키마 rows[].properties 에 `domain_effects`·`calculation_requests` 존재 — 장부 검사만으로 닫히지 않는 의미 검사(Part 2 교훈) | `PART4_LEDGER_SCHEMA_STALE` |
|
||||
| 4 | 진입 봉인 셋 | ① `verify_signal_seal()`: `transaction_id` 정규식 + `files[].file_sha256` 전수(경로에 `signals/` 접두 부착) ② `verify_registry_index_seal()`: SG-01 `registry_index_sha256` ↔ `_registry_index` 원문 sha ③ `verify_les_transaction()`: 두 갈래 — 키 있고 값 다르면 경성, 키 없으면 fail-open 검토(`UNSEALED_REVIEW`) | `PART4_SIGNAL_SEAL_FAILED` · `PART4_REGISTRY_INDEX_SEAL_FAILED` · `PART4_LES_TRANSACTION_MISMATCH` (연성: `PART4_LES_TRANSACTION_UNSEALED_REVIEW` warn) |
|
||||
| 5 | 입력 적재 | expected_runnable 도메인별 domain_config(`config_sha256` 사슬)·gates.json·structure_types.json(실패는 `sidecar_gaps`) · 별칭 선언 · SG 5종 · 도메인 봉투(부재 `envelope_absent`) · P2 handoff/evidence(상수 경로 `read_json` 직접 — U4 실측 가시성, 부재 try warn) · BO | `PART4_REGISTRY_INDEX_SEAL_FAILED`(config_sha256) · warn 2종 |
|
||||
| 6 | **`fact_ledger_compiler.compile_fact_ledger_candidates(...)` 13인자 호출** — `bo_records, les_root, signal_documents, domain_envelopes, p2_handoff, evidence_doc, registry_index, domain_configs, gate_sidecars, structure_type_sidecars, activation_doc, alias_declarations, policy` | TypeError 는 시그니처 불일치로 번역. 산출 후 `assert_compiler_capability()`(rows 배열·gate_report·행별 domain_effects) | `PART4_COMPILER_STALE` (detail: signature_mismatch 포함) |
|
||||
| 7 | 기록 | bundle 에 `signal_manifest_transaction_id`·`les_transaction_seal`·`created_by` 부착 → `schema_subset_validator.validate` 로 bundle·pack 각각 닫힌 검증 → 4파일 기록(bundle · pack · handoff OPEN · receipt — receipt 는 실측값만, 상수 PASS 금지) | `PART4_LEDGER_SCHEMA_INVALID` (stage F0 / F0.pack) |
|
||||
|
||||
**모듈 내부(`compile_fact_ledger_candidates`) 소단계 — 전략서 소작업 번호 그대로:**
|
||||
|
||||
| 소단계 | 내용 |
|
||||
|---|---|
|
||||
| F0-0 | 사이드카 **17축 방언 정규화 리더** `normalize_gate_rules` — rule 배열 키(rules/gates)·emitted code 키 3종·효과 컨테이너 3종·차단 플래그 경로 3종·status 발화 경로 3종·평가 키 3종·행 효과 키·파일 status 키·입력 선언 키·선택 플래그 4종을 단일 norm 형으로. `global_status_rule` 3방언은 채택하지 않고 경고 기록 |
|
||||
| F0-0b | **별칭 해소** `resolve_alias_table` (D-P4-7) — 선언표 `legacy_alias_targets` ↔ structure_types 사이드카의 `legacy_source` 자기선언 전수 대조. 불일치 `LEGACY_ALIAS_SELF_MISMATCH_REVIEW`, 파생 목록 대조 `LEGACY_ALIAS_DECLARATION_INCOMPLETE_REVIEW` |
|
||||
| F0-0c | BO 압축·정규화 `compact_bo` — 정책 `bo_normalization.key_map`·`domain_payload_keep_keys` |
|
||||
| F0-7b | 게이트 입력 정규화 — 봉투 review_items + P2 handoff(`source_review_code` 패턴 `^[A-Z][A-Z0-9_]{2,127}$`·도메인 귀속은 직접 or 별칭) → `code_pool` / 봉투 `evidence_slot_status` → `slot_status` / SG-11 `operand_state` → `operand_by_domain`. 불량은 `P2_HANDOFF_CODE_NOT_A_REVIEW_CODE_REVIEW`·`P2_HANDOFF_DOMAIN_UNRESOLVED_REVIEW` |
|
||||
| F0-1~6b | **행 생성** — BO 를 BO_ID 사전순 정렬, `fact_id = F-%03d` 부여. (가) 9필드(parties 는 core `Performer`/`Subject`, amount·action 등) · F0-3 LES 조인(`structure_index.by_bo_id` → `domain_effects{도메인: {module, role_projection, structure_ids, type_ids, review_codes}}`, 미부착 `FACT_ROW_UNATTACHED_REVIEW`) · F0-5 SG-11 조인(`calculation_request_refs` → `calculation_requests[]`, `operand_state` 승계·재산정 금지, SG-04 `law_version_refs` 병합, dangling `CALCULATION_REF_DANGLING_REVIEW`·calc_id 결손 대체 `CALCULATION_ID_SUBSTITUTED_REVIEW`) · (다) 증거력 `score_evidence` 정책 5갈래(documentary 마커→high/documentary, 2건 이상→high/high, meeting 계열→medium/meeting_only_core, 기본 medium/medium, 빈 refs→low/low; 우주 밖 참조 `EVIDENCE_REF_NOT_IN_EVIDENCE_UNIVERSE` stub 계수) · (나) 15필드(`legal_calculation_object` 는 정책 5-원소 유형 집합 ∩ type_ids, 별칭 모듈 어휘로 actio/money/successor 필드 합성) |
|
||||
| F0-8 | **게이트 합집합 실행** — 선언(registry `domain_config.gates`) × 규칙(사이드카 정규화본). dict condition 구현 3키: `any_review_code_present`(code_pool 교집합) · `required_slots_missing_or_conflicting`(slot missing/conflicted) · `calculation_operand_state_in`(operand 상태 교집합). 미배포 `GATE_SPEC_NOT_DEPLOYED_REVIEW` · 미지원 키 `GATE_CONDITION_KEY_UNSUPPORTED_REVIEW` · str 술어 `GATE_PREDICATE_SPEC_UNIMPLEMENTED_REVIEW` · 차단 표지 불일치 `GATE_BLOCK_FLAG_MISMATCH_REVIEW` · registry 밖 code `GATE_EMITTED_CODE_NOT_IN_REGISTRY` · 고아 규칙 `GATE_RULE_NOT_IN_REGISTRY`. 입력 부재는 `fail_open_to_review` 기본 정책 |
|
||||
| F0-8b | 행 투영 — 스켈레톤 3코드 고정 순서(`EMPTY_DERIVED_FACT`·`NO_EVIDENCE_REFS`·`NO_LINKED_LEGAL_EFFECT_STRUCTURE`) 먼저, 발화 게이트 code 를 gate_id 오름차순 append, 첫 출현 보존 dedupe. `row_must_consider` 발화 시 R(d) 전 행 OR 갱신 |
|
||||
| (8b↔9 사이 — 전략서 무번호, §4.2 G-i) | **LES 미사용 검토** — 어느 행에도 부착되지 않은 LES `structure_id` 전건을 `STRUCTURE_UNATTACHED_REVIEW` 로 `SOFT_WARNING` 검토 적재(정책 `unattached_review.structure` · 컴파일러 767~771행). BO 측 `FACT_ROW_UNATTACHED_REVIEW` 의 쌍 — "보존 등식은 손실을 세지 흡수를 세지 않는다. 침묵 금지를 등식 위에 따로 건다"(정책 note) |
|
||||
| F0-9 | **예외 pack** — `legal_calculation_object` 비 null 이고 amount 후보 2개 이상(bo.amount·core.Amount)이면 `FX-%03d` 적재 + `conflict_flags ["CALCULATION_BASIS_CONFLICT"]` · 항목 2,000자 초과는 `oversize_review` + 검토 · elif amount/object_spec 공백은 `CALCULATION_BASIS_INCOMPLETE_REVIEW` 검토만. unreachable 2부류(`unresolved_asset_cluster_projection`·`unresolved_structure_role_projection`)가 실리면 즉시 `PART4_UNREACHABLE_EXCEPTION_TYPE` 경성 |
|
||||
| F0-10 | 보존 등식 5 계수(bundle.counts.conservation 으로 동봉 — F2 가 재계수로 재검증) · status = 검토/예외/LES 승계 검토/게이트 발화 중 하나라도 있으면 `READY_WITH_REVIEW` 아니면 `READY` |
|
||||
|
||||
### 4.2 Task_C_FL_F1_fact_exception_adjudicator — LLM 예외 재정판정 (YAML 649~753행)
|
||||
|
||||
- **성격**: 유일 LLM task. `llm_provider: google` · `llm_model: gemini-3.1-flash-lite` · `llm_reasoning: low` · `llm_verbosity: low` · `max_iterations: 1` · `use_tools: [localdocs]` · `cache_control: {mode: auto, ttl: 20m}` · `preflight: true` · `preflight_files: [stage1_tmp/fact_ledger/fact_exception_pack.json]`.
|
||||
- **프롬프트 구조**: `<COMMON_CACHE_PREFIX_STAGE_1>`(Stage 1 공통 6블록 — 우선순위·환각 가드·출처 분리·스키마/기록자 경계·읽기 다이어트·출력 압축) + `<STATIC_BLOCK_TASK_C_FL_F1_FACT_EXCEPTION_ADJUDICATOR>`.
|
||||
- **목적**: 결정적 reducer(F0)가 pack 에 실은 예외만 판정. **유일 생존 부류 `legal_calculation_required`(계산 근거 다중성)**. 병합·최종 파일 작성·사실 창작 금지.
|
||||
- **실행 절차(프롬프트 계약)**: ① pack 의 `has_exceptions` 확인 → ② false 면 no-exception 객체(`status: READY_NO_EXCEPTIONS` · decisions/blocked 빈 배열 · gate 3계수 0)를 `write_file(overwrite=true)` 로 기록, `"NO_EXCEPTIONS"` 출력 후 즉시 종료 → ③ true 면 각 exception 을 `compact_payload` 만으로 판정(추가 read 금지) → ④ `amount_candidates` 중 수치·통화·기간이 더 완전한 후보를 `selected_value` 로 — decision `SELECT_AMOUNT` · `patch_field` 는 반드시 `"amount"`; 우열 불가면 `BLOCK_REVIEW` 로 `blocked_review_items` 적재(확신 없는 확정 금지 — 인간 검토 라우팅); `amount` 외 patch_field 는 F2 의 `PART4_PATCH_REJECTED` 경고 명시; `domain_effects` 하위 경로는 읽기 전용 → ⑤ 결과 기록: 루트 `fact_exception_adjudication` · `schema_version: stage1_fact_exception_adjudication.v1` · status `READY`(전건 비차단)/`READY_WITH_BLOCKS`(차단 존재) · decision 객체 `{exception_id, fact_id, decision, patch_field, selected_value, rationale(1문장)}` · `adjudication_gate {input_exception_count, decision_count, blocked_count}` — 모든 decision 은 pack 의 `exception_id`·`fact_id` 인용 → ⑥ `"F1 예외 판정 완료 (decisions=<건수>)"` 만 출력하고 종료.
|
||||
- **실패 정책**: pack 부재·파싱 불가 → 즉시 중단·채팅 보고만(파일 안 씀). tool 오류 → 1회 재시도, 재실패 시 `FAILED: <step>` 보고 후 종료.
|
||||
- **금지면**: BO.json·후보 bundle·최종 원장·review handoff·signal 파일 읽기/쓰기 금지, pack 에 없는 exception_id·fact_id·source_bo_id 창작 금지, 금액 계산 금지(선택/차단만), 출력 파일은 `fact_adjudication.json` 하나, 도구는 `write_file` 하나.
|
||||
|
||||
### 4.3 Task_C_FL_F2_final_fact_ledger_gate_and_writer — code 최종 게이트/작성자 (YAML 755~1253행)
|
||||
|
||||
- **성격**: `mcp: code-executor` · `run_code` · `requirements: "httpx"` · `network: "agent-network"` · `timeout: 240`. 모듈은 2종만 반입(runtime_common·schema_subset_validator). F0 식 전수 배포 게이트는 없고 소비 자산만 `_verify_asset`.
|
||||
- **목적**: F1 판정 커버리지 검증·패치 적용 후 보존 등식·활성 부분집합·연속성·닫힌 스키마를 전부 통과한 행만 최종 원장으로 기록. **입력은 전부 파일 계약 — 메모리 전달 없음.**
|
||||
|
||||
**내부 단계 순서:**
|
||||
|
||||
| 단계 | 내용 | 실패 코드 |
|
||||
|---|---|---|
|
||||
| 1 | 모듈 2종 반입 → 정책 반입(schema_version) → `assert_base_schema_capability`(최종 스키마 items.properties 에 신규 2키) | `MODULE_MIRROR_*` · `PART4_POLICY_INVALID` · `PART4_LEDGER_SCHEMA_STALE` |
|
||||
| 2 | bundle·pack·handoff·activation manifest 적재. `expected_runnable_domain_ids` 집합화 | (read 실패 경성) |
|
||||
| 3a | **판정 파일 조건부** — `fact_adjudication.json` 상수 경로 `read_json`(U4) · 부재 try: exceptions>0 이면 경성, 0 이면 `READY_NO_EXCEPTIONS` 합성. status 는 정책 `adjudication.accepted_status`(READY·READY_NO_EXCEPTIONS·READY_WITH_BLOCKS) 밖이면 경성 | `PART4_ADJUDICATION_MISSING` (detail: status_out_of_contract 포함) |
|
||||
| 3b | **판정 커버리지** (구본 자구 승계) — expected == decided ∪ blocked · 교집합 공집합 · 중복 decision · 미지 ID · 예외 0 의 임의 decision 5축 | `PART4_COVERAGE_BROKEN` (failures: duplicate_decision · decided_and_blocked_overlap · expected_neq_decided_union_blocked · unknown_exception_ids · decision_without_exception) |
|
||||
| 3c | **패치 적용** — BLOCK_REVIEW 는 건너뛰고, `patch_field ∈ policy.adjudication.allowed_patch_fields`(=["amount"]) 만 해당 행 `target[field] = selected_value`. 미지 fact_id 도 경성 | `PART4_PATCH_REJECTED` |
|
||||
| 4 | **domain_effects ⊆ SG-01 활성** — 행별로 `domain_effects` 키 − expected_runnable 비면 통과 (등식보다 앞 — G-g 기대) | `PART4_DOMAIN_EFFECT_NOT_ACTIVE` |
|
||||
| 5 | **보존 등식 다섯** — 바깥 수를 BO.json·legal_effect_structures.json·SG-11 원본에서 직접 계수(bundle counts 불신): ① 행 수 == BO 수 ② attached+unattached == BO 수 ③ Σ행 domain_effects 키 수 == Σ BO 부착 구조의 도메인 distinct ④ Σ행 calculation_requests == Σ BO 부착 구조의 refs distinct ⑤ used + unused == SG-11 signal_id 총수 | `PART4_ROW_CONSERVATION_BROKEN` · `PART4_BO_ATTACHMENT_COVERAGE_BROKEN` · `PART4_EFFECT_CONSERVATION_BROKEN` · `PART4_CALC_CONSERVATION_BROKEN` · `PART4_CALC_SOURCE_CONSERVATION_BROKEN` (모아서 `conservation_failures` 로 일괄) |
|
||||
| 6 | **BO 보존 + fact_id 연속** — BO_ID 정렬 집합 == 행 source_bo_id 정렬 집합 · `fact_ids == ["F-%03d" % i for i in 1..n]` | `PART4_BO_CONSERVATION_BROKEN` · `PART4_FACT_ID_SEQUENCE_BROKEN` |
|
||||
| 7 | **닫힌 스키마 → 기록 → 재읽기** — `schema_subset_validator.validate(rows, base_schema)` → `canonical(rows)` 를 `Fact_Ledger_base.json` 에 기록 → `read_raw` 재읽기 sha 대조 | `PART4_LEDGER_SCHEMA_INVALID`(stage F2) · `PART4_WRITE_REREAD_MISMATCH` |
|
||||
| 8 | **writer report 3종 + handoff FINALIZED** — report: `final_writer_status`(review/blocked/행 skeleton code/bundle READY_WITH_REVIEW 중 하나라도 있으면 `READY_WITH_REVIEW` 아니면 `READY`) · row_count · `gate_firings`(bundle gate_report.fired_by_domain) · `domain_effect_coverage`(도메인별 행 수) · `calculation_readiness`(operand_state 별 계수) · patched · blocked_review_items · conservation 5종 실측 · `final_sha256`. handoff 는 `status: FINALIZED` + `finalized_by` 로 재기록 — 항목을 줄이지 않는다(공동 기록자). **receipt 는 쓰지 않는다** | — |
|
||||
|
||||
---
|
||||
|
||||
## 5. upstream-downstream 연결 — 쌍별 연결 이유·방식·자료 소비
|
||||
|
||||
### 5.1 Part 내부 연결
|
||||
|
||||
**(1) F0 → F1**
|
||||
- **연결 이유**: 결정론이 판정할 수 없는 잔여(계산 근거 다중성)만 LLM 에 위임하기 위해 — F0 은 사실을 창작하지 않고 후보를 pack 에 실어 넘긴다.
|
||||
- **연결 방식**: ① DAG 상 `task_procedure` 순서(F0.nexts → F1) ② **파일 handoff** `stage1_tmp/fact_ledger/fact_exception_pack.json` ③ F1 의 `preflight_files` 선공급 — F1 은 read 도구 호출 없이 프롬프트에 실린 pack 만 본다.
|
||||
- **자료 소비**: F1 은 `has_exceptions` 로 즉시 분기 · exception 별 `compact_payload.amount_candidates`(선택 대상) · `object_spec`·`calculation_request_ids`(판정 참고) · `exception_id`/`fact_id`/`source_bo_id`(인용 의무 — 창작 금지) 소비. pack 의 `budget.pack_item_char_limit`(2000) 이 F1 입력 부담을 봉투 차원에서 통제.
|
||||
|
||||
**(2) F0 → F2**
|
||||
- **연결 이유**: 행 생성기(F0)와 최종 기록자(F2)의 분리 — F1 판정 반영·독립 재검증을 거친 뒤에만 최종 파일이 존재하게 하는 2단 기록 구조.
|
||||
- **연결 방식**: ① 파일 handoff `stage1_tmp/fact_ledger/fact_ledger_candidate_bundle.json`(행 원천) + `fact_exception_pack.json`(커버리지 기대집합) + `quality_gates/stage1_part4_review_handoff.json`(OPEN→FINALIZED 상태 게이트 — 공동 기록자) ② **봉인 승계**: F0 이 bundle 에 부착한 `signal_manifest_transaction_id` — F2 는 signal_manifest 를 다시 읽지 않고 이 값을 승계(코드 주석 실물) ③ **불신 재계수**: F2 는 bundle 의 `counts.conservation` 을 믿지 않고 BO·LES·SG-11 원본에서 등식 5 를 직접 재계수.
|
||||
- **자료 소비**: `rows`(29키 후보 행 — 패치·검증·기록 대상) · `gate_report.fired_by_domain`(writer report 의 gate_firings 로 전사) · `status`(READY_WITH_REVIEW 전파) · pack `exceptions[].exception_id`(커버리지 좌변) · handoff `review_items`(계수 후 보존 재기록).
|
||||
|
||||
**(3) F1 → F2**
|
||||
- **연결 이유**: LLM 판정을 경성 게이트 아래 두기 위해 — F2 가 커버리지·허용 필드·상태 계약을 전건 검증한 뒤에만 패치를 반영한다.
|
||||
- **연결 방식**: ① 파일 handoff `stage1_tmp/fact_ledger/fact_adjudication.json`(optional — 조건부 경성: pack exceptions>0 인데 부재면 `PART4_ADJUDICATION_MISSING`) ② 상태 계약: `status ∈ policy.adjudication.accepted_status` ③ 커버리지 등식: pack ↔ 판정 (expected == decided ∪ blocked, 5축) ④ 패치 화이트리스트: `allowed_patch_fields = ["amount"]` 정책 선언 — 프롬프트의 "patch_field 는 반드시 amount" 규칙과 대칭.
|
||||
- **자료 소비**: `decisions[]` 중 비 BLOCK_REVIEW 항목의 `{fact_id, patch_field, selected_value}` 를 행 패치에 사용 · `blocked_review_items` 는 writer report 로 전사되고 final_writer_status 를 READY_WITH_REVIEW 로 승격.
|
||||
|
||||
### 5.2 Part 간(진입) 연결 — F0 기준
|
||||
|
||||
**(4) Part 2 `Task_C_BO_F0_final_bo_compiler_gate_writer` → F0·F2 (`BO.json`)**
|
||||
- 이유: 행 카디널리티의 좌변 — BO 1건 = 1행. / 방식: 파일 handoff(래핑 없는 배열 — 최대 호환면, 레코드 구조 불변 계약). / 소비: F0 은 `BO_ID` 사전순 정렬로 fact_id 부여, `core_field_base`(Performer·Subject·Amount·Action·Object·BehaviorTime)·`extensions.domain_payload`·`source_evidence_indexes`·`amount` 로 (가) 9필드·예외 후보 합성. F2 는 BO_ID 집합·총수만 재계수(등식 ①②③④·BO 보존).
|
||||
|
||||
**(5) Part 2 `Task_C_BO_S0_signal_bundle_writer` → F0 (`signals/signal_manifest.json` + SG 5종 + 봉투)**
|
||||
- 이유: 진입 정본 집합 선언(`downstream_read_sets.part4_F0` = SG-04·06·07·10·11)과 위변조 방지. / 방식: **봉인 검증** — manifest `transaction_id`(`^S5TX-[a-f0-9]{20}$`) + `files[].file_sha256` 전수 대조 후에만 소비(상태 게이트이자 sha 검증). 구 signal 3종 뿌리 이름은 읽지 않는다(C-7 폐쇄). / 소비: SG-11 `records[].signal_id/details.calculation_id/operand_state/missing_operands/law_version_refs/domain_ids`(계산 조인 — operand_state 재산정 금지) · SG-04 `records[].domain_ids→signal_id`(law_version_refs 보강 — 버전 확정 판단 금지) · SG-06·SG-07·SG-10 은 `signal_documents` 로 컴파일러에 전달(참조 계열) · 봉투 `review_items`(게이트 code_pool)·`evidence_slot_status`(slot 게이트 입력).
|
||||
|
||||
**(6) Part 3 `Task_C_LE_L2_final_structure_index_writer` → F0·F2 (`legal_effect_structures.json`)**
|
||||
- 이유: LES 조인이 `domain_effects`·`calculation_requests` 의 유일 원천 — Part 4 신규 2키의 상류. / 방식: 파일 handoff + **거래 봉인 두 갈래**(`signal_manifest_transaction_id` 키 있고 다르면 경성 `PART4_LES_TRANSACTION_MISMATCH`, 없으면 fail-open `UNSEALED_REVIEW` — 계약상 적법) — 결과는 bundle `les_transaction_seal` 로 하류 전파. / 소비: F0 은 `structure_records[]`(structure_id·domain_id·module·role_projection·type_id·review_codes·calculation_request_refs)와 `structure_index.by_bo_id` 로 행별 조인. F2 는 같은 두 면을 재계수(등식 ③④).
|
||||
|
||||
**(7) Part 1 `Task_D0_domain_activation_gate` → F0·F2 (`routing/domain_activation_manifest.json`)**
|
||||
- 이유: 실행 대상 도메인의 유일 결정면(`expected_runnable_domain_ids`)과 registry 무결성 닻. / 방식: 파일 handoff + **sha 사슬** — `registry_index_sha256` ↔ `_registry_index` 원문, index `entries[].config_sha256` ↔ 각 domain_config 원문. / 소비: F0 은 expected_runnable 로 config·사이드카·봉투 적재 범위를 한정하고 게이트 선언을 수집. F2 는 `domain_effects ⊆ expected_runnable` 부분집합 경성 검사(`PART4_DOMAIN_EFFECT_NOT_ACTIVE`).
|
||||
|
||||
**(8) Part 1 `Task_B1_quality_gate_evidence_indexed` → F0 (`evidence_indexed.json`)**
|
||||
- 이유: 증거력 산정 (다) 2필드(credibility·proof_strength)의 우주. / 방식: 파일 handoff(부재 warn — fail-open). / 소비: `build_evidence_authority` 가 evidence_index/title/key_facts/key_dates/key_amounts/priority/authentication 을 평탄화(depth 3)해 `score_evidence` 5갈래 판정. 우주 밖 참조는 stub 계수(`EVIDENCE_REF_NOT_IN_EVIDENCE_UNIVERSE`).
|
||||
|
||||
**(9) Part 2 `Task_C_BO_R0_seed_reducer_and_exception_planner` → F0 (`quality_gates/stage1_part2_review_handoff.json`)**
|
||||
- 이유: Part 2 검토 코드를 게이트 입력(code_pool)으로 승계 — 도메인 게이트 `any_review_code_present` 의 원천 절반. / 방식: 파일 handoff(부재 warn) + 코드 패턴·도메인 귀속 규칙(직접 도메인 ID or 별칭표 해소 — 실패는 검토 2종). / 소비: `review_items[].source_review_code`·`source_domain`.
|
||||
|
||||
### 5.3 Stage 2 로의 하류 연결
|
||||
|
||||
- **`Fact_Ledger_base.json`** (F2 → Stage_2): 최종 사실원장 — 래핑 없는 배열 · 행 29키 · fact_id 연속 경성. 신규 2키(`domain_effects`·`calculation_requests`)는 required 밖(Stage 2 호환 — D-P4-4).
|
||||
- **`stage1_tmp/fact_ledger/fact_ledger_writer_report.json`** (F2 → Stage_2): 게이트별 발화 목록·도메인 효과 커버리지·계산 준비도(operand_state 분포)·보존 등식 실측·`final_sha256` — Stage 2 가 원장 무결성·검토 부담을 읽는 면.
|
||||
- **`quality_gates/stage1_part4_review_handoff.json`** (F0+F2 공동 기록 → Stage_2): OPEN→FINALIZED 상태 게이트. `review_items` 는 소프트 검토 19종 코드 계열.
|
||||
- **`validation_assets/routing/part4_receipt.json`** (F0 단독): 소비자 없음 — 배포 게이트·봉인 셋·게이트 실행 계수(declared/implemented/visualized_str/visualized_unsupported/fired/orphan_rules)·보존 등식·경고의 실측 감사 기록.
|
||||
- 차단 의미론: `blocks_final_drafting: true` 게이트도 **Stage 1 기록을 막지 않는다** — 행은 기록되고 status 가 READY_WITH_REVIEW 로, 차단 표지는 Stage 2 로 전달(정책 `block_semantics` 실물).
|
||||
|
||||
---
|
||||
|
||||
## 6. 특기사항 (검증·설계상 유의점 — 전부 실측)
|
||||
|
||||
1. **무결성 이중 트랙**: `domains/_registry_index.json` 과 `domains/<id>/domain_config.json` ×26 은 `runtime_manifest.json` 에 **미등재**(실측 0건). 훼손 검출은 manifest 가 아니라 Part 1 SG-01 봉인 사슬(`registry_index_sha256` → `config_sha256`)이 맡는다. 반면 gates.json·structure_types.json ×25 는 manifest 등재(25/25) — `_verify_asset` 경로. 두 트랙을 혼동하면 배포 검증 설계가 어긋난다.
|
||||
2. **F2 는 경량 게이트**: F0 의 `assert_deployment()`(모듈 미러 5는 필수 자산 13 리터럴에 포함 — 합집합 검사 집합 13경로, receipt `checked_count` 도 13) 같은 전수 배포 게이트가 없고, 소비하는 정책·최종 스키마·모듈 2종만 개별 sha 검증한다. receipt 도 쓰지 않는다(F0 단독).
|
||||
3. **F1 은 무조건 노드**: 예외 0 이어도 `READY_NO_EXCEPTIONS` 파일을 쓰고 종료한다(task_procedure 주석 실물). 단 F2 는 판정 파일 부재+예외 0 조합도 허용(합성) — F1 완전 실패 시에도 예외 0 케이스는 완주 가능한 이중 안전 설계.
|
||||
4. **F0 의 `ERRORS` 리스트는 선언만 있고 append 지점이 없다** (반환 계약의 자리 채우기 — 실질 오류는 전부 RuntimeError 즉시 중단). F2 의 `try_read_json` 도 정의만 있고 미호출(MEMORY ㊳ 이월: "F2 사문 try_read_json 정리(v.9)").
|
||||
5. **경성 실패 23종 / 소프트 검토 19종**이 정책 `hard_failure_codes`·`review_codes_soft` 에 전수 선언되어 있으며 본 문서 §4 표의 코드와 문자 단위 일치(실측 대조 완료).
|
||||
6. **`Fact_Ledger_base.json` 스키마의 required 는 27키** — 신규 2키는 존재는 검증되나(29 properties·additionalProperties:false) 필수는 아니다.
|
||||
7. 게이트 수량 계약(구현 25 · 가시화 96 = str 90 + boundary 6 · 고아 6)은 YAML 머리 주석과 전략서 승계 값이며, 실행 시 값은 receipt 의 `gate_execution` 계수로 실측 기록된다 — "선언 존재와 실측 비공백을 따로 적는다(§7.5-4)". 가시화 근거: `boundary_or_overlap_detected` 는 정의처(domain_extension.schema·Stage2_handoff_contract)가 배포 트리에 없어 `GATE_CONDITION_KEY_UNSUPPORTED_REVIEW`, str 술어는 코드 이식이 판정식 창작이라 `GATE_PREDICATE_SPEC_UNIMPLEMENTED_REVIEW`(정책 실물).
|
||||
8. **미실주행 상태**(MEMORY ㊳ 이월): 이 YAML 은 정적 검증 2회 왕복 PASS 이나 서버 실주행 전이며, 신설 31자산+매니페스트(434→465)의 서버 배포가 선결이다. F1 실 LLM 품질도 미검증.
|
||||
9. 스테이지 선언의 `llm_provider: openai / llm_model: gpt-4o-2024-08-06` 은 스테이지 기본값일 뿐 실제 LLM 호출 task 는 F1 하나이고 task 레벨 `google / gemini-3.1-flash-lite` 가 우선한다.
|
||||
10. 실행 뿌리 3종 상수는 F0·F2 동일: `ASSET_ROOT = "Default_Agent/"` · `EXECUTION_ROOT = "/tmp/s1"` · 모듈 전개처 `RT = /tmp/s1/_rt` (Part 3 규율 공유 — 새 뿌리 금지).
|
||||
Reference in New Issue
Block a user