Sub-scope 07 (inbound-web) http + json + advanced/codec + openapi
revision=a24ece9cf797f7ea647e33bf846b115208ed1ba5
generatedAt=2026-08-30T07:33:21+00:00

=== OWNED FILES ===
5195ccde1fb114a7b3e8b3671922112fd06ae37b main/java/dev/caskeleton/adapter/inbound/web/advanced/codec/CodecBudget.java 61
03bebdb143e9ae7702485727a7278c08af892aae main/java/dev/caskeleton/adapter/inbound/web/advanced/codec/RepresentationNegotiationPolicy.java 84
94b098604b018bc78428cd7f010ebfae7dc4dd8c main/java/dev/caskeleton/adapter/inbound/web/advanced/codec/SecureXmlInputFactory.java 59
0a03fa6eef7b4a55263025d9af88588dcc8dbade main/java/dev/caskeleton/adapter/inbound/web/advanced/codec/WebCborMapperFactory.java 87
2949cf411f2413f80aa0fa7eee7c0de8076a62e0 main/java/dev/caskeleton/adapter/inbound/web/advanced/codec/WebRepresentation.java 90
ee36dbc9fa8d61639cbb19d83288b110b0da9985 main/java/dev/caskeleton/adapter/inbound/web/advanced/codec/WebXmlMapperFactory.java 99
5b81c84bdd8a0c3283dd0f4c4c145230d7eb7cc4 main/java/dev/caskeleton/adapter/inbound/web/advanced/openapi/OpenApi32CompatibilityReport.java 72
b5f2614e2c7ea1f9635a4b65272c38895e9aff9d main/java/dev/caskeleton/adapter/inbound/web/advanced/openapi/OpenApiDeepCopy.java 40
72ae00a519233206951458f1494ff6a3b53eca64 main/java/dev/caskeleton/adapter/inbound/web/advanced/openapi/OpenApiToolchainMatrix.java 81
39ee8a7da3d7099ccf9007119ff482a92701ffc3 main/java/dev/caskeleton/adapter/inbound/web/advanced/openapi/OpenApiVersionLane.java 36
ea237116f9d72b88ba7935a840cf44d5fa77b76a main/java/dev/caskeleton/adapter/inbound/web/advanced/openapi/WebOpenApi32Generator.java 122
f88b13a2ad17de5d2a8413283704a8e4ab6d219f main/java/dev/caskeleton/adapter/inbound/web/http/ApiHeaders.java 39
a456725d9fcc474551828a20a191d60b8eae6a5d main/java/dev/caskeleton/adapter/inbound/web/http/CanonicalPath.java 29
1e1f5432b38f7106a443045d285cbabe97157713 main/java/dev/caskeleton/adapter/inbound/web/http/ExternalOrigin.java 51
7a345f29bbee8540c4cd2ba50569173b436fa8f7 main/java/dev/caskeleton/adapter/inbound/web/http/ExternalPrefix.java 63
df45ae6b7e72a27285fe85d66add4162c41baaca main/java/dev/caskeleton/adapter/inbound/web/http/ExternalUriBuilder.java 80
61b0716affa7b70483a5186c106266b53fee47b9 main/java/dev/caskeleton/adapter/inbound/web/http/ExternalUriPolicy.java 88
30340076e30870d39e772bcb252de73fef72d119 main/java/dev/caskeleton/adapter/inbound/web/http/WebHeaderName.java 56
996f869cd9bce048bf9aa7cb6259fb8c43383a86 main/java/dev/caskeleton/adapter/inbound/web/http/WebMethodPolicy.java 112
c1b27a158eaca2f51780589b963f119d1fb8c353 main/java/dev/caskeleton/adapter/inbound/web/http/WebResponseContract.java 46
8943022bcd69d164e9e077dcbabe39a9c37619cd main/java/dev/caskeleton/adapter/inbound/web/http/WebStatusContract.java 40
6ed5547086dcb10247628f38988e6d57325567f2 main/java/dev/caskeleton/adapter/inbound/web/http/WebSuccessResponse.java 76
b6adcfee747f00d32b9ac0bb4c2ecd861b51feec main/java/dev/caskeleton/adapter/inbound/web/http/WebUriPolicy.java 91
e35af8b43e7a4a7b29f60f35611f4af96b711c87 main/java/dev/caskeleton/adapter/inbound/web/json/BoundedJsonFactory.java 45
7f3fd0146e72a41e1b75137c1ececb930483e1ed main/java/dev/caskeleton/adapter/inbound/web/json/WebJsonDecodingException.java 36
6126903621e89a96c2a627ab361c1a64492a283c main/java/dev/caskeleton/adapter/inbound/web/json/WebJsonProfile.java 51
b1beacf04d7c2cc7a33a940046791db80b65141c main/java/dev/caskeleton/adapter/inbound/web/json/WebObjectMapperFactory.java 111
1be7552faf5870cecb1ba67244d2cd7e3d7a11bc main/java/dev/caskeleton/adapter/inbound/web/openapi/CursorSchemaContributor.java 47
4be10e76dd601438718314d298e04214c495ff1c main/java/dev/caskeleton/adapter/inbound/web/openapi/ProblemSchemaContributor.java 88
c43576247de7740565f078eb6b88e93482761706 main/java/dev/caskeleton/adapter/inbound/web/openapi/WebOpenApiBreakingPolicy.java 187
55096eda5a698fff1dbf11b3a76cbbbf591f5344 main/java/dev/caskeleton/adapter/inbound/web/openapi/WebOpenApiCustomizer.java 74
93dbfefd30e88ceff637af11faba09965fa7f9d4 main/java/dev/caskeleton/adapter/inbound/web/openapi/WebOpenApiDiffResult.java 39
71a65f7abdcb6a39d49d4c62d75d245bd5f34195 main/java/dev/caskeleton/adapter/inbound/web/openapi/WebOpenApiProfile.java 72
aaf4da55c1827a4b3c44152da92ccdb60dcc1892 main/java/dev/caskeleton/adapter/inbound/web/openapi/WebOpenApiReleaseGate.java 100
c01bacbde0950f9bbe87123d8565b251324790f0 test/java/dev/caskeleton/adapter/inbound/web/advanced/codec/RepresentationBackendScopeTest.java 107
900b0e7ed708febc17fd6468fbf5ebc6714ced3e test/java/dev/caskeleton/adapter/inbound/web/advanced/codec/WebCodecMapperTest.java 175
11a4a8f64b76013b0f4e8b73f1822d85c10992f3 test/java/dev/caskeleton/adapter/inbound/web/advanced/codec/WebCodecSecurityTest.java 168
84cb49ceacfd8bff48642de18dfbaa9a3613d788 test/java/dev/caskeleton/adapter/inbound/web/advanced/openapi/OpenApi32CompatibilityReportTest.java 110
b1bf70b4e051dcfbf488c003d5ff23a4f25e2a9b test/java/dev/caskeleton/adapter/inbound/web/advanced/openapi/WebOpenApi32GeneratorTest.java 156
3728ba0f9206e2472dd762ae08bad44289015332 test/java/dev/caskeleton/adapter/inbound/web/http/ExternalUriBuilderTest.java 141
81495ad18f4680f64bd590b37c5aa8dd7303ce7e test/java/dev/caskeleton/adapter/inbound/web/http/WebResponseContractTest.java 81
002fe95c59fb5524bc05bd62a31196f001045e93 test/java/dev/caskeleton/adapter/inbound/web/http/WebUriPolicyTest.java 137
bbef1d7f459637fd508f2e466d2fa132d7fccdf2 test/java/dev/caskeleton/adapter/inbound/web/json/WebObjectMapperFactoryTest.java 133
a71b8972cf5ba559802752f1490441533bb7fa25 test/java/dev/caskeleton/adapter/inbound/web/openapi/WebOpenApiReleaseGateTest.java 166
167eb701763d9391a8b78252c0deba24829d2745 test/java/dev/caskeleton/adapter/inbound/web/openapi/WebOpenApiSnapshotTest.java 125
file_count=45

=== 8.1 도달성: WebJsonProfile 8개 필드 중 강제되는 것 ===
rejectUnknownProperties    readers=json/WebObjectMapperFactory.java:66:                profile.rejectUnknownProperties()) 
rejectDuplicateKeys        readers=json/BoundedJsonFactory.java:40:    if (profile.rejectDuplicateKeys()) { 
rejectTrailingTokens       readers=json/WebObjectMapperFactory.java:68:                DeserializationFeature.FAIL_ON_TRAILING_TOKENS, profile.rejectTrailingTokens()) 
caseSensitiveEnums         readers=json/WebObjectMapperFactory.java:69:            .configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS, !profile.caseSensitiveEnums()) json/WebObjectMapperFactory.java:71:                MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, !profile.caseSensitiveEnums()) 
rejectScalarCoercion       readers=json/WebObjectMapperFactory.java:75:    if (profile.rejectScalarCoercion()) { 
maxDepth                   readers=json/BoundedJsonFactory.java:37:                    .maxNestingDepth(profile.maxDepth()) 
maxArrayElements           readers=
maxStringBytes             readers=json/BoundedJsonFactory.java:38:                    .maxStringLength(profile.maxStringBytes()) 
=== 8.2 조건 형제 비교: 두 개의 OpenApiCustomizer ===
$ grep -n 'OpenApiCustomizer' adapter/inbound/web/src/main/java/dev/caskeleton/adapter/inbound/web/config/OpenApiContractConfig.java
7:import org.springdoc.core.customizers.OpenApiCustomizer;
26:  OpenApiCustomizer apiErrorDetailsObjectSchemaCustomizer() {
exit=0

$ grep -rn 'WebOpenApiCustomizer' --include=*.java adapter/inbound/web/src app-bootstrap/src | sed 's|adapter/inbound/web/src/||'
test/java/dev/caskeleton/adapter/inbound/web/openapi/WebOpenApiSnapshotTest.java:75:    WebOpenApiCustomizer.standard().customise(springdoc);
main/java/dev/caskeleton/adapter/inbound/web/openapi/WebOpenApiCustomizer.java:18:public final class WebOpenApiCustomizer {
main/java/dev/caskeleton/adapter/inbound/web/openapi/WebOpenApiCustomizer.java:27:  public WebOpenApiCustomizer(WebOpenApiProfile profile) {
main/java/dev/caskeleton/adapter/inbound/web/openapi/WebOpenApiCustomizer.java:32:  public static WebOpenApiCustomizer standard() {
main/java/dev/caskeleton/adapter/inbound/web/openapi/WebOpenApiCustomizer.java:33:    return new WebOpenApiCustomizer(WebOpenApiProfile.standard());
exit=0

=== 8.3 XML/CBOR 표현의 런타임 배선 ===
$ grep -n 'compileOnly' adapter/inbound/web/build.gradle
39:    compileOnly 'tools.jackson.dataformat:jackson-dataformat-cbor'
40:    compileOnly 'tools.jackson.dataformat:jackson-dataformat-xml'
exit=0

$ grep -rn 'WebXmlMapperFactory\|WebCborMapperFactory\|SecureXmlInputFactory' --include=*.java adapter/inbound/web/src app-bootstrap/src | sed 's|adapter/inbound/web/src/||' | awk -F: '{print $1}' | sort -u
main/java/dev/caskeleton/adapter/inbound/web/advanced/codec/SecureXmlInputFactory.java
main/java/dev/caskeleton/adapter/inbound/web/advanced/codec/WebCborMapperFactory.java
main/java/dev/caskeleton/adapter/inbound/web/advanced/codec/WebXmlMapperFactory.java
test/java/dev/caskeleton/adapter/inbound/web/advanced/codec/WebCodecMapperTest.java
test/java/dev/caskeleton/adapter/inbound/web/advanced/codec/WebCodecSecurityTest.java
exit=0

=== 8.4 maxStringBytes 가 무엇에 적용되는가 ===
$ grep -n 'maxStringLength\|maxNestingDepth\|StreamReadConstraints' adapter/inbound/web/src/main/java/dev/caskeleton/adapter/inbound/web/json/BoundedJsonFactory.java
4:import tools.jackson.core.StreamReadConstraints;
36:                StreamReadConstraints.builder()
37:                    .maxNestingDepth(profile.maxDepth())
38:                    .maxStringLength(profile.maxStringBytes())
exit=0

$ grep -n 'maxArrayElements' adapter/inbound/web/src/main/java/dev/caskeleton/adapter/inbound/web/json/WebJsonProfile.java
18: * @param maxArrayElements most elements accepted in one array
28:    int maxArrayElements,
32:    if (maxDepth <= 0 || maxArrayElements <= 0 || maxStringBytes <= 0) {
exit=0

