Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
111 commits
Select commit Hold shift + click to select a range
75dfd75
refactor(runtime): owner transports, the creation default and a focus…
OrcaWin Oct 10, 2026
2eb6a92
refactor(forge): forge reads and edits route by the repo's owner or t…
OrcaWin Oct 10, 2026
7de3710
refactor(files): file reads and edits route by the file's owner (#27278)
OrcaWin Oct 10, 2026
314993c
refactor(terminals): terminal input and inspection route by the PTY's…
OrcaWin Oct 10, 2026
572f178
refactor(agents): agent, session and port calls route by their worksp…
OrcaWin Oct 10, 2026
ca1aac6
refactor(github): PR and work-item calls carry the repo owner's host …
OrcaWin Oct 10, 2026
81867c8
refactor(sources): row-less sources and host-less surfaces name their…
OrcaWin Oct 10, 2026
4f03c23
refactor(projects): repo, project group and folder catalog calls rout…
OrcaWin Oct 10, 2026
0a73d1e
[CI] Reduce repeated test setup and real CLI waits (#27297)
nwparker Oct 10, 2026
853c25d
refactor(git): git calls route by the worktree's owner (#27291)
OrcaWin Oct 10, 2026
26ee9bb
[CI] Reduce repeated test setup and unnecessary packaging (#27308)
nwparker Oct 10, 2026
e7d7c5b
refactor(worktrees): worktree create, listing, removal and repo hook/…
OrcaWin Oct 10, 2026
ddcbb78
chore(lint): bypassing owner routing fails lint (#27313)
OrcaWin Oct 10, 2026
42be4c5
chore(settings): rename "Active Server" to "Default host for new proj…
OrcaWin Oct 10, 2026
8ba353a
[CI] Refresh unit timing weights and reduce repeated test setup (#27315)
nwparker Oct 10, 2026
eaf5dbe
fix(cli): preserve alias recovery while guarding destructive suggesti…
nwparker Oct 10, 2026
68519e6
fix(composer): preserve explicit workspace names after selecting task…
nwparker Oct 10, 2026
e7ee93e
docs(rpc): a paired client runs commands as you; say so when pairing …
OrcaWin Oct 10, 2026
3f7943c
fix(relay): cells without a seat feed stay out of shadow coverage and…
Jinwoo-H Oct 10, 2026
87da843
fix(zcode): isolate read-only account discovery and quota ownership
nwparker Oct 10, 2026
b9ea43b
test(accounts): keep quota fixtures consistent with saved state
nwparker Oct 10, 2026
808c4ae
test(zcode): verify read-only account contracts across platforms
nwparker Oct 10, 2026
7dfcef4
test(composer): reuse fixtures to restore the main lint gate
nwparker Oct 10, 2026
04f8f2b
feat(accounts): isolate ZCode sign-in terminal setup
nwparker Oct 10, 2026
fda01fa
feat(relay): the director that booked a join writes its row about a s…
Jinwoo-H Oct 10, 2026
a09dc9a
fix: honor inactive Claude account retry deadlines (#26936)
nwparker Oct 10, 2026
a188831
fix(relay): database sweeps and ops reads skip reserve-mode cells (st…
Jinwoo-H Oct 10, 2026
9029e84
feat(relay): log metric and console alert for unreadable cell switch …
Jinwoo-H Oct 10, 2026
c33fa87
fix(accounts): remove a rejected GLM key when restore fails
parkavenue9639 Oct 3, 2026
ae573a9
fix(accounts): keep an identical plaintext key after a failed restore
parkavenue9639 Oct 3, 2026
1f6ab26
fix(accounts): preserve competing keys during failed GLM saves
nwparker Oct 10, 2026
6de900f
test(zcode): verify rollback with real Windows file permissions
nwparker Oct 10, 2026
70f0b1a
ci(zcode): install the pinned test runner before native contracts
nwparker Oct 10, 2026
33a1ddf
ci(zcode): register native credential tests in the Windows lane
nwparker Oct 10, 2026
a90e5d9
ci(e2e): run the layout oracle on PRs that change layout writers (#27…
Jinwoo-H Oct 10, 2026
2895869
feat(relay): alert when a reserve-mode cell trips its dead-man (#27096)
Jinwoo-H Oct 10, 2026
3c6c24f
test(relay): deterministic step-5 simulation with invariants 1-8 (#27…
Jinwoo-H Oct 10, 2026
e9bf6d1
fix(relay): the cell switch tool changes only the named switches (#27…
Jinwoo-H Oct 10, 2026
db2ed7c
perf(mac): name terminals in Orca instead of ps tty= (#27146)
nwparker Oct 10, 2026
19f20c8
test(e2e): pass the catalog owner to the remaining fetchRepos callers…
OrcaWin Oct 10, 2026
b154baf
fix(relay): staging director deploys run as relay-dir with rehome ide…
Jinwoo-H Oct 10, 2026
2110887
fix(relay): staging director deploys set the admin identity the direc…
Jinwoo-H Oct 11, 2026
7d81ce2
infra(relay): staging c1 gets a 600/60 cap, and c1/c4 get rehome trus…
Jinwoo-H Oct 11, 2026
ecc3433
feat(native-chat): read ZCode session transcripts through the OpenCod…
star-nebula Oct 10, 2026
45c4d6e
fix(native-chat): preserve ZCode store selection and transcript order
nwparker Oct 10, 2026
4fd7398
test(native-chat): run ZCode SQLite fixtures on the production runtime
nwparker Oct 10, 2026
3d51f67
test(native-chat): seed ZCode through the execution host
nwparker Oct 10, 2026
b74e946
fix(native-chat): prepare SQLite readers for ZCode-only WSL homes
nwparker Oct 10, 2026
dac3ae1
test(native-chat): verify ZCode readers on every desktop platform
nwparker Oct 10, 2026
8b2c795
test(native-chat): seed large transcript fixtures in one transaction
nwparker Oct 10, 2026
c445584
feat(relay): a staging cell-flags workflow, trusted by the staging re…
Jinwoo-H Oct 11, 2026
15ee25e
feat(relay): a free-form staging load mode on Prove Relay Asia Stagin…
Jinwoo-H Oct 11, 2026
c2da633
fix(relay): staging sleep runs under the admission selector instead o…
Jinwoo-H Oct 11, 2026
6404b7e
test(relay): load generator can send two concurrent assigns per host …
Jinwoo-H Oct 11, 2026
ae861b7
fix(github): don't link a PR headed by the default branch a branch tr…
petersindex Oct 10, 2026
7ac9f4d
fix(github): compare a tracked upstream with its own remote's default…
petersindex Oct 10, 2026
0bc07c9
fix(github): validate implicit default-branch PR repository identity
nwparker Oct 10, 2026
82c5484
fix(github): scope PR selection and clear rejected cached links
nwparker Oct 10, 2026
884575a
fix(github): verify cached integration PRs after tracking is removed
nwparker Oct 10, 2026
b4d8e37
fix(orcad): install agent status hooks when a managed host starts (#2…
OrcaWin Oct 11, 2026
ee8cd8e
perf(ai-vault): pipeline fresh transcript discovery with bounded I/O …
outof-place Oct 11, 2026
77d5de1
fix(orcad): provide the orca CLI in Windows managed-host terminals (#…
OrcaWin Oct 11, 2026
7ecc61a
infra(relay): pin staging c1, c2 and c4 to the step-5 image for the s…
Jinwoo-H Oct 11, 2026
91f9744
fix(settings): return current preferences after slow updates (#27199)
nwparker Oct 11, 2026
43fbd23
test(e2e): pass the catalog owner to the remaining catalog fetches an…
OrcaWin Oct 11, 2026
db309a5
test(e2e): cover SSH user journeys on an orcad-managed host (#27323)
OrcaWin Oct 11, 2026
be78796
Update README downloads badge
github-actions[bot] Oct 11, 2026
f6d536d
Save runtime-started tabs in the tab bar before their terminal starts…
Jinwoo-H Oct 11, 2026
e6af897
feat(ssh): a paired client can manage the server's own SSH hosts (ssh…
OrcaWin Oct 11, 2026
f30631c
infra(relay): keep staging c4 on the serving director image until the…
Jinwoo-H Oct 11, 2026
1dde4c0
fix(projects): create on a server's SSH project; Add Project SSH list…
OrcaWin Oct 11, 2026
8f24508
infra(relay): pin staging c4 to the step-5 image again after the dire…
Jinwoo-H Oct 11, 2026
f69bbe8
List the cold-relaunch tab-order swap as known on main (#27353)
Jinwoo-H Oct 11, 2026
73575f4
infra(relay): point the staging deploy at the pre-step-5 image for th…
Jinwoo-H Oct 11, 2026
24ea55a
infra(relay): pin staging c4 to the step-5 image again after the rese…
Jinwoo-H Oct 11, 2026
cf36928
test(native-chat): unmount the cut-turn notice hooks after each test …
OrcaWin Oct 11, 2026
5f350a3
fix(ssh): restore saved port forwards on managed hosts and show their…
OrcaWin Oct 11, 2026
e062552
fix(files): a managed terminal links and opens a host file outside it…
OrcaWin Oct 11, 2026
666d990
Record a display-only snapshot of each paired server's tabs (inert) (…
Jinwoo-H Oct 11, 2026
56d25b0
fix(settings): reenable terminal link Actions after an old opt-out (#…
nwparker Oct 11, 2026
a2c2f8b
fix(computer-use): clean up completed permission helpers asynchronous…
nwparker Oct 11, 2026
b411bf3
perf(runtime): reduce terminal ANSI scanning work (#27344)
nwparker Oct 11, 2026
bc02f3c
perf(main): release startup allocations held by journal sentinel (#27…
nwparker Oct 11, 2026
41de89a
fix: spell source NUL separators as Unicode escapes (#26864)
nwparker Oct 11, 2026
c2d5430
[CI] Fix test fixtures and reduce unnecessary test setup (#27330)
nwparker Oct 11, 2026
1e5031e
fix(i18n): correct Korean CI check translations (#27367)
abruption Oct 11, 2026
810c262
fix(computer-use): release macOS screenshot memory after each request…
f8team Oct 11, 2026
f49d0bc
test(main): guard against a shared journal no-row sentinel returning …
nwparker Oct 11, 2026
dae2cc9
test(runtime): enforce ANSI preview-final pre-filter invariant (#27376)
nwparker Oct 11, 2026
74856c8
fix(dev): keep Node-only Quick Open path accumulator out of the rende…
Jinwoo-H Oct 11, 2026
e4f599d
perf(worktrees): preserve Git scans when saving sidebar order (#27343)
nwparker Oct 11, 2026
d2ba67d
fix(claude): register a short PostCompact hook command (#25211)
vampik33 Oct 11, 2026
0081ea0
fix(clipboard): paste a macOS image copied beside its file URL (#27346)
benjaminb10 Oct 11, 2026
bcc5048
fix(vm): a recipe VM's SSH root runs on a managed Orca server (#27366)
OrcaWin Oct 11, 2026
22bcda1
fix(ssh): a restore racing a disconnect never leaves a forward behind…
OrcaWin Oct 11, 2026
3aaa6a8
Require pointer rest before opening activity hover cards (#25931)
AmethystLiang Oct 11, 2026
4c4f1ee
test(e2e): reusable phone-mirror test setup and baseline specs (#26412)
Jinwoo-H Oct 11, 2026
ff27338
refactor(ssh): connect fails for hosts orcad can't serve; remove the …
OrcaWin Oct 11, 2026
a13c2b3
[CI] Reduce test teardown and scope server qualification (#27380)
nwparker Oct 11, 2026
d07ac4b
perf(worktrees): skip unchanged lineage after sidebar order saves (#2…
nwparker Oct 11, 2026
c2c63e7
Avoid downloading unchanged paired-runtime session history (#27383)
nwparker Oct 11, 2026
2b4b60a
refactor(relay): delete the SSH relay server, its build assets and te…
OrcaWin Oct 11, 2026
f425cab
fix(agent-status): keep nested models off parent panes (#26846)
nwparker Oct 11, 2026
ac156c0
perf(ci): overlap Bun typechecking and skip redundant alias scans (#2…
nwparker Oct 11, 2026
92fb883
fix(runtime): refuse headless tab split/move into an unknown group (#…
Jinwoo-H Oct 11, 2026
a34d8b9
merge: sync fork-main from stablyai/orca main
karlorz Oct 11, 2026
edd1f1b
docs(sync): record 2026-10-11b conflict resolutions and light checks
karlorz Oct 11, 2026
097240e
docs(sync): keep 2026-10-11b notes under docs/audits
karlorz Oct 11, 2026
fc5cca0
fix(ci): retarget node-server change-scope fixtures after src/relay d…
karlorz Oct 11, 2026
c98e2bb
test(e2e): keep ZCode native chat eligible after SessionStart resume
karlorz Oct 11, 2026
a9d41f6
test(e2e): seed ZCode native chat without a SessionStart resume hook
karlorz Oct 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 0 additions & 1 deletion .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
# .version, which names the immutable remote install dir. A CRLF checkout makes a
# Windows-built client disagree with a mac/Linux-built one on the same release,
# so one host ends up with two relay trees (#17886 review).
/config/relay-assets/** text eol=lf
# Pin the bytes so a patch reads and diffs identically on every host. It is NOT
# what makes the hash right: pnpm hashes a patch LF-normalized, so a CRLF checkout
# cannot change it. Believing otherwise put a hand-computed raw digest in the
Expand Down
39 changes: 39 additions & 0 deletions .github/actions/prepare-windows-cli-launcher/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
name: Prepare the orcad Windows CLI launcher
description: Compiles native/windows-cli-launcher for each requested arch into .build/windows-cli-launcher/<arch>/orca.exe.

inputs:
arches:
description: Space-separated Windows architectures (x64, arm64).
required: true

runs:
using: composite
steps:
- name: Cache the Windows CLI launcher builds
if: runner.os == 'Windows'
uses: actions/cache@v5
with:
path: |
.build/windows-cli-launcher
native/windows-cli-launcher/target
~/.cargo/registry
key: orcad-windows-cli-launcher-${{ runner.arch }}-${{ inputs.arches }}-${{ hashFiles('native/windows-cli-launcher/**', 'config/scripts/build-windows-cli-launcher.mjs', 'resources/build/icon.ico', 'package.json') }}

# Why explicit: a runner image without cargo would otherwise fail inside the orcad build.
- name: Build the launcher for each architecture
if: runner.os == 'Windows'
shell: pwsh
env:
ARCHES: ${{ inputs.arches }}
run: |
if (-not (Get-Command cargo -ErrorAction SilentlyContinue)) {
rustup toolchain install stable --profile minimal
rustup default stable
}
$triples = @{ x64 = 'x86_64-pc-windows-msvc'; arm64 = 'aarch64-pc-windows-msvc' }
foreach ($arch in ($env:ARCHES -split ' ' | Where-Object { $_ })) {
rustup target add $triples[$arch]
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
node config/scripts/build-windows-cli-launcher.mjs --arch $arch --output ".build/windows-cli-launcher/$arch/orca.exe"
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
}
14 changes: 0 additions & 14 deletions .github/workflows/ci-cache-warmup.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ on:
- 'pnpm-workspace.yaml'
- '.npmrc'
- '.pnpmfile.cjs'
- 'config/tsconfig*.json'
- 'config/scripts/ensure-native-runtime.mjs'
- 'config/scripts/rebuild-native-deps.mjs'
- 'config/scripts/node-pty-job-ownership.cjs'
Expand Down Expand Up @@ -86,19 +85,6 @@ jobs:

- uses: ./.github/actions/prepare-git-compatibility

- name: Cache TypeScript incremental state
id: typecheck-cache
uses: actions/cache@v5
with:
path: config/*.tsbuildinfo
key: tsbuildinfo-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml', 'config/tsconfig*.json') }}-${{ github.sha }}
restore-keys: |
tsbuildinfo-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml', 'config/tsconfig*.json') }}-

- name: Refresh TypeScript state for this commit
if: steps.typecheck-cache.outputs.cache-hit != 'true'
run: pnpm run typecheck

warm-linux-arm:
runs-on: ubuntu-24.04-arm
timeout-minutes: 10
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -544,7 +544,6 @@ jobs:
--capacity-service-account "${CAPACITY_SERVICE_ACCOUNT}" \
--capacity-cell-id "${cell_id}" \
--director-cells-json "${desired_cells_json}" \
--min-instances 0 \
--prune-revisions true \
--release-id "bootstrap-${cell_id}-${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}")"
echo "${director_result}"
Expand Down
17 changes: 16 additions & 1 deletion .github/workflows/cloud-deploy-relay-production-director.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,17 @@ on:
required: true
default: preserve
type: string
reserve-placement:
description: Preserve step-5 reserve placement, or set it; turning it off is refused while any cell is reserve
required: true
default: preserve
type: choice
options: [preserve, 'off', dry-run, 'on']
shadow-seat-feed-cells:
description: Preserve the step-3 shadow seat-feed cells, or set all or a comma list of cell ids; dropping a reserve cell is refused
required: true
default: preserve
type: string
prune-incompatible-revisions:
description: Retain only the newly verified serving and rollback revisions
required: true
Expand Down Expand Up @@ -68,6 +79,8 @@ jobs:
IMAGE_DIGEST: ${{ inputs.image-digest }}
REGIONAL_PLACEMENT_MODE: ${{ inputs.regional-placement-mode }}
REGION_CORRECTION_COHORT_PERCENT: ${{ inputs.region-correction-cohort-percent }}
RESERVE_PLACEMENT: ${{ inputs.reserve-placement }}
SHADOW_SEAT_FEED_CELLS: ${{ inputs.shadow-seat-feed-cells }}
PRUNE_INCOMPATIBLE_REVISIONS: ${{ inputs.prune-incompatible-revisions }}
# Floor the served revision must keep, matching relay_min_instances in
# environments/production.tfvars. This gate only fails a bad deploy; Terraform
Expand Down Expand Up @@ -228,7 +241,9 @@ jobs:
--prune-revisions "${PRUNE_INCOMPATIBLE_REVISIONS}" \
--release-id "${RELEASE_ID}" \
--regional-placement-secret-version "${target_version}" \
--region-correction-cohort-percent "${REGION_CORRECTION_COHORT_PERCENT}"
--region-correction-cohort-percent "${REGION_CORRECTION_COHORT_PERCENT}" \
--reserve-placement "${RESERVE_PLACEMENT}" \
--shadow-seat-feed-cells "${SHADOW_SEAT_FEED_CELLS}"
echo "REGIONAL_PLACEMENT_ENABLED=${desired}" >> "${GITHUB_ENV}"
echo "REGIONAL_PLACEMENT_VERSION=${target_version}" >> "${GITHUB_ENV}"

Expand Down
117 changes: 114 additions & 3 deletions .github/workflows/cloud-deploy-relay-staging.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,46 @@ on:
description: Exact checked-in production Relay sha256 digest to deploy
required: true
type: string
reserve-placement:
description: Preserve step-5 reserve placement, or set it; turning it off is refused while any cell is reserve
required: true
default: preserve
type: choice
options: [preserve, 'off', dry-run, 'on']
expected-rehome-generation:
description: Exact durable regional-rehome generation; it must remain disabled
required: true
type: string
bootstrap-runtime-identity:
description: One-time move from the stamped-cell identity to the director identity
required: true
default: false
type: boolean
predecessor-image-digest:
description: Bootstrap only. Exact immutable serving predecessor digest
required: false
type: string
capacity-cell-id:
description: Register this cell's reviewed staging.tfvars cap and bound with the director
required: true
default: none
type: choice
options: [none, staging-gce-c1, staging-gce-c2, staging-gce-c3, staging-gce-c4]
min-instances:
description: Director floor; preserve keeps the serving revision's, so a reserve run's 2 survives
required: true
default: preserve
type: choice
options: [preserve, '0', '2']
confirmation:
description: BOOTSTRAP_RELAY_DIRECTOR_REHOME_IDENTITY for a bootstrap
required: false
type: string
shadow-seat-feed-cells:
description: Preserve the step-3 shadow seat-feed cells, or set all or a comma list of cell ids; dropping a reserve cell is refused
required: true
default: preserve
type: string

permissions:
contents: read
Expand Down Expand Up @@ -34,13 +74,38 @@ jobs:
IMAGE_NAME: relay
EXPECTED_IMAGE_DIGEST: ${{ inputs.expected-image-digest }}
CAPACITY_SERVICE_ACCOUNT: ${{ vars.STAGING_GCP_RELAY_CAPACITY_SERVICE_ACCOUNT }}
# The director must trust the identity every staging Relay workflow authenticates as.
DEPLOY_SERVICE_ACCOUNT: ${{ vars.STAGING_GCP_RELAY_DEPLOY_SERVICE_ACCOUNT }}
ASIA_PROOF_SERVICE_ACCOUNT: ${{ vars.STAGING_GCP_RELAY_ASIA_PROOF_SERVICE_ACCOUNT }}
REGIONAL_PLACEMENT_SECRET: orca-cloud-relay-regional-placement-enabled
DIRECTOR_RUNTIME_SERVICE_ACCOUNT: orca-cloud-staging-relay-dir@onorca-cloud-staging.iam.gserviceaccount.com
PREDECESSOR_RUNTIME_SERVICE_ACCOUNT: orca-cloud-staging-relay@onorca-cloud-staging.iam.gserviceaccount.com
REHOME_AUDIENCE: https://relay-staging.onorca.dev/v1/admin/host-drain
EXPECTED_REHOME_GENERATION: ${{ inputs.expected-rehome-generation }}
BOOTSTRAP_RUNTIME_IDENTITY: ${{ inputs.bootstrap-runtime-identity }}
PREDECESSOR_IMAGE_DIGEST: ${{ inputs.predecessor-image-digest }}
CAPACITY_CELL_ID: ${{ inputs.capacity-cell-id }}
MIN_INSTANCES: ${{ inputs.min-instances }}
steps:
- uses: actions/checkout@v4

- name: Require the expected immutable image
run: '[[ "${EXPECTED_IMAGE_DIGEST}" =~ ^sha256:[a-f0-9]{64}$ ]]'
- name: Require the expected immutable image and identity request
shell: bash
env:
CONFIRMATION: ${{ inputs.confirmation }}
run: |
set -euo pipefail
[[ "${EXPECTED_IMAGE_DIGEST}" =~ ^sha256:[a-f0-9]{64}$ ]]
[[ "${EXPECTED_REHOME_GENERATION}" =~ ^(0|[1-9][0-9]*)$ ]]
[[ "${BOOTSTRAP_RUNTIME_IDENTITY}" =~ ^(true|false)$ ]]
[[ "${MIN_INSTANCES}" =~ ^(preserve|0|2)$ ]]
if test "${BOOTSTRAP_RUNTIME_IDENTITY}" = true; then
[[ "${PREDECESSOR_IMAGE_DIGEST}" =~ ^sha256:[a-f0-9]{64}$ ]]
test "${CAPACITY_CELL_ID}" = none
test "${CONFIRMATION}" = BOOTSTRAP_RELAY_DIRECTOR_REHOME_IDENTITY
else
test -z "${PREDECESSOR_IMAGE_DIGEST}"
fi

- uses: hashicorp/setup-terraform@v3
with:
Expand Down Expand Up @@ -68,6 +133,16 @@ jobs:
test "${IMAGE}" = \
"${GCP_REGION}-docker.pkg.dev/${GCP_PROJECT_ID}/${REPOSITORY_ID}/${IMAGE_NAME}@${EXPECTED_IMAGE_DIGEST}"
echo "IMAGE=${IMAGE}" >> "${GITHUB_ENV}"
if test "${CAPACITY_CELL_ID}" != none; then
# The deploy script refuses any topology change beyond this one cell's cap and bound.
DESIRED_CELLS_JSON="$(terraform -chdir=infra/terraform console \
-var-file=environments/staging.tfvars \
<<< 'local.relay_director_cells_json' | jq -er '.')"
jq -e --arg cell "${CAPACITY_CELL_ID}" \
'any(.[]; .id == $cell and .connectionHardCap != null)' \
<<< "${DESIRED_CELLS_JSON}" >/dev/null
echo "DESIRED_CELLS_JSON=${DESIRED_CELLS_JSON}" >> "${GITHUB_ENV}"
fi

- uses: google-github-actions/setup-gcloud@v2

Expand All @@ -87,12 +162,37 @@ jobs:
test "${DIGEST}" = "${EXPECTED_IMAGE_DIGEST}"

- name: Deploy director blue/green
env:
# An image change reads every cell's admit mode before the traffic move.
ORCA_RELAY_ADMIN_ID_TOKEN: ${{ steps.google-auth.outputs.id_token }}
RESERVE_PLACEMENT: ${{ inputs.reserve-placement }}
SHADOW_SEAT_FEED_CELLS: ${{ inputs.shadow-seat-feed-cells }}
run: |
regional_version="$(gcloud secrets versions describe latest \
--project "${GCP_PROJECT_ID}" --secret "${REGIONAL_PLACEMENT_SECRET}" \
--format='value(name)' | awk -F/ '{print $NF}')"
[[ "${regional_version}" =~ ^[1-9][0-9]*$ ]]
RELEASE_ID="${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}-${GITHUB_SHA:0:8}"
identity_args=()
if test "${BOOTSTRAP_RUNTIME_IDENTITY}" = true; then
identity_args=(
--bootstrap-runtime-identity true
--predecessor-runtime-service-account "${PREDECESSOR_RUNTIME_SERVICE_ACCOUNT}"
--predecessor-image-digest "${PREDECESSOR_IMAGE_DIGEST}"
)
fi
# Omitted, the deploy script inherits the serving revision's floor.
floor_args=()
if test "${MIN_INSTANCES}" != preserve; then
floor_args=(--min-instances "${MIN_INSTANCES}")
fi
topology_args=()
if test "${CAPACITY_CELL_ID}" != none; then
topology_args=(
--capacity-cell-id "${CAPACITY_CELL_ID}"
--director-cells-json "${DESIRED_CELLS_JSON}"
)
fi
node dev/scripts/deploy-relay-blue-green.mjs \
--project "${GCP_PROJECT_ID}" \
--region "${GCP_REGION}" \
Expand All @@ -101,9 +201,20 @@ jobs:
--role director \
--max-instances 2 \
--capacity-service-account "${CAPACITY_SERVICE_ACCOUNT}" \
--deploy-service-account "${DEPLOY_SERVICE_ACCOUNT}" \
--asia-proof-service-account "${ASIA_PROOF_SERVICE_ACCOUNT}" \
--regional-placement-secret-version "${regional_version}" \
--min-instances 0 \
"${floor_args[@]}" \
--runtime-service-account "${DIRECTOR_RUNTIME_SERVICE_ACCOUNT}" \
"${identity_args[@]}" \
--rehome-director-service-account "${DIRECTOR_RUNTIME_SERVICE_ACCOUNT}" \
--rehome-audience "${REHOME_AUDIENCE}" \
--rehome-control-origin https://relay-staging.onorca.dev \
--expected-rehome-generation "${EXPECTED_REHOME_GENERATION}" \
"${topology_args[@]}" \
--admin-audience https://relay-staging.onorca.dev/v1/admin/drain \
--reserve-placement "${RESERVE_PLACEMENT}" \
--shadow-seat-feed-cells "${SHADOW_SEAT_FEED_CELLS}" \
--release-id "${RELEASE_ID}"

- name: Smoke director health
Expand Down
42 changes: 27 additions & 15 deletions .github/workflows/cloud-operate-relay-production-cell-flags.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,26 @@ on:
description: Exact cell id, e.g. production-gce-c26
required: true
type: string
readiness-local:
description: /ready answers from the cell alone (local readiness)
required: true
default: 'false'
type: choice
options: ['false', 'true']
ticket-check:
description: Shadow-check the director's assignment lease on host hellos
break-glass:
description: >-
Only for a dead or unreachable reserve cell, with set admitMode=default. Typed as
BREAK GLASS <cell-id>; records db without the cell's read-back
required: false
default: ''
type: string
confirm-reserve:
description: Required for admitMode=reserve, typed as RESERVE <cell-id>
required: false
default: ''
type: string
set:
description: >-
Switches to change, e.g. readinessLocal=true,admitMode=reserve (key=default removes a
key). Every other switch keeps its current value. Known: readinessLocal, ticketCheck,
admitMode, intakePerSec, reserveDryRun, rejectionFence, readTimeoutMarginMs,
reregisterInFlight
required: true
default: 'off'
type: choice
options: ['off', 'shadow']
type: string
expected-generation:
description: Exact current object generation from a dry run, or 0 if none exists
required: true
Expand Down Expand Up @@ -55,15 +63,17 @@ jobs:
operate:
if: ${{ vars.ORCA_CLOUD_OPERATIONS_ENABLED == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 10
# A flip back waits for the cell to lease every control: 8-50 minutes, scaled to its controls.
timeout-minutes: 60
environment: production
env:
MODE: ${{ inputs.mode }}
CELL_ID: ${{ inputs.cell-id }}
READINESS_LOCAL: ${{ inputs.readiness-local }}
TICKET_CHECK: ${{ inputs.ticket-check }}
FLAG_CHANGES: ${{ inputs.set }}
EXPECTED_GENERATION: ${{ inputs.expected-generation }}
CONFIRMATION: ${{ inputs.confirmation }}
CONFIRM_RESERVE: ${{ inputs.confirm-reserve }}
BREAK_GLASS: ${{ inputs.break-glass }}
GCP_PROJECT_ID: onorca-cloud
steps:
- uses: actions/checkout@v4
Expand Down Expand Up @@ -95,7 +105,9 @@ jobs:
--mode "${MODE}" --cell-id "${CELL_ID}" \
--cell-origin "https://${CELL_ID#production-gce-}.relay.onorca.dev" \
--project-id "${GCP_PROJECT_ID}" \
--readiness-local "${READINESS_LOCAL}" --ticket-check "${TICKET_CHECK}" \
--set "${FLAG_CHANGES}" \
--director-origin "https://relay.onorca.dev" --confirm-reserve "${CONFIRM_RESERVE}" \
--break-glass "${BREAK_GLASS}" \
--expected-generation "${EXPECTED_GENERATION}" --confirmation "${CONFIRMATION}" \
| tee "${RUNNER_TEMP}/relay-cell-flags.jsonl"

Expand Down
Loading
Loading