diff --git a/.gitbot-fleet/enrolment.json b/.gitbot-fleet/enrolment.json new file mode 100644 index 0000000..4f8c684 --- /dev/null +++ b/.gitbot-fleet/enrolment.json @@ -0,0 +1,14 @@ +{ + "schema": 1, + "reporters": { + "rhodibot": { "title": "rhodibot (RSR compliance)", "enrolled": true }, + "panicbot": { "title": "panicbot (panic recovery, error handling)", "enrolled": true }, + "echidnabot": { "title": "echidnabot (formal verification: proofs/)", "enrolled": true }, + "seambot": { "title": "seambot (integration health: API routes)", "enrolled": true }, + "finishingbot": { "title": "finishingbot (release readiness)", "enrolled": true }, + "accessibilitybot": { "title": "accessibilitybot (WCAG on the React UI)", "enrolled": true }, + "glambot": { "title": "glambot (presentation quality)", "enrolled": true }, + "cipherbot": { "enrolled": false, "reason": "no cryptography is implemented in this repository" }, + "sustainabot": { "enrolled": false, "reason": "fleet adapter slot reserved; no adapter exists yet (gitbot-fleet README)" } + } +} diff --git a/.github/workflows/governance.yml b/.github/workflows/governance.yml new file mode 100644 index 0000000..20910d5 --- /dev/null +++ b/.github/workflows/governance.yml @@ -0,0 +1,154 @@ +# SPDX-License-Identifier: MPL-2.0 +# SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath) +# +# Fork governance lane. Two reusable lanes from hyperpolymath/standards, each +# pinned to a commit: DEED syntax for the repo deed, and the Hypatia verdict +# grid (Hypatia, panic-attack, pons asinorum and the gitbot-fleet report-backs +# under .gitbot-fleet/). This workflow is the fork's; nothing in it is +# proposed upstream, and upstream's ci.yml is untouched. +# +# The reusable renders the grid; the two jobs below post it on the pull +# request and publish the badges, because a called workflow may not request +# permissions its caller does not grant. +name: Governance (fork) + +on: + push: + branches: [main] + pull_request: + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + deed: + name: DEED syntax + uses: hyperpolymath/standards/.github/workflows/deed-conformance.yml@75bd5994470661a099df562d6d5ad2fe744dbd66 + permissions: + contents: read + with: + require-files: true + + hypatia: + name: Hypatia verdict grid + uses: hyperpolymath/standards/.github/workflows/hypatia-scan-reusable.yml@feat/verdict-grid + permissions: + actions: read + contents: read + security-events: write + secrets: + HYPATIA_SCAN_PAT: ${{ secrets.HYPATIA_SCAN_PAT }} + + verdict: + name: Post the verdict grid + needs: [deed, hypatia] + if: ${{ always() && github.event_name == 'pull_request' }} + runs-on: ubuntu-latest + timeout-minutes: 5 + permissions: + contents: read + actions: read + pull-requests: write + steps: + - name: Download the verdict grid + continue-on-error: true + uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2 + with: + name: verdict-grid + path: verdict-grid + + - name: Update the compact PR verdict + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_NUMBER: ${{ github.event.pull_request.number }} + DEED_RESULT: ${{ needs.deed.result }} + HYPATIA_RESULT: ${{ needs.hypatia.result }} + HYPATIA_VERDICT: ${{ needs.hypatia.outputs.verdict }} + run: | + set -euo pipefail + # The DEED lane is a conformance row: pass is green, failure red, + # anything else (skipped, cancelled, no result) orange. The grid + # itself comes from the artifact; a missing artifact is orange. + case "$DEED_RESULT" in + success) deed='๐ŸŸข conformant' ;; + failure) deed='๐Ÿ”ด failing' ;; + *) deed="๐ŸŸ  indeterminate ($DEED_RESULT)" ;; + esac + { + echo '' + echo '# Fork governance' + echo + echo "| Lane | Status | Run |" + echo "|---|---|---|" + echo "| DEED syntax (repo deed) | $deed | [run $GITHUB_RUN_ID]($GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID) |" + echo "| Hypatia verdict grid | ${HYPATIA_VERDICT:-orange} (job: $HYPATIA_RESULT) | same run |" + echo + if [ -s verdict-grid/report.md ]; then + cat verdict-grid/report.md + else + echo '๐ŸŸ  indeterminate ยท no verdict-grid artifact was produced by the Hypatia lane; see the run.' + fi + } > "$RUNNER_TEMP/body.md" + # One comment per PR, updated in place; newest run wins. + comment_id=$(gh api --paginate --slurp "repos/$GITHUB_REPOSITORY/issues/$PR_NUMBER/comments" \ + | jq -r '[.[][] | select(.user.login == "github-actions[bot]" and (.body | contains("