Skip to content

fix(openapi): align buyer contract license metadata - #316

Open
seonghobae wants to merge 17 commits into
mainfrom
fix/openapi-license-authority
Open

fix(openapi): align buyer contract license metadata#316
seonghobae wants to merge 17 commits into
mainfrom
fix/openapi-license-authority

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator

Objective

Advance issue #315 with bounded buyer-facing OpenAPI contract integrity: repository licensing must agree with machine-readable licensing, examples must not imply demo production authority, protected routes must declare their real parameter/auth semantics, and signed artifact range responses must be consumable by generated clients.

Exact current state — 2026-08-10

  • exact head: 71c1e3a9cd26bbd4d193811d8d35927a9af60fe2
  • exact protected main: 55d7ae8647208e301f282350f076eeddaba61d11
  • open, Ready, mergeable
  • CI 31391571756: success
  • Security Scan 31391573204: success
  • SAST Semgrep 31391571894: success
  • fuzz 31391571821: success
  • all known inline review threads are resolved on the current head
  • automated reviews/checks are not qualifying independent approval

Every predecessor SHA, run, review, and PR-body statement is historical.

Test-first defects and fixes

License authority

A RED contract proved the buyer OpenAPI info.license contradicted repository Apache-2.0 authority. The OpenAPI now declares Apache-2.0 with the canonical Apache License 2.0 URL, and Java contract tests parse the actual YAML object rather than relying on whole-file substrings.

Demo identity in machine-readable examples

The spec no longer hard-codes buyer-demo / buyer-demo-operator; neutral tenant-example / operator-example values avoid implying production demo authority. Issue #317 still owns the broader UI/service demo-authority gap.

Protected delete route

The contract test resolves referenced parameters and requires jobId to be in: path and required: true rather than accepting an arbitrary non-null parameter container.

Signed artifact auth and range contract

A review finding identified that tests did not bind /artifacts/{docId}.pdf to its actual authority and range semantics. Test-only head 581f53172d7ba2f8b88086111f9661d8ca953e9b tightened the contract to require:

  • required docId path parameter
  • optional Range header
  • exactly the artifactTokenQuery and artifactTokenBearer security alternatives
  • response statuses 200, 206, 401, 403, 404, 416
  • Content-Range metadata for 206 and 416

Exact-head CI failed RED because the OpenAPI had no headers map for the range responses (500 tests, 1 failure, 0 errors, 0 skipped). Final head 71c1e3a9cd26bbd4d193811d8d35927a9af60fe2 adds only the missing contract metadata:

  • 206: Content-Range string, documented as bytes start-end/total
  • 416: Content-Range string, documented as bytes */total

The four exact-head CI/security/SAST/fuzz workflows are now green, and CodeRabbit marked the corresponding findings addressed.

Scope / non-completion boundary

Changed paths remain limited to:

  1. docs/deployment/clearfolio-buyer-connector.openapi.yaml
  2. scripts/test_buyer_openapi_license_contract.py
  3. src/test/java/com/clearfolio/viewer/config/BuyerOpenApiLicenseContractTest.java
  4. src/test/java/com/clearfolio/viewer/config/BuyerOpenApiRouteContractTest.java

This PR does not complete issue #315. The buyer OpenAPI remains a partial seed; complete route/DTO/error/schema parity, API version policy, breaking-change detection, generated standalone and naruon clients, version negotiation, and release-provenance binding remain open. PR #337 independently owns the unique operationId invariant.

Merge gate

Merge only if this unchanged final head continues to satisfy live repository protection, has zero valid unresolved findings, and receives the qualifying independent non-author approval with write access required by protected main. After integration, continue issue #315 rather than closing it.

@coderabbitai

coderabbitai Bot commented Aug 10, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

구매자 OpenAPI 문서에 Apache-2.0 라이선스, 테넌트 예제, conversion 삭제, PDF artifact, liveness 계약을 추가했습니다. Python 및 Java 계약 테스트가 해당 메타데이터와 경로 정의를 검증합니다.

Changes

구매자 OpenAPI 계약 검증

