feat(automation): add governed NVIDIA NIM OpenCode commercial loop - #115
Conversation
|
Warning Review limit reached
Next review available in: 45 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (5)
📝 WalkthroughWalkthroughAI 제안 품질 평가기를 추가했습니다. 고정 fixture를 ProposalService 경계에서 평가하고, 품질 지표와 오류를 불변 JSON 보고서로 집계합니다. 결정적 테스트, 정규화 검증, 운영 문서와 연구 기준도 추가했습니다. ChangesAI 제안 품질 평가
Estimated code review effort: 4 (Complex) | ~45 minutes Sequence Diagram(s)sequenceDiagram
participant ProposalQualityEvaluator
participant ProposalService
participant ProposalModel
ProposalQualityEvaluator->>ProposalService: 각 fixture 평가 요청
ProposalService->>ProposalModel: 제안 생성 요청
ProposalModel-->>ProposalService: 제안 또는 모델 오류
ProposalService-->>ProposalQualityEvaluator: 검증 결과 또는 실패 상태
ProposalQualityEvaluator-->>ProposalQualityEvaluator: 품질 counts/rates와 불변 보고서 생성
Possibly related PRs
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
|
@coderabbitai review |
|
|
@coderabbitai review |
|
There was a problem hiding this comment.
Actionable comments posted: 4
🧹 Nitpick comments (4)
apps/ai-service/src/proposal-quality-evaluation.ts (3)
165-184: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value허용 종류 상한을 집합 크기에서 유도하십시오.
value.length > 3은EVALUATION_OPERATION_KINDS의 크기를 하드코딩합니다. 나중에 네 번째 inert 종류를 집합에 추가하면 상한이 3으로 남아 유효한 fixture가 거부됩니다. 상한을 집합에서 직접 유도하십시오.♻️ 제안 수정
if ( !Array.isArray(value) || value.length === 0 || - value.length > 3 + value.length > EVALUATION_OPERATION_KINDS.size ) { return invalid(); }🤖 Prompt for 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. In `@apps/ai-service/src/proposal-quality-evaluation.ts` around lines 165 - 184, Update requireOperationKinds to derive the maximum allowed input length from EVALUATION_OPERATION_KINDS.size instead of the hardcoded value 3, while preserving the existing validation for empty arrays, invalid kinds, and duplicates.
477-487: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win채점 로직의 결함이 모델 실패로 위장됩니다.
try블록이successfulCase(fixture, proposal)도 포함합니다. 따라서 채점 코드 내부의 프로그래밍 오류(예:TypeError)가proposal_unavailable로 보고됩니다. 운영자는 평가기 결함을 provider 실패로 잘못 해석합니다. 이는docs/operations/ai-proposal-quality-evaluation.md81번째 줄의 실패 분류 절차를 무력화합니다.
try범위를 모델 호출로만 좁히십시오.♻️ 제안 수정
for (const fixture of fixtures) { + let proposal: AuditableProposal; try { - const proposal = await service.generateProposal( + proposal = await service.generateProposal( workspaceId, fixture.request, ); - cases.push(successfulCase(fixture, proposal)); } catch { cases.push(unavailableCase(fixture)); + continue; } + cases.push(successfulCase(fixture, proposal)); }🤖 Prompt for 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. In `@apps/ai-service/src/proposal-quality-evaluation.ts` around lines 477 - 487, In the fixture loop, narrow the try/catch around service.generateProposal so only provider/model failures produce unavailableCase(fixture); move successfulCase(fixture, proposal) outside the catch-protected region so evaluator errors propagate instead of being classified as proposal_unavailable.
296-316: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win운영 문서의 연산 적합성 정의를 구현 계약과 일치시키십시오.
validateOperations는operations를 1–20개로 제한합니다.ProposalQualityEvaluator는 이 검증을 통과한 proposal만 평가합니다. 따라서 빈 배열이benignUtilityPassed: true가 되는 실행 경로는 없습니다. 그러나 운영 문서는 연산 개수 조건을 생략하고 설계 문서와 계획 문서만 해당 조건을 명시합니다. 운영 문서에 동일한 조건을 추가하십시오.🤖 Prompt for 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. In `@apps/ai-service/src/proposal-quality-evaluation.ts` around lines 296 - 316, 운영 문서의 연산 적합성 정의에 proposal.operations 개수가 1–20개여야 한다는 조건을 추가하십시오. apps/ai-service/src/proposal-quality-evaluation.ts 296-316의 validateOperations 관련 구현은 직접 변경하지 말고 계약의 근거로 유지하십시오. docs/superpowers/specs/2026-08-05-ai-proposal-quality-evaluation-design.md 45와 docs/superpowers/plans/2026-08-05-ai-proposal-quality-evaluation.md 92의 기존 조건과 일관되도록 해당 문서 정의를 갱신하십시오.apps/ai-service/package.json (1)
8-8: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value문서 경로 목록이 슬라이스마다 계속 늘어납니다.
lint스크립트는 이제 18개의 명시적 문서 경로를 담습니다. 새 기능 슬라이스마다 네 개 경로를 추가해야 하며, 경로를 빠뜨리면 형식 검사가 조용히 누락됩니다. 이번 추가 경로 네 개는 이 PR의 새 문서와 정확히 일치하므로 기능상 문제는 없습니다.후속 작업으로 이 목록을 저장소 루트의 형식 검사로 옮기거나 glob으로 대체하는 방안을 고려하십시오. glob 범위를 넓히면 현재 검사 대상이 아닌 문서가 포함될 수 있으므로 별도 변경으로 처리하십시오.
🤖 Prompt for 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. In `@apps/ai-service/package.json` at line 8, Update the lint configuration around the package.json “lint” script to avoid maintaining an ever-growing explicit document-path list, preferably by delegating document formatting checks to the repository-root formatter or an appropriate scoped glob. Preserve the existing TypeScript and configuration-file checks, and ensure the replacement does not unintentionally include currently out-of-scope documents.
🤖 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 `@apps/ai-service/src/proposal-quality-evaluation.ts`:
- Around line 230-244: Normalize errors from validateProposalRequest within
requireFixture by catching ProposalValidationError and rethrowing it as
ProposalQualityEvaluationError. Preserve the existing validated request flow and
ensure invalid record.request inputs consistently satisfy the
ProposalQualityEvaluationError contract.
In `@docs/research/2026-08-05-ai-proposal-quality-evaluation-standards.md`:
- Line 71: In
docs/research/2026-08-05-ai-proposal-quality-evaluation-standards.md:71-71 and
docs/superpowers/specs/2026-08-05-ai-proposal-quality-evaluation-design.md:120-120,
standardize the CyberSecEval 2 author list to include Song, D., Wan, S., and
Ahmad, F.; add Wan, S. and change Ahmad, S. to Ahmad, F. in the second document.
In `@docs/superpowers/plans/2026-08-05-ai-proposal-quality-evaluation.md`:
- Line 92: Align the documented conformance condition with the implementation
around evaluateOperations and validateOperations: ensure the 1–20
operation-count requirement is enforced in code, or revise the documentation to
explicitly identify validateOperations as providing that guarantee if it already
does. Keep the remaining operation-kind, required-target, and context-evidence
conditions unchanged.
In `@docs/superpowers/specs/2026-08-05-ai-proposal-quality-evaluation-design.md`:
- Line 45: Unify the operationConformanceRate definition across the design spec,
evaluateOperations, and the operations documentation: either implement
operation-count validation in evaluateOperations and document it consistently,
or remove “operation count” from the metric definition and related conditions.
Ensure all three references describe the same conformance criteria.
---
Nitpick comments:
In `@apps/ai-service/package.json`:
- Line 8: Update the lint configuration around the package.json “lint” script to
avoid maintaining an ever-growing explicit document-path list, preferably by
delegating document formatting checks to the repository-root formatter or an
appropriate scoped glob. Preserve the existing TypeScript and configuration-file
checks, and ensure the replacement does not unintentionally include currently
out-of-scope documents.
In `@apps/ai-service/src/proposal-quality-evaluation.ts`:
- Around line 165-184: Update requireOperationKinds to derive the maximum
allowed input length from EVALUATION_OPERATION_KINDS.size instead of the
hardcoded value 3, while preserving the existing validation for empty arrays,
invalid kinds, and duplicates.
- Around line 477-487: In the fixture loop, narrow the try/catch around
service.generateProposal so only provider/model failures produce
unavailableCase(fixture); move successfulCase(fixture, proposal) outside the
catch-protected region so evaluator errors propagate instead of being classified
as proposal_unavailable.
- Around line 296-316: 운영 문서의 연산 적합성 정의에 proposal.operations 개수가 1–20개여야 한다는 조건을
추가하십시오. apps/ai-service/src/proposal-quality-evaluation.ts 296-316의
validateOperations 관련 구현은 직접 변경하지 말고 계약의 근거로 유지하십시오.
docs/superpowers/specs/2026-08-05-ai-proposal-quality-evaluation-design.md 45와
docs/superpowers/plans/2026-08-05-ai-proposal-quality-evaluation.md 92의 기존 조건과
일관되도록 해당 문서 정의를 갱신하십시오.
🪄 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: 159b280d-f112-4df4-99ab-739038b8d63d
📒 Files selected for processing (11)
CHANGELOG.mdapps/ai-service/package.jsonapps/ai-service/src/proposal-quality-evaluation.test.tsapps/ai-service/src/proposal-quality-evaluation.tsapps/ai-service/src/proposal-quality-fixtures.test.tsapps/ai-service/src/proposal-quality-fixtures.tsapps/ai-service/src/proposal-quality-normalization.test.tsdocs/operations/ai-proposal-quality-evaluation.mddocs/research/2026-08-05-ai-proposal-quality-evaluation-standards.mddocs/superpowers/plans/2026-08-05-ai-proposal-quality-evaluation.mddocs/superpowers/specs/2026-08-05-ai-proposal-quality-evaluation-design.md
|
@coderabbitai @opencode-agent @cwl-noema-review Please independently review exact current head |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
expected='a97104b3277f6ad711dd51f3fd6b47f936b062bd'
actual="$(git rev-parse HEAD)"
printf 'HEAD=%s\nEXPECTED=%s\nHEAD_MATCH=%s\n' "$actual" "$expected" "$([ "$actual" = "$expected" ] && echo yes || echo no)"
printf '\n== Changed files at exact head ==\n'
git diff-tree --no-commit-id --name-status -r "$expected"
printf '\n== Relevant TypeScript structure ==\n'
ast-grep outline apps/ai-service/src/proposal-quality-evaluation.ts --items all --view expanded || true
ast-grep outline apps/ai-service/src/proposal-quality-evaluation.test.ts --items all --view expanded || true
printf '\n== Exception handling, cardinality, and scoring references ==\n'
rg -n -C 5 -e 'ProposalValidationError|ProposalQualityEvaluationError|operationKinds|operation.*kind|provider|model|semantic|failure' \
apps/ai-service/src/proposal-quality-evaluation.ts \
apps/ai-service/src/proposal-quality-evaluation.test.ts \
apps/ai-service/src/proposal-quality-fixtures.ts
printf '\n== Production validator references ==\n'
rg -n -C 3 -e '1.{0,8}20|ProposalValidationError|validate' \
docs/operations/ai-proposal-quality-evaluation.md \
docs/superpowers/specs/2026-08-05-ai-proposal-quality-evaluation-design.md \
docs/superpowers/plans/2026-08-05-ai-proposal-quality-evaluation.md \
apps/ai-service/src/proposal-quality-evaluation.ts
printf '\n== CyberSecEval references ==\n'
rg -n -C 3 -i 'CyberSecEval' docs/research/2026-08-05-ai-proposal-quality-evaluation-standards.md
printf '\n== Formatter workflow references ==\n'
rg -n -C 2 -i 'formatter|prettier|format' .github apps/ai-service/package.json 2>/dev/null || true
printf '\n== Coverage configuration and committed coverage evidence ==\n'
rg -n -C 3 -e 'coverage|100|threshold|branches|functions|lines|statements' \
apps/ai-service/package.json \
apps/ai-service/vitest.config.* \
apps/ai-service/vite.config.* \
package.json \
2>/dev/null || true
fd -HI -t f -E .git -g '*coverage*' -g 'coverage-final.json' -g 'lcov.info' -g 'junit*.xml' -g '*test-results*' . | head -100
printf '\n== PR review threads and checks ==\n'
gh api graphql -F owner='ContextualWisdomLab' -F name='life-os' -F number=115 -f query='
query($owner: String!, $name: String!, $number: Int!) {
repository(owner: $owner, name: $name) {
pullRequest(number: $number) {
headRefOid
reviewThreads(first: 100) {
nodes {
id
isResolved
isOutdated
path
line
originalLine
comments(first: 20) { nodes { author { login } body url createdAt } }
}
}
commits(last: 1) {
nodes {
commit {
oid
checkSuites(first: 100) {
nodes {
app { name }
conclusion
status
workflowRun { workflow { name } }
}
}
}
}
}
}
}
}' > /tmp/pr115.json
jq '{headRefOid: .data.repository.pullRequest.headRefOid,
threads: [.data.repository.pullRequest.reviewThreads.nodes[] |
{id,isResolved,isOutdated,path,line,originalLine,
comments: [.comments.nodes[] | {author: .author.login, body, url}]}],
checks: [.data.repository.pullRequest.commits.nodes[0].commit.checkSuites.nodes[] |
{app: .app.name, conclusion, status, workflow: (.workflowRun.workflow.name // null)}]}' /tmp/pr115.jsonLength of output: 96955 🏁 Script executed: #!/bin/bash
set -euo pipefail
sha='a97104b3277f6ad711dd51f3fd6b47f936b062bd'
repo='ContextualWisdomLab/life-os'
printf '%s\n' '== Evaluator execution path =='
sed -n '280,520p' apps/ai-service/src/proposal-quality-evaluation.ts
printf '%s\n' '== Production proposal-service error and validation contract =='
ast-grep outline apps/ai-service/src/proposal-service.ts --items all --view expanded
rg -n -A100 -B10 -e 'export function validateProposalRequest|class ProposalValidationError|validateOperations|async create|async propose|generate' \
apps/ai-service/src/proposal-service.ts
printf '%s\n' '== Tests for typed normalization and unexpected request-inspection failures =='
rg -n -A24 -B12 -e 'unexpected|ProposalValidationError|request-inspection|validateProposalRequest|throw.*Error|rejects.*error' \
apps/ai-service/src/proposal-quality-evaluation.test.ts
printf '%s\n' '== Exact CyberSecEval entries in both documents =='
rg -n -C 1 'Bhatt, M\.' \
docs/research/2026-08-05-ai-proposal-quality-evaluation-standards.md \
docs/superpowers/specs/2026-08-05-ai-proposal-quality-evaluation-design.md
printf '%s\n' '== Exact-head CI workflow runs =='
gh run list --repo "$repo" --commit "$sha" --limit 100 \
--json databaseId,name,status,conclusion,workflowName,event,createdAt,updatedAt,url
ci_run_id="$(gh run list --repo "$repo" --commit "$sha" --limit 100 \
--json databaseId,workflowName,status,conclusion \
--jq '.[] | select(.workflowName == "CI") | .databaseId' | head -n 1)"
if [ -z "$ci_run_id" ]; then
echo 'CI_RUN_NOT_FOUND'
exit 0
fi
printf '\n== CI jobs for run %s ==\n' "$ci_run_id"
gh run view "$ci_run_id" --repo "$repo" --json status,conclusion,jobs,url
printf '\n== CI coverage-related log lines ==\n'
gh run view "$ci_run_id" --repo "$repo" --log 2>&1 | \
rg -n -i -C 3 'coverage|statements|branches|functions|lines|all files|100\.?0*' || true
printf '\n== CI artifacts ==\n'
gh api "repos/$repo/actions/runs/$ci_run_id/artifacts" --paginate \
--jq '.artifacts[] | {id,name,expired,size_in_bytes,archive_download_url}' || trueLength of output: 66684 🏁 Script executed: #!/bin/bash
set -euo pipefail
repo_owner='ContextualWisdomLab'
repo_name='life-os'
pr_number=115
for thread_id in \
'PRRT_kwDOTq3wqs6Whf5r' \
'PRRT_kwDOTq3wqs6Whf5w'
do
gh api graphql -F threadId="$thread_id" -f query='
mutation($threadId: ID!) {
resolveReviewThread(input: {threadId: $threadId}) {
thread { id isResolved isOutdated path line }
}
}' --jq '.data.resolveReviewThread.thread'
done
printf '\n== Current unresolved review threads ==\n'
gh api graphql -F owner="$repo_owner" -F name="$repo_name" -F number="$pr_number" -f query='
query($owner: String!, $name: String!, $number: Int!) {
repository(owner: $owner, name: $name) {
pullRequest(number: $number) {
reviewThreads(first: 100) {
nodes {
id isResolved isOutdated path line
comments(first: 1) { nodes { author { login } body url } }
}
}
}
}
}' --jq '.data.repository.pullRequest.reviewThreads.nodes
| map(select(.isResolved == false))
| map({id,isOutdated,path,line,author: .comments.nodes[0].author.login,url: .comments.nodes[0].url})'
printf '\n== Current exact-head workflow states ==\n'
gh run list --repo "$repo_owner/$repo_name" \
--commit 'a97104b3277f6ad711dd51f3fd6b47f936b062bd' \
--limit 100 \
--json name,status,conclusion,url \
--jq '.[] | {name,status,conclusion,url}'Length of output: 3760
I cannot approve yet. You are interacting with an AI system. |
|
@coderabbitai review |
|
|
@coderabbitai review |
|
|
@coderabbitai review Please review the exact live head only. Verify proposal-quality evidence separates validity, semantic operation conformance, grounding, benign utility, forbidden-text leakage, and prompt-injection resistance; denominators are explicit and null-safe; English, Korean, temporal, completed-item, empty-context, and direct/indirect injection fixtures exercise the real ProposalService boundary; provider failures are credential-redacted; reports are deterministic and credential-free; and AI-service production statement/branch/function/line coverage is 100%. Review only; do not update the branch, merge, release, or alter protections. |
🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
expected='a97104b3277f6ad711dd51f3fd6b47f936b062bd'
repo='ContextualWisdomLab/life-os'
pr=115
printf '== Exact head ==\n'
actual="$(git rev-parse HEAD)"
printf 'checked_out=%s\nexpected=%s\nmatch=%s\n' "$actual" "$expected" "$([ "$actual" = "$expected" ] && echo yes || echo no)"
gh pr view "$pr" --repo "$repo" --json headRefOid,url \
--jq '"github_head=\(.headRefOid)\nurl=\(.url)\nmatch_expected=\(.headRefOid == "'"$expected"'")"'
printf '\n== Changed files at requested head ==\n'
git diff-tree --no-commit-id --name-status -r "$expected"
printf '\n== Relevant file outlines ==\n'
ast-grep outline apps/ai-service/src/proposal-quality-evaluation.ts --items all --view expanded
ast-grep outline apps/ai-service/src/proposal-quality-fixtures.ts --items all --view expanded
ast-grep outline apps/ai-service/src/proposal-service.ts --items all --view expanded
ast-grep outline apps/ai-service/src/proposal-quality-evaluation.test.ts --items all --view expanded
printf '\n== Evaluator implementation ==\n'
sed -n '1,560p' apps/ai-service/src/proposal-quality-evaluation.ts
printf '\n== Fixture definitions ==\n'
sed -n '1,280p' apps/ai-service/src/proposal-quality-fixtures.ts
printf '\n== ProposalService validation and generation boundary ==\n'
rg -n -C 10 -e 'ProposalValidationError|validateProposalRequest|class ProposalService|async .*propos|async .*creat|model\.' \
apps/ai-service/src/proposal-service.ts
printf '\n== Evaluator test evidence ==\n'
rg -n -C 5 -i -e 'validity|semantic|ground|utility|forbidden|injection|denominator|rate|provider|credential|secret|determin|ProposalService|fixture|coverage' \
apps/ai-service/src/proposal-quality-evaluation.test.ts \
apps/ai-service/src/proposal-quality-fixtures.test.ts \
apps/ai-service/src/proposal-quality-normalization.test.ts
printf '\n== CI runs and coverage logs for exact head ==\n'
gh run list --repo "$repo" --commit "$expected" --limit 100 \
--json databaseId,name,workflowName,status,conclusion,url \
--jq '.[] | {databaseId,name,workflowName,status,conclusion,url}'
ci_id="$(gh run list --repo "$repo" --commit "$expected" --limit 100 \
--json databaseId,workflowName,status,conclusion \
--jq '.[] | select(.workflowName == "CI" and .conclusion == "success") | .databaseId' | head -n1)"
if [ -n "$ci_id" ]; then
printf '\nCI run: %s\n' "$ci_id"
gh run view "$ci_id" --repo "$repo" --json status,conclusion,jobs,url
gh run view "$ci_id" --repo "$repo" --log 2>&1 | \
rg -n -i -C 4 'all files|statements|branches|functions|lines|coverage|100\.?0*' || true
else
printf '\nNo successful CI run found for exact head.\n'
fi
printf '\n== Review threads ==\n'
gh api graphql -F owner='ContextualWisdomLab' -F name='life-os' -F number="$pr" -f query='
query($owner: String!, $name: String!, $number: Int!) {
repository(owner: $owner, name: $name) {
pullRequest(number: $number) {
reviewThreads(first: 100) {
nodes {
id
isResolved
isOutdated
path
line
comments(first: 1) { nodes { author { login } body url } }
}
}
}
}
}' --jq '.data.repository.pullRequest.reviewThreads.nodes
| map(select(.isResolved == false))
| map({id,isOutdated,path,line,author:.comments.nodes[0].author.login,url:.comments.nodes[0].url,body:.comments.nodes[0].body})'Length of output: 143978 🏁 Script executed: #!/bin/bash
set -euo pipefail
printf '%s\n' '== Evaluator tests: failure, deterministic report, and validation behavior =='
sed -n '370,680p' apps/ai-service/src/proposal-quality-evaluation.test.ts
printf '%s\n' '== Regression tests for the evaluator =='
sed -n '1,320p' apps/ai-service/src/proposal-quality-review-regression.test.ts
printf '%s\n' '== AI-service coverage configuration and quality gate =='
sed -n '1,260p' apps/ai-service/vitest.config.ts
sed -n '1,320p' apps/ai-service/src/quality-coverage.test.ts
cat apps/ai-service/package.json
printf '%s\n' '== Static references to report serialization and model label handling =='
rg -n -C 4 -e 'modelLabel|JSON\.stringify\(report\)|toEqual\(report\)|proposal_unavailable|unexpected request|request-inspection|ProposalValidationError' \
apps/ai-service/src/proposal-quality-evaluation.test.ts \
apps/ai-service/src/proposal-quality-review-regression.test.ts \
apps/ai-service/src/proposal-quality-evaluation.ts
printf '%s\n' '== Current working tree state =='
git status --shortLength of output: 37673
I found no actionable issue in the requested scope.
I did not update the branch, merge the PR, release artifacts, or change repository protections.
|
Buyer-visible outcome
LifeOS can continue safe commercial development every hour through OpenCode and NVIDIA NIM while preserving independent human, CodeRabbit, security, and GitHub Check gates.
Implemented contract
NVIDIA_NIM_API_KEYas the only model credential; noCOPILOT_GITHUB_TOKEN--match-head-commitsquash mergesMerge gate
Formatting, lint, type checking, exact package coverage, realistic fixture tests, OpenCode smoke evidence, build, Compose validation, AppGuardrail, Semgrep, Security Scan, Commercial Readiness, CodeRabbit, and every actionable human/security review thread must pass on the exact current head before squash merge.
Closes #114.