Skip to content

ci: enforce app-server release gates - #208

Merged
oratis merged 37 commits into
mainfrom
codex/app-server-release-gates
Aug 2, 2026
Merged

ci: enforce app-server release gates#208
oratis merged 37 commits into
mainfrom
codex/app-server-release-gates

Conversation

@oratis

@oratis oratis commented Aug 1, 2026

Copy link
Copy Markdown
Owner

Summary

  • add a real packaged app-server release gate with protocol, persistence, boundary, bundle, and timing budgets
  • enforce the gate on Ubuntu, macOS, and tag validation alongside the desktop Playwright journey
  • package a versioned VSIX as a GitHub Release artifact and delay npm publication until VSIX and signed DMG builds succeed
  • document additive migration, isolated-home rollback drills, budget-change policy, and post-build DMG smoke checks

Measured baseline

  • extension.cjs: 31,814 bytes, budget 64 KiB
  • app-server.cjs: 599,351 bytes, budget 768 KiB
  • VSIX: 185,057 bytes, budget 256 KiB
  • cold initialize: about 42 ms locally, budget 5 s
  • workspace diff: about 151 ms locally, budget 10 s
  • thin-client scan: 53 production source files, zero violations

Validation

  • pnpm release:check
  • desktop Playwright journey: 4 passed
  • pnpm test: 1028 passed, 12 skipped
  • pnpm lint: no errors, one pre-existing warning
  • pnpm format:check
  • pnpm docs:check
  • workflow YAML syntax check

Stacked on #207.

t added 30 commits August 1, 2026 13:32
@oratis
oratis changed the base branch from codex/remove-legacy-runtime-facades to main August 2, 2026 06:36
@oratis
oratis marked this pull request as ready for review August 2, 2026 06:47
@oratis

oratis commented Aug 2, 2026

Copy link
Copy Markdown
Owner Author

Review: approved ✅

Gates that run against real packaged artifacts rather than source. That distinction is the whole value: #202 already found an import.meta.url crash that only appeared in packaged CJS sidecars, which source-level CI cannot see.

On the budgets — measured, with headroom, and each has a stated baseline:

artifact measured budget
extension.cjs 31,814 B 64 KiB
app-server.cjs 599,351 B 768 KiB
VSIX 185,057 B 256 KiB
cold initialize ~42 ms 5 s
workspace diff ~151 ms 10 s

The timing budgets are ~100× the local measurement, which is right for CI runners — a timing gate tight enough to be informative is a timing gate that flakes. The size budgets are ~1.3–2× and are the ones that will actually catch regressions. Requiring before/after measurements in the PR description to raise a budget is the part that keeps them from being ratcheted up silently.

The thin-client scan is the gate I value most: 53 production source files, zero violations, asserting that desktop/VS Code/LSP sources do not import the provider, credentials, agent loop, or RuntimeHost. Everything from #192/#195/#196 is otherwise a point-in-time property that the next convenient import quietly undoes. This makes it enforced.

Release-ordering change is correct: publishing the VSIX as a Release artifact and delaying npm publication until VSIX and signed DMG builds succeed fixes a real hazard — npm publish is effectively irreversible, so it must be the last step, after the failure-prone platform builds. Previously a DMG/notarization failure could leave a published npm version with no matching desktop build.

Documenting isolated-home rollback drills and post-build DMG smoke checks is good; those are manual, so their value depends on actually running them at release time.

Validation: CI green on Ubuntu, macOS, and tag validation.

@oratis
oratis merged commit a4b4556 into main Aug 2, 2026
5 checks passed
oratis added a commit that referenced this pull request Aug 2, 2026
Takes the safe half of #176. That PR grouped typescript-eslint with
@types/vscode ^1.85.0 → ^1.125.0, and the @types/vscode half fails the
release gate added in #208:

  @types/vscode ^1.125.0 greater than engines.vscode ^1.85.0.
  Either upgrade engines.vscode or use an older @types/vscode version

`vsce package` requires @types/vscode <= engines.vscode. Raising
engines.vscode to ^1.125.0 to satisfy it would drop support for every
VS Code from 1.85 through 1.124 — a product decision, not a dependency
bump, and one with no upside since the extension uses no API newer than
1.85. @types/vscode should track the minimum supported VS Code, so it
stays pinned.

Verified with pnpm release:check, which is the gate #176 fails.

- tsc -b --force, lint (--max-warnings=0), format:check: clean
- 1033 tests across 8 packages: pass
- pnpm release:check (build + VSIX package + release gate): pass

Co-authored-by: t <t@t>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
oratis pushed a commit that referenced this pull request Aug 2, 2026
Supersedes #138 and #139, which are coupled (plugin-react 6 requires
vite 7+) and were deferred in June because `vite build` failed with
`Rolldown failed to resolve import "openai"` — vite 8 swaps in the
rolldown bundler, and the renderer was transitively pulling
core/dist/providers/deepseek.js.

That blocker is gone: #192 split dependency-free model metadata from the
provider implementation specifically so provider/OpenAI SDK code is
absent from renderer bundles. The import rolldown could not resolve no
longer reaches the renderer graph, so no `build.rolldownOptions.external`
migration is needed.

Also replaces `__dirname` with `import.meta.dirname` in vite.config.ts.
vite 8 warns that `__dirname` is unsupported by `configLoader: 'native'`,
which is planned to become the default in a future major. The repo
requires Node >=22, so `import.meta.dirname` is available.

Verified on top of React 19 (#211), forced rebuild throughout:
- tsc -b --force, lint (--max-warnings=0), format:check: clean
- 1033 tests across 8 packages: pass
- pnpm build + full build:tauri-assets pipeline: pass
  (app-server.cjs 599,395 bytes — within the 768 KiB #208 budget)
- desktop Playwright protocol journey (4 tests): pass

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
oratis added a commit that referenced this pull request Aug 2, 2026
Supersedes #138 and #139, which are coupled (plugin-react 6 requires
vite 7+) and were deferred in June because `vite build` failed with
`Rolldown failed to resolve import "openai"` — vite 8 swaps in the
rolldown bundler, and the renderer was transitively pulling
core/dist/providers/deepseek.js.

That blocker is gone: #192 split dependency-free model metadata from the
provider implementation specifically so provider/OpenAI SDK code is
absent from renderer bundles. The import rolldown could not resolve no
longer reaches the renderer graph, so no `build.rolldownOptions.external`
migration is needed.

Also replaces `__dirname` with `import.meta.dirname` in vite.config.ts.
vite 8 warns that `__dirname` is unsupported by `configLoader: 'native'`,
which is planned to become the default in a future major. The repo
requires Node >=22, so `import.meta.dirname` is available.

Verified on top of React 19 (#211), forced rebuild throughout:
- tsc -b --force, lint (--max-warnings=0), format:check: clean
- 1033 tests across 8 packages: pass
- pnpm build + full build:tauri-assets pipeline: pass
  (app-server.cjs 599,395 bytes — within the 768 KiB #208 budget)
- desktop Playwright protocol journey (4 tests): pass

Co-authored-by: t <t@t>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant