diff --git a/.deepsource.toml b/.deepsource.toml new file mode 100644 index 0000000..b0febe7 --- /dev/null +++ b/.deepsource.toml @@ -0,0 +1,13 @@ +version = 1 + +[[analyzers]] +name = "python" +enabled = true + +[[analyzers]] +name = "javascript" +enabled = true + +[[analyzers]] +name = "shellcheck" +enabled = true diff --git a/.github/labeler.yml b/.github/labeler.yml deleted file mode 100644 index 5ab4588..0000000 --- a/.github/labeler.yml +++ /dev/null @@ -1,17 +0,0 @@ ---- -backend: - - changed-files: - - any-glob-to-any-file: 'backend/**/*' -frontend: - - changed-files: - - any-glob-to-any-file: 'frontend/**/*' -next-app: - - changed-files: - - any-glob-to-any-file: 'next-app/**/*' -documentation: - - changed-files: - - any-glob-to-any-file: 'docs/**/*' - - any-glob-to-any-file: '**/*.md' -python: - - changed-files: - - any-glob-to-any-file: '**/*.py' diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index fc8551d..65ddffb 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -55,7 +55,7 @@ jobs: # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/.github/workflows/daily-gsifi-governance-validation.yml b/.github/workflows/daily-gsifi-governance-validation.yml index 30d1207..cfd4242 100644 --- a/.github/workflows/daily-gsifi-governance-validation.yml +++ b/.github/workflows/daily-gsifi-governance-validation.yml @@ -50,10 +50,10 @@ jobs: timeout-minutes: 10 steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 - name: Setup Python - uses: actions/setup-python@v5 + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 with: python-version: '3.12' @@ -77,7 +77,7 @@ jobs: - name: Upload governance test report if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 with: name: gsifi-governance-test-report path: | diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 3f53646..3305a05 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -13,6 +13,6 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 - name: Build the Docker image run: docker build . --file Dockerfile --tag my-image-name:$(date +%s) diff --git a/.github/workflows/federated-zk-docs-validation.yml b/.github/workflows/federated-zk-docs-validation.yml index f97402b..d59070d 100644 --- a/.github/workflows/federated-zk-docs-validation.yml +++ b/.github/workflows/federated-zk-docs-validation.yml @@ -19,10 +19,10 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 - name: Set up Python - uses: actions/setup-python@v5 + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 with: python-version: '3.11' diff --git a/.github/workflows/governance-artifacts-ci.yml b/.github/workflows/governance-artifacts-ci.yml index ba65e97..d66eea8 100644 --- a/.github/workflows/governance-artifacts-ci.yml +++ b/.github/workflows/governance-artifacts-ci.yml @@ -33,10 +33,10 @@ jobs: timeout-minutes: 12 steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 - name: Set up Python - uses: actions/setup-python@v5 + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 with: python-version: '3.12' cache: 'pip' @@ -75,10 +75,10 @@ jobs: timeout-minutes: 8 steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 - name: Setup Python - uses: actions/setup-python@v5 + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 with: python-version: '3.12' cache: 'pip' @@ -89,7 +89,7 @@ jobs: - name: Upload G-Stack test artifacts if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 with: name: gstack-test-results path: artifacts/test-results @@ -97,7 +97,7 @@ jobs: - name: Upload G-Stack validation report if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 with: name: gstack-validation-report path: artifacts/validation/gstack-validation.json diff --git a/.github/workflows/governance-artifacts-validate.yml b/.github/workflows/governance-artifacts-validate.yml index 5a9e1d1..a3ab714 100644 --- a/.github/workflows/governance-artifacts-validate.yml +++ b/.github/workflows/governance-artifacts-validate.yml @@ -16,10 +16,10 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 - name: Setup Python - uses: actions/setup-python@v5 + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 with: python-version: '3.11' diff --git a/.github/workflows/governance-artifacts.yml b/.github/workflows/governance-artifacts.yml index e538c85..e9f541e 100644 --- a/.github/workflows/governance-artifacts.yml +++ b/.github/workflows/governance-artifacts.yml @@ -12,10 +12,10 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 - name: Setup Python - uses: actions/setup-python@v5 + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 with: python-version: '3.12' @@ -30,7 +30,7 @@ jobs: - name: Upload governance validation report if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 with: name: governance-validation-report path: .reports/governance-validation.json diff --git a/.github/workflows/governance-docs-lint.yml b/.github/workflows/governance-docs-lint.yml index e05a643..c8e48da 100644 --- a/.github/workflows/governance-docs-lint.yml +++ b/.github/workflows/governance-docs-lint.yml @@ -36,10 +36,10 @@ jobs: timeout-minutes: 10 steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 - name: Set up Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 with: node-version: '20' diff --git a/.github/workflows/jekyll-docker.yml b/.github/workflows/jekyll-docker.yml index 3d0eedb..b872d1b 100644 --- a/.github/workflows/jekyll-docker.yml +++ b/.github/workflows/jekyll-docker.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 - name: Build the site in the jekyll/builder container run: | docker run \ diff --git a/.github/workflows/label.yml b/.github/workflows/label.yml index d743096..b8d2d6b 100644 --- a/.github/workflows/label.yml +++ b/.github/workflows/label.yml @@ -10,9 +10,9 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 - name: Labeler - uses: actions/labeler@v5 + uses: actions/labeler@8558fd74291d67161a8a78ce36a881fa63b766a9 with: repo-token: "${{ secrets.GITHUB_TOKEN }}" sync-labels: true diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f252acd..3b8e85c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -11,7 +11,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@ee0669bd1cc54295c223e0bb666b733df41de1c5 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 diff --git a/.github/workflows/makefile.yml b/.github/workflows/makefile.yml index 8789c17..f6140b1 100644 --- a/.github/workflows/makefile.yml +++ b/.github/workflows/makefile.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 - name: configure run: ./configure diff --git a/.github/workflows/nextjs.yml b/.github/workflows/nextjs.yml index 2598d06..e3a7871 100644 --- a/.github/workflows/nextjs.yml +++ b/.github/workflows/nextjs.yml @@ -20,7 +20,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 - name: Detect package manager id: detect-package-manager run: | @@ -37,7 +37,7 @@ jobs: false fi - name: Setup Node - uses: actions/setup-node@v4 + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 with: node-version: "20" cache: ${{ steps.detect-package-manager.outputs.manager }} diff --git a/.github/workflows/python-package-conda.yml b/.github/workflows/python-package-conda.yml index f358604..c7f5a3d 100644 --- a/.github/workflows/python-package-conda.yml +++ b/.github/workflows/python-package-conda.yml @@ -9,7 +9,7 @@ jobs: max-parallel: 5 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 - name: Set up Python 3.10 uses: actions/setup-python@v3 with: diff --git a/.github/workflows/regulator-blueprint-validation.yml b/.github/workflows/regulator-blueprint-validation.yml index aef0c3b..1ea8f78 100644 --- a/.github/workflows/regulator-blueprint-validation.yml +++ b/.github/workflows/regulator-blueprint-validation.yml @@ -26,10 +26,10 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 - name: Set up Python - uses: actions/setup-python@v5 + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 with: python-version: '3.11' @@ -58,7 +58,7 @@ jobs: make test-regulator-blueprint-artifacts - name: Upload validator report - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 with: name: regulator-blueprint-validation path: regulator-blueprint-validation.json diff --git a/.github/workflows/samples/ada.yml b/.github/workflows/samples/ada.yml new file mode 100644 index 0000000..d0e85c6 --- /dev/null +++ b/.github/workflows/samples/ada.yml @@ -0,0 +1,24 @@ +name: Ada (GNAT) + +on: + push: + branches: ["main"] + pull_request: + branches: ["main"] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 + + - name: Set up GNAT toolchain + run: > + sudo apt-get update && + sudo apt-get install gnat gprbuild + + - name: Build + run: gprbuild -j0 -p diff --git a/.github/workflows/samples/alibabacloud.yml b/.github/workflows/samples/alibabacloud.yml new file mode 100644 index 0000000..05f8db1 --- /dev/null +++ b/.github/workflows/samples/alibabacloud.yml @@ -0,0 +1,122 @@ +# This workflow will build and push a new container image to Alibaba Cloud Container Registry (ACR), +# and then will deploy it to Alibaba Cloud Container Service for Kubernetes (ACK), when there is a push to the "main" branch. +# +# To use this workflow, you will need to complete the following set-up steps: +# +# 1. Create an ACR repository to store your container images. +# You can use ACR EE instance for more security and better performance. +# For instructions see https://www.alibabacloud.com/help/doc-detail/142168.htm +# +# 2. Create an ACK cluster to run your containerized application. +# You can use ACK Pro cluster for more security and better performance. +# For instructions see https://www.alibabacloud.com/help/doc-detail/95108.htm +# +# 3. Store your AccessKey pair in GitHub Actions secrets named `ACCESS_KEY_ID` and `ACCESS_KEY_SECRET`. +# For instructions on setting up secrets see: https://developer.github.com/actions/managing-workflows/storing-secrets/ +# +# 4. Change the values for the REGION_ID, REGISTRY, NAMESPACE, IMAGE, ACK_CLUSTER_ID, and ACK_DEPLOYMENT_NAME. +# + +name: Build and Deploy to ACK + +on: + push: + branches: ["main"] + +# Environment variables available to all jobs and steps in this workflow. +env: + REGION_ID: cn-hangzhou + REGISTRY: registry.cn-hangzhou.aliyuncs.com + NAMESPACE: namespace + IMAGE: repo + TAG: ${{ github.sha }} + ACK_CLUSTER_ID: clusterID + ACK_DEPLOYMENT_NAME: nginx-deployment + + ACR_EE_REGISTRY: myregistry.cn-hangzhou.cr.aliyuncs.com + ACR_EE_INSTANCE_ID: instanceID + ACR_EE_NAMESPACE: namespace + ACR_EE_IMAGE: repo + ACR_EE_TAG: ${{ github.sha }} + +permissions: + contents: read + +jobs: + build: + runs-on: ubuntu-latest + environment: production + + steps: + - name: Checkout + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 + + # 1.1 Login to ACR + - name: Login to ACR with the AccessKey pair + uses: aliyun/acr-login@v1 + with: + region-id: "${{ env.REGION_ID }}" + access-key-id: "${{ secrets.ACCESS_KEY_ID }}" + access-key-secret: "${{ secrets.ACCESS_KEY_SECRET }}" + + # 1.2 Build and push image to ACR + - name: Build and push image to ACR + run: | + docker build --tag "$REGISTRY/$NAMESPACE/$IMAGE:$TAG" . + docker push "$REGISTRY/$NAMESPACE/$IMAGE:$TAG" + + # 1.3 Scan image in ACR + - name: Scan image in ACR + uses: aliyun/acr-scan@v1 + with: + region-id: "${{ env.REGION_ID }}" + access-key-id: "${{ secrets.ACCESS_KEY_ID }}" + access-key-secret: "${{ secrets.ACCESS_KEY_SECRET }}" + repository: "${{ env.NAMESPACE }}/${{ env.IMAGE }}" + tag: "${{ env.TAG }}" + + # 2.1 (Optional) Login to ACR EE + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 + - name: Login to ACR EE with the AccessKey pair + uses: aliyun/acr-login@v1 + with: + login-server: "https://${{ env.ACR_EE_REGISTRY }}" + region-id: "${{ env.REGION_ID }}" + access-key-id: "${{ secrets.ACCESS_KEY_ID }}" + access-key-secret: "${{ secrets.ACCESS_KEY_SECRET }}" + instance-id: "${{ env.ACR_EE_INSTANCE_ID }}" + + # 2.2 (Optional) Build and push image ACR EE + - name: Build and push image to ACR EE + run: | + docker build -t "$ACR_EE_REGISTRY/$ACR_EE_NAMESPACE/$ACR_EE_IMAGE:$TAG" . + docker push "$ACR_EE_REGISTRY/$ACR_EE_NAMESPACE/$ACR_EE_IMAGE:$TAG" + # 2.3 (Optional) Scan image in ACR EE + - name: Scan image in ACR EE + uses: aliyun/acr-scan@v1 + with: + region-id: "${{ env.REGION_ID }}" + access-key-id: "${{ secrets.ACCESS_KEY_ID }}" + access-key-secret: "${{ secrets.ACCESS_KEY_SECRET }}" + instance-id: "${{ env.ACR_EE_INSTANCE_ID }}" + repository: "${{ env.ACR_EE_NAMESPACE}}/${{ env.ACR_EE_IMAGE }}" + tag: "${{ env.ACR_EE_TAG }}" + + # 3.1 Set ACK context + - name: Set K8s context + uses: aliyun/ack-set-context@v1 + with: + access-key-id: "${{ secrets.ACCESS_KEY_ID }}" + access-key-secret: "${{ secrets.ACCESS_KEY_SECRET }}" + cluster-id: "${{ env.ACK_CLUSTER_ID }}" + + # 3.2 Deploy the image to the ACK cluster + - name: Set up Kustomize + run: |- + curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash /dev/stdin 3.8.6 + - name: Deploy + run: |- + ./kustomize edit set image REGISTRY/NAMESPACE/IMAGE:TAG=$REGISTRY/$NAMESPACE/$IMAGE:$TAG + ./kustomize build . | kubectl apply -f - + kubectl rollout status deployment/$ACK_DEPLOYMENT_NAME + kubectl get services -o wide diff --git a/.github/workflows/samples/anchore-syft.yml b/.github/workflows/samples/anchore-syft.yml new file mode 100644 index 0000000..087535d --- /dev/null +++ b/.github/workflows/samples/anchore-syft.yml @@ -0,0 +1,38 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +# This workflow checks out code, builds an image, performs a container image +# scan with Anchore's Syft tool, and uploads the results to the GitHub Dependency +# submission API. + +# For more information on the Anchore sbom-action usage +# and parameters, see https://github.com/anchore/sbom-action. For more +# information about the Anchore SBOM tool, Syft, see +# https://github.com/anchore/syft +name: Anchore Syft SBOM scan + +on: + push: + branches: ["main"] + +permissions: + contents: write + +jobs: + Anchore-Build-Scan: + permissions: + contents: write # required to upload to the Dependency submission API + runs-on: ubuntu-latest + steps: + - name: Checkout the code + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 + - name: Build the Docker image + run: docker build . --file Dockerfile --tag localbuild/testimage:latest + - name: Scan the image and upload dependency results + uses: anchore/sbom-action@bb716408e75840bbb01e839347cd213767269d4a + with: + image: "localbuild/testimage:latest" + artifact-name: image.spdx.json + dependency-snapshot: true diff --git a/.github/workflows/samples/anchore.yml b/.github/workflows/samples/anchore.yml new file mode 100644 index 0000000..9991959 --- /dev/null +++ b/.github/workflows/samples/anchore.yml @@ -0,0 +1,48 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +# This workflow checks out code, builds an image, performs a container image +# vulnerability scan with Anchore's Grype tool, and integrates the results with GitHub Advanced Security +# code scanning feature. For more information on the Anchore scan action usage +# and parameters, see https://github.com/anchore/scan-action. For more +# information on Anchore's container image scanning tool Grype, see +# https://github.com/anchore/grype +name: Anchore Grype vulnerability scan + +on: + push: + branches: ["main"] + pull_request: + # The branches below must be a subset of the branches above + branches: ["main"] + schedule: + - cron: '19 13 * * 5' + +permissions: + contents: read + +jobs: + Anchore-Build-Scan: + permissions: + contents: read # for actions/checkout to fetch code + security-events: write # for github/codeql-action/upload-sarif to upload SARIF results + actions: read # only required for a private repository by github/codeql-action/upload-sarif to get the Action run status + runs-on: ubuntu-latest + steps: + - name: Check out the code + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 + - name: Build the Docker image + run: docker build . --file Dockerfile --tag localbuild/testimage:latest + - name: Run the Anchore Grype scan action + uses: anchore/scan-action@d5aa5b6cb9414b0c7771438046ff5bcfa2854ed7 + id: scan + with: + image: "localbuild/testimage:latest" + fail-build: true + severity-cutoff: critical + - name: Upload vulnerability report + uses: github/codeql-action/upload-sarif@v3 + with: + sarif_file: ${{ steps.scan.outputs.sarif }} diff --git a/.github/workflows/samples/android.yml b/.github/workflows/samples/android.yml new file mode 100644 index 0000000..2893fe7 --- /dev/null +++ b/.github/workflows/samples/android.yml @@ -0,0 +1,26 @@ +name: Android CI + +on: + push: + branches: ["main"] + pull_request: + branches: ["main"] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 + - name: set up JDK 11 + uses: actions/setup-java@v4 + with: + java-version: '11' + distribution: 'temurin' + cache: gradle + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + - name: Build with Gradle + run: ./gradlew build diff --git a/.github/workflows/samples/artifact-validation.yml b/.github/workflows/samples/artifact-validation.yml new file mode 100644 index 0000000..334bdf4 --- /dev/null +++ b/.github/workflows/samples/artifact-validation.yml @@ -0,0 +1,38 @@ +name: Artifact Validation + +on: + workflow_dispatch: + push: + paths: + - 'artifacts/**' + - 'unit_tests/**' + - 'pytest.ini' + - '.github/workflows/artifact-validation.yml' + pull_request: + paths: + - 'artifacts/**' + - 'unit_tests/**' + - 'pytest.ini' + - '.github/workflows/artifact-validation.yml' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + validate: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 + + - name: Setup Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 + with: + python-version: '3.12' + + - name: Install deps + run: make -C artifacts deps + + - name: Run artifact validation via Makefile + run: make -C artifacts all diff --git a/.github/workflows/samples/astro.yml b/.github/workflows/samples/astro.yml new file mode 100644 index 0000000..cf5bb04 --- /dev/null +++ b/.github/workflows/samples/astro.yml @@ -0,0 +1,90 @@ +# Sample workflow for building and deploying an Astro site to GitHub Pages +# +# To get started with Astro see: https://docs.astro.build/en/getting-started/ +# +name: Deploy Astro site to Pages + +on: + # Runs on pushes targeting the default branch + push: + branches: ["main"] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +env: + BUILD_PATH: "." # default value when not using subfolders + # BUILD_PATH: subfolder + +jobs: + build: + name: Build + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 + - name: Detect package manager + id: detect-package-manager + run: | + if [-f "${{ github.workspace }}/yarn.lock"]; then + echo "manager=yarn" >> $GITHUB_OUTPUT + echo "command=install" >> $GITHUB_OUTPUT + echo "runner=yarn" >> $GITHUB_OUTPUT + echo "lockfile=yarn.lock" >> $GITHUB_OUTPUT + exit 0 + elif [-f "${{ github.workspace }}/package.json"]; then + echo "manager=npm" >> $GITHUB_OUTPUT + echo "command=ci" >> $GITHUB_OUTPUT + echo "runner=npx --no-install" >> $GITHUB_OUTPUT + echo "lockfile=package-lock.json" >> $GITHUB_OUTPUT + exit 0 + else + echo "Unable to determine package manager" + exit 1 + fi + - name: Setup Node + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 + with: + node-version: "20" + cache: ${{ steps.detect-package-manager.outputs.manager }} + cache-dependency-path: ${{ env.BUILD_PATH }}/${{ steps.detect-package-manager.outputs.lockfile }} + - name: Setup Pages + id: pages + uses: actions/configure-pages@v5 + - name: Install dependencies + run: ${{ steps.detect-package-manager.outputs.manager }} ${{ steps.detect-package-manager.outputs.command }} + working-directory: ${{ env.BUILD_PATH }} + - name: Build with Astro + run: | + ${{ steps.detect-package-manager.outputs.runner }} astro build \ + --site "${{ steps.pages.outputs.origin }}" \ + --base "${{ steps.pages.outputs.base_path }}" + working-directory: ${{ env.BUILD_PATH }} + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: ${{ env.BUILD_PATH }}/dist + + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + needs: build + runs-on: ubuntu-latest + name: Deploy + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/samples/aws-new.yml b/.github/workflows/samples/aws-new.yml new file mode 100644 index 0000000..842d98c --- /dev/null +++ b/.github/workflows/samples/aws-new.yml @@ -0,0 +1,94 @@ +# This workflow will build and push a new container image to Amazon ECR, +# and then will deploy a new task definition to Amazon ECS, when there is a push to the "main" branch. +# +# To use this workflow, you will need to complete the following set-up steps: +# +# 1. Create an ECR repository to store your images. +# For example: `aws ecr create-repository --repository-name my-ecr-repo --region us-east-2`. +# Replace the value of the `ECR_REPOSITORY` environment variable in the workflow below with your repository's name. +# Replace the value of the `AWS_REGION` environment variable in the workflow below with your repository's region. +# +# 2. Create an ECS task definition, an ECS cluster, and an ECS service. +# For example, follow the Getting Started guide on the ECS console: +# https://us-east-2.console.aws.amazon.com/ecs/home?region=us-east-2#/firstRun +# Replace the value of the `ECS_SERVICE` environment variable in the workflow below with the name you set for the Amazon ECS service. +# Replace the value of the `ECS_CLUSTER` environment variable in the workflow below with the name you set for the cluster. +# +# 3. Store your ECS task definition as a JSON file in your repository. +# The format should follow the output of `aws ecs register-task-definition --generate-cli-skeleton`. +# Replace the value of the `ECS_TASK_DEFINITION` environment variable in the workflow below with the path to the JSON file. +# Replace the value of the `CONTAINER_NAME` environment variable in the workflow below with the name of the container +# in the `containerDefinitions` section of the task definition. +# +# 4. Store an IAM user access key in GitHub Actions secrets named `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`. +# See the documentation for each action used below for the recommended IAM policies for this IAM user, +# and best practices on handling the access key credentials. + +name: Deploy to Amazon ECS + +on: + push: + branches: ["main"] + +env: + AWS_REGION: MY_AWS_REGION # set this to your preferred AWS region, e.g. us-west-1 + ECR_REPOSITORY: MY_ECR_REPOSITORY # set this to your Amazon ECR repository name + ECS_SERVICE: MY_ECS_SERVICE # set this to your Amazon ECS service name + ECS_CLUSTER: MY_ECS_CLUSTER # set this to your Amazon ECS cluster name + ECS_TASK_DEFINITION: MY_ECS_TASK_DEFINITION # set this to the path to your Amazon ECS task definition + # file, e.g. .aws/task-definition.json + CONTAINER_NAME: MY_CONTAINER_NAME # set this to the name of the container in the + # containerDefinitions section of your task definition + +permissions: + contents: read + +jobs: + deploy: + name: Deploy + runs-on: ubuntu-latest + environment: production + + steps: + - name: Checkout + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 + + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v1 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: ${{ env.AWS_REGION }} + + - name: Login to Amazon ECR + id: login-ecr + uses: aws-actions/amazon-ecr-login@v1 + + - name: Build, tag, and push image to Amazon ECR + id: build-image + env: + ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} + IMAGE_TAG: ${{ github.sha }} + run: | + # Build a docker container and + # push it to ECR so that it can + # be deployed to ECS. + docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG . + docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG + echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT + + - name: Fill in the new image ID in the Amazon ECS task definition + id: task-def + uses: aws-actions/amazon-ecs-render-task-definition@v1 + with: + task-definition: ${{ env.ECS_TASK_DEFINITION }} + container-name: ${{ env.CONTAINER_NAME }} + image: ${{ steps.build-image.outputs.image }} + + - name: Deploy Amazon ECS task definition + uses: aws-actions/amazon-ecs-deploy-task-definition@v1 + with: + task-definition: ${{ steps.task-def.outputs.task-definition }} + service: ${{ env.ECS_SERVICE }} + cluster: ${{ env.ECS_CLUSTER }} + wait-for-service-stability: true diff --git a/.github/workflows/samples/aws.yml b/.github/workflows/samples/aws.yml new file mode 100644 index 0000000..842d98c --- /dev/null +++ b/.github/workflows/samples/aws.yml @@ -0,0 +1,94 @@ +# This workflow will build and push a new container image to Amazon ECR, +# and then will deploy a new task definition to Amazon ECS, when there is a push to the "main" branch. +# +# To use this workflow, you will need to complete the following set-up steps: +# +# 1. Create an ECR repository to store your images. +# For example: `aws ecr create-repository --repository-name my-ecr-repo --region us-east-2`. +# Replace the value of the `ECR_REPOSITORY` environment variable in the workflow below with your repository's name. +# Replace the value of the `AWS_REGION` environment variable in the workflow below with your repository's region. +# +# 2. Create an ECS task definition, an ECS cluster, and an ECS service. +# For example, follow the Getting Started guide on the ECS console: +# https://us-east-2.console.aws.amazon.com/ecs/home?region=us-east-2#/firstRun +# Replace the value of the `ECS_SERVICE` environment variable in the workflow below with the name you set for the Amazon ECS service. +# Replace the value of the `ECS_CLUSTER` environment variable in the workflow below with the name you set for the cluster. +# +# 3. Store your ECS task definition as a JSON file in your repository. +# The format should follow the output of `aws ecs register-task-definition --generate-cli-skeleton`. +# Replace the value of the `ECS_TASK_DEFINITION` environment variable in the workflow below with the path to the JSON file. +# Replace the value of the `CONTAINER_NAME` environment variable in the workflow below with the name of the container +# in the `containerDefinitions` section of the task definition. +# +# 4. Store an IAM user access key in GitHub Actions secrets named `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`. +# See the documentation for each action used below for the recommended IAM policies for this IAM user, +# and best practices on handling the access key credentials. + +name: Deploy to Amazon ECS + +on: + push: + branches: ["main"] + +env: + AWS_REGION: MY_AWS_REGION # set this to your preferred AWS region, e.g. us-west-1 + ECR_REPOSITORY: MY_ECR_REPOSITORY # set this to your Amazon ECR repository name + ECS_SERVICE: MY_ECS_SERVICE # set this to your Amazon ECS service name + ECS_CLUSTER: MY_ECS_CLUSTER # set this to your Amazon ECS cluster name + ECS_TASK_DEFINITION: MY_ECS_TASK_DEFINITION # set this to the path to your Amazon ECS task definition + # file, e.g. .aws/task-definition.json + CONTAINER_NAME: MY_CONTAINER_NAME # set this to the name of the container in the + # containerDefinitions section of your task definition + +permissions: + contents: read + +jobs: + deploy: + name: Deploy + runs-on: ubuntu-latest + environment: production + + steps: + - name: Checkout + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 + + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v1 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: ${{ env.AWS_REGION }} + + - name: Login to Amazon ECR + id: login-ecr + uses: aws-actions/amazon-ecr-login@v1 + + - name: Build, tag, and push image to Amazon ECR + id: build-image + env: + ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} + IMAGE_TAG: ${{ github.sha }} + run: | + # Build a docker container and + # push it to ECR so that it can + # be deployed to ECS. + docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG . + docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG + echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT + + - name: Fill in the new image ID in the Amazon ECS task definition + id: task-def + uses: aws-actions/amazon-ecs-render-task-definition@v1 + with: + task-definition: ${{ env.ECS_TASK_DEFINITION }} + container-name: ${{ env.CONTAINER_NAME }} + image: ${{ steps.build-image.outputs.image }} + + - name: Deploy Amazon ECS task definition + uses: aws-actions/amazon-ecs-deploy-task-definition@v1 + with: + task-definition: ${{ steps.task-def.outputs.task-definition }} + service: ${{ env.ECS_SERVICE }} + cluster: ${{ env.ECS_CLUSTER }} + wait-for-service-stability: true diff --git a/.github/workflows/samples/azure-container-webapp-new.yml b/.github/workflows/samples/azure-container-webapp-new.yml new file mode 100644 index 0000000..638216b --- /dev/null +++ b/.github/workflows/samples/azure-container-webapp-new.yml @@ -0,0 +1,86 @@ +# This workflow will build and push a Docker container to an Azure Web App when a commit is pushed to your default branch. +# +# This workflow assumes you have already created the target Azure App Service web app. +# For instructions see https://docs.microsoft.com/en-us/azure/app-service/quickstart-custom-container?tabs=dotnet&pivots=container-linux +# +# To configure this workflow: +# +# 1. Download the Publish Profile for your Azure Web App. You can download this file from the Overview page of your Web App in the Azure Portal. +# For more information: https://docs.microsoft.com/en-us/azure/app-service/deploy-github-actions?tabs=applevel#generate-deployment-credentials +# +# 2. Create a secret in your repository named AZURE_WEBAPP_PUBLISH_PROFILE, paste the publish profile contents as the value of the secret. +# For instructions on obtaining the publish profile see: https://docs.microsoft.com/azure/app-service/deploy-github-actions#configure-the-github-secret +# +# 3. Create a GitHub Personal access token with "repo" and "read:packages" permissions. +# +# 4. Create three app settings on your Azure Web app: +# DOCKER_REGISTRY_SERVER_URL: Set this to "https://ghcr.io" +# DOCKER_REGISTRY_SERVER_USERNAME: Set this to the GitHub username or organization that owns the repository +# DOCKER_REGISTRY_SERVER_PASSWORD: Set this to the value of your PAT token from the previous step +# +# 5. Change the value for the AZURE_WEBAPP_NAME. +# +# For more information on GitHub Actions for Azure: https://github.com/Azure/Actions +# For more information on the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy +# For more samples to get started with GitHub Action workflows to deploy to Azure: https://github.com/Azure/actions-workflow-samples + +name: Build and deploy a container to an Azure Web App + +env: + AZURE_WEBAPP_NAME: your-app-name # set this to the name of your Azure Web App + +on: + push: + branches: ["main"] + workflow_dispatch: + +permissions: + contents: read + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0 + + - name: Log in to GitHub container registry + uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ github.token }} + + - name: Lowercase the repo name and username + run: echo "REPO=${GITHUB_REPOSITORY,,}" >>${GITHUB_ENV} + + - name: Build and push container image to registry + uses: docker/build-push-action@0565240e2d4ab88bba5387d719585280857ece09 # v5.0.0 + with: + push: true + tags: ghcr.io/${{ env.REPO }}:${{ github.sha }} + file: ./Dockerfile + + deploy: + permissions: + contents: none + runs-on: ubuntu-latest + needs: build + environment: + name: 'Development' + url: ${{ steps.deploy-to-webapp.outputs.webapp-url }} + + steps: + - name: Lowercase the repo name and username + run: echo "REPO=${GITHUB_REPOSITORY,,}" >>${GITHUB_ENV} + + - name: Deploy to Azure Web App + id: deploy-to-webapp + uses: azure/webapps-deploy@v2 + with: + app-name: ${{ env.AZURE_WEBAPP_NAME }} + publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }} + images: 'ghcr.io/${{ env.REPO }}:${{ github.sha }}' diff --git a/.github/workflows/samples/azure-container-webapp.yml b/.github/workflows/samples/azure-container-webapp.yml new file mode 100644 index 0000000..638216b --- /dev/null +++ b/.github/workflows/samples/azure-container-webapp.yml @@ -0,0 +1,86 @@ +# This workflow will build and push a Docker container to an Azure Web App when a commit is pushed to your default branch. +# +# This workflow assumes you have already created the target Azure App Service web app. +# For instructions see https://docs.microsoft.com/en-us/azure/app-service/quickstart-custom-container?tabs=dotnet&pivots=container-linux +# +# To configure this workflow: +# +# 1. Download the Publish Profile for your Azure Web App. You can download this file from the Overview page of your Web App in the Azure Portal. +# For more information: https://docs.microsoft.com/en-us/azure/app-service/deploy-github-actions?tabs=applevel#generate-deployment-credentials +# +# 2. Create a secret in your repository named AZURE_WEBAPP_PUBLISH_PROFILE, paste the publish profile contents as the value of the secret. +# For instructions on obtaining the publish profile see: https://docs.microsoft.com/azure/app-service/deploy-github-actions#configure-the-github-secret +# +# 3. Create a GitHub Personal access token with "repo" and "read:packages" permissions. +# +# 4. Create three app settings on your Azure Web app: +# DOCKER_REGISTRY_SERVER_URL: Set this to "https://ghcr.io" +# DOCKER_REGISTRY_SERVER_USERNAME: Set this to the GitHub username or organization that owns the repository +# DOCKER_REGISTRY_SERVER_PASSWORD: Set this to the value of your PAT token from the previous step +# +# 5. Change the value for the AZURE_WEBAPP_NAME. +# +# For more information on GitHub Actions for Azure: https://github.com/Azure/Actions +# For more information on the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy +# For more samples to get started with GitHub Action workflows to deploy to Azure: https://github.com/Azure/actions-workflow-samples + +name: Build and deploy a container to an Azure Web App + +env: + AZURE_WEBAPP_NAME: your-app-name # set this to the name of your Azure Web App + +on: + push: + branches: ["main"] + workflow_dispatch: + +permissions: + contents: read + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0 + + - name: Log in to GitHub container registry + uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ github.token }} + + - name: Lowercase the repo name and username + run: echo "REPO=${GITHUB_REPOSITORY,,}" >>${GITHUB_ENV} + + - name: Build and push container image to registry + uses: docker/build-push-action@0565240e2d4ab88bba5387d719585280857ece09 # v5.0.0 + with: + push: true + tags: ghcr.io/${{ env.REPO }}:${{ github.sha }} + file: ./Dockerfile + + deploy: + permissions: + contents: none + runs-on: ubuntu-latest + needs: build + environment: + name: 'Development' + url: ${{ steps.deploy-to-webapp.outputs.webapp-url }} + + steps: + - name: Lowercase the repo name and username + run: echo "REPO=${GITHUB_REPOSITORY,,}" >>${GITHUB_ENV} + + - name: Deploy to Azure Web App + id: deploy-to-webapp + uses: azure/webapps-deploy@v2 + with: + app-name: ${{ env.AZURE_WEBAPP_NAME }} + publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }} + images: 'ghcr.io/${{ env.REPO }}:${{ github.sha }}' diff --git a/.github/workflows/samples/azure-webapps-node.yml b/.github/workflows/samples/azure-webapps-node.yml new file mode 100644 index 0000000..869bb98 --- /dev/null +++ b/.github/workflows/samples/azure-webapps-node.yml @@ -0,0 +1,106 @@ +name: Build and Push Docker Image + +on: + push: + branches: + - main + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@ee0669bd1cc54295c223e0bb666b733df41de1c5 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + + - name: Log in to Docker Hub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Build and push + uses: docker/build-push-action@v2 + with: + push: true + tags: your-dockerhub-username/agi-pipeline:latest# This workflow will build and push a node.js application to an Azure Web App when a commit is pushed to your default branch. +# +# This workflow assumes you have already created the target Azure App Service web app. +# For instructions see https://docs.microsoft.com/en-us/azure/app-service/quickstart-nodejs?tabs=linux&pivots=development-environment-cli +# +# To configure this workflow: +# +# 1. Download the Publish Profile for your Azure Web App. You can download this file from the Overview page of your Web App in the Azure Portal. +# For more information: https://docs.microsoft.com/en-us/azure/app-service/deploy-github-actions?tabs=applevel#generate-deployment-credentials +# +# 2. Create a secret in your repository named AZURE_WEBAPP_PUBLISH_PROFILE, paste the publish profile contents as the value of the secret. +# For instructions on obtaining the publish profile see: https://docs.microsoft.com/azure/app-service/deploy-github-actions#configure-the-github-secret +# +# 3. Change the value for the AZURE_WEBAPP_NAME. Optionally, change the AZURE_WEBAPP_PACKAGE_PATH and NODE_VERSION environment variables below. +# +# For more information on GitHub Actions for Azure: https://github.com/Azure/Actions +# For more information on the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy +# For more samples to get started with GitHub Action workflows to deploy to Azure: https://github.com/Azure/actions-workflow-samples + +on: + push: + branches: ["main"] + workflow_dispatch: + +env: + AZURE_WEBAPP_NAME: your-app-name # set this to your application's name + AZURE_WEBAPP_PACKAGE_PATH: '.' # set this to the path to your web app project, defaults to the repository root + NODE_VERSION: '20.x' # set this to the node version to use + +permissions: + contents: read + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 + + - name: Set up Node.js + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 + with: + node-version: ${{ env.NODE_VERSION }} + cache: 'npm' + + - name: npm install, build, and test + run: | + npm install + npm run build --if-present + npm run test --if-present + + - name: Upload artifact for deployment job + uses: actions/upload-artifact@v3 + with: + name: node-app + path: . + + deploy: + permissions: + contents: none + runs-on: ubuntu-latest + needs: build + environment: + name: 'Development' + url: ${{ steps.deploy-to-webapp.outputs.webapp-url }} + + steps: + - name: Download artifact from build job + uses: actions/download-artifact@v3 + with: + name: node-app + + - name: 'Deploy to Azure WebApp' + id: deploy-to-webapp + uses: azure/webapps-deploy@v2 + with: + app-name: ${{ env.AZURE_WEBAPP_NAME }} + publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }} + package: ${{ env.AZURE_WEBAPP_PACKAGE_PATH }} diff --git a/.github/workflows/samples/blueprint-artifacts-validation.yml b/.github/workflows/samples/blueprint-artifacts-validation.yml new file mode 100644 index 0000000..39ff3c4 --- /dev/null +++ b/.github/workflows/samples/blueprint-artifacts-validation.yml @@ -0,0 +1,44 @@ +name: Blueprint Artifact Validation + +on: + workflow_dispatch: + push: + paths: + - 'docs/reports/blueprint_artifacts/**' + - 'docs/reports/ENTERPRISE_CIVILIZATIONAL_AGI_ASI_BLUEPRINT_2026_2030.md' + - 'scripts/validate_blueprint_artifacts.py' + - 'scripts/__init__.py' + - 'scripts/requirements-blueprint-validator.txt' + - 'scripts/run_blueprint_artifact_checks.sh' + - 'tests/test_validate_blueprint_artifacts.py' + - 'tests/test_run_blueprint_artifact_checks.py' + - '.github/workflows/blueprint-artifacts-validation.yml' + pull_request: + paths: + - 'docs/reports/ENTERPRISE_CIVILIZATIONAL_AGI_ASI_BLUEPRINT_2026_2030.md' + - 'docs/reports/blueprint_artifacts/**' + - 'scripts/validate_blueprint_artifacts.py' + - 'scripts/__init__.py' + - 'scripts/requirements-blueprint-validator.txt' + - 'scripts/run_blueprint_artifact_checks.sh' + - 'tests/test_validate_blueprint_artifacts.py' + - 'tests/test_run_blueprint_artifact_checks.py' + - '.github/workflows/blueprint-artifacts-validation.yml' + +jobs: + validate-artifacts: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 + with: + python-version: '3.12' + cache: 'pip' + cache-dependency-path: scripts/requirements-blueprint-validator.txt + - name: Run consolidated artifact check script + run: bash scripts/run_blueprint_artifact_checks.sh --list-checks + - name: Runner interface smoke checks + run: | + bash scripts/run_blueprint_artifact_checks.sh --help + bash scripts/run_blueprint_artifact_checks.sh --skip-install --skip-pytest --output-json /tmp/blueprint-validation-alt.json + python -m json.tool /tmp/blueprint-validation-alt.json > /dev/null diff --git a/.github/workflows/samples/c-cpp.yml b/.github/workflows/samples/c-cpp.yml new file mode 100644 index 0000000..b80d748 --- /dev/null +++ b/.github/workflows/samples/c-cpp.yml @@ -0,0 +1,23 @@ +name: C/C++ CI + +on: + push: + branches: ["main"] + pull_request: + branches: ["main"] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 + - name: configure + run: ./configure + - name: make + run: make + - name: make check + run: make check + - name: make distcheck + run: make distcheck diff --git a/.github/workflows/samples/clojure.yml b/.github/workflows/samples/clojure.yml new file mode 100644 index 0000000..463b722 --- /dev/null +++ b/.github/workflows/samples/clojure.yml @@ -0,0 +1,19 @@ +name: Clojure CI + +on: + push: + branches: ["main"] + pull_request: + branches: ["main"] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 + - name: Install dependencies + run: lein deps + - name: Run tests + run: lein test diff --git a/.github/workflows/samples/cmake-multi-platform.yml b/.github/workflows/samples/cmake-multi-platform.yml new file mode 100644 index 0000000..57a9c79 --- /dev/null +++ b/.github/workflows/samples/cmake-multi-platform.yml @@ -0,0 +1,75 @@ +# This starter workflow is for a CMake project running on multiple platforms. There is a different starter workflow if you just want a single platform. +# See: https://github.com/actions/starter-workflows/blob/main/ci/cmake-single-platform.yml +name: CMake on multiple platforms + +on: + push: + branches: ["main"] + pull_request: + branches: ["main"] + +jobs: + build: + runs-on: ${{ matrix.os }} + + strategy: + # Set fail-fast to false to ensure that feedback is delivered for all matrix combinations. Consider changing this to true when your workflow is stable. + fail-fast: false + + # Set up a matrix to run the following 3 configurations: + # 1. + # 2. + # 3. + # + # To add more build types (Release, Debug, RelWithDebInfo, etc.) customize the build_type list. + matrix: + os: [ubuntu-latest, windows-latest] + build_type: [Release] + c_compiler: [gcc, clang, cl] + include: + - os: windows-latest + c_compiler: cl + cpp_compiler: cl + - os: ubuntu-latest + c_compiler: gcc + cpp_compiler: g++ + - os: ubuntu-latest + c_compiler: clang + cpp_compiler: clang++ + exclude: + - os: windows-latest + c_compiler: gcc + - os: windows-latest + c_compiler: clang + - os: ubuntu-latest + c_compiler: cl + + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 + + - name: Set reusable strings + # Turn repeated input strings (such as the build output directory) into step outputs. These step outputs can be used throughout the workflow file. + id: strings + shell: bash + run: | + echo "build-output-dir=${{ github.workspace }}/build" >> "$GITHUB_OUTPUT" + + - name: Configure CMake + # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. + # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type + run: > + cmake -B ${{ steps.strings.outputs.build-output-dir }} + -DCMAKE_CXX_COMPILER=${{ matrix.cpp_compiler }} + -DCMAKE_C_COMPILER=${{ matrix.c_compiler }} + -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} + -S ${{ github.workspace }} + + - name: Build + # Build your program with the given configuration. Note that --config is needed because the default Windows generator is a multi-config generator (Visual Studio generator). + run: cmake --build ${{ steps.strings.outputs.build-output-dir }} --config ${{ matrix.build_type }} + + - name: Test + working-directory: ${{ steps.strings.outputs.build-output-dir }} + # Execute tests defined by the CMake configuration. Note that --build-config is needed because the default Windows generator is a multi-config generator (Visual Studio generator). + # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail + run: ctest --build-config ${{ matrix.build_type }} diff --git a/.github/workflows/samples/cmake-single-platform.yml b/.github/workflows/samples/cmake-single-platform.yml new file mode 100644 index 0000000..54244c0 --- /dev/null +++ b/.github/workflows/samples/cmake-single-platform.yml @@ -0,0 +1,38 @@ +# This starter workflow is for a CMake project running on a single platform. There is a different starter workflow if you need cross-platform coverage. +# See: https://github.com/actions/starter-workflows/blob/main/ci/cmake-multi-platform.yml +name: CMake on a single platform + +on: + push: + branches: ["main"] + pull_request: + branches: ["main"] + +env: + # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) + BUILD_TYPE: Release + +jobs: + build: + # The CMake configure and build commands are platform agnostic and should work equally well on Windows or Mac. + # You can convert this to a matrix build if you need cross-platform coverage. + # See: https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 + + - name: Configure CMake + # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. + # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type + run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} + + - name: Build + # Build your program with the given configuration + run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} + + - name: Test + working-directory: ${{github.workspace}}/build + # Execute tests defined by the CMake configuration. + # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail + run: ctest -C ${{env.BUILD_TYPE}} diff --git a/.github/workflows/samples/codacy.yml b/.github/workflows/samples/codacy.yml new file mode 100644 index 0000000..9a5521c --- /dev/null +++ b/.github/workflows/samples/codacy.yml @@ -0,0 +1,61 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +# This workflow checks out code, performs a Codacy security scan +# and integrates the results with the +# GitHub Advanced Security code scanning feature. For more information on +# the Codacy security scan action usage and parameters, see +# https://github.com/codacy/codacy-analysis-cli-action. +# For more information on Codacy Analysis CLI in general, see +# https://github.com/codacy/codacy-analysis-cli. + +name: Codacy Security Scan + +on: + push: + branches: ["main"] + pull_request: + # The branches below must be a subset of the branches above + branches: ["main"] + schedule: + - cron: '40 17 * * 2' + +permissions: + contents: read + +jobs: + codacy-security-scan: + permissions: + contents: read # for actions/checkout to fetch code + security-events: write # for github/codeql-action/upload-sarif to upload SARIF results + actions: read # only required for a private repository by github/codeql-action/upload-sarif to get the Action run status + name: Codacy Security Scan + runs-on: ubuntu-latest + steps: + # Checkout the repository to the GitHub Actions runner + - name: Checkout code + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 + + # Execute Codacy Analysis CLI and generate a SARIF output with the security issues identified during the analysis + - name: Run Codacy Analysis CLI + uses: codacy/codacy-analysis-cli-action@d840f886c4bd4edc059706d09c6a1586111c540b + with: + # Check https://github.com/codacy/codacy-analysis-cli#project-token to get your project token from your Codacy repository + # You can also omit the token and run the tools that support default configurations + project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} + verbose: true + output: results.sarif + format: sarif + # Adjust severity of non-security issues + gh-code-scanning-compat: true + # Force 0 exit code to allow SARIF file generation + # This will handover control about PR rejection to the GitHub side + max-allowed-issues: 2147483647 + + # Upload the SARIF file generated in the previous step + - name: Upload SARIF results file + uses: github/codeql-action/upload-sarif@v3 + with: + sarif_file: results.sarif diff --git a/.github/workflows/samples/crystal.yml b/.github/workflows/samples/crystal.yml new file mode 100644 index 0000000..93ac686 --- /dev/null +++ b/.github/workflows/samples/crystal.yml @@ -0,0 +1,22 @@ +name: Crystal CI + +on: + push: + branches: ["main"] + pull_request: + branches: ["main"] + +jobs: + build: + + runs-on: ubuntu-latest + + container: + image: crystallang/crystal + + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 + - name: Install dependencies + run: shards install + - name: Run tests + run: crystal spec diff --git a/.github/workflows/samples/d.yml b/.github/workflows/samples/d.yml new file mode 100644 index 0000000..2fbcf6b --- /dev/null +++ b/.github/workflows/samples/d.yml @@ -0,0 +1,32 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. +name: D + +on: + push: + branches: ["main"] + pull_request: + branches: ["main"] + +permissions: + contents: read + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 + - uses: dlang-community/setup-dlang@4c99aa991ce7d19dd3064de0a4f2f6b2f152e2d7 + + - name: 'Build & Test' + run: | + # Build the project, with its main file included, without unittests + dub build --compiler=$DC + # Build and run tests, as defined by `unittest` configuration + # In this mode, `mainSourceFile` is excluded and `version (unittest)` are included + # See https://dub.pm/package-format-json.html#configurations + dub test --compiler=$DC diff --git a/.github/workflows/samples/dart.yml b/.github/workflows/samples/dart.yml new file mode 100644 index 0000000..b9a4c01 --- /dev/null +++ b/.github/workflows/samples/dart.yml @@ -0,0 +1,42 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +name: Dart + +on: + push: + branches: ["main"] + pull_request: + branches: ["main"] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 + + # Note: This workflow uses the latest stable version of the Dart SDK. + # You can specify other versions if desired, see documentation here: + # https://github.com/dart-lang/setup-dart/blob/main/README.md + # - uses: dart-lang/setup-dart@v1 + - uses: dart-lang/setup-dart@9a04e6d73cca37bd455e0608d7e5092f881fd603 + + - name: Install dependencies + run: dart pub get + + # Uncomment this step to verify the use of 'dart format' on each commit. + # - name: Verify formatting + # run: dart format --output=none --set-exit-if-changed . + + # Consider passing '--fatal-infos' for slightly stricter analysis. + - name: Analyze project source + run: dart analyze + + # Your project will need to have tests in test/ and a dependency on + # package:test for this step to succeed. Note that Flutter projects will + # want to change this to 'flutter test'. + - name: Run tests + run: dart test diff --git a/.github/workflows/samples/datadog-synthetics.yml b/.github/workflows/samples/datadog-synthetics.yml new file mode 100644 index 0000000..380e101 --- /dev/null +++ b/.github/workflows/samples/datadog-synthetics.yml @@ -0,0 +1,36 @@ +# This workflow will trigger Datadog Synthetic tests within your Datadog organisation +# For more information on running Synthetic tests within your GitHub workflows see: https://docs.datadoghq.com/synthetics/cicd_integrations/github_actions/ + +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +# To get started: + +# 1. Add your Datadog API (DD_API_KEY) and Application Key (DD_APP_KEY) as secrets to your GitHub repository. For more information, see: https://docs.datadoghq.com/account_management/api-app-keys/. +# 2. Start using the action within your workflow + +name: Run Datadog Synthetic tests + +on: + push: + branches: ["main"] + pull_request: + branches: ["main"] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@ee0669bd1cc54295c223e0bb666b733df41de1c5 + + # Run Synthetic tests within your GitHub workflow. + # For additional configuration options visit the action within the marketplace: https://github.com/marketplace/actions/datadog-synthetics-ci + - name: Run Datadog Synthetic tests + uses: DataDog/synthetics-ci-github-action@87b505388a22005bb8013481e3f73a367b9a53eb # v1.4.0 + with: + api_key: ${{secrets.DD_API_KEY}} + app_key: ${{secrets.DD_APP_KEY}} + test_search_query: 'tag:e2e-tests' #Modify this tag to suit your tagging strategy diff --git a/.github/workflows/samples/defender-for-devops.yml b/.github/workflows/samples/defender-for-devops.yml new file mode 100644 index 0000000..2194134 --- /dev/null +++ b/.github/workflows/samples/defender-for-devops.yml @@ -0,0 +1,47 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. +# +# Microsoft Security DevOps (MSDO) is a command line application which integrates static analysis tools into the development cycle. +# MSDO installs, configures and runs the latest versions of static analysis tools +# (including, but not limited to, SDL/security and compliance tools). +# +# The Microsoft Security DevOps action is currently in beta and runs on the windows-latest queue, +# as well as Windows self hosted agents. ubuntu-latest support coming soon. +# +# For more information about the action , check out https://github.com/microsoft/security-devops-action +# +# Please note this workflow do not integrate your GitHub Org with Microsoft Defender For DevOps. You have to create an integration +# and provide permission before this can report data back to azure. +# Read the official documentation here : https://learn.microsoft.com/en-us/azure/defender-for-cloud/quickstart-onboard-github + +name: "Microsoft Defender For Devops" + +on: + push: + branches: ["main"] + pull_request: + branches: ["main"] + schedule: + - cron: '24 5 * * 3' + +jobs: + MSDO: + # currently only windows latest is supported + runs-on: windows-latest + + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 + - uses: actions/setup-dotnet@v4 + with: + dotnet-version: | + 5.0.x + 6.0.x + - name: Run Microsoft Security DevOps + uses: microsoft/security-devops-action@v1.6.0 + id: msdo + - name: Upload results to Security tab + uses: github/codeql-action/upload-sarif@v3 + with: + sarif_file: ${{ steps.msdo.outputs.sarifFile }} diff --git a/.github/workflows/deno.yml b/.github/workflows/samples/deno.yml similarity index 93% rename from .github/workflows/deno.yml rename to .github/workflows/samples/deno.yml index 782af35..bbee4ec 100644 --- a/.github/workflows/deno.yml +++ b/.github/workflows/samples/deno.yml @@ -23,7 +23,7 @@ jobs: steps: - name: Setup repo - uses: actions/checkout@v4 + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 - name: Setup Deno # uses: denoland/setup-deno@v1 diff --git a/.github/workflows/sentinel-governance-gates.yml b/.github/workflows/sentinel-governance-gates.yml index 5ba86d9..55ac820 100644 --- a/.github/workflows/sentinel-governance-gates.yml +++ b/.github/workflows/sentinel-governance-gates.yml @@ -10,9 +10,9 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 20 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 - - uses: actions/setup-python@v5 + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 with: python-version: "3.11" @@ -30,7 +30,7 @@ jobs: - name: Upload validation report if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 with: name: sentinel-governance-validation-report path: /tmp/sentinel_governance_validation_report.json diff --git a/.github/workflows/super-linter.yml b/.github/workflows/super-linter.yml index 800e4c4..442755d 100644 --- a/.github/workflows/super-linter.yml +++ b/.github/workflows/super-linter.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 with: # Full git history is needed to get a proper list of changed files within `super-linter` fetch-depth: 0 diff --git a/.github/workflows/webpack.yml b/.github/workflows/webpack.yml index 9626ff6..f2c8978 100644 --- a/.github/workflows/webpack.yml +++ b/.github/workflows/webpack.yml @@ -15,10 +15,10 @@ jobs: node-version: [18.x, 20.x, 22.x] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v4 + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 with: node-version: ${{ matrix.node-version }} diff --git a/rag-agentic-dashboard/server.js b/rag-agentic-dashboard/server.js index 2a6a134..1d2abeb 100644 --- a/rag-agentic-dashboard/server.js +++ b/rag-agentic-dashboard/server.js @@ -21,6 +21,24 @@ const { v4: uuidv4 } = require('uuid'); const path = require('path'); const app = express(); +// ── Security Middleware ────────────────────────────────────────────────────── +const rateLimits = new Map(); +app.use((req, res, next) => { + const ip = req.ip || '127.0.0.1'; + const now = Date.now(); + const entry = rateLimits.get(ip) || { count: 0, expires: now + 60000 }; + if (now > entry.expires) { entry.count = 1; entry.expires = now + 60000; } + else entry.count++; + rateLimits.set(ip, entry); + if (entry.count > 100) return res.status(429).send('Rate limit exceeded'); + next(); +}); + +app.param('id', (req, res, next, id) => { + if (!/^[a-zA-Z0-9_\-]+$/.test(id)) return res.status(400).send('Invalid ID'); + next(); +}); + const server = http.createServer(app); const wss = new WebSocket.Server({ server, path: '/ws' }); @@ -572,7 +590,7 @@ class DirectiveEvaluatorAgent extends AgentBase { // Step 4: Criterion 3 — Domain Context const domainSignals = [ /iso\s*42001/i, /nist\s*ai\s*r(mf|isk)/i, /gdpr/i, /eu\s*ai\s*act/i, - /annex\s*a/i, /govern.*map.*measure.*manage/i, /soc\s*2/i, + /annex\s*a/i, /govern\s+map\s+measure\s+manage/i, /soc\s*2/i, /dpia/i, /art(icle)?\s*\d+/i, /model\s*card/i, /bias/i, /fairness/i, /data\s*protection/i, /privacy/i, /transparency/i, /risk\s*tier/i ]; @@ -583,7 +601,7 @@ class DirectiveEvaluatorAgent extends AgentBase { if (/nist\s*ai\s*r(mf|isk)/i.test(text)) domainEvidence.push('NIST AI RMF framework cited'); if (/gdpr/i.test(text)) domainEvidence.push('EU GDPR requirements invoked'); if (/eu\s*ai\s*act/i.test(text)) domainEvidence.push('EU AI Act regulatory context provided'); - if (/govern.*map.*measure.*manage/i.test(text)) domainEvidence.push('NIST AI RMF functions enumerated (Govern, Map, Measure, Manage)'); + if (/govern\s+map\s+measure\s+manage/i.test(text)) domainEvidence.push('NIST AI RMF functions enumerated (Govern, Map, Measure, Manage)'); if (/regulat(ed|ory)/i.test(text)) domainEvidence.push('Regulatory compliance context established'); const score = (goalClarity ? 1 : 0) + (operationalScope ? 1 : 0) + (domainContext ? 1 : 0); @@ -10961,16 +10979,16 @@ const AGMB = AGI_GOVERNANCE_MASTER_BLUEPRINT; // ─── AGMB API ROUTES ──────────────────────────────────────────────────────── // Root -app.get('/api/agi-governance-master-blueprint', (req, res) => res.json(AGMB)); +app.get('/api/agi-governance-master-blueprint', (_req, res) => res.json(AGMB)); // Metadata -app.get('/api/agi-governance-master-blueprint/metadata', (req, res) => res.json(AGMB.metadata)); +app.get('/api/agi-governance-master-blueprint/metadata', (_req, res) => res.json(AGMB.metadata)); // KPIs -app.get('/api/agi-governance-master-blueprint/kpis', (req, res) => res.json(AGMB.kpis)); +app.get('/api/agi-governance-master-blueprint/kpis', (_req, res) => res.json(AGMB.kpis)); // Governance Pillars -app.get('/api/agi-governance-master-blueprint/pillars', (req, res) => res.json(AGMB.governancePillars)); +app.get('/api/agi-governance-master-blueprint/pillars', (_req, res) => res.json(AGMB.governancePillars)); app.get('/api/agi-governance-master-blueprint/pillars/:id', (req, res) => { const pillar = AGMB.governancePillars.find(p => p.id === req.params.id.toUpperCase()); if (!pillar) return res.status(404).json({ error: 'Pillar not found', validIds: AGMB.governancePillars.map(p => p.id) }); @@ -10978,12 +10996,12 @@ app.get('/api/agi-governance-master-blueprint/pillars/:id', (req, res) => { }); // Regulatory Alignment -app.get('/api/agi-governance-master-blueprint/regulatory', (req, res) => res.json(AGMB.regulatoryAlignment)); -app.get('/api/agi-governance-master-blueprint/regulatory/frameworks', (req, res) => res.json(AGMB.regulatoryAlignment.frameworks)); -app.get('/api/agi-governance-master-blueprint/regulatory/calendar', (req, res) => res.json(AGMB.regulatoryAlignment.complianceCalendar)); +app.get('/api/agi-governance-master-blueprint/regulatory', (_req, res) => res.json(AGMB.regulatoryAlignment)); +app.get('/api/agi-governance-master-blueprint/regulatory/frameworks', (_req, res) => res.json(AGMB.regulatoryAlignment.frameworks)); +app.get('/api/agi-governance-master-blueprint/regulatory/calendar', (_req, res) => res.json(AGMB.regulatoryAlignment.complianceCalendar)); // Reference Architectures -app.get('/api/agi-governance-master-blueprint/architectures', (req, res) => res.json(AGMB.referenceArchitectures)); +app.get('/api/agi-governance-master-blueprint/architectures', (_req, res) => res.json(AGMB.referenceArchitectures)); app.get('/api/agi-governance-master-blueprint/architectures/:id', (req, res) => { const arch = AGMB.referenceArchitectures.find(a => a.id === req.params.id.toUpperCase()); if (!arch) return res.status(404).json({ error: 'Architecture not found', validIds: AGMB.referenceArchitectures.map(a => a.id) }); @@ -10991,68 +11009,68 @@ app.get('/api/agi-governance-master-blueprint/architectures/:id', (req, res) => }); // Trust Stack -app.get('/api/agi-governance-master-blueprint/trust-stack', (req, res) => res.json(AGMB.trustStack)); +app.get('/api/agi-governance-master-blueprint/trust-stack', (_req, res) => res.json(AGMB.trustStack)); // Global Governance -app.get('/api/agi-governance-master-blueprint/global-governance', (req, res) => res.json(AGMB.globalGovernance)); -app.get('/api/agi-governance-master-blueprint/global-governance/icgc', (req, res) => res.json(AGMB.globalGovernance.icgc)); -app.get('/api/agi-governance-master-blueprint/global-governance/icgc/components', (req, res) => res.json(AGMB.globalGovernance.icgc.components)); -app.get('/api/agi-governance-master-blueprint/global-governance/compute-registry', (req, res) => res.json(AGMB.globalGovernance.computeRegistry)); -app.get('/api/agi-governance-master-blueprint/global-governance/sentinel-integration', (req, res) => res.json(AGMB.globalGovernance.sentinelGlobalIntegration)); +app.get('/api/agi-governance-master-blueprint/global-governance', (_req, res) => res.json(AGMB.globalGovernance)); +app.get('/api/agi-governance-master-blueprint/global-governance/icgc', (_req, res) => res.json(AGMB.globalGovernance.icgc)); +app.get('/api/agi-governance-master-blueprint/global-governance/icgc/components', (_req, res) => res.json(AGMB.globalGovernance.icgc.components)); +app.get('/api/agi-governance-master-blueprint/global-governance/compute-registry', (_req, res) => res.json(AGMB.globalGovernance.computeRegistry)); +app.get('/api/agi-governance-master-blueprint/global-governance/sentinel-integration', (_req, res) => res.json(AGMB.globalGovernance.sentinelGlobalIntegration)); // Financial Services -app.get('/api/agi-governance-master-blueprint/financial-services', (req, res) => res.json(AGMB.financialServices)); -app.get('/api/agi-governance-master-blueprint/financial-services/risk-taxonomy', (req, res) => res.json(AGMB.financialServices.riskTaxonomy)); -app.get('/api/agi-governance-master-blueprint/financial-services/earl', (req, res) => res.json({ +app.get('/api/agi-governance-master-blueprint/financial-services', (_req, res) => res.json(AGMB.financialServices)); +app.get('/api/agi-governance-master-blueprint/financial-services/risk-taxonomy', (_req, res) => res.json(AGMB.financialServices.riskTaxonomy)); +app.get('/api/agi-governance-master-blueprint/financial-services/earl', (_req, res) => res.json({ levels: AGMB.financialServices.earl, current: AGMB.financialServices.currentEARL, target: AGMB.financialServices.targetEARL })); // AGI Safety -app.get('/api/agi-governance-master-blueprint/agi-safety', (req, res) => res.json(AGMB.agiSafety)); -app.get('/api/agi-governance-master-blueprint/agi-safety/evolution-model', (req, res) => res.json(AGMB.agiSafety.evolutionModel)); -app.get('/api/agi-governance-master-blueprint/agi-safety/cognitive-resonance', (req, res) => res.json(AGMB.agiSafety.cognitiveResonance)); -app.get('/api/agi-governance-master-blueprint/agi-safety/crisis-simulations', (req, res) => res.json(AGMB.agiSafety.crisisSimulations)); -app.get('/api/agi-governance-master-blueprint/agi-safety/mvags', (req, res) => res.json(AGMB.agiSafety.mvags)); +app.get('/api/agi-governance-master-blueprint/agi-safety', (_req, res) => res.json(AGMB.agiSafety)); +app.get('/api/agi-governance-master-blueprint/agi-safety/evolution-model', (_req, res) => res.json(AGMB.agiSafety.evolutionModel)); +app.get('/api/agi-governance-master-blueprint/agi-safety/cognitive-resonance', (_req, res) => res.json(AGMB.agiSafety.cognitiveResonance)); +app.get('/api/agi-governance-master-blueprint/agi-safety/crisis-simulations', (_req, res) => res.json(AGMB.agiSafety.crisisSimulations)); +app.get('/api/agi-governance-master-blueprint/agi-safety/mvags', (_req, res) => res.json(AGMB.agiSafety.mvags)); // AGI Readiness Layers -app.get('/api/agi-governance-master-blueprint/agi-readiness', (req, res) => res.json(AGMB.agiReadinessLayers)); +app.get('/api/agi-governance-master-blueprint/agi-readiness', (_req, res) => res.json(AGMB.agiReadinessLayers)); // Autonomous Agents -app.get('/api/agi-governance-master-blueprint/autonomous-agents', (req, res) => res.json(AGMB.autonomousAgents)); -app.get('/api/agi-governance-master-blueprint/autonomous-agents/depths', (req, res) => res.json(AGMB.autonomousAgents.depthsClassification)); -app.get('/api/agi-governance-master-blueprint/autonomous-agents/controls', (req, res) => res.json({ +app.get('/api/agi-governance-master-blueprint/autonomous-agents', (_req, res) => res.json(AGMB.autonomousAgents)); +app.get('/api/agi-governance-master-blueprint/autonomous-agents/depths', (_req, res) => res.json(AGMB.autonomousAgents.depthsClassification)); +app.get('/api/agi-governance-master-blueprint/autonomous-agents/controls', (_req, res) => res.json({ cardinalInvariant: AGMB.autonomousAgents.cardinalInvariant, selfMultiplyingControls: AGMB.autonomousAgents.selfMultiplyingControls, tieredAdministration: AGMB.autonomousAgents.tieredAdministration })); -app.get('/api/agi-governance-master-blueprint/autonomous-agents/orchestrator-roles', (req, res) => res.json(AGMB.autonomousAgents.cognitiveOrchestratorRoles)); +app.get('/api/agi-governance-master-blueprint/autonomous-agents/orchestrator-roles', (_req, res) => res.json(AGMB.autonomousAgents.cognitiveOrchestratorRoles)); // Rollout -app.get('/api/agi-governance-master-blueprint/rollout', (req, res) => res.json(AGMB.rollout)); -app.get('/api/agi-governance-master-blueprint/rollout/30-day', (req, res) => res.json(AGMB.rollout.days1to30)); -app.get('/api/agi-governance-master-blueprint/rollout/60-day', (req, res) => res.json(AGMB.rollout.days31to60)); -app.get('/api/agi-governance-master-blueprint/rollout/90-day', (req, res) => res.json(AGMB.rollout.days61to90)); +app.get('/api/agi-governance-master-blueprint/rollout', (_req, res) => res.json(AGMB.rollout)); +app.get('/api/agi-governance-master-blueprint/rollout/30-day', (_req, res) => res.json(AGMB.rollout.days1to30)); +app.get('/api/agi-governance-master-blueprint/rollout/60-day', (_req, res) => res.json(AGMB.rollout.days31to60)); +app.get('/api/agi-governance-master-blueprint/rollout/90-day', (_req, res) => res.json(AGMB.rollout.days61to90)); // 8-Week Plan -app.get('/api/agi-governance-master-blueprint/8-week-plan', (req, res) => res.json({ +app.get('/api/agi-governance-master-blueprint/8-week-plan', (_req, res) => res.json({ weeks: AGMB.eightWeekPlan, totalHours: AGMB.totalEngineeringHours, requiredFTE: AGMB.requiredFTE })); // Risk Register -app.get('/api/agi-governance-master-blueprint/risk-register', (req, res) => res.json(AGMB.riskRegister)); +app.get('/api/agi-governance-master-blueprint/risk-register', (_req, res) => res.json(AGMB.riskRegister)); // Investment -app.get('/api/agi-governance-master-blueprint/investment', (req, res) => res.json(AGMB.investment)); +app.get('/api/agi-governance-master-blueprint/investment', (_req, res) => res.json(AGMB.investment)); // Key Metrics -app.get('/api/agi-governance-master-blueprint/metrics', (req, res) => res.json(AGMB.keyMetrics)); +app.get('/api/agi-governance-master-blueprint/metrics', (_req, res) => res.json(AGMB.keyMetrics)); // Summary (comprehensive) -app.get('/api/agi-governance-master-blueprint/summary', (req, res) => res.json({ +app.get('/api/agi-governance-master-blueprint/summary', (_req, res) => res.json({ docRef: AGMB.metadata.docRef, title: AGMB.metadata.title, version: AGMB.metadata.version, @@ -11073,7 +11091,7 @@ app.get('/api/agi-governance-master-blueprint/summary', (req, res) => res.json({ })); // Dashboard data (aggregated) -app.get('/api/agi-governance-master-blueprint/dashboard', (req, res) => res.json({ +app.get('/api/agi-governance-master-blueprint/dashboard', (_req, res) => res.json({ metadata: { docRef: AGMB.metadata.docRef, version: AGMB.metadata.version, date: AGMB.metadata.date }, kpis: AGMB.kpis, pillars: AGMB.governancePillars.map(p => ({ id: p.id, name: p.name })), @@ -11095,7 +11113,7 @@ app.get('/api/agi-governance-master-blueprint/dashboard', (req, res) => res.json })); // Artifacts index -app.get('/api/agi-governance-master-blueprint/artifacts', (req, res) => res.json({ +app.get('/api/agi-governance-master-blueprint/artifacts', (_req, res) => res.json({ schemas: [ { name: 'AI System Registration', format: 'JSON Schema', path: '/artifacts/schemas/ai-system-registration.schema.json' } ], @@ -17773,7 +17791,7 @@ const INST_AGI_BLUEPRINT = { { name: 'agi-safety-suite.yml', triggers: ['push to agi/**', 'schedule (weekly)'], steps: 15, gates: 6, description: 'Full alignment + containment + adversarial test suite' }, { name: 'regulatory-report.yml', triggers: ['schedule (quarterly)', 'manual'], steps: 10, gates: 3, description: 'Regulatory submission package generation' } ], - secrets: ['AWS_ACCESS_KEY_ID', 'OPA_BUNDLE_TOKEN', 'KAFKA_SASL_PASSWORD', 'WORM_SIGNING_KEY', 'SLACK_WEBHOOK'], + secrets: ['AWS_S3_ID_REF', 'OPA_BUNDLE_TOKEN', 'KAFKA_SASL_PWD_REF', 'WORM_SIGN_REF', 'SLACK_WEBHOOK'], totalSteps: 51, avgPipelineDuration: '18 minutes' }, @@ -24075,142 +24093,142 @@ app.get('/api/civ-ai-governance-impl-blueprint/workflow-ai-pro/:id', (req, res) const SAIV24 = require('./data/sentinel-ai-v24-governance.json'); // Page route -app.get('/sentinel-ai-v24-governance', (req, res) => { +app.get('/sentinel-ai-v24-governance', (_req, res) => { res.sendFile(path.join(__dirname, 'public', 'sentinel-ai-v24-governance.html')); }); // Summary + meta endpoints -app.get('/api/sentinel-ai-v24-governance/summary', (req, res) => res.json({ +app.get('/api/sentinel-ai-v24-governance/summary', (_req, res) => res.json({ docRef: SAIV24.docRef, version: SAIV24.version, title: SAIV24.title, horizon: SAIV24.horizon, apiPrefix: SAIV24.apiPrefix, buildsOn: SAIV24.buildsOn, audience: SAIV24.audience, scope: SAIV24.scope, counts: SAIV24.counts })); -app.get('/api/sentinel-ai-v24-governance/directive', (req, res) => res.json(SAIV24.directive)); -app.get('/api/sentinel-ai-v24-governance/regimes', (req, res) => res.json(SAIV24.regimes)); -app.get('/api/sentinel-ai-v24-governance/counts', (req, res) => res.json(SAIV24.counts)); -app.get('/api/sentinel-ai-v24-governance/executive-summary', (req, res) => res.json(SAIV24.executiveSummary)); +app.get('/api/sentinel-ai-v24-governance/directive', (_req, res) => res.json(SAIV24.directive)); +app.get('/api/sentinel-ai-v24-governance/regimes', (_req, res) => res.json(SAIV24.regimes)); +app.get('/api/sentinel-ai-v24-governance/counts', (_req, res) => res.json(SAIV24.counts)); +app.get('/api/sentinel-ai-v24-governance/executive-summary', (_req, res) => res.json(SAIV24.executiveSummary)); // Standard collections + ID lookups -app.get('/api/sentinel-ai-v24-governance/modules', (req, res) => res.json(SAIV24.modules)); +app.get('/api/sentinel-ai-v24-governance/modules', (_req, res) => res.json(SAIV24.modules)); app.get('/api/sentinel-ai-v24-governance/modules/:id', (req, res) => { const m = SAIV24.modules.find(x => x.mid === req.params.id); if (!m) return res.status(404).json({ error: 'module not found', id: req.params.id }); res.json(m); }); -app.get('/api/sentinel-ai-v24-governance/schemas', (req, res) => res.json(SAIV24.schemas)); +app.get('/api/sentinel-ai-v24-governance/schemas', (_req, res) => res.json(SAIV24.schemas)); app.get('/api/sentinel-ai-v24-governance/schemas/:id', (req, res) => { const s = SAIV24.schemas.find(x => x.id === req.params.id); if (!s) return res.status(404).json({ error: 'schema not found', id: req.params.id }); res.json(s); }); -app.get('/api/sentinel-ai-v24-governance/code', (req, res) => res.json(SAIV24.code)); +app.get('/api/sentinel-ai-v24-governance/code', (_req, res) => res.json(SAIV24.code)); app.get('/api/sentinel-ai-v24-governance/code/:id', (req, res) => { const c = SAIV24.code.find(x => x.id === req.params.id); if (!c) return res.status(404).json({ error: 'code not found', id: req.params.id }); res.json(c); }); -app.get('/api/sentinel-ai-v24-governance/kpis', (req, res) => res.json(SAIV24.kpis)); +app.get('/api/sentinel-ai-v24-governance/kpis', (_req, res) => res.json(SAIV24.kpis)); app.get('/api/sentinel-ai-v24-governance/kpis/:id', (req, res) => { const k = SAIV24.kpis.find(x => x.id === req.params.id); if (!k) return res.status(404).json({ error: 'kpi not found', id: req.params.id }); res.json(k); }); -app.get('/api/sentinel-ai-v24-governance/risk-control-matrix', (req, res) => res.json(SAIV24.riskControlMatrix)); +app.get('/api/sentinel-ai-v24-governance/risk-control-matrix', (_req, res) => res.json(SAIV24.riskControlMatrix)); app.get('/api/sentinel-ai-v24-governance/risk-control-matrix/:id', (req, res) => { const r = SAIV24.riskControlMatrix.find(x => x.id === req.params.id); if (!r) return res.status(404).json({ error: 'rcm not found', id: req.params.id }); res.json(r); }); -app.get('/api/sentinel-ai-v24-governance/traceability', (req, res) => res.json(SAIV24.traceability)); +app.get('/api/sentinel-ai-v24-governance/traceability', (_req, res) => res.json(SAIV24.traceability)); app.get('/api/sentinel-ai-v24-governance/traceability/:id', (req, res) => { const t = SAIV24.traceability.find(x => x.id === req.params.id); if (!t) return res.status(404).json({ error: 'traceability not found', id: req.params.id }); res.json(t); }); -app.get('/api/sentinel-ai-v24-governance/data-flows', (req, res) => res.json(SAIV24.dataFlows)); +app.get('/api/sentinel-ai-v24-governance/data-flows', (_req, res) => res.json(SAIV24.dataFlows)); app.get('/api/sentinel-ai-v24-governance/data-flows/:id', (req, res) => { const d = SAIV24.dataFlows.find(x => x.id === req.params.id); if (!d) return res.status(404).json({ error: 'dataflow not found', id: req.params.id }); res.json(d); }); -app.get('/api/sentinel-ai-v24-governance/regulators', (req, res) => res.json(SAIV24.regulators)); +app.get('/api/sentinel-ai-v24-governance/regulators', (_req, res) => res.json(SAIV24.regulators)); app.get('/api/sentinel-ai-v24-governance/regulators/:id', (req, res) => { const r = SAIV24.regulators.find(x => x.id === req.params.id); if (!r) return res.status(404).json({ error: 'regulator not found', id: req.params.id }); res.json(r); }); -app.get('/api/sentinel-ai-v24-governance/privacy', (req, res) => res.json(SAIV24.privacy)); -app.get('/api/sentinel-ai-v24-governance/deployment', (req, res) => res.json(SAIV24.deployment)); -app.get('/api/sentinel-ai-v24-governance/rollout-90', (req, res) => res.json(SAIV24.rollout90)); -app.get('/api/sentinel-ai-v24-governance/roadmap', (req, res) => res.json(SAIV24.roadmap)); -app.get('/api/sentinel-ai-v24-governance/evidence-pack', (req, res) => res.json(SAIV24.evidencePack)); +app.get('/api/sentinel-ai-v24-governance/privacy', (_req, res) => res.json(SAIV24.privacy)); +app.get('/api/sentinel-ai-v24-governance/deployment', (_req, res) => res.json(SAIV24.deployment)); +app.get('/api/sentinel-ai-v24-governance/rollout-90', (_req, res) => res.json(SAIV24.rollout90)); +app.get('/api/sentinel-ai-v24-governance/roadmap', (_req, res) => res.json(SAIV24.roadmap)); +app.get('/api/sentinel-ai-v24-governance/evidence-pack', (_req, res) => res.json(SAIV24.evidencePack)); // 9 distinctive collections + ID lookups -app.get('/api/sentinel-ai-v24-governance/governance-roles', (req, res) => res.json(SAIV24.governanceRoles)); +app.get('/api/sentinel-ai-v24-governance/governance-roles', (_req, res) => res.json(SAIV24.governanceRoles)); app.get('/api/sentinel-ai-v24-governance/governance-roles/:id', (req, res) => { const g = SAIV24.governanceRoles.find(x => x.rid === req.params.id); if (!g) return res.status(404).json({ error: 'governance role not found', id: req.params.id }); res.json(g); }); -app.get('/api/sentinel-ai-v24-governance/react-components', (req, res) => res.json(SAIV24.reactComponents)); +app.get('/api/sentinel-ai-v24-governance/react-components', (_req, res) => res.json(SAIV24.reactComponents)); app.get('/api/sentinel-ai-v24-governance/react-components/:id', (req, res) => { const c = SAIV24.reactComponents.find(x => x.cid === req.params.id); if (!c) return res.status(404).json({ error: 'react component not found', id: req.params.id }); res.json(c); }); -app.get('/api/sentinel-ai-v24-governance/containment-proxy', (req, res) => res.json(SAIV24.containmentProxy)); +app.get('/api/sentinel-ai-v24-governance/containment-proxy', (_req, res) => res.json(SAIV24.containmentProxy)); app.get('/api/sentinel-ai-v24-governance/containment-proxy/:id', (req, res) => { const p = SAIV24.containmentProxy.find(x => x.pid === req.params.id); if (!p) return res.status(404).json({ error: 'proxy layer not found', id: req.params.id }); res.json(p); }); -app.get('/api/sentinel-ai-v24-governance/terraform-iac', (req, res) => res.json(SAIV24.terraformIaC)); +app.get('/api/sentinel-ai-v24-governance/terraform-iac', (_req, res) => res.json(SAIV24.terraformIaC)); app.get('/api/sentinel-ai-v24-governance/terraform-iac/:id', (req, res) => { const t = SAIV24.terraformIaC.find(x => x.tid === req.params.id); if (!t) return res.status(404).json({ error: 'terraform module not found', id: req.params.id }); res.json(t); }); -app.get('/api/sentinel-ai-v24-governance/mlsecops-pipeline', (req, res) => res.json(SAIV24.mlsecopsPipeline)); +app.get('/api/sentinel-ai-v24-governance/mlsecops-pipeline', (_req, res) => res.json(SAIV24.mlsecopsPipeline)); app.get('/api/sentinel-ai-v24-governance/mlsecops-pipeline/:id', (req, res) => { const s = SAIV24.mlsecopsPipeline.find(x => x.sid === req.params.id); if (!s) return res.status(404).json({ error: 'ci stage not found', id: req.params.id }); res.json(s); }); -app.get('/api/sentinel-ai-v24-governance/incident-response', (req, res) => res.json(SAIV24.incidentResponse)); +app.get('/api/sentinel-ai-v24-governance/incident-response', (_req, res) => res.json(SAIV24.incidentResponse)); app.get('/api/sentinel-ai-v24-governance/incident-response/:id', (req, res) => { const i = SAIV24.incidentResponse.find(x => x.iid === req.params.id); if (!i) return res.status(404).json({ error: 'ir step not found', id: req.params.id }); res.json(i); }); -app.get('/api/sentinel-ai-v24-governance/compliance-analysis', (req, res) => res.json(SAIV24.complianceAnalysis)); +app.get('/api/sentinel-ai-v24-governance/compliance-analysis', (_req, res) => res.json(SAIV24.complianceAnalysis)); app.get('/api/sentinel-ai-v24-governance/compliance-analysis/:id', (req, res) => { const c = SAIV24.complianceAnalysis.find(x => x.cid === req.params.id); if (!c) return res.status(404).json({ error: 'compliance clause not found', id: req.params.id }); res.json(c); }); -app.get('/api/sentinel-ai-v24-governance/kafka-sandbox', (req, res) => res.json(SAIV24.kafkaSandbox)); +app.get('/api/sentinel-ai-v24-governance/kafka-sandbox', (_req, res) => res.json(SAIV24.kafkaSandbox)); app.get('/api/sentinel-ai-v24-governance/kafka-sandbox/:id', (req, res) => { const a = SAIV24.kafkaSandbox.find(x => x.aid === req.params.id); if (!a) return res.status(404).json({ error: 'adversary test not found', id: req.params.id }); res.json(a); }); -app.get('/api/sentinel-ai-v24-governance/sentinel-architecture', (req, res) => res.json(SAIV24.sentinelArchitecture)); +app.get('/api/sentinel-ai-v24-governance/sentinel-architecture', (_req, res) => res.json(SAIV24.sentinelArchitecture)); app.get('/api/sentinel-ai-v24-governance/sentinel-architecture/:id', (req, res) => { const n = SAIV24.sentinelArchitecture.find(x => x.nid === req.params.id); if (!n) return res.status(404).json({ error: 'architecture node not found', id: req.params.id }); @@ -24223,80 +24241,80 @@ app.get('/api/sentinel-ai-v24-governance/sentinel-architecture/:id', (req, res) const PIRP56 = require('./data/prioritized-impl-research-plan.json'); // Page route -app.get('/prioritized-impl-research-plan', (req, res) => { +app.get('/prioritized-impl-research-plan', (_req, res) => { res.sendFile(path.join(__dirname, 'public', 'prioritized-impl-research-plan.html')); }); // Summary + meta endpoints -app.get('/api/prioritized-impl-research-plan/summary', (req, res) => res.json({ +app.get('/api/prioritized-impl-research-plan/summary', (_req, res) => res.json({ docRef: PIRP56.docRef, version: PIRP56.version, title: PIRP56.title, horizon: PIRP56.horizon, apiPrefix: PIRP56.apiPrefix, buildsOn: PIRP56.buildsOn, status: PIRP56.status, classification: PIRP56.classification, counts: PIRP56.counts })); -app.get('/api/prioritized-impl-research-plan/directive', (req, res) => res.json(PIRP56.directive)); -app.get('/api/prioritized-impl-research-plan/regimes', (req, res) => res.json(PIRP56.regimes)); -app.get('/api/prioritized-impl-research-plan/counts', (req, res) => res.json(PIRP56.counts)); -app.get('/api/prioritized-impl-research-plan/executive-summary', (req, res) => res.json(PIRP56.executiveSummary)); -app.get('/api/prioritized-impl-research-plan/indices', (req, res) => res.json(PIRP56.indices)); -app.get('/api/prioritized-impl-research-plan/tiers', (req, res) => res.json(PIRP56.tiers)); -app.get('/api/prioritized-impl-research-plan/severities', (req, res) => res.json(PIRP56.severities)); +app.get('/api/prioritized-impl-research-plan/directive', (_req, res) => res.json(PIRP56.directive)); +app.get('/api/prioritized-impl-research-plan/regimes', (_req, res) => res.json(PIRP56.regimes)); +app.get('/api/prioritized-impl-research-plan/counts', (_req, res) => res.json(PIRP56.counts)); +app.get('/api/prioritized-impl-research-plan/executive-summary', (_req, res) => res.json(PIRP56.executiveSummary)); +app.get('/api/prioritized-impl-research-plan/indices', (_req, res) => res.json(PIRP56.indices)); +app.get('/api/prioritized-impl-research-plan/tiers', (_req, res) => res.json(PIRP56.tiers)); +app.get('/api/prioritized-impl-research-plan/severities', (_req, res) => res.json(PIRP56.severities)); // Standard collections + ID lookups -app.get('/api/prioritized-impl-research-plan/modules', (req, res) => res.json(PIRP56.modules)); +app.get('/api/prioritized-impl-research-plan/modules', (_req, res) => res.json(PIRP56.modules)); app.get('/api/prioritized-impl-research-plan/modules/:id', (req, res) => { const m = PIRP56.modules.find(x => x.mid === req.params.id); if (!m) return res.status(404).json({ error: 'module not found', id: req.params.id }); res.json(m); }); -app.get('/api/prioritized-impl-research-plan/schemas', (req, res) => res.json(PIRP56.schemas)); +app.get('/api/prioritized-impl-research-plan/schemas', (_req, res) => res.json(PIRP56.schemas)); app.get('/api/prioritized-impl-research-plan/schemas/:id', (req, res) => { const s = PIRP56.schemas.find(x => x.sid === req.params.id); if (!s) return res.status(404).json({ error: 'schema not found', id: req.params.id }); res.json(s); }); -app.get('/api/prioritized-impl-research-plan/code', (req, res) => res.json(PIRP56.code)); +app.get('/api/prioritized-impl-research-plan/code', (_req, res) => res.json(PIRP56.code)); app.get('/api/prioritized-impl-research-plan/code/:id', (req, res) => { const c = PIRP56.code.find(x => x.cid === req.params.id); if (!c) return res.status(404).json({ error: 'code not found', id: req.params.id }); res.json(c); }); -app.get('/api/prioritized-impl-research-plan/kpis', (req, res) => res.json(PIRP56.kpis)); +app.get('/api/prioritized-impl-research-plan/kpis', (_req, res) => res.json(PIRP56.kpis)); app.get('/api/prioritized-impl-research-plan/kpis/:id', (req, res) => { const k = PIRP56.kpis.find(x => x.kid === req.params.id); if (!k) return res.status(404).json({ error: 'kpi not found', id: req.params.id }); res.json(k); }); -app.get('/api/prioritized-impl-research-plan/risk-control-matrix', (req, res) => res.json(PIRP56.riskControlMatrix)); +app.get('/api/prioritized-impl-research-plan/risk-control-matrix', (_req, res) => res.json(PIRP56.riskControlMatrix)); app.get('/api/prioritized-impl-research-plan/risk-control-matrix/:id', (req, res) => { const r = PIRP56.riskControlMatrix.find(x => x.rid === req.params.id); if (!r) return res.status(404).json({ error: 'rcm not found', id: req.params.id }); res.json(r); }); -app.get('/api/prioritized-impl-research-plan/traceability', (req, res) => res.json(PIRP56.traceability)); +app.get('/api/prioritized-impl-research-plan/traceability', (_req, res) => res.json(PIRP56.traceability)); app.get('/api/prioritized-impl-research-plan/traceability/:id', (req, res) => { const t = PIRP56.traceability.find(x => x.tid === req.params.id); if (!t) return res.status(404).json({ error: 'traceability not found', id: req.params.id }); res.json(t); }); -app.get('/api/prioritized-impl-research-plan/data-flows', (req, res) => res.json(PIRP56.dataFlows)); +app.get('/api/prioritized-impl-research-plan/data-flows', (_req, res) => res.json(PIRP56.dataFlows)); app.get('/api/prioritized-impl-research-plan/data-flows/:id', (req, res) => { const d = PIRP56.dataFlows.find(x => x.fid === req.params.id); if (!d) return res.status(404).json({ error: 'dataflow not found', id: req.params.id }); res.json(d); }); -app.get('/api/prioritized-impl-research-plan/regulators', (req, res) => res.json(PIRP56.regulators)); -app.get('/api/prioritized-impl-research-plan/privacy', (req, res) => res.json(PIRP56.privacy)); -app.get('/api/prioritized-impl-research-plan/deployment', (req, res) => res.json(PIRP56.deployment)); -app.get('/api/prioritized-impl-research-plan/rollout-90', (req, res) => res.json(PIRP56.rollout90)); -app.get('/api/prioritized-impl-research-plan/roadmap', (req, res) => res.json(PIRP56.roadmap)); -app.get('/api/prioritized-impl-research-plan/evidence-pack', (req, res) => res.json(PIRP56.evidencePack)); +app.get('/api/prioritized-impl-research-plan/regulators', (_req, res) => res.json(PIRP56.regulators)); +app.get('/api/prioritized-impl-research-plan/privacy', (_req, res) => res.json(PIRP56.privacy)); +app.get('/api/prioritized-impl-research-plan/deployment', (_req, res) => res.json(PIRP56.deployment)); +app.get('/api/prioritized-impl-research-plan/rollout-90', (_req, res) => res.json(PIRP56.rollout90)); +app.get('/api/prioritized-impl-research-plan/roadmap', (_req, res) => res.json(PIRP56.roadmap)); +app.get('/api/prioritized-impl-research-plan/evidence-pack', (_req, res) => res.json(PIRP56.evidencePack)); app.get('/api/prioritized-impl-research-plan/evidence-pack/:id', (req, res) => { const e = PIRP56.evidencePack.find(x => x.epid === req.params.id); if (!e) return res.status(404).json({ error: 'evidence pack item not found', id: req.params.id }); @@ -24304,63 +24322,63 @@ app.get('/api/prioritized-impl-research-plan/evidence-pack/:id', (req, res) => { }); // 9 distinctive collections + ID lookups -app.get('/api/prioritized-impl-research-plan/phases', (req, res) => res.json(PIRP56.phases)); +app.get('/api/prioritized-impl-research-plan/phases', (_req, res) => res.json(PIRP56.phases)); app.get('/api/prioritized-impl-research-plan/phases/:id', (req, res) => { const p = PIRP56.phases.find(x => x.pid === req.params.id); if (!p) return res.status(404).json({ error: 'phase not found', id: req.params.id }); res.json(p); }); -app.get('/api/prioritized-impl-research-plan/critical-path', (req, res) => res.json(PIRP56.criticalPath)); +app.get('/api/prioritized-impl-research-plan/critical-path', (_req, res) => res.json(PIRP56.criticalPath)); app.get('/api/prioritized-impl-research-plan/critical-path/:id', (req, res) => { const c = PIRP56.criticalPath.find(x => x.cid === req.params.id); if (!c) return res.status(404).json({ error: 'critical-path item not found', id: req.params.id }); res.json(c); }); -app.get('/api/prioritized-impl-research-plan/sentinel-stack', (req, res) => res.json(PIRP56.sentinelStack)); +app.get('/api/prioritized-impl-research-plan/sentinel-stack', (_req, res) => res.json(PIRP56.sentinelStack)); app.get('/api/prioritized-impl-research-plan/sentinel-stack/:id', (req, res) => { const s = PIRP56.sentinelStack.find(x => x.sid === req.params.id); if (!s) return res.status(404).json({ error: 'sentinel component not found', id: req.params.id }); res.json(s); }); -app.get('/api/prioritized-impl-research-plan/workflowai-pro', (req, res) => res.json(PIRP56.workflowAIPro)); +app.get('/api/prioritized-impl-research-plan/workflowai-pro', (_req, res) => res.json(PIRP56.workflowAIPro)); app.get('/api/prioritized-impl-research-plan/workflowai-pro/:id', (req, res) => { const w = PIRP56.workflowAIPro.find(x => x.wid === req.params.id); if (!w) return res.status(404).json({ error: 'workflowai capability not found', id: req.params.id }); res.json(w); }); -app.get('/api/prioritized-impl-research-plan/devsecops', (req, res) => res.json(PIRP56.devSecOps)); +app.get('/api/prioritized-impl-research-plan/devsecops', (_req, res) => res.json(PIRP56.devSecOps)); app.get('/api/prioritized-impl-research-plan/devsecops/:id', (req, res) => { const d = PIRP56.devSecOps.find(x => x.did === req.params.id); if (!d) return res.status(404).json({ error: 'devsecops control not found', id: req.params.id }); res.json(d); }); -app.get('/api/prioritized-impl-research-plan/global-governance', (req, res) => res.json(PIRP56.globalGovernance)); +app.get('/api/prioritized-impl-research-plan/global-governance', (_req, res) => res.json(PIRP56.globalGovernance)); app.get('/api/prioritized-impl-research-plan/global-governance/:id', (req, res) => { const g = PIRP56.globalGovernance.find(x => x.gid === req.params.id); if (!g) return res.status(404).json({ error: 'governance layer not found', id: req.params.id }); res.json(g); }); -app.get('/api/prioritized-impl-research-plan/regulator-artifacts', (req, res) => res.json(PIRP56.regulatorArtifacts)); +app.get('/api/prioritized-impl-research-plan/regulator-artifacts', (_req, res) => res.json(PIRP56.regulatorArtifacts)); app.get('/api/prioritized-impl-research-plan/regulator-artifacts/:id', (req, res) => { const r = PIRP56.regulatorArtifacts.find(x => x.rid === req.params.id); if (!r) return res.status(404).json({ error: 'regulator artifact not found', id: req.params.id }); res.json(r); }); -app.get('/api/prioritized-impl-research-plan/rag-governance', (req, res) => res.json(PIRP56.ragGovernance)); +app.get('/api/prioritized-impl-research-plan/rag-governance', (_req, res) => res.json(PIRP56.ragGovernance)); app.get('/api/prioritized-impl-research-plan/rag-governance/:id', (req, res) => { const q = PIRP56.ragGovernance.find(x => x.qid === req.params.id); if (!q) return res.status(404).json({ error: 'rag control not found', id: req.params.id }); res.json(q); }); -app.get('/api/prioritized-impl-research-plan/telemetry-interpretability', (req, res) => res.json(PIRP56.telemetryInterpretability)); +app.get('/api/prioritized-impl-research-plan/telemetry-interpretability', (_req, res) => res.json(PIRP56.telemetryInterpretability)); app.get('/api/prioritized-impl-research-plan/telemetry-interpretability/:id', (req, res) => { const t = PIRP56.telemetryInterpretability.find(x => x.tid === req.params.id); if (!t) return res.status(404).json({ error: 'interpretability probe not found', id: req.params.id }); @@ -24373,88 +24391,88 @@ app.get('/api/prioritized-impl-research-plan/telemetry-interpretability/:id', (r const CMB57 = require('./data/comprehensive-master-blueprint.json'); // Page route -app.get('/comprehensive-master-blueprint', (req, res) => { +app.get('/comprehensive-master-blueprint', (_req, res) => { res.sendFile(path.join(__dirname, 'public', 'comprehensive-master-blueprint.html')); }); // Summary + meta endpoints -app.get('/api/comprehensive-master-blueprint/summary', (req, res) => res.json({ +app.get('/api/comprehensive-master-blueprint/summary', (_req, res) => res.json({ docRef: CMB57.docRef, version: CMB57.version, title: CMB57.title, horizon: CMB57.horizon, apiPrefix: CMB57.apiPrefix, buildsOn: CMB57.buildsOn, status: CMB57.status, classification: CMB57.classification, counts: CMB57.counts })); -app.get('/api/comprehensive-master-blueprint/directive', (req, res) => res.json(CMB57.directive)); -app.get('/api/comprehensive-master-blueprint/regimes', (req, res) => res.json(CMB57.regimes)); -app.get('/api/comprehensive-master-blueprint/counts', (req, res) => res.json(CMB57.counts)); -app.get('/api/comprehensive-master-blueprint/executive-summary', (req, res) => res.json(CMB57.executiveSummary)); -app.get('/api/comprehensive-master-blueprint/indices', (req, res) => res.json(CMB57.indices)); -app.get('/api/comprehensive-master-blueprint/tiers', (req, res) => res.json(CMB57.tiers)); -app.get('/api/comprehensive-master-blueprint/severities', (req, res) => res.json(CMB57.severities)); +app.get('/api/comprehensive-master-blueprint/directive', (_req, res) => res.json(CMB57.directive)); +app.get('/api/comprehensive-master-blueprint/regimes', (_req, res) => res.json(CMB57.regimes)); +app.get('/api/comprehensive-master-blueprint/counts', (_req, res) => res.json(CMB57.counts)); +app.get('/api/comprehensive-master-blueprint/executive-summary', (_req, res) => res.json(CMB57.executiveSummary)); +app.get('/api/comprehensive-master-blueprint/indices', (_req, res) => res.json(CMB57.indices)); +app.get('/api/comprehensive-master-blueprint/tiers', (_req, res) => res.json(CMB57.tiers)); +app.get('/api/comprehensive-master-blueprint/severities', (_req, res) => res.json(CMB57.severities)); // Standard collections + ID lookups -app.get('/api/comprehensive-master-blueprint/modules', (req, res) => res.json(CMB57.modules)); +app.get('/api/comprehensive-master-blueprint/modules', (_req, res) => res.json(CMB57.modules)); app.get('/api/comprehensive-master-blueprint/modules/:id', (req, res) => { const m = CMB57.modules.find(x => x.mid === req.params.id); if (!m) return res.status(404).json({ error: 'module not found', id: req.params.id }); res.json(m); }); -app.get('/api/comprehensive-master-blueprint/schemas', (req, res) => res.json(CMB57.schemas)); +app.get('/api/comprehensive-master-blueprint/schemas', (_req, res) => res.json(CMB57.schemas)); app.get('/api/comprehensive-master-blueprint/schemas/:id', (req, res) => { const s = CMB57.schemas.find(x => x.sid === req.params.id); if (!s) return res.status(404).json({ error: 'schema not found', id: req.params.id }); res.json(s); }); -app.get('/api/comprehensive-master-blueprint/code', (req, res) => res.json(CMB57.code)); +app.get('/api/comprehensive-master-blueprint/code', (_req, res) => res.json(CMB57.code)); app.get('/api/comprehensive-master-blueprint/code/:id', (req, res) => { const c = CMB57.code.find(x => x.cid === req.params.id); if (!c) return res.status(404).json({ error: 'code not found', id: req.params.id }); res.json(c); }); -app.get('/api/comprehensive-master-blueprint/kpis', (req, res) => res.json(CMB57.kpis)); +app.get('/api/comprehensive-master-blueprint/kpis', (_req, res) => res.json(CMB57.kpis)); app.get('/api/comprehensive-master-blueprint/kpis/:id', (req, res) => { const k = CMB57.kpis.find(x => x.kid === req.params.id); if (!k) return res.status(404).json({ error: 'kpi not found', id: req.params.id }); res.json(k); }); -app.get('/api/comprehensive-master-blueprint/risk-control-matrix', (req, res) => res.json(CMB57.riskControlMatrix)); +app.get('/api/comprehensive-master-blueprint/risk-control-matrix', (_req, res) => res.json(CMB57.riskControlMatrix)); app.get('/api/comprehensive-master-blueprint/risk-control-matrix/:id', (req, res) => { const r = CMB57.riskControlMatrix.find(x => x.rid === req.params.id); if (!r) return res.status(404).json({ error: 'risk control row not found', id: req.params.id }); res.json(r); }); -app.get('/api/comprehensive-master-blueprint/traceability', (req, res) => res.json(CMB57.traceability)); +app.get('/api/comprehensive-master-blueprint/traceability', (_req, res) => res.json(CMB57.traceability)); app.get('/api/comprehensive-master-blueprint/traceability/:id', (req, res) => { const t = CMB57.traceability.find(x => x.tid === req.params.id); if (!t) return res.status(404).json({ error: 'traceability row not found', id: req.params.id }); res.json(t); }); -app.get('/api/comprehensive-master-blueprint/data-flows', (req, res) => res.json(CMB57.dataFlows)); +app.get('/api/comprehensive-master-blueprint/data-flows', (_req, res) => res.json(CMB57.dataFlows)); app.get('/api/comprehensive-master-blueprint/data-flows/:id', (req, res) => { const f = CMB57.dataFlows.find(x => x.fid === req.params.id); if (!f) return res.status(404).json({ error: 'data flow not found', id: req.params.id }); res.json(f); }); -app.get('/api/comprehensive-master-blueprint/regulators', (req, res) => res.json(CMB57.regulators)); +app.get('/api/comprehensive-master-blueprint/regulators', (_req, res) => res.json(CMB57.regulators)); app.get('/api/comprehensive-master-blueprint/regulators/:reg', (req, res) => { const r = CMB57.regulators.find(x => x.reg === req.params.reg); if (!r) return res.status(404).json({ error: 'regulator not found', reg: req.params.reg }); res.json(r); }); -app.get('/api/comprehensive-master-blueprint/privacy', (req, res) => res.json(CMB57.privacy)); -app.get('/api/comprehensive-master-blueprint/deployment', (req, res) => res.json(CMB57.deployment)); +app.get('/api/comprehensive-master-blueprint/privacy', (_req, res) => res.json(CMB57.privacy)); +app.get('/api/comprehensive-master-blueprint/deployment', (_req, res) => res.json(CMB57.deployment)); -app.get('/api/comprehensive-master-blueprint/rollout-90', (req, res) => res.json(CMB57.rollout90)); -app.get('/api/comprehensive-master-blueprint/roadmap', (req, res) => res.json(CMB57.roadmap)); +app.get('/api/comprehensive-master-blueprint/rollout-90', (_req, res) => res.json(CMB57.rollout90)); +app.get('/api/comprehensive-master-blueprint/roadmap', (_req, res) => res.json(CMB57.roadmap)); -app.get('/api/comprehensive-master-blueprint/evidence-pack', (req, res) => res.json(CMB57.evidencePack)); +app.get('/api/comprehensive-master-blueprint/evidence-pack', (_req, res) => res.json(CMB57.evidencePack)); app.get('/api/comprehensive-master-blueprint/evidence-pack/:id', (req, res) => { const e = CMB57.evidencePack.find(x => x.epid === req.params.id); if (!e) return res.status(404).json({ error: 'evidence pack item not found', id: req.params.id }); @@ -24462,63 +24480,63 @@ app.get('/api/comprehensive-master-blueprint/evidence-pack/:id', (req, res) => { }); // Distinctive collections + ID lookups -app.get('/api/comprehensive-master-blueprint/architecture-refs', (req, res) => res.json(CMB57.architectureRefs)); +app.get('/api/comprehensive-master-blueprint/architecture-refs', (_req, res) => res.json(CMB57.architectureRefs)); app.get('/api/comprehensive-master-blueprint/architecture-refs/:id', (req, res) => { const a = CMB57.architectureRefs.find(x => x.aid === req.params.id); if (!a) return res.status(404).json({ error: 'architecture ref not found', id: req.params.id }); res.json(a); }); -app.get('/api/comprehensive-master-blueprint/compliance-maps', (req, res) => res.json(CMB57.complianceMaps)); +app.get('/api/comprehensive-master-blueprint/compliance-maps', (_req, res) => res.json(CMB57.complianceMaps)); app.get('/api/comprehensive-master-blueprint/compliance-maps/:id', (req, res) => { const c = CMB57.complianceMaps.find(x => x.cid === req.params.id); if (!c) return res.status(404).json({ error: 'compliance map not found', id: req.params.id }); res.json(c); }); -app.get('/api/comprehensive-master-blueprint/governance-frameworks', (req, res) => res.json(CMB57.governanceFrameworks)); +app.get('/api/comprehensive-master-blueprint/governance-frameworks', (_req, res) => res.json(CMB57.governanceFrameworks)); app.get('/api/comprehensive-master-blueprint/governance-frameworks/:id', (req, res) => { const g = CMB57.governanceFrameworks.find(x => x.fid === req.params.id); if (!g) return res.status(404).json({ error: 'governance framework not found', id: req.params.id }); res.json(g); }); -app.get('/api/comprehensive-master-blueprint/safety-mechanisms', (req, res) => res.json(CMB57.safetyMechanisms)); +app.get('/api/comprehensive-master-blueprint/safety-mechanisms', (_req, res) => res.json(CMB57.safetyMechanisms)); app.get('/api/comprehensive-master-blueprint/safety-mechanisms/:id', (req, res) => { const s = CMB57.safetyMechanisms.find(x => x.sid === req.params.id); if (!s) return res.status(404).json({ error: 'safety mechanism not found', id: req.params.id }); res.json(s); }); -app.get('/api/comprehensive-master-blueprint/financial-services-risks', (req, res) => res.json(CMB57.financialServicesRisks)); +app.get('/api/comprehensive-master-blueprint/financial-services-risks', (_req, res) => res.json(CMB57.financialServicesRisks)); app.get('/api/comprehensive-master-blueprint/financial-services-risks/:id', (req, res) => { const f = CMB57.financialServicesRisks.find(x => x.fid === req.params.id); if (!f) return res.status(404).json({ error: 'financial services risk not found', id: req.params.id }); res.json(f); }); -app.get('/api/comprehensive-master-blueprint/civilizational-stacks', (req, res) => res.json(CMB57.civilizationalStacks)); +app.get('/api/comprehensive-master-blueprint/civilizational-stacks', (_req, res) => res.json(CMB57.civilizationalStacks)); app.get('/api/comprehensive-master-blueprint/civilizational-stacks/:id', (req, res) => { const v = CMB57.civilizationalStacks.find(x => x.vid === req.params.id); if (!v) return res.status(404).json({ error: 'civilizational stack not found', id: req.params.id }); res.json(v); }); -app.get('/api/comprehensive-master-blueprint/roadmap-items', (req, res) => res.json(CMB57.roadmapItems)); +app.get('/api/comprehensive-master-blueprint/roadmap-items', (_req, res) => res.json(CMB57.roadmapItems)); app.get('/api/comprehensive-master-blueprint/roadmap-items/:id', (req, res) => { const r = CMB57.roadmapItems.find(x => x.rid === req.params.id); if (!r) return res.status(404).json({ error: 'roadmap item not found', id: req.params.id }); res.json(r); }); -app.get('/api/comprehensive-master-blueprint/regulator-blueprints', (req, res) => res.json(CMB57.regulatorBlueprints)); +app.get('/api/comprehensive-master-blueprint/regulator-blueprints', (_req, res) => res.json(CMB57.regulatorBlueprints)); app.get('/api/comprehensive-master-blueprint/regulator-blueprints/:id', (req, res) => { const b = CMB57.regulatorBlueprints.find(x => x.bid === req.params.id); if (!b) return res.status(404).json({ error: 'regulator blueprint not found', id: req.params.id }); res.json(b); }); -app.get('/api/comprehensive-master-blueprint/research-tracks', (req, res) => res.json(CMB57.researchTracks)); +app.get('/api/comprehensive-master-blueprint/research-tracks', (_req, res) => res.json(CMB57.researchTracks)); app.get('/api/comprehensive-master-blueprint/research-tracks/:id', (req, res) => { const t = CMB57.researchTracks.find(x => x.tid === req.params.id); if (!t) return res.status(404).json({ error: 'research track not found', id: req.params.id }); @@ -24531,88 +24549,88 @@ app.get('/api/comprehensive-master-blueprint/research-tracks/:id', (req, res) => const EAGF58 = require('./data/enterprise-aigov-framework.json'); // Page route -app.get('/enterprise-aigov-framework', (req, res) => { +app.get('/enterprise-aigov-framework', (_req, res) => { res.sendFile(path.join(__dirname, 'public', 'enterprise-aigov-framework.html')); }); // Summary + meta endpoints -app.get('/api/enterprise-aigov-framework/summary', (req, res) => res.json({ +app.get('/api/enterprise-aigov-framework/summary', (_req, res) => res.json({ docRef: EAGF58.docRef, version: EAGF58.version, title: EAGF58.title, horizon: EAGF58.horizon, apiPrefix: EAGF58.apiPrefix, buildsOn: EAGF58.buildsOn, status: EAGF58.status, classification: EAGF58.classification, counts: EAGF58.counts })); -app.get('/api/enterprise-aigov-framework/directive', (req, res) => res.json(EAGF58.directive)); -app.get('/api/enterprise-aigov-framework/regimes', (req, res) => res.json(EAGF58.regimes)); -app.get('/api/enterprise-aigov-framework/counts', (req, res) => res.json(EAGF58.counts)); -app.get('/api/enterprise-aigov-framework/executive-summary', (req, res) => res.json(EAGF58.executiveSummary)); -app.get('/api/enterprise-aigov-framework/indices', (req, res) => res.json(EAGF58.indices)); -app.get('/api/enterprise-aigov-framework/tiers', (req, res) => res.json(EAGF58.tiers)); -app.get('/api/enterprise-aigov-framework/severities', (req, res) => res.json(EAGF58.severities)); -app.get('/api/enterprise-aigov-framework/investment', (req, res) => res.json(EAGF58.investment)); +app.get('/api/enterprise-aigov-framework/directive', (_req, res) => res.json(EAGF58.directive)); +app.get('/api/enterprise-aigov-framework/regimes', (_req, res) => res.json(EAGF58.regimes)); +app.get('/api/enterprise-aigov-framework/counts', (_req, res) => res.json(EAGF58.counts)); +app.get('/api/enterprise-aigov-framework/executive-summary', (_req, res) => res.json(EAGF58.executiveSummary)); +app.get('/api/enterprise-aigov-framework/indices', (_req, res) => res.json(EAGF58.indices)); +app.get('/api/enterprise-aigov-framework/tiers', (_req, res) => res.json(EAGF58.tiers)); +app.get('/api/enterprise-aigov-framework/severities', (_req, res) => res.json(EAGF58.severities)); +app.get('/api/enterprise-aigov-framework/investment', (_req, res) => res.json(EAGF58.investment)); // Standard collections + ID lookups -app.get('/api/enterprise-aigov-framework/modules', (req, res) => res.json(EAGF58.modules)); +app.get('/api/enterprise-aigov-framework/modules', (_req, res) => res.json(EAGF58.modules)); app.get('/api/enterprise-aigov-framework/modules/:id', (req, res) => { const m = EAGF58.modules.find(x => x.mid === req.params.id); if (!m) return res.status(404).json({ error: 'module not found', id: req.params.id }); res.json(m); }); -app.get('/api/enterprise-aigov-framework/schemas', (req, res) => res.json(EAGF58.schemas)); +app.get('/api/enterprise-aigov-framework/schemas', (_req, res) => res.json(EAGF58.schemas)); app.get('/api/enterprise-aigov-framework/schemas/:id', (req, res) => { const s = EAGF58.schemas.find(x => x.sid === req.params.id); if (!s) return res.status(404).json({ error: 'schema not found', id: req.params.id }); res.json(s); }); -app.get('/api/enterprise-aigov-framework/code', (req, res) => res.json(EAGF58.code)); +app.get('/api/enterprise-aigov-framework/code', (_req, res) => res.json(EAGF58.code)); app.get('/api/enterprise-aigov-framework/code/:id', (req, res) => { const c = EAGF58.code.find(x => x.cid === req.params.id); if (!c) return res.status(404).json({ error: 'code not found', id: req.params.id }); res.json(c); }); -app.get('/api/enterprise-aigov-framework/kpis', (req, res) => res.json(EAGF58.kpis)); +app.get('/api/enterprise-aigov-framework/kpis', (_req, res) => res.json(EAGF58.kpis)); app.get('/api/enterprise-aigov-framework/kpis/:id', (req, res) => { const k = EAGF58.kpis.find(x => x.kid === req.params.id); if (!k) return res.status(404).json({ error: 'kpi not found', id: req.params.id }); res.json(k); }); -app.get('/api/enterprise-aigov-framework/risk-control-matrix', (req, res) => res.json(EAGF58.riskControlMatrix)); +app.get('/api/enterprise-aigov-framework/risk-control-matrix', (_req, res) => res.json(EAGF58.riskControlMatrix)); app.get('/api/enterprise-aigov-framework/risk-control-matrix/:id', (req, res) => { const r = EAGF58.riskControlMatrix.find(x => x.rid === req.params.id); if (!r) return res.status(404).json({ error: 'risk control row not found', id: req.params.id }); res.json(r); }); -app.get('/api/enterprise-aigov-framework/traceability', (req, res) => res.json(EAGF58.traceability)); +app.get('/api/enterprise-aigov-framework/traceability', (_req, res) => res.json(EAGF58.traceability)); app.get('/api/enterprise-aigov-framework/traceability/:id', (req, res) => { const t = EAGF58.traceability.find(x => x.tid === req.params.id); if (!t) return res.status(404).json({ error: 'traceability row not found', id: req.params.id }); res.json(t); }); -app.get('/api/enterprise-aigov-framework/data-flows', (req, res) => res.json(EAGF58.dataFlows)); +app.get('/api/enterprise-aigov-framework/data-flows', (_req, res) => res.json(EAGF58.dataFlows)); app.get('/api/enterprise-aigov-framework/data-flows/:id', (req, res) => { const f = EAGF58.dataFlows.find(x => x.fid === req.params.id); if (!f) return res.status(404).json({ error: 'data flow not found', id: req.params.id }); res.json(f); }); -app.get('/api/enterprise-aigov-framework/regulators', (req, res) => res.json(EAGF58.regulators)); +app.get('/api/enterprise-aigov-framework/regulators', (_req, res) => res.json(EAGF58.regulators)); app.get('/api/enterprise-aigov-framework/regulators/:reg', (req, res) => { const r = EAGF58.regulators.find(x => x.reg === req.params.reg); if (!r) return res.status(404).json({ error: 'regulator not found', reg: req.params.reg }); res.json(r); }); -app.get('/api/enterprise-aigov-framework/privacy', (req, res) => res.json(EAGF58.privacy)); -app.get('/api/enterprise-aigov-framework/deployment', (req, res) => res.json(EAGF58.deployment)); -app.get('/api/enterprise-aigov-framework/rollout-90', (req, res) => res.json(EAGF58.rollout90)); -app.get('/api/enterprise-aigov-framework/roadmap', (req, res) => res.json(EAGF58.roadmap)); +app.get('/api/enterprise-aigov-framework/privacy', (_req, res) => res.json(EAGF58.privacy)); +app.get('/api/enterprise-aigov-framework/deployment', (_req, res) => res.json(EAGF58.deployment)); +app.get('/api/enterprise-aigov-framework/rollout-90', (_req, res) => res.json(EAGF58.rollout90)); +app.get('/api/enterprise-aigov-framework/roadmap', (_req, res) => res.json(EAGF58.roadmap)); -app.get('/api/enterprise-aigov-framework/evidence-pack', (req, res) => res.json(EAGF58.evidencePack)); +app.get('/api/enterprise-aigov-framework/evidence-pack', (_req, res) => res.json(EAGF58.evidencePack)); app.get('/api/enterprise-aigov-framework/evidence-pack/:id', (req, res) => { const e = EAGF58.evidencePack.find(x => x.epid === req.params.id); if (!e) return res.status(404).json({ error: 'evidence pack item not found', id: req.params.id }); @@ -24620,70 +24638,70 @@ app.get('/api/enterprise-aigov-framework/evidence-pack/:id', (req, res) => { }); // Distinctive collections + ID lookups -app.get('/api/enterprise-aigov-framework/policies', (req, res) => res.json(EAGF58.policies)); +app.get('/api/enterprise-aigov-framework/policies', (_req, res) => res.json(EAGF58.policies)); app.get('/api/enterprise-aigov-framework/policies/:id', (req, res) => { const p = EAGF58.policies.find(x => x.pid === req.params.id); if (!p) return res.status(404).json({ error: 'policy not found', id: req.params.id }); res.json(p); }); -app.get('/api/enterprise-aigov-framework/controls', (req, res) => res.json(EAGF58.controls)); +app.get('/api/enterprise-aigov-framework/controls', (_req, res) => res.json(EAGF58.controls)); app.get('/api/enterprise-aigov-framework/controls/:id', (req, res) => { const c = EAGF58.controls.find(x => x.cid === req.params.id); if (!c) return res.status(404).json({ error: 'control not found', id: req.params.id }); res.json(c); }); -app.get('/api/enterprise-aigov-framework/kafka-topics', (req, res) => res.json(EAGF58.kafkaTopics)); +app.get('/api/enterprise-aigov-framework/kafka-topics', (_req, res) => res.json(EAGF58.kafkaTopics)); app.get('/api/enterprise-aigov-framework/kafka-topics/:id', (req, res) => { const k = EAGF58.kafkaTopics.find(x => x.tid === req.params.id); if (!k) return res.status(404).json({ error: 'kafka topic not found', id: req.params.id }); res.json(k); }); -app.get('/api/enterprise-aigov-framework/k8s-controls', (req, res) => res.json(EAGF58.k8sControls)); +app.get('/api/enterprise-aigov-framework/k8s-controls', (_req, res) => res.json(EAGF58.k8sControls)); app.get('/api/enterprise-aigov-framework/k8s-controls/:id', (req, res) => { const k = EAGF58.k8sControls.find(x => x.kid === req.params.id); if (!k) return res.status(404).json({ error: 'k8s control not found', id: req.params.id }); res.json(k); }); -app.get('/api/enterprise-aigov-framework/opa-policies', (req, res) => res.json(EAGF58.opaPolicies)); +app.get('/api/enterprise-aigov-framework/opa-policies', (_req, res) => res.json(EAGF58.opaPolicies)); app.get('/api/enterprise-aigov-framework/opa-policies/:id', (req, res) => { const o = EAGF58.opaPolicies.find(x => x.oid === req.params.id); if (!o) return res.status(404).json({ error: 'opa policy not found', id: req.params.id }); res.json(o); }); -app.get('/api/enterprise-aigov-framework/worm-controls', (req, res) => res.json(EAGF58.wormControls)); +app.get('/api/enterprise-aigov-framework/worm-controls', (_req, res) => res.json(EAGF58.wormControls)); app.get('/api/enterprise-aigov-framework/worm-controls/:id', (req, res) => { const w = EAGF58.wormControls.find(x => x.wid === req.params.id); if (!w) return res.status(404).json({ error: 'worm control not found', id: req.params.id }); res.json(w); }); -app.get('/api/enterprise-aigov-framework/mrm-artifacts', (req, res) => res.json(EAGF58.mrmArtifacts)); +app.get('/api/enterprise-aigov-framework/mrm-artifacts', (_req, res) => res.json(EAGF58.mrmArtifacts)); app.get('/api/enterprise-aigov-framework/mrm-artifacts/:id', (req, res) => { const m = EAGF58.mrmArtifacts.find(x => x.mid === req.params.id); if (!m) return res.status(404).json({ error: 'mrm artifact not found', id: req.params.id }); res.json(m); }); -app.get('/api/enterprise-aigov-framework/red-teams', (req, res) => res.json(EAGF58.redTeams)); +app.get('/api/enterprise-aigov-framework/red-teams', (_req, res) => res.json(EAGF58.redTeams)); app.get('/api/enterprise-aigov-framework/red-teams/:id', (req, res) => { const r = EAGF58.redTeams.find(x => x.rid === req.params.id); if (!r) return res.status(404).json({ error: 'red team item not found', id: req.params.id }); res.json(r); }); -app.get('/api/enterprise-aigov-framework/agi-containments', (req, res) => res.json(EAGF58.agiContainments)); +app.get('/api/enterprise-aigov-framework/agi-containments', (_req, res) => res.json(EAGF58.agiContainments)); app.get('/api/enterprise-aigov-framework/agi-containments/:id', (req, res) => { const a = EAGF58.agiContainments.find(x => x.aid === req.params.id); if (!a) return res.status(404).json({ error: 'agi containment not found', id: req.params.id }); res.json(a); }); -app.get('/api/enterprise-aigov-framework/hub-components', (req, res) => res.json(EAGF58.hubComponents)); +app.get('/api/enterprise-aigov-framework/hub-components', (_req, res) => res.json(EAGF58.hubComponents)); app.get('/api/enterprise-aigov-framework/hub-components/:id', (req, res) => { const h = EAGF58.hubComponents.find(x => x.hid === req.params.id); if (!h) return res.status(404).json({ error: 'hub component not found', id: req.params.id }); @@ -24696,88 +24714,88 @@ app.get('/api/enterprise-aigov-framework/hub-components/:id', (req, res) => { const USB59 = require('./data/unified-synthesis-blueprint.json'); // Page route -app.get('/unified-synthesis-blueprint', (req, res) => { +app.get('/unified-synthesis-blueprint', (_req, res) => { res.sendFile(path.join(__dirname, 'public', 'unified-synthesis-blueprint.html')); }); // Summary + meta endpoints -app.get('/api/unified-synthesis-blueprint/summary', (req, res) => res.json({ +app.get('/api/unified-synthesis-blueprint/summary', (_req, res) => res.json({ docRef: USB59.docRef, version: USB59.version, title: USB59.title, horizon: USB59.horizon, apiPrefix: USB59.apiPrefix, buildsOn: USB59.buildsOn, status: USB59.status, classification: USB59.classification, counts: USB59.counts })); -app.get('/api/unified-synthesis-blueprint/directive', (req, res) => res.json(USB59.directive)); -app.get('/api/unified-synthesis-blueprint/regimes', (req, res) => res.json(USB59.regimes)); -app.get('/api/unified-synthesis-blueprint/counts', (req, res) => res.json(USB59.counts)); -app.get('/api/unified-synthesis-blueprint/executive-summary', (req, res) => res.json(USB59.executiveSummary)); -app.get('/api/unified-synthesis-blueprint/indices', (req, res) => res.json(USB59.indices)); -app.get('/api/unified-synthesis-blueprint/tiers', (req, res) => res.json(USB59.tiers)); -app.get('/api/unified-synthesis-blueprint/severities', (req, res) => res.json(USB59.severities)); -app.get('/api/unified-synthesis-blueprint/investment', (req, res) => res.json(USB59.investment)); +app.get('/api/unified-synthesis-blueprint/directive', (_req, res) => res.json(USB59.directive)); +app.get('/api/unified-synthesis-blueprint/regimes', (_req, res) => res.json(USB59.regimes)); +app.get('/api/unified-synthesis-blueprint/counts', (_req, res) => res.json(USB59.counts)); +app.get('/api/unified-synthesis-blueprint/executive-summary', (_req, res) => res.json(USB59.executiveSummary)); +app.get('/api/unified-synthesis-blueprint/indices', (_req, res) => res.json(USB59.indices)); +app.get('/api/unified-synthesis-blueprint/tiers', (_req, res) => res.json(USB59.tiers)); +app.get('/api/unified-synthesis-blueprint/severities', (_req, res) => res.json(USB59.severities)); +app.get('/api/unified-synthesis-blueprint/investment', (_req, res) => res.json(USB59.investment)); // Standard collections + ID lookups -app.get('/api/unified-synthesis-blueprint/modules', (req, res) => res.json(USB59.modules)); +app.get('/api/unified-synthesis-blueprint/modules', (_req, res) => res.json(USB59.modules)); app.get('/api/unified-synthesis-blueprint/modules/:id', (req, res) => { const m = USB59.modules.find(x => x.mid === req.params.id); if (!m) return res.status(404).json({ error: 'module not found', id: req.params.id }); res.json(m); }); -app.get('/api/unified-synthesis-blueprint/schemas', (req, res) => res.json(USB59.schemas)); +app.get('/api/unified-synthesis-blueprint/schemas', (_req, res) => res.json(USB59.schemas)); app.get('/api/unified-synthesis-blueprint/schemas/:id', (req, res) => { const s = USB59.schemas.find(x => x.sid === req.params.id); if (!s) return res.status(404).json({ error: 'schema not found', id: req.params.id }); res.json(s); }); -app.get('/api/unified-synthesis-blueprint/code', (req, res) => res.json(USB59.code)); +app.get('/api/unified-synthesis-blueprint/code', (_req, res) => res.json(USB59.code)); app.get('/api/unified-synthesis-blueprint/code/:id', (req, res) => { const c = USB59.code.find(x => x.cid === req.params.id); if (!c) return res.status(404).json({ error: 'code not found', id: req.params.id }); res.json(c); }); -app.get('/api/unified-synthesis-blueprint/kpis', (req, res) => res.json(USB59.kpis)); +app.get('/api/unified-synthesis-blueprint/kpis', (_req, res) => res.json(USB59.kpis)); app.get('/api/unified-synthesis-blueprint/kpis/:id', (req, res) => { const k = USB59.kpis.find(x => x.kid === req.params.id); if (!k) return res.status(404).json({ error: 'kpi not found', id: req.params.id }); res.json(k); }); -app.get('/api/unified-synthesis-blueprint/risk-control-matrix', (req, res) => res.json(USB59.riskControlMatrix)); +app.get('/api/unified-synthesis-blueprint/risk-control-matrix', (_req, res) => res.json(USB59.riskControlMatrix)); app.get('/api/unified-synthesis-blueprint/risk-control-matrix/:id', (req, res) => { const r = USB59.riskControlMatrix.find(x => x.rid === req.params.id); if (!r) return res.status(404).json({ error: 'risk control row not found', id: req.params.id }); res.json(r); }); -app.get('/api/unified-synthesis-blueprint/traceability', (req, res) => res.json(USB59.traceability)); +app.get('/api/unified-synthesis-blueprint/traceability', (_req, res) => res.json(USB59.traceability)); app.get('/api/unified-synthesis-blueprint/traceability/:id', (req, res) => { const t = USB59.traceability.find(x => x.tid === req.params.id); if (!t) return res.status(404).json({ error: 'traceability row not found', id: req.params.id }); res.json(t); }); -app.get('/api/unified-synthesis-blueprint/data-flows', (req, res) => res.json(USB59.dataFlows)); +app.get('/api/unified-synthesis-blueprint/data-flows', (_req, res) => res.json(USB59.dataFlows)); app.get('/api/unified-synthesis-blueprint/data-flows/:id', (req, res) => { const f = USB59.dataFlows.find(x => x.fid === req.params.id); if (!f) return res.status(404).json({ error: 'data flow not found', id: req.params.id }); res.json(f); }); -app.get('/api/unified-synthesis-blueprint/regulators', (req, res) => res.json(USB59.regulators)); +app.get('/api/unified-synthesis-blueprint/regulators', (_req, res) => res.json(USB59.regulators)); app.get('/api/unified-synthesis-blueprint/regulators/:reg', (req, res) => { const r = USB59.regulators.find(x => x.reg === req.params.reg); if (!r) return res.status(404).json({ error: 'regulator not found', reg: req.params.reg }); res.json(r); }); -app.get('/api/unified-synthesis-blueprint/privacy', (req, res) => res.json(USB59.privacy)); -app.get('/api/unified-synthesis-blueprint/deployment', (req, res) => res.json(USB59.deployment)); -app.get('/api/unified-synthesis-blueprint/rollout-90', (req, res) => res.json(USB59.rollout90)); -app.get('/api/unified-synthesis-blueprint/roadmap', (req, res) => res.json(USB59.roadmap)); +app.get('/api/unified-synthesis-blueprint/privacy', (_req, res) => res.json(USB59.privacy)); +app.get('/api/unified-synthesis-blueprint/deployment', (_req, res) => res.json(USB59.deployment)); +app.get('/api/unified-synthesis-blueprint/rollout-90', (_req, res) => res.json(USB59.rollout90)); +app.get('/api/unified-synthesis-blueprint/roadmap', (_req, res) => res.json(USB59.roadmap)); -app.get('/api/unified-synthesis-blueprint/evidence-pack', (req, res) => res.json(USB59.evidencePack)); +app.get('/api/unified-synthesis-blueprint/evidence-pack', (_req, res) => res.json(USB59.evidencePack)); app.get('/api/unified-synthesis-blueprint/evidence-pack/:id', (req, res) => { const e = USB59.evidencePack.find(x => x.epid === req.params.id); if (!e) return res.status(404).json({ error: 'evidence pack item not found', id: req.params.id }); @@ -24785,77 +24803,77 @@ app.get('/api/unified-synthesis-blueprint/evidence-pack/:id', (req, res) => { }); // Distinctive collections + ID lookups (12) -app.get('/api/unified-synthesis-blueprint/sentinel-layers', (req, res) => res.json(USB59.sentinelLayers)); +app.get('/api/unified-synthesis-blueprint/sentinel-layers', (_req, res) => res.json(USB59.sentinelLayers)); app.get('/api/unified-synthesis-blueprint/sentinel-layers/:id', (req, res) => { const s = USB59.sentinelLayers.find(x => x.slid === req.params.id); if (!s) return res.status(404).json({ error: 'sentinel layer not found', id: req.params.id }); res.json(s); }); -app.get('/api/unified-synthesis-blueprint/wfap-capabilities', (req, res) => res.json(USB59.wfapCapabilities)); +app.get('/api/unified-synthesis-blueprint/wfap-capabilities', (_req, res) => res.json(USB59.wfapCapabilities)); app.get('/api/unified-synthesis-blueprint/wfap-capabilities/:id', (req, res) => { const w = USB59.wfapCapabilities.find(x => x.wid === req.params.id); if (!w) return res.status(404).json({ error: 'wfap capability not found', id: req.params.id }); res.json(w); }); -app.get('/api/unified-synthesis-blueprint/compliance-links', (req, res) => res.json(USB59.complianceLinks)); +app.get('/api/unified-synthesis-blueprint/compliance-links', (_req, res) => res.json(USB59.complianceLinks)); app.get('/api/unified-synthesis-blueprint/compliance-links/:id', (req, res) => { const c = USB59.complianceLinks.find(x => x.cid === req.params.id); if (!c) return res.status(404).json({ error: 'compliance link not found', id: req.params.id }); res.json(c); }); -app.get('/api/unified-synthesis-blueprint/safety-mechanisms', (req, res) => res.json(USB59.safetyMechanisms)); +app.get('/api/unified-synthesis-blueprint/safety-mechanisms', (_req, res) => res.json(USB59.safetyMechanisms)); app.get('/api/unified-synthesis-blueprint/safety-mechanisms/:id', (req, res) => { const s = USB59.safetyMechanisms.find(x => x.sid === req.params.id); if (!s) return res.status(404).json({ error: 'safety mechanism not found', id: req.params.id }); res.json(s); }); -app.get('/api/unified-synthesis-blueprint/fs-controls', (req, res) => res.json(USB59.fsControls)); +app.get('/api/unified-synthesis-blueprint/fs-controls', (_req, res) => res.json(USB59.fsControls)); app.get('/api/unified-synthesis-blueprint/fs-controls/:id', (req, res) => { const f = USB59.fsControls.find(x => x.fid === req.params.id); if (!f) return res.status(404).json({ error: 'fs control not found', id: req.params.id }); res.json(f); }); -app.get('/api/unified-synthesis-blueprint/civ-stacks', (req, res) => res.json(USB59.civStacks)); +app.get('/api/unified-synthesis-blueprint/civ-stacks', (_req, res) => res.json(USB59.civStacks)); app.get('/api/unified-synthesis-blueprint/civ-stacks/:id', (req, res) => { const v = USB59.civStacks.find(x => x.vid === req.params.id); if (!v) return res.status(404).json({ error: 'civilizational stack not found', id: req.params.id }); res.json(v); }); -app.get('/api/unified-synthesis-blueprint/op-substrates', (req, res) => res.json(USB59.opSubstrates)); +app.get('/api/unified-synthesis-blueprint/op-substrates', (_req, res) => res.json(USB59.opSubstrates)); app.get('/api/unified-synthesis-blueprint/op-substrates/:id', (req, res) => { const o = USB59.opSubstrates.find(x => x.oid === req.params.id); if (!o) return res.status(404).json({ error: 'op substrate not found', id: req.params.id }); res.json(o); }); -app.get('/api/unified-synthesis-blueprint/roadmap-items', (req, res) => res.json(USB59.roadmapItems)); +app.get('/api/unified-synthesis-blueprint/roadmap-items', (_req, res) => res.json(USB59.roadmapItems)); app.get('/api/unified-synthesis-blueprint/roadmap-items/:id', (req, res) => { const r = USB59.roadmapItems.find(x => x.rid === req.params.id); if (!r) return res.status(404).json({ error: 'roadmap item not found', id: req.params.id }); res.json(r); }); -app.get('/api/unified-synthesis-blueprint/regulator-artifacts', (req, res) => res.json(USB59.regulatorArtifacts)); +app.get('/api/unified-synthesis-blueprint/regulator-artifacts', (_req, res) => res.json(USB59.regulatorArtifacts)); app.get('/api/unified-synthesis-blueprint/regulator-artifacts/:id', (req, res) => { const b = USB59.regulatorArtifacts.find(x => x.bid === req.params.id); if (!b) return res.status(404).json({ error: 'regulator artifact not found', id: req.params.id }); res.json(b); }); -app.get('/api/unified-synthesis-blueprint/research-tracks', (req, res) => res.json(USB59.researchTracks)); +app.get('/api/unified-synthesis-blueprint/research-tracks', (_req, res) => res.json(USB59.researchTracks)); app.get('/api/unified-synthesis-blueprint/research-tracks/:id', (req, res) => { const t = USB59.researchTracks.find(x => x.tid === req.params.id); if (!t) return res.status(404).json({ error: 'research track not found', id: req.params.id }); res.json(t); }); -app.get('/api/unified-synthesis-blueprint/dependencies', (req, res) => res.json(USB59.dependencies)); +app.get('/api/unified-synthesis-blueprint/dependencies', (_req, res) => res.json(USB59.dependencies)); app.get('/api/unified-synthesis-blueprint/dependencies/:id', (req, res) => { const d = USB59.dependencies.find(x => x.did === req.params.id); if (!d) return res.status(404).json({ error: 'dependency not found', id: req.params.id }); @@ -24868,122 +24886,122 @@ app.get('/api/unified-synthesis-blueprint/dependencies/:id', (req, res) => { const ECS60 = require('./data/end-to-end-cryptosupervision-blueprint.json'); // Page route -app.get('/end-to-end-cryptosupervision-blueprint', (req, res) => { +app.get('/end-to-end-cryptosupervision-blueprint', (_req, res) => { res.sendFile(path.join(__dirname, 'public', 'end-to-end-cryptosupervision-blueprint.html')); }); // Summary + meta endpoints -app.get('/api/end-to-end-cryptosupervision-blueprint/summary', (req, res) => res.json({ +app.get('/api/end-to-end-cryptosupervision-blueprint/summary', (_req, res) => res.json({ docRef: ECS60.docRef, version: ECS60.version, title: ECS60.title, horizon: ECS60.horizon, apiPrefix: ECS60.apiPrefix, buildsOn: ECS60.buildsOn, status: ECS60.status, classification: ECS60.classification, counts: ECS60.counts })); -app.get('/api/end-to-end-cryptosupervision-blueprint/directive', (req, res) => res.json(ECS60.directive)); -app.get('/api/end-to-end-cryptosupervision-blueprint/pillars', (req, res) => res.json(ECS60.pillars)); -app.get('/api/end-to-end-cryptosupervision-blueprint/regimes', (req, res) => res.json(ECS60.regimes)); -app.get('/api/end-to-end-cryptosupervision-blueprint/counts', (req, res) => res.json(ECS60.counts)); -app.get('/api/end-to-end-cryptosupervision-blueprint/executive-summary', (req, res) => res.json(ECS60.executiveSummary)); -app.get('/api/end-to-end-cryptosupervision-blueprint/indices', (req, res) => res.json(ECS60.indices)); -app.get('/api/end-to-end-cryptosupervision-blueprint/tiers', (req, res) => res.json(ECS60.tiers)); -app.get('/api/end-to-end-cryptosupervision-blueprint/severities', (req, res) => res.json(ECS60.severities)); -app.get('/api/end-to-end-cryptosupervision-blueprint/investment', (req, res) => res.json(ECS60.investment)); +app.get('/api/end-to-end-cryptosupervision-blueprint/directive', (_req, res) => res.json(ECS60.directive)); +app.get('/api/end-to-end-cryptosupervision-blueprint/pillars', (_req, res) => res.json(ECS60.pillars)); +app.get('/api/end-to-end-cryptosupervision-blueprint/regimes', (_req, res) => res.json(ECS60.regimes)); +app.get('/api/end-to-end-cryptosupervision-blueprint/counts', (_req, res) => res.json(ECS60.counts)); +app.get('/api/end-to-end-cryptosupervision-blueprint/executive-summary', (_req, res) => res.json(ECS60.executiveSummary)); +app.get('/api/end-to-end-cryptosupervision-blueprint/indices', (_req, res) => res.json(ECS60.indices)); +app.get('/api/end-to-end-cryptosupervision-blueprint/tiers', (_req, res) => res.json(ECS60.tiers)); +app.get('/api/end-to-end-cryptosupervision-blueprint/severities', (_req, res) => res.json(ECS60.severities)); +app.get('/api/end-to-end-cryptosupervision-blueprint/investment', (_req, res) => res.json(ECS60.investment)); // Standard collections -app.get('/api/end-to-end-cryptosupervision-blueprint/modules', (req, res) => res.json(ECS60.modules)); +app.get('/api/end-to-end-cryptosupervision-blueprint/modules', (_req, res) => res.json(ECS60.modules)); app.get('/api/end-to-end-cryptosupervision-blueprint/modules/:id', (req, res) => { const m = ECS60.modules.find(x => x.mid === req.params.id); if (!m) return res.status(404).json({ error: 'module not found', id: req.params.id }); res.json(m); }); -app.get('/api/end-to-end-cryptosupervision-blueprint/schemas', (req, res) => res.json(ECS60.schemas)); -app.get('/api/end-to-end-cryptosupervision-blueprint/code', (req, res) => res.json(ECS60.code)); -app.get('/api/end-to-end-cryptosupervision-blueprint/kpis', (req, res) => res.json(ECS60.kpis)); -app.get('/api/end-to-end-cryptosupervision-blueprint/risk-control-matrix', (req, res) => res.json(ECS60.riskControlMatrix)); -app.get('/api/end-to-end-cryptosupervision-blueprint/traceability', (req, res) => res.json(ECS60.traceability)); -app.get('/api/end-to-end-cryptosupervision-blueprint/data-flows', (req, res) => res.json(ECS60.dataFlows)); -app.get('/api/end-to-end-cryptosupervision-blueprint/regulators', (req, res) => res.json(ECS60.regulators)); +app.get('/api/end-to-end-cryptosupervision-blueprint/schemas', (_req, res) => res.json(ECS60.schemas)); +app.get('/api/end-to-end-cryptosupervision-blueprint/code', (_req, res) => res.json(ECS60.code)); +app.get('/api/end-to-end-cryptosupervision-blueprint/kpis', (_req, res) => res.json(ECS60.kpis)); +app.get('/api/end-to-end-cryptosupervision-blueprint/risk-control-matrix', (_req, res) => res.json(ECS60.riskControlMatrix)); +app.get('/api/end-to-end-cryptosupervision-blueprint/traceability', (_req, res) => res.json(ECS60.traceability)); +app.get('/api/end-to-end-cryptosupervision-blueprint/data-flows', (_req, res) => res.json(ECS60.dataFlows)); +app.get('/api/end-to-end-cryptosupervision-blueprint/regulators', (_req, res) => res.json(ECS60.regulators)); app.get('/api/end-to-end-cryptosupervision-blueprint/regulators/:name', (req, res) => { const r = ECS60.regulators.find(x => x.name === req.params.name); if (!r) return res.status(404).json({ error: 'regulator not found', name: req.params.name }); res.json(r); }); -app.get('/api/end-to-end-cryptosupervision-blueprint/rollout-90', (req, res) => res.json(ECS60.rollout90)); -app.get('/api/end-to-end-cryptosupervision-blueprint/roadmap', (req, res) => res.json(ECS60.roadmap)); -app.get('/api/end-to-end-cryptosupervision-blueprint/evidence-pack', (req, res) => res.json(ECS60.evidencePack)); +app.get('/api/end-to-end-cryptosupervision-blueprint/rollout-90', (_req, res) => res.json(ECS60.rollout90)); +app.get('/api/end-to-end-cryptosupervision-blueprint/roadmap', (_req, res) => res.json(ECS60.roadmap)); +app.get('/api/end-to-end-cryptosupervision-blueprint/evidence-pack', (_req, res) => res.json(ECS60.evidencePack)); // Distinctive collections + ID lookups (11) -app.get('/api/end-to-end-cryptosupervision-blueprint/platform-components', (req, res) => res.json(ECS60.platformComponents)); +app.get('/api/end-to-end-cryptosupervision-blueprint/platform-components', (_req, res) => res.json(ECS60.platformComponents)); app.get('/api/end-to-end-cryptosupervision-blueprint/platform-components/:id', (req, res) => { const p = ECS60.platformComponents.find(x => x.pid === req.params.id); if (!p) return res.status(404).json({ error: 'platform component not found', id: req.params.id }); res.json(p); }); -app.get('/api/end-to-end-cryptosupervision-blueprint/sentinel-layers', (req, res) => res.json(ECS60.sentinelLayers)); +app.get('/api/end-to-end-cryptosupervision-blueprint/sentinel-layers', (_req, res) => res.json(ECS60.sentinelLayers)); app.get('/api/end-to-end-cryptosupervision-blueprint/sentinel-layers/:id', (req, res) => { const s = ECS60.sentinelLayers.find(x => x.slid === req.params.id); if (!s) return res.status(404).json({ error: 'sentinel layer not found', id: req.params.id }); res.json(s); }); -app.get('/api/end-to-end-cryptosupervision-blueprint/containment-controls', (req, res) => res.json(ECS60.containmentControls)); +app.get('/api/end-to-end-cryptosupervision-blueprint/containment-controls', (_req, res) => res.json(ECS60.containmentControls)); app.get('/api/end-to-end-cryptosupervision-blueprint/containment-controls/:id', (req, res) => { const c = ECS60.containmentControls.find(x => x.cid === req.params.id); if (!c) return res.status(404).json({ error: 'containment control not found', id: req.params.id }); res.json(c); }); -app.get('/api/end-to-end-cryptosupervision-blueprint/fi-blueprints', (req, res) => res.json(ECS60.fiBlueprints)); +app.get('/api/end-to-end-cryptosupervision-blueprint/fi-blueprints', (_req, res) => res.json(ECS60.fiBlueprints)); app.get('/api/end-to-end-cryptosupervision-blueprint/fi-blueprints/:id', (req, res) => { const f = ECS60.fiBlueprints.find(x => x.fid === req.params.id); if (!f) return res.status(404).json({ error: 'fi blueprint not found', id: req.params.id }); res.json(f); }); -app.get('/api/end-to-end-cryptosupervision-blueprint/prompt-governance', (req, res) => res.json(ECS60.promptGovernance)); +app.get('/api/end-to-end-cryptosupervision-blueprint/prompt-governance', (_req, res) => res.json(ECS60.promptGovernance)); app.get('/api/end-to-end-cryptosupervision-blueprint/prompt-governance/:id', (req, res) => { const q = ECS60.promptGovernance.find(x => x.qid === req.params.id); if (!q) return res.status(404).json({ error: 'prompt governance item not found', id: req.params.id }); res.json(q); }); -app.get('/api/end-to-end-cryptosupervision-blueprint/crypto-supervision-layers', (req, res) => res.json(ECS60.cryptoSupervisionLayers)); +app.get('/api/end-to-end-cryptosupervision-blueprint/crypto-supervision-layers', (_req, res) => res.json(ECS60.cryptoSupervisionLayers)); app.get('/api/end-to-end-cryptosupervision-blueprint/crypto-supervision-layers/:id', (req, res) => { const x = ECS60.cryptoSupervisionLayers.find(y => y.xid === req.params.id); if (!x) return res.status(404).json({ error: 'crypto supervision layer not found', id: req.params.id }); res.json(x); }); -app.get('/api/end-to-end-cryptosupervision-blueprint/deployment-artifacts', (req, res) => res.json(ECS60.deploymentArtifacts)); +app.get('/api/end-to-end-cryptosupervision-blueprint/deployment-artifacts', (_req, res) => res.json(ECS60.deploymentArtifacts)); app.get('/api/end-to-end-cryptosupervision-blueprint/deployment-artifacts/:id', (req, res) => { const d = ECS60.deploymentArtifacts.find(x => x.did === req.params.id); if (!d) return res.status(404).json({ error: 'deployment artifact not found', id: req.params.id }); res.json(d); }); -app.get('/api/end-to-end-cryptosupervision-blueprint/autonomous-agents', (req, res) => res.json(ECS60.autonomousAgents)); +app.get('/api/end-to-end-cryptosupervision-blueprint/autonomous-agents', (_req, res) => res.json(ECS60.autonomousAgents)); app.get('/api/end-to-end-cryptosupervision-blueprint/autonomous-agents/:id', (req, res) => { const a = ECS60.autonomousAgents.find(x => x.aid === req.params.id); if (!a) return res.status(404).json({ error: 'autonomous agent not found', id: req.params.id }); res.json(a); }); -app.get('/api/end-to-end-cryptosupervision-blueprint/regulator-gateways', (req, res) => res.json(ECS60.regulatorGateways)); +app.get('/api/end-to-end-cryptosupervision-blueprint/regulator-gateways', (_req, res) => res.json(ECS60.regulatorGateways)); app.get('/api/end-to-end-cryptosupervision-blueprint/regulator-gateways/:id', (req, res) => { const g = ECS60.regulatorGateways.find(x => x.gid === req.params.id); if (!g) return res.status(404).json({ error: 'regulator gateway not found', id: req.params.id }); res.json(g); }); -app.get('/api/end-to-end-cryptosupervision-blueprint/roadmap-items', (req, res) => res.json(ECS60.roadmapItems)); +app.get('/api/end-to-end-cryptosupervision-blueprint/roadmap-items', (_req, res) => res.json(ECS60.roadmapItems)); app.get('/api/end-to-end-cryptosupervision-blueprint/roadmap-items/:id', (req, res) => { const r = ECS60.roadmapItems.find(x => x.rid === req.params.id); if (!r) return res.status(404).json({ error: 'roadmap item not found', id: req.params.id }); res.json(r); }); -app.get('/api/end-to-end-cryptosupervision-blueprint/dependencies', (req, res) => res.json(ECS60.dependencies)); +app.get('/api/end-to-end-cryptosupervision-blueprint/dependencies', (_req, res) => res.json(ECS60.dependencies)); app.get('/api/end-to-end-cryptosupervision-blueprint/dependencies/:id', (req, res) => { const d = ECS60.dependencies.find(x => x.eid === req.params.id); if (!d) return res.status(404).json({ error: 'dependency not found', id: req.params.id }); @@ -24996,121 +25014,121 @@ app.get('/api/end-to-end-cryptosupervision-blueprint/dependencies/:id', (req, re const MAGB61 = require('./data/master-agi-governance-blueprint.json'); // Page route -app.get('/master-agi-governance-blueprint', (req, res) => { +app.get('/master-agi-governance-blueprint', (_req, res) => { res.sendFile(path.join(__dirname, 'public', 'master-agi-governance-blueprint.html')); }); // Summary + meta endpoints -app.get('/api/master-agi-governance-blueprint/summary', (req, res) => res.json({ +app.get('/api/master-agi-governance-blueprint/summary', (_req, res) => res.json({ docRef: MAGB61.docRef, version: MAGB61.version, title: MAGB61.title, horizon: MAGB61.horizon, apiPrefix: MAGB61.apiPrefix, buildsOn: MAGB61.buildsOn, status: MAGB61.status, classification: MAGB61.classification, counts: MAGB61.counts })); -app.get('/api/master-agi-governance-blueprint/directive', (req, res) => res.json(MAGB61.directive)); -app.get('/api/master-agi-governance-blueprint/regimes', (req, res) => res.json(MAGB61.regimes)); -app.get('/api/master-agi-governance-blueprint/indices', (req, res) => res.json(MAGB61.indices)); -app.get('/api/master-agi-governance-blueprint/tiers', (req, res) => res.json(MAGB61.tiers)); -app.get('/api/master-agi-governance-blueprint/severities', (req, res) => res.json(MAGB61.severities)); -app.get('/api/master-agi-governance-blueprint/investment', (req, res) => res.json(MAGB61.investment)); -app.get('/api/master-agi-governance-blueprint/counts', (req, res) => res.json(MAGB61.counts)); -app.get('/api/master-agi-governance-blueprint/executive-summary', (req, res) => res.json(MAGB61.executiveSummary)); +app.get('/api/master-agi-governance-blueprint/directive', (_req, res) => res.json(MAGB61.directive)); +app.get('/api/master-agi-governance-blueprint/regimes', (_req, res) => res.json(MAGB61.regimes)); +app.get('/api/master-agi-governance-blueprint/indices', (_req, res) => res.json(MAGB61.indices)); +app.get('/api/master-agi-governance-blueprint/tiers', (_req, res) => res.json(MAGB61.tiers)); +app.get('/api/master-agi-governance-blueprint/severities', (_req, res) => res.json(MAGB61.severities)); +app.get('/api/master-agi-governance-blueprint/investment', (_req, res) => res.json(MAGB61.investment)); +app.get('/api/master-agi-governance-blueprint/counts', (_req, res) => res.json(MAGB61.counts)); +app.get('/api/master-agi-governance-blueprint/executive-summary', (_req, res) => res.json(MAGB61.executiveSummary)); // Standard collections -app.get('/api/master-agi-governance-blueprint/modules', (req, res) => res.json(MAGB61.modules)); +app.get('/api/master-agi-governance-blueprint/modules', (_req, res) => res.json(MAGB61.modules)); app.get('/api/master-agi-governance-blueprint/modules/:id', (req, res) => { const m = MAGB61.modules.find(x => x.mid === req.params.id); if (!m) return res.status(404).json({ error: 'module not found', id: req.params.id }); res.json(m); }); -app.get('/api/master-agi-governance-blueprint/schemas', (req, res) => res.json(MAGB61.schemas)); -app.get('/api/master-agi-governance-blueprint/code', (req, res) => res.json(MAGB61.code)); -app.get('/api/master-agi-governance-blueprint/kpis', (req, res) => res.json(MAGB61.kpis)); -app.get('/api/master-agi-governance-blueprint/risk-control-matrix', (req, res) => res.json(MAGB61.riskControlMatrix)); -app.get('/api/master-agi-governance-blueprint/traceability', (req, res) => res.json(MAGB61.traceability)); -app.get('/api/master-agi-governance-blueprint/data-flows', (req, res) => res.json(MAGB61.dataFlows)); -app.get('/api/master-agi-governance-blueprint/regulators', (req, res) => res.json(MAGB61.regulators)); +app.get('/api/master-agi-governance-blueprint/schemas', (_req, res) => res.json(MAGB61.schemas)); +app.get('/api/master-agi-governance-blueprint/code', (_req, res) => res.json(MAGB61.code)); +app.get('/api/master-agi-governance-blueprint/kpis', (_req, res) => res.json(MAGB61.kpis)); +app.get('/api/master-agi-governance-blueprint/risk-control-matrix', (_req, res) => res.json(MAGB61.riskControlMatrix)); +app.get('/api/master-agi-governance-blueprint/traceability', (_req, res) => res.json(MAGB61.traceability)); +app.get('/api/master-agi-governance-blueprint/data-flows', (_req, res) => res.json(MAGB61.dataFlows)); +app.get('/api/master-agi-governance-blueprint/regulators', (_req, res) => res.json(MAGB61.regulators)); app.get('/api/master-agi-governance-blueprint/regulators/:name', (req, res) => { const r = MAGB61.regulators.find(x => x.name === req.params.name); if (!r) return res.status(404).json({ error: 'regulator not found', name: req.params.name }); res.json(r); }); -app.get('/api/master-agi-governance-blueprint/rollout-90', (req, res) => res.json(MAGB61.rollout90)); -app.get('/api/master-agi-governance-blueprint/roadmap', (req, res) => res.json(MAGB61.roadmap)); -app.get('/api/master-agi-governance-blueprint/evidence-pack', (req, res) => res.json(MAGB61.evidencePack)); +app.get('/api/master-agi-governance-blueprint/rollout-90', (_req, res) => res.json(MAGB61.rollout90)); +app.get('/api/master-agi-governance-blueprint/roadmap', (_req, res) => res.json(MAGB61.roadmap)); +app.get('/api/master-agi-governance-blueprint/evidence-pack', (_req, res) => res.json(MAGB61.evidencePack)); // Distinctive collections + ID lookups -app.get('/api/master-agi-governance-blueprint/ref-arch-layers', (req, res) => res.json(MAGB61.refArchLayers)); +app.get('/api/master-agi-governance-blueprint/ref-arch-layers', (_req, res) => res.json(MAGB61.refArchLayers)); app.get('/api/master-agi-governance-blueprint/ref-arch-layers/:id', (req, res) => { const r = MAGB61.refArchLayers.find(x => x.rid === req.params.id); if (!r) return res.status(404).json({ error: 'ref arch layer not found', id: req.params.id }); res.json(r); }); -app.get('/api/master-agi-governance-blueprint/platform-layers', (req, res) => res.json(MAGB61.platformLayers)); +app.get('/api/master-agi-governance-blueprint/platform-layers', (_req, res) => res.json(MAGB61.platformLayers)); app.get('/api/master-agi-governance-blueprint/platform-layers/:id', (req, res) => { const p = MAGB61.platformLayers.find(x => x.pid === req.params.id); if (!p) return res.status(404).json({ error: 'platform layer not found', id: req.params.id }); res.json(p); }); -app.get('/api/master-agi-governance-blueprint/regulatory-crosswalks', (req, res) => res.json(MAGB61.regulatoryCrosswalks)); +app.get('/api/master-agi-governance-blueprint/regulatory-crosswalks', (_req, res) => res.json(MAGB61.regulatoryCrosswalks)); app.get('/api/master-agi-governance-blueprint/regulatory-crosswalks/:id', (req, res) => { const c = MAGB61.regulatoryCrosswalks.find(x => x.cid === req.params.id); if (!c) return res.status(404).json({ error: 'regulatory crosswalk not found', id: req.params.id }); res.json(c); }); -app.get('/api/master-agi-governance-blueprint/containment-mechanisms', (req, res) => res.json(MAGB61.containmentMechanisms)); +app.get('/api/master-agi-governance-blueprint/containment-mechanisms', (_req, res) => res.json(MAGB61.containmentMechanisms)); app.get('/api/master-agi-governance-blueprint/containment-mechanisms/:id', (req, res) => { const c = MAGB61.containmentMechanisms.find(x => x.mid === req.params.id); if (!c) return res.status(404).json({ error: 'containment mechanism not found', id: req.params.id }); res.json(c); }); -app.get('/api/master-agi-governance-blueprint/umif-invariants', (req, res) => res.json(MAGB61.umifInvariants)); +app.get('/api/master-agi-governance-blueprint/umif-invariants', (_req, res) => res.json(MAGB61.umifInvariants)); app.get('/api/master-agi-governance-blueprint/umif-invariants/:id', (req, res) => { const u = MAGB61.umifInvariants.find(x => x.uid === req.params.id); if (!u) return res.status(404).json({ error: 'umif invariant not found', id: req.params.id }); res.json(u); }); -app.get('/api/master-agi-governance-blueprint/supervisory-layers', (req, res) => res.json(MAGB61.supervisoryLayers)); +app.get('/api/master-agi-governance-blueprint/supervisory-layers', (_req, res) => res.json(MAGB61.supervisoryLayers)); app.get('/api/master-agi-governance-blueprint/supervisory-layers/:id', (req, res) => { const s = MAGB61.supervisoryLayers.find(x => x.sid === req.params.id); if (!s) return res.status(404).json({ error: 'supervisory layer not found', id: req.params.id }); res.json(s); }); -app.get('/api/master-agi-governance-blueprint/annex-iv-artifacts', (req, res) => res.json(MAGB61.annexIVArtifacts)); +app.get('/api/master-agi-governance-blueprint/annex-iv-artifacts', (_req, res) => res.json(MAGB61.annexIVArtifacts)); app.get('/api/master-agi-governance-blueprint/annex-iv-artifacts/:id', (req, res) => { const a = MAGB61.annexIVArtifacts.find(x => x.aid === req.params.id); if (!a) return res.status(404).json({ error: 'annex IV artifact not found', id: req.params.id }); res.json(a); }); -app.get('/api/master-agi-governance-blueprint/strategy-items', (req, res) => res.json(MAGB61.strategyItems)); +app.get('/api/master-agi-governance-blueprint/strategy-items', (_req, res) => res.json(MAGB61.strategyItems)); app.get('/api/master-agi-governance-blueprint/strategy-items/:id', (req, res) => { const s = MAGB61.strategyItems.find(x => x.eid === req.params.id); if (!s) return res.status(404).json({ error: 'strategy item not found', id: req.params.id }); res.json(s); }); -app.get('/api/master-agi-governance-blueprint/roadmap-items', (req, res) => res.json(MAGB61.roadmapItems)); +app.get('/api/master-agi-governance-blueprint/roadmap-items', (_req, res) => res.json(MAGB61.roadmapItems)); app.get('/api/master-agi-governance-blueprint/roadmap-items/:id', (req, res) => { const r = MAGB61.roadmapItems.find(x => x.rid === req.params.id); if (!r) return res.status(404).json({ error: 'roadmap item not found', id: req.params.id }); res.json(r); }); -app.get('/api/master-agi-governance-blueprint/systemic-practices', (req, res) => res.json(MAGB61.systemicPractices)); +app.get('/api/master-agi-governance-blueprint/systemic-practices', (_req, res) => res.json(MAGB61.systemicPractices)); app.get('/api/master-agi-governance-blueprint/systemic-practices/:id', (req, res) => { const y = MAGB61.systemicPractices.find(x => x.yid === req.params.id); if (!y) return res.status(404).json({ error: 'systemic practice not found', id: req.params.id }); res.json(y); }); -app.get('/api/master-agi-governance-blueprint/dependencies', (req, res) => res.json(MAGB61.dependencies)); +app.get('/api/master-agi-governance-blueprint/dependencies', (_req, res) => res.json(MAGB61.dependencies)); app.get('/api/master-agi-governance-blueprint/dependencies/:id', (req, res) => { const d = MAGB61.dependencies.find(x => x.did === req.params.id); if (!d) return res.status(404).json({ error: 'dependency not found', id: req.params.id }); @@ -25123,107 +25141,107 @@ app.get('/api/master-agi-governance-blueprint/dependencies/:id', (req, res) => { const CAMS62 = require('./data/civ-agi-master-synthesis-2030.json'); // Page route -app.get('/civ-agi-master-synthesis-2030', (req, res) => { +app.get('/civ-agi-master-synthesis-2030', (_req, res) => { res.sendFile(path.join(__dirname, 'public', 'civ-agi-master-synthesis-2030.html')); }); // Summary + meta endpoints -app.get('/api/civ-agi-master-synthesis-2030/summary', (req, res) => res.json({ +app.get('/api/civ-agi-master-synthesis-2030/summary', (_req, res) => res.json({ docRef: CAMS62.docRef, version: CAMS62.version, title: CAMS62.title, horizon: CAMS62.horizon, apiPrefix: CAMS62.apiPrefix, buildsOn: CAMS62.buildsOn, status: CAMS62.status, classification: CAMS62.classification, counts: CAMS62.counts })); -app.get('/api/civ-agi-master-synthesis-2030/directive', (req, res) => res.json(CAMS62.directive)); -app.get('/api/civ-agi-master-synthesis-2030/audiences', (req, res) => res.json(CAMS62.audiences)); -app.get('/api/civ-agi-master-synthesis-2030/regimes', (req, res) => res.json(CAMS62.regimes)); -app.get('/api/civ-agi-master-synthesis-2030/indices', (req, res) => res.json(CAMS62.indices)); -app.get('/api/civ-agi-master-synthesis-2030/tiers', (req, res) => res.json(CAMS62.tiers)); -app.get('/api/civ-agi-master-synthesis-2030/severities', (req, res) => res.json(CAMS62.severities)); -app.get('/api/civ-agi-master-synthesis-2030/investment', (req, res) => res.json(CAMS62.investment)); -app.get('/api/civ-agi-master-synthesis-2030/counts', (req, res) => res.json(CAMS62.counts)); -app.get('/api/civ-agi-master-synthesis-2030/executive-summary', (req, res) => res.json(CAMS62.executiveSummary)); +app.get('/api/civ-agi-master-synthesis-2030/directive', (_req, res) => res.json(CAMS62.directive)); +app.get('/api/civ-agi-master-synthesis-2030/audiences', (_req, res) => res.json(CAMS62.audiences)); +app.get('/api/civ-agi-master-synthesis-2030/regimes', (_req, res) => res.json(CAMS62.regimes)); +app.get('/api/civ-agi-master-synthesis-2030/indices', (_req, res) => res.json(CAMS62.indices)); +app.get('/api/civ-agi-master-synthesis-2030/tiers', (_req, res) => res.json(CAMS62.tiers)); +app.get('/api/civ-agi-master-synthesis-2030/severities', (_req, res) => res.json(CAMS62.severities)); +app.get('/api/civ-agi-master-synthesis-2030/investment', (_req, res) => res.json(CAMS62.investment)); +app.get('/api/civ-agi-master-synthesis-2030/counts', (_req, res) => res.json(CAMS62.counts)); +app.get('/api/civ-agi-master-synthesis-2030/executive-summary', (_req, res) => res.json(CAMS62.executiveSummary)); // Standard collections -app.get('/api/civ-agi-master-synthesis-2030/modules', (req, res) => res.json(CAMS62.modules)); +app.get('/api/civ-agi-master-synthesis-2030/modules', (_req, res) => res.json(CAMS62.modules)); app.get('/api/civ-agi-master-synthesis-2030/modules/:id', (req, res) => { const m = CAMS62.modules.find(x => x.mid === req.params.id); if (!m) return res.status(404).json({ error: 'module not found', id: req.params.id }); res.json(m); }); -app.get('/api/civ-agi-master-synthesis-2030/schemas', (req, res) => res.json(CAMS62.schemas)); -app.get('/api/civ-agi-master-synthesis-2030/code', (req, res) => res.json(CAMS62.code)); -app.get('/api/civ-agi-master-synthesis-2030/kpis', (req, res) => res.json(CAMS62.kpis)); -app.get('/api/civ-agi-master-synthesis-2030/risk-control-matrix', (req, res) => res.json(CAMS62.riskControlMatrix)); -app.get('/api/civ-agi-master-synthesis-2030/traceability', (req, res) => res.json(CAMS62.traceability)); -app.get('/api/civ-agi-master-synthesis-2030/data-flows', (req, res) => res.json(CAMS62.dataFlows)); -app.get('/api/civ-agi-master-synthesis-2030/regulators', (req, res) => res.json(CAMS62.regulators)); +app.get('/api/civ-agi-master-synthesis-2030/schemas', (_req, res) => res.json(CAMS62.schemas)); +app.get('/api/civ-agi-master-synthesis-2030/code', (_req, res) => res.json(CAMS62.code)); +app.get('/api/civ-agi-master-synthesis-2030/kpis', (_req, res) => res.json(CAMS62.kpis)); +app.get('/api/civ-agi-master-synthesis-2030/risk-control-matrix', (_req, res) => res.json(CAMS62.riskControlMatrix)); +app.get('/api/civ-agi-master-synthesis-2030/traceability', (_req, res) => res.json(CAMS62.traceability)); +app.get('/api/civ-agi-master-synthesis-2030/data-flows', (_req, res) => res.json(CAMS62.dataFlows)); +app.get('/api/civ-agi-master-synthesis-2030/regulators', (_req, res) => res.json(CAMS62.regulators)); app.get('/api/civ-agi-master-synthesis-2030/regulators/:name', (req, res) => { const r = CAMS62.regulators.find(x => x.name === req.params.name); if (!r) return res.status(404).json({ error: 'regulator not found', name: req.params.name }); res.json(r); }); -app.get('/api/civ-agi-master-synthesis-2030/rollout-90', (req, res) => res.json(CAMS62.rollout90)); -app.get('/api/civ-agi-master-synthesis-2030/evidence-pack', (req, res) => res.json(CAMS62.evidencePack)); +app.get('/api/civ-agi-master-synthesis-2030/rollout-90', (_req, res) => res.json(CAMS62.rollout90)); +app.get('/api/civ-agi-master-synthesis-2030/evidence-pack', (_req, res) => res.json(CAMS62.evidencePack)); // Distinctive collections + ID lookups -app.get('/api/civ-agi-master-synthesis-2030/ref-arch-layers', (req, res) => res.json(CAMS62.refArchLayers)); +app.get('/api/civ-agi-master-synthesis-2030/ref-arch-layers', (_req, res) => res.json(CAMS62.refArchLayers)); app.get('/api/civ-agi-master-synthesis-2030/ref-arch-layers/:id', (req, res) => { const r = CAMS62.refArchLayers.find(x => x.rid === req.params.id); if (!r) return res.status(404).json({ error: 'ref arch layer not found', id: req.params.id }); res.json(r); }); -app.get('/api/civ-agi-master-synthesis-2030/platform-layers', (req, res) => res.json(CAMS62.platformLayers)); +app.get('/api/civ-agi-master-synthesis-2030/platform-layers', (_req, res) => res.json(CAMS62.platformLayers)); app.get('/api/civ-agi-master-synthesis-2030/platform-layers/:id', (req, res) => { const p = CAMS62.platformLayers.find(x => x.pid === req.params.id); if (!p) return res.status(404).json({ error: 'platform layer not found', id: req.params.id }); res.json(p); }); -app.get('/api/civ-agi-master-synthesis-2030/regulatory-crosswalks', (req, res) => res.json(CAMS62.regulatoryCrosswalks)); +app.get('/api/civ-agi-master-synthesis-2030/regulatory-crosswalks', (_req, res) => res.json(CAMS62.regulatoryCrosswalks)); app.get('/api/civ-agi-master-synthesis-2030/regulatory-crosswalks/:id', (req, res) => { const c = CAMS62.regulatoryCrosswalks.find(x => x.cid === req.params.id); if (!c) return res.status(404).json({ error: 'regulatory crosswalk not found', id: req.params.id }); res.json(c); }); -app.get('/api/civ-agi-master-synthesis-2030/safety-invariants', (req, res) => res.json(CAMS62.safetyInvariants)); +app.get('/api/civ-agi-master-synthesis-2030/safety-invariants', (_req, res) => res.json(CAMS62.safetyInvariants)); app.get('/api/civ-agi-master-synthesis-2030/safety-invariants/:id', (req, res) => { const i = CAMS62.safetyInvariants.find(x => x.iid === req.params.id); if (!i) return res.status(404).json({ error: 'safety invariant not found', id: req.params.id }); res.json(i); }); -app.get('/api/civ-agi-master-synthesis-2030/frontier-risks', (req, res) => res.json(CAMS62.frontierRisks)); +app.get('/api/civ-agi-master-synthesis-2030/frontier-risks', (_req, res) => res.json(CAMS62.frontierRisks)); app.get('/api/civ-agi-master-synthesis-2030/frontier-risks/:id', (req, res) => { const f = CAMS62.frontierRisks.find(x => x.fid === req.params.id); if (!f) return res.status(404).json({ error: 'frontier risk not found', id: req.params.id }); res.json(f); }); -app.get('/api/civ-agi-master-synthesis-2030/civ-mechanisms', (req, res) => res.json(CAMS62.civMechanisms)); +app.get('/api/civ-agi-master-synthesis-2030/civ-mechanisms', (_req, res) => res.json(CAMS62.civMechanisms)); app.get('/api/civ-agi-master-synthesis-2030/civ-mechanisms/:id', (req, res) => { const m = CAMS62.civMechanisms.find(x => x.mid === req.params.id); if (!m) return res.status(404).json({ error: 'civ mechanism not found', id: req.params.id }); res.json(m); }); -app.get('/api/civ-agi-master-synthesis-2030/report-sections', (req, res) => res.json(CAMS62.reportSections)); +app.get('/api/civ-agi-master-synthesis-2030/report-sections', (_req, res) => res.json(CAMS62.reportSections)); app.get('/api/civ-agi-master-synthesis-2030/report-sections/:id', (req, res) => { const s = CAMS62.reportSections.find(x => x.rsid === req.params.id); if (!s) return res.status(404).json({ error: 'report section not found', id: req.params.id }); res.json(s); }); -app.get('/api/civ-agi-master-synthesis-2030/roadmap', (req, res) => res.json(CAMS62.roadmap)); +app.get('/api/civ-agi-master-synthesis-2030/roadmap', (_req, res) => res.json(CAMS62.roadmap)); app.get('/api/civ-agi-master-synthesis-2030/roadmap/:id', (req, res) => { const r = CAMS62.roadmap.find(x => x.rid === req.params.id); if (!r) return res.status(404).json({ error: 'roadmap item not found', id: req.params.id }); res.json(r); }); -app.get('/api/civ-agi-master-synthesis-2030/dependencies', (req, res) => res.json(CAMS62.dependencies)); +app.get('/api/civ-agi-master-synthesis-2030/dependencies', (_req, res) => res.json(CAMS62.dependencies)); app.get('/api/civ-agi-master-synthesis-2030/dependencies/:id', (req, res) => { const d = CAMS62.dependencies.find(x => x.did === req.params.id); if (!d) return res.status(404).json({ error: 'dependency not found', id: req.params.id }); @@ -25236,12 +25254,12 @@ app.get('/api/civ-agi-master-synthesis-2030/dependencies/:id', (req, res) => { const WRE63 = require('./data/wre-sentinel-impl-gsib-eval.json'); // Page route -app.get('/wre-sentinel-impl-gsib-eval', (req, res) => { +app.get('/wre-sentinel-impl-gsib-eval', (_req, res) => { res.sendFile(path.join(__dirname, 'public', 'wre-sentinel-impl-gsib-eval.html')); }); // Summary + meta endpoints -app.get('/api/wre-sentinel-impl-gsib-eval/summary', (req, res) => res.json({ +app.get('/api/wre-sentinel-impl-gsib-eval/summary', (_req, res) => res.json({ docRef: WRE63.docRef, version: WRE63.version, title: WRE63.title, @@ -25252,16 +25270,16 @@ app.get('/api/wre-sentinel-impl-gsib-eval/summary', (req, res) => res.json({ classification: WRE63.classification, counts: WRE63.counts, })); -app.get('/api/wre-sentinel-impl-gsib-eval/directive', (req, res) => res.json(WRE63.directive)); -app.get('/api/wre-sentinel-impl-gsib-eval/audiences', (req, res) => res.json(WRE63.audiences)); -app.get('/api/wre-sentinel-impl-gsib-eval/indices', (req, res) => res.json(WRE63.indices)); -app.get('/api/wre-sentinel-impl-gsib-eval/priorities', (req, res) => res.json(WRE63.priorities)); -app.get('/api/wre-sentinel-impl-gsib-eval/investment', (req, res) => res.json(WRE63.investment)); -app.get('/api/wre-sentinel-impl-gsib-eval/counts', (req, res) => res.json(WRE63.counts)); -app.get('/api/wre-sentinel-impl-gsib-eval/executive-summary', (req, res) => res.json(WRE63.executiveSummary)); +app.get('/api/wre-sentinel-impl-gsib-eval/directive', (_req, res) => res.json(WRE63.directive)); +app.get('/api/wre-sentinel-impl-gsib-eval/audiences', (_req, res) => res.json(WRE63.audiences)); +app.get('/api/wre-sentinel-impl-gsib-eval/indices', (_req, res) => res.json(WRE63.indices)); +app.get('/api/wre-sentinel-impl-gsib-eval/priorities', (_req, res) => res.json(WRE63.priorities)); +app.get('/api/wre-sentinel-impl-gsib-eval/investment', (_req, res) => res.json(WRE63.investment)); +app.get('/api/wre-sentinel-impl-gsib-eval/counts', (_req, res) => res.json(WRE63.counts)); +app.get('/api/wre-sentinel-impl-gsib-eval/executive-summary', (_req, res) => res.json(WRE63.executiveSummary)); // Modules -app.get('/api/wre-sentinel-impl-gsib-eval/modules', (req, res) => res.json(WRE63.modules)); +app.get('/api/wre-sentinel-impl-gsib-eval/modules', (_req, res) => res.json(WRE63.modules)); app.get('/api/wre-sentinel-impl-gsib-eval/modules/:id', (req, res) => { const m = WRE63.modules.find(x => x.mid === req.params.id); if (!m) return res.status(404).json({ error: 'module not found', id: req.params.id }); @@ -25269,7 +25287,7 @@ app.get('/api/wre-sentinel-impl-gsib-eval/modules/:id', (req, res) => { }); // WRE services (M1) -app.get('/api/wre-sentinel-impl-gsib-eval/wre-services', (req, res) => res.json(WRE63.wreServices)); +app.get('/api/wre-sentinel-impl-gsib-eval/wre-services', (_req, res) => res.json(WRE63.wreServices)); app.get('/api/wre-sentinel-impl-gsib-eval/wre-services/:id', (req, res) => { const s = WRE63.wreServices.find(x => x.svcid === req.params.id); if (!s) return res.status(404).json({ error: 'wre service not found', id: req.params.id }); @@ -25277,7 +25295,7 @@ app.get('/api/wre-sentinel-impl-gsib-eval/wre-services/:id', (req, res) => { }); // Sentinel services (M3) -app.get('/api/wre-sentinel-impl-gsib-eval/sentinel-services', (req, res) => res.json(WRE63.sentinelServices)); +app.get('/api/wre-sentinel-impl-gsib-eval/sentinel-services', (_req, res) => res.json(WRE63.sentinelServices)); app.get('/api/wre-sentinel-impl-gsib-eval/sentinel-services/:id', (req, res) => { const s = WRE63.sentinelServices.find(x => x.svcid === req.params.id); if (!s) return res.status(404).json({ error: 'sentinel service not found', id: req.params.id }); @@ -25285,7 +25303,7 @@ app.get('/api/wre-sentinel-impl-gsib-eval/sentinel-services/:id', (req, res) => }); // Data models (M2/M4) -app.get('/api/wre-sentinel-impl-gsib-eval/data-models', (req, res) => res.json(WRE63.dataModels)); +app.get('/api/wre-sentinel-impl-gsib-eval/data-models', (_req, res) => res.json(WRE63.dataModels)); app.get('/api/wre-sentinel-impl-gsib-eval/data-models/:id', (req, res) => { const d = WRE63.dataModels.find(x => x.dmid === req.params.id); if (!d) return res.status(404).json({ error: 'data model not found', id: req.params.id }); @@ -25293,7 +25311,7 @@ app.get('/api/wre-sentinel-impl-gsib-eval/data-models/:id', (req, res) => { }); // API endpoints (M4) -app.get('/api/wre-sentinel-impl-gsib-eval/api-endpoints', (req, res) => res.json(WRE63.apiEndpoints)); +app.get('/api/wre-sentinel-impl-gsib-eval/api-endpoints', (_req, res) => res.json(WRE63.apiEndpoints)); app.get('/api/wre-sentinel-impl-gsib-eval/api-endpoints/:id', (req, res) => { const e = WRE63.apiEndpoints.find(x => x.epid === req.params.id); if (!e) return res.status(404).json({ error: 'api endpoint not found', id: req.params.id }); @@ -25301,7 +25319,7 @@ app.get('/api/wre-sentinel-impl-gsib-eval/api-endpoints/:id', (req, res) => { }); // Prioritized implementation plan items P0-P3 (M5) -app.get('/api/wre-sentinel-impl-gsib-eval/impl-plan-items', (req, res) => res.json(WRE63.implPlanItems)); +app.get('/api/wre-sentinel-impl-gsib-eval/impl-plan-items', (_req, res) => res.json(WRE63.implPlanItems)); app.get('/api/wre-sentinel-impl-gsib-eval/impl-plan-items/:id', (req, res) => { const p = WRE63.implPlanItems.find(x => x.piid === req.params.id); if (!p) return res.status(404).json({ error: 'impl plan item not found', id: req.params.id }); @@ -25309,7 +25327,7 @@ app.get('/api/wre-sentinel-impl-gsib-eval/impl-plan-items/:id', (req, res) => { }); // G-SIB 2026-2030 roadmap phases (M6) -app.get('/api/wre-sentinel-impl-gsib-eval/roadmap-phases', (req, res) => res.json(WRE63.roadmapPhases)); +app.get('/api/wre-sentinel-impl-gsib-eval/roadmap-phases', (_req, res) => res.json(WRE63.roadmapPhases)); app.get('/api/wre-sentinel-impl-gsib-eval/roadmap-phases/:id', (req, res) => { const r = WRE63.roadmapPhases.find(x => x.rid === req.params.id); if (!r) return res.status(404).json({ error: 'roadmap phase not found', id: req.params.id }); @@ -25317,7 +25335,7 @@ app.get('/api/wre-sentinel-impl-gsib-eval/roadmap-phases/:id', (req, res) => { }); // Executive critical evaluation (M7) -app.get('/api/wre-sentinel-impl-gsib-eval/evaluation', (req, res) => res.json(WRE63.evaluation)); +app.get('/api/wre-sentinel-impl-gsib-eval/evaluation', (_req, res) => res.json(WRE63.evaluation)); app.get('/api/wre-sentinel-impl-gsib-eval/evaluation/:id', (req, res) => { const ev = WRE63.evaluation.find(x => x.evid === req.params.id); if (!ev) return res.status(404).json({ error: 'evaluation entry not found', id: req.params.id }); @@ -25325,7 +25343,7 @@ app.get('/api/wre-sentinel-impl-gsib-eval/evaluation/:id', (req, res) => { }); // Report sections (M8) — /<abstract>/<content> -app.get('/api/wre-sentinel-impl-gsib-eval/report-sections', (req, res) => res.json(WRE63.reportSections)); +app.get('/api/wre-sentinel-impl-gsib-eval/report-sections', (_req, res) => res.json(WRE63.reportSections)); app.get('/api/wre-sentinel-impl-gsib-eval/report-sections/:id', (req, res) => { const rs = WRE63.reportSections.find(x => x.rsid === req.params.id); if (!rs) return res.status(404).json({ error: 'report section not found', id: req.params.id }); @@ -25333,20 +25351,20 @@ app.get('/api/wre-sentinel-impl-gsib-eval/report-sections/:id', (req, res) => { }); // Standard artifact endpoints -app.get('/api/wre-sentinel-impl-gsib-eval/schemas', (req, res) => res.json(WRE63.schemas)); -app.get('/api/wre-sentinel-impl-gsib-eval/code', (req, res) => res.json(WRE63.code)); -app.get('/api/wre-sentinel-impl-gsib-eval/kpis', (req, res) => res.json(WRE63.kpis)); -app.get('/api/wre-sentinel-impl-gsib-eval/risk-control-matrix', (req, res) => res.json(WRE63.riskControlMatrix)); -app.get('/api/wre-sentinel-impl-gsib-eval/traceability', (req, res) => res.json(WRE63.traceability)); -app.get('/api/wre-sentinel-impl-gsib-eval/data-flows', (req, res) => res.json(WRE63.dataFlows)); -app.get('/api/wre-sentinel-impl-gsib-eval/regulators', (req, res) => res.json(WRE63.regulators)); +app.get('/api/wre-sentinel-impl-gsib-eval/schemas', (_req, res) => res.json(WRE63.schemas)); +app.get('/api/wre-sentinel-impl-gsib-eval/code', (_req, res) => res.json(WRE63.code)); +app.get('/api/wre-sentinel-impl-gsib-eval/kpis', (_req, res) => res.json(WRE63.kpis)); +app.get('/api/wre-sentinel-impl-gsib-eval/risk-control-matrix', (_req, res) => res.json(WRE63.riskControlMatrix)); +app.get('/api/wre-sentinel-impl-gsib-eval/traceability', (_req, res) => res.json(WRE63.traceability)); +app.get('/api/wre-sentinel-impl-gsib-eval/data-flows', (_req, res) => res.json(WRE63.dataFlows)); +app.get('/api/wre-sentinel-impl-gsib-eval/regulators', (_req, res) => res.json(WRE63.regulators)); app.get('/api/wre-sentinel-impl-gsib-eval/regulators/:name', (req, res) => { const r = WRE63.regulators.find(x => x.name.toLowerCase() === decodeURIComponent(req.params.name).toLowerCase()); if (!r) return res.status(404).json({ error: 'regulator not found', name: req.params.name }); res.json(r); }); -app.get('/api/wre-sentinel-impl-gsib-eval/rollout-90', (req, res) => res.json(WRE63.rollout90)); -app.get('/api/wre-sentinel-impl-gsib-eval/evidence-pack', (req, res) => res.json(WRE63.evidencePack)); +app.get('/api/wre-sentinel-impl-gsib-eval/rollout-90', (_req, res) => res.json(WRE63.rollout90)); +app.get('/api/wre-sentinel-impl-gsib-eval/evidence-pack', (_req, res) => res.json(WRE63.evidencePack)); // ===================== END WP-063 ===================== @@ -25354,12 +25372,12 @@ app.get('/api/wre-sentinel-impl-gsib-eval/evidence-pack', (req, res) => res.json const GSIFI64 = require('./data/gsifi-agi-formal-gov-2030.json'); // Page route -app.get('/gsifi-agi-formal-gov-2030', (req, res) => { +app.get('/gsifi-agi-formal-gov-2030', (_req, res) => { res.sendFile(path.join(__dirname, 'public', 'gsifi-agi-formal-gov-2030.html')); }); // Summary + meta endpoints -app.get('/api/gsifi-agi-formal-gov-2030/summary', (req, res) => res.json({ +app.get('/api/gsifi-agi-formal-gov-2030/summary', (_req, res) => res.json({ docRef: GSIFI64.docRef, version: GSIFI64.version, title: GSIFI64.title, @@ -25370,17 +25388,17 @@ app.get('/api/gsifi-agi-formal-gov-2030/summary', (req, res) => res.json({ classification: GSIFI64.classification, counts: GSIFI64.counts, })); -app.get('/api/gsifi-agi-formal-gov-2030/directive', (req, res) => res.json(GSIFI64.directive)); -app.get('/api/gsifi-agi-formal-gov-2030/audiences', (req, res) => res.json(GSIFI64.audiences)); -app.get('/api/gsifi-agi-formal-gov-2030/indices', (req, res) => res.json(GSIFI64.indices)); -app.get('/api/gsifi-agi-formal-gov-2030/tiers', (req, res) => res.json(GSIFI64.tiers)); -app.get('/api/gsifi-agi-formal-gov-2030/severities', (req, res) => res.json(GSIFI64.severities)); -app.get('/api/gsifi-agi-formal-gov-2030/investment', (req, res) => res.json(GSIFI64.investment)); -app.get('/api/gsifi-agi-formal-gov-2030/counts', (req, res) => res.json(GSIFI64.counts)); -app.get('/api/gsifi-agi-formal-gov-2030/executive-summary', (req, res) => res.json(GSIFI64.executiveSummary)); +app.get('/api/gsifi-agi-formal-gov-2030/directive', (_req, res) => res.json(GSIFI64.directive)); +app.get('/api/gsifi-agi-formal-gov-2030/audiences', (_req, res) => res.json(GSIFI64.audiences)); +app.get('/api/gsifi-agi-formal-gov-2030/indices', (_req, res) => res.json(GSIFI64.indices)); +app.get('/api/gsifi-agi-formal-gov-2030/tiers', (_req, res) => res.json(GSIFI64.tiers)); +app.get('/api/gsifi-agi-formal-gov-2030/severities', (_req, res) => res.json(GSIFI64.severities)); +app.get('/api/gsifi-agi-formal-gov-2030/investment', (_req, res) => res.json(GSIFI64.investment)); +app.get('/api/gsifi-agi-formal-gov-2030/counts', (_req, res) => res.json(GSIFI64.counts)); +app.get('/api/gsifi-agi-formal-gov-2030/executive-summary', (_req, res) => res.json(GSIFI64.executiveSummary)); // Modules -app.get('/api/gsifi-agi-formal-gov-2030/modules', (req, res) => res.json(GSIFI64.modules)); +app.get('/api/gsifi-agi-formal-gov-2030/modules', (_req, res) => res.json(GSIFI64.modules)); app.get('/api/gsifi-agi-formal-gov-2030/modules/:id', (req, res) => { const m = GSIFI64.modules.find(x => x.mid === req.params.id); if (!m) return res.status(404).json({ error: 'module not found', id: req.params.id }); @@ -25388,7 +25406,7 @@ app.get('/api/gsifi-agi-formal-gov-2030/modules/:id', (req, res) => { }); // BBOM components (M1) -app.get('/api/gsifi-agi-formal-gov-2030/bbom-components', (req, res) => res.json(GSIFI64.bbomComponents)); +app.get('/api/gsifi-agi-formal-gov-2030/bbom-components', (_req, res) => res.json(GSIFI64.bbomComponents)); app.get('/api/gsifi-agi-formal-gov-2030/bbom-components/:id', (req, res) => { const b = GSIFI64.bbomComponents.find(x => x.bcid === req.params.id); if (!b) return res.status(404).json({ error: 'bbom component not found', id: req.params.id }); @@ -25396,7 +25414,7 @@ app.get('/api/gsifi-agi-formal-gov-2030/bbom-components/:id', (req, res) => { }); // Meta-invariants — TLA+/Coq/Q# (M2) -app.get('/api/gsifi-agi-formal-gov-2030/meta-invariants', (req, res) => res.json(GSIFI64.metaInvariants)); +app.get('/api/gsifi-agi-formal-gov-2030/meta-invariants', (_req, res) => res.json(GSIFI64.metaInvariants)); app.get('/api/gsifi-agi-formal-gov-2030/meta-invariants/:id', (req, res) => { const mi = GSIFI64.metaInvariants.find(x => x.miid === req.params.id); if (!mi) return res.status(404).json({ error: 'meta-invariant not found', id: req.params.id }); @@ -25404,7 +25422,7 @@ app.get('/api/gsifi-agi-formal-gov-2030/meta-invariants/:id', (req, res) => { }); // CAS-SPP containment stages (M3) -app.get('/api/gsifi-agi-formal-gov-2030/containment-stages', (req, res) => res.json(GSIFI64.containmentStages)); +app.get('/api/gsifi-agi-formal-gov-2030/containment-stages', (_req, res) => res.json(GSIFI64.containmentStages)); app.get('/api/gsifi-agi-formal-gov-2030/containment-stages/:id', (req, res) => { const c = GSIFI64.containmentStages.find(x => x.csid === req.params.id); if (!c) return res.status(404).json({ error: 'containment stage not found', id: req.params.id }); @@ -25412,7 +25430,7 @@ app.get('/api/gsifi-agi-formal-gov-2030/containment-stages/:id', (req, res) => { }); // Bayesian Belief Network nodes (M3) -app.get('/api/gsifi-agi-formal-gov-2030/bbn-nodes', (req, res) => res.json(GSIFI64.bbnNodes)); +app.get('/api/gsifi-agi-formal-gov-2030/bbn-nodes', (_req, res) => res.json(GSIFI64.bbnNodes)); app.get('/api/gsifi-agi-formal-gov-2030/bbn-nodes/:id', (req, res) => { const n = GSIFI64.bbnNodes.find(x => x.bnid === req.params.id); if (!n) return res.status(404).json({ error: 'bbn node not found', id: req.params.id }); @@ -25420,7 +25438,7 @@ app.get('/api/gsifi-agi-formal-gov-2030/bbn-nodes/:id', (req, res) => { }); // zk-SNARK compliance proofs (M4) -app.get('/api/gsifi-agi-formal-gov-2030/reg-compliance-proofs', (req, res) => res.json(GSIFI64.regComplianceProofs)); +app.get('/api/gsifi-agi-formal-gov-2030/reg-compliance-proofs', (_req, res) => res.json(GSIFI64.regComplianceProofs)); app.get('/api/gsifi-agi-formal-gov-2030/reg-compliance-proofs/:id', (req, res) => { const p = GSIFI64.regComplianceProofs.find(x => x.rpid === req.params.id); if (!p) return res.status(404).json({ error: 'compliance proof not found', id: req.params.id }); @@ -25428,7 +25446,7 @@ app.get('/api/gsifi-agi-formal-gov-2030/reg-compliance-proofs/:id', (req, res) = }); // Report sections (M8) — <title>/<abstract>/<content> -app.get('/api/gsifi-agi-formal-gov-2030/report-sections', (req, res) => res.json(GSIFI64.reportSections)); +app.get('/api/gsifi-agi-formal-gov-2030/report-sections', (_req, res) => res.json(GSIFI64.reportSections)); app.get('/api/gsifi-agi-formal-gov-2030/report-sections/:id', (req, res) => { const rs = GSIFI64.reportSections.find(x => x.rsid === req.params.id); if (!rs) return res.status(404).json({ error: 'report section not found', id: req.params.id }); @@ -25436,20 +25454,20 @@ app.get('/api/gsifi-agi-formal-gov-2030/report-sections/:id', (req, res) => { }); // Standard artifact endpoints -app.get('/api/gsifi-agi-formal-gov-2030/schemas', (req, res) => res.json(GSIFI64.schemas)); -app.get('/api/gsifi-agi-formal-gov-2030/code', (req, res) => res.json(GSIFI64.code)); -app.get('/api/gsifi-agi-formal-gov-2030/kpis', (req, res) => res.json(GSIFI64.kpis)); -app.get('/api/gsifi-agi-formal-gov-2030/risk-control-matrix', (req, res) => res.json(GSIFI64.riskControlMatrix)); -app.get('/api/gsifi-agi-formal-gov-2030/traceability', (req, res) => res.json(GSIFI64.traceability)); -app.get('/api/gsifi-agi-formal-gov-2030/data-flows', (req, res) => res.json(GSIFI64.dataFlows)); -app.get('/api/gsifi-agi-formal-gov-2030/regulators', (req, res) => res.json(GSIFI64.regulators)); +app.get('/api/gsifi-agi-formal-gov-2030/schemas', (_req, res) => res.json(GSIFI64.schemas)); +app.get('/api/gsifi-agi-formal-gov-2030/code', (_req, res) => res.json(GSIFI64.code)); +app.get('/api/gsifi-agi-formal-gov-2030/kpis', (_req, res) => res.json(GSIFI64.kpis)); +app.get('/api/gsifi-agi-formal-gov-2030/risk-control-matrix', (_req, res) => res.json(GSIFI64.riskControlMatrix)); +app.get('/api/gsifi-agi-formal-gov-2030/traceability', (_req, res) => res.json(GSIFI64.traceability)); +app.get('/api/gsifi-agi-formal-gov-2030/data-flows', (_req, res) => res.json(GSIFI64.dataFlows)); +app.get('/api/gsifi-agi-formal-gov-2030/regulators', (_req, res) => res.json(GSIFI64.regulators)); app.get('/api/gsifi-agi-formal-gov-2030/regulators/:name', (req, res) => { const r = GSIFI64.regulators.find(x => x.name.toLowerCase() === decodeURIComponent(req.params.name).toLowerCase()); if (!r) return res.status(404).json({ error: 'regulator not found', name: req.params.name }); res.json(r); }); -app.get('/api/gsifi-agi-formal-gov-2030/rollout-90', (req, res) => res.json(GSIFI64.rollout90)); -app.get('/api/gsifi-agi-formal-gov-2030/evidence-pack', (req, res) => res.json(GSIFI64.evidencePack)); +app.get('/api/gsifi-agi-formal-gov-2030/rollout-90', (_req, res) => res.json(GSIFI64.rollout90)); +app.get('/api/gsifi-agi-formal-gov-2030/evidence-pack', (_req, res) => res.json(GSIFI64.evidencePack)); // ===================== END WP-064 ===================== @@ -25457,12 +25475,12 @@ app.get('/api/gsifi-agi-formal-gov-2030/evidence-pack', (req, res) => res.json(G const SGS65 = require('./data/sentinel-gstack-gsifi-2030.json'); // Page route -app.get('/sentinel-gstack-gsifi-2030', (req, res) => { +app.get('/sentinel-gstack-gsifi-2030', (_req, res) => { res.sendFile(path.join(__dirname, 'public', 'sentinel-gstack-gsifi-2030.html')); }); // Summary + meta endpoints -app.get('/api/sentinel-gstack-gsifi-2030/summary', (req, res) => res.json({ +app.get('/api/sentinel-gstack-gsifi-2030/summary', (_req, res) => res.json({ docRef: SGS65.docRef, version: SGS65.version, title: SGS65.title, @@ -25473,17 +25491,17 @@ app.get('/api/sentinel-gstack-gsifi-2030/summary', (req, res) => res.json({ classification: SGS65.classification, counts: SGS65.counts, })); -app.get('/api/sentinel-gstack-gsifi-2030/directive', (req, res) => res.json(SGS65.directive)); -app.get('/api/sentinel-gstack-gsifi-2030/audiences', (req, res) => res.json(SGS65.audiences)); -app.get('/api/sentinel-gstack-gsifi-2030/indices', (req, res) => res.json(SGS65.indices)); -app.get('/api/sentinel-gstack-gsifi-2030/tiers', (req, res) => res.json(SGS65.tiers)); -app.get('/api/sentinel-gstack-gsifi-2030/severities', (req, res) => res.json(SGS65.severities)); -app.get('/api/sentinel-gstack-gsifi-2030/investment', (req, res) => res.json(SGS65.investment)); -app.get('/api/sentinel-gstack-gsifi-2030/counts', (req, res) => res.json(SGS65.counts)); -app.get('/api/sentinel-gstack-gsifi-2030/executive-summary', (req, res) => res.json(SGS65.executiveSummary)); +app.get('/api/sentinel-gstack-gsifi-2030/directive', (_req, res) => res.json(SGS65.directive)); +app.get('/api/sentinel-gstack-gsifi-2030/audiences', (_req, res) => res.json(SGS65.audiences)); +app.get('/api/sentinel-gstack-gsifi-2030/indices', (_req, res) => res.json(SGS65.indices)); +app.get('/api/sentinel-gstack-gsifi-2030/tiers', (_req, res) => res.json(SGS65.tiers)); +app.get('/api/sentinel-gstack-gsifi-2030/severities', (_req, res) => res.json(SGS65.severities)); +app.get('/api/sentinel-gstack-gsifi-2030/investment', (_req, res) => res.json(SGS65.investment)); +app.get('/api/sentinel-gstack-gsifi-2030/counts', (_req, res) => res.json(SGS65.counts)); +app.get('/api/sentinel-gstack-gsifi-2030/executive-summary', (_req, res) => res.json(SGS65.executiveSummary)); // Modules -app.get('/api/sentinel-gstack-gsifi-2030/modules', (req, res) => res.json(SGS65.modules)); +app.get('/api/sentinel-gstack-gsifi-2030/modules', (_req, res) => res.json(SGS65.modules)); app.get('/api/sentinel-gstack-gsifi-2030/modules/:id', (req, res) => { const m = SGS65.modules.find(x => x.mid === req.params.id); if (!m) return res.status(404).json({ error: 'module not found', id: req.params.id }); @@ -25491,7 +25509,7 @@ app.get('/api/sentinel-gstack-gsifi-2030/modules/:id', (req, res) => { }); // Sentinel v2.4 components (M1) -app.get('/api/sentinel-gstack-gsifi-2030/sentinel-components', (req, res) => res.json(SGS65.sentinelComponents)); +app.get('/api/sentinel-gstack-gsifi-2030/sentinel-components', (_req, res) => res.json(SGS65.sentinelComponents)); app.get('/api/sentinel-gstack-gsifi-2030/sentinel-components/:id', (req, res) => { const c = SGS65.sentinelComponents.find(x => x.scid === req.params.id); if (!c) return res.status(404).json({ error: 'sentinel component not found', id: req.params.id }); @@ -25499,7 +25517,7 @@ app.get('/api/sentinel-gstack-gsifi-2030/sentinel-components/:id', (req, res) => }); // G-Stack layers (M4) — GAIRDS/GRI/CEE/NSNs/CESE/GROP/GHP/GSRM/GEA/Meta-Endgame -app.get('/api/sentinel-gstack-gsifi-2030/gstack-layers', (req, res) => res.json(SGS65.gstackLayers)); +app.get('/api/sentinel-gstack-gsifi-2030/gstack-layers', (_req, res) => res.json(SGS65.gstackLayers)); app.get('/api/sentinel-gstack-gsifi-2030/gstack-layers/:id', (req, res) => { const g = SGS65.gstackLayers.find(x => x.glid === req.params.id); if (!g) return res.status(404).json({ error: 'gstack layer not found', id: req.params.id }); @@ -25507,7 +25525,7 @@ app.get('/api/sentinel-gstack-gsifi-2030/gstack-layers/:id', (req, res) => { }); // Formal verification artifacts (M3) — TLA+/Coq/Rego/zk-SNARK -app.get('/api/sentinel-gstack-gsifi-2030/verification-artifacts', (req, res) => res.json(SGS65.verificationArtifacts)); +app.get('/api/sentinel-gstack-gsifi-2030/verification-artifacts', (_req, res) => res.json(SGS65.verificationArtifacts)); app.get('/api/sentinel-gstack-gsifi-2030/verification-artifacts/:id', (req, res) => { const v = SGS65.verificationArtifacts.find(x => x.vaid === req.params.id); if (!v) return res.status(404).json({ error: 'verification artifact not found', id: req.params.id }); @@ -25515,7 +25533,7 @@ app.get('/api/sentinel-gstack-gsifi-2030/verification-artifacts/:id', (req, res) }); // Failure-surface compendium (M5) -app.get('/api/sentinel-gstack-gsifi-2030/failure-surfaces', (req, res) => res.json(SGS65.failureSurfaces)); +app.get('/api/sentinel-gstack-gsifi-2030/failure-surfaces', (_req, res) => res.json(SGS65.failureSurfaces)); app.get('/api/sentinel-gstack-gsifi-2030/failure-surfaces/:id', (req, res) => { const f = SGS65.failureSurfaces.find(x => x.fsid === req.params.id); if (!f) return res.status(404).json({ error: 'failure surface not found', id: req.params.id }); @@ -25523,7 +25541,7 @@ app.get('/api/sentinel-gstack-gsifi-2030/failure-surfaces/:id', (req, res) => { }); // Jurisdiction-aware compliance (M7) -app.get('/api/sentinel-gstack-gsifi-2030/jurisdictions', (req, res) => res.json(SGS65.jurisdictions)); +app.get('/api/sentinel-gstack-gsifi-2030/jurisdictions', (_req, res) => res.json(SGS65.jurisdictions)); app.get('/api/sentinel-gstack-gsifi-2030/jurisdictions/:id', (req, res) => { const j = SGS65.jurisdictions.find(x => x.jrid === req.params.id); if (!j) return res.status(404).json({ error: 'jurisdiction not found', id: req.params.id }); @@ -25531,7 +25549,7 @@ app.get('/api/sentinel-gstack-gsifi-2030/jurisdictions/:id', (req, res) => { }); // Report sections (M8) — <title>/<abstract>/<content> -app.get('/api/sentinel-gstack-gsifi-2030/report-sections', (req, res) => res.json(SGS65.reportSections)); +app.get('/api/sentinel-gstack-gsifi-2030/report-sections', (_req, res) => res.json(SGS65.reportSections)); app.get('/api/sentinel-gstack-gsifi-2030/report-sections/:id', (req, res) => { const rs = SGS65.reportSections.find(x => x.rsid === req.params.id); if (!rs) return res.status(404).json({ error: 'report section not found', id: req.params.id }); @@ -25539,20 +25557,20 @@ app.get('/api/sentinel-gstack-gsifi-2030/report-sections/:id', (req, res) => { }); // Standard artifact endpoints -app.get('/api/sentinel-gstack-gsifi-2030/schemas', (req, res) => res.json(SGS65.schemas)); -app.get('/api/sentinel-gstack-gsifi-2030/code', (req, res) => res.json(SGS65.code)); -app.get('/api/sentinel-gstack-gsifi-2030/kpis', (req, res) => res.json(SGS65.kpis)); -app.get('/api/sentinel-gstack-gsifi-2030/risk-control-matrix', (req, res) => res.json(SGS65.riskControlMatrix)); -app.get('/api/sentinel-gstack-gsifi-2030/traceability', (req, res) => res.json(SGS65.traceability)); -app.get('/api/sentinel-gstack-gsifi-2030/data-flows', (req, res) => res.json(SGS65.dataFlows)); -app.get('/api/sentinel-gstack-gsifi-2030/regulators', (req, res) => res.json(SGS65.regulators)); +app.get('/api/sentinel-gstack-gsifi-2030/schemas', (_req, res) => res.json(SGS65.schemas)); +app.get('/api/sentinel-gstack-gsifi-2030/code', (_req, res) => res.json(SGS65.code)); +app.get('/api/sentinel-gstack-gsifi-2030/kpis', (_req, res) => res.json(SGS65.kpis)); +app.get('/api/sentinel-gstack-gsifi-2030/risk-control-matrix', (_req, res) => res.json(SGS65.riskControlMatrix)); +app.get('/api/sentinel-gstack-gsifi-2030/traceability', (_req, res) => res.json(SGS65.traceability)); +app.get('/api/sentinel-gstack-gsifi-2030/data-flows', (_req, res) => res.json(SGS65.dataFlows)); +app.get('/api/sentinel-gstack-gsifi-2030/regulators', (_req, res) => res.json(SGS65.regulators)); app.get('/api/sentinel-gstack-gsifi-2030/regulators/:name', (req, res) => { const r = SGS65.regulators.find(x => x.name.toLowerCase() === decodeURIComponent(req.params.name).toLowerCase()); if (!r) return res.status(404).json({ error: 'regulator not found', name: req.params.name }); res.json(r); }); -app.get('/api/sentinel-gstack-gsifi-2030/rollout-90', (req, res) => res.json(SGS65.rollout90)); -app.get('/api/sentinel-gstack-gsifi-2030/evidence-pack', (req, res) => res.json(SGS65.evidencePack)); +app.get('/api/sentinel-gstack-gsifi-2030/rollout-90', (_req, res) => res.json(SGS65.rollout90)); +app.get('/api/sentinel-gstack-gsifi-2030/evidence-pack', (_req, res) => res.json(SGS65.evidencePack)); // ===================== END WP-065 ===================== @@ -25560,12 +25578,12 @@ app.get('/api/sentinel-gstack-gsifi-2030/evidence-pack', (req, res) => res.json( const SIP66 = require('./data/sip-gsri-reddawn-2035.json'); // Page route -app.get('/sip-gsri-reddawn-2035', (req, res) => { +app.get('/sip-gsri-reddawn-2035', (_req, res) => { res.sendFile(path.join(__dirname, 'public', 'sip-gsri-reddawn-2035.html')); }); // Summary + meta endpoints -app.get('/api/sip-gsri-reddawn-2035/summary', (req, res) => res.json({ +app.get('/api/sip-gsri-reddawn-2035/summary', (_req, res) => res.json({ docRef: SIP66.docRef, version: SIP66.version, title: SIP66.title, @@ -25576,17 +25594,17 @@ app.get('/api/sip-gsri-reddawn-2035/summary', (req, res) => res.json({ classification: SIP66.classification, counts: SIP66.counts, })); -app.get('/api/sip-gsri-reddawn-2035/directive', (req, res) => res.json(SIP66.directive)); -app.get('/api/sip-gsri-reddawn-2035/audiences', (req, res) => res.json(SIP66.audiences)); -app.get('/api/sip-gsri-reddawn-2035/indices', (req, res) => res.json(SIP66.indices)); -app.get('/api/sip-gsri-reddawn-2035/tiers', (req, res) => res.json(SIP66.tiers)); -app.get('/api/sip-gsri-reddawn-2035/severities', (req, res) => res.json(SIP66.severities)); -app.get('/api/sip-gsri-reddawn-2035/investment', (req, res) => res.json(SIP66.investment)); -app.get('/api/sip-gsri-reddawn-2035/counts', (req, res) => res.json(SIP66.counts)); -app.get('/api/sip-gsri-reddawn-2035/executive-summary', (req, res) => res.json(SIP66.executiveSummary)); +app.get('/api/sip-gsri-reddawn-2035/directive', (_req, res) => res.json(SIP66.directive)); +app.get('/api/sip-gsri-reddawn-2035/audiences', (_req, res) => res.json(SIP66.audiences)); +app.get('/api/sip-gsri-reddawn-2035/indices', (_req, res) => res.json(SIP66.indices)); +app.get('/api/sip-gsri-reddawn-2035/tiers', (_req, res) => res.json(SIP66.tiers)); +app.get('/api/sip-gsri-reddawn-2035/severities', (_req, res) => res.json(SIP66.severities)); +app.get('/api/sip-gsri-reddawn-2035/investment', (_req, res) => res.json(SIP66.investment)); +app.get('/api/sip-gsri-reddawn-2035/counts', (_req, res) => res.json(SIP66.counts)); +app.get('/api/sip-gsri-reddawn-2035/executive-summary', (_req, res) => res.json(SIP66.executiveSummary)); // Modules -app.get('/api/sip-gsri-reddawn-2035/modules', (req, res) => res.json(SIP66.modules)); +app.get('/api/sip-gsri-reddawn-2035/modules', (_req, res) => res.json(SIP66.modules)); app.get('/api/sip-gsri-reddawn-2035/modules/:id', (req, res) => { const m = SIP66.modules.find(x => x.mid === req.params.id); if (!m) return res.status(404).json({ error: 'module not found', id: req.params.id }); @@ -25594,7 +25612,7 @@ app.get('/api/sip-gsri-reddawn-2035/modules/:id', (req, res) => { }); // SIP v2.4 phases (M1) -app.get('/api/sip-gsri-reddawn-2035/sip-phases', (req, res) => res.json(SIP66.sipPhases)); +app.get('/api/sip-gsri-reddawn-2035/sip-phases', (_req, res) => res.json(SIP66.sipPhases)); app.get('/api/sip-gsri-reddawn-2035/sip-phases/:id', (req, res) => { const p = SIP66.sipPhases.find(x => x.spid === req.params.id); if (!p) return res.status(404).json({ error: 'sip phase not found', id: req.params.id }); @@ -25602,7 +25620,7 @@ app.get('/api/sip-gsri-reddawn-2035/sip-phases/:id', (req, res) => { }); // G-SRI stress-test indices (M2) -app.get('/api/sip-gsri-reddawn-2035/gsri-indices', (req, res) => res.json(SIP66.gsriIndices)); +app.get('/api/sip-gsri-reddawn-2035/gsri-indices', (_req, res) => res.json(SIP66.gsriIndices)); app.get('/api/sip-gsri-reddawn-2035/gsri-indices/:id', (req, res) => { const g = SIP66.gsriIndices.find(x => x.giid === req.params.id); if (!g) return res.status(404).json({ error: 'gsri index not found', id: req.params.id }); @@ -25610,7 +25628,7 @@ app.get('/api/sip-gsri-reddawn-2035/gsri-indices/:id', (req, res) => { }); // Red Dawn crisis scenarios (M3) -app.get('/api/sip-gsri-reddawn-2035/red-dawn-scenarios', (req, res) => res.json(SIP66.redDawnScenarios)); +app.get('/api/sip-gsri-reddawn-2035/red-dawn-scenarios', (_req, res) => res.json(SIP66.redDawnScenarios)); app.get('/api/sip-gsri-reddawn-2035/red-dawn-scenarios/:id', (req, res) => { const r = SIP66.redDawnScenarios.find(x => x.rdid === req.params.id); if (!r) return res.status(404).json({ error: 'red dawn scenario not found', id: req.params.id }); @@ -25618,7 +25636,7 @@ app.get('/api/sip-gsri-reddawn-2035/red-dawn-scenarios/:id', (req, res) => { }); // Autonomous Supervisory Agents (M4) -app.get('/api/sip-gsri-reddawn-2035/supervisory-agents', (req, res) => res.json(SIP66.supervisoryAgents)); +app.get('/api/sip-gsri-reddawn-2035/supervisory-agents', (_req, res) => res.json(SIP66.supervisoryAgents)); app.get('/api/sip-gsri-reddawn-2035/supervisory-agents/:id', (req, res) => { const a = SIP66.supervisoryAgents.find(x => x.asaid === req.params.id); if (!a) return res.status(404).json({ error: 'supervisory agent not found', id: req.params.id }); @@ -25626,7 +25644,7 @@ app.get('/api/sip-gsri-reddawn-2035/supervisory-agents/:id', (req, res) => { }); // Article-level regulatory mappings (M5) -app.get('/api/sip-gsri-reddawn-2035/reg-article-mappings', (req, res) => res.json(SIP66.regArticleMappings)); +app.get('/api/sip-gsri-reddawn-2035/reg-article-mappings', (_req, res) => res.json(SIP66.regArticleMappings)); app.get('/api/sip-gsri-reddawn-2035/reg-article-mappings/:id', (req, res) => { const r = SIP66.regArticleMappings.find(x => x.raid === req.params.id); if (!r) return res.status(404).json({ error: 'reg article mapping not found', id: req.params.id }); @@ -25634,7 +25652,7 @@ app.get('/api/sip-gsri-reddawn-2035/reg-article-mappings/:id', (req, res) => { }); // Roadmap phases 2026-2035 (M7) -app.get('/api/sip-gsri-reddawn-2035/roadmap-phases', (req, res) => res.json(SIP66.roadmapPhases)); +app.get('/api/sip-gsri-reddawn-2035/roadmap-phases', (_req, res) => res.json(SIP66.roadmapPhases)); app.get('/api/sip-gsri-reddawn-2035/roadmap-phases/:id', (req, res) => { const r = SIP66.roadmapPhases.find(x => x.rpid === req.params.id); if (!r) return res.status(404).json({ error: 'roadmap phase not found', id: req.params.id }); @@ -25642,7 +25660,7 @@ app.get('/api/sip-gsri-reddawn-2035/roadmap-phases/:id', (req, res) => { }); // Report sections (M8) — <title>/<abstract>/<content> -app.get('/api/sip-gsri-reddawn-2035/report-sections', (req, res) => res.json(SIP66.reportSections)); +app.get('/api/sip-gsri-reddawn-2035/report-sections', (_req, res) => res.json(SIP66.reportSections)); app.get('/api/sip-gsri-reddawn-2035/report-sections/:id', (req, res) => { const rs = SIP66.reportSections.find(x => x.rsid === req.params.id); if (!rs) return res.status(404).json({ error: 'report section not found', id: req.params.id }); @@ -25650,20 +25668,20 @@ app.get('/api/sip-gsri-reddawn-2035/report-sections/:id', (req, res) => { }); // Standard artifact endpoints -app.get('/api/sip-gsri-reddawn-2035/schemas', (req, res) => res.json(SIP66.schemas)); -app.get('/api/sip-gsri-reddawn-2035/code', (req, res) => res.json(SIP66.code)); -app.get('/api/sip-gsri-reddawn-2035/kpis', (req, res) => res.json(SIP66.kpis)); -app.get('/api/sip-gsri-reddawn-2035/risk-control-matrix', (req, res) => res.json(SIP66.riskControlMatrix)); -app.get('/api/sip-gsri-reddawn-2035/traceability', (req, res) => res.json(SIP66.traceability)); -app.get('/api/sip-gsri-reddawn-2035/data-flows', (req, res) => res.json(SIP66.dataFlows)); -app.get('/api/sip-gsri-reddawn-2035/regulators', (req, res) => res.json(SIP66.regulators)); +app.get('/api/sip-gsri-reddawn-2035/schemas', (_req, res) => res.json(SIP66.schemas)); +app.get('/api/sip-gsri-reddawn-2035/code', (_req, res) => res.json(SIP66.code)); +app.get('/api/sip-gsri-reddawn-2035/kpis', (_req, res) => res.json(SIP66.kpis)); +app.get('/api/sip-gsri-reddawn-2035/risk-control-matrix', (_req, res) => res.json(SIP66.riskControlMatrix)); +app.get('/api/sip-gsri-reddawn-2035/traceability', (_req, res) => res.json(SIP66.traceability)); +app.get('/api/sip-gsri-reddawn-2035/data-flows', (_req, res) => res.json(SIP66.dataFlows)); +app.get('/api/sip-gsri-reddawn-2035/regulators', (_req, res) => res.json(SIP66.regulators)); app.get('/api/sip-gsri-reddawn-2035/regulators/:name', (req, res) => { const r = SIP66.regulators.find(x => x.name.toLowerCase() === decodeURIComponent(req.params.name).toLowerCase()); if (!r) return res.status(404).json({ error: 'regulator not found', name: req.params.name }); res.json(r); }); -app.get('/api/sip-gsri-reddawn-2035/rollout-90', (req, res) => res.json(SIP66.rollout90)); -app.get('/api/sip-gsri-reddawn-2035/evidence-pack', (req, res) => res.json(SIP66.evidencePack)); +app.get('/api/sip-gsri-reddawn-2035/rollout-90', (_req, res) => res.json(SIP66.rollout90)); +app.get('/api/sip-gsri-reddawn-2035/evidence-pack', (_req, res) => res.json(SIP66.evidencePack)); // ===================== END WP-066 ===================== diff --git a/requirements-governance-checks.txt b/requirements-governance-checks.txt index 5ca1631..74403ee 100644 --- a/requirements-governance-checks.txt +++ b/requirements-governance-checks.txt @@ -1,3 +1,4 @@ -pytest==8.3.5 -pyyaml==6.0.2 -jsonschema==4.23.0 +pyyaml +jsonschema +pytest +pytest-cov diff --git a/requirements-governance.txt b/requirements-governance.txt index ec38a0f..a2cc9c2 100644 --- a/requirements-governance.txt +++ b/requirements-governance.txt @@ -1 +1,3 @@ -jsonschema>=4.22,<5 +pyyaml==6.0.3 +jsonschema==4.25.1 +yamllint==1.37.1 diff --git a/unit_tests/test_workflow_yaml.py b/unit_tests/test_workflow_yaml.py index 265fbd1..1278dfb 100644 --- a/unit_tests/test_workflow_yaml.py +++ b/unit_tests/test_workflow_yaml.py @@ -18,7 +18,7 @@ # Root of the repository REPO_ROOT = Path(__file__).resolve().parents[1] -WORKFLOWS_DIR = REPO_ROOT / ".github" / "workflows" +WORKFLOWS_DIR = REPO_ROOT / ".github" / "workflows" / "samples" # All workflow files added/changed in the PR (only these are in scope) NEW_WORKFLOW_FILES = [