Repository navigation
210 lines (205 loc) · 8.42 KB
/
Copy pathcloud-stability.yml
File metadata and controls
210 lines (205 loc) · 8.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
name: Cloud Agent Stability
on:
workflow_call:
inputs:
real_model:
description: Enable the explicitly credentialed model lane
type: boolean
default: false
provider:
type: string
default: openai
model:
type: string
default: ""
workflow_dispatch:
inputs:
real_model:
description: Run a real model over mock services instead of keyless fixtures
type: boolean
default: true
provider:
description: Production model provider; all service providers remain mock-backed
required: true
default: openai
type: choice
options: [openai, anthropic]
model:
description: Optional production model override
required: false
type: string
permissions:
contents: read
concurrency:
group: cloud-stability-${{ github.event_name }}-${{ github.ref }}
cancel-in-progress: ${{ github.event_name == 'push' }}
jobs:
deterministic-keyless:
if: ${{ !inputs.real_model }}
runs-on: ubuntu-24.04
timeout-minutes: 30
env:
CI: "true"
NODE_ENV: test
CLOUD_E2E: "1"
MOCK_REDIS: "1"
MOCK_HETZNER_LATENCY: "0"
MOCK_HETZNER_ACTION_MS: "30"
CONTROL_PLANE_TICK_MS: "50"
OPENAI_API_KEY: ""
ANTHROPIC_API_KEY: ""
AWS_ACCESS_KEY_ID: ""
AWS_SECRET_ACCESS_KEY: ""
HCLOUD_TOKEN: ""
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
with:
persist-credentials: false
- uses: ./.github/actions/cloud-setup-test-env
- name: Establish Linux scenario containment boundary
run: |
sudo apt-get update
sudo apt-get install --yes acl apparmor bubblewrap iptables
sudo tee /etc/apparmor.d/eliza-stability-bwrap >/dev/null <<'PROFILE'
abi <abi/4.0>,
include <tunables/global>
profile eliza-stability-bwrap /usr/bin/bwrap flags=(unconfined) {
userns,
}
PROFILE
sudo apparmor_parser -r /etc/apparmor.d/eliza-stability-bwrap
test "$(sysctl -n kernel.apparmor_restrict_unprivileged_userns)" = 1
sudo -n /usr/bin/env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin \
/bin/bash packages/cloud/scripts/e2e/stability-linux-sandbox.sh setup
echo "ELIZA_STABILITY_LINUX_SANDBOX=1" >> "$GITHUB_ENV"
- name: Expose checkout outside the runner private home
run: |
sudo install -d -m 0755 /opt/eliza-stability
sudo mount --bind "$GITHUB_WORKSPACE" /opt/eliza-stability
- name: Prove Linux containment against adversarial escapes
working-directory: /opt/eliza-stability
run: bun run --cwd packages/cloud/e2e test:containment
- name: Run exact-three keyless AgentRuntime scenario
working-directory: /opt/eliza-stability
run: >-
bun run --cwd packages/cloud/e2e stability:keyless --
--run-id cloud-keyless-${{ github.run_id }}-${{ github.run_attempt }}
--output /opt/eliza-stability/test-results/cloud-stability/keyless
# Keep the parent-owned result available even if a failed sandbox leaves
# a child-owned ledger unreadable by the full artifact uploader.
- name: Upload deterministic stability summary
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: cloud-stability-keyless-summary-${{ github.run_attempt }}
path: |
test-results/cloud-stability/keyless/stability.json
test-results/cloud-stability/keyless/stability.sha256
test-results/cloud-stability/keyless/manifest.json
test-results/cloud-stability/keyless/attempt-*/*/scenario.stdout.log
test-results/cloud-stability/keyless/attempt-*/*/scenario.stderr.log
retention-days: 14
if-no-files-found: error
- name: Upload deterministic trajectories and ledgers
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: cloud-stability-keyless-${{ github.run_attempt }}
path: |
test-results/cloud-stability/keyless
packages/cloud/e2e/.logs
retention-days: 14
include-hidden-files: true
if-no-files-found: error
real-model-mock-services:
if: ${{ inputs.real_model }}
runs-on: ubuntu-24.04
timeout-minutes: 35
env:
CI: "true"
NODE_ENV: test
CLOUD_E2E: "1"
MOCK_REDIS: "1"
MOCK_HETZNER_LATENCY: "0"
MOCK_HETZNER_ACTION_MS: "30"
CONTROL_PLANE_TICK_MS: "50"
OPENAI_API_KEY: ""
ANTHROPIC_API_KEY: ""
AWS_ACCESS_KEY_ID: ""
AWS_SECRET_ACCESS_KEY: ""
HCLOUD_TOKEN: ""
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
with:
persist-credentials: false
- uses: ./.github/actions/cloud-setup-test-env
- name: Establish Linux scenario containment boundary
run: |
sudo apt-get update
sudo apt-get install --yes acl apparmor bubblewrap iptables
sudo tee /etc/apparmor.d/eliza-stability-bwrap >/dev/null <<'PROFILE'
abi <abi/4.0>,
include <tunables/global>
profile eliza-stability-bwrap /usr/bin/bwrap flags=(unconfined) {
userns,
}
PROFILE
sudo apparmor_parser -r /etc/apparmor.d/eliza-stability-bwrap
test "$(sysctl -n kernel.apparmor_restrict_unprivileged_userns)" = 1
sudo -n /usr/bin/env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin \
/bin/bash packages/cloud/scripts/e2e/stability-linux-sandbox.sh setup
echo "ELIZA_STABILITY_LINUX_SANDBOX=1" >> "$GITHUB_ENV"
- name: Expose checkout outside the runner private home
run: |
sudo install -d -m 0755 /opt/eliza-stability
sudo mount --bind "$GITHUB_WORKSPACE" /opt/eliza-stability
- name: Prove Linux containment against adversarial escapes
working-directory: /opt/eliza-stability
run: bun run --cwd packages/cloud/e2e test:containment
- name: Run exact-three real-model scenario over mock services
working-directory: /opt/eliza-stability
env:
OPENAI_API_KEY: ${{ (github.event_name == 'schedule' || inputs.provider == 'openai') && secrets.OPENAI_API_KEY || '' }}
ANTHROPIC_API_KEY: ${{ inputs.provider == 'anthropic' && secrets.ANTHROPIC_API_KEY || '' }}
STABILITY_PROVIDER: ${{ github.event_name == 'schedule' && 'openai' || inputs.provider }}
STABILITY_INPUT_MODEL: ${{ inputs.model || '' }}
STABILITY_RUN_ID: cloud-real-${{ github.run_id }}-${{ github.run_attempt }}
STABILITY_OUTPUT: /opt/eliza-stability/test-results/cloud-stability/real
run: |
args=(
bun run --cwd packages/cloud/e2e stability:real --
--provider "$STABILITY_PROVIDER"
)
if [ -n "$STABILITY_INPUT_MODEL" ]; then
if [[ ! "$STABILITY_INPUT_MODEL" =~ ^[A-Za-z0-9][A-Za-z0-9._:/-]{0,127}$ ]]; then
echo "::error::model must match the bounded provider model identifier grammar"
exit 1
fi
args+=(--model "$STABILITY_INPUT_MODEL")
fi
args+=(--run-id "$STABILITY_RUN_ID" --output "$STABILITY_OUTPUT")
"${args[@]}"
- name: Upload real-model stability summary
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: cloud-stability-real-summary-${{ github.run_attempt }}
path: |
test-results/cloud-stability/real/stability.json
test-results/cloud-stability/real/stability.sha256
test-results/cloud-stability/real/manifest.json
test-results/cloud-stability/real/attempt-*/*/scenario.stdout.log
test-results/cloud-stability/real/attempt-*/*/scenario.stderr.log
retention-days: 30
if-no-files-found: error
- name: Upload real-model trajectories and mock-service ledgers
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: cloud-stability-real-${{ github.run_attempt }}
path: |
test-results/cloud-stability/real
packages/cloud/e2e/.logs
retention-days: 30
include-hidden-files: true
if-no-files-found: error