Layer / File(s) Summary
OpenAPI 메타데이터 및 엔드포인트 계약
docs/deployment/clearfolio-buyer-connector.openapi.yaml
라이선스와 예제 식별자를 변경했습니다. conversion job 삭제, signed PDF artifact 조회, /healthz 엔드포인트를 추가했습니다. 보안 방식, 범위 매개변수, 오류 응답 및 HealthResponse 스키마를 정의했습니다.
Python 라이선스 계약 테스트
scripts/test_buyer_openapi_license_contract.py
저장소 라이선스의 Apache License 2.0 시작 문자열을 확인합니다. OpenAPI의 독점 라이선스 문구와 기존 구매자 데모 식별자를 거부하고 새 예제 식별자를 요구합니다.
Java OpenAPI 계약 테스트
src/test/java/com/clearfolio/viewer/config/BuyerOpenApiLicenseContractTest.java, src/test/java/com/clearfolio/viewer/config/BuyerOpenApiRouteContractTest.java
OpenAPI 라이선스 이름과 URL을 검증합니다. 삭제, PDF artifact, liveness 경로의 operation ID, 보안 설정, 매개변수, 응답 및 스키마 참조를 검증합니다.

Estimated code review effort: 3 (Moderate) | ~20분

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목은 구매자 OpenAPI 계약의 라이선스 메타데이터 정렬이라는 PR의 주요 변경 사항을 명확하고 간결하게 설명합니다.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/openapi-license-authority

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@seonghobae
seonghobae marked this pull request as ready for review August 10, 2026 02:45
@seonghobae
seonghobae enabled auto-merge (squash) August 10, 2026 02:46

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@opencode-agent @cwl-noema-review Please independently review exact head d5b2cdfcfe955efe6d26335eeefdc4e21952f87d against protected main f3cc09a9838f0f88c81a2ceae22138fab80a2edb. This bounded issue-#315 slice only aligns the buyer OpenAPI license metadata with the repository's Apache-2.0 authority and adds a regression rejecting the former proprietary-only claim. Exact-head CI 31350577072, Security Scan 31350577063, and SAST 31350577066 are successful; no predecessor evidence is being counted. Verify the actual two-file diff, machine-readable license truth, no unintended API/schema claim change, and current-head contract test. Report actionable findings or a formal review; automated review remains advisory unless repository policy actually counts the reviewer identity.

@coderabbitai

coderabbitai Bot commented Aug 10, 2026

Copy link
Copy Markdown
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

HEAD_SHA="d5b2cdfcfe955efe6d26335eeefdc4e21952f87d"
BASE_SHA="f3cc09a9838f0f88c81a2ceae22138fab80a2edb"
REPO="ContextualWisdomLab/clearfolio"

echo '== Local commit availability and identity =='
git rev-parse HEAD
git show -s --format='commit=%H%nparents=%P%nsubject=%s' "$HEAD_SHA"
git show -s --format='commit=%H%nparents=%P%nsubject=%s' "$BASE_SHA"

echo '== Exact changed paths and diff stat =='
git diff --name-status "$BASE_SHA" "$HEAD_SHA"
git diff --stat "$BASE_SHA" "$HEAD_SHA"

echo '== Complete requested-range diff =='
git diff --no-ext-diff --unified=80 "$BASE_SHA" "$HEAD_SHA" -- \
  docs/deployment/clearfolio-buyer-connector.openapi.yaml \
  scripts/test_buyer_openapi_license_contract.py

echo '== Root LICENSE authority (first 40 lines) =='
sed -n '1,40p' LICENSE

echo '== Current OpenAPI info/license block =='
awk '
  /^info:[[:space:]]*$/ { in_info=1 }
  in_info { print }
  in_info && /^paths:[[:space:]]*$/ { exit }
' docs/deployment/clearfolio-buyer-connector.openapi.yaml

echo '== Contract test source =='
cat -n scripts/test_buyer_openapi_license_contract.py

echo '== GitHub PR head/base and current checks =='
gh pr view 316 --repo "$REPO" --json number,state,isDraft,mergeable,headRefOid,baseRefOid,reviewDecision,statusCheckRollup
gh api "repos/$REPO/commits/$HEAD_SHA/check-runs?per_page=100" \
  --jq '.check_runs[] | [.name, .status, .conclusion, .details_url] | `@tsv`'

echo '== Live main and branch protection =='
gh api "repos/$REPO/git/ref/heads/main" --jq '.object.sha'
gh api "repos/$REPO/branches/main/protection" \
  --jq '{required_pull_request_reviews, required_status_checks, enforce_admins}'

Length of output: 27199


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo '== Locate Buyer-readiness workflow and test-discovery references =='
rg -n -C 4 --hidden \
  -g '!**/.git/**' \
  -e 'Buyer-readiness script tests' \
  -e 'test_buyer_openapi_license_contract' \
  -e 'unittest' \
  -e 'scripts/test_.*\.py' \
  .

echo '== GitHub job steps for the successful Buyer-readiness job =='
gh api 'repos/ContextualWisdomLab/clearfolio/actions/jobs/93340438963' \
  --jq '{name, status, conclusion, head_sha, started_at, completed_at, steps: [.steps[] | {name, status, conclusion, number}]}'

Length of output: 16149


@seonghobae Review finding:

  • P2 — Bind the regression to info.license. scripts/test_buyer_openapi_license_contract.py checks document-wide substrings. A later change could set info.license back to an incorrect value while retaining name: Apache-2.0 and the Apache URL in another YAML field. The test would pass, but the machine-readable license object would be wrong again. Parse the OpenAPI YAML and assert document["info"]["license"]["name"] and document["info"]["license"]["url"] directly.

The exact range contains only the stated two files. The current info.license object matches the root Apache 2.0 license. The API paths and schemas are unchanged. The exact-head Buyer-readiness, Maven, Semgrep, and Security Scan checks succeeded.

I could not verify branch-protection requirements because GitHub returned HTTP 403. The PR still reports REVIEW_REQUIRED, and strix was in progress when inspected. Do not treat this review as merge approval.

⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

Fresh retry after the previous rate-limit window. Please review exact source head d5b2cdfcfe955efe6d26335eeefdc4e21952f87d against current protected main 83ec6f7fe2b04bdcd28bf98ec350e41e55730a18. The PR is one commit behind only because protected main integrated the unrelated Junrar baseline; the two-file effective delta remains the buyer OpenAPI Apache-2.0 license metadata correction plus its regression. Verify that this bounded slice does not broaden API/schema support claims and report only current-head actionable findings. Automated review remains advisory and is not counted as independent approval.

@coderabbitai

coderabbitai Bot commented Aug 10, 2026

Copy link
Copy Markdown
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

repo="ContextualWisdomLab/clearfolio"
head="d5b2cdfcfe955efe6d26335eeefdc4e21952f87d"
base="83ec6f7fe2b04bdcd28bf98ec350e41e55730a18"

echo "== Commit identities and ancestry =="
git show -s --format='%H%n%P%n%s' "$head"
git show -s --format='%H%n%P%n%s' "$base"
git merge-base --is-ancestor "$base" "$head" && echo "base_is_ancestor_of_head=true" || echo "base_is_ancestor_of_head=false"
git merge-base "$base" "$head"

echo "== Pull request state =="
gh pr view 316 --repo "$repo" \
  --json number,state,isDraft,mergeable,headRefOid,baseRefOid,reviewDecision,statusCheckRollup

echo "== Live protected main ref =="
gh api "repos/$repo/git/ref/heads/main" --jq '.object.sha'

echo "== Effective changed paths and complete diff =="
git diff --name-status "$base" "$head"
git diff --stat "$base" "$head"
git diff --no-ext-diff --unified=60 "$base" "$head" -- \
  docs/deployment/clearfolio-buyer-connector.openapi.yaml \
  scripts/test_buyer_openapi_license_contract.py

echo "== Root license authority =="
sed -n '1,35p' LICENSE

echo "== OpenAPI top-level metadata through paths marker =="
sed -n '1,100p' docs/deployment/clearfolio-buyer-connector.openapi.yaml

echo "== Contract test =="
cat -n scripts/test_buyer_openapi_license_contract.py

echo "== Contract-test discovery references =="
rg -n -C 3 --hidden -g '!**/.git/**' \
  'test_buyer_openapi_license_contract|Buyer-readiness|unittest' \
  .github scripts 2>/dev/null || true

echo "== Current check runs for requested head =="
gh api "repos/$repo/commits/$head/check-runs?per_page=100" \
  --jq '.check_runs[] | [.name,.status,.conclusion] | `@tsv`'

Length of output: 33684


🏁 Script executed:

#!/bin/bash
set -euo pipefail

head="d5b2cdfcfe955efe6d26335eeefdc4e21952f87d"
merge_base="f3cc09a9838f0f88c81a2ceae22138fab80a2edb"

