Renewal 확장 응답 계약 수용 - #202

Merged
hywznn merged 3 commits into
mainfrom
fix/10-renewal-response-contract
Aug 18, 2026
Merged

Renewal 확장 응답 계약 수용#202
hywznn merged 3 commits into
mainfrom
fix/10-renewal-response-contract

Conversation

@hywznn

Copy link
Copy Markdown
Member

왜 필요한가요?

AI Renewal 응답에 variant, nextAction, legalConclusion, questions, suggestedWorkflowIds가 추가됐지만 Server의 strict JSON 계약에는 해당 필드가 없었습니다. AI는 HTTP 200을 반환해도 Server 역직렬화가 실패하여 사용자에게 503 RENEWAL_RUNTIME_UNAVAILABLE이 노출됐습니다.

무엇이 바뀌나요?

  • AI가 반환하는 Renewal 확장 필드를 Server 응답 계약에 명시적으로 추가합니다.
  • nullable 목록을 빈 불변 목록으로 정규화합니다.
  • 기존 Server 내부 Adapter와 테스트가 사용하는 생성 계약은 호환 생성자로 유지합니다.
  • WireMock 계약 테스트가 확장 필드를 실제로 역직렬화하는지 검증합니다.

사용자·개발 영향

  • AI의 정상 Renewal 응답이 더 이상 503으로 오인되지 않습니다.
  • Agent가 예외 Workflow에 사용하는 다음 행동·질문·추천 Workflow 필드를 안전하게 수용할 수 있습니다.
  • DB·Flyway·Client·Infra 변경은 없습니다.

검증

  • ./gradlew clean test 전체 통과 (BUILD SUCCESSFUL)
  • 실제 Server → AI 호출에서 HTTP 200 확인
  • 응답이 REVIEW_REQUIRED, guideReviewRequired=true로 정상 매핑되는 것 확인

Refs #10

@hywznn
hywznn marked this pull request as ready for review August 18, 2026 03:49
@hywznn
hywznn merged commit 6d3067a into mainAug 18, 2026
4 checks passed
@hywznn
hywznn deleted the fix/10-renewal-response-contract branch August 18, 2026 03:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@hywznn
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Renewal 확장 응답 계약 수용 - #202

Merged
hywznn merged 3 commits into
mainfrom
fix/10-renewal-response-contract
Aug 18, 2026
Merged

Renewal 확장 응답 계약 수용#202
hywznn merged 3 commits into
mainfrom
fix/10-renewal-response-contract

Conversation

@hywznn

Copy link
Copy Markdown
Member

왜 필요한가요?

AI Renewal 응답에 variant, nextAction, legalConclusion, questions, suggestedWorkflowIds가 추가됐지만 Server의 strict JSON 계약에는 해당 필드가 없었습니다. AI는 HTTP 200을 반환해도 Server 역직렬화가 실패하여 사용자에게 503 RENEWAL_RUNTIME_UNAVAILABLE이 노출됐습니다.

무엇이 바뀌나요?

  • AI가 반환하는 Renewal 확장 필드를 Server 응답 계약에 명시적으로 추가합니다.
  • nullable 목록을 빈 불변 목록으로 정규화합니다.
  • 기존 Server 내부 Adapter와 테스트가 사용하는 생성 계약은 호환 생성자로 유지합니다.
  • WireMock 계약 테스트가 확장 필드를 실제로 역직렬화하는지 검증합니다.

사용자·개발 영향

  • AI의 정상 Renewal 응답이 더 이상 503으로 오인되지 않습니다.
  • Agent가 예외 Workflow에 사용하는 다음 행동·질문·추천 Workflow 필드를 안전하게 수용할 수 있습니다.
  • DB·Flyway·Client·Infra 변경은 없습니다.

검증

  • ./gradlew clean test 전체 통과 (BUILD SUCCESSFUL)
  • 실제 Server → AI 호출에서 HTTP 200 확인
  • 응답이 REVIEW_REQUIRED, guideReviewRequired=true로 정상 매핑되는 것 확인

Refs #10

@hywznn
hywznn marked this pull request as ready for review August 18, 2026 03:49
@hywznn
hywznn merged commit 6d3067a into mainAug 18, 2026
4 checks passed
@hywznn
hywznn deleted the fix/10-renewal-response-contract branch August 18, 2026 03:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@hywznn
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Renewal 확장 응답 계약 수용 - #202

