release(v4.8.1): bump framework and eight skills to 4.8.1 in lockstep; archive PR #43 reviews (two rounds)
Issue #26: one .mam.env parser for the wrapper and the Python tools, decimal integer knobs, tests on a local MQTT broker. Merge-workspace review: round 1 (@b58edac) claude agy PASS, codex NOT PASS (R1-R4), grok no verdict (its late report, archived as report-c9ed5b14.md, found R1 too); round 2 (@0eec795) 4/4 PASS. Reports and round-2 identity sidecars go to .agents/reports/<session>/. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VCgu9Fa9iT7TbJUSzdq4Ff
This commit is contained in:
1 parent
0eec795cd1
commit
2e90c809d3
28 files changed
+922
-26
No files matched your search
@@ -0,0 +1,70 @@
|
||||
# PR #43 2회차 리뷰 — job 95a22045
|
||||
|
||||
판정: **PASS**. 새 커밋 `0eec795`에서 이전 R1~R4가 모두 수정됐다. 해당 수정 범위에서 새 반려 사유는 발견하지 못했다.
|
||||
|
||||
## 검증 대상과 범위
|
||||
|
||||
- 검토 diff: `b58edace115205500c1197d9ce59cb5c6d724893..0eec795cd1b46f7a28b9a1cc87ef8577619a731f` (브리프의 codex 지시대로 수정 커밋만 검토).
|
||||
- loop: `loop-20261001T140030Z-34381f`
|
||||
- PR base: `e1eb22bd59ce825e3a22e86433c30f7ffd833810`
|
||||
- head: `0eec795cd1b46f7a28b9a1cc87ef8577619a731f`
|
||||
- tree: `584eac551f880232896b898cc43156f28ae1bacb`
|
||||
- 검증 cwd: `/var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20261001T140030Z-34381f/1`
|
||||
- Python: `/Users/godopu16/PuKi/laa/canary_projects/multi-agent-mux-wt/pr-43/.venv/bin/python`
|
||||
|
||||
HEAD/tree가 브리프와 일치함을 확인했다. 코드와 브랜치는 변경하지 않았다. 실제 `.mam.env`를 읽거나 export하지 않았으며, 테스트·탐침은 합성 설정과 격리된 임시 HOME/registry/log 디렉터리를 사용했다. MQTT 구현과 purge 기준 비교는 이번 수정 커밋에 변경이 없어 전체 재리뷰하지 않았다. 다만 지정된 MQTT/liveness 회귀 테스트는 실행했다.
|
||||
|
||||
## 이전 지적의 종결 여부
|
||||
|
||||
| 지적 | 판정 | 수정 근거와 확인 결과 |
|
||||
|---|---|---|
|
||||
| R1: 읽을 수 없는 설정 파일에서 wrapper가 rc 0으로 계속 진행 | **종결** | `lib_py/delegation/envfile.py:60`은 전체 읽기·디코딩 실패를 `EnvFileError`로 올리고, `:107`은 CLI 오류 메시지와 rc 1로 바꾼다. wrapper `:44`도 rc 1로 종료한다. 이전 chmod-000 탐침이 이제 오류와 rc 1을 반환하며 usage를 출력하지 않았다. Python 로더 및 실제 `publish_event.py`에서도 권한/UTF-8 오류를 각각 검증했다. |
|
||||
| R2: 로케일에 따른 Bash/Python 정수 해석 불일치 | **종결** | `lib.sh:2349`–`:2351`은 ASCII 공백 6개와 숫자 10개를 명시한다. 이전 U+2003 예산 탐침은 wrapper와 runner 모두 경고 후 3600으로 일치했다. 별도 24개 비교(ASCII 공백 6종, Unicode 공백/숫자, 선행 0; C와 en_US.UTF-8)도 모두 일치했다. `test_issue26_ints.py:190`의 회귀 검증은 helper뿐 아니라 실제 wrapper 등록과 runner budget을 비교한다. |
|
||||
| R3: 명시적 빈 정수 플래그의 검증 우회 | **종결** | wrapper `:167`, `:175`–`:179`가 명시된 플래그를 기록하고 `:201`이 빈 값도 검증으로 보낸다. 이전 실제 `submit --dry-run --idle-timeout ''` 탐침은 이제 rc 1, 해당 플래그 오류, 잡 미등록이다. 테스트의 다섯 플래그 invalid 표에도 빈 문자열이 추가됐다(`test_issue26_ints.py:229`). 미지정 idle timeout의 파생 기본값은 유지된다. |
|
||||
| R4: NUL 값이 Python을 종료시키고 Bash에서는 다른 값이 됨 | **종결** | `envfile.py:66`에서 환경 대입·shell 출력 전에 NUL 줄을 공통으로 건너뛴다. 이전 `GOOD=ok / VALUE=left<NUL>right / AFTER=yes` 탐침에서 두 실제 로더 모두 rc 0, VALUE 미설정, 앞뒤 값 보존, 줄 번호 경고를 확인했다. 값 문자열은 경고에 노출되지 않았다. |
|
||||
|
||||
위 표의 `lib.sh`, `lib_py/...`는 `.agents/skills/` 아래이며 wrapper는 `.agents/skills/multi-agent-mux-delegate-job/multi-agent-mux-delegate-job`이다. 테스트 경로는 `tests/` 아래다.
|
||||
|
||||
사용자 문서 보완도 확인했다. `.mam.env.example:14`–`:26`에 KEY=VALUE 규칙, 확장 없음, 절대경로 사용, inline `#`의 의미, export/예약 변수/NUL 거부, env 우선 및 전체 읽기 실패의 오류 처리가 명시됐다. 기존의 파서 규칙·우선순위 이행 설명 부족에 대한 권고는 해소됐다. env 우선 정책과 eval의 key 검증/shlex 인용은 이번 커밋에서 바뀌지 않았다.
|
||||
|
||||
## Python 진입점의 읽기 실패 처리에 대한 의견
|
||||
|
||||
**예외로 멈추는 현재 방향에 동의한다.** 존재하는 설정 파일을 읽거나 디코딩하지 못한 경우는 설정이 없는 경우와 다르다. 경고 후 계속하면 broker/auth/dispatch 설정이 누락된 상태에서 다른 기본 연결을 사용하거나 잘못된 제어 평면으로 이벤트를 보낼 수 있다. `EnvFileError`는 파일 경로와 오류 종류만 포함하고 `from None`으로 원본 디코딩 예외를 숨기며, 파일 전체를 파싱하기 전에 환경 대입이 일어나지 않는다(`envfile.py:57`, `:89`). 개별 잘못된 줄을 건너뛰는 규칙과 전체 파일 실패를 구분한 것이 적절하다.
|
||||
|
||||
실제 `publish_event.main`은 `publish_event.py:337`에서 설정을 로드한 뒤 잡 조회·보고서 finalize·발행으로 진행한다. 이번 탐침은 명시적 합성 broker 환경변수가 이미 있어도 깨진 파일의 오류가 가려지지 않고, CLI가 rc 1을 반환하며 임시 registry를 생성하지 않는 것을 확인했다. 권한 오류와 잘못된 UTF-8 모두 동일했다. 설정 값은 stderr에 노출되지 않았다.
|
||||
|
||||
운영상 새 publisher 또는 heartbeat 프로세스는 잘못된 파일 때문에 시작하지 못할 수 있고, 그 결과 열린 잡이 liveness timeout에 도달할 수 있다. 이는 설정 실패를 성공적인 이벤트 전달로 오인하지 않도록 하는 의도된 실패다. 파일 권한/인코딩을 복구하고 실패한 명령을 다시 실행해야 하며, 자동으로 기본 broker로 우회하는 동작은 권하지 않는다. 이미 설정을 로드한 장기 실행 프로세스는 once-per-process 방식(`mqtt_common.py:109`)에 따라 파일을 매 이벤트마다 다시 읽지 않는다.
|
||||
|
||||
현재 Python CLI의 traceback은 설정 실패를 드러내고 nonzero를 반환하므로 기능상 수용 가능하다. 향후 CLI 경계에서 `EnvFileError`를 잡아 짧은 오류 메시지와 rc 1로 바꾸면 사용자 경험은 좋아지겠지만, 경고만 남기고 실행을 계속하는 방식으로 바꾸면 안 된다. 이 표현 개선은 이번 PASS의 선행 조건이 아니다.
|
||||
|
||||
## 설계 경계와 범위 제한
|
||||
|
||||
이 수정 커밋은 새 업무 판단이나 제어 평면 분기를 Bash에 추가하지 않는다. 기존 정수 helper의 문자 집합을 고정하고 명시적 CLI 입력 여부를 기록한다. 정수 정규화가 Bash/Python 두 구현으로 남는 구조적 중복은 여전하므로 #17/#42의 Python 단일화 후속 작업 대상이다. 다만 1회차 R2에서 제시한 최소 수정 방향(명시적 ASCII와 실제 두 경로의 비교 검증)을 충족하므로 이를 새로운 반려 조건으로 확대하지 않는다. 파일 문법·NUL·전체 읽기 실패 판정은 공통 Python 모듈에 있다.
|
||||
|
||||
로컬 MQTT 브로커와 기존 22개 전환 테스트의 구현은 이번 커밋에서 변경되지 않았다. purge 기준 실패 주장 역시 이번 검토 범위 밖이며, 1회차의 base/head 각 23건 통과 결과를 새 실행 결과로 재표기하지 않는다. 전체 스위트는 지시대로 오케스트레이터에 맡겼다.
|
||||
|
||||
## 검증 결과
|
||||
|
||||
지정 테스트: **174 passed in 210.31s (3분 30초), rc 0, skip 없음**. 로그는 `/tmp/95a22045-selected.log`.
|
||||
|
||||
검증 cwd에서 실행한 명령:
|
||||
|
||||
```bash
|
||||
AGENT_PYTHON_BIN=/Users/godopu16/PuKi/laa/canary_projects/multi-agent-mux-wt/pr-43/.venv/bin/python \
|
||||
PYTHONDONTWRITEBYTECODE=1 \
|
||||
/Users/godopu16/PuKi/laa/canary_projects/multi-agent-mux-wt/pr-43/.venv/bin/python \
|
||||
-m pytest -p no:cacheprovider -q --basetemp=/tmp/95a22045-selected \
|
||||
tests/test_issue26_envfile.py tests/test_issue26_ints.py tests/test_local_mqtt.py \
|
||||
tests/test_issue18_liveness_contract.py tests/test_tier1_unit.py
|
||||
```
|
||||
|
||||
검증 종료 후에도 HEAD/tree는 위 identity 그대로이며 `git status --short`와 `git diff --quiet`는 clean이었다.
|
||||
|
||||
- `git diff --check b58edac 0eec795`: 통과.
|
||||
- 변경 shell 파일의 `bash -n`, 변경 Python 파일 AST syntax 검사: 통과.
|
||||
- 독립 탐침: `/tmp/95a22045-probes.py`, 출력 `/tmp/95a22045-probes.log`.
|
||||
- 이전 실제 wrapper/runner 탐침 재실행 결과: `/tmp/95a22045-reprobe.log`.
|
||||
|
||||
독립 탐침은 검증 cwd에서 `PYTHONDONTWRITEBYTECODE=1 <위 Python> /tmp/95a22045-probes.py "$PWD"`로 재실행할 수 있다. 합성 파일, uuid4 잡 식별자, 자체 임시 디렉터리만 사용한다.
|
||||
|
||||
[VERDICT: PASS]
|
||||
Reference in new issue
Block a user