echo "== Source-only delta from merge base to requested head =="
git diff --name-status "$merge_base" "$head"
git diff --check "$merge_base" "$head"
git diff --no-ext-diff --unified=30 "$merge_base" "$head" -- \
  docs/deployment/clearfolio-buyer-connector.openapi.yaml \
  scripts/test_buyer_openapi_license_contract.py

echo "== Buyer-readiness workflow script-test step =="
sed -n '29,65p' .github/workflows/ci.yml

echo "== License test assertion locations =="
rg -n -C 2 \
  'assert(In|NotIn|Equal|True)|OPENAPI_PATH|LICENSE_PATH' \
  scripts/test_buyer_openapi_license_contract.py

Length of output: 6939


@seonghobae Review complete for source head d5b2cdfcfe955efe6d26335eeefdc4e21952f87d.

P2 — Bind the regression to info.license.
scripts/test_buyer_openapi_license_contract.py uses document-wide substring checks at Lines 25-27. A later change can set info.license to an incorrect value while retaining Apache-2.0 and the Apache URL elsewhere in the YAML document. The test would then pass although the machine-readable OpenAPI license object is incorrect.

Parse the OpenAPI document and assert these exact fields:

  • document["info"]["license"]["name"] == "Apache-2.0"
  • document["info"]["license"]["url"] == "https://www.apache.org/licenses/LICENSE-2.0.html"

The source-only delta from merge base f3cc09a9838f0f88c81a2ceae22138fab80a2edb contains the stated two files. The pom.xml difference exists only because protected main contains the unrelated Junrar update. The OpenAPI paths and schemas are unchanged. The current info.license values match the root Apache 2.0 license. The Buyer-readiness script test succeeded on the requested head.

This review is advisory. It is not an approval.

⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@scripts/test_buyer_openapi_license_contract.py`:
- Around line 21-27: Update the OpenAPI assertions in the test method to parse
OPENAPI_PATH as YAML and directly assert document["info"]["license"]["name"]
equals "Apache-2.0" and document["info"]["license"]["url"] equals the Apache
license URL. Remove the whole-file substring checks, and add the YAML parser to
the test dependencies and execution environment if it is not already available.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 90793cee-0c6d-4365-b3c5-9f9b309d32eb

📥 Commits

Reviewing files that changed from the base of the PR and between 83ec6f7 and b9ea77a.

📒 Files selected for processing (2)
  • docs/deployment/clearfolio-buyer-connector.openapi.yaml
  • scripts/test_buyer_openapi_license_contract.py

Comment thread scripts/test_buyer_openapi_license_contract.py
@opencode-agent
opencode-agent Bot disabled auto-merge August 10, 2026 04:54
@seonghobae
seonghobae enabled auto-merge (squash) August 10, 2026 05:31

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@src/test/java/com/clearfolio/viewer/config/BuyerOpenApiRouteContractTest.java`:
- Line 39: Update BuyerOpenApiRouteContractTest’s deleteOperation parameter
assertions to inspect the parameters array directly and require a parameter with
name jobId, in path, and required true, rather than only asserting that
parameters is non-null.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 9707dd5c-0096-41fc-9998-f9983d24a4eb

📥 Commits

Reviewing files that changed from the base of the PR and between b9ea77a and 7e97ee6.

📒 Files selected for processing (4)
  • docs/deployment/clearfolio-buyer-connector.openapi.yaml
  • scripts/test_buyer_openapi_license_contract.py
  • src/test/java/com/clearfolio/viewer/config/BuyerOpenApiLicenseContractTest.java
  • src/test/java/com/clearfolio/viewer/config/BuyerOpenApiRouteContractTest.java
🚧 Files skipped from review as they are similar to previous changes (1)
  • docs/deployment/clearfolio-buyer-connector.openapi.yaml

Comment thread src/test/java/com/clearfolio/viewer/config/BuyerOpenApiRouteContractTest.java Outdated
@opencode-agent
opencode-agent Bot disabled auto-merge August 10, 2026 07:11

Copy link
Copy Markdown
Collaborator Author

