# 주제: 인증(certification) 증거 매니페스트의 실제 상태와, # BrokerFailureMatrix 클래스 javadoc 이 선언한 "Stable 규칙" 이 강제되지 않는 사실 # revision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916 # command: find src -path "*messaging/broker-certification-evidence.jsonl" # exit: 0 src/messaging/messaging-testkit/build/resources/main/messaging/broker-certification-evidence.jsonl src/messaging/messaging-testkit/src/main/resources/messaging/broker-certification-evidence.jsonl # command: diff <(sort src/.../src/main/resources/.../*.jsonl) <(sort src/.../build/resources/.../*.jsonl) # exit: 0 -> IDENTICAL src vs build # command: cat src/messaging/messaging-testkit/src/main/resources/messaging/broker-certification-evidence.jsonl # exit: 0 (4줄) {"adapter":"messaging-kafka","brokerImage":"apache/kafka:4.1.0","scenario":"confirm-timeout","testId":"KafkaBrokerCertificationIT#aConfirmThatNeverArrivesIsReportedAsAmbiguousAndTheRecordIsThere","outcome":"AMBIGUOUS","gitCommit":"e98b56eb03ecab588c21fd1e7dbcaa493c1d8645","observedAt":"2026-08-19T14:21:30.826332993Z"} {"adapter":"messaging-kafka","brokerImage":"apache/kafka:4.1.0","scenario":"connection-cut-after-write","testId":"KafkaBrokerCertificationIT#aConnectionCutAfterTheWriteIsReportedAsAmbiguous","outcome":"AMBIGUOUS","gitCommit":"e98b56eb03ecab588c21fd1e7dbcaa493c1d8645","observedAt":"2026-08-19T14:21:34.906464945Z"} {"adapter":"messaging-kafka","brokerImage":"apache/kafka:4.1.0","scenario":"high-latency","testId":"KafkaBrokerCertificationIT#latencyBeyondThePublishDeadlineIsReportedAsAmbiguous","outcome":"AMBIGUOUS","gitCommit":"e98b56eb03ecab588c21fd1e7dbcaa493c1d8645","observedAt":"2026-08-19T14:21:21.870705263Z"} {"adapter":"messaging-kafka","brokerImage":"apache/kafka:4.1.0","scenario":"settlement-lost","testId":"KafkaBrokerCertificationIT#aDeliveryLostBeforeSettlementIsRedelivered","outcome":"REDELIVERED","gitCommit":"e98b56eb03ecab588c21fd1e7dbcaa493c1d8645","observedAt":"2026-08-19T14:21:42.058283607Z"} # 시나리오 모집단 (NetworkFaultScenario.all(), NetworkFaultScenario.java:143-150) = 5개 # connection-refused / connection-cut-after-write / confirm-timeout / settlement-lost / high-latency # 증거가 있는 조합 = messaging-kafka x 4 (connection-refused 없음) # 증거가 있는 어댑터 = messaging-kafka 1개. messaging-rabbit 은 0줄. # command: git rev-parse HEAD ; git log --oneline -1 e98b56eb03ecab588c21fd1e7dbcaa493c1d8645 # exit: 0 현재 HEAD : 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916 증거가 기록한 gitCommit : e98b56eb "feat: jpa, messaging, notification, mongo, graphql 어댑터터 리펙토링" # => 증거는 현재 트리가 아니라 과거 커밋에서 생산되었다. 히스토리에는 존재하는 커밋이다. # => `verifyMessagingCertificationEvidence` 는 비교 시 gitCommit/observedAt 을 정규식으로 제거하고 # 비교하므로(messaging-kafka/build.gradle doLast 의 claims 클로저), 커밋 불일치는 게이트에 걸리지 않는다. # 이는 설계된 선택이며 주석에 명시되어 있다("differ on every run by design"). # ---- 드리프트 ---- # BrokerFailureMatrix.java:19-20 클래스 javadoc: # "A Stable adapter must cover every scenario. That rule is enforced by a test rather than # documented, because a promotion to Stable is exactly the moment the gap would otherwise be # overlooked." # # command: git grep -n "isComplete" -- src (messaging-testkit 범위만 발췌) src/messaging/messaging-testkit/src/main/java/.../BrokerFailureMatrix.java:95: public boolean isComplete(String adapter) { src/messaging/messaging-testkit/src/test/java/.../CrossBrokerContractSuite.java:110: assertThat(matrix.isComplete("messaging-pulsar-experimental")) # => isComplete 의 호출부는 단 1곳이며, 그것은 *Experimental* 어댑터에 대해 false 를 단언한다. # Stable 어댑터에 isComplete 를 거는 테스트는 존재하지 않는다. # # 실제로 Stable 어댑터인 messaging-kafka 는 gap 을 가진 상태로 통과한다: # CertifiedEvidenceTest.java:52-55 aScenarioWithNoLineInTheManifestIsAGapRatherThanAnAbsence # assertThat(CertifiedEvidence.knownGaps("messaging-kafka")).contains(CONNECTION_REFUSED) # CrossBrokerContractSuite.java:43-54 everyStableAdapterCoversEveryFaultScenario # -> 이름은 "covers every"이지만 본문은 gaps 를 *열거*할 뿐 비어 있음을 단언하지 않는다. # 본문 주석이 그 선택을 명시한다: "The gaps are named rather than asserted empty." # # 판정: 코드는 의도적으로 "정직한 gap 열거"로 바뀌었고, 그 결정은 테스트 본문 주석에 남았다. # 그러나 BrokerFailureMatrix 클래스 javadoc 은 바뀌기 전 규칙("must cover every scenario, # enforced by a test")을 그대로 들고 있다. 규칙을 강제하는 테스트는 없다. # 테스트 메서드 이름 everyStableAdapterCoversEveryFaultScenario 도 같은 잔재다. # command: git grep -n "adapters()" -- src (messaging-testkit) src/messaging/messaging-testkit/src/main/java/.../BrokerFailureMatrix.java:104: public List adapters() { # => 호출부 0건. public API 로 노출되어 있으나 아무도 쓰지 않는다.