Merged
hywznn merged 3 commits into
mainfrom
fix/10-renewal-response-contract
Aug 18, 2026
Merged

Renewal 확장 응답 계약 수용#202
hywznn merged 3 commits into
mainfrom
fix/10-renewal-response-contract

Conversation

@hywznn

Copy link
Copy Markdown
Member

왜 필요한가요?

AI Renewal 응답에 variant, nextAction, legalConclusion, questions, suggestedWorkflowIds가 추가됐지만 Server의 strict JSON 계약에는 해당 필드가 없었습니다. AI는 HTTP 200을 반환해도 Server 역직렬화가 실패하여 사용자에게 503 RENEWAL_RUNTIME_UNAVAILABLE이 노출됐습니다.

무엇이 바뀌나요?

  • AI가 반환하는 Renewal 확장 필드를 Server 응답 계약에 명시적으로 추가합니다.
  • nullable 목록을 빈 불변 목록으로 정규화합니다.
  • 기존 Server 내부 Adapter와 테스트가 사용하는 생성 계약은 호환 생성자로 유지합니다.
  • WireMock 계약 테스트가 확장 필드를 실제로 역직렬화하는지 검증합니다.

사용자·개발 영향

  • AI의 정상 Renewal 응답이 더 이상 503으로 오인되지 않습니다.
  • Agent가 예외 Workflow에 사용하는 다음 행동·질문·추천 Workflow 필드를 안전하게 수용할 수 있습니다.
  • DB·Flyway·Client·Infra 변경은 없습니다.

검증

  • ./gradlew clean test 전체 통과 (BUILD SUCCESSFUL)
  • 실제 Server → AI 호출에서 HTTP 200 확인
  • 응답이 REVIEW_REQUIRED, guideReviewRequired=true로 정상 매핑되는 것 확인

Refs #10

@hywznn
hywznn marked this pull request as ready for review August 18, 2026 03:49
@hywznn
hywznn merged commit 6d3067a into mainAug 18, 2026
4 checks passed
@hywznn
hywznn deleted the fix/10-renewal-response-contract branch August 18, 2026 03:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@hywznn
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Renewal 확장 응답 계약 수용 - #202

Merged
hywznn merged 3 commits into
mainfrom
fix/10-renewal-response-contract
Aug 18, 2026
Merged

Renewal 확장 응답 계약 수용#202
hywznn merged 3 commits into
mainfrom
fix/10-renewal-response-contract

Conversation

@hywznn

Copy link
Copy Markdown
Member

왜 필요한가요?

AI Renewal 응답에 variant, nextAction, legalConclusion, questions, suggestedWorkflowIds가 추가됐지만 Server의 strict JSON 계약에는 해당 필드가 없었습니다. AI는 HTTP 200을 반환해도 Server 역직렬화가 실패하여 사용자에게 503 RENEWAL_RUNTIME_UNAVAILABLE이 노출됐습니다.

무엇이 바뀌나요?

  • AI가 반환하는 Renewal 확장 필드를 Server 응답 계약에 명시적으로 추가합니다.
  • nullable 목록을 빈 불변 목록으로 정규화합니다.
  • 기존 Server 내부 Adapter와 테스트가 사용하는 생성 계약은 호환 생성자로 유지합니다.
  • WireMock 계약 테스트가 확장 필드를 실제로 역직렬화하는지 검증합니다.

사용자·개발 영향

  • AI의 정상 Renewal 응답이 더 이상 503으로 오인되지 않습니다.
  • Agent가 예외 Workflow에 사용하는 다음 행동·질문·추천 Workflow 필드를 안전하게 수용할 수 있습니다.
  • DB·Flyway·Client·Infra 변경은 없습니다.

검증

  • ./gradlew clean test 전체 통과 (BUILD SUCCESSFUL)
  • 실제 Server → AI 호출에서 HTTP 200 확인
  • 응답이 REVIEW_REQUIRED, guideReviewRequired=true로 정상 매핑되는 것 확인

Refs #10

@hywznn
hywznn marked this pull request as ready for review August 18, 2026 03:49
@hywznn
hywznn merged commit 6d3067a into mainAug 18, 2026
4 checks passed
@hywznn
hywznn deleted the fix/10-renewal-response-contract branch August 18, 2026 03:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@hywznn
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Renewal 확장 응답 계약 수용 - #202

