Skip to content

fix(gateway): 결재 텔레그램 직통 봇 폴백 — 폴러 callback_query 공용 처리로 죽은 버튼 사유 해소 - #307

Merged
beyondworks merged 2 commits into
mainfrom
claude/focused-lehmann-0e826d
Aug 27, 2026
Merged

fix(gateway): 결재 텔레그램 직통 봇 폴백 — 폴러 callback_query 공용 처리로 죽은 버튼 사유 해소#307
beyondworks merged 2 commits into
mainfrom
claude/focused-lehmann-0e826d

Conversation

@beyondworks

Copy link
Copy Markdown
Owner

배경

PR #305가 브리핑 3종(routine/job/crewmail)에 직통 봇 폴백을 도입하면서 결재는 의도적으로 제외했습니다 — 직통 봇 폴러가 callback_query를 처리하지 않아 인라인 버튼이 죽은 버튼이 되기 때문(분리 검수 LOW-2). 이 PR이 그 사유 자체를 제거하고 결재를 같은 폴백 계열에 합류시킵니다.

변경

  1. 직통 봇 폴러의 결재 버튼 처리 — 회사 게이트웨이 폴러의 콜백 블록을 handleApprovalCallback 공용 함수로 추출해 두 폴러가 같은 원천을 씁니다(한쪽만 고쳐지는 드리프트 방지). 인가는 페어링 채팅(ownerChat) + 페어링 사장(ownerId) 본인만.
  2. 결재 푸시 목적지 폴백pushEvent의 approval 분기가 브리핑과 같은 telegramBriefingDest 판정을 지납니다(게이트웨이 우선 → 담당 크루 item.slug의 직통 봇, 음소거 존중). 폴백 반환에 botSlug를 실어 setApprovalMeta로 카드 귀속을 저장하고, 해소 편집(approval_resolved)·후속 배달(approval_followup)이 그 봇 토큰으로 같은 카드를 다룹니다(approvalCardToken 단일 판정, 게이트웨이 카드의 enabled 게이트 LOW-4는 유지).
  3. 텍스트 결재 즉시 처리 — 직통 봇의 "승인 ap-xxx"는 큐를 거치지 않고 폴러가 즉시 처리합니다. 기존에도 runAgentTurn 머리에서 처리는 됐지만 큐 경유라, 결재 대기(권한 게이트) 턴들이 워커 슬롯(동시 2)을 점유하면 승인이 큐에 갇히는 교착이 가능했습니다 — 슬랙 approval 분기·인라인 버튼과 같은 위상으로 격상.

