.mam.env 1행이 AGENT_SESSIONS_YAML= .mam/agent-sessions.yaml(= 뒤 공백)일 때:
Python 쪽(mqtt_common.py:96-106_parse_env_file)은 값을 strip 해서 .mam/agent-sessions.yaml 로 정상 처리한다.
delegate-job 래퍼는 이 파일을 bash 로 source 한다(multi-agent-mux-delegate-job:21-32, TARGET_ENV). bash 는 이 줄을 "빈 AGENT_SESSIONS_YAML 을 붙여 .mam/agent-sessions.yaml 을 명령으로 실행"으로 해석한다.
결과: .mam.env: line 1: .mam/agent-sessions.yaml: Permission denied 후 래퍼가 즉시 종료(--help 도 출력되지 않음).
YAML 파일에 실행 권한이 있었다면 실제로 실행됐을 것이다.
같은 설정 파일을 두 로더가 다른 문법으로 읽기 때문에, 한쪽에서 정상인 설정이 다른 쪽에서 치명적이다. source 는 .mam.env 안의 $(...) 등 임의 셸도 실행한다.
제안
래퍼도 source 대신 Python 로더와 같은 규칙의 KEY=VALUE 파서로 읽는다(주석·빈 줄 무시, 따옴표 제거, 값 앞뒤 공백 제거, 셸 해석 없음).
최소한 로드 전에 각 행을 ^[A-Za-z_][A-Za-z0-9_]*= 형식으로 검증하고, 어긋나는 행은 경고 후 건너뛴다.
.mam.env.example 에 형식 규칙(= 앞뒤 공백 금지, 셸 문법 미지원)을 명시한다.
환경 정보
main 1134d74 (v4.6.0), 2026-09-14 Linux 호스트에서 관측
## 증상
`.mam.env` 1행이 `AGENT_SESSIONS_YAML= .mam/agent-sessions.yaml`(`=` 뒤 공백)일 때:
- Python 쪽(`mqtt_common.py:96-106` `_parse_env_file`)은 값을 strip 해서 `.mam/agent-sessions.yaml` 로 정상 처리한다.
- delegate-job 래퍼는 이 파일을 bash 로 `source` 한다(`multi-agent-mux-delegate-job:21-32`, `TARGET_ENV`). bash 는 이 줄을 "빈 `AGENT_SESSIONS_YAML` 을 붙여 `.mam/agent-sessions.yaml` 을 **명령으로 실행**"으로 해석한다.
- 결과: `.mam.env: line 1: .mam/agent-sessions.yaml: Permission denied` 후 래퍼가 즉시 종료(`--help` 도 출력되지 않음).
- YAML 파일에 실행 권한이 있었다면 실제로 실행됐을 것이다.
같은 설정 파일을 두 로더가 다른 문법으로 읽기 때문에, 한쪽에서 정상인 설정이 다른 쪽에서 치명적이다. `source` 는 `.mam.env` 안의 `$(...)` 등 임의 셸도 실행한다.
## 제안
1. 래퍼도 `source` 대신 Python 로더와 같은 규칙의 `KEY=VALUE` 파서로 읽는다(주석·빈 줄 무시, 따옴표 제거, 값 앞뒤 공백 제거, 셸 해석 없음).
2. 최소한 로드 전에 각 행을 `^[A-Za-z_][A-Za-z0-9_]*=` 형식으로 검증하고, 어긋나는 행은 경고 후 건너뛴다.
3. `.mam.env.example` 에 형식 규칙(`=` 앞뒤 공백 금지, 셸 문법 미지원)을 명시한다.
## 환경 정보
- main `1134d74` (v4.6.0), 2026-09-14 Linux 호스트에서 관측
PR #43 병합(v4.8.1, 0051fd6)으로 닫힙니다. .mam.env 는 이제 lib_py/delegation/envfile.py 한 곳이 읽습니다(셸 해석 없음, 환경변수 우선, 형식이 어긋난 줄·export·NUL·bash 자체 변수는 줄 번호 경고 후 건너뜀, 존재하지만 읽을 수 없는 파일은 래퍼·Python 모두 오류). 이슈의 재현(KEY= value 로 래퍼 즉시 종료, 값 속 $(...) 실행)은 실제 래퍼로 수정 전후를 확인했습니다. 셸이 env 파일을 source 하던 곳은 이슈 작업 지시의 "세 곳"이 아니라 delegate-job 래퍼 한 곳이었습니다. 리뷰 경과와 후속 목록은 PR #43 코멘트에 있습니다.
PR #43 병합(v4.8.1, 0051fd6)으로 닫힙니다. `.mam.env` 는 이제 `lib_py/delegation/envfile.py` 한 곳이 읽습니다(셸 해석 없음, 환경변수 우선, 형식이 어긋난 줄·`export`·NUL·bash 자체 변수는 줄 번호 경고 후 건너뜀, 존재하지만 읽을 수 없는 파일은 래퍼·Python 모두 오류). 이슈의 재현(`KEY= value` 로 래퍼 즉시 종료, 값 속 `$(...)` 실행)은 실제 래퍼로 수정 전후를 확인했습니다. 셸이 env 파일을 `source` 하던 곳은 이슈 작업 지시의 "세 곳"이 아니라 delegate-job 래퍼 한 곳이었습니다. 리뷰 경과와 후속 목록은 PR #43 코멘트에 있습니다.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
증상
.mam.env1행이AGENT_SESSIONS_YAML= .mam/agent-sessions.yaml(=뒤 공백)일 때:mqtt_common.py:96-106_parse_env_file)은 값을 strip 해서.mam/agent-sessions.yaml로 정상 처리한다.source한다(multi-agent-mux-delegate-job:21-32,TARGET_ENV). bash 는 이 줄을 "빈AGENT_SESSIONS_YAML을 붙여.mam/agent-sessions.yaml을 명령으로 실행"으로 해석한다..mam.env: line 1: .mam/agent-sessions.yaml: Permission denied후 래퍼가 즉시 종료(--help도 출력되지 않음).같은 설정 파일을 두 로더가 다른 문법으로 읽기 때문에, 한쪽에서 정상인 설정이 다른 쪽에서 치명적이다.
source는.mam.env안의$(...)등 임의 셸도 실행한다.제안
source대신 Python 로더와 같은 규칙의KEY=VALUE파서로 읽는다(주석·빈 줄 무시, 따옴표 제거, 값 앞뒤 공백 제거, 셸 해석 없음).^[A-Za-z_][A-Za-z0-9_]*=형식으로 검증하고, 어긋나는 행은 경고 후 건너뛴다..mam.env.example에 형식 규칙(=앞뒤 공백 금지, 셸 문법 미지원)을 명시한다.환경 정보
1134d74(v4.6.0), 2026-09-14 Linux 호스트에서 관측PR #43 병합(v4.8.1,
0051fd6)으로 닫힙니다..mam.env는 이제lib_py/delegation/envfile.py한 곳이 읽습니다(셸 해석 없음, 환경변수 우선, 형식이 어긋난 줄·export·NUL·bash 자체 변수는 줄 번호 경고 후 건너뜀, 존재하지만 읽을 수 없는 파일은 래퍼·Python 모두 오류). 이슈의 재현(KEY= value로 래퍼 즉시 종료, 값 속$(...)실행)은 실제 래퍼로 수정 전후를 확인했습니다. 셸이 env 파일을source하던 곳은 이슈 작업 지시의 "세 곳"이 아니라 delegate-job 래퍼 한 곳이었습니다. 리뷰 경과와 후속 목록은 PR #43 코멘트에 있습니다.