refactor: split DaemonStarter into platform-aware launch strategies #746
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: CI | |
| on: | |
| push: | |
| branches: [ main ] | |
| pull_request: | |
| types: [ opened, synchronize, reopened ] | |
| # Cancel in-progress runs for the same PR/branch | |
| concurrency: | |
| group: ci-${{ github.event.pull_request.number || github.ref }} | |
| cancel-in-progress: true | |
| permissions: | |
| contents: read | |
| jobs: | |
| pre-merge-check: | |
| runs-on: ubuntu-latest | |
| env: | |
| REPLAY_FULL_MODE: ${{ vars.ACECLAW_REPLAY_FULL_MODE || 'false' }} | |
| REPLAY_PROMPTS_PATH: ${{ vars.ACECLAW_REPLAY_PROMPTS_PATH || (vars.ACECLAW_REPLAY_FULL_MODE == 'true' && 'docs/reports/samples/replay-prompts-sample.json' || 'docs/reports/samples/replay-prompts-ci-short.json') }} | |
| # Structural minimum: 3 = can run. Statistical significance (10) is enforced by BenchmarkScorecard. | |
| REPLAY_SUITE_MIN_PER_CATEGORY: ${{ vars.ACECLAW_REPLAY_SUITE_MIN_PER_CATEGORY || '3' }} | |
| REPLAY_MAX_TOKEN_ESTIMATION_ERROR_RATIO: ${{ vars.ACECLAW_REPLAY_MAX_TOKEN_ESTIMATION_ERROR_RATIO || '0.65' }} | |
| REPLAY_FAIL_ON_LATENCY: ${{ vars.ACECLAW_REPLAY_FAIL_ON_LATENCY || 'false' }} | |
| # Rollout default: collect metric first; enforce only when explicitly enabled. | |
| REPLAY_ENFORCE_ANTI_PATTERN_FP_RATE: ${{ vars.ACECLAW_REPLAY_ENFORCE_ANTI_PATTERN_FP_RATE || 'false' }} | |
| REPLAY_MAX_ANTI_PATTERN_FP_RATE: ${{ vars.ACECLAW_REPLAY_MAX_ANTI_PATTERN_FP_RATE || '0.50' }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-java@v4 | |
| with: | |
| distribution: temurin | |
| java-version: 21 | |
| - uses: gradle/actions/setup-gradle@v4 | |
| - name: Generate replay cases (learning off/on) | |
| run: > | |
| ./gradlew generateReplayCases | |
| -PreplayPromptsInput=${{ env.REPLAY_PROMPTS_PATH }} | |
| -PreplayCasesOutput=${{ vars.ACECLAW_REPLAY_INPUT_PATH || '.aceclaw/metrics/continuous-learning/replay-cases.json' }} | |
| -PreplayCasesManifestOutput=${{ vars.ACECLAW_REPLAY_MANIFEST_PATH || '.aceclaw/metrics/continuous-learning/replay-cases.manifest.json' }} | |
| -PreplaySuiteMinPerCategory=${{ env.REPLAY_SUITE_MIN_PER_CATEGORY }} | |
| -PreplayTimeoutMs=${{ vars.ACECLAW_REPLAY_TIMEOUT_MS || '180000' }} | |
| -PreplayAutoApprovePermissions=${{ vars.ACECLAW_REPLAY_AUTO_APPROVE_PERMISSIONS || 'true' }} | |
| --no-daemon | |
| - name: Generate replay report | |
| run: > | |
| ./gradlew generateReplayReport | |
| -PreplayCasesInput=${{ vars.ACECLAW_REPLAY_INPUT_PATH || '.aceclaw/metrics/continuous-learning/replay-cases.json' }} | |
| -PreplayCasesManifestInput=${{ vars.ACECLAW_REPLAY_MANIFEST_PATH || '.aceclaw/metrics/continuous-learning/replay-cases.manifest.json' }} | |
| -PreplayAntiPatternFeedbackPath=${{ vars.ACECLAW_ANTI_PATTERN_FEEDBACK_PATH || '.aceclaw/metrics/continuous-learning/anti-pattern-gate-feedback.json' }} | |
| -PreplayReport=${{ vars.ACECLAW_REPLAY_REPORT_PATH || '.aceclaw/metrics/continuous-learning/replay-latest.json' }} | |
| --no-daemon | |
| - name: Pre-merge quality gate | |
| run: > | |
| ./gradlew preMergeCheck | |
| -PreplayGateStrict=true | |
| -PreplayReport=${{ vars.ACECLAW_REPLAY_REPORT_PATH || '.aceclaw/metrics/continuous-learning/replay-latest.json' }} | |
| -PreplayMaxTokenEstimationErrorRatio=${{ env.REPLAY_MAX_TOKEN_ESTIMATION_ERROR_RATIO }} | |
| -PreplayFailOnLatency=${{ env.REPLAY_FAIL_ON_LATENCY }} | |
| -PreplayEnforceAntiPatternFalsePositiveRate=${{ env.REPLAY_ENFORCE_ANTI_PATTERN_FP_RATE }} | |
| -PreplayMaxAntiPatternFalsePositiveRate=${{ env.REPLAY_MAX_ANTI_PATTERN_FP_RATE }} | |
| --no-daemon | |
| # When main gets new commits, re-test all open PRs | |
| retrigger-prs: | |
| if: github.event_name == 'push' && github.ref == 'refs/heads/main' | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: write | |
| pull-requests: write | |
| steps: | |
| - name: Update PR branches to re-trigger CI | |
| uses: actions/github-script@v7 | |
| with: | |
| script: | | |
| const pulls = await github.paginate(github.rest.pulls.list, { | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| state: 'open', | |
| }); | |
| for (const pr of pulls) { | |
| try { | |
| console.log(`Updating PR #${pr.number}: ${pr.title}`); | |
| await github.rest.pulls.updateBranch({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| pull_number: pr.number, | |
| }); | |
| console.log(` Merged main into PR #${pr.number}, CI will re-trigger`); | |
| } catch (err) { | |
| console.log(` PR #${pr.number}: ${err.message}, skipping`); | |
| } | |
| } |