Skip to content

릴리즈: MCP 종료 경계를 닫고 0.0.19 출하 #257

릴리즈: MCP 종료 경계를 닫고 0.0.19 출하

릴리즈: MCP 종료 경계를 닫고 0.0.19 출하 #257

Workflow file for this run

# CI: 구조 게이트 + 브라우저 런타임 게이트. 게이트 정의의 SSOT는 tests/ (여기는 디스패치만).
name: ci
on:
push:
branches: [main]
pull_request:
# 게시 경로가 같은 게이트 집합을 재사용한다(목록 이중 관리 = 표류의 씨앗).
workflow_call:
permissions:
contents: read
jobs:
structure:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7
with:
node-version: 22
# 의존성 0이지만 lockfile 정합(extraneous 잔재 감지)을 위해 npm ci를 먼저 돈다.
- run: npm ci
- run: npm run test:contracts
- run: npm test
# 타입 계약 게이트: 손으로 유지하는 d.ts에 컴파일러를 붙인다. typescript는 CI 도구로만
# 쓰고 package 의존성으로 넣지 않는다(설치 의존성 0 유지).
- run: npm run test:types
browser:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7
with:
node-version: 22
- uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
with:
path: vendor/pyodide
key: pyodide-${{ hashFiles('src/runtime/pyodideDistribution.js', 'scripts/assetCatalog.json') }}
- run: npm run fetch:engine
# ubuntu 러너에 Google Chrome이 프리인스톨되어 있다. CI=true라 --no-sandbox가 자동 적용된다.
- run: npm run test:browser
env:
PYPROC_BROWSER: /usr/bin/google-chrome
PYPROC_GATE_OUT: gateMeasurements.json
# 설치 패키지 게이트: npm pack으로 설치한 pyproc을 격리 브라우저가 public specifier로 import한다.
- run: npm run test:installed
- run: npm run test:golden
env:
PYPROC_BROWSER: /usr/bin/google-chrome
# 러너 실측 수치를 보존한다: 원장/리드미의 로컬 수치와 비교 가능한 근거.
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
if: always()
with:
name: gate-measurements
path: gateMeasurements.json
# 증거가 없으면 조용히 넘기지 않는다: PYPROC_GATE_OUT 배선이 죽으면 실측이 사라지고
# "측정했다"는 기록만 남는다. 러너는 RED에서도 이 파일을 쓴다.
if-no-files-found: error
# 예제 실행 게이트: 데모 페이지가 사람이 여는 그대로 완주하는지(진열장 회귀 방지).
- run: npm run test:examples
env:
PYPROC_BROWSER: /usr/bin/google-chrome
# 공유 러너(4 vCPU)는 4-워커 샤딩이 물리적으로 2.0x를 못 넘는다(실측 1.90-1.98x).
# 여기서의 게이트는 데모 완주+정확성이고, 속도 주장 인증은 artifact 계약(S1)이다.
PYPROC_EXAMPLES_MIN_SPEEDUP: "1.3"
# 헤더 없는 호스팅(GitHub Pages 등가) 진단 게이트: README가 약속하는 가상 COI 경로.
# 이 페이지는 게이트 폴더에 있으면서 아무도 돌리지 않았다(2026-07-27 감사).
- run: npm run test:preflight
env:
PYPROC_BROWSER: /usr/bin/google-chrome
PYPROC_NO_COI: "1"
# WASI 세션 게이트: pyproc/wasi subpath(bootWasi/WasiSession)의 실배선.
# 30MB 자산은 릴리즈 zip에서 준비하고 버전 키로 캐시해 SKIP이 아니라 실제 GREEN으로 돈다.
- uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
with:
path: |
tests/attempts/enginePort/python-3.14.6.wasm
tests/attempts/enginePort/python314-stdlib.zip
key: wasi-python-3.14.6-wasi_sdk-24-v2 # v2: 가짜 zip(GNU tar 산출물) 캐시 무효화
- run: node scripts/fetchWasiAssets.mjs
- run: node tests/browser/run.mjs tests/browser/wasiGate.html
env:
PYPROC_BROWSER: /usr/bin/google-chrome
# Web Machine probe: 무자산 계약에 실제 WASI guest 레인을 더한다.
# x86 자산이 필요한 레인은 별도 job이 소유한다.
- run: npm run test:web-machine:wasi
env:
PYPROC_BROWSER: /usr/bin/google-chrome
# 소켓 레인: 이 표면은 "릴레이를 배송하지 않는다"는 이유로 오래 무게이트였다. 러너가
# 저장소 안 릴레이와 로컬 TCP 오리진을 소유하므로 바깥으로 한 바이트도 나가지 않는다.
- run: npm run test:socket
env:
PYPROC_BROWSER: /usr/bin/google-chrome
# MCP 레시피 게이트: 에이전트 통합 표면(stdio JSON-RPC + 샌드박스 도구 4종)의 실왕복.
- run: npm run test:mcp
env:
PYPROC_BROWSER: /usr/bin/google-chrome
# 설치 tarball의 stable bin으로 Python, ordered screenshot, chunk read/delete를 완주한다.
- run: npm run test:mcp-product
env:
PYPROC_BROWSER: /usr/bin/google-chrome
# 같은 제품 런타임의 언어 중립 Control Protocol, cancel, binary attachment를 설치물에서 검증한다.
- run: npm run test:control-product
- run: npm run test:frame-space
- run: npm run test:replay-space
env:
PYPROC_BROWSER: /usr/bin/google-chrome
- run: python -m pip install -r pythonSdk/buildRequirements.txt
- run: npm run test:python-sdk
env:
PYPROC_BROWSER: /usr/bin/google-chrome
# APX 정식 제품 게이트: occlusion, identity, delta, visual artifact와 EvidenceLoop를 검증한다.
- run: npm run test:apx
env:
PYPROC_BROWSER: /usr/bin/google-chrome
# Opt-in browser automation broker: compact observe, 고수준 action pipeline, Python restore와
# 외부 Chromium effect의 비복원 경계, permission, 취소와 사망 outcome을 같은 MCP 흐름에서 검증한다.
- run: npm run test:browser-control
env:
PYPROC_BROWSER: /usr/bin/google-chrome
- run: npm run test:browser-control-stress
env:
PYPROC_BROWSER: /usr/bin/google-chrome
# 실제 Microsoft Edge의 Windows 배포 경계. 설치 tarball/골든 경로와 핵심 브라우저
# 계약을 Chrome과 독립해 문다. examples는 Chrome의 동일 쇼케이스를 그대로 반복해 비용이
# 커서 제외하고, WASI/v86 실행 자산 레인은 Ubuntu 전용 job이 계속 소유한다.
edge-release:
runs-on: windows-latest
env:
PYPROC_BROWSER: 'C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe'
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7
with:
node-version: 22
- name: Microsoft Edge 설치 확인
shell: pwsh
run: |
if (-not (Test-Path -LiteralPath $env:PYPROC_BROWSER -PathType Leaf)) {
throw "Microsoft Edge executable not found: $env:PYPROC_BROWSER"
}
$edge = Get-Item -LiteralPath $env:PYPROC_BROWSER
Write-Host "Microsoft Edge $($edge.VersionInfo.ProductVersion)"
- run: npm ci
- uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
with:
path: vendor/pyodide
key: pyodide-${{ hashFiles('src/runtime/pyodideDistribution.js', 'scripts/assetCatalog.json') }}
- run: npm run fetch:engine
- run: npm test
- run: npm run test:browser
env:
PYPROC_GATE_OUT: edgeGateMeasurements.json
# npm pack 설치물의 public specifier와 골든 워크플로를 실제 Edge에서 검증한다.
- run: npm run test:installed
- run: npm run test:golden
# 무자산 Web Machine 계약만 실행한다. 실제 WASI/v86 guest는 Ubuntu 레인이 소유한다.
- run: npm run test:web-machine
# 로컬 relay/TCP만 쓰는 통합면은 추가 다운로드 없이 Edge 차이를 잡을 수 있어 함께 돈다.
- run: npm run test:socket
- run: npm run test:mcp
- run: npm run test:mcp-product
- run: npm run test:control-product
- run: npm run test:frame-space
- run: npm run test:replay-space
- run: python -m pip install -r pythonSdk/buildRequirements.txt
- run: npm run test:python-sdk
- run: npm run test:apx
- run: npm run test:browser-control
- run: npm run test:browser-control-stress
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
if: always()
with:
name: edge-gate-measurements
path: edgeGateMeasurements.json
if-no-files-found: error
web-computer:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7
with:
node-version: 22
# 실행 자산(v86 engine/firmware/guest image)은 hash 고정 development channel이며
# 미추적이다: 준비 스크립트가 받아오고 catalog 버전 키로 캐시한다.
- uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
with:
path: apps/webComputer/assets
key: web-computer-assets-${{ hashFiles('apps/webComputer/assetCatalog.json') }}
# 3-process 제품 E2E: 초기 부팅 -> 브라우저 프로세스 재시작 콜드 복원 -> 새 프로필 import.
- run: npm run test:web-computer
env:
PYPROC_BROWSER: /usr/bin/google-chrome
# x86 자산 레인. 오랫동안 "자산이 gitignore라 CI에서 못 돈다"고 적혀 있었지만 그것은 낡은
# 문장이었다: 위 job이 같은 catalog의 같은 자산을 매 push마다 받아온다. gitignore는 "받을 수
# 없다"가 아니라 "커밋하지 않는다"이고, 준비 스크립트가 SHA-256 핀으로 받아온다.
web-machine-x86:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7
with:
node-version: 22
- uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
with:
path: |
tests/webMachine/fixtures/v86/assets
tests/attempts/enginePort/python-3.14.6.wasm
tests/attempts/enginePort/python314-stdlib.zip
key: web-machine-v86-assets-${{ hashFiles('scripts/assetCatalog.json') }}
# dual-boot probe는 Linux guest 옆에 Python guest를 올린다. 기본 부팅 URL이 자체 호스팅
# `/vendor/pyodide/`이므로 이 job도 엔진을 받아야 한다(안 받으면 그 probe만 404로 죽는다).
- uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
with:
path: vendor/pyodide
key: pyodide-${{ hashFiles('src/runtime/pyodideDistribution.js', 'scripts/assetCatalog.json') }}
- run: npm run fetch:engine
- run: node scripts/fetchWasiAssets.mjs
# 실 x86 Linux guest를 부팅해 dual-boot과 장치(디스플레이·프레임버퍼·패킷·포인터)를 문다.
# 타임아웃을 올린 이유는 공유 러너에서 v86 부팅이 느리기 때문이다(자산이 아니라 CPU 몫).
- run: npm run test:web-machine:v86
env:
PYPROC_BROWSER: /usr/bin/google-chrome
PYPROC_GATE_TIMEOUT: "600000"