8.5 KiB
8.5 KiB
Phase 11: ProjectManager Release Readiness
Milestone Status
- architecture freeze: complete
- interactive prototype: complete
- internal alpha desktop shell: complete
- macOS local packaging validation: complete
- signed beta build: pending signing/notarization credentials and platform-host verification
- release candidate: pending Windows and Linux package validation
- production release readiness: pending platform signing completion and final release-channel credentials
What Is Ready
- dedicated Electron-native desktop workspace under
AgentCompany - explicit main / preload / renderer / shared separation
- local-first profile, secret storage, orchestration worker, IPC contracts, and desktop shell
- onboarding to first usable shell flow
- packaging configuration for macOS, Windows, and Linux
- warning-free local lint baseline across main/preload/renderer
- validation gate rerun on 2026-03-13 passed (
lint,typecheck,test:run,build:dir) - TODO: PR CI quality gate workflow (
.github/workflows/agent-company-pr-verify.yml) has not been created yet - TODO: Electron production fuse hardening has not been configured yet (see doc 11)
- packaging script now defaults to
--publish neverunless explicitly overridden (AGENTCOMPANY_ELECTRON_PUBLISHor explicit--publish)
Release Ownership Boundaries
| Area | Primary owner | Backup owner | Scope boundary | Exit evidence |
|---|---|---|---|---|
| Release gate decision | CEO / ProjectManager | Product lead | Approves go/no-go only after all gates are green; does not bypass security/platform sign-off | Signed release checklist + release tag decision |
| Signing credentials | Security Auditor | Platform Release Engineer | Manages cert issuance/rotation and secret distribution; build operators never commit secrets | Secret inventory record + cert expiry check |
| macOS signing + notarization | macOS Release Engineer | Security Auditor | Runs signed build on macOS host and validates notarization ticket | spctl, codesign, stapler evidence |
| Windows signing + installer trust | Windows Release Engineer | Security Auditor | Runs NSIS build on Windows host and validates Authenticode chain | Get-AuthenticodeSignature evidence |
| Linux package validation | Linux Release Engineer | QA lead | Builds and smoke-tests AppImage on Linux host; verifies runtime dependencies | AppImage launch and smoke checklist |
| Updater endpoint trust | Security Auditor | SRE / Infra | Owns TLS/domain trust policy and update channel integrity checks | latest*.yml metadata + artifact hash verification |
| Cross-platform functional smoke | QA lead | Platform engineers | Verifies startup/onboarding/task-run/approval flows on each target OS | Smoke run logs + screenshots |
Release Checklist (Production Candidate)
pnpm install --frozen-lockfilecompleted on release hostpnpm lintpassedpnpm typecheckpassedpnpm test:runpassedpnpm build:dirpassed- signing environment variables are set from secret manager (not shell history files)
AGENTCOMPANY_UPDATE_URLpoints to production or staging trusted domain (notexample.invalid)- updater checks are enabled for release validation (
AGENTCOMPANY_DISABLE_UPDATES=false) - macOS signed build + notarization validation completed on macOS host
- Windows signed installer validation completed on Windows host
- Linux AppImage validation completed on Linux host
- update metadata (
latest*.yml) and published artifacts hash-match - secrets regression check completed (existing local secrets remain readable after upgrade)
- local data migration test completed (old profile boots and migrates without data loss)
- final go/no-go approved by CEO / ProjectManager
Runbook
1. Preflight (all platforms)
pnpm install --frozen-lockfile
pnpm lint
pnpm typecheck
pnpm test:run
pnpm build:dir
Expected: all commands pass; no skipped failures are allowed unless explicitly waived in release notes.
2. Signing Material Readiness
Prepare these values in CI secret manager or local secure vault:
AGENTCOMPANY_UPDATE_URLCSC_LINKCSC_KEY_PASSWORDWIN_CSC_LINKWIN_CSC_KEY_PASSWORD- macOS notarization credentials (
APPLE_ID,APPLE_APP_SPECIFIC_PASSWORD,APPLE_TEAM_ID) if using Apple ID flow
Sanity check before release build:
env | rg "^(AGENTCOMPANY_UPDATE_URL|CSC_LINK|WIN_CSC_LINK|APPLE_ID|APPLE_TEAM_ID)="
3. macOS Signed Build + Notarization (native macOS host)
- Enable release-mode updater behavior and set trusted update URL.
- Build signed artifacts.
- Validate signature + notarization ticket.
export AGENTCOMPANY_DISABLE_UPDATES=false
export AGENTCOMPANY_UPDATE_URL="https://updates.<your-domain>/agentcompany/stable"
export CSC_LINK="file://$HOME/.signing/agentcompany-mac.p12"
export CSC_KEY_PASSWORD="<from-secret-manager>"
export CSC_IDENTITY_AUTO_DISCOVERY=true
export APPLE_ID="<apple-notarization-account>"
export APPLE_APP_SPECIFIC_PASSWORD="<app-specific-password>"
export APPLE_TEAM_ID="<team-id>"
pnpm build -- --mac dmg zip --publish never
spctl -a -vv "build/release/mac/AgentCompany.app"
codesign -dv --verbose=4 "build/release/mac/AgentCompany.app" 2>&1 | rg "Authority=|TeamIdentifier="
xcrun stapler validate "build/release"/*.dmg
Notes:
- For public macOS distribution, switch
mac.hardenedRuntimetotruewith proper entitlements before final GA build. - Keep ad-hoc signing only for local development and internal unsigned testing.
4. Windows Signed Installer Validation (native Windows host)
$env:AGENTCOMPANY_DISABLE_UPDATES = "false"
$env:AGENTCOMPANY_UPDATE_URL = "https://updates.<your-domain>/agentcompany/stable"
$env:WIN_CSC_LINK = "C:\signing\agentcompany-win.pfx"
$env:WIN_CSC_KEY_PASSWORD = "<from-secret-manager>"
pnpm build -- --win nsis --x64 --publish never
Get-ChildItem .\build\release\*.exe | Get-AuthenticodeSignature |
Format-Table Path, Status, @{Name='Signer';Expression={$_.SignerCertificate.Subject}}
Expected:
StatusisValid- signer subject matches the intended publisher identity
5. Linux AppImage Validation (native Linux host)
export AGENTCOMPANY_DISABLE_UPDATES=false
export AGENTCOMPANY_UPDATE_URL="https://updates.<your-domain>/agentcompany/stable"
pnpm build -- --linux AppImage --x64 --publish never
chmod +x build/release/*.AppImage
./build/release/*.AppImage --appimage-version
Then run manual smoke validation on Linux:
- app launches and reaches main shell
- company/workspace/agent CRUD works
- task run + approval flow works
- settings toggle for updater works
6. Updater Endpoint Trust Verification
- Validate update metadata endpoint and schema.
- Verify published artifact hash against metadata.
- Validate app update check in runtime.
curl -fsSL "$AGENTCOMPANY_UPDATE_URL/latest.yml" -o /tmp/latest.yml
rg "^(version|path|sha512):" /tmp/latest.yml
Hash verification (replace placeholders with actual artifact path/hash from metadata):
node -e "const fs=require('fs');const crypto=require('crypto');const [file,expected]=process.argv.slice(1);const got=crypto.createHash('sha512').update(fs.readFileSync(file)).digest('base64');if(got!==expected){console.error('sha512 mismatch');process.exit(1)}console.log('sha512 ok');" \
build/release/<artifact-file> \
"<sha512-from-latest-yml>"
Runtime verification:
- launch packaged app with
AGENTCOMPANY_DISABLE_UPDATES=false - trigger
Check for updatesfrom Settings - confirm request goes only to trusted
AGENTCOMPANY_UPDATE_URLdomain - confirm unsigned/untrusted update payloads are rejected by platform signing checks
7. Windows/Linux Native-Host QA Gate
Required evidence per platform:
- startup success + no crash in first 5 minutes
- create company + create workspace + create task + assign agent + run once
- approve one pending approval item
- inspect logs for uncaught errors
- close/reopen app and confirm local data persistence
8. Release Close-Out
- publish artifacts and corresponding
latest*.ymlonly after all platform owners sign off - attach evidence bundle (command output, screenshots, hash checks, signatures)
- mark release decision in changelog/release note with approver and timestamp
Outstanding Risks Before Public GA
- current config keeps
mac.hardenedRuntime: false; must be enabled with release entitlements for notarized public mac builds - no trusted production updater endpoint is configured by default (
example.invalidfallback) - Windows and Linux validation still requires native host execution each release cycle