Files
document-haness/docs/clean-architecture-backend-template/tech-log-studio/_meta/state.json
T
DongHyeonkaandClaude Opus 5 b2963105a8 docs(keycloak-session-store): import the session-storage lab as a new project
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>
2026-09-04 22:51:59 +09:00

18719 lines
789 KiB
JSON

{
"schemaVersion": 1,
"project": "clean-architecture-backend-template",
"rootTreePath": "/shared/document-detail/clean-architecture-backend-template/root-tree.md",
"rootTreeSha256": "98f442fc71922a8d2aa8f5fe25d380ce0bb8aa422880166c3f43387d8e8e9581",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"upstream": {
"analysisStatus": "COMPLETE",
"crossScopeAnalysis": "COMPLETE",
"finalDocument": "COMPLETE",
"rootTree": "COMPLETE"
},
"records": {
"commit-ambiguity-is-not-only-sqlstate-08": {
"kind": "CASE",
"slug": "commit-ambiguity-is-not-only-sqlstate-08",
"title": "pg_terminate_backend가 57P01로 도착하고 커밋 레코드는 이미 WAL에 있었다",
"topic": "commit-ambiguity-as-a-result",
"path": "case/case-commit-ambiguity-is-not-only-sqlstate-08.md",
"rootTreeNode": "case:commit-ambiguity-is-not-only-sqlstate-08",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "bdbfac2e3008252f12dd11f975bceb8e5df8de94566e6f4ec12947ae62030c79",
"lines": 75,
"body": "case/case-commit-ambiguity-is-not-only-sqlstate-08.body.md",
"bodySha256": "ac8b43caf8828973699aa371ec9b122eb613f7c2ae20dda8b6f50b6715086430",
"assets": [
{
"key": "commit-ambiguity-is-not-only-sqlstate-08",
"kind": "terminal"
}
]
},
"high-water-mark-swallowed-a-redelivered-change": {
"kind": "CASE",
"slug": "high-water-mark-swallowed-a-redelivered-change",
"title": "high-water mark가 \"본 위치\"를 뜻해서 재전달된 변경이 영구히 사라졌다",
"topic": "commit-ambiguity-as-a-result",
"path": "case/case-high-water-mark-swallowed-a-redelivered-change.md",
"rootTreeNode": "case:high-water-mark-swallowed-a-redelivered-change",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "c456331fab94a55c3780bced51456d977df60f6188d0d6f16198c33a71d99c79",
"lines": 82,
"body": "case/case-high-water-mark-swallowed-a-redelivered-change.body.md",
"bodySha256": "6870b9ef33035fc083d4ae3decd75e6915429192ae1a0ccae0c302f014d95eb3",
"assets": [
{
"key": "high-water-mark-swallowed-a-redelivered-change",
"kind": "terminal"
}
]
},
"untranslated-contention-bypassed-the-retry-catch": {
"kind": "CASE",
"slug": "untranslated-contention-bypassed-the-retry-catch",
"title": "번역되지 않은 경합 예외가 재시도 코디네이터의 catch를 통째로 비껴갔다",
"topic": "commit-ambiguity-as-a-result",
"path": "case/case-untranslated-contention-bypassed-the-retry-catch.md",
"rootTreeNode": "case:untranslated-contention-bypassed-the-retry-catch",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "3eb1883e7fc83f627871797a02333eae08f3afc18d4c2c970ec9c340d801a836",
"lines": 72,
"body": "case/case-untranslated-contention-bypassed-the-retry-catch.body.md",
"bodySha256": "02f832f4261bd07aadb7d3714888a8594d9b4408346e2dab61466705ced4b238",
"assets": [
{
"key": "untranslated-contention-bypassed-the-retry-catch",
"kind": "terminal"
}
]
},
"two-owners-popped-the-evidence-frame": {
"kind": "CASE",
"slug": "two-owners-popped-the-evidence-frame",
"title": "커밋 증거 프레임을 두 주인이 pop해서 바깥 트랜잭션의 실패가 익명이 됐다",
"topic": "commit-ambiguity-as-a-result",
"path": "case/case-two-owners-popped-the-evidence-frame.md",
"rootTreeNode": "case:two-owners-popped-the-evidence-frame",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "4fed06b213e37860cabaae3374a5e2ea7514f10e676dc18330711f17577417be",
"lines": 73,
"body": "case/case-two-owners-popped-the-evidence-frame.body.md",
"bodySha256": "6310dafb1ce2f885f59c5f37d3f437af5a2d53c3d0cfd93c3f68a9642033558e",
"assets": [
{
"key": "two-owners-popped-the-evidence-frame",
"kind": "terminal"
}
]
},
"unknown-is-a-third-result": {
"kind": "REFERENCE",
"slug": "unknown-is-a-third-result",
"title": "모르는 것은 성공도 실패도 아닌 세 번째 결과여야 한다",
"topic": "commit-ambiguity-as-a-result",
"path": "reference/reference-unknown-is-a-third-result.md",
"rootTreeNode": "reference:unknown-is-a-third-result",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "ee0088f1363be098f2ea8b8231ddf95eb5bb9b82fd41da82c4f4207bb18f97e1",
"lines": 55
},
"make-the-unsafe-state-unrepresentable": {
"kind": "REFERENCE",
"slug": "make-the-unsafe-state-unrepresentable",
"title": "위험한 조합은 정책이 아니라 생성자가 거부하게 만든다",
"topic": "commit-ambiguity-as-a-result",
"path": "reference/reference-make-the-unsafe-state-unrepresentable.md",
"rootTreeNode": "reference:make-the-unsafe-state-unrepresentable",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "1cc61cdf4458b80c4acf183018b32f6365a11bc201956c8bdf84a3099987fea5",
"lines": 55
},
"ambiguity-rule-hurts-both-ways": {
"kind": "REFERENCE",
"slug": "ambiguity-rule-hurts-both-ways",
"title": "커밋 모호성 판정은 넓혀도 좁혀도 해롭다",
"topic": "commit-ambiguity-as-a-result",
"path": "reference/reference-ambiguity-rule-hurts-both-ways.md",
"rootTreeNode": "reference:ambiguity-rule-hurts-both-ways",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "07f01fe12e8913d913a582ce75ccfa0d01424845012e2ad9f0230f30ebc3d342",
"lines": 52
},
"translation-chain-order-is-a-contract": {
"kind": "REFERENCE",
"slug": "translation-chain-order-is-a-contract",
"title": "실패 번역 사슬의 순서는 계약이다",
"topic": "commit-ambiguity-as-a-result",
"path": "reference/reference-translation-chain-order-is-a-contract.md",
"rootTreeNode": "reference:translation-chain-order-is-a-contract",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d27f606663d9306f62393899502572367bb0a1255da5d18f0267cd53852059a2",
"lines": 56
},
"commit-ambiguity-lane-not-executed": {
"kind": "QUESTION",
"slug": "commit-ambiguity-lane-not-executed",
"title": "커밋 모호성 계약 레인이 이 리비전에서 통과하는지 실행으로 확인되지 않았다",
"topic": "commit-ambiguity-as-a-result",
"path": "openquestion/openquestion-commit-ambiguity-lane-not-executed.md",
"rootTreeNode": "open-question:commit-ambiguity-lane-not-executed",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "fccc624e769f0e06f7bcb0e2f4f22dc17006eb4fd0963a57f8af8fc0d0ad5c2a",
"lines": 74
},
"completion-unknown-is-never-retried": {
"kind": "DECISION",
"slug": "completion-unknown-is-never-retried",
"title": "completion-unknown은 자동으로도 수동으로도 재시도하지 않는다",
"topic": "commit-ambiguity-as-a-result",
"path": "decision/decision-completion-unknown-is-never-retried.md",
"rootTreeNode": "decision:completion-unknown-is-never-retried",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "aede7b5cd5d5fbfdec2eed178a4b7c4ea669c54704e3ea4ab92aba13c1561816",
"lines": 61
},
"three-axes-of-evidence": {
"kind": "DECISION",
"slug": "three-axes-of-evidence",
"title": "전송·업무·스트림 증거는 세 축이고 서로를 함의하지 않는다",
"topic": "commit-ambiguity-as-a-result",
"path": "decision/decision-three-axes-of-evidence.md",
"rootTreeNode": "decision:three-axes-of-evidence",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "edb805d5411ea3eaeb6bd5e045b077cdade16e0281a4990f29bc832e704a6650",
"lines": 66
},
"retry-unit-is-the-use-case": {
"kind": "DECISION",
"slug": "retry-unit-is-the-use-case",
"title": "재시도 단위는 statement가 아니라 유스케이스 전체다",
"topic": "commit-ambiguity-as-a-result",
"path": "decision/decision-retry-unit-is-the-use-case.md",
"rootTreeNode": "decision:retry-unit-is-the-use-case",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "bc207d4a2ecfad496f02f7b8d60ccdb3ab53e3b97dfd8116d81472ef42eff058",
"lines": 69
},
"commit-evidence-phases": {
"kind": "CONCEPT",
"slug": "commit-evidence-phases",
"title": "커밋 증거 단계 — NOT_STARTED에서 UNKNOWN까지",
"topic": "commit-ambiguity-as-a-result",
"path": "concept/concept-commit-evidence-phases.md",
"rootTreeNode": "concept:commit-evidence-phases",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a60c4160bbf9abe3fd0c1820d27556dac3ddd3c1555f9c9a326fdacb23240a0d",
"lines": 123,
"body": "concept/concept-commit-evidence-phases.body.md",
"bodySha256": "852d27a4130954730e1264150c45931f22ecfe95939bc51ddcdd86227c1e96e2",
"assets": [
{
"key": "commit-evidence-phases-diagram",
"kind": "diagram"
},
{
"key": "commit-evidence-phases",
"kind": "terminal"
}
]
},
"transaction-result-algebra": {
"kind": "CONCEPT",
"slug": "transaction-result-algebra",
"title": "트랜잭션 결과 대수 — 다섯 변형이 각각 답하는 질문",
"topic": "commit-ambiguity-as-a-result",
"path": "concept/concept-transaction-result-algebra.md",
"rootTreeNode": "concept:transaction-result-algebra",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "2ba10c2a923dd6b4eb61c2e6a8f217e82bf96186b970f5e4ca8a81d8b7c06300",
"lines": 109,
"body": "concept/concept-transaction-result-algebra.body.md",
"bodySha256": "6a1f5cdb21e14bad06f24d920f20cf7fa93c8256d2e74b483c74cc9cfdee3dac",
"assets": [
{
"key": "transaction-result-algebra",
"kind": "terminal"
}
]
},
"three-assembly-paths": {
"kind": "CONCEPT",
"slug": "three-assembly-paths",
"title": "Spring 조립의 세 경로와 각각이 결정하는 것",
"topic": "assembly-ownership",
"path": "concept/concept-three-assembly-paths.md",
"rootTreeNode": "concept:three-assembly-paths",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d04cb8f9d5061ea702524981ccc366640ea2db961cca50ac656f7a29ca191192",
"lines": 119,
"body": "concept/concept-three-assembly-paths.body.md",
"bodySha256": "1cded0c075faff9ea69a09da433d614610a316acd97172ab15915ca0d5880feb",
"assets": [
{
"key": "three-assembly-paths-diagram",
"kind": "diagram"
},
{
"key": "three-assembly-paths",
"kind": "terminal"
}
]
},
"when-conditions-are-evaluated": {
"kind": "CONCEPT",
"slug": "when-conditions-are-evaluated",
"title": "조건부 빈의 평가 시점 — 파싱 시점과 등록 시점",
"topic": "assembly-ownership",
"path": "concept/concept-when-conditions-are-evaluated.md",
"rootTreeNode": "concept:when-conditions-are-evaluated",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "8bb6724494eba6036ee9411aa93e1dcf879d9e1f4e287722f8a2fa44ef5186a3",
"lines": 89,
"body": "concept/concept-when-conditions-are-evaluated.body.md",
"bodySha256": "f1c82cbbed51dfe953f235cb62c25bc0cb245e995a16e9d1e01f21b1372632b4",
"assets": [
{
"key": "when-conditions-are-evaluated",
"kind": "terminal"
}
]
},
"scan-exclusion-without-an-owner": {
"kind": "CASE",
"slug": "scan-exclusion-without-an-owner",
"title": "스캔에서 뺀 다섯 패키지의 컴포넌트 여섯을 두 자동설정 어느 쪽도 소유하지 않았다",
"topic": "assembly-ownership",
"path": "case/case-scan-exclusion-without-an-owner.md",
"rootTreeNode": "case:scan-exclusion-without-an-owner",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "836cd4cb22cd3ca19c6885df34c5672d08a1326bfebf237282dddca10b5eeade",
"lines": 82,
"body": "case/case-scan-exclusion-without-an-owner.body.md",
"bodySha256": "cdfb81d5f02b0f82db71138c7a38d2d69fc73ee87bae077ef5df02edbd6d2dc5",
"assets": [
{
"key": "scan-exclusion-without-an-owner",
"kind": "terminal"
}
]
},
"outbox-chain-behind-an-unsatisfiable-condition": {
"kind": "CASE",
"slug": "outbox-chain-behind-an-unsatisfiable-condition",
"title": "outbox 가 둘이고, 출하되는 것은 messaging 플랫폼 쪽이 아니다",
"topic": "assembly-ownership",
"path": "case/case-outbox-chain-behind-an-unsatisfiable-condition.md",
"rootTreeNode": "case:outbox-chain-behind-an-unsatisfiable-condition",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "192c60fa1d67c1f6d5435eaf5110bc9d5fe6501d828a20a1c02ccd84af60c78c",
"lines": 93,
"body": "case/case-outbox-chain-behind-an-unsatisfiable-condition.body.md",
"bodySha256": "8d73218ff55aeaeee6dc6f750847f323f6ce6c5a8b8fe35a834d4cc98710abe1",
"assets": [
{
"key": "outbox-chain-behind-an-unsatisfiable-condition",
"kind": "terminal"
}
]
},
"observation-downgraded-by-the-composition": {
"kind": "CASE",
"slug": "observation-downgraded-by-the-composition",
"title": "관측을 필수 생성자 인자로 만든 수정을 조립이 6인자 생성자로 되돌렸다",
"topic": "assembly-ownership",
"path": "case/case-observation-downgraded-by-the-composition.md",
"rootTreeNode": "case:observation-downgraded-by-the-composition",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "1c333f21b10ce1df518bcf83e494e92468c9cf14c95b42ad833f53abc7ae2e3e",
"lines": 69,
"body": "case/case-observation-downgraded-by-the-composition.body.md",
"bodySha256": "b7c5217fd50e46a99cd4e5b4427ea43c5eb6dfd6fe26c2d286fcea12c09c48be",
"assets": [
{
"key": "observation-downgraded-by-the-composition",
"kind": "terminal"
}
]
},
"autoconfiguration-in-name-only": {
"kind": "CASE",
"slug": "autoconfiguration-in-name-only",
"title": "이름만 AutoConfiguration이던 세 클래스가 capability 리포트에 Stable로 올라 있었다",
"topic": "assembly-ownership",
"path": "case/case-autoconfiguration-in-name-only.md",
"rootTreeNode": "case:autoconfiguration-in-name-only",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "47ee9ca672402fb3d2a0929e07dd5155c2e1249b58970e5968b27de473d0743e",
"lines": 65,
"body": "case/case-autoconfiguration-in-name-only.body.md",
"bodySha256": "ccc6ac6ab61c6de76e5bbb4e5b4711ce89da33be5c50f708982e56e6d2092faf",
"assets": [
{
"key": "autoconfiguration-in-name-only",
"kind": "terminal"
}
]
},
"conditionalonbean-evaluated-at-parse-time": {
"kind": "CASE",
"slug": "conditionalonbean-evaluated-at-parse-time",
"title": "'@ConditionalOnBean(DataSource.class)가 클래스 파싱 시점에 평가되어 여덟 빈이 사라졌다'",
"topic": "assembly-ownership",
"path": "case/case-conditionalonbean-evaluated-at-parse-time.md",
"rootTreeNode": "case:conditionalonbean-evaluated-at-parse-time",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "47cdcad1439be16bddc3d828b5fda82237fc4eaa610c49cb0fa3bee12279758d",
"lines": 61,
"body": "case/case-conditionalonbean-evaluated-at-parse-time.body.md",
"bodySha256": "5d070b173955c6a49d539813ab5841fd55e73ec19b6b09fc0a58d271d6de1717",
"assets": [
{
"key": "conditionalonbean-evaluated-at-parse-time",
"kind": "terminal"
}
]
},
"narrowing-the-scan-orphaned-eight-components": {
"kind": "CASE",
"slug": "narrowing-the-scan-orphaned-eight-components",
"title": "넓은 스캔을 좁히자 여덟 컴포넌트에 아무것도 도달하지 않았다",
"topic": "assembly-ownership",
"path": "case/case-narrowing-the-scan-orphaned-eight-components.md",
"rootTreeNode": "case:narrowing-the-scan-orphaned-eight-components",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5fefc95af220a954e2bce7ee02324af2285496cd0a26955e7f793598af63b777",
"lines": 75,
"body": "case/case-narrowing-the-scan-orphaned-eight-components.body.md",
"bodySha256": "9b4ccf2dd5a9607c90b0e3f6587ff69762a8f5c37905e241b614d7b20af270f2",
"assets": [
{
"key": "narrowing-the-scan-orphaned-eight-components",
"kind": "terminal"
}
]
},
"thirteen-startup-rules-never-run": {
"kind": "CASE",
"slug": "thirteen-startup-rules-never-run",
"title": "시작 검증기 13개 규칙이 유일한 조립 지점에서 호출되지 않는다",
"topic": "assembly-ownership",
"path": "case/case-thirteen-startup-rules-never-run.md",
"rootTreeNode": "case:thirteen-startup-rules-never-run",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "163d206bb1be89d392848e83f46896eccdc2a74a4e9783df9b454a8b131f55ab",
"lines": 61,
"body": "case/case-thirteen-startup-rules-never-run.body.md",
"bodySha256": "0ca79e0f3e5a486fad740f03f9f124786cc273f33b0f4c05d7f6bb22a6cd0a7d",
"assets": [
{
"key": "thirteen-startup-rules-never-run",
"kind": "terminal"
}
]
},
"a-flag-that-validates-an-unwired-subsystem": {
"kind": "CASE",
"slug": "a-flag-that-validates-an-unwired-subsystem",
"title": "하위 시스템 전체가 미배선인데 그것을 켜는 플래그는 시작 검사를 수행한다",
"topic": "assembly-ownership",
"path": "case/case-a-flag-that-validates-an-unwired-subsystem.md",
"rootTreeNode": "case:a-flag-that-validates-an-unwired-subsystem",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "8b2462317c46fcab81465b6d7f518cb60fa9a855dfec2aae3d112adb4c20d192",
"lines": 62,
"body": "case/case-a-flag-that-validates-an-unwired-subsystem.body.md",
"bodySha256": "a232c97d87f1d27367ded070d28fb159f46c637d73b1e66c55a0b23d3a8e9ca0",
"assets": [
{
"key": "a-flag-that-validates-an-unwired-subsystem",
"kind": "terminal"
}
]
},
"a-bean-is-not-composition-evidence": {
"kind": "REFERENCE",
"slug": "a-bean-is-not-composition-evidence",
"title": "'@Bean이 있다는 것은 조립 증거가 아니다'",
"topic": "assembly-ownership",
"path": "reference/reference-a-bean-is-not-composition-evidence.md",
"rootTreeNode": "reference:a-bean-is-not-composition-evidence",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "7cff7dd54c49c75f7e65153c50aa48baba1eb40021d1277d0f93ad18787f64f9",
"lines": 62
},
"conditionalonbean-must-be-satisfiable": {
"kind": "REFERENCE",
"slug": "conditionalonbean-must-be-satisfiable",
"title": "'@ConditionalOnBean은 조건이 만족될 수 있는지까지 확인해야 한다'",
"topic": "assembly-ownership",
"path": "reference/reference-conditionalonbean-must-be-satisfiable.md",
"rootTreeNode": "reference:conditionalonbean-must-be-satisfiable",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "2bb8b352095b74502a93a960f5458605bd89ffed064bddb428942ac44026383e",
"lines": 58
},
"the-startup-validator-follows-the-autoconfiguration-root": {
"kind": "REFERENCE",
"slug": "the-startup-validator-follows-the-autoconfiguration-root",
"title": "시작 검증기가 도는지는 그 능력에 자동설정 루트가 있는지와 일치한다",
"topic": "assembly-ownership",
"path": "reference/reference-the-startup-validator-follows-the-autoconfiguration-root.md",
"rootTreeNode": "reference:the-startup-validator-follows-the-autoconfiguration-root",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "c798147ec76c0defceeaf1380b4db5bb4956a6c4c3c7f2adfc207c8fcdf6611b",
"lines": 51
},
"read-the-assembling-side-first": {
"kind": "REFERENCE",
"slug": "read-the-assembling-side-first",
"title": "조립 결함을 판정하려면 조립하는 쪽을 먼저 읽어야 한다",
"topic": "assembly-ownership",
"path": "reference/reference-read-the-assembling-side-first.md",
"rootTreeNode": "reference:read-the-assembling-side-first",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d4427193783454cdc2888fe676eb27ff3bb30410b01bf8f4eeb41fae3eeb743a",
"lines": 53
},
"off-must-be-structural": {
"kind": "REFERENCE",
"slug": "off-must-be-structural",
"title": "'\"꺼짐\"은 조건의 반복이 아니라 구조여야 한다'",
"topic": "assembly-ownership",
"path": "reference/reference-off-must-be-structural.md",
"rootTreeNode": "reference:off-must-be-structural",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "42b80c488766d46bb0d2eda0eb08d0d4305d204f98618843fe30eae6e693180d",
"lines": 58
},
"count-the-frameworks-own-autoconfigurations": {
"kind": "REFERENCE",
"slug": "count-the-frameworks-own-autoconfigurations",
"title": "프레임워크가 기여하는 자동설정까지 세지 않으면 스위치가 아니다",
"topic": "assembly-ownership",
"path": "reference/reference-count-the-frameworks-own-autoconfigurations.md",
"rootTreeNode": "reference:count-the-frameworks-own-autoconfigurations",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "8dd0440af36732c9d360891ce84cf82ce691ee10183fe24312dcb19c714b53ca",
"lines": 51
},
"one-boot-would-settle-two-findings": {
"kind": "QUESTION",
"slug": "one-boot-would-settle-two-findings",
"title": "부팅 한 번으로 확증 가능한 두 건이 아직 정적 추론으로만 남아 있다",
"topic": "assembly-ownership",
"path": "openquestion/openquestion-one-boot-would-settle-two-findings.md",
"rootTreeNode": "open-question:one-boot-would-settle-two-findings",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "187cef6c56397e46a96093c6f77943ec8426a91587b3180a4350bc3657958bee",
"lines": 77
},
"conditional-evaluation-order-unverified": {
"kind": "QUESTION",
"slug": "conditional-evaluation-order-unverified",
"title": "'@ConditionalOnBean 사슬의 실제 평가 순서를 확인하지 않았다'",
"topic": "assembly-ownership",
"path": "openquestion/openquestion-conditional-evaluation-order-unverified.md",
"rootTreeNode": "open-question:conditional-evaluation-order-unverified",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "409af52f43ff2ee0a3db820cf4562ac151b6c376de8d444edbbe8af082036b9b",
"lines": 74
},
"one-root-owns-the-master-switch": {
"kind": "DECISION",
"slug": "one-root-owns-the-master-switch",
"title": "마스터 스위치는 루트 하나가 소유하고 자식 설정은 조건을 갖지 않는다",
"topic": "assembly-ownership",
"path": "decision/decision-one-root-owns-the-master-switch.md",
"rootTreeNode": "decision:one-root-owns-the-master-switch",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "6e0850d561e939ffaff1a89cbe4e1e6a2a8014dfa47594e2927dbc33e959717c",
"lines": 63
},
"pool-need-is-a-capability-question": {
"kind": "DECISION",
"slug": "pool-need-is-a-capability-question",
"title": "풀이 필요한지는 \"JPA가 켜졌나\"가 아니라 \"커넥션이 필요한 capability가 있나\"로 묻는다",
"topic": "assembly-ownership",
"path": "decision/decision-pool-need-is-a-capability-question.md",
"rootTreeNode": "decision:pool-need-is-a-capability-question",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "15b1a9fe7e597b2f252aacc07879a060190a61d1da7a54a82288cab21ad13384",
"lines": 63
},
"a-validator-that-demands-tls-and-an-assembly-that-omits-it": {
"kind": "CASE",
"slug": "a-validator-that-demands-tls-and-an-assembly-that-omits-it",
"title": "검증기가 운영에 TLS를 요구하고, 실제로 조립되는 생산자에는 그 설정이 없다",
"topic": "assembly-ownership",
"path": "case/case-a-validator-that-demands-tls-and-an-assembly-that-omits-it.md",
"rootTreeNode": "case:a-validator-that-demands-tls-and-an-assembly-that-omits-it",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "c996e00aff7ac84b770de7e6e540cbcba83b8b8dde73ec111bbf115c7c8a110f",
"lines": 72,
"body": "case/case-a-validator-that-demands-tls-and-an-assembly-that-omits-it.body.md",
"bodySha256": "240caaae647afe5e4074501f50e671b4a40b5064314602e5794d2fc3af596d5e",
"assets": [
{
"key": "a-validator-that-demands-tls-and-an-assembly-that-omits-it",
"kind": "terminal"
},
{
"key": "a-validator-that-demands-tls-and-an-assembly-that-omits-it-run",
"kind": "terminal"
}
]
},
"strict-test-lane": {
"kind": "CONCEPT",
"slug": "strict-test-lane",
"title": "strict test lane — 발견하지 못하면 실패하는 레인",
"topic": "what-a-gate-does-not-prove",
"path": "concept/concept-strict-test-lane.md",
"rootTreeNode": "concept:strict-test-lane",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "9ae24f186a2c9e40081f370bbeae054a1608a5daa0214b258b9fb5bd41fd3b8c",
"lines": 93,
"body": "concept/concept-strict-test-lane.body.md",
"bodySha256": "9e9bc782f595c62d3a2f1ddabc6e934a133dde82aa2efb862b2f39a9df7fb7e5",
"assets": [
{
"key": "strict-test-lane",
"kind": "terminal"
}
]
},
"evidence-grades-and-provenance": {
"kind": "CONCEPT",
"slug": "evidence-grades-and-provenance",
"title": "증거 등급과 provenance — R1과 R2를 가르는 것",
"topic": "what-a-gate-does-not-prove",
"path": "concept/concept-evidence-grades-and-provenance.md",
"rootTreeNode": "concept:evidence-grades-and-provenance",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "436d01dbbb5d0d876162bac528fa7c3d81d70ac8d8120ffc9abcd1689b941e16",
"lines": 93,
"body": "concept/concept-evidence-grades-and-provenance.body.md",
"bodySha256": "7536d63f426b16b28247e2691f718a648621d7824c2c913292ecb050c570c262",
"assets": [
{
"key": "evidence-grades-and-provenance-diagram",
"kind": "diagram"
},
{
"key": "evidence-grades-and-provenance",
"kind": "terminal"
}
]
},
"a-certifying-lane-that-compared-nothing": {
"kind": "CASE",
"slug": "a-certifying-lane-that-compared-nothing",
"title": "'\"certified\"라 불리던 레인이 threshold를 하나도 비교하지 않고 있었다'",
"topic": "what-a-gate-does-not-prove",
"path": "case/case-a-certifying-lane-that-compared-nothing.md",
"rootTreeNode": "case:a-certifying-lane-that-compared-nothing",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "130350fed886dbc005376cd2a467f9ec14692512c7b845e9bfbb46062064be2e",
"lines": 64,
"body": "case/case-a-certifying-lane-that-compared-nothing.body.md",
"bodySha256": "f4a98c7ff21c963d0dd6698c2c53666e0a4c73730e590e7e1e11f56daf32649a",
"assets": [
{
"key": "a-certifying-lane-that-compared-nothing",
"kind": "terminal"
}
]
},
"doc-contract-test-boundary-predicted-the-drift": {
"kind": "CASE",
"slug": "doc-contract-test-boundary-predicted-the-drift",
"title": "문서 계약 테스트의 단언 경계 밖에 발견된 드리프트 세 건이 전부 있었다",
"topic": "what-a-gate-does-not-prove",
"path": "case/case-doc-contract-test-boundary-predicted-the-drift.md",
"rootTreeNode": "case:doc-contract-test-boundary-predicted-the-drift",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "224f1a7a2e8ca87bb5007d25b26db98a68b8ce62baf191225e5165cdd35e2588",
"lines": 80,
"body": "case/case-doc-contract-test-boundary-predicted-the-drift.body.md",
"bodySha256": "83ab2a4adebba01208aca39d37f2b3f63bbb97ebf04573c3ff79e5b2d316b076",
"assets": [
{
"key": "doc-contract-test-boundary-predicted-the-drift",
"kind": "terminal"
}
]
},
"a-release-gate-with-no-evidence-producer": {
"kind": "CASE",
"slug": "a-release-gate-with-no-evidence-producer",
"title": "릴리스 게이트가 읽는 증거를 아무도 생산하지 않는다",
"topic": "what-a-gate-does-not-prove",
"path": "case/case-a-release-gate-with-no-evidence-producer.md",
"rootTreeNode": "case:a-release-gate-with-no-evidence-producer",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "efc5892972c2582860c174d855525f030f113109e5aa73497e4902b3424f5d68",
"lines": 63,
"body": "case/case-a-release-gate-with-no-evidence-producer.body.md",
"bodySha256": "e658137119ec91b9f9aa7cbfe2c79124780b76baee30c235fbae08f5dcb24811",
"assets": [
{
"key": "a-release-gate-with-no-evidence-producer",
"kind": "terminal"
}
]
},
"two-files-name-a-build-gate-that-no-build-runs": {
"kind": "CASE",
"slug": "two-files-name-a-build-gate-that-no-build-runs",
"title": "두 파일이 같은 검증기를 \"빌드를 실패시키는 것\"이라 적고, 어떤 빌드도 그것을 부르지 않는다",
"topic": "what-a-gate-does-not-prove",
"path": "case/case-two-files-name-a-build-gate-that-no-build-runs.md",
"rootTreeNode": "case:two-files-name-a-build-gate-that-no-build-runs",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "1a15053bdfda25a436d3a3e9eff7fd42ae7118152837b0f25b73950b025fba68",
"lines": 66,
"body": "case/case-two-files-name-a-build-gate-that-no-build-runs.body.md",
"bodySha256": "72f5b151a409b3553f1e1eb7daa50e2b03d43e50520f8dabfbb9ccc3360d909f",
"assets": [
{
"key": "two-files-name-a-build-gate-that-no-build-runs",
"kind": "terminal"
}
]
},
"test-names-that-assert-what-their-bodies-do-not": {
"kind": "CASE",
"slug": "test-names-that-assert-what-their-bodies-do-not",
"title": "이름이 검사한다고 말하는 것을 본문이 검사하지 않는 테스트 넷",
"topic": "what-a-gate-does-not-prove",
"path": "case/case-test-names-that-assert-what-their-bodies-do-not.md",
"rootTreeNode": "case:test-names-that-assert-what-their-bodies-do-not",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "bbb8179cc85e3e4cd3a58b9b59a7a18f0830c5df68a3b6182b68937ee2668045",
"lines": 63,
"body": "case/case-test-names-that-assert-what-their-bodies-do-not.body.md",
"bodySha256": "d945edae7cf7c58ef7731367be8a8d3e76eeb0bb4bfe106f00e6a7558e30d2d3",
"assets": [
{
"key": "test-names-that-assert-what-their-bodies-do-not",
"kind": "terminal"
}
]
},
"a-catalog-nine-entries-short": {
"kind": "CASE",
"slug": "a-catalog-nine-entries-short",
"title": "패키지 카탈로그가 트리보다 아홉 개 적었고, 선언된 간선의 DAG 검사도 없었다",
"topic": "what-a-gate-does-not-prove",
"path": "case/case-a-catalog-nine-entries-short.md",
"rootTreeNode": "case:a-catalog-nine-entries-short",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "6585137d0c3e49248780f5e0364e304a5f136dfa2b28e15c2e4fc63ebed098ae",
"lines": 60,
"body": "case/case-a-catalog-nine-entries-short.body.md",
"bodySha256": "f53fe44a71e7c2610dda2aa41df107b21d83fce8a2c3c12c242b15567ddcabee",
"assets": [
{
"key": "a-catalog-nine-entries-short",
"kind": "terminal"
}
]
},
"three-versions-declared-one-executed": {
"kind": "CASE",
"slug": "three-versions-declared-one-executed",
"title": "릴리스 레인이 매트릭스 세 버전 중 첫 번째만 돌리고 세 개를 커버로 기록했다",
"topic": "what-a-gate-does-not-prove",
"path": "case/case-three-versions-declared-one-executed.md",
"rootTreeNode": "case:three-versions-declared-one-executed",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "7413536fab44b871b218e94bdefc06f391a96143b5b4a338ca47633b42fa077f",
"lines": 59,
"body": "case/case-three-versions-declared-one-executed.body.md",
"bodySha256": "e06c74ff40a4574b7ea0dffbb29e98c60bcc201041102033b7cfd4f30126f7ea",
"assets": [
{
"key": "three-versions-declared-one-executed",
"kind": "terminal"
}
]
},
"a-test-that-passed-on-the-wrong-guard": {
"kind": "CASE",
"slug": "a-test-that-passed-on-the-wrong-guard",
"title": "다중 타깃 검증을 확인한다는 테스트가 다른 가드에 걸려 통과했다",
"topic": "what-a-gate-does-not-prove",
"path": "case/case-a-test-that-passed-on-the-wrong-guard.md",
"rootTreeNode": "case:a-test-that-passed-on-the-wrong-guard",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "27fa1e6f77fa49b7f3bb7266cd581ecb7cebfcc946f6255192130dd2f5217def",
"lines": 63,
"body": "case/case-a-test-that-passed-on-the-wrong-guard.body.md",
"bodySha256": "5e49bf1c9b0c42eda4f7a94d2c9194221d1fbdeac08f6dd22a125177c7847d60",
"assets": [
{
"key": "a-test-that-passed-on-the-wrong-guard",
"kind": "terminal"
}
]
},
"omission-that-passes-is-not-a-gate": {
"kind": "REFERENCE",
"slug": "omission-that-passes-is-not-a-gate",
"title": "빠뜨림이 통과가 되는 게이트는 게이트가 아니다",
"topic": "what-a-gate-does-not-prove",
"path": "reference/reference-omission-that-passes-is-not-a-gate.md",
"rootTreeNode": "reference:omission-that-passes-is-not-a-gate",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "6c0d366eba902c57a3e9121000be4bbd506f6dc5dc8e62efdbac23ca8a966073",
"lines": 60
},
"agreement-between-documents-proves-nothing": {
"kind": "REFERENCE",
"slug": "agreement-between-documents-proves-nothing",
"title": "문서와 상수가 서로 일치하는 것으로는 아무것도 증명되지 않는다",
"topic": "what-a-gate-does-not-prove",
"path": "reference/reference-agreement-between-documents-proves-nothing.md",
"rootTreeNode": "reference:agreement-between-documents-proves-nothing",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "cf36c0df44d052d083c75ab9e54aa80b33a645545d0ef068413a4baf39a0237f",
"lines": 53
},
"a-gate-nobody-runs-reports-the-last-run": {
"kind": "REFERENCE",
"slug": "a-gate-nobody-runs-reports-the-last-run",
"title": "아무도 돌리지 않는 레인의 게이트는 마지막으로 돌린 사람이 본 것을 보고한다",
"topic": "what-a-gate-does-not-prove",
"path": "reference/reference-a-gate-nobody-runs-reports-the-last-run.md",
"rootTreeNode": "reference:a-gate-nobody-runs-reports-the-last-run",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "63c86d92c36495acc99a3f305e5ca2451c705b24d3180709b252738deabf34e2",
"lines": 51
},
"a-gate-declared-in-prose-is-not-in-the-build": {
"kind": "REFERENCE",
"slug": "a-gate-declared-in-prose-is-not-in-the-build",
"title": "산문이 선언한 게이트는 빌드에 있는 게이트가 아니다",
"topic": "what-a-gate-does-not-prove",
"path": "reference/reference-a-gate-declared-in-prose-is-not-in-the-build.md",
"rootTreeNode": "reference:a-gate-declared-in-prose-is-not-in-the-build",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "40f27d569f21be9d0107e799c5ac62458dcb9c0c5696f928a39c00bb38475191",
"lines": 61
},
"a-contract-test-must-run-the-adapters-statement": {
"kind": "REFERENCE",
"slug": "a-contract-test-must-run-the-adapters-statement",
"title": "계약 테스트는 어댑터가 실제로 돌리는 statement를 실행해야 한다",
"topic": "what-a-gate-does-not-prove",
"path": "reference/reference-a-contract-test-must-run-the-adapters-statement.md",
"rootTreeNode": "reference:a-contract-test-must-run-the-adapters-statement",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "271d6fd8bcc2cea8207cd6ab98f1c943d25069b04f969132fe63a877e493c11b",
"lines": 51
},
"a-lane-that-discovers-nothing-must-fail": {
"kind": "REFERENCE",
"slug": "a-lane-that-discovers-nothing-must-fail",
"title": "아무것도 발견하지 못한 레인은 성공이 아니라 실패여야 한다",
"topic": "what-a-gate-does-not-prove",
"path": "reference/reference-a-lane-that-discovers-nothing-must-fail.md",
"rootTreeNode": "reference:a-lane-that-discovers-nothing-must-fail",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "8dea91dca65cafef3a7c6efb4d8bbe9b385ee32bbb871a494a418dd932179d00",
"lines": 56
},
"container-lanes-not-executed": {
"kind": "QUESTION",
"slug": "container-lanes-not-executed",
"title": "컨테이너가 필요한 레인의 실제 결과를 실행으로 확인하지 않았다",
"topic": "what-a-gate-does-not-prove",
"path": "openquestion/openquestion-container-lanes-not-executed.md",
"rootTreeNode": "open-question:container-lanes-not-executed",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5cb76a07e9c4837e2dd4c638b988bc2cc6b6b0a05be8cabd025a162de623fe3a",
"lines": 85
},
"only-the-certification-lane-carries-no-docker-guard": {
"kind": "DECISION",
"slug": "only-the-certification-lane-carries-no-docker-guard",
"title": "인증 레인만 Docker 가드를 달지 않는다",
"topic": "what-a-gate-does-not-prove",
"path": "decision/decision-only-the-certification-lane-carries-no-docker-guard.md",
"rootTreeNode": "decision:only-the-certification-lane-carries-no-docker-guard",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "efaa71df871a096824faad0fa52dc7b0629b144fb82cbf0ebe3d0b6655b49e4d",
"lines": 57
},
"performance-measurement-is-not-a-release-gate": {
"kind": "DECISION",
"slug": "performance-measurement-is-not-a-release-gate",
"title": "성능 측정은 릴리스 게이트에 넣지 않는다",
"topic": "what-a-gate-does-not-prove",
"path": "decision/decision-performance-measurement-is-not-a-release-gate.md",
"rootTreeNode": "decision:performance-measurement-is-not-a-release-gate",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "de65367c4285464d768a1b74adeabd64e136582fa233de632d1a4212a6a04bc0",
"lines": 61
},
"candidate-evidence-stays-at-r1": {
"kind": "DECISION",
"slug": "candidate-evidence-stays-at-r1",
"title": "후보 증거는 통과해도 R1에 머무르고 R2는 별도 게이트가 판정한다",
"topic": "what-a-gate-does-not-prove",
"path": "decision/decision-candidate-evidence-stays-at-r1.md",
"rootTreeNode": "decision:candidate-evidence-stays-at-r1",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "8f83687cda4c8802442c3c83a2901ce8b57b7cb7c2e56ce6834eda8db76ad191",
"lines": 60
},
"signed-cursor-structure": {
"kind": "CONCEPT",
"slug": "signed-cursor-structure",
"title": "서명된 커서의 구조와 검증 순서",
"topic": "bounding-by-type",
"path": "concept/concept-signed-cursor-structure.md",
"rootTreeNode": "concept:signed-cursor-structure",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "ae5cb0d6e4646dfd80ac586a3a3c0ddc2347a49c851c8ad9a4fc9643bbd3f8db",
"lines": 104,
"body": "concept/concept-signed-cursor-structure.body.md",
"bodySha256": "c7c4af33667a1b40167846b571c2c968a61e18837196f053ed533b88ab005064",
"assets": [
{
"key": "signed-cursor-structure-diagram",
"kind": "diagram"
},
{
"key": "signed-cursor-structure",
"kind": "terminal"
}
]
},
"cardinality-bounds-as-types": {
"kind": "CONCEPT",
"slug": "cardinality-bounds-as-types",
"title": "카디널리티 경계를 타입으로 표현하기",
"topic": "bounding-by-type",
"path": "concept/concept-cardinality-bounds-as-types.md",
"rootTreeNode": "concept:cardinality-bounds-as-types",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f870019e9dcaa4f1aa3f39940069bbb0b4ccf06ad3fd4cbccb415558253aff48",
"lines": 123,
"body": "concept/concept-cardinality-bounds-as-types.body.md",
"bodySha256": "70c2d5980bd098eb56c642fc0c77e7abbaf8e0f78f88c8189f2e4c1196a3c4ae",
"assets": [
{
"key": "cardinality-bounds-as-types-diagram",
"kind": "diagram"
},
{
"key": "cardinality-bounds-as-types",
"kind": "terminal"
}
]
},
"pii-through-an-exception-message": {
"kind": "CASE",
"slug": "pii-through-an-exception-message",
"title": "시그니처가 payload를 받지 않는데 예외 메시지로 PII가 로그에 남았다",
"topic": "bounding-by-type",
"path": "case/case-pii-through-an-exception-message.md",
"rootTreeNode": "case:pii-through-an-exception-message",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "796b3116ebd41d0904a500b51b824fed9d2c642cf9ff74eea696add33475514c",
"lines": 77,
"body": "case/case-pii-through-an-exception-message.body.md",
"bodySha256": "93850447a23ec6854a40a65642a7f0d82c8e807ef3d10a5f47919421eae4e520",
"assets": [
{
"key": "pii-through-an-exception-message",
"kind": "terminal"
}
]
},
"a-report-that-cannot-carry-a-datasource": {
"kind": "CASE",
"slug": "a-report-that-cannot-carry-a-datasource",
"title": "진단 리포트가 살아 있는 리소스를 담지 않도록 값 타입을 좁혔다",
"topic": "bounding-by-type",
"path": "case/case-a-report-that-cannot-carry-a-datasource.md",
"rootTreeNode": "case:a-report-that-cannot-carry-a-datasource",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "67ddff9dcd7fed29fb8bba61f6cf38e79b179d6417e128ad71c332037a3cd95a",
"lines": 59,
"body": "case/case-a-report-that-cannot-carry-a-datasource.body.md",
"bodySha256": "a597ea5abe72fa589ad316980d701afa5df483cd4e81c2f40e495ffc7de2c87c",
"assets": [
{
"key": "a-report-that-cannot-carry-a-datasource",
"kind": "terminal"
}
]
},
"cursor-verification-order": {
"kind": "CASE",
"slug": "cursor-verification-order",
"title": "커서 서명 검증이 길이·상수시간·순서를 전부 지켜야 했던 이유",
"topic": "bounding-by-type",
"path": "case/case-cursor-verification-order.md",
"rootTreeNode": "case:cursor-verification-order",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "8a64f3ff06562bb15202e8b8095706c97b593254b735dc524662e5d0291874f5",
"lines": 72,
"body": "case/case-cursor-verification-order.body.md",
"bodySha256": "835b38af61ccd6993535202a6ae792b57da5e05288f23e226ad7e25bcf8f0662",
"assets": [
{
"key": "cursor-verification-order",
"kind": "terminal"
}
]
},
"names-are-registry-keys-not-values": {
"kind": "REFERENCE",
"slug": "names-are-registry-keys-not-values",
"title": "이름은 값이 아니라 registry key다",
"topic": "bounding-by-type",
"path": "reference/reference-names-are-registry-keys-not-values.md",
"rootTreeNode": "reference:names-are-registry-keys-not-values",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a6b8feb6dc6808085f18f9fc43cfb75d49272604187601a9510dd6fe5cee0814",
"lines": 53
},
"telemetry-can-be-more-dangerous-than-its-subject": {
"kind": "REFERENCE",
"slug": "telemetry-can-be-more-dangerous-than-its-subject",
"title": "관측을 위해 수집한 데이터가 관측 대상보다 위험할 수 있다",
"topic": "bounding-by-type",
"path": "reference/reference-telemetry-can-be-more-dangerous-than-its-subject.md",
"rootTreeNode": "reference:telemetry-can-be-more-dangerous-than-its-subject",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "82ad2f4f8457b5eeccad5c1eff3b0c83cae176021018e0758c8673dfa4eaad18",
"lines": 58
},
"register-paths-bind-values": {
"kind": "REFERENCE",
"slug": "register-paths-bind-values",
"title": "path·identifier는 등록하고 value는 바인딩한다",
"topic": "bounding-by-type",
"path": "reference/reference-register-paths-bind-values.md",
"rootTreeNode": "reference:register-paths-bind-values",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0fd81ddfe08c33ffcbb8579412e05454e00327b3da41f462ec6d36256a547c03",
"lines": 53
},
"reject-rather-than-sanitize": {
"kind": "REFERENCE",
"slug": "reject-rather-than-sanitize",
"title": "sanitize가 아니라 reject가 기본이다",
"topic": "bounding-by-type",
"path": "reference/reference-reject-rather-than-sanitize.md",
"rootTreeNode": "reference:reject-rather-than-sanitize",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "696b94f22600f60d233ea6a801b44517c17c26a2660568215d84b100503ccd7b",
"lines": 53
},
"tenant-id-is-never-a-metric-tag": {
"kind": "DECISION",
"slug": "tenant-id-is-never-a-metric-tag",
"title": "tenant id는 메트릭 태그가 되지 않는다",
"topic": "bounding-by-type",
"path": "decision/decision-tenant-id-is-never-a-metric-tag.md",
"rootTreeNode": "decision:tenant-id-is-never-a-metric-tag",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "df2569fdd4fdf6f79fc0abcd130c3a6dd0671cb6d3aa1a687fad1c76717fce00",
"lines": 63
},
"cursors-are-signed-for-integrity": {
"kind": "DECISION",
"slug": "cursors-are-signed-for-integrity",
"title": "커서에 서명하는 이유는 기밀성이 아니라 무결성이다",
"topic": "bounding-by-type",
"path": "decision/decision-cursors-are-signed-for-integrity.md",
"rootTreeNode": "decision:cursors-are-signed-for-integrity",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "ce3903150406e36a4a5f3e815d0b37087f5271f246ae529f6d4bbe3483b55281",
"lines": 60
},
"a-weaker-private-copy-on-the-wired-path": {
"kind": "CASE",
"slug": "a-weaker-private-copy-on-the-wired-path",
"title": "강한 가드가 웹푸시를 지목하는데 값 타입은 약한 검사를 다시 썼다",
"topic": "duplicate-mechanisms",
"path": "case/case-a-weaker-private-copy-on-the-wired-path.md",
"rootTreeNode": "case:a-weaker-private-copy-on-the-wired-path",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "c89e248d274480685c06aeaee807e7efcda950cfa1da133f0d99a7fb1a9a34ac",
"lines": 65,
"body": "case/case-a-weaker-private-copy-on-the-wired-path.body.md",
"bodySha256": "d68229486f1aeb9fb9daeee805c49c50796f4001c86b6db4f0b01ae65010210b",
"assets": [
{
"key": "a-weaker-private-copy-on-the-wired-path",
"kind": "terminal"
},
{
"key": "a-weaker-private-copy-on-the-wired-path-probe",
"kind": "terminal"
}
]
},
"a-policy-reversed-by-a-later-filter": {
"kind": "CASE",
"slug": "a-policy-reversed-by-a-later-filter",
"title": "요청 식별자를 클라이언트가 고를 수 없다는 정책이 뒤에 도는 필터에 뒤집혔다",
"topic": "duplicate-mechanisms",
"path": "case/case-a-policy-reversed-by-a-later-filter.md",
"rootTreeNode": "case:a-policy-reversed-by-a-later-filter",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "bfbbfe584aeb07d326c6b6fb3407b771bf50767ff475b869e24e801c292e4998",
"lines": 62,
"body": "case/case-a-policy-reversed-by-a-later-filter.body.md",
"bodySha256": "1876f7b7692663d9d265f2f098700f12d999460191e6085d2b360ff846079fe6",
"assets": [
{
"key": "a-policy-reversed-by-a-later-filter",
"kind": "terminal"
}
]
},
"jpa-platform-capabilities-have-no-consumer": {
"kind": "CASE",
"slug": "jpa-platform-capabilities-have-no-consumer",
"title": "JPA 플랫폼 capability 대부분에 production 소비자가 없다",
"topic": "duplicate-mechanisms",
"path": "case/case-jpa-platform-capabilities-have-no-consumer.md",
"rootTreeNode": "case:jpa-platform-capabilities-have-no-consumer",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "8ebef79cd996931b3416fe360df2dca2acb90ea297badbea919a2f22461db1c6",
"lines": 68,
"body": "case/case-jpa-platform-capabilities-have-no-consumer.body.md",
"bodySha256": "26c529f2f68bc00af990ab6b8012ae66b46e5d955d6a4efa3e421ec117e7e798",
"assets": [
{
"key": "jpa-platform-capabilities-have-no-consumer",
"kind": "terminal"
}
]
},
"trust-policy-lives-in-nginx-not-in-the-code": {
"kind": "CASE",
"slug": "trust-policy-lives-in-nginx-not-in-the-code",
"title": "forwarded 헤더 신뢰 판정이 Nginx에만 있고 Java 정책 421 LOC은 배선되지 않았다",
"topic": "duplicate-mechanisms",
"path": "case/case-trust-policy-lives-in-nginx-not-in-the-code.md",
"rootTreeNode": "case:trust-policy-lives-in-nginx-not-in-the-code",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "74229eacb2e71c6e55c57b4305396cf572d9d69dbb053994510c7dd2d895f71a",
"lines": 83,
"body": "case/case-trust-policy-lives-in-nginx-not-in-the-code.body.md",
"bodySha256": "ad657e6d49a0632f6ad43a841a00092ddb9ee28f3180e08d03621d47a0896396",
"assets": [
{
"key": "trust-policy-lives-in-nginx-not-in-the-code",
"kind": "terminal"
}
]
},
"a-retry-implementation-nobody-calls": {
"kind": "CASE",
"slug": "a-retry-implementation-nobody-calls",
"title": "정식 경계라고 적은 클래스가 그것을 구현하지 않는다",
"topic": "duplicate-mechanisms",
"path": "case/case-a-retry-implementation-nobody-calls.md",
"rootTreeNode": "case:a-retry-implementation-nobody-calls",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "79b8a313cf6ad2c59a2bf36f629f0a038afd091097083e6a49b2b455ab451ae9",
"lines": 81,
"body": "case/case-a-retry-implementation-nobody-calls.body.md",
"bodySha256": "1e9e3ca8a22442c18e3ac729e1a9e484f02fdcbaa44d71f640312cc5ff37b52a",
"assets": [
{
"key": "a-retry-implementation-nobody-calls",
"kind": "terminal"
}
]
},
"check-which-duplicate-is-wired": {
"kind": "REFERENCE",
"slug": "check-which-duplicate-is-wired",
"title": "중복 장치를 찾으면 어느 쪽이 조립됐는지 먼저 확인한다",
"topic": "duplicate-mechanisms",
"path": "reference/reference-check-which-duplicate-is-wired.md",
"rootTreeNode": "reference:check-which-duplicate-is-wired",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "279dd25bc0d90491235335f546fdacfb9fa3937c0fa74c34c403f462effb8072",
"lines": 64
},
"atomic-type-is-not-atomicity": {
"kind": "REFERENCE",
"slug": "atomic-type-is-not-atomicity",
"title": "Atomic* 타입의 존재는 원자성의 증거가 아니다",
"topic": "duplicate-mechanisms",
"path": "reference/reference-atomic-type-is-not-atomicity.md",
"rootTreeNode": "reference:atomic-type-is-not-atomicity",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b2cf35d7b23bf889488392f587ed29dcb72cdfe34e64b0bb277912ae2c8f5e36",
"lines": 54
},
"two-vocabularies-for-one-concept": {
"kind": "REFERENCE",
"slug": "two-vocabularies-for-one-concept",
"title": "같은 개념의 두 어휘가 공존하면 하나를 죽은 것으로 표시한다",
"topic": "duplicate-mechanisms",
"path": "reference/reference-two-vocabularies-for-one-concept.md",
"rootTreeNode": "reference:two-vocabularies-for-one-concept",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "095730a9845fce7dbc5d5b48865860570751aa76971ebb9d0936e224129becef",
"lines": 53
},
"one-audit-mechanism-per-entity": {
"kind": "DECISION",
"slug": "one-audit-mechanism-per-entity",
"title": "감사 메커니즘은 엔티티당 정확히 하나여야 한다",
"topic": "duplicate-mechanisms",
"path": "decision/decision-one-audit-mechanism-per-entity.md",
"rootTreeNode": "decision:one-audit-mechanism-per-entity",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "421e131080c8c56e64383ce7c998bda7b7628e6d3910c8ec60feb87f786b2710",
"lines": 54
},
"the-same-repository-bound-a-decision-once-and-not-the-other-time": {
"kind": "CASE",
"slug": "the-same-repository-bound-a-decision-once-and-not-the-other-time",
"title": "같은 저장소가 \"결정을 그 결정이 판정한 대상에 묶는 것\"을 한 번은 맞게, 한 번은 틀리게 썼다",
"topic": "duplicate-mechanisms",
"path": "case/case-the-same-repository-bound-a-decision-once-and-not-the-other-time.md",
"rootTreeNode": "case:the-same-repository-bound-a-decision-once-and-not-the-other-time",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "3366fcf4e9e0cdae7310a39f02ddebaa6e7007a3a498b6f91ecad93f668d82c1",
"lines": 65,
"body": "case/case-the-same-repository-bound-a-decision-once-and-not-the-other-time.body.md",
"bodySha256": "ecbf1e0fd129a0c30f3e65f3f9ebbb9cc566e71fa698372d370266c867a351e0",
"assets": [
{
"key": "the-same-repository-bound-a-decision-once-and-not-the-other-time",
"kind": "terminal"
}
]
},
"support-matrix-said-the-opposite-of-the-code": {
"kind": "CASE",
"slug": "support-matrix-said-the-opposite-of-the-code",
"title": "지원 매트릭스가 코드와 반대를 적었고, 그 오해가 소비자에게 자기 멱등성을 생략하게 한다",
"topic": "drift-direction",
"path": "case/case-support-matrix-said-the-opposite-of-the-code.md",
"rootTreeNode": "case:support-matrix-said-the-opposite-of-the-code",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d5f6a84617633c97f6d45e887ef0904a8b62246c44a3da9d35b3f86c0d5a813d",
"lines": 68,
"body": "case/case-support-matrix-said-the-opposite-of-the-code.body.md",
"bodySha256": "d4a1f407b7c1956cf789da75aa08bcb39aa25694f3761c6929c3a3497653bc1c",
"assets": [
{
"key": "support-matrix-said-the-opposite-of-the-code",
"kind": "terminal"
}
]
},
"the-readme-recipe-does-not-start": {
"kind": "CASE",
"slug": "the-readme-recipe-does-not-start",
"title": "README의 활성화 recipe를 그대로 따르면 애플리케이션이 시작되지 않는다",
"topic": "drift-direction",
"path": "case/case-the-readme-recipe-does-not-start.md",
"rootTreeNode": "case:the-readme-recipe-does-not-start",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0eb5334703501686c715f14db1cb73bdcf5a2f9b07dd683a2d8a8260cea694ec",
"lines": 59,
"body": "case/case-the-readme-recipe-does-not-start.body.md",
"bodySha256": "765aee61281c7f59e5527ccdc7dbd02157556e3b7c3ce921e3c3437562dc4dd0",
"assets": [
{
"key": "the-readme-recipe-does-not-start",
"kind": "terminal"
}
]
},
"mongo-default-throws-on-first-write": {
"kind": "CASE",
"slug": "mongo-default-throws-on-first-write",
"title": "출하 default 조합이 첫 write에서 예외를 던진다",
"topic": "drift-direction",
"path": "case/case-mongo-default-throws-on-first-write.md",
"rootTreeNode": "case:mongo-default-throws-on-first-write",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "ddb5c4a8a777a29c4fe31047cc094d0f368c5826a9b4e769d51bc8514b0cdb24",
"lines": 77,
"body": "case/case-mongo-default-throws-on-first-write.body.md",
"bodySha256": "465bf849d040c9286573d48748436b2ce8fe8baaf494f74ae7bb32b11a1f284b",
"assets": [
{
"key": "mongo-default-throws-on-first-write",
"kind": "terminal"
}
]
},
"documented-uuidv7-generates-v4": {
"kind": "CASE",
"slug": "documented-uuidv7-generates-v4",
"title": "문서가 UUIDv7이라 말하고 생성되는 것은 v4다",
"topic": "drift-direction",
"path": "case/case-documented-uuidv7-generates-v4.md",
"rootTreeNode": "case:documented-uuidv7-generates-v4",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0ce5b5fd7afd35e02820437df0fcf22914cfebb681862dea9eb40d6071f00f01",
"lines": 62,
"body": "case/case-documented-uuidv7-generates-v4.body.md",
"bodySha256": "eb570b99d06343528e767618e2e758e0fa7495e9ce3b7d2beea1f8208be2090b",
"assets": [
{
"key": "documented-uuidv7-generates-v4",
"kind": "terminal"
}
]
},
"an-unselectable-broker-listed-with-features": {
"kind": "CASE",
"slug": "an-unselectable-broker-listed-with-features",
"title": "선택하면 기동이 멈추는 브로커가 지원 매트릭스에 기능 목록과 함께 실려 있다",
"topic": "drift-direction",
"path": "case/case-an-unselectable-broker-listed-with-features.md",
"rootTreeNode": "case:an-unselectable-broker-listed-with-features",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "39dd955390174c931547eba820e0791a822119a990b0c46945201a5642a2251d",
"lines": 89,
"body": "case/case-an-unselectable-broker-listed-with-features.body.md",
"bodySha256": "836c03f1e822d4cfab9f950926ebe6ae7b0c48113897d3077e477f82552ca77b",
"assets": [
{
"key": "an-unselectable-broker-listed-with-features",
"kind": "terminal"
}
]
},
"five-documents-say-nineteen-leaves": {
"kind": "CASE",
"slug": "five-documents-say-nineteen-leaves",
"title": "다섯 문서가 \"exactly 19 leaf\"라고 적고 레지스트리는 62다",
"topic": "drift-direction",
"path": "case/case-five-documents-say-nineteen-leaves.md",
"rootTreeNode": "case:five-documents-say-nineteen-leaves",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0c146b534dc3f81a69f76d69bf452074eb927eaac9108c34dd5b1797f6e8c047",
"lines": 57,
"body": "case/case-five-documents-say-nineteen-leaves.body.md",
"bodySha256": "93b398b97b74544cdd18d612e8fddfeb62d11f475356892f2042b6b91d9fa982",
"assets": [
{
"key": "five-documents-say-nineteen-leaves",
"kind": "terminal"
}
]
},
"fix-overstatement-before-understatement": {
"kind": "REFERENCE",
"slug": "fix-overstatement-before-understatement",
"title": "과대 진술 문서를 과소보다 먼저 고친다",
"topic": "drift-direction",
"path": "reference/reference-fix-overstatement-before-understatement.md",
"rootTreeNode": "reference:fix-overstatement-before-understatement",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "92d69718d42d94b184227612c98bbf1b71b7409c21c97013ed01c591892fc67f",
"lines": 58
},
"numbers-in-docs-should-be-derived": {
"kind": "REFERENCE",
"slug": "numbers-in-docs-should-be-derived",
"title": "문서의 수치는 세지 말고 파생하거나 게이트로 붙든다",
"topic": "drift-direction",
"path": "reference/reference-numbers-in-docs-should-be-derived.md",
"rootTreeNode": "reference:numbers-in-docs-should-be-derived",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "1f7ff0da4b524640c019843f865c19d654d3b79b1831f68ecb62e902415a45ce",
"lines": 55
},
"widen-doc-contract-assertions": {
"kind": "QUESTION",
"slug": "widen-doc-contract-assertions",
"title": "문서 계약 테스트의 단언 범위를 capability 표까지 넓힐 것인가",
"topic": "drift-direction",
"path": "openquestion/openquestion-widen-doc-contract-assertions.md",
"rootTreeNode": "open-question:widen-doc-contract-assertions",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "38290b90ce6012192c3d85364d1be4b012f752dd62f8a9f72dfbdccf8801ce11",
"lines": 48
},
"capability-grade-is-declared-not-inferred": {
"kind": "DECISION",
"slug": "capability-grade-is-declared-not-inferred",
"title": "지원 등급은 추론이 아니라 선언이고 증거 없이는 올라가지 않는다",
"topic": "drift-direction",
"path": "decision/decision-capability-grade-is-declared-not-inferred.md",
"rootTreeNode": "decision:capability-grade-is-declared-not-inferred",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "aa2092a14ab005038396b6fc1128bc4db6aba77870d591c8f06118d43bcb1d80",
"lines": 65
},
"the-second-platform-carried-the-design-not-the-wiring": {
"kind": "CASE",
"slug": "the-second-platform-carried-the-design-not-the-wiring",
"title": "두 번째 플랫폼이 첫 번째의 bridge 부재는 막고 게이트 배선은 옮기지 않았다",
"topic": "learning-transfer-between-families",
"path": "case/case-the-second-platform-carried-the-design-not-the-wiring.md",
"rootTreeNode": "case:the-second-platform-carried-the-design-not-the-wiring",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "1ef1fc8cb1f8effefc042234e71486ea8fb5bd5c3cd019827212df007e971e4b",
"lines": 75,
"body": "case/case-the-second-platform-carried-the-design-not-the-wiring.body.md",
"bodySha256": "b54d3ea3f18a2219de6efa52bab5a8a89bd7512c96fe2b4dcd759bf4be35581d",
"assets": [
{
"key": "the-second-platform-carried-the-design-not-the-wiring",
"kind": "terminal"
}
]
},
"the-same-rotation-defect-closed-once-and-reproduced": {
"kind": "CASE",
"slug": "the-same-rotation-defect-closed-once-and-reproduced",
"title": "같은 자격 증명 회전 결함이 한 가족에서 닫히고 다른 가족에서 재현됐다",
"topic": "learning-transfer-between-families",
"path": "case/case-the-same-rotation-defect-closed-once-and-reproduced.md",
"rootTreeNode": "case:the-same-rotation-defect-closed-once-and-reproduced",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "2ea365347a91bdff5be2f2bddb87faa25f35fea708a5a023b724a6d1b316f024",
"lines": 75,
"body": "case/case-the-same-rotation-defect-closed-once-and-reproduced.body.md",
"bodySha256": "4e8f59370759c1c3623105f52824c473f5565d707c33f988fee58cb74c75e7c3",
"assets": [
{
"key": "the-same-rotation-defect-closed-once-and-reproduced",
"kind": "terminal"
}
]
},
"registry-rules-transfer-ci-rules-do-not": {
"kind": "REFERENCE",
"slug": "registry-rules-transfer-ci-rules-do-not",
"title": "레지스트리로 표현된 규칙은 전이되고 CI로 표현된 규칙은 전이되지 않는다",
"topic": "learning-transfer-between-families",
"path": "reference/reference-registry-rules-transfer-ci-rules-do-not.md",
"rootTreeNode": "reference:registry-rules-transfer-ci-rules-do-not",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "98f76b08571035af0130f0d0d2bc064a39609536e191fc585e8aace6b42a148e",
"lines": 58
},
"grpc-stays-build-only-until-the-bridge-is-decided": {
"kind": "DECISION",
"slug": "grpc-stays-build-only-until-the-bridge-is-decided",
"title": "gRPC 플랫폼은 build-only로 두고 애플리케이션 도달 경로를 먼저 정한다",
"topic": "learning-transfer-between-families",
"path": "decision/decision-grpc-stays-build-only-until-the-bridge-is-decided.md",
"rootTreeNode": "decision:grpc-stays-build-only-until-the-bridge-is-decided",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "fb2d62e25658a5c4fd1829a1465168a41ce6c61000281c380a44e74281db2f3e",
"lines": 65
},
"fenced-lease": {
"kind": "CONCEPT",
"slug": "fenced-lease",
"title": "fenced lease — 만료 시각만으로는 부족한 이유",
"topic": "owner-safe-state-machines",
"path": "concept/concept-fenced-lease.md",
"rootTreeNode": "concept:fenced-lease",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "ed06c9e3da34ccbe71f9cc20243348b54706e72af5a3754cc0e7199739698498",
"lines": 99,
"body": "concept/concept-fenced-lease.body.md",
"bodySha256": "cb7a91e6baec4a082c1e10696595bc28ae153bdaebc53ef19d3f57db684affa5",
"assets": [
{
"key": "fenced-lease",
"kind": "terminal"
}
]
},
"cas-tuple-and-update-count": {
"kind": "CONCEPT",
"slug": "cas-tuple-and-update-count",
"title": "CAS 튜플과 update count가 답이 되는 구조",
"topic": "owner-safe-state-machines",
"path": "concept/concept-cas-tuple-and-update-count.md",
"rootTreeNode": "concept:cas-tuple-and-update-count",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d1861e7ccf4f237adc419a14d14f18a8f144f00cc4396c14db7eb693bfab25ce",
"lines": 96,
"body": "concept/concept-cas-tuple-and-update-count.body.md",
"bodySha256": "e353d54125a52675d25e9898af61e52ce23169980951cc78501424c72a696119",
"assets": [
{
"key": "cas-tuple-and-update-count-diagram",
"kind": "diagram"
},
{
"key": "cas-tuple-and-update-count",
"kind": "terminal"
}
]
},
"capability-schema-registry": {
"kind": "CONCEPT",
"slug": "capability-schema-registry",
"title": "capability_schema_registry — 스키마 적용과 사용 승인의 분리",
"topic": "owner-safe-state-machines",
"path": "concept/concept-capability-schema-registry.md",
"rootTreeNode": "concept:capability-schema-registry",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "995eca82ebd1676dc48e27bdd921d9644ce21c326ce4d1378da299e897b7e624",
"lines": 92,
"body": "concept/concept-capability-schema-registry.body.md",
"bodySha256": "503f5471c2545761bff6aa867026bdc6d59afbe0c1caba962f9d8bc9e8a497c2",
"assets": [
{
"key": "capability-schema-registry-diagram",
"kind": "diagram"
},
{
"key": "capability-schema-registry",
"kind": "terminal"
}
]
},
"a-lease-without-an-owner": {
"kind": "CASE",
"slug": "a-lease-without-an-owner",
"title": "리스가 만료 시각만 기록하고 소유자를 기록하지 않아 최종 상태를 되돌릴 수 있었다",
"topic": "owner-safe-state-machines",
"path": "case/case-a-lease-without-an-owner.md",
"rootTreeNode": "case:a-lease-without-an-owner",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "2ceec8e407b24467dce38fb7359497d9cb3020aa2eff7550fcff70df29a0b71f",
"lines": 58,
"body": "case/case-a-lease-without-an-owner.body.md",
"bodySha256": "f9f3c9e1587e2d514e0745f7b0be3adf2ccbac6ded485d334cb96055c2ca05ab",
"assets": [
{
"key": "a-lease-without-an-owner",
"kind": "terminal"
}
]
},
"a-digest-that-covered-who-but-not-what": {
"kind": "CASE",
"slug": "a-digest-that-covered-who-but-not-what",
"title": "transition digest가 \"누가·언제\"만 덮고 \"무엇\"을 덮지 않아 다른 전이를 같다고 보고했다",
"topic": "owner-safe-state-machines",
"path": "case/case-a-digest-that-covered-who-but-not-what.md",
"rootTreeNode": "case:a-digest-that-covered-who-but-not-what",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d3707478a66bb7c499bf9ceeb95e294289d964cbe911f97e3c9d74ffc0804de6",
"lines": 59,
"body": "case/case-a-digest-that-covered-who-but-not-what.body.md",
"bodySha256": "fabd1e960c9bffdb666d96a162f5906e6e9330108f81244924bbeac11f8b0711",
"assets": [
{
"key": "a-digest-that-covered-who-but-not-what",
"kind": "terminal"
}
]
},
"an-active-transaction-check-that-asked-the-wrong-question": {
"kind": "CASE",
"slug": "an-active-transaction-check-that-asked-the-wrong-question",
"title": "활성 트랜잭션 검사가 data source를 묻지 않아 남의 트랜잭션이 통과했다",
"topic": "owner-safe-state-machines",
"path": "case/case-an-active-transaction-check-that-asked-the-wrong-question.md",
"rootTreeNode": "case:an-active-transaction-check-that-asked-the-wrong-question",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "9dc32238042e5e9f5d6343f6201753166d1da020f4a7da5fc809da6a7639606d",
"lines": 77,
"body": "case/case-an-active-transaction-check-that-asked-the-wrong-question.body.md",
"bodySha256": "c9a5cf3351690212008eb5517beaaf3ad5b04fc0af0ebabd1799ce93594574e4",
"assets": [
{
"key": "an-active-transaction-check-that-asked-the-wrong-question",
"kind": "terminal"
}
]
},
"expired-claim-versus-expired-execution": {
"kind": "CASE",
"slug": "expired-claim-versus-expired-execution",
"title": "만료된 CLAIMED는 takeover하고 만료된 EXECUTING은 조정을 요구하도록 갈랐다",
"topic": "owner-safe-state-machines",
"path": "case/case-expired-claim-versus-expired-execution.md",
"rootTreeNode": "case:expired-claim-versus-expired-execution",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e2f5153eb8526101aac732b6a629892508508f0706f1d6bcb9ff69a1ead9b0ea",
"lines": 70,
"body": "case/case-expired-claim-versus-expired-execution.body.md",
"bodySha256": "5f8c0d7feaaabff5a60223311ee19ed9699f1d3f94237fe204b3f43a9857e4e5",
"assets": [
{
"key": "expired-claim-versus-expired-execution",
"kind": "terminal"
}
]
},
"native-claim-did-not-bump-the-version": {
"kind": "CASE",
"slug": "native-claim-did-not-bump-the-version",
"title": "native claim이 @Version을 올리지 않아 충돌을 보고하지 않는 낙관적 잠금이 됐다",
"topic": "owner-safe-state-machines",
"path": "case/case-native-claim-did-not-bump-the-version.md",
"rootTreeNode": "case:native-claim-did-not-bump-the-version",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "bf61eebdf97f249daec91917d01fa6a245abf3cfa501115b0c1f3358b1e24b90",
"lines": 59,
"body": "case/case-native-claim-did-not-bump-the-version.body.md",
"bodySha256": "fe968e19d4b5550470d53a4268446560158c44e5a5a6daae9755bd510c5b44b6",
"assets": [
{
"key": "native-claim-did-not-bump-the-version",
"kind": "terminal"
}
]
},
"cas-tuple-in-the-where-clause": {
"kind": "REFERENCE",
"slug": "cas-tuple-in-the-where-clause",
"title": "CAS 튜플을 where 절에 전부 반복하고 update count를 답으로 쓴다",
"topic": "owner-safe-state-machines",
"path": "reference/reference-cas-tuple-in-the-where-clause.md",
"rootTreeNode": "reference:cas-tuple-in-the-where-clause",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d81f623e7d5c02ae2a0b0719078f441f2916477db01a69dd7b954cb7db65ef41",
"lines": 60
},
"read-the-clock-after-the-lock": {
"kind": "REFERENCE",
"slug": "read-the-clock-after-the-lock",
"title": "시간은 DB에서, 그리고 행을 잠근 다음에 읽는다",
"topic": "owner-safe-state-machines",
"path": "reference/reference-read-the-clock-after-the-lock.md",
"rootTreeNode": "reference:read-the-clock-after-the-lock",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "431e32db1bb142493f476077ad1d72065479cd08dc1b065dc0d8d164b438dd2a",
"lines": 53
},
"expired-claim-and-expired-execution-differ": {
"kind": "REFERENCE",
"slug": "expired-claim-and-expired-execution-differ",
"title": "만료된 claim과 만료된 실행은 다르게 다뤄야 한다",
"topic": "owner-safe-state-machines",
"path": "reference/reference-expired-claim-and-expired-execution-differ.md",
"rootTreeNode": "reference:expired-claim-and-expired-execution-differ",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "635ca6d03ce29140e9c480d55d0c1581d072374aff844b0afdb81b4cc7d3c144",
"lines": 56
},
"digest-must-be-length-framed-and-versioned": {
"kind": "REFERENCE",
"slug": "digest-must-be-length-framed-and-versioned",
"title": "digest는 길이 프레이밍하고 버전을 붙인다",
"topic": "owner-safe-state-machines",
"path": "reference/reference-digest-must-be-length-framed-and-versioned.md",
"rootTreeNode": "reference:digest-must-be-length-framed-and-versioned",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e7469a44e2fc4487f28782a36e10d0f56c5037c6aef4fb52ac94d64193ad2675",
"lines": 56
},
"v2-state-machine-lanes-not-executed": {
"kind": "QUESTION",
"slug": "v2-state-machine-lanes-not-executed",
"title": "V2 상태 기계 넷의 컨테이너 레인이 실행되지 않았다",
"topic": "owner-safe-state-machines",
"path": "openquestion/openquestion-v2-state-machine-lanes-not-executed.md",
"rootTreeNode": "open-question:v2-state-machine-lanes-not-executed",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "1118aba5cb5fcee19b3da3ab5acccc69f7421c9185b511b28a7ec5052fdbcb97",
"lines": 78
},
"capability-separates-installation-from-activation": {
"kind": "DECISION",
"slug": "capability-separates-installation-from-activation",
"title": "capability는 스키마 적용과 사용 승인을 분리한다",
"topic": "owner-safe-state-machines",
"path": "decision/decision-capability-separates-installation-from-activation.md",
"rootTreeNode": "decision:capability-separates-installation-from-activation",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "ee3d2cc9da6b590298293fb426142a7bb5e7c98e20b5738f3b15614ab8b8c9e6",
"lines": 58
},
"state-machines-carry-no-stereotype": {
"kind": "DECISION",
"slug": "state-machines-carry-no-stereotype",
"title": "상태 기계 구현은 Spring stereotype을 갖지 않는다",
"topic": "owner-safe-state-machines",
"path": "decision/decision-state-machines-carry-no-stereotype.md",
"rootTreeNode": "decision:state-machines-carry-no-stereotype",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "ce6ece6d7688a99a960a22447b762fabc46c3da437827bea6fb6a2ffac4fb3dc",
"lines": 56
},
"deadline-propagation": {
"kind": "CONCEPT",
"slug": "deadline-propagation",
"title": "호출 예산에서 DB 로컬 타임아웃까지의 데드라인 전파",
"topic": "transaction-deadline-and-pool",
"path": "concept/concept-deadline-propagation.md",
"rootTreeNode": "concept:deadline-propagation",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "8f64f6f4c00151260a0dcd6ffd41b10a1001a2ebf19424153d3763f0bf839fb3",
"lines": 77,
"body": "concept/concept-deadline-propagation.body.md",
"bodySha256": "a20b616ac8976f067a302529d782e4c09a930cb086d218b35d72db9c8b32ea55",
"assets": [
{
"key": "deadline-propagation-diagram",
"kind": "diagram"
},
{
"key": "deadline-propagation",
"kind": "terminal"
}
]
},
"requires-new-connection-cost": {
"kind": "CONCEPT",
"slug": "requires-new-connection-cost",
"title": "REQUIRES_NEW의 커넥션 비용과 풀 사이징 제약",
"topic": "transaction-deadline-and-pool",
"path": "concept/concept-requires-new-connection-cost.md",
"rootTreeNode": "concept:requires-new-connection-cost",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "9014cd974ba254fd492f0ee1f81308c25ad10694f5f4021b627ce85c48d7a9f1",
"lines": 83,
"body": "concept/concept-requires-new-connection-cost.body.md",
"bodySha256": "0714b47c35c658c4104848978bff309debec989cf82845eb56a5d9a5b0fc2779",
"assets": [
{
"key": "requires-new-connection-cost",
"kind": "terminal"
}
]
},
"a-five-second-string-that-broke-every-prod-deploy": {
"kind": "CASE",
"slug": "a-five-second-string-that-broke-every-prod-deploy",
"title": "'connection-timeout: 5s가 모든 prod 배포를 시작 실패시켰고 local만 통과했다'",
"topic": "transaction-deadline-and-pool",
"path": "case/case-a-five-second-string-that-broke-every-prod-deploy.md",
"rootTreeNode": "case:a-five-second-string-that-broke-every-prod-deploy",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "67d18e4cd200a359870b589af66321727fcde5bd50974ca1ce388c0ae6c726f7",
"lines": 57,
"body": "case/case-a-five-second-string-that-broke-every-prod-deploy.body.md",
"bodySha256": "df175bc57a817a73c0317385fe46db044a88112c7394d1d3f7488c7ddb0d8697",
"assets": [
{
"key": "a-five-second-string-that-broke-every-prod-deploy-bind",
"kind": "terminal"
},
{
"key": "a-five-second-string-that-broke-every-prod-deploy",
"kind": "terminal"
}
]
},
"a-validator-checking-the-wrong-datasource": {
"kind": "CASE",
"slug": "a-validator-checking-the-wrong-datasource",
"title": "validator가 요청을 서비스하지 않는 datasource를 검증하고 있었다",
"topic": "transaction-deadline-and-pool",
"path": "case/case-a-validator-checking-the-wrong-datasource.md",
"rootTreeNode": "case:a-validator-checking-the-wrong-datasource",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "385b5c9d74fd419328b1c2244edc25b29196663b8ee36da1b8fcf0ab2b2f58f6",
"lines": 80,
"body": "case/case-a-validator-checking-the-wrong-datasource.body.md",
"bodySha256": "71f07462b8a2fe41648bdd7d3b636d22e68fb039efe95f0328c37128c2adb0d0",
"assets": [
{
"key": "a-validator-checking-the-wrong-datasource",
"kind": "terminal"
},
{
"key": "a-validator-checking-the-wrong-datasource-run",
"kind": "terminal"
}
]
},
"requires-new-pins-the-outer-connection": {
"kind": "CASE",
"slug": "requires-new-pins-the-outer-connection",
"title": "REQUIRES_NEW가 바깥 커넥션을 핀한 채 새 커넥션을 딴다",
"topic": "transaction-deadline-and-pool",
"path": "case/case-requires-new-pins-the-outer-connection.md",
"rootTreeNode": "case:requires-new-pins-the-outer-connection",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0df117d9102ef98057106ac52d2f61a85dfae2f10e7a31a620b7f03d4091eab0",
"lines": 64,
"body": "case/case-requires-new-pins-the-outer-connection.body.md",
"bodySha256": "2daa83d5dd846cd137e3aebe65c47cd4a81263acfaf171f80e7a181088fe69bb",
"assets": [
{
"key": "requires-new-pins-the-outer-connection",
"kind": "terminal"
}
]
},
"deadline-narrows-in-three-stages": {
"kind": "REFERENCE",
"slug": "deadline-narrows-in-three-stages",
"title": "데드라인은 호출 예산에서 시작해 세 단계로 좁힌다",
"topic": "transaction-deadline-and-pool",
"path": "reference/reference-deadline-narrows-in-three-stages.md",
"rootTreeNode": "reference:deadline-narrows-in-three-stages",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b443281b0c90fc4f9a493d2a90cb7ccf25bf442a21b5a5e70250de8e422d9f91",
"lines": 58
},
"write-transactions-need-a-finite-timeout": {
"kind": "REFERENCE",
"slug": "write-transactions-need-a-finite-timeout",
"title": "쓰기 트랜잭션에는 유한 타임아웃이 필수다",
"topic": "transaction-deadline-and-pool",
"path": "reference/reference-write-transactions-need-a-finite-timeout.md",
"rootTreeNode": "reference:write-transactions-need-a-finite-timeout",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "4e692c17584003f42abc4dcc57a8635c6df32294f0eabca481dbde522ac1e1f9",
"lines": 53
},
"session-scoped-settings-outlive-the-transaction": {
"kind": "REFERENCE",
"slug": "session-scoped-settings-outlive-the-transaction",
"title": "세션 스코프 설정은 풀로 돌아간 커넥션에 남는다",
"topic": "transaction-deadline-and-pool",
"path": "reference/reference-session-scoped-settings-outlive-the-transaction.md",
"rootTreeNode": "reference:session-scoped-settings-outlive-the-transaction",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "99993002865fc4f4ddf69e7d48427d8de702e82b8a7648c2378124ddccd5e97c",
"lines": 56
},
"pool-contract-lane-not-executed": {
"kind": "QUESTION",
"slug": "pool-contract-lane-not-executed",
"title": "풀 계약 레인이 실행되지 않아 포화 동작이 확인되지 않았다",
"topic": "transaction-deadline-and-pool",
"path": "openquestion/openquestion-pool-contract-lane-not-executed.md",
"rootTreeNode": "open-question:pool-contract-lane-not-executed",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "eedbf10a77d1b57f8e7a9f21838cdaa38afdaa7052414f26af3933c0087334f5",
"lines": 78
},
"templates-are-built-once-per-mode": {
"kind": "DECISION",
"slug": "templates-are-built-once-per-mode",
"title": "트랜잭션 템플릿은 모드별로 미리 만들어 둔다",
"topic": "transaction-deadline-and-pool",
"path": "decision/decision-templates-are-built-once-per-mode.md",
"rootTreeNode": "decision:templates-are-built-once-per-mode",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "57d02f839cb6ec5474951a9f3acb0ded58aa934f152fb95cf08bb220613ca2fd",
"lines": 53
},
"in-root-write-fails-fast": {
"kind": "DECISION",
"slug": "in-root-write-fails-fast",
"title": "inRootWrite는 suspend하지 않고 fail-fast한다",
"topic": "transaction-deadline-and-pool",
"path": "decision/decision-in-root-write-fails-fast.md",
"rootTreeNode": "decision:in-root-write-fails-fast",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "7219cb905d67c5f8a7cd2f70a4b429e58ddc8abf0baeb268c2486d70544f6345",
"lines": 57
},
"independent-flyway-streams": {
"kind": "CONCEPT",
"slug": "independent-flyway-streams",
"title": "독립 Flyway 스트림과 baseline version 0",
"topic": "schema-ownership-and-capability-streams",
"path": "concept/concept-independent-flyway-streams.md",
"rootTreeNode": "concept:independent-flyway-streams",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a11cb398e7259e47c635069bf4f4d58f97ebcb700d57c85bf6fe0ef34996b741",
"lines": 104,
"body": "concept/concept-independent-flyway-streams.body.md",
"bodySha256": "5c348dda46267bc136972b027eab1a9c3790e93e899be77b1386cf272cc9b515",
"assets": [
{
"key": "independent-flyway-streams",
"kind": "terminal"
}
]
},
"two-trees-both-numbered-from-v1": {
"kind": "CASE",
"slug": "two-trees-both-numbered-from-v1",
"title": "두 트리가 다 V1부터 번호를 매겨 공유 history가 하나를 건너뛸 수 있었다",
"topic": "schema-ownership-and-capability-streams",
"path": "case/case-two-trees-both-numbered-from-v1.md",
"rootTreeNode": "case:two-trees-both-numbered-from-v1",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "ea7b2feb53bd65dea946f2039e77146795e6584214c671d48698b8b4d37b817e",
"lines": 62,
"body": "case/case-two-trees-both-numbered-from-v1.body.md",
"bodySha256": "ef3af9c11c1af142985c2b7789f588c2e0617a887d8866d43219f76d982ee332",
"assets": [
{
"key": "two-trees-both-numbered-from-v1",
"kind": "terminal"
}
]
},
"h2-hid-a-column-type-mismatch": {
"kind": "CASE",
"slug": "h2-hid-a-column-type-mismatch",
"title": "char(64)와 varchar(64) 불일치를 H2가 가리고 있었다",
"topic": "schema-ownership-and-capability-streams",
"path": "case/case-h2-hid-a-column-type-mismatch.md",
"rootTreeNode": "case:h2-hid-a-column-type-mismatch",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "91d3e26260ede2f72c1eeb239f63a47df69030f480edb3423b3faa719f261283",
"lines": 66,
"body": "case/case-h2-hid-a-column-type-mismatch.body.md",
"bodySha256": "0248cabbe032361ed940fefbc8de6ac305b55139f48680bbe945721a079773f4",
"assets": [
{
"key": "h2-hid-a-column-type-mismatch",
"kind": "terminal"
}
]
},
"registry-column-too-short-for-its-own-path": {
"kind": "CASE",
"slug": "registry-column-too-short-for-its-own-path",
"title": "레지스트리 컬럼이 38자 경로에서 짧아 \"더 짧은 경로를 적는\" 우회를 유혹했다",
"topic": "schema-ownership-and-capability-streams",
"path": "case/case-registry-column-too-short-for-its-own-path.md",
"rootTreeNode": "case:registry-column-too-short-for-its-own-path",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "4ff2bdb9bc45d59e85b5514c13a2e9e72b8c4fec96c43ed24816daea3c811ad1",
"lines": 58,
"body": "case/case-registry-column-too-short-for-its-own-path.body.md",
"bodySha256": "7c1d214a53216d6c27bc9c6579882b603cc3c3baa9284f93f58351e9f564ebcd",
"assets": [
{
"key": "registry-column-too-short-for-its-own-path",
"kind": "terminal"
}
]
},
"a-customizer-that-discarded-the-bound-property": {
"kind": "CASE",
"slug": "a-customizer-that-discarded-the-bound-property",
"title": "Flyway location customizer가 운영자가 바인딩한 값을 덮어썼다",
"topic": "schema-ownership-and-capability-streams",
"path": "case/case-a-customizer-that-discarded-the-bound-property.md",
"rootTreeNode": "case:a-customizer-that-discarded-the-bound-property",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "fcd871c0f248d7fa236903260c8811163dc658e0cf4167f47c52eccc48bdd4c8",
"lines": 55,
"body": "case/case-a-customizer-that-discarded-the-bound-property.body.md",
"bodySha256": "3e69f9d20c484d7b25de9eca6072baf8554a366089c734863ae41e70ab1191b4",
"assets": [
{
"key": "a-customizer-that-discarded-the-bound-property",
"kind": "terminal"
}
]
},
"messaging-migrations-collide-at-v2": {
"kind": "CASE",
"slug": "messaging-migrations-collide-at-v2",
"title": "messaging 마이그레이션 두 leaf가 같은 디렉터리에서 V2를 둘 만들었다",
"topic": "schema-ownership-and-capability-streams",
"path": "case/case-messaging-migrations-collide-at-v2.md",
"rootTreeNode": "case:messaging-migrations-collide-at-v2",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d4005ee9ee8aeb13a304e51db246c058224af4c0c55b18fd3d56baeeb12b5ffb",
"lines": 64,
"body": "case/case-messaging-migrations-collide-at-v2.body.md",
"bodySha256": "6f811e113aed659a4bb18209c9f059af7d421c5e0784ab1fc4058eaac2891544",
"assets": [
{
"key": "messaging-migrations-collide-at-v2",
"kind": "terminal"
}
]
},
"each-stream-owns-its-history-table": {
"kind": "REFERENCE",
"slug": "each-stream-owns-its-history-table",
"title": "마이그레이션 스트림은 자기 history 테이블을 갖는다",
"topic": "schema-ownership-and-capability-streams",
"path": "reference/reference-each-stream-owns-its-history-table.md",
"rootTreeNode": "reference:each-stream-owns-its-history-table",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "7d5362158d5a2ae9e68432f8565ff1c80e73aa1acf93654bdfa07151f23a358b",
"lines": 60
},
"local-with-a-different-db-is-a-different-system": {
"kind": "REFERENCE",
"slug": "local-with-a-different-db-is-a-different-system",
"title": "로컬이 다른 DB면 로컬 테스트는 다른 시스템에 대한 진술이다",
"topic": "schema-ownership-and-capability-streams",
"path": "reference/reference-local-with-a-different-db-is-a-different-system.md",
"rootTreeNode": "reference:local-with-a-different-db-is-a-different-system",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "3604d4ab0b408ebbdb190c054c4fad440de65fdafdfe41038ab2e666c656e5bc",
"lines": 58
},
"an-applied-checksum-is-a-promise": {
"kind": "REFERENCE",
"slug": "an-applied-checksum-is-a-promise",
"title": "적용된 마이그레이션의 checksum은 그것을 돌린 모든 배포에 대한 약속이다",
"topic": "schema-ownership-and-capability-streams",
"path": "reference/reference-an-applied-checksum-is-a-promise.md",
"rootTreeNode": "reference:an-applied-checksum-is-a-promise",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "ba33aa92b74f5c50c6d48570130fb0cbf8311b9ff5fb94b1e401551acfd52360",
"lines": 58
},
"flyway-owns-the-schema": {
"kind": "DECISION",
"slug": "flyway-owns-the-schema",
"title": "Flyway가 스키마를 소유하고 런타임 롤은 DDL 권한을 갖지 않는다",
"topic": "schema-ownership-and-capability-streams",
"path": "decision/decision-flyway-owns-the-schema.md",
"rootTreeNode": "decision:flyway-owns-the-schema",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "87a6b123fdbb42a8206ae594ecbb75fa0c9a6304891b3810f1dbd9aedf1959db",
"lines": 58
},
"repair-is-not-a-mode": {
"kind": "DECISION",
"slug": "repair-is-not-a-mode",
"title": "Repair는 모드가 아니라 운영자가 호출하는 작업이다",
"topic": "schema-ownership-and-capability-streams",
"path": "decision/decision-repair-is-not-a-mode.md",
"rootTreeNode": "decision:repair-is-not-a-mode",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "39cb995af1561d513072cd593f3789f6b02587fb4390aabd53fc6e115f45c144",
"lines": 56
},
"redis-admission-stages": {
"kind": "CONCEPT",
"slug": "redis-admission-stages",
"title": "명령 카탈로그와 admission 아홉 단계",
"topic": "redis-command-admission",
"path": "concept/concept-redis-admission-stages.md",
"rootTreeNode": "concept:redis-admission-stages",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "7f65e495ca5b46d8a1c716dfa006657c6cde1fed30d49b760146b5575a9f42e4",
"lines": 95,
"body": "concept/concept-redis-admission-stages.body.md",
"bodySha256": "b7a4a3a7700cbb081775689421d7f87f72ac3ec023f4ef6634805f625bd96b89",
"assets": [
{
"key": "redis-admission-stages-diagram",
"kind": "diagram"
},
{
"key": "redis-admission-stages",
"kind": "terminal"
}
]
},
"a-build-gate-that-is-not-in-the-build": {
"kind": "CASE",
"slug": "a-build-gate-that-is-not-in-the-build",
"title": "'\"build gate\"라 불리는 catalog drift 검사가 어디에서도 실행되지 않는다'",
"topic": "redis-command-admission",
"path": "case/case-a-build-gate-that-is-not-in-the-build.md",
"rootTreeNode": "case:a-build-gate-that-is-not-in-the-build",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "7e39a730dc856eb4bf6e2eeb869b0afc82ba37ae1512a84e3a0195215b90047e",
"lines": 67,
"body": "case/case-a-build-gate-that-is-not-in-the-build.body.md",
"bodySha256": "aef82b7bf9da585418b857a484972abe2248215feb90f4935ab24f9ad84884b2",
"assets": [
{
"key": "a-build-gate-that-is-not-in-the-build",
"kind": "terminal"
}
]
},
"five-adapters-bypass-the-single-admission-point": {
"kind": "CASE",
"slug": "five-adapters-bypass-the-single-admission-point",
"title": "의미 어댑터 다섯이 gateway를 직접 불러 admission 아홉 단계를 건너뛴다",
"topic": "redis-command-admission",
"path": "case/case-five-adapters-bypass-the-single-admission-point.md",
"rootTreeNode": "case:five-adapters-bypass-the-single-admission-point",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "aba2670f7b8e2fab74fb698b81936bdd46117f015dd61db06a3ed2067df7cdd2",
"lines": 75,
"body": "case/case-five-adapters-bypass-the-single-admission-point.body.md",
"bodySha256": "5d384081ea8f32de1e620ac770f13c033ff22f3ae6cb3e55f224f9dc3401c0ee",
"assets": [
{
"key": "five-adapters-bypass-the-single-admission-point",
"kind": "terminal"
}
]
},
"five-copies-of-noscript-recovery": {
"kind": "CASE",
"slug": "five-copies-of-noscript-recovery",
"title": "NOSCRIPT 복구가 다섯 벌이고 넷은 스크립트 레지스트리를 지나지 않는다",
"topic": "redis-command-admission",
"path": "case/case-five-copies-of-noscript-recovery.md",
"rootTreeNode": "case:five-copies-of-noscript-recovery",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a2565f767cd5aca62de2529cbd1713625ba0b355c63a9b692d6a8a813609f4eb",
"lines": 64,
"body": "case/case-five-copies-of-noscript-recovery.body.md",
"bodySha256": "c57010f0f57da2c5846c00be364fd9388182ddb8f4cee6ecc3b8c70b7b4f7903",
"assets": [
{
"key": "five-copies-of-noscript-recovery",
"kind": "terminal"
}
]
},
"a-startup-probe-that-never-runs": {
"kind": "CASE",
"slug": "a-startup-probe-that-never-runs",
"title": "startup probe가 production에서 한 번도 실행되지 않는다",
"topic": "redis-command-admission",
"path": "case/case-a-startup-probe-that-never-runs.md",
"rootTreeNode": "case:a-startup-probe-that-never-runs",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "02ce3b3636e5e5906614026a86571a1ddcc4fae5f6c47b0b56749e0b3535f5ed",
"lines": 58,
"body": "case/case-a-startup-probe-that-never-runs.body.md",
"bodySha256": "de5f36ac7e59e9a6f125d05f02dc223bb17e15bf3d32751f77bc1b0250c3d5f7",
"assets": [
{
"key": "a-startup-probe-that-never-runs",
"kind": "terminal"
}
]
},
"server-metadata-defines-the-command": {
"kind": "REFERENCE",
"slug": "server-metadata-defines-the-command",
"title": "서버 메타데이터가 명령의 정의이고 정책 파일은 허용 범위다",
"topic": "redis-command-admission",
"path": "reference/reference-server-metadata-defines-the-command.md",
"rootTreeNode": "reference:server-metadata-defines-the-command",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b65a6b22c8ce9bc688a6b72011ac398a69f8300e2a23adc3972c757126f7c0a0",
"lines": 56
},
"a-single-admission-point-must-count-its-bypasses": {
"kind": "REFERENCE",
"slug": "a-single-admission-point-must-count-its-bypasses",
"title": "단일 admission point는 우회 경로를 세어야 성립한다",
"topic": "redis-command-admission",
"path": "reference/reference-a-single-admission-point-must-count-its-bypasses.md",
"rootTreeNode": "reference:a-single-admission-point-must-count-its-bypasses",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "145ff57f8e70d3b6f5b5e99741b2765bac1bfe14b66dcf3e86cc753a0b5b864e",
"lines": 58
},
"redis-topology-lane-not-executed": {
"kind": "QUESTION",
"slug": "redis-topology-lane-not-executed",
"title": "Redis 토폴로지 레인이 실행되지 않아 key spec 드리프트가 확인되지 않았다",
"topic": "redis-command-admission",
"path": "openquestion/openquestion-redis-topology-lane-not-executed.md",
"rootTreeNode": "open-question:redis-topology-lane-not-executed",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "3756f61cdef17262130f81a2910e83a8933c332d483ee3abbfda7b3cd1f2c171",
"lines": 78
},
"unclassified-commands-are-refused": {
"kind": "DECISION",
"slug": "unclassified-commands-are-refused",
"title": "분류되지 않은 명령은 fail-closed로 거부한다",
"topic": "redis-command-admission",
"path": "decision/decision-unclassified-commands-are-refused.md",
"rootTreeNode": "decision:unclassified-commands-are-refused",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "da938893d8d79b3c18df79f9aaa5188db2d524bce313b4beb6fbf571e1fe2dbc",
"lines": 60
},
"transport-failure-stage-and-category": {
"kind": "CONCEPT",
"slug": "transport-failure-stage-and-category",
"title": "전송 실패의 단계와 범주 — AttemptStage와 FailureCategory",
"topic": "http-failure-classification",
"path": "concept/concept-transport-failure-stage-and-category.md",
"rootTreeNode": "concept:transport-failure-stage-and-category",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e830ff662f17058b167a2a512d6aa2f44f90bf53afd7c18831c119b967ecc300",
"lines": 132,
"body": "concept/concept-transport-failure-stage-and-category.body.md",
"bodySha256": "3bf3ab648816c035d0a7eee8eea3b0f02ca170027548e985197f183db1d723a5",
"assets": [
{
"key": "transport-failure-stage-and-category-diagram",
"kind": "diagram"
},
{
"key": "transport-failure-stage-and-category",
"kind": "terminal"
}
]
},
"a-red-test-misread-as-a-product-defect": {
"kind": "CASE",
"slug": "a-red-test-misread-as-a-product-defect",
"title": "붉은 테스트를 제품 결함으로 읽은 오진 — 듀얼스택 localhost가 TLS 실패를 버린다",
"topic": "http-failure-classification",
"path": "case/case-a-red-test-misread-as-a-product-defect.md",
"rootTreeNode": "case:a-red-test-misread-as-a-product-defect",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "2de24921c19cb7f9a490e9b2813cbab4d329deddbc5001fb39bc3f7be0cd1bfe",
"lines": 73,
"body": "case/case-a-red-test-misread-as-a-product-defect.body.md",
"bodySha256": "cb5b8ac0da7c5b6f6ef609892341c3cd3291ed57c3d04c8dfd162102fef3b0c2",
"assets": [
{
"key": "a-red-test-misread-as-a-product-defect",
"kind": "terminal"
},
{
"key": "a-red-test-misread-as-a-product-defect-host-control",
"kind": "terminal"
}
]
},
"a-circuit-breaker-permit-that-leaks-on-local-rejection": {
"kind": "CASE",
"slug": "a-circuit-breaker-permit-that-leaks-on-local-rejection",
"title": "로컬 거부 경로에서 회로 브레이커 permission이 반환되지 않는다",
"topic": "http-failure-classification",
"path": "case/case-a-circuit-breaker-permit-that-leaks-on-local-rejection.md",
"rootTreeNode": "case:a-circuit-breaker-permit-that-leaks-on-local-rejection",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b0c11293a9ba6fdfb5c4e54c5462c7778bf9e22ce2978c909fdb5133a315834e",
"lines": 60,
"body": "case/case-a-circuit-breaker-permit-that-leaks-on-local-rejection.body.md",
"bodySha256": "e6901467ab152cc4304a27374bdc6c2ddc154be617206e49f13f963317d1d36c",
"assets": [
{
"key": "a-circuit-breaker-permit-that-leaks-on-local-rejection",
"kind": "terminal"
}
]
},
"walk-the-cause-chain-most-specific-wins": {
"kind": "REFERENCE",
"slug": "walk-the-cause-chain-most-specific-wins",
"title": "원인 사슬은 가장 구체적인 분류가 이기도록 순회한다",
"topic": "http-failure-classification",
"path": "reference/reference-walk-the-cause-chain-most-specific-wins.md",
"rootTreeNode": "reference:walk-the-cause-chain-most-specific-wins",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "ac9c437eac0b6244eff1923c2b3ef18905c13a9ce0b66d185c42b8da55f6bf07",
"lines": 62
},
"a-classifier-sees-only-what-the-engine-kept": {
"kind": "REFERENCE",
"slug": "a-classifier-sees-only-what-the-engine-kept",
"title": "분류기는 엔진이 남긴 것만 볼 수 있다",
"topic": "http-failure-classification",
"path": "reference/reference-a-classifier-sees-only-what-the-engine-kept.md",
"rootTreeNode": "reference:a-classifier-sees-only-what-the-engine-kept",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5cc42233b54a4ff6eae838d2c121a4b65924c0c7ff47144e11ef3046593602df",
"lines": 53
},
"verify-runtime-shape-at-runtime": {
"kind": "REFERENCE",
"slug": "verify-runtime-shape-at-runtime",
"title": "런타임의 모양에 대한 주장은 런타임에서 확인한다",
"topic": "http-failure-classification",
"path": "reference/reference-verify-runtime-shape-at-runtime.md",
"rootTreeNode": "reference:verify-runtime-shape-at-runtime",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "8ad00ca00a7b9905324481ddb5ad37560f15bb294b6b6651ae1c4b78014cbf76",
"lines": 60
},
"retryability-needs-both-idempotency-and-category": {
"kind": "REFERENCE",
"slug": "retryability-needs-both-idempotency-and-category",
"title": "재시도 가능성은 멱등성과 실패 범주를 함께 봐야 정해진다",
"topic": "http-failure-classification",
"path": "reference/reference-retryability-needs-both-idempotency-and-category.md",
"rootTreeNode": "reference:retryability-needs-both-idempotency-and-category",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "947096b7e9e9aba8759a9306d9631ecaaccf60d71954b591c4f096012dddc895",
"lines": 56
},
"retry-safety-is-decided-by-evidence": {
"kind": "DECISION",
"slug": "retry-safety-is-decided-by-evidence",
"title": "재시도 안전성은 증거에 기반해 판정한다",
"topic": "http-failure-classification",
"path": "decision/decision-retry-safety-is-decided-by-evidence.md",
"rootTreeNode": "decision:retry-safety-is-decided-by-evidence",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "117f87ae6d433a3d723291647b8d27d541ec094efffb9d2b45e81904952dee5a",
"lines": 58
},
"file-state-machine-and-ready": {
"kind": "CONCEPT",
"slug": "file-state-machine-and-ready",
"title": "파일 상태 기계와 READY가 뜻하는 것",
"topic": "fileserver-state-and-fencing",
"path": "concept/concept-file-state-machine-and-ready.md",
"rootTreeNode": "concept:file-state-machine-and-ready",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "9755536acf2cf2b192f526dbce980b68a719256785563b6f8012f8ea7a87b681",
"lines": 91,
"body": "concept/concept-file-state-machine-and-ready.body.md",
"bodySha256": "cacdc1a62e95ff76ae4fada63706db3bd4d9b1656aaabf435796b712da477335",
"assets": [
{
"key": "file-state-machine-and-ready-diagram",
"kind": "diagram"
},
{
"key": "file-state-machine-and-ready",
"kind": "terminal"
}
]
},
"scriptable-detection-bypassed-by-a-bom": {
"kind": "CASE",
"slug": "scriptable-detection-bypassed-by-a-bom",
"title": "scriptable 콘텐츠 탐지가 BOM·NUL·주석으로 우회된다",
"topic": "fileserver-state-and-fencing",
"path": "case/case-scriptable-detection-bypassed-by-a-bom.md",
"rootTreeNode": "case:scriptable-detection-bypassed-by-a-bom",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "df3259fbb76d09acbbfa6d67f25e4d3a53c25a669a499799bbb8987b6dce18be",
"lines": 71,
"body": "case/case-scriptable-detection-bypassed-by-a-bom.body.md",
"bodySha256": "c48cc8c049e8c3a094fe18f4b2f6b229de464b74a76eb563f505205d12b786e8",
"assets": [
{
"key": "scriptable-detection-bypassed-by-a-bom",
"kind": "terminal"
}
]
},
"a-read-then-delete-race-on-the-upload-lease": {
"kind": "CASE",
"slug": "a-read-then-delete-race-on-the-upload-lease",
"title": "cleanup이 읽은 lease와 삭제 사이에 writer가 그 lease를 얻을 수 있었다",
"topic": "fileserver-state-and-fencing",
"path": "case/case-a-read-then-delete-race-on-the-upload-lease.md",
"rootTreeNode": "case:a-read-then-delete-race-on-the-upload-lease",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a2cb8d416805b848c142ae02376b18de3a8bf8dc98047d0b6b5da93ae159fbc1",
"lines": 63,
"body": "case/case-a-read-then-delete-race-on-the-upload-lease.body.md",
"bodySha256": "87ce369a5f54b9bba6438e09e1f595431cd2d665ae9676e1b3b9f2fbbee26bed",
"assets": [
{
"key": "a-read-then-delete-race-on-the-upload-lease",
"kind": "terminal"
}
]
},
"a-cleanup-claim-without-fencing": {
"kind": "CASE",
"slug": "a-cleanup-claim-without-fencing",
"title": "claim이 소유자·토큰·만료를 기록하지 않아 죽은 worker의 항목이 영영 남았다",
"topic": "fileserver-state-and-fencing",
"path": "case/case-a-cleanup-claim-without-fencing.md",
"rootTreeNode": "case:a-cleanup-claim-without-fencing",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5bdb8378d83566ebde51ecd39313fa9f5a48bd5a82f73cee84cb0642aa947fa8",
"lines": 58,
"body": "case/case-a-cleanup-claim-without-fencing.body.md",
"bodySha256": "240ac6b4e96db508dc511966e655d407ef869df59014c219aabdc660057ae676",
"assets": [
{
"key": "a-cleanup-claim-without-fencing",
"kind": "terminal"
}
]
},
"readme-said-no-beans-there-are-eight": {
"kind": "CASE",
"slug": "readme-said-no-beans-there-are-eight",
"title": "README가 \"노출된 setting도 bean도 없다\"고 적은 능력에 production bean 여덟이 있다",
"topic": "fileserver-state-and-fencing",
"path": "case/case-readme-said-no-beans-there-are-eight.md",
"rootTreeNode": "case:readme-said-no-beans-there-are-eight",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "aaeff6698a9308ecc96e9fb4f598454d18181b8a079eec3672a32149af553684",
"lines": 63,
"body": "case/case-readme-said-no-beans-there-are-eight.body.md",
"bodySha256": "52ad99c6ad35c4de8eb3cb85b64afe82a701ef9c9ea59cb211d17bd448441d5c",
"assets": [
{
"key": "readme-said-no-beans-there-are-eight",
"kind": "terminal"
}
]
},
"a-publicly-readable-state-must-be-complete-by-constraint": {
"kind": "REFERENCE",
"slug": "a-publicly-readable-state-must-be-complete-by-constraint",
"title": "공개 읽기 가능한 상태는 완전한 identity를 DB 제약으로 요구한다",
"topic": "fileserver-state-and-fencing",
"path": "reference/reference-a-publicly-readable-state-must-be-complete-by-constraint.md",
"rootTreeNode": "reference:a-publicly-readable-state-must-be-complete-by-constraint",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "58a1ee9260a0c0bdae61f77664c627f7f3669430502bdfae4e179ca68c0ce0be",
"lines": 53
},
"claim-with-a-conditional-update-not-a-read": {
"kind": "REFERENCE",
"slug": "claim-with-a-conditional-update-not-a-read",
"title": "조건부 update로 행을 claim하고 읽은 값으로 판단하지 않는다",
"topic": "fileserver-state-and-fencing",
"path": "reference/reference-claim-with-a-conditional-update-not-a-read.md",
"rootTreeNode": "reference:claim-with-a-conditional-update-not-a-read",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "56c6b914d0c8641e231cdbaf13caee2b2d29f40a441e311f50db237bd87099e6",
"lines": 58
},
"prefix-matching-fits-signatures-not-sniffing": {
"kind": "REFERENCE",
"slug": "prefix-matching-fits-signatures-not-sniffing",
"title": "접두사 시작 매칭은 시그니처에는 맞고 스니핑 패턴에는 맞지 않는다",
"topic": "fileserver-state-and-fencing",
"path": "reference/reference-prefix-matching-fits-signatures-not-sniffing.md",
"rootTreeNode": "reference:prefix-matching-fits-signatures-not-sniffing",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "c819a2bce2c60a169d9349d317ace0fc4d606e95e5fbf50105a0a83084c5202d",
"lines": 54
},
"no-physical-paths-in-metadata": {
"kind": "DECISION",
"slug": "no-physical-paths-in-metadata",
"title": "물리 경로와 원본 파일명을 저장하지 않는다",
"topic": "fileserver-state-and-fencing",
"path": "decision/decision-no-physical-paths-in-metadata.md",
"rootTreeNode": "decision:no-physical-paths-in-metadata",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "05ee322255164828bea94c14e1cd98b360b89ce6ce00ed671166013b97638a49",
"lines": 55
},
"staged-lifecycle-and-signed-grants": {
"kind": "CONCEPT",
"slug": "staged-lifecycle-and-signed-grants",
"title": "staged lifecycle과 서명된 grant",
"topic": "objectstorage-staged-lifecycle",
"path": "concept/concept-staged-lifecycle-and-signed-grants.md",
"rootTreeNode": "concept:staged-lifecycle-and-signed-grants",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "4b6547b8d4f2c579cb3fe09dad372471bbcb8d456489a919696a08a507a03eb2",
"lines": 77,
"body": "concept/concept-staged-lifecycle-and-signed-grants.body.md",
"bodySha256": "c2d9f1af6e16b7a8e768f0707bfe8670e5f81d719abd8fe68b595ee5bd15f72e",
"assets": [
{
"key": "staged-lifecycle-and-signed-grants-diagram",
"kind": "diagram"
},
{
"key": "staged-lifecycle-and-signed-grants",
"kind": "terminal"
}
]
},
"apply-is-a-setting-approval-is-not": {
"kind": "CASE",
"slug": "apply-is-a-setting-approval-is-not",
"title": "APPLY를 켜는 설정은 있고 승인을 검증하는 bean은 없다",
"topic": "objectstorage-staged-lifecycle",
"path": "case/case-apply-is-a-setting-approval-is-not.md",
"rootTreeNode": "case:apply-is-a-setting-approval-is-not",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "625cb7e951d19e1227c2b4d6d15ed7300d717bf0e21bcae58f8b1f186c558f79",
"lines": 79,
"body": "case/case-apply-is-a-setting-approval-is-not.body.md",
"bodySha256": "0f1c7d9cd4d204c6113ae3a058754326b25ffce6441a456a7f7ce0b0ca722c23",
"assets": [
{
"key": "apply-is-a-setting-approval-is-not",
"kind": "terminal"
}
]
},
"the-last-part-cannot-get-a-grant": {
"kind": "CASE",
"slug": "the-last-part-cannot-get-a-grant",
"title": "직접 multipart의 마지막 part는 grant를 받을 수 없다",
"topic": "objectstorage-staged-lifecycle",
"path": "case/case-the-last-part-cannot-get-a-grant.md",
"rootTreeNode": "case:the-last-part-cannot-get-a-grant",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a3ea09482fc6d1474465890a65ec9ff35fbe8ad56a3711c5e605dcf1b1f9baa0",
"lines": 59,
"body": "case/case-the-last-part-cannot-get-a-grant.body.md",
"bodySha256": "542b57b40d2d5714af5db44450582ddae92617cec1c9226517113f84fa17cc86",
"assets": [
{
"key": "the-last-part-cannot-get-a-grant",
"kind": "terminal"
}
]
},
"endpoint-check-only-on-upload": {
"kind": "CASE",
"slug": "endpoint-check-only-on-upload",
"title": "서명된 grant의 endpoint 검증이 upload 경로에만 있다",
"topic": "objectstorage-staged-lifecycle",
"path": "case/case-endpoint-check-only-on-upload.md",
"rootTreeNode": "case:endpoint-check-only-on-upload",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "92adec4070d5276b83b10dd4152488ae4da2cf517b16c3dcbb7918f618cbf3a4",
"lines": 59,
"body": "case/case-endpoint-check-only-on-upload.body.md",
"bodySha256": "2ce19ee8b007be39da8a0447b71454e2c20799c2d22f01a599f5ba511c0d9a2f",
"assets": [
{
"key": "endpoint-check-only-on-upload",
"kind": "terminal"
}
]
},
"the-powerful-half-must-not-be-one-setting-away": {
"kind": "REFERENCE",
"slug": "the-powerful-half-must-not-be-one-setting-away",
"title": "권한이 센 절반이 설정 한 줄로 켜지면 안 된다",
"topic": "objectstorage-staged-lifecycle",
"path": "reference/reference-the-powerful-half-must-not-be-one-setting-away.md",
"rootTreeNode": "reference:the-powerful-half-must-not-be-one-setting-away",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "7dd3c13a865bd6618f3188e3bf000aae345615c4220f2197e99f397afddfa2a9",
"lines": 56
},
"a-binary-approval-codec-must-round-trip": {
"kind": "REFERENCE",
"slug": "a-binary-approval-codec-must-round-trip",
"title": "이진 승인 코덱은 decode 후 재인코딩이 원본과 같아야 한다",
"topic": "objectstorage-staged-lifecycle",
"path": "reference/reference-a-binary-approval-codec-must-round-trip.md",
"rootTreeNode": "reference:a-binary-approval-codec-must-round-trip",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5e0f503db932308ff09886a681e4676b364c20c961f0584f417d4604f763b1cd",
"lines": 58
},
"legacy-adoption-requires-two-approvers": {
"kind": "DECISION",
"slug": "legacy-adoption-requires-two-approvers",
"title": "legacy 채택은 서로 다른 두 승인자의 서명을 요구한다",
"topic": "objectstorage-staged-lifecycle",
"path": "decision/decision-legacy-adoption-requires-two-approvers.md",
"rootTreeNode": "decision:legacy-adoption-requires-two-approvers",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "17d44598a792ed7017581c249294e37c05baaf40622dcaaf4df564119836bb2f",
"lines": 61
},
"four-grade-disclosure": {
"kind": "CONCEPT",
"slug": "four-grade-disclosure",
"title": "네 단계 공시 등급 — modelled에서 production-verified까지",
"topic": "self-disclosure-grading",
"path": "concept/concept-four-grade-disclosure.md",
"rootTreeNode": "concept:four-grade-disclosure",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "640d399787cc3c7334eb73b7c013cd042faf0b2ca830bf9cae38f54b68b8b5c9",
"lines": 92,
"body": "concept/concept-four-grade-disclosure.body.md",
"bodySha256": "7a61107d032e80a0da34b5b0b7578938a28631e545e2c30604fc8258ecda9708",
"assets": [
{
"key": "four-grade-disclosure-diagram",
"kind": "diagram"
},
{
"key": "four-grade-disclosure",
"kind": "terminal"
}
]
},
"seven-rows-downgraded-by-the-family-itself": {
"kind": "CASE",
"slug": "seven-rows-downgraded-by-the-family-itself",
"title": "등급표 13행 중 일곱을 스스로 강등하고 한 행만 관측과 어긋났다",
"topic": "self-disclosure-grading",
"path": "case/case-seven-rows-downgraded-by-the-family-itself.md",
"rootTreeNode": "case:seven-rows-downgraded-by-the-family-itself",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "44da636a160a9632be3f8b8b94354a59a7c90d4d28cc4d2b93c851ce055f618c",
"lines": 71,
"body": "case/case-seven-rows-downgraded-by-the-family-itself.body.md",
"bodySha256": "d003dd8bc317c6d2176e02a73608c15317105af4d495f9343f1e9df09739f07b",
"assets": [
{
"key": "seven-rows-downgraded-by-the-family-itself",
"kind": "terminal"
}
]
},
"a-soak-threshold-written-for-a-grade-that-does-not-exist": {
"kind": "CASE",
"slug": "a-soak-threshold-written-for-a-grade-that-does-not-exist",
"title": "담금 임계값이 열거형에 없는 등급을 위해 쓰여 중간 등급으로 올라가는 것이 더 어려워졌다",
"topic": "self-disclosure-grading",
"path": "case/case-a-soak-threshold-written-for-a-grade-that-does-not-exist.md",
"rootTreeNode": "case:a-soak-threshold-written-for-a-grade-that-does-not-exist",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "871362081d4718271382a01b7002a0a5cea5509e9ee71f3a63b92f99e7915df4",
"lines": 63,
"body": "case/case-a-soak-threshold-written-for-a-grade-that-does-not-exist.body.md",
"bodySha256": "142598d7d830ae53a36d72c20ff99e2279bfeb8f173dc5034746d86d3423c851",
"assets": [
{
"key": "a-soak-threshold-written-for-a-grade-that-does-not-exist",
"kind": "terminal"
}
]
},
"a-startup-validator-that-requires-a-key-nothing-signs-with": {
"kind": "CASE",
"slug": "a-startup-validator-that-requires-a-key-nothing-signs-with",
"title": "시작 검증기가 커서 서명 키를 요구하는데 그 키로 서명하는 코드가 없다",
"topic": "self-disclosure-grading",
"path": "case/case-a-startup-validator-that-requires-a-key-nothing-signs-with.md",
"rootTreeNode": "case:a-startup-validator-that-requires-a-key-nothing-signs-with",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "9970edd467dde4502522637742d7ae77ccfe4553fa575fafe1f569b45034c7d8",
"lines": 66,
"body": "case/case-a-startup-validator-that-requires-a-key-nothing-signs-with.body.md",
"bodySha256": "3aa498533f1c9080c43b81595d589d7ce200434800e8814132f592cae8d2791c",
"assets": [
{
"key": "a-startup-validator-that-requires-a-key-nothing-signs-with",
"kind": "terminal"
}
]
},
"build-only-exempts-ninety-files-from-todays-incident": {
"kind": "CASE",
"slug": "build-only-exempts-ninety-files-from-todays-incident",
"title": "build-only 등급이 90개 파일의 미조립을 오늘의 사고에서 면제한다",
"topic": "self-disclosure-grading",
"path": "case/case-build-only-exempts-ninety-files-from-todays-incident.md",
"rootTreeNode": "case:build-only-exempts-ninety-files-from-todays-incident",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b8d55ebd6274c2fcd436a16be0fbbfbc6cc2e49e86f793e04fac0b79bafe51bc",
"lines": 65,
"body": "case/case-build-only-exempts-ninety-files-from-todays-incident.body.md",
"bodySha256": "50aab92080e1b114c23d2426cfa0a50452ef1c14a9163efe98244bc50a0dbbd8",
"assets": [
{
"key": "build-only-exempts-ninety-files-from-todays-incident",
"kind": "terminal"
}
]
},
"grades-may-understate-never-overstate": {
"kind": "REFERENCE",
"slug": "grades-may-understate-never-overstate",
"title": "등급은 네 단계로 나누고 관측보다 높게 적지 않는다",
"topic": "self-disclosure-grading",
"path": "reference/reference-grades-may-understate-never-overstate.md",
"rootTreeNode": "reference:grades-may-understate-never-overstate",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a36be9ec0ed23d91285de8c2f7b78b531f8328bc54fa333ff458c065c88de209",
"lines": 60
},
"runtime-membership-decides-severity": {
"kind": "REFERENCE",
"slug": "runtime-membership-decides-severity",
"title": "runtime_memberships를 먼저 읽고 심각도를 정한다",
"topic": "self-disclosure-grading",
"path": "reference/reference-runtime-membership-decides-severity.md",
"rootTreeNode": "reference:runtime-membership-decides-severity",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "2bf02741a15eb9eeaeb34bb44cd4f1592d2ef2bf9cfed5306a6fd3d5b85d3e40",
"lines": 60
},
"grades-derive-from-executed-evidence": {
"kind": "DECISION",
"slug": "grades-derive-from-executed-evidence",
"title": "능력 등급은 코드가 아니라 실행된 증거에서 파생한다",
"topic": "self-disclosure-grading",
"path": "decision/decision-grades-derive-from-executed-evidence.md",
"rootTreeNode": "decision:grades-derive-from-executed-evidence",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b96f65e29499b5d295f3b1b7d6babb5e085667bc3108bfaa090862d1baf3b89d",
"lines": 63
},
"rls-three-preconditions": {
"kind": "CONCEPT",
"slug": "rls-three-preconditions",
"title": "RLS가 성립하기 위한 세 전제",
"topic": "multitenancy-isolation",
"path": "concept/concept-rls-three-preconditions.md",
"rootTreeNode": "concept:rls-three-preconditions",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "1a0d28ebb69e6d9b805970ddd0d29cfd36a5a1b8534a18bb2be18212fa366444",
"lines": 92,
"body": "concept/concept-rls-three-preconditions.body.md",
"bodySha256": "d53d4b59ee692ae3d04fc58370201bab3536bc53c43dd36b11a407a00eada285",
"assets": [
{
"key": "rls-three-preconditions-diagram",
"kind": "diagram"
},
{
"key": "rls-three-preconditions",
"kind": "terminal"
}
]
},
"four-multitenancy-strategies": {
"kind": "CONCEPT",
"slug": "four-multitenancy-strategies",
"title": "네 가지 멀티테넌시 전략과 각각의 격리 경계",
"topic": "multitenancy-isolation",
"path": "concept/concept-four-multitenancy-strategies.md",
"rootTreeNode": "concept:four-multitenancy-strategies",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "4833593e3daf5c8b1712488e667e7676c6a49ef93042cb3530d8489d853415dc",
"lines": 70,
"body": "concept/concept-four-multitenancy-strategies.body.md",
"bodySha256": "70d6c94f0cb01eef4e0c6b4b45caa71aa1072b8b39c9da50d996a9901445cba2",
"assets": [
{
"key": "four-multitenancy-strategies-diagram",
"kind": "diagram"
},
{
"key": "four-multitenancy-strategies",
"kind": "terminal"
}
]
},
"three-ways-rls-does-nothing": {
"kind": "CASE",
"slug": "three-ways-rls-does-nothing",
"title": "RLS가 아무것도 하지 않는 세 가지 방법",
"topic": "multitenancy-isolation",
"path": "case/case-three-ways-rls-does-nothing.md",
"rootTreeNode": "case:three-ways-rls-does-nothing",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "c25e6be9b2a50991e890258187b55b451197d3e590ddefd40ae72473a76dc6fc",
"lines": 64,
"body": "case/case-three-ways-rls-does-nothing.body.md",
"bodySha256": "4b481cf618309766298be6cc3eb4034ffbac60d14af1b61283be0dff40a42c4f",
"assets": [
{
"key": "three-ways-rls-does-nothing",
"kind": "terminal"
}
]
},
"search-path-survived-the-return-to-the-pool": {
"kind": "CASE",
"slug": "search-path-survived-the-return-to-the-pool",
"title": "search_path가 풀로 돌아간 커넥션에 남아 다음 tenant가 상속한다",
"topic": "multitenancy-isolation",
"path": "case/case-search-path-survived-the-return-to-the-pool.md",
"rootTreeNode": "case:search-path-survived-the-return-to-the-pool",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "bdd2561e1ad562cde29aea92f915b22eaa2d97f9d87f7bd9331244bf508e76db",
"lines": 62,
"body": "case/case-search-path-survived-the-return-to-the-pool.body.md",
"bodySha256": "d88f834254a353f1c4f86cc6e687a8dbd57794f2a2b63931ce57f46f0fbbeb09",
"assets": [
{
"key": "search-path-survived-the-return-to-the-pool",
"kind": "terminal"
}
]
},
"tenant-pools-summed-past-the-server-ceiling": {
"kind": "CASE",
"slug": "tenant-pools-summed-past-the-server-ceiling",
"title": "tenant별 풀이 개별적으로 합리적이고 그 합이 서버 상한을 넘긴다",
"topic": "multitenancy-isolation",
"path": "case/case-tenant-pools-summed-past-the-server-ceiling.md",
"rootTreeNode": "case:tenant-pools-summed-past-the-server-ceiling",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "cf408e38370f080d3b0a0020a39cb18c33f77406cf7c14abb689ce103c35ab37",
"lines": 60,
"body": "case/case-tenant-pools-summed-past-the-server-ceiling.body.md",
"bodySha256": "f246900b8e63437239364bae11dc95173c697b8dea414f747b2cfa79c3a5bb2e",
"assets": [
{
"key": "tenant-pools-summed-past-the-server-ceiling",
"kind": "terminal"
}
]
},
"hibernate-filter-is-not-a-security-boundary": {
"kind": "REFERENCE",
"slug": "hibernate-filter-is-not-a-security-boundary",
"title": "Hibernate filter는 보안 경계가 아니다",
"topic": "multitenancy-isolation",
"path": "reference/reference-hibernate-filter-is-not-a-security-boundary.md",
"rootTreeNode": "reference:hibernate-filter-is-not-a-security-boundary",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "ba9e4a118081ca2e2459606487163d72e7986d0144c166d3b082437bfaefb271",
"lines": 55
},
"tenant-column-belongs-in-every-unique-constraint": {
"kind": "REFERENCE",
"slug": "tenant-column-belongs-in-every-unique-constraint",
"title": "tenant 컬럼이 있는 테이블의 모든 unique 제약에 그 컬럼이 들어가야 한다",
"topic": "multitenancy-isolation",
"path": "reference/reference-tenant-column-belongs-in-every-unique-constraint.md",
"rootTreeNode": "reference:tenant-column-belongs-in-every-unique-constraint",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "4ec096bb19fd503c101b304ff53cea71f093d008ab54b3d5a71b355b710b1533",
"lines": 53
},
"isolation-settings-must-be-transaction-local": {
"kind": "REFERENCE",
"slug": "isolation-settings-must-be-transaction-local",
"title": "격리 설정은 트랜잭션 로컬이어야 한다",
"topic": "multitenancy-isolation",
"path": "reference/reference-isolation-settings-must-be-transaction-local.md",
"rootTreeNode": "reference:isolation-settings-must-be-transaction-local",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "168036a5ede52c3a9f7ee0c159ce544f9d4b9fa9df9da115a580987e6c360c4e",
"lines": 60
},
"classpath-presence-is-not-consent": {
"kind": "DECISION",
"slug": "classpath-presence-is-not-consent",
"title": "클래스패스에 있는 것은 실행 동의가 아니다",
"topic": "multitenancy-isolation",
"path": "decision/decision-classpath-presence-is-not-consent.md",
"rootTreeNode": "decision:classpath-presence-is-not-consent",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "539a740f96999b4c53641a4883d81d8f626f8908b257edf754b79ee663d4d81c",
"lines": 62
},
"a01-f002-idfactory-newid": {
"kind": "CASE",
"slug": "a01-f002-idfactory-newid",
"title": "never-before-used 는 시그니처가 줄 수 없는 보장이다",
"topic": "identity-and-value-contracts",
"path": "case/case-a01-f002-idfactory-newid.md",
"rootTreeNode": "case:a01-f002-idfactory-newid",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d69db10558f285076d79dcbf486a27ca51b98e3cd62db5ce53606c33820c2782",
"lines": 64,
"body": "case/case-a01-f002-idfactory-newid.body.md",
"bodySha256": "ebb34fba4bea601626a392fed3e8a27fc1340eb02500ece2d48f82fe8deec1d4",
"assets": [
{
"key": "a01-f002-idfactory-newid",
"kind": "terminal"
}
]
},
"a02-f001-lro": {
"kind": "QUESTION",
"slug": "a02-f001-lro",
"title": "response/LRO invariant enforcement boundary",
"topic": "multitenancy-isolation",
"path": "openquestion/openquestion-a02-f001-lro.md",
"rootTreeNode": "open-question:a02-f001-lro",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d60bb9a1b04ded84bd546d83fcffced9e2e6a883ddb92afbc10d3362a43b3808",
"lines": 66
},
"a02-f002-domaincontextkey": {
"kind": "QUESTION",
"slug": "a02-f002-domaincontextkey",
"title": "DomainContextKey same-name different-type collision",
"topic": "multitenancy-isolation",
"path": "openquestion/openquestion-a02-f002-domaincontextkey.md",
"rootTreeNode": "open-question:a02-f002-domaincontextkey",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "ef75492b48ebf3730c093c0782ede80631f57ac11b8c75acb2f616d5bc7da1bf",
"lines": 66
},
"analysis-finding-a02-f003": {
"kind": "QUESTION",
"slug": "analysis-finding-a02-f003",
"title": "bounded operational record identifiers",
"topic": "multitenancy-isolation",
"path": "openquestion/openquestion-analysis-finding-a02-f003.md",
"rootTreeNode": "open-question:analysis-finding-a02-f003",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "4c2b801c581f510cb8452a4833659ad7178bbdc16e64a303bb2ea071a3c1b39f",
"lines": 68
},
"analysis-finding-a02-f004": {
"kind": "QUESTION",
"slug": "analysis-finding-a02-f004",
"title": "permission component grammar",
"topic": "multitenancy-isolation",
"path": "openquestion/openquestion-analysis-finding-a02-f004.md",
"rootTreeNode": "open-question:analysis-finding-a02-f004",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "33dcdd5e18d297106b2e8774f13690f725c798035fc0601a413e9b3a9113936a",
"lines": 64
},
"analysis-finding-a02-f005": {
"kind": "QUESTION",
"slug": "analysis-finding-a02-f005",
"title": "messaging schema qualification boundary",
"topic": "multitenancy-isolation",
"path": "openquestion/openquestion-analysis-finding-a02-f005.md",
"rootTreeNode": "open-question:analysis-finding-a02-f005",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f3f13795949a7f0855183e6f880d84816bf71a54b26c540ef9a63bdf398c5f6d",
"lines": 64
},
"analysis-finding-a03-f001": {
"kind": "CASE",
"slug": "analysis-finding-a03-f001",
"title": "네 답을 주는 claim 이 있는데 서비스는 있음·없음 두 갈래로 판단한다",
"topic": "multitenancy-isolation",
"path": "case/case-analysis-finding-a03-f001.md",
"rootTreeNode": "case:analysis-finding-a03-f001",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "68e9b6f4d1e2dc4caf084816a744fbaff9616f41c826d0d88cb38fb50d8f7ce4",
"lines": 74,
"body": "case/case-analysis-finding-a03-f001.body.md",
"bodySha256": "62ea4ca6ec144bf9698d7d5bd3822c069bca3d3d19dcadc804400209ba4f4485",
"assets": [
{
"key": "analysis-finding-a03-f001",
"kind": "terminal"
}
]
},
"analysis-finding-a03-f002": {
"kind": "QUESTION",
"slug": "analysis-finding-a03-f002",
"title": "notification derived idempotency key가 32-bit hash",
"topic": "multitenancy-isolation",
"path": "openquestion/openquestion-analysis-finding-a03-f002.md",
"rootTreeNode": "open-question:analysis-finding-a03-f002",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d2f85e4e3ae491bdfb818ce49795da6c0c7e7e23681043bd63e0a1f9d0ec23fd",
"lines": 68
},
"analysis-finding-a03-f003": {
"kind": "REFERENCE",
"slug": "analysis-finding-a03-f003",
"title": "legacy compatibility surface의 제거 조건을 세 가지로 고정한다",
"topic": "multitenancy-isolation",
"path": "reference/reference-analysis-finding-a03-f003.md",
"rootTreeNode": "reference:analysis-finding-a03-f003",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "17b8b5d2130d65941954b04dc1dda1aa31c1705851d464ea346809baa0267fad",
"lines": 54
},
"analysis-finding-a03-f004": {
"kind": "QUESTION",
"slug": "analysis-finding-a03-f004",
"title": "isolation vocabulary와 legacy routing capability의 시차",
"topic": "multitenancy-isolation",
"path": "openquestion/openquestion-analysis-finding-a03-f004.md",
"rootTreeNode": "open-question:analysis-finding-a03-f004",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "feac9ef42791b290a44be739991693f533dfa6f5dc5d334d8f98a47365e8ffcb",
"lines": 70
},
"analysis-finding-a04-f002": {
"kind": "CASE",
"slug": "analysis-finding-a04-f002",
"title": "메시징만 성공 로그를 try 밖으로 옮기고 알림은 같은 try 에 남겨 두었다",
"topic": "multitenancy-isolation",
"path": "case/case-analysis-finding-a04-f002.md",
"rootTreeNode": "case:analysis-finding-a04-f002",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "4f96a881ac8ad20ad68cd19fb47dae9f935393231eee6d1cc9b30fcc5e39d258",
"lines": 76,
"body": "case/case-analysis-finding-a04-f002.body.md",
"bodySha256": "97b112784167b85327057519f03bd587cb2786cbe3048a337d94d14378049039",
"assets": [
{
"key": "analysis-finding-a04-f002",
"kind": "terminal"
}
]
},
"analysis-finding-a04-f004": {
"kind": "CASE",
"slug": "analysis-finding-a04-f004",
"title": "실패 로거가 던지면 그 예외가 제공자 예외를 밀어내고 호출자로 나간다",
"topic": "multitenancy-isolation",
"path": "case/case-analysis-finding-a04-f004.md",
"rootTreeNode": "case:analysis-finding-a04-f004",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "08ebfa2f7e82fa81f182a69281a0b65ca1834ec2a04f388240b8391b658af45e",
"lines": 73,
"body": "case/case-analysis-finding-a04-f004.body.md",
"bodySha256": "f6c5ca326c2b164c40a5efc8260d48cb7c9f2cdd57f537532139c153a7b2f48b",
"assets": [
{
"key": "analysis-finding-a04-f004",
"kind": "terminal"
}
]
},
"analysis-finding-a04-f005": {
"kind": "CASE",
"slug": "analysis-finding-a04-f005",
"title": "README 의 세 문장 중 둘은 쓰일 때부터 틀렸고 하나만 나중에 어긋났다",
"topic": "multitenancy-isolation",
"path": "case/case-analysis-finding-a04-f005.md",
"rootTreeNode": "case:analysis-finding-a04-f005",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "39802b776eb03bccd96d9ba8a27beeb7149ed2d5a54e832a45552f80f2c32a91",
"lines": 69,
"body": "case/case-analysis-finding-a04-f005.body.md",
"bodySha256": "6336c2e9298829a1f9b000fdc1074244a9fe20f2153e4b9b86fc0fd85c5c83df",
"assets": [
{
"key": "analysis-finding-a04-f005",
"kind": "terminal"
}
]
},
"analysis-finding-a04-f006": {
"kind": "QUESTION",
"slug": "analysis-finding-a04-f006",
"title": "cache-redis 와 httpclient 의 support 간선이 죽었는지 확정되지 않았다",
"topic": "multitenancy-isolation",
"path": "openquestion/openquestion-analysis-finding-a04-f006.md",
"rootTreeNode": "open-question:analysis-finding-a04-f006",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "7e24855b49466cb361cb873528cef3e158888070f18f4e11c7ea0b1a5707fb20",
"lines": 66
},
"analysis-finding-a05-f001": {
"kind": "CASE",
"slug": "analysis-finding-a05-f001",
"title": "추정식의 여유분이 상수라서 인코드가 내준 세 크기를 디코드가 거절한다",
"topic": "multitenancy-isolation",
"path": "case/case-analysis-finding-a05-f001.md",
"rootTreeNode": "case:analysis-finding-a05-f001",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "9856006d96be374ffcd0e75be602f8cfe1570477a345a15f0646a8687bdbbfe4",
"lines": 78,
"body": "case/case-analysis-finding-a05-f001.body.md",
"bodySha256": "e02b368c2e5f7cffc4b35316450ee41a8e00c7d9ba6691dc61fd4760ec381b3b",
"assets": [
{
"key": "analysis-finding-a05-f001",
"kind": "terminal"
}
]
},
"a05-f003-capabilitysupport-constraints": {
"kind": "QUESTION",
"slug": "a05-f003-capabilitysupport-constraints",
"title": "CapabilitySupport.constraints 의 경계가 타입에 없다",
"topic": "multitenancy-isolation",
"path": "openquestion/openquestion-a05-f003-capabilitysupport-constraints.md",
"rootTreeNode": "open-question:a05-f003-capabilitysupport-constraints",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "7784346c04d7f5b0be2207e39fa20036907befd290a5e2e2e4b39c7414f5d55a",
"lines": 70
},
"a05-f004-retrydecision-reason": {
"kind": "CASE",
"slug": "a05-f004-retrydecision-reason",
"title": "안전하다고 적힌 값이 같은 모듈의 저카디널리티 정의를 통과하지 못한다",
"topic": "bounding-by-type",
"path": "case/case-a05-f004-retrydecision-reason.md",
"rootTreeNode": "case:a05-f004-retrydecision-reason",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "29b64b5d5b908f7709aeddf78d8f1df4835710ca6a64a7b8eb983557d731acf8",
"lines": 68,
"body": "case/case-a05-f004-retrydecision-reason.body.md",
"bodySha256": "f45785e41fb8eecc4fc80bdd2ac21a8d65c39c3885cb2c6c2511cebfbf9f67e9",
"assets": [
{
"key": "a05-f004-retrydecision-reason",
"kind": "terminal"
},
{
"key": "a05-f004-retrydecision-reason-probe",
"kind": "terminal"
}
]
},
"a05-f005-jparetrypolicy": {
"kind": "CASE",
"slug": "a05-f005-jparetrypolicy",
"title": "애플리케이션이 넣은 재시도 정책이 한 번도 불리지 않고 작업만 두 번 돈다",
"topic": "runtime-contract-correctness",
"path": "case/case-a05-f005-jparetrypolicy.md",
"rootTreeNode": "case:a05-f005-jparetrypolicy",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "fe4ed2143629b859c977af84502b199322b7cfc971d03e62c44cd66fc6c09d17",
"lines": 64,
"body": "case/case-a05-f005-jparetrypolicy.body.md",
"bodySha256": "1e70fdb4799ab31e08d64a36709cd0e8e35a1421a9079b9120630d81aef871a8",
"assets": [
{
"key": "a05-f005-jparetrypolicy",
"kind": "terminal"
},
{
"key": "a05-f005-jparetrypolicy-probe",
"kind": "terminal"
}
]
},
"a05-f006-stable": {
"kind": "CASE",
"slug": "a05-f006-stable",
"title": "안정 등급으로 광고한 증거를 만드는 매니저가 어디서도 만들어지지 않는다",
"topic": "capability-declaration-vs-proof",
"path": "case/case-a05-f006-stable.md",
"rootTreeNode": "case:a05-f006-stable",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "65374ce26850722db0e02b67c084cfa1fd1c7a072032795478d01a24a826c25d",
"lines": 71,
"body": "case/case-a05-f006-stable.body.md",
"bodySha256": "d879b880cb8b5a3f40213bdbf3e2adc486c9807f771fe3b882af30f58c845107",
"assets": [
{
"key": "a05-f006-stable",
"kind": "terminal"
},
{
"key": "a05-f006-stable-chain",
"kind": "terminal"
}
]
},
"a05-f007-transactionprofileregistry": {
"kind": "CASE",
"slug": "a05-f007-transactionprofileregistry",
"title": "오타를 막는 근거만 남기고, 오타가 들어올 자리를 지웠다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-a05-f007-transactionprofileregistry.md",
"rootTreeNode": "case:a05-f007-transactionprofileregistry",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a40201b465dcd093f0dea0f943f29d074838a8d5f3fb356ab34dc70b763e0dc7",
"lines": 75,
"body": "case/case-a05-f007-transactionprofileregistry.body.md",
"bodySha256": "05c1c65fc07701d014499b95b55da5d60cfcbf0b60c9c7a61ab30092d4196e00",
"assets": [
{
"key": "a05-f007-transactionprofileregistry-adr",
"kind": "terminal"
},
{
"key": "a05-f007-transactionprofileregistry",
"kind": "terminal"
}
]
},
"analysis-finding-a05-f010": {
"kind": "CASE",
"slug": "analysis-finding-a05-f010",
"title": "정본이라던 코디네이터는 그 포트를 구현하지 않고 다른 클래스가 구현한다",
"topic": "multitenancy-isolation",
"path": "case/case-analysis-finding-a05-f010.md",
"rootTreeNode": "case:analysis-finding-a05-f010",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "86fc85e8f5c1f1a1acbb7a4dff7c4e57f54a41d73aece73c4a603530a1fc5ff5",
"lines": 71,
"body": "case/case-analysis-finding-a05-f010.body.md",
"bodySha256": "8eb1fe7f6b5306a8638a104af3c3030e3fefa4d9f6cbf9cc5189925d63dddd19",
"assets": [
{
"key": "analysis-finding-a05-f010",
"kind": "terminal"
}
]
},
"a05-f012-identity": {
"kind": "CASE",
"slug": "a05-f012-identity",
"title": "상위 클래스까지 올라가는 탐색이 게터는 읽지 않는다",
"topic": "what-a-gate-does-not-prove",
"path": "case/case-a05-f012-identity.md",
"rootTreeNode": "case:a05-f012-identity",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "6f724e7eb6b1ab4933cfb59dbddadcd86e716e9d48bd72223be2345eb195a837",
"lines": 70,
"body": "case/case-a05-f012-identity.body.md",
"bodySha256": "26f70f3e75a5a9f8757aff4312d019f0fa0e5d91181475145f8bb42d37159e17",
"assets": [
{
"key": "a05-f012-identity",
"kind": "terminal"
},
{
"key": "a05-f012-identity-probe",
"kind": "terminal"
}
]
},
"a05-f013-specificationpolicy-specification-unrestricted": {
"kind": "CASE",
"slug": "a05-f013-specificationpolicy-specification-unrestricted",
"title": "널 검사가 술어 검사를 대신하고, 라이브러리는 널 아닌 조건 없음을 준다",
"topic": "what-a-gate-does-not-prove",
"path": "case/case-a05-f013-specificationpolicy-specification-unrestricted.md",
"rootTreeNode": "case:a05-f013-specificationpolicy-specification-unrestricted",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5fc3c82ce9ab8fd9f4ff109460421428b420f02dff256c0cac8d5c6dd94bdd8e",
"lines": 69,
"body": "case/case-a05-f013-specificationpolicy-specification-unrestricted.body.md",
"bodySha256": "4ee212487194057978956a94a2a2e829fb3129a06d74b43fcb869249131ef019",
"assets": [
{
"key": "a05-f013-specificationpolicy-specification-unrestricted",
"kind": "terminal"
},
{
"key": "a05-f013-specificationpolicy-specification-unrestricted-probe",
"kind": "terminal"
}
]
},
"a05-f014-collection-fetch-pagination": {
"kind": "CASE",
"slug": "a05-f014-collection-fetch-pagination",
"title": "게이트가 막겠다는 실패가 그 게이트 실행 안에서 일어나고, 단언은 그것을 보지 못한다",
"topic": "what-a-gate-does-not-prove",
"path": "case/case-a05-f014-collection-fetch-pagination.md",
"rootTreeNode": "case:a05-f014-collection-fetch-pagination",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "46ab4d5ee8ec5b95b847690ea59e87055ba000ea52a42f23e4ccb401d258ac12",
"lines": 74,
"body": "case/case-a05-f014-collection-fetch-pagination.body.md",
"bodySha256": "ffbd7c177c21f56c4325e6d0246862505dc5931d6273b0e7c2d92991dbe4875f",
"assets": [
{
"key": "a05-f014-collection-fetch-pagination",
"kind": "terminal"
},
{
"key": "a05-f014-collection-fetch-pagination-probe",
"kind": "terminal"
},
{
"key": "a05-f014-collection-fetch-pagination-lane",
"kind": "terminal"
}
]
},
"a05-f018-sql": {
"kind": "CASE",
"slug": "a05-f018-sql",
"title": "쿼리 이름을 SQL 로 옮기는 두 경로가 양쪽 끝만 있고 가운데가 없다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-a05-f018-sql.md",
"rootTreeNode": "case:a05-f018-sql",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "ca14f6a18bfc1bfd61d11a1fd4f85d476bb271a403c77dac235890647d4dd48f",
"lines": 64,
"body": "case/case-a05-f018-sql.body.md",
"bodySha256": "bf37e2a03edc45e492f63536ac75a71ca36f3587600890e483d6f1475b6626c1",
"assets": [
{
"key": "a05-f018-sql",
"kind": "terminal"
}
]
},
"a05-f019-ssot": {
"kind": "CASE",
"slug": "a05-f019-ssot",
"title": "정본이 어디인지 주석에 적어 두고 정의는 다시 타이핑한다",
"topic": "declaration-and-document-drift",
"path": "case/case-a05-f019-ssot.md",
"rootTreeNode": "case:a05-f019-ssot",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e7aec5c88095344264f2e80fd0969c80e2a2938ecd72f5de452f90139e1b3961",
"lines": 67,
"body": "case/case-a05-f019-ssot.body.md",
"bodySha256": "6f5b989efa0a94acabcbac21a63827d84e1f86075ce246162de851a37b96337c",
"assets": [
{
"key": "a05-f019-ssot",
"kind": "terminal"
}
]
},
"a05-f020-inspect-claim": {
"kind": "CASE",
"slug": "a05-f020-inspect-claim",
"title": "만료를 보는 청구와 시각을 읽지 않는 조회가 같은 행을 다르게 답한다",
"topic": "state-machines-and-ownership",
"path": "case/case-a05-f020-inspect-claim.md",
"rootTreeNode": "case:a05-f020-inspect-claim",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0a7aaecf3720daf1324a41482f65a4b28b58a3ffdd8fe5a275cced56cfcd38dd",
"lines": 67,
"body": "case/case-a05-f020-inspect-claim.body.md",
"bodySha256": "bda8f45418a8ad4dc35da19f2265f3899b1378847da22fc0ce7697418125dbf3",
"assets": [
{
"key": "a05-f020-inspect-claim",
"kind": "terminal"
},
{
"key": "a05-f020-inspect-claim-postgres",
"kind": "terminal"
}
]
},
"a05-f021-complete-replayttl": {
"kind": "CASE",
"slug": "a05-f021-complete-replayttl",
"title": "전이 다섯 중 넷은 공용 판정을 쓰고 완료만 손으로 비교한다",
"topic": "state-machines-and-ownership",
"path": "case/case-a05-f021-complete-replayttl.md",
"rootTreeNode": "case:a05-f021-complete-replayttl",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "7090f28d66b5912c645fbeeee6bee1f4e3ed943663dd3121e108ba3efdf44ffb",
"lines": 65,
"body": "case/case-a05-f021-complete-replayttl.body.md",
"bodySha256": "2191e6f2b00db6ffc1133afe1e0373d0634bf1f584d57aa7cda71658109d650f",
"assets": [
{
"key": "a05-f021-complete-replayttl-postgres",
"kind": "terminal"
},
{
"key": "a05-f021-complete-replayttl",
"kind": "terminal"
}
]
},
"a05-f022-stable": {
"kind": "CASE",
"slug": "a05-f022-stable",
"title": "검증기는 도는데 정책을 넘기는 한 번의 호출이 없다",
"topic": "capability-declaration-vs-proof",
"path": "case/case-a05-f022-stable.md",
"rootTreeNode": "case:a05-f022-stable",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "c4728cf33473eb2b097f93c50af70cc1b2340c506131a17c42b339a135f3ee50",
"lines": 72,
"body": "case/case-a05-f022-stable.body.md",
"bodySha256": "58d5c9bee999361cb825564ba175dfbe4328d7a8dec9b0a6a15035b3de5a549e",
"assets": [
{
"key": "a05-f022-stable",
"kind": "terminal"
}
]
},
"analysis-finding-a05-f023": {
"kind": "CASE",
"slug": "analysis-finding-a05-f023",
"title": "쿼터 원장은 사용량을 적기만 하고 승인은 그것을 읽지 않는다",
"topic": "multitenancy-isolation",
"path": "case/case-analysis-finding-a05-f023.md",
"rootTreeNode": "case:analysis-finding-a05-f023",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "92a05b452d75ee003846e2e51bd44994fbaaffc117c3c80fbb6b88e3fe1ceb4b",
"lines": 73,
"body": "case/case-analysis-finding-a05-f023.body.md",
"bodySha256": "65d4c82a3fbac748ff8c2c3b44e2807a6733e7abf8483bdd40919a16487282c6",
"assets": [
{
"key": "analysis-finding-a05-f023",
"kind": "terminal"
}
]
},
"analysis-finding-a05-f024": {
"kind": "CASE",
"slug": "analysis-finding-a05-f024",
"title": "회수가 페이지 하나를 다 쓰면 남은 바이트를 들고 그대로 끝난다",
"topic": "multitenancy-isolation",
"path": "case/case-analysis-finding-a05-f024.md",
"rootTreeNode": "case:analysis-finding-a05-f024",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5346e995ba968804c6cef6a95a62c8b109e700c9272052584b3c62e8b554bf76",
"lines": 70,
"body": "case/case-analysis-finding-a05-f024.body.md",
"bodySha256": "cf063282da104e225d1489d7a5709baffd975e502279086552d242268120b2ac",
"assets": [
{
"key": "analysis-finding-a05-f024",
"kind": "terminal"
}
]
},
"a05-f025-filequotaservice-commit": {
"kind": "CASE",
"slug": "a05-f025-filequotaservice-commit",
"title": "만료 조건이 연장에는 있고 확정에는 없다",
"topic": "state-machines-and-ownership",
"path": "case/case-a05-f025-filequotaservice-commit.md",
"rootTreeNode": "case:a05-f025-filequotaservice-commit",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "4b6bc07c283f559a9eb0747e7ee749e267f448b505669cc0ef3f9dae7501ac39",
"lines": 68,
"body": "case/case-a05-f025-filequotaservice-commit.body.md",
"bodySha256": "0c39875b848640366596542d9867a7446c54a35c98af8a7f21c37b6588e70aad",
"assets": [
{
"key": "a05-f025-filequotaservice-commit",
"kind": "terminal"
},
{
"key": "a05-f025-filequotaservice-commit-postgres",
"kind": "terminal"
}
]
},
"a05-f026-enqueue": {
"kind": "CASE",
"slug": "a05-f026-enqueue",
"title": "upsert 라고 적힌 연산이 갱신하고 안 되면 삽입한다",
"topic": "non-atomic-check-then-act",
"path": "case/case-a05-f026-enqueue.md",
"rootTreeNode": "case:a05-f026-enqueue",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b1c79cc18846d84ae9323155300bb97580251fffee029c52356ac64305de294a",
"lines": 73,
"body": "case/case-a05-f026-enqueue.body.md",
"bodySha256": "8695717f98be5ce057f093acfb6770fa45fd062a5985b875cf0967951ef1eabd",
"assets": [
{
"key": "a05-f026-enqueue",
"kind": "terminal"
},
{
"key": "a05-f026-enqueue-race",
"kind": "terminal"
}
]
},
"a05-f027-maximum-attempts": {
"kind": "CASE",
"slug": "a05-f027-maximum-attempts",
"title": "reclaimExpiredClaim이 MAXIMUM_ATTEMPTS를 보지 않는다",
"topic": "state-machines-and-ownership",
"path": "case/case-a05-f027-maximum-attempts.md",
"rootTreeNode": "case:a05-f027-maximum-attempts",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "224a0977916bc4dd08723f931da21c9056400ddcf24eddf457e7f7e439ec905c",
"lines": 71,
"body": "case/case-a05-f027-maximum-attempts.body.md",
"bodySha256": "c37df1ccff8735a68255f57ce60f2e4c06ca14fa8cbd7605c73a2be033577f96",
"assets": [
{
"key": "a05-f027-maximum-attempts",
"kind": "terminal"
},
{
"key": "a05-f027-maximum-attempts-reclaim",
"kind": "terminal"
}
]
},
"analysis-finding-a05-f028": {
"kind": "CASE",
"slug": "analysis-finding-a05-f028",
"title": "리스가 만료될 수 있는 그 구간을 지난 뒤의 쓰기만 펜싱을 쓰지 않는다",
"topic": "multitenancy-isolation",
"path": "case/case-analysis-finding-a05-f028.md",
"rootTreeNode": "case:analysis-finding-a05-f028",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "51b69d2b482f54627cc0b38a26f932dc683e017a39396f307a5ed1e40290c883",
"lines": 72,
"body": "case/case-analysis-finding-a05-f028.body.md",
"bodySha256": "b509eb3f46b05ba41fab4203269bd3eb3c455641b734f3f2a68d7067336aec59",
"assets": [
{
"key": "analysis-finding-a05-f028",
"kind": "terminal"
}
]
},
"a05-f029-for-update-skip-locked": {
"kind": "CASE",
"slug": "a05-f029-for-update-skip-locked",
"title": "SKIP LOCKED 로 잡은 조정 작업을 두 번째 연결이 그대로 받는다",
"topic": "state-ownership-and-concurrency",
"path": "case/case-a05-f029-for-update-skip-locked.md",
"rootTreeNode": "case:a05-f029-for-update-skip-locked",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "64d81a4a8ab36a3417ddcd6272f70d9847f752ea2624fa3194aff81186cb67a8",
"lines": 69,
"body": "case/case-a05-f029-for-update-skip-locked.body.md",
"bodySha256": "83b2a6e4a6b12f0b82222f9b353ea8ddb5a76b6618625ab4801947fdfd2f2166",
"assets": [
{
"key": "a05-f029-for-update-skip-locked",
"kind": "terminal"
},
{
"key": "a05-f029-for-update-skip-locked-probe",
"kind": "terminal"
}
]
},
"analysis-finding-a05-f030": {
"kind": "CASE",
"slug": "analysis-finding-a05-f030",
"title": "청구는 CLAIMED 행을 넣고 저장은 새 행을 넣어 둘이 이어지지 않는다",
"topic": "multitenancy-isolation",
"path": "case/case-analysis-finding-a05-f030.md",
"rootTreeNode": "case:analysis-finding-a05-f030",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "ef7a8e21bbde3f184e4ab35e73181978ec0c808f1820778bf250dcedf811afb1",
"lines": 75,
"body": "case/case-analysis-finding-a05-f030.body.md",
"bodySha256": "915313446515ef4a9508bd3cc8b21aebf19e1a132d5f2e27bfe6274be8fe8a81",
"assets": [
{
"key": "analysis-finding-a05-f030",
"kind": "terminal"
}
]
},
"analysis-finding-a05-f031": {
"kind": "CASE",
"slug": "analysis-finding-a05-f031",
"title": "열거형 바인딩이 만든다던 기동 실패를 합성 루트가 문자열 비교로 대신한다",
"topic": "multitenancy-isolation",
"path": "case/case-analysis-finding-a05-f031.md",
"rootTreeNode": "case:analysis-finding-a05-f031",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "6736ad7c8194043e94f0861f4062a1dada03671a2371c39fbbe56472722bc13e",
"lines": 70,
"body": "case/case-analysis-finding-a05-f031.body.md",
"bodySha256": "9864d0c581a780285bd589335b33eae0e4493759eb323cd140cd1b3ad5f58654",
"assets": [
{
"key": "analysis-finding-a05-f031",
"kind": "terminal"
}
]
},
"analysis-finding-a05-f032": {
"kind": "CASE",
"slug": "analysis-finding-a05-f032",
"title": "대기 수를 단언하는 시험은 그 값을 손으로 넣고 실제로 읽는 시험은 단언하지 않는다",
"topic": "multitenancy-isolation",
"path": "case/case-analysis-finding-a05-f032.md",
"rootTreeNode": "case:analysis-finding-a05-f032",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e1fed9740389c75a6a5aa2ef1375774ac9c37eccd76242026cfade559cd6f66f",
"lines": 73,
"body": "case/case-analysis-finding-a05-f032.body.md",
"bodySha256": "5e8226ee9f60567376eddf5954246339042f6bbe27fb5b91a1cef7c46aa2d792",
"assets": [
{
"key": "analysis-finding-a05-f032",
"kind": "terminal"
}
]
},
"a05-f033-jpa-flyway-migration": {
"kind": "CASE",
"slug": "a05-f033-jpa-flyway-migration",
"title": "선택된 카드의 생산자 태스크가 지금 빌드를 실패시킨다",
"topic": "what-a-gate-does-not-prove",
"path": "case/case-a05-f033-jpa-flyway-migration.md",
"rootTreeNode": "case:a05-f033-jpa-flyway-migration",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "8a6f2063b4c3045949bc37c6618edab301960143671b22e63c2dd73407a4b3dd",
"lines": 69,
"body": "case/case-a05-f033-jpa-flyway-migration.body.md",
"bodySha256": "6de829eacec3ff330697f1a27c5199fc8a547e98a3490d318d595adba4adca76",
"assets": [
{
"key": "a05-f033-jpa-flyway-migration",
"kind": "terminal"
},
{
"key": "a05-f033-jpa-flyway-migration-run",
"kind": "terminal"
},
{
"key": "a05-f033-jpa-flyway-migration-gate",
"kind": "terminal"
}
]
},
"analysis-finding-a05-f034": {
"kind": "CASE",
"slug": "analysis-finding-a05-f034",
"title": "두 카드의 태그를 채우는 시험이 프로덕션 타입을 한 줄도 import 하지 않는다",
"topic": "multitenancy-isolation",
"path": "case/case-analysis-finding-a05-f034.md",
"rootTreeNode": "case:analysis-finding-a05-f034",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "12a56be30fe81c49c300cb25f4bf3a255bf3396fa94f0653b32fb102bc01b92f",
"lines": 69,
"body": "case/case-analysis-finding-a05-f034.body.md",
"bodySha256": "28089078fcb0dca61cc23233dc85b981462f9d5a3588c41e2e089e53b988bd9f",
"assets": [
{
"key": "analysis-finding-a05-f034",
"kind": "terminal"
}
]
},
"analysis-finding-a06-f002": {
"kind": "CASE",
"slug": "analysis-finding-a06-f002",
"title": "가드가 막겠다는 문장이 실제로 있는 두 파일이 탐색 범위 밖이다",
"topic": "multitenancy-isolation",
"path": "case/case-analysis-finding-a06-f002.md",
"rootTreeNode": "case:analysis-finding-a06-f002",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "309ff5e9db11edf36f1b7a2760777a5ef57afe667e8c48af56d5e77a2432540e",
"lines": 75,
"body": "case/case-analysis-finding-a06-f002.body.md",
"bodySha256": "697f44e38597dc03bce09be856a5d66300bc863b48a1a3386927ab9ad2b9a3c0",
"assets": [
{
"key": "analysis-finding-a06-f002",
"kind": "terminal"
}
]
},
"a06-f003-change-streams-true": {
"kind": "CASE",
"slug": "a06-f003-change-streams-true",
"title": "거부라고 적힌 처리가 폐기이고, 그 값을 읽는 시작 검사는 켤 방법이 없다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-a06-f003-change-streams-true.md",
"rootTreeNode": "case:a06-f003-change-streams-true",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "71161c553acfbd67ce46ed11b5a9f08d83258e1b1926e82aca4cf023eada6177",
"lines": 64,
"body": "case/case-a06-f003-change-streams-true.body.md",
"bodySha256": "f14ac67d0bf197561569589af5eb099c82ecb6cdcf91286a56e2d5286fe78d72",
"assets": [
{
"key": "a06-f003-change-streams-true",
"kind": "terminal"
},
{
"key": "a06-f003-change-streams-true-probe",
"kind": "terminal"
},
{
"key": "a06-f003-change-streams-true-shipped",
"kind": "terminal"
}
]
},
"analysis-finding-a06-f004": {
"kind": "CASE",
"slug": "analysis-finding-a06-f004",
"title": "schema version 실패는 두 경로 중 어느 쪽도 온전하지 않다",
"topic": "multitenancy-isolation",
"path": "case/case-analysis-finding-a06-f004.md",
"rootTreeNode": "case:analysis-finding-a06-f004",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "67609527c900610320b8574ba045f43c9114614d88dae858439ca6e53380a8cf",
"lines": 83,
"body": "case/case-analysis-finding-a06-f004.body.md",
"bodySha256": "ec97076b1609680278fe67f07a84026e6458243f0dfadb1ffee4df5e5e30f82f",
"assets": [
{
"key": "analysis-finding-a06-f004",
"kind": "terminal"
}
]
},
"analysis-finding-a06-f005": {
"kind": "CASE",
"slug": "analysis-finding-a06-f005",
"title": "예외 계층의 \"cause를 붙이지 않는다\" 규칙에 문서화되지 않은 예외가 하나 있다",
"topic": "multitenancy-isolation",
"path": "case/case-analysis-finding-a06-f005.md",
"rootTreeNode": "case:analysis-finding-a06-f005",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "4a8b679ece08da64e1f17d137b7244fe5748c585646f68727da744cb9cdcb2c1",
"lines": 79,
"body": "case/case-analysis-finding-a06-f005.body.md",
"bodySha256": "35a4aedc0f50b291cb5d565185178e8578a4d6a1fd72071addaeebf0d7cb0b9b",
"assets": [
{
"key": "analysis-finding-a06-f005",
"kind": "terminal"
}
]
},
"analysis-finding-a06-f007": {
"kind": "CASE",
"slug": "analysis-finding-a06-f007",
"title": "D3 gateway가 문서화한 검사 순서에 존재하지 않는 단계가 있다",
"topic": "multitenancy-isolation",
"path": "case/case-analysis-finding-a06-f007.md",
"rootTreeNode": "case:analysis-finding-a06-f007",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "3ce4b76371478922ee53431febfa7d62b01136fb9f9485411d29d8b9fe42e2cc",
"lines": 76,
"body": "case/case-analysis-finding-a06-f007.body.md",
"bodySha256": "c061455e806b4b39fe68de1eaf5dbc708f195b7b4d00cd8aa2eb08d97b18d973",
"assets": [
{
"key": "analysis-finding-a06-f007",
"kind": "terminal"
}
]
},
"analysis-finding-a06-f008": {
"kind": "CASE",
"slug": "analysis-finding-a06-f008",
"title": "서버 측 deadline이 경로마다 다르게 적용되고, 문서가 지목한 메커니즘은 production 호출자가 0이다",
"topic": "multitenancy-isolation",
"path": "case/case-analysis-finding-a06-f008.md",
"rootTreeNode": "case:analysis-finding-a06-f008",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5b058ccdc9d724c9912d3aa627f4594f0a87f6297b115c258afb7777412c0b28",
"lines": 71,
"body": "case/case-analysis-finding-a06-f008.body.md",
"bodySha256": "65feb3f9cda54d3949a48c6460e49e69460820f98d54f3cfe95feb42fa77e422",
"assets": [
{
"key": "analysis-finding-a06-f008",
"kind": "terminal"
}
]
},
"analysis-finding-a06-f009": {
"kind": "CASE",
"slug": "analysis-finding-a06-f009",
"title": "timeout 초과 경로가 한 observation에 success와 failure를 모두 기록한다",
"topic": "multitenancy-isolation",
"path": "case/case-analysis-finding-a06-f009.md",
"rootTreeNode": "case:analysis-finding-a06-f009",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "bd58152537b439aaa16dd7f6887b57f249231c95b20a0b2b3c10b0b930b74b7e",
"lines": 67,
"body": "case/case-analysis-finding-a06-f009.body.md",
"bodySha256": "58d13904837dc6ee0ffbedc181a226bc57018bda45dfc3096f72df4acfe5bad6",
"assets": [
{
"key": "analysis-finding-a06-f009",
"kind": "terminal"
}
]
},
"analysis-finding-a06-f010": {
"kind": "CASE",
"slug": "analysis-finding-a06-f010",
"title": "collection 이름 불변식이 aggregation executor의 서명에서 깨진다",
"topic": "multitenancy-isolation",
"path": "case/case-analysis-finding-a06-f010.md",
"rootTreeNode": "case:analysis-finding-a06-f010",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b9d5a298edb51fd9639ea4b6ca168f8cf2c25d7738d793eb614806270bcd484e",
"lines": 75,
"body": "case/case-analysis-finding-a06-f010.body.md",
"bodySha256": "5f293896709836de20a30d7c0077e12b7cee25f33776fe6dc04c694c5f03fb4a",
"assets": [
{
"key": "analysis-finding-a06-f010",
"kind": "terminal"
}
]
},
"a06-f011-mongoregexpolicy-forbidden": {
"kind": "CASE",
"slug": "a06-f011-mongoregexpolicy-forbidden",
"title": "MongoRegexPolicy.forbidden()은 금지하지 않는다",
"topic": "security-policy-enforcement",
"path": "case/case-a06-f011-mongoregexpolicy-forbidden.md",
"rootTreeNode": "case:a06-f011-mongoregexpolicy-forbidden",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "ad0f032be4f22c955818e09f96f05e0559dcd6dcc50179315b1dd9426f0c46d1",
"lines": 67,
"body": "case/case-a06-f011-mongoregexpolicy-forbidden.body.md",
"bodySha256": "3655ee7caf3edd86bf77d3737c9ab09be6117c11fc5246a5c66ae04c200b20e8",
"assets": [
{
"key": "a06-f011-mongoregexpolicy-forbidden-probe",
"kind": "terminal"
},
{
"key": "a06-f011-mongoregexpolicy-forbidden",
"kind": "terminal"
}
]
},
"a06-f013-recordapplied": {
"kind": "CASE",
"slug": "a06-f013-recordapplied",
"title": "recordApplied가 펜스를 비교하지 않아 밀려난 실행자가 원장을 차지한다",
"topic": "state-ownership-and-concurrency",
"path": "case/case-a06-f013-recordapplied.md",
"rootTreeNode": "case:a06-f013-recordapplied",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "29a9c8a1f80c7ad55e9578b830dca0c57f445d5da507b8f83c31bd757f6cab5a",
"lines": 70,
"body": "case/case-a06-f013-recordapplied.body.md",
"bodySha256": "7d50160b5b7006dd14c59560ea6c7fda31ba391bdefa244ffd3e78ded0b1f83b",
"assets": [
{
"key": "a06-f013-recordapplied",
"kind": "terminal"
},
{
"key": "a06-f013-recordapplied-probe",
"kind": "terminal"
},
{
"key": "a06-f013-recordapplied-around",
"kind": "terminal"
}
]
},
"analysis-finding-a06-f014": {
"kind": "CASE",
"slug": "analysis-finding-a06-f014",
"title": "index diff가 실제로 비교하는 것은 두 필드뿐이다",
"topic": "multitenancy-isolation",
"path": "case/case-analysis-finding-a06-f014.md",
"rootTreeNode": "case:analysis-finding-a06-f014",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "804509b79eca241b7f0ce1b5690e2d83e58dd5c0e12c84f849f4eb68715dd0f5",
"lines": 71,
"body": "case/case-analysis-finding-a06-f014.body.md",
"bodySha256": "1d811ccff4642a5a6b395066f2494182e0f808d583e937514fdd3820ef3bb1c8",
"assets": [
{
"key": "analysis-finding-a06-f014",
"kind": "terminal"
}
]
},
"analysis-finding-a06-f015": {
"kind": "CASE",
"slug": "analysis-finding-a06-f015",
"title": "TTL이 두 곳에 선언되고, 규칙을 가진 쪽은 아무도 쓰지 않는다",
"topic": "multitenancy-isolation",
"path": "case/case-analysis-finding-a06-f015.md",
"rootTreeNode": "case:analysis-finding-a06-f015",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "39a6b9b6ad11ab1f4513b2e1121cebc590aa3c3200f0cdcf34741ad576ef7904",
"lines": 71,
"body": "case/case-analysis-finding-a06-f015.body.md",
"bodySha256": "e53e3bc1308dbadf5d9489a363db7d7d498f50401a691104521aee133cebbc77",
"assets": [
{
"key": "analysis-finding-a06-f015",
"kind": "terminal"
}
]
},
"a06-f016-flamingock": {
"kind": "CASE",
"slug": "a06-f016-flamingock",
"title": "javadoc은 재개 가능한 것만 거부한다고 적는데 검사는 마이그레이션을 보지 않는다",
"topic": "declaration-and-document-drift",
"path": "case/case-a06-f016-flamingock.md",
"rootTreeNode": "case:a06-f016-flamingock",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "75022fc8ea9cc1f88c2331f5ce7ddea10aa4b8e883846b42e03321537990f261",
"lines": 66,
"body": "case/case-a06-f016-flamingock.body.md",
"bodySha256": "f8da70c0dcfc100527ad71f42490a9104f48945fb09fb24fd307bbe03be7f207",
"assets": [
{
"key": "a06-f016-flamingock",
"kind": "terminal"
},
{
"key": "a06-f016-flamingock-probe",
"kind": "terminal"
}
]
},
"a06-f018-changestreams-false": {
"kind": "CASE",
"slug": "a06-f018-changestreams-false",
"title": "플래그는 고정 거짓이라 능력 검사를 끄지만, 조립 조건이 아니라서 소비자 빈은 그대로 생성된다",
"topic": "assembly-ownership",
"path": "case/case-a06-f018-changestreams-false.md",
"rootTreeNode": "case:a06-f018-changestreams-false",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f5666a43df7ce7ffbd145fdc004f6435dba97f1c8ff86f000f7dc671051bc624",
"lines": 68,
"body": "case/case-a06-f018-changestreams-false.body.md",
"bodySha256": "c71bdeef57ab6b767ff601ada727e0c47aacf5b4dd410cfec7324f71825edb50",
"assets": [
{
"key": "a06-f018-changestreams-false",
"kind": "terminal"
},
{
"key": "a06-f018-changestreams-false-wiring",
"kind": "terminal"
}
]
},
"analysis-finding-a06-f019": {
"kind": "CASE",
"slug": "analysis-finding-a06-f019",
"title": "recovery package에 쓰이는 어휘와 쓰이지 않는 어휘가 나란히 있다",
"topic": "multitenancy-isolation",
"path": "case/case-analysis-finding-a06-f019.md",
"rootTreeNode": "case:analysis-finding-a06-f019",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e37db824f142bea79480744987bf71b180a69337383f2eb4234b268e26bc9786",
"lines": 74,
"body": "case/case-analysis-finding-a06-f019.body.md",
"bodySha256": "bf36ba43401760aa71c34202d5449cb65bd43ef89e3e6ef5d389854fdb52bf6c",
"assets": [
{
"key": "analysis-finding-a06-f019",
"kind": "terminal"
}
]
},
"a06-f020-tls-stable": {
"kind": "CASE",
"slug": "a06-f020-tls-stable",
"title": "프로파일이 선언한 여섯 값이 드라이버에 하나도 도달하지 않는다",
"topic": "security-and-trust-boundaries",
"path": "case/case-a06-f020-tls-stable.md",
"rootTreeNode": "case:a06-f020-tls-stable",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "91739a19dc276aa150c4a57b46f4db7711eb2d64dac54df3810230bc7fb067af",
"lines": 71,
"body": "case/case-a06-f020-tls-stable.body.md",
"bodySha256": "b6e2b21e20b10a466864c17d54eeef4efe613ca1507697febb0af04cde835838",
"assets": [
{
"key": "a06-f020-tls-stable",
"kind": "terminal"
},
{
"key": "a06-f020-tls-stable-probe",
"kind": "terminal"
}
]
},
"analysis-finding-a06-f021": {
"kind": "CASE",
"slug": "analysis-finding-a06-f021",
"title": "admin gateway의 두 audit 경로 중 하나만 fail-closed다",
"topic": "multitenancy-isolation",
"path": "case/case-analysis-finding-a06-f021.md",
"rootTreeNode": "case:analysis-finding-a06-f021",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d53bb908f786b67f5db953afd0b50fe741a2f080edb76ffeb7fa8f532fc07996",
"lines": 71,
"body": "case/case-analysis-finding-a06-f021.body.md",
"bodySha256": "8715411831f436620786e9c359da778a3b25bb1d192dfd989aa138e9b1f42881",
"assets": [
{
"key": "analysis-finding-a06-f021",
"kind": "terminal"
}
]
},
"analysis-finding-a06-f022": {
"kind": "CASE",
"slug": "analysis-finding-a06-f022",
"title": "태그 allowlist는 규약이지 강제가 아니다",
"topic": "multitenancy-isolation",
"path": "case/case-analysis-finding-a06-f022.md",
"rootTreeNode": "case:analysis-finding-a06-f022",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d0e4cf59181b89e4240963ceb44beecd0ac8dad8e2bdd021b4d9dcd86017357c",
"lines": 75,
"body": "case/case-analysis-finding-a06-f022.body.md",
"bodySha256": "272cf4b846f73c736c5529c8ab404d8a53919434ff8c9932888fa6f769216094",
"assets": [
{
"key": "analysis-finding-a06-f022",
"kind": "terminal"
}
]
},
"analysis-finding-a06-f023": {
"kind": "CASE",
"slug": "analysis-finding-a06-f023",
"title": "sharding admin gateway의 네 작업 중 셋은 어떤 입력으로도 완료될 수 없다",
"topic": "multitenancy-isolation",
"path": "case/case-analysis-finding-a06-f023.md",
"rootTreeNode": "case:analysis-finding-a06-f023",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "8846ef39347dbe88a728a1b12935eda35c924641e1c46d1b9f96720fefd35b78",
"lines": 75,
"body": "case/case-analysis-finding-a06-f023.body.md",
"bodySha256": "a31292f200c3c968c45511de7da6c7a52a2cab860ab669aed0177cc7c204ca1f",
"assets": [
{
"key": "analysis-finding-a06-f023",
"kind": "terminal"
}
]
},
"analysis-finding-a06-f024": {
"kind": "CASE",
"slug": "analysis-finding-a06-f024",
"title": "promotion 증거 어휘가 둘이고, gate는 하나만 검사한다",
"topic": "multitenancy-isolation",
"path": "case/case-analysis-finding-a06-f024.md",
"rootTreeNode": "case:analysis-finding-a06-f024",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "cc549f3a19e55c563a403073df9310f34bd165e19d62e2d7824cf7b47e83d42f",
"lines": 67,
"body": "case/case-analysis-finding-a06-f024.body.md",
"bodySha256": "3b36132405a7eda6a8d30829d857bd84b905ee34bf3e09b1642a92279614c7de",
"assets": [
{
"key": "analysis-finding-a06-f024",
"kind": "terminal"
}
]
},
"analysis-finding-a06-f025": {
"kind": "CASE",
"slug": "analysis-finding-a06-f025",
"title": "구현 없는 4개의 계약 중 셋은 그 사실을 적고, 하나는 적지 않는다",
"topic": "multitenancy-isolation",
"path": "case/case-analysis-finding-a06-f025.md",
"rootTreeNode": "case:analysis-finding-a06-f025",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "eaf0f1ae6c6d4d997c8efee924d98e5e779e8fdbba66922aca38a45052ea66f6",
"lines": 66,
"body": "case/case-analysis-finding-a06-f025.body.md",
"bodySha256": "0f9f725f64f5dfdf1dec6164c9b314d47c1cfd5a6e402d531cce3aaa7cddc49c",
"assets": [
{
"key": "analysis-finding-a06-f025",
"kind": "terminal"
}
]
},
"analysis-finding-a06-f026": {
"kind": "CASE",
"slug": "analysis-finding-a06-f026",
"title": "커버리지 gate 둘이 나란히 있고, 하나는 발화할 수 없다",
"topic": "multitenancy-isolation",
"path": "case/case-analysis-finding-a06-f026.md",
"rootTreeNode": "case:analysis-finding-a06-f026",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a44ce6c22c80e5dc84d2a7d60d21d093b3df9db88c2d2d9ed4ef2dbdf56c1330",
"lines": 72,
"body": "case/case-analysis-finding-a06-f026.body.md",
"bodySha256": "e0fd23149669e2ae703259433088d057060c28179aac00a91de4082738119150",
"assets": [
{
"key": "analysis-finding-a06-f026",
"kind": "terminal"
}
]
},
"analysis-finding-a06-f027": {
"kind": "CASE",
"slug": "analysis-finding-a06-f027",
"title": "release gate가 실제로 차단하는 것은 hermetic test 3개이고, mongo용 CI workflow는 없다",
"topic": "multitenancy-isolation",
"path": "case/case-analysis-finding-a06-f027.md",
"rootTreeNode": "case:analysis-finding-a06-f027",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "548d5b4824498966a9b3dd4f310034d4105e8830123764b5a67c4934d5ede016",
"lines": 72,
"body": "case/case-analysis-finding-a06-f027.body.md",
"bodySha256": "bfa1ab20648f68f638463b3dac2e1f32be47d0009f56cae994202895581b59b6",
"assets": [
{
"key": "analysis-finding-a06-f027",
"kind": "terminal"
}
]
},
"analysis-finding-a06-f028": {
"kind": "CASE",
"slug": "analysis-finding-a06-f028",
"title": "소비자가 없는 fixture 셋",
"topic": "multitenancy-isolation",
"path": "case/case-analysis-finding-a06-f028.md",
"rootTreeNode": "case:analysis-finding-a06-f028",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "c14f4d5cbebaee70ae09b6086c102cedd9fefc0c80c1a2f81b89ff03a4283465",
"lines": 67,
"body": "case/case-analysis-finding-a06-f028.body.md",
"bodySha256": "9476a466e89d54a803dc386ce80b3480033bb984fa670120c27a5695b88da403",
"assets": [
{
"key": "analysis-finding-a06-f028",
"kind": "terminal"
}
]
},
"a07-f001-uuidcodec": {
"kind": "CASE",
"slug": "a07-f001-uuidcodec",
"title": "UuidCodec 의 메서드를 부르는 줄은 자기 명세 다섯뿐이다",
"topic": "identity-and-identifier",
"path": "case/case-a07-f001-uuidcodec.md",
"rootTreeNode": "case:a07-f001-uuidcodec",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "4c9149e3cf87974821ddac3c8d1ad86fb33de151df4e9dba041548d104cf231e",
"lines": 75,
"body": "case/case-a07-f001-uuidcodec.body.md",
"bodySha256": "5567936e4dcb5e60d4966fabd56da8e46c10d07032d65779e4eaadfc844d7ccf",
"assets": [
{
"key": "a07-f001-uuidcodec",
"kind": "terminal"
},
{
"key": "a07-f001-uuidcodec-elsewhere",
"kind": "terminal"
}
]
},
"a07-f002-normalize": {
"kind": "CASE",
"slug": "a07-f002-normalize",
"title": "정규형에서 한 글자를 지운 입력이 거부되지 않고 정규형으로 채워진다",
"topic": "identity-and-identifier",
"path": "case/case-a07-f002-normalize.md",
"rootTreeNode": "case:a07-f002-normalize",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "94a18018589c44ba2a1cd9695b1c1574165d6d85c9fb81c419af818283787654",
"lines": 79,
"body": "case/case-a07-f002-normalize.body.md",
"bodySha256": "53478488750c1daf46eea2a4821ae3513b1a37741c27154c1625b6882322183a",
"assets": [
{
"key": "a07-f002-normalize",
"kind": "terminal"
},
{
"key": "a07-f002-normalize-probe",
"kind": "terminal"
}
]
},
"a07-f004-claude": {
"kind": "CASE",
"slug": "a07-f004-claude",
"title": "문서가 선언됐다는 둘은 없고, 선언된 하나는 그 문장에 없다",
"topic": "identity-and-identifier",
"path": "case/case-a07-f004-claude.md",
"rootTreeNode": "case:a07-f004-claude",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a6d3b52d7b85fcba73f7b66512259dcf7cf391b787824e261d8581aab531b7c3",
"lines": 64,
"body": "case/case-a07-f004-claude.body.md",
"bodySha256": "beac2167eadc0c6d07683887ee0e14196359fd610a5522873b7908f0bc21fcaf",
"assets": [
{
"key": "a07-f004-claude",
"kind": "terminal"
}
]
},
"analysis-finding-a07-f005": {
"kind": "CASE",
"slug": "analysis-finding-a07-f005",
"title": "README의 세 가지 사실 오류",
"topic": "identity-and-identifier",
"path": "case/case-analysis-finding-a07-f005.md",
"rootTreeNode": "case:analysis-finding-a07-f005",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "02c4f46716fe561e6d174ab31a8b4be1651f20fc66fc72f62fa57f8d865d8052",
"lines": 70,
"body": "case/case-analysis-finding-a07-f005.body.md",
"bodySha256": "06ecb7fcac03a6037fd5c6efeb53da1a30838249fac7f7ed1b1e073851b2e98b",
"assets": [
{
"key": "analysis-finding-a07-f005",
"kind": "terminal"
}
]
},
"a07-f006-claude": {
"kind": "CASE",
"slug": "a07-f006-claude",
"title": "사라진 가드가 문서에만 남았고 그 부재는 이미 승인된 결정이다",
"topic": "identity-and-identifier",
"path": "case/case-a07-f006-claude.md",
"rootTreeNode": "case:a07-f006-claude",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e77e6f7be4d3dd05012d9e303a03105c6f7ba8d17e377ec4e3b0071f4a6b976c",
"lines": 64,
"body": "case/case-a07-f006-claude.body.md",
"bodySha256": "aae2b08a15041c83de115d9665cb231b200e1cad6442e0c8d0f4605f1d5efd47",
"assets": [
{
"key": "a07-f006-claude",
"kind": "terminal"
}
]
},
"analysis-finding-a08-f002": {
"kind": "CASE",
"slug": "analysis-finding-a08-f002",
"title": "R1과 R2의 설정 취급이 비대칭이고, 검증된 쪽은 하나뿐이다",
"topic": "file-transfer-and-storage",
"path": "case/case-analysis-finding-a08-f002.md",
"rootTreeNode": "case:analysis-finding-a08-f002",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d579c6446275ab05ed2bbae0071be05af46bfe1dc9c2dcf44b7b29cc8961e9d7",
"lines": 74,
"body": "case/case-analysis-finding-a08-f002.body.md",
"bodySha256": "f7ecfc6a35dbf57a88d407b63a1b215f81ce2bcd34f70916cf15cf15f9343f39",
"assets": [
{
"key": "analysis-finding-a08-f002",
"kind": "terminal"
}
]
},
"analysis-finding-a08-f003": {
"kind": "CASE",
"slug": "analysis-finding-a08-f003",
"title": "문서가 지목한 기본값 위치와 test 목록이 실제와 다르다",
"topic": "file-transfer-and-storage",
"path": "case/case-analysis-finding-a08-f003.md",
"rootTreeNode": "case:analysis-finding-a08-f003",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d8d5a15905e6d8301dbd6318dc05248ae84ac3f5a2b475ef2da9ca98904b7672",
"lines": 69,
"body": "case/case-analysis-finding-a08-f003.body.md",
"bodySha256": "20fb37dbc9993a5bd20785395eecd49cbb544978f57b2a7eabf21777bb5e0766",
"assets": [
{
"key": "analysis-finding-a08-f003",
"kind": "terminal"
}
]
},
"analysis-finding-a08-f004": {
"kind": "CASE",
"slug": "analysis-finding-a08-f004",
"title": "발행 rename만 경로 기반이고, 그것을 지키는 것은 이 모듈이 \"근사에 불과하다\"고 적은 사전검사다",
"topic": "file-transfer-and-storage",
"path": "case/case-analysis-finding-a08-f004.md",
"rootTreeNode": "case:analysis-finding-a08-f004",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d5fadb852244fc775c0b7f7a87e4a07fb08e87a356af883221e1107d80a4879a",
"lines": 82,
"body": "case/case-analysis-finding-a08-f004.body.md",
"bodySha256": "240a290acc2039cd8eccbc1c015da658d891b84828d52a4d67c3248aa1daf88d",
"assets": [
{
"key": "analysis-finding-a08-f004",
"kind": "terminal"
}
]
},
"a08-f005-transferbufferpool-maxborrowedbytes": {
"kind": "CASE",
"slug": "a08-f005-transferbufferpool-maxborrowedbytes",
"title": "부재로 판정된 결합이 원본 증거의 출력 안에 있다",
"topic": "file-transfer-and-storage",
"path": "case/case-a08-f005-transferbufferpool-maxborrowedbytes.md",
"rootTreeNode": "case:a08-f005-transferbufferpool-maxborrowedbytes",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0af49d791a2da660ee81c04c1301da0bf0565a91b4eb73902be33fedeb988ae1",
"lines": 72,
"body": "case/case-a08-f005-transferbufferpool-maxborrowedbytes.body.md",
"bodySha256": "585f335f04e67999cd5cbe919805a12ba29bfd1bf8321a805353ac243f59a1c9",
"assets": [
{
"key": "a08-f005-transferbufferpool-maxborrowedbytes",
"kind": "terminal"
},
{
"key": "a08-f005-transferbufferpool-maxborrowedbytes-peak",
"kind": "terminal"
}
]
},
"analysis-finding-a09-f001": {
"kind": "CASE",
"slug": "analysis-finding-a09-f001",
"title": "production 판정이 두 개의 리터럴 프로파일 이름에 걸려 있다",
"topic": "file-transfer-and-storage",
"path": "case/case-analysis-finding-a09-f001.md",
"rootTreeNode": "case:analysis-finding-a09-f001",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d3cf1bc63c0ed5f9d4b5cd1f11fd7ce48ed56dd68b31fb8dcc07d79e39c44728",
"lines": 78,
"body": "case/case-analysis-finding-a09-f001.body.md",
"bodySha256": "0d269ca9ad82a97c0f64fa0d4aba94094fde4c0c4d6cb399bed73aa7c7d9ebc3",
"assets": [
{
"key": "analysis-finding-a09-f001",
"kind": "terminal"
}
]
},
"analysis-finding-a09-f004": {
"kind": "CASE",
"slug": "analysis-finding-a09-f004",
"title": "그러나 R0 경계가 문서에만 있고 compile 경로에서 닫히지 않는다",
"topic": "file-transfer-and-storage",
"path": "case/case-analysis-finding-a09-f004.md",
"rootTreeNode": "case:analysis-finding-a09-f004",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "1d84c00f6be96c4a815f0c2fe114b42895a5d3f98492c92152e128e73381d6b1",
"lines": 81,
"body": "case/case-analysis-finding-a09-f004.body.md",
"bodySha256": "beeb2ae1dcee70b21aceaed099c8df59be953da65b0da27cd813cbb77cc070e2",
"assets": [
{
"key": "analysis-finding-a09-f004",
"kind": "terminal"
}
]
},
"analysis-finding-a09-f006": {
"kind": "CASE",
"slug": "analysis-finding-a09-f006",
"title": "nonce replay 경계가 결과를 읽고 버린다",
"topic": "file-transfer-and-storage",
"path": "case/case-analysis-finding-a09-f006.md",
"rootTreeNode": "case:analysis-finding-a09-f006",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "9e95ddf72e675d97845cf7ac951ef3ab1848b13e2b6d9689f64b5ca6d4d412df",
"lines": 75,
"body": "case/case-analysis-finding-a09-f006.body.md",
"bodySha256": "ee9d271f6edf2a2530b59503121e0edd64bd46de7da257b7b60b023ac1986344",
"assets": [
{
"key": "analysis-finding-a09-f006",
"kind": "terminal"
}
]
},
"a10-f001-readme": {
"kind": "CASE",
"slug": "a10-f001-readme",
"title": "표가 증거로 지목한 시험이 그 표를 반증한다",
"topic": "caching-and-redis",
"path": "case/case-a10-f001-readme.md",
"rootTreeNode": "case:a10-f001-readme",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "fead0f87b3f70c9261e0c0d87efd25be764ed4fa3881b1a3e588fd774d6ae564",
"lines": 81,
"body": "case/case-a10-f001-readme.body.md",
"bodySha256": "a6c2fb58e808454e7027fef113582ddce745bc8535878c2402a22e3c881c1419",
"assets": [
{
"key": "a10-f001-readme",
"kind": "terminal"
},
{
"key": "a10-f001-readme-counts",
"kind": "terminal"
}
]
},
"analysis-finding-a10-f003": {
"kind": "CASE",
"slug": "analysis-finding-a10-f003",
"title": "SDK가 선언한 두 진입점에 구현이 없다",
"topic": "caching-and-redis",
"path": "case/case-analysis-finding-a10-f003.md",
"rootTreeNode": "case:analysis-finding-a10-f003",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "7d737e3b93c9af93238fc56231c693b5abf973369c35649f58cb6210a3787587",
"lines": 77,
"body": "case/case-analysis-finding-a10-f003.body.md",
"bodySha256": "588c853cea1edef93dd86bd40b7566d94195df049c38c3b1810852ffd31430ea",
"assets": [
{
"key": "analysis-finding-a10-f003",
"kind": "terminal"
}
]
},
"a10-f004-pub-sub": {
"kind": "CASE",
"slug": "a10-f004-pub-sub",
"title": "상한을 주입받는 자리는 있고 주입하는 곳은 없다",
"topic": "caching-and-redis",
"path": "case/case-a10-f004-pub-sub.md",
"rootTreeNode": "case:a10-f004-pub-sub",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "2981f3b726239243da55a76fad831b7ad55300f17e52c6a6bc59bc2e3505f987",
"lines": 73,
"body": "case/case-a10-f004-pub-sub.body.md",
"bodySha256": "6823d1ce2c35d7daa8b459a8f2ff3fabf5dde06e76c4fc6d164112b8d6212d7d",
"assets": [
{
"key": "a10-f004-pub-sub",
"kind": "terminal"
},
{
"key": "a10-f004-pub-sub-bound",
"kind": "terminal"
}
]
},
"a10-f005-hyperloglog-merge": {
"kind": "CASE",
"slug": "a10-f005-hyperloglog-merge",
"title": "채워 넣은 상한은 자기가 잴 요청에서 값을 가져온다",
"topic": "caching-and-redis",
"path": "case/case-a10-f005-hyperloglog-merge.md",
"rootTreeNode": "case:a10-f005-hyperloglog-merge",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "977b0dda05033d8debc02d2ab6348d50aaa527bf2fa37fc33f056954348e4377",
"lines": 78,
"body": "case/case-a10-f005-hyperloglog-merge.body.md",
"bodySha256": "eb7fd587371a04d5b5aabdde1c64c7aafc3eb5270e40faf698391ca8254d6128",
"assets": [
{
"key": "a10-f005-hyperloglog-merge",
"kind": "terminal"
},
{
"key": "a10-f005-hyperloglog-merge-scope",
"kind": "terminal"
},
{
"key": "a10-f005-hyperloglog-merge-budget",
"kind": "terminal"
}
]
},
"a10-f006-requireidentifier": {
"kind": "CASE",
"slug": "a10-f006-requireidentifier",
"title": "지워도 test가 초록인 검사가 셋이다",
"topic": "caching-and-redis",
"path": "case/case-a10-f006-requireidentifier.md",
"rootTreeNode": "case:a10-f006-requireidentifier",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a5b9351ff3466829007434437e0c6d357499e52fe5ea4be5dab98c0b6cdcf70e",
"lines": 84,
"body": "case/case-a10-f006-requireidentifier.body.md",
"bodySha256": "30510ee35f2e118f220af5c26f88f0448679387e99d2487b67f0ccdaf3de46c0",
"assets": [
{
"key": "a10-f006-requireidentifier",
"kind": "terminal"
},
{
"key": "a10-f006-requireidentifier-branch",
"kind": "terminal"
}
]
},
"analysis-finding-a10-f007": {
"kind": "CASE",
"slug": "analysis-finding-a10-f007",
"title": "패턴 구독의 R2 승인만 호출자가 아니라 배포에 대해 이루어진다",
"topic": "caching-and-redis",
"path": "case/case-analysis-finding-a10-f007.md",
"rootTreeNode": "case:analysis-finding-a10-f007",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "1898f2f73ed9016bf312fbe3c2e1e286388591adcb3897be54201c20d3f5f83c",
"lines": 85,
"body": "case/case-analysis-finding-a10-f007.body.md",
"bodySha256": "2831e27011fd8a3882738971ae54a60d287c46fa1075246800d8436b112baf04",
"assets": [
{
"key": "analysis-finding-a10-f007",
"kind": "terminal"
}
]
},
"analysis-finding-a10-f008": {
"kind": "CASE",
"slug": "analysis-finding-a10-f008",
"title": "permit 정책 이름이 세 곳에 문자열로 존재하고 교차 검사가 없다",
"topic": "caching-and-redis",
"path": "case/case-analysis-finding-a10-f008.md",
"rootTreeNode": "case:analysis-finding-a10-f008",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "30d6e8c0eb82ccd90a3eb7da9f8d689eaadbe128fe3a89efd816502a7fddccc4",
"lines": 77,
"body": "case/case-analysis-finding-a10-f008.body.md",
"bodySha256": "6cffb89cb4ca9102e0eb8e2c3ecb6f8d8fd90dc28c563516aa802388515b51d6",
"assets": [
{
"key": "analysis-finding-a10-f008",
"kind": "terminal"
}
]
},
"a11-f001-close": {
"kind": "CASE",
"slug": "a11-f001-close",
"title": "누수 하나는 회수되고 하나는 회수되지 않는다",
"topic": "http-client-and-resilience",
"path": "case/case-a11-f001-close.md",
"rootTreeNode": "case:a11-f001-close",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b8dba7637b58da14ec06c2b0744c077a43b1e711b0ddfbbc0d7d0d416cf8ae91",
"lines": 81,
"body": "case/case-a11-f001-close.body.md",
"bodySha256": "25c169da91c06f58670199a466abf5935e910f0fe20470edfe9e36dcaf3cac5f",
"assets": [
{
"key": "a11-f001-close",
"kind": "terminal"
},
{
"key": "a11-f001-close-leak",
"kind": "terminal"
}
]
},
"a11-f002-pool-route-exceeds-total": {
"kind": "CASE",
"slug": "a11-f002-pool-route-exceeds-total",
"title": "설정 참고 문서가 약속한 코드를 운영자는 받지 못한다",
"topic": "http-client-and-resilience",
"path": "case/case-a11-f002-pool-route-exceeds-total.md",
"rootTreeNode": "case:a11-f002-pool-route-exceeds-total",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "c703bcb24890dd56a49d742af477efb1ebf2f025614abb0d23749301d4deb95a",
"lines": 80,
"body": "case/case-a11-f002-pool-route-exceeds-total.body.md",
"bodySha256": "3d2104b8cae316e1b1ea3e80a4518f2eca1d295ef9bffb67c7cfa041ced77fc8",
"assets": [
{
"key": "a11-f002-pool-route-exceeds-total",
"kind": "terminal"
},
{
"key": "a11-f002-pool-route-exceeds-total-shape",
"kind": "terminal"
}
]
},
"analysis-finding-a11-f003": {
"kind": "CASE",
"slug": "analysis-finding-a11-f003",
"title": "위반 코드 34종 중 22종이 어떤 test에서도 이름으로 확인되지 않는다",
"topic": "http-client-and-resilience",
"path": "case/case-analysis-finding-a11-f003.md",
"rootTreeNode": "case:analysis-finding-a11-f003",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "1808a23714bf04dea77a4c52a6bf03224afe5c7d92f38c47612e054d03fa84ef",
"lines": 73,
"body": "case/case-analysis-finding-a11-f003.body.md",
"bodySha256": "c8152db861c91992b31528fc767cd7e6db3e83d248f540d9dd894624e069f321",
"assets": [
{
"key": "analysis-finding-a11-f003",
"kind": "terminal"
}
]
},
"a11-f004-number": {
"kind": "CASE",
"slug": "a11-f004-number",
"title": "재생 가능으로 인증된 본문이 다른 바이트를 낸다",
"topic": "http-client-and-resilience",
"path": "case/case-a11-f004-number.md",
"rootTreeNode": "case:a11-f004-number",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0aac0b70dbe0cf0e1b2176139c69b36c69410a739f1d61da773c5ba40960c745",
"lines": 79,
"body": "case/case-a11-f004-number.body.md",
"bodySha256": "2fa708bfefec9710a8cf468c8a707396e6317294c3d9449fa957717ceadd2c2b",
"assets": [
{
"key": "a11-f004-number",
"kind": "terminal"
},
{
"key": "a11-f004-number-bytes",
"kind": "terminal"
}
]
},
"a11-f006-boundeddatabufferflux": {
"kind": "CASE",
"slug": "a11-f006-boundeddatabufferflux",
"title": "부르는 쪽이 이미 걸어 둔 것을 한 번 더 건다",
"topic": "http-client-and-resilience",
"path": "case/case-a11-f006-boundeddatabufferflux.md",
"rootTreeNode": "case:a11-f006-boundeddatabufferflux",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "ba34de076199becf1e889899d82021c41d84841171ac305311035b2cc15c774f",
"lines": 79,
"body": "case/case-a11-f006-boundeddatabufferflux.body.md",
"bodySha256": "336e62da410c114bf4095fd06f3dc87bcfbb4e3ab80a7f7f3388c7fbbfd74095",
"assets": [
{
"key": "a11-f006-boundeddatabufferflux",
"kind": "terminal"
},
{
"key": "a11-f006-boundeddatabufferflux-release",
"kind": "terminal"
}
]
},
"a11-f007-dns": {
"kind": "CASE",
"slug": "a11-f007-dns",
"title": "혼동이라 적어 둔 이름이 아직 검사 문구에 있다",
"topic": "http-client-and-resilience",
"path": "case/case-a11-f007-dns.md",
"rootTreeNode": "case:a11-f007-dns",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "41de2617da512464828a2ca18142e126c205b641ad957238687dfd45cfb097b2",
"lines": 83,
"body": "case/case-a11-f007-dns.body.md",
"bodySha256": "415a78365a7a21f45118e396b82cf3688054e940eb1f0979d278eeb44ea43c46",
"assets": [
{
"key": "a11-f007-dns",
"kind": "terminal"
},
{
"key": "a11-f007-dns-overloads",
"kind": "terminal"
}
]
},
"a12-f001-check-verifyjsonschemaruntimegraph": {
"kind": "CASE",
"slug": "a12-f001-check-verifyjsonschemaruntimegraph",
"title": "매 PR 을 막는 게이트가 초록일 수 없다",
"topic": "messaging-and-outbox",
"path": "case/case-a12-f001-check-verifyjsonschemaruntimegraph.md",
"rootTreeNode": "case:a12-f001-check-verifyjsonschemaruntimegraph",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f2001887383481ea3df6736d26b76a292e4b55a3450f0180ba7dbbfec1fe6ad4",
"lines": 80,
"body": "case/case-a12-f001-check-verifyjsonschemaruntimegraph.body.md",
"bodySha256": "aaa3fa545174a462b3d954d1fbdeddf6b236897518a61590ee9cf78975f460e4",
"assets": [
{
"key": "a12-f001-check-verifyjsonschemaruntimegraph",
"kind": "terminal"
},
{
"key": "a12-f001-check-verifyjsonschemaruntimegraph-run",
"kind": "terminal"
}
]
},
"a12-f002-jackson-databind": {
"kind": "CASE",
"slug": "a12-f002-jackson-databind",
"title": "근거를 없앤 커밋이 README 를 열고 그 줄만 두었다",
"topic": "messaging-and-outbox",
"path": "case/case-a12-f002-jackson-databind.md",
"rootTreeNode": "case:a12-f002-jackson-databind",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "16fb390e8dbdc535aeebb057d7fd6ad8e271ca2f965a978a90ac835a813113b6",
"lines": 80,
"body": "case/case-a12-f002-jackson-databind.body.md",
"bodySha256": "1ddecbccd96d06d612d31e7fb3011c19f4de9faf61319f36428170dd76ffddb4",
"assets": [
{
"key": "a12-f002-jackson-databind",
"kind": "terminal"
},
{
"key": "a12-f002-jackson-databind-history",
"kind": "terminal"
}
]
},
"a13-f002-authentication-failed-resumehealthy": {
"kind": "CASE",
"slug": "a13-f002-authentication-failed-resumehealthy",
"title": "두 호출이 상태와 함께 경보를 끈다",
"topic": "notification-and-delivery",
"path": "case/case-a13-f002-authentication-failed-resumehealthy.md",
"rootTreeNode": "case:a13-f002-authentication-failed-resumehealthy",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "c112ceb804b2510f3f8e7b4bbdfce441db2c7e1aec6048207adba99be714b029",
"lines": 81,
"body": "case/case-a13-f002-authentication-failed-resumehealthy.body.md",
"bodySha256": "3be131f8fa053a9e9c35c94846c790f32fed2eea4f286021bb32cb6ff902dc1f",
"assets": [
{
"key": "a13-f002-authentication-failed-resumehealthy",
"kind": "terminal"
},
{
"key": "a13-f002-authentication-failed-resumehealthy-sequence",
"kind": "terminal"
}
]
},
"a13-f003-accesscontext": {
"kind": "CASE",
"slug": "a13-f003-accesscontext",
"title": "정책을 담은 필드가 참이 된 적도 읽힌 적도 없다",
"topic": "notification-and-delivery",
"path": "case/case-a13-f003-accesscontext.md",
"rootTreeNode": "case:a13-f003-accesscontext",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "694caa1af7c66b782a9eac3e7cc98245bcb4b1218de89fe6b2df54cabab6395b",
"lines": 73,
"body": "case/case-a13-f003-accesscontext.body.md",
"bodySha256": "e7d4f5808cd08955ae4f18f5450b300c84eb63a41347780a8461b78eaf957e61",
"assets": [
{
"key": "a13-f003-accesscontext",
"kind": "terminal"
},
{
"key": "a13-f003-accesscontext-reveal",
"kind": "terminal"
}
]
},
"a13-f004-thymeleaf": {
"kind": "CASE",
"slug": "a13-f004-thymeleaf",
"title": "Thymeleaf 메시지 삭제 가드가 프로덕션 경로에 없고, 있어도 값은 로그에 남는다",
"topic": "notification-and-delivery",
"path": "case/case-a13-f004-thymeleaf.md",
"rootTreeNode": "case:a13-f004-thymeleaf",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "bf0df6698a27a6ffd2720035875c7ecd95b7cc1e58f2aa12a1dbd7a7ab9f7f1a",
"lines": 81,
"body": "case/case-a13-f004-thymeleaf.body.md",
"bodySha256": "2d9c3f23026ce78aab2aa22e86f6716e37f751721d95badb0c2e2c2f5619deee",
"assets": [
{
"key": "a13-f004-thymeleaf",
"kind": "terminal"
},
{
"key": "a13-f004-thymeleaf-messages",
"kind": "terminal"
}
]
},
"a13-f005-retry-after-illegalargumentexception": {
"kind": "CASE",
"slug": "a13-f005-retry-after-illegalargumentexception",
"title": "음수 Retry-After 를 거르지 않는 파서 셋이 조립되지 않아 결함이 잠재로 남는다",
"topic": "notification-and-delivery",
"path": "case/case-a13-f005-retry-after-illegalargumentexception.md",
"rootTreeNode": "case:a13-f005-retry-after-illegalargumentexception",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "9773199d7bd4a0970cf5ad759d60335ca49ee6edbd0054b588264eeb7af6ad27",
"lines": 90,
"body": "case/case-a13-f005-retry-after-illegalargumentexception.body.md",
"bodySha256": "202cd1893bce8f4c604d8fce9665e89e317229c6d1d15af08980c8c325952154",
"assets": [
{
"key": "a13-f005-retry-after-illegalargumentexception",
"kind": "terminal"
},
{
"key": "a13-f005-retry-after-illegalargumentexception-negative",
"kind": "terminal"
},
{
"key": "a13-f005-retry-after-illegalargumentexception-unassembled",
"kind": "terminal"
},
{
"key": "a13-f005-retry-after-illegalargumentexception-ambiguous",
"kind": "terminal"
}
]
},
"analysis-finding-a13-f007": {
"kind": "CASE",
"slug": "analysis-finding-a13-f007",
"title": "'\"상한을 두고 읽는다\"는 본문 핸들러가 전부 읽은 뒤에 자른다'",
"topic": "notification-and-delivery",
"path": "case/case-analysis-finding-a13-f007.md",
"rootTreeNode": "case:analysis-finding-a13-f007",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "66e64fbf2ae0f7747c9c6444daf875414f5fce4380114834bda98d8c07095877",
"lines": 82,
"body": "case/case-analysis-finding-a13-f007.body.md",
"bodySha256": "9f40aa88f2e20f7cf7ba54b11e32c02e8e3b68ed1d0bf954c131fc59e2b202a1",
"assets": [
{
"key": "analysis-finding-a13-f007",
"kind": "terminal"
}
]
},
"a13-f008-host": {
"kind": "CASE",
"slug": "a13-f008-host",
"title": "포트를 뺀 호스트를 서명하는 자리가 둘이고, 같은 저장소의 네 자리는 그 포트를 지킨다",
"topic": "notification-and-delivery",
"path": "case/case-a13-f008-host.md",
"rootTreeNode": "case:a13-f008-host",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d03a8007750d8583a953b7d607fa50ac344fbad372ccde979144f899e6f0044e",
"lines": 77,
"body": "case/case-a13-f008-host.body.md",
"bodySha256": "7c8b365d7bc8af28988f22c894b46526b5cf77998e59eb25878cd4ee6ff998f9",
"assets": [
{
"key": "a13-f008-host",
"kind": "terminal"
},
{
"key": "a13-f008-host-wire",
"kind": "terminal"
}
]
},
"a13-f009-sigv4-string": {
"kind": "CASE",
"slug": "a13-f009-sigv4-string",
"title": "지운다고 약속한 사본은 아무도 받지 않고, 서명 자리가 받는 사본은 지울 수 없다",
"topic": "notification-and-delivery",
"path": "case/case-a13-f009-sigv4-string.md",
"rootTreeNode": "case:a13-f009-sigv4-string",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e789b901e23443ec796ea9d4b7c8c870c3931b95e90213836b0e33da7c78422f",
"lines": 87,
"body": "case/case-a13-f009-sigv4-string.body.md",
"bodySha256": "6e9d324f134851e7ecf207bb399feac860e4a29b1146c501f165d1ec10901da4",
"assets": [
{
"key": "a13-f009-sigv4-string",
"kind": "terminal"
},
{
"key": "a13-f009-sigv4-string-heap",
"kind": "terminal"
}
]
},
"analysis-finding-a13-f010": {
"kind": "CASE",
"slug": "analysis-finding-a13-f010",
"title": "FCM만 \"커밋 후 응답 손실 = ambiguous\" 규칙 밖에 있고, 그 FCM이 두 계약 집합 어디에도 없다",
"topic": "notification-and-delivery",
"path": "case/case-analysis-finding-a13-f010.md",
"rootTreeNode": "case:analysis-finding-a13-f010",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f23fc0c186b7ca3a09bbb0b3efc701cf420ba6d44aaaf893fbb4b0c80064943a",
"lines": 84,
"body": "case/case-analysis-finding-a13-f010.body.md",
"bodySha256": "988afa3ca72d2a7b0768c05da04750e20799929ebbf1b1a962bcd5c155ffa23d",
"assets": [
{
"key": "analysis-finding-a13-f010",
"kind": "terminal"
}
]
},
"analysis-finding-a13-f011": {
"kind": "CASE",
"slug": "analysis-finding-a13-f011",
"title": "공유 provider 계약이 8종 중 3종에서만 상속되고, 강제 장치가 없다",
"topic": "notification-and-delivery",
"path": "case/case-analysis-finding-a13-f011.md",
"rootTreeNode": "case:analysis-finding-a13-f011",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5e56aa844a66e8967c609334021df881a27f1319a7ea949ac0d2d8d82e94d4d2",
"lines": 70,
"body": "case/case-analysis-finding-a13-f011.body.md",
"bodySha256": "72a55c6f42a24c68991a46bb2b5b2c7538a3c8df74facf85bd427abc53c8ff96",
"assets": [
{
"key": "analysis-finding-a13-f011",
"kind": "terminal"
}
]
},
"a14-f002-webproblemsanitizer-alreadysafe": {
"kind": "CASE",
"slug": "a14-f002-webproblemsanitizer-alreadysafe",
"title": "호출자 없이 들어온 메서드이고, 도달 불가라던 가지는 켜지면 반대로 답한다",
"topic": "web-inbound-and-http-surface",
"path": "case/case-a14-f002-webproblemsanitizer-alreadysafe.md",
"rootTreeNode": "case:a14-f002-webproblemsanitizer-alreadysafe",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "8628b9782ce032d1d0af5155fa8faf26d01d197456344edbf3c57b22f7af4110",
"lines": 74,
"body": "case/case-a14-f002-webproblemsanitizer-alreadysafe.body.md",
"bodySha256": "fde618968b0550ace36e9f1b3dbc08fad3409f0fbc05cb0e9126808db0bb1632",
"assets": [
{
"key": "a14-f002-webproblemsanitizer-alreadysafe",
"kind": "terminal"
},
{
"key": "a14-f002-webproblemsanitizer-alreadysafe-branch",
"kind": "terminal"
}
]
},
"analysis-finding-a14-f003": {
"kind": "CASE",
"slug": "analysis-finding-a14-f003",
"title": "플랫폼 요청 컨텍스트가 서블릿에는 생산자가 없고, 리액티브에는 익명 액터로 고정되어 있다",
"topic": "web-inbound-and-http-surface",
"path": "case/case-analysis-finding-a14-f003.md",
"rootTreeNode": "case:analysis-finding-a14-f003",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "623f673e5e07540806d20d7cc1f85daf7d679b41d5ecbf317c9808fed3940a60",
"lines": 123,
"body": "case/case-analysis-finding-a14-f003.body.md",
"bodySha256": "753f21c2477febd0c9e1b732e5ce98d3c0f65c359145c4103d41d59c5dac08e2",
"assets": [
{
"key": "analysis-finding-a14-f003",
"kind": "terminal"
}
]
},
"analysis-finding-a14-f004": {
"kind": "CASE",
"slug": "analysis-finding-a14-f004",
"title": "프레임워크 자유 신원 모델과 교차 테넌트 가드가 프로덕션에서 한 번도 참조되지 않는다",
"topic": "web-inbound-and-http-surface",
"path": "case/case-analysis-finding-a14-f004.md",
"rootTreeNode": "case:analysis-finding-a14-f004",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b71f1be94bffab5937ad95300b6c37f5c6c37fe615021d03182c7b38d6f2d699",
"lines": 87,
"body": "case/case-analysis-finding-a14-f004.body.md",
"bodySha256": "0cdb2023217e49200380be61bfe55100f41e926f1da32297a4d86e49f79fb519",
"assets": [
{
"key": "analysis-finding-a14-f004",
"kind": "terminal"
}
]
},
"a14-f005-publicpaths-restrictedpathrule": {
"kind": "CASE",
"slug": "a14-f005-publicpaths-restrictedpathrule",
"title": "공개 경로가 관리 경로를 덮으면 제한 규칙이 건너뛰어지고, 그 겹침을 보는 것이 없다",
"topic": "web-inbound-and-http-surface",
"path": "case/case-a14-f005-publicpaths-restrictedpathrule.md",
"rootTreeNode": "case:a14-f005-publicpaths-restrictedpathrule",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d5291a5d5652cb9c5520a59a9876d771afb4d932eb56ad6d5066c31a84ead7cd",
"lines": 91,
"body": "case/case-a14-f005-publicpaths-restrictedpathrule.body.md",
"bodySha256": "fa10757455a14c8c2ee8d7cd547f3734ff715097f604b236a8aef09b63c7a6f7",
"assets": [
{
"key": "a14-f005-publicpaths-restrictedpathrule",
"kind": "terminal"
},
{
"key": "a14-f005-publicpaths-restrictedpathrule-chain",
"kind": "terminal"
},
{
"key": "a14-f005-publicpaths-restrictedpathrule-mgmtport",
"kind": "terminal"
}
]
},
"analysis-finding-a14-f006": {
"kind": "CASE",
"slug": "analysis-finding-a14-f006",
"title": "용량 보호 계층 전체(41 main files)가 자기 테스트 픽스처 안에서만 실행된다",
"topic": "web-inbound-and-http-surface",
"path": "case/case-analysis-finding-a14-f006.md",
"rootTreeNode": "case:analysis-finding-a14-f006",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "2c49488795cf98f526664b72b33aa30d76253d0a428535e11f3c721574b8e2d0",
"lines": 92,
"body": "case/case-analysis-finding-a14-f006.body.md",
"bodySha256": "ee95f54844b3447e0b6269e4b322615ef02ceebc1d2dcbebaf9ef864e97bb057",
"assets": [
{
"key": "analysis-finding-a14-f006",
"kind": "terminal"
}
]
},
"analysis-finding-a14-f007": {
"kind": "CASE",
"slug": "analysis-finding-a14-f007",
"title": "리액티브 전송에는 속도 제한 경로가 하나도 없다",
"topic": "web-inbound-and-http-surface",
"path": "case/case-analysis-finding-a14-f007.md",
"rootTreeNode": "case:analysis-finding-a14-f007",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "c320f39c425c7841ead95cd8246c498f30d4410cef0216e3e168e461a727e1a7",
"lines": 69,
"body": "case/case-analysis-finding-a14-f007.body.md",
"bodySha256": "3d42a8c0f995760d40cf550292e121e4d1d1ec9369b0a9a6aab10450ac4321ac",
"assets": [
{
"key": "analysis-finding-a14-f007",
"kind": "terminal"
}
]
},
"analysis-finding-a14-f008": {
"kind": "CASE",
"slug": "analysis-finding-a14-f008",
"title": "멱등 실행 계층과 durable-operation 표면이 픽스처에서만 조립된다",
"topic": "web-inbound-and-http-surface",
"path": "case/case-analysis-finding-a14-f008.md",
"rootTreeNode": "case:analysis-finding-a14-f008",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "01cb078a7bb7451f238787ef8ed4238203f2dcc24f7fb8bfb28a06db9e622b21",
"lines": 86,
"body": "case/case-analysis-finding-a14-f008.body.md",
"bodySha256": "0e569bcea47717d7e4ed7ed69480f2c030fa217d0d8b184f4f69ed7c70f3b950",
"assets": [
{
"key": "analysis-finding-a14-f008",
"kind": "terminal"
}
]
},
"analysis-finding-a14-f009": {
"kind": "CASE",
"slug": "analysis-finding-a14-f009",
"title": "의미 지문이 길이 프레이밍 없이 구분자로 만들어진다",
"topic": "web-inbound-and-http-surface",
"path": "case/case-analysis-finding-a14-f009.md",
"rootTreeNode": "case:analysis-finding-a14-f009",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "90a660ace38520a1bcc223dccd5d0ac830b3fbf853bff55c2f00f99c31916d7b",
"lines": 81,
"body": "case/case-analysis-finding-a14-f009.body.md",
"bodySha256": "31105afef4b89dc560f9b1e7b4e0ea38857f385bfa5449254d7d953a7dbf35a4",
"assets": [
{
"key": "analysis-finding-a14-f009",
"kind": "terminal"
}
]
},
"a14-f010-no-store": {
"kind": "CASE",
"slug": "a14-f010-no-store",
"title": "저장 금지와 조건부 읽기가 같은 응답에 실리고, 둘을 이으라고 만든 이름은 아무도 읽지 않는다",
"topic": "web-inbound-and-http-surface",
"path": "case/case-a14-f010-no-store.md",
"rootTreeNode": "case:a14-f010-no-store",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "3080f2e699f658235fd2c07002403ea1a3b621f85b1aed85770edc9d36617576",
"lines": 95,
"body": "case/case-a14-f010-no-store.body.md",
"bodySha256": "13473537e3891af1cf0036cf32eefb7fdd4c67a840f8f1a85f21caf72c450324",
"assets": [
{
"key": "a14-f010-no-store",
"kind": "terminal"
},
{
"key": "a14-f010-no-store-conditional",
"kind": "terminal"
}
]
},
"a14-f011-maxarrayelements": {
"kind": "CASE",
"slug": "a14-f011-maxarrayelements",
"title": "배열 원소 상한은 선언만 되고, 파서가 그것을 대신할 수단은 이 팩토리에서만 비어 있다",
"topic": "web-inbound-and-http-surface",
"path": "case/case-a14-f011-maxarrayelements.md",
"rootTreeNode": "case:a14-f011-maxarrayelements",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e5b36fb2885bf919f7fa2288241ccaf83cee1e4f477296736f7bb285789a48a2",
"lines": 94,
"body": "case/case-a14-f011-maxarrayelements.body.md",
"bodySha256": "0367e97b5fccad08acbd592680cc52b14c64d8553c258244ac6ccbaf82c9bedb",
"assets": [
{
"key": "a14-f011-maxarrayelements",
"kind": "terminal"
},
{
"key": "a14-f011-maxarrayelements-converter",
"kind": "terminal"
},
{
"key": "a14-f011-maxarrayelements-parser",
"kind": "terminal"
}
]
},
"a14-f014-advanced": {
"kind": "CASE",
"slug": "a14-f014-advanced",
"title": "선언된 Advanced 능력 열둘 중 속성 이름을 읽는 코드가 있는 것은 둘이다",
"topic": "web-inbound-and-http-surface",
"path": "case/case-a14-f014-advanced.md",
"rootTreeNode": "case:a14-f014-advanced",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "81786b545929666530079ee12d4ff4dd520fa9b4a56b5ef6ade6e1ab7e339baa",
"lines": 94,
"body": "case/case-a14-f014-advanced.body.md",
"bodySha256": "bafcb5f924b4556f9561b7c531607826976a94281d1af5332d001415e0c4efbd",
"assets": [
{
"key": "a14-f014-advanced",
"kind": "terminal"
},
{
"key": "a14-f014-advanced-switches",
"kind": "terminal"
}
]
},
"a14-f015-virtualthreadprofile-propertyname": {
"kind": "CASE",
"slug": "a14-f015-virtualthreadprofile-propertyname",
"title": "켜는 속성이라고 적힌 메서드가 어느 게이트도 쓰지 않는 이름을 돌려준다",
"topic": "web-inbound-and-http-surface",
"path": "case/case-a14-f015-virtualthreadprofile-propertyname.md",
"rootTreeNode": "case:a14-f015-virtualthreadprofile-propertyname",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "3a17cb83000ee6c8b51ea812a7a69d5fd86cf774fb551b2e8b76fb63f9a939cc",
"lines": 82,
"body": "case/case-a14-f015-virtualthreadprofile-propertyname.body.md",
"bodySha256": "5fa431e0d0f1b2026dc31ffb8cc78d54e70cdcb4fc2b968085a04cefd458bb3e",
"assets": [
{
"key": "a14-f015-virtualthreadprofile-propertyname",
"kind": "terminal"
},
{
"key": "a14-f015-virtualthreadprofile-propertyname-bind",
"kind": "terminal"
}
]
},
"analysis-finding-a14-f016": {
"kind": "CASE",
"slug": "analysis-finding-a14-f016",
"title": "이 leaf의 리액티브 절반 29개 파일은 어떤 출하 배포에서도 활성화될 수 없다",
"topic": "web-inbound-and-http-surface",
"path": "case/case-analysis-finding-a14-f016.md",
"rootTreeNode": "case:analysis-finding-a14-f016",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e870eb61d78da033c9c5d742fc9720627e626231054783dce60d2554ca713d31",
"lines": 85,
"body": "case/case-analysis-finding-a14-f016.body.md",
"bodySha256": "b3d7b2dbc13fcca9265796401d9aad4c5778de611efca5b48d638e80cebdd996",
"assets": [
{
"key": "analysis-finding-a14-f016",
"kind": "terminal"
}
]
},
"a14-f017-springmvcrouteinventorycollector": {
"kind": "CASE",
"slug": "a14-f017-springmvcrouteinventorycollector",
"title": "라우트 게이트가 실물을 읽어 오는 한 조각만 아무도 만들지 않는다",
"topic": "web-inbound-and-http-surface",
"path": "case/case-a14-f017-springmvcrouteinventorycollector.md",
"rootTreeNode": "case:a14-f017-springmvcrouteinventorycollector",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a2aa80f2d002e95866e856c0e8c8900593cee207906ac8ff255bea0fcadb6507",
"lines": 78,
"body": "case/case-a14-f017-springmvcrouteinventorycollector.body.md",
"bodySha256": "abb7ffa5d0cbfa05425cbf1cca2b44b018492b339cd873fb65cd2648be0ff376",
"assets": [
{
"key": "a14-f017-springmvcrouteinventorycollector",
"kind": "terminal"
},
{
"key": "a14-f017-springmvcrouteinventorycollector-run",
"kind": "terminal"
}
]
},
"a14-f018-webplatformstartupvalidator": {
"kind": "CASE",
"slug": "a14-f018-webplatformstartupvalidator",
"title": "운영 런북이 시작 검증기의 판정을 근거로 삼는데 그 검증기를 부르는 곳이 없다",
"topic": "web-inbound-and-http-surface",
"path": "case/case-a14-f018-webplatformstartupvalidator.md",
"rootTreeNode": "case:a14-f018-webplatformstartupvalidator",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0350f862b0c22b7fab57e0d5ffa1428a8c1d5e4bc61446c937a4874bd3729a66",
"lines": 81,
"body": "case/case-a14-f018-webplatformstartupvalidator.body.md",
"bodySha256": "7b7b9c6ff463e2dab5fab56ce89ba0f4ce68d32d5898f719185202534697cedc",
"assets": [
{
"key": "a14-f018-webplatformstartupvalidator",
"kind": "terminal"
},
{
"key": "a14-f018-webplatformstartupvalidator-run",
"kind": "terminal"
}
]
},
"analysis-finding-a14-f019": {
"kind": "CASE",
"slug": "analysis-finding-a14-f019",
"title": "크로스 스택 게이트가 검증하는 조립은 픽스처의 조립이고, 플랫폼의 조립이 아니다",
"topic": "web-inbound-and-http-surface",
"path": "case/case-analysis-finding-a14-f019.md",
"rootTreeNode": "case:analysis-finding-a14-f019",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "1a1380f19eb5202b48147659b84c5865f80418238c2bdc7fdf7c947c34aac225",
"lines": 94,
"body": "case/case-analysis-finding-a14-f019.body.md",
"bodySha256": "6ab0834d810d01eabab5855664a6df4ca76e05215a6522d208bb4b67a367fda8",
"assets": [
{
"key": "analysis-finding-a14-f019",
"kind": "terminal"
}
]
},
"analysis-finding-a15-f001": {
"kind": "CASE",
"slug": "analysis-finding-a15-f001",
"title": "원인 사슬 순회가 2-순환에서 무한 루프에 빠지고, 저장소는 이미 그 사례를 이름으로 적어 두었다",
"topic": "grpc-and-streaming",
"path": "case/case-analysis-finding-a15-f001.md",
"rootTreeNode": "case:analysis-finding-a15-f001",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "6b025184b4c36813d8dc25edf973df975b264cd0c46cc500192a77faa79ec5e8",
"lines": 92,
"body": "case/case-analysis-finding-a15-f001.body.md",
"bodySha256": "0547906a8f91cfc170371756390f806be33558c2d86e90d5bd74a242ecd0e8cd",
"assets": [
{
"key": "analysis-finding-a15-f001",
"kind": "terminal"
}
]
},
"analysis-finding-a15-f002": {
"kind": "CASE",
"slug": "analysis-finding-a15-f002",
"title": "설정 바인딩이 마스터 스위치 밖에서 일어난다. 컴포지션 루트의 자기 규칙과 어긋난다",
"topic": "grpc-and-streaming",
"path": "case/case-analysis-finding-a15-f002.md",
"rootTreeNode": "case:analysis-finding-a15-f002",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e72abda1df4056e9f44fadd75dcd3c829f621beb9c45a436f26ce63ebdbb3213",
"lines": 88,
"body": "case/case-analysis-finding-a15-f002.body.md",
"bodySha256": "d563b0d418b3fcf93ece90769af67a5c38337a6a7338e5adafda70ee3df81275",
"assets": [
{
"key": "analysis-finding-a15-f002",
"kind": "terminal"
}
]
},
"analysis-finding-a16-f001": {
"kind": "CASE",
"slug": "analysis-finding-a16-f001",
"title": "스키마 조립·계약 정체성·해시 사슬이 통째로 미배선이고, 그것을 발행할 액추에이터 엔드포인트도 등록되지 않는다",
"topic": "graphql-surface",
"path": "case/case-analysis-finding-a16-f001.md",
"rootTreeNode": "case:analysis-finding-a16-f001",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "41457ed05a45113895d79ae0945709e21e5c0d2aa3766c33652c93fef6a56fcc",
"lines": 97,
"body": "case/case-analysis-finding-a16-f001.body.md",
"bodySha256": "b58e56f234488da16a593b444d769300a7304b7a15e2dc5238201e52d1635c0a",
"assets": [
{
"key": "analysis-finding-a16-f001",
"kind": "terminal"
}
]
},
"a16-f002-oneof": {
"kind": "CASE",
"slug": "a16-f002-oneof",
"title": "플랫폼이 강제한다고 적었지만 그 규칙을 실제로 거는 것은 라이브러리다",
"topic": "graphql-surface",
"path": "case/case-a16-f002-oneof.md",
"rootTreeNode": "case:a16-f002-oneof",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "076e305868a31bbc994c86281b8b30b8104387a690e1b0c3e05133c97dceef6e",
"lines": 76,
"body": "case/case-a16-f002-oneof.body.md",
"bodySha256": "10a1fa0f8e245deb94428fa952276263f01471d94d1f0b642ec4cf28950b451d",
"assets": [
{
"key": "a16-f002-oneof",
"kind": "terminal"
},
{
"key": "a16-f002-oneof-run",
"kind": "terminal"
}
]
},
"analysis-finding-a16-f003": {
"kind": "CASE",
"slug": "analysis-finding-a16-f003",
"title": "5계층 예산 모델에서 요청 계층만 강제되고, 나머지 파생이 전부 미배선이다",
"topic": "graphql-surface",
"path": "case/case-analysis-finding-a16-f003.md",
"rootTreeNode": "case:analysis-finding-a16-f003",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "904e7c608f30639446c4585c6aac8f439f585d11d6889bf1c26c7e2ce6f40c56",
"lines": 91,
"body": "case/case-analysis-finding-a16-f003.body.md",
"bodySha256": "7aceb56b9d24a31d9e4f82037ed0795ee03fc1e89e3ffe6767ceb73ebb3c7879",
"assets": [
{
"key": "analysis-finding-a16-f003",
"kind": "terminal"
}
]
},
"a16-f004-graphqloperationnamepolicy": {
"kind": "CASE",
"slug": "a16-f004-graphqloperationnamepolicy",
"title": "연산 이름 정책의 두 구현 중 하나만 배선되고, 미배선 쪽만 GraphQlOperationNamePolicy를 쓴다",
"topic": "graphql-surface",
"path": "case/case-a16-f004-graphqloperationnamepolicy.md",
"rootTreeNode": "case:a16-f004-graphqloperationnamepolicy",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "bd4590db5021323dcc581e1a95656223c1a7bdbda98c788e796a3a019cec5a86",
"lines": 74,
"body": "case/case-a16-f004-graphqloperationnamepolicy.body.md",
"bodySha256": "0cadad363412a605015d57184e95714d3b02a90656fadd74f9000c66825f5a70",
"assets": [
{
"key": "a16-f004-graphqloperationnamepolicy",
"kind": "terminal"
},
{
"key": "a16-f004-graphqloperationnamepolicy-run",
"kind": "terminal"
}
]
},
"analysis-finding-a16-f005": {
"kind": "CASE",
"slug": "analysis-finding-a16-f005",
"title": "설정으로 정한 파서 한계가 graphql-java에 설치되지 않는다",
"topic": "graphql-surface",
"path": "case/case-analysis-finding-a16-f005.md",
"rootTreeNode": "case:analysis-finding-a16-f005",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "12d6fc6ff2b1c4412aea33965cd2b090165279d5d314ce065ef6bf04b7812700",
"lines": 87,
"body": "case/case-analysis-finding-a16-f005.body.md",
"bodySha256": "2839a6e7e6d380e7549e3492e8f9b13cb5a85cb249b6a39e315d9d5fcab654ca",
"assets": [
{
"key": "analysis-finding-a16-f005",
"kind": "terminal"
}
]
},
"analysis-finding-a16-f006": {
"kind": "CASE",
"slug": "analysis-finding-a16-f006",
"title": "프로파일별 정책 매니페스트가 미배선이라, 자격에서 해석된 프로파일이 아무 예산도 선택하지 않는다",
"topic": "graphql-surface",
"path": "case/case-analysis-finding-a16-f006.md",
"rootTreeNode": "case:analysis-finding-a16-f006",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "2390f7a8f6fd192e0066288178d90dcedb48a852629321a68da7dee28d2c151e",
"lines": 85,
"body": "case/case-analysis-finding-a16-f006.body.md",
"bodySha256": "b7cc4a67c2a216010ebc7c65f92e820875a20f4412240e6e63d07c7f400fd7b3",
"assets": [
{
"key": "analysis-finding-a16-f006",
"kind": "terminal"
}
]
},
"analysis-finding-a16-f008": {
"kind": "CASE",
"slug": "analysis-finding-a16-f008",
"title": "파싱·검증 실패에 플랫폼 매퍼가 없다",
"topic": "graphql-surface",
"path": "case/case-analysis-finding-a16-f008.md",
"rootTreeNode": "case:analysis-finding-a16-f008",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e37812c1cdad393c2b2d74d30e8d1181f6f6dc91ed959165dc464a566a49d1e0",
"lines": 63,
"body": "case/case-analysis-finding-a16-f008.body.md",
"bodySha256": "1b9de0b41339ebe76b921f8bebc8ff2ced5690c3a8a3ed0e7b9b0b34fada7375",
"assets": [
{
"key": "analysis-finding-a16-f008",
"kind": "terminal"
}
]
},
"analysis-finding-a16-f011": {
"kind": "CASE",
"slug": "analysis-finding-a16-f011",
"title": "기계가 읽는 능력 매니페스트와 사람이 읽는 등급표가 커서 서명에 대해 다르게 답한다",
"topic": "graphql-surface",
"path": "case/case-analysis-finding-a16-f011.md",
"rootTreeNode": "case:analysis-finding-a16-f011",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "1d904fe1c2eab7304a8bdc245571c61c0e47bef4db3028906b13d4236be3e07e",
"lines": 81,
"body": "case/case-analysis-finding-a16-f011.body.md",
"bodySha256": "a3fab50e72c01ec09c2355741a0b6690596caeca8e3a276e9b6b2d311fa66ff9",
"assets": [
{
"key": "analysis-finding-a16-f011",
"kind": "terminal"
}
]
},
"analysis-finding-a16-f012": {
"kind": "CASE",
"slug": "analysis-finding-a16-f012",
"title": "'\"기본 비활성\"은 존재하지 않는 스위치의 기본값을 서술한다'",
"topic": "graphql-surface",
"path": "case/case-analysis-finding-a16-f012.md",
"rootTreeNode": "case:analysis-finding-a16-f012",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "cb8f8c1f8f4d737dec754cfa387edff432baee3d3833500db19be3cc4049e4fe",
"lines": 81,
"body": "case/case-analysis-finding-a16-f012.body.md",
"bodySha256": "1de78628cd2d7267eb4906fbdb1ebad35fe6778b528701b1db13b11130023142",
"assets": [
{
"key": "analysis-finding-a16-f012",
"kind": "terminal"
}
]
},
"a17-f002-stomp": {
"kind": "CASE",
"slug": "a17-f002-stomp",
"title": "연결 티켓·origin 정책·메시지 권한·연결 예산이 요청 경로 밖이고, 그중 일부는 STOMP 어댑터가 다른 방식으로 대체한다",
"topic": "websocket-and-realtime",
"path": "case/case-a17-f002-stomp.md",
"rootTreeNode": "case:a17-f002-stomp",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0e3d018c6adf60d3a62c9245f232c2a67d04f2466f4060f56fd18ede5987cb7a",
"lines": 76,
"body": "case/case-a17-f002-stomp.body.md",
"bodySha256": "a8ce2d02437de07666d6bfa47f31071fd07951f9f3d4f33862c387ed4b485579",
"assets": [
{
"key": "a17-f002-stomp",
"kind": "terminal"
}
]
},
"analysis-finding-a17-f003": {
"kind": "CASE",
"slug": "analysis-finding-a17-f003",
"title": "능력 프로퍼티 이름을 만드는 코드와 실제 게이트가 다른 접두사를 쓴다",
"topic": "websocket-and-realtime",
"path": "case/case-analysis-finding-a17-f003.md",
"rootTreeNode": "case:analysis-finding-a17-f003",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5f795ec51bf7ae62cf2a36556106dedd3311e3b86c386b0fa746026ae5b8ccb4",
"lines": 63,
"body": "case/case-analysis-finding-a17-f003.body.md",
"bodySha256": "65fd6ee4691c58f23c4dae7b72b72d4eab8b7ce20a8843af8e37275abc8f34cd",
"assets": [
{
"key": "analysis-finding-a17-f003",
"kind": "terminal"
}
]
},
"analysis-finding-a18-f001": {
"kind": "CASE",
"slug": "analysis-finding-a18-f001",
"title": "출하되는 web 어댑터의 스위치가 활성화 모델 밖에 있다",
"topic": "composition-root-and-bootstrap",
"path": "case/case-analysis-finding-a18-f001.md",
"rootTreeNode": "case:analysis-finding-a18-f001",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "77b29c91e9c05cccce50cb3ecde8cafacd96b04f2bc1c2c8319c6ebbfe2084d4",
"lines": 79,
"body": "case/case-analysis-finding-a18-f001.body.md",
"bodySha256": "5d8a36f85328e07eb73254f804516739d9086993e3cd6f29dc5feb4e3aab0b14",
"assets": [
{
"key": "analysis-finding-a18-f001",
"kind": "terminal"
}
]
},
"analysis-finding-a18-f002": {
"kind": "CASE",
"slug": "analysis-finding-a18-f002",
"title": "실패는 환경 원인이며, 그 테스트의 도구 가드가 불완전하다",
"topic": "composition-root-and-bootstrap",
"path": "case/case-analysis-finding-a18-f002.md",
"rootTreeNode": "case:analysis-finding-a18-f002",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "eb336462167481314ff426ce884c6a22fd60ba958033d73c1bc737e955057c3a",
"lines": 80,
"body": "case/case-analysis-finding-a18-f002.body.md",
"bodySha256": "1e1ab278d2ad0b6546f3702d276454b15c7d9382852cd73bc0d0703229edb3c3",
"assets": [
{
"key": "analysis-finding-a18-f002",
"kind": "terminal"
}
]
},
"analysis-finding-a19-f001": {
"kind": "CASE",
"slug": "analysis-finding-a19-f001",
"title": "capability 12개 중 main 코드가 읽는 것은 3개, 거부하는 것은 1개",
"topic": "messaging-and-outbox",
"path": "case/case-analysis-finding-a19-f001.md",
"rootTreeNode": "case:analysis-finding-a19-f001",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "c57ff9587d2e31658fcba59e2d665c379c00a26589263a23b9f8b89a4edfc7c0",
"lines": 79,
"body": "case/case-analysis-finding-a19-f001.body.md",
"bodySha256": "dcd40fc0b1a41abb7d6f4d9cba2e74fd79c591155462c890aff63ceaee6d32fc",
"assets": [
{
"key": "analysis-finding-a19-f001",
"kind": "terminal"
}
]
},
"analysis-finding-a19-f002": {
"kind": "CASE",
"slug": "analysis-finding-a19-f002",
"title": "8개 profile validator 중 조립에서 실행되는 것은 3개",
"topic": "messaging-and-outbox",
"path": "case/case-analysis-finding-a19-f002.md",
"rootTreeNode": "case:analysis-finding-a19-f002",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e161f236cde71c01af18507cb1f2aca99ab156017b1c83e3275452e1d2eb742f",
"lines": 80,
"body": "case/case-analysis-finding-a19-f002.body.md",
"bodySha256": "3136aa37fecfb12d05312e3f387b12c6b70f5beff568b5d2d0ebb0ec1a389410",
"assets": [
{
"key": "analysis-finding-a19-f002",
"kind": "terminal"
}
]
},
"a19-f003-messaging-reliability-api": {
"kind": "CASE",
"slug": "a19-f003-messaging-reliability-api",
"title": "messaging-reliability-api는 main 13파일 · 817 LOC에 테스트가 0개다",
"topic": "messaging-and-outbox",
"path": "case/case-a19-f003-messaging-reliability-api.md",
"rootTreeNode": "case:a19-f003-messaging-reliability-api",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "ba244f88edb4294a3ddde43be48cb422939ba4169e2783f5a5e43b51ebc6900a",
"lines": 73,
"body": "case/case-a19-f003-messaging-reliability-api.body.md",
"bodySha256": "a1eee6852a9414359a2a35aec42ab79b25d098d8f04f7faa46a37c207a617818",
"assets": [
{
"key": "a19-f003-messaging-reliability-api",
"kind": "terminal"
}
]
},
"analysis-finding-a19-f004": {
"kind": "CASE",
"slug": "analysis-finding-a19-f004",
"title": "스키마 호환성 검증기는 출하 leaf에 있고, main 코드에서 호출되지 않는다",
"topic": "messaging-and-outbox",
"path": "case/case-analysis-finding-a19-f004.md",
"rootTreeNode": "case:analysis-finding-a19-f004",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "6af289628489f82a1a67c7c496a596db1c60cca789bbed391da94a8c19d5b534",
"lines": 90,
"body": "case/case-analysis-finding-a19-f004.body.md",
"bodySha256": "ea77d9bc19f1f36bd5dac46bfb4a2818d5a34e27e766c8bb21a2f82ab9c555ae",
"assets": [
{
"key": "analysis-finding-a19-f004",
"kind": "terminal"
}
]
},
"analysis-finding-a19-f005": {
"kind": "CASE",
"slug": "analysis-finding-a19-f005",
"title": "호환성 게이트를 가진 두 포맷은 build-only이고, 출하되는 유일한 코덱에는 게이트가 없다",
"topic": "messaging-and-outbox",
"path": "case/case-analysis-finding-a19-f005.md",
"rootTreeNode": "case:analysis-finding-a19-f005",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "48ec4006d33322c3c9edb58ff748434cf7ea52356766dbd0db31def4c14a1a8e",
"lines": 79,
"body": "case/case-analysis-finding-a19-f005.body.md",
"bodySha256": "f379409a8147c774a46cdd105e1164fc336e97a14c32da4ec7a54c82b776d7ee",
"assets": [
{
"key": "analysis-finding-a19-f005",
"kind": "terminal"
}
]
},
"a19-f006-messaging-cloudevents": {
"kind": "CASE",
"slug": "a19-f006-messaging-cloudevents",
"title": "messaging-cloudevents는 출하 leaf이고 starter의 의존이며 소비자가 없다",
"topic": "messaging-and-outbox",
"path": "case/case-a19-f006-messaging-cloudevents.md",
"rootTreeNode": "case:a19-f006-messaging-cloudevents",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5e71d4d2215aeebb641c8cfc4fdac3d6046960e1cd327b2be5005b90097b2293",
"lines": 72,
"body": "case/case-a19-f006-messaging-cloudevents.body.md",
"bodySha256": "a87c4d27ecad1b0caf8989a7e04f841e9bac99f97ef93375c025e6bb5e58add6",
"assets": [
{
"key": "a19-f006-messaging-cloudevents",
"kind": "terminal"
}
]
},
"a19-f008-acl": {
"kind": "CASE",
"slug": "a19-f008-acl",
"title": "브로커 ACL 매니페스트의 자기 점검이 존재하지 않는다",
"topic": "messaging-and-outbox",
"path": "case/case-a19-f008-acl.md",
"rootTreeNode": "case:a19-f008-acl",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "906c4847c0afde55e49ed8875601d4e21f9bd4701b9550ad1f7a8187a8709fb0",
"lines": 72,
"body": "case/case-a19-f008-acl.body.md",
"bodySha256": "3f42c4ac3f2d6e5ac240e6867f84ca6f89cbeaed2fa76344f9dd0c5d53a3816e",
"assets": [
{
"key": "a19-f008-acl",
"kind": "terminal"
}
]
},
"analysis-finding-a19-f009": {
"kind": "CASE",
"slug": "analysis-finding-a19-f009",
"title": "접근 검사가 두 갈래로 존재하고, 조립된 쪽이 진단이 약한 쪽이다 (§8.3)",
"topic": "messaging-and-outbox",
"path": "case/case-analysis-finding-a19-f009.md",
"rootTreeNode": "case:analysis-finding-a19-f009",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "26bb657ab0a6069d32fb3da2cb71afebab4ce8016688b05bd1e8fa0954495555",
"lines": 81,
"body": "case/case-analysis-finding-a19-f009.body.md",
"bodySha256": "15ec30471e64fd468753e48cac86458a423740af43c45b1886a7717e6db6f77e",
"assets": [
{
"key": "analysis-finding-a19-f009",
"kind": "terminal"
}
]
},
"analysis-finding-a19-f013": {
"kind": "CASE",
"slug": "analysis-finding-a19-f013",
"title": "가족 권위 문서가 이미 정정한 build-only 문장이 지원 매트릭스에 남아 있다",
"topic": "messaging-and-outbox",
"path": "case/case-analysis-finding-a19-f013.md",
"rootTreeNode": "case:analysis-finding-a19-f013",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5b103fbd8fc84a00c366dfefd7fa3f8297228208c5be991c4cfe1a2e0e652a66",
"lines": 77,
"body": "case/case-analysis-finding-a19-f013.body.md",
"bodySha256": "020997598f99204055e831202117082b883cd6626e93fb188fc47f4f267ee734",
"assets": [
{
"key": "analysis-finding-a19-f013",
"kind": "terminal"
}
]
},
"a19-f014-kafka-msg": {
"kind": "CASE",
"slug": "a19-f014-kafka-msg",
"title": "Kafka 스택이 둘이고, 브로커 이름만 주면 기동이 실패한다",
"topic": "messaging-and-outbox",
"path": "case/case-a19-f014-kafka-msg.md",
"rootTreeNode": "case:a19-f014-kafka-msg",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0008f0bbf60803460bebd30fdb33e953a05ff50c67c14e3a9b29ad6ee389049d",
"lines": 73,
"body": "case/case-a19-f014-kafka-msg.body.md",
"bodySha256": "da3e7a7cb2199b7ae42d4da64545dcf28ae2e2948826214b541eca2f67ccd6eb",
"assets": [
{
"key": "a19-f014-kafka-msg",
"kind": "terminal"
},
{
"key": "a19-f014-kafka-msg-probe",
"kind": "terminal"
}
]
},
"a19-f015-compatibilitymatrix-extension": {
"kind": "CASE",
"slug": "a19-f015-compatibilitymatrix-extension",
"title": "CompatibilityMatrix 의 EXTENSION 등급을 쓰는 항목이 없다",
"topic": "messaging-and-outbox",
"path": "case/case-a19-f015-compatibilitymatrix-extension.md",
"rootTreeNode": "case:a19-f015-compatibilitymatrix-extension",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "03af50da8a91397bfac043a3bbed8ced2eb6d7f804ec1eb139822facf56b9d48",
"lines": 71,
"body": "case/case-a19-f015-compatibilitymatrix-extension.body.md",
"bodySha256": "0fd0d7e8aa38b4d6e64c064f18de428da55a3c849f52ab43d2ae5c8433d85c87",
"assets": [
{
"key": "a19-f015-compatibilitymatrix-extension",
"kind": "terminal"
}
]
},
"analysis-finding-a19-f018": {
"kind": "CASE",
"slug": "analysis-finding-a19-f018",
"title": "claim-check는 starter에 배선 코드가 한 줄도 없다",
"topic": "messaging-and-outbox",
"path": "case/case-analysis-finding-a19-f018.md",
"rootTreeNode": "case:analysis-finding-a19-f018",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "addb14a742d275bcccfa9cd4bed08e70c0ad66727ea1fbf2e0dd4a02be5ed8ae",
"lines": 79,
"body": "case/case-analysis-finding-a19-f018.body.md",
"bodySha256": "704a284dc33d08ce85d5bcd7788e7880fdc72b09196db897f2b0f362d3d92d6b",
"assets": [
{
"key": "analysis-finding-a19-f018",
"kind": "terminal"
}
]
},
"analysis-finding-a19-f019": {
"kind": "CASE",
"slug": "analysis-finding-a19-f019",
"title": "admin 스위치가 가드를 켜고 서비스는 켜지 않는다",
"topic": "messaging-and-outbox",
"path": "case/case-analysis-finding-a19-f019.md",
"rootTreeNode": "case:analysis-finding-a19-f019",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "108ff0481719e4797050b6cb73d13b14cae0edc1a5a616ded08e7dc7b5fdac8a",
"lines": 96,
"body": "case/case-analysis-finding-a19-f019.body.md",
"bodySha256": "6c588450a74facb6eb119138ca5829b0fb7130138f97fd81d3c0e4670a77f489",
"assets": [
{
"key": "analysis-finding-a19-f019",
"kind": "terminal"
}
]
},
"a19-f020-messaging-admin-api": {
"kind": "CASE",
"slug": "a19-f020-messaging-admin-api",
"title": "messaging-admin-api 의 시험 한 파일이 아홉을 담고 만료까지 단언한다",
"topic": "messaging-and-outbox",
"path": "case/case-a19-f020-messaging-admin-api.md",
"rootTreeNode": "case:a19-f020-messaging-admin-api",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "466ccc470003939ebeb5e5e7af2b42c19d296b2a85b37a3a3f23ff0723c80cc5",
"lines": 74,
"body": "case/case-a19-f020-messaging-admin-api.body.md",
"bodySha256": "22c0792999bc8beec08498d39e02468fd97c6ee31b722ac949c6867e4f191831",
"assets": [
{
"key": "a19-f020-messaging-admin-api",
"kind": "terminal"
}
]
},
"a19-f022-messagingpublicsurfacecontracttest": {
"kind": "CASE",
"slug": "a19-f022-messagingpublicsurfacecontracttest",
"title": "공개 표면 계약 시험이 가족 밖 app-bootstrap 에 있다",
"topic": "messaging-and-outbox",
"path": "case/case-a19-f022-messagingpublicsurfacecontracttest.md",
"rootTreeNode": "case:a19-f022-messagingpublicsurfacecontracttest",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "4ad583e002178da087b2d784a5afb76af40b44efe740eb75721514eff2f483b4",
"lines": 71,
"body": "case/case-a19-f022-messagingpublicsurfacecontracttest.body.md",
"bodySha256": "89c5532b451874d2a6ad216be2dc1a56f8e15b691bd062a35e832c438904018d",
"assets": [
{
"key": "a19-f022-messagingpublicsurfacecontracttest",
"kind": "terminal"
}
]
},
"a20-f003-claude": {
"kind": "CASE",
"slug": "a20-f003-claude",
"title": "grpc 레인 시험 25개는 check 로 돌고, 레인만 거는 실행 0 검사는 돌지 않는다",
"topic": "grpc-and-streaming",
"path": "case/case-a20-f003-claude.md",
"rootTreeNode": "case:a20-f003-claude",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "1b0bf6da675ca75b3a0f6d03456a6c42b579993d249c78624cc809da1470cd87",
"lines": 78,
"body": "case/case-a20-f003-claude.body.md",
"bodySha256": "c7a263db0309aa6fb6a86cc70d6a42768b52e0992b3ddf2cf026fa802cfd8e9d",
"assets": [
{
"key": "a20-f003-claude",
"kind": "terminal"
}
]
},
"analysis-finding-a20-f004": {
"kind": "CASE",
"slug": "analysis-finding-a20-f004",
"title": "조립 경계가 정책 객체 9개를 만들고 서버를 만들지 않는다",
"topic": "grpc-and-streaming",
"path": "case/case-analysis-finding-a20-f004.md",
"rootTreeNode": "case:analysis-finding-a20-f004",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "61dead63a76e99003ca9fc578ac3086b29055e3c79aef6575294e34c2251effa",
"lines": 72,
"body": "case/case-analysis-finding-a20-f004.body.md",
"bodySha256": "4956abf22e30445d854324d249faf1a5a84810831d18e417731ec856bf8abc21",
"assets": [
{
"key": "analysis-finding-a20-f004",
"kind": "terminal"
}
]
},
"analysis-finding-a20-f005": {
"kind": "CASE",
"slug": "analysis-finding-a20-f005",
"title": "저장소 어디에도 참조가 없는 타입 3개",
"topic": "grpc-and-streaming",
"path": "case/case-analysis-finding-a20-f005.md",
"rootTreeNode": "case:analysis-finding-a20-f005",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f80c38c8481e17f1dce680ae479ef20592987240261a9b2b1edd8a4d16edfd1f",
"lines": 77,
"body": "case/case-analysis-finding-a20-f005.body.md",
"bodySha256": "69d1dab7350e8c6b3b79de96fbea66c20e1c66577848b16a8820f16124bd0c0b",
"assets": [
{
"key": "analysis-finding-a20-f005",
"kind": "terminal"
}
]
},
"a20-f006-grpcadmissioncontroller-tryadmit": {
"kind": "CASE",
"slug": "a20-f006-grpcadmissioncontroller-tryadmit",
"title": "승격이 상한 필드를 읽지 않고, 세 승인 메서드의 main 호출자가 0 이다",
"topic": "grpc-and-streaming",
"path": "case/case-a20-f006-grpcadmissioncontroller-tryadmit.md",
"rootTreeNode": "case:a20-f006-grpcadmissioncontroller-tryadmit",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "68a825bf936171cb78222a3a1611f757512becaeb24e9fa55c9ddfd5ece24ccb",
"lines": 74,
"body": "case/case-a20-f006-grpcadmissioncontroller-tryadmit.body.md",
"bodySha256": "885ecee5544fa911e7918149e69acfe73ddc3f7e2c03a4e792215b2f4e2a50ce",
"assets": [
{
"key": "a20-f006-grpcadmissioncontroller-tryadmit",
"kind": "terminal"
}
]
},
"a20-f007-grpcstreamadmission": {
"kind": "CASE",
"slug": "a20-f007-grpcstreamadmission",
"title": "GrpcStreamAdmission 의 호출자 맵이 줄지 않고 main 소비자는 0 이다",
"topic": "grpc-and-streaming",
"path": "case/case-a20-f007-grpcstreamadmission.md",
"rootTreeNode": "case:a20-f007-grpcstreamadmission",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "06e87b6480039e09d84c12fb422898a2633f431c7d9a30a56bc3bc2c45645a07",
"lines": 75,
"body": "case/case-a20-f007-grpcstreamadmission.body.md",
"bodySha256": "3d758a5d1304f2fd0e2f225eab1ae20459df018570aa2df0dd9ce8e7a986b050",
"assets": [
{
"key": "a20-f007-grpcstreamadmission",
"kind": "terminal"
}
]
},
"a20-f008-grpcserializedstreamwriter-drop-oldest": {
"kind": "CASE",
"slug": "a20-f008-grpcserializedstreamwriter-drop-oldest",
"title": "GrpcSerializedStreamWriter 가 버린 봉투 대신 들어오는 크기를 뺀다",
"topic": "grpc-and-streaming",
"path": "case/case-a20-f008-grpcserializedstreamwriter-drop-oldest.md",
"rootTreeNode": "case:a20-f008-grpcserializedstreamwriter-drop-oldest",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "860fbdf81afcd30cfc01aebf91a29492f38685f2a33b99b336d604127c31fd5f",
"lines": 78,
"body": "case/case-a20-f008-grpcserializedstreamwriter-drop-oldest.body.md",
"bodySha256": "c25b115d079877a38479030895a35424bde52c8f1b886e00ad868c50efb5114f",
"assets": [
{
"key": "a20-f008-grpcserializedstreamwriter-drop-oldest",
"kind": "terminal"
}
]
},
"a20-f010-grpcoutcomereplay": {
"kind": "CASE",
"slug": "a20-f010-grpcoutcomereplay",
"title": "GrpcOutcomeReplay 의 맵에 put·get·size 뿐이고 부르는 코드도 없다",
"topic": "grpc-and-streaming",
"path": "case/case-a20-f010-grpcoutcomereplay.md",
"rootTreeNode": "case:a20-f010-grpcoutcomereplay",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "7e786618f3b088244fa05fa70428c0f99ba5093bb6a7c27a676a9dda033d1900",
"lines": 77,
"body": "case/case-a20-f010-grpcoutcomereplay.body.md",
"bodySha256": "24c01c94fcc2462e524961ae536be160ac287f31bfd642c45f969cc36336c775",
"assets": [
{
"key": "a20-f010-grpcoutcomereplay",
"kind": "terminal"
}
]
},
"a20-f011-grpccompletionreconciler-arraylist": {
"kind": "CASE",
"slug": "a20-f011-grpccompletionreconciler-arraylist",
"title": "GrpcCompletionReconciler 의 pending 만 잠금 없는 ArrayList 다",
"topic": "grpc-and-streaming",
"path": "case/case-a20-f011-grpccompletionreconciler-arraylist.md",
"rootTreeNode": "case:a20-f011-grpccompletionreconciler-arraylist",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e405906043cd9f58e86a30ec44a7029215bc9e4c033a0c00fc116d0cc83c656c",
"lines": 74,
"body": "case/case-a20-f011-grpccompletionreconciler-arraylist.body.md",
"bodySha256": "827b67e405ed0d39ebefae6f386f6e29a35ce81bdc0912829b6223c209866242",
"assets": [
{
"key": "a20-f011-grpccompletionreconciler-arraylist",
"kind": "terminal"
}
]
},
"performance-and-capacity-unmeasured": {
"kind": "QUESTION",
"slug": "performance-and-capacity-unmeasured",
"title": "실제 성능·용량 특성을 어떤 모듈에서도 측정하지 않았다",
"topic": "multitenancy-isolation",
"path": "openquestion/openquestion-performance-and-capacity-unmeasured.md",
"rootTreeNode": "open-question:performance-and-capacity-unmeasured",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "cb98a784acca3645e4b79045d63b6335d914ded5dbbfa9266b78d1fd4783e014",
"lines": 78
},
"three-sources-of-a-capability-answer": {
"kind": "CONCEPT",
"slug": "three-sources-of-a-capability-answer",
"title": "능력 선언의 세 출처와 그것이 파생되지 않을 때",
"topic": "capability-declaration-vs-proof",
"path": "concept/concept-three-sources-of-a-capability-answer.md",
"rootTreeNode": "concept:three-sources-of-a-capability-answer",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "9e64225d3c05a6af6d65a4ec0a57df224c120d509e2345af3281a7c887ee89ac",
"lines": 57,
"body": "concept/concept-three-sources-of-a-capability-answer.body.md",
"bodySha256": "ef7419d2d9e4cc61f766913b0f8045724a2000b02947480590033175e2520708",
"assets": [
{
"key": "three-sources-of-a-capability-answer-diagram",
"kind": "diagram"
},
{
"key": "three-sources-of-a-capability-answer",
"kind": "terminal"
}
]
},
"a-transaction-capability-true-and-its-validator-never-run": {
"kind": "CASE",
"slug": "a-transaction-capability-true-and-its-validator-never-run",
"title": "브로커 트랜잭션을 무조건 참으로 선언하고, 그 조건을 검사하는 검증기는 기동 시 돌지 않는다",
"topic": "capability-declaration-vs-proof",
"path": "case/case-a-transaction-capability-true-and-its-validator-never-run.md",
"rootTreeNode": "case:a-transaction-capability-true-and-its-validator-never-run",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d5f7a9d06eb5fc557abda4d90cf519f1d3086adc8bce397436e8a23b5dc45e6e",
"lines": 63,
"body": "case/case-a-transaction-capability-true-and-its-validator-never-run.body.md",
"bodySha256": "b243ac6b286a4f835e42e11e535f9e8ac1b824aba81abaa1f758891c3c571d99",
"assets": [
{
"key": "a-transaction-capability-true-and-its-validator-never-run",
"kind": "terminal"
}
]
},
"a-delayed-delivery-flag-without-the-topology-that-delivers-it": {
"kind": "CASE",
"slug": "a-delayed-delivery-flag-without-the-topology-that-delivers-it",
"title": "지연 배달을 참으로 선언하는데 그 지연을 제공할 토폴로지가 조립되지 않는다",
"topic": "capability-declaration-vs-proof",
"path": "case/case-a-delayed-delivery-flag-without-the-topology-that-delivers-it.md",
"rootTreeNode": "case:a-delayed-delivery-flag-without-the-topology-that-delivers-it",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e026070983496cd02fb98c201c9d07a5ed5f6689a8f8fe80642a34c1d22dc3f8",
"lines": 54,
"body": "case/case-a-delayed-delivery-flag-without-the-topology-that-delivers-it.body.md",
"bodySha256": "ad2f95b6c5a4752100310d53b7a5e2644c80bbc31742ab3b40c4bd1e85e0db96",
"assets": [
{
"key": "a-delayed-delivery-flag-without-the-topology-that-delivers-it",
"kind": "terminal"
}
]
},
"the-transport-and-the-validator-answer-differently": {
"kind": "CASE",
"slug": "the-transport-and-the-validator-answer-differently",
"title": "같은 어댑터의 능력을 전송과 검증기가 다르게 답하고, 런타임이 쓰는 쪽이 record 의 의미와 어긋난다",
"topic": "capability-declaration-vs-proof",
"path": "case/case-the-transport-and-the-validator-answer-differently.md",
"rootTreeNode": "case:the-transport-and-the-validator-answer-differently",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "9069b54179280d68778bb5b3afb905f8f8a9113b9e4a3545842a0d6c76acb900",
"lines": 66,
"body": "case/case-the-transport-and-the-validator-answer-differently.body.md",
"bodySha256": "2956c9f89d53d7fea3c42a852d5e37ae47a7c42b4a5a906e00fe3a31b13e3def",
"assets": [
{
"key": "the-transport-and-the-validator-answer-differently",
"kind": "terminal"
}
]
},
"the-support-matrix-says-nothing-is-deployed-and-eighteen-are": {
"kind": "CASE",
"slug": "the-support-matrix-says-nothing-is-deployed-and-eighteen-are",
"title": "운영자용 지원 매트릭스가 런타임 편입을 반대로 적고, 틀린 쪽이 옳은 쪽을 권위로 지목한다",
"topic": "capability-declaration-vs-proof",
"path": "case/case-the-support-matrix-says-nothing-is-deployed-and-eighteen-are.md",
"rootTreeNode": "case:the-support-matrix-says-nothing-is-deployed-and-eighteen-are",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "014e01848d913b810996cf8d8e829acfeeaa05b9835ee50912eff68b3e994d48",
"lines": 60,
"body": "case/case-the-support-matrix-says-nothing-is-deployed-and-eighteen-are.body.md",
"bodySha256": "5d4ff8205eb855bba591f1333b087600c4acc794f38baac37cbfe3f5d7872410",
"assets": [
{
"key": "the-support-matrix-says-nothing-is-deployed-and-eighteen-are",
"kind": "terminal"
}
]
},
"a-capability-constant-must-derive-from-the-profile": {
"kind": "REFERENCE",
"slug": "a-capability-constant-must-derive-from-the-profile",
"title": "능력 선언은 프로파일에서 파생되어야 하고 상수는 그것을 할 수 없다",
"topic": "capability-declaration-vs-proof",
"path": "reference/reference-a-capability-constant-must-derive-from-the-profile.md",
"rootTreeNode": "reference:a-capability-constant-must-derive-from-the-profile",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "7162adfde89ef786833ed8846a269785e255deb133711b8d7e1fe633b2d6c7fb",
"lines": 57
},
"the-weight-of-a-flag-is-set-by-the-code-that-reads-it": {
"kind": "REFERENCE",
"slug": "the-weight-of-a-flag-is-set-by-the-code-that-reads-it",
"title": "능력 플래그의 무게는 그것을 읽는 코드가 정한다",
"topic": "capability-declaration-vs-proof",
"path": "reference/reference-the-weight-of-a-flag-is-set-by-the-code-that-reads-it.md",
"rootTreeNode": "reference:the-weight-of-a-flag-is-set-by-the-code-that-reads-it",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "2266cc72396fe2571d167f59bcd3cd9c745af369467fb2b7c25610f3a1ac7289",
"lines": 55
},
"check-then-act-on-atomic-types": {
"kind": "CONCEPT",
"slug": "check-then-act-on-atomic-types",
"title": "원자 타입 위의 검사 후 실행과 비교 후 교체 루프",
"topic": "non-atomic-check-then-act",
"path": "concept/concept-check-then-act-on-atomic-types.md",
"rootTreeNode": "concept:check-then-act-on-atomic-types",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0a3a6be558ee2129a26644b9571ac290174438eba9d9dc26e1c84d5ab33254cf",
"lines": 53,
"body": "concept/concept-check-then-act-on-atomic-types.body.md",
"bodySha256": "48056ea6a2d283e3a8a292df497936a6c7227d5f24cd8aa059132aea6adbd899",
"assets": [
{
"key": "check-then-act-on-atomic-types-diagram",
"kind": "diagram"
},
{
"key": "check-then-act-on-atomic-types",
"kind": "terminal"
}
]
},
"a-rotation-that-overwrites-and-a-generation-that-cannot-be-reclaimed": {
"kind": "CASE",
"slug": "a-rotation-that-overwrites-and-a-generation-that-cannot-be-reclaimed",
"title": "회전이 비교 후 교체가 아니라 덮어쓰기이고, 세대 계수기는 음수가 되면 회수되지 않는다",
"topic": "non-atomic-check-then-act",
"path": "case/case-a-rotation-that-overwrites-and-a-generation-that-cannot-be-reclaimed.md",
"rootTreeNode": "case:a-rotation-that-overwrites-and-a-generation-that-cannot-be-reclaimed",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d669edecbc7e3dd1f4d91239ce2eef6826dfd7643cd1e4eb1bf1010e1c12efbc",
"lines": 63,
"body": "case/case-a-rotation-that-overwrites-and-a-generation-that-cannot-be-reclaimed.body.md",
"bodySha256": "330c7fd110db12853333b524ebb884a3e3260e3dffcef1aca4f5618390d769b5",
"assets": [
{
"key": "a-rotation-that-overwrites-and-a-generation-that-cannot-be-reclaimed",
"kind": "terminal"
}
]
},
"an-admission-boundary-that-leaks-and-a-counter-that-cannot-return": {
"kind": "CASE",
"slug": "an-admission-boundary-that-leaks-and-a-counter-that-cannot-return",
"title": "queued 를 줄이는 유일한 연산이 상한을 읽지 않는 승격 안에 있다",
"topic": "non-atomic-check-then-act",
"path": "case/case-an-admission-boundary-that-leaks-and-a-counter-that-cannot-return.md",
"rootTreeNode": "case:an-admission-boundary-that-leaks-and-a-counter-that-cannot-return",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "76c22a38d2fb8e82f23967737cdf40c86af7b3b918822cd4bde3657cd7d44ece",
"lines": 77,
"body": "case/case-an-admission-boundary-that-leaks-and-a-counter-that-cannot-return.body.md",
"bodySha256": "c1d2f87966e1268455205d5d03aee30346031298a5449a4b844ad80a777db0d2",
"assets": [
{
"key": "an-admission-boundary-that-leaks-and-a-counter-that-cannot-return",
"kind": "terminal"
}
]
},
"draining-began-and-a-service-came-back-serving": {
"kind": "CASE",
"slug": "draining-began-and-a-service-came-back-serving",
"title": "배수를 시작한 뒤에도 한 서비스가 다시 SERVING 이 될 수 있다",
"topic": "non-atomic-check-then-act",
"path": "case/case-draining-began-and-a-service-came-back-serving.md",
"rootTreeNode": "case:draining-began-and-a-service-came-back-serving",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a5eda3302f7f605f6fb9adb824022b7040d89f92a6b305a17e4973b1e3c7c513",
"lines": 62,
"body": "case/case-draining-began-and-a-service-came-back-serving.body.md",
"bodySha256": "98fc8c10c693b98700b9721a2332cad485f77306b78e93b3552bbecf88d03243",
"assets": [
{
"key": "draining-began-and-a-service-came-back-serving",
"kind": "terminal"
}
]
},
"beginning-a-transition-and-the-set-it-covers-are-one-operation": {
"kind": "REFERENCE",
"slug": "beginning-a-transition-and-the-set-it-covers-are-one-operation",
"title": "전이를 시작하는 쓰기와 그 전이가 덮는 집합은 한 연산이어야 한다",
"topic": "non-atomic-check-then-act",
"path": "reference/reference-beginning-a-transition-and-the-set-it-covers-are-one-operation.md",
"rootTreeNode": "reference:beginning-a-transition-and-the-set-it-covers-are-one-operation",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f9debb6e3f9dd7a252cfda1737ca493fa6dce92ceaac82b8530ec54e8828f870",
"lines": 55
},
"bounded-and-unbounded-side-by-side": {
"kind": "CONCEPT",
"slug": "bounded-and-unbounded-side-by-side",
"title": "bounded 와 unbounded 오버로드를 나란히 둔 포트",
"topic": "retention-and-unbounded-growth",
"path": "concept/concept-bounded-and-unbounded-side-by-side.md",
"rootTreeNode": "concept:bounded-and-unbounded-side-by-side",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "8920e4944951b912b35153d4d0b43e4d345ddeb966ed2ebd881f9bba66194bc4",
"lines": 53,
"body": "concept/concept-bounded-and-unbounded-side-by-side.body.md",
"bodySha256": "0aba26a73f61b83ac4a0e73e6046f6ca565097974997060b8102e2b175a608b4",
"assets": [
{
"key": "bounded-and-unbounded-side-by-side-diagram",
"kind": "diagram"
},
{
"key": "bounded-and-unbounded-side-by-side",
"kind": "terminal"
}
]
},
"the-cleanup-that-causes-the-outage-it-prevents": {
"kind": "CASE",
"slug": "the-cleanup-that-causes-the-outage-it-prevents",
"title": "cleanup 이 스스로 막겠다고 적은 장애를 일으키는 형태로 호출된다",
"topic": "retention-and-unbounded-growth",
"path": "case/case-the-cleanup-that-causes-the-outage-it-prevents.md",
"rootTreeNode": "case:the-cleanup-that-causes-the-outage-it-prevents",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5ba72ad35b731cec841b93ad4d1e3a246798748081b92ea27044faa49cb8b056",
"lines": 67,
"body": "case/case-the-cleanup-that-causes-the-outage-it-prevents.body.md",
"bodySha256": "edf92f631ae63d6e6124511eb6b2562b9fe178ab8063e30e78bbff6947f90d52",
"assets": [
{
"key": "the-cleanup-that-causes-the-outage-it-prevents",
"kind": "terminal"
}
]
},
"a-replay-store-with-no-eviction-path": {
"kind": "CASE",
"slug": "a-replay-store-with-no-eviction-path",
"title": "재생 저장소에 제거 경로가 없고, 형제 맵의 상한은 세션 경계 하나다",
"topic": "retention-and-unbounded-growth",
"path": "case/case-a-replay-store-with-no-eviction-path.md",
"rootTreeNode": "case:a-replay-store-with-no-eviction-path",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "01c185eadc7d49d46dd8ed2883111db1a06abf8184e417db09635371a3405949",
"lines": 63,
"body": "case/case-a-replay-store-with-no-eviction-path.body.md",
"bodySha256": "160a2415f7eab0f959c127684e4bffab7a6097965715d0f5536f362133da96cc",
"assets": [
{
"key": "a-replay-store-with-no-eviction-path",
"kind": "terminal"
}
]
},
"a-port-that-offers-both-forms-has-chosen-the-unsafe-one": {
"kind": "REFERENCE",
"slug": "a-port-that-offers-both-forms-has-chosen-the-unsafe-one",
"title": "두 형태를 나란히 내놓는 포트는 이미 안전하지 않은 쪽을 고른 것이다",
"topic": "retention-and-unbounded-growth",
"path": "reference/reference-a-port-that-offers-both-forms-has-chosen-the-unsafe-one.md",
"rootTreeNode": "reference:a-port-that-offers-both-forms-has-chosen-the-unsafe-one",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5dccf01f7806f434bd9c195ce29eeeebcec22c5648075fcd7913dc3ad8736cac",
"lines": 53
},
"one-formula-and-one-enforcement-point-per-safety-rule": {
"kind": "REFERENCE",
"slug": "one-formula-and-one-enforcement-point-per-safety-rule",
"title": "같은 안전 규칙은 하나의 공식과 하나의 강제 시점을 갖는다",
"topic": "retention-and-unbounded-growth",
"path": "reference/reference-one-formula-and-one-enforcement-point-per-safety-rule.md",
"rootTreeNode": "reference:one-formula-and-one-enforcement-point-per-safety-rule",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "cc295bb986c6b42d32113f93b7353d8087c105bf5907e3b295e193063b6589bc",
"lines": 53
},
"the-eight-phase-shutdown-contract": {
"kind": "CONCEPT",
"slug": "the-eight-phase-shutdown-contract",
"title": "8단계 종료 순서 계약과 실제 종료 경로",
"topic": "drain-and-shutdown-ordering",
"path": "concept/concept-the-eight-phase-shutdown-contract.md",
"rootTreeNode": "concept:the-eight-phase-shutdown-contract",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "38e553e89e06a9bbe86a615efba3f66f62e79db1fc6c0ac7753768c178d3899b",
"lines": 55,
"body": "concept/concept-the-eight-phase-shutdown-contract.body.md",
"bodySha256": "824ce2465fa6c4f13690f5d2f3b7a4004bce14330e89e5e17d40318ba1e1d56c",
"assets": [
{
"key": "the-eight-phase-shutdown-contract",
"kind": "terminal"
},
{
"key": "the-eight-phase-shutdown-contract-diagram",
"kind": "diagram"
}
]
},
"an-order-contract-with-no-implementation": {
"kind": "CASE",
"slug": "an-order-contract-with-no-implementation",
"title": "순서 계약을 구현하는 것이 없고, 그것을 검증한다는 테스트는 enum 선언 순서만 본다",
"topic": "drain-and-shutdown-ordering",
"path": "case/case-an-order-contract-with-no-implementation.md",
"rootTreeNode": "case:an-order-contract-with-no-implementation",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d54a9d1a9adfb416b1c422b3f3225fd08300d29cc2394d8a3aae47423850b17d",
"lines": 73,
"body": "case/case-an-order-contract-with-no-implementation.body.md",
"bodySha256": "4b910215d37dba66aaa9911f1878ccea0704dfd6cce19a984cfd54a3e6622e6d",
"assets": [
{
"key": "an-order-contract-with-no-implementation",
"kind": "terminal"
}
]
},
"reject-new-admission-that-rejects-nothing": {
"kind": "CASE",
"slug": "reject-new-admission-that-rejects-nothing",
"title": "새 승인을 거절한다는 메서드가 단계만 기록하고 아무것도 거절하지 않는다",
"topic": "drain-and-shutdown-ordering",
"path": "case/case-reject-new-admission-that-rejects-nothing.md",
"rootTreeNode": "case:reject-new-admission-that-rejects-nothing",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "477fd9969ecd04c4823417a53c7c687f66cdd1bdb8ea0b517bec5fca23ae4476",
"lines": 58,
"body": "case/case-reject-new-admission-that-rejects-nothing.body.md",
"bodySha256": "b904f7989c825d2805950fc624d4d30ca3da9bbd632984c5ebe7b56af63b2808",
"assets": [
{
"key": "reject-new-admission-that-rejects-nothing",
"kind": "terminal"
}
]
},
"the-last-step-of-secret-erasure-is-not-wired": {
"kind": "CASE",
"slug": "the-last-step-of-secret-erasure-is-not-wired",
"title": "비밀을 힙에서 지우는 마지막 단계가 종료 경로에 연결되지 않았다",
"topic": "drain-and-shutdown-ordering",
"path": "case/case-the-last-step-of-secret-erasure-is-not-wired.md",
"rootTreeNode": "case:the-last-step-of-secret-erasure-is-not-wired",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "9264c0ebb1347be829ff24a16eae469d847a989587aa07c2b844fdce12061258",
"lines": 62,
"body": "case/case-the-last-step-of-secret-erasure-is-not-wired.body.md",
"bodySha256": "8a96866bc8fcb2bc275113e8f43d0db06d86ac2f6a40b5095ac1a592baebdabb",
"assets": [
{
"key": "the-last-step-of-secret-erasure-is-not-wired",
"kind": "terminal"
}
]
},
"a-declaration-order-test-is-a-gate-only-if-something-reads-that-order": {
"kind": "REFERENCE",
"slug": "a-declaration-order-test-is-a-gate-only-if-something-reads-that-order",
"title": "선언 순서를 단언하는 테스트는 그 순서를 읽는 코드가 있을 때만 게이트다",
"topic": "drain-and-shutdown-ordering",
"path": "reference/reference-a-declaration-order-test-is-a-gate-only-if-something-reads-that-order.md",
"rootTreeNode": "reference:a-declaration-order-test-is-a-gate-only-if-something-reads-that-order",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f094004878aa6f921b772473da0b736b93624b138379f3028d0d0fdfa47f4299",
"lines": 53
},
"a-fake-that-cannot-show-the-property-is-not-a-witness": {
"kind": "REFERENCE",
"slug": "a-fake-that-cannot-show-the-property-is-not-a-witness",
"title": "그 속성을 보일 수 없는 대역 위에서 통과한 테스트는 증인이 아니다",
"topic": "retention-and-unbounded-growth",
"path": "reference/reference-a-fake-that-cannot-show-the-property-is-not-a-witness.md",
"rootTreeNode": "reference:a-fake-that-cannot-show-the-property-is-not-a-witness",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f4b93ad571478bab7765dd16d454cd1dabfca0502492ca4f8c6a2eb6330d56df",
"lines": 55
},
"approval-verification-execution": {
"kind": "CONCEPT",
"slug": "approval-verification-execution",
"title": "승인·검증·실행의 분리와 그것을 타입으로 표현하기",
"topic": "operator-approval-and-destructive-operations",
"path": "concept/concept-approval-verification-execution.md",
"rootTreeNode": "concept:approval-verification-execution",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f68448aebcb1f5c5f76bceffb4188cb37af942d398c4ecc25d9f96291c9067ba",
"lines": 57,
"body": "concept/concept-approval-verification-execution.body.md",
"bodySha256": "8662bdaab68abbe082502f382dd1015a54d8229cbc1ab20ab27091876027d3d0",
"assets": [
{
"key": "approval-verification-execution-diagram",
"kind": "diagram"
},
{
"key": "approval-verification-execution",
"kind": "terminal"
}
]
},
"a-resumed-redrive-skips-what-it-could-not-move": {
"kind": "CASE",
"slug": "a-resumed-redrive-skips-what-it-could-not-move",
"title": "재개된 리드라이브가 옮기지 못한 메시지를 건너뛰고 성공으로 닫힌다",
"topic": "operator-approval-and-destructive-operations",
"path": "case/case-a-resumed-redrive-skips-what-it-could-not-move.md",
"rootTreeNode": "case:a-resumed-redrive-skips-what-it-could-not-move",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "8a97be3e33d36cca87b2ec4af7a21176183069febfee71cf9d2b5bfb63e9fe83",
"lines": 69,
"body": "case/case-a-resumed-redrive-skips-what-it-could-not-move.body.md",
"bodySha256": "94bc2275f2d56655565a047b3a68949a67f0c2f33c9b9529eb80648cd4e97e75",
"assets": [
{
"key": "a-resumed-redrive-skips-what-it-could-not-move",
"kind": "terminal"
}
]
},
"the-forgeable-approval-survived-on-the-irreversible-half": {
"kind": "CASE",
"slug": "the-forgeable-approval-survived-on-the-irreversible-half",
"title": "위조 가능한 승인이 하필 되돌릴 수 없는 작업 쪽에만 남았다",
"topic": "operator-approval-and-destructive-operations",
"path": "case/case-the-forgeable-approval-survived-on-the-irreversible-half.md",
"rootTreeNode": "case:the-forgeable-approval-survived-on-the-irreversible-half",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "69f95c9498911204766db71b0a1f970059e7bed6f30635acbb52e4e35291be39",
"lines": 65,
"body": "case/case-the-forgeable-approval-survived-on-the-irreversible-half.body.md",
"bodySha256": "4b6806a7b2d02ae0969d1e0ff218fa23b1330f1e98ad11f8c5bfb5fc0137f816",
"assets": [
{
"key": "the-forgeable-approval-survived-on-the-irreversible-half",
"kind": "terminal"
}
]
},
"blocking-means-startup-fails-and-nothing-runs-it": {
"kind": "CASE",
"slug": "blocking-means-startup-fails-and-nothing-runs-it",
"title": "BLOCKING 이면 기동이 실패한다는 보장이 어떤 배선에서도 실행되지 않는다",
"topic": "operator-approval-and-destructive-operations",
"path": "case/case-blocking-means-startup-fails-and-nothing-runs-it.md",
"rootTreeNode": "case:blocking-means-startup-fails-and-nothing-runs-it",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "ad33102b846ec3bf43fe62f67adb7e2bb36bf5125d528af0991aa6d42a2fe1ff",
"lines": 76,
"body": "case/case-blocking-means-startup-fails-and-nothing-runs-it.body.md",
"bodySha256": "9786917bd40bf9794e1efd34f3e8259357f6c0a3c0940959f82e2eb05aad2b91",
"assets": [
{
"key": "blocking-means-startup-fails-and-nothing-runs-it",
"kind": "terminal"
}
]
},
"signing-and-verifying-do-not-share-an-object": {
"kind": "REFERENCE",
"slug": "signing-and-verifying-do-not-share-an-object",
"title": "서명 능력과 검증 능력은 같은 객체에 두지 않는다",
"topic": "operator-approval-and-destructive-operations",
"path": "reference/reference-signing-and-verifying-do-not-share-an-object.md",
"rootTreeNode": "reference:signing-and-verifying-do-not-share-an-object",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "27fa24fa359bb186028709b98d37dacaca28060c8724027d7a2570876caa7d98",
"lines": 57
},
"resume-by-identity-not-by-index": {
"kind": "REFERENCE",
"slug": "resume-by-identity-not-by-index",
"title": "재개는 인덱스가 아니라 신원으로 한다",
"topic": "operator-approval-and-destructive-operations",
"path": "reference/reference-resume-by-identity-not-by-index.md",
"rootTreeNode": "reference:resume-by-identity-not-by-index",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "c1e1aebbb288cbac12640058f190c1ac649247a6724056f6481fc0808917ae9c",
"lines": 53
},
"an-authorization-denial-recorded-as-a-configuration-error": {
"kind": "CASE",
"slug": "an-authorization-denial-recorded-as-a-configuration-error",
"title": "브로커가 막으면 AUTHORIZATION, 플랫폼이 막으면 CONFIGURATION 이다",
"topic": "failure-category-across-adapters",
"path": "case/case-an-authorization-denial-recorded-as-a-configuration-error.md",
"rootTreeNode": "case:an-authorization-denial-recorded-as-a-configuration-error",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "94390abfdc8056a2db7ef54f268cd6c7c06c5b9938fbe63983c7ce5304c26aa0",
"lines": 73,
"body": "case/case-an-authorization-denial-recorded-as-a-configuration-error.body.md",
"bodySha256": "d6f9645df12b03d8c6a74c015c29a87dc23f895f13c10c9152f95b98be3b5184",
"assets": [
{
"key": "an-authorization-denial-recorded-as-a-configuration-error",
"kind": "terminal"
}
]
},
"a-closing-transport-reported-as-a-permanent-business-failure": {
"kind": "CASE",
"slug": "a-closing-transport-reported-as-a-permanent-business-failure",
"title": "종료 중이라는 사정이 업무의 영구 실패로 분류된다",
"topic": "failure-category-across-adapters",
"path": "case/case-a-closing-transport-reported-as-a-permanent-business-failure.md",
"rootTreeNode": "case:a-closing-transport-reported-as-a-permanent-business-failure",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "c278a866910533fc2ec9fa713e18907ca58b2ff43e19da5d4c35becf306bf4d2",
"lines": 54,
"body": "case/case-a-closing-transport-reported-as-a-permanent-business-failure.body.md",
"bodySha256": "12031be1e7527470f4ce163dc6eabdcfec4fb3b011a4c6f087de0e64b6b79735",
"assets": [
{
"key": "a-closing-transport-reported-as-a-permanent-business-failure",
"kind": "terminal"
}
]
},
"a-category-is-a-contract-between-retry-dlq-and-dashboard": {
"kind": "REFERENCE",
"slug": "a-category-is-a-contract-between-retry-dlq-and-dashboard",
"title": "실패 범주는 재시도·DLQ·대시보드 사이의 계약이다",
"topic": "failure-category-across-adapters",
"path": "reference/reference-a-category-is-a-contract-between-retry-dlq-and-dashboard.md",
"rootTreeNode": "reference:a-category-is-a-contract-between-retry-dlq-and-dashboard",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a28ec280c7f0c22bb2f438d4233e822a4451e03e7b8dbbb2a5b0163d27750944",
"lines": 53
},
"this-generations-circumstance-is-not-a-permanent-failure": {
"kind": "REFERENCE",
"slug": "this-generations-circumstance-is-not-a-permanent-failure",
"title": "이 세대의 사정은 업무의 영구 실패가 아니다",
"topic": "failure-category-across-adapters",
"path": "reference/reference-this-generations-circumstance-is-not-a-permanent-failure.md",
"rootTreeNode": "reference:this-generations-circumstance-is-not-a-permanent-failure",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "df1c763405ad7dbb284c5598a96b76f5d33d3cd7a2e6f94d8e1f3b5f268308e9",
"lines": 53
},
"grpc-advanced-diagnostics-f03": {
"kind": "CASE",
"slug": "grpc-advanced-diagnostics-f03",
"title": "\"실환경 증거\" 가 두 리프에 반씩 있고 서로 만나지 않는다",
"topic": "contract-domain-and-bounds",
"path": "case/case-grpc-advanced-diagnostics-f03.md",
"rootTreeNode": "case:grpc-advanced-diagnostics-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "12ecae59d0f4e13d24ec0af8dfb7addd5b81cc15b5c1b90284f1e0e55763d86a",
"lines": 59,
"body": "case/case-grpc-advanced-diagnostics-f03.body.md",
"bodySha256": "bdeba1717bc8c1c05a3a8ff620ff4bfdeaffb2ed60bc66f1f74f79ec2f2ad512",
"assets": [
{
"key": "grpc-advanced-diagnostics-f03",
"kind": "terminal"
}
]
},
"grpc-advanced-resilience-f02": {
"kind": "CASE",
"slug": "grpc-advanced-resilience-f02",
"title": "대체 선택기는 사용자 정의 선택기가 받는 보호를 받지 않는다",
"topic": "contract-domain-and-bounds",
"path": "case/case-grpc-advanced-resilience-f02.md",
"rootTreeNode": "case:grpc-advanced-resilience-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "153516cfdab4cfe0f58f954267599f76ba0503785729d0a1df9c5779ec07cb7d",
"lines": 51,
"body": "case/case-grpc-advanced-resilience-f02.body.md",
"bodySha256": "1f35574821c94f9bae9a4e97943e839c9e73595c8fa99d1effe341c49e1c3ae0",
"assets": [
{
"key": "grpc-advanced-resilience-f02",
"kind": "terminal"
}
]
},
"grpc-advanced-streaming-f01": {
"kind": "CASE",
"slug": "grpc-advanced-streaming-f01",
"title": "클래스가 비판한 무제한 증가를 형제 맵이 그대로 한다",
"topic": "contract-domain-and-bounds",
"path": "case/case-grpc-advanced-streaming-f01.md",
"rootTreeNode": "case:grpc-advanced-streaming-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "98ab8172fd5d59d15f13189dbde097e65569344d7b05dbb73f1f90ac69fd5bfd",
"lines": 59,
"body": "case/case-grpc-advanced-streaming-f01.body.md",
"bodySha256": "3b91ebcdbf3aa2851b548940a8d179cb8859ceffc14e7122c17549a1f9d1a869",
"assets": [
{
"key": "grpc-advanced-streaming-f01",
"kind": "terminal"
}
]
},
"grpc-advanced-streaming-f02": {
"kind": "CASE",
"slug": "grpc-advanced-streaming-f02",
"title": "클라이언트 스트림 정책의 네 상한 중 둘은 읽는 코드가 없다",
"topic": "contract-domain-and-bounds",
"path": "case/case-grpc-advanced-streaming-f02.md",
"rootTreeNode": "case:grpc-advanced-streaming-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a2e77d1fa2fe9e4a1ea5deda61fd4143b3f18cf3b546f8dcc63b62c2e56ea8ae",
"lines": 53,
"body": "case/case-grpc-advanced-streaming-f02.body.md",
"bodySha256": "9daee524c10184a2cb7cb4c4848978cc83862e750d84927a7f79e848a4695a9b",
"assets": [
{
"key": "grpc-advanced-streaming-f02",
"kind": "terminal"
}
]
},
"grpc-core-api-f05": {
"kind": "CASE",
"slug": "grpc-core-api-f05",
"title": "메타데이터 예산의 두 성분 중 하나는 강제되지 않고, 나머지 하나는 바이트가 아니라 문자를 센다",
"topic": "contract-domain-and-bounds",
"path": "case/case-grpc-core-api-f05.md",
"rootTreeNode": "case:grpc-core-api-f05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a1abe63c01de4ce8fc342c97ba8b0efbd4cf8861ee3ce435a9a2d20aebdd2957",
"lines": 59,
"body": "case/case-grpc-core-api-f05.body.md",
"bodySha256": "ad6d0fd73bfd2663cba910692f7ca31ffab7108ec8352cf0ddca41781bb63ad2",
"assets": [
{
"key": "grpc-core-api-f05",
"kind": "terminal"
}
]
},
"grpc-discovery-f01": {
"kind": "CASE",
"slug": "grpc-discovery-f01",
"title": "프로파일이 스트림 재접속 예산을 선언하는데 그것이 함의하는 DNS 갱신 주기를 정하지 않는다",
"topic": "contract-domain-and-bounds",
"path": "case/case-grpc-discovery-f01.md",
"rootTreeNode": "case:grpc-discovery-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d86c8f47dad88e4a821b9ac7aace2034a8c6e7aec716b961999e3f0da8474ffc",
"lines": 51,
"body": "case/case-grpc-discovery-f01.body.md",
"bodySha256": "4aa9bbc024c4e0d2e8f2d6a9ab4017b3a6534850c78b7a894e72bb8a632af7a3",
"assets": [
{
"key": "grpc-discovery-f01",
"kind": "terminal"
}
]
},
"grpc-operation-ledger-jpa-f01": {
"kind": "CASE",
"slug": "grpc-operation-ledger-jpa-f01",
"title": "낙관적 잠금 컬럼이 없어 전이 가드가 메모리 안에만 있다",
"topic": "contract-domain-and-bounds",
"path": "case/case-grpc-operation-ledger-jpa-f01.md",
"rootTreeNode": "case:grpc-operation-ledger-jpa-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "845eb1367c9651d29da2bb2d4b38ce6e877631e27d8ad11d933a37815a85e423",
"lines": 53,
"body": "case/case-grpc-operation-ledger-jpa-f01.body.md",
"bodySha256": "adaa6d1005f7048035b15fe07553255938a2c718246a4ad803a79fc53c66de7d",
"assets": [
{
"key": "grpc-operation-ledger-jpa-f01",
"kind": "terminal"
}
]
},
"messaging-claim-check-f05": {
"kind": "QUESTION",
"slug": "messaging-claim-check-f05",
"title": "보존 sweep이 없다",
"topic": "contract-domain-and-bounds",
"path": "openquestion/openquestion-messaging-claim-check-f05.md",
"rootTreeNode": "open-question:messaging-claim-check-f05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a90d1993f428f99c59413b770193653b9fc296134addb5f8776dfa965fc7b681",
"lines": 49
},
"messaging-core-api-f05": {
"kind": "CASE",
"slug": "messaging-core-api-f05",
"title": "WireSafeText의 규칙이 leaf 경계에서 멈춘다",
"topic": "contract-domain-and-bounds",
"path": "case/case-messaging-core-api-f05.md",
"rootTreeNode": "case:messaging-core-api-f05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "ada34e752e5f2c4bda5072825bd9ed206e7fef2c3d5a31b6f67c7b550231349b",
"lines": 49,
"body": "case/case-messaging-core-api-f05.body.md",
"bodySha256": "a479c4d7bd012a2d0e354460cf948ce48305e55aa27a36ed6ef3a6004a0f4352",
"assets": [
{
"key": "messaging-core-api-f05",
"kind": "terminal"
}
]
},
"messaging-inbox-jdbc-postgresql-f05": {
"kind": "REFERENCE",
"slug": "messaging-inbox-jdbc-postgresql-f05",
"title": "컬럼 폭은 애플리케이션 검증과 짝을 이룬다",
"topic": "contract-domain-and-bounds",
"path": "reference/reference-messaging-inbox-jdbc-postgresql-f05.md",
"rootTreeNode": "reference:messaging-inbox-jdbc-postgresql-f05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "292a22c03de427580d9df8384a99c3b1c629d14efb1cb226c855fd87c5c3498a",
"lines": 43
},
"messaging-inbox-jdbc-postgresql-f06": {
"kind": "REFERENCE",
"slug": "messaging-inbox-jdbc-postgresql-f06",
"title": "같은 안전 규칙은 한 공식과 한 강제 시점을 갖는다",
"topic": "contract-domain-and-bounds",
"path": "reference/reference-messaging-inbox-jdbc-postgresql-f06.md",
"rootTreeNode": "reference:messaging-inbox-jdbc-postgresql-f06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "131330efeccc38611fcf677f045c7c2e7e00499ed3fae32058e44b4a517252c1",
"lines": 43
},
"messaging-observability-f07": {
"kind": "CASE",
"slug": "messaging-observability-f07",
"title": "extract가 손상된 추적 헤더에 분류되지 않은 예외를 던진다",
"topic": "contract-domain-and-bounds",
"path": "case/case-messaging-observability-f07.md",
"rootTreeNode": "case:messaging-observability-f07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "be007e30b181b77c564705af38133f1ee6b357c513bc04967ceae48864bd950f",
"lines": 49,
"body": "case/case-messaging-observability-f07.body.md",
"bodySha256": "8863938be5a3affb54c18f275d0f7cf36c976d4286fb629bc1ddff6875547190",
"assets": [
{
"key": "messaging-observability-f07",
"kind": "terminal"
}
]
},
"messaging-reliability-api-f05": {
"kind": "CASE",
"slug": "messaging-reliability-api-f05",
"title": "inbox 보존 규칙이 문서로만 있다",
"topic": "contract-domain-and-bounds",
"path": "case/case-messaging-reliability-api-f05.md",
"rootTreeNode": "case:messaging-reliability-api-f05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "904de2a8e3510c91ebac5718a8418765f489211c96accdd90016f2ae8e2a4947",
"lines": 47,
"body": "case/case-messaging-reliability-api-f05.body.md",
"bodySha256": "97ae433b993790649b8915d804b111ecd860791750cd971dac6c263070e0275b",
"assets": [
{
"key": "messaging-reliability-api-f05",
"kind": "terminal"
}
]
},
"messaging-reliability-api-f08": {
"kind": "CASE",
"slug": "messaging-reliability-api-f08",
"title": "포트가 bounded/unbounded purge 두 오버로드를 나란히 노출하고, 호출자가 무제한 쪽을 고른다",
"topic": "contract-domain-and-bounds",
"path": "case/case-messaging-reliability-api-f08.md",
"rootTreeNode": "case:messaging-reliability-api-f08",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "2ec53c821e61f1a0581af09328f477c914e6a574272ecaf070c37b2030e1ec3e",
"lines": 47,
"body": "case/case-messaging-reliability-api-f08.body.md",
"bodySha256": "654a17e0178adbc7a60fedd85042b569751c0e87042805f7111cef81f526911a",
"assets": [
{
"key": "messaging-reliability-api-f08",
"kind": "terminal"
}
]
},
"grpc-advanced-compat-f01": {
"kind": "CASE",
"slug": "grpc-advanced-compat-f01",
"title": "통합 다리의 메타데이터 조립이 메타데이터 예산을 검사하지 않는다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-grpc-advanced-compat-f01.md",
"rootTreeNode": "case:grpc-advanced-compat-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "c98cb69e5e48124b2b398623f689cded385b57ae760da4cbd9facf30b36a30db",
"lines": 51,
"body": "case/case-grpc-advanced-compat-f01.body.md",
"bodySha256": "a2e77ba947fd61eae28d514c5450bcfdc145b58f234abe72b3780ec4f5695fb0",
"assets": [
{
"key": "grpc-advanced-compat-f01",
"kind": "terminal"
}
]
},
"grpc-core-api-f01": {
"kind": "CASE",
"slug": "grpc-core-api-f01",
"title": "정책 목록의 가장 강한 성질을 이 저장소에서는 쓸 수 없다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-grpc-core-api-f01.md",
"rootTreeNode": "case:grpc-core-api-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "da1157a3024f5933e740bf2922d6602c7ca8bf33c389480ecebaab4deb2e4f05",
"lines": 55,
"body": "case/case-grpc-core-api-f01.body.md",
"bodySha256": "66684cb3ca942785f5e601d68a3f23fd558b9d44267c188bd8bf3c48effb1d0f",
"assets": [
{
"key": "grpc-core-api-f01",
"kind": "terminal"
}
]
},
"grpc-observability-f01": {
"kind": "CASE",
"slug": "grpc-observability-f01",
"title": "queueHighWatermark 는 요구되고 검증되지만 아무도 읽지 않는다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-grpc-observability-f01.md",
"rootTreeNode": "case:grpc-observability-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "99d81e14659bd36d363f160b81861df30d5d7378b595347e99a369a62c81cfd2",
"lines": 55,
"body": "case/case-grpc-observability-f01.body.md",
"bodySha256": "1d59f4801e756fec4ea03f74145f7b711d46cfd1faef99cb49846b4745c5d16b",
"assets": [
{
"key": "grpc-observability-f01",
"kind": "terminal"
}
]
},
"grpc-policy-f07": {
"kind": "CASE",
"slug": "grpc-policy-f07",
"title": "clearAfterTask 는 합법 값이 하나뿐인 성분이고, 아무도 읽지 않는다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-grpc-policy-f07.md",
"rootTreeNode": "case:grpc-policy-f07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "13a61cee9babbe2ce1676d55627ccc400182b0785b5ad030cde673c0f96dac92",
"lines": 57,
"body": "case/case-grpc-policy-f07.body.md",
"bodySha256": "f5dcf6ee8a6297c98b61cca204864d07ef6d386e4ba969d06a4dd08787cc0e0e",
"assets": [
{
"key": "grpc-policy-f07",
"kind": "terminal"
}
]
},
"grpc-server-f03": {
"kind": "CASE",
"slug": "grpc-server-f03",
"title": "빌더 경로에서 순서 규칙 넷 중 셋이 발화할 수 없다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-grpc-server-f03.md",
"rootTreeNode": "case:grpc-server-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "7b5f8cf261d9ddded50792abf31784a759e8552a20f9affce0b5a5b8015701a9",
"lines": 53,
"body": "case/case-grpc-server-f03.body.md",
"bodySha256": "69406cf87aba5e92bb72cc8fadc0c221e1fe527c81610f36ee6e9c0a3ceb7467",
"assets": [
{
"key": "grpc-server-f03",
"kind": "terminal"
}
]
},
"grpc-spring-boot-starter-f01": {
"kind": "CASE",
"slug": "grpc-spring-boot-starter-f01",
"title": "시작 검증기가 시작 시 실행되지 않는다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-grpc-spring-boot-starter-f01.md",
"rootTreeNode": "case:grpc-spring-boot-starter-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "17f8f0b7b0cd363a978d991ac2a712e74bac75252f0fa7ad82810a87d575a404",
"lines": 59,
"body": "case/case-grpc-spring-boot-starter-f01.body.md",
"bodySha256": "4f2e5d11aa85798c6a13758111021bed8e9e17897e08005d223b7128d8a4fb6a",
"assets": [
{
"key": "grpc-spring-boot-starter-f01-diagram",
"kind": "diagram"
},
{
"key": "grpc-spring-boot-starter-f01",
"kind": "terminal"
}
]
},
"grpc-spring-boot-starter-f03": {
"kind": "CASE",
"slug": "grpc-spring-boot-starter-f03",
"title": "default-unary-deadline 은 읽는 코드가 저장소에 없다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-grpc-spring-boot-starter-f03.md",
"rootTreeNode": "case:grpc-spring-boot-starter-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "9e6d679796053968d8180447f69bb260f9572138fe6e350397ee82278a4902ac",
"lines": 49,
"body": "case/case-grpc-spring-boot-starter-f03.body.md",
"bodySha256": "4bd655be664bb421670a885b352a52e6eac549b0f9de6b23dd80957eb069d85d",
"assets": [
{
"key": "grpc-spring-boot-starter-f03",
"kind": "terminal"
}
]
},
"grpc-testkit-f05": {
"kind": "CASE",
"slug": "grpc-testkit-f05",
"title": "계약 스위트 둘이 결과를 만드는 코드를 갖지 않는다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-grpc-testkit-f05.md",
"rootTreeNode": "case:grpc-testkit-f05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0fc2fe00baa674aab170050f56f2103800f35c1c667171a7c5a9d6e17c350bbd",
"lines": 57,
"body": "case/case-grpc-testkit-f05.body.md",
"bodySha256": "fcdec920226146f4f33ae53f22985a96bb2f9d13ae34d687e5c5bc8337c3eb58",
"assets": [
{
"key": "grpc-testkit-f05",
"kind": "terminal"
}
]
},
"messaging-admin-api-f03": {
"kind": "CASE",
"slug": "messaging-admin-api-f03",
"title": "TopologyManagementMode 가 어디에도 연결되어 있지 않다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-messaging-admin-api-f03.md",
"rootTreeNode": "case:messaging-admin-api-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "8e7cdf38e503c08d0c769d6f42aa4b52b40125fd5bb1ce9f3eb6a0654171f87e",
"lines": 47,
"body": "case/case-messaging-admin-api-f03.body.md",
"bodySha256": "2cdd072342ed8e5bdc51f5591376dde1c2c4f035d215d614129dfc96afa8fac0",
"assets": [
{
"key": "messaging-admin-api-f03",
"kind": "terminal"
}
]
},
"messaging-admin-api-f04": {
"kind": "CASE",
"slug": "messaging-admin-api-f04",
"title": "운영자용 표면 전체에 프로덕션 소비자가 없다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-messaging-admin-api-f04.md",
"rootTreeNode": "case:messaging-admin-api-f04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5d0b7b368bb5a1b6b482326b193e4c5933051202c3f22d2f4b974be42190d952",
"lines": 49,
"body": "case/case-messaging-admin-api-f04.body.md",
"bodySha256": "cce501f87b37d408a032dd6e06581a9f8f4a5cb3226abacc4e66f5a655a9249a",
"assets": [
{
"key": "messaging-admin-api-f04",
"kind": "terminal"
}
]
},
"messaging-admin-api-f06": {
"kind": "CASE",
"slug": "messaging-admin-api-f06",
"title": "messaging-policy 의존이 import 0건이다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-messaging-admin-api-f06.md",
"rootTreeNode": "case:messaging-admin-api-f06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "48c4834a2b98d4df344587b443e786e3a3f7a33393e30216db68fed17d286905",
"lines": 47,
"body": "case/case-messaging-admin-api-f06.body.md",
"bodySha256": "d1f9449ae69cf7b3fde0eafc5bc644dea597fbafca48b1aeec63141f4c2e9185",
"assets": [
{
"key": "messaging-admin-api-f06",
"kind": "terminal"
}
]
},
"messaging-admin-runtime-f03": {
"kind": "CASE",
"slug": "messaging-admin-runtime-f03",
"title": "오케스트레이터가 어디에서도 실행되지 않는다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-messaging-admin-runtime-f03.md",
"rootTreeNode": "case:messaging-admin-runtime-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "916f16dde549b5bc9d8cd301e64dbf4380ed2dc083c9825866810bce3d44d610",
"lines": 47,
"body": "case/case-messaging-admin-runtime-f03.body.md",
"bodySha256": "d9ac68607f72cdfbc3edb89d6924e1accba4d2e695c6c37814e9b59875a26d92",
"assets": [
{
"key": "messaging-admin-runtime-f03-diagram",
"kind": "diagram"
},
{
"key": "messaging-admin-runtime-f03",
"kind": "terminal"
}
]
},
"messaging-admin-runtime-f04": {
"kind": "CASE",
"slug": "messaging-admin-runtime-f04",
"title": "public 인터페이스를 패키지 밖에서 구현할 수 없다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-messaging-admin-runtime-f04.md",
"rootTreeNode": "case:messaging-admin-runtime-f04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "be75b8fc6a6313ad5fe670b87647261eeefd7b099a222abd4d95d18df78405f2",
"lines": 47,
"body": "case/case-messaging-admin-runtime-f04.body.md",
"bodySha256": "dbce6d6c642ba4adc9f10263bf390d96ff7157e72b29db66965b97149b80a9eb",
"assets": [
{
"key": "messaging-admin-runtime-f04",
"kind": "terminal"
}
]
},
"messaging-admin-runtime-f09": {
"kind": "CASE",
"slug": "messaging-admin-runtime-f09",
"title": "선언된 의존 6개 중 3개가 import 0건",
"topic": "runtime-reachability-and-composition",
"path": "case/case-messaging-admin-runtime-f09.md",
"rootTreeNode": "case:messaging-admin-runtime-f09",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "99705ad5ad0309dedd306ca2b40870d793f308775e7f1c6d8c4c2372dd992744",
"lines": 47,
"body": "case/case-messaging-admin-runtime-f09.body.md",
"bodySha256": "a033c9c6cf18d374fec44e25d09a4ce807cc4e13dab9e6ded2bc3740d00acb55",
"assets": [
{
"key": "messaging-admin-runtime-f09",
"kind": "terminal"
}
]
},
"messaging-claim-check-f01": {
"kind": "CASE",
"slug": "messaging-claim-check-f01",
"title": "배포 아티팩트가 싣지만 아무도 부르지 않고, 다른 곳의 에러 메시지가 이 경로를 권한다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-messaging-claim-check-f01.md",
"rootTreeNode": "case:messaging-claim-check-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5d1ba5cefa30f7644b004acdf239eb48a575040f23fe5a9fbbd4181d0fc904e4",
"lines": 51,
"body": "case/case-messaging-claim-check-f01.body.md",
"bodySha256": "eea7f51ca117bb63a92907741d3cc3b9420a0bc52527bc3fdc760faa0332874b",
"assets": [
{
"key": "messaging-claim-check-f01-diagram",
"kind": "diagram"
},
{
"key": "messaging-claim-check-f01",
"kind": "terminal"
}
]
},
"messaging-claim-check-f04": {
"kind": "REFERENCE",
"slug": "messaging-claim-check-f04",
"title": "leaf의 각 public 클래스는 자기 레인에 테스트를 갖는다",
"topic": "runtime-reachability-and-composition",
"path": "reference/reference-messaging-claim-check-f04.md",
"rootTreeNode": "reference:messaging-claim-check-f04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e8bfa0e3d7ae6a2108ac0bb32f5be4c91d9bbdd2516be619b7b224beecd31772",
"lines": 43
},
"messaging-cloudevents-f02": {
"kind": "CASE",
"slug": "messaging-cloudevents-f02",
"title": "배포 아티팩트가 싣지만 아무도 부르지 않는다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-messaging-cloudevents-f02.md",
"rootTreeNode": "case:messaging-cloudevents-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5d1e231ffc7ed491dfcefc5267ef4735b8c1bbfc8e87f0f3d751c74035ba26e6",
"lines": 53,
"body": "case/case-messaging-cloudevents-f02.body.md",
"bodySha256": "3a42e00d471ac4315e8de04f9754ab92e9f66cb55b7d8aa82231da505112f1e8",
"assets": [
{
"key": "messaging-cloudevents-f02-diagram",
"kind": "diagram"
},
{
"key": "messaging-cloudevents-f02",
"kind": "terminal"
}
]
},
"messaging-core-api-f01": {
"kind": "QUESTION",
"slug": "messaging-core-api-f01",
"title": "선언된 핸들러 계약이 배선된 것과 다르다",
"topic": "runtime-reachability-and-composition",
"path": "openquestion/openquestion-messaging-core-api-f01.md",
"rootTreeNode": "open-question:messaging-core-api-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f9c9821e5253f50183a45d12461831ca88f9458e8ce5d9a70e1571038eb09b2a",
"lines": 52
},
"messaging-core-api-f03": {
"kind": "QUESTION",
"slug": "messaging-core-api-f03",
"title": "12개 예외가 선언만 되어 있다",
"topic": "runtime-reachability-and-composition",
"path": "openquestion/openquestion-messaging-core-api-f03.md",
"rootTreeNode": "open-question:messaging-core-api-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f90a59652fbb824199a67d520b794e799f26f146c65a07715167dd28ef367386",
"lines": 52
},
"messaging-inbox-jdbc-postgresql-f01": {
"kind": "CASE",
"slug": "messaging-inbox-jdbc-postgresql-f01",
"title": "bounded purge가 구현돼 있고 호출되지 않아, cleanup이 스스로 막겠다고 한 장애를 일으킨다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-messaging-inbox-jdbc-postgresql-f01.md",
"rootTreeNode": "case:messaging-inbox-jdbc-postgresql-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "bf64798d597d66fd95ccba1a9653331ce80863808b49a546cccaffc04586a4ef",
"lines": 57,
"body": "case/case-messaging-inbox-jdbc-postgresql-f01.body.md",
"bodySha256": "811074a9b764181132791e1712028487e8cccd3ed50c6d22842a48292873817a",
"assets": [
{
"key": "messaging-inbox-jdbc-postgresql-f01-diagram",
"kind": "diagram"
},
{
"key": "messaging-inbox-jdbc-postgresql-f01",
"kind": "terminal"
}
]
},
"messaging-kafka-share-experimental-f02": {
"kind": "REFERENCE",
"slug": "messaging-kafka-share-experimental-f02",
"title": "허용 의존 목록은 상한이므로 미사용을 잡지 않는다 — 그것을 잡으려면 별도 검사가 필요하다",
"topic": "runtime-reachability-and-composition",
"path": "reference/reference-messaging-kafka-share-experimental-f02.md",
"rootTreeNode": "reference:messaging-kafka-share-experimental-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "85f7dde9c817096fa6e64bf9c16fe80090f7f702f487a6c30b158dea9c2a29ec",
"lines": 43
},
"messaging-kafka-share-experimental-f03": {
"kind": "QUESTION",
"slug": "messaging-kafka-share-experimental-f03",
"title": "형제 어댑터 넷이 구현하는 SPI를 이 leaf만 구현하지 않는다",
"topic": "runtime-reachability-and-composition",
"path": "openquestion/openquestion-messaging-kafka-share-experimental-f03.md",
"rootTreeNode": "open-question:messaging-kafka-share-experimental-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f340c6bff15c3ff528f3e63ef1cbbcb31056688b5fe89c5e9e67d771137fb695",
"lines": 49
},
"messaging-observability-f02": {
"kind": "CASE",
"slug": "messaging-observability-f02",
"title": "관측 구현이 조립되지 않고, 그 재료 둘만 bean으로 존재한다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-messaging-observability-f02.md",
"rootTreeNode": "case:messaging-observability-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "99cff1e0d83fc93f909a587b9e4341bfcba91237bc7ca24f39faf48406079e4a",
"lines": 49,
"body": "case/case-messaging-observability-f02.body.md",
"bodySha256": "66698d78a668de5af4fe589105ea5b480dd928e3bbdcd2626958803ea8565878",
"assets": [
{
"key": "messaging-observability-f02-diagram",
"kind": "diagram"
},
{
"key": "messaging-observability-f02",
"kind": "terminal"
}
]
},
"messaging-outbox-jdbc-postgresql-f01": {
"kind": "CASE",
"slug": "messaging-outbox-jdbc-postgresql-f01",
"title": "정리 작업이 무제한 DELETE 를 쏘고, 그것을 막는 오버로드는 호출되지 않는다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-messaging-outbox-jdbc-postgresql-f01.md",
"rootTreeNode": "case:messaging-outbox-jdbc-postgresql-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "532027fd575cfedba8912a11743b1a2bd2bd8186c536b8b46e6bff5ca6150f1c",
"lines": 59,
"body": "case/case-messaging-outbox-jdbc-postgresql-f01.body.md",
"bodySha256": "165d0a7f4932e90e68e66defe14c6248b301053184c0efa6f610a8aaa9a6b890",
"assets": [
{
"key": "messaging-outbox-jdbc-postgresql-f01-diagram",
"kind": "diagram"
},
{
"key": "messaging-outbox-jdbc-postgresql-f01",
"kind": "terminal"
}
]
},
"messaging-outbox-jdbc-postgresql-f04": {
"kind": "CASE",
"slug": "messaging-outbox-jdbc-postgresql-f04",
"title": "두 릴레이 상호배제가 기동에서 강제되지 않는다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-messaging-outbox-jdbc-postgresql-f04.md",
"rootTreeNode": "case:messaging-outbox-jdbc-postgresql-f04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "859d16c91d06de9a26db5042e3e8efed12cedc8bbe64f9e6689ab495513df65a",
"lines": 51,
"body": "case/case-messaging-outbox-jdbc-postgresql-f04.body.md",
"bodySha256": "22f30ffb62389d14d7fa448bf3b05e201bad77dbb877dc9fdc4c7c31744d9626",
"assets": [
{
"key": "messaging-outbox-jdbc-postgresql-f04-diagram",
"kind": "diagram"
},
{
"key": "messaging-outbox-jdbc-postgresql-f04",
"kind": "terminal"
}
]
},
"messaging-policy-f02": {
"kind": "QUESTION",
"slug": "messaging-policy-f02",
"title": "출하 컨텍스트가 발행은 하고 소비는 하지 못한다",
"topic": "runtime-reachability-and-composition",
"path": "openquestion/openquestion-messaging-policy-f02.md",
"rootTreeNode": "open-question:messaging-policy-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f1490ef982abe15395a3ba0276de4129f5d5e33990b3c5bd86e6ecf4322c1970",
"lines": 51
},
"messaging-rabbit-f04": {
"kind": "CASE",
"slug": "messaging-rabbit-f04",
"title": "능력 상수의 delayedDelivery 가 무조건 참이고, 그 지연을 제공할 토폴로지는 조립되지 않는다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-messaging-rabbit-f04.md",
"rootTreeNode": "case:messaging-rabbit-f04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "95efa102fdf454ff690a2fc36cef118da4e2e32ed9b15447ef2bc32fe070d907",
"lines": 57,
"body": "case/case-messaging-rabbit-f04.body.md",
"bodySha256": "35a8150ad37664105e590e7dad32bf20873cc35f30906036aedf53b999fe4497",
"assets": [
{
"key": "messaging-rabbit-f04",
"kind": "terminal"
}
]
},
"messaging-reliability-api-f02": {
"kind": "CASE",
"slug": "messaging-reliability-api-f02",
"title": "fencing token 경로가 실제 데이터베이스에 대해 실행되지 않는다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-messaging-reliability-api-f02.md",
"rootTreeNode": "case:messaging-reliability-api-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "2c8cd59c379c25589179b292d9e2b84c400ae258f9a4c2c709aabe28154145c0",
"lines": 53,
"body": "case/case-messaging-reliability-api-f02.body.md",
"bodySha256": "7ff36998bb7e0cd0c271033694eb9e47e865a80b356b95aace65e38360e5fd41",
"assets": [
{
"key": "messaging-reliability-api-f02-diagram",
"kind": "diagram"
},
{
"key": "messaging-reliability-api-f02",
"kind": "terminal"
}
]
},
"messaging-reliability-api-f03": {
"kind": "QUESTION",
"slug": "messaging-reliability-api-f03",
"title": "dual-write의 답이라고 선언한 진입점에 구현이 없다",
"topic": "runtime-reachability-and-composition",
"path": "openquestion/openquestion-messaging-reliability-api-f03.md",
"rootTreeNode": "open-question:messaging-reliability-api-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "56d28464a20742ffb767eba51bda3e584cfbdb78977a6a3456d592a01f8e0349",
"lines": 49
},
"messaging-runtime-core-f01": {
"kind": "CASE",
"slug": "messaging-runtime-core-f01",
"title": "관측이 구현·호출부·주입 자리를 모두 갖추고도 출하에서 no-op이다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-messaging-runtime-core-f01.md",
"rootTreeNode": "case:messaging-runtime-core-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "11a0c25b454b1268b3e35b669cef25d5dbf9e9d610b919c6be9f2fccdc39fa5c",
"lines": 59,
"body": "case/case-messaging-runtime-core-f01.body.md",
"bodySha256": "fb34c01c11e0fb65c9a6cd64df38db6c264d1e9b35dabeddabeb454473b9bf14",
"assets": [
{
"key": "messaging-runtime-core-f01-diagram",
"kind": "diagram"
},
{
"key": "messaging-runtime-core-f01",
"kind": "terminal"
}
]
},
"messaging-runtime-core-f02": {
"kind": "CASE",
"slug": "messaging-runtime-core-f02",
"title": "소비 오케스트레이터가 조립되지 않는다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-messaging-runtime-core-f02.md",
"rootTreeNode": "case:messaging-runtime-core-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a939eeb337be8cac77ec3a5338e0cc9c32096f432a8c708df84e712861fb8095",
"lines": 45,
"body": "case/case-messaging-runtime-core-f02.body.md",
"bodySha256": "af2adae83cfbafef593e552f0c16c909d3a52fe5de77c615d9353d9b81a0e24e",
"assets": [
{
"key": "messaging-runtime-core-f02-diagram",
"kind": "diagram"
},
{
"key": "messaging-runtime-core-f02",
"kind": "terminal"
}
]
},
"messaging-runtime-core-f07": {
"kind": "REFERENCE",
"slug": "messaging-runtime-core-f07",
"title": "만들어 두고 흘리지 않는 진단값은 진단이 아니다",
"topic": "runtime-reachability-and-composition",
"path": "reference/reference-messaging-runtime-core-f07.md",
"rootTreeNode": "reference:messaging-runtime-core-f07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "1c50bd9515fdff637b4bda402dc069b4bc39772d03e26101906fdb7f560900b3",
"lines": 43
},
"messaging-schema-api-f01": {
"kind": "CASE",
"slug": "messaging-schema-api-f01",
"title": "포맷 독립 진화 규칙이 호출되지 않고, 그것이 막으려던 중복이 실제로 생겼다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-messaging-schema-api-f01.md",
"rootTreeNode": "case:messaging-schema-api-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "dd4d20c6e9202d14a732cda97250240becc8bcf2ed8fdc64c4b7fde962a7c0a2",
"lines": 49,
"body": "case/case-messaging-schema-api-f01.body.md",
"bodySha256": "f2b4275582e4a30ad0554c1dcf8881f4ed97b4666f6efc07b4353da833db645e",
"assets": [
{
"key": "messaging-schema-api-f01-diagram",
"kind": "diagram"
},
{
"key": "messaging-schema-api-f01",
"kind": "terminal"
}
]
},
"messaging-schema-json-f03": {
"kind": "QUESTION",
"slug": "messaging-schema-json-f03",
"title": "빈 registry로 조립되면 모든 메시지가 거절된다",
"topic": "runtime-reachability-and-composition",
"path": "openquestion/openquestion-messaging-schema-json-f03.md",
"rootTreeNode": "open-question:messaging-schema-json-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "9d3859ab4fdeacb0ebb075ae351d419db5008a0fe3280ab2ef6af37c189e99aa",
"lines": 50
},
"messaging-security-f04": {
"kind": "CASE",
"slug": "messaging-security-f04",
"title": "종료 시 자격증명 소거가 호출되지 않는다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-messaging-security-f04.md",
"rootTreeNode": "case:messaging-security-f04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "65553a47c8c76435c22887102c40139534034ceaf0cdeb4758e70c5b5651c81c",
"lines": 45,
"body": "case/case-messaging-security-f04.body.md",
"bodySha256": "20d5d5ac18118194d3a911ff00ad6c3ee17a50363037b988992d8a9d6ef6ff15",
"assets": [
{
"key": "messaging-security-f04",
"kind": "terminal"
}
]
},
"messaging-security-f07": {
"kind": "REFERENCE",
"slug": "messaging-security-f07",
"title": "배선된 게이트는 자기 leaf 레인에서 검증한다",
"topic": "runtime-reachability-and-composition",
"path": "reference/reference-messaging-security-f07.md",
"rootTreeNode": "reference:messaging-security-f07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "bafe4ffa7deaa437d78516b744eba84c2f5c3fa89e93cfc0db20d74d515b61b3",
"lines": 43
},
"messaging-spring-boot-starter-f01": {
"kind": "CASE",
"slug": "messaging-spring-boot-starter-f01",
"title": "같은 자동 설정 안에서 검증기 하나만 감싸이지 않는다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-messaging-spring-boot-starter-f01.md",
"rootTreeNode": "case:messaging-spring-boot-starter-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "435f540ccdb5a495d1bcf02d6abd8a186fdeee7188b488eea436ef845beb1aa5",
"lines": 57,
"body": "case/case-messaging-spring-boot-starter-f01.body.md",
"bodySha256": "1351c416434f83bb25c06523cca3582596d02b051cf8106536b3acb961be7602",
"assets": [
{
"key": "messaging-spring-boot-starter-f01-diagram",
"kind": "diagram"
},
{
"key": "messaging-spring-boot-starter-f01",
"kind": "terminal"
}
]
},
"messaging-spring-cloud-stream-bridge-f01": {
"kind": "REFERENCE",
"slug": "messaging-spring-cloud-stream-bridge-f01",
"title": "허용 의존 목록은 상한이므로 미사용을 잡지 않는다",
"topic": "runtime-reachability-and-composition",
"path": "reference/reference-messaging-spring-cloud-stream-bridge-f01.md",
"rootTreeNode": "reference:messaging-spring-cloud-stream-bridge-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "9cd54a6f09e473a95fbc452108de7a2085cd0de94d294c144da7ea312cc571bf",
"lines": 43
},
"messaging-spring-cloud-stream-bridge-f05": {
"kind": "REFERENCE",
"slug": "messaging-spring-cloud-stream-bridge-f05",
"title": "등록을 받는 컴포넌트는 해제도 제공한다",
"topic": "runtime-reachability-and-composition",
"path": "reference/reference-messaging-spring-cloud-stream-bridge-f05.md",
"rootTreeNode": "reference:messaging-spring-cloud-stream-bridge-f05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "991116d42013d2496db9b7c9240414874d54a93de3ffd93272d23d5b9bf2c80e",
"lines": 43
},
"messaging-testkit-f01": {
"kind": "CASE",
"slug": "messaging-testkit-f01",
"title": "FaultController 의 5개 중 2개가 구현만 3벌 있고 호출부가 0건이다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-messaging-testkit-f01.md",
"rootTreeNode": "case:messaging-testkit-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "cb67d5ed75eb8cf11e9df0c45e705bbecfb2df58e8afb28f704b141a0e6b18f6",
"lines": 57,
"body": "case/case-messaging-testkit-f01.body.md",
"bodySha256": "bb41c2a1c01e2f18becefef921b2a98c6bd687233f4c9daeacfadee35005dc6a",
"assets": [
{
"key": "messaging-testkit-f01-diagram",
"kind": "diagram"
},
{
"key": "messaging-testkit-f01",
"kind": "terminal"
}
]
},
"messaging-testkit-f04": {
"kind": "CASE",
"slug": "messaging-testkit-f04",
"title": "1 MiB 한도가 PayloadPolicy 를 두고 리터럴로 재선언된다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-messaging-testkit-f04.md",
"rootTreeNode": "case:messaging-testkit-f04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b956631f54ed16945a96fa0cb1c10791ee9431362b1fc3198f4a30cdd2ead665",
"lines": 47,
"body": "case/case-messaging-testkit-f04.body.md",
"bodySha256": "30ab5b4ba205ff96a152c48b2b5d8e6d811068815ffa4535ac1f2b0e1374e32f",
"assets": [
{
"key": "messaging-testkit-f04",
"kind": "terminal"
}
]
},
"messaging-testkit-f05": {
"kind": "CASE",
"slug": "messaging-testkit-f05",
"title": "messaging-transport-spi 의존이 import 0건이다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-messaging-testkit-f05.md",
"rootTreeNode": "case:messaging-testkit-f05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d6f09a0ec37d01378cec685696ecf455f46eae754206586a808e4cb13427dbf3",
"lines": 47,
"body": "case/case-messaging-testkit-f05.body.md",
"bodySha256": "8ca7310530b26ab3178f58277bbd74906176f8b2f2853717ede0f22a2c8b74c7",
"assets": [
{
"key": "messaging-testkit-f05",
"kind": "terminal"
}
]
},
"messaging-testkit-f06": {
"kind": "CASE",
"slug": "messaging-testkit-f06",
"title": "BrokerFailureMatrix.adapters() 는 호출부가 0건이다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-messaging-testkit-f06.md",
"rootTreeNode": "case:messaging-testkit-f06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "2d3f0b6e551266672dde29d966b478591d9a60b23a99cc66918462113cfe811e",
"lines": 45,
"body": "case/case-messaging-testkit-f06.body.md",
"bodySha256": "acbc86f00ec87772ca395b4a254ab7995815e06ce7e14a15b82ea9b3db7f311a",
"assets": [
{
"key": "messaging-testkit-f06",
"kind": "terminal"
}
]
},
"grpc-admin-f01": {
"kind": "CASE",
"slug": "grpc-admin-f01",
"title": "rejectNewAdmission() 이 단계만 기록하고 아무것도 거절하지 않는다",
"topic": "verification-path-coverage",
"path": "case/case-grpc-admin-f01.md",
"rootTreeNode": "case:grpc-admin-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "900141e377466bd64b7dbf3f003f4a5da3390360b5935d28b696e858ed5e66b1",
"lines": 59,
"body": "case/case-grpc-admin-f01.body.md",
"bodySha256": "438efd34a53546acd08773f408117db911397d97222a0d08e0e29476a9e57be4",
"assets": [
{
"key": "grpc-admin-f01-diagram",
"kind": "diagram"
},
{
"key": "grpc-admin-f01",
"kind": "terminal"
}
]
},
"grpc-advanced-bootstrap-f01": {
"kind": "CASE",
"slug": "grpc-advanced-bootstrap-f01",
"title": "등급 재정의에 하한이 없어 \"켤 수 없다\" 는 등급이 켜질 수 있다",
"topic": "verification-path-coverage",
"path": "case/case-grpc-advanced-bootstrap-f01.md",
"rootTreeNode": "case:grpc-advanced-bootstrap-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "8dcc58d838cc54b0ef29161b7c245d0555a617c260c1e0e67739121eb5d4f129",
"lines": 59,
"body": "case/case-grpc-advanced-bootstrap-f01.body.md",
"bodySha256": "9152a2ad0f448f361285b955fa93aea81b4dde5212235cbe6b561ba712282a23",
"assets": [
{
"key": "grpc-advanced-bootstrap-f01",
"kind": "terminal"
}
]
},
"grpc-advanced-bootstrap-f04": {
"kind": "CASE",
"slug": "grpc-advanced-bootstrap-f04",
"title": "capabilitiesDraggedAlong 은 독립성을 증명하지 않는다. 상수를 상수와 비교한다",
"topic": "verification-path-coverage",
"path": "case/case-grpc-advanced-bootstrap-f04.md",
"rootTreeNode": "case:grpc-advanced-bootstrap-f04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e6e7e70b023d9b0c5b7b7e61bbf2cb9ba09da6f362539df329e8c9637dfc10df",
"lines": 59,
"body": "case/case-grpc-advanced-bootstrap-f04.body.md",
"bodySha256": "5ee52377b8515854540bad1334f2f0dae57f156bc4e52fec7a5542674b849a08",
"assets": [
{
"key": "grpc-advanced-bootstrap-f04",
"kind": "terminal"
}
]
},
"grpc-advanced-compat-f02": {
"kind": "CASE",
"slug": "grpc-advanced-compat-f02",
"title": "반응형 표면 두 타입은 테스트조차 없다",
"topic": "verification-path-coverage",
"path": "case/case-grpc-advanced-compat-f02.md",
"rootTreeNode": "case:grpc-advanced-compat-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "004642ec5266eb46fefa364248e3e83f5edd5d7d99734bad20b04a9d53585c70",
"lines": 51,
"body": "case/case-grpc-advanced-compat-f02.body.md",
"bodySha256": "d9903d0509ab65fbf58f19efd42d7229455c00137bf71c63477e8fda077d19e8",
"assets": [
{
"key": "grpc-advanced-compat-f02",
"kind": "terminal"
}
]
},
"grpc-advanced-compat-f03": {
"kind": "CASE",
"slug": "grpc-advanced-compat-f03",
"title": "저장소가 참조 프록시 설정을 갖고 있는데, 그것을 판정할 코드에 넣지 않는다",
"topic": "verification-path-coverage",
"path": "case/case-grpc-advanced-compat-f03.md",
"rootTreeNode": "case:grpc-advanced-compat-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e73c6eb21712ff782643df2c06b1f6c65b9d9b5f5fef83623c640f08f558c771",
"lines": 59,
"body": "case/case-grpc-advanced-compat-f03.body.md",
"bodySha256": "e69609cfd872d893f885e4ccdff2a74dabe3b876fed69c032e9229fde9c2ac27",
"assets": [
{
"key": "grpc-advanced-compat-f03",
"kind": "terminal"
}
]
},
"grpc-codegen-f01": {
"kind": "CASE",
"slug": "grpc-codegen-f01",
"title": "Buf 수명주기 태스크 목록이 빌드와 대조되지 않는다. 테스트는 목록을 자기 자신과 비교한다",
"topic": "verification-path-coverage",
"path": "case/case-grpc-codegen-f01.md",
"rootTreeNode": "case:grpc-codegen-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "611d4258d6700424e625303af8d3e6a6245d96bdf392edc6928a7987ee1ebc62",
"lines": 55,
"body": "case/case-grpc-codegen-f01.body.md",
"bodySha256": "f053e1462f9c26727ca916a70fbcb5a93e7308ef27dcbddd796892be4e14cfc3",
"assets": [
{
"key": "grpc-codegen-f01",
"kind": "terminal"
}
]
},
"grpc-codegen-f04": {
"kind": "CASE",
"slug": "grpc-codegen-f04",
"title": "sha256: 검사가 길이 15자 이상만 요구한다. 저장소 자신의 테스트가 32자 해시를 통과시킨다",
"topic": "verification-path-coverage",
"path": "case/case-grpc-codegen-f04.md",
"rootTreeNode": "case:grpc-codegen-f04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "ed823a66d915ff8cbf60e377d6ab8efb7b151c72f109337df21e6746a4e555f4",
"lines": 53,
"body": "case/case-grpc-codegen-f04.body.md",
"bodySha256": "80af4d597779243fac44d5a2c2d1dfe7d71ed02e1ff9db6e5435229f97424afc",
"assets": [
{
"key": "grpc-codegen-f04",
"kind": "terminal"
}
]
},
"grpc-core-api-f02": {
"kind": "CASE",
"slug": "grpc-core-api-f02",
"title": "모듈 목록 테스트가 레지스트리와 목록을 붙들지 않는다",
"topic": "verification-path-coverage",
"path": "case/case-grpc-core-api-f02.md",
"rootTreeNode": "case:grpc-core-api-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "fe2ae745fa85ba603576507b0d808d5363acdefd869c8d27d2e1c0f19583e366",
"lines": 57,
"body": "case/case-grpc-core-api-f02.body.md",
"bodySha256": "5773f29f8072ac6e25a37449336c1cc41e9e4cfc8ecd421a5bddc359c5d4bd45",
"assets": [
{
"key": "grpc-core-api-f02",
"kind": "terminal"
}
]
},
"grpc-server-f01": {
"kind": "CASE",
"slug": "grpc-server-f01",
"title": "두 아키텍처 규칙이 저장소 소스에 적용되지 않는다",
"topic": "verification-path-coverage",
"path": "case/case-grpc-server-f01.md",
"rootTreeNode": "case:grpc-server-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5df556fc5211edb60aa9a6effb69d3ea0b654b048b9c6ee2d102f5ef70c21949",
"lines": 53,
"body": "case/case-grpc-server-f01.body.md",
"bodySha256": "1a9f5743a2deabfd3b9b8f799252e0f49bfe6c0674dc8d1e5bb4a88a02427f60",
"assets": [
{
"key": "grpc-server-f01-diagram",
"kind": "diagram"
},
{
"key": "grpc-server-f01",
"kind": "terminal"
}
]
},
"grpc-testkit-f01": {
"kind": "CASE",
"slug": "grpc-testkit-f01",
"title": "네 레인이 check 에 붙지 않고, 이 가족을 이름으로 부르는 워크플로가 없다",
"topic": "verification-path-coverage",
"path": "case/case-grpc-testkit-f01.md",
"rootTreeNode": "case:grpc-testkit-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "c7ceab105f37b6a038f6da7dc02cc5169ae3aa9df27a2aea41cdadbff19e8039",
"lines": 59,
"body": "case/case-grpc-testkit-f01.body.md",
"bodySha256": "73e9be04bf917dff6f5a1e34811882a7373928fa08e67b756a082f3eedc44d94",
"assets": [
{
"key": "grpc-testkit-f01-diagram",
"kind": "diagram"
},
{
"key": "grpc-testkit-f01",
"kind": "terminal"
}
]
},
"grpc-testkit-f03": {
"kind": "CASE",
"slug": "grpc-testkit-f03",
"title": "고장 레인의 유일한 실소켓 시험이 자기가 관측한 것을 버리고 리터럴로 증거를 만든다",
"topic": "verification-path-coverage",
"path": "case/case-grpc-testkit-f03.md",
"rootTreeNode": "case:grpc-testkit-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "c541ec92d01a5f8cbc47523e996b375f280ae1ec2246305360db2e73cd7452dd",
"lines": 59,
"body": "case/case-grpc-testkit-f03.body.md",
"bodySha256": "b6597fa2af0f398d5d468b4eee8aef9ee354604fe99a10f84cb68945d7e98727",
"assets": [
{
"key": "grpc-testkit-f03-diagram",
"kind": "diagram"
},
{
"key": "grpc-testkit-f03",
"kind": "terminal"
}
]
},
"grpc-testkit-f04": {
"kind": "CASE",
"slug": "grpc-testkit-f04",
"title": "호환성 표의 레인 이름과 빌드의 레인 이름이 서로 다른 집합이다",
"topic": "verification-path-coverage",
"path": "case/case-grpc-testkit-f04.md",
"rootTreeNode": "case:grpc-testkit-f04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "dcbef312aeed48f99b664f3c70e80ed19c01d1758b5be00295adc9dd69726210",
"lines": 53,
"body": "case/case-grpc-testkit-f04.body.md",
"bodySha256": "72b8651cb130495a82458a352374492eab204758c44b4cf1aed004c82c897af6",
"assets": [
{
"key": "grpc-testkit-f04",
"kind": "terminal"
}
]
},
"messaging-admin-api-f01": {
"kind": "CASE",
"slug": "messaging-admin-api-f01",
"title": "DestructiveOperationGuard 의 두 분기가 문서에도 없고 테스트에도 없다",
"topic": "verification-path-coverage",
"path": "case/case-messaging-admin-api-f01.md",
"rootTreeNode": "case:messaging-admin-api-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "6d07c4409fc72ee28881bb3afd88c595ff4ecbe5ead3c56c98c461e5dd79b6fd",
"lines": 53,
"body": "case/case-messaging-admin-api-f01.body.md",
"bodySha256": "fa8591e130ff4212c8d7c459b6f358b5e1245a44e07bc7343fbc20e01299671a",
"assets": [
{
"key": "messaging-admin-api-f01-diagram",
"kind": "diagram"
},
{
"key": "messaging-admin-api-f01",
"kind": "terminal"
}
]
},
"messaging-cloudevents-f01": {
"kind": "CASE",
"slug": "messaging-cloudevents-f01",
"title": "상호운용을 위한 매퍼가 명세 준수 이벤트를 분류되지 않은 예외로 거절한다",
"topic": "verification-path-coverage",
"path": "case/case-messaging-cloudevents-f01.md",
"rootTreeNode": "case:messaging-cloudevents-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a148c2f1b4abf587a6342c5a2af142c083d9a0daab93f9a6feb5858b6507f778",
"lines": 59,
"body": "case/case-messaging-cloudevents-f01.body.md",
"bodySha256": "f51dfb160f2ee05acd2518338bce1813b843d0a1f6922578e4b870276a983adc",
"assets": [
{
"key": "messaging-cloudevents-f01-diagram",
"kind": "diagram"
},
{
"key": "messaging-cloudevents-f01",
"kind": "terminal"
}
]
},
"messaging-cloudevents-f03": {
"kind": "REFERENCE",
"slug": "messaging-cloudevents-f03",
"title": "왕복이라 부르는 테스트는 무엇을 보존하지 않는지도 적는다",
"topic": "verification-path-coverage",
"path": "reference/reference-messaging-cloudevents-f03.md",
"rootTreeNode": "reference:messaging-cloudevents-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "2c029879bf7c5c758d70b4ef3723fb57d6b6fa6f86e0ab23eeda510e4723fd18",
"lines": 43
},
"messaging-inbox-jdbc-postgresql-f02": {
"kind": "CASE",
"slug": "messaging-inbox-jdbc-postgresql-f02",
"title": "속성을 이름으로 주장하는 테스트가 그 속성을 보일 수 없는 fake 위에서 통과한다",
"topic": "verification-path-coverage",
"path": "case/case-messaging-inbox-jdbc-postgresql-f02.md",
"rootTreeNode": "case:messaging-inbox-jdbc-postgresql-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "8a15f4806d0ed2b2b9b796500ab3dd8985b9f0e68559c15a376acd663cbd8a48",
"lines": 53,
"body": "case/case-messaging-inbox-jdbc-postgresql-f02.body.md",
"bodySha256": "ac33a14ea1866066183e571bb078d121ca4d1aa5d8490b486546ad62f3d2bda8",
"assets": [
{
"key": "messaging-inbox-jdbc-postgresql-f02-diagram",
"kind": "diagram"
},
{
"key": "messaging-inbox-jdbc-postgresql-f02",
"kind": "terminal"
}
]
},
"messaging-kafka-share-experimental-f05": {
"kind": "REFERENCE",
"slug": "messaging-kafka-share-experimental-f05",
"title": "leaf의 각 public 클래스는 자기 레인에 테스트를 갖는다",
"topic": "verification-path-coverage",
"path": "reference/reference-messaging-kafka-share-experimental-f05.md",
"rootTreeNode": "reference:messaging-kafka-share-experimental-f05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "2d955598ae441721eb3d57c3b650b49f847eed205fa1a362408949bf1d382baf",
"lines": 43
},
"messaging-nats-experimental-f01": {
"kind": "CASE",
"slug": "messaging-nats-experimental-f01",
"title": "deduplicatedPublish 를 무조건 참으로 선언하는데 실제 중복 제거는 프로파일에 창이 있을 때만 일어난다",
"topic": "verification-path-coverage",
"path": "case/case-messaging-nats-experimental-f01.md",
"rootTreeNode": "case:messaging-nats-experimental-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "8f901923ee4b7388cb1355c74691631967198d9402c5e0d5714fdad63e21e2ab",
"lines": 59,
"body": "case/case-messaging-nats-experimental-f01.body.md",
"bodySha256": "b784f9c9163c9de44dbcdbc4b6e6172a0b32c50327246ae42cca54c82198ca9a",
"assets": [
{
"key": "messaging-nats-experimental-f01-diagram",
"kind": "diagram"
},
{
"key": "messaging-nats-experimental-f01",
"kind": "terminal"
}
]
},
"messaging-nats-experimental-f04": {
"kind": "CASE",
"slug": "messaging-nats-experimental-f04",
"title": "경과 시간 회귀를 막으려는 어셈블이 항상 참이다",
"topic": "verification-path-coverage",
"path": "case/case-messaging-nats-experimental-f04.md",
"rootTreeNode": "case:messaging-nats-experimental-f04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "216f7d78849d9cc7bc1250666634b9e94c8c4e29179ea41bcf8c3fd3b361ef46",
"lines": 55,
"body": "case/case-messaging-nats-experimental-f04.body.md",
"bodySha256": "85ff9b3893114f99057539c29aa8e371c78f84bac160afedf493325c15e79ac1",
"assets": [
{
"key": "messaging-nats-experimental-f04",
"kind": "terminal"
}
]
},
"messaging-outbox-jdbc-postgresql-f02": {
"kind": "CASE",
"slug": "messaging-outbox-jdbc-postgresql-f02",
"title": "배포되는 Debezium 설정이 수정 이전 버전이다",
"topic": "verification-path-coverage",
"path": "case/case-messaging-outbox-jdbc-postgresql-f02.md",
"rootTreeNode": "case:messaging-outbox-jdbc-postgresql-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b34e4a9678acd2a3d229deb3a058716ac0eef963bfe39c7d54cd87ac3eed1918",
"lines": 59,
"body": "case/case-messaging-outbox-jdbc-postgresql-f02.body.md",
"bodySha256": "37dfd7df786db2137fe535bc700b3d9ffe9f5c490e07c8b2e8429b34a4a4b883",
"assets": [
{
"key": "messaging-outbox-jdbc-postgresql-f02-diagram",
"kind": "diagram"
},
{
"key": "messaging-outbox-jdbc-postgresql-f02",
"kind": "terminal"
}
]
},
"messaging-outbox-jdbc-postgresql-f03": {
"kind": "CASE",
"slug": "messaging-outbox-jdbc-postgresql-f03",
"title": "역슬래시로 끝나는 헤더 값이 헤더 맵을 깨뜨린다",
"topic": "verification-path-coverage",
"path": "case/case-messaging-outbox-jdbc-postgresql-f03.md",
"rootTreeNode": "case:messaging-outbox-jdbc-postgresql-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "bb866699519504deb73ea522ea1227b1cabb090e64461be0b280c2f4e4cd7c14",
"lines": 53,
"body": "case/case-messaging-outbox-jdbc-postgresql-f03.body.md",
"bodySha256": "48aafbe0558f2122309b68a25df54c5e478090ddf29c8c2f53be6b1739c5e78b",
"assets": [
{
"key": "messaging-outbox-jdbc-postgresql-f03-diagram",
"kind": "diagram"
},
{
"key": "messaging-outbox-jdbc-postgresql-f03",
"kind": "terminal"
}
]
},
"messaging-reliability-api-f01": {
"kind": "CASE",
"slug": "messaging-reliability-api-f01",
"title": "한 인터페이스가 같은 전이의 두 세대를 갖고, 안전하지 않은 쪽에 @Deprecated가 없다",
"topic": "verification-path-coverage",
"path": "case/case-messaging-reliability-api-f01.md",
"rootTreeNode": "case:messaging-reliability-api-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "2dc2355bf171a1005091d157722be84b538f47e2b537b65ad75c6299da3c9b59",
"lines": 49,
"body": "case/case-messaging-reliability-api-f01.body.md",
"bodySha256": "890b4beb4a55ab0f7f560cd1d9467d91497932eaf85da61d8c8abc2df001b424",
"assets": [
{
"key": "messaging-reliability-api-f01-diagram",
"kind": "diagram"
},
{
"key": "messaging-reliability-api-f01",
"kind": "terminal"
}
]
},
"messaging-reliability-api-f04": {
"kind": "REFERENCE",
"slug": "messaging-reliability-api-f04",
"title": "계약만 담는 leaf도 계약의 거절 조건은 자기 레인에서 검증한다",
"topic": "verification-path-coverage",
"path": "reference/reference-messaging-reliability-api-f04.md",
"rootTreeNode": "reference:messaging-reliability-api-f04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "107814aefa66c2168f07faca1da37f9663d6e25f2e72eb2130a8250d605ada75",
"lines": 43
},
"messaging-reliability-api-f07": {
"kind": "REFERENCE",
"slug": "messaging-reliability-api-f07",
"title": "record의 equals를 좁히면 이유를 적는다",
"topic": "verification-path-coverage",
"path": "reference/reference-messaging-reliability-api-f07.md",
"rootTreeNode": "reference:messaging-reliability-api-f07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b6686849eb32658f8220ed3775c7fe1b1dc8d0e5588ca782406622ea97ee53bb",
"lines": 43
},
"messaging-runtime-core-f06": {
"kind": "REFERENCE",
"slug": "messaging-runtime-core-f06",
"title": "증가한다고 문서화한 값이 리터럴이면 그 사실을 적는다",
"topic": "verification-path-coverage",
"path": "reference/reference-messaging-runtime-core-f06.md",
"rootTreeNode": "reference:messaging-runtime-core-f06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "32f0aa826b564d4450628942cd3f75c1ecf20d4643173cce5ff46e8cb9832e9b",
"lines": 43
},
"messaging-schema-avro-f04": {
"kind": "REFERENCE",
"slug": "messaging-schema-avro-f04",
"title": "모드 enum을 분기 조건으로 쓰면 각 분기에 테스트를 둔다",
"topic": "verification-path-coverage",
"path": "reference/reference-messaging-schema-avro-f04.md",
"rootTreeNode": "reference:messaging-schema-avro-f04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a5c4153baf8d1e98719fc6f584695109be4facab03bdf432cf3ebc2345ea4d34",
"lines": 43
},
"messaging-schema-protobuf-f01": {
"kind": "REFERENCE",
"slug": "messaging-schema-protobuf-f01",
"title": "검증되지 않는 스키마 파일은 문서임을 파일 안에 적는다",
"topic": "verification-path-coverage",
"path": "reference/reference-messaging-schema-protobuf-f01.md",
"rootTreeNode": "reference:messaging-schema-protobuf-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "97687e45b55678dd356aac1b1622218c2e07894a985a352ea06155639ea19312",
"lines": 43
},
"messaging-schema-protobuf-f02": {
"kind": "REFERENCE",
"slug": "messaging-schema-protobuf-f02",
"title": "신뢰할 수 없는 입력 쪽 경계를 먼저 테스트한다",
"topic": "verification-path-coverage",
"path": "reference/reference-messaging-schema-protobuf-f02.md",
"rootTreeNode": "reference:messaging-schema-protobuf-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "45451c01b205cc14d291e19a990e19158b235bc00c81d54af9277088817d3423",
"lines": 43
},
"messaging-security-f05": {
"kind": "REFERENCE",
"slug": "messaging-security-f05",
"title": "같은 술어가 두 타입에 있으면 하나가 다른 하나를 부른다",
"topic": "verification-path-coverage",
"path": "reference/reference-messaging-security-f05.md",
"rootTreeNode": "reference:messaging-security-f05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "9da04238e4729d50edbe9add53517d735af182598cef0d1c9561cf70c33ce907",
"lines": 43
},
"messaging-spring-boot-starter-f05": {
"kind": "CASE",
"slug": "messaging-spring-boot-starter-f05",
"title": "배치 발행자가 CompletionStage 를 돌려주면서 동기 예외를 던진다",
"topic": "verification-path-coverage",
"path": "case/case-messaging-spring-boot-starter-f05.md",
"rootTreeNode": "case:messaging-spring-boot-starter-f05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "ca42c0cbf436ea91d86479744284dfbb3719d43a69cdf966fe61965a01af031c",
"lines": 49,
"body": "case/case-messaging-spring-boot-starter-f05.body.md",
"bodySha256": "7da83e547674970a33cbe5ab5dac6a882336d876734a1f7791bbd11051b78b9f",
"assets": [
{
"key": "messaging-spring-boot-starter-f05",
"kind": "terminal"
}
]
},
"messaging-testkit-f07": {
"kind": "CASE",
"slug": "messaging-testkit-f07",
"title": "항등식을 단언하는 테스트가 하나 있다",
"topic": "verification-path-coverage",
"path": "case/case-messaging-testkit-f07.md",
"rootTreeNode": "case:messaging-testkit-f07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "07c8c884dfe29d22fed50b70690579d9604f69f4d6e5e83e83b6876128dd6865",
"lines": 47,
"body": "case/case-messaging-testkit-f07.body.md",
"bodySha256": "9b4bf54f1a77ae1e6ed42c764a690a89155c5266d1b0bda329f51ff1b5fa8c76",
"assets": [
{
"key": "messaging-testkit-f07",
"kind": "terminal"
}
]
},
"messaging-transport-spi-f01": {
"kind": "CASE",
"slug": "messaging-transport-spi-f01",
"title": "드레인 마감 30초가 세 곳에서 독립적으로 결정된다",
"topic": "verification-path-coverage",
"path": "case/case-messaging-transport-spi-f01.md",
"rootTreeNode": "case:messaging-transport-spi-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f02e34b7336f317354188f8435e66605d09a07076d2690476f03038c0c6f4478",
"lines": 47,
"body": "case/case-messaging-transport-spi-f01.body.md",
"bodySha256": "3387b03458c5644f50274c4cdd7d7596e49d4b32aea00c625243aed9dec67105",
"assets": [
{
"key": "messaging-transport-spi-f01",
"kind": "terminal"
}
]
},
"grpc-admin-f03": {
"kind": "CASE",
"slug": "grpc-admin-f03",
"title": "배수 조정자가 가변이고 동기화가 없다",
"topic": "state-ownership-and-concurrency",
"path": "case/case-grpc-admin-f03.md",
"rootTreeNode": "case:grpc-admin-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e90e1bd16cd997eed8c1b554a9e8d2b91ac53dace9d0a43998412b7e5176fa64",
"lines": 53,
"body": "case/case-grpc-admin-f03.body.md",
"bodySha256": "6f9476d9ce7bd7223b2dc7583b934cafdd9f9d5cd28f6e530af86205ea0dd958",
"assets": [
{
"key": "grpc-admin-f03",
"kind": "terminal"
}
]
},
"grpc-advanced-bootstrap-f03": {
"kind": "CASE",
"slug": "grpc-advanced-bootstrap-f03",
"title": "깃발 홀더가 가변이고 동기화가 없다",
"topic": "state-ownership-and-concurrency",
"path": "case/case-grpc-advanced-bootstrap-f03.md",
"rootTreeNode": "case:grpc-advanced-bootstrap-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d613452d02c7e5ca0228ea3a6f4a366162158c54c0d8c1f88cea6ddcfe8c4eb9",
"lines": 55,
"body": "case/case-grpc-advanced-bootstrap-f03.body.md",
"bodySha256": "3b912bf9f3cc0667719e94dd7e374711f8c591c96199de25b4f75a894dec8b59",
"assets": [
{
"key": "grpc-advanced-bootstrap-f03",
"kind": "terminal"
}
]
},
"grpc-advanced-resilience-f03": {
"kind": "CASE",
"slug": "grpc-advanced-resilience-f03",
"title": "리졸버의 개정 가드가 비교 후 교체가 아니다",
"topic": "state-ownership-and-concurrency",
"path": "case/case-grpc-advanced-resilience-f03.md",
"rootTreeNode": "case:grpc-advanced-resilience-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "cf4bb1bf6ebabf782d02367819515439d84fa7ca7acc86ffa5efd0a8516f6513",
"lines": 59,
"body": "case/case-grpc-advanced-resilience-f03.body.md",
"bodySha256": "7f789957292ac026a1bce3c2f5e2b4ccc3b235b2a5b74ad330f3daf0175a2562",
"assets": [
{
"key": "grpc-advanced-resilience-f03-diagram",
"kind": "diagram"
},
{
"key": "grpc-advanced-resilience-f03",
"kind": "terminal"
}
]
},
"grpc-advanced-streaming-f03": {
"kind": "CASE",
"slug": "grpc-advanced-streaming-f03",
"title": "체크포인트 전진이 ConcurrentMap 위의 확인 후 쓰기다",
"topic": "state-ownership-and-concurrency",
"path": "case/case-grpc-advanced-streaming-f03.md",
"rootTreeNode": "case:grpc-advanced-streaming-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5b34c930e36f57dd736a379c58aacd21858ac7a9a053ca0133b449a277c72d0b",
"lines": 59,
"body": "case/case-grpc-advanced-streaming-f03.body.md",
"bodySha256": "443940c47921acc099d28cad2d4c904eb34f694a2117125a70ccc98be0ec92bb",
"assets": [
{
"key": "grpc-advanced-streaming-f03",
"kind": "terminal"
}
]
},
"grpc-client-f01": {
"kind": "CASE",
"slug": "grpc-client-f01",
"title": "rotate 가 비교 후 교체가 아니라 덮어쓰기다",
"topic": "state-ownership-and-concurrency",
"path": "case/case-grpc-client-f01.md",
"rootTreeNode": "case:grpc-client-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "779c8c53e810e11df1011d7420f1b1cc858c4ef8cd37a393cb5bb0d85175ac99",
"lines": 55,
"body": "case/case-grpc-client-f01.body.md",
"bodySha256": "10f30ce3a25f1d0c040c7fac8040e7d6d18a565d11eb63b20a37e9f00b3a80b0",
"assets": [
{
"key": "grpc-client-f01-diagram",
"kind": "diagram"
},
{
"key": "grpc-client-f01",
"kind": "terminal"
}
]
},
"grpc-client-f02": {
"kind": "CASE",
"slug": "grpc-client-f02",
"title": "비원자적 감소가 세대를 영구히 회수 불가로 만든다",
"topic": "state-ownership-and-concurrency",
"path": "case/case-grpc-client-f02.md",
"rootTreeNode": "case:grpc-client-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "061be84c8784a28005152549f02e3929b5f13fb3cc56a84e561bd08a46147d82",
"lines": 57,
"body": "case/case-grpc-client-f02.body.md",
"bodySha256": "9022742e938af76b04145f8d31787d06a478ffedf187056c372f22ebe502de60",
"assets": [
{
"key": "grpc-client-f02-diagram",
"kind": "diagram"
},
{
"key": "grpc-client-f02",
"kind": "terminal"
}
]
},
"grpc-client-f03": {
"kind": "CASE",
"slug": "grpc-client-f03",
"title": "배수 목록의 순회가 동기화 밖에서 일어난다",
"topic": "state-ownership-and-concurrency",
"path": "case/case-grpc-client-f03.md",
"rootTreeNode": "case:grpc-client-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "07605e850aaba9d667fcabee13b6fe9d5f0960f5ba53dfa2d6ed841649718797",
"lines": 55,
"body": "case/case-grpc-client-f03.body.md",
"bodySha256": "3b0549fc3553f7d0a45dbf7b697341f7e11fb1e70da078b4ed9130cc8a531be6",
"assets": [
{
"key": "grpc-client-f03",
"kind": "terminal"
}
]
},
"grpc-codegen-f02": {
"kind": "CASE",
"slug": "grpc-codegen-f02",
"title": "릴리스 버전 불변성이 프로세스 안에서만 성립한다",
"topic": "state-ownership-and-concurrency",
"path": "case/case-grpc-codegen-f02.md",
"rootTreeNode": "case:grpc-codegen-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b0960a1d67e150830ecf7e31e7ef83ab54f14260229498194a44c6db5790d27a",
"lines": 53,
"body": "case/case-grpc-codegen-f02.body.md",
"bodySha256": "bc2a18c319c50c634b955684dcf0e101ea7f779be2743f2c691058dd148291fe",
"assets": [
{
"key": "grpc-codegen-f02",
"kind": "terminal"
}
]
},
"grpc-discovery-f03": {
"kind": "CASE",
"slug": "grpc-discovery-f03",
"title": "목록으로 보고하는 검증기가 주소 수 0 에서 던진다",
"topic": "state-ownership-and-concurrency",
"path": "case/case-grpc-discovery-f03.md",
"rootTreeNode": "case:grpc-discovery-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "82417487f3abd080c7b51ac958a116e7414fc825eb9c35d3c11d5d4cce69a481",
"lines": 59,
"body": "case/case-grpc-discovery-f03.body.md",
"bodySha256": "55920733c93ad944a1601c4af99c12d73461ce38c1f26c6c4c19f5176127b43b",
"assets": [
{
"key": "grpc-discovery-f03",
"kind": "terminal"
}
]
},
"grpc-operation-ledger-jpa-f02": {
"kind": "CASE",
"slug": "grpc-operation-ledger-jpa-f02",
"title": "markCommitted 는 던지고 markFailed 는 조용히 넘어간다",
"topic": "state-ownership-and-concurrency",
"path": "case/case-grpc-operation-ledger-jpa-f02.md",
"rootTreeNode": "case:grpc-operation-ledger-jpa-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "82348d9df994654474e61cb64a0d351b1582de26009afa35e540a6c78df76340",
"lines": 49,
"body": "case/case-grpc-operation-ledger-jpa-f02.body.md",
"bodySha256": "f02a0c4b7f984b5f745d1f5eeb131bff73940336a4f841a4d8211cf667153678",
"assets": [
{
"key": "grpc-operation-ledger-jpa-f02",
"kind": "terminal"
}
]
},
"grpc-policy-f04": {
"kind": "CASE",
"slug": "grpc-policy-f04",
"title": "완료 조정자가 요청 경로에서 동기화 없는 가변 리스트를 변경한다",
"topic": "state-ownership-and-concurrency",
"path": "case/case-grpc-policy-f04.md",
"rootTreeNode": "case:grpc-policy-f04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "fb185e4918ecf46a6ab8ad87c8dae5aa488a0f9fd74b3a9e928465599d456274",
"lines": 47,
"body": "case/case-grpc-policy-f04.body.md",
"bodySha256": "a013afca9fe1923a9f394ffb59c36b0319c3882213e90f4f030bf7fda7dc3a7d",
"assets": [
{
"key": "grpc-policy-f04-diagram",
"kind": "diagram"
},
{
"key": "grpc-policy-f04",
"kind": "terminal"
}
]
},
"grpc-policy-f05": {
"kind": "CASE",
"slug": "grpc-policy-f05",
"title": "스트림 수명 조정자의 배수 신호가 스레드를 건너면서 volatile 이 아니다",
"topic": "state-ownership-and-concurrency",
"path": "case/case-grpc-policy-f05.md",
"rootTreeNode": "case:grpc-policy-f05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "26b613f2fe1cc9e500b47288394bcb723f1ae35d1c85a142b3c6f5f64538a3c5",
"lines": 57,
"body": "case/case-grpc-policy-f05.body.md",
"bodySha256": "6d210c8cfdf3de66f8e00aa8bf1144d3af745f7b21e7c56ff18fef9940fce88c",
"assets": [
{
"key": "grpc-policy-f05-diagram",
"kind": "diagram"
},
{
"key": "grpc-policy-f05",
"kind": "terminal"
}
]
},
"grpc-testkit-f02": {
"kind": "CASE",
"slug": "grpc-testkit-f02",
"title": "릴리스 게이트의 입력이 전부 호출자가 손으로 만드는 값이다",
"topic": "state-ownership-and-concurrency",
"path": "case/case-grpc-testkit-f02.md",
"rootTreeNode": "case:grpc-testkit-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b39803c9ab8e4b54fd9ae62392ee12e75d004e2786cd88a61a7f2593b0324b39",
"lines": 53,
"body": "case/case-grpc-testkit-f02.body.md",
"bodySha256": "a6d3000d5b809745c44977389c2d139ea0d9c71efb48b90b4ebdb409f8ab5198",
"assets": [
{
"key": "grpc-testkit-f02",
"kind": "terminal"
}
]
},
"messaging-admin-runtime-f06": {
"kind": "CASE",
"slug": "messaging-admin-runtime-f06",
"title": "저널의 itemsCompleted 단조성이 인터페이스 계약에 없다",
"topic": "state-ownership-and-concurrency",
"path": "case/case-messaging-admin-runtime-f06.md",
"rootTreeNode": "case:messaging-admin-runtime-f06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "8f5308fd72898655afdae921d2a56d77b0bf63a4f162b8bbf9695298c685b435",
"lines": 51,
"body": "case/case-messaging-admin-runtime-f06.body.md",
"bodySha256": "841440bec8b96a4d3f9c846caa1bcea2b739b53fbe5d3722d8ae9bd964dda583",
"assets": [
{
"key": "messaging-admin-runtime-f06",
"kind": "terminal"
}
]
},
"messaging-admin-runtime-f07": {
"kind": "CASE",
"slug": "messaging-admin-runtime-f07",
"title": "리플레이가 리스를 받지만 재개하지 않는다",
"topic": "state-ownership-and-concurrency",
"path": "case/case-messaging-admin-runtime-f07.md",
"rootTreeNode": "case:messaging-admin-runtime-f07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "6598256f24f63f15f460462f2b0f4ae28580f448fc00d78a70556e88f675419d",
"lines": 49,
"body": "case/case-messaging-admin-runtime-f07.body.md",
"bodySha256": "12e5da828809b85b29084b533876006eacde52aae203cd6eb7122816f29eba93",
"assets": [
{
"key": "messaging-admin-runtime-f07",
"kind": "terminal"
}
]
},
"messaging-claim-check-f02": {
"kind": "REFERENCE",
"slug": "messaging-claim-check-f02",
"title": "같은 튜닝 값이 두 계층에 있으면 어느 쪽이 이기는지 정한다",
"topic": "state-ownership-and-concurrency",
"path": "reference/reference-messaging-claim-check-f02.md",
"rootTreeNode": "reference:messaging-claim-check-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "05e5c5c6559d5dc13ecf46750076bef52b5db098722923656eac51966743db8c",
"lines": 43
},
"messaging-rabbit-f02": {
"kind": "CASE",
"slug": "messaging-rabbit-f02",
"title": "반환을 순번에 맞추는 조각이 production 에 없고, 시험이 그 자리를 스스로 메운다",
"topic": "state-ownership-and-concurrency",
"path": "case/case-messaging-rabbit-f02.md",
"rootTreeNode": "case:messaging-rabbit-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "9ad92c9fffcbf12d8357d1ed9ee8e95da288f6c214bb68770eb16972b5a491ec",
"lines": 59,
"body": "case/case-messaging-rabbit-f02.body.md",
"bodySha256": "1be1b083e2fe4c50592eb8d074fa3fd8d0509683394fbd216ed3dfbedda219a2",
"assets": [
{
"key": "messaging-rabbit-f02-diagram",
"kind": "diagram"
},
{
"key": "messaging-rabbit-f02",
"kind": "terminal"
}
]
},
"messaging-security-f08": {
"kind": "REFERENCE",
"slug": "messaging-security-f08",
"title": "가변 필드로 상태 전이를 표현하면 가시성을 함께 정한다",
"topic": "state-ownership-and-concurrency",
"path": "reference/reference-messaging-security-f08.md",
"rootTreeNode": "reference:messaging-security-f08",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a11b3c0b635be7c8cd4895affc2ef5e3bf0c898e14b77b8e0d613e64a3973cc1",
"lines": 43
},
"messaging-spring-cloud-stream-bridge-f04": {
"kind": "REFERENCE",
"slug": "messaging-spring-cloud-stream-bridge-f04",
"title": "함께 읽히는 두 맵은 한 값으로 묶는다",
"topic": "state-ownership-and-concurrency",
"path": "reference/reference-messaging-spring-cloud-stream-bridge-f04.md",
"rootTreeNode": "reference:messaging-spring-cloud-stream-bridge-f04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b0bfe454fe8de2f894c55d0e00cc0e700d291121a7c0ae116abbf5987decf1f3",
"lines": 43
},
"messaging-spring-cloud-stream-bridge-f06": {
"kind": "REFERENCE",
"slug": "messaging-spring-cloud-stream-bridge-f06",
"title": "에러 메시지가 지시하는 설정은 그 설정을 읽는 코드와 함께 존재해야 한다",
"topic": "state-ownership-and-concurrency",
"path": "reference/reference-messaging-spring-cloud-stream-bridge-f06.md",
"rootTreeNode": "reference:messaging-spring-cloud-stream-bridge-f06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0d1fc453d2a6fb4df04e814d08295bb13175847dc8133c2adba53fe0560ed98f",
"lines": 43
},
"grpc-advanced-bootstrap-f05": {
"kind": "CASE",
"slug": "grpc-advanced-bootstrap-f05",
"title": "예외가 들고 있는 능력이 transient 라 역직렬화 뒤 사라진다",
"topic": "schema-and-data-contracts",
"path": "case/case-grpc-advanced-bootstrap-f05.md",
"rootTreeNode": "case:grpc-advanced-bootstrap-f05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5d3c708fd7425ac8917da8c329d2d6aa428133b1e5ac6fa9757a3edd42c06f2a",
"lines": 53,
"body": "case/case-grpc-advanced-bootstrap-f05.body.md",
"bodySha256": "4b93cbb17be9401744bb52c26151fe2373ba4af2c3615b815f526654329f0a0e",
"assets": [
{
"key": "grpc-advanced-bootstrap-f05",
"kind": "terminal"
}
]
},
"grpc-advanced-edition-f01": {
"kind": "CASE",
"slug": "grpc-advanced-edition-f01",
"title": "비교 픽스처에 비교 대상이 없다",
"topic": "schema-and-data-contracts",
"path": "case/case-grpc-advanced-edition-f01.md",
"rootTreeNode": "case:grpc-advanced-edition-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "82daf52d2f89e0ba683313d0af6d7e75eb36da70faca1e3ac1addac167a1eebe",
"lines": 59,
"body": "case/case-grpc-advanced-edition-f01.body.md",
"bodySha256": "43a726ac1959427e0e77e4e5d1ae870eebbd818238b765238f4931af28931014",
"assets": [
{
"key": "grpc-advanced-edition-f01-diagram",
"kind": "diagram"
},
{
"key": "grpc-advanced-edition-f01",
"kind": "terminal"
}
]
},
"grpc-codegen-f03": {
"kind": "CASE",
"slug": "grpc-codegen-f03",
"title": "픽스처의 메서드 경로가 서비스 × 메서드 교차곱이다",
"topic": "schema-and-data-contracts",
"path": "case/case-grpc-codegen-f03.md",
"rootTreeNode": "case:grpc-codegen-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5592171163107da91f7a888c653aeb295704eaf6b7d758cfab98c0247e1328c2",
"lines": 59,
"body": "case/case-grpc-codegen-f03.body.md",
"bodySha256": "a3d31f9ae6fe62e5f5fec9cc8ebadb96ddd9ba50e931ca22b7d02b007fb30690",
"assets": [
{
"key": "grpc-codegen-f03",
"kind": "terminal"
}
]
},
"grpc-core-api-f06": {
"kind": "CASE",
"slug": "grpc-core-api-f06",
"title": "직렬화 가능하다고 선언한 예외가 자기 내용을 직렬화하지 않는다",
"topic": "schema-and-data-contracts",
"path": "case/case-grpc-core-api-f06.md",
"rootTreeNode": "case:grpc-core-api-f06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b0636ad580d0f5dd4044ddbef3c13bfd52e7dbe601488c54a4cd7484f3f11a56",
"lines": 57,
"body": "case/case-grpc-core-api-f06.body.md",
"bodySha256": "8f22f0e9048ba756d2d68ee73ee5736643dd69559dc9ff1a96bfd7b1ca0e0ece",
"assets": [
{
"key": "grpc-core-api-f06",
"kind": "terminal"
}
]
},
"grpc-policy-f03": {
"kind": "CASE",
"slug": "grpc-policy-f03",
"title": "직렬 스트림 기록기의 가장 오래된 것 버리기가 잘못된 메시지의 바이트를 뺀다",
"topic": "schema-and-data-contracts",
"path": "case/case-grpc-policy-f03.md",
"rootTreeNode": "case:grpc-policy-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "baf26ef43f4dc9a4963d296c4365c6d10ca90b65a09d4131b6c7672d6b363a85",
"lines": 59,
"body": "case/case-grpc-policy-f03.body.md",
"bodySha256": "383e7de80af94cf3566e7fa10623cf5a09fb41737a8f5772bdbeb0a4bb65ead2",
"assets": [
{
"key": "grpc-policy-f03-diagram",
"kind": "diagram"
},
{
"key": "grpc-policy-f03",
"kind": "terminal"
}
]
},
"grpc-proto-contract-f01": {
"kind": "CASE",
"slug": "grpc-proto-contract-f01",
"title": "reserved 2 to 5; 범위가 개별 숫자로만 수집되어 RESERVED_HISTORY 오탐이 된다",
"topic": "schema-and-data-contracts",
"path": "case/case-grpc-proto-contract-f01.md",
"rootTreeNode": "case:grpc-proto-contract-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "12ecd662cd31fca9fa81d40d9d2d465f9e807e08dfc3295abe7097f024cce54a",
"lines": 53,
"body": "case/case-grpc-proto-contract-f01.body.md",
"bodySha256": "e051e42b9b4486c850288367f4c13ede51afedd345f94e2cf93a1088d7aa08ab",
"assets": [
{
"key": "grpc-proto-contract-f01",
"kind": "terminal"
}
]
},
"grpc-proto-contract-f03": {
"kind": "CASE",
"slug": "grpc-proto-contract-f03",
"title": "커밋 스키마 게이트가 파일 목록을 하드코딩한다",
"topic": "schema-and-data-contracts",
"path": "case/case-grpc-proto-contract-f03.md",
"rootTreeNode": "case:grpc-proto-contract-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "8dc5137abb4e6ae133c4afc3fdb09559d835240a494b28850c6d98226373dc77",
"lines": 47,
"body": "case/case-grpc-proto-contract-f03.body.md",
"bodySha256": "ea298d86529581f14b74c7d8bddc04a020816b2bd86b059d0b759b0dec69b841",
"assets": [
{
"key": "grpc-proto-contract-f03",
"kind": "terminal"
}
]
},
"grpc-proto-contract-f04": {
"kind": "CASE",
"slug": "grpc-proto-contract-f04",
"title": "열거형 안의 reserved 는 수집되지 않는다",
"topic": "schema-and-data-contracts",
"path": "case/case-grpc-proto-contract-f04.md",
"rootTreeNode": "case:grpc-proto-contract-f04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "493241419eb9b4dd1dbab3ebb02ad24be9033a1303e4d10a98a9cde7ec45aef5",
"lines": 51,
"body": "case/case-grpc-proto-contract-f04.body.md",
"bodySha256": "feeee09b1208eceaf8fb1f90a9cd4af4dffcee91e8f0a57fe15df42afb7e5351",
"assets": [
{
"key": "grpc-proto-contract-f04",
"kind": "terminal"
}
]
},
"messaging-cloudevents-f04": {
"kind": "QUESTION",
"slug": "messaging-cloudevents-f04",
"title": "dataschema가 채워질 경로가 없다",
"topic": "schema-and-data-contracts",
"path": "openquestion/openquestion-messaging-cloudevents-f04.md",
"rootTreeNode": "open-question:messaging-cloudevents-f04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "dfdedfff5dd782744dc5cb3ab1366b96ec8d9e78e224722a60422afe34007a1d",
"lines": 49
},
"messaging-observability-f04": {
"kind": "CASE",
"slug": "messaging-observability-f04",
"title": "감사 sink 인터페이스가 사용처에서 다시 선언된다",
"topic": "schema-and-data-contracts",
"path": "case/case-messaging-observability-f04.md",
"rootTreeNode": "case:messaging-observability-f04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5849eb18a421abc55df6accf69eb5669bf36ef42a5a188102c29bab6c0a5eebb",
"lines": 47,
"body": "case/case-messaging-observability-f04.body.md",
"bodySha256": "3c63d80b09acc039cbb63acafe22a573b2efa2e7f52615c688cf6196c42a7284",
"assets": [
{
"key": "messaging-observability-f04",
"kind": "terminal"
}
]
},
"messaging-runtime-core-f03": {
"kind": "CASE",
"slug": "messaging-runtime-core-f03",
"title": "선언된 content type과 실제 인코딩이 조용히 갈라질 수 있다",
"topic": "schema-and-data-contracts",
"path": "case/case-messaging-runtime-core-f03.md",
"rootTreeNode": "case:messaging-runtime-core-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "747c3a84c89bbf3a9ad1819d8ce082215cdd54fff548f831d3a66a320a8c6617",
"lines": 51,
"body": "case/case-messaging-runtime-core-f03.body.md",
"bodySha256": "02091decbc7cf317a1a6040ad0334c00ea63626b179532683d604bcdac2ee026",
"assets": [
{
"key": "messaging-runtime-core-f03",
"kind": "terminal"
}
]
},
"messaging-schema-avro-f02": {
"kind": "CASE",
"slug": "messaging-schema-avro-f02",
"title": "진화 판단이 두 곳에 있고 형태가 반대다",
"topic": "schema-and-data-contracts",
"path": "case/case-messaging-schema-avro-f02.md",
"rootTreeNode": "case:messaging-schema-avro-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a0aa8dfc6a5b10ac7259599b59744bc75be460c4ea89af258f6b02c834cffcfd",
"lines": 47,
"body": "case/case-messaging-schema-avro-f02.body.md",
"bodySha256": "885fad5a1d07d19130e5a8d16048fad29842e1c6a3c87ff420e399f4abcf14dd",
"assets": [
{
"key": "messaging-schema-avro-f02-diagram",
"kind": "diagram"
},
{
"key": "messaging-schema-avro-f02",
"kind": "terminal"
}
]
},
"messaging-schema-avro-f03": {
"kind": "REFERENCE",
"slug": "messaging-schema-avro-f03",
"title": "컬렉션 순서가 계약이면 양쪽에서 같은 방향으로 적는다",
"topic": "schema-and-data-contracts",
"path": "reference/reference-messaging-schema-avro-f03.md",
"rootTreeNode": "reference:messaging-schema-avro-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "9e292d222e8bf42397847257449e02993b578edbc3909d697a7ed01cf17eac07",
"lines": 43
},
"messaging-schema-avro-f05": {
"kind": "REFERENCE",
"slug": "messaging-schema-avro-f05",
"title": "안정 코드는 판단 단위로 정하고 구현 단위로 정하지 않는다",
"topic": "schema-and-data-contracts",
"path": "reference/reference-messaging-schema-avro-f05.md",
"rootTreeNode": "reference:messaging-schema-avro-f05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "fda5b8e69756c1c382d4d81b0d4d249cd4f8eb783a29cb33ea5cfeb59e9c9525",
"lines": 43
},
"messaging-schema-json-f01": {
"kind": "CASE",
"slug": "messaging-schema-json-f01",
"title": "포맷 중립 payload 정책이, 자기 상수를 두고 JSON codec의 상수를 참조한다",
"topic": "schema-and-data-contracts",
"path": "case/case-messaging-schema-json-f01.md",
"rootTreeNode": "case:messaging-schema-json-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "2be6bcab761ddd4158b3c4b2e8138215009396a176136f16ce4f647deeed6fac",
"lines": 53,
"body": "case/case-messaging-schema-json-f01.body.md",
"bodySha256": "e06897782fb74c388e053760d659b89f2f1a85f0ba48c7bff51639fa35354e38",
"assets": [
{
"key": "messaging-schema-json-f01-diagram",
"kind": "diagram"
},
{
"key": "messaging-schema-json-f01",
"kind": "terminal"
}
]
},
"messaging-schema-protobuf-f03": {
"kind": "QUESTION",
"slug": "messaging-schema-protobuf-f03",
"title": "protobuf-java 버전이 저장소에 셋이고 전역 정책이 없다",
"topic": "schema-and-data-contracts",
"path": "openquestion/openquestion-messaging-schema-protobuf-f03.md",
"rootTreeNode": "open-question:messaging-schema-protobuf-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a82b2cc69a7fdc83ced34955940eff1ddbe2bbfb47a1d8debb6b100cbceeadf4",
"lines": 51
},
"messaging-schema-protobuf-f04": {
"kind": "CASE",
"slug": "messaging-schema-protobuf-f04",
"title": "registry 조회 로직이 세 codec에 복제돼 있다",
"topic": "schema-and-data-contracts",
"path": "case/case-messaging-schema-protobuf-f04.md",
"rootTreeNode": "case:messaging-schema-protobuf-f04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "721a0528502a666e31e58875ccc669783b84808197ccc018a98409a41d4aceb1",
"lines": 49,
"body": "case/case-messaging-schema-protobuf-f04.body.md",
"bodySha256": "8cd1ec629bfce6758a2e19aa7f230cca2b0b6c97be3fb0c8341d99424110ff12",
"assets": [
{
"key": "messaging-schema-protobuf-f04",
"kind": "terminal"
}
]
},
"grpc-spring-boot-starter-f02": {
"kind": "CASE",
"slug": "grpc-spring-boot-starter-f02",
"title": "자동 설정이 transport 를 읽지 않고 전송을 하드코딩한다",
"topic": "transport-and-provider-semantics",
"path": "case/case-grpc-spring-boot-starter-f02.md",
"rootTreeNode": "case:grpc-spring-boot-starter-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e32ef3c59d0295d53588dd6e5cc95ffe70eb6b87615a00da2d6396801be8f8dc",
"lines": 49,
"body": "case/case-grpc-spring-boot-starter-f02.body.md",
"bodySha256": "d5a2f6c891e3a5aba10c34487fb056f3bc5b804358414d10388866812eeb3dff",
"assets": [
{
"key": "grpc-spring-boot-starter-f02",
"kind": "terminal"
}
]
},
"messaging-admin-runtime-f02": {
"kind": "CASE",
"slug": "messaging-admin-runtime-f02",
"title": "토폴로지 검증 스택이 두 벌이고 판정이 어긋난다",
"topic": "transport-and-provider-semantics",
"path": "case/case-messaging-admin-runtime-f02.md",
"rootTreeNode": "case:messaging-admin-runtime-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5a2b871edd7f9ed89c970276e90ac00ffc73bde6279ab5dcbb5559c0b1cd9c6a",
"lines": 51,
"body": "case/case-messaging-admin-runtime-f02.body.md",
"bodySha256": "f25b771354d5d8d3367a2afb01f6c6bd09ac0869de3ebad9a32e65111a27fed0",
"assets": [
{
"key": "messaging-admin-runtime-f02-diagram",
"kind": "diagram"
},
{
"key": "messaging-admin-runtime-f02",
"kind": "terminal"
}
]
},
"messaging-admin-runtime-f10": {
"kind": "CASE",
"slug": "messaging-admin-runtime-f10",
"title": "실패한 리드라이브 항목의 사유가 어디에도 남지 않는다",
"topic": "transport-and-provider-semantics",
"path": "case/case-messaging-admin-runtime-f10.md",
"rootTreeNode": "case:messaging-admin-runtime-f10",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "72b6c08603b12c79d2e640bba7a46e128b5e12bfbe5dd682a55e1d2e9487bb9a",
"lines": 47,
"body": "case/case-messaging-admin-runtime-f10.body.md",
"bodySha256": "b46c0a966bf4d46da8bec248efbf6dcb2915aef5854d69b7371020a1d07432cf",
"assets": [
{
"key": "messaging-admin-runtime-f10",
"kind": "terminal"
}
]
},
"messaging-core-api-f02": {
"kind": "CASE",
"slug": "messaging-core-api-f02",
"title": "배치 metadata를 만들고 넘길 곳이 없다",
"topic": "transport-and-provider-semantics",
"path": "case/case-messaging-core-api-f02.md",
"rootTreeNode": "case:messaging-core-api-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "6ac44d7e788c7614f5ac9ecf3b0cdf958219c458cd6dae8618f7988266647528",
"lines": 49,
"body": "case/case-messaging-core-api-f02.body.md",
"bodySha256": "434bbf9a217c00188d816538b4e7f21182a18dce24aa892ba487b2fab4d72585",
"assets": [
{
"key": "messaging-core-api-f02-diagram",
"kind": "diagram"
},
{
"key": "messaging-core-api-f02",
"kind": "terminal"
}
]
},
"messaging-inbox-jdbc-postgresql-f03": {
"kind": "CASE",
"slug": "messaging-inbox-jdbc-postgresql-f03",
"title": "SQL 실패가 재시도 불가로 분류된다",
"topic": "transport-and-provider-semantics",
"path": "case/case-messaging-inbox-jdbc-postgresql-f03.md",
"rootTreeNode": "case:messaging-inbox-jdbc-postgresql-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "282d7fd37c994266664ddc5864c0e2ed7f0f2dd3776000520ca949a40e1c13dd",
"lines": 47,
"body": "case/case-messaging-inbox-jdbc-postgresql-f03.body.md",
"bodySha256": "ff396c7df225337e1994cdad6a3fabc087a3fbad0796e96679b9fbcb26340171",
"assets": [
{
"key": "messaging-inbox-jdbc-postgresql-f03-diagram",
"kind": "diagram"
},
{
"key": "messaging-inbox-jdbc-postgresql-f03",
"kind": "terminal"
}
]
},
"messaging-kafka-f02": {
"kind": "CASE",
"slug": "messaging-kafka-f02",
"title": "천장에 닿아 일시정지된 파티션을 재개하는 경로가 없다",
"topic": "transport-and-provider-semantics",
"path": "case/case-messaging-kafka-f02.md",
"rootTreeNode": "case:messaging-kafka-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "6e3acb7c21420868c2c0b39fe41eeae960649551b6958459e7dd37cf3261ef0b",
"lines": 59,
"body": "case/case-messaging-kafka-f02.body.md",
"bodySha256": "1075d41a9b58b344ccbc5d062d2d043812078b688bfca8641e78e893bb3e5ce9",
"assets": [
{
"key": "messaging-kafka-f02-diagram",
"kind": "diagram"
},
{
"key": "messaging-kafka-f02",
"kind": "terminal"
}
]
},
"messaging-kafka-f03": {
"kind": "CASE",
"slug": "messaging-kafka-f03",
"title": "오염된 재시도 헤더가 격리되지 않고 무한 pause-and-seek 을 만든다",
"topic": "transport-and-provider-semantics",
"path": "case/case-messaging-kafka-f03.md",
"rootTreeNode": "case:messaging-kafka-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "edd225b10c50654ae7707832f920b60169b72db40a8cdf0eaaf1f4178ab5226e",
"lines": 59,
"body": "case/case-messaging-kafka-f03.body.md",
"bodySha256": "20d81116d0d955e4d005c096814058de2106674bfb4d092ceed88f8c2be82ea3",
"assets": [
{
"key": "messaging-kafka-f03-diagram",
"kind": "diagram"
},
{
"key": "messaging-kafka-f03",
"kind": "terminal"
}
]
},
"messaging-kafka-f04": {
"kind": "CASE",
"slug": "messaging-kafka-f04",
"title": "시계를 주입받는 클래스가 한 곳에서만 벽시계를 읽는다",
"topic": "transport-and-provider-semantics",
"path": "case/case-messaging-kafka-f04.md",
"rootTreeNode": "case:messaging-kafka-f04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "2aa843a73719ea586cb1a949e1869639b12eef759d5629908c6a9fd3f6826281",
"lines": 57,
"body": "case/case-messaging-kafka-f04.body.md",
"bodySha256": "ae654e4cb12513964d8634503dc6ed6d8523b7f0b02f5edbb3667444d7101073",
"assets": [
{
"key": "messaging-kafka-f04-diagram",
"kind": "diagram"
},
{
"key": "messaging-kafka-f04",
"kind": "terminal"
}
]
},
"messaging-kafka-f05": {
"kind": "CASE",
"slug": "messaging-kafka-f05",
"title": "결함으로 판정된 메서드가 남아 있고, 실브로커 증명이 그것 위에서 돈다",
"topic": "transport-and-provider-semantics",
"path": "case/case-messaging-kafka-f05.md",
"rootTreeNode": "case:messaging-kafka-f05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "9e42d2bf94b9602e438b09319d0e9ccdfa35d90bab3ee36a42f2bcb5fc24b747",
"lines": 57,
"body": "case/case-messaging-kafka-f05.body.md",
"bodySha256": "9c6b8543deddd4ff542eb5201e7f0eaf95e0c958e039aa16ce3f36368dfd9d54",
"assets": [
{
"key": "messaging-kafka-f05",
"kind": "terminal"
}
]
},
"messaging-kafka-share-experimental-f01": {
"kind": "CASE",
"slug": "messaging-kafka-share-experimental-f01",
"title": "\"등록\"이 아무것도 등록하지 않고 성공을 반환한다",
"topic": "transport-and-provider-semantics",
"path": "case/case-messaging-kafka-share-experimental-f01.md",
"rootTreeNode": "case:messaging-kafka-share-experimental-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f918b3402bdfce2f44bf60c67a8c0080ef2b5ef1252b26f7ac29ab5e80cd86f4",
"lines": 53,
"body": "case/case-messaging-kafka-share-experimental-f01.body.md",
"bodySha256": "385ea5dfdfffb12904ac57f25ee4022e185d971018bd7eb4b94dfa04e0c8cf34",
"assets": [
{
"key": "messaging-kafka-share-experimental-f01-diagram",
"kind": "diagram"
},
{
"key": "messaging-kafka-share-experimental-f01",
"kind": "terminal"
}
]
},
"messaging-kafka-share-experimental-f06": {
"kind": "REFERENCE",
"slug": "messaging-kafka-share-experimental-f06",
"title": "에러 메시지가 지시하는 설정은 그 설정을 읽는 코드와 함께 존재해야 한다",
"topic": "transport-and-provider-semantics",
"path": "reference/reference-messaging-kafka-share-experimental-f06.md",
"rootTreeNode": "reference:messaging-kafka-share-experimental-f06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "1ed0d4be4cfd12852a0800ccfb7d1c21bec0f386a9acf2fb32dabfeae764a7c9",
"lines": 43
},
"messaging-nats-experimental-f02": {
"kind": "CASE",
"slug": "messaging-nats-experimental-f02",
"title": "닫힌 전송의 거절이 영구 업무 실패로 분류된다",
"topic": "transport-and-provider-semantics",
"path": "case/case-messaging-nats-experimental-f02.md",
"rootTreeNode": "case:messaging-nats-experimental-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "ad3e5bd084818526e94fd8de81defd6bd046bc4dedaf8ae36f119ae1397cd1b4",
"lines": 47,
"body": "case/case-messaging-nats-experimental-f02.body.md",
"bodySha256": "64a9f08aeea938a370742a964f548f8d3d593de1c9efc6c8c515a127e66c4bda",
"assets": [
{
"key": "messaging-nats-experimental-f02",
"kind": "terminal"
}
]
},
"messaging-nats-experimental-f03": {
"kind": "CASE",
"slug": "messaging-nats-experimental-f03",
"title": "NatsJetStreamProfileValidator 를 부르는 곳이 javadoc 링크 하나뿐이다",
"topic": "transport-and-provider-semantics",
"path": "case/case-messaging-nats-experimental-f03.md",
"rootTreeNode": "case:messaging-nats-experimental-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e97cd4df38b9c1f06388f08d12c01d6eeb5262f3fd60e38b6ccc714f230ee467",
"lines": 59,
"body": "case/case-messaging-nats-experimental-f03.body.md",
"bodySha256": "18e6794251b27b75097c7a994762eda41a4103d9d6b4b154bd62626ce89270b6",
"assets": [
{
"key": "messaging-nats-experimental-f03-diagram",
"kind": "diagram"
},
{
"key": "messaging-nats-experimental-f03",
"kind": "terminal"
}
]
},
"messaging-observability-f03": {
"kind": "QUESTION",
"slug": "messaging-observability-f03",
"title": "브로커 홉 추적기가 소비자를 갖지 않는다",
"topic": "transport-and-provider-semantics",
"path": "openquestion/openquestion-messaging-observability-f03.md",
"rootTreeNode": "open-question:messaging-observability-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "c6ec9f233584fd9d8e86ecec38bfba87c63749bfe739b7c7388174a1af5dc247",
"lines": 49
},
"messaging-policy-f01": {
"kind": "CASE",
"slug": "messaging-policy-f01",
"title": "재시도 엔진과 DLQ 조정자가 bean으로 만들어지고 주입되는 곳이 없다",
"topic": "transport-and-provider-semantics",
"path": "case/case-messaging-policy-f01.md",
"rootTreeNode": "case:messaging-policy-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "35ee5af5be2ac75df88d134704d7a1eafcba7118a03decc9f1aa1cdbd1d3104f",
"lines": 51,
"body": "case/case-messaging-policy-f01.body.md",
"bodySha256": "db57a144380cbb48745b6c92e2fb27b5c8b79d1b81564a1fe9e613c317226db5",
"assets": [
{
"key": "messaging-policy-f01-diagram",
"kind": "diagram"
},
{
"key": "messaging-policy-f01",
"kind": "terminal"
}
]
},
"messaging-policy-f03": {
"kind": "CASE",
"slug": "messaging-policy-f03",
"title": "재시도와 DLQ 각각에 두 개의 구현이 있고 정본이 표시되지 않았다",
"topic": "transport-and-provider-semantics",
"path": "case/case-messaging-policy-f03.md",
"rootTreeNode": "case:messaging-policy-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5309221192acbd657d6c0f5240412edde869bd911533b7ffb37ce48dda140939",
"lines": 51,
"body": "case/case-messaging-policy-f03.body.md",
"bodySha256": "93937deede22fa943bf6d50ba77e451024e499d66fe00845c24a8c2f6cfea3c5",
"assets": [
{
"key": "messaging-policy-f03",
"kind": "terminal"
}
]
},
"messaging-policy-f04": {
"kind": "CASE",
"slug": "messaging-policy-f04",
"title": "DLQ 메타데이터의 두 시각이 항상 같다",
"topic": "transport-and-provider-semantics",
"path": "case/case-messaging-policy-f04.md",
"rootTreeNode": "case:messaging-policy-f04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "53b8a1c696721833d05b98f729101745c248d14275e672007989a039abe3b62c",
"lines": 47,
"body": "case/case-messaging-policy-f04.body.md",
"bodySha256": "d4e7f7f06a132a5b4a4918bd6d6c04c559244cb0f52e3d1128802d1bcaf99015",
"assets": [
{
"key": "messaging-policy-f04",
"kind": "terminal"
}
]
},
"messaging-pulsar-experimental-f01": {
"kind": "CASE",
"slug": "messaging-pulsar-experimental-f01",
"title": "닫힌 전송의 거절이 영구 업무 실패로 분류된다",
"topic": "transport-and-provider-semantics",
"path": "case/case-messaging-pulsar-experimental-f01.md",
"rootTreeNode": "case:messaging-pulsar-experimental-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "483ff14aea1c7215661836bcae5328b75e9e488e188aad65ee0c9ab595a2c6e8",
"lines": 57,
"body": "case/case-messaging-pulsar-experimental-f01.body.md",
"bodySha256": "64c47072817bbc006eead6da5a5c3b63e8b0812d3a973ab563ef97e08c646959",
"assets": [
{
"key": "messaging-pulsar-experimental-f01",
"kind": "terminal"
}
]
},
"messaging-rabbit-f01": {
"kind": "CASE",
"slug": "messaging-rabbit-f01",
"title": "확인 등급이 요구에서 파생되고, 그 요구를 뒷받침하는 강제는 목적지 종류 하나에만 걸린다",
"topic": "transport-and-provider-semantics",
"path": "case/case-messaging-rabbit-f01.md",
"rootTreeNode": "case:messaging-rabbit-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "3b6d1da732119ce4c1d46d602ce8da5879d6a8c9b4699d1dc606957a5fb43e86",
"lines": 59,
"body": "case/case-messaging-rabbit-f01.body.md",
"bodySha256": "786434851e54df778e25fda5f62cf45c75393cfcc6c42121db71a34f01eb8152",
"assets": [
{
"key": "messaging-rabbit-f01",
"kind": "terminal"
}
]
},
"messaging-rabbit-f03": {
"kind": "CASE",
"slug": "messaging-rabbit-f03",
"title": "SCRAM 자격을 RabbitMQ 의 데모 기구로 조용히 매핑한다",
"topic": "transport-and-provider-semantics",
"path": "case/case-messaging-rabbit-f03.md",
"rootTreeNode": "case:messaging-rabbit-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "8c5003efbbf22fb4411139ef27ed29fa4f1b59387a523a3b9f3e00dbdcd95091",
"lines": 55,
"body": "case/case-messaging-rabbit-f03.body.md",
"bodySha256": "c22edc51621854750337e447162fd3d330434be1feadc1a0abb0775c5928a5e8",
"assets": [
{
"key": "messaging-rabbit-f03",
"kind": "terminal"
}
]
},
"messaging-rabbit-f05": {
"kind": "CASE",
"slug": "messaging-rabbit-f05",
"title": "pause 의 의미가 SPI 하나 뒤에서 두 브로커에 다르게 구현된다",
"topic": "transport-and-provider-semantics",
"path": "case/case-messaging-rabbit-f05.md",
"rootTreeNode": "case:messaging-rabbit-f05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b9fc266849e0ee914c3f1286581de71a50a46e2e2b9b0c9a861a80e0f89aa7de",
"lines": 55,
"body": "case/case-messaging-rabbit-f05.body.md",
"bodySha256": "88e5232d3d02988179a9b5e657e2399048859d75d40210f25d9b5ab4e836bcdc",
"assets": [
{
"key": "messaging-rabbit-f05",
"kind": "terminal"
}
]
},
"messaging-runtime-core-f04": {
"kind": "REFERENCE",
"slug": "messaging-runtime-core-f04",
"title": "안정 코드는 운영자의 행동이 갈리는 지점마다 나눈다",
"topic": "transport-and-provider-semantics",
"path": "reference/reference-messaging-runtime-core-f04.md",
"rootTreeNode": "reference:messaging-runtime-core-f04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "8e3b64dc8b6dbc035da23da74f2a27a477116c85299bd136dd53d71f15932279",
"lines": 43
},
"messaging-schema-json-f02": {
"kind": "REFERENCE",
"slug": "messaging-schema-json-f02",
"title": "실패 코드는 운영자의 다음 행동이 갈리는 지점마다 나눈다",
"topic": "transport-and-provider-semantics",
"path": "reference/reference-messaging-schema-json-f02.md",
"rootTreeNode": "reference:messaging-schema-json-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "ef7cf49a33d44259027dfc45d21fbd011903ae3623b469c3abfbde1790bfa6df",
"lines": 43
},
"messaging-spring-cloud-stream-bridge-f02": {
"kind": "QUESTION",
"slug": "messaging-spring-cloud-stream-bridge-f02",
"title": "브리지의 바인더 쪽 절반이 없다",
"topic": "transport-and-provider-semantics",
"path": "openquestion/openquestion-messaging-spring-cloud-stream-bridge-f02.md",
"rootTreeNode": "open-question:messaging-spring-cloud-stream-bridge-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d80ceb98e2e6d75377eb5461e2640ff9bcef3f79bca526151d7dd8aba75f0727",
"lines": 49
},
"messaging-testkit-f03": {
"kind": "CASE",
"slug": "messaging-testkit-f03",
"title": "Faults 내부클래스 57줄이 3개 모듈에 바이트 단위로 복제되어 있다",
"topic": "transport-and-provider-semantics",
"path": "case/case-messaging-testkit-f03.md",
"rootTreeNode": "case:messaging-testkit-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "aca3c13e58f17138f13c6eb8da1dd8bcd69be32c892a5a084019cc84e4bcd992",
"lines": 49,
"body": "case/case-messaging-testkit-f03.body.md",
"bodySha256": "4097d4388aae118dd237bf99a08be124b9f0f6a7662b9ece115bda2d9bbae382",
"assets": [
{
"key": "messaging-testkit-f03",
"kind": "terminal"
}
]
},
"messaging-transport-spi-f02": {
"kind": "REFERENCE",
"slug": "messaging-transport-spi-f02",
"title": "멱등 종료를 보장하는 컴포넌트는 종료 이후의 등록도 정의한다",
"topic": "transport-and-provider-semantics",
"path": "reference/reference-messaging-transport-spi-f02.md",
"rootTreeNode": "reference:messaging-transport-spi-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b53f3834af04a78f8d2491e6a42701482dd15a530344058401f6f46b80449100",
"lines": 43
},
"messaging-transport-spi-f03": {
"kind": "REFERENCE",
"slug": "messaging-transport-spi-f03",
"title": "같은 개념의 sentinel은 계층을 넘어 하나로 정한다",
"topic": "transport-and-provider-semantics",
"path": "reference/reference-messaging-transport-spi-f03.md",
"rootTreeNode": "reference:messaging-transport-spi-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5d3c09548dd444e388f447bf8ad1c342fb7cc977afac96bc63a1a1c33f22ca0e",
"lines": 43
},
"grpc-admin-f02": {
"kind": "CASE",
"slug": "grpc-admin-f02",
"title": "비밀 필드 검사가 스냅숏의 네 구획 중 하나에만 적용된다",
"topic": "security-policy-enforcement",
"path": "case/case-grpc-admin-f02.md",
"rootTreeNode": "case:grpc-admin-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "633f2ab49c979694dc3e5b0021c49e0f7c1409bdc2b0ebada12d904b0feb7915",
"lines": 59,
"body": "case/case-grpc-admin-f02.body.md",
"bodySha256": "485afb76a7beffa5052c69c416fc32cdda595407ef5bb1465c9662ea40bcbad6",
"assets": [
{
"key": "grpc-admin-f02",
"kind": "terminal"
}
]
},
"grpc-advanced-diagnostics-f01": {
"kind": "CASE",
"slug": "grpc-advanced-diagnostics-f01",
"title": "마스킹이 IPv4 만 알고, 그 결과 \"마스킹되지 않은 주소\" 검사가 나머지 형태를 전부 통과시킨다",
"topic": "security-policy-enforcement",
"path": "case/case-grpc-advanced-diagnostics-f01.md",
"rootTreeNode": "case:grpc-advanced-diagnostics-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f3d6e82a25202af0fd3e37e003b4ea77cd8f6fad4d48d4c9931c3fec4f5cedeb",
"lines": 59,
"body": "case/case-grpc-advanced-diagnostics-f01.body.md",
"bodySha256": "84fb1471d7c537073c50a6a1884620187eadbd8223a62f621a572ba449a55c42",
"assets": [
{
"key": "grpc-advanced-diagnostics-f01-diagram",
"kind": "diagram"
},
{
"key": "grpc-advanced-diagnostics-f01",
"kind": "terminal"
}
]
},
"grpc-advanced-diagnostics-f02": {
"kind": "CASE",
"slug": "grpc-advanced-diagnostics-f02",
"title": "금지 필드 검사가 키에만 적용되고 값에는 적용되지 않는다",
"topic": "security-policy-enforcement",
"path": "case/case-grpc-advanced-diagnostics-f02.md",
"rootTreeNode": "case:grpc-advanced-diagnostics-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "7a1e735f29887a487138bc54b88ebd419e86625278c25668d920ed14df63d28b",
"lines": 51,
"body": "case/case-grpc-advanced-diagnostics-f02.body.md",
"bodySha256": "e7058f41bed0f23be9ff7e42519a5556fcc50728ffa9df6e90b15a7c514eb5bc",
"assets": [
{
"key": "grpc-advanced-diagnostics-f02",
"kind": "terminal"
}
]
},
"grpc-advanced-edition-f03": {
"kind": "CASE",
"slug": "grpc-advanced-edition-f03",
"title": "정책의 자바독이 하지 않는 거부를 한다고 적고, 승격 승인이 두 곳에 따로 있다",
"topic": "security-policy-enforcement",
"path": "case/case-grpc-advanced-edition-f03.md",
"rootTreeNode": "case:grpc-advanced-edition-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f60da1aeaa2befddcf640f34d5f536e30d1d5abaae0be6be0ac5c1ca07c8c1c6",
"lines": 59,
"body": "case/case-grpc-advanced-edition-f03.body.md",
"bodySha256": "743da9733341b7997e1e222b332d1daaca902eb0017f3075aee5644160d0ec3d",
"assets": [
{
"key": "grpc-advanced-edition-f03",
"kind": "terminal"
}
]
},
"grpc-core-api-f03": {
"kind": "CASE",
"slug": "grpc-core-api-f03",
"title": "RESOURCE_EXHAUSTED 매핑이 그 상태의 두 출처 중 하나만 가정한다",
"topic": "security-policy-enforcement",
"path": "case/case-grpc-core-api-f03.md",
"rootTreeNode": "case:grpc-core-api-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0cd9eff59473e100f6d7efb1083e6be54fa836116a9d3ec839771b7b9826717a",
"lines": 59,
"body": "case/case-grpc-core-api-f03.body.md",
"bodySha256": "612cf132d0b083f5f72aa51361750eaace69bc2f24db8965a15e832555383539",
"assets": [
{
"key": "grpc-core-api-f03",
"kind": "terminal"
}
]
},
"grpc-policy-f01": {
"kind": "CASE",
"slug": "grpc-policy-f01",
"title": "스트림 승인의 경계가 동시성 아래에서 새고, caller별 맵이 줄지 않는다",
"topic": "security-policy-enforcement",
"path": "case/case-grpc-policy-f01.md",
"rootTreeNode": "case:grpc-policy-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "50ade1dcefdeeac7f0d36c29b0566abb808f046e3f6bc8ff99eb5f6ba922f3f2",
"lines": 55,
"body": "case/case-grpc-policy-f01.body.md",
"bodySha256": "e4df9cccde604b9c580dcf702073972beed642c584c67518487fc39deab265c9",
"assets": [
{
"key": "grpc-policy-f01-diagram",
"kind": "diagram"
},
{
"key": "grpc-policy-f01",
"kind": "terminal"
}
]
},
"grpc-policy-f02": {
"kind": "CASE",
"slug": "grpc-policy-f02",
"title": "자격증명 회전이 비교 후 교체가 아니고, 배수 완료가 진행 중인 회전을 되돌릴 수 있다",
"topic": "security-policy-enforcement",
"path": "case/case-grpc-policy-f02.md",
"rootTreeNode": "case:grpc-policy-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f18a1c2d9ee88ddd1438a045ac9b6cc18d4c72444add619e65cc8e8d3eaf8964",
"lines": 59,
"body": "case/case-grpc-policy-f02.body.md",
"bodySha256": "cdbc84c47b08fb7cce71214aa6f84594f9b45e66496b26a870a2e2efbd954e19",
"assets": [
{
"key": "grpc-policy-f02-diagram",
"kind": "diagram"
},
{
"key": "grpc-policy-f02",
"kind": "terminal"
}
]
},
"grpc-server-f04": {
"kind": "CASE",
"slug": "grpc-server-f04",
"title": "승인 제어기의 세 메서드가 원자적이지 않고, 큐 계수기를 되돌리는 경로가 없다",
"topic": "security-policy-enforcement",
"path": "case/case-grpc-server-f04.md",
"rootTreeNode": "case:grpc-server-f04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "60f1de5ff26641ee6c5045e1eded074fbe3afdf31b0b88d2f0e152d3eeae8b9a",
"lines": 59,
"body": "case/case-grpc-server-f04.body.md",
"bodySha256": "7441df9293e3471b7ab719ccbe81ff9965966c33ac1142f13137269e01cab78e",
"assets": [
{
"key": "grpc-server-f04-diagram",
"kind": "diagram"
},
{
"key": "grpc-server-f04",
"kind": "terminal"
}
]
},
"grpc-testkit-f06": {
"kind": "CASE",
"slug": "grpc-testkit-f06",
"title": "던져 버릴 비밀번호를 만들어 놓고 외부 프로세스의 명령줄에 싣는다",
"topic": "security-policy-enforcement",
"path": "case/case-grpc-testkit-f06.md",
"rootTreeNode": "case:grpc-testkit-f06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "47f501c6cdf28c9bddfcf214f62a4e414c484868b967d5129c05b32aaf51703f",
"lines": 57,
"body": "case/case-grpc-testkit-f06.body.md",
"bodySha256": "b42758215beeeff5639f6095387964f85ae277d1b8004b815a8e1f9c4ba37072",
"assets": [
{
"key": "grpc-testkit-f06",
"kind": "terminal"
}
]
},
"messaging-admin-api-f02": {
"kind": "CASE",
"slug": "messaging-admin-api-f02",
"title": "계획 다이제스트가 승인 정규 형식과 다른 인코딩을 쓴다",
"topic": "security-policy-enforcement",
"path": "case/case-messaging-admin-api-f02.md",
"rootTreeNode": "case:messaging-admin-api-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a16db7a7b29c1aeafba6564d369db7fc2f74bba88a755ede32dbca370fb49306",
"lines": 51,
"body": "case/case-messaging-admin-api-f02.body.md",
"bodySha256": "fc4c5749c2ce8fe6294b6be9f7914221d577dd5d71a383dbb7aa01c974e1ce7f",
"assets": [
{
"key": "messaging-admin-api-f02",
"kind": "terminal"
}
]
},
"messaging-admin-api-f05": {
"kind": "CASE",
"slug": "messaging-admin-api-f05",
"title": "VerifiedApproval 의 위조 방지가 package-private 에만 의존한다",
"topic": "security-policy-enforcement",
"path": "case/case-messaging-admin-api-f05.md",
"rootTreeNode": "case:messaging-admin-api-f05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "738ee526eb7af1ba6d2810a0a0590346757394dc18bd99bda9fe6af7c4a8ae20",
"lines": 49,
"body": "case/case-messaging-admin-api-f05.body.md",
"bodySha256": "10b36d612dd01ea4137632e226f489ad5a0fc4176c36556e0861be4777631673",
"assets": [
{
"key": "messaging-admin-api-f05",
"kind": "terminal"
}
]
},
"messaging-admin-api-f07": {
"kind": "CASE",
"slug": "messaging-admin-api-f07",
"title": "같은 인가 실패 코드가 세 파일에 문자열 리터럴로 흩어져 있다",
"topic": "security-policy-enforcement",
"path": "case/case-messaging-admin-api-f07.md",
"rootTreeNode": "case:messaging-admin-api-f07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f6b45d32226626c7135f70efc8c1ad9294c11a909f05169cf02fb85b480068cb",
"lines": 47,
"body": "case/case-messaging-admin-api-f07.body.md",
"bodySha256": "e7f6cc362b1e09e8001f7ad326c64e0a02f54cddee1c11e0c640bb6110552b7d",
"assets": [
{
"key": "messaging-admin-api-f07",
"kind": "terminal"
}
]
},
"messaging-admin-runtime-f01": {
"kind": "CASE",
"slug": "messaging-admin-runtime-f01",
"title": "파괴적 작업의 승인만 위조 가능한 형태로 남아 있다",
"topic": "security-policy-enforcement",
"path": "case/case-messaging-admin-runtime-f01.md",
"rootTreeNode": "case:messaging-admin-runtime-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e469eb3b2e35a7990d1217139675dd64507f5ba88300d7b4157ea598a561e119",
"lines": 55,
"body": "case/case-messaging-admin-runtime-f01.body.md",
"bodySha256": "a9524403e65f17f3a5d6fd82e095ab5bc08b8c23add18e6e629b802cda7d288a",
"assets": [
{
"key": "messaging-admin-runtime-f01-diagram",
"kind": "diagram"
},
{
"key": "messaging-admin-runtime-f01",
"kind": "terminal"
}
]
},
"messaging-admin-runtime-f05": {
"kind": "CASE",
"slug": "messaging-admin-runtime-f05",
"title": "감사 싱크가 중복 선언되어 있고 레닥션 계약이 유실된다",
"topic": "security-policy-enforcement",
"path": "case/case-messaging-admin-runtime-f05.md",
"rootTreeNode": "case:messaging-admin-runtime-f05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "9e8fbf2fb397119f61c4d8914de9c1245c7fc6fffb3a31143afbb701d0cb1110",
"lines": 49,
"body": "case/case-messaging-admin-runtime-f05.body.md",
"bodySha256": "96884a3da2dd6975decaf056a9e145fdf96fb1e69a410322f36a39ac3e2926a7",
"assets": [
{
"key": "messaging-admin-runtime-f05",
"kind": "terminal"
}
]
},
"messaging-admin-runtime-f08": {
"kind": "CASE",
"slug": "messaging-admin-runtime-f08",
"title": "격리 리플레이의 guard 우회가 dryRun 파라미터로 표현된다",
"topic": "security-policy-enforcement",
"path": "case/case-messaging-admin-runtime-f08.md",
"rootTreeNode": "case:messaging-admin-runtime-f08",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "782a4241ccedf5ebd6ae15734373969d28992e9176a601cfb1ec14773d2a46d6",
"lines": 45,
"body": "case/case-messaging-admin-runtime-f08.body.md",
"bodySha256": "daee7e309b3184fba2b025e94b8e89892e75d7304297710c58649cf20f00eb41",
"assets": [
{
"key": "messaging-admin-runtime-f08",
"kind": "terminal"
}
]
},
"messaging-observability-f05": {
"kind": "CASE",
"slug": "messaging-observability-f05",
"title": "자격증명 판정이 core-api보다 약하다",
"topic": "security-policy-enforcement",
"path": "case/case-messaging-observability-f05.md",
"rootTreeNode": "case:messaging-observability-f05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "9f959edc8a2264e10be71d88c572a1b6e51a304aa6431531a479965959559ba1",
"lines": 51,
"body": "case/case-messaging-observability-f05.body.md",
"bodySha256": "5efe87e1b64ad442fe5a62e10d8a77377b234c433e1c2d143bcd6f706f5bc653",
"assets": [
{
"key": "messaging-observability-f05",
"kind": "terminal"
}
]
},
"messaging-security-f01": {
"kind": "CASE",
"slug": "messaging-security-f01",
"title": "같은 TLS posture를 두 클래스가 다른 엄격도로 검사한다",
"topic": "security-policy-enforcement",
"path": "case/case-messaging-security-f01.md",
"rootTreeNode": "case:messaging-security-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d977ce0a34e608198f09d03fa41b41e81d4caac02b7afa84e848cd53ab39fbb3",
"lines": 51,
"body": "case/case-messaging-security-f01.body.md",
"bodySha256": "e8be6342f49e4c1152de54921d06f6a2fa338c5dce41687f8199f4bf367908e9",
"assets": [
{
"key": "messaging-security-f01-diagram",
"kind": "diagram"
},
{
"key": "messaging-security-f01",
"kind": "terminal"
}
]
},
"messaging-security-f02": {
"kind": "CASE",
"slug": "messaging-security-f02",
"title": "권한 거부가 AUTHORIZATION이 아니라 CONFIGURATION으로 기록된다",
"topic": "security-policy-enforcement",
"path": "case/case-messaging-security-f02.md",
"rootTreeNode": "case:messaging-security-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "acb81dd04f221934cfd57c9089d8288448e912db412f58f5e731708d291b982d",
"lines": 51,
"body": "case/case-messaging-security-f02.body.md",
"bodySha256": "684fa661a8382070a6cb60ce30080fffda84faf1261897e95e2c6521f5e0144c",
"assets": [
{
"key": "messaging-security-f02-diagram",
"kind": "diagram"
},
{
"key": "messaging-security-f02",
"kind": "terminal"
}
]
},
"messaging-security-f03": {
"kind": "QUESTION",
"slug": "messaging-security-f03",
"title": "ACL 매니페스트 전체가 쓰이지 않는다",
"topic": "security-policy-enforcement",
"path": "openquestion/openquestion-messaging-security-f03.md",
"rootTreeNode": "open-question:messaging-security-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "ee1f96eb1ea8ac9588613692a9b9a931f6984bfe1530f784191765ba126dead3",
"lines": 49
},
"messaging-security-f06": {
"kind": "REFERENCE",
"slug": "messaging-security-f06",
"title": "맵 갱신 함수 안에서 I/O를 하면 그 지연이 락 범위가 된다",
"topic": "security-policy-enforcement",
"path": "reference/reference-messaging-security-f06.md",
"rootTreeNode": "reference:messaging-security-f06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f8211bce731ece4ae084d19eba519b7a02fe3870241b0092ccd6404a2cb9799a",
"lines": 43
},
"grpc-advanced-bootstrap-f02": {
"kind": "CASE",
"slug": "grpc-advanced-bootstrap-f02",
"title": "승격 게이트가 하향 전이도 승격 규칙으로 판정하고, javadoc 이 약속한 거부는 없다",
"topic": "declaration-and-document-drift",
"path": "case/case-grpc-advanced-bootstrap-f02.md",
"rootTreeNode": "case:grpc-advanced-bootstrap-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f5d3e894982e70739c4ff03288a8ecc461b64c121556b8d9c36a3fa53e6e5e4f",
"lines": 57,
"body": "case/case-grpc-advanced-bootstrap-f02.body.md",
"bodySha256": "8b3f6937ffc46a2f314abea311322b2c1a1ff4a4e261953558becbf5f6a0590a",
"assets": [
{
"key": "grpc-advanced-bootstrap-f02",
"kind": "terminal"
}
]
},
"grpc-advanced-edition-f02": {
"kind": "CASE",
"slug": "grpc-advanced-edition-f02",
"title": "승격 차단 목록에 담금 기간과 실환경 항목이 없다",
"topic": "declaration-and-document-drift",
"path": "case/case-grpc-advanced-edition-f02.md",
"rootTreeNode": "case:grpc-advanced-edition-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "8cb9ab1405f035ff52891c223f6f06d48c41a025babca70b5eaa042c70ec40bd",
"lines": 53,
"body": "case/case-grpc-advanced-edition-f02.body.md",
"bodySha256": "5972ccf676ca1c86ba541cc52fb8164224b86973f2042d398d03590495d6ab8c",
"assets": [
{
"key": "grpc-advanced-edition-f02",
"kind": "terminal"
}
]
},
"grpc-advanced-resilience-f01": {
"kind": "CASE",
"slug": "grpc-advanced-resilience-f01",
"title": "부트스트랩 대조가 문서 어디든의 부분 문자열을 본다",
"topic": "declaration-and-document-drift",
"path": "case/case-grpc-advanced-resilience-f01.md",
"rootTreeNode": "case:grpc-advanced-resilience-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "4244cb35b9218d78169059097b96f07c5a6d08ae8284681e0aa76a6bd24d0e23",
"lines": 59,
"body": "case/case-grpc-advanced-resilience-f01.body.md",
"bodySha256": "487acbb26345d706414bfa2bfabac393aedaa9041484bb24cbf3f38b52f7935e",
"assets": [
{
"key": "grpc-advanced-resilience-f01",
"kind": "terminal"
}
]
},
"grpc-client-f04": {
"kind": "CASE",
"slug": "grpc-client-f04",
"title": "프로파일 검증기가 javadoc 이 든 두 실수 중 하나만 검사한다",
"topic": "declaration-and-document-drift",
"path": "case/case-grpc-client-f04.md",
"rootTreeNode": "case:grpc-client-f04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0d4935815fa0ded9e21bdb448935dfa9fee7c66a169dc9dd16302b2374d15410",
"lines": 51,
"body": "case/case-grpc-client-f04.body.md",
"bodySha256": "39951448d58d79bc633887b3a31be2bcdb4c6b3b14aa34912b1dc3252419d976",
"assets": [
{
"key": "grpc-client-f04",
"kind": "terminal"
}
]
},
"grpc-discovery-f02": {
"kind": "CASE",
"slug": "grpc-discovery-f02",
"title": "리졸버 검증기의 규칙이 하나뿐인데 javadoc 은 복수형으로 서술한다",
"topic": "declaration-and-document-drift",
"path": "case/case-grpc-discovery-f02.md",
"rootTreeNode": "case:grpc-discovery-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "ed9aea0bf33eff0d65016356e8b48b0b78372c88849197a80f1b17a3b5e77587",
"lines": 49,
"body": "case/case-grpc-discovery-f02.body.md",
"bodySha256": "b079dce0a1ba32920757f4cb0ec1a1489eca1f60a6342873509a273f5f4f150c",
"assets": [
{
"key": "grpc-discovery-f02",
"kind": "terminal"
}
]
},
"grpc-observability-f02": {
"kind": "CASE",
"slug": "grpc-observability-f02",
"title": "deadlineRemaining 도 meter 가 없다. javadoc 은 그것이 기록된다고 말한다",
"topic": "declaration-and-document-drift",
"path": "case/case-grpc-observability-f02.md",
"rootTreeNode": "case:grpc-observability-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "4277daa808500198f5953704142e7308ea3738f802e9f64de14c07893a0a9b2c",
"lines": 59,
"body": "case/case-grpc-observability-f02.body.md",
"bodySha256": "69b66e53d0b304f668b07b7f2a72f26ff73e7540fbcfc12ed2de35af93e335eb",
"assets": [
{
"key": "grpc-observability-f02",
"kind": "terminal"
}
]
},
"grpc-policy-f06": {
"kind": "CASE",
"slug": "grpc-policy-f06",
"title": "오류 노출 거부 목록의 \"호스트와 포트\" 규칙이 IPv4 점표기만 본다",
"topic": "declaration-and-document-drift",
"path": "case/case-grpc-policy-f06.md",
"rootTreeNode": "case:grpc-policy-f06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "6be9be312c21e8ffd126ddb095c7d5b3cfcf34ba9998832e42368269f12bce35",
"lines": 59,
"body": "case/case-grpc-policy-f06.body.md",
"bodySha256": "33084d8daba7ab2739a73cfda9c58797cf0200fed7f243ad570f483dc4a24bd3",
"assets": [
{
"key": "grpc-policy-f06",
"kind": "terminal"
}
]
},
"grpc-proto-contract-f02": {
"kind": "CASE",
"slug": "grpc-proto-contract-f02",
"title": "반환 목록이 자바독이 약속한 source order 가 아니다",
"topic": "declaration-and-document-drift",
"path": "case/case-grpc-proto-contract-f02.md",
"rootTreeNode": "case:grpc-proto-contract-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "88df700bf9da7edd3787ae79c60c3df461618cacc000630259bd547bb432ed78",
"lines": 47,
"body": "case/case-grpc-proto-contract-f02.body.md",
"bodySha256": "0191f97dcc53e409d572c2ad1a94e3256015fe19e49899dc15b107bd20e94e8f",
"assets": [
{
"key": "grpc-proto-contract-f02",
"kind": "terminal"
}
]
},
"grpc-server-f02": {
"kind": "CASE",
"slug": "grpc-server-f02",
"title": "원시 API 규칙이 import 문만 보므로 완전 수식 사용과 와일드카드를 놓친다",
"topic": "declaration-and-document-drift",
"path": "case/case-grpc-server-f02.md",
"rootTreeNode": "case:grpc-server-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5351ba015185c9e439dfb839fcfd27a54eef704f1e5b662be7b193a6f96e3d2f",
"lines": 53,
"body": "case/case-grpc-server-f02.body.md",
"bodySha256": "ffc02380169632e0d1184f2bba1a7053162a4d0c615839d32cc9c6d54622e0f6",
"assets": [
{
"key": "grpc-server-f02",
"kind": "terminal"
}
]
},
"messaging-cloudevents-f05": {
"kind": "REFERENCE",
"slug": "messaging-cloudevents-f05",
"title": "문서가 범위를 제한하면 그 제한을 누가 강제하는지 같이 적는다",
"topic": "declaration-and-document-drift",
"path": "reference/reference-messaging-cloudevents-f05.md",
"rootTreeNode": "reference:messaging-cloudevents-f05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "8496adc0dc28e64d771b8ea507cdb820fa3bc58200ae1076bb4ba52f098370ed",
"lines": 43
},
"messaging-inbox-jdbc-postgresql-f04": {
"kind": "QUESTION",
"slug": "messaging-inbox-jdbc-postgresql-f04",
"title": "세 갈래 판정이 포트의 boolean에서 두 갈래로 접힌다",
"topic": "declaration-and-document-drift",
"path": "openquestion/openquestion-messaging-inbox-jdbc-postgresql-f04.md",
"rootTreeNode": "open-question:messaging-inbox-jdbc-postgresql-f04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "daac2658f7ba951ca52aebf57155b544f128561fb4768f8ecb28e63e052295a6",
"lines": 49
},
"messaging-kafka-f01": {
"kind": "CASE",
"slug": "messaging-kafka-f01",
"title": "deduplicatedPublish 를 문서는 지원으로 적고 코드는 거짓으로 둔다",
"topic": "declaration-and-document-drift",
"path": "case/case-messaging-kafka-f01.md",
"rootTreeNode": "case:messaging-kafka-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "349c1f57ddc4fc1a3bc980aa9bd968665691390be03d8a5861ca5280c8944b2a",
"lines": 55,
"body": "case/case-messaging-kafka-f01.body.md",
"bodySha256": "111a04fd3fa5a7bc1f3c9a7363fa71697594f4ba61848fb3fcaac8078772a560",
"assets": [
{
"key": "messaging-kafka-f01-diagram",
"kind": "diagram"
},
{
"key": "messaging-kafka-f01",
"kind": "terminal"
}
]
},
"messaging-observability-f01": {
"kind": "CASE",
"slug": "messaging-observability-f01",
"title": "태그 어휘가 존재하고 유일한 호출부가 우회해, 실패 분류가 기록되지 않는다",
"topic": "declaration-and-document-drift",
"path": "case/case-messaging-observability-f01.md",
"rootTreeNode": "case:messaging-observability-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f12ae30b41d1a2b86bd3b5fd02efe82b1be4f6692e4af5540225a9113ddf73c0",
"lines": 55,
"body": "case/case-messaging-observability-f01.body.md",
"bodySha256": "8f90e4323c7b1457907cdc07dd544d4d24c86db91a2ec65f651784fcb8874b69",
"assets": [
{
"key": "messaging-observability-f01-diagram",
"kind": "diagram"
},
{
"key": "messaging-observability-f01",
"kind": "terminal"
}
]
},
"messaging-observability-f06": {
"kind": "REFERENCE",
"slug": "messaging-observability-f06",
"title": "타입이 문서화한 불변식은 타입이 강제한다",
"topic": "declaration-and-document-drift",
"path": "reference/reference-messaging-observability-f06.md",
"rootTreeNode": "reference:messaging-observability-f06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "6a505ed7a460e0d02f80f436c14ca5849996e5582b9a7b025972349538425f71",
"lines": 43
},
"messaging-outbox-jdbc-postgresql-f06": {
"kind": "CASE",
"slug": "messaging-outbox-jdbc-postgresql-f06",
"title": "백오프 지터가 인스턴스를 분산시키지 못한다",
"topic": "declaration-and-document-drift",
"path": "case/case-messaging-outbox-jdbc-postgresql-f06.md",
"rootTreeNode": "case:messaging-outbox-jdbc-postgresql-f06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "718ed99d99864b982c20f00d8dca1514e207c3e26d03cb0308a86bf4d5a3785c",
"lines": 51,
"body": "case/case-messaging-outbox-jdbc-postgresql-f06.body.md",
"bodySha256": "431538a349dbe05d0a78ecc375bb8e6e1343baf2461ec4bc867ed883c130ec25",
"assets": [
{
"key": "messaging-outbox-jdbc-postgresql-f06",
"kind": "terminal"
}
]
},
"messaging-outbox-jdbc-postgresql-f07": {
"kind": "CASE",
"slug": "messaging-outbox-jdbc-postgresql-f07",
"title": "커넥션 획득 방식이 리프 안에서 갈린다",
"topic": "declaration-and-document-drift",
"path": "case/case-messaging-outbox-jdbc-postgresql-f07.md",
"rootTreeNode": "case:messaging-outbox-jdbc-postgresql-f07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e2d7fdfa9f0fcf405ffc5d975e934af20580f54f024fcb1239f6012027a00612",
"lines": 47,
"body": "case/case-messaging-outbox-jdbc-postgresql-f07.body.md",
"bodySha256": "9e46f95dbc926563cc3d5bb8988facc85af5ea5042f8d59b1ce4802357697b77",
"assets": [
{
"key": "messaging-outbox-jdbc-postgresql-f07",
"kind": "terminal"
}
]
},
"messaging-policy-f06": {
"kind": "REFERENCE",
"slug": "messaging-policy-f06",
"title": "구성 오류는 한 예외 타입과 안정 코드로 보고한다",
"topic": "declaration-and-document-drift",
"path": "reference/reference-messaging-policy-f06.md",
"rootTreeNode": "reference:messaging-policy-f06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f6899f3827bb242846ed6a49c4ddc79d8c00f07f3b88cc7f2f6171b57ce954c7",
"lines": 43
},
"messaging-policy-f07": {
"kind": "REFERENCE",
"slug": "messaging-policy-f07",
"title": "저장소 밖 문서를 절 번호로 인용하지 않는다",
"topic": "declaration-and-document-drift",
"path": "reference/reference-messaging-policy-f07.md",
"rootTreeNode": "reference:messaging-policy-f07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "eeceb31cc367a5a31e2d1754416cbabb68481531d1c0c7a4c0f798af8a91cc8b",
"lines": 43
},
"messaging-reliability-api-f06": {
"kind": "REFERENCE",
"slug": "messaging-reliability-api-f06",
"title": "호출 컨텍스트가 계약이면 그 컨텍스트를 검증할 수단을 함께 정한다",
"topic": "declaration-and-document-drift",
"path": "reference/reference-messaging-reliability-api-f06.md",
"rootTreeNode": "reference:messaging-reliability-api-f06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "521656014d9485d9023ce2bd3d24dd40ac356d61658b7aacc998145adca1760e",
"lines": 43
},
"messaging-schema-api-f02": {
"kind": "REFERENCE",
"slug": "messaging-schema-api-f02",
"title": "port 계약은 동시성 요구를 적는다",
"topic": "declaration-and-document-drift",
"path": "reference/reference-messaging-schema-api-f02.md",
"rootTreeNode": "reference:messaging-schema-api-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "c97d46249721f225398bedbae7c140f80edc69d8bd0d33a90a25b5c9aa844a52",
"lines": 43
},
"messaging-schema-api-f03": {
"kind": "REFERENCE",
"slug": "messaging-schema-api-f03",
"title": "도달성 판정은 단어가 아니라 import로 확인한다",
"topic": "declaration-and-document-drift",
"path": "reference/reference-messaging-schema-api-f03.md",
"rootTreeNode": "reference:messaging-schema-api-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "16b8efe68fca99c8f9972e3f0368ec8b1bf64d7944b38c9378c34afcbe72acb7",
"lines": 43
},
"messaging-schema-avro-f01": {
"kind": "CASE",
"slug": "messaging-schema-avro-f01",
"title": "CI에서 돈다고 선언한 게이트를 부르는 CI가 없다",
"topic": "declaration-and-document-drift",
"path": "case/case-messaging-schema-avro-f01.md",
"rootTreeNode": "case:messaging-schema-avro-f01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "c85a91fb971ecc1df3087aa52e52cc42e2213fc7b2e35a259b223087f0949e96",
"lines": 47,
"body": "case/case-messaging-schema-avro-f01.body.md",
"bodySha256": "1ddd2b22845ef73f947088a10b31b756e12fde733bcb7b4d94467543e4b92f6d",
"assets": [
{
"key": "messaging-schema-avro-f01-diagram",
"kind": "diagram"
},
{
"key": "messaging-schema-avro-f01",
"kind": "terminal"
}
]
},
"messaging-spring-boot-starter-f02": {
"kind": "CASE",
"slug": "messaging-spring-boot-starter-f02",
"title": "출고되는 신뢰성 체인 전체가 아무도 공급하지 않는 빈 뒤에 있고, 그 사슬이 자기 클래스 안을 가리킨다",
"topic": "declaration-and-document-drift",
"path": "case/case-messaging-spring-boot-starter-f02.md",
"rootTreeNode": "case:messaging-spring-boot-starter-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "3f439c8e96c47a1f09e6716392765452346ef288ef75c955398994b612e54c58",
"lines": 59,
"body": "case/case-messaging-spring-boot-starter-f02.body.md",
"bodySha256": "531f8a8fe3ae917df7f199f2bcfc4d60c0dff8525d82893f00c41ee10012ff2f",
"assets": [
{
"key": "messaging-spring-boot-starter-f02-diagram",
"kind": "diagram"
},
{
"key": "messaging-spring-boot-starter-f02",
"kind": "terminal"
}
]
},
"messaging-spring-boot-starter-f04": {
"kind": "CASE",
"slug": "messaging-spring-boot-starter-f04",
"title": "설정 경로의 재시도가 예외 분류를 표현할 수 없다",
"topic": "declaration-and-document-drift",
"path": "case/case-messaging-spring-boot-starter-f04.md",
"rootTreeNode": "case:messaging-spring-boot-starter-f04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5ea1b6319f80d03f65e979dc36a6f656677679fbc1767a513caa19b271c79555",
"lines": 55,
"body": "case/case-messaging-spring-boot-starter-f04.body.md",
"bodySha256": "c075a9de05111d2b243b4f7f92f007841702fabe75f07bc202a2a03a80428f6c",
"assets": [
{
"key": "messaging-spring-boot-starter-f04",
"kind": "terminal"
}
]
},
"messaging-spring-cloud-stream-bridge-f03": {
"kind": "REFERENCE",
"slug": "messaging-spring-cloud-stream-bridge-f03",
"title": "한 개념의 등록 상태를 두 객체가 나눠 갖지 않는다",
"topic": "declaration-and-document-drift",
"path": "reference/reference-messaging-spring-cloud-stream-bridge-f03.md",
"rootTreeNode": "reference:messaging-spring-cloud-stream-bridge-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d2f247bc664db9525a15986844551fc8fcd979e678fc56cf33f6944bd6919cfc",
"lines": 43
},
"messaging-testkit-f02": {
"kind": "CASE",
"slug": "messaging-testkit-f02",
"title": "클래스 javadoc 이 강제되지 않는 규칙을 강제된다고 말한다",
"topic": "declaration-and-document-drift",
"path": "case/case-messaging-testkit-f02.md",
"rootTreeNode": "case:messaging-testkit-f02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "7f510e99f5a0f633327835e2c34626fb78c5538571c18dbdbd41d83c753d39af",
"lines": 59,
"body": "case/case-messaging-testkit-f02.body.md",
"bodySha256": "4177c6acf52475a7539b7e68649758e31a32a30eeccb722a82607c7853044822",
"assets": [
{
"key": "messaging-testkit-f02-diagram",
"kind": "diagram"
},
{
"key": "messaging-testkit-f02",
"kind": "terminal"
}
]
},
"messaging-testkit-f08": {
"kind": "CASE",
"slug": "messaging-testkit-f08",
"title": "gitCommit 은 기록되지만 읽혀 판정되지 않는다",
"topic": "declaration-and-document-drift",
"path": "case/case-messaging-testkit-f08.md",
"rootTreeNode": "case:messaging-testkit-f08",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5e6344d8a303bedc8a55ba87a8cd282512dff6b9b172079434c7b07c4161b080",
"lines": 45,
"body": "case/case-messaging-testkit-f08.body.md",
"bodySha256": "b67fa0b3b28a9ca6614c349d15655f4ac10a30852739314f90420b539d04f39a",
"assets": [
{
"key": "messaging-testkit-f08",
"kind": "terminal"
}
]
},
"grpc-core-api-f04": {
"kind": "CASE",
"slug": "grpc-core-api-f04",
"title": "하나의 상태 코드가 같은 메서드 안에서 두 답을 갖는다",
"topic": "runtime-contract-correctness",
"path": "case/case-grpc-core-api-f04.md",
"rootTreeNode": "case:grpc-core-api-f04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d379787bd103c370702b09fd0b1ece83410d07251602728c885a57cea9765c64",
"lines": 55,
"body": "case/case-grpc-core-api-f04.body.md",
"bodySha256": "40e33cd21033a1026d1449cdb7a6a0be301897f6b7f2010a28bc69fe0a7b0166",
"assets": [
{
"key": "grpc-core-api-f04",
"kind": "terminal"
}
]
},
"grpc-observability-f03": {
"kind": "CASE",
"slug": "grpc-observability-f03",
"title": "허용 태그 8개 중 둘은 값이 자유 문자열이고, 그중 하나는 bounded 열거형이 이미 존재한다",
"topic": "runtime-contract-correctness",
"path": "case/case-grpc-observability-f03.md",
"rootTreeNode": "case:grpc-observability-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "aa44fb6614f9d37dae53bf669f615d2ca5becb854d95f2929315ea6059f812f8",
"lines": 55,
"body": "case/case-grpc-observability-f03.body.md",
"bodySha256": "219ffad885cc55df2a86c8c2fbe72924cf81a06512ac226dced591bca10eef52",
"assets": [
{
"key": "grpc-observability-f03",
"kind": "terminal"
}
]
},
"grpc-spring-boot-starter-f04": {
"kind": "CASE",
"slug": "grpc-spring-boot-starter-f04",
"title": "반사 모드를 명시하면 서비스·역할 허용 목록이 조용히 하드코딩으로 바뀐다",
"topic": "runtime-contract-correctness",
"path": "case/case-grpc-spring-boot-starter-f04.md",
"rootTreeNode": "case:grpc-spring-boot-starter-f04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "9f59de64816bf05af1c8d717ce41c80abb9f009500ba0774af3e88bb1b79ddde",
"lines": 57,
"body": "case/case-grpc-spring-boot-starter-f04.body.md",
"bodySha256": "c6cd62cf45d46ca95ecff35ae499b46a0dd04b606acb73ab86b1585e03767f05",
"assets": [
{
"key": "grpc-spring-boot-starter-f04",
"kind": "terminal"
}
]
},
"messaging-claim-check-f03": {
"kind": "CASE",
"slug": "messaging-claim-check-f03",
"title": "예외 승격이 에러 코드 문자열 접미사에 의존한다",
"topic": "runtime-contract-correctness",
"path": "case/case-messaging-claim-check-f03.md",
"rootTreeNode": "case:messaging-claim-check-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b74996e4557f5227b0d13fcbddde88bad775554b3f495f37a8271876e1636532",
"lines": 47,
"body": "case/case-messaging-claim-check-f03.body.md",
"bodySha256": "ca67a8899525833969d315e485d58dcd6d997e9747ee6c40845436575dc6e62e",
"assets": [
{
"key": "messaging-claim-check-f03",
"kind": "terminal"
}
]
},
"messaging-core-api-f04": {
"kind": "CASE",
"slug": "messaging-core-api-f04",
"title": "MessagingRedactor가 상수 대신 문자열 리터럴을 쓴다",
"topic": "runtime-contract-correctness",
"path": "case/case-messaging-core-api-f04.md",
"rootTreeNode": "case:messaging-core-api-f04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "028d925df262333138dd580c9fdbb5444df026183e0c50e130b6cdbc926457a3",
"lines": 47,
"body": "case/case-messaging-core-api-f04.body.md",
"bodySha256": "72e9cd1fe7f0d7c07df18d00c4705bc73df7c7499714e23b9cdfb3f2740bf8f9",
"assets": [
{
"key": "messaging-core-api-f04",
"kind": "terminal"
}
]
},
"messaging-kafka-share-experimental-f04": {
"kind": "REFERENCE",
"slug": "messaging-kafka-share-experimental-f04",
"title": "구성 오류는 한 예외 타입과 안정 코드로 보고한다",
"topic": "runtime-contract-correctness",
"path": "reference/reference-messaging-kafka-share-experimental-f04.md",
"rootTreeNode": "reference:messaging-kafka-share-experimental-f04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "94a96877f2fd05da535f5b8e0291fea3a4f3ecf1e7b54768a58a892ba048c81f",
"lines": 43
},
"messaging-outbox-jdbc-postgresql-f05": {
"kind": "CASE",
"slug": "messaging-outbox-jdbc-postgresql-f05",
"title": "구세대 전이 메서드가 신세대와 다른 행 상태를 남긴다",
"topic": "runtime-contract-correctness",
"path": "case/case-messaging-outbox-jdbc-postgresql-f05.md",
"rootTreeNode": "case:messaging-outbox-jdbc-postgresql-f05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "713d9ca61104bafbc8989a297db2d7076aaaa44234209aa55629405f738ea8d0",
"lines": 53,
"body": "case/case-messaging-outbox-jdbc-postgresql-f05.body.md",
"bodySha256": "d6ae1858386a8814171afa2d871708193142ce58ac1aa8e0ee8aa3361d7b5563",
"assets": [
{
"key": "messaging-outbox-jdbc-postgresql-f05",
"kind": "terminal"
}
]
},
"messaging-outbox-jdbc-postgresql-f08": {
"kind": "CASE",
"slug": "messaging-outbox-jdbc-postgresql-f08",
"title": "maxBatches 가 하드코딩이고 현재는 의미가 없다",
"topic": "runtime-contract-correctness",
"path": "case/case-messaging-outbox-jdbc-postgresql-f08.md",
"rootTreeNode": "case:messaging-outbox-jdbc-postgresql-f08",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "fd147456deb24b87454873d0b083797b75058f1431798b0a5d3930cb297d89b8",
"lines": 45,
"body": "case/case-messaging-outbox-jdbc-postgresql-f08.body.md",
"bodySha256": "58df408d59d0674557920f78d932665350adc60ddeb81d7bdf730d29ce7eee50",
"assets": [
{
"key": "messaging-outbox-jdbc-postgresql-f08",
"kind": "terminal"
}
]
},
"messaging-policy-f05": {
"kind": "REFERENCE",
"slug": "messaging-policy-f05",
"title": "부팅 경로의 알고리즘 복잡도는 문서화한다",
"topic": "runtime-contract-correctness",
"path": "reference/reference-messaging-policy-f05.md",
"rootTreeNode": "reference:messaging-policy-f05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "39be593e5c02a1116d32bb3787b90b4fd919af69ef10cf3e787beeb7c50e0d5d",
"lines": 43
},
"messaging-runtime-core-f05": {
"kind": "REFERENCE",
"slug": "messaging-runtime-core-f05",
"title": "CompletionStage를 반환하는 메서드는 동기적으로 던지지 않는다",
"topic": "runtime-contract-correctness",
"path": "reference/reference-messaging-runtime-core-f05.md",
"rootTreeNode": "reference:messaging-runtime-core-f05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "8256eef40316d11aa71eb8b4f4eabe3155521cefaf5e652138c322945ba34de4",
"lines": 43
},
"messaging-spring-boot-starter-f03": {
"kind": "CASE",
"slug": "messaging-spring-boot-starter-f03",
"title": "죽은 매개변수 하나가 유일한 비기본값에서 NPE 를 낳는다",
"topic": "runtime-contract-correctness",
"path": "case/case-messaging-spring-boot-starter-f03.md",
"rootTreeNode": "case:messaging-spring-boot-starter-f03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "671a2b28b6e1f10fe39a924775d0b2eae2393aaf11120dd3fe544966f638af6b",
"lines": 51,
"body": "case/case-messaging-spring-boot-starter-f03.body.md",
"bodySha256": "b9cd33a4660f971a48e6fd760f0b56efc920c48be048c5e61785f54c69adea94",
"assets": [
{
"key": "messaging-spring-boot-starter-f03",
"kind": "terminal"
}
]
},
"messaging-migration-stream-has-no-applier-and-collides-on-adoption": {
"kind": "CASE",
"slug": "messaging-migration-stream-has-no-applier-and-collides-on-adoption",
"title": "messaging 마이그레이션 스트림을 적용하는 곳이 없고, 적용하려는 순간 버전이 충돌한다",
"topic": "cross-leaf-integration-facts",
"path": "case/case-messaging-migration-stream-has-no-applier-and-collides-on-adoption.md",
"rootTreeNode": "case:messaging-migration-stream-has-no-applier-and-collides-on-adoption",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d4d8af0f9685f8ce58ab238457aea8a8b25b5f7d9fcd2685fd30a8f77318599f",
"lines": 54,
"body": "case/case-messaging-migration-stream-has-no-applier-and-collides-on-adoption.body.md",
"bodySha256": "6a958fc438669e8821d28e4b1231943673832ac7801b082aaa3d4893db314bfe",
"assets": [
{
"key": "messaging-migration-stream-has-no-applier-and-collides-on-adoption-diagram",
"kind": "diagram"
},
{
"key": "messaging-migration-stream-has-no-applier-and-collides-on-adoption",
"kind": "terminal"
}
]
},
"claim-check-has-no-wiring-line-in-the-starter": {
"kind": "CASE",
"slug": "claim-check-has-no-wiring-line-in-the-starter",
"title": "claim-check는 starter에 배선 코드가 한 줄도 없다",
"topic": "cross-leaf-integration-facts",
"path": "case/case-claim-check-has-no-wiring-line-in-the-starter.md",
"rootTreeNode": "case:claim-check-has-no-wiring-line-in-the-starter",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "54eb02b0977bac9442afd261486b29c4f86d7f6fc71de414bebf4648a7317b13",
"lines": 45,
"body": "case/case-claim-check-has-no-wiring-line-in-the-starter.body.md",
"bodySha256": "9a07aa401286710d7ab9e5084b72c6acb69418a044ed5fb2c0d1fcd49d541d6a",
"assets": [
{
"key": "claim-check-has-no-wiring-line-in-the-starter",
"kind": "terminal"
}
]
},
"the-admin-switch-turns-on-the-guard-and-not-the-service": {
"kind": "CASE",
"slug": "the-admin-switch-turns-on-the-guard-and-not-the-service",
"title": "admin 스위치가 가드를 켜고 서비스는 켜지 않는다",
"topic": "cross-leaf-integration-facts",
"path": "case/case-the-admin-switch-turns-on-the-guard-and-not-the-service.md",
"rootTreeNode": "case:the-admin-switch-turns-on-the-guard-and-not-the-service",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "9400bb029752aff20e8c9e94c040de2a8b56e3eb814e8420a4a74fd17baf9451",
"lines": 47,
"body": "case/case-the-admin-switch-turns-on-the-guard-and-not-the-service.body.md",
"bodySha256": "60f451bb92194b7eca27b6b79da848460186a73090d2cec09fecd5479f802755",
"assets": [
{
"key": "the-admin-switch-turns-on-the-guard-and-not-the-service-diagram",
"kind": "diagram"
},
{
"key": "the-admin-switch-turns-on-the-guard-and-not-the-service",
"kind": "terminal"
}
]
},
"twenty-five-main-files-and-one-test-file": {
"kind": "CASE",
"slug": "twenty-five-main-files-and-one-test-file",
"title": "messaging-admin-api는 main 25파일 · 1,613 LOC에 테스트 파일이 1개다",
"topic": "cross-leaf-integration-facts",
"path": "case/case-twenty-five-main-files-and-one-test-file.md",
"rootTreeNode": "case:twenty-five-main-files-and-one-test-file",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "89e271cf330970c8685b4192c522a3733a9483e47c9f1eadee4d4e29b570b4a5",
"lines": 45,
"body": "case/case-twenty-five-main-files-and-one-test-file.body.md",
"bodySha256": "0a8bb2d3aadfd5e2eb7782e1cec1e28e5d86e4b42be5c1e70e5d73f8b05b4744",
"assets": [
{
"key": "twenty-five-main-files-and-one-test-file",
"kind": "terminal"
}
]
},
"the-public-surface-contract-test-lives-outside-the-family": {
"kind": "CASE",
"slug": "the-public-surface-contract-test-lives-outside-the-family",
"title": "MessagingPublicSurfaceContractTest가 가족 밖(app-bootstrap)에 있다",
"topic": "cross-leaf-integration-facts",
"path": "case/case-the-public-surface-contract-test-lives-outside-the-family.md",
"rootTreeNode": "case:the-public-surface-contract-test-lives-outside-the-family",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "70e92a279eeafd6cecde986c6f7cd9303f092283622042a4d44b533c2f34112c",
"lines": 45,
"body": "case/case-the-public-surface-contract-test-lives-outside-the-family.body.md",
"bodySha256": "99ce7f537722df74c8ca47542e18649b1a9c4bdfe6042bc18d8c9f2d9cfa15f8",
"assets": [
{
"key": "the-public-surface-contract-test-lives-outside-the-family",
"kind": "terminal"
}
]
},
"adapter-inbound-web-c19": {
"kind": "CONCEPT",
"slug": "adapter-inbound-web-c19",
"title": "상속으로 강제하는 계약과 태스크 그래프로 강제하는 계약",
"topic": "identity-and-value-contracts",
"path": "concept/concept-adapter-inbound-web-c19.md",
"rootTreeNode": "concept:adapter-inbound-web-c19",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5087d86037fffab2877aa8c461f18aad2143d177ab77a1b08c23e7518afd7fd2",
"lines": 32,
"body": "concept/concept-adapter-inbound-web-c19.body.md",
"bodySha256": "ccbbf7d9a6386afb278e4d8556cd7c3a5b9d0c521c5427cb548f9c2825a0012b",
"assets": [
{
"key": "adapter-inbound-web-c19",
"kind": "terminal"
}
]
},
"adapter-outbound-cache-redis-c03": {
"kind": "CONCEPT",
"slug": "adapter-outbound-cache-redis-c03",
"title": "부재 주장을 지키는 세 자리 — 선언·구현·정책",
"topic": "identity-and-value-contracts",
"path": "concept/concept-adapter-outbound-cache-redis-c03.md",
"rootTreeNode": "concept:adapter-outbound-cache-redis-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b53edef10f938d4b0249b5e708d43a564a0c7b252b936ef99bc24ee521d7b7e7",
"lines": 40,
"body": "concept/concept-adapter-outbound-cache-redis-c03.body.md",
"bodySha256": "29777e28e8ff3296a8f0f63de0213b600ecdf21fbed3e55d9827226511ed46d7",
"assets": [
{
"key": "adapter-outbound-cache-redis-c03-diagram",
"kind": "diagram"
},
{
"key": "adapter-outbound-cache-redis-c03",
"kind": "terminal"
}
]
},
"adapter-outbound-notification-c05": {
"kind": "CONCEPT",
"slug": "adapter-outbound-notification-c05",
"title": "SSRF 가드의 호출처 둘과 javadoc이 지목하는 둘이 다르다",
"topic": "identity-and-value-contracts",
"path": "concept/concept-adapter-outbound-notification-c05.md",
"rootTreeNode": "concept:adapter-outbound-notification-c05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "6571c5ffa093c13ee58ffb61b07d2b00e841057922783ab40792d529355207ea",
"lines": 32,
"body": "concept/concept-adapter-outbound-notification-c05.body.md",
"bodySha256": "1fd2e6079ca672464043697342140465143c1c1cd157137a4bffc0df0f890813",
"assets": [
{
"key": "adapter-outbound-notification-c05",
"kind": "terminal"
}
]
},
"adapter-outbound-notification-c06": {
"kind": "CONCEPT",
"slug": "adapter-outbound-notification-c06",
"title": "상속을 강제하는 장치가 없어 8종 중 3종만 계약을 탄다",
"topic": "identity-and-value-contracts",
"path": "concept/concept-adapter-outbound-notification-c06.md",
"rootTreeNode": "concept:adapter-outbound-notification-c06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "c194e15b8145cdfab0a94a14798783f6444562f1563d77fd99532d4dadd30070",
"lines": 36,
"body": "concept/concept-adapter-outbound-notification-c06.body.md",
"bodySha256": "9b383a1e44e3fe932b82b61cefc739a190d0d1d12d5cb01b626b5b5c225a4cee",
"assets": [
{
"key": "adapter-outbound-notification-c06",
"kind": "terminal"
}
]
},
"adapter-outbound-objectstorage-c09": {
"kind": "CONCEPT",
"slug": "adapter-outbound-objectstorage-c09",
"title": "경로 방어는 세그먼트마다, 발행은 배타적 하드링크로",
"topic": "identity-and-value-contracts",
"path": "concept/concept-adapter-outbound-objectstorage-c09.md",
"rootTreeNode": "concept:adapter-outbound-objectstorage-c09",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a66b5a24154aecee917ab118579ebb014492e8ff678ff3a07787521686d536bd",
"lines": 36,
"body": "concept/concept-adapter-outbound-objectstorage-c09.body.md",
"bodySha256": "ce177cb4817302f8fe3036449fe438dc60574943c4e9fa482b55d3bd1727cf0b",
"assets": [
{
"key": "adapter-outbound-objectstorage-c09",
"kind": "terminal"
}
]
},
"app-bootstrap-c04": {
"kind": "CONCEPT",
"slug": "app-bootstrap-c04",
"title": "자동설정 안의 @ConditionalOnBean은 컴포넌트 스캔과 다르다",
"topic": "identity-and-value-contracts",
"path": "concept/concept-app-bootstrap-c04.md",
"rootTreeNode": "concept:app-bootstrap-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "4f87bed5d26b1322039acf12922ff599c7a67983b204fe2d0d54346dd54fce5a",
"lines": 32,
"body": "concept/concept-app-bootstrap-c04.body.md",
"bodySha256": "228ef85bafb076b5fa45b68fb6d4ae3444e9b3920b7cfee91a49ae17b6a36224",
"assets": [
{
"key": "app-bootstrap-c04",
"kind": "terminal"
}
]
},
"grpc-core-api-c01": {
"kind": "CONCEPT",
"slug": "grpc-core-api-c01",
"title": "게이트가 인자를 받지 않고 집합을 돌려주는 이유",
"topic": "identity-and-value-contracts",
"path": "concept/concept-grpc-core-api-c01.md",
"rootTreeNode": "concept:grpc-core-api-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a8474ed29d620bf70b1cc7e903a550727d1cef20744617731f896ac5f0b74e7a",
"lines": 32,
"body": "concept/concept-grpc-core-api-c01.body.md",
"bodySha256": "d13d7e2706903de717764b1513c74045e137c34805873de5a92b3c140f20a9fa",
"assets": [
{
"key": "grpc-core-api-c01",
"kind": "terminal"
}
]
},
"messaging-testkit-c04": {
"kind": "CONCEPT",
"slug": "messaging-testkit-c04",
"title": "계약 테스트 일곱 개를 어댑터가 지울 수 없게 만든 방식",
"topic": "identity-and-value-contracts",
"path": "concept/concept-messaging-testkit-c04.md",
"rootTreeNode": "concept:messaging-testkit-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b46116dac4327d59ff887d5172ef32bbb3a24d0ba8720ab68720fe8a34824c28",
"lines": 40,
"body": "concept/concept-messaging-testkit-c04.body.md",
"bodySha256": "470ed8feeb6df9c98e53625e428bf4af81c571ac7e6509cf4ea3c223cd0bf999",
"assets": [
{
"key": "messaging-testkit-c04-diagram",
"kind": "diagram"
},
{
"key": "messaging-testkit-c04",
"kind": "terminal"
}
]
},
"adapter-inbound-grpc-c01": {
"kind": "CONCEPT",
"slug": "adapter-inbound-grpc-c01",
"title": "인증이 예외 변환 바깥에 있어도 진단이 새지 않는다",
"topic": "result-and-failure-algebra",
"path": "concept/concept-adapter-inbound-grpc-c01.md",
"rootTreeNode": "concept:adapter-inbound-grpc-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f5909cb8f43ca604c2cb81352b47f442b23eb4d9042f9cf5568a9d63935a2650",
"lines": 32,
"body": "concept/concept-adapter-inbound-grpc-c01.body.md",
"bodySha256": "b56bee68e5e6e7830b10697b8f7f704c749bfb90d3c1ec7ffc3f418f10420ec6",
"assets": [
{
"key": "adapter-inbound-grpc-c01-diagram",
"kind": "diagram"
},
{
"key": "adapter-inbound-grpc-c01",
"kind": "terminal"
}
]
},
"adapter-outbound-cache-redis-c09": {
"kind": "CONCEPT",
"slug": "adapter-outbound-cache-redis-c09",
"title": "구독 경로가 guard를 건너뛰고 대신 세우는 검사",
"topic": "result-and-failure-algebra",
"path": "concept/concept-adapter-outbound-cache-redis-c09.md",
"rootTreeNode": "concept:adapter-outbound-cache-redis-c09",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "8b59289e0399cc52da438acfaa4cc7621097dcbc47e39b2510eb38f0d116dacb",
"lines": 32,
"body": "concept/concept-adapter-outbound-cache-redis-c09.body.md",
"bodySha256": "e8c129ecdd0b7951e0cc731fd47492bf76dcdc643490d4c19de49927843908ed",
"assets": [
{
"key": "adapter-outbound-cache-redis-c09",
"kind": "terminal"
}
]
},
"domain-core-c03": {
"kind": "CONCEPT",
"slug": "domain-core-c03",
"title": "실패가 런타임이 아니라 빌드에서 발생한다",
"topic": "result-and-failure-algebra",
"path": "concept/concept-domain-core-c03.md",
"rootTreeNode": "concept:domain-core-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e417cc691590ad2379186f709b854f7e652c813d8b4dd63aae194f09d07e5d03",
"lines": 32,
"body": "concept/concept-domain-core-c03.body.md",
"bodySha256": "cda3a8cfda8ba338fa1dab38466679f05130c5da10ba84a352ab15e902adf8b2",
"assets": [
{
"key": "domain-core-c03",
"kind": "terminal"
}
]
},
"messaging-cloudevents-c08": {
"kind": "CONCEPT",
"slug": "messaging-cloudevents-c08",
"title": "public 시그니처에 나오는 타입은 api로 선언한다",
"topic": "result-and-failure-algebra",
"path": "concept/concept-messaging-cloudevents-c08.md",
"rootTreeNode": "concept:messaging-cloudevents-c08",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5588633da17f3b0539c3f2bae650d911856bf6003fadf0c9e632278dade4e0c0",
"lines": 36,
"body": "concept/concept-messaging-cloudevents-c08.body.md",
"bodySha256": "7ed7343fb4ed445f697bc021969ec16b5d3ce01a1eabd5b30ec52236d6d41817",
"assets": [
{
"key": "messaging-cloudevents-c08",
"kind": "terminal"
}
]
},
"messaging-inbox-jdbc-postgresql-c07": {
"kind": "CONCEPT",
"slug": "messaging-inbox-jdbc-postgresql-c07",
"title": "커넥션을 요청하기 전에 거절하도록 고정한 테스트",
"topic": "result-and-failure-algebra",
"path": "concept/concept-messaging-inbox-jdbc-postgresql-c07.md",
"rootTreeNode": "concept:messaging-inbox-jdbc-postgresql-c07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "2b652a0066bffb4a704b5f9fef3b45c56cce5351b87205f1c05d8bf5225db781",
"lines": 32,
"body": "concept/concept-messaging-inbox-jdbc-postgresql-c07.body.md",
"bodySha256": "8587dc93bd41db6b773d610778a21159b8ae710b9416f009839bac5dfcfbe501",
"assets": [
{
"key": "messaging-inbox-jdbc-postgresql-c07",
"kind": "terminal"
}
]
},
"messaging-pulsar-experimental-c01": {
"kind": "CONCEPT",
"slug": "messaging-pulsar-experimental-c01",
"title": "알 수 없는 실패의 기본값을 모호로 둔다",
"topic": "result-and-failure-algebra",
"path": "concept/concept-messaging-pulsar-experimental-c01.md",
"rootTreeNode": "concept:messaging-pulsar-experimental-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "35fc0c92703a9cf1d04490ec93cbb76a13dae72b0233fb7725f4bd6fe769ae3d",
"lines": 36,
"body": "concept/concept-messaging-pulsar-experimental-c01.body.md",
"bodySha256": "17bf2eae1539efdd2e6b0c3bb7c5b49a22316050840cdee5e544f4ed4c15fbc1",
"assets": [
{
"key": "messaging-pulsar-experimental-c01-diagram",
"kind": "diagram"
},
{
"key": "messaging-pulsar-experimental-c01",
"kind": "terminal"
}
]
},
"messaging-schema-api-c07": {
"kind": "CONCEPT",
"slug": "messaging-schema-api-c07",
"title": "검사의 위치와 키가 틀렸던 두 결함",
"topic": "result-and-failure-algebra",
"path": "concept/concept-messaging-schema-api-c07.md",
"rootTreeNode": "concept:messaging-schema-api-c07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "6b1e490138f940593de7b61ac289ecbe9b658702b83b37861d341605959659b5",
"lines": 36,
"body": "concept/concept-messaging-schema-api-c07.body.md",
"bodySha256": "87f58a702baa6ebf19b5048dbc1fba1bef3e7fff7ce50e0e6e9b35b50980eaa1",
"assets": [
{
"key": "messaging-schema-api-c07",
"kind": "terminal"
}
]
},
"messaging-testkit-c06": {
"kind": "CONCEPT",
"slug": "messaging-testkit-c06",
"title": "아는 척하지 않기 위해 던지는 자리와 삼키는 자리",
"topic": "result-and-failure-algebra",
"path": "concept/concept-messaging-testkit-c06.md",
"rootTreeNode": "concept:messaging-testkit-c06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "beb1739617502a7dc01f3a8cd3163aa4d87267395cc0fef5cdf4f7bed383de78",
"lines": 36,
"body": "concept/concept-messaging-testkit-c06.body.md",
"bodySha256": "bf74e142155840b607ae7ba06d7325bd7520dc4be874da9d82beb38c22a525a1",
"assets": [
{
"key": "messaging-testkit-c06",
"kind": "terminal"
}
]
},
"messaging-transport-spi-c07": {
"kind": "CONCEPT",
"slug": "messaging-transport-spi-c07",
"title": "오래 돌 때만 드러나는 수명주기 결함 네 개",
"topic": "result-and-failure-algebra",
"path": "concept/concept-messaging-transport-spi-c07.md",
"rootTreeNode": "concept:messaging-transport-spi-c07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "1e9780b917f0ec401aedf6e1f74290c4753321dbc76d9a00b57a394f48942d72",
"lines": 38,
"body": "concept/concept-messaging-transport-spi-c07.body.md",
"bodySha256": "34579aff1fc90b84f5461e2241ecd17099901e93bb69d9a3f4be0f5e427c5b4d",
"assets": [
{
"key": "messaging-transport-spi-c07",
"kind": "terminal"
}
]
},
"shared-contract-c03": {
"kind": "CONCEPT",
"slug": "shared-contract-c03",
"title": "추정하지 않는 두 경계 — 스위치 해석과 상태 투영",
"topic": "result-and-failure-algebra",
"path": "concept/concept-shared-contract-c03.md",
"rootTreeNode": "concept:shared-contract-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "421defffd497f32ad3cd14017e329b002509f777e1757e3215b1f7629d838e59",
"lines": 36,
"body": "concept/concept-shared-contract-c03.body.md",
"bodySha256": "a734f38f1db57ad43927f4a95c6d0706a060782ce6254b7d122459d1d81039ce",
"assets": [
{
"key": "shared-contract-c03",
"kind": "terminal"
}
]
},
"adapter-inbound-graphql-c12": {
"kind": "CONCEPT",
"slug": "adapter-inbound-graphql-c12",
"title": "기계가 읽는 매니페스트와 사람이 읽는 등급표가 다르게 답한다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-inbound-graphql-c12.md",
"rootTreeNode": "concept:adapter-inbound-graphql-c12",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "3b06c069d927a7b5614cfd9a0cc03351b28db3e2d5b790ebdf1b46a291a1f305",
"lines": 32,
"body": "concept/concept-adapter-inbound-graphql-c12.body.md",
"bodySha256": "a5d320a0a0c2d3e7bc5f0f7a5f115e4935eb9889d243845e473b2236544e3457",
"assets": [
{
"key": "adapter-inbound-graphql-c12",
"kind": "terminal"
}
]
},
"adapter-inbound-graphql-c13": {
"kind": "CONCEPT",
"slug": "adapter-inbound-graphql-c13",
"title": "릴리스 게이트의 미배선은 정상이고 작성기의 호출자 부재는 다르다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-inbound-graphql-c13.md",
"rootTreeNode": "concept:adapter-inbound-graphql-c13",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "cb80b2d893b6d21392c61853b5e6306cf693c5f4b6561e3f25a14063023cdc86",
"lines": 32,
"body": "concept/concept-adapter-inbound-graphql-c13.body.md",
"bodySha256": "e7c4e77932dba182feae43bb4d45a16bd50add111f91588204be08fbec8dab0e",
"assets": [
{
"key": "adapter-inbound-graphql-c13",
"kind": "terminal"
}
]
},
"adapter-inbound-web-c09": {
"kind": "CONCEPT",
"slug": "adapter-inbound-web-c09",
"title": "캐시 헤더를 소유하는 것은 24줄 상수 두 개다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-inbound-web-c09.md",
"rootTreeNode": "concept:adapter-inbound-web-c09",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0d14a37fd6d4c27c387cf58078a74b9df2ad63397dd820a000f1d0fbcc2da5bb",
"lines": 36,
"body": "concept/concept-adapter-inbound-web-c09.body.md",
"bodySha256": "c304c9e582ab6ea7dc97acb73ec981c1281069ef7365335b01a5d3f920b0b267",
"assets": [
{
"key": "adapter-inbound-web-c09",
"kind": "terminal"
}
]
},
"adapter-inbound-web-c16": {
"kind": "CONCEPT",
"slug": "adapter-inbound-web-c16",
"title": "선언된 능력 열하나 중 켤 수 있는 것은 둘이다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-inbound-web-c16.md",
"rootTreeNode": "concept:adapter-inbound-web-c16",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f028a050948e2ef05473bada496afc94e165bb4c4c0eb3f0bff6b018d87ec06b",
"lines": 32,
"body": "concept/concept-adapter-inbound-web-c16.body.md",
"bodySha256": "69cbaeb5bdff2972a2680b75f47bf6c272b6b21854d554fbbe5167b48f055268",
"assets": [
{
"key": "adapter-inbound-web-c16",
"kind": "terminal"
}
]
},
"adapter-inbound-websocket-c05": {
"kind": "CONCEPT",
"slug": "adapter-inbound-websocket-c05",
"title": "릴리스 시점 도구라서 런타임 미배선이 정상이다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-inbound-websocket-c05.md",
"rootTreeNode": "concept:adapter-inbound-websocket-c05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5ccf293cb3dca5f5a8ddb688efd4c53db49b4ccf0c353f59101c1f4593f58488",
"lines": 32,
"body": "concept/concept-adapter-inbound-websocket-c05.body.md",
"bodySha256": "6d714b1b8e2ff9138c9d103e5a7e8c3814cb7b251c1f75d23e61bf5c5d716a38",
"assets": [
{
"key": "adapter-inbound-websocket-c05",
"kind": "terminal"
}
]
},
"adapter-outbound-cache-redis-c08": {
"kind": "CONCEPT",
"slug": "adapter-outbound-cache-redis-c08",
"title": "한쪽에만 적용되는 변경이 구조적으로 불가능하다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-cache-redis-c08.md",
"rootTreeNode": "concept:adapter-outbound-cache-redis-c08",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a91a18f23642c54abe6514c1119a98bc760bcc18b8d25b7ebb795072f349216e",
"lines": 36,
"body": "concept/concept-adapter-outbound-cache-redis-c08.body.md",
"bodySha256": "22a5601d4e9ea72b012ec52b62f4229489d1e9fc1774485e50d2b053ad5b3cac",
"assets": [
{
"key": "adapter-outbound-cache-redis-c08-diagram",
"kind": "diagram"
},
{
"key": "adapter-outbound-cache-redis-c08",
"kind": "terminal"
}
]
},
"adapter-outbound-cache-redis-c10": {
"kind": "CONCEPT",
"slug": "adapter-outbound-cache-redis-c10",
"title": "뒤 단계일수록 비싸도록 검증 순서를 고정했다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-cache-redis-c10.md",
"rootTreeNode": "concept:adapter-outbound-cache-redis-c10",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "c87845039de26a35f8a062b0d142e3bd5a0005c987b44d3b2cc72ed1aeb9e21f",
"lines": 36,
"body": "concept/concept-adapter-outbound-cache-redis-c10.body.md",
"bodySha256": "6f792eae646a67995e9a7a0d956637f81f0e45c4b4e2090782c1bef079d22402",
"assets": [
{
"key": "adapter-outbound-cache-redis-c10-diagram",
"kind": "diagram"
},
{
"key": "adapter-outbound-cache-redis-c10",
"kind": "terminal"
}
]
},
"adapter-outbound-fileserver-c03": {
"kind": "CONCEPT",
"slug": "adapter-outbound-fileserver-c03",
"title": "stateRevision은 정확히 하나씩만 증가한다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-fileserver-c03.md",
"rootTreeNode": "concept:adapter-outbound-fileserver-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f967c4f72ee335fef519570e067f78d0a4c36c78222d55c91e09097460d65e38",
"lines": 40,
"body": "concept/concept-adapter-outbound-fileserver-c03.body.md",
"bodySha256": "d283ac5a09f96a4784334da286202a8e18d6f4012e57456ba4d61ddf89210e18",
"assets": [
{
"key": "adapter-outbound-fileserver-c03-diagram",
"kind": "diagram"
},
{
"key": "adapter-outbound-fileserver-c03",
"kind": "terminal"
}
]
},
"adapter-outbound-fileserver-c04": {
"kind": "CONCEPT",
"slug": "adapter-outbound-fileserver-c04",
"title": "배타성이 필요한 쪽에만 OS 락을 둔다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-fileserver-c04.md",
"rootTreeNode": "concept:adapter-outbound-fileserver-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "53b7ea16975370cc5250e259003ae4936cebf470d2a8dd9b1f35dc8f6e04dcdd",
"lines": 36,
"body": "concept/concept-adapter-outbound-fileserver-c04.body.md",
"bodySha256": "52edc92f7b8535be1872b3803f0b55ce182779dbc735f749529bf1a597650625",
"assets": [
{
"key": "adapter-outbound-fileserver-c04",
"kind": "terminal"
}
]
},
"adapter-outbound-fileserver-c08": {
"kind": "CONCEPT",
"slug": "adapter-outbound-fileserver-c08",
"title": "잔여 경로 연산을 선언하고 identity 검사로 감싼다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-fileserver-c08.md",
"rootTreeNode": "concept:adapter-outbound-fileserver-c08",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e4e8ee13213fcebf6ec9bd04d192766d8731cba8cae4554535696f8195629212",
"lines": 36,
"body": "concept/concept-adapter-outbound-fileserver-c08.body.md",
"bodySha256": "201e7426c08b274a0f35e40586c0d23f70aefb1022a932730509f6455b83a846",
"assets": [
{
"key": "adapter-outbound-fileserver-c08-diagram",
"kind": "diagram"
},
{
"key": "adapter-outbound-fileserver-c08",
"kind": "terminal"
}
]
},
"adapter-outbound-httpclient-c02": {
"kind": "CONCEPT",
"slug": "adapter-outbound-httpclient-c02",
"title": "회전이 틈으로 관측되지 않게 만든 순서와 두 누수 이력",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-httpclient-c02.md",
"rootTreeNode": "concept:adapter-outbound-httpclient-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "c49c73e1d60b290ad08034c75b4349acd488e585aa77ae22638ddf727b9edec8",
"lines": 36,
"body": "concept/concept-adapter-outbound-httpclient-c02.body.md",
"bodySha256": "74bbf2ccb2f23d7235c968b776221984e073de75e062a6acfb81ea8d22f61d07",
"assets": [
{
"key": "adapter-outbound-httpclient-c02",
"kind": "terminal"
}
]
},
"adapter-outbound-httpclient-c04": {
"kind": "CONCEPT",
"slug": "adapter-outbound-httpclient-c04",
"title": "뒤 규칙이 앞 규칙의 금지를 되돌리지 못한다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-httpclient-c04.md",
"rootTreeNode": "concept:adapter-outbound-httpclient-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "57bbcd1144800c82552c98bc9d83b5196a09cb9879456ac728d60f451e2f3933",
"lines": 40,
"body": "concept/concept-adapter-outbound-httpclient-c04.body.md",
"bodySha256": "fd98d120f0a729079cb5e67a918cc7543c52ec1a99e8a0735f8b48aa517a15ae",
"assets": [
{
"key": "adapter-outbound-httpclient-c04-diagram",
"kind": "diagram"
},
{
"key": "adapter-outbound-httpclient-c04",
"kind": "terminal"
}
]
},
"adapter-outbound-messaging-c03": {
"kind": "CONCEPT",
"slug": "adapter-outbound-messaging-c03",
"title": "열린 타입은 페이로드로 받지 않는다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-messaging-c03.md",
"rootTreeNode": "concept:adapter-outbound-messaging-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d71c6ed16edfebbabc28b9967c9395dc2863480034c6551562e41d3db9afad3f",
"lines": 40,
"body": "concept/concept-adapter-outbound-messaging-c03.body.md",
"bodySha256": "6c24f92b3dbf0e8f7b2a8cd371c579be4fdc84373c6cfda0fb44eb7720feb66b",
"assets": [
{
"key": "adapter-outbound-messaging-c03",
"kind": "terminal"
}
]
},
"adapter-outbound-objectstorage-c05": {
"kind": "CONCEPT",
"slug": "adapter-outbound-objectstorage-c05",
"title": "revision은 건너뛰지도 되돌아가지도 못한다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-objectstorage-c05.md",
"rootTreeNode": "concept:adapter-outbound-objectstorage-c05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "6d9c9f051a31b3e24fde0f4eec57190e76f3a3e93cb98a52f5a66243d8de3b20",
"lines": 36,
"body": "concept/concept-adapter-outbound-objectstorage-c05.body.md",
"bodySha256": "23bf1496d46dbd73d151d400d41e242d50706b7949a35d2bf35550ed192ebc51",
"assets": [
{
"key": "adapter-outbound-objectstorage-c05-diagram",
"kind": "diagram"
},
{
"key": "adapter-outbound-objectstorage-c05",
"kind": "terminal"
}
]
},
"adapter-outbound-objectstorage-c07": {
"kind": "CONCEPT",
"slug": "adapter-outbound-objectstorage-c07",
"title": "durable record가 비밀을 담지 않는다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-objectstorage-c07.md",
"rootTreeNode": "concept:adapter-outbound-objectstorage-c07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "2811c0e299c89b6da66e7adf437754f7f531138b4b76854dd0217d7466fd432c",
"lines": 36,
"body": "concept/concept-adapter-outbound-objectstorage-c07.body.md",
"bodySha256": "83528a91af07c40fe3d0d96f3647fb38866614a7032bcde344f9d7c459345d0d",
"assets": [
{
"key": "adapter-outbound-objectstorage-c07",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c01": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c01",
"title": "내부 소비자 부재와 public 계약 필요성을 따로 묻는다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-persistence-jpa-c01.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "accff633787a8d74f022ab83364357fe7ecde160bee49dd01d460d4e35433cfe",
"lines": 40,
"body": "concept/concept-adapter-outbound-persistence-jpa-c01.body.md",
"bodySha256": "b465050ec8d5baa3aeeb1d3e604f0aa036064b39376120114700e5105c169dbf",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c01",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c03": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c03",
"title": "위험한 shape 자체를 표현하기 어렵게 만든다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-persistence-jpa-c03.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d792a5c846a0e4e59591e5b478a969e14a3f8e06ba35c66b73d508f5be397418",
"lines": 40,
"body": "concept/concept-adapter-outbound-persistence-jpa-c03.body.md",
"bodySha256": "3051c2b44c0bc3ea47dcd7dac416af08fcfb5ed50ea2ce2447be8e79f754c80d",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c03",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c06": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c06",
"title": "설정으로 completion unknown을 다시 살릴 수 없다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-persistence-jpa-c06.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0b5c9c1d9aeb3f4a11a60830a2153a15f1bdfb9dd59517e338af4840a44fb5cb",
"lines": 40,
"body": "concept/concept-adapter-outbound-persistence-jpa-c06.body.md",
"bodySha256": "77e701894da0b45cfb52053f8a0ac76ef5bd6306031d90072c331c784ccf85ad",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c06-diagram",
"kind": "diagram"
},
{
"key": "adapter-outbound-persistence-jpa-c06",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c07": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c07",
"title": "이름 목록만 고정하고 의미는 고정하지 않는다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-persistence-jpa-c07.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "08bcf28bcf9c97bf9445387277ab698b82748331fa840724d8a013b1ec4c478d",
"lines": 28,
"body": "concept/concept-adapter-outbound-persistence-jpa-c07.body.md",
"bodySha256": "1a1ddaddd768579af95f8b3607fb48e822fdfbce75c95ff67288a52e2a350df6",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c07",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c08": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c08",
"title": "구현 클래스를 샘플링하지 않고 51개를 전부 읽었다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-persistence-jpa-c08.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c08",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "31cdab78c7e360a96132b9daa680db7c1474c43403b2d106fc6dd915b5cdec18",
"lines": 32,
"body": "concept/concept-adapter-outbound-persistence-jpa-c08.body.md",
"bodySha256": "0879edfd9963259ff3211254326cb9fd89538d5e74a4186ee5d2d7097cd880c1",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c08",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c09": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c09",
"title": "같은 leaf 안에 트랜잭션 모델이 둘 있다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-persistence-jpa-c09.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c09",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f95aefce2f070c73c76b6fed9da80a2a9bfac2134b6c157e835e862037bb3cd5",
"lines": 40,
"body": "concept/concept-adapter-outbound-persistence-jpa-c09.body.md",
"bodySha256": "a5a064f223c9cc48091f4355054ae53fb70489f0578b3ae59dbb181f4393a97c",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c09",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c12": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c12",
"title": "commit exception을 rollback으로 가정하지 않는다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-persistence-jpa-c12.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c12",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "ee564bc294159ce98913b9df6246a8d174b57c8139c1bb2e6e21bc508e2c8549",
"lines": 40,
"body": "concept/concept-adapter-outbound-persistence-jpa-c12.body.md",
"bodySha256": "4629de1f789bd14869d69e2f7f13194bee6d8f3dd4fc1fdeeec372f2f8973971",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c12",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c13": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c13",
"title": "이미 소비한 시간을 트랜잭션 계층이 다시 주지 않는다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-persistence-jpa-c13.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c13",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "64a244d056ed07084519f1c8834fbfd0058f914bfb553a4773bcb848b49aef68",
"lines": 40,
"body": "concept/concept-adapter-outbound-persistence-jpa-c13.body.md",
"bodySha256": "b547473357bf80a20c0e031d5f7ba63adf71db5cb00d740d3b0fcb7f140714a9",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c13",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c17": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c17",
"title": "SQLSTATE만으로는 구분할 수 없어 phase가 필요하다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-persistence-jpa-c17.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c17",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a252fcffbc6d22b329d045771c2fd5a7b64923d7bc97674346d427a5705a88b9",
"lines": 32,
"body": "concept/concept-adapter-outbound-persistence-jpa-c17.body.md",
"bodySha256": "b87b7c06052e840bafba5a6d3ff3ae112f78ce487960c5e0a198509f3b35abe0",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c17",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c19": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c19",
"title": "runbook이 지목하는 지표를 만드는 호출이 없다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-persistence-jpa-c19.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c19",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "36ff5f13becadcda24d0cccc3c30bc983571f3fadce0205d6adb6d2df9c3775d",
"lines": 36,
"body": "concept/concept-adapter-outbound-persistence-jpa-c19.body.md",
"bodySha256": "6c30dea687c8e10047f540900ea8e28af5834178d23e40b7496110cd90440fed",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c19",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c30": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c30",
"title": "Querydsl은 production runtimeClasspath에 들어오지 않는다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-persistence-jpa-c30.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c30",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "7c102a154cc894e14459bcf89cf8f46a58a08b13a4dfe77e463c7707f6ad7574",
"lines": 36,
"body": "concept/concept-adapter-outbound-persistence-jpa-c30.body.md",
"bodySha256": "771da94e2e8ae142004219c4d8760eda473de01ce6014ad04e7743ee6f945d2f",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c30",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c34": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c34",
"title": "게이트 통과가 오히려 검증기의 한계를 보여 준다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-persistence-jpa-c34.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c34",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "bc4b39502fafc5e02514d5e9be9e13478882725f496acb257034e60f4e129523",
"lines": 28,
"body": "concept/concept-adapter-outbound-persistence-jpa-c34.body.md",
"bodySha256": "72f425989df8582f51a69da7100ec9f3e4ddc51ec31e8a88b043bbf6c787e7fa",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c34",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c35": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c35",
"title": "40003이 UNKNOWN으로 강등되면서 조정 경로도 함께 사라진다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-persistence-jpa-c35.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c35",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "396a93ed3d4c5763d28fafa6f8674d6c7d3aa24bbeddebe800081290354815f4",
"lines": 44,
"body": "concept/concept-adapter-outbound-persistence-jpa-c35.body.md",
"bodySha256": "5805abf1920baacfeb80761fd3182242280204f7bd2161bf5fcfcbdbba00f745",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c35",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c36": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c36",
"title": "만료된 COMPLETED row를 inspect와 claim이 다르게 읽는다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-persistence-jpa-c36.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c36",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b162a26b54cc209f7816ff93f24a09d41cf44fbf5ac4f456bef1e4045ea45a07",
"lines": 44,
"body": "concept/concept-adapter-outbound-persistence-jpa-c36.body.md",
"bodySha256": "938a546eed5051ce62026eb178363a2cac2294edb3108759b68b5bcc27f96fab",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c36-diagram",
"kind": "diagram"
},
{
"key": "adapter-outbound-persistence-jpa-c36",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c38": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c38",
"title": "SQL 식별자를 호출자가 조립하지 않는다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-persistence-jpa-c38.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c38",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "6ec639ccde63663f0ede658132a1e407d86b5e2f4a6720710aeb8cf4f3f4dca1",
"lines": 32,
"body": "concept/concept-adapter-outbound-persistence-jpa-c38.body.md",
"bodySha256": "378e00c2ade9b6972c7ca72b0176ad897f376ae79534f63441ebfb9caaca5719",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c38",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c39": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c39",
"title": "vendor migration 아홉을 실제 PostgreSQL에서 적용했다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-persistence-jpa-c39.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c39",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d22384c4aa9ffd49a1c9b749132f1b95bfaa7d5341ab06b9d82bdf212a3ed2e7",
"lines": 32,
"body": "concept/concept-adapter-outbound-persistence-jpa-c39.body.md",
"bodySha256": "8342b8afd4a541b413793b26470525a9f94a7e8cc2d5482965aa3f581fe10962",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c39",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c40": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c40",
"title": "재현에 쓴 레인과 복원까지 남긴 기록",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-persistence-jpa-c40.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c40",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "10d670b8dfe3d78e0d76c2fc3333d5e710065f312e22ceed3755129fd43f5461",
"lines": 32,
"body": "concept/concept-adapter-outbound-persistence-jpa-c40.body.md",
"bodySha256": "0f9e7e95fe8ba5d5be97faf43c9922d0f0a917196fcb24f0355dd127bfbfb1fc",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c40",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c41": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c41",
"title": "보류한 항목과 보류한 이유",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-persistence-jpa-c41.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c41",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f2d27f866b3af413c30d12f89cc645b536506eabf062a60d796d8a9267c2fa7c",
"lines": 32,
"body": "concept/concept-adapter-outbound-persistence-jpa-c41.body.md",
"bodySha256": "5a33c7fa404dbaa76db10dcce9fe9e54a3884899546b3d13e60748186805f3a0",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c41",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c43": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c43",
"title": "H2 idempotency와 V2 owner 필드",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-persistence-jpa-c43.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c43",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "142f6f54fb41ea15783bb6da6703997423f206e7a13a818d992b8e566e2cc06c",
"lines": 32,
"body": "concept/concept-adapter-outbound-persistence-jpa-c43.body.md",
"bodySha256": "95d4376b87b8f221b6ac21500c19b35160d684d375c9793291966a32b7125a41",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c43",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c46": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c46",
"title": "FIFO 정산은 기록된 적응이고 전제가 빠진 것이 문제다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-persistence-jpa-c46.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c46",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d1d4fccc653fe76a7d286a8be5273ff309f84844feec813cef8eb50497fbe6d6",
"lines": 32,
"body": "concept/concept-adapter-outbound-persistence-jpa-c46.body.md",
"bodySha256": "01329efb0d4ee9560e672213e2f6701b01321b3c53baced38717c4139239ba74",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c46",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c47": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c47",
"title": "만료 직후 takeover 전 창은 보이지만 계약이 그것을 금지하지 않는다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-persistence-jpa-c47.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c47",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d6c535a1e483fdd43e6fc1265cc8e3d69b4c05d8a7f256634167eb8fa340cc56",
"lines": 32,
"body": "concept/concept-adapter-outbound-persistence-jpa-c47.body.md",
"bodySha256": "1a769b74bef814bff85ead9fc49c9a7293521145e810f8b122302d35f4f26c96",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c47",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c48": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c48",
"title": "레지스트리는 V4에 멈춰 있고 매핑은 V10까지 의존한다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-persistence-jpa-c48.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c48",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "793331facaff3964515c2e36cefa2832bd2b7b8149be23a11fc1ccd872fca2c4",
"lines": 36,
"body": "concept/concept-adapter-outbound-persistence-jpa-c48.body.md",
"bodySha256": "b421a9ca13e0162ef3f0a18123fd5ce452b59596f1f3e9bad665dc0759edf532",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c48",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c50": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c50",
"title": "이 scope에서는 cross-tenant bypass를 확정하지 못했다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-persistence-jpa-c50.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c50",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b15f5e67036e4ee2fd79714fb0cb4c3cafbf3ec3f28a41337426f2b9ac44059e",
"lines": 32,
"body": "concept/concept-adapter-outbound-persistence-jpa-c50.body.md",
"bodySha256": "08c0539ea2ec9c4005bacb8b33cb1f8f5fc29c3273ad22c7a7568d0bb3ad6866",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c50",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c52": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c52",
"title": "schema 값을 statement text에 붙이지 않고 set_config로 바인딩한다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-persistence-jpa-c52.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c52",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "390d28e9cfc6d4f3c96b73f1970782593840af6d0c6aa4fb34968d37efb790b0",
"lines": 32,
"body": "concept/concept-adapter-outbound-persistence-jpa-c52.body.md",
"bodySha256": "51e80c6e4d2378b7ce987bad04fb3085921e26344203283b70b45c21ee757e78",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c52",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c54": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c54",
"title": "이름이 말하는 것과 반환하는 것이 다른 helper",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-persistence-jpa-c54.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c54",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "94e653321e9698ecb9f6d5cb0342ee7211d5e88403cc17044c45c1109a1c99f9",
"lines": 32,
"body": "concept/concept-adapter-outbound-persistence-jpa-c54.body.md",
"bodySha256": "62c4424c80595d59dbb72a5fcf2436b4d3c1b0fbb44149998abb9b50472088fd",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c54",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c55": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c55",
"title": "정규식 파서를 통과해도 Gradle이 다시 파싱한다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-persistence-jpa-c55.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c55",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f980e6ffde8cac5df2f4231d6ada4f3771ffa6c18a20fe7b9f586fc84ad69923",
"lines": 28,
"body": "concept/concept-adapter-outbound-persistence-jpa-c55.body.md",
"bodySha256": "b8d3677038eba9a2eedff458f292f142a98084e6b023318dba95b78b2c1552cb",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c55",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c57": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c57",
"title": "registry에서 task graph 한 방향만 검사한다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-persistence-jpa-c57.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c57",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "7935ed04ca12c68d20ba105c71b668a2bd2fb47a59111ac9d57e2f51466deb28",
"lines": 40,
"body": "concept/concept-adapter-outbound-persistence-jpa-c57.body.md",
"bodySha256": "66e5159476c1c532e5e5e6443c34f99d710846e26088bed4d14b6135bb19b304",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c57",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c58": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c58",
"title": "JVM 공유를 설계 근거로 내세웠지만 소비자 31곳 어디에도 없다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-persistence-jpa-c58.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c58",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b13690cc255e1078fd55ce8132653319e00cee8d81a3c97aaa10fcc057164766",
"lines": 40,
"body": "concept/concept-adapter-outbound-persistence-jpa-c58.body.md",
"bodySha256": "f6bf9d6aaa267fee4babbed182b6f77cc9d7672c01fbf68e6ac4f3ea33a579e1",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c58",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-mongo-c04": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-mongo-c04",
"title": "취소된 stream은 성공도 실패도 기록하지 않는다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-persistence-mongo-c04.md",
"rootTreeNode": "concept:adapter-outbound-persistence-mongo-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "bb67edcc11f4fcc10a417d85055eaa28c1a6eaeec23039c8c7a7167f5d5deeaa",
"lines": 36,
"body": "concept/concept-adapter-outbound-persistence-mongo-c04.body.md",
"bodySha256": "c3bafc05267dcd68cef46daa92038bb0d82ea1eb1a84909b7b19c30bb394fe71",
"assets": [
{
"key": "adapter-outbound-persistence-mongo-c04-diagram",
"kind": "diagram"
},
{
"key": "adapter-outbound-persistence-mongo-c04",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-mongo-c06": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-mongo-c06",
"title": "더 자주 갱신해도 고쳐지지 않는 문제라서 fencing을 얹는다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-persistence-mongo-c06.md",
"rootTreeNode": "concept:adapter-outbound-persistence-mongo-c06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b4c4087ed008b3481fde4c2e70d50bed16c0df27bf085f55b677bd09ed84f9fe",
"lines": 44,
"body": "concept/concept-adapter-outbound-persistence-mongo-c06.body.md",
"bodySha256": "4e09aba410c893314d0b75e53a6af19718f4b6182f605a1b6415ad97836fbf3b",
"assets": [
{
"key": "adapter-outbound-persistence-mongo-c06",
"kind": "terminal"
}
]
},
"adapter-outbound-support-c04": {
"kind": "CONCEPT",
"slug": "adapter-outbound-support-c04",
"title": "직접 참조 0이지만 broad component scan으로 도달한다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-adapter-outbound-support-c04.md",
"rootTreeNode": "concept:adapter-outbound-support-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "8549974f4b3f96733f928815ac202e3c5914a1dba41dcb280cf034f85405d039",
"lines": 36,
"body": "concept/concept-adapter-outbound-support-c04.body.md",
"bodySha256": "22f6c6cec37e3586831b066cf6ea7bdf9610da1829625ffffae8b8b0b34df3fb",
"assets": [
{
"key": "adapter-outbound-support-c04",
"kind": "terminal"
}
]
},
"application-core-c04": {
"kind": "CONCEPT",
"slug": "application-core-c04",
"title": "효과가 없었다고 증명할 수 없으면 자동 재시도 권한을 주지 않는다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-application-core-c04.md",
"rootTreeNode": "concept:application-core-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "15a7f9b3c9ef9007f1aafb3c3f652b1dd088f75fe9496572583a10348036e3a0",
"lines": 44,
"body": "concept/concept-application-core-c04.body.md",
"bodySha256": "9a323ec9b37c3c7aa37a5c27b1631eedea877847f9310c8106df0f6609c69fe7",
"assets": [
{
"key": "application-core-c04-diagram",
"kind": "diagram"
},
{
"key": "application-core-c04",
"kind": "terminal"
}
]
},
"application-core-c05": {
"kind": "CONCEPT",
"slug": "application-core-c05",
"title": "efficiency lock이 correctness authority를 대체하지 않는다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-application-core-c05.md",
"rootTreeNode": "concept:application-core-c05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a10bf41e14c063a2a2861423e9edaf732ec9b52083e95e6243a11d4c462b454f",
"lines": 44,
"body": "concept/concept-application-core-c05.body.md",
"bodySha256": "e95cf2e9f21362bd72eae03b9701a75f086819a07f6aed89c9d2cc7334a87db0",
"assets": [
{
"key": "application-core-c05",
"kind": "terminal"
}
]
},
"application-core-c09": {
"kind": "CONCEPT",
"slug": "application-core-c09",
"title": "메타데이터와 물리 내용이 원자적이지 않다는 사실을 숨기지 않는다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-application-core-c09.md",
"rootTreeNode": "concept:application-core-c09",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "6c054a2ab0764cb48f331b86d2b94ccf1ca972e9394600cfbfedad01e9eaa915",
"lines": 44,
"body": "concept/concept-application-core-c09.body.md",
"bodySha256": "ee40b5dfe0ff79213e9728102ee812fce9fc9504ff27832426ef0b56442fe190",
"assets": [
{
"key": "application-core-c09",
"kind": "terminal"
}
]
},
"domain-core-c01": {
"kind": "CONCEPT",
"slug": "domain-core-c01",
"title": "도메인 내용이 아니라 도메인 모델링 계약을 소유한다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-domain-core-c01.md",
"rootTreeNode": "concept:domain-core-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "820f6c63a0d8e8c3b6a4e39c6dd72f265769fd985422f62a9e3a88748bd84909",
"lines": 36,
"body": "concept/concept-domain-core-c01.body.md",
"bodySha256": "49cda7369ef8b7e46cd9977dec235a1374ad5c119245b2f86c99bd1da9704687",
"assets": [
{
"key": "domain-core-c01-diagram",
"kind": "diagram"
},
{
"key": "domain-core-c01",
"kind": "terminal"
}
]
},
"grpc-advanced-resilience-c01": {
"kind": "CONCEPT",
"slug": "grpc-advanced-resilience-c01",
"title": "헤지는 성공했을지도 모르는 호출에 대해 일어난다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-grpc-advanced-resilience-c01.md",
"rootTreeNode": "concept:grpc-advanced-resilience-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e013f2ca05b4aabbf77dbed08208b55252df71ed1c943dc817a024885683500a",
"lines": 36,
"body": "concept/concept-grpc-advanced-resilience-c01.body.md",
"bodySha256": "5cd6127ad46da3e7edc21b39f4332a4a352fc43b0101c15d695229bbdc730c16",
"assets": [
{
"key": "grpc-advanced-resilience-c01-diagram",
"kind": "diagram"
},
{
"key": "grpc-advanced-resilience-c01",
"kind": "terminal"
}
]
},
"grpc-codegen-c01": {
"kind": "CONCEPT",
"slug": "grpc-codegen-c01",
"title": "손으로 적은 요구 목록은 갱신이 멈추는 쪽이다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-grpc-codegen-c01.md",
"rootTreeNode": "concept:grpc-codegen-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "40b344cfa7b4f52ce6ab5334d66b03198ce8f645a2fb4e6f01dca9158859fbad",
"lines": 40,
"body": "concept/concept-grpc-codegen-c01.body.md",
"bodySha256": "b71dffc55cf1171a74d6496cd55f6f6cff43ba2bd39873d30057bd6f9997b021",
"assets": [
{
"key": "grpc-codegen-c01-diagram",
"kind": "diagram"
},
{
"key": "grpc-codegen-c01",
"kind": "terminal"
}
]
},
"grpc-discovery-c01": {
"kind": "CONCEPT",
"slug": "grpc-discovery-c01",
"title": "위험한 조합은 정책이 아니라 생성자가 거부한다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-grpc-discovery-c01.md",
"rootTreeNode": "concept:grpc-discovery-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "94cb68b5859712d8e2a590c0efeb3e78285141d13799e254bd76c7c150ed968c",
"lines": 36,
"body": "concept/concept-grpc-discovery-c01.body.md",
"bodySha256": "876c10c093b8c86f5afe720187adac64a563b8ab4792009a6ea4f1809040a3db",
"assets": [
{
"key": "grpc-discovery-c01-diagram",
"kind": "diagram"
},
{
"key": "grpc-discovery-c01",
"kind": "terminal"
}
]
},
"grpc-operation-ledger-jpa-c01": {
"kind": "CONCEPT",
"slug": "grpc-operation-ledger-jpa-c01",
"title": "record를 지나지 않는 쓰기가 있어서 제약을 DB에도 둔다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-grpc-operation-ledger-jpa-c01.md",
"rootTreeNode": "concept:grpc-operation-ledger-jpa-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "31457d72f1469e934d9cd5e5651c9fd2ab079d9acc64be6662358f1a9a700fae",
"lines": 32,
"body": "concept/concept-grpc-operation-ledger-jpa-c01.body.md",
"bodySha256": "0fea1c002832224d4f31c3a7dd3e127bb85172aa280dc734612a2799e7a4da59",
"assets": [
{
"key": "grpc-operation-ledger-jpa-c01",
"kind": "terminal"
}
]
},
"grpc-operation-ledger-jpa-c02": {
"kind": "CONCEPT",
"slug": "grpc-operation-ledger-jpa-c02",
"title": "같은 신원의 두 번째 청구가 같은 행을 겨냥한다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-grpc-operation-ledger-jpa-c02.md",
"rootTreeNode": "concept:grpc-operation-ledger-jpa-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a218c2861abeae1808d505afb16951ac7cb53df3d073e176d9f5434325a44188",
"lines": 36,
"body": "concept/concept-grpc-operation-ledger-jpa-c02.body.md",
"bodySha256": "5bc4471f1a030f1f3335058114c180f652c427a84288911fd10f4ca26111b31d",
"assets": [
{
"key": "grpc-operation-ledger-jpa-c02",
"kind": "terminal"
}
]
},
"grpc-operation-ledger-jpa-c03": {
"kind": "CONCEPT",
"slug": "grpc-operation-ledger-jpa-c03",
"title": "서수 컬럼은 값이 끼어들면 모든 행을 조용히 바꾼다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-grpc-operation-ledger-jpa-c03.md",
"rootTreeNode": "concept:grpc-operation-ledger-jpa-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a0f4535b203ef41b0d88793b27fe4362a0618e144db8b83b05ea33655014e4fe",
"lines": 32,
"body": "concept/concept-grpc-operation-ledger-jpa-c03.body.md",
"bodySha256": "47068c2b16b301f42dcecacebfc255969cb7f545e2f0ff86c8d8ae2e0142be05",
"assets": [
{
"key": "grpc-operation-ledger-jpa-c03-diagram",
"kind": "diagram"
},
{
"key": "grpc-operation-ledger-jpa-c03",
"kind": "terminal"
}
]
},
"grpc-spring-boot-starter-c02": {
"kind": "CONCEPT",
"slug": "grpc-spring-boot-starter-c02",
"title": "한 번에 전부 모아 실패한다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-grpc-spring-boot-starter-c02.md",
"rootTreeNode": "concept:grpc-spring-boot-starter-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "034c6a1645597c3c7286d6c852db00ffd3bd6a30f420d0d54a0becd0e15bc456",
"lines": 40,
"body": "concept/concept-grpc-spring-boot-starter-c02.body.md",
"bodySha256": "722440670d3664e0bbf5745eb0e93684dd146b51c0c8825205a2c4b08fd1dddb",
"assets": [
{
"key": "grpc-spring-boot-starter-c02",
"kind": "terminal"
}
]
},
"grpc-testkit-c01": {
"kind": "CONCEPT",
"slug": "grpc-testkit-c01",
"title": "런북을 나중에 쓰면 처음 만나는 사람이 새벽에 알아내야 한다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-grpc-testkit-c01.md",
"rootTreeNode": "concept:grpc-testkit-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f015ff81855d7d9f31e0814f7bebd3fa88dcf23fd290b72cd617290faa781ef0",
"lines": 36,
"body": "concept/concept-grpc-testkit-c01.body.md",
"bodySha256": "c6f774cd4440df37ca53c45daef9bdca90cd7b639039c6a484aace9e640a2569",
"assets": [
{
"key": "grpc-testkit-c01",
"kind": "terminal"
}
]
},
"messaging-admin-api-c06": {
"kind": "CONCEPT",
"slug": "messaging-admin-api-c06",
"title": "실행 코드가 없어서 동시성 계약이 전부 문서다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-admin-api-c06.md",
"rootTreeNode": "concept:messaging-admin-api-c06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "da4e807edf31cb19981d933227e3da2fe2c9c230d9c651ec0def135745c50cc1",
"lines": 36,
"body": "concept/concept-messaging-admin-api-c06.body.md",
"bodySha256": "f6a167ef826f4698f6479df289c19fc5cc1d955373535a9383d709377c0fe0c3",
"assets": [
{
"key": "messaging-admin-api-c06-diagram",
"kind": "diagram"
},
{
"key": "messaging-admin-api-c06",
"kind": "terminal"
}
]
},
"messaging-admin-api-c07": {
"kind": "CONCEPT",
"slug": "messaging-admin-api-c07",
"title": "승인이 처음에는 데이터였고 지금은 타입이다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-admin-api-c07.md",
"rootTreeNode": "concept:messaging-admin-api-c07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "22d08cf7f9ec69f01a01e66446b87af017f08a75d6e8eabb4178b1de37212b77",
"lines": 32,
"body": "concept/concept-messaging-admin-api-c07.body.md",
"bodySha256": "991d197789cd089b6c45a2cae7c3f6b60e1c62250afdab4388184bc10e1367c0",
"assets": [
{
"key": "messaging-admin-api-c07",
"kind": "terminal"
}
]
},
"messaging-admin-runtime-c03": {
"kind": "CONCEPT",
"slug": "messaging-admin-runtime-c03",
"title": "리드라이브는 재개하고 리플레이는 처음부터 다시 읽는다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-admin-runtime-c03.md",
"rootTreeNode": "concept:messaging-admin-runtime-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "28512d3380be2194b6c96db20351f2747c2ac026e69a530de18b2d28b70506ee",
"lines": 40,
"body": "concept/concept-messaging-admin-runtime-c03.body.md",
"bodySha256": "ebd00537f356117fa30563fe87bccc778436ae2708c5060e930583c0ce62e16e",
"assets": [
{
"key": "messaging-admin-runtime-c03-diagram",
"kind": "diagram"
},
{
"key": "messaging-admin-runtime-c03",
"kind": "terminal"
}
]
},
"messaging-admin-runtime-c06": {
"kind": "CONCEPT",
"slug": "messaging-admin-runtime-c06",
"title": "펜싱 토큰이 세 지점에서 작동한다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-admin-runtime-c06.md",
"rootTreeNode": "concept:messaging-admin-runtime-c06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "aae7d05f5c14added4f9d55e8c96efe500b48bb1dfcb6ed6dc3bc9e76d9a680d",
"lines": 40,
"body": "concept/concept-messaging-admin-runtime-c06.body.md",
"bodySha256": "abf07678ee077ffeb4e51c3383f5f88254ee198138812742ca50388ac7321a03",
"assets": [
{
"key": "messaging-admin-runtime-c06-diagram",
"kind": "diagram"
},
{
"key": "messaging-admin-runtime-c06",
"kind": "terminal"
}
]
},
"messaging-admin-runtime-c07": {
"kind": "CONCEPT",
"slug": "messaging-admin-runtime-c07",
"title": "크래시와 복제본을 고려하지 않은 admin 평면",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-admin-runtime-c07.md",
"rootTreeNode": "concept:messaging-admin-runtime-c07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f9fccf66a9ba8feaf1bdcabb2b6e4f8954102a280789b3375f42205dc5f784f3",
"lines": 36,
"body": "concept/concept-messaging-admin-runtime-c07.body.md",
"bodySha256": "629c531149d3099efd5040e96e5b0cd014ba7123a34aa79afa21903e0ba9bea9",
"assets": [
{
"key": "messaging-admin-runtime-c07",
"kind": "terminal"
}
]
},
"messaging-claim-check-c01": {
"kind": "CONCEPT",
"slug": "messaging-claim-check-c01",
"title": "위협은 실패가 아니라 잘못된 성공이다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-claim-check-c01.md",
"rootTreeNode": "concept:messaging-claim-check-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "05e1b310826db6d28f11322b71aa32c2742d1970aa1d23133c9baca23205a83d",
"lines": 32,
"body": "concept/concept-messaging-claim-check-c01.body.md",
"bodySha256": "78971b91124bb2982d61d97345d302976ebff7f69d5390c3083531c83d4470e0",
"assets": [
{
"key": "messaging-claim-check-c01-diagram",
"kind": "diagram"
},
{
"key": "messaging-claim-check-c01",
"kind": "terminal"
}
]
},
"messaging-claim-check-c02": {
"kind": "CONCEPT",
"slug": "messaging-claim-check-c02",
"title": "싣고 쓰지 않는다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-claim-check-c02.md",
"rootTreeNode": "concept:messaging-claim-check-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "dff98e672ac216684c6da63694dd2252b49789860f6cd9200eaee3bbfe35d13a",
"lines": 36,
"body": "concept/concept-messaging-claim-check-c02.body.md",
"bodySha256": "e892609f37cbe7bebd50fbb43798b399da4c2c036fc51a3dafc8e1cd6a2c736b",
"assets": [
{
"key": "messaging-claim-check-c02",
"kind": "terminal"
}
]
},
"messaging-claim-check-c03": {
"kind": "CONCEPT",
"slug": "messaging-claim-check-c03",
"title": "보존이 생성자 불변식이고 삭제를 부르는 쪽이 없다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-claim-check-c03.md",
"rootTreeNode": "concept:messaging-claim-check-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "21ef12911786370b668b77ca3303d1d4d3118fa485f03fd405c5fdab03a7b110",
"lines": 40,
"body": "concept/concept-messaging-claim-check-c03.body.md",
"bodySha256": "b7c6c6617a9ba6db09a9b2313c22241e816628cdd16270c46c04ccef17bab8c3",
"assets": [
{
"key": "messaging-claim-check-c03-diagram",
"kind": "diagram"
},
{
"key": "messaging-claim-check-c03",
"kind": "terminal"
}
]
},
"messaging-claim-check-c04": {
"kind": "CONCEPT",
"slug": "messaging-claim-check-c04",
"title": "두 경로 모두 production에서 호출되지 않는다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-claim-check-c04.md",
"rootTreeNode": "concept:messaging-claim-check-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "45ca54da9e8b38ad65a01e309dc4a2c4f2df654301c6fb2b38c73b6280b91579",
"lines": 32,
"body": "concept/concept-messaging-claim-check-c04.body.md",
"bodySha256": "04ff2b8a74cfc90b3d2f705d5465742670219af1d364fbd1fe0d55ea5080e860",
"assets": [
{
"key": "messaging-claim-check-c04",
"kind": "terminal"
}
]
},
"messaging-claim-check-c05": {
"kind": "CONCEPT",
"slug": "messaging-claim-check-c05",
"title": "만료와 불일치를 다른 카테고리로 가른다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-claim-check-c05.md",
"rootTreeNode": "concept:messaging-claim-check-c05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5cb1d0dc8503c9d7ab7d1cd1fb9ef144f1b58468d17ee7de06785ad22e554bc2",
"lines": 32,
"body": "concept/concept-messaging-claim-check-c05.body.md",
"bodySha256": "444d657f3c109de2b9712b9a675f52bb58debf9c755e220886fcc01151b3ac47",
"assets": [
{
"key": "messaging-claim-check-c05",
"kind": "terminal"
}
]
},
"messaging-claim-check-c06": {
"kind": "CONCEPT",
"slug": "messaging-claim-check-c06",
"title": "MessageDigest를 호출마다 새로 만드는 것이 옳다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-claim-check-c06.md",
"rootTreeNode": "concept:messaging-claim-check-c06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "94d6bf79bffcee14eb41c98a4a7f6ff1fe7f03f5ef3153f0518b3082e4d7fe01",
"lines": 32,
"body": "concept/concept-messaging-claim-check-c06.body.md",
"bodySha256": "8f958b5c26bfcee5c0d2958049df5bf6956503665ccc711a667043464f05b161",
"assets": [
{
"key": "messaging-claim-check-c06",
"kind": "terminal"
}
]
},
"messaging-claim-check-c07": {
"kind": "CONCEPT",
"slug": "messaging-claim-check-c07",
"title": "테스트에서는 드물고 부하에서는 일상인 것",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-claim-check-c07.md",
"rootTreeNode": "concept:messaging-claim-check-c07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "07fb971cdbfb2496d1cc8b2530a852372db307145af0742bbda6c2cdcac6182d",
"lines": 32,
"body": "concept/concept-messaging-claim-check-c07.body.md",
"bodySha256": "21b5c5f5b21e395f4305fe1923332923ff3e40e103b6bd52036390000e6cf393",
"assets": [
{
"key": "messaging-claim-check-c07",
"kind": "terminal"
}
]
},
"messaging-cloudevents-c07": {
"kind": "CONCEPT",
"slug": "messaging-cloudevents-c07",
"title": "상태가 없다는 사실이 javadoc에는 적혀 있지 않다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-cloudevents-c07.md",
"rootTreeNode": "concept:messaging-cloudevents-c07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d61e7c56482d0594f7fdb0a7365d939dd5f40b76b2e9214750f9f142cd8464bb",
"lines": 32,
"body": "concept/concept-messaging-cloudevents-c07.body.md",
"bodySha256": "e67903a94ff98a5769bb1221037757ae70f85fccc0ddec328a1aa01ec1b6847b",
"assets": [
{
"key": "messaging-cloudevents-c07",
"kind": "terminal"
}
]
},
"messaging-core-api-c01": {
"kind": "CONCEPT",
"slug": "messaging-core-api-c01",
"title": "무엇이 아닌가가 무엇인가만큼 중요하다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-core-api-c01.md",
"rootTreeNode": "concept:messaging-core-api-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "dd237ed9715bc2576e6172b540c455a1862af32215864413b209d56a5e0942a1",
"lines": 40,
"body": "concept/concept-messaging-core-api-c01.body.md",
"bodySha256": "341d24767362d8c55a37677f07995b2541dd364e471f691673cf75fa239b7386",
"assets": [
{
"key": "messaging-core-api-c01-diagram",
"kind": "diagram"
},
{
"key": "messaging-core-api-c01",
"kind": "terminal"
}
]
},
"messaging-core-api-c03": {
"kind": "CONCEPT",
"slug": "messaging-core-api-c03",
"title": "예약 네임스페이스를 봉투 필드와 헤더 전용으로 쪼갠다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-core-api-c03.md",
"rootTreeNode": "concept:messaging-core-api-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "399e9166456a29e21510c620945c622a158464938baf536a6941483a26c76e05",
"lines": 36,
"body": "concept/concept-messaging-core-api-c03.body.md",
"bodySha256": "15b166254b0b169fc2f4113e6be8f28b481a5a180f4fc073f9eb41e7c733e075",
"assets": [
{
"key": "messaging-core-api-c03",
"kind": "terminal"
}
]
},
"messaging-core-api-c07": {
"kind": "CONCEPT",
"slug": "messaging-core-api-c07",
"title": "동시성 지점이 하나뿐이다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-core-api-c07.md",
"rootTreeNode": "concept:messaging-core-api-c07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "4ff4bddbe92f14dff3ac1c4b5af48a2292d1435fcc413b45d0adba9cfac56f6b",
"lines": 40,
"body": "concept/concept-messaging-core-api-c07.body.md",
"bodySha256": "885e86707a9a3cb7d3041342bd9506ee29716e32d483174f952c9537424a73bb",
"assets": [
{
"key": "messaging-core-api-c07",
"kind": "terminal"
}
]
},
"messaging-core-api-c08": {
"kind": "CONCEPT",
"slug": "messaging-core-api-c08",
"title": "검사가 없었던 게 아니라 잘못된 단위로 되어 있었다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-core-api-c08.md",
"rootTreeNode": "concept:messaging-core-api-c08",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "23b9432c16883d2cc6c1ef84670dc1fd16bb4fbdfd2c0f28bd845e22f915b316",
"lines": 32,
"body": "concept/concept-messaging-core-api-c08.body.md",
"bodySha256": "5e32f2c8bae1252833777ffc66996bc227379cb3f66b2b0760c4d7af98ade4f3",
"assets": [
{
"key": "messaging-core-api-c08",
"kind": "terminal"
}
]
},
"messaging-inbox-jdbc-postgresql-c04": {
"kind": "CONCEPT",
"slug": "messaging-inbox-jdbc-postgresql-c04",
"title": "action 예외가 예약까지 함께 롤백시킨다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-inbox-jdbc-postgresql-c04.md",
"rootTreeNode": "concept:messaging-inbox-jdbc-postgresql-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "20aaede3480485e2debbdc94c4b05388d49d44a52b231bf6557a45c70ce97672",
"lines": 36,
"body": "concept/concept-messaging-inbox-jdbc-postgresql-c04.body.md",
"bodySha256": "95964ff0bffd595721fc9b5c638176fae41eaddc8dff20e7382fd62a081adfec",
"assets": [
{
"key": "messaging-inbox-jdbc-postgresql-c04",
"kind": "terminal"
}
]
},
"messaging-inbox-jdbc-postgresql-c05": {
"kind": "CONCEPT",
"slug": "messaging-inbox-jdbc-postgresql-c05",
"title": "일시적 인프라 문제가 재시도 불가로 분류된다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-inbox-jdbc-postgresql-c05.md",
"rootTreeNode": "concept:messaging-inbox-jdbc-postgresql-c05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "bd96a96f3c4fc4a0e756ce2da9aad49c1c8b98bb19f58c3a7903970244dcaa58",
"lines": 32,
"body": "concept/concept-messaging-inbox-jdbc-postgresql-c05.body.md",
"bodySha256": "261f0f026f828c1c500952c212fc98d6850be75051abc3ff4459271ce31573b0",
"assets": [
{
"key": "messaging-inbox-jdbc-postgresql-c05",
"kind": "terminal"
}
]
},
"messaging-inbox-jdbc-postgresql-c06": {
"kind": "CONCEPT",
"slug": "messaging-inbox-jdbc-postgresql-c06",
"title": "커넥션 조회가 새 커넥션을 열기 전에 검사가 돌아야 한다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-inbox-jdbc-postgresql-c06.md",
"rootTreeNode": "concept:messaging-inbox-jdbc-postgresql-c06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "c8370ac39ea609f4026edcecebc36fe54ac644c257d87db71848e8d70b51a6bc",
"lines": 36,
"body": "concept/concept-messaging-inbox-jdbc-postgresql-c06.body.md",
"bodySha256": "fa7d2257fe43d286c720b2f834a3001168a4bbe9b2e5da5b9affda496dc7acae",
"assets": [
{
"key": "messaging-inbox-jdbc-postgresql-c06-diagram",
"kind": "diagram"
},
{
"key": "messaging-inbox-jdbc-postgresql-c06",
"kind": "terminal"
}
]
},
"messaging-kafka-c02": {
"kind": "CONCEPT",
"slug": "messaging-kafka-c02",
"title": "느린 메시지 하나가 그 파티션의 워터마크를 붙든다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-kafka-c02.md",
"rootTreeNode": "concept:messaging-kafka-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "6e45818067c3041d7f3042c8c7583bd7f33f30444705002c1285c0620338a5f0",
"lines": 36,
"body": "concept/concept-messaging-kafka-c02.body.md",
"bodySha256": "17d0bed476517ea9b6f327dec907d83a2ce2a4665f50d943f89b3e3a77963b4a",
"assets": [
{
"key": "messaging-kafka-c02-diagram",
"kind": "diagram"
},
{
"key": "messaging-kafka-c02",
"kind": "terminal"
}
]
},
"messaging-kafka-share-experimental-c03": {
"kind": "CONCEPT",
"slug": "messaging-kafka-share-experimental-c03",
"title": "register가 아무것도 등록하지 않고 활성을 돌려준다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-kafka-share-experimental-c03.md",
"rootTreeNode": "concept:messaging-kafka-share-experimental-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0f689637c08fbdc5e3884b7dded282f1ef98d5d448bc03860264c79fadc62fe6",
"lines": 40,
"body": "concept/concept-messaging-kafka-share-experimental-c03.body.md",
"bodySha256": "5e3f3e8e299d53bc4a2ced2499f8940e44ed454b99f171b494ca74fbe88bc59f",
"assets": [
{
"key": "messaging-kafka-share-experimental-c03-diagram",
"kind": "diagram"
},
{
"key": "messaging-kafka-share-experimental-c03",
"kind": "terminal"
}
]
},
"messaging-kafka-share-experimental-c06": {
"kind": "CONCEPT",
"slug": "messaging-kafka-share-experimental-c06",
"title": "닫을 자원이 없어서 두 번 닫아도 무해하다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-kafka-share-experimental-c06.md",
"rootTreeNode": "concept:messaging-kafka-share-experimental-c06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "c8376e45cf3a19c382d28326a909ad8885516213ebc4df103079db05699ffa35",
"lines": 32,
"body": "concept/concept-messaging-kafka-share-experimental-c06.body.md",
"bodySha256": "b5f9fb19dd273e3a7c175f3160c4190eaac58c2300a2691c61d5f835321f8a72",
"assets": [
{
"key": "messaging-kafka-share-experimental-c06",
"kind": "terminal"
}
]
},
"messaging-observability-c01": {
"kind": "CONCEPT",
"slug": "messaging-observability-c01",
"title": "seam은 중립이고 구현만 벤더에 묶인다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-observability-c01.md",
"rootTreeNode": "concept:messaging-observability-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "27f389555c2ca48ef9fe395f0a11cc92d8334d9251410e0c1f6daf4ceae41f3d",
"lines": 32,
"body": "concept/concept-messaging-observability-c01.body.md",
"bodySha256": "025b7f2e087c0ffd302053100486d2d186007229e8ba2fcfecc365d27c021b1b",
"assets": [
{
"key": "messaging-observability-c01-diagram",
"kind": "diagram"
},
{
"key": "messaging-observability-c01",
"kind": "terminal"
}
]
},
"messaging-observability-c06": {
"kind": "CONCEPT",
"slug": "messaging-observability-c06",
"title": "Set 인스턴스를 락으로 쓰지만 외부 경합이 없다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-observability-c06.md",
"rootTreeNode": "concept:messaging-observability-c06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "85742d63150c3443fb81f38729752bf0c27cc8e01dd692c98a29151e411494a7",
"lines": 32,
"body": "concept/concept-messaging-observability-c06.body.md",
"bodySha256": "319f3f8cf8f998489291c2c0da33901a0e51e0ce699a5ed7999d646829b747ef",
"assets": [
{
"key": "messaging-observability-c06",
"kind": "terminal"
}
]
},
"messaging-observability-c07": {
"kind": "CONCEPT",
"slug": "messaging-observability-c07",
"title": "경계는 예산을 정확히 소비할 때만 경계다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-observability-c07.md",
"rootTreeNode": "concept:messaging-observability-c07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "595f20a534488afa0d3f9e06877bad24c8123a07f3e2c5bf8bc212669f63110a",
"lines": 32,
"body": "concept/concept-messaging-observability-c07.body.md",
"bodySha256": "ec2ab98637bca7003579dfe6d10190387a2f74ddeb750c551ac2db3a4ceb705b",
"assets": [
{
"key": "messaging-observability-c07",
"kind": "terminal"
}
]
},
"messaging-outbox-jdbc-postgresql-c05": {
"kind": "CONCEPT",
"slug": "messaging-outbox-jdbc-postgresql-c05",
"title": "동시성 제어가 전부 데이터베이스에 있다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-outbox-jdbc-postgresql-c05.md",
"rootTreeNode": "concept:messaging-outbox-jdbc-postgresql-c05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b244f0a3a1202341ea93cd76a70b9dfaf88b812241ff7a4daf228ee97ac540a9",
"lines": 36,
"body": "concept/concept-messaging-outbox-jdbc-postgresql-c05.body.md",
"bodySha256": "a324d89c446cd89b2cc7febe9ae731004620742d6d0bbbd6709204e5bb26494e",
"assets": [
{
"key": "messaging-outbox-jdbc-postgresql-c05-diagram",
"kind": "diagram"
},
{
"key": "messaging-outbox-jdbc-postgresql-c05",
"kind": "terminal"
}
]
},
"messaging-policy-c01": {
"kind": "CONCEPT",
"slug": "messaging-policy-c01",
"title": "모순은 부팅 실패여야 한다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-policy-c01.md",
"rootTreeNode": "concept:messaging-policy-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "443bf76fe26be544bfe83dc43169c327ceaad20e663f59054be51e489b783a93",
"lines": 32,
"body": "concept/concept-messaging-policy-c01.body.md",
"bodySha256": "80e6d41a76a7e8b2fa641b8db906ac31a758cae5729feab6bdae965ba972ef6a",
"assets": [
{
"key": "messaging-policy-c01-diagram",
"kind": "diagram"
},
{
"key": "messaging-policy-c01",
"kind": "terminal"
}
]
},
"messaging-policy-c03": {
"kind": "CONCEPT",
"slug": "messaging-policy-c03",
"title": "거절이 전송 전에 끝나는 것이 설계의 핵심이다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-policy-c03.md",
"rootTreeNode": "concept:messaging-policy-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "c0d29255d526b3d468f56d4aa9c7143c2dcbad1c90177d9384aacb845992c915",
"lines": 40,
"body": "concept/concept-messaging-policy-c03.body.md",
"bodySha256": "d6e125e578638ae684a2c473c5627f4d1b71900dccc1a7fefda89a87cfdd3340",
"assets": [
{
"key": "messaging-policy-c03-diagram",
"kind": "diagram"
},
{
"key": "messaging-policy-c03",
"kind": "terminal"
}
]
},
"messaging-policy-c06": {
"kind": "CONCEPT",
"slug": "messaging-policy-c06",
"title": "제거 실패는 안전한 방향의 경합이다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-policy-c06.md",
"rootTreeNode": "concept:messaging-policy-c06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "6686c4eedd49a16fcfd6351aa289ecda29675f77b0e9f7229685d49e0a6aa37e",
"lines": 40,
"body": "concept/concept-messaging-policy-c06.body.md",
"bodySha256": "d428aff6f19664bf5b685a0573c6e97a3b73b52db9cbd5b8575107c323eab860",
"assets": [
{
"key": "messaging-policy-c06",
"kind": "terminal"
}
]
},
"messaging-policy-c09": {
"kind": "CONCEPT",
"slug": "messaging-policy-c09",
"title": "반납이 획득보다 많으면 제한이 사라진다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-policy-c09.md",
"rootTreeNode": "concept:messaging-policy-c09",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5e070736bb5fd8584d67496b116cf2ee77e0386e00a45003d5eaed062886fee6",
"lines": 32,
"body": "concept/concept-messaging-policy-c09.body.md",
"bodySha256": "0a46fb02c14591dca857157c9f7b95a17b8995fec206eb64e6cc90e992f85982",
"assets": [
{
"key": "messaging-policy-c09",
"kind": "terminal"
}
]
},
"messaging-reliability-api-c01": {
"kind": "CONCEPT",
"slug": "messaging-reliability-api-c01",
"title": "Outbox 하나로는 부족하다는 것을 타입이 직접 말한다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-reliability-api-c01.md",
"rootTreeNode": "concept:messaging-reliability-api-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "251a35b17f59e92d5d747ac7d96883dd7bb5ebf4866cd89474e76900cdc11528",
"lines": 36,
"body": "concept/concept-messaging-reliability-api-c01.body.md",
"bodySha256": "2faf25cb669ffb1f69c3425c3a73e1bf53279cfc69bad4b32132704085cb0048",
"assets": [
{
"key": "messaging-reliability-api-c01-diagram",
"kind": "diagram"
},
{
"key": "messaging-reliability-api-c01",
"kind": "terminal"
}
]
},
"messaging-reliability-api-c02": {
"kind": "CONCEPT",
"slug": "messaging-reliability-api-c02",
"title": "Outbox에 행을 쓰는 진입점이 없다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-reliability-api-c02.md",
"rootTreeNode": "concept:messaging-reliability-api-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "ba2f10b1f02bb0c0ec14fef8217664624212117bb5039e30da577f67419ea90e",
"lines": 36,
"body": "concept/concept-messaging-reliability-api-c02.body.md",
"bodySha256": "44bd18a0816996d8effaad372ec17ac3cb59648499cb2341e3fa6171fd366e24",
"assets": [
{
"key": "messaging-reliability-api-c02",
"kind": "terminal"
}
]
},
"messaging-reliability-api-c03": {
"kind": "CONCEPT",
"slug": "messaging-reliability-api-c03",
"title": "이 enum의 의미가 저장소 규칙 하나의 존재 이유다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-reliability-api-c03.md",
"rootTreeNode": "concept:messaging-reliability-api-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0d0bc32e6f59afb52dc502abc87e1c3c7f36e7a80b3492327027bf82473e0703",
"lines": 44,
"body": "concept/concept-messaging-reliability-api-c03.body.md",
"bodySha256": "4127bb9435a4b1851f7b153426d66036c8d924cde8ae9195d1c27a4e9157b048",
"assets": [
{
"key": "messaging-reliability-api-c03-diagram",
"kind": "diagram"
},
{
"key": "messaging-reliability-api-c03",
"kind": "terminal"
}
]
},
"messaging-reliability-api-c04": {
"kind": "CONCEPT",
"slug": "messaging-reliability-api-c04",
"title": "Outbox에 행을 쓰는 진입점만 구현이 없다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-reliability-api-c04.md",
"rootTreeNode": "concept:messaging-reliability-api-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "1f889bf8b4668d52deda559e715886f92b4884e4b93c17b0d904b4ed9ba27285",
"lines": 36,
"body": "concept/concept-messaging-reliability-api-c04.body.md",
"bodySha256": "4af7db08a902eb5d96df73b772da3cd3bb5891396b2255cb2b811d6abcf8dc5f",
"assets": [
{
"key": "messaging-reliability-api-c04",
"kind": "terminal"
}
]
},
"messaging-reliability-api-c05": {
"kind": "CONCEPT",
"slug": "messaging-reliability-api-c05",
"title": "실패를 예외가 아니라 상태와 반환값으로 표현한다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-reliability-api-c05.md",
"rootTreeNode": "concept:messaging-reliability-api-c05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "7835c403316d48d41fe8a487b188002c5f355f7ba53104d91832d110787217de",
"lines": 32,
"body": "concept/concept-messaging-reliability-api-c05.body.md",
"bodySha256": "0aebb59cfbeed1f87d94c58f028d73a692cef65c0ef918079d8da0b0ea336475",
"assets": [
{
"key": "messaging-reliability-api-c05",
"kind": "terminal"
}
]
},
"messaging-reliability-api-c06": {
"kind": "CONCEPT",
"slug": "messaging-reliability-api-c06",
"title": "전부 트랜잭션 계약인데 코드에는 트랜잭션이 없다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-reliability-api-c06.md",
"rootTreeNode": "concept:messaging-reliability-api-c06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "eb03c3f1cc5d088b83aa2dfcc3bcf7921815bf08b0aa243e20d5be2ac870ed21",
"lines": 32,
"body": "concept/concept-messaging-reliability-api-c06.body.md",
"bodySha256": "23d950d0d797995c84a61fcc9d6cbc93c1d6e51671182621ca5defe1f76ecbce",
"assets": [
{
"key": "messaging-reliability-api-c06-diagram",
"kind": "diagram"
},
{
"key": "messaging-reliability-api-c06",
"kind": "terminal"
}
]
},
"messaging-reliability-api-c07": {
"kind": "CONCEPT",
"slug": "messaging-reliability-api-c07",
"title": "전달 경로가 메시지 내용을 바꾸면 그것은 전달이 아니다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-reliability-api-c07.md",
"rootTreeNode": "concept:messaging-reliability-api-c07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "58a0a8da202717a42837240f62943aa82252c41c78837c048f2c841e0185273b",
"lines": 32,
"body": "concept/concept-messaging-reliability-api-c07.body.md",
"bodySha256": "9572ff85cd4ac0c2b73f527c9fe5d5b75253e51c64fdf690018d95e983989e3d",
"assets": [
{
"key": "messaging-reliability-api-c07",
"kind": "terminal"
}
]
},
"messaging-runtime-core-c04": {
"kind": "CONCEPT",
"slug": "messaging-runtime-core-c04",
"title": "전송이 없으면 조용히 반환하는 설치 경로",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-runtime-core-c04.md",
"rootTreeNode": "concept:messaging-runtime-core-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "8f15b5068602944a800daa0cd318f9cd0ee74e9903d6accea240fb8c4655f958",
"lines": 36,
"body": "concept/concept-messaging-runtime-core-c04.body.md",
"bodySha256": "3064216f68ff1b01975662b00eafe999c2178ff0b94fdca902611b7baaffaca8",
"assets": [
{
"key": "messaging-runtime-core-c04",
"kind": "terminal"
}
]
},
"messaging-runtime-core-c06": {
"kind": "CONCEPT",
"slug": "messaging-runtime-core-c06",
"title": "지역 변수 하나만 람다가 복사해 캡처한다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-runtime-core-c06.md",
"rootTreeNode": "concept:messaging-runtime-core-c06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "3ca0dd4dc95611f7fc8afab44be0add248d140fc2d47f9de1478a55bad5a7d06",
"lines": 32,
"body": "concept/concept-messaging-runtime-core-c06.body.md",
"bodySha256": "55bb5b00d519efeb36abde05128b286aac55ddaf151c847509df1dc7cbb04641",
"assets": [
{
"key": "messaging-runtime-core-c06",
"kind": "terminal"
}
]
},
"messaging-schema-api-c01": {
"kind": "CONCEPT",
"slug": "messaging-schema-api-c01",
"title": "codec은 닫힌 registry에 대해서만 동작한다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-schema-api-c01.md",
"rootTreeNode": "concept:messaging-schema-api-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5782a8fbe2eb97a34c050cfb52751f040d1dc7cd26627863b5518f29e9e1b070",
"lines": 32,
"body": "concept/concept-messaging-schema-api-c01.body.md",
"bodySha256": "b3fa28683a90d37bab8960613fe933f4132af0df913876ca268c2d40b4a0f512",
"assets": [
{
"key": "messaging-schema-api-c01-diagram",
"kind": "diagram"
},
{
"key": "messaging-schema-api-c01",
"kind": "terminal"
}
]
},
"messaging-schema-api-c05": {
"kind": "CONCEPT",
"slug": "messaging-schema-api-c05",
"title": "프로그래밍 오류를 MessagingException 밖에 둔다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-schema-api-c05.md",
"rootTreeNode": "concept:messaging-schema-api-c05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "c40ac64252bbc15bb4fa8ae0e4a2fe474bc3aed8f84287199948127c332787eb",
"lines": 32,
"body": "concept/concept-messaging-schema-api-c05.body.md",
"bodySha256": "68c120cc2133578e7d72cc777bb2486419191bf368fc11921976f9dc48eab434",
"assets": [
{
"key": "messaging-schema-api-c05",
"kind": "terminal"
}
]
},
"messaging-schema-api-c06": {
"kind": "CONCEPT",
"slug": "messaging-schema-api-c06",
"title": "의도적으로 스레드 안전하지 않은 타입이 하나 있다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-schema-api-c06.md",
"rootTreeNode": "concept:messaging-schema-api-c06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "2f832742eaea64027e9c14c7d581f339c8b920eb1e5e1ce2df8a607fca130537",
"lines": 36,
"body": "concept/concept-messaging-schema-api-c06.body.md",
"bodySha256": "2759c4cef89b4d104945d320855aae62ab436ef15fd62373f38bf6ad10b4d129",
"assets": [
{
"key": "messaging-schema-api-c06",
"kind": "terminal"
}
]
},
"messaging-schema-avro-c06": {
"kind": "CONCEPT",
"slug": "messaging-schema-avro-c06",
"title": "재사용 자리에 항상 null을 넘겨 공유 상태를 없앤다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-schema-avro-c06.md",
"rootTreeNode": "concept:messaging-schema-avro-c06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5f21887cef377f47e5586da23c5a4e4aed72edf653dc1791c5c289586a853c89",
"lines": 36,
"body": "concept/concept-messaging-schema-avro-c06.body.md",
"bodySha256": "6adcf70624fbf74eb5b7bf0a6cec30eb33bdb9d206886890fa544b7a8eb30144",
"assets": [
{
"key": "messaging-schema-avro-c06",
"kind": "terminal"
}
]
},
"messaging-schema-json-c06": {
"kind": "CONCEPT",
"slug": "messaging-schema-json-c06",
"title": "메시지당 유지 메모리를 성능 테스트가 간접 확인한다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-schema-json-c06.md",
"rootTreeNode": "concept:messaging-schema-json-c06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "6f1f254818d1e93bd946300799cc6587adb337065e9b26c526276c5ce41996a9",
"lines": 32,
"body": "concept/concept-messaging-schema-json-c06.body.md",
"bodySha256": "eea09eb3ad90157ece63391f69461614d1d2e0e0b66c1ba1a9cce2fa01be86e7",
"assets": [
{
"key": "messaging-schema-json-c06",
"kind": "terminal"
}
]
},
"messaging-schema-json-c07": {
"kind": "CONCEPT",
"slug": "messaging-schema-json-c07",
"title": "이 리프에서 발견된 문제가 상위 리프의 타입을 만들어냈다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-schema-json-c07.md",
"rootTreeNode": "concept:messaging-schema-json-c07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e58e6fbc33611cdc2ec8e0eab910d38ee0f021176a237fed58eb4450d5adab36",
"lines": 36,
"body": "concept/concept-messaging-schema-json-c07.body.md",
"bodySha256": "0b492c96bf42ae890ade91d609e5d2f712ae79837d80bb0c04665fefc97e33e8",
"assets": [
{
"key": "messaging-schema-json-c07",
"kind": "terminal"
}
]
},
"messaging-schema-protobuf-c02": {
"kind": "CONCEPT",
"slug": "messaging-schema-protobuf-c02",
"title": "나가는 의존이 하나도 없다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-schema-protobuf-c02.md",
"rootTreeNode": "concept:messaging-schema-protobuf-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "cc2f6b7ef8b6b3b248387f39e4af5d27a4f403fcc3d0ddcbfb6f4c4dec73b876",
"lines": 36,
"body": "concept/concept-messaging-schema-protobuf-c02.body.md",
"bodySha256": "0ffba2230d1d2e9457d3be2b16884aca754fda568b964d0347e9ba5db41aeed8",
"assets": [
{
"key": "messaging-schema-protobuf-c02",
"kind": "terminal"
}
]
},
"messaging-schema-protobuf-c06": {
"kind": "CONCEPT",
"slug": "messaging-schema-protobuf-c06",
"title": "평탄한 registry라 얕은 복사 문제가 없다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-schema-protobuf-c06.md",
"rootTreeNode": "concept:messaging-schema-protobuf-c06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b396d95cb9a25e66467e0025b7fee4ac620426be64ff7cb146a94236824b390e",
"lines": 32,
"body": "concept/concept-messaging-schema-protobuf-c06.body.md",
"bodySha256": "d2ee107d8200b229f6a284e386bb62116a3e5317d1ca028a25ceb9193ec66a3a",
"assets": [
{
"key": "messaging-schema-protobuf-c06",
"kind": "terminal"
}
]
},
"messaging-security-c01": {
"kind": "CONCEPT",
"slug": "messaging-security-c01",
"title": "비밀은 참조로만 다루고 역할은 필드로 나눈다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-security-c01.md",
"rootTreeNode": "concept:messaging-security-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b584bb20594d2be4ed10c4c94c02f87570b3486ee4a6369d1ad020d401c456f8",
"lines": 36,
"body": "concept/concept-messaging-security-c01.body.md",
"bodySha256": "5dbc0aa48e3f157878359e97b18e1efbd28dea6d36f281a47438964d9f3e6d71",
"assets": [
{
"key": "messaging-security-c01-diagram",
"kind": "diagram"
},
{
"key": "messaging-security-c01",
"kind": "terminal"
}
]
},
"messaging-security-c03": {
"kind": "CONCEPT",
"slug": "messaging-security-c03",
"title": "한 경합에서 서로 다른 두 결함이 나왔다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-security-c03.md",
"rootTreeNode": "concept:messaging-security-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0fb82a8cc1a58c481d3e615ef5517be9023cf656f20e3ca12c3bcb3a57695bcc",
"lines": 44,
"body": "concept/concept-messaging-security-c03.body.md",
"bodySha256": "4e0d32eb802d3b0233f661719d75d8cef6d827fadb6e747efeaab47d197ab026",
"assets": [
{
"key": "messaging-security-c03-diagram",
"kind": "diagram"
},
{
"key": "messaging-security-c03",
"kind": "terminal"
}
]
},
"messaging-security-c04": {
"kind": "CONCEPT",
"slug": "messaging-security-c04",
"title": "시작 검증 호출 지점이 두 곳으로 갈린다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-security-c04.md",
"rootTreeNode": "concept:messaging-security-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "1149a09991792509c63ef39358a468d4008f9e8db9642de74e97d5e8de0f54fa",
"lines": 36,
"body": "concept/concept-messaging-security-c04.body.md",
"bodySha256": "eecbd7849b610d4b2a07c891f7f27e6f82d725db1108a211be8c02bc4a409b76",
"assets": [
{
"key": "messaging-security-c04",
"kind": "terminal"
}
]
},
"messaging-security-c06": {
"kind": "CONCEPT",
"slug": "messaging-security-c06",
"title": "종료 시 자격증명을 소거하는 코드가 없다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-security-c06.md",
"rootTreeNode": "concept:messaging-security-c06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "8b5869069babacb208219ba1b9ec93b266375f6b4917e11c9032f4e6903aff1a",
"lines": 32,
"body": "concept/concept-messaging-security-c06.body.md",
"bodySha256": "01e8db95d6b9b73e5535a4a2867e0bb0e720401af0180e043ad9ead00eeb890b",
"assets": [
{
"key": "messaging-security-c06",
"kind": "terminal"
}
]
},
"messaging-security-c07": {
"kind": "CONCEPT",
"slug": "messaging-security-c07",
"title": "거부목록이 실제로 뚫린 기록이 남아 있다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-security-c07.md",
"rootTreeNode": "concept:messaging-security-c07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "9cb990f5217343efd558b840ee0ee4575878526942aa98869fcda0842919eb07",
"lines": 28,
"body": "concept/concept-messaging-security-c07.body.md",
"bodySha256": "8934678807061e7f56faa86d3242747e246d937e4916107e33bfc510b7840c31",
"assets": [
{
"key": "messaging-security-c07",
"kind": "terminal"
}
]
},
"messaging-spring-cloud-stream-bridge-c06": {
"kind": "CONCEPT",
"slug": "messaging-spring-cloud-stream-bridge-c06",
"title": "등록된 핸들러를 해제하는 방법이 없다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-spring-cloud-stream-bridge-c06.md",
"rootTreeNode": "concept:messaging-spring-cloud-stream-bridge-c06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "70390b15eeb847bdf6b7212cdfdd735bebe0b595e3bac561c9213dc3a334a15c",
"lines": 36,
"body": "concept/concept-messaging-spring-cloud-stream-bridge-c06.body.md",
"bodySha256": "fa68c3f47f2ecb51bcfa1056a03e30513dfc7fe897dc831be196e435eeb9c934",
"assets": [
{
"key": "messaging-spring-cloud-stream-bridge-c06",
"kind": "terminal"
}
]
},
"messaging-testkit-c07": {
"kind": "CONCEPT",
"slug": "messaging-testkit-c07",
"title": "가변인데 공유되지 않아서 안전한 것들",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-testkit-c07.md",
"rootTreeNode": "concept:messaging-testkit-c07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "aac4edf4dc5c093f83e91a97d90df07a2168002c3be784c111a9e4b5456cc28f",
"lines": 40,
"body": "concept/concept-messaging-testkit-c07.body.md",
"bodySha256": "9815de8ac1d6286b307bf3307608cac9eae4dded7dc901437440032df804e821",
"assets": [
{
"key": "messaging-testkit-c07",
"kind": "terminal"
}
]
},
"messaging-testkit-c08": {
"kind": "CONCEPT",
"slug": "messaging-testkit-c08",
"title": "자기 자신을 검증하는 상수가 여섯 얼굴로 나타났다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-testkit-c08.md",
"rootTreeNode": "concept:messaging-testkit-c08",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "4da0571f7f4ace3457760b1b125260d15fde510aa7e78783ab3b83421ec50490",
"lines": 32,
"body": "concept/concept-messaging-testkit-c08.body.md",
"bodySha256": "347f26d46e7b559565a9e76a128271e4c6be714273fe3985a4a603e20c0ee035",
"assets": [
{
"key": "messaging-testkit-c08",
"kind": "terminal"
}
]
},
"messaging-transport-spi-c01": {
"kind": "CONCEPT",
"slug": "messaging-transport-spi-c01",
"title": "어댑터가 코덱도 한도도 스스로 고르지 않는다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-transport-spi-c01.md",
"rootTreeNode": "concept:messaging-transport-spi-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5b514eff9cdb2114be1d296812b98022688bc57675f546303404aa97d66d69ee",
"lines": 32,
"body": "concept/concept-messaging-transport-spi-c01.body.md",
"bodySha256": "265dd92d145aada88f42395eda466e48d984d0eee8503e0bb126631c362581ea",
"assets": [
{
"key": "messaging-transport-spi-c01-diagram",
"kind": "diagram"
},
{
"key": "messaging-transport-spi-c01",
"kind": "terminal"
}
]
},
"messaging-transport-spi-c03": {
"kind": "CONCEPT",
"slug": "messaging-transport-spi-c03",
"title": "회전은 변경이 아니라 교체다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-transport-spi-c03.md",
"rootTreeNode": "concept:messaging-transport-spi-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "81649f7b10fdf67a1ea7a6b4d7b5ae3b00673f3d3d43a8ec22969406d7bb7535",
"lines": 44,
"body": "concept/concept-messaging-transport-spi-c03.body.md",
"bodySha256": "1def04fc8b4f183182f4037c1ece7bf1b6448d9475f05263fe327d0d86eb7a8b",
"assets": [
{
"key": "messaging-transport-spi-c03-diagram",
"kind": "diagram"
},
{
"key": "messaging-transport-spi-c03",
"kind": "terminal"
}
]
},
"messaging-transport-spi-c04": {
"kind": "CONCEPT",
"slug": "messaging-transport-spi-c04",
"title": "선언된 종료 순서와 실제 종료 경로",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-transport-spi-c04.md",
"rootTreeNode": "concept:messaging-transport-spi-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "df7c82989311285b38faa286a59977877c0d69b76bad6c8c5c9a3be75f848988",
"lines": 40,
"body": "concept/concept-messaging-transport-spi-c04.body.md",
"bodySha256": "ef50e62665277aa68269c21f4f16d888aca341af828387ffb4dfef4dedab80b1",
"assets": [
{
"key": "messaging-transport-spi-c04",
"kind": "terminal"
}
]
},
"messaging-transport-spi-c05": {
"kind": "CONCEPT",
"slug": "messaging-transport-spi-c05",
"title": "포기가 조용하지 않다는 것이 설계다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-transport-spi-c05.md",
"rootTreeNode": "concept:messaging-transport-spi-c05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "c5e997fabe665a18b79494a28d5564d070cedf5c87b2e061125fce9e76060cea",
"lines": 30,
"body": "concept/concept-messaging-transport-spi-c05.body.md",
"bodySha256": "0a3ffe1eb76e7ca66d42e39e69b2d86989a715d562fbc866263603c6501538e0",
"assets": [
{
"key": "messaging-transport-spi-c05",
"kind": "terminal"
}
]
},
"messaging-transport-spi-c06": {
"kind": "CONCEPT",
"slug": "messaging-transport-spi-c06",
"title": "두 자료구조가 다른 방식으로 보호되고 주석이 없다",
"topic": "state-machines-and-ownership",
"path": "concept/concept-messaging-transport-spi-c06.md",
"rootTreeNode": "concept:messaging-transport-spi-c06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "09a26dc01f61b962f62a569118eac2a1888f9f91781ff8489a8be6d7d1f5edda",
"lines": 32,
"body": "concept/concept-messaging-transport-spi-c06.body.md",
"bodySha256": "9f781900b0ed2d04e9f311753a53fe7f8b6b6873dca469b192a7339f47cd22a0",
"assets": [
{
"key": "messaging-transport-spi-c06",
"kind": "terminal"
}
]
},
"adapter-inbound-websocket-c02": {
"kind": "CONCEPT",
"slug": "adapter-inbound-websocket-c02",
"title": "요청 경로에 있는 것은 stomp 패키지가 참조하는 것뿐이다",
"topic": "transaction-and-consistency-models",
"path": "concept/concept-adapter-inbound-websocket-c02.md",
"rootTreeNode": "concept:adapter-inbound-websocket-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5fac2d5cdd2383cda0b1961da2cabab2aa3a5d2b1caf3c8427a22e3c93c137b5",
"lines": 32,
"body": "concept/concept-adapter-inbound-websocket-c02.body.md",
"bodySha256": "3199c4d7c6c12b8a76649d49b94229def1361f273b5162da61b57dab0fdc42d8",
"assets": [
{
"key": "adapter-inbound-websocket-c02",
"kind": "terminal"
}
]
},
"adapter-outbound-cache-redis-c13": {
"kind": "CONCEPT",
"slug": "adapter-outbound-cache-redis-c13",
"title": "등록되지 않은 스크립트는 서버에 닿을 방법이 없다",
"topic": "transaction-and-consistency-models",
"path": "concept/concept-adapter-outbound-cache-redis-c13.md",
"rootTreeNode": "concept:adapter-outbound-cache-redis-c13",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "2cf9cc697c341b3ac010d02b6360143f81b7bf0d55a5f25958a0f1fdcbc420d4",
"lines": 40,
"body": "concept/concept-adapter-outbound-cache-redis-c13.body.md",
"bodySha256": "008d353dae70b20720a87cbfd118ccb67812ad37d1237db611fa95f0492f4fc0",
"assets": [
{
"key": "adapter-outbound-cache-redis-c13-diagram",
"kind": "diagram"
},
{
"key": "adapter-outbound-cache-redis-c13",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c02": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c02",
"title": "능력 어휘와 지원 등급과 실제 보고를 나눈다",
"topic": "transaction-and-consistency-models",
"path": "concept/concept-adapter-outbound-persistence-jpa-c02.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "ad75054ef10924197a7ab5e2e7ddc49fa836ebc7e2e18de5660e9497e2cf04a4",
"lines": 40,
"body": "concept/concept-adapter-outbound-persistence-jpa-c02.body.md",
"bodySha256": "e08407472ed0fd2f7e5655ff26733a9305953e927039c215786867a0a02195cc",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c02-diagram",
"kind": "diagram"
},
{
"key": "adapter-outbound-persistence-jpa-c02",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c10": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c10",
"title": "두 트랜잭션 경계가 공존하고 문서만 어긋난다",
"topic": "transaction-and-consistency-models",
"path": "concept/concept-adapter-outbound-persistence-jpa-c10.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c10",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "93e985c126c77169ca3c647acc33b118d19a128e7caed2bf33e8253dfe0a3673",
"lines": 40,
"body": "concept/concept-adapter-outbound-persistence-jpa-c10.body.md",
"bodySha256": "35b83295bf1414ceabb1fbc9d69040be25ab32674993d4dcef0d14aff80b980e",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c10",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c11": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c11",
"title": "Spring stereotype이 있다고 runtime에 도달하지 않는다",
"topic": "transaction-and-consistency-models",
"path": "concept/concept-adapter-outbound-persistence-jpa-c11.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c11",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f16ae1df753bbd4ad3315cad9145ede8651c955e3757cc63e3e6cccb81e93348",
"lines": 40,
"body": "concept/concept-adapter-outbound-persistence-jpa-c11.body.md",
"bodySha256": "480ee5b16592c6222985187194697864eb1d524052891610f516c8b4dd956192",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c11",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c14": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c14",
"title": "SQLSTATE가 retryable이라고 해서 use case를 다시 돌리지 않는다",
"topic": "transaction-and-consistency-models",
"path": "concept/concept-adapter-outbound-persistence-jpa-c14.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c14",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "aec53043cddadb1c3fa6dfa5989fa34caf1068cfb0dc500c7d24db153dbc2314",
"lines": 36,
"body": "concept/concept-adapter-outbound-persistence-jpa-c14.body.md",
"bodySha256": "5f52fbc3ca17ccc69d44d8b012d6cd93a26b454daebaccdbb79a2c68303331ee",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c14",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c15": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c15",
"title": "한 번의 물리 시도만 담당하고 재시도는 하지 않는다",
"topic": "transaction-and-consistency-models",
"path": "concept/concept-adapter-outbound-persistence-jpa-c15.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c15",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "be97ba68fa738b058d0ef71db7e2242bec5d843e18a731e00b76031bb042dc0a",
"lines": 36,
"body": "concept/concept-adapter-outbound-persistence-jpa-c15.body.md",
"bodySha256": "07b64779fc52abfcc54f2810255dc365bedfbb3a9426edf3dd7d65c8a297eb27",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c15",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c16": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c16",
"title": "완료 불명과 되돌릴 수 없는 부작용에서는 재시도하지 않는다",
"topic": "transaction-and-consistency-models",
"path": "concept/concept-adapter-outbound-persistence-jpa-c16.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c16",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "cb8476cc23621ec5b397631ec7d8a9c2c54599f8c692849e52640caafc5a74c7",
"lines": 36,
"body": "concept/concept-adapter-outbound-persistence-jpa-c16.body.md",
"bodySha256": "afbf5bc60942b8d486bd3134e298e87678647ab873c37869c9757599181ac194",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c16",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c18": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c18",
"title": "문서가 지목하는 조정 레코드를 쓰는 코드가 없다",
"topic": "transaction-and-consistency-models",
"path": "concept/concept-adapter-outbound-persistence-jpa-c18.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c18",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "ba95a5f20f0b7e98afeee62837fe9c4645dd3df09ffda2ab11bae74d09418f0c",
"lines": 36,
"body": "concept/concept-adapter-outbound-persistence-jpa-c18.body.md",
"bodySha256": "0e795c4307f547c597334b2540a267f9e8fb9281748bc9f4770a96ce5fe479a2",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c18",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c20": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c20",
"title": "참조 수가 0이어도 스캔으로 도달한다",
"topic": "transaction-and-consistency-models",
"path": "concept/concept-adapter-outbound-persistence-jpa-c20.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c20",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f07528e061d1469cd4d93720853be51d4898a20378daa537ab4375ca049563ba",
"lines": 36,
"body": "concept/concept-adapter-outbound-persistence-jpa-c20.body.md",
"bodySha256": "95e5bfe12f657eb3b07acc2c0569032aceccb8a2cf234ad5fa1b616b87483f88",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c20",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c21": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c21",
"title": "이름이 비슷한 두 번역 계열의 출력 계약이 다르다",
"topic": "transaction-and-consistency-models",
"path": "concept/concept-adapter-outbound-persistence-jpa-c21.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c21",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "338b0b0f7ae6d1d2dd42e15a1009db772e3abe7f1d17b28cc8305a2fea6068f9",
"lines": 36,
"body": "concept/concept-adapter-outbound-persistence-jpa-c21.body.md",
"bodySha256": "9ba386ecf6a86209e3b2255109890e77a9fe232be0d3d00c34ffbb81171603e7",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c21",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c22": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c22",
"title": "adapter 오류 경계 쪽 번역기는 다른 출력을 낸다",
"topic": "transaction-and-consistency-models",
"path": "concept/concept-adapter-outbound-persistence-jpa-c22.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c22",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0db6cc1b89952beaf43359eafaee7ce31bc58fe3ffb52653ba03f2628cabbb35",
"lines": 36,
"body": "concept/concept-adapter-outbound-persistence-jpa-c22.body.md",
"bodySha256": "4c610f17d4edfc8a7508d2b7aaf3731544472a479bc0ebf6e82e3aa481771632",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c22",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c23": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c23",
"title": "설치되는 bean 셋과 설치되지 않는 구현 셋",
"topic": "transaction-and-consistency-models",
"path": "concept/concept-adapter-outbound-persistence-jpa-c23.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c23",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "98a541f0050a93a634c420d8b0fae1364bbf6357b08b274b6f5f351a04fc2a78",
"lines": 36,
"body": "concept/concept-adapter-outbound-persistence-jpa-c23.body.md",
"bodySha256": "3c1df196255e34973e58846fac9eed75bb2c74c2de141498d883a9e3a8d7c507",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c23",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c26": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c26",
"title": "쓰기 경로마다 트랜잭션 소유가 다르다",
"topic": "transaction-and-consistency-models",
"path": "concept/concept-adapter-outbound-persistence-jpa-c26.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c26",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f10ada7a4872ed15530c4303f736169183d41bab2957b54f941203be47cfabd6",
"lines": 36,
"body": "concept/concept-adapter-outbound-persistence-jpa-c26.body.md",
"bodySha256": "eb7430e96c3dc66f8d7d0e9cb9145ba9d91b2ab2683192141bdd50683f4a4be9",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c26-diagram",
"kind": "diagram"
},
{
"key": "adapter-outbound-persistence-jpa-c26",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c37": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c37",
"title": "중복 재생이 owner 검증보다 먼저 저장된 owner를 돌려준다",
"topic": "transaction-and-consistency-models",
"path": "concept/concept-adapter-outbound-persistence-jpa-c37.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c37",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5f7cc170abca59f96d4cc3b98f50e1608d7ac310f5cc225b81da908ada209f08",
"lines": 40,
"body": "concept/concept-adapter-outbound-persistence-jpa-c37.body.md",
"bodySha256": "0615a2c334d3ca63e89e1595d41010e2820d8bbe4f359d1dd80850221ce238c9",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c37",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c42": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c42",
"title": "여섯 package만 스캔하므로 같은 리프 안에서도 도달성이 다르다",
"topic": "transaction-and-consistency-models",
"path": "concept/concept-adapter-outbound-persistence-jpa-c42.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c42",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b43770a87a318561d5817b637e71dede22762b6eaab2414f70b758c2e453826c",
"lines": 36,
"body": "concept/concept-adapter-outbound-persistence-jpa-c42.body.md",
"bodySha256": "b544f8db8267b41b5d6334cfd5eb1f523faf8130344430d4f517e116818c9fe6",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c42-diagram",
"kind": "diagram"
},
{
"key": "adapter-outbound-persistence-jpa-c42",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c51": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c51",
"title": "Stable 스캔 목록에 experimental package가 이미 들어 있다",
"topic": "transaction-and-consistency-models",
"path": "concept/concept-adapter-outbound-persistence-jpa-c51.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c51",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "08367894df482b744c1aa1aa9c5a9762016c521e5618496fd588accb212f26c9",
"lines": 36,
"body": "concept/concept-adapter-outbound-persistence-jpa-c51.body.md",
"bodySha256": "68b7d3d4760bdfa46a90ea9315cc48173cc2416ade690a65bac290663010ec62",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c51",
"kind": "terminal"
},
{
"key": "adapter-outbound-persistence-jpa-c51-diagram",
"kind": "diagram"
}
]
},
"adapter-outbound-persistence-mongo-c03": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-mongo-c03",
"title": "아직 쓰이지 않은 연산에도 같은 불변식이 성립하게 만든 순서",
"topic": "transaction-and-consistency-models",
"path": "concept/concept-adapter-outbound-persistence-mongo-c03.md",
"rootTreeNode": "concept:adapter-outbound-persistence-mongo-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "72a833fa92aa52358e3a81e8fec169a724e7bacbd6da327299300cccd0b6d12f",
"lines": 40,
"body": "concept/concept-adapter-outbound-persistence-mongo-c03.body.md",
"bodySha256": "6cc8a8e328226098d95a9e03a17515345836b48ad3ca3e00fcaad781c213577e",
"assets": [
{
"key": "adapter-outbound-persistence-mongo-c03-diagram",
"kind": "diagram"
},
{
"key": "adapter-outbound-persistence-mongo-c03",
"kind": "terminal"
}
]
},
"application-core-c03": {
"kind": "CONCEPT",
"slug": "application-core-c03",
"title": "예외가 발생했다는 것을 rollback으로 단순화하지 않는다",
"topic": "transaction-and-consistency-models",
"path": "concept/concept-application-core-c03.md",
"rootTreeNode": "concept:application-core-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "c015104bb2978193cc52e7c36dd55ce7ba34183c00b91f97a4b00855271e42a1",
"lines": 40,
"body": "concept/concept-application-core-c03.body.md",
"bodySha256": "16afaedbc853d02b86609ff9450f7a64bf6be435c6f2dd09843ff4f252a7aaef",
"assets": [
{
"key": "application-core-c03-diagram",
"kind": "diagram"
},
{
"key": "application-core-c03",
"kind": "terminal"
}
]
},
"grpc-server-c01": {
"kind": "CONCEPT",
"slug": "grpc-server-c01",
"title": "승인이 마감보다 먼저이고 멱등이 검증보다 먼저다",
"topic": "transaction-and-consistency-models",
"path": "concept/concept-grpc-server-c01.md",
"rootTreeNode": "concept:grpc-server-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "4ad0a9be565f3fda4b24f2faa1ae0129bd697558599018523040ada9a48cf623",
"lines": 36,
"body": "concept/concept-grpc-server-c01.body.md",
"bodySha256": "9e87395aa0f32ba141e95db95b03693e80b911c3d6097aa19ec3cd7c9ed603c1",
"assets": [
{
"key": "grpc-server-c01-diagram",
"kind": "diagram"
},
{
"key": "grpc-server-c01",
"kind": "terminal"
}
]
},
"messaging-inbox-jdbc-postgresql-c01": {
"kind": "CONCEPT",
"slug": "messaging-inbox-jdbc-postgresql-c01",
"title": "메커니즘 전체가 하나의 SQL 문장에 있다",
"topic": "transaction-and-consistency-models",
"path": "concept/concept-messaging-inbox-jdbc-postgresql-c01.md",
"rootTreeNode": "concept:messaging-inbox-jdbc-postgresql-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d6f58130e9db41462b1ff3d4086bb4c138c861475459d750b128ff5271a27b07",
"lines": 40,
"body": "concept/concept-messaging-inbox-jdbc-postgresql-c01.body.md",
"bodySha256": "b2f28150d945f5d55b24e76bc5a6022b83b5483982f16cef3e1c78caec431b9f",
"assets": [
{
"key": "messaging-inbox-jdbc-postgresql-c01",
"kind": "terminal"
}
]
},
"messaging-inbox-jdbc-postgresql-c02": {
"kind": "CONCEPT",
"slug": "messaging-inbox-jdbc-postgresql-c02",
"title": "starter가 셋을 만들고 InboxRepository는 그 목록에 없다",
"topic": "transaction-and-consistency-models",
"path": "concept/concept-messaging-inbox-jdbc-postgresql-c02.md",
"rootTreeNode": "concept:messaging-inbox-jdbc-postgresql-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "9a5347169c3a397b310bd1d580cf64f5df47819ff6981d5978a425e04e2094bb",
"lines": 36,
"body": "concept/concept-messaging-inbox-jdbc-postgresql-c02.body.md",
"bodySha256": "f07cae1cdcab55c9fe740700be39179f4ce19c8f9f5212d38af68baae6417ec3",
"assets": [
{
"key": "messaging-inbox-jdbc-postgresql-c02",
"kind": "terminal"
}
]
},
"messaging-inbox-jdbc-postgresql-c03": {
"kind": "CONCEPT",
"slug": "messaging-inbox-jdbc-postgresql-c03",
"title": "두 오버로드가 있었고 호출되는 쪽이 틀린 쪽이었다",
"topic": "transaction-and-consistency-models",
"path": "concept/concept-messaging-inbox-jdbc-postgresql-c03.md",
"rootTreeNode": "concept:messaging-inbox-jdbc-postgresql-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "2bceaa50fc9bcab8ba1e4e09ce4580d3dfe441f2f38321e86950b21de82749de",
"lines": 40,
"body": "concept/concept-messaging-inbox-jdbc-postgresql-c03.body.md",
"bodySha256": "d48410d6c99e9c00bff777b086a909c0ab9b2fc6987a82b8b2e8650a6e2bc5e8",
"assets": [
{
"key": "messaging-inbox-jdbc-postgresql-c03-diagram",
"kind": "diagram"
},
{
"key": "messaging-inbox-jdbc-postgresql-c03",
"kind": "terminal"
}
]
},
"messaging-outbox-jdbc-postgresql-c01": {
"kind": "CONCEPT",
"slug": "messaging-outbox-jdbc-postgresql-c01",
"title": "모르는 것을 실패로 취급하지 않는다",
"topic": "transaction-and-consistency-models",
"path": "concept/concept-messaging-outbox-jdbc-postgresql-c01.md",
"rootTreeNode": "concept:messaging-outbox-jdbc-postgresql-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e763b0134a9fcae4b102c58cbb53d238bfa0f3e2f0532f42625004e9afb049c3",
"lines": 36,
"body": "concept/concept-messaging-outbox-jdbc-postgresql-c01.body.md",
"bodySha256": "4ee47727878f4fced8bfff24ed41600b864ff46cc31ffc69c4ecb0b4fd3000ea",
"assets": [
{
"key": "messaging-outbox-jdbc-postgresql-c01-diagram",
"kind": "diagram"
},
{
"key": "messaging-outbox-jdbc-postgresql-c01",
"kind": "terminal"
}
]
},
"messaging-outbox-jdbc-postgresql-c02": {
"kind": "CONCEPT",
"slug": "messaging-outbox-jdbc-postgresql-c02",
"title": "starter가 만들지 않는 셋은 애플리케이션이 직접 등록해야 한다",
"topic": "transaction-and-consistency-models",
"path": "concept/concept-messaging-outbox-jdbc-postgresql-c02.md",
"rootTreeNode": "concept:messaging-outbox-jdbc-postgresql-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "6300d4518c0a882997cd9c0a63014baa6fb076391009e3d8270b9df158a4ce00",
"lines": 32,
"body": "concept/concept-messaging-outbox-jdbc-postgresql-c02.body.md",
"bodySha256": "85455d0073967499d095d8a466a864dafe2978b52d8664f5724d3a686cf79ac1",
"assets": [
{
"key": "messaging-outbox-jdbc-postgresql-c02",
"kind": "terminal"
}
]
},
"messaging-outbox-jdbc-postgresql-c04": {
"kind": "CONCEPT",
"slug": "messaging-outbox-jdbc-postgresql-c04",
"title": "쓰기와 배출과 정리와 저널이 각각 다른 경로다",
"topic": "transaction-and-consistency-models",
"path": "concept/concept-messaging-outbox-jdbc-postgresql-c04.md",
"rootTreeNode": "concept:messaging-outbox-jdbc-postgresql-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "19eccd64c42359c66c43fcead5263859bbc3c5fe7f392e968ec7793f76647113",
"lines": 40,
"body": "concept/concept-messaging-outbox-jdbc-postgresql-c04.body.md",
"bodySha256": "11b150ab34a71f9f7217da0f3314ca6606ac1879d3793cb9f197d74eaf995b4f",
"assets": [
{
"key": "messaging-outbox-jdbc-postgresql-c04",
"kind": "terminal"
}
]
},
"messaging-outbox-jdbc-postgresql-c06": {
"kind": "CONCEPT",
"slug": "messaging-outbox-jdbc-postgresql-c06",
"title": "만들어졌지만 아무도 부르지 않는다를 이름 붙인 유일한 자리",
"topic": "transaction-and-consistency-models",
"path": "concept/concept-messaging-outbox-jdbc-postgresql-c06.md",
"rootTreeNode": "concept:messaging-outbox-jdbc-postgresql-c06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "9a860e62e41931f5f1ffa0e3abbeb7c55c1120950e9ef0f5b0b6b35fee24490e",
"lines": 36,
"body": "concept/concept-messaging-outbox-jdbc-postgresql-c06.body.md",
"bodySha256": "cf67c42e5ebe5f9492f334185bbd744f2d5e4898474e9279394e7dac6fc41130",
"assets": [
{
"key": "messaging-outbox-jdbc-postgresql-c06",
"kind": "terminal"
}
]
},
"adapter-inbound-graphql-c08": {
"kind": "CONCEPT",
"slug": "adapter-inbound-graphql-c08",
"title": "보고되는 프로파일이 규정하는 동작을 수행하는 코드가 없다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-adapter-inbound-graphql-c08.md",
"rootTreeNode": "concept:adapter-inbound-graphql-c08",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "ffade844b8dd292f581624c3d92cbb540ab670a80be7d0b50cc4f923ff50f776",
"lines": 32,
"body": "concept/concept-adapter-inbound-graphql-c08.body.md",
"bodySha256": "6a51ac63e954a0ab385e9f8e764b89f96944e6a39b4c1bb8ffd505de232dcd0c",
"assets": [
{
"key": "adapter-inbound-graphql-c08",
"kind": "terminal"
}
]
},
"adapter-outbound-cache-redis-c06": {
"kind": "CONCEPT",
"slug": "adapter-outbound-cache-redis-c06",
"title": "모호한 실행을 재시도 가능으로 표시할 수 없다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-adapter-outbound-cache-redis-c06.md",
"rootTreeNode": "concept:adapter-outbound-cache-redis-c06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "3aa094f1c990b27ed20073309e7e217f5b643861db49f2a81db4c210032c2afa",
"lines": 36,
"body": "concept/concept-adapter-outbound-cache-redis-c06.body.md",
"bodySha256": "b8e0d5daf054a00a27997e32867bd90a09077c628502d5f3a295566af8f8e525",
"assets": [
{
"key": "adapter-outbound-cache-redis-c06",
"kind": "terminal"
}
]
},
"adapter-outbound-fileserver-c05": {
"kind": "CONCEPT",
"slug": "adapter-outbound-fileserver-c05",
"title": "길이 프레이밍이 구분자를 없애고, 잘린 토큰의 충돌을 컴파일 시점에 잡는다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-adapter-outbound-fileserver-c05.md",
"rootTreeNode": "concept:adapter-outbound-fileserver-c05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "4d4a41ee88b4d34ec733f6915cafb9f225314f7d1de95766357672b673f5aa10",
"lines": 36,
"body": "concept/concept-adapter-outbound-fileserver-c05.body.md",
"bodySha256": "38f182c62aa2695f89b9231c358de99cafd2e2755b6932959b9931c947596517",
"assets": [
{
"key": "adapter-outbound-fileserver-c05",
"kind": "terminal"
}
]
},
"adapter-outbound-fileserver-c07": {
"kind": "CONCEPT",
"slug": "adapter-outbound-fileserver-c07",
"title": "인식하지 못한 실패는 변경 연산이면 ambiguous로 떨어진다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-adapter-outbound-fileserver-c07.md",
"rootTreeNode": "concept:adapter-outbound-fileserver-c07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "506a57de1d51accfe5c86d55c33e88d7d26672d8d19d08b9262ba88aa98e0956",
"lines": 36,
"body": "concept/concept-adapter-outbound-fileserver-c07.body.md",
"bodySha256": "fc07a1548bb7179a4a97db28d86bb10dcc90ae7e9e558f0e230cac5ad072e89d",
"assets": [
{
"key": "adapter-outbound-fileserver-c07",
"kind": "terminal"
}
]
},
"adapter-outbound-messaging-c04": {
"kind": "CONCEPT",
"slug": "adapter-outbound-messaging-c04",
"title": "브로커가 받아들인 발행을 로거 실패가 실패로 만들지 못한다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-adapter-outbound-messaging-c04.md",
"rootTreeNode": "concept:adapter-outbound-messaging-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "ee1beb82b11ea49b1642c0594fe24c8c95faad8cf187409b050d15572da5aef3",
"lines": 40,
"body": "concept/concept-adapter-outbound-messaging-c04.body.md",
"bodySha256": "fefe26e2f240092ae085e92b63a185179b9cfda0e44fa1de043e481786462d65",
"assets": [
{
"key": "adapter-outbound-messaging-c04",
"kind": "terminal"
}
]
},
"adapter-outbound-notification-c03": {
"kind": "CONCEPT",
"slug": "adapter-outbound-notification-c03",
"title": "provider가 요청한 지연은 계산값보다 길 때만 채택되고 max에서 잘린다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-adapter-outbound-notification-c03.md",
"rootTreeNode": "concept:adapter-outbound-notification-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "6366410df4fffdbea9348042f36ed5a468501a7abd287b8001de0a3fe79d5047",
"lines": 36,
"body": "concept/concept-adapter-outbound-notification-c03.body.md",
"bodySha256": "5fcd02ce32081799d04c50ea576fc4e92e705517da62ea1500e97cb49c47f698",
"assets": [
{
"key": "adapter-outbound-notification-c03",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c04": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c04",
"title": "offset을 표현할 수 없는 타입과 count 질의 없는 hasNext",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-adapter-outbound-persistence-jpa-c04.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "752a01f7d8789eb18ff161b165c7da3ce4a4799e679f62dd1ce58dad886ad2ef",
"lines": 40,
"body": "concept/concept-adapter-outbound-persistence-jpa-c04.body.md",
"bodySha256": "399cfe0279b4413f7d8e003dfc6517f0d14735c0a584642f58138256c609059a",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c04-diagram",
"kind": "diagram"
},
{
"key": "adapter-outbound-persistence-jpa-c04",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c31": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c31",
"title": "grep refs=0은 finding의 시작점이지 결론이 아니다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-adapter-outbound-persistence-jpa-c31.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c31",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "28c9ee4f9721628c79a1025409e071409bb9acec52b9c74e463e0ef3bc9deb1e",
"lines": 36,
"body": "concept/concept-adapter-outbound-persistence-jpa-c31.body.md",
"bodySha256": "63ca6c039070366015263a0f04a212b5412dbfe6776ab741560d3beceee4279b",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c31",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c32": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c32",
"title": "두 export 목록에 postgresql과 h2만큼의 차이가 있다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-adapter-outbound-persistence-jpa-c32.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c32",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "3b451bc73398b9c3271c35e5a80f57701d3565046c02f1ddfae1c666e64ac36a",
"lines": 32,
"body": "concept/concept-adapter-outbound-persistence-jpa-c32.body.md",
"bodySha256": "055a1cf7343ebc35e1509f3e2222e8e37d4bf7cefc63e99039cb5f7704db298f",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c32",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c33": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c33",
"title": "leaf list 자체는 outside consumer를 검사하지 않는다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-adapter-outbound-persistence-jpa-c33.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c33",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "71b5c90da24e9355f9b108a70f08a37da99f29ab27461869c7c423a8173f42e2",
"lines": 40,
"body": "concept/concept-adapter-outbound-persistence-jpa-c33.body.md",
"bodySha256": "0345c3fd5b91b99066135a71a166c6dd167e4f422d2636d0a19a64d107a23824",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c33",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-mongo-c07": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-mongo-c07",
"title": "투영 먼저 checkpoint 나중, 그리고 3-state claim",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-adapter-outbound-persistence-mongo-c07.md",
"rootTreeNode": "concept:adapter-outbound-persistence-mongo-c07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "13738e8b392078f46174d5fccc54d19f09bf8dc6c00614e2fe1d961cd8f9356e",
"lines": 48,
"body": "concept/concept-adapter-outbound-persistence-mongo-c07.body.md",
"bodySha256": "4cdbe2db63c39ff03d3de7d6de659cd28707a1bf8a40d2913e69610862788be4",
"assets": [
{
"key": "adapter-outbound-persistence-mongo-c07",
"kind": "terminal"
}
]
},
"application-core-c06": {
"kind": "CONCEPT",
"slug": "application-core-c06",
"title": "계약에 Kafka topic도 WebSocket도 나오지 않는다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-application-core-c06.md",
"rootTreeNode": "concept:application-core-c06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "24d61cc763156ea5fdc876df5b23e10478ea8b4226b3ff8ce3cc20d63c33693e",
"lines": 36,
"body": "concept/concept-application-core-c06.body.md",
"bodySha256": "66788723bfec90e4566e38a0b881902f7a9c89fc1aa00c14b52aec4982d81520",
"assets": [
{
"key": "application-core-c06",
"kind": "terminal"
}
]
},
"application-core-c07": {
"kind": "CONCEPT",
"slug": "application-core-c07",
"title": "forRemoval이 붙었는데 production consumer가 남아 있다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-application-core-c07.md",
"rootTreeNode": "concept:application-core-c07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "ee5947f21391486fe3822c46ef55a4340dc75cbc5f7c2e7d97c7e04f1090e1b0",
"lines": 32,
"body": "concept/concept-application-core-c07.body.md",
"bodySha256": "f32af05927375ffe538de4750b49d31b539f05d72384fbde750ff6edb82cb6fc",
"assets": [
{
"key": "application-core-c07",
"kind": "terminal"
}
]
},
"application-core-c11": {
"kind": "CONCEPT",
"slug": "application-core-c11",
"title": "adapter까지 있고 호출자가 없는 교정 경로",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-application-core-c11.md",
"rootTreeNode": "concept:application-core-c11",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0ffe659a5ef3202efd14c963828de70ddb8d0c5114a9f5dccf7049fc0c95454b",
"lines": 36,
"body": "concept/concept-application-core-c11.body.md",
"bodySha256": "2bc215b39b2a49f557cac59bddeb5d91f95443403a32ff61411d40e79d6fb27c",
"assets": [
{
"key": "application-core-c11",
"kind": "terminal"
}
]
},
"domain-core-c02": {
"kind": "CONCEPT",
"slug": "domain-core-c02",
"title": "bean은 없고 컴파일 시점 참조만 있다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-domain-core-c02.md",
"rootTreeNode": "concept:domain-core-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "208c8480bb6a626b0d661eca5d647eed27aafde00ad3cefe75ac9d6a8164600f",
"lines": 36,
"body": "concept/concept-domain-core-c02.body.md",
"bodySha256": "a173cd5d454726af67ca2fd2a283a42669167833d37255315db92a0cc8f682b7",
"assets": [
{
"key": "domain-core-c02",
"kind": "terminal"
}
]
},
"grpc-admin-c01": {
"kind": "CONCEPT",
"slug": "grpc-admin-c01",
"title": "건강 레지스트리 — 낙관에서 시작하지 않는다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-grpc-admin-c01.md",
"rootTreeNode": "concept:grpc-admin-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "88354309c9fe90402eef3351edd7fbd35b3f2acac6d1d510bd3e4f3a9a73e67c",
"lines": 26,
"body": "concept/concept-grpc-admin-c01.body.md",
"bodySha256": "62f447f3b807e644bd236cce46634a82545307e37d4c755a8186d402bf0b52d4",
"assets": [
{
"key": "grpc-admin-c01-diagram",
"kind": "diagram"
},
{
"key": "grpc-admin-c01",
"kind": "terminal"
}
]
},
"grpc-admin-c02": {
"kind": "CONCEPT",
"slug": "grpc-admin-c02",
"title": "배수 순서",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-grpc-admin-c02.md",
"rootTreeNode": "concept:grpc-admin-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "159d0ce0a4b5a88d963363df670d5f8168a4afd7c4bff525675c0d495ecbdd93",
"lines": 26,
"body": "concept/concept-grpc-admin-c02.body.md",
"bodySha256": "47300263831a8d431a1f10bdf3d14392d170e42fcdc2bccc6f3b0c94c3b60472",
"assets": [
{
"key": "grpc-admin-c02",
"kind": "terminal"
}
]
},
"grpc-advanced-resilience-c02": {
"kind": "CONCEPT",
"slug": "grpc-advanced-resilience-c02",
"title": "xDS 시작 가드",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-grpc-advanced-resilience-c02.md",
"rootTreeNode": "concept:grpc-advanced-resilience-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "cd48d93de1c077b23b34f92dce3b2199b27969b08614426263531e89dcdcfbf8",
"lines": 26,
"body": "concept/concept-grpc-advanced-resilience-c02.body.md",
"bodySha256": "80532e10d11009e0d5cd954d4993b13d8f3681e972870e6f8d67bf337fa73bb3",
"assets": [
{
"key": "grpc-advanced-resilience-c02",
"kind": "terminal"
}
]
},
"messaging-admin-api-c01": {
"kind": "CONCEPT",
"slug": "messaging-admin-api-c01",
"title": "권한을 불리언이 아니라 타입으로 만든다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-admin-api-c01.md",
"rootTreeNode": "concept:messaging-admin-api-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "31da15dc5a16f7c64bb4fc576b12dd34f4e6da6fb7bb786d2d70b717fcc637c1",
"lines": 34,
"body": "concept/concept-messaging-admin-api-c01.body.md",
"bodySha256": "f83c8168dcf98c1e07909c688239b374991c9d7fc0e6c898b7b74a8be518ac47",
"assets": [
{
"key": "messaging-admin-api-c01-diagram",
"kind": "diagram"
},
{
"key": "messaging-admin-api-c01",
"kind": "terminal"
}
]
},
"messaging-admin-runtime-c01": {
"kind": "CONCEPT",
"slug": "messaging-admin-runtime-c01",
"title": "부품은 정교하고 부품을 잇는 층은 실행된 적이 없다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-admin-runtime-c01.md",
"rootTreeNode": "concept:messaging-admin-runtime-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "71afc4ec723550e0dfd990b62ff38f70a75ed1db2f559c66f31fe3806d8fecd6",
"lines": 42,
"body": "concept/concept-messaging-admin-runtime-c01.body.md",
"bodySha256": "eaec03a5d178d5f8694c3413b1a9c655f85569d07346c4a44a26778dcc2abbd7",
"assets": [
{
"key": "messaging-admin-runtime-c01-diagram",
"kind": "diagram"
},
{
"key": "messaging-admin-runtime-c01",
"kind": "terminal"
}
]
},
"messaging-admin-runtime-c04": {
"kind": "CONCEPT",
"slug": "messaging-admin-runtime-c04",
"title": "파괴적 작업에는 실행 경로가 없다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-admin-runtime-c04.md",
"rootTreeNode": "concept:messaging-admin-runtime-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "fe1055041bd8e8aed426999f78a7b2c3929549c8ebdb0825918ed4f36cf6823a",
"lines": 30,
"body": "concept/concept-messaging-admin-runtime-c04.body.md",
"bodySha256": "a5add67fce6d7c42df8a9ab1af86ddf6a55ff66bfa1d0bd8c07a0390925bafbc",
"assets": [
{
"key": "messaging-admin-runtime-c04",
"kind": "terminal"
}
]
},
"messaging-cloudevents-c04": {
"kind": "CONCEPT",
"slug": "messaging-cloudevents-c04",
"title": "왕복 검증이 producedAt 을 비교하지 않는다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-cloudevents-c04.md",
"rootTreeNode": "concept:messaging-cloudevents-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0b84ff1abcaf41f130ed30824aebfcba5337a5a3796a0cbe1a517e8f0c8bbf1b",
"lines": 38,
"body": "concept/concept-messaging-cloudevents-c04.body.md",
"bodySha256": "d02e91fcdc114382a61a994eb04a3c52bf4c58b34932eabb0d564de28be9db32",
"assets": [
{
"key": "messaging-cloudevents-c04",
"kind": "terminal"
},
{
"key": "messaging-cloudevents-c04-diagram",
"kind": "diagram"
}
]
},
"messaging-core-api-c04": {
"kind": "CONCEPT",
"slug": "messaging-core-api-c04",
"title": "거절과 결과 모름을 하나로 합치면 중복 주문이 생긴다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-core-api-c04.md",
"rootTreeNode": "concept:messaging-core-api-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f46bbfc9a512f6bac84aa076ff57bf690a15423c4969241d3d2b653979e7646c",
"lines": 38,
"body": "concept/concept-messaging-core-api-c04.body.md",
"bodySha256": "0965286a30b0d04466d6f3c7ed30822472fc53c653053a87ab491e7148d78c43",
"assets": [
{
"key": "messaging-core-api-c04-diagram",
"kind": "diagram"
},
{
"key": "messaging-core-api-c04",
"kind": "terminal"
}
]
},
"messaging-core-api-c06": {
"kind": "CONCEPT",
"slug": "messaging-core-api-c06",
"title": "예외 클래스로 분기하지 않아도 되게 만든 기반 타입",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-core-api-c06.md",
"rootTreeNode": "concept:messaging-core-api-c06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0df53a334f419b80700d7a910359eef36e49459a6469c4b973a07d7c5a427a6b",
"lines": 30,
"body": "concept/concept-messaging-core-api-c06.body.md",
"bodySha256": "0c424ab2c3cc1858d021a99312ddbe29df2f21ef6e045c9b2cb3aa6d51857ea8",
"assets": [
{
"key": "messaging-core-api-c06",
"kind": "terminal"
}
]
},
"messaging-kafka-c01": {
"kind": "CONCEPT",
"slug": "messaging-kafka-c01",
"title": "소비자 런타임 — 스레드 규율이 설계다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-kafka-c01.md",
"rootTreeNode": "concept:messaging-kafka-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "459f35f8fc7dad2016156323bb541c1e20d480a099c6c4b56c876e456a15fffd",
"lines": 30,
"body": "concept/concept-messaging-kafka-c01.body.md",
"bodySha256": "463131501e9b2f2678652a556c3f0dc77d0545e25f7d838c4dc66f87ac086126",
"assets": [
{
"key": "messaging-kafka-c01-diagram",
"kind": "diagram"
},
{
"key": "messaging-kafka-c01",
"kind": "terminal"
}
]
},
"messaging-kafka-share-experimental-c04": {
"kind": "CONCEPT",
"slug": "messaging-kafka-share-experimental-c04",
"title": "등록이 통과한 뒤에 아무 일도 일어나지 않는다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-kafka-share-experimental-c04.md",
"rootTreeNode": "concept:messaging-kafka-share-experimental-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "eeb6aaa855f28a798003bc97cbafd66144d6ac98f7284b18688cd27b38af1fb1",
"lines": 26,
"body": "concept/concept-messaging-kafka-share-experimental-c04.body.md",
"bodySha256": "0c213d328b597e086e5ac0649aa6fad84f477a693932cf13e5bcb42d4b995285",
"assets": [
{
"key": "messaging-kafka-share-experimental-c04",
"kind": "terminal"
}
]
},
"messaging-kafka-share-experimental-c05": {
"kind": "CONCEPT",
"slug": "messaging-kafka-share-experimental-c05",
"title": "조용히 강등하지 않고 던진다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-kafka-share-experimental-c05.md",
"rootTreeNode": "concept:messaging-kafka-share-experimental-c05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f8970df4d28ad45f11a801cd18adf2a0090961da76daeac2a954e8229dbd22bb",
"lines": 26,
"body": "concept/concept-messaging-kafka-share-experimental-c05.body.md",
"bodySha256": "ebb3c9fe8b171c6ae9bbd89b38f629d2f447e5e2324f7064b79c5ba0aec7cdff",
"assets": [
{
"key": "messaging-kafka-share-experimental-c05",
"kind": "terminal"
}
]
},
"messaging-nats-experimental-c01": {
"kind": "CONCEPT",
"slug": "messaging-nats-experimental-c01",
"title": "없는 큐를 찾아 나서게 만들지 않는다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-nats-experimental-c01.md",
"rootTreeNode": "concept:messaging-nats-experimental-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "6edb3329f4d021aba37507fab36d16128af401e2255a70b1648a943092009252",
"lines": 26,
"body": "concept/concept-messaging-nats-experimental-c01.body.md",
"bodySha256": "d27b2750249748bf1b3f30ff3eafc420f6fa921f3807a0fe1d32a08bc4987bd9",
"assets": [
{
"key": "messaging-nats-experimental-c01",
"kind": "terminal"
}
]
},
"messaging-observability-c03": {
"kind": "CONCEPT",
"slug": "messaging-observability-c03",
"title": "차원이 닫혀 있고, 사전 확인과 커밋 사이에 lock이 없다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-observability-c03.md",
"rootTreeNode": "concept:messaging-observability-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "3332c063cf2f7c35ba52654826b299a3d3bc5457aba096d89872c4de41e30243",
"lines": 42,
"body": "concept/concept-messaging-observability-c03.body.md",
"bodySha256": "c70505cfa8a45a5c685fa3405ada8843bf16a677bcc2503a489faaa7412d01d4",
"assets": [
{
"key": "messaging-observability-c03-diagram",
"kind": "diagram"
},
{
"key": "messaging-observability-c03",
"kind": "terminal"
}
]
},
"messaging-observability-c04": {
"kind": "CONCEPT",
"slug": "messaging-observability-c04",
"title": "거절된 태그 집합도 세어서 남긴다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-observability-c04.md",
"rootTreeNode": "concept:messaging-observability-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5e447cc768f097789477ab87753055ffcd68e7411d12a8c142dbd61cc3251ea2",
"lines": 26,
"body": "concept/concept-messaging-observability-c04.body.md",
"bodySha256": "ccf99b74d8abb755afe3311d0bdbdba7d6e2fbdd166fe9e4d1fc727d37fb08ad",
"assets": [
{
"key": "messaging-observability-c04",
"kind": "terminal"
}
]
},
"messaging-observability-c05": {
"kind": "CONCEPT",
"slug": "messaging-observability-c05",
"title": "손상된 traceparent 는 이 leaf 의 실패 어휘 밖에서 터진다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-observability-c05.md",
"rootTreeNode": "concept:messaging-observability-c05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "87560f2f1c4c752ece060198eecc46502b7fec6554d87d173c295492f8efdbc5",
"lines": 34,
"body": "concept/concept-messaging-observability-c05.body.md",
"bodySha256": "7aedc678c0a621ad04e9c033fcf9887cf0059d4ee223751838fe5c49c54be93c",
"assets": [
{
"key": "messaging-observability-c05",
"kind": "terminal"
}
]
},
"messaging-outbox-jdbc-postgresql-c03": {
"kind": "CONCEPT",
"slug": "messaging-outbox-jdbc-postgresql-c03",
"title": "확률을 낮추는 것과 데이터 제약으로 만드는 것은 다르다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-outbox-jdbc-postgresql-c03.md",
"rootTreeNode": "concept:messaging-outbox-jdbc-postgresql-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b575d456dabccb1b1e323d93d9f3c24365a53a1cd809ea75dfc2c192c28ff87f",
"lines": 42,
"body": "concept/concept-messaging-outbox-jdbc-postgresql-c03.body.md",
"bodySha256": "8a1281f5a6b08e69b523c4bc17c51c103e188e919ec7054f3fed0ffa16473856",
"assets": [
{
"key": "messaging-outbox-jdbc-postgresql-c03",
"kind": "terminal"
}
]
},
"messaging-policy-c02": {
"kind": "CONCEPT",
"slug": "messaging-policy-c02",
"title": "bean 정의는 전부 starter 쪽에 있다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-policy-c02.md",
"rootTreeNode": "concept:messaging-policy-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "64c5557ee99192276c0ab536f32e638b8602e073399b216a765821e5a7221ade",
"lines": 30,
"body": "concept/concept-messaging-policy-c02.body.md",
"bodySha256": "22a0feac3c211d8784d8781c57ab68cee3465a6a181b48b88317ded5ee29ac8f",
"assets": [
{
"key": "messaging-policy-c02",
"kind": "terminal"
}
]
},
"messaging-policy-c04": {
"kind": "CONCEPT",
"slug": "messaging-policy-c04",
"title": "재시도 판단과 DLQ 경로는 출하 컨텍스트에서 호출되지 않는다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-policy-c04.md",
"rootTreeNode": "concept:messaging-policy-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a881a01fd4edbe6d50e6d3135eb80c44f1555238079cd02dcc8d89ea344e4f5a",
"lines": 26,
"body": "concept/concept-messaging-policy-c04.body.md",
"bodySha256": "07f951ce31f7c13f9e3f621c81777fe6339d6ab28a5a269e75c13e2e3923f47b",
"assets": [
{
"key": "messaging-policy-c04",
"kind": "terminal"
}
]
},
"messaging-policy-c07": {
"kind": "CONCEPT",
"slug": "messaging-policy-c07",
"title": "발행 경로는 프로덕션에서 실제로 조립된다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-policy-c07.md",
"rootTreeNode": "concept:messaging-policy-c07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b0eea8b0b383e3d8c4d7ae634030638e5c7791aef1eb0405d250f33dfce86a03",
"lines": 26,
"body": "concept/concept-messaging-policy-c07.body.md",
"bodySha256": "71f416fd7119d37ed50bae13a941cf3b4048ad1e1333ce206530d1fe2b1129ef",
"assets": [
{
"key": "messaging-policy-c07",
"kind": "terminal"
}
]
},
"messaging-policy-c08": {
"kind": "CONCEPT",
"slug": "messaging-policy-c08",
"title": "RetryDecision 변형에 반응하는 파일 넷 중 셋이 선언과 테스트다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-policy-c08.md",
"rootTreeNode": "concept:messaging-policy-c08",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a5e218df64713909fab0b58e2ccc57c2c0ed604584b1d36aa9d948dd442307d9",
"lines": 26,
"body": "concept/concept-messaging-policy-c08.body.md",
"bodySha256": "d9805f4c28a750492bbcb1a6d6b254bb71b7bdb062e483e0af151ec3631d7410",
"assets": [
{
"key": "messaging-policy-c08",
"kind": "terminal"
}
]
},
"messaging-rabbit-c01": {
"kind": "CONCEPT",
"slug": "messaging-rabbit-c01",
"title": "소비·정착·죽은 편지의 세 규율",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-rabbit-c01.md",
"rootTreeNode": "concept:messaging-rabbit-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "58993a4105ce27c24a7a0a3bf7bd937466b3afe7812c1515327453d4a2d416c9",
"lines": 30,
"body": "concept/concept-messaging-rabbit-c01.body.md",
"bodySha256": "1c5aef90057c1308058ce065e9b9f5b3ed7bb066e04a02e0aa84cb65bb683f29",
"assets": [
{
"key": "messaging-rabbit-c01-diagram",
"kind": "diagram"
},
{
"key": "messaging-rabbit-c01",
"kind": "terminal"
}
]
},
"messaging-runtime-core-c01": {
"kind": "CONCEPT",
"slug": "messaging-runtime-core-c01",
"title": "컨텍스트 테스트를 통과하면서 아무것도 실행하지 않는 조립",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-runtime-core-c01.md",
"rootTreeNode": "concept:messaging-runtime-core-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "7741c2f9a8138e5176a34d3a175e898ffd67ba012b0ea374abd90f6794f10e1a",
"lines": 30,
"body": "concept/concept-messaging-runtime-core-c01.body.md",
"bodySha256": "11539bf5c4ce315f8bcf4e716c2402bd64567ec05727e8dca147fe5726f7e113",
"assets": [
{
"key": "messaging-runtime-core-c01",
"kind": "terminal"
}
]
},
"messaging-runtime-core-c02": {
"kind": "CONCEPT",
"slug": "messaging-runtime-core-c02",
"title": "인자가 여섯 개라는 것이 관측 지점이다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-runtime-core-c02.md",
"rootTreeNode": "concept:messaging-runtime-core-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "c860454d23e89c57fcb393b96b411c11e27033725d9a3f54aeaf3667e4a277d5",
"lines": 30,
"body": "concept/concept-messaging-runtime-core-c02.body.md",
"bodySha256": "0a713bbbd6ad3fd3d28c18bc9598b1ef2fc7f5843445a81c206c297cd69853cb",
"assets": [
{
"key": "messaging-runtime-core-c02",
"kind": "terminal"
}
]
},
"messaging-runtime-core-c03": {
"kind": "CONCEPT",
"slug": "messaging-runtime-core-c03",
"title": "바이트가 프로세스를 떠났는가가 REJECTED와 AMBIGUOUS를 가른다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-runtime-core-c03.md",
"rootTreeNode": "concept:messaging-runtime-core-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "9b3603b2701ed205bb7110dbdb4e7b6eed32ae069cad9bb7a993dcc2c0de05c6",
"lines": 42,
"body": "concept/concept-messaging-runtime-core-c03.body.md",
"bodySha256": "86dfb24f7e74eb82348e15044a4f5f627553424af643bf5247654dc24e5088e8",
"assets": [
{
"key": "messaging-runtime-core-c03-diagram",
"kind": "diagram"
},
{
"key": "messaging-runtime-core-c03",
"kind": "terminal"
}
]
},
"messaging-runtime-core-c05": {
"kind": "CONCEPT",
"slug": "messaging-runtime-core-c05",
"title": "같은 코드가 두 completion에 쓰인다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-runtime-core-c05.md",
"rootTreeNode": "concept:messaging-runtime-core-c05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f621cfd37dd2758743ba436aedc9b3746d041fef536a5b8db101861e1ccdb94c",
"lines": 34,
"body": "concept/concept-messaging-runtime-core-c05.body.md",
"bodySha256": "ec26f97d43437d19cbdf2777d724cf19716f8ec392bea4dd9e67561b73b4a9c2",
"assets": [
{
"key": "messaging-runtime-core-c05",
"kind": "terminal"
}
]
},
"messaging-schema-json-c01": {
"kind": "CONCEPT",
"slug": "messaging-schema-json-c01",
"title": "크기 초과를 codec에서 잡으면 버려도 안전한 실패가 된다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-schema-json-c01.md",
"rootTreeNode": "concept:messaging-schema-json-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a6c95946ebc405ece2d2458f51bb5ca9aa19f7f1b67e933d181e17c6f7bfc66e",
"lines": 34,
"body": "concept/concept-messaging-schema-json-c01.body.md",
"bodySha256": "3a2667085e889447f583c0e5a9f9c05a38599dae3e2da4378ae60db92981e6d5",
"assets": [
{
"key": "messaging-schema-json-c01-diagram",
"kind": "diagram"
},
{
"key": "messaging-schema-json-c01",
"kind": "terminal"
}
]
},
"messaging-schema-json-c05": {
"kind": "CONCEPT",
"slug": "messaging-schema-json-c05",
"title": "여섯 갈래 원인이 하나의 코드로 접힌다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-schema-json-c05.md",
"rootTreeNode": "concept:messaging-schema-json-c05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "c96b55ba3eab30f1c704eda37264a98de2fab76e65a2b42d045c88831b4ce463",
"lines": 34,
"body": "concept/concept-messaging-schema-json-c05.body.md",
"bodySha256": "6309f9c3ea041efcb1942c3ac0781ca0c5fef8c2d8d810b8692822393f3e45b0",
"assets": [
{
"key": "messaging-schema-json-c05",
"kind": "terminal"
}
]
},
"messaging-schema-protobuf-c03": {
"kind": "CONCEPT",
"slug": "messaging-schema-protobuf-c03",
"title": "어긋난 짝을 표현할 수 없게 만든 값 하나",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-schema-protobuf-c03.md",
"rootTreeNode": "concept:messaging-schema-protobuf-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "88a394eda5f38d4a5b6f9be58116c50b6351fbf35fb80ca50f074cbeade16d2e",
"lines": 42,
"body": "concept/concept-messaging-schema-protobuf-c03.body.md",
"bodySha256": "d897dc16c76d746ae07f946508ebe657d2885289e0fbc3e211a4ed25984daaae",
"assets": [
{
"key": "messaging-schema-protobuf-c03-diagram",
"kind": "diagram"
},
{
"key": "messaging-schema-protobuf-c03",
"kind": "terminal"
}
]
},
"messaging-security-c05": {
"kind": "CONCEPT",
"slug": "messaging-security-c05",
"title": "같은 두 검사를 두 예외 계층이 나눠 갖는다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-security-c05.md",
"rootTreeNode": "concept:messaging-security-c05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "eb0e202381496d947f1441c443ef8077c86a0e23f8d068f218fe35d1ce59c3cd",
"lines": 26,
"body": "concept/concept-messaging-security-c05.body.md",
"bodySha256": "ef20cffcdc493fdae1c15b8c379c708df7b4e192c1a819dae2417eeafd59e411",
"assets": [
{
"key": "messaging-security-c05",
"kind": "terminal"
}
]
},
"messaging-spring-boot-starter-c02": {
"kind": "CONCEPT",
"slug": "messaging-spring-boot-starter-c02",
"title": "모든 거부가 타입이 아니라 키를 부른다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-spring-boot-starter-c02.md",
"rootTreeNode": "concept:messaging-spring-boot-starter-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "867e04f036cedcb49a767ca022f11612532b1ac775375241560200d27926b14f",
"lines": 34,
"body": "concept/concept-messaging-spring-boot-starter-c02.body.md",
"bodySha256": "adeb97db3a4fcbffa587f780e9a68faf1be7e05c7b87f9c1fe2c14828ed9f89c",
"assets": [
{
"key": "messaging-spring-boot-starter-c02",
"kind": "terminal"
}
]
},
"messaging-spring-boot-starter-c03": {
"kind": "CONCEPT",
"slug": "messaging-spring-boot-starter-c03",
"title": "종료 순서가 두 수명 주기의 phase 로 표현된다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-spring-boot-starter-c03.md",
"rootTreeNode": "concept:messaging-spring-boot-starter-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "cadc5115cb9d793bb0f4dc6c08410304c0bd15b77e34c24e4eba85f6630718e7",
"lines": 30,
"body": "concept/concept-messaging-spring-boot-starter-c03.body.md",
"bodySha256": "cfb0990e18b226e2bf818f780f4b4ad07a7649027e8bc9c2fab2689064fbdca5",
"assets": [
{
"key": "messaging-spring-boot-starter-c03-diagram",
"kind": "diagram"
},
{
"key": "messaging-spring-boot-starter-c03",
"kind": "terminal"
}
]
},
"messaging-spring-cloud-stream-bridge-c02": {
"kind": "CONCEPT",
"slug": "messaging-spring-cloud-stream-bridge-c02",
"title": "Spring Cloud Stream 브리지가 Spring을 import하지 않는다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-spring-cloud-stream-bridge-c02.md",
"rootTreeNode": "concept:messaging-spring-cloud-stream-bridge-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "78ef183882972695c796df98c493e3102e520f754ebda93282b008e402096368",
"lines": 42,
"body": "concept/concept-messaging-spring-cloud-stream-bridge-c02.body.md",
"bodySha256": "15c7912819589895c4a244aa6061ff4f3fd2393262d57fe033f20680d3c44e51",
"assets": [
{
"key": "messaging-spring-cloud-stream-bridge-c02",
"kind": "terminal"
}
]
},
"messaging-spring-cloud-stream-bridge-c04": {
"kind": "CONCEPT",
"slug": "messaging-spring-cloud-stream-bridge-c04",
"title": "send가 true를 반환해도 AMBIGUOUS다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-spring-cloud-stream-bridge-c04.md",
"rootTreeNode": "concept:messaging-spring-cloud-stream-bridge-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d2d2d83b2242fe224efb128b6db3155e6549e60d7fd2ff3a2ee07bf039cbf7b6",
"lines": 26,
"body": "concept/concept-messaging-spring-cloud-stream-bridge-c04.body.md",
"bodySha256": "c7068281efe9a76f17433cc81b8e2582014c38e9f4cf4c8463dcb81559781858",
"assets": [
{
"key": "messaging-spring-cloud-stream-bridge-c04",
"kind": "terminal"
}
]
},
"messaging-spring-cloud-stream-bridge-c05": {
"kind": "CONCEPT",
"slug": "messaging-spring-cloud-stream-bridge-c05",
"title": "messaging family에서 예외 어휘가 가장 일관된 leaf",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-spring-cloud-stream-bridge-c05.md",
"rootTreeNode": "concept:messaging-spring-cloud-stream-bridge-c05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "76c2d7fb4d071530e8363b3dce0f3977f12741d69c8097e51b0af53169ddb913",
"lines": 26,
"body": "concept/concept-messaging-spring-cloud-stream-bridge-c05.body.md",
"bodySha256": "5adae1f4c9c1c043c8493738937e0890d180d542b7192f4bfb1dc21869d433de",
"assets": [
{
"key": "messaging-spring-cloud-stream-bridge-c05",
"kind": "terminal"
}
]
},
"messaging-testkit-c01": {
"kind": "CONCEPT",
"slug": "messaging-testkit-c01",
"title": "지원한다는 단어의 정의를 코드로 못 박는 곳",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-testkit-c01.md",
"rootTreeNode": "concept:messaging-testkit-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "1cc0c81297b4993f63f75f1e965621375df4bd455796464551cc1776f7a8c019",
"lines": 42,
"body": "concept/concept-messaging-testkit-c01.body.md",
"bodySha256": "e4da24cb5a1ded7eaeafd76b55f3f1fa4e2c6ac0e923f291a0a5447ab731b705",
"assets": [
{
"key": "messaging-testkit-c01-diagram",
"kind": "diagram"
},
{
"key": "messaging-testkit-c01",
"kind": "terminal"
}
]
},
"messaging-testkit-c02": {
"kind": "CONCEPT",
"slug": "messaging-testkit-c02",
"title": "상속하는 쪽이 컴파일되려면 전부 전이되어야 한다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-testkit-c02.md",
"rootTreeNode": "concept:messaging-testkit-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "56bd624242c353d747e769342c49ebc0a4ada26f0f33f0863aa24a7fc834a90c",
"lines": 34,
"body": "concept/concept-messaging-testkit-c02.body.md",
"bodySha256": "bf2a6e4014e4fae0b143c541bcc86b9329c14a35f5e2e48047d547d73c82039c",
"assets": [
{
"key": "messaging-testkit-c02",
"kind": "terminal"
}
]
},
"messaging-transport-spi-c02": {
"kind": "CONCEPT",
"slug": "messaging-transport-spi-c02",
"title": "세 leaf의 타입이 public 시그니처에 직접 등장한다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-messaging-transport-spi-c02.md",
"rootTreeNode": "concept:messaging-transport-spi-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "7ee73fb55e886f562451d5d86a54dbed18348730d681fa59d0adec07f5ef93c4",
"lines": 30,
"body": "concept/concept-messaging-transport-spi-c02.body.md",
"bodySha256": "69ec87146849cff2b91a0868ef914d3e25ac507c63946a8425c3fc266b291297",
"assets": [
{
"key": "messaging-transport-spi-c02",
"kind": "terminal"
}
]
},
"shared-contract-c01": {
"kind": "CONCEPT",
"slug": "shared-contract-c01",
"title": "factory는 검증하고 raw 생성자는 검증하지 않는다",
"topic": "delivery-and-settlement-models",
"path": "concept/concept-shared-contract-c01.md",
"rootTreeNode": "concept:shared-contract-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f6be800c24ee4b5129f5021e7a44c9b439fa092462d09f1dccbfa942cc16da9b",
"lines": 34,
"body": "concept/concept-shared-contract-c01.body.md",
"bodySha256": "51a19d2c68cb5053532eda2519ccab048910d9baa0c89698501f8076de875d4c",
"assets": [
{
"key": "shared-contract-c01",
"kind": "terminal"
},
{
"key": "shared-contract-c01-diagram",
"kind": "diagram"
}
]
},
"adapter-inbound-graphql-c02": {
"kind": "CONCEPT",
"slug": "adapter-inbound-graphql-c02",
"title": "스키마 해시의 생산자도 소비자도 빈이 없다",
"topic": "schema-and-wire-models",
"path": "concept/concept-adapter-inbound-graphql-c02.md",
"rootTreeNode": "concept:adapter-inbound-graphql-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "1c0544b3f2321fdfa579861c0f053ce73d5a4025c43af3036ed54602fc5e661d",
"lines": 36,
"body": "concept/concept-adapter-inbound-graphql-c02.body.md",
"bodySha256": "0890c9e0c28205dd8fce5670616577aa908a998efab59f4871326ce3d407dbb6",
"assets": [
{
"key": "adapter-inbound-graphql-c02",
"kind": "terminal"
}
]
},
"adapter-inbound-graphql-c07": {
"kind": "CONCEPT",
"slug": "adapter-inbound-graphql-c07",
"title": "파싱·검증 실패의 와이어 형식은 이 플랫폼이 정하지 않는다",
"topic": "schema-and-wire-models",
"path": "concept/concept-adapter-inbound-graphql-c07.md",
"rootTreeNode": "concept:adapter-inbound-graphql-c07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "2d24046dcf1ca623f7afcc81a64ab6e732a8ad57b19d8a6308b592fdd60816e3",
"lines": 32,
"body": "concept/concept-adapter-inbound-graphql-c07.body.md",
"bodySha256": "5dd40909c6e582908d0099f3c10d0ff283f37f8f02e8d5d942e38384733260e6",
"assets": [
{
"key": "adapter-inbound-graphql-c07",
"kind": "terminal"
}
]
},
"adapter-inbound-graphql-c11": {
"kind": "CONCEPT",
"slug": "adapter-inbound-graphql-c11",
"title": "키를 요구하는 코드는 둘이고 서명하는 코드는 없다",
"topic": "schema-and-wire-models",
"path": "concept/concept-adapter-inbound-graphql-c11.md",
"rootTreeNode": "concept:adapter-inbound-graphql-c11",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e9fd2b7a3ade2a96a921056ec61193211ebeab9bbcadd6ff5db6f120463f2c7c",
"lines": 32,
"body": "concept/concept-adapter-inbound-graphql-c11.body.md",
"bodySha256": "a98bcbaab2aced58c043779f3d30185a8852d966699dc3f4e606357b9d74aa65",
"assets": [
{
"key": "adapter-inbound-graphql-c11",
"kind": "terminal"
}
]
},
"adapter-inbound-web-c08": {
"kind": "CONCEPT",
"slug": "adapter-inbound-web-c08",
"title": "페이지네이션 어휘가 한 번도 컨트롤러에 붙어 본 적이 없다",
"topic": "schema-and-wire-models",
"path": "concept/concept-adapter-inbound-web-c08.md",
"rootTreeNode": "concept:adapter-inbound-web-c08",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "36e11bd355eef41182db562532cb45ca9c28e44e8b11887bb63e36db0f05193d",
"lines": 32,
"body": "concept/concept-adapter-inbound-web-c08.body.md",
"bodySha256": "e06d9bfa5b11153949913a1aea6624aa76b2e334838b99f1d919740f8c7d459f",
"assets": [
{
"key": "adapter-inbound-web-c08",
"kind": "terminal"
}
]
},
"adapter-inbound-web-c10": {
"kind": "CONCEPT",
"slug": "adapter-inbound-web-c10",
"title": "어느 쪽이 정본인지 코드로 판정할 수 없다",
"topic": "schema-and-wire-models",
"path": "concept/concept-adapter-inbound-web-c10.md",
"rootTreeNode": "concept:adapter-inbound-web-c10",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d2bb1058279f9f527e17dcf4bb2c622cb45a0d90e9c3e31b6b3f75db6db56cf2",
"lines": 36,
"body": "concept/concept-adapter-inbound-web-c10.body.md",
"bodySha256": "592b38ad1c1431d3204d7e3f6706a69dcbb1787e8963fa5f415c643406c1378a",
"assets": [
{
"key": "adapter-inbound-web-c10",
"kind": "terminal"
}
]
},
"adapter-inbound-web-c11": {
"kind": "CONCEPT",
"slug": "adapter-inbound-web-c11",
"title": "기여자가 커스터마이저에 도달하지 않아 스키마가 문서에 없다",
"topic": "schema-and-wire-models",
"path": "concept/concept-adapter-inbound-web-c11.md",
"rootTreeNode": "concept:adapter-inbound-web-c11",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "81e575924c6fb7a6f1e4c02d8d6f91ed6cf32824ba32d4c6afd7b4b289c943af",
"lines": 36,
"body": "concept/concept-adapter-inbound-web-c11.body.md",
"bodySha256": "c114ae0006d14f30508997152f3701fe62080e5f4b28dbee9a88c1b99d3d4f0e",
"assets": [
{
"key": "adapter-inbound-web-c11",
"kind": "terminal"
}
]
},
"adapter-inbound-websocket-c03": {
"kind": "CONCEPT",
"slug": "adapter-inbound-websocket-c03",
"title": "오류 형식이 세 벌이다",
"topic": "schema-and-wire-models",
"path": "concept/concept-adapter-inbound-websocket-c03.md",
"rootTreeNode": "concept:adapter-inbound-websocket-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "9e1e8625e65a0519f78f718123fef87a5f2dc3cc7fcf48282768c7672ff2bbc5",
"lines": 36,
"body": "concept/concept-adapter-inbound-websocket-c03.body.md",
"bodySha256": "2997910338796d99157ee1756b67bf455d2118d1ac384134828734295db42630",
"assets": [
{
"key": "adapter-inbound-websocket-c03",
"kind": "terminal"
}
]
},
"adapter-inbound-websocket-c04": {
"kind": "CONCEPT",
"slug": "adapter-inbound-websocket-c04",
"title": "키를 요구하는 검증기가 없어서 잘못된 확인 신호도 없다",
"topic": "schema-and-wire-models",
"path": "concept/concept-adapter-inbound-websocket-c04.md",
"rootTreeNode": "concept:adapter-inbound-websocket-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5a988f26d4eddeab93bf1ef888227c459bc88710e2bbd70ba3bc572d0d0a7535",
"lines": 32,
"body": "concept/concept-adapter-inbound-websocket-c04.body.md",
"bodySha256": "91908f7631f0dec203eb2989526f8bac829ed821682f1655cc6413e064541bf7",
"assets": [
{
"key": "adapter-inbound-websocket-c04",
"kind": "terminal"
}
]
},
"adapter-outbound-cache-redis-c07": {
"kind": "CONCEPT",
"slug": "adapter-outbound-cache-redis-c07",
"title": "guard 아래에서는 명령 이름으로 위험을 다시 유도할 수 없다",
"topic": "schema-and-wire-models",
"path": "concept/concept-adapter-outbound-cache-redis-c07.md",
"rootTreeNode": "concept:adapter-outbound-cache-redis-c07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "2cdd0d508a49cabff5f30c9e58785fbd01298353beb7877fa0640502b6f45425",
"lines": 44,
"body": "concept/concept-adapter-outbound-cache-redis-c07.body.md",
"bodySha256": "1f24796d01e94a08fd176ca1b26674309999b4cbd81cffc20e318da6852c16a3",
"assets": [
{
"key": "adapter-outbound-cache-redis-c07",
"kind": "terminal"
}
]
},
"adapter-outbound-cache-redis-c11": {
"kind": "CONCEPT",
"slug": "adapter-outbound-cache-redis-c11",
"title": "R4인데 BLOCKED이 아닌 정책 파일은 읽히지 않는다",
"topic": "schema-and-wire-models",
"path": "concept/concept-adapter-outbound-cache-redis-c11.md",
"rootTreeNode": "concept:adapter-outbound-cache-redis-c11",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "bc0692a600f733b68af261f860fbd91df9428dedfedae38dbbb1517cc8b21d4a",
"lines": 36,
"body": "concept/concept-adapter-outbound-cache-redis-c11.body.md",
"bodySha256": "b54d2a64858e710ef17427573cd1d0ca3f1bf3346028f4b58b24cbeaa0ca0315",
"assets": [
{
"key": "adapter-outbound-cache-redis-c11",
"kind": "terminal"
}
]
},
"adapter-outbound-fileserver-c02": {
"kind": "CONCEPT",
"slug": "adapter-outbound-fileserver-c02",
"title": "파싱은 되지만 우리가 쓰지 않았을 형태를 전부 거부한다",
"topic": "schema-and-wire-models",
"path": "concept/concept-adapter-outbound-fileserver-c02.md",
"rootTreeNode": "concept:adapter-outbound-fileserver-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e41e9003a2c88e891a7f8566bb0b4a836de3cdad63a131195285437bf3a65048",
"lines": 40,
"body": "concept/concept-adapter-outbound-fileserver-c02.body.md",
"bodySha256": "790ff255c05235906d59a670c6701e149c16a358cbce75226f28eab04b203a43",
"assets": [
{
"key": "adapter-outbound-fileserver-c02",
"kind": "terminal"
}
]
},
"adapter-outbound-httpclient-c03": {
"kind": "CONCEPT",
"slug": "adapter-outbound-httpclient-c03",
"title": "검사할 수 없는 성분을 가진 본문은 재생 가능으로 인증되지 않는다",
"topic": "schema-and-wire-models",
"path": "concept/concept-adapter-outbound-httpclient-c03.md",
"rootTreeNode": "concept:adapter-outbound-httpclient-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "fd58f9e3894718c964ca023533ed253cdc8b7af61896f1e0e620296d5f34a765",
"lines": 36,
"body": "concept/concept-adapter-outbound-httpclient-c03.body.md",
"bodySha256": "f528067565615be0a11a74ed5b58d3972d61073fa64bdc07acf3555f47a12b2a",
"assets": [
{
"key": "adapter-outbound-httpclient-c03",
"kind": "terminal"
}
]
},
"adapter-outbound-httpclient-c06": {
"kind": "CONCEPT",
"slug": "adapter-outbound-httpclient-c06",
"title": "와이어 바이트와 디코드 바이트를 따로 세고, 읽는 도중에 상한을 건다",
"topic": "schema-and-wire-models",
"path": "concept/concept-adapter-outbound-httpclient-c06.md",
"rootTreeNode": "concept:adapter-outbound-httpclient-c06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5c5c185cd346e64c17822f331f2680266c08ea5cace5bc8a556801c79d9ee16b",
"lines": 40,
"body": "concept/concept-adapter-outbound-httpclient-c06.body.md",
"bodySha256": "e77f5a69537d0b1f8313c6ee912b78ef7ca2d22a31a5c914a1faf3682b916842",
"assets": [
{
"key": "adapter-outbound-httpclient-c06-diagram",
"kind": "diagram"
},
{
"key": "adapter-outbound-httpclient-c06",
"kind": "terminal"
}
]
},
"adapter-outbound-messaging-c01": {
"kind": "CONCEPT",
"slug": "adapter-outbound-messaging-c01",
"title": "구성이 끝난 뒤에는 스키마를 가져올 방법이 남아 있지 않다",
"topic": "schema-and-wire-models",
"path": "concept/concept-adapter-outbound-messaging-c01.md",
"rootTreeNode": "concept:adapter-outbound-messaging-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "1405d03f4f75490338850322c60e2df050b093b73c9f718134eb5bd2e5596f98",
"lines": 40,
"body": "concept/concept-adapter-outbound-messaging-c01.body.md",
"bodySha256": "c76e6adb28e4f4071527772230c1aa592be9fba64fb3e489ec5a69851d4ce7e4",
"assets": [
{
"key": "adapter-outbound-messaging-c01-diagram",
"kind": "diagram"
},
{
"key": "adapter-outbound-messaging-c01",
"kind": "terminal"
}
]
},
"adapter-outbound-messaging-c02": {
"kind": "CONCEPT",
"slug": "adapter-outbound-messaging-c02",
"title": "봉투를 쓰는 경로에 JSON 파서도 생성기도 없다",
"topic": "schema-and-wire-models",
"path": "concept/concept-adapter-outbound-messaging-c02.md",
"rootTreeNode": "concept:adapter-outbound-messaging-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "46ba86a7121b1c45556ee3452c58ff5ec9ce2ac10fcebb4e59a938b4b07e79e1",
"lines": 36,
"body": "concept/concept-adapter-outbound-messaging-c02.body.md",
"bodySha256": "3f05f7474ca09b0efc0318bcf465c4b055fc153d8ef9a16df7d6c6bc45b051fb",
"assets": [
{
"key": "adapter-outbound-messaging-c02",
"kind": "terminal"
}
]
},
"adapter-outbound-objectstorage-c04": {
"kind": "CONCEPT",
"slug": "adapter-outbound-objectstorage-c04",
"title": "새 레코드를 추가하면 컴파일이 codec 갱신을 강제한다",
"topic": "schema-and-wire-models",
"path": "concept/concept-adapter-outbound-objectstorage-c04.md",
"rootTreeNode": "concept:adapter-outbound-objectstorage-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b5d4b061554d781225d63d0e53741e130b61117ecc8012e703bc3b02f178bf1e",
"lines": 36,
"body": "concept/concept-adapter-outbound-objectstorage-c04.body.md",
"bodySha256": "1ac3df82538cbaba17d6ef93316cc63678002a408bcc324f5dcc51316a9a4d1e",
"assets": [
{
"key": "adapter-outbound-objectstorage-c04",
"kind": "terminal"
}
]
},
"adapter-outbound-objectstorage-c06": {
"kind": "CONCEPT",
"slug": "adapter-outbound-objectstorage-c06",
"title": "다른 route의 identity로 만든 키는 파싱 단계에서 거부된다",
"topic": "schema-and-wire-models",
"path": "concept/concept-adapter-outbound-objectstorage-c06.md",
"rootTreeNode": "concept:adapter-outbound-objectstorage-c06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "95aa291bfbeab07cb09bdf9bb25b1d973cd4d38656ec7cae29650f1c5548394f",
"lines": 44,
"body": "concept/concept-adapter-outbound-objectstorage-c06.body.md",
"bodySha256": "38902a267824128b4bc028fec1c10ca3cd87d440a8a2a48fed097a78feb7156e",
"assets": [
{
"key": "adapter-outbound-objectstorage-c06",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c05": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c05",
"title": "자기가 만든 토큰을 자기가 거부하는 경계값",
"topic": "schema-and-wire-models",
"path": "concept/concept-adapter-outbound-persistence-jpa-c05.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5e377d8c7bbecd23d6b08e2c29ba0fd2f9a44ac994cd9c4ea062f7a720f2e4d7",
"lines": 36,
"body": "concept/concept-adapter-outbound-persistence-jpa-c05.body.md",
"bodySha256": "43da66e5d9006b3fc07ae94ecccf78ad11792aece927af82d03c69c2b5776e97",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c05",
"kind": "terminal"
},
{
"key": "adapter-outbound-persistence-jpa-c05-diagram",
"kind": "diagram"
}
]
},
"adapter-outbound-persistence-jpa-c25": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c25",
"title": "문서 상수와 같은 상수를 assert하는 test를 피한 이유",
"topic": "schema-and-wire-models",
"path": "concept/concept-adapter-outbound-persistence-jpa-c25.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c25",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "126d3c6cf1089ce73a1b3e573fd51b3df028bb7da3f56c7be36578ba83942c7c",
"lines": 36,
"body": "concept/concept-adapter-outbound-persistence-jpa-c25.body.md",
"bodySha256": "78d2bda6490629ab64feda9ca296ef03e377006494a7415dfef3b0a3083fcdc0",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c25-diagram",
"kind": "diagram"
},
{
"key": "adapter-outbound-persistence-jpa-c25",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c45": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c45",
"title": "V3와 V4는 registry revision을 올리지 않는다",
"topic": "schema-and-wire-models",
"path": "concept/concept-adapter-outbound-persistence-jpa-c45.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c45",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5073e85dc05f44a237be98798a614223e84b43f08fc6f3a25765adb605ef5816",
"lines": 36,
"body": "concept/concept-adapter-outbound-persistence-jpa-c45.body.md",
"bodySha256": "a3326df8df724f717fedbe5f5e7063e866e9d9b2579b0d5e3c3c7a75b05c16b3",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c45",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c49": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c49",
"title": "평문처럼 보이는 envelope를 DB constraint가 거부한다",
"topic": "schema-and-wire-models",
"path": "concept/concept-adapter-outbound-persistence-jpa-c49.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c49",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "74b8a0abeb3e35fe67d10417dcc53bb9ffb1466205548cef53b0d651ab17d5a7",
"lines": 40,
"body": "concept/concept-adapter-outbound-persistence-jpa-c49.body.md",
"bodySha256": "3e9d9fa28d15737e3837090049cee44413bdd57489f815055b5d1136acb5b6a9",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c49",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-mongo-c02": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-mongo-c02",
"title": "선언된 축이 컴파일되지 않으면 startup에서 거부된다",
"topic": "schema-and-wire-models",
"path": "concept/concept-adapter-outbound-persistence-mongo-c02.md",
"rootTreeNode": "concept:adapter-outbound-persistence-mongo-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0308d6689c10924e7b1cb3b97de95b4bbcc08e61c2265f8b0d5e3ea35278b920",
"lines": 48,
"body": "concept/concept-adapter-outbound-persistence-mongo-c02.body.md",
"bodySha256": "9277dd7c97ab6cb26f943f45ef6b14f239f2d550a3d32ec52fa832d54e2245f1",
"assets": [
{
"key": "adapter-outbound-persistence-mongo-c02",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-mongo-c05": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-mongo-c05",
"title": "배선된 enforcer를 부르는 코드가 미배선이다",
"topic": "schema-and-wire-models",
"path": "concept/concept-adapter-outbound-persistence-mongo-c05.md",
"rootTreeNode": "concept:adapter-outbound-persistence-mongo-c05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "db6a0b155837c4c47d203e727538adb61183196d7309bb3c527dc538954e89f3",
"lines": 40,
"body": "concept/concept-adapter-outbound-persistence-mongo-c05.body.md",
"bodySha256": "39c013546692309186e8692136c10f848296a7cb11f9425fa98662912f64b9dc",
"assets": [
{
"key": "adapter-outbound-persistence-mongo-c05",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-mongo-c09": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-mongo-c09",
"title": "@Configuration을 게이팅하면 게이트를 공급하는 것을 게이팅한다",
"topic": "schema-and-wire-models",
"path": "concept/concept-adapter-outbound-persistence-mongo-c09.md",
"rootTreeNode": "concept:adapter-outbound-persistence-mongo-c09",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "ef99cdba5e9fcf99086583e27457e04152f63a39dc4e19ea50597086bacad3e8",
"lines": 36,
"body": "concept/concept-adapter-outbound-persistence-mongo-c09.body.md",
"bodySha256": "2ac9b7a5f500039115e1d311bfc7095b977e117155f650309e6d39ecb79546f3",
"assets": [
{
"key": "adapter-outbound-persistence-mongo-c09",
"kind": "terminal"
}
]
},
"application-core-c10": {
"kind": "CONCEPT",
"slug": "application-core-c10",
"title": "임의 Object 대신 sealed 변수 대수를 쓴 이유",
"topic": "schema-and-wire-models",
"path": "concept/concept-application-core-c10.md",
"rootTreeNode": "concept:application-core-c10",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "3f217cd960d1a84123422ac91cb22bb6e31aa7e21f02213cd2cb6a6d8cca5d53",
"lines": 36,
"body": "concept/concept-application-core-c10.body.md",
"bodySha256": "35b65f6c1de9c8495f9ab4bc240c1bdc00680ebbb7c35b2b874bdc4e28df0e16",
"assets": [
{
"key": "application-core-c10-diagram",
"kind": "diagram"
},
{
"key": "application-core-c10",
"kind": "terminal"
}
]
},
"grpc-policy-c01": {
"kind": "CONCEPT",
"slug": "grpc-policy-c01",
"title": "재개 토큰 — 서명하고, 구분자를 봉인한다",
"topic": "schema-and-wire-models",
"path": "concept/concept-grpc-policy-c01.md",
"rootTreeNode": "concept:grpc-policy-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "4ce5853af33c3648ae37a2173c11423741026eced1b57811faad2999b53cff74",
"lines": 26,
"body": "concept/concept-grpc-policy-c01.body.md",
"bodySha256": "d7242ab9775ad40630b3b88d1ec04ca2b991f94ff569631edc8a6198d41e82a7",
"assets": [
{
"key": "grpc-policy-c01",
"kind": "terminal"
}
]
},
"messaging-admin-api-c03": {
"kind": "CONCEPT",
"slug": "messaging-admin-api-c03",
"title": "서명 대상 객체가 존재한다는 것이 4-eyes 통과를 뜻한다",
"topic": "schema-and-wire-models",
"path": "concept/concept-messaging-admin-api-c03.md",
"rootTreeNode": "concept:messaging-admin-api-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "646eb971fe79022b8774e193ae06f4399d150b7329c6427b013058dc030c161d",
"lines": 42,
"body": "concept/concept-messaging-admin-api-c03.body.md",
"bodySha256": "007cdf0fcd376b717e872517069cfac3f7d395c0b59a578c774417e3cb608827",
"assets": [
{
"key": "messaging-admin-api-c03-diagram",
"kind": "diagram"
},
{
"key": "messaging-admin-api-c03",
"kind": "terminal"
}
]
},
"messaging-cloudevents-c01": {
"kind": "CONCEPT",
"slug": "messaging-cloudevents-c01",
"title": "싣고 쓰지 않는다",
"topic": "schema-and-wire-models",
"path": "concept/concept-messaging-cloudevents-c01.md",
"rootTreeNode": "concept:messaging-cloudevents-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "8cc702996eb5a78bf6f46cc60ee2429679d0d1867d0784a02a57edb2bcbbcb40",
"lines": 38,
"body": "concept/concept-messaging-cloudevents-c01.body.md",
"bodySha256": "406db518b4a9efc14acdd599fd22ea2c09da54e5ec21982a527d066297702a67",
"assets": [
{
"key": "messaging-cloudevents-c01-diagram",
"kind": "diagram"
},
{
"key": "messaging-cloudevents-c01",
"kind": "terminal"
}
]
},
"messaging-cloudevents-c02": {
"kind": "CONCEPT",
"slug": "messaging-cloudevents-c02",
"title": "런타임 classpath에는 오르고 어느 @Bean도 만들지 않는다",
"topic": "schema-and-wire-models",
"path": "concept/concept-messaging-cloudevents-c02.md",
"rootTreeNode": "concept:messaging-cloudevents-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "8e3da0016c081a0cbe3df62fad95343a9f7ad193dab1cad4a691b00ba30ebe91",
"lines": 30,
"body": "concept/concept-messaging-cloudevents-c02.body.md",
"bodySha256": "049924c626fdbbffa5420ed268a259d154fcfe2f4d2377684f4ee540cd12fe08",
"assets": [
{
"key": "messaging-cloudevents-c02",
"kind": "terminal"
}
]
},
"messaging-cloudevents-c03": {
"kind": "CONCEPT",
"slug": "messaging-cloudevents-c03",
"title": "확장 이름이 봉투 필드명과 다른 이유",
"topic": "schema-and-wire-models",
"path": "concept/concept-messaging-cloudevents-c03.md",
"rootTreeNode": "concept:messaging-cloudevents-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0c36f02bcba6daa1e52c820126dd2dacc9cc7391e353290901df50baffbdfe21",
"lines": 26,
"body": "concept/concept-messaging-cloudevents-c03.body.md",
"bodySha256": "d0d58cc3b767eaa8195945547801fa87cc197f7eae637d210c15f37cc1afd349",
"assets": [
{
"key": "messaging-cloudevents-c03",
"kind": "terminal"
}
]
},
"messaging-cloudevents-c05": {
"kind": "CONCEPT",
"slug": "messaging-cloudevents-c05",
"title": "두 방향 모두 시각이 없으면 거절한다",
"topic": "schema-and-wire-models",
"path": "concept/concept-messaging-cloudevents-c05.md",
"rootTreeNode": "concept:messaging-cloudevents-c05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "3c59f11bc3df6b0ba71e0311528edc0784717fb4f54e0fc3b13a38f9e0fd7e19",
"lines": 26,
"body": "concept/concept-messaging-cloudevents-c05.body.md",
"bodySha256": "d985dd56b3e45cccd38f62c468d47f72302b06c2124f0766cc2f7626ab641f80",
"assets": [
{
"key": "messaging-cloudevents-c05",
"kind": "terminal"
}
]
},
"messaging-cloudevents-c06": {
"kind": "CONCEPT",
"slug": "messaging-cloudevents-c06",
"title": "외부 데이터가 들어오는 유일한 진입점의 실패가 분류되지 않는다",
"topic": "schema-and-wire-models",
"path": "concept/concept-messaging-cloudevents-c06.md",
"rootTreeNode": "concept:messaging-cloudevents-c06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e4c56d1d1afcbfb7bdd6f88ba6d687766dd18b294615952b598199341c53193e",
"lines": 30,
"body": "concept/concept-messaging-cloudevents-c06.body.md",
"bodySha256": "79428d7f2312dfeb9a82a5e409e2bbf33bdf1da144f6ac9ebd7f49b82c61bde0",
"assets": [
{
"key": "messaging-cloudevents-c06",
"kind": "terminal"
}
]
},
"messaging-core-api-c02": {
"kind": "CONCEPT",
"slug": "messaging-core-api-c02",
"title": "의존이 하나도 없고 나머지 24개 전부가 이것을 의존한다",
"topic": "schema-and-wire-models",
"path": "concept/concept-messaging-core-api-c02.md",
"rootTreeNode": "concept:messaging-core-api-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "08d841198c126ca143f04afc9b2627adedcd15e73432446a3dfc1c94ebf14244",
"lines": 34,
"body": "concept/concept-messaging-core-api-c02.body.md",
"bodySha256": "4f482a23ccc2ecc13393079e844f23aa6b12c7222531588710711b96745dd4d5",
"assets": [
{
"key": "messaging-core-api-c02",
"kind": "terminal"
}
]
},
"messaging-core-api-c05": {
"kind": "CONCEPT",
"slug": "messaging-core-api-c05",
"title": "코드가 실제로 도는 네 지점",
"topic": "schema-and-wire-models",
"path": "concept/concept-messaging-core-api-c05.md",
"rootTreeNode": "concept:messaging-core-api-c05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "92052c0eb00410ce44617711d9d85dacbf1481d99909b5cadcea2389b1dd3b80",
"lines": 34,
"body": "concept/concept-messaging-core-api-c05.body.md",
"bodySha256": "9dcaa054d532043c5e281b9bd30234102c7c74f3d64d2ad9289f66775020a187",
"assets": [
{
"key": "messaging-core-api-c05",
"kind": "terminal"
}
]
},
"messaging-schema-api-c02": {
"kind": "CONCEPT",
"slug": "messaging-schema-api-c02",
"title": "Spring 주석 0개인 leaf가 배포 아티팩트에 실린다",
"topic": "schema-and-wire-models",
"path": "concept/concept-messaging-schema-api-c02.md",
"rootTreeNode": "concept:messaging-schema-api-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "2339381d1ffdc74088c11132f99f9d56ea1c8ca22816be69e79cc8f2b3a58477",
"lines": 30,
"body": "concept/concept-messaging-schema-api-c02.body.md",
"bodySha256": "67eeb7a36f8f545bc59b6e6672bb555342911d5bb3ff3715087bec622a61b98e",
"assets": [
{
"key": "messaging-schema-api-c02",
"kind": "terminal"
}
]
},
"messaging-schema-api-c03": {
"kind": "CONCEPT",
"slug": "messaging-schema-api-c03",
"title": "아무것도 실패하지 않고 잘못된 성공이 나온다",
"topic": "schema-and-wire-models",
"path": "concept/concept-messaging-schema-api-c03.md",
"rootTreeNode": "concept:messaging-schema-api-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "37e003eb31253205154b767f1f998a04d461f385d1f4a56ae199da45c9ffe666",
"lines": 42,
"body": "concept/concept-messaging-schema-api-c03.body.md",
"bodySha256": "bc622e3471d41ac91d9ab571d442f1ba30c21bdad2c88b62a7f7f1b27516f7d7",
"assets": [
{
"key": "messaging-schema-api-c03-diagram",
"kind": "diagram"
},
{
"key": "messaging-schema-api-c03",
"kind": "terminal"
}
]
},
"messaging-schema-api-c04": {
"kind": "CONCEPT",
"slug": "messaging-schema-api-c04",
"title": "진화 검사 경로는 이 저장소에서 실행되지 않는다",
"topic": "schema-and-wire-models",
"path": "concept/concept-messaging-schema-api-c04.md",
"rootTreeNode": "concept:messaging-schema-api-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "03f838738cc6a5eb041429f2e5943cea3b6587d6c55d5ffeddcfb828c37d9667",
"lines": 30,
"body": "concept/concept-messaging-schema-api-c04.body.md",
"bodySha256": "818c3b4f3b77b68454d8d42953b851fb61001845592bf56730bd83166b36bcb8",
"assets": [
{
"key": "messaging-schema-api-c04",
"kind": "terminal"
}
]
},
"messaging-schema-avro-c01": {
"kind": "CONCEPT",
"slug": "messaging-schema-avro-c01",
"title": "형제 leaf가 implementation이고 이쪽이 api인 것이 규칙의 증거다",
"topic": "schema-and-wire-models",
"path": "concept/concept-messaging-schema-avro-c01.md",
"rootTreeNode": "concept:messaging-schema-avro-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0294101fd2d7b3bafb0ea8528d552f688444b347a0043d0e536aa1d1782d832c",
"lines": 34,
"body": "concept/concept-messaging-schema-avro-c01.body.md",
"bodySha256": "00dca95e1041b30574ecc11af008a6f8c5f746764ed9443a3cad3b4b108cd55f",
"assets": [
{
"key": "messaging-schema-avro-c01",
"kind": "terminal"
}
]
},
"messaging-schema-avro-c02": {
"kind": "CONCEPT",
"slug": "messaging-schema-avro-c02",
"title": "소비자 없음과 membership 없음이 일치한다",
"topic": "schema-and-wire-models",
"path": "concept/concept-messaging-schema-avro-c02.md",
"rootTreeNode": "concept:messaging-schema-avro-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "481d0f4ab41153f82e6f9990706ccf83a8c2a4ec41607208e22bd4ca55e236c5",
"lines": 34,
"body": "concept/concept-messaging-schema-avro-c02.body.md",
"bodySha256": "e787b2da58ea1b9445ac163c44b761e84d24b5cff6d317c00a4ec25189ea69c2",
"assets": [
{
"key": "messaging-schema-avro-c02",
"kind": "terminal"
}
]
},
"messaging-schema-avro-c03": {
"kind": "CONCEPT",
"slug": "messaging-schema-avro-c03",
"title": "틀린 스키마로 디코딩해도 실패하지 않는다",
"topic": "schema-and-wire-models",
"path": "concept/concept-messaging-schema-avro-c03.md",
"rootTreeNode": "concept:messaging-schema-avro-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "341f048b5237afa250caad2110005bced139991995f32c84b6c74ffa744fb1cc",
"lines": 38,
"body": "concept/concept-messaging-schema-avro-c03.body.md",
"bodySha256": "6051e533a7ccff55717e44a3aadc779e1538cd9eec0256e0b32ed39eb99d4209",
"assets": [
{
"key": "messaging-schema-avro-c03-diagram",
"kind": "diagram"
},
{
"key": "messaging-schema-avro-c03",
"kind": "terminal"
}
]
},
"messaging-schema-avro-c04": {
"kind": "CONCEPT",
"slug": "messaging-schema-avro-c04",
"title": "쓰기 스키마와 읽기 스키마를 둘 다 넘기는 경로",
"topic": "schema-and-wire-models",
"path": "concept/concept-messaging-schema-avro-c04.md",
"rootTreeNode": "concept:messaging-schema-avro-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "68c264254b211afdc53dea0aaaca42199eeeedd3d36f7420b9bf33854ba50cc5",
"lines": 26,
"body": "concept/concept-messaging-schema-avro-c04.body.md",
"bodySha256": "fd78d2ec26ccc6513f75379736638b533447e97c6699b48273303adf5ce584d3",
"assets": [
{
"key": "messaging-schema-avro-c04",
"kind": "terminal"
}
]
},
"messaging-schema-avro-c05": {
"kind": "CONCEPT",
"slug": "messaging-schema-avro-c05",
"title": "크기 실패가 인코딩 실패로 접히지 않게 하는 재던지기",
"topic": "schema-and-wire-models",
"path": "concept/concept-messaging-schema-avro-c05.md",
"rootTreeNode": "concept:messaging-schema-avro-c05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "1db6f0b0ea352cec48e9c42c780325581bb802dca24a05889b5443e71464c82e",
"lines": 30,
"body": "concept/concept-messaging-schema-avro-c05.body.md",
"bodySha256": "b49217e4336272c4bc586ced6195cb408d889160537c78566d3a89721fd70a93",
"assets": [
{
"key": "messaging-schema-avro-c05",
"kind": "terminal"
}
]
},
"messaging-schema-json-c02": {
"kind": "CONCEPT",
"slug": "messaging-schema-json-c02",
"title": "출하 구성의 codec registry에는 JSON 하나만 들어간다",
"topic": "schema-and-wire-models",
"path": "concept/concept-messaging-schema-json-c02.md",
"rootTreeNode": "concept:messaging-schema-json-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "31467b302f293ac2a0c9cc40e8e7c3b70f92aa31e398ef4dda9b14febe8f12d0",
"lines": 38,
"body": "concept/concept-messaging-schema-json-c02.body.md",
"bodySha256": "d26879cc731fb4c9e2bc051de43821392d3d71d382a1a2bab39d28ca8eb6eb02",
"assets": [
{
"key": "messaging-schema-json-c02",
"kind": "terminal"
}
]
},
"messaging-schema-json-c03": {
"kind": "CONCEPT",
"slug": "messaging-schema-json-c03",
"title": "인코딩 상한과 파서 상한이 하나의 값에서 나온다",
"topic": "schema-and-wire-models",
"path": "concept/concept-messaging-schema-json-c03.md",
"rootTreeNode": "concept:messaging-schema-json-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "2f2af6aba6566bf1d7ac01bc9586849899bfbf19027e1ff0918ea99ec8c4d47e",
"lines": 42,
"body": "concept/concept-messaging-schema-json-c03.body.md",
"bodySha256": "51c43cf322a59d6254ce373f2e5412e0889bafc8196bff6acacf831b67f88da0",
"assets": [
{
"key": "messaging-schema-json-c03",
"kind": "terminal"
}
]
},
"messaging-schema-json-c04": {
"kind": "CONCEPT",
"slug": "messaging-schema-json-c04",
"title": "디코딩은 등록 클래스와 정확히 같은지를 본다",
"topic": "schema-and-wire-models",
"path": "concept/concept-messaging-schema-json-c04.md",
"rootTreeNode": "concept:messaging-schema-json-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d7c7db329fa24900b90246d8ca4264a34a688ac2009c5eb2f68382396fb5383f",
"lines": 26,
"body": "concept/concept-messaging-schema-json-c04.body.md",
"bodySha256": "d7f8c087e3d8861dec045a6adcba8d5f1d58611852db03deb38cdedbc1b83507",
"assets": [
{
"key": "messaging-schema-json-c04",
"kind": "terminal"
}
]
},
"messaging-schema-protobuf-c01": {
"kind": "CONCEPT",
"slug": "messaging-schema-protobuf-c01",
"title": "소비자가 계약을 등록하려면 vendor 타입을 이름 불러야 한다",
"topic": "schema-and-wire-models",
"path": "concept/concept-messaging-schema-protobuf-c01.md",
"rootTreeNode": "concept:messaging-schema-protobuf-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "045e1906f32ba3f81506e5fbdaad4b2b6b5a2fa20595bf7a1afeb4baf03d4f00",
"lines": 38,
"body": "concept/concept-messaging-schema-protobuf-c01.body.md",
"bodySha256": "a30c018ab0463d621b6bcb86568257cba6040b4ee868c27fc7c4dfb144f29def",
"assets": [
{
"key": "messaging-schema-protobuf-c01",
"kind": "terminal"
}
]
},
"messaging-schema-protobuf-c04": {
"kind": "CONCEPT",
"slug": "messaging-schema-protobuf-c04",
"title": "계약 등록 실패가 시작 시점에 난다",
"topic": "schema-and-wire-models",
"path": "concept/concept-messaging-schema-protobuf-c04.md",
"rootTreeNode": "concept:messaging-schema-protobuf-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "68661599759ea00d0b6148844a73fba5e98c5299a0e9b60406ba2ff22ee6f0d1",
"lines": 26,
"body": "concept/concept-messaging-schema-protobuf-c04.body.md",
"bodySha256": "e5d5d0bd2f9096278825dac3ff9319628ec8a9ac96668bc24d074de48e7e4fc2",
"assets": [
{
"key": "messaging-schema-protobuf-c04",
"kind": "terminal"
}
]
},
"messaging-schema-protobuf-c05": {
"kind": "CONCEPT",
"slug": "messaging-schema-protobuf-c05",
"title": "세 codec이 같은 문제를 라이브러리에 맞춰 다르게 푼다",
"topic": "schema-and-wire-models",
"path": "concept/concept-messaging-schema-protobuf-c05.md",
"rootTreeNode": "concept:messaging-schema-protobuf-c05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "40ba911be37ff7400651a1ba8b61cd67d11e79cbe6322fc6f424868b24223028",
"lines": 34,
"body": "concept/concept-messaging-schema-protobuf-c05.body.md",
"bodySha256": "6cb9e59803172fc8fe01c59e56856370b6074814ba55a32ebfa644ef6d299125",
"assets": [
{
"key": "messaging-schema-protobuf-c05",
"kind": "terminal"
}
]
},
"messaging-schema-protobuf-c07": {
"kind": "CONCEPT",
"slug": "messaging-schema-protobuf-c07",
"title": "실패의 종류가 바뀌면 운영자가 읽을 정보가 사라진다",
"topic": "schema-and-wire-models",
"path": "concept/concept-messaging-schema-protobuf-c07.md",
"rootTreeNode": "concept:messaging-schema-protobuf-c07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "8546310a6f1e32e70e43341f2bbfea670e2d3a174a5333ab9da3a0af1527a69a",
"lines": 30,
"body": "concept/concept-messaging-schema-protobuf-c07.body.md",
"bodySha256": "9fe88a0aa8049fee9a62c707cd03f3b90f21126e206590df91cab36ebcac95b7",
"assets": [
{
"key": "messaging-schema-protobuf-c07",
"kind": "terminal"
}
]
},
"messaging-testkit-c03": {
"kind": "CONCEPT",
"slug": "messaging-testkit-c03",
"title": "등급이 증거를 만들지 않고 증거가 등급을 만든다",
"topic": "schema-and-wire-models",
"path": "concept/concept-messaging-testkit-c03.md",
"rootTreeNode": "concept:messaging-testkit-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "47d08378dac37d78a5ccc6c8246bfcfcc0449971ec49ccb2a7571f6d9fe7a46f",
"lines": 30,
"body": "concept/concept-messaging-testkit-c03.body.md",
"bodySha256": "a8ad37d596fed1d8895b5ae8b42dbb05243cfbef68f04401ffd24db50f58fe9b",
"assets": [
{
"key": "messaging-testkit-c03",
"kind": "terminal"
}
]
},
"shared-contract-c04": {
"kind": "CONCEPT",
"slug": "shared-contract-c04",
"title": "digest는 고정하지만 validator 상호운용은 증명하지 않는다",
"topic": "schema-and-wire-models",
"path": "concept/concept-shared-contract-c04.md",
"rootTreeNode": "concept:shared-contract-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b888c0db23475e0ca8f8ca92c020c1786e6d94c0619c5226ba608d2e1b7b92d7",
"lines": 30,
"body": "concept/concept-shared-contract-c04.body.md",
"bodySha256": "5c1454e9fe3f1422b605e180e759233ce24e8743c29a3f4cb716629e2e3d0ad3",
"assets": [
{
"key": "shared-contract-c04",
"kind": "terminal"
}
]
},
"adapter-inbound-graphql-c04": {
"kind": "CONCEPT",
"slug": "adapter-inbound-graphql-c04",
"title": "다섯 예산 계층 중 요청 계층만 배선돼 있다",
"topic": "admission-budget-and-backpressure",
"path": "concept/concept-adapter-inbound-graphql-c04.md",
"rootTreeNode": "concept:adapter-inbound-graphql-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f6b9cc1412a788e4193f3387c74ed2ab37a227d8b4f6649a92c0dc0723f69e53",
"lines": 32,
"body": "concept/concept-adapter-inbound-graphql-c04.body.md",
"bodySha256": "ca5fbf3031a7f1d5b7a891900154ca6896da0fce53e5ea85bec12865711c45b1",
"assets": [
{
"key": "adapter-inbound-graphql-c04-diagram",
"kind": "diagram"
},
{
"key": "adapter-inbound-graphql-c04",
"kind": "terminal"
}
]
},
"adapter-inbound-graphql-c05": {
"kind": "CONCEPT",
"slug": "adapter-inbound-graphql-c05",
"title": "요청 데드라인이 실제로 실행을 끊는 경로가 있다",
"topic": "admission-budget-and-backpressure",
"path": "concept/concept-adapter-inbound-graphql-c05.md",
"rootTreeNode": "concept:adapter-inbound-graphql-c05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f6c058dbbbd997844b772e3efb64634c721d4aa8eb95674fcb8ce671189451f4",
"lines": 32,
"body": "concept/concept-adapter-inbound-graphql-c05.body.md",
"bodySha256": "8427408675cb24ecc3fde050c7b1d0cd3c84d3252b02bfea27ebd1004dd75dc1",
"assets": [
{
"key": "adapter-inbound-graphql-c05",
"kind": "terminal"
}
]
},
"adapter-inbound-web-c05": {
"kind": "CONCEPT",
"slug": "adapter-inbound-web-c05",
"title": "예산 게이트 프로퍼티가 자바 한 줄에만 있다",
"topic": "admission-budget-and-backpressure",
"path": "concept/concept-adapter-inbound-web-c05.md",
"rootTreeNode": "concept:adapter-inbound-web-c05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "059a806123823772774a506df432e4a52212da2f7e3e458ba9b9abd3faf98e36",
"lines": 32,
"body": "concept/concept-adapter-inbound-web-c05.body.md",
"bodySha256": "cfc88c0aa5b2dc76a3df790b9d6173a0b287d2a648d5dc2dc13abf57782f7324",
"assets": [
{
"key": "adapter-inbound-web-c05",
"kind": "terminal"
}
]
},
"adapter-inbound-web-c14": {
"kind": "CONCEPT",
"slug": "adapter-inbound-web-c14",
"title": "forwarded 헤더를 해석하는 쪽은 피어를 검사하지 않는다",
"topic": "admission-budget-and-backpressure",
"path": "concept/concept-adapter-inbound-web-c14.md",
"rootTreeNode": "concept:adapter-inbound-web-c14",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "bb4c939fdefd074335a380ee34c2851dbe0a9f130d862ec9a9cd8db8cb29633a",
"lines": 32,
"body": "concept/concept-adapter-inbound-web-c14.body.md",
"bodySha256": "f9789935bdfec69652feec379c5abf14262a3b57b3c0a882364801c2f5a4e3eb",
"assets": [
{
"key": "adapter-inbound-web-c14",
"kind": "terminal"
}
]
},
"adapter-inbound-web-c18": {
"kind": "CONCEPT",
"slug": "adapter-inbound-web-c18",
"title": "fileserver 매핑 검증은 회로가 닫혀 있다",
"topic": "admission-budget-and-backpressure",
"path": "concept/concept-adapter-inbound-web-c18.md",
"rootTreeNode": "concept:adapter-inbound-web-c18",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "ca3e9078be56a72096e9dc58318ec0380284b388f261114ff3a35004345d955b",
"lines": 32,
"body": "concept/concept-adapter-inbound-web-c18.body.md",
"bodySha256": "a4298df22e38015a781fdd4e061e7cff78da07227b29a5c97b55569d9b3728f0",
"assets": [
{
"key": "adapter-inbound-web-c18",
"kind": "terminal"
}
]
},
"adapter-outbound-cache-redis-c04": {
"kind": "CONCEPT",
"slug": "adapter-outbound-cache-redis-c04",
"title": "대칭 검사기 자신을 검사하는 메타 테스트가 있다",
"topic": "admission-budget-and-backpressure",
"path": "concept/concept-adapter-outbound-cache-redis-c04.md",
"rootTreeNode": "concept:adapter-outbound-cache-redis-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e9fa1489d45eee0588a7bea12f81794ef3d251951715635a4e231720b70dce3a",
"lines": 36,
"body": "concept/concept-adapter-outbound-cache-redis-c04.body.md",
"bodySha256": "6b637f9fbc3e8ad4a612db5002d46fe76ae699a913d5a6e3a5be4516993d8899",
"assets": [
{
"key": "adapter-outbound-cache-redis-c04-diagram",
"kind": "diagram"
},
{
"key": "adapter-outbound-cache-redis-c04",
"kind": "terminal"
}
]
},
"adapter-outbound-cache-redis-c05": {
"kind": "CONCEPT",
"slug": "adapter-outbound-cache-redis-c05",
"title": "렌더된 키 문자열을 받는 API가 없다",
"topic": "admission-budget-and-backpressure",
"path": "concept/concept-adapter-outbound-cache-redis-c05.md",
"rootTreeNode": "concept:adapter-outbound-cache-redis-c05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "6cac86a426ad4e23d3563ee83890ca1afe18215545b7613746eef0fc820822e9",
"lines": 36,
"body": "concept/concept-adapter-outbound-cache-redis-c05.body.md",
"bodySha256": "7d943e8d5d3f310528cf4ca5dccfdefc4f6ba9cfc4e70d0171db3c7be5b3692d",
"assets": [
{
"key": "adapter-outbound-cache-redis-c05",
"kind": "terminal"
}
]
},
"adapter-outbound-cache-redis-c12": {
"kind": "CONCEPT",
"slug": "adapter-outbound-cache-redis-c12",
"title": "탈출구가 두 겹의 사전 승인으로 닫혀 있다",
"topic": "admission-budget-and-backpressure",
"path": "concept/concept-adapter-outbound-cache-redis-c12.md",
"rootTreeNode": "concept:adapter-outbound-cache-redis-c12",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "1157efef08ac542102a437d00002b3fa0a095953f492bb8e36f976c6ca556e17",
"lines": 40,
"body": "concept/concept-adapter-outbound-cache-redis-c12.body.md",
"bodySha256": "222b1aacda1a210d2476c6e72510cd8dd963cfd07e373f85688c8a1dad45e39d",
"assets": [
{
"key": "adapter-outbound-cache-redis-c12-diagram",
"kind": "diagram"
},
{
"key": "adapter-outbound-cache-redis-c12",
"kind": "terminal"
}
]
},
"adapter-outbound-fileserver-c06": {
"kind": "CONCEPT",
"slug": "adapter-outbound-fileserver-c06",
"title": "거부 메시지가 역할 모델을 설명하지 않는다",
"topic": "admission-budget-and-backpressure",
"path": "concept/concept-adapter-outbound-fileserver-c06.md",
"rootTreeNode": "concept:adapter-outbound-fileserver-c06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "7d9ce301e99e4e507b738218f3af92aeb6c232ffa0eff813941ed81f83cc9eb5",
"lines": 40,
"body": "concept/concept-adapter-outbound-fileserver-c06.body.md",
"bodySha256": "0ac8856cae8ed57023f3a0dbf1f4d7b4851b0cf8e357cf10fe5c97e37c110213",
"assets": [
{
"key": "adapter-outbound-fileserver-c06",
"kind": "terminal"
}
]
},
"adapter-outbound-httpclient-c01": {
"kind": "CONCEPT",
"slug": "adapter-outbound-httpclient-c01",
"title": "닿지 않는 설정을 무시하지 않고 거부한다",
"topic": "admission-budget-and-backpressure",
"path": "concept/concept-adapter-outbound-httpclient-c01.md",
"rootTreeNode": "concept:adapter-outbound-httpclient-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "4d8f301137f229c67b2d78cf9c093f6ce06d870a3dc57f43a41d49c1e21451ad",
"lines": 44,
"body": "concept/concept-adapter-outbound-httpclient-c01.body.md",
"bodySha256": "2cf4b392ba1108791424f941550e7173c90e3b11998034c08e5fdd36090057a4",
"assets": [
{
"key": "adapter-outbound-httpclient-c01",
"kind": "terminal"
}
]
},
"adapter-outbound-httpclient-c05": {
"kind": "CONCEPT",
"slug": "adapter-outbound-httpclient-c05",
"title": "열린 회로가 토큰과 permit을 쓰기 전에 거절한다",
"topic": "admission-budget-and-backpressure",
"path": "concept/concept-adapter-outbound-httpclient-c05.md",
"rootTreeNode": "concept:adapter-outbound-httpclient-c05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "464598ea72847cbce737f7dcc7cf7da0033d6704c968940831aaf0fd5e3d878d",
"lines": 40,
"body": "concept/concept-adapter-outbound-httpclient-c05.body.md",
"bodySha256": "8772a98d925dc484db98ae809ad029be23d7b88e9b34706e51cc3598f1b8c966",
"assets": [
{
"key": "adapter-outbound-httpclient-c05-diagram",
"kind": "diagram"
},
{
"key": "adapter-outbound-httpclient-c05",
"kind": "terminal"
}
]
},
"adapter-outbound-httpclient-c08": {
"kind": "CONCEPT",
"slug": "adapter-outbound-httpclient-c08",
"title": "전송의 선언이 프로파일보다 약하면 startup이 실패한다",
"topic": "admission-budget-and-backpressure",
"path": "concept/concept-adapter-outbound-httpclient-c08.md",
"rootTreeNode": "concept:adapter-outbound-httpclient-c08",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0451dde09b4f6fa9d444f1f9b3abc6241d8de1e363c568337ab07dac83ce2dc2",
"lines": 40,
"body": "concept/concept-adapter-outbound-httpclient-c08.body.md",
"bodySha256": "d7c5ffd6813e02bea21c16c8c6685115a429e49c4409911772b4f1d31ac0e7b3",
"assets": [
{
"key": "adapter-outbound-httpclient-c08",
"kind": "terminal"
}
]
},
"adapter-outbound-objectstorage-c02": {
"kind": "CONCEPT",
"slug": "adapter-outbound-objectstorage-c02",
"title": "레거시 경로 셋이 서로 다른 스위치로 서로를 배제한다",
"topic": "admission-budget-and-backpressure",
"path": "concept/concept-adapter-outbound-objectstorage-c02.md",
"rootTreeNode": "concept:adapter-outbound-objectstorage-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0d1ab05b08667cea66a1e3957e248d71c80cdf57c0f89aa400748bf231ccfd7a",
"lines": 36,
"body": "concept/concept-adapter-outbound-objectstorage-c02.body.md",
"bodySha256": "d2c2c2dd820488e832ba8807ea42b5cd680352f9b80575a39c2de371aa8375ae",
"assets": [
{
"key": "adapter-outbound-objectstorage-c02",
"kind": "terminal"
}
]
},
"application-core-c08": {
"kind": "CONCEPT",
"slug": "application-core-c08",
"title": "검증 권한과 삭제 권한을 분리한 staged lifecycle",
"topic": "admission-budget-and-backpressure",
"path": "concept/concept-application-core-c08.md",
"rootTreeNode": "concept:application-core-c08",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "7ecbb7cc904abf3f9d5d5094f0dbc3ca8b6d44027ea72db412c2ea6955543f3f",
"lines": 40,
"body": "concept/concept-application-core-c08.body.md",
"bodySha256": "70b1897f291238d0488b9319b5803c7dbd7585b575658cac399a030593e41271",
"assets": [
{
"key": "application-core-c08",
"kind": "terminal"
}
]
},
"grpc-advanced-bootstrap-c01": {
"kind": "CONCEPT",
"slug": "grpc-advanced-bootstrap-c01",
"title": "능력을 하나씩 등급 매기는 것이 설계다",
"topic": "admission-budget-and-backpressure",
"path": "concept/concept-grpc-advanced-bootstrap-c01.md",
"rootTreeNode": "concept:grpc-advanced-bootstrap-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f20f715287d88bc8fb119b44b010b7cb18dce608e35c138d1de4906ce4c7b7f9",
"lines": 40,
"body": "concept/concept-grpc-advanced-bootstrap-c01.body.md",
"bodySha256": "0c91908991513f3b3f10746486394ef79c0195b5c3b468586a265de7302c72cf",
"assets": [
{
"key": "grpc-advanced-bootstrap-c01",
"kind": "terminal"
}
]
},
"grpc-advanced-streaming-c01": {
"kind": "CONCEPT",
"slug": "grpc-advanced-streaming-c01",
"title": "상한 없는 request(n)은 단계만 늘린 무제한 버퍼링이다",
"topic": "admission-budget-and-backpressure",
"path": "concept/concept-grpc-advanced-streaming-c01.md",
"rootTreeNode": "concept:grpc-advanced-streaming-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "80676f9294adbb6835e37051a62060a97a6fa2ff86e7ca5e0f730bb72ab2fa8d",
"lines": 32,
"body": "concept/concept-grpc-advanced-streaming-c01.body.md",
"bodySha256": "33ebd8066c442ada72dec4b5d7346ef101c4f74c354cbc87a36c7dc43e9f4990",
"assets": [
{
"key": "grpc-advanced-streaming-c01",
"kind": "terminal"
}
]
},
"messaging-admin-api-c04": {
"kind": "CONCEPT",
"slug": "messaging-admin-api-c04",
"title": "실행 경로에서 같은 검사가 세 지점에 겹친다",
"topic": "admission-budget-and-backpressure",
"path": "concept/concept-messaging-admin-api-c04.md",
"rootTreeNode": "concept:messaging-admin-api-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "2e937dacf098ec57fe4bfe06d50016785ee1882955fdea599b2ee29e61892cb5",
"lines": 32,
"body": "concept/concept-messaging-admin-api-c04.body.md",
"bodySha256": "cde82c826a8b5f8ba46b80e7eeabbd5520437e64abc01ebfc88cca4b37038783",
"assets": [
{
"key": "messaging-admin-api-c04",
"kind": "terminal"
}
]
},
"messaging-policy-c05": {
"kind": "CONCEPT",
"slug": "messaging-policy-c05",
"title": "배치 상한이 개수와 바이트 두 축인 이유",
"topic": "admission-budget-and-backpressure",
"path": "concept/concept-messaging-policy-c05.md",
"rootTreeNode": "concept:messaging-policy-c05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "78fd4fbe9282db0c2c6e0bdecf40b4ab9e864b062254aac5e618fbc356fc2daf",
"lines": 36,
"body": "concept/concept-messaging-policy-c05.body.md",
"bodySha256": "0f61279a2330225be9989e65f50a9c70c01542141ab9948be8779fecf1d2eab5",
"assets": [
{
"key": "messaging-policy-c05",
"kind": "terminal"
}
]
},
"messaging-schema-avro-c07": {
"kind": "CONCEPT",
"slug": "messaging-schema-avro-c07",
"title": "바이트 상한이 잘못된 공격에 적용돼 있었다",
"topic": "admission-budget-and-backpressure",
"path": "concept/concept-messaging-schema-avro-c07.md",
"rootTreeNode": "concept:messaging-schema-avro-c07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "dc2b00e85ede500c4820299b95f42a5114bdad30a7b0eebbb905d1310b0cd680",
"lines": 32,
"body": "concept/concept-messaging-schema-avro-c07.body.md",
"bodySha256": "37602d3b03051f23701ce1b215a5db721cc0081541ce0af2e4827072e71fa644",
"assets": [
{
"key": "messaging-schema-avro-c07",
"kind": "terminal"
}
]
},
"messaging-spring-cloud-stream-bridge-c03": {
"kind": "CONCEPT",
"slug": "messaging-spring-cloud-stream-bridge-c03",
"title": "보장에 의존하는 순간 브리지를 거절한다",
"topic": "admission-budget-and-backpressure",
"path": "concept/concept-messaging-spring-cloud-stream-bridge-c03.md",
"rootTreeNode": "concept:messaging-spring-cloud-stream-bridge-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "aa6de86f73df741a9e9de9a45cb986ea20efeb7c9388911eb1495ea27f9e88d5",
"lines": 40,
"body": "concept/concept-messaging-spring-cloud-stream-bridge-c03.body.md",
"bodySha256": "5f84d1c60c99366edab405d1c4103fef3aca444e4d4a729a1354678e476db0b8",
"assets": [
{
"key": "messaging-spring-cloud-stream-bridge-c03-diagram",
"kind": "diagram"
},
{
"key": "messaging-spring-cloud-stream-bridge-c03",
"kind": "terminal"
}
]
},
"shared-contract-c02": {
"kind": "CONCEPT",
"slug": "shared-contract-c02",
"title": "Permission의 정규화는 문법 제한이 아니다",
"topic": "admission-budget-and-backpressure",
"path": "concept/concept-shared-contract-c02.md",
"rootTreeNode": "concept:shared-contract-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d95be1ae91ccb0e738698babd952eced0318535c92b7b61117ef0cc45fdd94eb",
"lines": 32,
"body": "concept/concept-shared-contract-c02.body.md",
"bodySha256": "675432ba6c33530e257b6a5365f7557bca4d49d32fc7feb05d6e594713193789",
"assets": [
{
"key": "shared-contract-c02",
"kind": "terminal"
}
]
},
"adapter-inbound-graphql-c01": {
"kind": "CONCEPT",
"slug": "adapter-inbound-graphql-c01",
"title": "off 계약의 두 절반과 리터럴 404를 피한 단언",
"topic": "security-and-trust-boundaries",
"path": "concept/concept-adapter-inbound-graphql-c01.md",
"rootTreeNode": "concept:adapter-inbound-graphql-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "595da18e3b83dd9517b9afc8d0ac66c462b9847c5eb8e3ac5929819b3416a56a",
"lines": 36,
"body": "concept/concept-adapter-inbound-graphql-c01.body.md",
"bodySha256": "f5c38c3833cf5542fc80b1c33f2d58e5b56f04a695c3103db826a7cd3c073e31",
"assets": [
{
"key": "adapter-inbound-graphql-c01",
"kind": "terminal"
}
]
},
"adapter-inbound-web-c03": {
"kind": "CONCEPT",
"slug": "adapter-inbound-web-c03",
"title": "security 패키지가 자기 안에서만 서로를 부른다",
"topic": "security-and-trust-boundaries",
"path": "concept/concept-adapter-inbound-web-c03.md",
"rootTreeNode": "concept:adapter-inbound-web-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "13f2680e5e8b5c6562be8e73d5f5f6022b4b908ba5736210df9f4870a49096bf",
"lines": 32,
"body": "concept/concept-adapter-inbound-web-c03.body.md",
"bodySha256": "19da2bc1a0652a89b835f2be891aea3edd5d6c59eb834ce20270eaa84df3125e",
"assets": [
{
"key": "adapter-inbound-web-c03-diagram",
"kind": "diagram"
},
{
"key": "adapter-inbound-web-c03",
"kind": "terminal"
}
]
},
"adapter-inbound-web-c04": {
"kind": "CONCEPT",
"slug": "adapter-inbound-web-c04",
"title": "publicPaths가 먼저 등록되어 제한 경로 규칙을 덮는다",
"topic": "security-and-trust-boundaries",
"path": "concept/concept-adapter-inbound-web-c04.md",
"rootTreeNode": "concept:adapter-inbound-web-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0e6524f3c67889b85beda5b959e2c73ef4fff325993fcff01937bbb729607700",
"lines": 36,
"body": "concept/concept-adapter-inbound-web-c04.body.md",
"bodySha256": "66363721b15c76f8fffd4432ccf6749f79a3ed131b39ef4ce596c9ce0d304f7c",
"assets": [
{
"key": "adapter-inbound-web-c04-diagram",
"kind": "diagram"
},
{
"key": "adapter-inbound-web-c04",
"kind": "terminal"
}
]
},
"adapter-inbound-web-c07": {
"kind": "CONCEPT",
"slug": "adapter-inbound-web-c07",
"title": "지문이 길이 프레이밍 없이 구분자로만 만들어진다",
"topic": "security-and-trust-boundaries",
"path": "concept/concept-adapter-inbound-web-c07.md",
"rootTreeNode": "concept:adapter-inbound-web-c07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0aee4db85028588f21bac9d372ada40ed35fde1627808b1d84b0252624cd37af",
"lines": 32,
"body": "concept/concept-adapter-inbound-web-c07.body.md",
"bodySha256": "b80a7a8489e81b3e4b134013618274ff81a59169a253e6dd4278f1321113f742",
"assets": [
{
"key": "adapter-inbound-web-c07",
"kind": "terminal"
}
]
},
"adapter-outbound-httpclient-c07": {
"kind": "CONCEPT",
"slug": "adapter-outbound-httpclient-c07",
"title": "절대 URI를 정화하지 않고 거부한다",
"topic": "security-and-trust-boundaries",
"path": "concept/concept-adapter-outbound-httpclient-c07.md",
"rootTreeNode": "concept:adapter-outbound-httpclient-c07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "9f7a37af84f88455c943f80eb3b08e5be737f940660530f894347d15cd0d8a39",
"lines": 36,
"body": "concept/concept-adapter-outbound-httpclient-c07.body.md",
"bodySha256": "58fa1dc692572751c864962003d0ac7391193f5475d2869be2a9ecb3d530de79",
"assets": [
{
"key": "adapter-outbound-httpclient-c07",
"kind": "terminal"
}
]
},
"adapter-outbound-httpclient-c09": {
"kind": "CONCEPT",
"slug": "adapter-outbound-httpclient-c09",
"title": "TLS 실패가 CONNECT로 분류된 원인은 픽스처의 듀얼스택 호스트명이다",
"topic": "security-and-trust-boundaries",
"path": "concept/concept-adapter-outbound-httpclient-c09.md",
"rootTreeNode": "concept:adapter-outbound-httpclient-c09",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "8d78a0b4392edac7afecb6c7dfe189748af769f7c8bfa59e3c81f84f6b323a45",
"lines": 40,
"body": "concept/concept-adapter-outbound-httpclient-c09.body.md",
"bodySha256": "eb1aa49b36cfb15b340301303b70bb5dd9d9c528fd3c346fa7914f5953d39d74",
"assets": [
{
"key": "adapter-outbound-httpclient-c09",
"kind": "terminal"
}
]
},
"adapter-outbound-notification-c04": {
"kind": "CONCEPT",
"slug": "adapter-outbound-notification-c04",
"title": "unhealthy 조건 넷에 DRAINING이 없다",
"topic": "security-and-trust-boundaries",
"path": "concept/concept-adapter-outbound-notification-c04.md",
"rootTreeNode": "concept:adapter-outbound-notification-c04",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "38880b5695bbc770244ca238b0089b844dbc21122c708f6118669bb3e73b32c4",
"lines": 36,
"body": "concept/concept-adapter-outbound-notification-c04.body.md",
"bodySha256": "e19ea92d3681e09c691ef0e5f0bfb8da560948900f7870bbb80aa1e4fd6a1395",
"assets": [
{
"key": "adapter-outbound-notification-c04",
"kind": "terminal"
}
]
},
"adapter-outbound-objectstorage-c03": {
"kind": "CONCEPT",
"slug": "adapter-outbound-objectstorage-c03",
"title": "ObjectReference가 보장하는 route 구획",
"topic": "security-and-trust-boundaries",
"path": "concept/concept-adapter-outbound-objectstorage-c03.md",
"rootTreeNode": "concept:adapter-outbound-objectstorage-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "253751aaf558c82617d867d0ec42f3c053f3f1b654c27ba940ee840f33fb6e70",
"lines": 32,
"body": "concept/concept-adapter-outbound-objectstorage-c03.body.md",
"bodySha256": "312a9f62755da6aaf53659e2351426c10169b541b543ad429d5699960b1e3353",
"assets": [
{
"key": "adapter-outbound-objectstorage-c03",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c53": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c53",
"title": "가드의 존재가 곧 테넌트 격리 보장은 아니다",
"topic": "security-and-trust-boundaries",
"path": "concept/concept-adapter-outbound-persistence-jpa-c53.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c53",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "197ddaebc466e82902fc1d5323ebe21b9b7e2f155b5c4f56b3a97179c66f81e7",
"lines": 32,
"body": "concept/concept-adapter-outbound-persistence-jpa-c53.body.md",
"bodySha256": "bf47a2d25eb2a18af452336cc90968f2aaaaed663cf5ab382b94940f74da7ee0",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c53",
"kind": "terminal"
}
]
},
"adapter-outbound-support-c03": {
"kind": "CONCEPT",
"slug": "adapter-outbound-support-c03",
"title": "로그 마스킹은 PII 차단 보장을 복구하지 않는다",
"topic": "security-and-trust-boundaries",
"path": "concept/concept-adapter-outbound-support-c03.md",
"rootTreeNode": "concept:adapter-outbound-support-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "747d585baa4b08e8f151d41dca4e1891ef3d40bbe616e1ae3b039f29954cd049",
"lines": 36,
"body": "concept/concept-adapter-outbound-support-c03.body.md",
"bodySha256": "1c7db089d35a90956e52d8928885292105ef5c1524117f71e7d56491ab97f962",
"assets": [
{
"key": "adapter-outbound-support-c03",
"kind": "terminal"
}
]
},
"adapter-outbound-support-c05": {
"kind": "CONCEPT",
"slug": "adapter-outbound-support-c05",
"title": "outbound 어댑터끼리는 support를 통해서만 공유한다",
"topic": "security-and-trust-boundaries",
"path": "concept/concept-adapter-outbound-support-c05.md",
"rootTreeNode": "concept:adapter-outbound-support-c05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "c8b84c042b764ba3312e4132333f6fb2d41e90ebc7bafe36a868e98a0fb0c3e2",
"lines": 36,
"body": "concept/concept-adapter-outbound-support-c05.body.md",
"bodySha256": "780d13db1a89e198320d201abecb3777db2b24579e383fa855db858277501c87",
"assets": [
{
"key": "adapter-outbound-support-c05",
"kind": "terminal"
}
]
},
"app-bootstrap-c05": {
"kind": "CONCEPT",
"slug": "app-bootstrap-c05",
"title": "레지스트리 계약 테스트가 실제 파일을 읽어 대조한다",
"topic": "security-and-trust-boundaries",
"path": "concept/concept-app-bootstrap-c05.md",
"rootTreeNode": "concept:app-bootstrap-c05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d6bddc6aeaa27113bc5e3279dca93e498d927142859a2e3e4261ed2aa6f96b10",
"lines": 28,
"body": "concept/concept-app-bootstrap-c05.body.md",
"bodySha256": "93a48b0c43fddfc30e395da8ed16cbad34c2069c20788b80bfb188c7770e4107",
"assets": [
{
"key": "app-bootstrap-c05",
"kind": "terminal"
}
]
},
"application-core-c02": {
"kind": "CONCEPT",
"slug": "application-core-c02",
"title": "권한 판정과 객체 접근 판정을 분리한다",
"topic": "security-and-trust-boundaries",
"path": "concept/concept-application-core-c02.md",
"rootTreeNode": "concept:application-core-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "3176abd1e4d914ace4babc8addba9965d9d68f53d31b4123440625a08dc00344",
"lines": 40,
"body": "concept/concept-application-core-c02.body.md",
"bodySha256": "0a831f057aec65c0ff73798cb2d1a14495d8335ac98eae211d1292e99bbe7481",
"assets": [
{
"key": "application-core-c02-diagram",
"kind": "diagram"
},
{
"key": "application-core-c02",
"kind": "terminal"
}
]
},
"grpc-advanced-bootstrap-c03": {
"kind": "CONCEPT",
"slug": "grpc-advanced-bootstrap-c03",
"title": "승격 게이트는 능력마다 따로 기록된 증거를 본다",
"topic": "security-and-trust-boundaries",
"path": "concept/concept-grpc-advanced-bootstrap-c03.md",
"rootTreeNode": "concept:grpc-advanced-bootstrap-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "03e3686c7a22fa6e628fd56368b94581c8245516b44c7860806237f6f448d845",
"lines": 36,
"body": "concept/concept-grpc-advanced-bootstrap-c03.body.md",
"bodySha256": "ec870e87611632c8507135411abd6c251db7acc87cddfc151d5b29bc292f1a29",
"assets": [
{
"key": "grpc-advanced-bootstrap-c03",
"kind": "terminal"
}
]
},
"grpc-advanced-diagnostics-c01": {
"kind": "CONCEPT",
"slug": "grpc-advanced-diagnostics-c01",
"title": "Channelz는 유용해서 위험한 표면이다",
"topic": "security-and-trust-boundaries",
"path": "concept/concept-grpc-advanced-diagnostics-c01.md",
"rootTreeNode": "concept:grpc-advanced-diagnostics-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d0350f4cb15c755147fbc3026a9639032275ed00812855b09ab97cf1133367d5",
"lines": 32,
"body": "concept/concept-grpc-advanced-diagnostics-c01.body.md",
"bodySha256": "248dcddf8bf78afcbb4eed80da0763371aff80ca429a6c7f942897c8b2727342",
"assets": [
{
"key": "grpc-advanced-diagnostics-c01-diagram",
"kind": "diagram"
},
{
"key": "grpc-advanced-diagnostics-c01",
"kind": "terminal"
}
]
},
"grpc-observability-c01": {
"kind": "CONCEPT",
"slug": "grpc-observability-c01",
"title": "논리 RPC와 물리 시도와 스트림 수명주기를 구별한다",
"topic": "security-and-trust-boundaries",
"path": "concept/concept-grpc-observability-c01.md",
"rootTreeNode": "concept:grpc-observability-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "c95e380648931009b5e1ec58cd2afaed8342f8b1bca7563433867dc3caff3bc5",
"lines": 32,
"body": "concept/concept-grpc-observability-c01.body.md",
"bodySha256": "626af1937e13ca1b53975d4b0928250e75d8109661249bdadcb84362d357de9b",
"assets": [
{
"key": "grpc-observability-c01-diagram",
"kind": "diagram"
},
{
"key": "grpc-observability-c01",
"kind": "terminal"
}
]
},
"grpc-spring-boot-starter-c01": {
"kind": "CONCEPT",
"slug": "grpc-spring-boot-starter-c01",
"title": "Advanced 의존 금지를 세 겹으로 강제한다",
"topic": "security-and-trust-boundaries",
"path": "concept/concept-grpc-spring-boot-starter-c01.md",
"rootTreeNode": "concept:grpc-spring-boot-starter-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "1abd35697753e907133dd492729f1ff5acec809ed41bb592daddf4c460c6fb14",
"lines": 32,
"body": "concept/concept-grpc-spring-boot-starter-c01.body.md",
"bodySha256": "e22cbdf314e981399b7055e5ef874ce5d123d85011cec47f9ec09ce7d14777a3",
"assets": [
{
"key": "grpc-spring-boot-starter-c01-diagram",
"kind": "diagram"
},
{
"key": "grpc-spring-boot-starter-c01",
"kind": "terminal"
}
]
},
"messaging-admin-api-c02": {
"kind": "CONCEPT",
"slug": "messaging-admin-api-c02",
"title": "부팅된 애플리케이션에서 살아나는 타입은 둘뿐이다",
"topic": "security-and-trust-boundaries",
"path": "concept/concept-messaging-admin-api-c02.md",
"rootTreeNode": "concept:messaging-admin-api-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0bdf5ff50eaaeb7e3edaba68c8d437dbdae91081eb8d3f1bd8e3262db280f839",
"lines": 36,
"body": "concept/concept-messaging-admin-api-c02.body.md",
"bodySha256": "b01020b16152b020168bf90a476793b9e5378b534576877b31a521a804937a6c",
"assets": [
{
"key": "messaging-admin-api-c02",
"kind": "terminal"
}
]
},
"messaging-admin-api-c05": {
"kind": "CONCEPT",
"slug": "messaging-admin-api-c05",
"title": "인가 실패와 프로그래밍 오류를 예외 타입으로 가른다",
"topic": "security-and-trust-boundaries",
"path": "concept/concept-messaging-admin-api-c05.md",
"rootTreeNode": "concept:messaging-admin-api-c05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "26edcdd2bee77de3d4da9ee027e64abbb0fbe4c42c89892ed6b1f1815e3fff68",
"lines": 36,
"body": "concept/concept-messaging-admin-api-c05.body.md",
"bodySha256": "3739870a78c91202980bc4fb6d5a3617d931c5f6934e5cce1ce5e6b0640c3c63",
"assets": [
{
"key": "messaging-admin-api-c05",
"kind": "terminal"
}
]
},
"messaging-rabbit-c02": {
"kind": "CONCEPT",
"slug": "messaging-rabbit-c02",
"title": "자격증명은 연결 시도마다 해석된다",
"topic": "security-and-trust-boundaries",
"path": "concept/concept-messaging-rabbit-c02.md",
"rootTreeNode": "concept:messaging-rabbit-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e3196b60059e9645c4c7edb38ae9778b194ddd00a4dcd8199c40153734353450",
"lines": 32,
"body": "concept/concept-messaging-rabbit-c02.body.md",
"bodySha256": "311530309494571a52bfea8203d205f968a055efe651f647a297df1bd57f224b",
"assets": [
{
"key": "messaging-rabbit-c02",
"kind": "terminal"
}
]
},
"adapter-inbound-web-c01": {
"kind": "CONCEPT",
"slug": "adapter-inbound-web-c01",
"title": "상호배타성이 프로퍼티가 아니라 타입에서 온다",
"topic": "capability-and-disclosure-models",
"path": "concept/concept-adapter-inbound-web-c01.md",
"rootTreeNode": "concept:adapter-inbound-web-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0a10628c1dd47da1aaab9439470bae2c6b4824b1481381c580ccab37311c6c43",
"lines": 36,
"body": "concept/concept-adapter-inbound-web-c01.body.md",
"bodySha256": "f264a2e02f6592ad9ee64fc4462c07805fedab204adc4d0609a4420bf3e7b7a9",
"assets": [
{
"key": "adapter-inbound-web-c01-diagram",
"kind": "diagram"
},
{
"key": "adapter-inbound-web-c01",
"kind": "terminal"
}
]
},
"adapter-inbound-web-c17": {
"kind": "CONCEPT",
"slug": "adapter-inbound-web-c17",
"title": "ndjson 스위치 하나가 두 능력을 함께 켠다",
"topic": "capability-and-disclosure-models",
"path": "concept/concept-adapter-inbound-web-c17.md",
"rootTreeNode": "concept:adapter-inbound-web-c17",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "82abb0a18206836bb0c639369fb7acf3783dc0264c948efc0eb32312bd0a4819",
"lines": 32,
"body": "concept/concept-adapter-inbound-web-c17.body.md",
"bodySha256": "1b4cd06c5ce3427c743c43d82422b00937f01c5861744e043796ef63b11eec60",
"assets": [
{
"key": "adapter-inbound-web-c17",
"kind": "terminal"
}
]
},
"adapter-outbound-objectstorage-c01": {
"kind": "CONCEPT",
"slug": "adapter-outbound-objectstorage-c01",
"title": "컴파일이 전부 끝난 뒤에야 생성이 시작된다",
"topic": "capability-and-disclosure-models",
"path": "concept/concept-adapter-outbound-objectstorage-c01.md",
"rootTreeNode": "concept:adapter-outbound-objectstorage-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "7274efd0027c99971d406bd9c00a9a3fa8ac787f8ac8dbbd79870ade08300db5",
"lines": 40,
"body": "concept/concept-adapter-outbound-objectstorage-c01.body.md",
"bodySha256": "1f3f279479d9930e3c14ac6aacb18651df5a070fc76597a7b6fe86ff3e10d90a",
"assets": [
{
"key": "adapter-outbound-objectstorage-c01-diagram",
"kind": "diagram"
},
{
"key": "adapter-outbound-objectstorage-c01",
"kind": "terminal"
}
]
},
"adapter-outbound-objectstorage-c08": {
"kind": "CONCEPT",
"slug": "adapter-outbound-objectstorage-c08",
"title": "레지스트리가 덮는 것은 문서 주장이고 설정 경로가 아니다",
"topic": "capability-and-disclosure-models",
"path": "concept/concept-adapter-outbound-objectstorage-c08.md",
"rootTreeNode": "concept:adapter-outbound-objectstorage-c08",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "670365718117578f97c16093de312e9c82508622e46196b6f11890cc66e3951a",
"lines": 36,
"body": "concept/concept-adapter-outbound-objectstorage-c08.body.md",
"bodySha256": "dcb0f14054471ad049829affc10613b123195cfeca354fbd8b45bdd86f944fb9",
"assets": [
{
"key": "adapter-outbound-objectstorage-c08",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c24": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c24",
"title": "질의 계층은 프레임워크가 아니라 세 단계의 정책층이다",
"topic": "capability-and-disclosure-models",
"path": "concept/concept-adapter-outbound-persistence-jpa-c24.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c24",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f7613898f95b4d7251e7b97c58ff96d8298d394d5c0d86b99f68f1306c6a266f",
"lines": 32,
"body": "concept/concept-adapter-outbound-persistence-jpa-c24.body.md",
"bodySha256": "ead2a21a2580ddc7a841feea7754d55def09d7631ffaa07d3e161080533ee39f",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c24-diagram",
"kind": "diagram"
},
{
"key": "adapter-outbound-persistence-jpa-c24",
"kind": "terminal"
}
]
},
"app-bootstrap-c01": {
"kind": "CONCEPT",
"slug": "app-bootstrap-c01",
"title": "세 환경 검증기의 관심사가 서로 다르다",
"topic": "capability-and-disclosure-models",
"path": "concept/concept-app-bootstrap-c01.md",
"rootTreeNode": "concept:app-bootstrap-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f56cd31296242addb11a19802c94bc9a1e95d0cc5ff3b64f6b8711d3990938bb",
"lines": 32,
"body": "concept/concept-app-bootstrap-c01.body.md",
"bodySha256": "32d9897b7d200e549796b79e413d0e02a5bb2b4ea52691417bf9a7509e7e13bf",
"assets": [
{
"key": "app-bootstrap-c01",
"kind": "terminal"
}
]
},
"app-bootstrap-c02": {
"kind": "CONCEPT",
"slug": "app-bootstrap-c02",
"title": "런타임 멤버십이 결정하는 어댑터 활성화 스위치 범위",
"topic": "capability-and-disclosure-models",
"path": "concept/concept-app-bootstrap-c02.md",
"rootTreeNode": "concept:app-bootstrap-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "cebdca2a939f9eb80973c4cbd0bd5b514e25dd654ec1db6f3c9363a239aa68a9",
"lines": 36,
"body": "concept/concept-app-bootstrap-c02.body.md",
"bodySha256": "73a04efbb0c5bd327ecd32db34366963c9f54764e713c4545f7213c2c8d76884",
"assets": [
{
"key": "app-bootstrap-c02",
"kind": "terminal"
}
]
},
"app-bootstrap-c03": {
"kind": "CONCEPT",
"slug": "app-bootstrap-c03",
"title": ".imports 여섯 줄 중 다섯이 능력 루트다",
"topic": "capability-and-disclosure-models",
"path": "concept/concept-app-bootstrap-c03.md",
"rootTreeNode": "concept:app-bootstrap-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f105875637691a34ded820ab51a20048baeefed8fdd67fa816a066382790b7c3",
"lines": 32,
"body": "concept/concept-app-bootstrap-c03.body.md",
"bodySha256": "94bc49528e381efc212888b3856cc2ff1aec32ffcb998fae3efd2bba77e45d82",
"assets": [
{
"key": "app-bootstrap-c03",
"kind": "terminal"
}
]
},
"grpc-advanced-diagnostics-c02": {
"kind": "CONCEPT",
"slug": "grpc-advanced-diagnostics-c02",
"title": "진단 열람은 망 게이트와 역할 게이트를 함께 요구한다",
"topic": "capability-and-disclosure-models",
"path": "concept/concept-grpc-advanced-diagnostics-c02.md",
"rootTreeNode": "concept:grpc-advanced-diagnostics-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "587ba82d77890b8a82030bb68f40d6cd1e054b530960799080109dcda91d8b28",
"lines": 32,
"body": "concept/concept-grpc-advanced-diagnostics-c02.body.md",
"bodySha256": "e4b8c75a5b73acbabd468ef8bd6fd0d600e3a0bca8f6d772a9210ef859b0d285",
"assets": [
{
"key": "grpc-advanced-diagnostics-c02-diagram",
"kind": "diagram"
},
{
"key": "grpc-advanced-diagnostics-c02",
"kind": "terminal"
}
]
},
"messaging-kafka-share-experimental-c07": {
"kind": "CONCEPT",
"slug": "messaging-kafka-share-experimental-c07",
"title": "이전 결함 대신 막으려는 것 셋을 적는다",
"topic": "capability-and-disclosure-models",
"path": "concept/concept-messaging-kafka-share-experimental-c07.md",
"rootTreeNode": "concept:messaging-kafka-share-experimental-c07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "0044b6dca44c225add7256fc0b51a492a81e35b9363cd267784d2c585ff313ad",
"lines": 32,
"body": "concept/concept-messaging-kafka-share-experimental-c07.body.md",
"bodySha256": "1b22eb797fbc7f5394383bf784aa4a5773b9d12006f5dfa0502cc4a3fa61860c",
"assets": [
{
"key": "messaging-kafka-share-experimental-c07",
"kind": "terminal"
}
]
},
"messaging-testkit-c05": {
"kind": "CONCEPT",
"slug": "messaging-testkit-c05",
"title": "등급을 판정하는 경로가 증거를 만드는 경로 없이도 돈다",
"topic": "capability-and-disclosure-models",
"path": "concept/concept-messaging-testkit-c05.md",
"rootTreeNode": "concept:messaging-testkit-c05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "461a50d27d30fcccfc010da2963575dfed0e339a5e9becf8bcf364315b10ce9d",
"lines": 40,
"body": "concept/concept-messaging-testkit-c05.body.md",
"bodySha256": "7c7f299a29926053098a9831adfc8677bd229cb41977c532387af1ed4c6bd841",
"assets": [
{
"key": "messaging-testkit-c05",
"kind": "terminal"
}
]
},
"adapter-inbound-graphql-c10": {
"kind": "CONCEPT",
"slug": "adapter-inbound-graphql-c10",
"title": "자동설정이 참조하는 것은 58개 파일 중 둘이다",
"topic": "query-and-pagination-models",
"path": "concept/concept-adapter-inbound-graphql-c10.md",
"rootTreeNode": "concept:adapter-inbound-graphql-c10",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "1cecfd741a8818b4ba99131d0645544c5c61c4f2bf2c85fd718e5bffc9d6a5c8",
"lines": 32,
"body": "concept/concept-adapter-inbound-graphql-c10.body.md",
"bodySha256": "3694c5c35b27f0d340b061660275a30cef5a340a636f96d0996e4ed545bebfaa",
"assets": [
{
"key": "adapter-inbound-graphql-c10-diagram",
"kind": "diagram"
},
{
"key": "adapter-inbound-graphql-c10",
"kind": "terminal"
}
]
},
"adapter-inbound-web-c06": {
"kind": "CONCEPT",
"slug": "adapter-inbound-web-c06",
"title": "durable-operation 게이트는 켤 수 없고 켜면 부팅이 실패한다",
"topic": "query-and-pagination-models",
"path": "concept/concept-adapter-inbound-web-c06.md",
"rootTreeNode": "concept:adapter-inbound-web-c06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "895d4a05da3f8e08eacb37428573b89cdfb30477f78268121ebf9ebd1bfde860",
"lines": 32,
"body": "concept/concept-adapter-inbound-web-c06.body.md",
"bodySha256": "c7239c05602a251ed9eb07bd6aa1c6b465b729f22ccc9b8c5a58243d05af3364",
"assets": [
{
"key": "adapter-inbound-web-c06",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c27": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c27",
"title": "JpaRepositoryFragmentSupport는 CRUD가 아니라 실행 정책이다",
"topic": "query-and-pagination-models",
"path": "concept/concept-adapter-outbound-persistence-jpa-c27.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c27",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "9d09d00a83cee022b2f19d1b5785760c31fff4697bea7279fc342478c0b3de08",
"lines": 32,
"body": "concept/concept-adapter-outbound-persistence-jpa-c27.body.md",
"bodySha256": "574229188a8e0c648e6597b0aa932e4bd9edf0b09abdc64dcaea8f74c60f85c6",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c27",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c28": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c28",
"title": "KeysetPredicateBuilder가 만드는 것은 사전식 술어다",
"topic": "query-and-pagination-models",
"path": "concept/concept-adapter-outbound-persistence-jpa-c28.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c28",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "76f6405e728f18d61ecb98a33583926936f8c888a80398011859548dc6bc5edd",
"lines": 36,
"body": "concept/concept-adapter-outbound-persistence-jpa-c28.body.md",
"bodySha256": "6aaf401ec233cae3b0464ec07907e25990c812688c3a571f5223557ccc3e6512",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c28",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c29": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c29",
"title": "size + 1로 hasNext를 판정하고 COUNT를 없앤다",
"topic": "query-and-pagination-models",
"path": "concept/concept-adapter-outbound-persistence-jpa-c29.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c29",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "43ba1d5479928eee70a8014b58c81a0d2f437e6aa5905c9370a1eb2f7c596162",
"lines": 36,
"body": "concept/concept-adapter-outbound-persistence-jpa-c29.body.md",
"bodySha256": "d2f5439370ed76433f0275b27d85e9aa2686ce2ddd7e5fbe88de12c1d1b1e95e",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c29",
"kind": "terminal"
}
]
},
"application-core-c01": {
"kind": "CONCEPT",
"slug": "application-core-c01",
"title": "application-core가 아는 유일한 프로젝트 의존은 shared-contract다",
"topic": "query-and-pagination-models",
"path": "concept/concept-application-core-c01.md",
"rootTreeNode": "concept:application-core-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e23914d6d95fb019ac76af5b99e041054fdd89fc3d18883a725339745429e7b5",
"lines": 40,
"body": "concept/concept-application-core-c01.body.md",
"bodySha256": "172f56305937f48df5db84b57011f3fb900edad4ce804d6e3b13fe08d9a1c36a",
"assets": [
{
"key": "application-core-c01-diagram",
"kind": "diagram"
},
{
"key": "application-core-c01",
"kind": "terminal"
}
]
},
"adapter-inbound-web-c15": {
"kind": "CONCEPT",
"slug": "adapter-inbound-web-c15",
"title": "상관 식별자를 만드는 필터가 세 벌이다",
"topic": "observability-models",
"path": "concept/concept-adapter-inbound-web-c15.md",
"rootTreeNode": "concept:adapter-inbound-web-c15",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d500ae1c645210505c9c62878649317073ff96c64c5ec36c9425806f45da70bc",
"lines": 32,
"body": "concept/concept-adapter-inbound-web-c15.body.md",
"bodySha256": "840acbbc98c286add6cdf49accaf71a31b20dd58ed28b166c31ff73219ce121d",
"assets": [
{
"key": "adapter-inbound-web-c15",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c44": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c44",
"title": "manual audit 경로만 조립되고 Spring Data auditing은 dormant다",
"topic": "observability-models",
"path": "concept/concept-adapter-outbound-persistence-jpa-c44.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c44",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "080f707c59130e3ac42a816e471f48b8d25287662513fb934da513777dbf378d",
"lines": 28,
"body": "concept/concept-adapter-outbound-persistence-jpa-c44.body.md",
"bodySha256": "20004222e266f7bde0135a986ab4a448f3f96d9df0f7670076c2730ba8ff6e99",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c44",
"kind": "terminal"
}
]
},
"adapter-outbound-support-c02": {
"kind": "CONCEPT",
"slug": "adapter-outbound-support-c02",
"title": "FailOpenDependencyLogger는 실패 정책을 정하지 않는다",
"topic": "observability-models",
"path": "concept/concept-adapter-outbound-support-c02.md",
"rootTreeNode": "concept:adapter-outbound-support-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "4655da073db17430db02ccc7449f1596cc837a7f21408263969dac723f30e48a",
"lines": 32,
"body": "concept/concept-adapter-outbound-support-c02.body.md",
"bodySha256": "0f6c2e565dfaad0b20d1a978b6d0bf698f598757e20bd96f8a36397af5a6b51a",
"assets": [
{
"key": "adapter-outbound-support-c02-diagram",
"kind": "diagram"
},
{
"key": "adapter-outbound-support-c02",
"kind": "terminal"
}
]
},
"adapter-outbound-support-c06": {
"kind": "CONCEPT",
"slug": "adapter-outbound-support-c06",
"title": "두 게이트가 증명하는 것과 증명하지 않는 것",
"topic": "observability-models",
"path": "concept/concept-adapter-outbound-support-c06.md",
"rootTreeNode": "concept:adapter-outbound-support-c06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "f9e64bffe77c91e6b8277b791c39069ef3fa8f5f4abedffb0fcf49fd9ee0e09b",
"lines": 32,
"body": "concept/concept-adapter-outbound-support-c06.body.md",
"bodySha256": "61906f98ed8fb3e78e21ba5b9a649eeb3d484b9f523a4f6fc8be71cdd57174a3",
"assets": [
{
"key": "adapter-outbound-support-c06",
"kind": "terminal"
}
]
},
"grpc-observability-c03": {
"kind": "CONCEPT",
"slug": "grpc-observability-c03",
"title": "allowlist가 기본 거절이고 거절 목록은 메시지를 위한 것이다",
"topic": "observability-models",
"path": "concept/concept-grpc-observability-c03.md",
"rootTreeNode": "concept:grpc-observability-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "011db1780624aa1945cf362c189d7b37667841d9c229cfef26cb6662af1c593e",
"lines": 44,
"body": "concept/concept-grpc-observability-c03.body.md",
"bodySha256": "06a17dc60ceaa2fbc468d1df17d3e17406faf6db157a386c7a70cd0215ac70a6",
"assets": [
{
"key": "grpc-observability-c03",
"kind": "terminal"
}
]
},
"messaging-admin-runtime-c05": {
"kind": "CONCEPT",
"slug": "messaging-admin-runtime-c05",
"title": "실패 사유가 저널에도 감사 이벤트에도 남지 않는다",
"topic": "observability-models",
"path": "concept/concept-messaging-admin-runtime-c05.md",
"rootTreeNode": "concept:messaging-admin-runtime-c05",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "415cf92ec62a8dc92187b690b96292d052e0f9bffd3882e2cfb07d9b39c9a9a8",
"lines": 32,
"body": "concept/concept-messaging-admin-runtime-c05.body.md",
"bodySha256": "d179a49bc4318a274e33ff208bb9430ea651e3a665b38da3fcd49c43e8042d27",
"assets": [
{
"key": "messaging-admin-runtime-c05",
"kind": "terminal"
}
]
},
"messaging-observability-c02": {
"kind": "CONCEPT",
"slug": "messaging-observability-c02",
"title": "재료 둘만 bean으로 있고 그것을 조립하는 것이 없다",
"topic": "observability-models",
"path": "concept/concept-messaging-observability-c02.md",
"rootTreeNode": "concept:messaging-observability-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e44bff7c1ae7f55891eea76358982ff69bff0ea9a6b62060fa8cd29c654d0c41",
"lines": 36,
"body": "concept/concept-messaging-observability-c02.body.md",
"bodySha256": "173e24dcdc6660b4f2206f97a107cbae69fde4b54c40f99a2824a06096b9a0f6",
"assets": [
{
"key": "messaging-observability-c02",
"kind": "terminal"
}
]
},
"adapter-inbound-graphql-c03": {
"kind": "CONCEPT",
"slug": "adapter-inbound-graphql-c03",
"title": "미배선 인터셉터는 누락이 아니라 중복이다",
"topic": "composition-and-lifecycle-models",
"path": "concept/concept-adapter-inbound-graphql-c03.md",
"rootTreeNode": "concept:adapter-inbound-graphql-c03",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b89d05e843a2378a3ba3a57a77261648abdacf82a3579e0605f411c38b27d13f",
"lines": 36,
"body": "concept/concept-adapter-inbound-graphql-c03.body.md",
"bodySha256": "715eaabb9982ba0ced6763571e4308e1cb3aa788391b838bb2907d306ce6c781",
"assets": [
{
"key": "adapter-inbound-graphql-c03",
"kind": "terminal"
}
]
},
"adapter-inbound-graphql-c06": {
"kind": "CONCEPT",
"slug": "adapter-inbound-graphql-c06",
"title": "매니페스트 조회를 설계했는데 단일 빈이 대신 주입된다",
"topic": "composition-and-lifecycle-models",
"path": "concept/concept-adapter-inbound-graphql-c06.md",
"rootTreeNode": "concept:adapter-inbound-graphql-c06",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "eafd783fc072037e1df9b1ca9174e70aaf1d92e1fd4d5882dde6f36cd5ff6527",
"lines": 36,
"body": "concept/concept-adapter-inbound-graphql-c06.body.md",
"bodySha256": "c9f828249f6fd8029c68cef5be35c78f3c1de062ccf53899954964db516d438c",
"assets": [
{
"key": "adapter-inbound-graphql-c06",
"kind": "terminal"
}
]
},
"adapter-inbound-graphql-c09": {
"kind": "CONCEPT",
"slug": "adapter-inbound-graphql-c09",
"title": "선언한 전송 프로파일과 실제 응답을 만드는 쪽이 다르다",
"topic": "composition-and-lifecycle-models",
"path": "concept/concept-adapter-inbound-graphql-c09.md",
"rootTreeNode": "concept:adapter-inbound-graphql-c09",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "fc9c800fe376dd5552ea1e742ba0584c6e4a0192353e15acfe5c39fc6e00f063",
"lines": 40,
"body": "concept/concept-adapter-inbound-graphql-c09.body.md",
"bodySha256": "e0e6ecc77aac352ba6ef05557523be935743d36ed7ea1bc44efbb2cbe8a57713",
"assets": [
{
"key": "adapter-inbound-graphql-c09-diagram",
"kind": "diagram"
},
{
"key": "adapter-inbound-graphql-c09",
"kind": "terminal"
}
]
},
"adapter-inbound-web-c02": {
"kind": "CONCEPT",
"slug": "adapter-inbound-web-c02",
"title": "실패를 보여 준 적 없는 경계 테스트는 잘못된 디렉터리를 스캔한 것과 구별되지 않는다",
"topic": "composition-and-lifecycle-models",
"path": "concept/concept-adapter-inbound-web-c02.md",
"rootTreeNode": "concept:adapter-inbound-web-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "a2e4dbf70153150c0ae392e69cf1131b75416f334071256c6d13e652461d7637",
"lines": 40,
"body": "concept/concept-adapter-inbound-web-c02.body.md",
"bodySha256": "2cb3bbeb10baa7adda943a6de3802435dd2f2f6493d62ead70d50489fabfac1e",
"assets": [
{
"key": "adapter-inbound-web-c02",
"kind": "terminal"
}
]
},
"adapter-inbound-web-c12": {
"kind": "CONCEPT",
"slug": "adapter-inbound-web-c12",
"title": "compileOnly로 막았지만 컨버터를 등록하는 코드도 없다",
"topic": "composition-and-lifecycle-models",
"path": "concept/concept-adapter-inbound-web-c12.md",
"rootTreeNode": "concept:adapter-inbound-web-c12",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "2be515859b7127b386b76a4e63b93f4d4e2c56285e405e92df1ff611c4a5e7b8",
"lines": 32,
"body": "concept/concept-adapter-inbound-web-c12.body.md",
"bodySha256": "5c3b71738d5ae79485bbf7ab8b6b7367a1346942adce9ea73e6a5db566fed1f3",
"assets": [
{
"key": "adapter-inbound-web-c12",
"kind": "terminal"
}
]
},
"adapter-inbound-web-c13": {
"kind": "CONCEPT",
"slug": "adapter-inbound-web-c13",
"title": "나중에 도는 필터가 클라이언트 값으로 덮어쓴다",
"topic": "composition-and-lifecycle-models",
"path": "concept/concept-adapter-inbound-web-c13.md",
"rootTreeNode": "concept:adapter-inbound-web-c13",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e4b05e14e43d7a841271e56cf94373c8c25bd4a9332ce73467cc5511c4ad18db",
"lines": 32,
"body": "concept/concept-adapter-inbound-web-c13.body.md",
"bodySha256": "7366884dfbfac32421bb5ffbd3d709e445f00009b05a1537b1b89bda8cd16e1a",
"assets": [
{
"key": "adapter-inbound-web-c13",
"kind": "terminal"
}
]
},
"adapter-inbound-websocket-c01": {
"kind": "CONCEPT",
"slug": "adapter-inbound-websocket-c01",
"title": "세 설정 접두사 중 하나에 소비자가 없다",
"topic": "composition-and-lifecycle-models",
"path": "concept/concept-adapter-inbound-websocket-c01.md",
"rootTreeNode": "concept:adapter-inbound-websocket-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "eefc129fc9007eec9126a066cb3ae70b7047b70f16d7de7f81f260ff802de5f5",
"lines": 36,
"body": "concept/concept-adapter-inbound-websocket-c01.body.md",
"bodySha256": "a5a6c5c35206dd99d03891e759a5c872e2dfa48b6cc3688eddbd52731b851229",
"assets": [
{
"key": "adapter-inbound-websocket-c01-diagram",
"kind": "diagram"
},
{
"key": "adapter-inbound-websocket-c01",
"kind": "terminal"
}
]
},
"adapter-outbound-cache-redis-c01": {
"kind": "CONCEPT",
"slug": "adapter-outbound-cache-redis-c01",
"title": "꺼져 있을 때 아무것도 기여하지 않는다는 말이 문자 그대로다",
"topic": "composition-and-lifecycle-models",
"path": "concept/concept-adapter-outbound-cache-redis-c01.md",
"rootTreeNode": "concept:adapter-outbound-cache-redis-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "9b14a6ce25ebf569ef1eceeedc846e0e740801897d861d3b24f1022b8ddd2837",
"lines": 36,
"body": "concept/concept-adapter-outbound-cache-redis-c01.body.md",
"bodySha256": "25ed65addb0b1764d222f66b8953751b29007821eec652bae216070d47705bcf",
"assets": [
{
"key": "adapter-outbound-cache-redis-c01-diagram",
"kind": "diagram"
},
{
"key": "adapter-outbound-cache-redis-c01",
"kind": "terminal"
}
]
},
"adapter-outbound-cache-redis-c02": {
"kind": "CONCEPT",
"slug": "adapter-outbound-cache-redis-c02",
"title": "기본값이 가리키는 리소스가 없고 그것이 시작 실패로 잡힌다",
"topic": "composition-and-lifecycle-models",
"path": "concept/concept-adapter-outbound-cache-redis-c02.md",
"rootTreeNode": "concept:adapter-outbound-cache-redis-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "76d2f018fdde2d7c2ef3d56da266635326d87294406538bf064fd82fa6159aab",
"lines": 36,
"body": "concept/concept-adapter-outbound-cache-redis-c02.body.md",
"bodySha256": "c43e062ab921b0b1131749dde11491cbcf18d0cf27f0013e60e65672ca4564e4",
"assets": [
{
"key": "adapter-outbound-cache-redis-c02",
"kind": "terminal"
}
]
},
"adapter-outbound-fileserver-c01": {
"kind": "CONCEPT",
"slug": "adapter-outbound-fileserver-c01",
"title": "적재는 import filter가 아니라 명시적 component scan이다",
"topic": "composition-and-lifecycle-models",
"path": "concept/concept-adapter-outbound-fileserver-c01.md",
"rootTreeNode": "concept:adapter-outbound-fileserver-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "bd884547a7b78cde69c761712b2fa6fb489a6ba722539da2b029f274cd58399b",
"lines": 36,
"body": "concept/concept-adapter-outbound-fileserver-c01.body.md",
"bodySha256": "0174d0e8fb14e829589beeb08fa44b9eb7b31c0b5f25a29f079b75a93a3a421c",
"assets": [
{
"key": "adapter-outbound-fileserver-c01",
"kind": "terminal"
}
]
},
"adapter-outbound-notification-c01": {
"kind": "CONCEPT",
"slug": "adapter-outbound-notification-c01",
"title": "이름 없던 상태에 이름을 붙인 세 자리",
"topic": "composition-and-lifecycle-models",
"path": "concept/concept-adapter-outbound-notification-c01.md",
"rootTreeNode": "concept:adapter-outbound-notification-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b2dbcb0742c4a444984dc55f2db92a3daf5926696e84d5d609cb75ef196cc7c1",
"lines": 40,
"body": "concept/concept-adapter-outbound-notification-c01.body.md",
"bodySha256": "79281187cb2dd2704a41c7de2fcc51937aec21b80edd3d1c37d741d381917147",
"assets": [
{
"key": "adapter-outbound-notification-c01-diagram",
"kind": "diagram"
},
{
"key": "adapter-outbound-notification-c01",
"kind": "terminal"
}
]
},
"adapter-outbound-notification-c02": {
"kind": "CONCEPT",
"slug": "adapter-outbound-notification-c02",
"title": "같은 종료 절차를 쓰지만 대상이 다르다",
"topic": "composition-and-lifecycle-models",
"path": "concept/concept-adapter-outbound-notification-c02.md",
"rootTreeNode": "concept:adapter-outbound-notification-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "14e5c3e0e0a9169a2a6c3e2152723902cdb758e13bae6f6a90bbd873952ba1e5",
"lines": 36,
"body": "concept/concept-adapter-outbound-notification-c02.body.md",
"bodySha256": "855e914937f1a96d54e02d1dd737acbb0b1c7611fa267d31cca392a41fb8bfc1",
"assets": [
{
"key": "adapter-outbound-notification-c02",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-jpa-c56": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-jpa-c56",
"title": "항상 설치되는 스캔이 opt-in package를 끌고 오지 않는다",
"topic": "composition-and-lifecycle-models",
"path": "concept/concept-adapter-outbound-persistence-jpa-c56.md",
"rootTreeNode": "concept:adapter-outbound-persistence-jpa-c56",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b9aca44094d37f0dd6d5b412992947ec588447e0c06a525435bcfe898283e633",
"lines": 36,
"body": "concept/concept-adapter-outbound-persistence-jpa-c56.body.md",
"bodySha256": "bd65e7086a24446867b68cd9ca6acbc34e14f66fcdc76918f670d330031cf4e2",
"assets": [
{
"key": "adapter-outbound-persistence-jpa-c56-diagram",
"kind": "diagram"
},
{
"key": "adapter-outbound-persistence-jpa-c56",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-mongo-c01": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-mongo-c01",
"title": "네 겹이 같은 스위치를 읽고 각각 다른 실패를 막는다",
"topic": "composition-and-lifecycle-models",
"path": "concept/concept-adapter-outbound-persistence-mongo-c01.md",
"rootTreeNode": "concept:adapter-outbound-persistence-mongo-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "7aba8610f230866405a114b9d1ed7f7e5fd4877176153b0b1b25d6767a611f68",
"lines": 40,
"body": "concept/concept-adapter-outbound-persistence-mongo-c01.body.md",
"bodySha256": "81b9be758b0b994b7f91a192f02e79d758c3b8f13231e02be76354764a41cbad",
"assets": [
{
"key": "adapter-outbound-persistence-mongo-c01-diagram",
"kind": "diagram"
},
{
"key": "adapter-outbound-persistence-mongo-c01",
"kind": "terminal"
}
]
},
"adapter-outbound-persistence-mongo-c08": {
"kind": "CONCEPT",
"slug": "adapter-outbound-persistence-mongo-c08",
"title": "phase를 code table 위에 두는 순서까지 논증돼 있다",
"topic": "composition-and-lifecycle-models",
"path": "concept/concept-adapter-outbound-persistence-mongo-c08.md",
"rootTreeNode": "concept:adapter-outbound-persistence-mongo-c08",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "7ebd271e925204fd3019e6f64d66d7bb2f313ae3ce1ac08d6af15bc545ef83e6",
"lines": 44,
"body": "concept/concept-adapter-outbound-persistence-mongo-c08.body.md",
"bodySha256": "f4f7e26acfd64d26dbf1ad3ddc5fe19ce5b9b736b6a9289b305263a90ef3918a",
"assets": [
{
"key": "adapter-outbound-persistence-mongo-c08",
"kind": "terminal"
}
]
},
"adapter-outbound-support-c01": {
"kind": "CONCEPT",
"slug": "adapter-outbound-support-c01",
"title": "허용된 의존과 실제 의존이 다르다",
"topic": "composition-and-lifecycle-models",
"path": "concept/concept-adapter-outbound-support-c01.md",
"rootTreeNode": "concept:adapter-outbound-support-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d6a70d36819373dfebe3d3e4b67dd7c652cc1522e0b234a81244d898f24926a9",
"lines": 36,
"body": "concept/concept-adapter-outbound-support-c01.body.md",
"bodySha256": "76001f317f737e19a99d0def9c9a4f6beb893162e85f0ff0816988adb13cac51",
"assets": [
{
"key": "adapter-outbound-support-c01-diagram",
"kind": "diagram"
},
{
"key": "adapter-outbound-support-c01",
"kind": "terminal"
}
]
},
"grpc-advanced-bootstrap-c02": {
"kind": "CONCEPT",
"slug": "grpc-advanced-bootstrap-c02",
"title": "세 조건을 하나의 boolean으로 접지 않는다",
"topic": "composition-and-lifecycle-models",
"path": "concept/concept-grpc-advanced-bootstrap-c02.md",
"rootTreeNode": "concept:grpc-advanced-bootstrap-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e88e0ae38cfb8506f95e488fcd66dd2d99c7f1190151a1bbc82edbd3aa23b75d",
"lines": 36,
"body": "concept/concept-grpc-advanced-bootstrap-c02.body.md",
"bodySha256": "359354d49d0d2a7385d852786b7572cf8c3c663ea396f3b7cb06a91a5ab99d49",
"assets": [
{
"key": "grpc-advanced-bootstrap-c02-diagram",
"kind": "diagram"
},
{
"key": "grpc-advanced-bootstrap-c02",
"kind": "terminal"
}
]
},
"grpc-observability-c02": {
"kind": "CONCEPT",
"slug": "grpc-observability-c02",
"title": "네 타입을 쓰지만 그 관측을 만드는 코드가 없다",
"topic": "composition-and-lifecycle-models",
"path": "concept/concept-grpc-observability-c02.md",
"rootTreeNode": "concept:grpc-observability-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "8d59cfe8034bf2d2440ea74fc424bbe662de9f6d187c49798ff9383f873c7efd",
"lines": 32,
"body": "concept/concept-grpc-observability-c02.body.md",
"bodySha256": "1bd5d8d9e32290eedaa9c4c9a3a0d68b594c05a52178042def46051ceeeb3e4a",
"assets": [
{
"key": "grpc-observability-c02",
"kind": "terminal"
}
]
},
"messaging-admin-runtime-c02": {
"kind": "CONCEPT",
"slug": "messaging-admin-runtime-c02",
"title": "선언한 여섯 의존 중 셋이 import 0건이다",
"topic": "composition-and-lifecycle-models",
"path": "concept/concept-messaging-admin-runtime-c02.md",
"rootTreeNode": "concept:messaging-admin-runtime-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "fbd560836b6ae110735c9f28f266986f4b94d09dfbe4de3eb8059c38cac0f94a",
"lines": 36,
"body": "concept/concept-messaging-admin-runtime-c02.body.md",
"bodySha256": "2e056ad7c8303280a9be2e56a0a59159817853cf7036f10153c64c0ad4bac7cd",
"assets": [
{
"key": "messaging-admin-runtime-c02",
"kind": "terminal"
}
]
},
"messaging-kafka-share-experimental-c01": {
"kind": "CONCEPT",
"slug": "messaging-kafka-share-experimental-c01",
"title": "이 리프의 실질은 세 가지 거절이다",
"topic": "composition-and-lifecycle-models",
"path": "concept/concept-messaging-kafka-share-experimental-c01.md",
"rootTreeNode": "concept:messaging-kafka-share-experimental-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "89248cff996e4b9bec7a685d31971f4a3d02a4e83513b38a2e32d6d07a5f7577",
"lines": 36,
"body": "concept/concept-messaging-kafka-share-experimental-c01.body.md",
"bodySha256": "b9e50e0bd1bf17d42ff9ab67da76d7b18c5583ca56cdcf56a5a97534562c41e5",
"assets": [
{
"key": "messaging-kafka-share-experimental-c01-diagram",
"kind": "diagram"
},
{
"key": "messaging-kafka-share-experimental-c01",
"kind": "terminal"
}
]
},
"messaging-kafka-share-experimental-c02": {
"kind": "CONCEPT",
"slug": "messaging-kafka-share-experimental-c02",
"title": "소비자 없음과 membership 없음과 조립 없음이 서로 맞는다",
"topic": "composition-and-lifecycle-models",
"path": "concept/concept-messaging-kafka-share-experimental-c02.md",
"rootTreeNode": "concept:messaging-kafka-share-experimental-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "43e74c918e2e58388d911d68a6267a4ad2c1291094114203e80fa695fb427580",
"lines": 40,
"body": "concept/concept-messaging-kafka-share-experimental-c02.body.md",
"bodySha256": "db6ec1f79e8c2f13af5a3acdd0d366a6db318196d6f54521b482ca71c4e98e41",
"assets": [
{
"key": "messaging-kafka-share-experimental-c02",
"kind": "terminal"
}
]
},
"messaging-nats-experimental-c02": {
"kind": "CONCEPT",
"slug": "messaging-nats-experimental-c02",
"title": "검증기가 불리지 않는 지금 실제로 도는 게이트는 생성자다",
"topic": "composition-and-lifecycle-models",
"path": "concept/concept-messaging-nats-experimental-c02.md",
"rootTreeNode": "concept:messaging-nats-experimental-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e4fb8866e4a5ec7e419a412a43774fb5044499beeb0185b0e1f293e6ac48186d",
"lines": 36,
"body": "concept/concept-messaging-nats-experimental-c02.body.md",
"bodySha256": "d58ea5c91ea86bc9f2c29858d0a8b356e1c5048bd665af04244fee57febb7b62",
"assets": [
{
"key": "messaging-nats-experimental-c02",
"kind": "terminal"
}
]
},
"messaging-runtime-core-c07": {
"kind": "CONCEPT",
"slug": "messaging-runtime-core-c07",
"title": "이 리프는 통째로 하나의 수정이다",
"topic": "composition-and-lifecycle-models",
"path": "concept/concept-messaging-runtime-core-c07.md",
"rootTreeNode": "concept:messaging-runtime-core-c07",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "4ef28a44fa7db87f8c271ebfd48061177a20c8b93b9a6bcb35bdbe72bc111c50",
"lines": 36,
"body": "concept/concept-messaging-runtime-core-c07.body.md",
"bodySha256": "304da5fac04a13797046bebe150ba6f2804ea075a28b3f880cf91cfa07c9eaa1",
"assets": [
{
"key": "messaging-runtime-core-c07",
"kind": "terminal"
}
]
},
"messaging-security-c02": {
"kind": "CONCEPT",
"slug": "messaging-security-c02",
"title": "이 리프는 messaging family에서 배선이 가장 잘 된 축이다",
"topic": "composition-and-lifecycle-models",
"path": "concept/concept-messaging-security-c02.md",
"rootTreeNode": "concept:messaging-security-c02",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "9b9b2afecb77ea8669f9748b7318f10ad67e11f44e83ce024500e2740edd087d",
"lines": 36,
"body": "concept/concept-messaging-security-c02.body.md",
"bodySha256": "ab9b19a97e321a5a23acbfa53f294c9b7b5383b8dbe06e3cd223ee5e855bd28e",
"assets": [
{
"key": "messaging-security-c02",
"kind": "terminal"
}
]
},
"messaging-spring-boot-starter-c01": {
"kind": "CONCEPT",
"slug": "messaging-spring-boot-starter-c01",
"title": "등록되어 있다는 것과 조립할 수 있다는 것을 분리했다",
"topic": "composition-and-lifecycle-models",
"path": "concept/concept-messaging-spring-boot-starter-c01.md",
"rootTreeNode": "concept:messaging-spring-boot-starter-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "64c001c09f24a152c3e4cd67d5debd8f866280072ddcd465b428065e70521821",
"lines": 36,
"body": "concept/concept-messaging-spring-boot-starter-c01.body.md",
"bodySha256": "cfd9df5fde082415d5ffafe4efd23043d57f1ed896a60b6e18f8f1e655a91456",
"assets": [
{
"key": "messaging-spring-boot-starter-c01-diagram",
"kind": "diagram"
},
{
"key": "messaging-spring-boot-starter-c01",
"kind": "terminal"
}
]
},
"messaging-spring-cloud-stream-bridge-c01": {
"kind": "CONCEPT",
"slug": "messaging-spring-cloud-stream-bridge-c01",
"title": "플랫폼 보장과 헷갈릴 만큼 닮은 것이 이 리프의 위협 모델이다",
"topic": "composition-and-lifecycle-models",
"path": "concept/concept-messaging-spring-cloud-stream-bridge-c01.md",
"rootTreeNode": "concept:messaging-spring-cloud-stream-bridge-c01",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "15c207f51243db3d73b6206e442c6d97587777891280085173b96b92e314511a",
"lines": 36,
"body": "concept/concept-messaging-spring-cloud-stream-bridge-c01.body.md",
"bodySha256": "ba76acf08dbc5e27ab0897f7a39235c71d405fdb4cbcb27246f4aecfc58b6527",
"assets": [
{
"key": "messaging-spring-cloud-stream-bridge-c01",
"kind": "terminal"
}
]
},
"assigned-id-turns-claim-into-upsert": {
"kind": "CASE",
"slug": "assigned-id-turns-claim-into-upsert",
"title": "배정 식별자 때문에 insert-first 청구가 UPSERT 가 되어 커밋된 결과를 덮었다",
"topic": "state-ownership-and-concurrency",
"path": "case/case-assigned-id-turns-claim-into-upsert.md",
"rootTreeNode": "case:assigned-id-turns-claim-into-upsert",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "18316e46d4f18b0ddb67bc2b0ec54feb410b1a4e157925a320bb490af6d8b1a9",
"lines": 83,
"body": "case/case-assigned-id-turns-claim-into-upsert.body.md",
"bodySha256": "572ed5fd7cd1ea0a66040d5da08fecb241681281ee39dec8f4d61821c57c5c6b",
"assets": [
{
"key": "assigned-id-turns-claim-into-upsert",
"kind": "terminal"
}
]
},
"complete-drain-rolls-back-a-rotation": {
"kind": "CASE",
"slug": "complete-drain-rolls-back-a-rotation",
"title": "배수 완료가 자기가 읽은 값으로 상태를 다시 써서 진행 중인 자격증명 회전을 되돌린다",
"topic": "state-ownership-and-concurrency",
"path": "case/case-complete-drain-rolls-back-a-rotation.md",
"rootTreeNode": "case:complete-drain-rolls-back-a-rotation",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "d626f6c0cd66ad4e3b781c9d6308352dd2499bc41bc711c0ae495960d9950afa",
"lines": 80,
"body": "case/case-complete-drain-rolls-back-a-rotation.body.md",
"bodySha256": "674d3b245863eee6fb66158d78fe0485828a6ed7c081dfc37b1c35f06841e348",
"assets": [
{
"key": "complete-drain-rolls-back-a-rotation",
"kind": "terminal"
}
]
},
"startup-validator-is-the-only-reader-of-four-keys": {
"kind": "CASE",
"slug": "startup-validator-is-the-only-reader-of-four-keys",
"title": "시작 검증기가 유일한 소비자인 설정 키 넷이 아무것도 게이트하지 않는다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-startup-validator-is-the-only-reader-of-four-keys.md",
"rootTreeNode": "case:startup-validator-is-the-only-reader-of-four-keys",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "2874657a7741734e86fc27d31095fda8cd117977ac2bc8c4d27c0b496383fee2",
"lines": 76,
"body": "case/case-startup-validator-is-the-only-reader-of-four-keys.body.md",
"bodySha256": "02ac82c23b4ea9dfae96384f37903c42318f2f53289ff914f1328358e748215f",
"assets": [
{
"key": "startup-validator-is-the-only-reader-of-four-keys",
"kind": "terminal"
}
]
},
"validator-declared-and-never-injected": {
"kind": "CASE",
"slug": "validator-declared-and-never-injected",
"title": "같은 자동 설정 안에서 검증기 하나만 감싸이지 않아 트랜잭션 조건이 검사되지 않는다",
"topic": "runtime-reachability-and-composition",
"path": "case/case-validator-declared-and-never-injected.md",
"rootTreeNode": "case:validator-declared-and-never-injected",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "5fc0d94802307bc6de2042b53ce806c9179f9e0d61aa50fe6d09ab02a847a6d2",
"lines": 74,
"body": "case/case-validator-declared-and-never-injected.body.md",
"bodySha256": "00ec7c60e8f1ae4f1e266581e884726df1a4e0eef05e50082fe78e25633d56a6",
"assets": [
{
"key": "validator-declared-and-never-injected",
"kind": "terminal"
}
]
},
"capability-constant-outlives-its-condition": {
"kind": "CASE",
"slug": "capability-constant-outlives-its-condition",
"title": "능력 상수가 프로파일 조건보다 오래 살아서 중복 제거 없는 목적지가 가드를 통과한다",
"topic": "transport-and-provider-semantics",
"path": "case/case-capability-constant-outlives-its-condition.md",
"rootTreeNode": "case:capability-constant-outlives-its-condition",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "b51b5765510018e52acafb9ac9b802ff3b74f825cfc706001451851393293e51",
"lines": 77,
"body": "case/case-capability-constant-outlives-its-condition.body.md",
"bodySha256": "0dd92433da34cdd8d2e6503271fa2e93f86697c0601a127a1eb3c1809f1df7d8",
"assets": [
{
"key": "capability-constant-outlives-its-condition",
"kind": "terminal"
}
]
},
"ipv4-only-mask-passes-every-other-form": {
"kind": "CASE",
"slug": "ipv4-only-mask-passes-every-other-form",
"title": "마스킹이 IPv4 만 알아서 검사가 나머지 주소 형태를 전부 통과시킨다",
"topic": "security-policy-enforcement",
"path": "case/case-ipv4-only-mask-passes-every-other-form.md",
"rootTreeNode": "case:ipv4-only-mask-passes-every-other-form",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "e228717a351255d3b99dbc1296787af2a8c57d705ee0a387d9caf7534727b41b",
"lines": 76,
"body": "case/case-ipv4-only-mask-passes-every-other-form.body.md",
"bodySha256": "51a0b0b1a00612f7f1e6a5f57d6135a4ac514aa6f54ad8375b538eeda9708cd2",
"assets": [
{
"key": "ipv4-only-mask-passes-every-other-form",
"kind": "terminal"
}
]
},
"a-validator-is-enforced-by-injection": {
"kind": "REFERENCE",
"slug": "a-validator-is-enforced-by-injection",
"title": "검증기는 발행이 아니라 주입이 강제다",
"topic": "runtime-reachability-and-composition",
"path": "reference/reference-a-validator-is-enforced-by-injection.md",
"rootTreeNode": "reference:a-validator-is-enforced-by-injection",
"sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916",
"verifiedOn": "2026-09-01",
"sha256": "421a5572b7688fbb26eee3a936b6cd84929f9ef038907e53bdff61043790c81b",
"lines": 58
}
},
"lastGenerationAt": "2026-08-31T18:15:13Z",
"lastEditorialAt": "2026-09-01T15:48:45Z",
"lastValidationAt": "2026-09-01T15:48:45Z",
"recordCounts": {
"total": 949,
"case": 402,
"concept": 386,
"reference": 105,
"question": 31,
"decision": 25
},
"cycle2Redo": {
"addedRecords": 6,
"note": "23개 리프 재통독에서 처음 나온 finding 중 기존 노드가 담지 않은 6건에 대한 기록. root-tree 노드 340, ledger 353."
},
"intentionallyNotEmitted": {
"decision:widen-doc-contract-assertions": "root-tree 노드가 decision-status NOT_DECIDED 이고 classification 이 '이 노드는 생성되지 않는다' 고 명시한다. 프로젝트가 선택한 기록이 없는 권고이므로 기록으로 내지 않는다."
},
"sourceManifestSha256": "77d8f6c4d5ab6e4efc5e21ed1fce5dcff8b365ed7a39f4e3f3968de18bf4dd76",
"cycle3": {
"addedRecords": 33,
"topicsAdded": 6,
"note": "43개 리프 SSOT(226 findings) 재분해로 만든 TOPIC 17~22 의 기록. root-tree 노드 373, ledger 386."
},
"assets": {
"terminal": 849,
"diagram": 181,
"raw": 849,
"meta": 1030
},
"bodies": 788
}