Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
94a54f0
Add fail-closed registered application evidence runner without modify…
devnet82 Oct 30, 2026
d9933dc
Test registered QA gate failure conditions
devnet82 Oct 30, 2026
c875325
Replace broken missing-extension workflow with fail-closed registered…
devnet82 Oct 30, 2026
f0c449e
Harden registered candidate receipt verification and require actual G…
devnet82 Oct 30, 2026
f79f133
Restore signed candidate/receipt attestations and separate verificati…
devnet82 Oct 30, 2026
2a2aada
Add candidate-bound GitHub→VM→host trusted evidence acceptance coordi…
devnet82 Oct 30, 2026
6f51eee
Add negative/positive tests for signed exact-candidate GitHub VM host…
devnet82 Oct 30, 2026
f98ac1d
Run complete new acceptance coordinator regression suite on GitHub fi…
devnet82 Oct 30, 2026
3541546
Bind every signed VM/host PASS to an independently hashed execution log
devnet82 Oct 30, 2026
fb393ff
Test per-check evidence hashes and tamper rejection for signed stages
devnet82 Oct 30, 2026
fb6b2da
Run acceptance-coordinator security regression tests on draft PR commits
devnet82 Oct 30, 2026
4fa5897
Require independently signed operator-approved complete checklist bef…
devnet82 Oct 30, 2026
0398d1d
Test independent signed operator checklist and block scope tampering
devnet82 Oct 30, 2026
89cb70b
Cover Ed25519 signature failure in scope-tamper regression assertions
devnet82 Oct 30, 2026
8b0e42d
Document strict protected stage-signature contract, real missing exec…
devnet82 Oct 30, 2026
f89d462
Repair application GitHub workflow missing signature-test dependency;…
devnet82 Oct 30, 2026
9b373ed
Record verified 21-test GitHub CI result and expected unregistered-ca…
devnet82 Oct 30, 2026
5a8ea8a
Register exact archived v0.6.132 draft asset for GitHub-first limited…
devnet82 Oct 30, 2026
bf9bb09
Add exact-candidate read-only GitHub archive integrity and static sou…
devnet82 Oct 30, 2026
9f63d5a
Run GitHub first against original pinned v0.6.132 draft ZIP and verif…
devnet82 Oct 30, 2026
da4841d
Add candidate-bound VM/host stage test executor with protected driver…
devnet82 Oct 30, 2026
8867c0a
Regression-test candidate-bound VM executor real subprocess receipts,…
devnet82 Oct 30, 2026
43bbec2
Withdraw incorrect full-application registration: v0.6.132 draft ZIP …
devnet82 Oct 30, 2026
aa8921e
Remove inaccessible draft hotfix fetch; only run real registered full…
devnet82 Oct 30, 2026
48b3e2a
Separate protected driver ownership check from exact test-scope valid…
devnet82 Oct 30, 2026
801a938
Make driver-scope test actually check incomplete coverage rather than…
devnet82 Oct 30, 2026
a1435f7
Correct archive provenance (v0.6.132 is a hotfix), document 403 and t…
devnet82 Oct 30, 2026
69b7b22
Fix trusted-driver positive regression to use non-symlink absolute ex…
devnet82 Oct 30, 2026
aceb24c
Record final 30-of-30 GitHub stage-engine regression pass; preserve f…
devnet82 Oct 30, 2026
f84c04c
Bind immutable operator-approved QA checklist separately from changin…
devnet82 Oct 30, 2026
4bfa3fb
Make stable operator policy verifier explicit and avoid forward-defin…
devnet82 Oct 30, 2026
d44b9eb
Require signed stable QA checklist for stage execution, retaining per…
devnet82 Oct 30, 2026
369c960
Test signed stable QA policy and disallow reuse of evidence after can…
devnet82 Oct 30, 2026
0e27312
Update VM-stage regression fixture to reflect stable separately-signe…
devnet82 Oct 30, 2026
d14f225
Require independent GitHub source-bound attestation on both exact ZIP…
devnet82 Oct 30, 2026
02e0cf3
Require independent GitHub source-bound attestation on both exact ZIP…
devnet82 Oct 30, 2026
60b97e0
Add exact-candidate signed GitHub evidence handoff for private VM val…
devnet82 Oct 30, 2026
b8e8bab
Add 10 tests of exact GitHub-to-VM handoff, signatures, tampering, pr…
devnet82 Oct 30, 2026
312b3fe
Add post-attestation candidate-bound GitHub-to-private-VM handoff art…
devnet82 Oct 30, 2026
c5fba5c
Document stable policy, verified 41-test handoff and explicit GitHub-…
devnet82 Oct 30, 2026
d42e460
Probe genuine published v0.6.85 full-app bytes and layout on GitHub f…
devnet82 Oct 30, 2026
e0c31c0
Independently verify complete application layout in original v0.6.85 …
devnet82 Oct 30, 2026
5fe48ce
Test real original v0.6.85 install/reinstall/uninstall and data prese…
devnet82 Oct 30, 2026
cdd3b43
Execute original v0.6.85 installer lifecycle in isolated GitHub CI HO…
devnet82 Oct 30, 2026
7df6769
Run exact original full v0.6.85 ZIP inside real isolated GitHub-hoste…
devnet82 Oct 30, 2026
6d820b4
Diagnose actual GitHub KVM access and grant disposable-runner-only pe…
devnet82 Oct 30, 2026
832f09a
Add real unprivileged original-app install/reinstall/uninstall and co…
devnet82 Oct 30, 2026
4a7bfb8
Execute genuine app installer lifecycle inside native GitHub CachyOS …
devnet82 Oct 30, 2026
a2dde80
Replace incompatible VERSION-file guest assumption with original v0.6…
devnet82 Oct 30, 2026
8c191a1
Use original-v0.6.85-compatible native guest checker and actual unpri…
devnet82 Oct 30, 2026
14cdef9
Re-run entire GitHub first and native CachyOS guest suite whenever ei…
devnet82 Oct 30, 2026
ba14fcf
Wait for BOTH real native guest ZIP and installed lifecycle receipts …
devnet82 Oct 30, 2026
97f166e
Add independent candidate-hash and 26-check native/Ubuntu evidence ga…
devnet82 Oct 30, 2026
c307f66
Add independent 26-check native/Ubuntu evidence verifier, GitHub atte…
devnet82 Oct 30, 2026
64220c3
Fix genuine CachyOS VM test HOME ownership bug: allow unprivileged ap…
devnet82 Oct 30, 2026
bb6aa75
Prepare pinned exact-ZIP real CachyOS QEMU GitHub-first unit QA for r…
devnet82 Oct 31, 2026
6984d4e
Add candidate ZIP for GitHub-first validation
devnet82 Oct 31, 2026
d2cbd9d
Fix SHA256SUMS digest/filename parsing and trigger unchanged candidat…
devnet82 Oct 31, 2026
b1985b4
QA only: stage privacy-reviewed Devnet Safe AI v0.1.1 exact candidate…
devnet82 Oct 31, 2026
c613041
CI: run exact Devnet Safe AI v0.1.1 in genuine GitHub CachyOS QEMU, i…
devnet82 Oct 31, 2026
f0b4100
QA traceability: publish hosted run ID on draft PR; preserve candidat…
devnet82 Oct 31, 2026
f259a37
Fix CI: remove run-ID comment step denied by restricted GitHub token;…
devnet82 Oct 31, 2026
3f8b7b2
QA-blocked Devnet Safe AI v0.1.2 exact candidate; fixed overbroad hom…
devnet82 Oct 31, 2026
f1e2a73
GitHub-first CachyOS v0.1.2 QA: exact artifact, full fresh unit tests…
devnet82 Oct 31, 2026
e567ffa
qa: add PR-triggered native CachyOS verification for exact safe AI v0…
devnet82 Oct 31, 2026
9580831
master QA: mandate fresh real runner/output testing and independent e…
devnet82 Oct 31, 2026
e2d0971
master QA: add fail-closed live OpenCode CLI gate with revision-bound…
devnet82 Oct 31, 2026
4ab3e03
master QA: regression tests for real OpenCode prefix, wrong majors, m…
devnet82 Oct 31, 2026
fbdcd28
master QA policy: require real tool output, runner negative tests and…
devnet82 Oct 31, 2026
8de2296
master QA: enforce runner real-output regression tests in existing co…
devnet82 Oct 31, 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
144 changes: 92 additions & 52 deletions .github/workflows/devnet-application-qa.yml
Original file line number Diff line number Diff line change
@@ -1,55 +1,55 @@
name: Devnet Master QA — registered application GitHub first
name: Devnet registered application GitHub stage (fail closed)
on:
workflow_dispatch:
push:
branches: [qa/master-unified-v0.2.4-github-first]
branches: [qa/registered-app-executor-fix-v0.1.0]
paths:
- 'qa/application/devnet-master-qa-registered-application-stages-v0.1.0-QA-BLOCKED.zip'
- 'qa/application/jobs/**'
workflow_dispatch:
- 'qa/application/registered_gate.py'
- 'qa/application/candidate_checks.py'
- '.github/workflows/devnet-application-qa.yml'
permissions:
contents: read
jobs:
execute-application-tests:
application-github:
runs-on: ubuntu-24.04
timeout-minutes: 15
permissions:
contents: read
timeout-minutes: 30
steps:
- uses: actions/checkout@v5
with:
persist-credentials: false
- name: Verify and extract exact immutable QA extension
shell: bash
run: |
set -euo pipefail
f=qa/application/devnet-master-qa-registered-application-stages-v0.1.0-QA-BLOCKED.zip
echo "10bb63d065a264a9870c24a9b11dae045e654cef4e4e8b2c6e07a12ec4946411 $f" | sha256sum -c -
test ! -e qa/application/jobs/selftest
test ! -e qa/application/registered_gate.py
unzip -nq "$f"
- uses: actions/setup-python@v6
with:
python-version: '3.13'
- name: Exercise entire registered application gate
- name: Install pinned cryptographic test dependency
run: python -m pip install --disable-pip-version-check 'cryptography==50.0.2'
- name: Validate fail-closed gate
run: python3 -m unittest discover -s qa/application -p 'test_*.py' -v
- name: Execute registered candidate GitHub checklist
shell: bash
run: |
set -euo pipefail
export DEVNET_PINNED_MASTER_ZIP="$PWD/qa/master/devnet-master-qa-unified-v0.3.8-QA-BLOCKED.zip"
python3 -m unittest discover -s qa/application -p 'test_*.py' -v
python3 qa/application/ci_all.py --mode run
python3 qa/application/ci_all.py --mode verify-local
shopt -s nullglob
manifests=(qa/application/jobs/*/manifest.json)
if (( ${#manifests[@]} != 1 )); then
echo 'BLOCKED: exactly one actual candidate must be registered' >&2
exit 1
fi
python3 qa/application/registered_gate.py run "${manifests[0]}"
python3 qa/application/registered_gate.py verify "${manifests[0]}"
- uses: actions/upload-artifact@v4
if: always()
with:
name: registered-application-github-evidence
path: qa-stage-evidence/
if-no-files-found: error
if-no-files-found: ignore
retention-days: 90
- name: Report fail-closed stage
- name: Preserve release block
if: always()
run: echo 'GitHub application stage only. Real VM, GUI, host, install/rollback and full release remain BLOCKED.' >> "$GITHUB_STEP_SUMMARY"
run: echo 'GitHub-only stage; VM, host and operator acceptance NOT verified. RELEASE BLOCKED.' >> "$GITHUB_STEP_SUMMARY"

attest-application-tests:
needs: execute-application-tests
sign-candidate-evidence:
needs: application-github
runs-on: ubuntu-24.04
permissions:
contents: read
Expand All @@ -59,30 +59,26 @@ jobs:
- uses: actions/checkout@v5
with:
persist-credentials: false
- name: Verify and extract exact immutable QA extension
shell: bash
run: |
set -euo pipefail
f=qa/application/devnet-master-qa-registered-application-stages-v0.1.0-QA-BLOCKED.zip
echo "10bb63d065a264a9870c24a9b11dae045e654cef4e4e8b2c6e07a12ec4946411 $f" | sha256sum -c -
test ! -e qa/application/jobs/selftest
test ! -e qa/application/registered_gate.py
unzip -nq "$f"
- uses: actions/download-artifact@v4
with:
name: registered-application-github-evidence
path: qa-stage-evidence
- name: Verify all log hashes before signing
run: python3 qa/application/ci_all.py --mode verify-local
- name: Recheck candidate and stage receipt before signing
shell: bash
run: |
set -euo pipefail
shopt -s nullglob
manifests=(qa/application/jobs/*/manifest.json)
test "${#manifests[@]}" -eq 1
python3 qa/application/registered_gate.py verify "${manifests[0]}"
- uses: actions/attest@v4
with:
subject-path: qa/application/jobs/*/candidate.zip
- uses: actions/attest@v4
with:
subject-path: qa-stage-evidence/*/receipt.json

verify-signed-application-tests:
needs: attest-application-tests
independent-signature-check:
needs: sign-candidate-evidence
runs-on: ubuntu-24.04
permissions:
contents: read
Expand All @@ -91,24 +87,68 @@ jobs:
- uses: actions/checkout@v5
with:
persist-credentials: false
- name: Verify and extract exact immutable QA extension
- uses: actions/download-artifact@v4
with:
name: registered-application-github-evidence
path: qa-stage-evidence
- name: Verify candidate-bound GitHub-issued signatures
shell: bash
env:
GH_TOKEN: ${{ github.token }}
run: |
set -euo pipefail
f=qa/application/devnet-master-qa-registered-application-stages-v0.1.0-QA-BLOCKED.zip
echo "10bb63d065a264a9870c24a9b11dae045e654cef4e4e8b2c6e07a12ec4946411 $f" | sha256sum -c -
test ! -e qa/application/jobs/selftest
test ! -e qa/application/registered_gate.py
unzip -nq "$f"
shopt -s nullglob
manifests=(qa/application/jobs/*/manifest.json)
test "${#manifests[@]}" -eq 1
python3 qa/application/registered_gate.py verify "${manifests[0]}"
zips=(qa/application/jobs/*/candidate.zip)
receipts=(qa-stage-evidence/*/receipt.json)
test "${#zips[@]}" -eq 1
test "${#receipts[@]}" -eq 1
gh attestation verify "${zips[0]}" --repo "${GITHUB_REPOSITORY}" --signer-workflow "${GITHUB_REPOSITORY}/.github/workflows/devnet-application-qa.yml" --source-digest "$GITHUB_SHA"
gh attestation verify "${receipts[0]}" --repo "${GITHUB_REPOSITORY}" --signer-workflow "${GITHUB_REPOSITORY}/.github/workflows/devnet-application-qa.yml" --source-digest "$GITHUB_SHA"
echo 'SIGNED_GITHUB_STAGE_VERIFIED. REAL VM/HOST/RELEASE STILL BLOCKED.' >> "$GITHUB_STEP_SUMMARY"
package-private-vm-handoff:
# Only after independent GitHub signature verification.
# This transport artifact is NOT VM test evidence or release approval.
needs: independent-signature-check
runs-on: ubuntu-24.04
permissions:
contents: read
attestations: read
steps:
- uses: actions/checkout@v5
with:
persist-credentials: false
- uses: actions/setup-python@v6
with:
python-version: '3.13'
- uses: actions/download-artifact@v4
with:
name: registered-application-github-evidence
path: qa-stage-evidence
- name: Independently verify signed exact GitHub-stage evidence
- name: Prepare candidate-specific handoff (no VM execution)
shell: bash
env:
GH_TOKEN: ${{ github.token }}
run: |
set -euo pipefail
python3 qa/application/ci_all.py --mode verify-signed
echo 'SIGNED_REGISTERED_APPLICATION_GITHUB_STAGE: VERIFIED_SCOPE_LIMITED' >> "$GITHUB_STEP_SUMMARY"
shopt -s nullglob
manifests=(qa/application/jobs/*/manifest.json)
receipts=(qa-stage-evidence/*/receipt.json)
test "${#manifests[@]}" -eq 1
test "${#receipts[@]}" -eq 1
work="$(mktemp -d)"
mkdir -p "$work/github"
cp -- "${receipts[0]}" "$work/github/receipt.json"
jobdir="$(dirname -- "${manifests[0]}")"
test -f "$jobdir/policy.json" -a -f "$jobdir/policy.sig"
python3 qa/application/handoff.py assemble \
--job-dir "$jobdir" \
--evidence-dir "$work" \
--handoff-dir "$RUNNER_TEMP/private-vm-handoff"
echo 'GitHub handoff prepared; VM/host NOT_TESTED, release BLOCKED.' >> "$GITHUB_STEP_SUMMARY"
- uses: actions/upload-artifact@v4
with:
name: devnet-private-vm-handoff
path: ${{ runner.temp }}/private-vm-handoff
retention-days: 30
if-no-files-found: error
37 changes: 37 additions & 0 deletions .github/workflows/devnet-coordinator-regressions.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
name: Devnet acceptance coordinator regression tests (not release approval)
on:
push:
branches:
- qa/registered-app-executor-fix-v0.1.0
paths:
- 'qa/application/**'
- '.github/workflows/devnet-coordinator-regressions.yml'
workflow_dispatch:
pull_request:
branches:
- qa/master-unified-v0.2.4-github-first
paths:
- 'qa/application/**'
- '.github/workflows/devnet-coordinator-regressions.yml'
permissions:
contents: read
jobs:
coordinator-regressions:
runs-on: ubuntu-24.04
timeout-minutes: 10
steps:
- uses: actions/checkout@v5
with:
persist-credentials: false
- uses: actions/setup-python@v6
with:
python-version: '3.13'
- name: Install isolated signature-test dependency
run: python -m pip install --disable-pip-version-check 'cryptography==50.0.2'
- name: Compile all QA coordinator Python
run: python -m compileall -q qa/application
- name: Exercise ALL coordinator positive and negative tests
run: python -m unittest discover -s qa/application -p 'test_*.py' -v
- name: Preserve correct scope
if: always()
run: echo 'Coordinator regressions only. No application has passed GitHub→VM→host. Release remains BLOCKED.' >> "$GITHUB_STEP_SUMMARY"
Loading
Loading