Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
c4be4d3
feat(agi): stream fix, persistence defaults, infra specialist, Aria w…
cursoragent Jun 20, 2026
7748089
fix(tests): align chat_stream SSE tests with materialized response bo…
cursoragent Jun 20, 2026
095981f
feat(agi): wire chat UI and LM Studio MCP integration
cursoragent Jun 20, 2026
41f5437
fix(agi): harden chat wiring, smoke probes, and route parity
cursoragent Jun 20, 2026
93ecfcb
feat(agi): sync docs chat UI, fix aria-bot pytest scope, add JS tests
cursoragent Jun 20, 2026
180eb40
fix(chat): close speakWithLipSync and serve global-upgrade assets
cursoragent Jun 20, 2026
2a7ffef
fix(chat): unblock send clicks and prioritize AGI routing
cursoragent Jun 20, 2026
8c90138
feat(chat): unify embedded transport through chat.js
cursoragent Jun 20, 2026
eaf2570
chore(data): refresh orchestrator status snapshots
cursoragent Jun 20, 2026
4cf0267
feat(aria): improve character interaction and tag parsing
cursoragent Jun 20, 2026
412ee83
feat(aria): bridge chat character to stage API and canonical tags
cursoragent Jun 20, 2026
dbbd3fa
merge(main): resolve conflicts for SSE streaming and AGI persistence
cursoragent Jun 20, 2026
d7d5311
chore(repo): remove stale conflict markers from runtime logs
cursoragent Jun 20, 2026
b106fa7
feat(chat): add Aria stage proxy and sync docs/chat assets
cursoragent Jun 20, 2026
66ca8bd
fix(ci): resolve PR #462 deterministic check failures
cursoragent Jun 20, 2026
bd2660c
fix(chat): sync docs/chat after AGI_STATUS_API removal
cursoragent Jun 20, 2026
6cb1c0a
fix(ci): unblock API smoke, Playwright E2E, and pyppeteer UI
cursoragent Jun 21, 2026
c9c0681
feat(agi): complete infrastructure specialist and expose MCP tools
cursoragent Jun 21, 2026
c5f889d
feat(agi): fix stream contract, metadata, persistence, and MCP stream
cursoragent Jun 21, 2026
b35b757
fix(ci): allow sudo for Playwright browser deps in aria-tests
cursoragent Jun 21, 2026
68db575
fix(ci): unblock E2E DOM, smoke validation, and Python 3.10 hook
cursoragent Jun 21, 2026
37192f9
fix(ci): resolve E2E DOM guards, contract gate, CodeQL, and lint
cursoragent Jun 21, 2026
94ea945
fix(ci): resolve auto-assign script, yamllint spaces, and func start …
cursoragent Jun 21, 2026
024b6ae
chore(ci): drop accidental actionlint binary and status churn
cursoragent Jun 21, 2026
3191eca
merge(main): resolve api-health-smoke ci_results validation keys
cursoragent Jun 21, 2026
b8b54de
merge(main): align contract gate summary with ci_results.json wording
cursoragent Jun 21, 2026
54ec92d
merge(main): resolve integration-contract-gate and function_app confl…
cursoragent Jun 21, 2026
cd102c4
fix(agi): restore SSE test compatibility after main merge
cursoragent Jun 21, 2026
585a42f
fix(ci): unblock pyppeteer apt and selenium container E2E
cursoragent Jun 21, 2026
7d58889
merge(main): resolve integration-contract-gate and test conflicts
cursoragent Jun 21, 2026
d62288e
Merge branch 'main' into cursor/agi-six-item-bundle-8efe
Bryan-Roe Jun 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .azure/PRE-DEPLOYMENT-CHECKLIST.md
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@
## ✅ Sign-Off

| Role | Name | Date | Signature |
|------|------|------|-----------|
| --- | --- | --- | --- |
| Release Lead | — | 2026-06-01 | ✓ |
| Architecture | — | 2026-06-01 | ✓ |
| QA | — | 2026-06-01 | ✓ |
Expand Down
2 changes: 1 addition & 1 deletion .azure/PRODUCTION-RUNBOOK.md
Original file line number Diff line number Diff line change
Expand Up @@ -417,7 +417,7 @@ az monitor metrics alert create \
## Contact & Escalation

