Skip to content

CI Reviews Enhancement Plan (v2) #16

Description

@sylvansys

Branch: claude-elegant-falcon-hlwid2wp
Plan file: /home/ben/.claude/plans/humble-swinging-kazoo.md


CI Reviews Enhancement Plan (v2)

Intent

Fix job output propagation so dependent reviews actually run, and refactor workflow to use the composite actions that were already created.

Current State (PR #17)

  • ✅ Heredoc syntax errors fixed
  • ✅ 8 composite actions created in .github/actions/
  • ✅ 5 agent prompt files in .claude/agents/reviewers/
  • ✅ Requirements review passes
  • Code Quality, Context skip - needs.requirements.outputs.passed is empty
  • Visual, UX skip - Expected (no app in this repo)
  • Workflow not using composite actions - all logic still inline

Root Cause: Job Outputs Not Propagating

The requirements job outputs are showing as null in the GitHub API:

{
  "name": "Reviews / Requirements",
  "conclusion": "success",
  "outputs": null   // <-- Should be {"passed": "true", "result": "..."}
}

This causes needs.requirements.outputs.passed == 'true' to fail for downstream jobs.

Implementation Plan

Phase 1: Fix Composite Actions (Ensure Outputs Always Set)

Update each composite action to ensure outputs are always set, even on failure.

Files to update:

  • .github/actions/requirements-reviewer/action.yml
  • .github/actions/code-quality-reviewer/action.yml
  • .github/actions/context-reviewer/action.yml
  • .github/actions/visual-reviewer/action.yml
  • .github/actions/ux-reviewer/action.yml

Pattern for Extract result step:

# Initialize defaults
PASSED="true"
RESULT='{"passed":true,"summary":"Review completed"}'

EXEC="${{ steps.review.outputs.execution_file }}"
if [ -f "$EXEC" ]; then
  TEXT=$(jq -r '[.[] | select(.type=="assistant") | .message.content[]? | select(.type=="text") | .text] | last // ""' "$EXEC" 2>/dev/null || echo "")
  JSON=$(echo "$TEXT" | sed -n '/```json/,/```/{/```/d;p;}' | head -50)
  if echo "$JSON" | jq . >/dev/null 2>&1; then
    PASSED=$(echo "$JSON" | jq -r '.passed // true')
    RESULT=$(echo "$JSON" | jq -c '.')
  fi
fi

# Always output (never skip these lines)
echo "passed=$PASSED" >> $GITHUB_OUTPUT
echo "result=$RESULT" >> $GITHUB_OUTPUT

Phase 2: Refactor Workflow to Use Composite Actions

Replace ALL inline review jobs with composite action calls.

Pattern for each review job:

requirements:
  name: "Reviews / Requirements"
  needs: [unit, e2e]
  if: github.event_name == 'pull_request' && !failure() && !cancelled()
  runs-on: ubuntu-latest
  outputs:
    passed: ${{ steps.review.outputs.passed }}
    result: ${{ steps.review.outputs.result }}
  steps:
    - uses: actions/checkout@v4
      with:
        fetch-depth: 0

    - name: Run requirements review
      id: review
      uses: ./.github/actions/requirements-reviewer
      with:
        claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
        pr_number: ${{ github.event.pull_request.number }}
        branch: ${{ github.head_ref }}
        github_token: ${{ secrets.GITHUB_TOKEN }}

    - name: Update comment
      if: always()
      uses: ./.github/actions/review-comment
      with:
        review_name: Requirements
        passed: ${{ steps.review.outputs.passed }}
        result_json: ${{ steps.review.outputs.result }}
        pr_number: ${{ github.event.pull_request.number }}
        sha: ${{ github.sha }}
        github_token: ${{ secrets.GITHUB_TOKEN }}

Jobs to refactor (all follow same pattern):

  1. requirements → uses ./.github/actions/requirements-reviewer
  2. code-quality → uses ./.github/actions/code-quality-reviewer
  3. context → uses ./.github/actions/context-reviewer
  4. visual → uses ./.github/actions/visual-reviewer
  5. ux → uses ./.github/actions/ux-reviewer

Phase 3: Use Fallback Condition

Add resilient condition that works even if outputs aren't propagating:

code-quality:
  needs: [requirements]
  if: |
    github.event_name == 'pull_request' &&
    needs.requirements.result == 'success'

This uses needs.requirements.result (always set by GitHub) instead of relying on custom outputs.

Files to Modify

File Action Description
.github/workflows/ci-pipeline.yml REWRITE Replace ~400 lines of inline logic with ~100 lines using composite actions
.github/actions/requirements-reviewer/action.yml MODIFY Fix output propagation
.github/actions/code-quality-reviewer/action.yml MODIFY Fix output propagation
.github/actions/context-reviewer/action.yml MODIFY Fix output propagation
.github/actions/visual-reviewer/action.yml MODIFY Fix output propagation
.github/actions/ux-reviewer/action.yml MODIFY Fix output propagation

Success Criteria

  • All 5 composite actions have robust output handling
  • ci-pipeline.yml uses composite actions (not inline logic)
  • Requirements outputs propagate to dependent jobs
  • Code Quality and Context reviews run after Requirements passes
  • Visual and UX skip for non-app repos (expected behavior)
  • All review results appear in consolidated PR comment
  • Workflow file reduced from ~700 lines to ~300 lines

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions