Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
10 changes: 5 additions & 5 deletions .github/workflows/alpha-topology.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2131,7 +2131,7 @@ jobs:

- name: Upload closed transaction TEST evidence
if: always() && env.VOLPAROSSA_ALPHA_SCENARIO == 'transaction-abci' && env.VOLPAROSSA_ALPHA_OUTPUT != ''
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: alpha-production-helper-topology-${{ github.run_id }}
path: |
Expand All @@ -2153,7 +2153,7 @@ jobs:

- name: Upload closed protected quote refusal evidence
if: always() && env.VOLPAROSSA_ALPHA_SCENARIO == 'protected-quote' && env.VOLPAROSSA_ALPHA_OUTPUT != ''
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: alpha-production-helper-topology-${{ github.run_id }}
path: |
Expand All @@ -2164,7 +2164,7 @@ jobs:

- name: Upload bounded topology diagnostics
if: always() && env.VOLPAROSSA_ALPHA_SCENARIO != 'agent-private-conversation' && env.VOLPAROSSA_ALPHA_SCENARIO != 'agent-native-coding' && env.VOLPAROSSA_ALPHA_SCENARIO != 'transaction-abci' && env.VOLPAROSSA_ALPHA_SCENARIO != 'protected-quote'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: alpha-production-helper-topology-${{ github.run_id }}
path: ${{ env.VOLPAROSSA_ALPHA_OUTPUT }}
Expand All @@ -2173,7 +2173,7 @@ jobs:

- name: Upload bounded private conversation fixture evidence
if: always() && env.VOLPAROSSA_ALPHA_SCENARIO == 'agent-private-conversation'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: alpha-production-helper-topology-${{ github.run_id }}
path: |
Expand Down Expand Up @@ -2202,7 +2202,7 @@ jobs:

- name: Upload bounded native coding fixture evidence
if: always() && env.VOLPAROSSA_ALPHA_SCENARIO == 'agent-native-coding'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: alpha-production-helper-topology-${{ github.run_id }}
path: |
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/dns-cache-proof.yml
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ jobs:

- name: Upload exact-source public wire and bounded collector evidence
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: dns-cache-builtin-root-${{ github.run_id }}
path: ${{ env.VOLPAROSSA_DNS_PROOF_OUTPUT }}
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/helper-boundary-evidence.yml
Original file line number Diff line number Diff line change
Expand Up @@ -658,7 +658,7 @@ jobs:
steps.vm_proof.outputs.exit_code == '0' &&
steps.host_validation.outcome == 'success' &&
steps.verify_kvm_state.outcome == 'success'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: helper-boundary-evidence-${{ github.sha }}
path: |
Expand All @@ -679,7 +679,7 @@ jobs:
steps.host_validation.outcome != 'success' ||
steps.verify_kvm_state.outcome != 'success') &&
steps.retained_artifacts.outputs.diagnostics_any == 'true'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: helper-boundary-diagnostics-${{ github.sha }}
path: |
Expand All @@ -697,7 +697,7 @@ jobs:
steps.vm_proof.outputs.exit_code == '0' &&
steps.host_validation.outcome == 'success' &&
steps.verify_kvm_state.outcome == 'success'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: helper-restart-exact-present-evidence-${{ github.sha }}
path: |
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/native-cpu-contract.yml
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ jobs:
) 2>&1 | tee build/native-contract/source-check.log
- name: Retain original source-only reports and logs, including failures
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: native-source-${{ matrix.mode }}-${{ github.sha }}
path: |
Expand Down
7 changes: 5 additions & 2 deletions .github/workflows/native-session-diagnostics.yml
Original file line number Diff line number Diff line change
Expand Up @@ -118,9 +118,12 @@ jobs:
test "$GITHUB_ACTIONS" = true
test "$RUNNER_ENVIRONMENT" = github-hosted
test "$(dpkg --print-architecture)" = amd64
# Same Noble security compiler/library family as Quality (2026-10-20).
sudo -n apt-get update
sudo -n apt-get install --yes --no-install-recommends \
protobuf-compiler=3.21.12-8.2ubuntu0.3
protobuf-compiler=3.21.12-8.2ubuntu0.4 \
libprotoc32t64=3.21.12-8.2ubuntu0.4 \
libprotobuf32t64=3.21.12-8.2ubuntu0.4
test "$(protoc --version)" = 'libprotoc 3.21.12'

- name: Check the closed Python collector contracts
Expand Down Expand Up @@ -261,7 +264,7 @@ jobs:

- name: Preserve only source, inventory and original check evidence including failures
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: native-session-diagnostics-${{ github.run_id }}-${{ github.run_attempt }}
retention-days: 14
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/protected-compute-admission.yml
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ jobs:
run: python3 -B tests/integration/protected-compute-quote.py receipt
- name: Retain only bounded public source lock and test evidence
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: protected-compute-core-evidence-${{ github.sha }}
retention-days: 14
Expand All @@ -123,7 +123,7 @@ jobs:
${{ runner.temp }}/volparossa-protected-compute-admission/evidence/clippy.log
- name: Retain bounded guest software evidence
if: always() && (github.ref == 'refs/heads/feature/protected-compute-guest' || github.ref == 'refs/heads/feature/protected-compute-quote-exchange')
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: protected-compute-guest-software-${{ github.sha }}
retention-days: 14
Expand All @@ -134,7 +134,7 @@ jobs:
${{ runner.temp }}/volparossa-protected-compute-admission/guest-evidence/report.json
- name: Retain bounded quote software evidence
if: always() && github.ref == 'refs/heads/feature/protected-compute-quote-exchange'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: protected-compute-quote-software-${{ github.sha }}
retention-days: 14
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/protected-compute-verifier.yml
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ jobs:
"$VERIFIER_SOURCE" build/protected-compute-verifier/evidence "${statuses[0]}" "${statuses[1]}"
- name: Retain original public fixture evidence only
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: protected-compute-public-fixtures-${{ github.sha }}
retention-days: 14
Expand Down
11 changes: 7 additions & 4 deletions .github/workflows/quality.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,10 +58,13 @@ jobs:
test "$RUNNER_ENVIRONMENT" = github-hosted
test "$(dpkg --print-architecture)" = amd64
# Official Noble security package; signed apt metadata authenticates it.
# https://packages.ubuntu.com/noble/amd64/protobuf-compiler
# Compiler and library family from Noble security, published 2026-10-20.
# https://security.ubuntu.com/ubuntu/dists/noble-security/universe/binary-amd64/Packages.xz
sudo apt-get update
sudo apt-get install --yes --no-install-recommends \
protobuf-compiler=3.21.12-8.2ubuntu0.3
protobuf-compiler=3.21.12-8.2ubuntu0.4 \
libprotoc32t64=3.21.12-8.2ubuntu0.4 \
libprotobuf32t64=3.21.12-8.2ubuntu0.4
test "$(protoc --version)" = 'libprotoc 3.21.12'

- name: Verify original ABCI schemas and inert fixture contracts
Expand All @@ -82,7 +85,7 @@ jobs:
sh -n tests/integration/content-provider-pressure-smoke.sh
node --version
node -e 'if (Number(process.versions.node.split(".")[0]) < 22) process.exit(1)'
node --test tests/integration/test-weather-source-observer.mjs
node --test tests/integration/test-weather-source-observer.mjs tests/integration/test-descriptor-reads.mjs
python3 -B tests/integration/test-weather-products-delivery.py
python3 -B tests/integration/test-weather-products-hosted-wiring.py
python3 -B tests/integration/test-weather-overmorrow-hosted-wiring.py
Expand Down Expand Up @@ -182,7 +185,7 @@ jobs:

- name: Preserve failed standalone lock reconciliation
if: ${{ failure() && steps.fetch-dependencies.outputs.backport_lock_diagnostic == 'true' }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: backport-lock-diagnostic-${{ github.run_id }}
path: |
Expand Down
7 changes: 5 additions & 2 deletions .github/workflows/storage-lock-lifecycle.yml
Original file line number Diff line number Diff line change
Expand Up @@ -79,9 +79,12 @@ jobs:
test "$GITHUB_ACTIONS" = true
test "$RUNNER_ENVIRONMENT" = github-hosted
test "$(dpkg --print-architecture)" = amd64
# Same Noble security compiler/library family as Quality (2026-10-20).
sudo -n apt-get update
sudo -n apt-get install --yes --no-install-recommends \
protobuf-compiler=3.21.12-8.2ubuntu0.3
protobuf-compiler=3.21.12-8.2ubuntu0.4 \
libprotoc32t64=3.21.12-8.2ubuntu0.4 \
libprotobuf32t64=3.21.12-8.2ubuntu0.4
test "$(protoc --version)" = 'libprotoc 3.21.12'

- name: Check out unchanged locking plus only the three regressions
Expand Down Expand Up @@ -182,7 +185,7 @@ jobs:

- name: Retain only regression observations and logs
if: always() && steps.scope.outcome == 'success'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: storage-lock-lifecycle-${{ github.run_id }}-${{ github.run_attempt }}
path: |
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/weather-android-delivery.yml
Original file line number Diff line number Diff line change
Expand Up @@ -372,7 +372,7 @@ jobs:
--manifest "$WEATHER_MANIFEST" --kvm-cleanup "$WEATHER_INPUTS/kvm-cleanup.json"
- name: Upload only closed evidence and pinned-input provenance
if: always() && env.WEATHER_OUTPUT != ''
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: weather-android-delivery-${{ github.sha }}
retention-days: 14
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/weather-decoder-abi.yml
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ jobs:
--expected-commit "$GITHUB_SHA"
- name: Retain bounded ABI results only
if: always() && env.VOLPAROSSA_ABI_OUTPUT != ''
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: weather-decoder-debian13-${{ github.sha }}
retention-days: 14
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/weather-overmorrow-delivery.yml
Original file line number Diff line number Diff line change
Expand Up @@ -302,7 +302,7 @@ jobs:
PY
- name: Retain bounded original evidence, never the input bundle or profiles
if: always() && env.WEATHER_OUTPUT != ''
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: weather-overmorrow-delivery-${{ github.sha }}
retention-days: 14
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/weather-products-delivery.yml
Original file line number Diff line number Diff line change
Expand Up @@ -269,7 +269,7 @@ jobs:
PY
- name: Retain bounded original evidence, never the input bundle or profiles
if: always() && env.WEATHER_OUTPUT != ''
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: weather-products-delivery-${{ github.sha }}
retention-days: 14
Expand Down
2 changes: 1 addition & 1 deletion scripts/test-diagnose-backport-lock.py
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ def test_harness_failure_preserved_after_diagnostic_success_or_failure(self):
def test_failure_only_exact_artifact_allowlist(self):
step = workflow_step("Preserve failed standalone lock reconciliation")
self.assertIn(" if: ${{ failure() && steps.fetch-dependencies.outputs.backport_lock_diagnostic == 'true' }}", step)
self.assertIn(" uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1", step)
self.assertIn(" uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2", step)
start = step.index(" path: |") + 1
paths = []
for line in step[start:]:
Expand Down
20 changes: 17 additions & 3 deletions tests/integration/agent-private-task-code.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,22 @@ function save(name, value) {
assert(Buffer.byteLength(data) <= 65536);
fs.writeFileSync(path.join(root, name), data, { flag: 'wx', mode: 0o600 });
}
function readPrivateInput(file) {
const fd = fs.openSync(file, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW | fs.constants.O_NONBLOCK);
try {
const info = fs.fstatSync(fd);
assert(info.isFile() && info.uid === process.getuid() && (info.mode & 0o7777) === 0o600 && info.size <= 65536);
const bytes = Buffer.alloc(info.size + 1); let size = 0;
while (size < bytes.length) {
const count = fs.readSync(fd, bytes, size, bytes.length - size, size);
if (count === 0) break;
size += count;
}
const after = fs.fstatSync(fd);
assert(size === info.size && ['size', 'mtimeMs', 'mode', 'uid', 'gid'].every(key => info[key] === after[key]));
return bytes.subarray(0, size);
} finally { fs.closeSync(fd); }
}
async function main() {
assert.equal(root, '/home/vpci/private-code');
assert.equal(process.getuid(), process.geteuid());
Expand All @@ -22,9 +38,7 @@ async function main() {
assert.notEqual(fs.readlinkSync('/proc/self/ns/net'), parentNetwork);
assert(Object.keys(os.networkInterfaces()).every(name => name === 'lo'));
const { PrivateCompute } = require(path.join(root, 'src/private-compute.cjs'));
const info = fs.lstatSync(inputPath);
assert(info.isFile() && info.uid === process.getuid() && (info.mode & 0o7777) === 0o600 && info.size <= 65536);
const input = JSON.parse(fs.readFileSync(inputPath, 'utf8'));
const input = JSON.parse(readPrivateInput(inputPath));
assert.equal(input.version, 1);
assert.equal(input.visibility, 'private_local');
assert.equal(input.question, 'What string does testIdentifier return? Answer with only the string.');
Expand Down
22 changes: 17 additions & 5 deletions tests/integration/cloud-private-file-sdk.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
import assert from 'node:assert/strict';
import { createHash, randomBytes } from 'node:crypto';
import { spawn } from 'node:child_process';
import { lstat, readFile, realpath, mkdir, readdir, writeFile } from 'node:fs/promises';
import { constants } from 'node:fs';
import { open, lstat, readFile, realpath, mkdir, readdir, writeFile } from 'node:fs/promises';
import path from 'node:path';
import { fileURLToPath, pathToFileURL } from 'node:url';
import { setTimeout as delay } from 'node:timers/promises';
Expand Down Expand Up @@ -52,10 +53,21 @@ async function privateJSON(file, value) {
await writeFile(file, JSON.stringify(value) + '\n', { flag: 'wx', mode: 0o600 });
}
async function publicBytes(file) {
const info = await lstat(file);
insist(info.isFile() && info.uid === 0 && !(info.mode & 0o222)
&& info.size <= 2 * 1024 ** 2 && await realpath(file) === file);
return readFile(file);
insist(await realpath(file) === file);
const handle = await open(file, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
try {
const info = await handle.stat();
insist(info.isFile() && info.uid === 0 && !(info.mode & 0o222) && info.size <= 2 * 1024 ** 2);
const bytes = Buffer.alloc(info.size + 1); let size = 0;
while (size < bytes.length) {
const { bytesRead } = await handle.read(bytes, size, bytes.length - size, size);
if (bytesRead === 0) break;
size += bytesRead;
}
const after = await handle.stat();
insist(size === info.size && ['size', 'mtimeMs', 'mode', 'uid', 'gid'].every(key => info[key] === after[key]));
return bytes.subarray(0, size);
} finally { await handle.close(); }
}
async function sdkProvenance() {
const bytes = await publicBytes(`${SDK}/receipt.json`);
Expand Down
Loading
Loading