검증

  • 전체 스위트 961 pass / 0 fail (신규 행동 테스트 5건: 카드 폴백+botSlug 귀속, 콜백 인가(타인 무시/사장 확정), 폴러 실구동(fetch 가로채 callback_query → 결재 확정), 해소 편집의 봇 토큰 귀속, protocol approval 판정)
  • 변이 배터리 4종(목적지 판정 null &&"·인가 무력화·봇 귀속 무력화·폴러 분기 제거) 각각 정확히 해당 테스트 1건 red 실측 후 복원
  • next build 통과. 라이브 텔레그램 미검증 — 실봇 클릭 검증은 상주 반영 후(정직 표기)

PR #306 처리 권고

#306(결재 비대칭 정직 표기)은 이 PR이 비대칭 자체를 없애므로 머지하지 않고 닫는 것을 권고합니다. 안내문 문구("직통 봇으로는 결재 요청이 오지 않습니다")가 이 PR 이후 모든 상태에서 거짓이 됩니다. 담당 크루에 직통 봇이 없는 경우 결재가 텔레그램에 못 가는 잔여 상태는 브리핑 3종과 동일한 조건이라 별도 안내 없이 대칭입니다.

🤖 Generated with Claude Code

beyondworks and others added 2 commits August 27, 2026 17:59
- 크루 직통 봇 폴러(startAgentTelegram)가 callback_query를 처리한다 — 회사
  게이트웨이와 공용 handleApprovalCallback(단일 원천, 페어링 사장·페어링 채팅만)
- 결재 푸시 목적지를 브리핑과 같은 telegramBriefingDest 판정으로 합류 —
  게이트웨이 우선, 못 보내면 담당 크루(item.slug)의 직통 봇 폴백. 음소거 존중
- 폴백 카드의 봇 귀속(tg.botSlug)을 setApprovalMeta로 저장 — 해소 편집
  (approval_resolved)·후속 배달(approval_followup)이 같은 봇 토큰을 쓴다
  (approvalCardToken 단일 판정, 게이트웨이 카드의 enabled 게이트 LOW-4 유지)
- 직통 봇 텍스트 결재("승인 ap-xxx")는 큐 미경유 즉시 처리 — 결재 대기 턴이
  워커 슬롯을 점유해도 승인이 뚫린다(슬랙 approval 분기와 같은 위상)
- 행동 테스트 5건(카드 폴백·콜백 인가·폴러 구동·해소 귀속) + 변이 4종 red 실측

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- handleApprovalCallback: chatId·cq.message.chat 명시 요구 — 미페어링 cfg +
  메시지 없는 콜백에서 String(undefined) 동등으로 게이트가 열리고 예외가 폴러
  offset을 영구 오염시키던 fail-open 차단(검수 MEDIUM-1 실측)
- 콜백 테스트: 페어링 채팅 밖·미페어링 fail-open 케이스 추가(MEDIUM-2)
- 폴러 텍스트 결재 행동 테스트: 큐 미경유 즉시 확정 + 잡 미적재(MEDIUM-3)
- 후속 배달 행동 테스트: botSlug 봇 토큰·enabled 게이트(LOW-4) — 소스 앵커 대체(MEDIUM-4)
- 무음 실패 로그 2건(후속 미배달·결재 회신 발송 실패, LOW-1·LOW-2)
- 검수가 GREEN으로 실측한 변이 3종(채팅 게이트 제거·텍스트 분기 무력화·enabled
  게이트 제거) 재실행 — 전부 red 전환 확인

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@beyondworks

Copy link
Copy Markdown
Owner Author

분리 검수(별도 컨텍스트 code-reviewer) 1차 CHANGES REQUESTED → 반영 커밋 push 완료.

  • MEDIUM-1: 콜백 게이트 fail-open 차단(!chatId || !cq.message?.chat 명시 가드) — 미페어링 cfg + 메시지 없는 콜백에서 타인 승인 확정 + 폴러 offset 영구 오염(실측)이던 경로 제거
  • MEDIUM-2~4: 채팅 게이트·텍스트 결재 즉시 처리·후속 배달 토큰 판정을 행동 테스트로 격상(검수가 GREEN으로 실측한 변이 3종 → 전부 red 전환 확인)
  • LOW-1·2: 무음 실패 로그 2건. LOW-3(커넥터 결재 slug 'crew' 폴백 사각)은 후속 칩으로 분리

전체 스위트 963 pass / 0 fail · next build 통과. 재검수 회신 대기 중.

@beyondworks
beyondworks merged commit 9242529 into main Aug 27, 2026
2 checks passed
@beyondworks
beyondworks deleted the claude/focused-lehmann-0e826d branch August 27, 2026 10:56
beyondworks added a commit that referenced this pull request Aug 27, 2026
… 봇 slug 정렬 폴백 (재검수 LOW-2) (#312)

* fix(gateway,connectors): 결재 유령 slug 사각 해소 — 기본 크루 최종 폴백 + 등록 시 실크루 귀속 (PR #307 분리 검수 LOW-3)

- pushEvent approval: 담당 slug의 봇이 없으면 defaultCrew 정본으로 최종 폴백(inbox 폴백과 같은 계열,
  음소거는 telegramBriefingDest 안 channelSends가 그대로 존중)
- callConnectorTool 결재 등록: slug 부재 시 유령 'crew' 대신 기본 크루로 귀속
- 행동 테스트 3건: 유령 slug 폴백 발송·음소거 계약·등록 귀속

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* test,perf(gateway): 분리 검수 반영 — 음소거 테스트 자체 시드(MEDIUM-1)·defaultCrew 정본 잠금(LOW-1)·listAgents 가드(LOW-3)·인덱스 의존 제거(LOW-5)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(gateway): 결재 최종 폴백 확장 — 기본 크루도 봇이 없으면 페어링 봇 중 slug 정렬 첫 번째로 (재검수 LOW-2)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
beyondworks added a commit that referenced this pull request Aug 27, 2026
…316)

실사용 혼란(2026-08-28): 경고가 게이트웨이를 필수로 읽히게 해, 직통 봇 사용자가 봇 토큰을
게이트웨이로 옮겨야 하는지 물음. #306의 안내문은 #307(결재 직통 봇 폴백+콜백 공용 처리) 머지로
거짓이 됐는데 제거가 이월돼 있었다. 사실에 맞는 안내로 교체: 직통 봇으로 결재·브리핑 배달됨,
게이트웨이는 전용 봇을 따로 둘 때만(토큰 1개=1곳 제약 설명 포함). i18n ko/en
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