{ "schemaVersion": 1, "project": "clean-architecture-backend-template", "generatedAt": "2026-08-31T02:22:23.332251+00:00", "sourceManifest": "root-tree-source-manifest.json", "candidates": [ { "id": "A01-F001", "kindCandidate": "CASE", "priority": "P1", "sourceRefs": [ "analysis/01-domain-core.md#L186" ], "sourceHeading": "P1 — UUIDv7 계약과 실제 validation의 불일치 확인/정렬", "summary": "UUIDv7 계약과 실제 validation의 불일치 확인/정렬", "disposition": "MERGED", "target": "case:documented-uuidv7-generates-v4", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A01-F002", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/01-domain-core.md#L200" ], "sourceHeading": "P3 — `IdFactory.newId()`의 “never-before-used” 문구 정밀화", "summary": "`IdFactory.newId()`의 “never-before-used” 문구 정밀화", "disposition": "EMITTED", "target": "case:a01-f002-idfactory-newid", "reason": null, "topic": "runtime-contract-correctness" }, { "id": "A02-F001", "kindCandidate": "CASE", "priority": "P1", "sourceRefs": [ "analysis/02-shared-contract.md#L139" ], "sourceHeading": "P1 — response/LRO invariant enforcement boundary", "summary": "response/LRO invariant enforcement boundary", "disposition": "EMITTED", "target": "case:a02-f001-lro", "reason": null, "topic": "contract-domain-and-bounds" }, { "id": "A02-F002", "kindCandidate": "CASE", "priority": "P1", "sourceRefs": [ "analysis/02-shared-contract.md#L143" ], "sourceHeading": "P1 — DomainContextKey same-name different-type collision", "summary": "DomainContextKey same-name different-type collision", "disposition": "EMITTED", "target": "case:a02-f002-domaincontextkey", "reason": null, "topic": "contract-domain-and-bounds" }, { "id": "A02-F003", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/02-shared-contract.md#L147" ], "sourceHeading": "P2 — bounded operational record identifiers", "summary": "bounded operational record identifiers", "disposition": "EMITTED", "target": "case:analysis-finding-a02-f003", "reason": null, "topic": "contract-domain-and-bounds" }, { "id": "A02-F004", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/02-shared-contract.md#L151" ], "sourceHeading": "P2 — permission component grammar", "summary": "permission component grammar", "disposition": "EMITTED", "target": "case:analysis-finding-a02-f004", "reason": null, "topic": "security-policy-enforcement" }, { "id": "A02-F005", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/02-shared-contract.md#L155" ], "sourceHeading": "P2 — messaging schema qualification boundary", "summary": "messaging schema qualification boundary", "disposition": "EMITTED", "target": "case:analysis-finding-a02-f005", "reason": null, "topic": "schema-and-data-contracts" }, { "id": "A03-F001", "kindCandidate": "CASE", "priority": "P1", "sourceRefs": [ "analysis/03-application-core.md#L328" ], "sourceHeading": "P1 — notification admin atomic claim contract가 service에서 사용되지 않음", "summary": "notification admin atomic claim contract가 service에서 사용되지 않음", "disposition": "EMITTED", "target": "case:analysis-finding-a03-f001", "reason": null, "topic": "state-ownership-and-concurrency" }, { "id": "A03-F002", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/03-application-core.md#L336" ], "sourceHeading": "P2 — notification derived idempotency key가 32-bit hash", "summary": "notification derived idempotency key가 32-bit hash", "disposition": "EMITTED", "target": "case:analysis-finding-a03-f002", "reason": null, "topic": "state-ownership-and-concurrency" }, { "id": "A03-F003", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/03-application-core.md#L344" ], "sourceHeading": "P2 — legacy storage/notification compatibility surface의 제거 조건 추적", "summary": "legacy storage/notification compatibility surface의 제거 조건 추적", "disposition": "EMITTED", "target": "case:analysis-finding-a03-f003", "reason": null, "topic": "runtime-contract-correctness" }, { "id": "A03-F004", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/03-application-core.md#L351" ], "sourceHeading": "P3 — isolation vocabulary와 legacy routing capability의 시차", "summary": "isolation vocabulary와 legacy routing capability의 시차", "disposition": "EMITTED", "target": "case:analysis-finding-a03-f004", "reason": null, "topic": "runtime-contract-correctness" }, { "id": "A04-F001", "kindCandidate": "CASE", "priority": "P1", "sourceRefs": [ "analysis/04-adapter-outbound-support.md#L140" ], "sourceHeading": "4. Confirmed P1 — `cause.getMessage()` 때문에 PII-safe logging 계약이 성립하지 않는다", "summary": "`cause.getMessage()` 때문에 PII-safe logging 계약이 성립하지 않는다", "disposition": "MERGED", "target": "case:pii-through-an-exception-message", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A04-F002", "kindCandidate": "CASE", "priority": "P1", "sourceRefs": [ "analysis/04-adapter-outbound-support.md#L216" ], "sourceHeading": "5. Confirmed P1 — notification consumer는 diagnostic failure를 authoritative failure로 바꿀 수 있다", "summary": "notification consumer는 diagnostic failure를 authoritative failure로 바꿀 수 있다", "disposition": "EMITTED", "target": "case:analysis-finding-a04-f002", "reason": null, "topic": "runtime-reachability-and-composition" }, { "id": "A04-F003", "kindCandidate": "CASE", "priority": "P1", "sourceRefs": [ "analysis/04-adapter-outbound-support.md#L559" ], "sourceHeading": "P1 — arbitrary exception message가 PII-safe logging boundary를 우회한다", "summary": "arbitrary exception message가 PII-safe logging boundary를 우회한다", "disposition": "MERGED", "target": "case:pii-through-an-exception-message", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A04-F004", "kindCandidate": "CASE", "priority": "P1", "sourceRefs": [ "analysis/04-adapter-outbound-support.md#L569" ], "sourceHeading": "P1 — notification fail-open consumer가 logger failure를 격리하지 않는다", "summary": "notification fail-open consumer가 logger failure를 격리하지 않는다", "disposition": "EMITTED", "target": "case:analysis-finding-a04-f004", "reason": null, "topic": "runtime-reachability-and-composition" }, { "id": "A04-F005", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/04-adapter-outbound-support.md#L579" ], "sourceHeading": "P3 — support README가 current architecture registry/history와 drift", "summary": "support README가 current architecture registry/history와 drift", "disposition": "EMITTED", "target": "case:analysis-finding-a04-f005", "reason": null, "topic": "declaration-and-document-drift" }, { "id": "A04-F006", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/04-adapter-outbound-support.md#L587" ], "sourceHeading": "P3 — cache-redis/httpclient의 support project dependency 필요성 재검증", "summary": "cache-redis/httpclient의 support project dependency 필요성 재검증", "disposition": "EMITTED", "target": "case:analysis-finding-a04-f006", "reason": null, "topic": "verification-path-coverage" }, { "id": "A05-F001", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/05-adapter-outbound-persistence-jpa.md#L366" ], "sourceHeading": "6.2 Confirmed P2 — encode가 발급한 2046~2048-byte cursor를 decode가 거부한다", "summary": "encode가 발급한 2046~2048-byte cursor를 decode가 거부한다", "disposition": "EMITTED", "target": "case:analysis-finding-a05-f001", "reason": null, "topic": "contract-domain-and-bounds" }, { "id": "A05-F002", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/05-adapter-outbound-persistence-jpa.md#L635" ], "sourceHeading": "P2 — `SignedJsonCursorCodec` accepted encode domain과 decode domain 불일치", "summary": "`SignedJsonCursorCodec` accepted encode domain과 decode domain 불일치", "disposition": "MERGED", "target": "case:analysis-finding-a05-f001", "reason": "A05-F001와 같은 분석 사건을 후속 sub-scope/pass에서 다시 기록한 중복 finding이다. 별도 Case를 만들지 않고 primary candidate에 병합한다." }, { "id": "A05-F003", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/05-adapter-outbound-persistence-jpa.md#L645" ], "sourceHeading": "P2 — `CapabilitySupport.constraints`의 bounded/report-safe 계약이 타입에서 강제되지 않음", "summary": "`CapabilitySupport.constraints`의 bounded/report-safe 계약이 타입에서 강제되지 않음", "disposition": "EMITTED", "target": "case:a05-f003-capabilitysupport-constraints", "reason": null, "topic": "contract-domain-and-bounds" }, { "id": "A05-F004", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/05-adapter-outbound-persistence-jpa.md#L654" ], "sourceHeading": "P3 — `RetryDecision.reason`의 “bounded” 설명과 constructor contract 불일치", "summary": "`RetryDecision.reason`의 “bounded” 설명과 constructor contract 불일치", "disposition": "EMITTED", "target": "case:a05-f004-retrydecision-reason", "reason": null, "topic": "declaration-and-document-drift" }, { "id": "A05-F005", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/05-adapter-outbound-persistence-jpa.md#L975" ], "sourceHeading": "20. Confirmed P2 — application-supplied `JpaRetryPolicy`가 valid execution에서 무시된다", "summary": "application-supplied `JpaRetryPolicy`가 valid execution에서 무시된다", "disposition": "EMITTED", "target": "case:a05-f005-jparetrypolicy", "reason": null, "topic": "runtime-contract-correctness" }, { "id": "A05-F006", "kindCandidate": "CASE", "priority": "P1", "sourceRefs": [ "analysis/05-adapter-outbound-persistence-jpa.md#L1106" ], "sourceHeading": "23. Confirmed P1 — Stable completion-evidence capability가 shipped composition에 설치되지 않는다", "summary": "Stable completion-evidence capability가 shipped composition에 설치되지 않는다", "disposition": "EMITTED", "target": "case:a05-f006-stable", "reason": null, "topic": "verification-path-coverage" }, { "id": "A05-F007", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/05-adapter-outbound-persistence-jpa.md#L1288" ], "sourceHeading": "25. P3 — `TransactionProfileRegistry`는 declarative retry 제거 후 legacy residue 후보", "summary": "`TransactionProfileRegistry`는 declarative retry 제거 후 legacy residue 후보", "disposition": "EMITTED", "target": "case:a05-f007-transactionprofileregistry", "reason": null, "topic": "runtime-reachability-and-composition" }, { "id": "A05-F008", "kindCandidate": "CASE", "priority": "P1", "sourceRefs": [ "analysis/05-adapter-outbound-persistence-jpa.md#L1508" ], "sourceHeading": "P1 — completion-evidence Stable contract가 actual composition에 연결되지 않음", "summary": "completion-evidence Stable contract가 actual composition에 연결되지 않음", "disposition": "MERGED", "target": "case:a05-f006-stable", "reason": "A05-F006와 같은 분석 사건을 후속 sub-scope/pass에서 다시 기록한 중복 finding이다. 별도 Case를 만들지 않고 primary candidate에 병합한다." }, { "id": "A05-F009", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/05-adapter-outbound-persistence-jpa.md#L1518" ], "sourceHeading": "P2 — custom `JpaRetryPolicy`가 silently ignored", "summary": "custom `JpaRetryPolicy`가 silently ignored", "disposition": "MERGED", "target": "case:a05-f005-jparetrypolicy", "reason": "A05-F005와 같은 분석 사건을 후속 sub-scope/pass에서 다시 기록한 중복 finding이다. 별도 Case를 만들지 않고 primary candidate에 병합한다." }, { "id": "A05-F010", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/05-adapter-outbound-persistence-jpa.md#L1526" ], "sourceHeading": "P2 — canonical transaction boundary documentation과 실제 dual stack 불일치", "summary": "canonical transaction boundary documentation과 실제 dual stack 불일치", "disposition": "EMITTED", "target": "case:analysis-finding-a05-f010", "reason": null, "topic": "contract-domain-and-bounds" }, { "id": "A05-F011", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/05-adapter-outbound-persistence-jpa.md#L1533" ], "sourceHeading": "P3 — TransactionProfileRegistry legacy residue", "summary": "TransactionProfileRegistry legacy residue", "disposition": "MERGED", "target": "case:a05-f007-transactionprofileregistry", "reason": "A05-F007와 같은 분석 사건을 후속 sub-scope/pass에서 다시 기록한 중복 finding이다. 별도 Case를 만들지 않고 primary candidate에 병합한다." }, { "id": "A05-F012", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/05-adapter-outbound-persistence-jpa.md#L1715" ], "sourceHeading": "38. Confirmed P2 — property-access `IDENTITY` entity가 batch guard를 우회한다", "summary": "property-access `IDENTITY` entity가 batch guard를 우회한다", "disposition": "EMITTED", "target": "case:a05-f012-identity", "reason": null, "topic": "security-policy-enforcement" }, { "id": "A05-F013", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/05-adapter-outbound-persistence-jpa.md#L2005" ], "sourceHeading": "47. Confirmed P2 — `SpecificationPolicy`는 `Specification.unrestricted()`를 bounded로 오인한다", "summary": "`SpecificationPolicy`는 `Specification.unrestricted()`를 bounded로 오인한다", "disposition": "EMITTED", "target": "case:a05-f013-specificationpolicy-specification-unrestricted", "reason": null, "topic": "contract-domain-and-bounds" }, { "id": "A05-F014", "kindCandidate": "CASE", "priority": "P1", "sourceRefs": [ "analysis/05-adapter-outbound-persistence-jpa.md#L2241" ], "sourceHeading": "52. Confirmed P1 — `collection-fetch-pagination` blocking release gate가 실제 위험을 증명하지 않는다", "summary": "`collection-fetch-pagination` blocking release gate가 실제 위험을 증명하지 않는다", "disposition": "EMITTED", "target": "case:a05-f014-collection-fetch-pagination", "reason": null, "topic": "verification-path-coverage" }, { "id": "A05-F015", "kindCandidate": "CASE", "priority": "P1", "sourceRefs": [ "analysis/05-adapter-outbound-persistence-jpa.md#L2515" ], "sourceHeading": "P1 — blocking `collection-fetch-pagination` release gate false evidence", "summary": "blocking `collection-fetch-pagination` release gate false evidence", "disposition": "MERGED", "target": "case:a05-f014-collection-fetch-pagination", "reason": "A05-F014와 같은 분석 사건을 후속 sub-scope/pass에서 다시 기록한 중복 finding이다. 별도 Case를 만들지 않고 primary candidate에 병합한다." }, { "id": "A05-F016", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/05-adapter-outbound-persistence-jpa.md#L2524" ], "sourceHeading": "P2 — property-access IDENTITY가 batching-required guard를 우회", "summary": "property-access IDENTITY가 batching-required guard를 우회", "disposition": "MERGED", "target": "case:a05-f012-identity", "reason": "A05-F012와 같은 분석 사건을 후속 sub-scope/pass에서 다시 기록한 중복 finding이다. 별도 Case를 만들지 않고 primary candidate에 병합한다." }, { "id": "A05-F017", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/05-adapter-outbound-persistence-jpa.md#L2532" ], "sourceHeading": "P2 — `SpecificationPolicy`가 unrestricted non-null Specification을 허용", "summary": "`SpecificationPolicy`가 unrestricted non-null Specification을 허용", "disposition": "MERGED", "target": "case:a05-f013-specificationpolicy-specification-unrestricted", "reason": "A05-F013와 같은 분석 사건을 후속 sub-scope/pass에서 다시 기록한 중복 finding이다. 별도 Case를 만들지 않고 primary candidate에 병합한다." }, { "id": "A05-F018", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/05-adapter-outbound-persistence-jpa.md#L2540" ], "sourceHeading": "Cross-scope P1/P2 — query SQL naming/observability composition 부재", "summary": "query SQL naming/observability composition 부재", "disposition": "EMITTED", "target": "case:a05-f018-sql", "reason": null, "topic": "runtime-contract-correctness" }, { "id": "A05-F019", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/05-adapter-outbound-persistence-jpa.md#L2546" ], "sourceHeading": "P2/P3 — export surface split SSOT", "summary": "export surface split SSOT", "disposition": "EMITTED", "target": "case:a05-f019-ssot", "reason": null, "topic": "runtime-contract-correctness" }, { "id": "A05-F020", "kindCandidate": "CASE", "priority": "P1", "sourceRefs": [ "analysis/05-adapter-outbound-persistence-jpa.md#L2659" ], "sourceHeading": "59.1 P1 — `inspect()`와 `claim()`이 만료된 COMPLETED row를 동시에 다른 상태로 해석한다", "summary": "`inspect()`와 `claim()`이 만료된 COMPLETED row를 동시에 다른 상태로 해석한다", "disposition": "EMITTED", "target": "case:a05-f020-inspect-claim", "reason": null, "topic": "state-ownership-and-concurrency" }, { "id": "A05-F021", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/05-adapter-outbound-persistence-jpa.md#L2688" ], "sourceHeading": "59.2 P2 — `complete()`의 replay 판정이 `replayTtl` 변경을 무시한다", "summary": "`complete()`의 replay 판정이 `replayTtl` 변경을 무시한다", "disposition": "EMITTED", "target": "case:a05-f021-complete-replayttl", "reason": null, "topic": "state-ownership-and-concurrency" }, { "id": "A05-F022", "kindCandidate": "CASE", "priority": "P1", "sourceRefs": [ "analysis/05-adapter-outbound-persistence-jpa.md#L2975" ], "sourceHeading": "69. P1 — Stable runtime-role verification이 startup에서 실제 policy를 적용하지 않는다", "summary": "Stable runtime-role verification이 startup에서 실제 policy를 적용하지 않는다", "disposition": "EMITTED", "target": "case:a05-f022-stable", "reason": null, "topic": "runtime-reachability-and-composition" }, { "id": "A05-F023", "kindCandidate": "CASE", "priority": "P1", "sourceRefs": [ "analysis/05-adapter-outbound-persistence-jpa.md#L3161" ], "sourceHeading": "78. P1 — persistent byte quota가 실제 admission에서 집행되지 않는다", "summary": "persistent byte quota가 실제 admission에서 집행되지 않는다", "disposition": "EMITTED", "target": "case:analysis-finding-a05-f023", "reason": null, "topic": "state-ownership-and-concurrency" }, { "id": "A05-F024", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/05-adapter-outbound-persistence-jpa.md#L3230" ], "sourceHeading": "80. P2 — quota reclaim은 최대 64개 committed row만 처리하고 남은 byte를 조용히 버린다", "summary": "quota reclaim은 최대 64개 committed row만 처리하고 남은 byte를 조용히 버린다", "disposition": "EMITTED", "target": "case:analysis-finding-a05-f024", "reason": null, "topic": "state-ownership-and-concurrency" }, { "id": "A05-F025", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/05-adapter-outbound-persistence-jpa.md#L3250" ], "sourceHeading": "81. P2 — direct `FileQuotaService.commit()`은 만료 reservation을 commit한다", "summary": "direct `FileQuotaService.commit()`은 만료 reservation을 commit한다", "disposition": "EMITTED", "target": "case:a05-f025-filequotaservice-commit", "reason": null, "topic": "state-ownership-and-concurrency" }, { "id": "A05-F026", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/05-adapter-outbound-persistence-jpa.md#L3271" ], "sourceHeading": "82. P2 — recovery queue의 `enqueue()`는 concurrent upsert가 아니다", "summary": "recovery queue의 `enqueue()`는 concurrent upsert가 아니다", "disposition": "EMITTED", "target": "case:a05-f026-enqueue", "reason": null, "topic": "state-ownership-and-concurrency" }, { "id": "A05-F027", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/05-adapter-outbound-persistence-jpa.md#L3300" ], "sourceHeading": "82.1. P2 — cleanup crash-reclaim은 `MAXIMUM_ATTEMPTS`를 우회해 poison item을 무한 재시도할 수 있다", "summary": "cleanup crash-reclaim은 `MAXIMUM_ATTEMPTS`를 우회해 poison item을 무한 재시도할 수 있다", "disposition": "EMITTED", "target": "case:a05-f027-maximum-attempts", "reason": null, "topic": "state-ownership-and-concurrency" }, { "id": "A05-F028", "kindCandidate": "CASE", "priority": "P1", "sourceRefs": [ "analysis/05-adapter-outbound-persistence-jpa.md#L3444" ], "sourceHeading": "89. P1 — provider 호출 뒤 recipient projection write가 lease fencing을 우회한다", "summary": "provider 호출 뒤 recipient projection write가 lease fencing을 우회한다", "disposition": "EMITTED", "target": "case:analysis-finding-a05-f028", "reason": null, "topic": "state-ownership-and-concurrency" }, { "id": "A05-F029", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/05-adapter-outbound-persistence-jpa.md#L3478" ], "sourceHeading": "90. P2 — reconciliation `FOR UPDATE SKIP LOCKED`는 worker 처리 구간을 claim하지 않는다", "summary": "reconciliation `FOR UPDATE SKIP LOCKED`는 worker 처리 구간을 claim하지 않는다", "disposition": "EMITTED", "target": "case:a05-f029-for-update-skip-locked", "reason": null, "topic": "state-ownership-and-concurrency" }, { "id": "A05-F030", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/05-adapter-outbound-persistence-jpa.md#L3509" ], "sourceHeading": "91. P2 — V8 atomic admin claim은 production service에 연결되지 않았고 completion 모델도 미완성이다", "summary": "V8 atomic admin claim은 production service에 연결되지 않았고 completion 모델도 미완성이다", "disposition": "EMITTED", "target": "case:analysis-finding-a05-f030", "reason": null, "topic": "runtime-reachability-and-composition" }, { "id": "A05-F031", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/05-adapter-outbound-persistence-jpa.md#L4073" ], "sourceHeading": "116. Confirmed P2 — vendor selector의 fail-fast 계약이 shipped composition에 설치돼 있지 않다", "summary": "vendor selector의 fail-fast 계약이 shipped composition에 설치돼 있지 않다", "disposition": "EMITTED", "target": "case:analysis-finding-a05-f031", "reason": null, "topic": "runtime-reachability-and-composition" }, { "id": "A05-F032", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/05-adapter-outbound-persistence-jpa.md#L4257" ], "sourceHeading": "125. Confirmed P2 — nightly workflow가 광고하는 세 가지 중 하나를 lane이 실제로 관측하지 않는다", "summary": "nightly workflow가 광고하는 세 가지 중 하나를 lane이 실제로 관측하지 않는다", "disposition": "EMITTED", "target": "case:analysis-finding-a05-f032", "reason": null, "topic": "verification-path-coverage" }, { "id": "A05-F033", "kindCandidate": "CASE", "priority": "P1", "sourceRefs": [ "analysis/05-adapter-outbound-persistence-jpa.md#L4375" ], "sourceHeading": "132. Confirmed P1 — selected base card `jpa-flyway-migration`의 producer가 현재 revision에서 실패한다", "summary": "selected base card `jpa-flyway-migration`의 producer가 현재 revision에서 실패한다", "disposition": "EMITTED", "target": "case:a05-f033-jpa-flyway-migration", "reason": null, "topic": "verification-path-coverage" }, { "id": "A05-F034", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/05-adapter-outbound-persistence-jpa.md#L4446" ], "sourceHeading": "133. Confirmed P2 — selected base card 3개의 evidence tag가 production code 없는 fixture로 충족된다", "summary": "selected base card 3개의 evidence tag가 production code 없는 fixture로 충족된다", "disposition": "EMITTED", "target": "case:analysis-finding-a05-f034", "reason": null, "topic": "verification-path-coverage" }, { "id": "A06-F001", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/06-adapter-outbound-persistence-mongo.md#L97" ], "sourceHeading": "4. Confirmed P2 — README가 제시하는 활성화 recipe를 그대로 따르면 애플리케이션이 시작되지 않는다", "summary": "README가 제시하는 활성화 recipe를 그대로 따르면 애플리케이션이 시작되지 않는다", "disposition": "MERGED", "target": "case:the-readme-recipe-does-not-start", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A06-F002", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/06-adapter-outbound-persistence-mongo.md#L116" ], "sourceHeading": "5. Confirmed P3 — 폐기된 namespace guard의 탐색 domain이 operator가 읽는 두 문서를 덮지 않는다", "summary": "폐기된 namespace guard의 탐색 domain이 operator가 읽는 두 문서를 덮지 않는다", "disposition": "EMITTED", "target": "case:analysis-finding-a06-f002", "reason": null, "topic": "declaration-and-document-drift" }, { "id": "A06-F003", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/06-adapter-outbound-persistence-mongo.md#L140" ], "sourceHeading": "6. Confirmed P3 — `change-streams=true`는 거부되지 않고 조용히 버려지며, 그 결과 startup validator의 한 분기가 production에서 도달 불가다", "summary": "`change-streams=true`는 거부되지 않고 조용히 버려지며, 그 결과 startup validator의 한 분기가 production에서 도달 불가다", "disposition": "EMITTED", "target": "case:a06-f003-change-streams-true", "reason": null, "topic": "runtime-reachability-and-composition" }, { "id": "A06-F004", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/06-adapter-outbound-persistence-mongo.md#L316" ], "sourceHeading": "16. Confirmed P2 — schema version 실패는 두 경로 중 어느 쪽도 온전하지 않다", "summary": "schema version 실패는 두 경로 중 어느 쪽도 온전하지 않다", "disposition": "EMITTED", "target": "case:analysis-finding-a06-f004", "reason": null, "topic": "schema-and-data-contracts" }, { "id": "A06-F005", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/06-adapter-outbound-persistence-mongo.md#L331" ], "sourceHeading": "17. Confirmed P3 — 예외 계층의 \"cause를 붙이지 않는다\" 규칙에 문서화되지 않은 예외가 하나 있다", "summary": "예외 계층의 \"cause를 붙이지 않는다\" 규칙에 문서화되지 않은 예외가 하나 있다", "disposition": "EMITTED", "target": "case:analysis-finding-a06-f005", "reason": null, "topic": "declaration-and-document-drift" }, { "id": "A06-F006", "kindCandidate": "CASE", "priority": "P1", "sourceRefs": [ "analysis/06-adapter-outbound-persistence-mongo.md#L431" ], "sourceHeading": "23. Confirmed P1 — shipped default 조합이 첫 write에서 예외를 던진다", "summary": "shipped default 조합이 첫 write에서 예외를 던진다", "disposition": "MERGED", "target": "case:mongo-default-throws-on-first-write", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A06-F007", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/06-adapter-outbound-persistence-mongo.md#L489" ], "sourceHeading": "25. Confirmed P2 — D3 gateway가 문서화한 검사 순서에 존재하지 않는 단계가 있다", "summary": "D3 gateway가 문서화한 검사 순서에 존재하지 않는 단계가 있다", "disposition": "EMITTED", "target": "case:analysis-finding-a06-f007", "reason": null, "topic": "verification-path-coverage" }, { "id": "A06-F008", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/06-adapter-outbound-persistence-mongo.md#L584" ], "sourceHeading": "32. Confirmed P2 — 서버 측 deadline이 경로마다 다르게 적용되고, 문서가 지목한 메커니즘은 production 호출자가 0이다", "summary": "서버 측 deadline이 경로마다 다르게 적용되고, 문서가 지목한 메커니즘은 production 호출자가 0이다", "disposition": "EMITTED", "target": "case:analysis-finding-a06-f008", "reason": null, "topic": "runtime-reachability-and-composition" }, { "id": "A06-F009", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/06-adapter-outbound-persistence-mongo.md#L606" ], "sourceHeading": "33. P3 — timeout 초과 경로가 한 observation에 success와 failure를 모두 기록한다", "summary": "timeout 초과 경로가 한 observation에 success와 failure를 모두 기록한다", "disposition": "EMITTED", "target": "case:analysis-finding-a06-f009", "reason": null, "topic": "transport-and-provider-semantics" }, { "id": "A06-F010", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/06-adapter-outbound-persistence-mongo.md#L701" ], "sourceHeading": "42. P2 — collection 이름 불변식이 aggregation executor의 서명에서 깨진다", "summary": "collection 이름 불변식이 aggregation executor의 서명에서 깨진다", "disposition": "EMITTED", "target": "case:analysis-finding-a06-f010", "reason": null, "topic": "schema-and-data-contracts" }, { "id": "A06-F011", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/06-adapter-outbound-persistence-mongo.md#L724" ], "sourceHeading": "43. P3 — `MongoRegexPolicy.forbidden()`은 금지하지 않는다", "summary": "`MongoRegexPolicy.forbidden()`은 금지하지 않는다", "disposition": "EMITTED", "target": "case:a06-f011-mongoregexpolicy-forbidden", "reason": null, "topic": "runtime-contract-correctness" }, { "id": "A06-F012", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/06-adapter-outbound-persistence-mongo.md#L793" ], "sourceHeading": "49. Confirmed P2 — 이 subsystem 전체가 배선돼 있지 않은데, 그것을 켜는 flag는 startup 검사를 수행한다", "summary": "이 subsystem 전체가 배선돼 있지 않은데, 그것을 켜는 flag는 startup 검사를 수행한다", "disposition": "MERGED", "target": "case:a-flag-that-validates-an-unwired-subsystem", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A06-F013", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/06-adapter-outbound-persistence-mongo.md#L868" ], "sourceHeading": "56. P2 — `recordApplied`는 문서화된 fence 계약을 구현하지 않고, 보호를 역전시킨다", "summary": "`recordApplied`는 문서화된 fence 계약을 구현하지 않고, 보호를 역전시킨다", "disposition": "EMITTED", "target": "case:a06-f013-recordapplied", "reason": null, "topic": "state-ownership-and-concurrency" }, { "id": "A06-F014", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/06-adapter-outbound-persistence-mongo.md#L894" ], "sourceHeading": "57. P2 — index diff가 실제로 비교하는 것은 두 필드뿐이다", "summary": "index diff가 실제로 비교하는 것은 두 필드뿐이다", "disposition": "EMITTED", "target": "case:analysis-finding-a06-f014", "reason": null, "topic": "schema-and-data-contracts" }, { "id": "A06-F015", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/06-adapter-outbound-persistence-mongo.md#L911" ], "sourceHeading": "58. P3 — TTL이 두 곳에 선언되고, 규칙을 가진 쪽은 아무도 쓰지 않는다", "summary": "TTL이 두 곳에 선언되고, 규칙을 가진 쪽은 아무도 쓰지 않는다", "disposition": "EMITTED", "target": "case:analysis-finding-a06-f015", "reason": null, "topic": "schema-and-data-contracts" }, { "id": "A06-F016", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/06-adapter-outbound-persistence-mongo.md#L926" ], "sourceHeading": "59. P3 — Flamingock lease로는 어떤 migration도 실행할 수 없고, javadoc은 다르게 적는다", "summary": "Flamingock lease로는 어떤 migration도 실행할 수 없고, javadoc은 다르게 적는다", "disposition": "EMITTED", "target": "case:a06-f016-flamingock", "reason": null, "topic": "state-ownership-and-concurrency" }, { "id": "A06-F017", "kindCandidate": "CASE", "priority": "P1", "sourceRefs": [ "analysis/06-adapter-outbound-persistence-mongo.md#L1025" ], "sourceHeading": "67. P1 — high-water mark가 재전달된 이벤트를 삼켜, failover 중이던 변경이 조용히 영구 소실된다", "summary": "high-water mark가 재전달된 이벤트를 삼켜, failover 중이던 변경이 조용히 영구 소실된다", "disposition": "MERGED", "target": "case:high-water-mark-swallowed-a-redelivered-change", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A06-F018", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/06-adapter-outbound-persistence-mongo.md#L1053" ], "sourceHeading": "68. P2 — `changeStreams` flag는 `false`로 고정돼 있는데, 소비자 bean은 그것과 무관하게 조립된다", "summary": "`changeStreams` flag는 `false`로 고정돼 있는데, 소비자 bean은 그것과 무관하게 조립된다", "disposition": "EMITTED", "target": "case:a06-f018-changestreams-false", "reason": null, "topic": "runtime-reachability-and-composition" }, { "id": "A06-F019", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/06-adapter-outbound-persistence-mongo.md#L1072" ], "sourceHeading": "69. P3 — recovery package에 쓰이는 어휘와 쓰이지 않는 어휘가 나란히 있다", "summary": "recovery package에 쓰이는 어휘와 쓰이지 않는 어휘가 나란히 있다", "disposition": "EMITTED", "target": "case:analysis-finding-a06-f019", "reason": null, "topic": "state-ownership-and-concurrency" }, { "id": "A06-F020", "kindCandidate": "CASE", "priority": "P1", "sourceRefs": [ "analysis/06-adapter-outbound-persistence-mongo.md#L1145" ], "sourceHeading": "75. P1 — 프로파일의 TLS·타임아웃·풀·Stable API가 driver에 도달하지 않는다", "summary": "프로파일의 TLS·타임아웃·풀·Stable API가 driver에 도달하지 않는다", "disposition": "EMITTED", "target": "case:a06-f020-tls-stable", "reason": null, "topic": "runtime-reachability-and-composition" }, { "id": "A06-F021", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/06-adapter-outbound-persistence-mongo.md#L1173" ], "sourceHeading": "76. P3 — admin gateway의 두 audit 경로 중 하나만 fail-closed다", "summary": "admin gateway의 두 audit 경로 중 하나만 fail-closed다", "disposition": "EMITTED", "target": "case:analysis-finding-a06-f021", "reason": null, "topic": "verification-path-coverage" }, { "id": "A06-F022", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/06-adapter-outbound-persistence-mongo.md#L1179" ], "sourceHeading": "77. P3 — 태그 allowlist는 규약이지 강제가 아니다", "summary": "태그 allowlist는 규약이지 강제가 아니다", "disposition": "EMITTED", "target": "case:analysis-finding-a06-f022", "reason": null, "topic": "runtime-contract-correctness" }, { "id": "A06-F023", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/06-adapter-outbound-persistence-mongo.md#L1265" ], "sourceHeading": "85. P2 — sharding admin gateway의 네 작업 중 셋은 어떤 입력으로도 완료될 수 없다", "summary": "sharding admin gateway의 네 작업 중 셋은 어떤 입력으로도 완료될 수 없다", "disposition": "EMITTED", "target": "case:analysis-finding-a06-f023", "reason": null, "topic": "verification-path-coverage" }, { "id": "A06-F024", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/06-adapter-outbound-persistence-mongo.md#L1289" ], "sourceHeading": "86. P3 — promotion 증거 어휘가 둘이고, gate는 하나만 검사한다", "summary": "promotion 증거 어휘가 둘이고, gate는 하나만 검사한다", "disposition": "EMITTED", "target": "case:analysis-finding-a06-f024", "reason": null, "topic": "verification-path-coverage" }, { "id": "A06-F025", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/06-adapter-outbound-persistence-mongo.md#L1308" ], "sourceHeading": "88. P3 — 구현 없는 4개의 계약 중 셋은 그 사실을 적고, 하나는 적지 않는다", "summary": "구현 없는 4개의 계약 중 셋은 그 사실을 적고, 하나는 적지 않는다", "disposition": "EMITTED", "target": "case:analysis-finding-a06-f025", "reason": null, "topic": "runtime-contract-correctness" }, { "id": "A06-F026", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/06-adapter-outbound-persistence-mongo.md#L1367" ], "sourceHeading": "94. P2 — 커버리지 gate 둘이 나란히 있고, 하나는 발화할 수 없다", "summary": "커버리지 gate 둘이 나란히 있고, 하나는 발화할 수 없다", "disposition": "EMITTED", "target": "case:analysis-finding-a06-f026", "reason": null, "topic": "verification-path-coverage" }, { "id": "A06-F027", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/06-adapter-outbound-persistence-mongo.md#L1394" ], "sourceHeading": "95. P2 — release gate가 실제로 차단하는 것은 hermetic test 3개이고, mongo용 CI workflow는 없다", "summary": "release gate가 실제로 차단하는 것은 hermetic test 3개이고, mongo용 CI workflow는 없다", "disposition": "EMITTED", "target": "case:analysis-finding-a06-f027", "reason": null, "topic": "verification-path-coverage" }, { "id": "A06-F028", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/06-adapter-outbound-persistence-mongo.md#L1417" ], "sourceHeading": "96. P3 — 소비자가 없는 fixture 셋", "summary": "소비자가 없는 fixture 셋", "disposition": "EMITTED", "target": "case:analysis-finding-a06-f028", "reason": null, "topic": "verification-path-coverage" }, { "id": "A07-F001", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/07-adapter-outbound-identifier.md#L57" ], "sourceHeading": "3. P2 — 모듈의 존재 논거인 `UuidCodec`에 production 소비자가 없다", "summary": "모듈의 존재 논거인 `UuidCodec`에 production 소비자가 없다", "disposition": "EMITTED", "target": "case:a07-f001-uuidcodec", "reason": null, "topic": "runtime-reachability-and-composition" }, { "id": "A07-F002", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/07-adapter-outbound-identifier.md#L73" ], "sourceHeading": "4. P2 — `normalize`는 canonical이 아닌 입력을 받아 다른 UUID로 조용히 바꾼다", "summary": "`normalize`는 canonical이 아닌 입력을 받아 다른 UUID로 조용히 바꾼다", "disposition": "EMITTED", "target": "case:a07-f002-normalize", "reason": null, "topic": "contract-domain-and-bounds" }, { "id": "A07-F003", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/07-adapter-outbound-identifier.md#L97" ], "sourceHeading": "5. P2 — 문서는 UUIDv7이라고 말하고, 생성되는 것은 v4다", "summary": "문서는 UUIDv7이라고 말하고, 생성되는 것은 v4다", "disposition": "MERGED", "target": "case:documented-uuidv7-generates-v4", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A07-F004", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/07-adapter-outbound-identifier.md#L115" ], "sourceHeading": "6. P3 — CLAUDE.md의 의존성 서술이 세 항목 모두 틀렸다", "summary": "CLAUDE.md의 의존성 서술이 세 항목 모두 틀렸다", "disposition": "EMITTED", "target": "case:a07-f004-claude", "reason": null, "topic": "declaration-and-document-drift" }, { "id": "A07-F005", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/07-adapter-outbound-identifier.md#L134" ], "sourceHeading": "7. P3 — README의 세 가지 사실 오류", "summary": "README의 세 가지 사실 오류", "disposition": "EMITTED", "target": "case:analysis-finding-a07-f005", "reason": null, "topic": "declaration-and-document-drift" }, { "id": "A07-F006", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/07-adapter-outbound-identifier.md#L144" ], "sourceHeading": "8. P3 — CLAUDE.md가 대는 두 가드 중 하나는 저장소에 없다", "summary": "CLAUDE.md가 대는 두 가드 중 하나는 저장소에 없다", "disposition": "EMITTED", "target": "case:a07-f006-claude", "reason": null, "topic": "declaration-and-document-drift" }, { "id": "A08-F001", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/08-adapter-outbound-fileserver.md#L71" ], "sourceHeading": "4. P2 — README가 \"노출된 setting도 bean도 없다\"고 적은 능력들에 production bean이 있다", "summary": "README가 \"노출된 setting도 bean도 없다\"고 적은 능력들에 production bean이 있다", "disposition": "MERGED", "target": "case:readme-said-no-beans-there-are-eight", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A08-F002", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/08-adapter-outbound-fileserver.md#L92" ], "sourceHeading": "5. P3 — R1과 R2의 설정 취급이 비대칭이고, 검증된 쪽은 하나뿐이다", "summary": "R1과 R2의 설정 취급이 비대칭이고, 검증된 쪽은 하나뿐이다", "disposition": "EMITTED", "target": "case:analysis-finding-a08-f002", "reason": null, "topic": "verification-path-coverage" }, { "id": "A08-F003", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/08-adapter-outbound-fileserver.md#L106" ], "sourceHeading": "6. P3 — 문서가 지목한 기본값 위치와 test 목록이 실제와 다르다", "summary": "문서가 지목한 기본값 위치와 test 목록이 실제와 다르다", "disposition": "EMITTED", "target": "case:analysis-finding-a08-f003", "reason": null, "topic": "verification-path-coverage" }, { "id": "A08-F004", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/08-adapter-outbound-fileserver.md#L360" ], "sourceHeading": "32. P3 — 발행 rename만 경로 기반이고, 그것을 지키는 것은 이 모듈이 \"근사에 불과하다\"고 적은 사전검사다", "summary": "발행 rename만 경로 기반이고, 그것을 지키는 것은 이 모듈이 \"근사에 불과하다\"고 적은 사전검사다", "disposition": "EMITTED", "target": "case:analysis-finding-a08-f004", "reason": null, "topic": "runtime-contract-correctness" }, { "id": "A08-F005", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/08-adapter-outbound-fileserver.md#L394" ], "sourceHeading": "34. P3 — `TransferBufferPool.maxBorrowedBytes()`가 자기 회귀 test를 지목하는데 그 test가 읽지 않는다", "summary": "`TransferBufferPool.maxBorrowedBytes()`가 자기 회귀 test를 지목하는데 그 test가 읽지 않는다", "disposition": "EMITTED", "target": "case:a08-f005-transferbufferpool-maxborrowedbytes", "reason": null, "topic": "verification-path-coverage" }, { "id": "A08-F006", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/08-adapter-outbound-fileserver.md#L453" ], "sourceHeading": "40. P2 — scriptable 콘텐츠 탐지가 접두사 **시작**에만 고정돼 있어 BOM·NUL·주석으로 우회된다", "summary": "scriptable 콘텐츠 탐지가 접두사 **시작**에만 고정돼 있어 BOM·NUL·주석으로 우회된다", "disposition": "MERGED", "target": "case:scriptable-detection-bypassed-by-a-bom", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A09-F001", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/09-adapter-outbound-objectstorage.md#L90" ], "sourceHeading": "5. P3 — production 판정이 두 개의 리터럴 프로파일 이름에 걸려 있다", "summary": "production 판정이 두 개의 리터럴 프로파일 이름에 걸려 있다", "disposition": "EMITTED", "target": "case:analysis-finding-a09-f001", "reason": null, "topic": "runtime-reachability-and-composition" }, { "id": "A09-F002", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/09-adapter-outbound-objectstorage.md#L416" ], "sourceHeading": "38. P2 — 직접 multipart의 마지막 part는 grant를 받을 수 없다", "summary": "직접 multipart의 마지막 part는 grant를 받을 수 없다", "disposition": "MERGED", "target": "case:the-last-part-cannot-get-a-grant", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A09-F003", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/09-adapter-outbound-objectstorage.md#L439" ], "sourceHeading": "39. P2 — 서명된 grant의 endpoint 검증이 upload 경로에만 있다", "summary": "서명된 grant의 endpoint 검증이 upload 경로에만 있다", "disposition": "MERGED", "target": "case:endpoint-check-only-on-upload", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A09-F004", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/09-adapter-outbound-objectstorage.md#L469" ], "sourceHeading": "41. P2 — 그러나 R0 경계가 문서에만 있고 compile 경로에서 닫히지 않는다", "summary": "그러나 R0 경계가 문서에만 있고 compile 경로에서 닫히지 않는다", "disposition": "EMITTED", "target": "case:analysis-finding-a09-f004", "reason": null, "topic": "declaration-and-document-drift" }, { "id": "A09-F005", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/09-adapter-outbound-objectstorage.md#L552" ], "sourceHeading": "49. P2 — APPLY를 켜는 설정은 있고, 승인을 검증하는 bean은 없다", "summary": "APPLY를 켜는 설정은 있고, 승인을 검증하는 bean은 없다", "disposition": "MERGED", "target": "case:apply-is-a-setting-approval-is-not", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A09-F006", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/09-adapter-outbound-objectstorage.md#L573" ], "sourceHeading": "50. P3 — nonce replay 경계가 결과를 읽고 버린다", "summary": "nonce replay 경계가 결과를 읽고 버린다", "disposition": "EMITTED", "target": "case:analysis-finding-a09-f006", "reason": null, "topic": "state-ownership-and-concurrency" }, { "id": "A10-F001", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/10-adapter-outbound-cache-redis.md#L105" ], "sourceHeading": "5. P2 — README readiness 표와 build.gradle 주석이 실제 소스와 어긋난다", "summary": "README readiness 표와 build.gradle 주석이 실제 소스와 어긋난다", "disposition": "EMITTED", "target": "case:a10-f001-readme", "reason": null, "topic": "verification-path-coverage" }, { "id": "A10-F002", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/10-adapter-outbound-cache-redis.md#L136" ], "sourceHeading": "6. P2 — startup probe가 production에서 한 번도 실행되지 않는다", "summary": "startup probe가 production에서 한 번도 실행되지 않는다", "disposition": "MERGED", "target": "case:a-startup-probe-that-never-runs", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A10-F003", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/10-adapter-outbound-cache-redis.md#L235" ], "sourceHeading": "15. P2 — SDK가 선언한 두 진입점에 구현이 없다", "summary": "SDK가 선언한 두 진입점에 구현이 없다", "disposition": "EMITTED", "target": "case:analysis-finding-a10-f003", "reason": null, "topic": "runtime-reachability-and-composition" }, { "id": "A10-F004", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/10-adapter-outbound-cache-redis.md#L247" ], "sourceHeading": "16. P3 — Pub/Sub 채널만 렌더 크기 검증을 받지 않는다", "summary": "Pub/Sub 채널만 렌더 크기 검증을 받지 않는다", "disposition": "EMITTED", "target": "case:a10-f004-pub-sub", "reason": null, "topic": "verification-path-coverage" }, { "id": "A10-F005", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/10-adapter-outbound-cache-redis.md#L261" ], "sourceHeading": "17. P3 — 다중 키 fan-in 중 HyperLogLog `merge`만 budget이 없다", "summary": "다중 키 fan-in 중 HyperLogLog `merge`만 budget이 없다", "disposition": "EMITTED", "target": "case:a10-f005-hyperloglog-merge", "reason": null, "topic": "contract-domain-and-bounds" }, { "id": "A10-F006", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/10-adapter-outbound-cache-redis.md#L359" ], "sourceHeading": "26. P3 — `requireIdentifier`의 다섯 검사 중 둘은 도달할 수 없다", "summary": "`requireIdentifier`의 다섯 검사 중 둘은 도달할 수 없다", "disposition": "EMITTED", "target": "case:a10-f006-requireidentifier", "reason": null, "topic": "contract-domain-and-bounds" }, { "id": "A10-F007", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/10-adapter-outbound-cache-redis.md#L469" ], "sourceHeading": "36. P3 — 패턴 구독의 R2 승인만 호출자가 아니라 배포에 대해 이루어진다", "summary": "패턴 구독의 R2 승인만 호출자가 아니라 배포에 대해 이루어진다", "disposition": "EMITTED", "target": "case:analysis-finding-a10-f007", "reason": null, "topic": "runtime-contract-correctness" }, { "id": "A10-F008", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/10-adapter-outbound-cache-redis.md#L486" ], "sourceHeading": "37. P3 — permit 정책 이름이 세 곳에 문자열로 존재하고 교차 검사가 없다", "summary": "permit 정책 이름이 세 곳에 문자열로 존재하고 교차 검사가 없다", "disposition": "EMITTED", "target": "case:analysis-finding-a10-f008", "reason": null, "topic": "runtime-contract-correctness" }, { "id": "A10-F009", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/10-adapter-outbound-cache-redis.md#L599" ], "sourceHeading": "47. P2 — \"build gate\"라고 불리는 catalog drift 검사가 어디에서도 실행되지 않는다", "summary": "\"build gate\"라고 불리는 catalog drift 검사가 어디에서도 실행되지 않는다", "disposition": "MERGED", "target": "case:a-build-gate-that-is-not-in-the-build", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A10-F010", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/10-adapter-outbound-cache-redis.md#L697" ], "sourceHeading": "56. P3 — NOSCRIPT 복구가 다섯 벌로 구현돼 있고 넷은 스크립트 레지스트리를 지나지 않는다", "summary": "NOSCRIPT 복구가 다섯 벌로 구현돼 있고 넷은 스크립트 레지스트리를 지나지 않는다", "disposition": "MERGED", "target": "case:five-copies-of-noscript-recovery", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A10-F011", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/10-adapter-outbound-cache-redis.md#L795" ], "sourceHeading": "64. P2 — 의미 어댑터 다섯이 `CommandPolicyGuard`를 지나지 않는다", "summary": "의미 어댑터 다섯이 `CommandPolicyGuard`를 지나지 않는다", "disposition": "MERGED", "target": "case:five-adapters-bypass-the-single-admission-point", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A11-F001", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/11-adapter-outbound-httpclient.md#L97" ], "sourceHeading": "4. P3 — `close()`가 실패하면 drain 스케줄러 스레드가 남는다", "summary": "`close()`가 실패하면 drain 스케줄러 스레드가 남는다", "disposition": "EMITTED", "target": "case:a11-f001-close", "reason": null, "topic": "runtime-contract-correctness" }, { "id": "A11-F002", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/11-adapter-outbound-httpclient.md#L122" ], "sourceHeading": "5. P3 — `POOL_ROUTE_EXCEEDS_TOTAL` 위반 코드는 발화할 수 없다", "summary": "`POOL_ROUTE_EXCEEDS_TOTAL` 위반 코드는 발화할 수 없다", "disposition": "EMITTED", "target": "case:a11-f002-pool-route-exceeds-total", "reason": null, "topic": "runtime-contract-correctness" }, { "id": "A11-F003", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/11-adapter-outbound-httpclient.md#L140" ], "sourceHeading": "6. P3 — 위반 코드 34종 중 22종이 어떤 test에서도 이름으로 확인되지 않는다", "summary": "위반 코드 34종 중 22종이 어떤 test에서도 이름으로 확인되지 않는다", "disposition": "EMITTED", "target": "case:analysis-finding-a11-f003", "reason": null, "topic": "verification-path-coverage" }, { "id": "A11-F004", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/11-adapter-outbound-httpclient.md#L225" ], "sourceHeading": "14. P3 — `Number`가 허용 목록에 있어 가변 숫자 타입이 REPLAYABLE로 인증된다", "summary": "`Number`가 허용 목록에 있어 가변 숫자 타입이 REPLAYABLE로 인증된다", "disposition": "EMITTED", "target": "case:a11-f004-number", "reason": null, "topic": "state-ownership-and-concurrency" }, { "id": "A11-F005", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/11-adapter-outbound-httpclient.md#L312" ], "sourceHeading": "22. P2 — 로컬 거부 경로에서 회로 브레이커 permission이 반환되지 않는다", "summary": "로컬 거부 경로에서 회로 브레이커 permission이 반환되지 않는다", "disposition": "MERGED", "target": "case:a-circuit-breaker-permit-that-leaks-on-local-rejection", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A11-F006", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/11-adapter-outbound-httpclient.md#L400" ], "sourceHeading": "30. P3 — `BoundedDataBufferFlux`의 두 연산자가 이름만 있고 아무것도 하지 않는다", "summary": "`BoundedDataBufferFlux`의 두 연산자가 이름만 있고 아무것도 하지 않는다", "disposition": "EMITTED", "target": "case:a11-f006-boundeddatabufferflux", "reason": null, "topic": "contract-domain-and-bounds" }, { "id": "A11-F007", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/11-adapter-outbound-httpclient.md#L559" ], "sourceHeading": "47. P3 — 동적 대상 DNS 핀 능력 검사가 블로킹 오버로드에만 있다", "summary": "동적 대상 DNS 핀 능력 검사가 블로킹 오버로드에만 있다", "disposition": "EMITTED", "target": "case:a11-f007-dns", "reason": null, "topic": "transport-and-provider-semantics" }, { "id": "A11-F008", "kindCandidate": "CASE", "priority": "P1", "sourceRefs": [ "analysis/11-adapter-outbound-httpclient.md#L603" ], "sourceHeading": "51. P1 — 영구 TLS 실패가 재시도 가능한 CONNECT 로 분류된다 (저장소의 자기 test 3건이 실패 중)", "summary": "영구 TLS 실패가 재시도 가능한 CONNECT 로 분류된다 (저장소의 자기 test 3건이 실패 중)", "disposition": "MERGED", "target": "case:permanent-tls-classified-as-retryable-connect", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A12-F001", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/12-adapter-outbound-messaging.md#L66" ], "sourceHeading": "3. P2 — `check`에 붙은 `verifyJsonSchemaRuntimeGraph`가 실행되면 실패한다", "summary": "`check`에 붙은 `verifyJsonSchemaRuntimeGraph`가 실행되면 실패한다", "disposition": "EMITTED", "target": "case:a12-f001-check-verifyjsonschemaruntimegraph", "reason": null, "topic": "schema-and-data-contracts" }, { "id": "A12-F002", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/12-adapter-outbound-messaging.md#L102" ], "sourceHeading": "4. P3 — README의 `jackson-databind` 부재 주장이 현재 상태와 어긋난다", "summary": "README의 `jackson-databind` 부재 주장이 현재 상태와 어긋난다", "disposition": "EMITTED", "target": "case:a12-f002-jackson-databind", "reason": null, "topic": "declaration-and-document-drift" }, { "id": "A13-F001", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/13-adapter-outbound-notification.md#L160" ], "sourceHeading": "P2 — `SINGLE` 전용 가드가 먼저 던져 다중 타깃 검증 전체가 도달 불가이고, 그것을 검증한다는 테스트는 다른 가드에 걸려 통과한다", "summary": "`SINGLE` 전용 가드가 먼저 던져 다중 타깃 검증 전체가 도달 불가이고, 그것을 검증한다는 테스트는 다른 가드에 걸려 통과한다", "disposition": "MERGED", "target": "case:a-test-that-passed-on-the-wrong-guard", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A13-F002", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/13-adapter-outbound-notification.md#L304" ], "sourceHeading": "P2 — `AUTHENTICATION_FAILED`를 지우지 않는다는 `resumeHealthy`의 보장이, 관리자 평면에 노출된 2단계 시퀀스로 우회된다", "summary": "`AUTHENTICATION_FAILED`를 지우지 않는다는 `resumeHealthy`의 보장이, 관리자 평면에 노출된 2단계 시퀀스로 우회된다", "disposition": "EMITTED", "target": "case:a13-f002-authentication-failed-resumehealthy", "reason": null, "topic": "runtime-contract-correctness" }, { "id": "A13-F003", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/13-adapter-outbound-notification.md#L414" ], "sourceHeading": "17.1 P2 — \"모든 reveal은 감사된다\"고 선언한 `AccessContext`를 읽는 코드가 저장소에 하나도 없다", "summary": "\"모든 reveal은 감사된다\"고 선언한 `AccessContext`를 읽는 코드가 저장소에 하나도 없다", "disposition": "EMITTED", "target": "case:a13-f003-accesscontext", "reason": null, "topic": "security-policy-enforcement" }, { "id": "A13-F004", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/13-adapter-outbound-notification.md#L460" ], "sourceHeading": "17.2 P2 — Thymeleaf 예외 메시지 삭제 가드가 프로덕션이 타지 않는 오버로드에만 있다", "summary": "Thymeleaf 예외 메시지 삭제 가드가 프로덕션이 타지 않는 오버로드에만 있다", "disposition": "EMITTED", "target": "case:a13-f004-thymeleaf", "reason": null, "topic": "runtime-contract-correctness" }, { "id": "A13-F005", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/13-adapter-outbound-notification.md#L620" ], "sourceHeading": "21.1 P3 — 음수 `Retry-After` 헤더가 throttle 결과 대신 `IllegalArgumentException`을 만든다", "summary": "음수 `Retry-After` 헤더가 throttle 결과 대신 `IllegalArgumentException`을 만든다", "disposition": "EMITTED", "target": "case:a13-f005-retry-after-illegalargumentexception", "reason": null, "topic": "schema-and-data-contracts" }, { "id": "A13-F006", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/13-adapter-outbound-notification.md#L725" ], "sourceHeading": "25.1 P2 — 클라이언트가 제공하는 Web Push 엔드포인트가 SSRF 가드를 지나지 않는다 (모듈 내 최고 영향도)", "summary": "클라이언트가 제공하는 Web Push 엔드포인트가 SSRF 가드를 지나지 않는다 (모듈 내 최고 영향도)", "disposition": "MERGED", "target": "case:a-weaker-private-copy-on-the-wired-path", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A13-F007", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/13-adapter-outbound-notification.md#L779" ], "sourceHeading": "25.2 P2 — \"상한을 두고 읽는다\"는 본문 핸들러가 전부 읽은 뒤에 자른다", "summary": "\"상한을 두고 읽는다\"는 본문 핸들러가 전부 읽은 뒤에 자른다", "disposition": "EMITTED", "target": "case:analysis-finding-a13-f007", "reason": null, "topic": "contract-domain-and-bounds" }, { "id": "A13-F008", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/13-adapter-outbound-notification.md#L815" ], "sourceHeading": "25.3 P3 — SigV4가 서명한 `host`에 포트가 없어, 기본 포트가 아닌 엔드포인트에서 서명이 어긋난다", "summary": "SigV4가 서명한 `host`에 포트가 없어, 기본 포트가 아닌 엔드포인트에서 서명이 어긋난다", "disposition": "EMITTED", "target": "case:a13-f008-host", "reason": null, "topic": "transport-and-provider-semantics" }, { "id": "A13-F009", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/13-adapter-outbound-notification.md#L828" ], "sourceHeading": "25.4 P3 — SigV4 서명 키 파생이 비밀을 지울 수 없는 `String`으로 승격시킨다", "summary": "SigV4 서명 키 파생이 비밀을 지울 수 없는 `String`으로 승격시킨다", "disposition": "EMITTED", "target": "case:a13-f009-sigv4-string", "reason": null, "topic": "transport-and-provider-semantics" }, { "id": "A13-F010", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/13-adapter-outbound-notification.md#L941" ], "sourceHeading": "29.1 P2 — FCM만 \"커밋 후 응답 손실 = ambiguous\" 규칙 밖에 있고, 그 FCM이 두 계약 집합 어디에도 없다", "summary": "FCM만 \"커밋 후 응답 손실 = ambiguous\" 규칙 밖에 있고, 그 FCM이 두 계약 집합 어디에도 없다", "disposition": "EMITTED", "target": "case:analysis-finding-a13-f010", "reason": null, "topic": "transport-and-provider-semantics" }, { "id": "A13-F011", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/13-adapter-outbound-notification.md#L974" ], "sourceHeading": "29.2 P3 — 공유 provider 계약이 8종 중 3종에서만 상속되고, 강제 장치가 없다", "summary": "공유 provider 계약이 8종 중 3종에서만 상속되고, 강제 장치가 없다", "disposition": "EMITTED", "target": "case:analysis-finding-a13-f011", "reason": null, "topic": "transport-and-provider-semantics" }, { "id": "A14-F001", "kindCandidate": "CASE", "priority": "P1", "sourceRefs": [ "analysis/14-adapter-inbound-web.md#L289" ], "sourceHeading": "8.1 P1 — RFC 9457 계약 23개 파일이 출하 애플리케이션에 등록되지 않는다. 두 플랫폼 자동설정은 협력자 빈만 소유하고, 스캔에서 제외된 여섯 컴포넌트는 소유하지 않는다", "summary": "RFC 9457 계약 23개 파일이 출하 애플리케이션에 등록되지 않는다. 두 플랫폼 자동설정은 협력자 빈만 소유하고, 스캔에서 제외된 여섯 컴포넌트는 소유하지 않는다", "disposition": "MERGED", "target": "case:scan-exclusion-without-an-owner", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A14-F002", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/14-adapter-inbound-web.md#L364" ], "sourceHeading": "8.2 P3 — `WebProblemSanitizer.alreadySafe`가 죽은 메서드이고 그 안의 조건도 죽어 있다", "summary": "`WebProblemSanitizer.alreadySafe`가 죽은 메서드이고 그 안의 조건도 죽어 있다", "disposition": "EMITTED", "target": "case:a14-f002-webproblemsanitizer-alreadysafe", "reason": null, "topic": "runtime-contract-correctness" }, { "id": "A14-F003", "kindCandidate": "CASE", "priority": "P1", "sourceRefs": [ "analysis/14-adapter-inbound-web.md#L487" ], "sourceHeading": "12.1 P1 — 플랫폼 요청 컨텍스트가 서블릿에는 생산자가 없고, 리액티브에는 익명 액터로 고정되어 있다", "summary": "플랫폼 요청 컨텍스트가 서블릿에는 생산자가 없고, 리액티브에는 익명 액터로 고정되어 있다", "disposition": "EMITTED", "target": "case:analysis-finding-a14-f003", "reason": null, "topic": "runtime-contract-correctness" }, { "id": "A14-F004", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/14-adapter-inbound-web.md#L546" ], "sourceHeading": "12.2 P2 — 프레임워크 자유 신원 모델과 교차 테넌트 가드가 프로덕션에서 한 번도 참조되지 않는다", "summary": "프레임워크 자유 신원 모델과 교차 테넌트 가드가 프로덕션에서 한 번도 참조되지 않는다", "disposition": "EMITTED", "target": "case:analysis-finding-a14-f004", "reason": null, "topic": "runtime-contract-correctness" }, { "id": "A14-F005", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/14-adapter-inbound-web.md#L566" ], "sourceHeading": "12.3 P3 — `publicPaths`가 `RestrictedPathRule`보다 먼저 등록되어, 넓은 공개 경로 하나가 관리 평면 규칙을 조용히 덮는다", "summary": "`publicPaths`가 `RestrictedPathRule`보다 먼저 등록되어, 넓은 공개 경로 하나가 관리 평면 규칙을 조용히 덮는다", "disposition": "EMITTED", "target": "case:a14-f005-publicpaths-restrictedpathrule", "reason": null, "topic": "security-policy-enforcement" }, { "id": "A14-F006", "kindCandidate": "CASE", "priority": "P1", "sourceRefs": [ "analysis/14-adapter-inbound-web.md#L661" ], "sourceHeading": "16.1 P1 — 용량 보호 계층 전체(41 main files)가 자기 테스트 픽스처 안에서만 실행된다", "summary": "용량 보호 계층 전체(41 main files)가 자기 테스트 픽스처 안에서만 실행된다", "disposition": "EMITTED", "target": "case:analysis-finding-a14-f006", "reason": null, "topic": "verification-path-coverage" }, { "id": "A14-F007", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/14-adapter-inbound-web.md#L685" ], "sourceHeading": "16.2 P2 — 리액티브 전송에는 속도 제한 경로가 하나도 없다", "summary": "리액티브 전송에는 속도 제한 경로가 하나도 없다", "disposition": "EMITTED", "target": "case:analysis-finding-a14-f007", "reason": null, "topic": "runtime-contract-correctness" }, { "id": "A14-F008", "kindCandidate": "CASE", "priority": "P1", "sourceRefs": [ "analysis/14-adapter-inbound-web.md#L777" ], "sourceHeading": "20.1 P1 — 멱등 실행 계층과 durable-operation 표면이 픽스처에서만 조립된다", "summary": "멱등 실행 계층과 durable-operation 표면이 픽스처에서만 조립된다", "disposition": "EMITTED", "target": "case:analysis-finding-a14-f008", "reason": null, "topic": "runtime-reachability-and-composition" }, { "id": "A14-F009", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/14-adapter-inbound-web.md#L791" ], "sourceHeading": "20.3 P3 — 의미 지문이 길이 프레이밍 없이 구분자로 만들어진다", "summary": "의미 지문이 길이 프레이밍 없이 구분자로 만들어진다", "disposition": "EMITTED", "target": "case:analysis-finding-a14-f009", "reason": null, "topic": "contract-domain-and-bounds" }, { "id": "A14-F010", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/14-adapter-inbound-web.md#L883" ], "sourceHeading": "24.1 P2 — 배선된 캐시 필터의 `no-store`가 배선된 조건부 읽기 경로를 무력화하고, 둘을 조정하려고 만든 패키지는 참조 0이다", "summary": "배선된 캐시 필터의 `no-store`가 배선된 조건부 읽기 경로를 무력화하고, 둘을 조정하려고 만든 패키지는 참조 0이다", "disposition": "EMITTED", "target": "case:a14-f010-no-store", "reason": null, "topic": "runtime-reachability-and-composition" }, { "id": "A14-F011", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/14-adapter-inbound-web.md#L990" ], "sourceHeading": "28.1 P2 — `maxArrayElements`가 선언만 되고 강제되지 않으며, 바이트 예산 백스톱도 없다", "summary": "`maxArrayElements`가 선언만 되고 강제되지 않으며, 바이트 예산 백스톱도 없다", "disposition": "EMITTED", "target": "case:a14-f011-maxarrayelements", "reason": null, "topic": "contract-domain-and-bounds" }, { "id": "A14-F012", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/14-adapter-inbound-web.md#L1121" ], "sourceHeading": "32.1 P2 — 요청 식별자를 클라이언트가 고를 수 없다는 정책이, 뒤에 도는 다른 배선 필터에 의해 뒤집힌다", "summary": "요청 식별자를 클라이언트가 고를 수 없다는 정책이, 뒤에 도는 다른 배선 필터에 의해 뒤집힌다", "disposition": "MERGED", "target": "case:a-policy-reversed-by-a-later-filter", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A14-F013", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/14-adapter-inbound-web.md#L1137" ], "sourceHeading": "32.2 P2 — forwarded 헤더 신뢰 판정이 Nginx 설정에만 있고, 그것을 위해 쓴 Java 정책 421 LOC은 배선되지 않는다", "summary": "forwarded 헤더 신뢰 판정이 Nginx 설정에만 있고, 그것을 위해 쓴 Java 정책 421 LOC은 배선되지 않는다", "disposition": "MERGED", "target": "case:trust-policy-lives-in-nginx-not-in-the-code", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A14-F014", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/14-adapter-inbound-web.md#L1251" ], "sourceHeading": "36.1 P2 — 선언된 Advanced 능력 11개 중 9개는 켜는 방법이 없다", "summary": "선언된 Advanced 능력 11개 중 9개는 켜는 방법이 없다", "disposition": "EMITTED", "target": "case:a14-f014-advanced", "reason": null, "topic": "runtime-contract-correctness" }, { "id": "A14-F015", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/14-adapter-inbound-web.md#L1263" ], "sourceHeading": "36.2 P3 — `VirtualThreadProfile.propertyName()`이 아무것도 게이트하지 않는 이름을 반환한다", "summary": "`VirtualThreadProfile.propertyName()`이 아무것도 게이트하지 않는 이름을 반환한다", "disposition": "EMITTED", "target": "case:a14-f015-virtualthreadprofile-propertyname", "reason": null, "topic": "runtime-reachability-and-composition" }, { "id": "A14-F016", "kindCandidate": "CASE", "priority": "P1", "sourceRefs": [ "analysis/14-adapter-inbound-web.md#L1362" ], "sourceHeading": "40.1 P1 — 이 leaf의 리액티브 절반 29개 파일은 어떤 출하 배포에서도 활성화될 수 없다", "summary": "이 leaf의 리액티브 절반 29개 파일은 어떤 출하 배포에서도 활성화될 수 없다", "disposition": "EMITTED", "target": "case:analysis-finding-a14-f016", "reason": null, "topic": "runtime-reachability-and-composition" }, { "id": "A14-F017", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/14-adapter-inbound-web.md#L1478" ], "sourceHeading": "44.1 P3 — `SpringMvcRouteInventoryCollector` 138줄에 참조가 하나도 없다", "summary": "`SpringMvcRouteInventoryCollector` 138줄에 참조가 하나도 없다", "disposition": "EMITTED", "target": "case:a14-f017-springmvcrouteinventorycollector", "reason": null, "topic": "runtime-reachability-and-composition" }, { "id": "A14-F018", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/14-adapter-inbound-web.md#L1484" ], "sourceHeading": "44.2 P3 — `WebPlatformStartupValidator`가 시작 시 실행되지 않는다", "summary": "`WebPlatformStartupValidator`가 시작 시 실행되지 않는다", "disposition": "EMITTED", "target": "case:a14-f018-webplatformstartupvalidator", "reason": null, "topic": "runtime-reachability-and-composition" }, { "id": "A14-F019", "kindCandidate": "CASE", "priority": "P1", "sourceRefs": [ "analysis/14-adapter-inbound-web.md#L1559" ], "sourceHeading": "48.1 P1 — 크로스 스택 게이트가 검증하는 조립은 픽스처의 조립이고, 플랫폼의 조립이 아니다", "summary": "크로스 스택 게이트가 검증하는 조립은 픽스처의 조립이고, 플랫폼의 조립이 아니다", "disposition": "EMITTED", "target": "case:analysis-finding-a14-f019", "reason": null, "topic": "verification-path-coverage" }, { "id": "A15-F001", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/15-adapter-inbound-grpc.md#L155" ], "sourceHeading": "4.1 P2 — 원인 사슬 순회가 2-순환에서 무한 루프에 빠지고, 저장소는 이미 그 사례를 이름으로 적어 두었다", "summary": "원인 사슬 순회가 2-순환에서 무한 루프에 빠지고, 저장소는 이미 그 사례를 이름으로 적어 두었다", "disposition": "EMITTED", "target": "case:analysis-finding-a15-f001", "reason": null, "topic": "runtime-contract-correctness" }, { "id": "A15-F002", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/15-adapter-inbound-grpc.md#L171" ], "sourceHeading": "4.2 P3 — 설정 바인딩이 마스터 스위치 밖에서 일어난다. 컴포지션 루트의 자기 규칙과 어긋난다", "summary": "설정 바인딩이 마스터 스위치 밖에서 일어난다. 컴포지션 루트의 자기 규칙과 어긋난다", "disposition": "EMITTED", "target": "case:analysis-finding-a15-f002", "reason": null, "topic": "runtime-reachability-and-composition" }, { "id": "A16-F001", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/16-adapter-inbound-graphql.md#L242" ], "sourceHeading": "8.1 P2 — 스키마 조립·계약 정체성·해시 사슬이 통째로 미배선이고, 그것을 발행할 액추에이터 엔드포인트도 등록되지 않는다", "summary": "스키마 조립·계약 정체성·해시 사슬이 통째로 미배선이고, 그것을 발행할 액추에이터 엔드포인트도 등록되지 않는다", "disposition": "EMITTED", "target": "case:analysis-finding-a16-f001", "reason": null, "topic": "runtime-reachability-and-composition" }, { "id": "A16-F002", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/16-adapter-inbound-graphql.md#L265" ], "sourceHeading": "8.2 P3 — `@oneOf` 게이트와 런타임 검증기가 미배선이고, \"플랫폼이 강제한다\"는 서술이 그것을 넘어선다", "summary": "`@oneOf` 게이트와 런타임 검증기가 미배선이고, \"플랫폼이 강제한다\"는 서술이 그것을 넘어선다", "disposition": "EMITTED", "target": "case:a16-f002-oneof", "reason": null, "topic": "verification-path-coverage" }, { "id": "A16-F003", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/16-adapter-inbound-graphql.md#L366" ], "sourceHeading": "12.1 P2 — 5계층 예산 모델에서 요청 계층만 강제되고, 나머지 파생이 전부 미배선이다", "summary": "5계층 예산 모델에서 요청 계층만 강제되고, 나머지 파생이 전부 미배선이다", "disposition": "EMITTED", "target": "case:analysis-finding-a16-f003", "reason": null, "topic": "runtime-reachability-and-composition" }, { "id": "A16-F004", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/16-adapter-inbound-graphql.md#L387" ], "sourceHeading": "12.2 P3 — 연산 이름 정책의 두 구현 중 하나만 배선되고, 미배선 쪽만 `GraphQlOperationNamePolicy`를 쓴다", "summary": "연산 이름 정책의 두 구현 중 하나만 배선되고, 미배선 쪽만 `GraphQlOperationNamePolicy`를 쓴다", "disposition": "EMITTED", "target": "case:a16-f004-graphqloperationnamepolicy", "reason": null, "topic": "runtime-reachability-and-composition" }, { "id": "A16-F005", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/16-adapter-inbound-graphql.md#L495" ], "sourceHeading": "16.1 P2 — 설정으로 정한 파서 한계가 graphql-java에 설치되지 않는다", "summary": "설정으로 정한 파서 한계가 graphql-java에 설치되지 않는다", "disposition": "EMITTED", "target": "case:analysis-finding-a16-f005", "reason": null, "topic": "runtime-reachability-and-composition" }, { "id": "A16-F006", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/16-adapter-inbound-graphql.md#L509" ], "sourceHeading": "16.2 P2 — 프로파일별 정책 매니페스트가 미배선이라, 자격에서 해석된 프로파일이 아무 예산도 선택하지 않는다", "summary": "프로파일별 정책 매니페스트가 미배선이라, 자격에서 해석된 프로파일이 아무 예산도 선택하지 않는다", "disposition": "EMITTED", "target": "case:analysis-finding-a16-f006", "reason": null, "topic": "runtime-reachability-and-composition" }, { "id": "A16-F007", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/16-adapter-inbound-graphql.md#L602" ], "sourceHeading": "20.1 P2 — `http/`가 등급표에서 `wired`로 선언돼 있으나 그 등급의 정의를 만족하지 않는다", "summary": "`http/`가 등급표에서 `wired`로 선언돼 있으나 그 등급의 정의를 만족하지 않는다", "disposition": "MERGED", "target": "case:seven-rows-downgraded-by-the-family-itself", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A16-F008", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/16-adapter-inbound-graphql.md#L664" ], "sourceHeading": "20.2 P3 — 파싱·검증 실패에 플랫폼 매퍼가 없다", "summary": "파싱·검증 실패에 플랫폼 매퍼가 없다", "disposition": "EMITTED", "target": "case:analysis-finding-a16-f008", "reason": null, "topic": "verification-path-coverage" }, { "id": "A16-F009", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/16-adapter-inbound-graphql.md#L750" ], "sourceHeading": "24.1 P2 — 시작 검증기가 제공되지 않는 보안 성질을 요구한다", "summary": "시작 검증기가 제공되지 않는 보안 성질을 요구한다", "disposition": "MERGED", "target": "case:a-startup-validator-that-requires-a-key-nothing-signs-with", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A16-F010", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/16-adapter-inbound-graphql.md#L869" ], "sourceHeading": "29.1 P2 — `http/` 행이 등급표의 자기 규칙을 어긴다 (§20.1 참조)", "summary": "`http/` 행이 등급표의 자기 규칙을 어긴다 (§20.1 참조)", "disposition": "MERGED", "target": "case:seven-rows-downgraded-by-the-family-itself", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A16-F011", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/16-adapter-inbound-graphql.md#L873" ], "sourceHeading": "29.2 P3 — 기계가 읽는 능력 매니페스트와 사람이 읽는 등급표가 커서 서명에 대해 다르게 답한다", "summary": "기계가 읽는 능력 매니페스트와 사람이 읽는 등급표가 커서 서명에 대해 다르게 답한다", "disposition": "EMITTED", "target": "case:analysis-finding-a16-f011", "reason": null, "topic": "contract-domain-and-bounds" }, { "id": "A16-F012", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/16-adapter-inbound-graphql.md#L986" ], "sourceHeading": "39.1 P3 — \"기본 비활성\"은 존재하지 않는 스위치의 기본값을 서술한다", "summary": "\"기본 비활성\"은 존재하지 않는 스위치의 기본값을 서술한다", "disposition": "EMITTED", "target": "case:analysis-finding-a16-f012", "reason": null, "topic": "runtime-reachability-and-composition" }, { "id": "A17-F001", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/17-adapter-inbound-websocket.md#L117" ], "sourceHeading": "4.1 P2 — `backend.websocket` 플랫폼(약 90개 main 파일)에 조립 지점이 없고, 모듈 SSOT 문서에 존재하지 않는다", "summary": "`backend.websocket` 플랫폼(약 90개 main 파일)에 조립 지점이 없고, 모듈 SSOT 문서에 존재하지 않는다", "disposition": "MERGED", "target": "case:build-only-exempts-ninety-files-from-todays-incident", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A17-F002", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/17-adapter-inbound-websocket.md#L257" ], "sourceHeading": "13.1 P2 — 연결 티켓·origin 정책·메시지 권한·연결 예산이 요청 경로 밖이고, 그중 일부는 STOMP 어댑터가 다른 방식으로 대체한다", "summary": "연결 티켓·origin 정책·메시지 권한·연결 예산이 요청 경로 밖이고, 그중 일부는 STOMP 어댑터가 다른 방식으로 대체한다", "disposition": "EMITTED", "target": "case:a17-f002-stomp", "reason": null, "topic": "security-policy-enforcement" }, { "id": "A17-F003", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/17-adapter-inbound-websocket.md#L410" ], "sourceHeading": "22.1 P3 — 능력 프로퍼티 이름을 만드는 코드와 실제 게이트가 다른 접두사를 쓴다", "summary": "능력 프로퍼티 이름을 만드는 코드와 실제 게이트가 다른 접두사를 쓴다", "disposition": "EMITTED", "target": "case:analysis-finding-a17-f003", "reason": null, "topic": "declaration-and-document-drift" }, { "id": "A18-F001", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/18-app-bootstrap.md#L198" ], "sourceHeading": "4.1b P3 — 출하되는 web 어댑터의 스위치가 활성화 모델 밖에 있다", "summary": "출하되는 web 어댑터의 스위치가 활성화 모델 밖에 있다", "disposition": "EMITTED", "target": "case:analysis-finding-a18-f001", "reason": null, "topic": "runtime-reachability-and-composition" }, { "id": "A18-F002", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/18-app-bootstrap.md#L533" ], "sourceHeading": "26.1 P3 — 실패는 환경 원인이며, 그 테스트의 도구 가드가 불완전하다", "summary": "실패는 환경 원인이며, 그 테스트의 도구 가드가 불완전하다", "disposition": "EMITTED", "target": "case:analysis-finding-a18-f002", "reason": null, "topic": "verification-path-coverage" }, { "id": "A19-F001", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/19-messaging-platform.md#L231" ], "sourceHeading": "3.4 P2 — capability 12개 중 main 코드가 읽는 것은 3개, 거부하는 것은 1개", "summary": "capability 12개 중 main 코드가 읽는 것은 3개, 거부하는 것은 1개", "disposition": "EMITTED", "target": "case:analysis-finding-a19-f001", "reason": null, "topic": "runtime-contract-correctness" }, { "id": "A19-F002", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/19-messaging-platform.md#L288" ], "sourceHeading": "3.5 P2 — 8개 profile validator 중 조립에서 실행되는 것은 3개", "summary": "8개 profile validator 중 조립에서 실행되는 것은 3개", "disposition": "EMITTED", "target": "case:analysis-finding-a19-f002", "reason": null, "topic": "runtime-reachability-and-composition" }, { "id": "A19-F003", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/19-messaging-platform.md#L325" ], "sourceHeading": "3.6 P3 — `messaging-reliability-api`는 main 13파일 · 817 LOC에 테스트가 0개다", "summary": "`messaging-reliability-api`는 main 13파일 · 817 LOC에 테스트가 0개다", "disposition": "EMITTED", "target": "case:a19-f003-messaging-reliability-api", "reason": null, "topic": "verification-path-coverage" }, { "id": "A19-F004", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/19-messaging-platform.md#L390" ], "sourceHeading": "4.3 P2 — 스키마 호환성 검증기는 출하 leaf에 있고, main 코드에서 호출되지 않는다", "summary": "스키마 호환성 검증기는 출하 leaf에 있고, main 코드에서 호출되지 않는다", "disposition": "EMITTED", "target": "case:analysis-finding-a19-f004", "reason": null, "topic": "verification-path-coverage" }, { "id": "A19-F005", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/19-messaging-platform.md#L415" ], "sourceHeading": "4.4 P2 — 호환성 게이트를 가진 두 포맷은 build-only이고, 출하되는 유일한 코덱에는 게이트가 없다", "summary": "호환성 게이트를 가진 두 포맷은 build-only이고, 출하되는 유일한 코덱에는 게이트가 없다", "disposition": "EMITTED", "target": "case:analysis-finding-a19-f005", "reason": null, "topic": "runtime-contract-correctness" }, { "id": "A19-F006", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/19-messaging-platform.md#L431" ], "sourceHeading": "4.5 P2 — `messaging-cloudevents`는 출하 leaf이고 starter의 의존이며 소비자가 없다", "summary": "`messaging-cloudevents`는 출하 leaf이고 starter의 의존이며 소비자가 없다", "disposition": "EMITTED", "target": "case:a19-f006-messaging-cloudevents", "reason": null, "topic": "runtime-reachability-and-composition" }, { "id": "A19-F007", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/19-messaging-platform.md#L456" ], "sourceHeading": "5.1 P2 — 출하되는 publish 경로는 관측을 하나도 기록하지 않는다", "summary": "출하되는 publish 경로는 관측을 하나도 기록하지 않는다", "disposition": "MERGED", "target": "case:observation-downgraded-by-the-composition", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A19-F008", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/19-messaging-platform.md#L495" ], "sourceHeading": "5.2 P2 — 브로커 ACL 매니페스트의 자기 점검이 존재하지 않는다", "summary": "브로커 ACL 매니페스트의 자기 점검이 존재하지 않는다", "disposition": "EMITTED", "target": "case:a19-f008-acl", "reason": null, "topic": "runtime-contract-correctness" }, { "id": "A19-F009", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/19-messaging-platform.md#L511" ], "sourceHeading": "5.3 P3 — 접근 검사가 두 갈래로 존재하고, 조립된 쪽이 진단이 약한 쪽이다 (§8.3)", "summary": "접근 검사가 두 갈래로 존재하고, 조립된 쪽이 진단이 약한 쪽이다 (§8.3)", "disposition": "EMITTED", "target": "case:analysis-finding-a19-f009", "reason": null, "topic": "runtime-reachability-and-composition" }, { "id": "A19-F010", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/19-messaging-platform.md#L543" ], "sourceHeading": "5.4 P3 — 자격 증명 회전 개념이 두 번 표현되고, 하나만 살아 있다 (§8.3)", "summary": "자격 증명 회전 개념이 두 번 표현되고, 하나만 살아 있다 (§8.3)", "disposition": "MERGED", "target": "case:the-same-rotation-defect-closed-once-and-reproduced", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A19-F011", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/19-messaging-platform.md#L609" ], "sourceHeading": "6.2 P2 — `messaging-rabbit`은 출하되지만 선택할 수 없고, 운영 문서는 그것을 말하지 않는다", "summary": "`messaging-rabbit`은 출하되지만 선택할 수 없고, 운영 문서는 그것을 말하지 않는다", "disposition": "MERGED", "target": "case:an-unselectable-broker-listed-with-features", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A19-F012", "kindCandidate": "CASE", "priority": "P1", "sourceRefs": [ "analysis/19-messaging-platform.md#L639" ], "sourceHeading": "6.3 P1 — 지원 매트릭스가 Kafka의 `deduplicatedPublish`를 `O`로 적고, 코드는 `false`이며, 그 차이가 정확히 코드가 경고한 피해다", "summary": "지원 매트릭스가 Kafka의 `deduplicatedPublish`를 `O`로 적고, 코드는 `false`이며, 그 차이가 정확히 코드가 경고한 피해다", "disposition": "MERGED", "target": "case:support-matrix-said-the-opposite-of-the-code", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A19-F013", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/19-messaging-platform.md#L682" ], "sourceHeading": "6.4 P2 — 지원 매트릭스가 \"모든 messaging leaf는 build-only\"라고 적고, 가족 권위 문서는 그 문장이 틀렸다고 이미 기록했다", "summary": "지원 매트릭스가 \"모든 messaging leaf는 build-only\"라고 적고, 가족 권위 문서는 그 문장이 틀렸다고 이미 기록했다", "disposition": "EMITTED", "target": "case:analysis-finding-a19-f013", "reason": null, "topic": "declaration-and-document-drift" }, { "id": "A19-F014", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/19-messaging-platform.md#L698" ], "sourceHeading": "6.5 P2 — 한 아티팩트 안의 서로 모르는 Kafka 스택 두 개 (MSG-015, 가족 문서가 미해결로 표시)", "summary": "한 아티팩트 안의 서로 모르는 Kafka 스택 두 개 (MSG-015, 가족 문서가 미해결로 표시)", "disposition": "EMITTED", "target": "case:a19-f014-kafka-msg", "reason": null, "topic": "declaration-and-document-drift" }, { "id": "A19-F015", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/19-messaging-platform.md#L757" ], "sourceHeading": "6.7 P3 — `CompatibilityMatrix`에 `EXTENSION` 등급이 있고 항목이 없으며, bridge leaf가 표 밖에 있다", "summary": "`CompatibilityMatrix`에 `EXTENSION` 등급이 있고 항목이 없으며, bridge leaf가 표 밖에 있다", "disposition": "EMITTED", "target": "case:a19-f015-compatibilitymatrix-extension", "reason": null, "topic": "declaration-and-document-drift" }, { "id": "A19-F016", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/19-messaging-platform.md#L811" ], "sourceHeading": "7.1 P2 — outbox/inbox 체인 전체가 만족되지 않는 `@ConditionalOnBean` 뒤에 있다", "summary": "outbox/inbox 체인 전체가 만족되지 않는 `@ConditionalOnBean` 뒤에 있다", "disposition": "MERGED", "target": "case:outbox-chain-behind-an-unsatisfiable-condition", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A19-F017", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/19-messaging-platform.md#L845" ], "sourceHeading": "7.2 P2 — messaging 마이그레이션 스트림을 적용하는 곳이 없고, 적용하려는 순간 버전이 충돌한다", "summary": "messaging 마이그레이션 스트림을 적용하는 곳이 없고, 적용하려는 순간 버전이 충돌한다", "disposition": "MERGED", "target": "case:messaging-migrations-collide-at-v2", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A19-F018", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/19-messaging-platform.md#L911" ], "sourceHeading": "7.4 P3 — claim-check는 starter에 배선 코드가 한 줄도 없다", "summary": "claim-check는 starter에 배선 코드가 한 줄도 없다", "disposition": "EMITTED", "target": "case:analysis-finding-a19-f018", "reason": null, "topic": "runtime-reachability-and-composition" }, { "id": "A19-F019", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/19-messaging-platform.md#L960" ], "sourceHeading": "8.2 P2 — admin 스위치가 가드를 켜고 서비스는 켜지 않는다", "summary": "admin 스위치가 가드를 켜고 서비스는 켜지 않는다", "disposition": "EMITTED", "target": "case:analysis-finding-a19-f019", "reason": null, "topic": "runtime-reachability-and-composition" }, { "id": "A19-F020", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/19-messaging-platform.md#L982" ], "sourceHeading": "8.3 P3 — `messaging-admin-api`는 main 25파일 · 1,613 LOC에 테스트 파일이 1개다", "summary": "`messaging-admin-api`는 main 25파일 · 1,613 LOC에 테스트 파일이 1개다", "disposition": "EMITTED", "target": "case:a19-f020-messaging-admin-api", "reason": null, "topic": "verification-path-coverage" }, { "id": "A19-F021", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/19-messaging-platform.md#L1049" ], "sourceHeading": "9.3 P2 — 문서 계약 테스트가 존재하고, 그 커버리지 경계가 §6.3·§6.4의 드리프트 위치를 정확히 예측한다", "summary": "문서 계약 테스트가 존재하고, 그 커버리지 경계가 §6.3·§6.4의 드리프트 위치를 정확히 예측한다", "disposition": "MERGED", "target": "case:doc-contract-test-boundary-predicted-the-drift", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A19-F022", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/19-messaging-platform.md#L1099" ], "sourceHeading": "9.5 P3 — `MessagingPublicSurfaceContractTest`가 가족 밖(app-bootstrap)에 있다", "summary": "`MessagingPublicSurfaceContractTest`가 가족 밖(app-bootstrap)에 있다", "disposition": "EMITTED", "target": "case:a19-f022-messagingpublicsurfacecontracttest", "reason": null, "topic": "verification-path-coverage" }, { "id": "A20-F001", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/20-grpc-platform.md#L173" ], "sourceHeading": "3.1 P2 — `GrpcPlatformStartupValidator`가 조립에서 호출되지 않는다", "summary": "`GrpcPlatformStartupValidator`가 조립에서 호출되지 않는다", "disposition": "MERGED", "target": "case:thirteen-startup-rules-never-run", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A20-F002", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/20-grpc-platform.md#L219" ], "sourceHeading": "3.2 P2 — 릴리스 게이트가 스스로 증거를 읽지 않는다. messaging이 이미 고친 모양을 되풀이한다", "summary": "릴리스 게이트가 스스로 증거를 읽지 않는다. messaging이 이미 고친 모양을 되풀이한다", "disposition": "MERGED", "target": "case:a-release-gate-with-no-evidence-producer", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A20-F003", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/20-grpc-platform.md#L260" ], "sourceHeading": "3.3 P2 — 증거 등급 모델 전체가 자동 실행 경로 밖에 있고, CLAUDE.md는 현재 시제로 서술한다", "summary": "증거 등급 모델 전체가 자동 실행 경로 밖에 있고, CLAUDE.md는 현재 시제로 서술한다", "disposition": "EMITTED", "target": "case:a20-f003-claude", "reason": null, "topic": "declaration-and-document-drift" }, { "id": "A20-F004", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/20-grpc-platform.md#L298" ], "sourceHeading": "3.4 P2 — 조립 경계가 정책 객체 9개를 만들고 서버를 만들지 않는다", "summary": "조립 경계가 정책 객체 9개를 만들고 서버를 만들지 않는다", "disposition": "EMITTED", "target": "case:analysis-finding-a20-f004", "reason": null, "topic": "runtime-reachability-and-composition" }, { "id": "A20-F005", "kindCandidate": "CASE", "priority": "P3", "sourceRefs": [ "analysis/20-grpc-platform.md#L321" ], "sourceHeading": "3.5 P3 — 저장소 어디에도 참조가 없는 타입 3개", "summary": "저장소 어디에도 참조가 없는 타입 3개", "disposition": "EMITTED", "target": "case:analysis-finding-a20-f005", "reason": null, "topic": "runtime-contract-correctness" }, { "id": "A20-F006", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/20-grpc-platform.md#L518" ], "sourceHeading": "7.1 P2 — `GrpcAdmissionController.tryAdmit()`의 동시성 경계가 동시성 아래에서 성립하지 않는다", "summary": "`GrpcAdmissionController.tryAdmit()`의 동시성 경계가 동시성 아래에서 성립하지 않는다", "disposition": "EMITTED", "target": "case:a20-f006-grpcadmissioncontroller-tryadmit", "reason": null, "topic": "state-ownership-and-concurrency" }, { "id": "A20-F007", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/20-grpc-platform.md#L572" ], "sourceHeading": "7.2 P2 — `GrpcStreamAdmission`도 같은 형태이고, per-caller 맵이 줄지 않는다", "summary": "`GrpcStreamAdmission`도 같은 형태이고, per-caller 맵이 줄지 않는다", "disposition": "EMITTED", "target": "case:a20-f007-grpcstreamadmission", "reason": null, "topic": "runtime-contract-correctness" }, { "id": "A20-F008", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/20-grpc-platform.md#L595" ], "sourceHeading": "7.3 P2 — `GrpcSerializedStreamWriter`의 `DROP_OLDEST`가 잘못된 메시지의 바이트를 뺀다", "summary": "`GrpcSerializedStreamWriter`의 `DROP_OLDEST`가 잘못된 메시지의 바이트를 뺀다", "disposition": "EMITTED", "target": "case:a20-f008-grpcserializedstreamwriter-drop-oldest", "reason": null, "topic": "runtime-contract-correctness" }, { "id": "A20-F009", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/20-grpc-platform.md#L634" ], "sourceHeading": "7.4 P2 — `GrpcCredentialRotationManager`가 CAS 없이 read-then-write 한다. messaging이 고친 결함의 재현이다", "summary": "`GrpcCredentialRotationManager`가 CAS 없이 read-then-write 한다. messaging이 고친 결함의 재현이다", "disposition": "MERGED", "target": "case:the-same-rotation-defect-closed-once-and-reproduced", "reason": "기존 Root Tree Case가 이 finding의 동일 사건과 검증 단위를 명시적으로 포함한다. 관련 Topic/Reference가 아니라 사건 자체가 같은 경우에만 병합했다." }, { "id": "A20-F010", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/20-grpc-platform.md#L664" ], "sourceHeading": "7.5 P2 — `GrpcOutcomeReplay`가 제거 경로 없는 인메모리 저장소다", "summary": "`GrpcOutcomeReplay`가 제거 경로 없는 인메모리 저장소다", "disposition": "EMITTED", "target": "case:a20-f010-grpcoutcomereplay", "reason": null, "topic": "state-ownership-and-concurrency" }, { "id": "A20-F011", "kindCandidate": "CASE", "priority": "P2", "sourceRefs": [ "analysis/20-grpc-platform.md#L678" ], "sourceHeading": "7.6 P2 — `GrpcCompletionReconciler`가 요청 경로에서 동기화 없는 `ArrayList`를 변경한다", "summary": "`GrpcCompletionReconciler`가 요청 경로에서 동기화 없는 `ArrayList`를 변경한다", "disposition": "EMITTED", "target": "case:a20-f011-grpccompletionreconciler-arraylist", "reason": null, "topic": "state-ownership-and-concurrency" }, { "id": "BASE-case-a-catalog-nine-entries-short", "kindCandidate": "CASE", "priority": "NONE", "sourceRefs": [ "`analysis/05` §1" ], "summary": "패키지 카탈로그가 트리보다 아홉 개 적어서 사이클이 통과했다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "case:a-catalog-nine-entries-short", "reason": null }, { "id": "BASE-case-a-certifying-lane-that-compared-nothing", "kindCandidate": "CASE", "priority": "NONE", "sourceRefs": [ "`final/document.md#6-6` · `analysis/05` §15.3" ], "summary": "\"certified\"라 불리던 레인이 threshold를 하나도 비교하지 않고 있었다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "case:a-certifying-lane-that-compared-nothing", "reason": null }, { "id": "BASE-case-a-cleanup-claim-without-fencing", "kindCandidate": "CASE", "priority": "NONE", "sourceRefs": [ "`analysis/08` §V3" ], "summary": "claim이 소유자·토큰·만료를 기록하지 않아 죽은 worker의 항목이 영영 남았다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "case:a-cleanup-claim-without-fencing", "reason": null }, { "id": "BASE-case-a-customizer-that-discarded-the-bound-property", "kindCandidate": "CASE", "priority": "NONE", "sourceRefs": [ "`analysis/05` §7.7" ], "summary": "Flyway location customizer가 운영자가 바인딩한 값을 덮어썼다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "case:a-customizer-that-discarded-the-bound-property", "reason": null }, { "id": "BASE-case-a-digest-that-covered-who-but-not-what", "kindCandidate": "CASE", "priority": "NONE", "sourceRefs": [ "`analysis/05` §10.1" ], "summary": "transition digest가 \"누가·언제\"만 덮고 \"무엇\"을 덮지 않아 다른 전이를 같다고 보고했다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "case:a-digest-that-covered-who-but-not-what", "reason": null }, { "id": "BASE-case-a-five-second-string-that-broke-every-prod-deploy", "kindCandidate": "CASE", "priority": "NONE", "sourceRefs": [ "`final/document.md#4-1` · `analysis/05` §14.6" ], "summary": "`connection-timeout: 5s`가 모든 prod 배포를 시작 실패시켰고 local만 통과했다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "case:a-five-second-string-that-broke-every-prod-deploy", "reason": null }, { "id": "BASE-case-a-lease-without-an-owner", "kindCandidate": "CASE", "priority": "NONE", "sourceRefs": [ "`final/document.md#4-3` · `analysis/19` §7.3 · `analysis/08` §V3" ], "summary": "lease가 만료 시각만 기록하고 소유자를 기록하지 않아 terminal state가 되돌려졌다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "case:a-lease-without-an-owner", "reason": null }, { "id": "BASE-case-a-read-then-delete-race-on-the-upload-lease", "kindCandidate": "CASE", "priority": "NONE", "sourceRefs": [ "`analysis/08` §V4" ], "summary": "cleanup이 읽은 lease와 삭제 사이에 writer가 그 lease를 얻을 수 있었다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "case:a-read-then-delete-race-on-the-upload-lease", "reason": null }, { "id": "BASE-case-a-report-that-cannot-carry-a-datasource", "kindCandidate": "CASE", "priority": "NONE", "sourceRefs": [ "`analysis/05` §2.5, §12.1" ], "summary": "진단 리포트가 살아 있는 리소스를 담지 않도록 값 타입을 좁혔다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "case:a-report-that-cannot-carry-a-datasource", "reason": null }, { "id": "BASE-case-a-retry-implementation-nobody-calls", "kindCandidate": "CASE", "priority": "NONE", "sourceRefs": [ "`final/document.md#8-2` 항목 7 · `analysis/05` §17 P1" ], "summary": "재시도 구현이 둘이고 정교한 쪽을 아무도 호출하지 않는다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "case:a-retry-implementation-nobody-calls", "reason": null }, { "id": "BASE-case-a-validator-checking-the-wrong-datasource", "kindCandidate": "CASE", "priority": "NONE", "sourceRefs": [ "`analysis/05` §14.5" ], "summary": "validator가 요청을 서비스하지 않는 datasource를 검증하고 있었다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "case:a-validator-checking-the-wrong-datasource", "reason": null }, { "id": "BASE-case-an-active-transaction-check-that-asked-the-wrong-question", "kindCandidate": "CASE", "priority": "NONE", "sourceRefs": [ "`final/document.md#4-1` · `analysis/05` §10.1" ], "summary": "활성 트랜잭션 검사가 data source를 묻지 않아 다른 커넥션에서 커밋됐다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "case:an-active-transaction-check-that-asked-the-wrong-question", "reason": null }, { "id": "BASE-case-autoconfiguration-in-name-only", "kindCandidate": "CASE", "priority": "NONE", "sourceRefs": [ "`analysis/05` §14.4" ], "summary": "이름만 AutoConfiguration이던 세 클래스가 capability 리포트에 Stable로 올라 있었다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "case:autoconfiguration-in-name-only", "reason": null }, { "id": "BASE-case-commit-ambiguity-is-not-only-sqlstate-08", "kindCandidate": "CASE", "priority": "NONE", "sourceRefs": [ "`final/document.md#4-1` · `analysis/05` §3.5" ], "summary": "`pg_terminate_backend`가 `57P01`로 도착하고 커밋 레코드는 이미 WAL에 있었다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "case:commit-ambiguity-is-not-only-sqlstate-08", "reason": null }, { "id": "BASE-case-conditionalonbean-evaluated-at-parse-time", "kindCandidate": "CASE", "priority": "NONE", "sourceRefs": [ "`analysis/05` §14.4" ], "summary": "`@ConditionalOnBean(DataSource.class)`가 클래스 파싱 시점에 평가되어 여덟 빈이 사라졌다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "case:conditionalonbean-evaluated-at-parse-time", "reason": null }, { "id": "BASE-case-cursor-verification-order", "kindCandidate": "CASE", "priority": "NONE", "sourceRefs": [ "`analysis/05` §2.4" ], "summary": "커서 서명 검증이 길이·상수시간·순서를 전부 지켜야 했던 이유", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "case:cursor-verification-order", "reason": null }, { "id": "BASE-case-expired-claim-versus-expired-execution", "kindCandidate": "CASE", "priority": "NONE", "sourceRefs": [ "`analysis/05` §10.1, §10.4" ], "summary": "만료된 CLAIMED는 takeover하고 만료된 EXECUTING은 조정을 요구하도록 갈랐다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "case:expired-claim-versus-expired-execution", "reason": null }, { "id": "BASE-case-five-documents-say-nineteen-leaves", "kindCandidate": "CASE", "priority": "NONE", "sourceRefs": [ "`final/document.md#7-4` · `analysis/05` §17 P3" ], "summary": "다섯 문서가 \"exactly 19 leaf\"라고 적고 레지스트리는 62다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "case:five-documents-say-nineteen-leaves", "reason": null }, { "id": "BASE-case-h2-hid-a-column-type-mismatch", "kindCandidate": "CASE", "priority": "NONE", "sourceRefs": [ "`final/document.md#4-1` · `analysis/05` §8.5" ], "summary": "`char(64)`와 `varchar(64)` 불일치를 H2가 가리고 있었다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "case:h2-hid-a-column-type-mismatch", "reason": null }, { "id": "BASE-case-jpa-platform-capabilities-have-no-consumer", "kindCandidate": "CASE", "priority": "NONE", "sourceRefs": [ "`final/document.md#8-2` 항목 8 · `analysis/05` §17 P8, §11.0" ], "summary": "JPA 플랫폼 capability 대부분에 production 소비자가 없다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "case:jpa-platform-capabilities-have-no-consumer", "reason": null }, { "id": "BASE-case-narrowing-the-scan-orphaned-eight-components", "kindCandidate": "CASE", "priority": "NONE", "sourceRefs": [ "`analysis/05` §14.2" ], "summary": "넓은 스캔을 좁히자 여덟 컴포넌트에 아무것도 도달하지 않았다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "case:narrowing-the-scan-orphaned-eight-components", "reason": null }, { "id": "BASE-case-native-claim-did-not-bump-the-version", "kindCandidate": "CASE", "priority": "NONE", "sourceRefs": [ "`final/document.md#4-1` · `analysis/05` §11.2" ], "summary": "native claim이 `@Version`을 올리지 않아 충돌을 보고하지 않는 낙관적 잠금이 됐다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "case:native-claim-did-not-bump-the-version", "reason": null }, { "id": "BASE-case-registry-column-too-short-for-its-own-path", "kindCandidate": "CASE", "priority": "NONE", "sourceRefs": [ "`analysis/05` §8.4" ], "summary": "레지스트리 컬럼이 38자 경로에서 짧아 \"더 짧은 경로를 적는\" 우회를 유혹했다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "case:registry-column-too-short-for-its-own-path", "reason": null }, { "id": "BASE-case-requires-new-pins-the-outer-connection", "kindCandidate": "CASE", "priority": "NONE", "sourceRefs": [ "`final/document.md#3-2` · `analysis/05` §3.1" ], "summary": "`REQUIRES_NEW`가 바깥 커넥션을 핀한 채 새 커넥션을 딴다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "case:requires-new-pins-the-outer-connection", "reason": null }, { "id": "BASE-case-search-path-survived-the-return-to-the-pool", "kindCandidate": "CASE", "priority": "NONE", "sourceRefs": [ "`analysis/05` §13.2" ], "summary": "`search_path`가 풀로 돌아간 커넥션에 남아 다음 tenant가 상속한다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "case:search-path-survived-the-return-to-the-pool", "reason": null }, { "id": "BASE-case-tenant-pools-summed-past-the-server-ceiling", "kindCandidate": "CASE", "priority": "NONE", "sourceRefs": [ "`analysis/05` §13.2" ], "summary": "tenant별 풀이 개별적으로 합리적이고 그 합이 서버 상한을 넘긴다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "case:tenant-pools-summed-past-the-server-ceiling", "reason": null }, { "id": "BASE-case-the-second-platform-carried-the-design-not-the-wiring", "kindCandidate": "CASE", "priority": "NONE", "sourceRefs": [ "`final/document.md#7-6` · `analysis/20` §2, §3 · `analysis/99` §7.6" ], "summary": "두 번째 플랫폼이 첫 번째의 bridge 부재는 막고 게이트 배선은 옮기지 않았다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "case:the-second-platform-carried-the-design-not-the-wiring", "reason": null }, { "id": "BASE-case-three-versions-declared-one-executed", "kindCandidate": "CASE", "priority": "NONE", "sourceRefs": [ "`analysis/05` §15.4" ], "summary": "릴리스 레인이 매트릭스 세 버전 중 첫 번째만 돌리고 세 개를 커버로 기록했다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "case:three-versions-declared-one-executed", "reason": null }, { "id": "BASE-case-three-ways-rls-does-nothing", "kindCandidate": "CASE", "priority": "NONE", "sourceRefs": [ "`final/document.md#4-1` · `analysis/05` §13.1, §17 P8" ], "summary": "RLS가 아무것도 하지 않는 세 가지 방법", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "case:three-ways-rls-does-nothing", "reason": null }, { "id": "BASE-case-two-owners-popped-the-evidence-frame", "kindCandidate": "CASE", "priority": "NONE", "sourceRefs": [ "`final/document.md#4-1` · `analysis/05` §3.4" ], "summary": "커밋 증거 프레임을 두 주인이 pop해서 바깥 트랜잭션의 실패가 익명이 됐다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "case:two-owners-popped-the-evidence-frame", "reason": null }, { "id": "BASE-case-two-trees-both-numbered-from-v1", "kindCandidate": "CASE", "priority": "NONE", "sourceRefs": [ "`final/document.md#4-1` · `analysis/05` §8.3" ], "summary": "두 트리가 다 V1부터 번호를 매겨 공유 history가 하나를 건너뛸 수 있었다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "case:two-trees-both-numbered-from-v1", "reason": null }, { "id": "BASE-case-untranslated-contention-bypassed-the-retry-catch", "kindCandidate": "CASE", "priority": "NONE", "sourceRefs": [ "`final/document.md#4-1` · `analysis/05` §3.6" ], "summary": "번역되지 않은 경합 예외가 재시도 코디네이터의 catch를 통째로 비껴갔다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "case:untranslated-contention-bypassed-the-retry-catch", "reason": null }, { "id": "BASE-concept-capability-schema-registry", "kindCandidate": "CONCEPT", "priority": "NONE", "sourceRefs": [ "`final/document.md#4-1` · `analysis/05` §8.4, §11.3" ], "summary": "capability_schema_registry — 스키마 적용과 사용 승인의 분리", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "concept:capability-schema-registry", "reason": null }, { "id": "BASE-concept-cardinality-bounds-as-types", "kindCandidate": "CONCEPT", "priority": "NONE", "sourceRefs": [ "`final/document.md#4-1`, `#5-2` · `analysis/05` §2.1, §12.2 · `analysis/02`" ], "summary": "카디널리티 경계를 타입으로 표현하기", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "concept:cardinality-bounds-as-types", "reason": null }, { "id": "BASE-concept-cas-tuple-and-update-count", "kindCandidate": "CONCEPT", "priority": "NONE", "sourceRefs": [ "`final/document.md#4-1` · `analysis/05` §10.1, §10.3" ], "summary": "CAS 튜플과 update count가 답이 되는 구조", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "concept:cas-tuple-and-update-count", "reason": null }, { "id": "BASE-concept-commit-evidence-phases", "kindCandidate": "CONCEPT", "priority": "NONE", "sourceRefs": [ "`final/document.md#3-2` · `analysis/05` §3.4, §2.3" ], "summary": "커밋 증거 단계 — NOT_STARTED에서 UNKNOWN까지", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "concept:commit-evidence-phases", "reason": null }, { "id": "BASE-concept-deadline-propagation", "kindCandidate": "CONCEPT", "priority": "NONE", "sourceRefs": [ "`final/document.md#3-2` · `analysis/05` §3.3" ], "summary": "호출 예산에서 DB 로컬 타임아웃까지의 데드라인 전파", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "concept:deadline-propagation", "reason": null }, { "id": "BASE-concept-evidence-grades-and-provenance", "kindCandidate": "CONCEPT", "priority": "NONE", "sourceRefs": [ "`final/document.md#6-5` · `analysis/05` §15.6" ], "summary": "증거 등급과 provenance — R1과 R2를 가르는 것", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "concept:evidence-grades-and-provenance", "reason": null }, { "id": "BASE-concept-fenced-lease", "kindCandidate": "CONCEPT", "priority": "NONE", "sourceRefs": [ "`final/document.md#4-1`, `#4-3` · `analysis/05` §10 · `analysis/19` §7.3" ], "summary": "fenced lease — 만료 시각만으로는 부족한 이유", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "concept:fenced-lease", "reason": null }, { "id": "BASE-concept-file-state-machine-and-ready", "kindCandidate": "CONCEPT", "priority": "NONE", "sourceRefs": [ "`final/document.md#4-4` · `analysis/08` §V1" ], "summary": "파일 상태 기계와 READY가 뜻하는 것", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "concept:file-state-machine-and-ready", "reason": null }, { "id": "BASE-concept-four-grade-disclosure", "kindCandidate": "CONCEPT", "priority": "NONE", "sourceRefs": [ "`final/document.md#7-5` · `analysis/16` §45.2, §45.3" ], "summary": "네 단계 공시 등급 — modelled에서 production-verified까지", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "concept:four-grade-disclosure", "reason": null }, { "id": "BASE-concept-four-multitenancy-strategies", "kindCandidate": "CONCEPT", "priority": "NONE", "sourceRefs": [ "`analysis/05` §13.2" ], "summary": "네 가지 멀티테넌시 전략과 각각의 격리 경계", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "concept:four-multitenancy-strategies", "reason": null }, { "id": "BASE-concept-independent-flyway-streams", "kindCandidate": "CONCEPT", "priority": "NONE", "sourceRefs": [ "`final/document.md#4-1` · `analysis/05` §8.3" ], "summary": "독립 Flyway 스트림과 baseline version 0", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "concept:independent-flyway-streams", "reason": null }, { "id": "BASE-concept-redis-admission-stages", "kindCandidate": "CONCEPT", "priority": "NONE", "sourceRefs": [ "`final/document.md#4-4` · `analysis/10` §64" ], "summary": "명령 카탈로그와 admission 아홉 단계", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "concept:redis-admission-stages", "reason": null }, { "id": "BASE-concept-requires-new-connection-cost", "kindCandidate": "CONCEPT", "priority": "NONE", "sourceRefs": [ "`final/document.md#3-2` · `analysis/05` §3.1, §13.2" ], "summary": "`REQUIRES_NEW`의 커넥션 비용과 풀 사이징 제약", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "concept:requires-new-connection-cost", "reason": null }, { "id": "BASE-concept-rls-three-preconditions", "kindCandidate": "CONCEPT", "priority": "NONE", "sourceRefs": [ "`final/document.md#4-1` · `analysis/05` §13.1" ], "summary": "RLS가 성립하기 위한 세 전제", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "concept:rls-three-preconditions", "reason": null }, { "id": "BASE-concept-signed-cursor-structure", "kindCandidate": "CONCEPT", "priority": "NONE", "sourceRefs": [ "`final/document.md#10-4` · `analysis/05` §2.4 · `analysis/19` §4.x" ], "summary": "서명된 커서의 구조와 검증 순서", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "concept:signed-cursor-structure", "reason": null }, { "id": "BASE-concept-staged-lifecycle-and-signed-grants", "kindCandidate": "CONCEPT", "priority": "NONE", "sourceRefs": [ "`final/document.md#4-4` · `analysis/09` · `analysis/03` §10" ], "summary": "staged lifecycle과 서명된 grant", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "concept:staged-lifecycle-and-signed-grants", "reason": null }, { "id": "BASE-concept-strict-test-lane", "kindCandidate": "CONCEPT", "priority": "NONE", "sourceRefs": [ "`final/document.md#6-3` · `analysis/05` §15.1 · `analysis/19` §2.3 · `analysis/20` §2.5" ], "summary": "strict test lane — 발견하지 못하면 실패하는 레인", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "concept:strict-test-lane", "reason": null }, { "id": "BASE-concept-three-assembly-paths", "kindCandidate": "CONCEPT", "priority": "NONE", "sourceRefs": [ "`final/document.md#1-4`, `#7-1` · `analysis/18` · `analysis/14` §7.1" ], "summary": "Spring 조립의 세 경로와 각각이 결정하는 것", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "concept:three-assembly-paths", "reason": null }, { "id": "BASE-concept-transaction-result-algebra", "kindCandidate": "CONCEPT", "priority": "NONE", "sourceRefs": [ "`final/document.md#3-2` · `analysis/05` §3.2" ], "summary": "트랜잭션 결과 대수 — 다섯 변형이 각각 답하는 질문", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "concept:transaction-result-algebra", "reason": null }, { "id": "BASE-concept-transport-failure-stage-and-category", "kindCandidate": "CONCEPT", "priority": "NONE", "sourceRefs": [ "`final/document.md#8-1` · `analysis/11` §51" ], "summary": "전송 실패의 단계와 범주 — `AttemptStage`와 `FailureCategory`", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "concept:transport-failure-stage-and-category", "reason": null }, { "id": "BASE-concept-when-conditions-are-evaluated", "kindCandidate": "CONCEPT", "priority": "NONE", "sourceRefs": [ "`analysis/05` §14.4" ], "summary": "조건부 빈의 평가 시점 — 파싱 시점과 등록 시점", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "concept:when-conditions-are-evaluated", "reason": null }, { "id": "BASE-decision-candidate-evidence-stays-at-r1", "kindCandidate": "DECISION", "priority": "NONE", "sourceRefs": [ "`final/document.md#6-5` · `analysis/05` §15.6" ], "summary": "후보 증거는 통과해도 R1에 머무르고 R2는 별도 게이트가 판정한다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "decision:candidate-evidence-stays-at-r1", "reason": null }, { "id": "BASE-decision-capability-grade-is-declared-not-inferred", "kindCandidate": "DECISION", "priority": "NONE", "sourceRefs": [ "`final/document.md#10-5` · `analysis/05` §2.5 · `analysis/19` §6.6 · `analysis/20` §2.6" ], "summary": "지원 등급은 추론이 아니라 선언이고 증거 없이는 올라가지 않는다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "decision:capability-grade-is-declared-not-inferred", "reason": null }, { "id": "BASE-decision-capability-separates-installation-from-activation", "kindCandidate": "DECISION", "priority": "NONE", "sourceRefs": [ "`final/document.md#4-1` · `analysis/05` §8.4, §11.3" ], "summary": "capability는 스키마 적용과 사용 승인을 분리한다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "decision:capability-separates-installation-from-activation", "reason": null }, { "id": "BASE-decision-classpath-presence-is-not-consent", "kindCandidate": "DECISION", "priority": "NONE", "sourceRefs": [ "`final/document.md#10-3` · `analysis/05` §13" ], "summary": "클래스패스에 있는 것은 실행 동의가 아니다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "decision:classpath-presence-is-not-consent", "reason": null }, { "id": "BASE-decision-completion-unknown-is-never-retried", "kindCandidate": "DECISION", "priority": "NONE", "sourceRefs": [ "`final/document.md#10-2` · `analysis/05` §2.2, §3.5" ], "summary": "completion-unknown은 자동으로도 수동으로도 재시도하지 않는다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "decision:completion-unknown-is-never-retried", "reason": null }, { "id": "BASE-decision-cursors-are-signed-for-integrity", "kindCandidate": "DECISION", "priority": "NONE", "sourceRefs": [ "`final/document.md#10-4` · `analysis/05` §2.4" ], "summary": "커서에 서명하는 이유는 기밀성이 아니라 무결성이다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "decision:cursors-are-signed-for-integrity", "reason": null }, { "id": "BASE-decision-flyway-owns-the-schema", "kindCandidate": "DECISION", "priority": "NONE", "sourceRefs": [ "`final/document.md#4-1`, `#10-3` · `analysis/05` §8.1, §12.1" ], "summary": "Flyway가 스키마를 소유하고 런타임 롤은 DDL 권한을 갖지 않는다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "decision:flyway-owns-the-schema", "reason": null }, { "id": "BASE-decision-grades-derive-from-executed-evidence", "kindCandidate": "DECISION", "priority": "NONE", "sourceRefs": [ "`final/document.md#10-5` · `analysis/19` §6.6 · `analysis/16` §45.3" ], "summary": "능력 등급은 코드가 아니라 실행된 증거에서 파생한다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "decision:grades-derive-from-executed-evidence", "reason": null }, { "id": "BASE-decision-grpc-stays-build-only-until-the-bridge-is-decided", "kindCandidate": "DECISION", "priority": "NONE", "sourceRefs": [ "`final/document.md#2-3` · `analysis/20` §2.3, §2.6" ], "summary": "gRPC 플랫폼은 build-only로 두고 애플리케이션 도달 경로를 먼저 정한다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "decision:grpc-stays-build-only-until-the-bridge-is-decided", "reason": null }, { "id": "BASE-decision-in-root-write-fails-fast", "kindCandidate": "DECISION", "priority": "NONE", "sourceRefs": [ "`final/document.md#3-2` · `analysis/05` §3.1" ], "summary": "`inRootWrite`는 suspend하지 않고 fail-fast한다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "decision:in-root-write-fails-fast", "reason": null }, { "id": "BASE-decision-legacy-adoption-requires-two-approvers", "kindCandidate": "DECISION", "priority": "NONE", "sourceRefs": [ "`analysis/09` §49" ], "summary": "legacy 채택은 서로 다른 두 승인자의 서명을 요구한다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "decision:legacy-adoption-requires-two-approvers", "reason": null }, { "id": "BASE-decision-no-physical-paths-in-metadata", "kindCandidate": "DECISION", "priority": "NONE", "sourceRefs": [ "`analysis/08` §V1" ], "summary": "물리 경로와 원본 파일명을 저장하지 않는다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "decision:no-physical-paths-in-metadata", "reason": null }, { "id": "BASE-decision-one-audit-mechanism-per-entity", "kindCandidate": "DECISION", "priority": "NONE", "sourceRefs": [ "`analysis/05` §12.5" ], "summary": "감사 메커니즘은 엔티티당 정확히 하나여야 한다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "decision:one-audit-mechanism-per-entity", "reason": null }, { "id": "BASE-decision-one-root-owns-the-master-switch", "kindCandidate": "DECISION", "priority": "NONE", "sourceRefs": [ "`final/document.md#10-3` · `analysis/19` §6.1 · `analysis/05` §14.1" ], "summary": "마스터 스위치는 루트 하나가 소유하고 자식 설정은 조건을 갖지 않는다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "decision:one-root-owns-the-master-switch", "reason": null }, { "id": "BASE-decision-only-the-certification-lane-carries-no-docker-guard", "kindCandidate": "DECISION", "priority": "NONE", "sourceRefs": [ "`final/document.md#6-4` · `analysis/19` §2.3" ], "summary": "인증 레인만 Docker 가드를 달지 않는다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "decision:only-the-certification-lane-carries-no-docker-guard", "reason": null }, { "id": "BASE-decision-performance-measurement-is-not-a-release-gate", "kindCandidate": "DECISION", "priority": "NONE", "sourceRefs": [ "`final/document.md#10-5` · `analysis/20` §2.5 · `analysis/05` §15.3" ], "summary": "성능 측정은 릴리스 게이트에 넣지 않는다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "decision:performance-measurement-is-not-a-release-gate", "reason": null }, { "id": "BASE-decision-pool-need-is-a-capability-question", "kindCandidate": "DECISION", "priority": "NONE", "sourceRefs": [ "`final/document.md#10-3` · `analysis/05` §14.1" ], "summary": "풀이 필요한지는 \"JPA가 켜졌나\"가 아니라 \"커넥션이 필요한 capability가 있나\"로 묻는다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "decision:pool-need-is-a-capability-question", "reason": null }, { "id": "BASE-decision-repair-is-not-a-mode", "kindCandidate": "DECISION", "priority": "NONE", "sourceRefs": [ "`analysis/05` §8.1" ], "summary": "Repair는 모드가 아니라 운영자가 호출하는 작업이다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "decision:repair-is-not-a-mode", "reason": null }, { "id": "BASE-decision-retry-safety-is-decided-by-evidence", "kindCandidate": "DECISION", "priority": "NONE", "sourceRefs": [ "`final/document.md#10-2` · `analysis/11` §51 · `analysis/20` §2.4" ], "summary": "재시도 안전성은 증거에 기반해 판정한다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "decision:retry-safety-is-decided-by-evidence", "reason": null }, { "id": "BASE-decision-retry-unit-is-the-use-case", "kindCandidate": "DECISION", "priority": "NONE", "sourceRefs": [ "`analysis/05` §3.6" ], "summary": "재시도 단위는 statement가 아니라 유스케이스 전체다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "decision:retry-unit-is-the-use-case", "reason": null }, { "id": "BASE-decision-state-machines-carry-no-stereotype", "kindCandidate": "DECISION", "priority": "NONE", "sourceRefs": [ "`analysis/05` §10" ], "summary": "상태 기계 구현은 Spring stereotype을 갖지 않는다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "decision:state-machines-carry-no-stereotype", "reason": null }, { "id": "BASE-decision-templates-are-built-once-per-mode", "kindCandidate": "DECISION", "priority": "NONE", "sourceRefs": [ "`final/document.md#3-2` · `analysis/05` §3.1" ], "summary": "트랜잭션 템플릿은 모드별로 미리 만들어 둔다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "decision:templates-are-built-once-per-mode", "reason": null }, { "id": "BASE-decision-tenant-id-is-never-a-metric-tag", "kindCandidate": "DECISION", "priority": "NONE", "sourceRefs": [ "`final/document.md#10-4` · `analysis/05` §13.2 · `analysis/02`" ], "summary": "tenant id는 메트릭 태그가 되지 않는다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "decision:tenant-id-is-never-a-metric-tag", "reason": null }, { "id": "BASE-decision-three-axes-of-evidence", "kindCandidate": "DECISION", "priority": "NONE", "sourceRefs": [ "`final/document.md#10-5` · `analysis/20` §2.4" ], "summary": "전송·업무·스트림 증거는 세 축이고 서로를 함의하지 않는다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "decision:three-axes-of-evidence", "reason": null }, { "id": "BASE-decision-unclassified-commands-are-refused", "kindCandidate": "DECISION", "priority": "NONE", "sourceRefs": [ "`analysis/10` §47" ], "summary": "분류되지 않은 명령은 fail-closed로 거부한다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "decision:unclassified-commands-are-refused", "reason": null }, { "id": "BASE-decision-widen-doc-contract-assertions", "kindCandidate": "DECISION", "priority": "NONE", "sourceRefs": [ "`final/document.md#7-4` · `analysis/19` §9.3" ], "summary": "문서 계약 테스트의 단언 범위를 capability 표까지 넓힐 것인가", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "decision:widen-doc-contract-assertions", "reason": null }, { "id": "BASE-open-question-commit-ambiguity-lane-not-executed", "kindCandidate": "OPEN_QUESTION", "priority": "NONE", "sourceRefs": [ "`final/document.md#6-2` · `analysis/05` §3.5, §15" ], "summary": "커밋 모호성 계약 레인이 이 리비전에서 통과하는지 실행으로 확인되지 않았다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "open-question:commit-ambiguity-lane-not-executed", "reason": null }, { "id": "BASE-open-question-conditional-evaluation-order-unverified", "kindCandidate": "OPEN_QUESTION", "priority": "NONE", "sourceRefs": [ "`final/document.md#11` 항목 4 · `analysis/05` §14.4" ], "summary": "`@ConditionalOnBean` 사슬의 실제 평가 순서를 확인하지 않았다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "open-question:conditional-evaluation-order-unverified", "reason": null }, { "id": "BASE-open-question-container-lanes-not-executed", "kindCandidate": "OPEN_QUESTION", "priority": "NONE", "sourceRefs": [ "`final/document.md#6-2` · `#11` 항목 1" ], "summary": "컨테이너가 필요한 레인의 실제 결과를 실행으로 확인하지 않았다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "open-question:container-lanes-not-executed", "reason": null }, { "id": "BASE-open-question-one-boot-would-settle-two-findings", "kindCandidate": "OPEN_QUESTION", "priority": "NONE", "sourceRefs": [ "`final/document.md#11` 항목 3 · `analysis/19` §5.1, §7.1" ], "summary": "부팅 한 번으로 확증 가능한 두 건이 아직 정적 추론으로만 남아 있다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "open-question:one-boot-would-settle-two-findings", "reason": null }, { "id": "BASE-open-question-pool-contract-lane-not-executed", "kindCandidate": "OPEN_QUESTION", "priority": "NONE", "sourceRefs": [ "`final/document.md#6-2` · `analysis/05` §15.3" ], "summary": "풀 계약 레인이 실행되지 않아 포화 동작이 확인되지 않았다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "open-question:pool-contract-lane-not-executed", "reason": null }, { "id": "BASE-open-question-redis-topology-lane-not-executed", "kindCandidate": "OPEN_QUESTION", "priority": "NONE", "sourceRefs": [ "`final/document.md#6-2` · `analysis/10` §0, §47" ], "summary": "Redis 토폴로지 레인이 실행되지 않아 key spec 드리프트가 확인되지 않았다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "open-question:redis-topology-lane-not-executed", "reason": null }, { "id": "BASE-open-question-v2-state-machine-lanes-not-executed", "kindCandidate": "OPEN_QUESTION", "priority": "NONE", "sourceRefs": [ "`final/document.md#6-2` · `analysis/05` §15.5" ], "summary": "V2 상태 기계 넷의 컨테이너 레인이 실행되지 않았다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "open-question:v2-state-machine-lanes-not-executed", "reason": null }, { "id": "BASE-reference-a-bean-is-not-composition-evidence", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`final/document.md#9` 규칙 2·3 · `analysis/99` §2" ], "summary": "`@Bean`이 있다는 것은 조립 증거가 아니다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:a-bean-is-not-composition-evidence", "reason": null }, { "id": "BASE-reference-a-binary-approval-codec-must-round-trip", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`analysis/09` §49" ], "summary": "이진 승인 코덱은 decode 후 재인코딩이 원본과 같아야 한다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:a-binary-approval-codec-must-round-trip", "reason": null }, { "id": "BASE-reference-a-contract-test-must-run-the-adapters-statement", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`final/document.md#9` 규칙 19 · `analysis/05` §11.2, §17 P2" ], "summary": "계약 테스트는 어댑터가 실제로 돌리는 statement를 실행해야 한다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:a-contract-test-must-run-the-adapters-statement", "reason": null }, { "id": "BASE-reference-a-gate-nobody-runs-reports-the-last-run", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`final/document.md#9` 규칙 6 · `analysis/18` §4.1c · `analysis/20` §3.3" ], "summary": "아무도 돌리지 않는 레인의 게이트는 마지막으로 돌린 사람이 본 것을 보고한다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:a-gate-nobody-runs-reports-the-last-run", "reason": null }, { "id": "BASE-reference-a-lane-that-discovers-nothing-must-fail", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`final/document.md#6-3` · `analysis/05` §15.1" ], "summary": "아무것도 발견하지 못한 레인은 성공이 아니라 실패여야 한다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:a-lane-that-discovers-nothing-must-fail", "reason": null }, { "id": "BASE-reference-a-publicly-readable-state-must-be-complete-by-constraint", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`analysis/08` §V1" ], "summary": "공개 읽기 가능한 상태는 완전한 identity를 DB 제약으로 요구한다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:a-publicly-readable-state-must-be-complete-by-constraint", "reason": null }, { "id": "BASE-reference-a-single-admission-point-must-count-its-bypasses", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`analysis/10` §64" ], "summary": "단일 admission point는 우회 경로를 세어야 성립한다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:a-single-admission-point-must-count-its-bypasses", "reason": null }, { "id": "BASE-reference-agreement-between-documents-proves-nothing", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`final/document.md#9` 규칙 5 · `analysis/19` §6.6" ], "summary": "문서와 상수가 서로 일치하는 것으로는 아무것도 증명되지 않는다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:agreement-between-documents-proves-nothing", "reason": null }, { "id": "BASE-reference-ambiguity-rule-hurts-both-ways", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`analysis/05` §3.5 · `docs/adr/ADR-JPA-003-completion-unknown.md`" ], "summary": "커밋 모호성 판정은 넓혀도 좁혀도 해롭다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:ambiguity-rule-hurts-both-ways", "reason": null }, { "id": "BASE-reference-an-applied-checksum-is-a-promise", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`analysis/05` §8.1, §8.5" ], "summary": "적용된 마이그레이션의 checksum은 그것을 돌린 모든 배포에 대한 약속이다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:an-applied-checksum-is-a-promise", "reason": null }, { "id": "BASE-reference-atomic-type-is-not-atomicity", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`final/document.md#5-5` · `analysis/20` §7" ], "summary": "`Atomic*` 타입의 존재는 원자성의 증거가 아니다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:atomic-type-is-not-atomicity", "reason": null }, { "id": "BASE-reference-cas-tuple-in-the-where-clause", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`final/document.md#9` 규칙 17 · `analysis/05` §10, §16" ], "summary": "CAS 튜플을 where 절에 전부 반복하고 update count를 답으로 쓴다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:cas-tuple-in-the-where-clause", "reason": null }, { "id": "BASE-reference-check-which-duplicate-is-wired", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`final/document.md#7-3` · `analysis/99` §4" ], "summary": "중복 장치를 찾으면 어느 쪽이 조립됐는지 먼저 확인한다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:check-which-duplicate-is-wired", "reason": null }, { "id": "BASE-reference-claim-with-a-conditional-update-not-a-read", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`analysis/08` §V4 · `analysis/05` §10" ], "summary": "조건부 update로 행을 claim하고 읽은 값으로 판단하지 않는다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:claim-with-a-conditional-update-not-a-read", "reason": null }, { "id": "BASE-reference-conditionalonbean-must-be-satisfiable", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`final/document.md#9` 규칙 4 · `analysis/19` §7.1" ], "summary": "`@ConditionalOnBean`은 조건이 만족될 수 있는지까지 확인해야 한다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:conditionalonbean-must-be-satisfiable", "reason": null }, { "id": "BASE-reference-count-the-frameworks-own-autoconfigurations", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`analysis/05` §14.1" ], "summary": "프레임워크가 기여하는 자동설정까지 세지 않으면 스위치가 아니다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:count-the-frameworks-own-autoconfigurations", "reason": null }, { "id": "BASE-reference-deadline-narrows-in-three-stages", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`analysis/05` §3.3" ], "summary": "데드라인은 호출 예산에서 시작해 세 단계로 좁힌다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:deadline-narrows-in-three-stages", "reason": null }, { "id": "BASE-reference-digest-must-be-length-framed-and-versioned", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`analysis/05` §10.1" ], "summary": "digest는 길이 프레이밍하고 버전을 붙인다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:digest-must-be-length-framed-and-versioned", "reason": null }, { "id": "BASE-reference-each-stream-owns-its-history-table", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`analysis/05` §8.3" ], "summary": "마이그레이션 스트림은 자기 history 테이블을 갖는다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:each-stream-owns-its-history-table", "reason": null }, { "id": "BASE-reference-expired-claim-and-expired-execution-differ", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`analysis/05` §10.1, §10.4" ], "summary": "만료된 claim과 만료된 실행은 다르게 다뤄야 한다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:expired-claim-and-expired-execution-differ", "reason": null }, { "id": "BASE-reference-fix-overstatement-before-understatement", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`final/document.md#7-4` · `analysis/19` §6.3" ], "summary": "과대 진술 문서를 과소보다 먼저 고친다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:fix-overstatement-before-understatement", "reason": null }, { "id": "BASE-reference-grades-may-understate-never-overstate", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`final/document.md#7-5` · `analysis/16` §45.3 · `analysis/20` §2.6" ], "summary": "등급은 네 단계로 나누고 관측보다 높게 적지 않는다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:grades-may-understate-never-overstate", "reason": null }, { "id": "BASE-reference-hibernate-filter-is-not-a-security-boundary", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`analysis/05` §13.2" ], "summary": "Hibernate filter는 보안 경계가 아니다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:hibernate-filter-is-not-a-security-boundary", "reason": null }, { "id": "BASE-reference-isolation-settings-must-be-transaction-local", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`analysis/05` §13.1, §13.2" ], "summary": "격리 설정은 트랜잭션 로컬이어야 한다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:isolation-settings-must-be-transaction-local", "reason": null }, { "id": "BASE-reference-local-with-a-different-db-is-a-different-system", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`final/document.md#9` 규칙 18 · `analysis/05` §8.5" ], "summary": "로컬이 다른 DB면 로컬 테스트는 다른 시스템에 대한 진술이다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:local-with-a-different-db-is-a-different-system", "reason": null }, { "id": "BASE-reference-make-the-unsafe-state-unrepresentable", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`final/document.md#9` 규칙 14 · `analysis/05` §2.2 · `analysis/19` §3.2" ], "summary": "위험한 조합은 정책이 아니라 생성자가 거부하게 만든다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:make-the-unsafe-state-unrepresentable", "reason": null }, { "id": "BASE-reference-names-are-registry-keys-not-values", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`final/document.md#9` 규칙 15 · `analysis/05` §2.1, §5, §7" ], "summary": "이름은 값이 아니라 registry key다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:names-are-registry-keys-not-values", "reason": null }, { "id": "BASE-reference-numbers-in-docs-should-be-derived", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`analysis/19` §6.4 · `analysis/05` §17 P3" ], "summary": "문서의 수치는 세지 말고 파생하거나 게이트로 붙든다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:numbers-in-docs-should-be-derived", "reason": null }, { "id": "BASE-reference-off-must-be-structural", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`final/document.md#10-3` · `analysis/05` §14.1 · `analysis/19` §6.1" ], "summary": "\"꺼짐\"은 조건의 반복이 아니라 구조여야 한다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:off-must-be-structural", "reason": null }, { "id": "BASE-reference-omission-that-passes-is-not-a-gate", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`final/document.md#9` 규칙 12 · `analysis/05` §1, §16" ], "summary": "빠뜨림이 통과가 되는 게이트는 게이트가 아니다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:omission-that-passes-is-not-a-gate", "reason": null }, { "id": "BASE-reference-prefix-matching-fits-signatures-not-sniffing", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`analysis/08` §40" ], "summary": "접두사 시작 매칭은 시그니처에는 맞고 스니핑 패턴에는 맞지 않는다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:prefix-matching-fits-signatures-not-sniffing", "reason": null }, { "id": "BASE-reference-read-the-assembling-side-first", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`final/document.md#13` 항목 5 · `analysis/99` §8" ], "summary": "조립 결함을 판정하려면 조립하는 쪽을 먼저 읽어야 한다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:read-the-assembling-side-first", "reason": null }, { "id": "BASE-reference-read-the-clock-after-the-lock", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`final/document.md#9` 규칙 17 · `analysis/05` §10, §16" ], "summary": "시간은 DB에서, 그리고 행을 잠근 다음에 읽는다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:read-the-clock-after-the-lock", "reason": null }, { "id": "BASE-reference-register-paths-bind-values", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`final/document.md#9` 규칙 16 · `analysis/05` §7.5" ], "summary": "path·identifier는 등록하고 value는 바인딩한다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:register-paths-bind-values", "reason": null }, { "id": "BASE-reference-registry-rules-transfer-ci-rules-do-not", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`final/document.md#7-6` · `analysis/99` §7.6" ], "summary": "레지스트리로 표현된 규칙은 전이되고 CI로 표현된 규칙은 전이되지 않는다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:registry-rules-transfer-ci-rules-do-not", "reason": null }, { "id": "BASE-reference-reject-rather-than-sanitize", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`analysis/05` §12.2" ], "summary": "sanitize가 아니라 reject가 기본이다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:reject-rather-than-sanitize", "reason": null }, { "id": "BASE-reference-retryability-needs-both-idempotency-and-category", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`analysis/11` §51 · `analysis/05` §3.6" ], "summary": "재시도 가능성은 멱등성과 실패 범주를 함께 봐야 정해진다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:retryability-needs-both-idempotency-and-category", "reason": null }, { "id": "BASE-reference-runtime-membership-decides-severity", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`final/document.md#9` 규칙 1 · `analysis/17` §26.6 · `analysis/19` §1.1 · `analysis/20` §1.1" ], "summary": "`runtime_memberships`를 먼저 읽고 심각도를 정한다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:runtime-membership-decides-severity", "reason": null }, { "id": "BASE-reference-server-metadata-defines-the-command", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`analysis/10` §47" ], "summary": "서버 메타데이터가 명령의 정의이고 정책 파일은 허용 범위다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:server-metadata-defines-the-command", "reason": null }, { "id": "BASE-reference-session-scoped-settings-outlive-the-transaction", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`analysis/05` §3.3, §13.2" ], "summary": "세션 스코프 설정은 풀로 돌아간 커넥션에 남는다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:session-scoped-settings-outlive-the-transaction", "reason": null }, { "id": "BASE-reference-telemetry-can-be-more-dangerous-than-its-subject", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`final/document.md#5-2` · `analysis/05` §12.2 · `analysis/02`" ], "summary": "관측을 위해 수집한 데이터가 관측 대상보다 위험할 수 있다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:telemetry-can-be-more-dangerous-than-its-subject", "reason": null }, { "id": "BASE-reference-tenant-column-belongs-in-every-unique-constraint", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`analysis/05` §13.1" ], "summary": "tenant 컬럼이 있는 테이블의 모든 unique 제약에 그 컬럼이 들어가야 한다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:tenant-column-belongs-in-every-unique-constraint", "reason": null }, { "id": "BASE-reference-the-powerful-half-must-not-be-one-setting-away", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`analysis/09` §49" ], "summary": "권한이 센 절반이 설정 한 줄로 켜지면 안 된다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:the-powerful-half-must-not-be-one-setting-away", "reason": null }, { "id": "BASE-reference-the-startup-validator-follows-the-autoconfiguration-root", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`final/document.md#5-3` · `analysis/18` (SRC-158)" ], "summary": "시작 검증기가 도는지는 그 능력에 자동설정 루트가 있는지와 일치한다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:the-startup-validator-follows-the-autoconfiguration-root", "reason": null }, { "id": "BASE-reference-translation-chain-order-is-a-contract", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`analysis/05` §3.6" ], "summary": "실패 번역 사슬의 순서는 계약이다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:translation-chain-order-is-a-contract", "reason": null }, { "id": "BASE-reference-two-vocabularies-for-one-concept", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`analysis/19` §5.4 · `analysis/06` §58, §69 · `analysis/05` §12.5" ], "summary": "같은 개념의 두 어휘가 공존하면 하나를 죽은 것으로 표시한다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:two-vocabularies-for-one-concept", "reason": null }, { "id": "BASE-reference-unknown-is-a-third-result", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`final/document.md#9` 규칙 13 · `analysis/05` §16 · `analysis/19` §3.2" ], "summary": "모르는 것은 성공도 실패도 아닌 세 번째 결과여야 한다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:unknown-is-a-third-result", "reason": null }, { "id": "BASE-reference-walk-the-cause-chain-most-specific-wins", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`analysis/11` §51" ], "summary": "원인 사슬은 가장 구체적인 분류가 이기도록 순회한다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:walk-the-cause-chain-most-specific-wins", "reason": null }, { "id": "BASE-reference-write-transactions-need-a-finite-timeout", "kindCandidate": "REFERENCE", "priority": "NONE", "sourceRefs": [ "`analysis/05` §2.3" ], "summary": "쓰기 트랜잭션에는 유한 타임아웃이 필수다", "origin": "PRE_COVERAGE_ROOT_TREE_BASELINE", "disposition": "EMITTED", "target": "reference:write-transactions-need-a-finite-timeout", "reason": null } ], "counts": { "total": 335, "emitted": 290, "merged": 45, "blocked": 0, "rejected": 0 }, "unmapped": 0 }