@opencode-agent Please independently review exact current head b6d79bce1cbbcc34e2743891788d96d40ab42d87 against protected main 83ec6f7fe2b04bdcd28bf98ec350e41e55730a18. This is a new exact-head invocation: the prior trusted mention was bound to predecessor d5b2cdfcfe955efe6d26335eeefdc4e21952f87d and must not transfer. Current exact-head CI 31365702909, Security Scan 31365702867, SAST Semgrep 31365702862, and fuzz 31365702957 are all successful; the two returned CodeRabbit threads are resolved/outdated. Verify the actual four-file diff, structured info.license assertions, demo-identity removal, delete-route path-parameter semantics, and that this bounded issue-#315 slice does not overclaim API completeness. If evidence supports it, submit the normal formal current-head review under the existing independent OpenCode reviewer identity; do not update the branch, enable/perform merge, or weaken any gate.

Copy link
Copy Markdown
Collaborator Author

@cwl-noema-review Please independently review exact current head b6d79bce1cbbcc34e2743891788d96d40ab42d87 against protected main 83ec6f7fe2b04bdcd28bf98ec350e41e55730a18. The predecessor Noema request was bound to d5b2cdfcfe955efe6d26335eeefdc4e21952f87d and is stale. Exact-head CI/Security/SAST/fuzz are all successful and current inline findings are resolved/outdated. Verify the actual four-file OpenAPI/license/demo-identity/delete-route contract delta, reject overclaiming issue #315 completeness, and report only source-backed current-head findings or an explicit clean verdict. Do not mutate the branch or merge.

@opencode-agent

Copy link
Copy Markdown
Contributor

Queued @cwl-noema-review for PR #316 at head b6d79bce1cbbcc34e2743891788d96d40ab42d87. Central exact-name Actions artifacts are the durable dispatch ledger; existing review workflows remain authoritative for the final verdict and failure evidence.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/deployment/clearfolio-buyer-connector.openapi.yaml`:
- Around line 307-321: OpenAPI의 해당 응답 정의에서 206과 416에 Content-Range 헤더를 추가하세요.
206은 bytes start-end/total 형식, 416은 bytes */total 형식을 설명하도록 각각 스키마와 설명을 선언하고, 다른
응답 정의는 변경하지 마세요.

In
`@src/test/java/com/clearfolio/viewer/config/BuyerOpenApiRouteContractTest.java`:
- Around line 51-53: BuyerOpenApiRouteContractTest의 getOperation 검증을 컨테이너 타입
확인에서 실제 계약 값 검증으로 확장하세요. 해결된 parameters에서 docId path parameter와 선택적인 Range
header의 이름, 위치, 필수 여부를 확인하고, operation security가 artifactTokenQuery와
artifactTokenBearer 요구사항만 정확히 포함하는지 검증하세요.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 044fc74f-8f85-45f8-b6a6-0ddf9e84c968

📥 Commits

Reviewing files that changed from the base of the PR and between 7e97ee6 and 5218537.

📒 Files selected for processing (2)
  • docs/deployment/clearfolio-buyer-connector.openapi.yaml
  • src/test/java/com/clearfolio/viewer/config/BuyerOpenApiRouteContractTest.java

Comment thread docs/deployment/clearfolio-buyer-connector.openapi.yaml
Comment thread src/test/java/com/clearfolio/viewer/config/BuyerOpenApiRouteContractTest.java Outdated
@opencode-agent

Copy link
Copy Markdown
Contributor

Queued @cwl-noema-review for PR #316 at head 52185370e866424f58177f310a11fa741ba679ce. Central exact-name Actions artifacts are the durable dispatch ledger; existing review workflows remain authoritative for the final verdict and failure evidence.

Copy link
Copy Markdown
Collaborator Author

@opencode-agent @cwl-noema-review Please independently review exact current head 52185370e866424f58177f310a11fa741ba679ce against protected main 55d7ae8647208e301f282350f076eeddaba61d11. Exact-head CI 31384829342, Security Scan 31384829301, SAST 31384829331, and fuzz 31384829330 are successful. Verify structured info.license authority, removal of demo identities from machine-readable examples, the required delete-route jobId path parameter contract, and the explicit boundary that this four-file slice does not complete issue #315. PR #337 separately owns unique operationIds. Advisory review only; do not mutate, count as human approval, merge, or weaken gates.

@opencode-agent
opencode-agent Bot disabled auto-merge August 10, 2026 13:02
@opencode-agent

Copy link
Copy Markdown
Contributor

Queued @cwl-noema-review for PR #316 at head 71c1e3a9cd26bbd4d193811d8d35927a9af60fe2. Central exact-name Actions artifacts are the durable dispatch ledger; existing review workflows remain authoritative for the final verdict and failure evidence.

Sign up for free to 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