release(v4.8.6): Issue #17 item 4 - archive PR #51 reviews and bump the lockstep version

Merge-workspace review: round 1 (@518beda) claude agy grok PASS, codex
NOT PASS (finalize wait measured on the wall clock); fixed in 4c86107.
Round 2 delta (@4c86107) claude agy grok PASS; codex (24b21b9c, after
817d1650 closed deadline_timeout with no report) found R1 closed and no
new defect, but withheld PASS only because its sandbox could not bind
the suite's loopback broker. The same two-file suite run here at
4c86107: 278 passed. Full suite at 518beda on macOS / Python 3.9:
1711 passed / 1 failed / 38 skipped; the failure
(test_issue45_restore, herdr 0.9.3 cwd restore) also fails on main.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VCgu9Fa9iT7TbJUSzdq4Ff
This commit is contained in:
GodopuandClaude Opus 5.5 committed 2026-10-08 01:37:48 +09:00
1 parent 4c86107846
commit 8fde39be33
24 files changed
+735 -26

No files matched your search

+32 -11
View File
@@ -6,8 +6,8 @@
## 📌 현재 버전 개요 (Current Release)
- **프레임워크 버전**: `v4.8.5`
- **최신 릴리스 일시**: 2026-10-04 (KST)
- **프레임워크 버전**: `v4.8.6`
- **최신 릴리스 일시**: 2026-10-08 (KST)
- **기준 브랜치**: `main`
- **핵심 아키텍처**:
- **Terminal 상태 단방향 불변성 (`engine.py`, Issue #6 Phase 1)**: `completed`, `error`, `cancelled` 터미널 상태 진입 후 후속 이벤트나 업데이트에 의한 덮어쓰기를 엄격히 차단(Terminal Immutability). `registry.py close` 서브커맨드 및 fail-closed 조기 종료 도입.
@@ -24,23 +24,44 @@
## 🧭 스킬 패키지 버전 매트릭스 (Skills Version Matrix)
모든 8개 스킬은 YAML frontmatter 메타데이터(`author`, `version`, `platforms`, `environments`) 표준화를 통해 `v4.8.5`로 동기화되어 배포됩니다.
모든 8개 스킬은 YAML frontmatter 메타데이터(`author`, `version`, `platforms`, `environments`) 표준화를 통해 `v4.8.6`로 동기화되어 배포됩니다.
| 스킬명 | 버전 | 역할 및 주요 책임 | 상태 |
| :--- | :---: | :--- | :---: |
| **`multi-agent-mux-create`** | `4.8.5` | 에이전트 세션 신규 생성 및 Herdr 컨테이너 격리 스폰 | ✅ 배포 |
| **`multi-agent-mux-stop`** | `4.8.5` | 대화 UUID 원자적 캡처 및 세션 안전 종료 (Graceful Stop) | ✅ 배포 |
| **`multi-agent-mux-resume`** | `4.8.5` | 온디스크 대화 컨텍스트 기반 Tier-1 초고속 세션 복원 | ✅ 배포 |
| **`multi-agent-mux-status`** | `4.8.5` | 실시간 Herdr 세션 및 레지스트리 드리프트 스냅샷 조회 | ✅ 배포 |
| **`multi-agent-mux-monitor`** | `4.8.5` | YAML ↔ 런타임 상태 간 자율 조정자 (Reconciler Loop) | ✅ 배포 |
| **`multi-agent-mux-delegate-job`** | `4.8.5` | MQTT 이벤트 채널 기반 비동기 단위 작업 위임 | ✅ 배포 |
| **`multi-agent-mux-loop`** | `4.8.5` | Planner-Creator-Reviewer 3자 자율 계획·실행·피어리뷰 루프 | ✅ 배포 |
| **`multi-agent-mux-orc-onboard`** | `4.8.5` | 오케스트레이터 UUID 격리 등록 및 서브 세션 오염 방지 | ✅ 배포 |
| **`multi-agent-mux-create`** | `4.8.6` | 에이전트 세션 신규 생성 및 Herdr 컨테이너 격리 스폰 | ✅ 배포 |
| **`multi-agent-mux-stop`** | `4.8.6` | 대화 UUID 원자적 캡처 및 세션 안전 종료 (Graceful Stop) | ✅ 배포 |
| **`multi-agent-mux-resume`** | `4.8.6` | 온디스크 대화 컨텍스트 기반 Tier-1 초고속 세션 복원 | ✅ 배포 |
| **`multi-agent-mux-status`** | `4.8.6` | 실시간 Herdr 세션 및 레지스트리 드리프트 스냅샷 조회 | ✅ 배포 |
| **`multi-agent-mux-monitor`** | `4.8.6` | YAML ↔ 런타임 상태 간 자율 조정자 (Reconciler Loop) | ✅ 배포 |
| **`multi-agent-mux-delegate-job`** | `4.8.6` | MQTT 이벤트 채널 기반 비동기 단위 작업 위임 | ✅ 배포 |
| **`multi-agent-mux-loop`** | `4.8.6` | Planner-Creator-Reviewer 3자 자율 계획·실행·피어리뷰 루프 | ✅ 배포 |
| **`multi-agent-mux-orc-onboard`** | `4.8.6` | 오케스트레이터 UUID 격리 등록 및 서브 세션 오염 방지 | ✅ 배포 |
---
## 📋 버전별 상세 변경 내역 (Changelog)
### 🚀 `v4.8.6` — Issue #17 항목 4: delegate-job 래퍼의 판정이 Python 으로 옮겨진다 (2026-10-08)
> **패치 (PATCH Release)**: 동작 변화 없는 리팩터링. 래퍼(bash)의 판정 로직을 `lib_py/delegation/wrapper.py` 로 옮기고, #26 정수 규칙의 두 구현을 `lib_py/ints.py` 하나로 합쳤다. 종료 코드·라벨·레지스트리 기록·이벤트·멈춤 감시 동작은 같다. #17 의 나머지 항목은 열린 채 남는다.
#### 🌟 주요 개선 사항
1. **판정의 이동 (`lib_py/delegation/wrapper.py`)**: `finalize_unfinished`(시계 선택, 디스크 heartbeat 유예, 브로커 재관측, `wall_clock_timeout`/`deadline_timeout`/`cancelled` 라벨, close 와 이벤트) → `finalize-begin`/`finalize-end`, `start_stall_watch` 의 감시 여부 → `stall-watch`, `_map_sub_rc` → `sub-status`, `_rc_for`(+`MAM_DELEGATE_FAIL_CLOSED`) → `exit-code`, 구독자 조기 종료 검사 → `subscriber-up`, `cmd_wait` 의 rc 정규화 → `wait-rc`. 래퍼는 `_decide` 하나로 부르고 서브커맨드의 종료 코드나 한 줄 출력에만 분기한다.
2. **정수 규칙 하나 (`lib_py/ints.py`)**: `lib_int.sh` 의 `mam_int`/`mam_int_knob` 와 runner 의 `_positive_int` 가 같은 구현(`positive_int`, `knob`)을 부른다.
3. **bash 에 남는 것**: spawn·wait·kill, 키 주입, 시그널 정리, 진단용 herdr busy 확인 하나, CLI 호환 층.
4. **finalizer 의 수명 (PR #41 계약과 같게)**: `finalize-end` 는 `--watch-pid "$$"` 를 받아 두 대기 내내와 close·이벤트 직전에 래퍼를 확인하고, 래퍼가 없으면 닫지도 발행하지도 않고 끝난다. 종료했지만 회수되지 않은 래퍼(좀비, `ps -o stat=` 의 Z)도 없는 것으로 본다.
5. **리뷰 R1 (병합 워크스페이스, codex)**: `finalize-end` 의 대기(`_sleep`)가 벽시계로 길이를 재서, 대기 중 시계가 뒤로 가면 bash `sleep N` 과 달리 늘어났다(10 초 뒤로 → 1 초 대기가 11 초). 대기 길이는 monotonic 시계로 재고 마감 판정은 벽시계에 남긴다(4c86107, 회귀 테스트 `test_u_a_wait_is_not_stretched_by_a_wall_clock_step_back`).
#### ✅ 품질 검증
- **옛 bash 대 새 래퍼 (`tests/test_issue17_item4_decisions.py`)**: 7209750 의 bash 함수를 그대로 복사한 `tests/data/issue17_item4_old_decisions.sh` 와 새 래퍼를 같은 입력에 돌려 출력·`FINAL_JOB_STATUS`·레지스트리/발행 호출을 비교한다(각 유예 중 TERM, 회수 없는 TERM 포함). 판정표 전체·잘못된 입력·경계값 단위 테스트.
- **독립 대조 (오케스트레이터)**: 7209750 대 518beda 실제 CLI, 오프라인으로 179 경우 모두 종료 코드·출력 일치(`mam_int`/`mam_int_knob` 19 입력, `submit --dry-run` 정수 플래그 6 개 × 19 입력, 8 상태의 레코드에 대한 `wait`).
- **리뷰 (병합 워크스페이스, 네 리뷰어)**: 1회차(@518beda) claude·agy·grok PASS, codex NOT PASS(R1 위 5). 4c86107 에서 수정. 2회차 델타(@4c86107) claude·agy·grok PASS. codex 는 첫 잡(817d1650)이 판정 없이 `deadline_timeout` 으로 닫혀 다시 돌렸고(24b21b9c), 그 리포트는 "R1 닫힘, 새 코드 결함 없음"이지만 자기 샌드박스가 루프백 브로커의 bind 를 막아 필수 두 파일 스위트(278 건)를 실행하지 못했다는 이유로만 NOT PASS 를 냈다. 같은 스위트를 병합 워크스페이스에서 4c86107 로 돌려 **278 passed** 를 확인하고 병합했다. 리포트는 `.agents/reports/<session>/`.
- **전체 스위트 (병합 워크스페이스, macOS·Python 3.9, MQTT 환경변수 없이)**: 518beda **1711 passed / 1 failed / 38 skipped**(72 분). 실패한 `tests/test_issue45_restore.py::test_b_only_the_resumed_sessions_restored_shell_is_closed` 는 main(7209750)에서도 실패한다: herdr 0.9.3 은 지워진 cwd 의 pane 을 `$HOME` 이 아니라 원래 경로로 복원해 테스트의 전제가 바뀌었다(이 PR 과 무관). 4c86107 의 델타는 관련 테스트 321 passed.
#### 📝 후속
- herdr 0.9.3 에 맞춘 `test_issue45_restore` 의 cwd 전제 수정.
- 래퍼 모듈이 패키지 경유로 paho 를 import 하는데 문서는 "stdlib only" 라고 한다; `_decide` 실패 시 `exit ""` 가 255 가 된다(`${rc:-1}` 제안); `lib_int.sh` 가 PATH 의 `python3` 를 쓴다; PR 본문은 0.2 초, 코드는 0.5 초 간격(claude 1회차 비차단 지적 N1·N2·N3·N5).
### 🚀 `v4.8.5` — Issue #45 A·B: 재기동된 격리 서버가 저장된 에이전트를 다시 띄우지 않고, resume 이 복원된 빈 셸을 닫는다 (2026-10-04)
> **패치 (PATCH Release)**: 격리 herdr 서버가 에이전트를 정지하지 않은 채 꺼졌다 다시 뜨면, herdr 가 저장 레이아웃을 복원하며 에이전트를 자기 재개 명령으로(권한 플래그 없이, 지운 에이전트까지) 다시 띄웠다. herdr 0.9.1 의 `[session] resume_agents_on_restore = false` 로 MAM 이 띄우는 서버에서 이를 끈다(A). 끈 뒤에도 pane 은 빈 셸로 복원되므로, resume 이 그 세션 자신의 빈 셸을 닫는다(B). 이슈의 제안 2·4 는 범위 밖.