hotfix(ci): restore reliable structured ai review comments

This commit is contained in:
Tam Nhu Tran committed 2026-04-02 00:24:29 -04:00
1 parent 737462ac1a
commit 5b9427f8a0
11 files changed
+1148 -207

No files matched your search

@@ -15,36 +15,42 @@ function loadWorkflow() {
}
describe('ai-review workflow', () => {
test('uses the self-hosted Claude binary instead of reinstalling it on internal PRs', () => {
test('pins automatic review helpers to trusted base-branch assets', () => {
const workflow = loadWorkflow();
const steps = workflow.jobs.review.steps;
const toolchainStep = steps.find((step) => step.id === 'toolchain');
expect(toolchainStep).toBeDefined();
expect(toolchainStep?.name).toBe('Resolve self-hosted Claude executable');
expect(toolchainStep?.run).toContain('command -v claude');
expect(toolchainStep?.run).toContain('"/home/github-runner/.local/bin/claude"');
expect(toolchainStep?.run).toContain('"/root/.local/bin/claude"');
expect(toolchainStep?.run).toContain('Missing self-hosted Claude executable. Checked:');
expect(toolchainStep?.run).toContain('echo "claude_path=$CLAUDE_PATH" >> "$GITHUB_OUTPUT"');
const claudeReviewStep = steps.find((step) => step.id === 'claude-review');
expect(claudeReviewStep).toBeDefined();
expect(claudeReviewStep?.uses).toBe('anthropics/claude-code-action@v1');
expect(claudeReviewStep?.['continue-on-error']).toBe(true);
expect(claudeReviewStep?.with?.path_to_claude_code_executable).toBe(
'${{ steps.toolchain.outputs.claude_path }}'
);
expect(claudeReviewStep?.with?.claude_args).toContain('--tools "Read"');
expect(claudeReviewStep?.with?.claude_args).toContain('--disallowedTools "Bash,Edit"');
const promptStep = steps.find((step) => step.id === 'review-prompt');
expect(promptStep).toBeDefined();
expect(promptStep?.run).toContain("printf '%s\\n' \\");
expect(promptStep?.run).not.toContain("| sed 's/^ //'");
expect(promptStep?.run).toContain('build-ai-review-packet.mjs');
expect(promptStep?.run).toContain('run-ai-review-direct.mjs');
expect(promptStep?.run).not.toContain('bootstrapping from checked-out internal branch asset');
expect(promptStep?.run).toContain('using minimal packet builder');
expect(promptStep?.run).toContain('using incomplete-review fallback');
const reviewScopeStep = steps.find((step) => step.id === 'review-scope');
expect(reviewScopeStep).toBeDefined();
expect(reviewScopeStep?.env?.AI_REVIEW_PR_SIZE_CLASS).toBe('${{ needs.prepare.outputs.pr_size_class }}');
const packetStep = steps.find((step) => step.id === 'review-packet');
expect(packetStep).toBeDefined();
expect(packetStep?.run).toContain('node "$AI_REVIEW_PACKET_SCRIPT"');
expect(packetStep?.env?.AI_REVIEW_PACKET_FILE).toBe('${{ env.REVIEW_PACKET_FILE }}');
expect(packetStep?.env?.AI_REVIEW_PACKET_INCLUDED_MANIFEST_FILE).toBe(
'${{ env.REVIEW_PACKET_INCLUDED_MANIFEST_FILE }}'
);
const directReviewStep = steps.find((step) => step.id === 'direct-review');
expect(directReviewStep).toBeDefined();
expect(directReviewStep?.uses).toBeUndefined();
expect(directReviewStep?.run).toContain('node "$AI_REVIEW_DIRECT_REVIEW_SCRIPT"');
expect(directReviewStep?.['continue-on-error']).toBe(true);
expect(directReviewStep?.env?.AI_REVIEW_PROMPT).toBe('${{ steps.review-prompt.outputs.content }}');
expect(directReviewStep?.env?.AI_REVIEW_PACKET_INCLUDED_MANIFEST_FILE).toBe(
'${{ steps.review-packet.outputs.packet_included_manifest_file }}'
);
expect(directReviewStep?.env?.AI_REVIEW_PACKET_INCLUDED_FILES).toBe(
'${{ steps.review-packet.outputs.packet_included_files }}'
);
expect(directReviewStep?.env?.AI_REVIEW_REQUEST_BUFFER_MS).toBe(45000);
});
});