diff --git a/.github/workflows/advisory-review-health.yml b/.github/workflows/advisory-review-health.yml new file mode 100644 index 0000000..137e96b --- /dev/null +++ b/.github/workflows/advisory-review-health.yml @@ -0,0 +1,20 @@ +name: Advisory Review Health +on: + schedule: + - cron: '35 8 * * *' + workflow_run: + workflows: [Drift Check, Evidence Gate] + types: [completed] + workflow_dispatch: +permissions: + contents: read + actions: read + issues: write +jobs: + check: + uses: QuantStrategyLab/QuantPlatformKit/.github/workflows/review-loop-deadman.yml@feat/advisory-review-closed-loop + with: + lanes_json: >- + [{"workflow":"drift-check.yml","job":"drift","interval_hours":24,"enabled_at":"2026-10-15T00:00:00Z"}, + {"workflow":"evidence-gate.yml","job":"gate","interval_hours":0}] + threshold: '3' diff --git a/.github/workflows/evidence-gate.yml b/.github/workflows/evidence-gate.yml index bec2dcc..c0513c7 100644 --- a/.github/workflows/evidence-gate.yml +++ b/.github/workflows/evidence-gate.yml @@ -16,6 +16,7 @@ on: permissions: contents: read pull-requests: read + issues: write id-token: write concurrency: @@ -26,7 +27,7 @@ jobs: gate: if: github.event.pull_request.draft == false runs-on: ubuntu-latest - timeout-minutes: 10 + timeout-minutes: 50 env: FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true" @@ -75,9 +76,20 @@ jobs: - name: Evaluate Evidence Gate env: + AI_REVIEW_CLOSED_LOOP: 'true' + GH_TOKEN: ${{ github.token }} GITHUB_BASE_REF: ${{ github.base_ref }} AI_SERVICE_RELEASE_READY: ${{ vars.AI_SERVICE_RELEASE_READY }} AI_SERVICE_URL: ${{ vars.AI_SERVICE_URL }} AI_SERVICE_AUDIENCE: ${{ vars.AI_SERVICE_AUDIENCE }} AI_SERVICE_REVIEWERS_JSON: ${{ vars.AI_SERVICE_REVIEWERS_JSON }} run: python scripts/gate_evidence_package.py + + - name: Archive advisory evidence verdicts + if: always() + uses: actions/upload-artifact@v7 + with: + name: evidence-review-verdicts-${{ github.run_id }}-${{ github.run_attempt }} + path: data/output/review_verdicts + if-no-files-found: warn + retention-days: 90 diff --git a/docs/advisory-review-disposition.md b/docs/advisory-review-disposition.md new file mode 100644 index 0000000..eb01a6f --- /dev/null +++ b/docs/advisory-review-disposition.md @@ -0,0 +1,9 @@ +# Advisory review disposition (draft) + +This draft opts the existing Evidence Gate and drift review into QPK's issue-only review disposition. Complete approvals archive JSON and close only the bot-owned review issue. Flags receive at most one deeper Dot task under existing grants. Owner alerts require confirmation, severe consensus or a three-cycle dead-man failure. Original evidence, release-readiness, role and promotion checks remain unchanged. No PR is auto-closed or merged by a review verdict. + +An independent scheduled/workflow-run monitor observes review-job failures/skips and missing scheduled drift cycles. Verdict artifacts are retained for 90 days. The extra review timeout allows the existing role calls and one deeper task; it adds no retries or model authority. GitHub issue writes use the current workflow token and never authorize trading or server access. + +Depends on the QPK advisory-review draft and promotion of its reviewed approved runtime wheel/reference. The monitor intentionally references that draft branch; pin the reviewed merge SHA during adoption. Missing existing model routes, grants, wheel admission or READY remain blockers. No secret, IAM, release variable, production wheel digest, live setting or trading actuator is changed. No cycle-bound pause is available here; severe consensus reports that gap. These drafts are not runtime acceptance. + +HK/Crypto branches are stacked on harden's role-name/READY drafts; those edits are preserved. No in-flight job worktree was modified. Tests use fakes; CI and workflow syntax must pass before review.