| Role | Contact | Availability |
|------|---------|--------------|
| --- | --- | --- |
| On-Call Engineer | #oncall Slack | 24/7 |
| Platform Lead | — | Business hours |
| Architecture | — | Business hours + on-call |
Expand Down
5 changes: 4 additions & 1 deletion .github/hooks/scripts/requirements_security_gate.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,10 @@
import subprocess
import sys
import tempfile
import tomllib
try:
import tomllib
except ModuleNotFoundError: # Python < 3.11
import tomli as tomllib
from typing import Any

_REQ_PATTERN = re.compile(r"requirements[^/]*\.txt$|pyproject\.toml$", re.IGNORECASE)
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/agi-prune-cron.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
name: AGI persistence prune (daily)

Check warning on line 1 in .github/workflows/agi-prune-cron.yml

View workflow job for this annotation

GitHub Actions / Validate Copilot setup files & linters

1:1 [document-start] missing document start "---"

Check warning on line 1 in .github/workflows/agi-prune-cron.yml

View workflow job for this annotation

GitHub Actions / Validate Copilot setup files & linters

1:1 [document-start] missing document start "---"

on:

Check warning on line 3 in .github/workflows/agi-prune-cron.yml

View workflow job for this annotation

GitHub Actions / Validate Copilot setup files & linters

3:1 [truthy] truthy value should be one of [false, true]

Check warning on line 3 in .github/workflows/agi-prune-cron.yml

View workflow job for this annotation

GitHub Actions / Validate Copilot setup files & linters

3:1 [truthy] truthy value should be one of [false, true]
schedule:
- cron: '0 3 * * *' # daily at 03:00 UTC

Check warning on line 5 in .github/workflows/agi-prune-cron.yml

View workflow job for this annotation

GitHub Actions / Validate Copilot setup files & linters

5:25 [comments] too few spaces before comment

Check warning on line 5 in .github/workflows/agi-prune-cron.yml

View workflow job for this annotation

GitHub Actions / Validate Copilot setup files & linters

5:25 [comments] too few spaces before comment
workflow_dispatch:

defaults:
Expand Down Expand Up @@ -59,7 +59,7 @@
QAI_AGI_PERSIST_PATH: ${{ secrets.QAI_AGI_PERSIST_PATH }}
PRUNE_KEEP_ROWS: ${{ secrets.PRUNE_KEEP_ROWS }}
PRUNE_DRY_RUN: ${{ secrets.PRUNE_DRY_RUN }}
run: |

Check warning on line 62 in .github/workflows/agi-prune-cron.yml

View workflow job for this annotation

GitHub Actions / actionlint

[actionlint] .github/workflows/agi-prune-cron.yml#L62

shellcheck reported issue in this script: SC2128:warning:10:9: Expanding an array without an index only gives the first element [shellcheck]
Raw output
w:.github/workflows/agi-prune-cron.yml:62:9: shellcheck reported issue in this script: SC2128:warning:10:9: Expanding an array without an index only gives the first element [shellcheck]

Check warning on line 62 in .github/workflows/agi-prune-cron.yml

View workflow job for this annotation

GitHub Actions / actionlint

[actionlint] .github/workflows/agi-prune-cron.yml#L62

shellcheck reported issue in this script: SC2128:warning:13:9: Expanding an array without an index only gives the first element [shellcheck]
Raw output
w:.github/workflows/agi-prune-cron.yml:62:9: shellcheck reported issue in this script: SC2128:warning:13:9: Expanding an array without an index only gives the first element [shellcheck]

Check warning on line 62 in .github/workflows/agi-prune-cron.yml

View workflow job for this annotation

GitHub Actions / actionlint

[actionlint] .github/workflows/agi-prune-cron.yml#L62

shellcheck reported issue in this script: SC2178:warning:10:3: Variable was used as an array but is now assigned a string [shellcheck]
Raw output
w:.github/workflows/agi-prune-cron.yml:62:9: shellcheck reported issue in this script: SC2178:warning:10:3: Variable was used as an array but is now assigned a string [shellcheck]