Merged
hywznn merged 3 commits into
mainfrom
fix/10-renewal-response-contract
Aug 18, 2026
Merged

Renewal 확장 응답 계약 수용#202
hywznn merged 3 commits into
mainfrom
fix/10-renewal-response-contract

Conversation

@hywznn

Copy link
Copy Markdown
Member

왜 필요한가요?

AI Renewal 응답에 variant, nextAction, legalConclusion, questions, suggestedWorkflowIds가 추가됐지만 Server의 strict JSON 계약에는 해당 필드가 없었습니다. AI는 HTTP 200을 반환해도 Server 역직렬화가 실패하여 사용자에게 503 RENEWAL_RUNTIME_UNAVAILABLE이 노출됐습니다.

무엇이 바뀌나요?

  • AI가 반환하는 Renewal 확장 필드를 Server 응답 계약에 명시적으로 추가합니다.
  • nullable 목록을 빈 불변 목록으로 정규화합니다.
  • 기존 Server 내부 Adapter와 테스트가 사용하는 생성 계약은 호환 생성자로 유지합니다.
  • WireMock 계약 테스트가 확장 필드를 실제로 역직렬화하는지 검증합니다.

사용자·개발 영향

  • AI의 정상 Renewal 응답이 더 이상 503으로 오인되지 않습니다.
  • Agent가 예외 Workflow에 사용하는 다음 행동·질문·추천 Workflow 필드를 안전하게 수용할 수 있습니다.
  • DB·Flyway·Client·Infra 변경은 없습니다.

검증

  • ./gradlew clean test 전체 통과 (BUILD SUCCESSFUL)
  • 실제 Server → AI 호출에서 HTTP 200 확인
  • 응답이 REVIEW_REQUIRED, guideReviewRequired=true로 정상 매핑되는 것 확인

Refs #10

@hywznn
hywznn marked this pull request as ready for review August 18, 2026 03:49
@hywznn
hywznn merged commit 6d3067a into mainAug 18, 2026
4 checks passed
@hywznn
hywznn deleted the fix/10-renewal-response-contract branch August 18, 2026 03:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@hywznn
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Renewal 확장 응답 계약 수용 - #202

Merged
hywznn merged 3 commits into
mainfrom
fix/10-renewal-response-contract
Aug 18, 2026
Merged

Renewal 확장 응답 계약 수용#202
hywznn merged 3 commits into
mainfrom
fix/10-renewal-response-contract

Conversation

@hywznn

Copy link
Copy Markdown
Member

왜 필요한가요?

AI Renewal 응답에 variant, nextAction, legalConclusion, questions, suggestedWorkflowIds가 추가됐지만 Server의 strict JSON 계약에는 해당 필드가 없었습니다. AI는 HTTP 200을 반환해도 Server 역직렬화가 실패하여 사용자에게 503 RENEWAL_RUNTIME_UNAVAILABLE이 노출됐습니다.

무엇이 바뀌나요?

  • AI가 반환하는 Renewal 확장 필드를 Server 응답 계약에 명시적으로 추가합니다.
  • nullable 목록을 빈 불변 목록으로 정규화합니다.
  • 기존 Server 내부 Adapter와 테스트가 사용하는 생성 계약은 호환 생성자로 유지합니다.
  • WireMock 계약 테스트가 확장 필드를 실제로 역직렬화하는지 검증합니다.

사용자·개발 영향

  • AI의 정상 Renewal 응답이 더 이상 503으로 오인되지 않습니다.
  • Agent가 예외 Workflow에 사용하는 다음 행동·질문·추천 Workflow 필드를 안전하게 수용할 수 있습니다.
  • DB·Flyway·Client·Infra 변경은 없습니다.

검증

  • ./gradlew clean test 전체 통과 (BUILD SUCCESSFUL)
  • 실제 Server → AI 호출에서 HTTP 200 확인
  • 응답이 REVIEW_REQUIRED, guideReviewRequired=true로 정상 매핑되는 것 확인

Refs #10

@hywznn
hywznn marked this pull request as ready for review August 18, 2026 03:49
@hywznn
hywznn merged commit 6d3067a into mainAug 18, 2026
4 checks passed
@hywznn
hywznn deleted the fix/10-renewal-response-contract branch August 18, 2026 03:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@hywznn
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Renewal 확장 응답 계약 수용 - #202

