Skip to content

[feat] 리뷰어가 소스 문자열 기반 불변식 테스트를 약한 가드로 판정하게 한다 - #596

Merged
unohee merged 6 commits into
mainfrom
swarm/AGT-4045-feat
Sep 9, 2026
Merged

unohee merged 6 commits into
mainfrom
swarm/AGT-4045-feat

Conversation

@unohee

@unohee unohee commented Sep 9, 2026

Copy link
Copy Markdown
Collaborator

Summary

TL;DR

워커가 inspect.getsource() 로 금지 토큰을 찾는 테스트를 "단방향 불변식 검증"으로 제출했고 리뷰어가 그대로 승인했다. 그 테스트는 헬퍼를 하나 끼우면 통과하고, 금지 토큰 5개 중 4개는 코드베이스에 존재하지도 않는 이름이다. 동작을 검증하지 않는 가드가 불변식으로 계상됐다.

Investigation (실측)

cgf-portal apps/pipelines/tests/test_a3_notion_job.py (PR #163, AX-1013):

def test_notion_job_is_one_way_and_has_no_sheet_write_path():
    source = inspect.getsource(jobs_module.a3_notion_cards)
    assert "A3SheetClient.from_settings" in source
    forbidden = ("write_values", "update_values", "append_values", "append_rows", "import_notion")
    assert all(token not in source for token in forbidden)

실측 3가지:

확인 결과
실제 쓰기 API A3SheetClient 의 공개 메서드는 read_values · append_rows 둘뿐
금지 토큰 유효성 5개 중 append_rows 만 실재. write_values·update_values·append_values·import_notion 은 코드베이스에 없는 이름
우회 가능성 a3_notion_cards 본문 텍스트만 검사하므로, 쓰기를 헬퍼 함수로 한 단계 옮기면 그대로 통과

리뷰어 판정은 이랬다:

:371-381은 job 소스의 Sheet write/import 경로 부재를 검사합니다.

관측은 맞다. 다만 그것이 무엇을 보장하지 못하는지가 판정에 없다. 이번 건은 직접 호출을 잡으므로 무해했지만, 이 형태가 "불변식을 테스트로 고정했다"로 보고되면 사람은 실제보다 강한 보장을 가정한다.

참고로 같은 PR 의 나머지 테스트는 강했다 — 뮤테이션 3종(preserve 제거·created 단락 제거·재시도→격리 전환)을 전부 잡았다. 문제는 이 한 형태다.

Approach

리뷰어 체크리스트에 항목을 하나 넣는다: 테스트가 동작이 아니라 소스 텍스트를 검사하면 약한 가드로 표시한다.

탐지 신호(언어별로 이름만 다르다): inspect.getsource · __code__ · readFile(__filename) · 자기 소스에 대한 정규식/부분문자열 검사.

승인을 막자는 게 아니다 — 이런 테스트도 쓸모가 있다(직접 호출 금지, 린트 성격). 요구하는 것은 판정에 한계를 적는 것이다:

  • 무엇을 잡고 무엇을 못 잡는가 (여기서는 "직접 호출은 잡고, 헬퍼 경유는 못 잡는다")
  • 검사하는 토큰이 실제 API 이름인가 — 존재하지 않는 이름은 커버리지 착시를 만든다
  • 같은 불변식을 동작으로 검증할 값싼 방법이 있는가 (여기서는 mock sheet client 에 append_rows 를 두고 호출되면 실패시키기)

Completion criteria

  • 리뷰어 프롬프트/체크리스트에 소스 텍스트 검사 탐지 항목이 en/ko 로 들어간다
  • 해당 패턴이 있으면 승인 판정에 한계 1줄이 포함된다 (무엇을 못 잡는지)
  • 검사 토큰이 코드베이스에 실재하는 이름인지 확인할 것을 요구한다
  • 픽스처 검증: inspect.getsource 기반 테스트가 든 diff 를 리뷰시키면 판정에 한계 문장이 나온다
  • 동작 기반 테스트만 있는 diff 에는 그 문장이 붙지 않는다 (과잉 적용 방지)

DoD

"불변식을 테스트로 고정했다"는 보고를 사람이 액면가로 읽어도 안전하다.

메타데이터 검토

  • label: N/A
  • milestone: N/A
  • blocker: 없음
  • sub-issues: 불필요
  • estimate: 1~2시간
  • priority: Medium — 이번엔 무해했다. 다만 이 형태가 반복되면 커버리지 지표가 조용히 부풀려진다

근거: 2026-08-28 cgf-portal PR #163 감사. 같은 PR 의 다른 테스트 3종은 뮤테이션을 전부 잡았다.

⚠️ File overlap with in-flight work

This branch changes files that other open PRs / active branches also touch. Coordinate before merging to avoid divergent parallel edits (INT-2388 #3):

Linear

Closes AGT-4045


🤖 Generated with OpenSwarm

@unohee

unohee commented Sep 9, 2026

Copy link
Copy Markdown
Collaborator Author

🔍 Fresh review of af54d44 (openswarm pr review --fresh)

✓ Decision: APPROVE
리뷰어 체크리스트에 source-string invariant test 약한 가드 탐지 항목을 추가. en/ko 양국 언어 + change/direct 양 모드 배선 완료, 렌더링 테스트 커버. package-lock.json 변경은 npm 자동 업데이트로 정상. 논리 오류, 회귀, 미배선 없음.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant