Skip to content

Optimize settings schema generation during release process. - #13240

Merged
vorporeal merged 16 commits into
masterfrom
david/optimize-settings-schema-generation-during-release
Aug 23, 2026
Merged

Optimize settings schema generation during release process.#13240
vorporeal merged 16 commits into
masterfrom
david/optimize-settings-schema-generation-during-release

Conversation

@vorporeal

@vorporeal vorporeal commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

Description

Problem

The release pipeline generated settings_schema.json with a separate generate_settings_schema Cargo binary. PR #12884 gave that binary the application feature set so that it generated an accurate schema.

On macOS, the feature set enabled dynamic Sentry framework linkage. The release job ran the generator outside the application bundle. The binary had no runtime search path for the bundled framework, so dyld could not load Sentry.framework.

A framework search path would fix that immediate error, but it would not fix the release design. Packaging-only and cross-target jobs would still compile and link a separate Warp binary only to generate the schema. That work adds release time and can generate a schema with the wrong channel or feature state.

Approach

This PR moves schema generation into the main Warp executable:

  • warp dump-settings-schema [output-path] generates the schema with the executable's initialized channel and feature flags.
  • The command writes files atomically. It writes to standard output when the output path is not present.
  • Native application builds run the command with the production executable.
  • Cross-target and packaging-only jobs consume a workflow-scoped canonical schema artifact for the same operating system and channel.
  • macOS and Linux jobs generate schemas for each native architecture and compare them byte for byte before they select the canonical schema.
  • Windows uses the x64 schema for both architectures. The current Windows ARM64 binary is cross-compiled on an x64 runner, so the workflow cannot execute it for the same comparison.
  • TUI binaries expose dump-settings-schema for local development. Packaged TUI jobs still consume the canonical application-generated schema. Each public setting has an x-warp-surfaces annotation that identifies its GUI and TUI surfaces.
  • Resource preparation requires exactly one input: SETTINGS_SCHEMA_EXECUTABLE or SETTINGS_SCHEMA_SOURCE.
  • Linux keeps the reusable schema outside the package output directory. This prevents the schema from becoming an unintended top-level release asset.
  • Nix and remote deployment paths run the target executable when that executable is available on the target system.

The standalone generator binary and its separate Cargo target are removed.

Alternatives considered

Set DYLD_FRAMEWORK_PATH for the standalone generator

This change would fix the immediate macOS launch error. It would keep the separate generator build and would not help cross-target or packaging-only jobs.

Remove cocoa_sentry or use a reduced standalone feature set

This change would avoid the dynamic framework dependency. It would also create a different Cargo unit and could generate a schema that does not match the shipped application feature set.

Revert the feature-set parity change

This change would restore the old release behavior, but it would also restore the schema mismatch that PR #12884 tried to remove.

Move the generator to a separate crate

A separate crate does not help if it still links the Warp dependency graph. It would still require another compilation and link step.

Build the generator with the initial Cargo command

This change would remove the later Cargo command, but the generator would remain a separate binary target. It would also not solve the cross-target packaging case.

Add dedicated schema producer jobs

A dedicated job would reduce dependencies between packaging jobs. It would also build Warp only to generate a schema. This PR instead reuses the native production executables that the release already builds.

Add metadata and hash sidecar files

Sidecar files could improve diagnostics and support artifact reuse across workflow runs. This workflow uses same-run artifacts, explicit job dependencies, fail-closed resource inputs, and byte-for-byte architecture comparisons. Those controls are sufficient for this change. Sidecar files can be added if the workflow later reuses schemas across runs.

Linked Issue

There is no linked issue. This PR addresses a release failure introduced after PR #12884.

  • The linked issue is labeled ready-to-spec or ready-to-implement. Not applicable.
  • Where appropriate, screenshots or a short video of the implementation are included below. Not applicable because this is a release pipeline change.

Testing

  • ./script/format --check
  • cargo clippy --workspace --exclude warp_completer --all-targets --tests -- -D warnings
  • cargo clippy -p warp --all-targets --tests -- -D warnings
  • cargo clippy -p warp_completer --all-targets --tests -- -D warnings
  • cargo nextest run -p warp -E 'test(schema_generation)'
  • cargo check -p warp --bin warp-oss --features release_bundle,gui
  • cargo check -p warp_tui --bin warp-tui-oss --features release_bundle,standalone
  • script/test_prepare_bundled_resources
  • Bash syntax checks for the changed bundle, resource, and deployment scripts
  • PowerShell parsing for the changed Windows scripts
  • actionlint for .github/workflows/create_release.yml
  • YAML parsing for .github/actions/bundle_arch_package/action.yml
  • I have manually tested my changes locally with ./script/run. This check is not applicable because this PR does not change interactive application behavior.

An end-to-end release workflow run is still required to validate package publication and cross-job artifact transfer on all release platforms.

Agent Mode

  • Warp Agent Mode - This PR was created via Warp's AI Agent Mode

CHANGELOG-NONE

Co-Authored-By: Warp agent@warp.dev

@cla-bot cla-bot Bot added the cla-signed label Jun 30, 2026

Copy link
Copy Markdown
Contributor Author

This stack of pull requests is managed by Graphite. Learn more about stacking.

Comment thread .github/workflows/create_release.yml Dismissed
Comment on lines +556 to +665
name: Build Release Binary (macOS TUI ${{ matrix.arch }})
runs-on: macos-26-xlarge
needs: prepare_release
if: ${{ inputs.build_macos != false }}
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
include:
- arch: aarch64
- arch: x86_64
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6

- uses: ./.github/actions/prepare_environment
with:
target_os: macos
is_self_hosted: false
ref: ${{ needs.prepare_release.outputs.release_branch }}
install_release_deps: true
ssh_key: ${{ secrets.WARP_CHANNEL_CONFIG_ACCESS_SSH_KEY }}

- name: Ensure rust target is installed
run: rustup target add ${{ matrix.arch }}-apple-darwin
shell: bash

# Install go toolchain, as it may be needed for some build steps.
- name: Setup Go
uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6
with:
go-version: stable

- name: Get channel configuration
id: get-config
uses: ./.github/actions/get_channel_config/
with:
config_file: ${{ env.CONFIG_FILE }}
channel: ${{ inputs.channel }}

# Only the binary matters here; this job's own bundled resources are
# discarded, so skip signing/notarization and the (otherwise mandatory)
# schema, both of which belong to the packaging step below.
- name: Build ${{ matrix.arch }} binary
id: build_tui
run: |
script/bundle --channel $CHANNEL --arch ${{ matrix.arch }} --artifact tui --nosign
shell: bash
env:
CHANNEL: ${{ steps.get-config.outputs.channel }}
GIT_RELEASE_TAG: ${{ needs.prepare_release.outputs.release_tag }}
NO_LICENSES: "1"
SKIP_SETTINGS_SCHEMA: "1"

# binary_path is already copied out of the per-target-triple Cargo output
# directory; --skip-build (used by release_macos_tui below) re-derives
# that copy from the triple directory, so preserve it here instead.
- name: Create tar archive with build artifacts
run: |
BINARY_PATH="${{ steps.build_tui.outputs.binary_path }}"
PROFILE_DIR="${BINARY_PATH#target/}"
PROFILE_DIR="${PROFILE_DIR%/bundle/osx/*}"
RAW_BINARY_PATH="target/${{ steps.build_tui.outputs.rust_target }}/$PROFILE_DIR/$(basename "$BINARY_PATH")"
TAR_PATHS=("$RAW_BINARY_PATH")
if [[ -e "$RAW_BINARY_PATH.dSYM" ]]; then
TAR_PATHS+=("$RAW_BINARY_PATH.dSYM")
fi
tar czfv build-artifacts.tar.gz "${TAR_PATHS[@]}"
shell: bash

- name: Archive ${{ matrix.arch }} TUI build artifacts
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: macos-tui-${{ matrix.arch }}-${{ steps.get-config.outputs.channel }}
retention-days: 1
# We compress the tar archive, so no need to re-compress.
compression-level: 0
path: build-artifacts.tar.gz

release_macos_tui:
name: Build Release (macOS TUI ${{ matrix.arch }})
runs-on: macos-26-xlarge
needs: [prepare_release, release_macos_single_arch, build_macos_tui_binaries]
if: ${{ inputs.build_macos != false }}
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
include:
- arch: aarch64
- arch: x86_64
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6

- uses: ./.github/actions/prepare_environment
with:
target_os: macos
is_self_hosted: false
ref: ${{ needs.prepare_release.outputs.release_branch }}
install_release_deps: true
ssh_key: ${{ secrets.WARP_CHANNEL_CONFIG_ACCESS_SSH_KEY }}

# Install go toolchain, as it may be needed for some build steps.
- name: Setup Go
uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6
with:
go-version: stable

- name: Get channel configuration
id: get-config
uses: ./.github/actions/get_channel_config/
Comment thread .github/workflows/create_release.yml Dismissed
@warp-agent-staging

Copy link
Copy Markdown
Contributor

This PR was generated with Warp.

Comment @warp-factory on this PR to send it follow-up work.

View run View conversation View on Slack

Comment on lines +445 to +562
name: Build Release Binary (macOS CLI ${{ matrix.arch }})
runs-on: macos-26-xlarge
needs: prepare_release
if: ${{ inputs.build_macos != false }}
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
include:
- arch: aarch64
- arch: x86_64
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6

- uses: ./.github/actions/prepare_environment
with:
target_os: macos
is_self_hosted: false
ref: ${{ needs.prepare_release.outputs.release_branch }}
install_release_deps: true
ssh_key: ${{ secrets.WARP_CHANNEL_CONFIG_ACCESS_SSH_KEY }}

- name: Ensure rust target is installed
run: rustup target add ${{ matrix.arch }}-apple-darwin
shell: bash

# Install go toolchain, as it may be needed for some build steps.
- name: Setup Go
uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6
with:
go-version: stable

- name: Get channel configuration
id: get-config
uses: ./.github/actions/get_channel_config/
with:
config_file: ${{ env.CONFIG_FILE }}
channel: ${{ inputs.channel }}

# Only the binary matters here; this job's own bundled resources are
# discarded, so skip signing/notarization and the (otherwise mandatory)
# schema, both of which belong to the packaging step below.
- name: Build ${{ matrix.arch }} binary
id: build_cli
run: |
script/bundle --channel $CHANNEL --arch ${{ matrix.arch }} --artifact cli --nosign
shell: bash
env:
CHANNEL: ${{ steps.get-config.outputs.channel }}
GIT_RELEASE_TAG: ${{ needs.prepare_release.outputs.release_tag }}
NO_LICENSES: "1"
SKIP_SETTINGS_SCHEMA: "1"

# binary_path is already copied out of the per-target-triple Cargo output
# directory; --skip-build (used by release_macos_cli below) re-derives
# that copy from the triple directory, so preserve it here instead. The
# dSYM Cargo produces there is itself a symlink into target/.../deps, so
# (as with the app archive above) also include its resolved target;
# otherwise the link dangles once extracted into a fresh job.
- name: Create tar archive with build artifacts
run: |
BINARY_PATH="${{ steps.build_cli.outputs.binary_path }}"
PROFILE_DIR="${BINARY_PATH#target/}"
PROFILE_DIR="${PROFILE_DIR%/bundle/osx/*}"
RAW_BINARY_PATH="target/${{ steps.build_cli.outputs.rust_target }}/$PROFILE_DIR/$(basename "$BINARY_PATH")"
RAW_DSYM_PATH="$RAW_BINARY_PATH.dSYM"
TAR_PATHS=("$RAW_BINARY_PATH")
if [[ -e "$RAW_DSYM_PATH" ]]; then
TAR_PATHS+=("$RAW_DSYM_PATH")
if [[ -L "$RAW_DSYM_PATH" ]]; then
REAL_DSYM_PATH="$(python3 -c 'import os,sys; print(os.path.relpath(sys.argv[1]))' "$(realpath "$RAW_DSYM_PATH")")"
TAR_PATHS+=("$REAL_DSYM_PATH")
fi
fi
tar czfv build-artifacts.tar.gz "${TAR_PATHS[@]}"
shell: bash

- name: Archive ${{ matrix.arch }} CLI build artifacts
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: macos-cli-${{ matrix.arch }}-${{ steps.get-config.outputs.channel }}
retention-days: 1
# We compress the tar archive, so no need to re-compress.
compression-level: 0
path: build-artifacts.tar.gz

release_macos_cli:
name: Build Release (macOS CLI ${{ matrix.arch }})
runs-on: macos-26-xlarge
needs: [prepare_release, release_macos_single_arch, build_macos_cli_binaries]
if: ${{ inputs.build_macos != false }}
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
include:
- arch: aarch64
- arch: x86_64
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6

- uses: ./.github/actions/prepare_environment
with:
target_os: macos
is_self_hosted: false
ref: ${{ needs.prepare_release.outputs.release_branch }}
install_release_deps: true
ssh_key: ${{ secrets.WARP_CHANNEL_CONFIG_ACCESS_SSH_KEY }}

# Install go toolchain, as it may be needed for some build steps.
- name: Setup Go
uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6
with:
go-version: stable

- name: Get channel configuration
id: get-config
uses: ./.github/actions/get_channel_config/
Comment on lines +563 to +761
with:
config_file: ${{ env.CONFIG_FILE }}
channel: ${{ inputs.channel }}

- name: Download ${{ matrix.arch }} CLI build artifacts
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: macos-cli-${{ matrix.arch }}-${{ steps.get-config.outputs.channel }}

- name: Extract CLI build artifacts
run: tar xvfz build-artifacts.tar.gz
shell: bash

- name: Download canonical macOS settings schema
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: settings-schema-macos-aarch64-${{ steps.get-config.outputs.channel }}
path: .release-artifacts/settings-schema-macos

- name: Bundle ${{ matrix.arch }} binary
id: bundle_cli
run: |
script/bundle --read-passwords-from-env --channel $CHANNEL --arch ${{ matrix.arch }} --artifact cli
script/bundle --skip-build --read-passwords-from-env --channel $CHANNEL --arch ${{ matrix.arch }} --artifact cli
shell: bash
env:
CHANNEL: ${{ steps.get-config.outputs.channel }}
GIT_RELEASE_TAG: ${{ needs.prepare_release.outputs.release_tag }}
WARP_DEVELOPER_ID_CERT: ${{ secrets.WARP_DEVELOPER_ID_CERT }}
WARP_DEVELOPER_ID_CERT_PASSWORD: ${{ secrets.WARP_DEVELOPER_ID_CERT_PASSWORD }}
WARP_CODESIGN_KEYCHAIN_PASSWORD: ${{ secrets.WARP_CODESIGN_KEYCHAIN_PASSWORD }}
WARP_NOTARIZATION_APPLE_ID: ${{ secrets.WARP_NOTARIZATION_APPLE_ID }}
WARP_NOTARIZATION_PASSWORD: ${{ secrets.WARP_NOTARIZATION_PASSWORD }}
SETTINGS_SCHEMA_SOURCE: ${{ github.workspace }}/.release-artifacts/settings-schema-macos/settings_schema.json

- name: Package CLI binary
run: |
mv ${{ steps.bundle_cli.outputs.binary_path }} oz-${{ steps.get-config.outputs.channel }}
tar czf oz-${{ steps.get-config.outputs.channel }}-macos-${{ matrix.arch }}.tar.gz oz-${{ steps.get-config.outputs.channel }} -C "$(dirname "${{ steps.bundle_cli.outputs.bundled_resources_dir }}")" resources

- name: Add CLI to GitHub release assets
if: ${{ needs.prepare_release.outputs.should_publish == 'true' }}
uses: softprops/action-gh-release@3d0d9888cb7fd7b750713d6e236d1fcb99157228 # v3.0.2
with:
tag_name: ${{ needs.prepare_release.outputs.release_tag }}
files: oz-${{ steps.get-config.outputs.channel }}-macos-${{ matrix.arch }}.tar.gz
token: ${{ secrets.GITHUB_TOKEN }}

- uses: google-github-actions/auth@7c6bc770dae815cd3e89ee6cdf493a5fab2cc093 # v3.0.0
if: ${{ needs.prepare_release.outputs.should_publish == 'true' }}
with:
credentials_json: ${{ secrets.GOOGLE_APPLICATION_CREDENTIALS }}

- name: Upload CLI to Google Cloud Storage
if: ${{ needs.prepare_release.outputs.should_publish == 'true' }}
uses: google-github-actions/upload-cloud-storage@e95a15f226403ed658d3e65f40205649f342ba2c # v1
with:
path: oz-${{ steps.get-config.outputs.channel }}-macos-${{ matrix.arch }}.tar.gz
destination: warp-releases/${{ steps.get-config.outputs.channel }}/${{ needs.prepare_release.outputs.release_tag }}/cli/macos/${{ matrix.arch }}
headers: |-
cache-control: ${{ steps.get-config.outputs.gcs_cache_control_value }}

- name: Upload CLI as workflow artifact
if: ${{ needs.prepare_release.outputs.should_publish != 'true' }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: release-macos-cli-${{ matrix.arch }}-${{ steps.get-config.outputs.channel }}
path: oz-${{ steps.get-config.outputs.channel }}-macos-${{ matrix.arch }}.tar.gz

- name: Set up Sentry CLI
if: ${{ needs.prepare_release.outputs.should_publish == 'true' }}
uses: matbour/setup-sentry-cli@3e938c54b3018bdd019973689ef984e033b0454b # v2.0.0
with:
token: ${{ secrets.SENTRY_RELEASE_TOKEN }}
organization: warpdotdev
project: ${{ steps.get-config.outputs.sentry_project }}

- name: Upload debugging symbols to Sentry
if: ${{ needs.prepare_release.outputs.should_publish == 'true' }}
run: |
script/sentry_upload_dif.sh
shell: bash
env:
DEBUG_FILE_OR_FOLDER_PATH: ${{ steps.bundle_cli.outputs.dsym_path }}

release_macos_tui:
name: Build Release (macOS TUI ${{ matrix.arch }})
# Builds the TUI binary only, with no dependency on release_macos_single_arch,
# so this heavy build+notarize step keeps running in parallel with the app
# build instead of serializing behind it. Packaging (which needs the
# canonical schema release_macos_single_arch produces) happens in
# release_macos_tui below, mirroring the build_windows_binaries /
# release_windows split.
build_macos_tui_binaries:
name: Build Release Binary (macOS TUI ${{ matrix.arch }})
runs-on: macos-26-xlarge
needs: prepare_release
if: ${{ inputs.build_macos != false }}
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
include:
- arch: aarch64
- arch: x86_64
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6

- uses: ./.github/actions/prepare_environment
with:
target_os: macos
is_self_hosted: false
ref: ${{ needs.prepare_release.outputs.release_branch }}
install_release_deps: true
ssh_key: ${{ secrets.WARP_CHANNEL_CONFIG_ACCESS_SSH_KEY }}

- name: Ensure rust target is installed
run: rustup target add ${{ matrix.arch }}-apple-darwin
shell: bash

# Install go toolchain, as it may be needed for some build steps.
- name: Setup Go
uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6
with:
go-version: stable

- name: Get channel configuration
id: get-config
uses: ./.github/actions/get_channel_config/
with:
config_file: ${{ env.CONFIG_FILE }}
channel: ${{ inputs.channel }}

# Only the binary matters here; this job's own bundled resources are
# discarded, so skip signing/notarization and the (otherwise mandatory)
# schema, both of which belong to the packaging step below.
- name: Build ${{ matrix.arch }} binary
id: build_tui
run: |
script/bundle --channel $CHANNEL --arch ${{ matrix.arch }} --artifact tui --nosign
shell: bash
env:
CHANNEL: ${{ steps.get-config.outputs.channel }}
GIT_RELEASE_TAG: ${{ needs.prepare_release.outputs.release_tag }}
NO_LICENSES: "1"
SKIP_SETTINGS_SCHEMA: "1"

# binary_path is already copied out of the per-target-triple Cargo output
# directory; --skip-build (used by release_macos_tui below) re-derives
# that copy from the triple directory, so preserve it here instead. The
# dSYM Cargo produces there is itself a symlink into target/.../deps, so
# (as with the app archive above) also include its resolved target;
# otherwise the link dangles once extracted into a fresh job.
- name: Create tar archive with build artifacts
run: |
BINARY_PATH="${{ steps.build_tui.outputs.binary_path }}"
PROFILE_DIR="${BINARY_PATH#target/}"
PROFILE_DIR="${PROFILE_DIR%/bundle/osx/*}"
RAW_BINARY_PATH="target/${{ steps.build_tui.outputs.rust_target }}/$PROFILE_DIR/$(basename "$BINARY_PATH")"
RAW_DSYM_PATH="$RAW_BINARY_PATH.dSYM"
TAR_PATHS=("$RAW_BINARY_PATH")
if [[ -e "$RAW_DSYM_PATH" ]]; then
TAR_PATHS+=("$RAW_DSYM_PATH")
if [[ -L "$RAW_DSYM_PATH" ]]; then
REAL_DSYM_PATH="$(python3 -c 'import os,sys; print(os.path.relpath(sys.argv[1]))' "$(realpath "$RAW_DSYM_PATH")")"
TAR_PATHS+=("$REAL_DSYM_PATH")
fi
fi
tar czfv build-artifacts.tar.gz "${TAR_PATHS[@]}"
shell: bash

- name: Archive ${{ matrix.arch }} TUI build artifacts
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: macos-tui-${{ matrix.arch }}-${{ steps.get-config.outputs.channel }}
retention-days: 1
# We compress the tar archive, so no need to re-compress.
compression-level: 0
path: build-artifacts.tar.gz

release_macos_tui:
name: Build Release (macOS TUI ${{ matrix.arch }})
runs-on: macos-26-xlarge
needs: [prepare_release, release_macos_single_arch, build_macos_tui_binaries]
if: ${{ inputs.build_macos != false }}
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
include:
- arch: aarch64
- arch: x86_64
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6

- uses: ./.github/actions/prepare_environment
with:
target_os: macos
is_self_hosted: false
ref: ${{ needs.prepare_release.outputs.release_branch }}
install_release_deps: true
ssh_key: ${{ secrets.WARP_CHANNEL_CONFIG_ACCESS_SSH_KEY }}
Comment thread .github/workflows/create_release.yml Outdated
Comment thread .github/workflows/create_release.yml Outdated
@vorporeal
vorporeal marked this pull request as ready for review August 23, 2026 00:38
vorporeal and others added 16 commits August 22, 2026 20:38
Co-Authored-By: Warp <agent@warp.dev>
… and fix Cargo.toml spacing

- script/run-tui: skip settings schema generation for local TUI runs, since
  the TUI binaries don't implement dump-settings-schema (only the full app
  binary does) and packaged TUI builds consume a schema generated from that
  binary during release instead. This fixes a regression where every local
  ./script/run-tui invocation failed with "Set SETTINGS_SCHEMA_EXECUTABLE or
  SETTINGS_SCHEMA_SOURCE" after prepare_bundled_resources started failing
  closed.
- script/test_prepare_bundled_resources: add coverage for the
  SKIP_SETTINGS_SCHEMA=1 path that script/run-tui now relies on.
- .github/workflows/create_release.yml: document why the macOS
  aarch64/x86_64 settings schema comparison expects byte-identical output.
- app/Cargo.toml: collapse the double blank line left behind by removing the
  generate_settings_schema [[bin]] block.
Review found that script/run-tui's SKIP_SETTINGS_SCHEMA=1 silently
disabled the bundled modify-settings skill for local TUI sessions
(SkillManager gates it on resources/settings_schema.json existing).

warp_tui already links the shared warp crate with its full default
feature set to build at all, so generating the schema from the
just-built TUI binary itself costs nothing extra:

- Expose settings::dump_settings_schema as pub (was pub(crate)) so
  warp_tui can call it directly.
- Add a dump-settings-schema [output_path] subcommand to the TUI's own
  CLI (crates/warp_tui/src/session.rs), mirroring
  warp_cli::Command::DumpSettingsSchema's shape, dispatched before the
  normal TUI bootstrap.
- script/run-tui now points SETTINGS_SCHEMA_EXECUTABLE at the binary it
  just built instead of skipping schema generation.
- Add script/test_run_tui_settings_schema: builds warp-tui-oss, checks
  it implements dump-settings-schema directly, and confirms the
  prepared resources satisfy modify-settings' exact activation gate.

Packaging is untouched: release TUI packages still consume the
canonical app-generated schema, and this local dev-only producer never
enters the release path, so no schema-parity checks are needed.

Also corrects the PR description bullet that said TUI binaries don't
implement dump-settings-schema; that was incidental (TUI binaries parse
their own CLI args rather than warp_cli::Command), not policy.
This PR made release_macos_tui, release_linux_tui, and release_windows_tui
wait on the job that produces their platform's canonical schema
(release_macos_single_arch, release_linux_x86, build_windows_binaries
respectively). Those jobs previously needed only prepare_release, so this
serialized the TUI build+notarize/package phase behind the (slower) app
build phase, undoing the parallelism the release pipeline relied on.

Split each into a build-only job (needs: prepare_release, builds the raw
TUI binary, no schema/signing) and the existing release_*_tui job trimmed
to packaging only (signs/notarizes/packages using the schema and the
binary handed off from the build job). This mirrors the
build_windows_binaries -> release_windows split already used for the GUI
Windows binary:

- macOS: new build_macos_tui_binaries (per arch) builds with --nosign,
  NO_LICENSES=1, SKIP_SETTINGS_SCHEMA=1, and uploads the binary+dSYM from
  their per-target-triple Cargo path. release_macos_tui now downloads
  that artifact and packages with --skip-build.
- Linux: new build_linux_tui_binaries (per arch, native runners) builds
  with NO_LICENSES=1, SKIP_SETTINGS_SCHEMA=1, and uploads the binary.
  release_linux_tui downloads it and packages with --skip-build.
- Windows: new build_windows_tui_binaries builds with -skip_build_installer
  (already schema-free) and uploads the binary+pdb. release_windows_tui
  downloads it and locates the same outputs via
  -skip_build_binary -skip_build_installer (the same locate idiom
  release_windows already uses) before signing and packaging.

release_linux_arm is intentionally left alone: it builds nothing it can
execute (consumes pre-built artifacts from build_linux_arm_binaries /
build_linux_cli_arm_binaries), so it must keep waiting on release_linux_x86
for the schema regardless.

No packaging behavior, published artifact, or the fail-closed
SETTINGS_SCHEMA_EXECUTABLE/SOURCE contract changed -- only when each half
of the split runs and what it waits on.
… dSYM symlink

Both were artifact-handoff bugs from the build/package split in 30771d4:

- Linux: the build job archived executable_path, which
  script/linux/bundle already reports as the staged
  target/<profile>/bundle/linux/<bin> copy. But --skip-build (used by
  release_linux_tui) still unconditionally cp's from the raw
  target/<profile>/<bin> Cargo output before staging it again, and that
  raw path was never in the archive. Archive the raw path instead, derived
  from debug_executable_path (raw path + ".debug") so we don't have to
  duplicate the channel/profile-naming logic that lives in the script.

- macOS: the build job archived the raw per-triple dSYM as a bare path.
  Cargo's dSYM there is a symlink into target/.../deps, so once extracted
  in a fresh packaging job the link dangled and the dwarfdump/sentry-cli
  verification in release_macos_tui failed. Also archive the symlink's
  resolved target (as a relative path), mirroring the existing app
  artifact's binary_path/dsym_path/dsym_realpath pattern.

Verified both fixes locally with tar archive/extract simulations in a
separate directory, confirming the raw Linux binary path is restored and
the macOS dSYM symlink resolves (non-dangling) post-extraction.

Swept the rest of each TUI packaging job for the same class of assumption
(a path resolving into target/ that must survive the new build/package
artifact boundary):
- macOS: only the binary and dSYM are read from target/ in the tui branch
  of script/macos/bundle; both are now covered. Codesigning/notarization
  operate on the OUT_DIR copy created fresh in the packaging job itself.
- Linux: only the executable path is read from target/ for the tui
  artifact; now covered. prepare_bundled_resources and the tarball
  validation step operate on the OUT_DIR copy created fresh in the
  packaging job.
- Windows: already used direct actions/upload-artifact and
  actions/download-artifact on the script's own absolute-path outputs
  (binary_path, pdb_file_path), matching the existing
  build_windows_binaries -> release_windows handoff exactly, so this
  class of bug does not apply there.

actionlint diagnostic count is unchanged (17, same pre-existing
custom-runner-label and unrelated action-metadata noise as before this
commit) -- no new issues introduced.
… targets

A live release run failed: build_linux_cli_arm_binaries cross-compiles an
aarch64 CLI binary on an x86_64 runner and set no
SETTINGS_SCHEMA_SOURCE/SETTINGS_SCHEMA_EXECUTABLE, so script/linux/bundle
defaulted to executing the just-built aarch64 binary on the x86_64 host to
generate its settings schema, failing with an exec format error.

Specific fix: skip schema generation in build_linux_cli_arm_binaries via
SKIP_SETTINGS_SCHEMA=1 - release_linux_arm, which packages this binary,
always supplies its own SETTINGS_SCHEMA_SOURCE, so this job never needs one.

General hardening: script/linux/bundle, script/macos/bundle, and
script/windows/bundle.ps1 all default SETTINGS_SCHEMA_EXECUTABLE to the
just-built binary when unset, assuming it's executable on the host. Compute
whether the host can actually execute the target architecture (accounting
for Rosetta 2 on macOS and Windows' arm64-host x64-emulation) and fail with
a clear error instead of defaulting blindly when it can't.
script/windows/prepare_bundled_resources.ps1 was already fail-closed with no
such default, so it needed no change.
script/macos/bundle: uname -m reports the running process's architecture,
not the hardware. In a Rosetta-translated x86_64 shell on Apple Silicon it
reports x86_64, which made the new cross-compile guard reject --arch aarch64
CLI/warpctrl/TUI builds that would actually succeed. Check
hw.optional.arm64 first, which reflects the real hardware.

script/windows/bundle.ps1: similarly, PROCESSOR_ARCHITECTURE reports AMD64
for an x64 process running under WOW64 on a Windows-on-ARM host.
PROCESSOR_ARCHITEW6432 carries the true native host architecture in that
case, so prefer it when present.
…ackaging-only jobs

Both jobs serialized their (slow, notarize/codesign- or gpg-signing-heavy)
build behind release_macos_single_arch / release_linux_x86 respectively,
even though they only need the canonical settings schema those jobs
produce, not their binaries. Split each into a build-only job (needs only
prepare_release) and a trimmed packaging job that downloads the build
artifact and the canonical schema, mirroring the build_*_tui_binaries /
release_*_tui split already established for the TUI jobs.

- build_macos_cli_binaries builds with --nosign and SKIP_SETTINGS_SCHEMA=1;
  release_macos_cli downloads it and runs --skip-build with the real
  schema and signing secrets. Preserves both the raw-vs-staged binary_path
  distinction and the dSYM symlink target when archiving, per the same
  class of bug fixed for the TUI split.
- build_linux_cli_x86_binaries builds with --packages none and
  SKIP_SETTINGS_SCHEMA=1; release_linux_cli_x86 downloads it and runs
  --skip-build with the real schema. Unlike the TUI job, the cli artifact's
  executable_path/debug_executable_path are already raw target/ paths (no
  staging), so no raw-vs-staged derivation is needed here.
gate_tui_release_artifacts only existed because the TUI jobs were never
added to generate_changelogs' own needs list; it also treated a
deliberately skipped platform (build_macos=false, build_linux=false, or
web on the preview channel) the same as a genuine failure, since it
compared job results directly to 'success' with no notion of 'this
platform was never supposed to run'.

Replace it with collect_results, which aggregates every build/release job
(TUI and non-TUI alike) into one place:
- if: always() so it still runs, and still reports failures, when any of
  its dependencies did not succeed.
- A platform disabled via a workflow input is excluded outright, regardless
  of its (necessarily 'skipped') result. Any other non-'success' result --
  a genuine failure, a cancellation, or a job skipped because one of its
  own dependencies (e.g. a build-only job) failed -- counts as a failure.
- The job itself fails when there is a genuine failure, which is the
  publish gate: generate_changelogs needs collect_results with default
  (success-required) semantics, so it is skipped whenever collect_results
  fails, same as any other failed dependency. should_publish is still
  independently honored via generate_changelogs' own if: condition.
- The failure list is exposed as a job output that
  send_slack_notif_if_unsuccessful now consumes directly, instead of
  recomputing it from a second, separately-maintained list of the same
  jobs. That job keeps if: always() so it can still report on a
  collect_results failure. The existing web-failure-ignored-on-preview
  special case, and the exact user-visible failure-name strings, are
  preserved.

generate_changelogs' needs list collapses from nine individual job
dependencies plus gate_tui_release_artifacts down to prepare_release (for
its release_tag/release_branch/should_publish outputs) and collect_results
(the sole success/failure gate).
collect_results passed a literal false for both Windows leaf jobs'
disabled flag instead of deriving it from inputs.build_windows the same
way as build_macos/build_linux/build_web. With Windows disabled, both
Windows release jobs are correctly skipped by their own if:, but
collect_results treated that skip as a genuine failure, failed the job,
and blocked generate_changelogs (plus fired a false Slack notification)
for an otherwise-publishable partial-platform release.

The complete set of disable inputs enumerated from the workflow's own
workflow_call/workflow_dispatch inputs blocks: build_linux, build_windows,
build_macos, build_web. (should_publish is a separate publish gate, not a
per-platform disable switch.) All four are now represented.
…ad params

Six items from David's review pass:

- Removed the 'Setup Go' step from the two new build-only jobs
  (build_macos_cli_binaries, build_macos_tui_binaries). It was copied
  wholesale from the packaging jobs they were split off from, but nothing
  in the actual build path (cargo build, prepare_bundled_resources) needs a
  Go toolchain. Left the packaging jobs' pre-existing Setup Go steps alone,
  since those predate this PR's TUI/CLI split work.
- Rewrote five 'Builds the X binary only, with no dependency on <job>, so
  ...' comments (build_macos_cli_binaries, build_macos_tui_binaries,
  build_linux_tui_binaries, build_linux_cli_x86_binaries,
  build_windows_tui_binaries) to drop the defensive 'no dependency on'
  framing while keeping the actual rationale (packaging happens in a
  separate job so the build can run in parallel instead of serializing).
- Added a blank line between two steps in build_windows_tui_binaries that
  were missing one.
- Removed the unused cargo_profile parameter from
  script/prepare_bundled_resources (and its Windows PowerShell
  counterpart): the value was accepted and stored but never read anywhere
  in either script. Its doc comment claimed it was 'retained for
  compatibility with existing callers' without naming them; the real
  callers (script/linux/bundle, script/linux/bundle_install,
  script/macos/bundle x3, script/windows/bundle.ps1) do exist, but since
  the parameter does nothing on the receiving end, updated all of them to
  stop passing it instead of keeping a misleading claim.
- Deleted script/test_run_tui_settings_schema. It requires a full cargo
  build (several minutes) to prove two things: that warp-tui-oss wires up
  its dump-settings-schema subcommand to the same function
  schema_generation_tests.rs already unit-tests, and that the resulting
  schema activates the modify-settings skill -- which reduces to checking
  settings_schema.json exists, already exercised (with a fake executable)
  by script/test_prepare_bundled_resources's SETTINGS_SCHEMA_EXECUTABLE
  case. It isn't wired into presubmit or any CI workflow. The one-time
  verification it was added for has already happened; the cost of keeping
  it running (and its real-build dependency) outweighs the thin, mostly
  redundant regression coverage it provides.
- Kept script/test_prepare_bundled_resources: it directly exercises the
  core branching contract of prepare_bundled_resources (the
  SETTINGS_SCHEMA_EXECUTABLE / SETTINGS_SCHEMA_SOURCE / SKIP_SETTINGS_SCHEMA
  paths and their mutual-exclusivity and missing-input failure modes) that
  this PR's cross-compile and host-detection fixes have repeatedly touched,
  at near-zero cost (no real build, self-contained fake executable).
- Added a brief comment on release_linux_tui (previously the only
  packaging job in the split with no comment of its own) explaining why it
  exists as a separate job from build_linux_tui_binaries.

Verified: actionlint 18 findings, unchanged; ./script/format --check clean;
bash -n on all touched shell scripts; PowerShell parser confirms no syntax
errors in both touched .ps1 files; ./script/test_prepare_bundled_resources
still passes after the cargo_profile parameter removal.
…plit comments

The cargo_profile arity change in 074ad8a missed three callers because the
sweep grepped for the parameter name on a single line rather than counting
every call site's actual argument count:

- script/run-tui's prepare_tui_bundled_resources branched on
  $PROFILE_DIR = debug, and only the else branch (any non-debug profile,
  e.g. --release) passed a third positional argument. That branch now dies
  immediately with 'Expected 1-2 arguments but received 3' on the exact
  path that isn't exercised by a plain debug run. Since the parameter is
  gone, both branches are identical now, so the if/else collapses to a
  single call.
- script/deploy_remote_server and script/deploy_remote_server_to_test_vm
  both still passed "$CARGO_PROFILE" as a third argument on its own
  continuation line, which the earlier single-line grep for
  'prepare_bundled_resources.*CARGO_PROFILE' never matched.
- flake.nix's Nix build script passed a literal 'release' as a third
  argument, for the same reason.

Verified the run-tui fix for real, not just by reasoning about it: freed
space on the build cache volume (it was at 100%, unrelated to this change,
from accumulated incremental build artifacts), built the real
warp-tui-oss release binary, then ran the exact
SETTINGS_SCHEMA_EXECUTABLE + 2-argument prepare_bundled_resources
invocation the now-unified prepare_tui_bundled_resources performs for a
non-debug profile against that real binary, and confirmed it generates a
valid settings_schema.json.

Also tightened the build/package split comments per feedback that they
were still too long and, for the Linux TUI pair, explained the same split
twice from both sides. Each pair now gets exactly one 1-2 line comment on
the packaging job (release_macos_cli, release_macos_tui, release_linux_tui,
release_linux_cli_x86, release_windows_tui), stating only what's packaged
here and where the binary came from; the build-only jobs are no longer
separately commented, and the 'mirroring the X / Y split' tails are gone
from all five.

Re-audited every prepare_bundled_resources / prepare_bundled_resources.ps1
caller by argument count rather than by name: script/macos/bundle (x3),
script/linux/bundle, script/linux/bundle_install, script/windows/bundle.ps1,
script/macos/run, script/test_prepare_bundled_resources,
script/test_factory_files_skill.py, script/run-tui, script/deploy_remote_server,
script/deploy_remote_server_to_test_vm, and flake.nix -- all now pass at
most 2 positional arguments (or the .ps1 equivalent), matching what both
scripts accept.
The comment justifying the SKIP_SETTINGS_SCHEMA=1 test case said local TUI
binaries don't implement dump-settings-schema. That was true when written,
but this PR added that subcommand to the TUI binaries themselves
(crates/warp_tui/src/session.rs) and script/run-tui now calls it, so the
comment is a false explanation left behind by a capability change it
predates.

The flag itself is still genuinely exercised elsewhere (script/macos/run,
script/linux/test_bundle_warpctrl, and the release workflow's build-only
jobs all set it to defer schema generation to a later packaging step), so
the test case stays; only the justification was wrong. Replaced it with
that real reason, kept to one line.

Swept every comment this PR touched or added, across the workflow, the
bundle/deploy scripts, and the Rust settings/CLI code, for the same kind of
staleness against the now-final TUI schema capability. Found nothing else:
script/run-tui's own function comment, the DumpSettingsSchema doc comments
in crates/warp_tui and crates/warp_cli, the macOS/Linux cross-arch schema
comparison caveats, and the PR description's TUI bullet all already
describe the current, post-iteration state accurately.

bash -n and a re-run of script/test_prepare_bundled_resources both pass.
build_windows_tui_binaries uploaded binary_path and pdb_file_path directly.
Both live in the same target/<triple>/<profile> directory, so
actions/upload-artifact collapsed the least common ancestor to that
directory and stripped the prefix. release_windows_tui downloaded with
path: ., landing the exe at the workspace root, while its own
script/bundle invocation (--skip_build_binary --skip_build_installer)
recomputes binary_path as the full target/... path. The Trusted Signing
step then failed with 'File not found' on a real release run -- the app
asset DLLs signed fine, only the TUI binary was missing.

The pre-existing app flow (build_windows_binaries / release_windows)
doesn't hit this because it uploads a third, workspace-relative path
(app/assets/windows/<arch>) alongside the same-directory binary_path/
pdb_file_path pair. That third path drags the LCA up to the workspace
root, which preserves the full relative structure for every file in the
artifact -- an accidental property of which paths happen to be listed,
not a guarantee. The Windows TUI split copied the two-path shape without
that accidental third path, so it lost the guarantee.

Fixed by tar-ing with explicit relative paths, the same approach already
used for every macOS/Linux split job in this PR: convert the Windows
absolute path to POSIX with cygpath -u, compute it relative to the
job's cwd with realpath, then tar/extract that. This makes the preserved
structure an explicit property of the archive contents rather than an
emergent property of upload-artifact's LCA algorithm.

Verified the realpath+tar+extract chain directly (not just by reasoning):
simulated the exact target/<triple>/<profile>/<binary+pdb> layout in an
isolated directory, ran the same realpath --relative-to and tar/extract
commands the workflow now runs, and confirmed both files land back at the
identical relative path a fresh consumer's script/bundle invocation
expects. cygpath -u's Windows-path-to-POSIX translation itself is a
standard, long-established git-bash utility I could not exercise directly
in this (Linux) environment, since no Windows runner was available to me.

Audited every upload/download artifact pair introduced by this PR's
platform splits, per the specific question of whether the structure its
consumer resolves is guaranteed or incidental:
- macOS CLI (build_macos_cli_binaries -> release_macos_cli): guaranteed.
  Uploads a single build-artifacts.tar.gz; the internal layout is set
  entirely by the paths passed to , so upload-artifact's LCA
  computation over a one-element path list never enters into it.
- macOS TUI (build_macos_tui_binaries -> release_macos_tui): guaranteed,
  same reasoning.
- Linux CLI x86_64 (build_linux_cli_x86_binaries -> release_linux_cli_x86):
  guaranteed, same reasoning (paths made relative via realpath before
  tar-ing).
- Linux TUI (build_linux_tui_binaries -> release_linux_tui): guaranteed,
  same reasoning.
- Windows TUI (build_windows_tui_binaries -> release_windows_tui): was
  incidental (relied on the two paths happening to share a directory in a
  way that made the bug latent rather than immediate); now guaranteed via
  the same tar approach.

actionlint: 18 findings, unchanged.
@vorporeal
vorporeal force-pushed the david/optimize-settings-schema-generation-during-release branch from fa13404 to bc4e29c Compare August 23, 2026 00:38
@warp-for-oss

warp-for-oss Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

@vorporeal

I'm starting a first review of this pull request.

You can view the conversation on Warp.

I completed the review and no human review was requested for this pull request.

Comment /oz-review on this pull request to retrigger a review (up to 3 times on the same pull request).

Powered by Oz

@warp-for-oss warp-for-oss Bot left a comment

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.

Overview

This PR moves settings schema generation into the shipped Warp executables and rewires release packaging to pass canonical schema artifacts through the macOS, Linux, and Windows jobs.

Concerns

  • The Windows TUI binary-only job invokes the updated bundler without a schema input or SKIP_SETTINGS_SCHEMA, so it will fail before uploading the binary artifact.
  • The Windows TUI packaging job's locate-only bundler invocation also omits a schema input despite using --skip_build_binary, so it will fail before installer packaging can proceed.
  • The Windows app packaging job's locate-only bundler invocation likewise omits a schema input despite using -skip_build_binary, so signing/package steps cannot run.

Verdict

Found: 0 critical, 3 important, 0 suggestions

Request changes

Comment /oz-review on this pull request to retrigger a review (up to 3 times on the same pull request).

Powered by Oz


- name: Build Warp Agent CLI
id: build_tui
run: script/bundle --artifact tui --channel "$CHANNEL" --skip_build_installer --arch ${{ matrix.arch }}

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.

⚠️ [IMPORTANT] This binary-only TUI build now reaches script/windows/bundle.ps1, whose new fail-closed check rejects TUI bundles unless a schema input or SKIP_SETTINGS_SCHEMA=1 is set; add the skip env here like the macOS/Linux binary jobs or the artifact upload will never run.

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.

Not a defect: this invocation passes --skip_build_installer, and script/windows/bundle.ps1 returns at the $SKIP_BUILD_INSTALLER block (emitting binary_path/pdb_file_path, then exit 0) before it ever reaches the schema check further down. No schema input is needed here.

Responding as wilson: Open session · View in factory

- name: Locate TUI binary build outputs
id: build_tui
run: script/bundle --artifact tui --channel "$CHANNEL" --skip_build_installer --arch ${{ matrix.arch }}
run: script/bundle --artifact tui --channel "$CHANNEL" --skip_build_binary --skip_build_installer --arch ${{ matrix.arch }}

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.

⚠️ [IMPORTANT] This locate-only TUI invocation uses --skip_build_binary but does not pass the downloaded schema or set SKIP_SETTINGS_SCHEMA=1, so the updated Windows bundler exits before exposing steps.build_tui.outputs.

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.

Not a defect: same reason as the build job. This passes --skip_build_installer, so bundle.ps1 exits 0 from the $SKIP_BUILD_INSTALLER block after emitting its outputs, well before the schema check. The step that does need a schema — "Bundle signed Warp Agent CLI installer", which omits --skip_build_installer — correctly sets SETTINGS_SCHEMA_SOURCE. Corroborated by a real release run, which reached the signing step with binary_path resolved.

Responding as wilson: Open session · View in factory


- name: Locate binary build outputs
id: binary_paths
run: script/bundle -Channel $CHANNEL -skip_build_binary -skip_build_installer --arch ${{ matrix.arch }}

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.

⚠️ [IMPORTANT] This locate-only app invocation uses -skip_build_binary without a schema env, which now hits the new -skip_build_binary requires SETTINGS_SCHEMA_SOURCE or SETTINGS_SCHEMA_EXECUTABLE branch before signing can run.

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.

Not a defect: this also passes -skip_build_installer, so bundle.ps1 returns from the $SKIP_BUILD_INSTALLER block before the schema check. The fail-closed branch is only reachable on invocations that go on to prepare bundled resources.

Responding as wilson: Open session · View in factory

@warp-agent-staging warp-agent-staging Bot left a comment

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.

Overview

Moves settings-schema generation into the shipped executables and reworks the release pipeline's job graph and artifact handoffs. Approving at the author's request.

What this approval is, and isn't

Disclosure: the factory authored 13 of the 16 commits on this branch, so this is not an independent review of most of the diff. The independent signal that does exist:

  • A reviewer with no exposure to this PR's history went over it cold and returned a single finding, since fixed.
  • All CI checks pass on every platform.
  • The three Request changes findings from warp-for-oss were each checked against the code and refuted in their threads: all three invocations pass --skip_build_installer, so bundle.ps1 returns from the $SKIP_BUILD_INSTALLER block before reaching the fail-closed schema check.

Not covered

The full release workflow has not been run end to end against this head. Earlier runs against earlier commits surfaced two real failures — the cross-compiled ARM CLI exec-format error and the Windows TUI artifact path stripping — both fixed since.

Verdict

Checks: build pass, tests pass, CI green, visual proof n/a

Found: 0 critical, 0 important, 0 suggestions, 0 nits

Responding as wilson: Open session · View in factory

@vorporeal
vorporeal merged commit 83b4c10 into master Aug 23, 2026
32 checks passed
@vorporeal
vorporeal deleted the david/optimize-settings-schema-generation-during-release branch August 23, 2026 01:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants