From 197b2c7e72224308b4310e1f6b245d17b6d186a7 Mon Sep 17 00:00:00 2001 From: DongHyeonka Date: Fri, 21 Aug 2026 14:32:14 +0900 Subject: [PATCH] chore: pick up the regenerated Question input contract `resolution` leaves the input's required list, so the generated type makes it optional. The editor already sent null for an unresolved question; nothing in the frontend changes behaviour. --- public/release-manifest.json | 10 +++++----- .../contracts/management/canonical-source.json | 2 +- .../tech-log/contracts/public/canonical-source.json | 2 +- .../tech-log/contracts/studio/canonical-source.json | 4 ++-- src/features/tech-log/contracts/studio/generated.ts | 2 +- .../tech-log/contracts/studio/studio-api.openapi.yaml | 7 ++++++- 6 files changed, 16 insertions(+), 11 deletions(-) diff --git a/public/release-manifest.json b/public/release-manifest.json index 0ca7a1c..6dc21a0 100644 --- a/public/release-manifest.json +++ b/public/release-manifest.json @@ -38,28 +38,28 @@ }, "contractSet": { "setAlgorithm": "CA_CONTRACT_SET_V1", - "setDigest": "sha256:f3124d4f29c487d1d6b4f42326393c91ad0542ecb4b60c0ce09a62fb452bb173", + "setDigest": "sha256:a7983cb56b824a32866f99f778ec92812e3d59d4fda1a3f632985e4b54560b8f", "packages": [ { "packageId": "@tech-log/management-contract", "version": "1.0.0", "digest": "sha256:9efc7709b29404db96a7cc7acecdd9ec7b27cb95f3389e5da2c4953e2e3e23aa", "runtimeProtocolVersion": 1, - "sourceRevision": "332b11f" + "sourceRevision": "dc290b4" }, { "packageId": "@tech-log/public-contract", "version": "2.0.0", "digest": "sha256:8ac71425b38658f34641102b4c2e6e21288c811efebdb92c0a46fb9d4790e23e", "runtimeProtocolVersion": 1, - "sourceRevision": "332b11f" + "sourceRevision": "dc290b4" }, { "packageId": "@tech-log/studio-contract", "version": "3.0.0", - "digest": "sha256:6cae9924403d0761f401643a022980b8e04183eea0d890c143c9fbbbbc7431e4", + "digest": "sha256:5229865c3d242f19d75030d3f524a44dfebbf444324068d6ae88e43b8047dba4", "runtimeProtocolVersion": 1, - "sourceRevision": "332b11f" + "sourceRevision": "dc290b4" } ] } diff --git a/src/features/tech-log/contracts/management/canonical-source.json b/src/features/tech-log/contracts/management/canonical-source.json index f9151b0..df54d0a 100644 --- a/src/features/tech-log/contracts/management/canonical-source.json +++ b/src/features/tech-log/contracts/management/canonical-source.json @@ -2,7 +2,7 @@ "packageId": "@tech-log/management-contract", "version": "1.0.0", "digest": "sha256:9efc7709b29404db96a7cc7acecdd9ec7b27cb95f3389e5da2c4953e2e3e23aa", - "sourceRevision": "332b11f", + "sourceRevision": "dc290b4", "operationIds": [ "createCaseDraft", "getCaseForEdit", diff --git a/src/features/tech-log/contracts/public/canonical-source.json b/src/features/tech-log/contracts/public/canonical-source.json index 26ca94d..64f241c 100644 --- a/src/features/tech-log/contracts/public/canonical-source.json +++ b/src/features/tech-log/contracts/public/canonical-source.json @@ -2,7 +2,7 @@ "packageId": "@tech-log/public-contract", "version": "2.0.0", "digest": "sha256:8ac71425b38658f34641102b4c2e6e21288c811efebdb92c0a46fb9d4790e23e", - "sourceRevision": "332b11f", + "sourceRevision": "dc290b4", "operationIds": [ "getPublicSite", "getPublicHome", diff --git a/src/features/tech-log/contracts/studio/canonical-source.json b/src/features/tech-log/contracts/studio/canonical-source.json index c4d443a..5b3ad97 100644 --- a/src/features/tech-log/contracts/studio/canonical-source.json +++ b/src/features/tech-log/contracts/studio/canonical-source.json @@ -1,8 +1,8 @@ { "packageId": "@tech-log/studio-contract", "version": "3.0.0", - "digest": "sha256:6cae9924403d0761f401643a022980b8e04183eea0d890c143c9fbbbbc7431e4", - "sourceRevision": "332b11f", + "digest": "sha256:5229865c3d242f19d75030d3f524a44dfebbf444324068d6ae88e43b8047dba4", + "sourceRevision": "dc290b4", "operationIds": [ "getStudioSession", "getStudioDashboard", diff --git a/src/features/tech-log/contracts/studio/generated.ts b/src/features/tech-log/contracts/studio/generated.ts index ccca359..a1afac9 100644 --- a/src/features/tech-log/contracts/studio/generated.ts +++ b/src/features/tech-log/contracts/studio/generated.ts @@ -645,7 +645,7 @@ export interface components { constraints: components["schemas"]["OrderedText"][]; options: components["schemas"]["QuestionOption"][]; nextValidation: string; - resolution: components["schemas"]["QuestionResolution"] | null; + resolution?: components["schemas"]["QuestionResolution"] | null; } & { /** * @description discriminator enum property added by openapi-typescript diff --git a/src/features/tech-log/contracts/studio/studio-api.openapi.yaml b/src/features/tech-log/contracts/studio/studio-api.openapi.yaml index 836aa00..f630344 100644 --- a/src/features/tech-log/contracts/studio/studio-api.openapi.yaml +++ b/src/features/tech-log/contracts/studio/studio-api.openapi.yaml @@ -959,7 +959,12 @@ components: allOf: - { $ref: "#/components/schemas/WorkingCopyInputBase" } - type: object - required: [kind, questionStatus, facts, assumptions, unknowns, constraints, options, nextValidation, resolution] + # `resolution` 은 여기 없다. 미해결 질문에는 해결 내용이 없고, 그것을 required 로 두면 + # Java 생성기가 nullable 여부와 무관하게 @NotNull 을 찍는다 — oneOf 로 적은 null 을 그 + # 생성기는 읽지 못한다. 실제로 그래서 Question 작업본을 만들 수 없었다: 프론트가 계약대로 + # resolution: null 을 보냈고 백엔드가 422 로 거절했다. 같은 목록의 `questionStatus` 가 + # 통과하는 것은 그쪽이 nullability 를 `type: [string, "null"]` 로 적었기 때문이다. + required: [kind, questionStatus, facts, assumptions, unknowns, constraints, options, nextValidation] properties: kind: { type: string, enum: [QUESTION] } questionStatus: