Skip to content

refactor: split DaemonStarter into platform-aware launch strategies #746

refactor: split DaemonStarter into platform-aware launch strategies

refactor: split DaemonStarter into platform-aware launch strategies #746

Workflow file for this run

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`);
}
}