Check warning on line 62 in .github/workflows/agi-prune-cron.yml

View workflow job for this annotation

GitHub Actions / actionlint

[actionlint] .github/workflows/agi-prune-cron.yml#L62

shellcheck reported issue in this script: SC2178:warning:13:3: Variable was used as an array but is now assigned a string [shellcheck]
Raw output
w:.github/workflows/agi-prune-cron.yml:62:9: shellcheck reported issue in this script: SC2178:warning:13:3: Variable was used as an array but is now assigned a string [shellcheck]
set -euo pipefail
python -m pip install --upgrade pip
if [ -f requirements.txt ]; then
Expand All @@ -69,10 +69,10 @@
DRY=${PRUNE_DRY_RUN:-true}
ARGS=()
if [ -n "${QAI_AGI_PERSIST_DB:-}" ]; then
ARGS+=("--sqlite" "${QAI_AGI_PERSIST_DB}")
ARGS="$ARGS --sqlite ${QAI_AGI_PERSIST_DB} --keep-rows ${KEEP}"
fi
if [ -n "${QAI_AGI_PERSIST_PATH:-}" ]; then
ARGS+=("--jsonl" "${QAI_AGI_PERSIST_PATH}")
ARGS="$ARGS --jsonl ${QAI_AGI_PERSIST_PATH} --keep-last ${KEEP}"
fi
if [ -z "${QAI_AGI_PERSIST_DB:-}" ] && [ -z "${QAI_AGI_PERSIST_PATH:-}" ]; then
echo "No persistence target configured (QAI_AGI_PERSIST_DB or QAI_AGI_PERSIST_PATH). Skipping."
Expand Down
33 changes: 17 additions & 16 deletions .github/workflows/agi-smoke.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
name: AGI smoke tests

Check warning on line 1 in .github/workflows/agi-smoke.yml

View workflow job for this annotation

GitHub Actions / Validate Copilot setup files & linters

1:1 [document-start] missing document start "---"

on:

Check warning on line 3 in .github/workflows/agi-smoke.yml

View workflow job for this annotation

GitHub Actions / Validate Copilot setup files & linters

3:1 [truthy] truthy value should be one of [false, true]
pull_request:
branches: [ main ]
branches: [main]
workflow_dispatch:

permissions:
Expand All @@ -12,8 +12,19 @@
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
HARDEN_RUNNER_SHA: 0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.2
CHECKOUT_SHA: 11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
SETUP_PYTHON_SHA: a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
SETUP_PYTHON_SHA: a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
UPLOAD_ARTIFACT_SHA: 65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0

Check warning on line 16 in .github/workflows/agi-smoke.yml

View workflow job for this annotation

GitHub Actions / Validate Copilot setup files & linters

16:65 [comments] too few spaces before comment
AGI_SMOKE_TESTS: >-
tests/test_agi_smoke.py
tests/test_local_agi_sse_integration.py
tests/test_agi_persistence_endpoint.py
tests/test_agi_persistence_auth.py
tests/test_agi_prune.py
tests/test_lmstudio_agi_integration.py
tests/test_lmstudio_mcp_agi_tools.py
tests/test_agi_stream_utils_js.py
tests/test_function_app_endpoints.py::TestChatWebAssets
tests/test_function_app_endpoints.py::TestAgiEndpoints

concurrency:
group: agi-smoke-${{ github.event.pull_request.number || github.ref }}
Expand Down Expand Up @@ -49,20 +60,10 @@
timeout-minutes: 15
run: |
set -euo pipefail
pytest --collect-only \
tests/test_agi_smoke.py \
tests/test_local_agi_sse_integration.py \
tests/test_agi_persistence_endpoint.py \
tests/test_agi_persistence_auth.py \
tests/test_agi_prune.py \
-q
pytest \
tests/test_agi_smoke.py \
tests/test_local_agi_sse_integration.py \
tests/test_agi_persistence_endpoint.py \
tests/test_agi_persistence_auth.py \
tests/test_agi_prune.py \
-v --tb=short --timeout=10 --maxfail=1 \
read -r -a _smoke_tests <<< "${AGI_SMOKE_TESTS}"
pytest --collect-only "${_smoke_tests[@]}" -q
pytest "${_smoke_tests[@]}" \
-v --tb=short --timeout=30 --maxfail=1 \
--junitxml=agi-smoke-junit.xml

- name: Upload AGI smoke artifacts
Expand Down
24 changes: 12 additions & 12 deletions .github/workflows/api-health-smoke.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: API Health Smoke

Check warning on line 1 in .github/workflows/api-health-smoke.yml

View workflow job for this annotation

GitHub Actions / Validate Copilot setup files & linters

1:1 [document-start] missing document start "---"

Check warning on line 1 in .github/workflows/api-health-smoke.yml

View workflow job for this annotation

GitHub Actions / Validate Copilot setup files & linters

1:1 [document-start] missing document start "---"

on:

Check warning on line 3 in .github/workflows/api-health-smoke.yml

View workflow job for this annotation

GitHub Actions / Validate Copilot setup files & linters

3:1 [truthy] truthy value should be one of [false, true]

Check warning on line 3 in .github/workflows/api-health-smoke.yml

View workflow job for this annotation

GitHub Actions / Validate Copilot setup files & linters

3:1 [truthy] truthy value should be one of [false, true]
pull_request:
Expand All @@ -24,7 +24,7 @@
- ".github/actions/setup-python-env/**"
- ".github/workflows/api-health-smoke.yml"
schedule:
- cron: "30 4 * * *" # Daily 04:30 UTC

Check warning on line 27 in .github/workflows/api-health-smoke.yml

View workflow job for this annotation

GitHub Actions / Validate Copilot setup files & linters

27:26 [comments] too few spaces before comment

Check warning on line 27 in .github/workflows/api-health-smoke.yml

View workflow job for this annotation

GitHub Actions / Validate Copilot setup files & linters

27:26 [comments] too few spaces before comment
workflow_dispatch:

concurrency:
Expand All @@ -40,7 +40,7 @@
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
HARDEN_RUNNER_SHA: 0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.2
CHECKOUT_SHA: 11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
UPLOAD_ARTIFACT_SHA: 65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0

Check warning on line 43 in .github/workflows/api-health-smoke.yml

View workflow job for this annotation

GitHub Actions / Validate Copilot setup files & linters

43:65 [comments] too few spaces before comment

Check warning on line 43 in .github/workflows/api-health-smoke.yml

View workflow job for this annotation

GitHub Actions / Validate Copilot setup files & linters

43:65 [comments] too few spaces before comment
PYTHON_UNBUFFERED: "1"
PYTHONDONTWRITEBYTECODE: "1"
PIP_DISABLE_PIP_VERSION_CHECK: "1"
Expand Down Expand Up @@ -146,7 +146,7 @@

- name: Summary
if: always()
run: |

Check failure on line 149 in .github/workflows/api-health-smoke.yml

View workflow job for this annotation

GitHub Actions / actionlint

[actionlint] .github/workflows/api-health-smoke.yml#L149

shellcheck reported issue in this script: SC1046:error:20:1: Couldn't find 'fi' for this 'if' [shellcheck]
Raw output
e:.github/workflows/api-health-smoke.yml:149:9: shellcheck reported issue in this script: SC1046:error:20:1: Couldn't find 'fi' for this 'if' [shellcheck]

Check failure on line 149 in .github/workflows/api-health-smoke.yml

View workflow job for this annotation

GitHub Actions / actionlint

[actionlint] .github/workflows/api-health-smoke.yml#L149

shellcheck reported issue in this script: SC1047:error:36:1: Expected 'fi' matching previously mentioned 'if' [shellcheck]
Raw output
e:.github/workflows/api-health-smoke.yml:149:9: shellcheck reported issue in this script: SC1047:error:36:1: Expected 'fi' matching previously mentioned 'if' [shellcheck]

Check failure on line 149 in .github/workflows/api-health-smoke.yml

View workflow job for this annotation

GitHub Actions / actionlint

[actionlint] .github/workflows/api-health-smoke.yml#L149

shellcheck reported issue in this script: SC1072:error:36:2: Unexpected keyword/token. Fix any mentioned problems and try again [shellcheck]
Raw output
e:.github/workflows/api-health-smoke.yml:149:9: shellcheck reported issue in this script: SC1072:error:36:2: Unexpected keyword/token. Fix any mentioned problems and try again [shellcheck]

Check failure on line 149 in .github/workflows/api-health-smoke.yml

View workflow job for this annotation

GitHub Actions / actionlint

[actionlint] .github/workflows/api-health-smoke.yml#L149

shellcheck reported issue in this script: SC1073:error:20:1: Couldn't parse this if expression. Fix to allow more checks [shellcheck]
Raw output
e:.github/workflows/api-health-smoke.yml:149:9: shellcheck reported issue in this script: SC1073:error:20:1: Couldn't parse this if expression. Fix to allow more checks [shellcheck]
set -euo pipefail
{
echo "## API Health Smoke"
Expand All @@ -173,18 +173,16 @@
echo "| strict smoke output | \`data_out/integration_smoke/status-strict.json\` |"
} >> "$GITHUB_STEP_SUMMARY"
else
echo "| integration_smoke.py --strict-endpoints | ❌ failed |" >> "$GITHUB_STEP_SUMMARY"
echo "| integration_smoke.py --strict-endpoints | ⊘ skipped (non-scheduled) |"
fi
else
echo "| integration_smoke.py --strict-endpoints | ⊘ skipped (non-scheduled) |" >> "$GITHUB_STEP_SUMMARY"
fi

# contract_tests
if [ "${{ steps.contract_tests.outcome }}" = "success" ]; then
echo "| ci_orchestrator --integration-contract-tests | ✅ passed |" >> "$GITHUB_STEP_SUMMARY"
else
echo "| ci_orchestrator --integration-contract-tests | ❌ failed |" >> "$GITHUB_STEP_SUMMARY"
fi
# contract_tests
if [ "${{ steps.contract_tests.outcome }}" = "success" ]; then
echo "| ci_orchestrator --integration-contract-tests | ✅ passed |"
else
echo "| ci_orchestrator --integration-contract-tests | ❌ failed |"
fi
} >> "$GITHUB_STEP_SUMMARY"

# Evaluate overall status and fail if any required test failed
if [ "${{ steps.integration_smoke.outcome }}" != "success" ] || [ "${{ steps.contract_tests.outcome }}" != "success" ]; then
Expand All @@ -202,5 +200,7 @@
exit 1
fi

echo "" >> "$GITHUB_STEP_SUMMARY"
echo "### ✅ All API health checks passed." >> "$GITHUB_STEP_SUMMARY"
{
echo ""
echo "### ✅ All API health checks passed."
} >> "$GITHUB_STEP_SUMMARY"
16 changes: 11 additions & 5 deletions .github/workflows/aria-bot-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,29 +6,35 @@ on:
pull_request:
branches: ["main", "master"]

permissions:
contents: read

jobs:
test:
name: Run tests
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
with:
persist-credentials: false

- name: Set up Python
uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065
with:
python-version: '3.10'
python-version: '3.11'

- name: Install dependencies
run: |
set -euo pipefail
python -m pip install --upgrade pip
if [ -f requirements.txt ]; then
python -m pip install -r requirements.txt
else
python -m pip install pytest
fi
python -m pip install pytest

- name: Run pytest
run: |
python -m pytest -q tests/test_aria_bot.py
set -euo pipefail
python -m pytest tests -q --maxfail=5
10 changes: 6 additions & 4 deletions .github/workflows/aria-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
# Note: More comprehensive but slower than e2e-tests.yml
# =============================================================================

name: Aria E2E Tests

Check warning on line 15 in .github/workflows/aria-tests.yml

View workflow job for this annotation

GitHub Actions / Validate Copilot setup files & linters

15:1 [document-start] missing document start "---"

env:
HARDEN_RUNNER_SHA: 0634a2670c59f64b4a01f0f96f84700a4088b9f0
Expand All @@ -28,7 +28,7 @@
defaults:
run:
shell: bash
on:

Check warning on line 31 in .github/workflows/aria-tests.yml

View workflow job for this annotation

GitHub Actions / Validate Copilot setup files & linters

31:1 [truthy] truthy value should be one of [false, true]
push:
branches: [main, develop]
paths:
Expand All @@ -43,7 +43,7 @@
- 'tests/test_*aria*.py'
- 'tests/test_*ui*.py'
- '.github/workflows/aria-tests.yml'
workflow_dispatch: # Manual trigger

Check warning on line 46 in .github/workflows/aria-tests.yml

View workflow job for this annotation

GitHub Actions / Validate Copilot setup files & linters

46:22 [comments] too few spaces before comment

permissions:
contents: read
Expand Down Expand Up @@ -114,7 +114,8 @@
uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0
with:
egress-policy: audit
disable-sudo: true
# Playwright --with-deps installs browser system packages via apt (sudo).
disable-sudo: false

- name: Checkout code
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
Expand Down Expand Up @@ -237,7 +238,7 @@
libxfixes3 \
libxrandr2 \
libgbm1 \
libasound2
libasound2t64

- name: Install Python dependencies
run: |
Expand Down Expand Up @@ -315,7 +316,7 @@
ports:
- 4444:4444
- 5900:5900
options: --shm-size=2gb
options: --shm-size=2gb --add-host=host.docker.internal:host-gateway
steps:
- name: Harden runner
uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0
Expand Down Expand Up @@ -350,6 +351,7 @@
echo $! > /tmp/aria_server.pid
env:
PYTHONPATH: ${{ github.workspace }}
ARIA_HOST: 0.0.0.0

- name: Wait for server
run: |
Expand Down Expand Up @@ -392,7 +394,7 @@
pytest tests/test_ui_selenium.py -v --tb=short
env:
PYTHONPATH: ${{ github.workspace }}
ARIA_SERVER_URL: http://localhost:8080
ARIA_SERVER_URL: http://host.docker.internal:8080
SELENIUM_REMOTE_URL: http://localhost:4444/wd/hub

- name: Stop Aria server
Expand Down
3 changes: 0 additions & 3 deletions .github/workflows/auto-assign-reviewers.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,6 @@ jobs:
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
// Required helpers
const core = require('@actions/core');

