From 642dcc4fb629726d2f4d3c759ee07862861c268d Mon Sep 17 00:00:00 2001 From: Prajna1999 Date: Tue, 26 May 2026 16:02:07 +0530 Subject: [PATCH 01/31] poc: test oasfiff API changelog --- .github/workflows/oasdiff.yaml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .github/workflows/oasdiff.yaml diff --git a/.github/workflows/oasdiff.yaml b/.github/workflows/oasdiff.yaml new file mode 100644 index 000000000..23d4b6f67 --- /dev/null +++ b/.github/workflows/oasdiff.yaml @@ -0,0 +1,16 @@ +# generate a changelog +name: oasdiff +on: + pull_request: + branches: [ "main" ] +jobs: + breaking-changes: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - run: git fetch --depth=1 origin ${{ github.base_ref }} + - uses: oasdiff/oasdiff-action/breaking@v0.0.48 + with: + base: 'origin/${{ github.base_ref }}:openapi.yaml' + revision: 'HEAD:openapi.yaml' + fail-on: WARN From 192650fedd82f92001b780b6e7d8756c02c891f4 Mon Sep 17 00:00:00 2001 From: Prajna1999 Date: Tue, 26 May 2026 16:17:40 +0530 Subject: [PATCH 02/31] fix: in CI generate and compare diffs on the fly --- backend/scripts/export_openapi.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 backend/scripts/export_openapi.py diff --git a/backend/scripts/export_openapi.py b/backend/scripts/export_openapi.py new file mode 100644 index 000000000..c1a920028 --- /dev/null +++ b/backend/scripts/export_openapi.py @@ -0,0 +1,25 @@ +"""Export the FastAPI app's OpenAPI schema to a YAML file. + +Usage: + uv run python -m scripts.export_openapi [output_path] + +Defaults to ./openapi.yaml relative to the current working directory. +""" + +import sys +from pathlib import Path + +import yaml + +from app.main import app + + +def main() -> None: + output = Path(sys.argv[1]) if len(sys.argv) > 1 else Path("openapi.yaml") + schema = app.openapi() + output.write_text(yaml.safe_dump(schema, sort_keys=False)) + print(f"[export_openapi] Wrote {output} ({output.stat().st_size} bytes)") + + +if __name__ == "__main__": + main() From 954c594ecc530626a38b07fa5f454d9fa0c11de9 Mon Sep 17 00:00:00 2001 From: Prajna1999 Date: Tue, 26 May 2026 16:18:30 +0530 Subject: [PATCH 03/31] fix: in CI generate and compare diffs on the fly --- .github/workflows/oasdiff.yaml | 66 ++++++++++++++++++++++++++++++---- 1 file changed, 59 insertions(+), 7 deletions(-) diff --git a/.github/workflows/oasdiff.yaml b/.github/workflows/oasdiff.yaml index 23d4b6f67..acf4b96fe 100644 --- a/.github/workflows/oasdiff.yaml +++ b/.github/workflows/oasdiff.yaml @@ -1,16 +1,68 @@ -# generate a changelog +# Generate an API changelog by diffing the OpenAPI schema between base and HEAD. name: oasdiff + on: pull_request: - branches: [ "main" ] + branches: ["main"] + jobs: breaking-changes: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 - - run: git fetch --depth=1 origin ${{ github.base_ref }} - - uses: oasdiff/oasdiff-action/breaking@v0.0.48 + - name: Checkout PR head + uses: actions/checkout@v4 with: - base: 'origin/${{ github.base_ref }}:openapi.yaml' - revision: 'HEAD:openapi.yaml' + path: head + fetch-depth: 0 + + - name: Checkout base ref + uses: actions/checkout@v4 + with: + ref: ${{ github.base_ref }} + path: base + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Install uv + uses: astral-sh/setup-uv@v3 + + - name: Prepare env file + run: cp head/.env.test.example .env + + - name: Export base OpenAPI schema + working-directory: base/backend + env: + ENVIRONMENT: testing + run: | + uv sync --frozen + if [ -f scripts/export_openapi.py ]; then + uv run python scripts/export_openapi.py "$GITHUB_WORKSPACE/base-openapi.yaml" + else + # Base ref predates this workflow; copy the HEAD script in to bootstrap. + cp "$GITHUB_WORKSPACE/head/backend/scripts/export_openapi.py" scripts/ + uv run python scripts/export_openapi.py "$GITHUB_WORKSPACE/base-openapi.yaml" + fi + + - name: Export HEAD OpenAPI schema + working-directory: head/backend + env: + ENVIRONMENT: testing + run: | + uv sync --frozen + uv run python scripts/export_openapi.py "$GITHUB_WORKSPACE/head-openapi.yaml" + + - name: Diff (breaking changes) + uses: oasdiff/oasdiff-action/breaking@v0.0.48 + with: + base: ${{ github.workspace }}/base-openapi.yaml + revision: ${{ github.workspace }}/head-openapi.yaml fail-on: WARN + + - name: Diff (changelog comment) + uses: oasdiff/oasdiff-action/changelog@v0.0.48 + with: + base: ${{ github.workspace }}/base-openapi.yaml + revision: ${{ github.workspace }}/head-openapi.yaml From 81e2cb4be19eeca420085caf4f47cebf0ff0f025 Mon Sep 17 00:00:00 2001 From: Prajna1999 Date: Wed, 27 May 2026 22:49:19 +0530 Subject: [PATCH 04/31] check CI From d61c8286957f47dbe36f18a829095c5dc8192cf2 Mon Sep 17 00:00:00 2001 From: Prajna1999 Date: Thu, 28 May 2026 09:35:41 +0530 Subject: [PATCH 05/31] fix: base cwd for .env.example --- .github/workflows/oasdiff.yaml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/oasdiff.yaml b/.github/workflows/oasdiff.yaml index acf4b96fe..017b5fd9c 100644 --- a/.github/workflows/oasdiff.yaml +++ b/.github/workflows/oasdiff.yaml @@ -29,8 +29,12 @@ jobs: - name: Install uv uses: astral-sh/setup-uv@v3 - - name: Prepare env file - run: cp head/.env.test.example .env + - name: Prepare env files + # get_settings() loads `../.env.test` relative to the backend cwd when + # ENVIRONMENT=testing, so the file must sit at the repo root of each checkout. + run: | + cp head/.env.test.example head/.env.test + cp head/.env.test.example base/.env.test - name: Export base OpenAPI schema working-directory: base/backend From 9eb4ffefa620455f79dd48467ec7630ce64362e6 Mon Sep 17 00:00:00 2001 From: Prajna1999 Date: Thu, 28 May 2026 09:40:42 +0530 Subject: [PATCH 06/31] fix: path for Diff breaking changes step --- .github/workflows/oasdiff.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/oasdiff.yaml b/.github/workflows/oasdiff.yaml index 017b5fd9c..bf207ea13 100644 --- a/.github/workflows/oasdiff.yaml +++ b/.github/workflows/oasdiff.yaml @@ -61,12 +61,12 @@ jobs: - name: Diff (breaking changes) uses: oasdiff/oasdiff-action/breaking@v0.0.48 with: - base: ${{ github.workspace }}/base-openapi.yaml - revision: ${{ github.workspace }}/head-openapi.yaml + base: base-openapi.yaml + revision: head-openapi.yaml fail-on: WARN - name: Diff (changelog comment) uses: oasdiff/oasdiff-action/changelog@v0.0.48 with: - base: ${{ github.workspace }}/base-openapi.yaml - revision: ${{ github.workspace }}/head-openapi.yaml + base: base-openapi.yaml + revision: head-openapi.yaml From e352cf74f26d25fa7bf8976ed05a08c0431c565e Mon Sep 17 00:00:00 2001 From: Prajna1999 Date: Thu, 28 May 2026 09:45:43 +0530 Subject: [PATCH 07/31] test: remove job_id from LLMJobImmediatePublic --- backend/app/models/llm/response.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/app/models/llm/response.py b/backend/app/models/llm/response.py index 439a6adfc..96304d8f2 100644 --- a/backend/app/models/llm/response.py +++ b/backend/app/models/llm/response.py @@ -110,7 +110,7 @@ class IntermediateChainResponse(SQLModel): class LLMJobImmediatePublic(SQLModel): """Immediate response after creating an LLM job.""" - job_id: UUID + # job_id: UUID status: str message: str job_inserted_at: datetime From 0b092d740f34fb3118c9ee5e70e82d44ef699723 Mon Sep 17 00:00:00 2001 From: Prajna1999 Date: Thu, 28 May 2026 10:00:53 +0530 Subject: [PATCH 08/31] chore: better siren and labeling to bypass --- .github/workflows/oasdiff.yaml | 58 ++++++++++++++++++++++++++++++---- 1 file changed, 51 insertions(+), 7 deletions(-) diff --git a/.github/workflows/oasdiff.yaml b/.github/workflows/oasdiff.yaml index bf207ea13..b763abdbf 100644 --- a/.github/workflows/oasdiff.yaml +++ b/.github/workflows/oasdiff.yaml @@ -4,6 +4,12 @@ name: oasdiff on: pull_request: branches: ["main"] + # Re-run when the approval label is added/removed so merge gating updates immediately. + types: [opened, synchronize, reopened, labeled, unlabeled] + +permissions: + contents: read + pull-requests: write jobs: breaking-changes: @@ -58,15 +64,53 @@ jobs: uv sync --frozen uv run python scripts/export_openapi.py "$GITHUB_WORKSPACE/head-openapi.yaml" - - name: Diff (breaking changes) - uses: oasdiff/oasdiff-action/breaking@v0.0.48 + - name: Generate changelog (markdown) + run: | + docker run --rm -v "$PWD:/specs" tufin/oasdiff \ + changelog /specs/base-openapi.yaml /specs/head-openapi.yaml \ + --format markdown > changelog.md || true + docker run --rm -v "$PWD:/specs" tufin/oasdiff \ + breaking /specs/base-openapi.yaml /specs/head-openapi.yaml \ + --format markdown > breaking.md || true + + - name: Build PR comment body + run: | + { + echo "## 📋 OpenAPI changes" + echo + if [ -s breaking.md ] && grep -qE '^\|' breaking.md; then + echo "### ⚠️ Breaking changes" + echo + cat breaking.md + echo + else + echo "✅ No breaking changes detected." + echo + fi + if [ -s changelog.md ] && grep -qE '^\|' changelog.md; then + echo "
Full changelog" + echo + cat changelog.md + echo + echo "
" + fi + echo + echo "_Generated by [oasdiff](https://github.com/oasdiff/oasdiff) · commit ${GITHUB_SHA::8}_" + } > comment.md + cat comment.md >> "$GITHUB_STEP_SUMMARY" + + - name: Post sticky PR comment + uses: marocchino/sticky-pull-request-comment@v2 with: - base: base-openapi.yaml - revision: head-openapi.yaml - fail-on: WARN + header: oasdiff + path: comment.md - - name: Diff (changelog comment) - uses: oasdiff/oasdiff-action/changelog@v0.0.48 + - name: Fail on breaking changes + # Skip the hard fail when a reviewer has explicitly acknowledged the breaking change + # by applying the `breaking-change-approved` label to the PR. + if: ${{ !contains(github.event.pull_request.labels.*.name, 'breaking-change-approved') }} + uses: oasdiff/oasdiff-action/breaking@v0.0.48 with: base: base-openapi.yaml revision: head-openapi.yaml + fail-on: WARN From b90bb97d99fa2f8b19698bcc8b9164204a521246 Mon Sep 17 00:00:00 2001 From: Prajna1999 Date: Thu, 28 May 2026 10:06:24 +0530 Subject: [PATCH 09/31] fix: conditional failure of breaking change --- .github/workflows/oasdiff.yaml | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/.github/workflows/oasdiff.yaml b/.github/workflows/oasdiff.yaml index b763abdbf..609d9bd25 100644 --- a/.github/workflows/oasdiff.yaml +++ b/.github/workflows/oasdiff.yaml @@ -73,12 +73,23 @@ jobs: breaking /specs/base-openapi.yaml /specs/head-openapi.yaml \ --format markdown > breaking.md || true + - name: Debug raw oasdiff output + run: | + echo "=== breaking.md ===" + cat breaking.md || echo "(missing)" + echo + echo "=== changelog.md ===" + cat changelog.md || echo "(missing)" + - name: Build PR comment body run: | + # Treat a file as "has content" if it contains any non-whitespace character. + has_content() { [ -s "$1" ] && grep -q '[^[:space:]]' "$1"; } + { echo "## 📋 OpenAPI changes" echo - if [ -s breaking.md ] && grep -qE '^\|' breaking.md; then + if has_content breaking.md; then echo "### ⚠️ Breaking changes" echo cat breaking.md @@ -87,15 +98,18 @@ jobs: echo "✅ No breaking changes detected." echo fi - if [ -s changelog.md ] && grep -qE '^\|' changelog.md; then - echo "
Full changelog" - echo + + echo "
Full changelog" + echo + if has_content changelog.md; then cat changelog.md - echo - echo "
" + else + echo "_No API changes._" fi echo - echo "_Generated by [oasdiff](https://github.com/oasdiff/oasdiff) · commit ${GITHUB_SHA::8}_" + echo "
" + echo + echo "_Generated by [oasdiff](https://github.com/oasdiff/oasdiff) · commit \`${GITHUB_SHA::8}\`_" } > comment.md cat comment.md >> "$GITHUB_STEP_SUMMARY" From c40815b239f1a9097113a43ac3d4b3d393923208 Mon Sep 17 00:00:00 2001 From: Prajna1999 Date: Thu, 28 May 2026 10:23:35 +0530 Subject: [PATCH 10/31] chore: prettify md files --- .github/workflows/oasdiff.yaml | 23 ++++++++++++++--------- backend/app/models/llm/response.py | 4 ++-- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/.github/workflows/oasdiff.yaml b/.github/workflows/oasdiff.yaml index 609d9bd25..0c4620c06 100644 --- a/.github/workflows/oasdiff.yaml +++ b/.github/workflows/oasdiff.yaml @@ -86,20 +86,25 @@ jobs: # Treat a file as "has content" if it contains any non-whitespace character. has_content() { [ -s "$1" ] && grep -q '[^[:space:]]' "$1"; } + # Indent every line so it stays inside a GitHub blockquote/alert callout. + quote() { sed 's/^/> /'; } + { - echo "## 📋 OpenAPI changes" + echo "## OpenAPI changes" echo if has_content breaking.md; then - echo "### ⚠️ Breaking changes" - echo - cat breaking.md - echo + echo "> [!CAUTION]" + echo "> **You made some changes to the API request/response body that might break downstream**" + echo ">" + quote < breaking.md else - echo "✅ No breaking changes detected." - echo + echo "> [!NOTE]" + echo "> No breaking changes detected." fi + echo - echo "
Full changelog" + echo "
" + echo "Full changelog" echo if has_content changelog.md; then cat changelog.md @@ -109,7 +114,7 @@ jobs: echo echo "
" echo - echo "_Generated by [oasdiff](https://github.com/oasdiff/oasdiff) · commit \`${GITHUB_SHA::8}\`_" + echo "Generated by oasdiff at ${GITHUB_SHA::8}" } > comment.md cat comment.md >> "$GITHUB_STEP_SUMMARY" diff --git a/backend/app/models/llm/response.py b/backend/app/models/llm/response.py index 96304d8f2..33769cfc0 100644 --- a/backend/app/models/llm/response.py +++ b/backend/app/models/llm/response.py @@ -112,8 +112,8 @@ class LLMJobImmediatePublic(SQLModel): # job_id: UUID status: str - message: str - job_inserted_at: datetime + # message: str + # job_inserted_at: datetime job_updated_at: datetime From 8264a025ec456eace16a8a5effc0aac5ec341c70 Mon Sep 17 00:00:00 2001 From: Prajna1999 Date: Thu, 28 May 2026 11:00:43 +0530 Subject: [PATCH 11/31] test --- backend/app/models/llm/response.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/app/models/llm/response.py b/backend/app/models/llm/response.py index 33769cfc0..67e286c60 100644 --- a/backend/app/models/llm/response.py +++ b/backend/app/models/llm/response.py @@ -114,7 +114,7 @@ class LLMJobImmediatePublic(SQLModel): status: str # message: str # job_inserted_at: datetime - job_updated_at: datetime + # job_updated_at: datetime class LLMJobPublic(SQLModel): From e2fcd4d274deb132606711c6d12cf042a5c455c7 Mon Sep 17 00:00:00 2001 From: Prajna1999 Date: Thu, 28 May 2026 11:31:07 +0530 Subject: [PATCH 12/31] garnishing sticky message in the PR comment --- .github/workflows/oasdiff.yaml | 79 +++++++++++++++++++++++----------- 1 file changed, 54 insertions(+), 25 deletions(-) diff --git a/.github/workflows/oasdiff.yaml b/.github/workflows/oasdiff.yaml index 0c4620c06..f38703539 100644 --- a/.github/workflows/oasdiff.yaml +++ b/.github/workflows/oasdiff.yaml @@ -82,44 +82,73 @@ jobs: cat changelog.md || echo "(missing)" - name: Build PR comment body + if: always() run: | - # Treat a file as "has content" if it contains any non-whitespace character. - has_content() { [ -s "$1" ] && grep -q '[^[:space:]]' "$1"; } - - # Indent every line so it stays inside a GitHub blockquote/alert callout. - quote() { sed 's/^/> /'; } + # Count list items: oasdiff markdown emits one bullet/numbered line per change. + count_items() { grep -cE '^([*-]|[0-9]+\.) ' "$1" 2>/dev/null || echo 0; } + plural() { [ "$1" -ne 1 ] && echo s; } + + BREAKING=$(count_items breaking.md) + CHANGES=$(count_items changelog.md) + + # Severity-driven theming: red badge + auto-expanded section when breaking, + # green when only additive, gray when nothing changed at all. + if [ "$BREAKING" -gt 0 ]; then + ALERT='> [!SIREN]' + BADGE="https://img.shields.io/badge/breaking-${BREAKING}-D1242F?style=for-the-badge&labelColor=24292F" + HEADLINE="**${BREAKING} breaking change$(plural $BREAKING) detected** — downstream consumers may need an update before merging." + BREAKING_OPEN=" open" + elif [ "$CHANGES" -gt 0 ]; then + ALERT='> [!TIP]' + BADGE="https://img.shields.io/badge/additive-${CHANGES}-1F883D?style=for-the-badge&labelColor=24292F" + HEADLINE="**${CHANGES} non-breaking change$(plural $CHANGES).** Safe to merge from an API-contract perspective." + BREAKING_OPEN="" + else + ALERT='> [!NOTE]' + BADGE="https://img.shields.io/badge/api-unchanged-6E7781?style=for-the-badge&labelColor=24292F" + HEADLINE="**No API surface changes** in this PR." + BREAKING_OPEN="" + fi { - echo "## OpenAPI changes" + echo "

OpenAPI changes   \"status\"

" echo - if has_content breaking.md; then - echo "> [!CAUTION]" - echo "> **You made some changes to the API request/response body that might break downstream**" - echo ">" - quote < breaking.md - else - echo "> [!NOTE]" - echo "> No breaking changes detected." - fi + echo "${ALERT}" + echo "> ${HEADLINE}" echo - echo "
" - echo "Full changelog" - echo - if has_content changelog.md; then + if [ "$BREAKING" -gt 0 ]; then + echo "" + echo " Breaking changes  ·  ${BREAKING} item$(plural $BREAKING)" + echo + cat breaking.md + echo + echo "
" + echo + fi + + if [ "$CHANGES" -gt 0 ]; then + echo "
" + echo " Full changelog  ·  ${CHANGES} item$(plural $CHANGES)" + echo cat changelog.md - else - echo "_No API changes._" + echo + echo "
" + echo fi + + echo "" + echo "" + echo "" + echo "" + echo "
base${GITHUB_BASE_REF}head${GITHUB_SHA::8}
" echo - echo "
" - echo - echo "Generated by oasdiff at ${GITHUB_SHA::8}" + echo "generated by oasdiff" } > comment.md cat comment.md >> "$GITHUB_STEP_SUMMARY" - name: Post sticky PR comment - uses: marocchino/sticky-pull-request-comment@v2 + uses: marocchino/sticky-pull-request-comment@v3 with: header: oasdiff path: comment.md From f38514415766f74dbdf2b274799eae3b0ef55f2e Mon Sep 17 00:00:00 2001 From: Prajna1999 Date: Thu, 28 May 2026 11:39:25 +0530 Subject: [PATCH 13/31] chore: test with non_breaking changes --- backend/app/models/llm/response.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/backend/app/models/llm/response.py b/backend/app/models/llm/response.py index 67e286c60..e01254325 100644 --- a/backend/app/models/llm/response.py +++ b/backend/app/models/llm/response.py @@ -110,11 +110,12 @@ class IntermediateChainResponse(SQLModel): class LLMJobImmediatePublic(SQLModel): """Immediate response after creating an LLM job.""" - # job_id: UUID - status: str - # message: str - # job_inserted_at: datetime - # job_updated_at: datetime + job_id: UUID + # status: str + message: str + job_inserted_at: datetime + job_updated_at: datetime + deleted_at: datetime class LLMJobPublic(SQLModel): @@ -122,5 +123,5 @@ class LLMJobPublic(SQLModel): job_id: UUID status: str - llm_response: LLMCallResponse | None = None + # llm_response: LLMCallResponse | None = None error_message: str | None = None From 5fc4c825fdff13dd54a39c0ea0e13623a05b3046 Mon Sep 17 00:00:00 2001 From: Prajna1999 Date: Thu, 28 May 2026 11:42:41 +0530 Subject: [PATCH 14/31] chore: revert all schema changes --- backend/app/models/llm/response.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/backend/app/models/llm/response.py b/backend/app/models/llm/response.py index e01254325..439a6adfc 100644 --- a/backend/app/models/llm/response.py +++ b/backend/app/models/llm/response.py @@ -111,11 +111,10 @@ class LLMJobImmediatePublic(SQLModel): """Immediate response after creating an LLM job.""" job_id: UUID - # status: str + status: str message: str job_inserted_at: datetime job_updated_at: datetime - deleted_at: datetime class LLMJobPublic(SQLModel): @@ -123,5 +122,5 @@ class LLMJobPublic(SQLModel): job_id: UUID status: str - # llm_response: LLMCallResponse | None = None + llm_response: LLMCallResponse | None = None error_message: str | None = None From f6a4a0fc83e9166d13890b828dc157e15523f4d2 Mon Sep 17 00:00:00 2001 From: Prajna1999 Date: Thu, 28 May 2026 16:36:43 +0530 Subject: [PATCH 15/31] test: breaking changes --- backend/app/models/response.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/backend/app/models/response.py b/backend/app/models/response.py index 4de982de6..a1fb1a4e7 100644 --- a/backend/app/models/response.py +++ b/backend/app/models/response.py @@ -19,6 +19,7 @@ class ResponsesSyncAPIRequest(SQLModel): temperature: float = 0.1 response_id: str | None = None question: str + lorem: str | None class Config: extra = "allow" @@ -45,8 +46,8 @@ class FileResultChunk(SQLModel): class CallbackResponse(SQLModel): - status: str - response_id: str + # status: str + # response_id: str message: str diagnostics: Diagnostics | None = None From 9781016fd3867fb27a057066215d83543f416e06 Mon Sep 17 00:00:00 2001 From: Prajna1999 Date: Mon, 1 Jun 2026 16:50:46 +0530 Subject: [PATCH 16/31] cosmetic UI changes --- .github/workflows/oasdiff.yaml | 77 +++++++++++++++++++--------------- 1 file changed, 44 insertions(+), 33 deletions(-) diff --git a/.github/workflows/oasdiff.yaml b/.github/workflows/oasdiff.yaml index f38703539..c3ee2d8a1 100644 --- a/.github/workflows/oasdiff.yaml +++ b/.github/workflows/oasdiff.yaml @@ -1,5 +1,5 @@ # Generate an API changelog by diffing the OpenAPI schema between base and HEAD. -name: oasdiff +name: API Changes on: pull_request: @@ -20,12 +20,14 @@ jobs: with: path: head fetch-depth: 0 + persist-credentials: false - name: Checkout base ref uses: actions/checkout@v4 with: ref: ${{ github.base_ref }} path: base + persist-credentials: false - name: Set up Python uses: actions/setup-python@v5 @@ -64,54 +66,69 @@ jobs: uv sync --frozen uv run python scripts/export_openapi.py "$GITHUB_WORKSPACE/head-openapi.yaml" - - name: Generate changelog (markdown) + - name: Generate diff (JSON) run: | + # JSON output gives structured fields (level, operation, path, text) + # so we can render a clean table instead of oasdiff's raw markdown. docker run --rm -v "$PWD:/specs" tufin/oasdiff \ changelog /specs/base-openapi.yaml /specs/head-openapi.yaml \ - --format markdown > changelog.md || true + --format json > changelog.json || echo "[]" > changelog.json docker run --rm -v "$PWD:/specs" tufin/oasdiff \ breaking /specs/base-openapi.yaml /specs/head-openapi.yaml \ - --format markdown > breaking.md || true + --format json > breaking.json || echo "[]" > breaking.json - name: Debug raw oasdiff output run: | - echo "=== breaking.md ===" - cat breaking.md || echo "(missing)" + echo "=== breaking.json ===" + cat breaking.json || echo "(missing)" echo - echo "=== changelog.md ===" - cat changelog.md || echo "(missing)" + echo "=== changelog.json ===" + cat changelog.json || echo "(missing)" - name: Build PR comment body if: always() run: | - # Count list items: oasdiff markdown emits one bullet/numbered line per change. - count_items() { grep -cE '^([*-]|[0-9]+\.) ' "$1" 2>/dev/null || echo 0; } plural() { [ "$1" -ne 1 ] && echo s; } - BREAKING=$(count_items breaking.md) - CHANGES=$(count_items changelog.md) + # Render an oasdiff JSON array as a markdown table. + # Severity dot: red for breaking/warn, white for info. + to_table() { + jq -r ' + def dot(lvl): + if lvl >= 2 then "🔴" + elif lvl == 1 then "🔴" + else "⚪" end; + if (. // []) | length == 0 then "_No entries._" + else + "| | Method | Path | Change |", + "|:-:|:-:|:--|:--|", + (.[] | "| \(dot(.level)) | `\(.operation // "—")` | `\(.path // "—")` | \((.text // "") | gsub("[\r\n]+"; " ")) |") + end + ' "$1" + } + + BREAKING=$(jq 'length' breaking.json) + CHANGES=$(jq 'length' changelog.json) - # Severity-driven theming: red badge + auto-expanded section when breaking, - # green when only additive, gray when nothing changed at all. if [ "$BREAKING" -gt 0 ]; then - ALERT='> [!SIREN]' - BADGE="https://img.shields.io/badge/breaking-${BREAKING}-D1242F?style=for-the-badge&labelColor=24292F" - HEADLINE="**${BREAKING} breaking change$(plural $BREAKING) detected** — downstream consumers may need an update before merging." + STATUS="🔴 **${BREAKING} breaking change$(plural $BREAKING)**" + ALERT='> [!CAUTION]' + HEADLINE="Downstream consumers may need an update before merging." BREAKING_OPEN=" open" elif [ "$CHANGES" -gt 0 ]; then + STATUS="🟢 **${CHANGES} non-breaking change$(plural $CHANGES)**" ALERT='> [!TIP]' - BADGE="https://img.shields.io/badge/additive-${CHANGES}-1F883D?style=for-the-badge&labelColor=24292F" - HEADLINE="**${CHANGES} non-breaking change$(plural $CHANGES).** Safe to merge from an API-contract perspective." + HEADLINE="Safe to merge from an API-contract perspective." BREAKING_OPEN="" else + STATUS="⚪ **No API surface changes**" ALERT='> [!NOTE]' - BADGE="https://img.shields.io/badge/api-unchanged-6E7781?style=for-the-badge&labelColor=24292F" - HEADLINE="**No API surface changes** in this PR." + HEADLINE="This PR does not modify the API contract." BREAKING_OPEN="" fi { - echo "

OpenAPI changes   \"status\"

" + echo "## OpenAPI changes   ${STATUS}" echo echo "${ALERT}" echo "> ${HEADLINE}" @@ -119,9 +136,9 @@ jobs: if [ "$BREAKING" -gt 0 ]; then echo "" - echo " Breaking changes  ·  ${BREAKING} item$(plural $BREAKING)" + echo "Breaking changes  ·  ${BREAKING}" echo - cat breaking.md + to_table breaking.json echo echo "" echo @@ -129,21 +146,15 @@ jobs: if [ "$CHANGES" -gt 0 ]; then echo "
" - echo " Full changelog  ·  ${CHANGES} item$(plural $CHANGES)" + echo "Full changelog  ·  ${CHANGES}" echo - cat changelog.md + to_table changelog.json echo echo "
" echo fi - echo "" - echo "" - echo "" - echo "" - echo "
base${GITHUB_BASE_REF}head${GITHUB_SHA::8}
" - echo - echo "generated by oasdiff" + echo "${GITHUB_BASE_REF}${GITHUB_SHA::8} · generated by oasdiff" } > comment.md cat comment.md >> "$GITHUB_STEP_SUMMARY" From b0266d4d7ac410e314510dccf8b39f72241c1a19 Mon Sep 17 00:00:00 2001 From: Prajna1999 Date: Mon, 1 Jun 2026 16:55:35 +0530 Subject: [PATCH 17/31] test with creds --- backend/app/models/credentials.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/app/models/credentials.py b/backend/app/models/credentials.py index e6741b2e9..cefd8728d 100644 --- a/backend/app/models/credentials.py +++ b/backend/app/models/credentials.py @@ -42,11 +42,12 @@ class CredsCreate(SQLModel): Example: {"openai": {"api_key": "..."}, "langfuse": {"public_key": "..."}} """ - is_active: bool = True + # is_active: bool = True credential: dict[str, Any] = Field( default=None, description="Dictionary mapping provider names to their credentials", ) + creds: str | None class CredsUpdate(SQLModel): From 60a88c5e0d8467b1a48f3e4dcc3729e967344c37 Mon Sep 17 00:00:00 2001 From: Prajna1999 Date: Mon, 1 Jun 2026 16:57:20 +0530 Subject: [PATCH 18/31] another test --- backend/app/models/response.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/app/models/response.py b/backend/app/models/response.py index a1fb1a4e7..85da53bf0 100644 --- a/backend/app/models/response.py +++ b/backend/app/models/response.py @@ -19,7 +19,7 @@ class ResponsesSyncAPIRequest(SQLModel): temperature: float = 0.1 response_id: str | None = None question: str - lorem: str | None + lorem: str | None = None class Config: extra = "allow" From 984c4ccf47c7ce3229587a5d14c510e8e4b0e6d9 Mon Sep 17 00:00:00 2001 From: Prajna1999 Date: Mon, 1 Jun 2026 17:04:06 +0530 Subject: [PATCH 19/31] chore: non breaking gree --- .github/workflows/oasdiff.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/oasdiff.yaml b/.github/workflows/oasdiff.yaml index c3ee2d8a1..477f6c9c5 100644 --- a/.github/workflows/oasdiff.yaml +++ b/.github/workflows/oasdiff.yaml @@ -91,13 +91,13 @@ jobs: plural() { [ "$1" -ne 1 ] && echo s; } # Render an oasdiff JSON array as a markdown table. - # Severity dot: red for breaking/warn, white for info. + # Severity dot: red only for breaking (ERR), green for everything else + # (WARN / INFO — non-breaking additions like optional params). to_table() { jq -r ' def dot(lvl): if lvl >= 2 then "🔴" - elif lvl == 1 then "🔴" - else "⚪" end; + else "🟢" end; if (. // []) | length == 0 then "_No entries._" else "| | Method | Path | Change |", From 985e73864c3044c31b2552d80dc6ad200cb53c24 Mon Sep 17 00:00:00 2001 From: Prajna1999 Date: Mon, 1 Jun 2026 20:08:23 +0530 Subject: [PATCH 20/31] chore: remove test breaking changes --- backend/app/models/credentials.py | 3 +-- backend/app/models/response.py | 5 ++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/backend/app/models/credentials.py b/backend/app/models/credentials.py index cefd8728d..e6741b2e9 100644 --- a/backend/app/models/credentials.py +++ b/backend/app/models/credentials.py @@ -42,12 +42,11 @@ class CredsCreate(SQLModel): Example: {"openai": {"api_key": "..."}, "langfuse": {"public_key": "..."}} """ - # is_active: bool = True + is_active: bool = True credential: dict[str, Any] = Field( default=None, description="Dictionary mapping provider names to their credentials", ) - creds: str | None class CredsUpdate(SQLModel): diff --git a/backend/app/models/response.py b/backend/app/models/response.py index 85da53bf0..4de982de6 100644 --- a/backend/app/models/response.py +++ b/backend/app/models/response.py @@ -19,7 +19,6 @@ class ResponsesSyncAPIRequest(SQLModel): temperature: float = 0.1 response_id: str | None = None question: str - lorem: str | None = None class Config: extra = "allow" @@ -46,8 +45,8 @@ class FileResultChunk(SQLModel): class CallbackResponse(SQLModel): - # status: str - # response_id: str + status: str + response_id: str message: str diagnostics: Diagnostics | None = None From 9be2496dbb0a9c28e86fe93b7e5dea16f4d8d79a Mon Sep 17 00:00:00 2001 From: Prajna Prayas Date: Mon, 1 Jun 2026 20:43:49 +0530 Subject: [PATCH 21/31] Update .github/workflows/oasdiff.yaml Co-authored-by: Ayush <80516839+Ayush8923@users.noreply.github.com> --- .github/workflows/oasdiff.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/oasdiff.yaml b/.github/workflows/oasdiff.yaml index 477f6c9c5..c94910c31 100644 --- a/.github/workflows/oasdiff.yaml +++ b/.github/workflows/oasdiff.yaml @@ -1,5 +1,5 @@ # Generate an API changelog by diffing the OpenAPI schema between base and HEAD. -name: API Changes +name: API Breaking Changes Check on: pull_request: From 9020324613d03be824f00fe39917da2382e17a4b Mon Sep 17 00:00:00 2001 From: Prajna Prayas Date: Mon, 1 Jun 2026 20:44:18 +0530 Subject: [PATCH 22/31] Update .github/workflows/oasdiff.yaml Co-authored-by: Ayush <80516839+Ayush8923@users.noreply.github.com> --- .github/workflows/oasdiff.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/oasdiff.yaml b/.github/workflows/oasdiff.yaml index c94910c31..d0cb879f3 100644 --- a/.github/workflows/oasdiff.yaml +++ b/.github/workflows/oasdiff.yaml @@ -10,6 +10,11 @@ on: permissions: contents: read pull-requests: write + + # One run per PR. A new commit (or label toggle) cancels the in-flight run instead +concurrency: + group: api-changes-pr-${{ github.event.pull_request.number }} + cancel-in-progress: true jobs: breaking-changes: From 7653cc8caa7e7b3ef19d4f9f0c652fb8d83c7851 Mon Sep 17 00:00:00 2001 From: Prajna Prayas Date: Mon, 1 Jun 2026 20:45:34 +0530 Subject: [PATCH 23/31] Update .github/workflows/oasdiff.yaml Co-authored-by: Ayush <80516839+Ayush8923@users.noreply.github.com> --- .github/workflows/oasdiff.yaml | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/.github/workflows/oasdiff.yaml b/.github/workflows/oasdiff.yaml index d0cb879f3..647becada 100644 --- a/.github/workflows/oasdiff.yaml +++ b/.github/workflows/oasdiff.yaml @@ -73,14 +73,21 @@ jobs: - name: Generate diff (JSON) run: | - # JSON output gives structured fields (level, operation, path, text) - # so we can render a clean table instead of oasdiff's raw markdown. - docker run --rm -v "$PWD:/specs" tufin/oasdiff \ - changelog /specs/base-openapi.yaml /specs/head-openapi.yaml \ - --format json > changelog.json || echo "[]" > changelog.json - docker run --rm -v "$PWD:/specs" tufin/oasdiff \ - breaking /specs/base-openapi.yaml /specs/head-openapi.yaml \ - --format json > breaking.json || echo "[]" > breaking.json + set -euo pipefail + + run_diff() { + local cmd="$1" out="$2" + docker run --rm -v "$PWD:/specs" "$OASDIFF_IMAGE" \ + "$cmd" /specs/base-openapi.yaml /specs/head-openapi.yaml \ + --format json > "$out" || true + if ! jq -e . "$out" >/dev/null 2>&1; then + echo "[]" > "$out" + fi + } + run_diff changelog changelog.json + run_diff breaking breaking.json + + echo "breaking=$(jq 'length' breaking.json) changelog=$(jq 'length' changelog.json)" - name: Debug raw oasdiff output run: | From 51350dd70f7c7a80dbd2766f2f71eb76a73f334a Mon Sep 17 00:00:00 2001 From: Prajna Prayas Date: Mon, 1 Jun 2026 20:46:09 +0530 Subject: [PATCH 24/31] Update .github/workflows/oasdiff.yaml Co-authored-by: Ayush <80516839+Ayush8923@users.noreply.github.com> --- .github/workflows/oasdiff.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/oasdiff.yaml b/.github/workflows/oasdiff.yaml index 647becada..a22ae44c1 100644 --- a/.github/workflows/oasdiff.yaml +++ b/.github/workflows/oasdiff.yaml @@ -176,7 +176,7 @@ jobs: header: oasdiff path: comment.md - - name: Fail on breaking changes + - name: Enforce breaking-change gate # Skip the hard fail when a reviewer has explicitly acknowledged the breaking change # by applying the `breaking-change-approved` label to the PR. if: ${{ !contains(github.event.pull_request.labels.*.name, 'breaking-change-approved') }} From bceb06310169132fd2c3439011d223293fc8fe99 Mon Sep 17 00:00:00 2001 From: Prajna Prayas Date: Mon, 1 Jun 2026 20:47:07 +0530 Subject: [PATCH 25/31] Update .github/workflows/oasdiff.yaml Co-authored-by: Ayush <80516839+Ayush8923@users.noreply.github.com> --- .github/workflows/oasdiff.yaml | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/.github/workflows/oasdiff.yaml b/.github/workflows/oasdiff.yaml index a22ae44c1..a80e805df 100644 --- a/.github/workflows/oasdiff.yaml +++ b/.github/workflows/oasdiff.yaml @@ -179,9 +179,12 @@ jobs: - name: Enforce breaking-change gate # Skip the hard fail when a reviewer has explicitly acknowledged the breaking change # by applying the `breaking-change-approved` label to the PR. - if: ${{ !contains(github.event.pull_request.labels.*.name, 'breaking-change-approved') }} - uses: oasdiff/oasdiff-action/breaking@v0.0.48 - with: - base: base-openapi.yaml - revision: head-openapi.yaml - fail-on: WARN +if: ${{ !contains(github.event.pull_request.labels.*.name, 'breaking-change-approved') }} + run: | + set -euo pipefail + count=$(jq 'length' breaking.json) + if [ "$count" -gt 0 ]; then + echo "::error::${count} breaking change(s) detected. Apply the 'breaking-change-approved' label to override the gate." + exit 1 + fi + echo "No breaking changes detected." From 6dea5a7e09a5b501bee55567306f85760f140e65 Mon Sep 17 00:00:00 2001 From: Prajna1999 Date: Tue, 2 Jun 2026 08:48:08 +0530 Subject: [PATCH 26/31] fix: comments --- ...oasdiff.yaml => api-breaking-changes.yaml} | 24 +++++++++---------- backend/app/models/llm/response.py | 3 ++- ...ort_openapi.py => kaapi_export_openapi.py} | 2 +- 3 files changed, 15 insertions(+), 14 deletions(-) rename .github/workflows/{oasdiff.yaml => api-breaking-changes.yaml} (89%) rename backend/scripts/{export_openapi.py => kaapi_export_openapi.py} (89%) diff --git a/.github/workflows/oasdiff.yaml b/.github/workflows/api-breaking-changes.yaml similarity index 89% rename from .github/workflows/oasdiff.yaml rename to .github/workflows/api-breaking-changes.yaml index a80e805df..fe82f7eb3 100644 --- a/.github/workflows/oasdiff.yaml +++ b/.github/workflows/api-breaking-changes.yaml @@ -3,14 +3,15 @@ name: API Breaking Changes Check on: pull_request: - branches: ["main"] + branches: + -- '**' # Re-run when the approval label is added/removed so merge gating updates immediately. types: [opened, synchronize, reopened, labeled, unlabeled] permissions: contents: read pull-requests: write - + # One run per PR. A new commit (or label toggle) cancels the in-flight run instead concurrency: group: api-changes-pr-${{ github.event.pull_request.number }} @@ -19,6 +20,7 @@ concurrency: jobs: breaking-changes: runs-on: ubuntu-latest + timeout-minutes: 15 steps: - name: Checkout PR head uses: actions/checkout@v4 @@ -43,8 +45,6 @@ jobs: uses: astral-sh/setup-uv@v3 - name: Prepare env files - # get_settings() loads `../.env.test` relative to the backend cwd when - # ENVIRONMENT=testing, so the file must sit at the repo root of each checkout. run: | cp head/.env.test.example head/.env.test cp head/.env.test.example base/.env.test @@ -55,12 +55,12 @@ jobs: ENVIRONMENT: testing run: | uv sync --frozen - if [ -f scripts/export_openapi.py ]; then - uv run python scripts/export_openapi.py "$GITHUB_WORKSPACE/base-openapi.yaml" + if [ -f scripts/kaapi_export_openapi.py ]; then + uv run python scripts/kaapi_export_openapi.py "$GITHUB_WORKSPACE/base-openapi.yaml" else # Base ref predates this workflow; copy the HEAD script in to bootstrap. - cp "$GITHUB_WORKSPACE/head/backend/scripts/export_openapi.py" scripts/ - uv run python scripts/export_openapi.py "$GITHUB_WORKSPACE/base-openapi.yaml" + cp "$GITHUB_WORKSPACE/head/backend/scripts/kaapi_export_openapi.py" scripts/ + uv run python scripts/kaapi_export_openapi.py "$GITHUB_WORKSPACE/base-openapi.yaml" fi - name: Export HEAD OpenAPI schema @@ -69,12 +69,12 @@ jobs: ENVIRONMENT: testing run: | uv sync --frozen - uv run python scripts/export_openapi.py "$GITHUB_WORKSPACE/head-openapi.yaml" + uv run python scripts/kaapi_export_openapi.py "$GITHUB_WORKSPACE/head-openapi.yaml" - name: Generate diff (JSON) run: | set -euo pipefail - + run_diff() { local cmd="$1" out="$2" docker run --rm -v "$PWD:/specs" "$OASDIFF_IMAGE" \ @@ -86,7 +86,7 @@ jobs: } run_diff changelog changelog.json run_diff breaking breaking.json - + echo "breaking=$(jq 'length' breaking.json) changelog=$(jq 'length' changelog.json)" - name: Debug raw oasdiff output @@ -179,7 +179,7 @@ jobs: - name: Enforce breaking-change gate # Skip the hard fail when a reviewer has explicitly acknowledged the breaking change # by applying the `breaking-change-approved` label to the PR. -if: ${{ !contains(github.event.pull_request.labels.*.name, 'breaking-change-approved') }} + if: ${{ !contains(github.event.pull_request.labels.*.name, 'breaking-change-approved') }} run: | set -euo pipefail count=$(jq 'length' breaking.json) diff --git a/backend/app/models/llm/response.py b/backend/app/models/llm/response.py index 439a6adfc..42042e1e7 100644 --- a/backend/app/models/llm/response.py +++ b/backend/app/models/llm/response.py @@ -113,6 +113,7 @@ class LLMJobImmediatePublic(SQLModel): job_id: UUID status: str message: str + test: str | None = None job_inserted_at: datetime job_updated_at: datetime @@ -121,6 +122,6 @@ class LLMJobPublic(SQLModel): """Full job response with nested LLM response when complete.""" job_id: UUID - status: str + # status: str llm_response: LLMCallResponse | None = None error_message: str | None = None diff --git a/backend/scripts/export_openapi.py b/backend/scripts/kaapi_export_openapi.py similarity index 89% rename from backend/scripts/export_openapi.py rename to backend/scripts/kaapi_export_openapi.py index c1a920028..48470b758 100644 --- a/backend/scripts/export_openapi.py +++ b/backend/scripts/kaapi_export_openapi.py @@ -1,7 +1,7 @@ """Export the FastAPI app's OpenAPI schema to a YAML file. Usage: - uv run python -m scripts.export_openapi [output_path] + uv run python -m scripts.kaapi_export_openapi [output_path] Defaults to ./openapi.yaml relative to the current working directory. """ From d1bfa4b1055ec8afe51cbf9e59c815d9e1f71e52 Mon Sep 17 00:00:00 2001 From: Prajna1999 Date: Tue, 2 Jun 2026 09:27:23 +0530 Subject: [PATCH 27/31] fix: oasdiff undefined --- .github/workflows/api-breaking-changes.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/api-breaking-changes.yaml b/.github/workflows/api-breaking-changes.yaml index fe82f7eb3..7f312a464 100644 --- a/.github/workflows/api-breaking-changes.yaml +++ b/.github/workflows/api-breaking-changes.yaml @@ -4,7 +4,7 @@ name: API Breaking Changes Check on: pull_request: branches: - -- '**' + --'**' # Re-run when the approval label is added/removed so merge gating updates immediately. types: [opened, synchronize, reopened, labeled, unlabeled] @@ -72,6 +72,8 @@ jobs: uv run python scripts/kaapi_export_openapi.py "$GITHUB_WORKSPACE/head-openapi.yaml" - name: Generate diff (JSON) + env: + OASDIFF_IMAGE: tufin/oasdiff:latest run: | set -euo pipefail From e321c02c554b95bda651ecacf29257138fc61862 Mon Sep 17 00:00:00 2001 From: Prajna1999 Date: Tue, 2 Jun 2026 09:33:49 +0530 Subject: [PATCH 28/31] fix: workflow not triggering --- .github/workflows/api-breaking-changes.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/api-breaking-changes.yaml b/.github/workflows/api-breaking-changes.yaml index 7f312a464..eacd651b7 100644 --- a/.github/workflows/api-breaking-changes.yaml +++ b/.github/workflows/api-breaking-changes.yaml @@ -3,8 +3,7 @@ name: API Breaking Changes Check on: pull_request: - branches: - --'**' + branches: ["main"] # Re-run when the approval label is added/removed so merge gating updates immediately. types: [opened, synchronize, reopened, labeled, unlabeled] From eb833cb962d469e404ed7a825e811ceb217c7bc3 Mon Sep 17 00:00:00 2001 From: Prajna1999 Date: Tue, 2 Jun 2026 09:39:12 +0530 Subject: [PATCH 29/31] fix: logic fix at generate comment --- .github/workflows/api-breaking-changes.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/api-breaking-changes.yaml b/.github/workflows/api-breaking-changes.yaml index eacd651b7..dcd07fe4f 100644 --- a/.github/workflows/api-breaking-changes.yaml +++ b/.github/workflows/api-breaking-changes.yaml @@ -101,7 +101,7 @@ jobs: - name: Build PR comment body if: always() run: | - plural() { [ "$1" -ne 1 ] && echo s; } + plural() { if [ "$1" -ne 1 ]; then echo s; fi; } # Render an oasdiff JSON array as a markdown table. # Severity dot: red only for breaking (ERR), green for everything else From 2e87b8817f0c4b393cda894a59709edcfa0ad93c Mon Sep 17 00:00:00 2001 From: Prajna1999 Date: Tue, 2 Jun 2026 18:57:24 +0530 Subject: [PATCH 30/31] chore: remove test fields --- backend/app/models/llm/response.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/backend/app/models/llm/response.py b/backend/app/models/llm/response.py index 42042e1e7..439a6adfc 100644 --- a/backend/app/models/llm/response.py +++ b/backend/app/models/llm/response.py @@ -113,7 +113,6 @@ class LLMJobImmediatePublic(SQLModel): job_id: UUID status: str message: str - test: str | None = None job_inserted_at: datetime job_updated_at: datetime @@ -122,6 +121,6 @@ class LLMJobPublic(SQLModel): """Full job response with nested LLM response when complete.""" job_id: UUID - # status: str + status: str llm_response: LLMCallResponse | None = None error_message: str | None = None From 6c49b2b68efca0cd0a03548826a3e145188ec3d4 Mon Sep 17 00:00:00 2001 From: Ayush <80516839+Ayush8923@users.noreply.github.com> Date: Tue, 2 Jun 2026 19:16:01 +0530 Subject: [PATCH 31/31] Update backend/scripts/kaapi_export_openapi.py --- backend/scripts/kaapi_export_openapi.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/backend/scripts/kaapi_export_openapi.py b/backend/scripts/kaapi_export_openapi.py index 48470b758..838deae9a 100644 --- a/backend/scripts/kaapi_export_openapi.py +++ b/backend/scripts/kaapi_export_openapi.py @@ -2,8 +2,6 @@ Usage: uv run python -m scripts.kaapi_export_openapi [output_path] - -Defaults to ./openapi.yaml relative to the current working directory. """ import sys