Merged
hywznn merged 3 commits into
mainfrom
fix/10-renewal-response-contract
Aug 18, 2026
Merged

Renewal 확장 응답 계약 수용#202
hywznn merged 3 commits into
mainfrom
fix/10-renewal-response-contract

Conversation

@hywznn

Copy link
Copy Markdown
Member

왜 필요한가요?

AI Renewal 응답에 variant, nextAction, legalConclusion, questions, suggestedWorkflowIds가 추가됐지만 Server의 strict JSON 계약에는 해당 필드가 없었습니다. AI는 HTTP 200을 반환해도 Server 역직렬화가 실패하여 사용자에게 503 RENEWAL_RUNTIME_UNAVAILABLE이 노출됐습니다.

무엇이 바뀌나요?

  • AI가 반환하는 Renewal 확장 필드를 Server 응답 계약에 명시적으로 추가합니다.
  • nullable 목록을 빈 불변 목록으로 정규화합니다.
  • 기존 Server 내부 Adapter와 테스트가 사용하는 생성 계약은 호환 생성자로 유지합니다.
  • WireMock 계약 테스트가 확장 필드를 실제로 역직렬화하는지 검증합니다.

사용자·개발 영향

  • AI의 정상 Renewal 응답이 더 이상 503으로 오인되지 않습니다.
  • Agent가 예외 Workflow에 사용하는 다음 행동·질문·추천 Workflow 필드를 안전하게 수용할 수 있습니다.
  • DB·Flyway·Client·Infra 변경은 없습니다.

검증

  • ./gradlew clean test 전체 통과 (BUILD SUCCESSFUL)
  • 실제 Server → AI 호출에서 HTTP 200 확인
  • 응답이 REVIEW_REQUIRED, guideReviewRequired=true로 정상 매핑되는 것 확인

Refs #10

@hywznn
hywznn marked this pull request as ready for review August 18, 2026 03:49
@hywznn
hywznn merged commit 6d3067a into mainAug 18, 2026
4 checks passed
@hywznn
hywznn deleted the fix/10-renewal-response-contract branch August 18, 2026 03:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@hywznn
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Renewal 확장 응답 계약 수용 - #202

Merged
hywznn merged 3 commits into
mainfrom
fix/10-renewal-response-contract
Aug 18, 2026
Merged

Renewal 확장 응답 계약 수용#202
hywznn merged 3 commits into
mainfrom
fix/10-renewal-response-contract

Conversation

@hywznn

Copy link
Copy Markdown
Member

왜 필요한가요?

AI Renewal 응답에 variant, nextAction, legalConclusion, questions, suggestedWorkflowIds가 추가됐지만 Server의 strict JSON 계약에는 해당 필드가 없었습니다. AI는 HTTP 200을 반환해도 Server 역직렬화가 실패하여 사용자에게 503 RENEWAL_RUNTIME_UNAVAILABLE이 노출됐습니다.

무엇이 바뀌나요?

  • AI가 반환하는 Renewal 확장 필드를 Server 응답 계약에 명시적으로 추가합니다.
  • nullable 목록을 빈 불변 목록으로 정규화합니다.
  • 기존 Server 내부 Adapter와 테스트가 사용하는 생성 계약은 호환 생성자로 유지합니다.
  • WireMock 계약 테스트가 확장 필드를 실제로 역직렬화하는지 검증합니다.

사용자·개발 영향

  • AI의 정상 Renewal 응답이 더 이상 503으로 오인되지 않습니다.
  • Agent가 예외 Workflow에 사용하는 다음 행동·질문·추천 Workflow 필드를 안전하게 수용할 수 있습니다.
  • DB·Flyway·Client·Infra 변경은 없습니다.

검증

  • ./gradlew clean test 전체 통과 (BUILD SUCCESSFUL)
  • 실제 Server → AI 호출에서 HTTP 200 확인
  • 응답이 REVIEW_REQUIRED, guideReviewRequired=true로 정상 매핑되는 것 확인

Refs #10

@hywznn
hywznn marked this pull request as ready for review August 18, 2026 03:49
@hywznn
hywznn merged commit 6d3067a into mainAug 18, 2026
4 checks passed
@hywznn
hywznn deleted the fix/10-renewal-response-contract branch August 18, 2026 03:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@hywznn