증거
버그를 고쳤다고 주장하는 건 누구나 할 수 있습니다. 이 페이지는 수정 내용, 그것을 지키는 테스트, 그리고 버그가 되돌아오면 그 테스트가 실패한다는 증거를 보여 줍니다.
tools/prove_regressions.py에서 2026-10-03에 생성됨 · 회귀 테스트 4개 중 4개가 공허하지 않음(non-vacuous)이 입증됨.
각 증거가 만들어지는 방식
- 수정된 코드에 대해 회귀 테스트를 실행합니다. 반드시 통과해야 합니다.
- 소스를 수정해 원래 버그를 되살립니다.
- 같은 테스트를 다시 실행하세요. 반드시 실제 assertion 실패로 실패해야 합니다. 수집 오류는 해당되지 않습니다: 테스트가 아예 실행되지 않았다는 뜻이기 때문입니다.
- 파일을 복원하고, SHA-256이 원본과 일치하는지 확인한 뒤 다시 실행합니다: 다시 통과해야 합니다.
어시스턴트는 방문자에게 웹훅이 그들의 대화를 전달한다고 말했습니다. 실제로는 대화를 전혀 전달하지 않습니다.
커밋 e027e6b · apps/gateway/tests/test_webhook_content_claim.py로 보호됨
웹훅 페이로드는 의도적으로 턴의 형태(SHAPE)만 담습니다. 이벤트 이름, 타임스탬프, 단계 수, 크레딧만 담고, 내용은 절대 담지 않습니다. 어시스턴트에게 웹훅에 대화가 포함되는지 묻자 '네, 각 웹훅 페이로드에는 해당 턴의 전체 대화 기록이 포함됩니다.'라고 답했습니다. 이는 허용 목록(allow-list)이 테스트로 검증하는 보장과 정반대입니다. 수정 전 6회 실행 중 2회 지어낸 것으로 측정되었습니다.
| 수정된 코드, 테스트 실행 |
통과 |
21 passed in 1.15s |
| 버그 재도입, 동일한 테스트 |
탐지됨 |
8 failed, 13 passed in 1.20s |
| 파일 복원, 테스트 실행 |
통과 |
sha256 a8d4cb0b10787eff… |
이 테스트는 공허하지 않습니다: 버그가 다시 생기면 실패합니다.
소유자들에게 존재하지 않는 대시보드 카드를 클릭하라고 안내했습니다.
커밋 b4a203a · apps/gateway/tests/test_card_names.py로 보호됨
지식 베이스, 문서, 스타터 타일 모두 소유자에게 'Send turns to a webhook'이라는 카드를 찾으라고 안내했습니다. 실제 대시보드 카드 이름은 'Send events to your own system'입니다. 이 이름은 지식 섹션을 작성할 때 지어낸 것이었고, 확인 없이 세 곳으로 퍼졌습니다. 측정 결과: 설정 관련 답변 2개 중 2개가 존재한 적 없는 컨트롤을 지목했습니다.
| 수정된 코드, 테스트 실행 |
통과 |
5 passed in 1.12s |
| 버그 재도입, 동일한 테스트 |
탐지됨 |
3 failed, 2 passed in 1.23s |
| 파일 복원, 테스트 실행 |
통과 |
sha256 f6348e1a5bbae209… |
이 테스트는 공허하지 않습니다: 버그가 다시 생기면 실패합니다.
다크 모드 인사말이 1.73:1 대비로 렌더링되어 사실상 보이지 않았고, 가드는 이를 잡아낼 수 없었습니다.
커밋 ca47f41 · apps/studio/test/themeContrast.test.mjs로 보호됨
어떤 테스트가 아니라 실제 iPhone에서 찍은 스크린샷에서 발견했습니다. 환영 인사가 #3a3a3c로 하드코딩되어 있었는데, 다크 모드 패널 대비 1.73:1로 최소 기준 4.5:1에 한참 못 미쳐 거의 읽을 수 없었습니다. 다크 모드의 모든 첫 방문자가 이를 봤습니다. 수정은 색상을 테마 변수 --pw-mist를 거치게 하여 패널을 따르도록 했고, 이제 가드는 색상이 설정되었다고 믿는 대신 테마가 적용된 각 쌍의 실제 대비율을 계산합니다.
| 수정된 코드, 테스트 실행 |
통과 |
pass 5, fail 0 |
| 버그 재도입, 동일한 테스트 |
탐지됨 |
pass 3, fail 2 |
| 파일 복원, 테스트 실행 |
통과 |
sha256 54f8802b444b6194… |
이 테스트는 공허하지 않습니다: 버그가 다시 생기면 실패합니다.
실패한 턴 때문에 방문자가 끊긴 스트림에서 끝없이 기다려야 했습니다.
커밋 4bcc691 · apps/studio/test/streamError.test.mjs로 보호됨
모델 호출이 실패했을 때 서버는 올바르게 오류 프레임을 보냈습니다. 그런데 위젯은 그 메시지를 거버넌스 트레이스 분기가 이미 숨겨 둔 요소에 기록했고, 트레이스를 접지도 않았습니다. 방문자는 이미 실패한 턴에서 'Reading your message'가 끝없이 깜빡이는 것만 봤습니다: 오류 표시도, 복구도, 알아챌 방법도 없었습니다. 오류 텍스트는 올바르게 할당됐지만 어디에도 그려지지 않았습니다. API 계정의 크레딧이 소진된 실제 장애 중에 발견했습니다.
| 수정된 코드, 테스트 실행 |
통과 |
pass 4, fail 0 |
| 버그 재도입, 동일한 테스트 |
탐지됨 |
pass 2, fail 2 |
| 파일 복원, 테스트 실행 |
통과 |
sha256 54f8802b444b6194… |
이 테스트는 공허하지 않습니다: 버그가 다시 생기면 실패합니다.
운영 기록
플랫폼 뒤에 실제로 존재하는 것, 그리고 테스트되지 않은 것. 스크립트나 로그가 보여줄 수 있는 것만 적었습니다.
- 백업: 매일 밤 03:17 UTC, pg_dump --clean --if-exists, gzip; 각 실행 후 비공개 git 원격 저장소로 푸시; 최신
20261003T031701Z; 덤프 29개 보관.
- 복원 훈련 2026-10-03: 덤프
20261003T031701Z를 같은 호스트의 일회용 pgvector/pgvector:pg16 컨테이너에 2초 만에 복원: 테넌트 34개, 지식 행 270개, 테이블 47개. 덤프는 03:17 UTC 시점이며, 13:26 UTC에 예약된 데모 정리 작업이 30일이 지난 방치된 데모 테넌트 1개를 제거했습니다(게이트웨이 로그). 따라서 복원 결과는 훈련 시점의 라이브보다 테넌트가 1개 더 많습니다.
- 롤백: 사이트: tools/deploy-site.sh --rollback (이전 릴리스로 심볼릭 링크를 한 번 더 전환); Studio: tools/deploy-studio.sh --rollback (이전 이미지, 헬스 체크 수행).
- 복구 목표: 약속한 것 없음. 야간 덤프로 데이터 손실은 최대 하루로 제한되며, 복원 소요 시간은 명시하지 않습니다.
- 테스트되지 않음: 단일 인스턴스를 넘는 부하, 멀티 리전 페일오버, 다른 호스트로의 복원.
복원 훈련(docs/runbooks/db-backup.md)이 기록한 docs/ops-record.json에서 가져옴.
이것이 증명하지 않는 것
이것들은 제 코드에 대해 제가 직접 실행한 검사입니다. 특정 테스트가 특정 버그를 잡는다는 것을 보여줄 뿐, 시스템에 다른 버그가 없다는 것도, 감사가 포괄적이었다는 것도, 독립적인 누군가가 검토했다는 것도 보여주지 않습니다. 하네스는 저장소에 있으며, 직접 실행해 보면 이 주장을 확인할 수 있습니다.
PANTHEON · 직접 증명하기: 실제 시스템을 공격해 보세요 · 감사 기록 · 워크스루 · 작업 · 이력서
여기 있는 결함 중 무엇이든, 그리고 그 테스트가 수정을 어떻게 증명하는지 물어보세요.
- 그가 찾아서 고친 실제 버그를 보여 주세요
- 테스트가 실패할 수 있다는 것을 어떻게 아는가?
- 아직 해결되지 않은 것은 무엇인가요?