The keycloak project ended with four open questions that design could not
settle. A two-VM lab was built to answer them by measurement, and this is
that material: 26 experiments, 125 raw command outputs, 22 browser captures.
Follows the import procedure in README.md.
source/ the originating repository verbatim — 78 documents, 28 SVGs,
8 manifests, plus .source-revision recording the commit
final/ the SSOT
document.md 729 lines written from the 29 experiment documents, not
concatenated: what was predicted, what was measured, and
where the measurement itself was wrong
evidence/raw 125 outputs, flattened to <experiment>__<file> because
the originals collided (01-baseline.txt appeared three
times) and the audit only globs the top level
evidence/meta one per raw file; command and exitCode are null and the
README says why rather than inventing them
evidence/browser 22 captures
assets/ three diagrams through techviz
.techviz/ their VizSpecs
A separate project rather than an addition to keycloak: the B-layer answers
that project's four questions, but the A, C and D layers are about cluster
failure, SSO and operations, and one document.md should hold one subject.
The four question records there can point here through 관계.
Recorded rather than papered over: only three of the 28 diagrams were
remade. The repository forbids hand-drawn SVG and forbids titles inside the
canvas; all 28 originals carry both, so converting them is redrawing, not
reformatting. They stay in source/ and the gap is written into the document.
verify-pipeline.py passes. audit-records.py reports no issues.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
4527 lines
181 KiB
JSON
4527 lines
181 KiB
JSON
{
|
|
"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
|
|
}
|