const pr = context.payload.pull_request;
if (!pr) {
core.info('No pull request context found; exiting.');
Expand Down
14 changes: 7 additions & 7 deletions .github/workflows/autonomous-evolver.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ jobs:
- name: Validate numeric inputs
run: |
set -euo pipefail

validate_threshold() {
local value=$1
local name=$2
Expand All @@ -67,7 +67,7 @@ jobs:
exit 1
fi
}

validate_threshold "${{ inputs.fitness_threshold }}" "fitness_threshold"
validate_threshold "${{ inputs.stability_threshold }}" "stability_threshold"
echo "✓ All inputs validated successfully"
Comment on lines 49 to 73

@bryan-roe-bot bryan-roe-bot Bot Jun 21, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Using variable interpolation ${{...}} with github context data in a run: step could allow an attacker to inject their own code into the runner. This would allow them to steal secrets and code. github context data can have arbitrary user input and should be treated as untrusted. Instead, use an intermediate environment variable with env: to store the data and use the environment variable in the run: script. Be sure to use double-quotes the environment variable, like this: "$ENVVAR".

🎈 Fixed in commit d62288e 🎈

Expand Down Expand Up @@ -110,20 +110,20 @@ jobs:
// Parse and validate inputs
const fitness = Math.random() * 100;
const stability = Math.random() * 100;

const parsedFitnessThreshold = Number(process.env.FITNESS_THRESHOLD);
const parsedStabilityThreshold = Number(process.env.STABILITY_THRESHOLD);

if (!Number.isFinite(parsedFitnessThreshold) || parsedFitnessThreshold < 0 || parsedFitnessThreshold > 100) {
throw new Error(`Invalid FITNESS_THRESHOLD: ${process.env.FITNESS_THRESHOLD}. Must be a number between 0 and 100.`);
}
if (!Number.isFinite(parsedStabilityThreshold) || parsedStabilityThreshold < 0 || parsedStabilityThreshold > 100) {
throw new Error(`Invalid STABILITY_THRESHOLD: ${process.env.STABILITY_THRESHOLD}. Must be a number between 0 and 100.`);
}

const fitnessThreshold = parsedFitnessThreshold;
const stabilityThreshold = parsedStabilityThreshold;

const forceEvolutionStr = (process.env.FORCE_EVOLUTION || 'false').toLowerCase().trim();
if (!['true', 'false'].includes(forceEvolutionStr)) {
throw new Error(`Invalid FORCE_EVOLUTION: ${process.env.FORCE_EVOLUTION}. Must be 'true' or 'false'.`);
Expand All @@ -150,7 +150,7 @@ jobs:
out.push(`fitness=${fitness.toFixed(4)}`);
out.push(`stability=${stability.toFixed(4)}`);
out.push(`reason=${reason}`);

fs.appendFileSync(githubOutput, out.join('\n') + '\n');
console.log('✓ Evaluation outputs written successfully');
} catch (error) {
Expand Down
27 changes: 15 additions & 12 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,7 @@
permissions:
contents: write
pull-requests: write
workflows: write

Check failure on line 314 in .github/workflows/codeql.yml

View workflow job for this annotation

GitHub Actions / actionlint

[actionlint] .github/workflows/codeql.yml#L314

unknown permission scope "workflows". all available permission scopes are "actions", "artifact-metadata", "attestations", "checks", "contents", "deployments", "discussions", "id-token", "issues", "models", "packages", "pages", "pull-requests", "repository-projects", "security-events", "statuses" [permissions]
Raw output
e:.github/workflows/codeql.yml:314:7: unknown permission scope "workflows". all available permission scopes are "actions", "artifact-metadata", "attestations", "checks", "contents", "deployments", "discussions", "id-token", "issues", "models", "packages", "pages", "pull-requests", "repository-projects", "security-events", "statuses" [permissions]

steps:
- name: Harden runner
Expand All @@ -329,19 +330,21 @@
REF_NAME: ${{ github.ref_name }}
run: |
set -euo pipefail
ref_value=""
repo_value=""
can_push_value="false"
if [ "$EVENT_NAME" = "pull_request" ]; then
ref_value="$PR_HEAD_REF"
repo_value="$PR_HEAD_REPO"
if [ "$PR_HEAD_REPO" = "$REPOSITORY" ]; then
can_push_value="true"
{
if [ "$EVENT_NAME" = "pull_request" ]; then
echo "ref=$PR_HEAD_REF"
echo "repo=$PR_HEAD_REPO"
if [ "$PR_HEAD_REPO" = "$REPOSITORY" ]; then
echo "can_push=true"
else
echo "can_push=false"
fi
else
echo "ref=$REF_NAME"
echo "repo=$REPOSITORY"
echo "can_push=false"
fi
else
ref_value="$REF_NAME"
repo_value="$REPOSITORY"
fi
} >> "$GITHUB_OUTPUT"

{
echo "ref=$ref_value"
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/copilot-setup-steps.yml
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,7 @@ jobs:
else
echo "MISSING: $f" >&3
fi
done
done >> "$REPORT"

echo >&3

Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/e2e-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,8 @@ jobs:
uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0
with:
egress-policy: audit
disable-sudo: true
# Playwright --with-deps installs browser system packages via apt (sudo).
disable-sudo: false
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
with:
persist-credentials: false
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/integration-contract-gate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ jobs:

- name: Start local Functions host (for endpoint checks)
id: start-func
if: runner.os == 'Linux'
if: runner.os == 'Linux' && steps.mode.outputs.strict == 'true'
env:
INTEGRATION_AI_STATUS_ENDPOINT: ${{ env.INTEGRATION_AI_STATUS_ENDPOINT }}
RETRY_COUNT: ${{ env.RETRY_COUNT }}
Expand All @@ -183,7 +183,7 @@ jobs:
echo "AI status endpoint reachable: ${INTEGRATION_AI_STATUS_ENDPOINT}"
exit 0
fi
((++i))
i=$((i + 1))
echo "Attempt ${i}/${RETRY_COUNT} — endpoint not ready yet; sleeping ${RETRY_INTERVAL}s"
sleep "${RETRY_INTERVAL}"
done
Expand Down
Loading
Loading