Skip to content

feat(desktop): target agentenv-framework 0.9.1464 - #9302

Merged
morluto merged 731 commits into
morluto:mainfrom
earakely-scale:feat/desktop-agentenv-pin
Nov 9, 2026
Merged

morluto merged 731 commits into
morluto:mainfrom
earakely-scale:feat/desktop-agentenv-pin

Conversation

@earakely-scale

@earakely-scale earakely-scale commented Nov 8, 2026 •

Copy link
Copy Markdown
Contributor

Stacked on #9185 and #9199. The framework pin is 85c1dc5d6; review follow-up commits also address inherited desktop findings. Merge it last in the desktop batch, after #9215, #9216, #9217 and #9225; it was validated with #9225's code.

Summary

Desktop bundles now target agentenv-framework 0.9.1464 instead of 0.9.1431. This covers the bundles' framework_version, setup's --install-agentenv command and the doctor's exact-version check. The 0.9.1463 and 0.9.1464 releases fix four problems desktop builds hit:

  • scaleapi/agentenv-framework#527: an exported app's app_data.get(paths, write_namespace) call works again. 0.9.1457 through 0.9.1462 broke it, so REA could not move past 0.9.1456.
  • #528: the computer probe's fixture stays above a window the app keeps on top at boot. Typora's licence dialog failed the probe on 0.9.1431.
  • #529: a build whose boot setting doesn't resolve stays unverified and re-probes once it resolves. On 0.9.1431 it was marked failed for good. feat(desktop): isolate declared secrets during app builds #9225's withheld files are such settings.
  • #532: lock .debs and wheels are mounted into the install step rather than copied into the image. KeePassXC's image shrank from 362.9 MB to 284.2 MB compressed.

The web environment lane (real-agentenv.yml, verify-agentenv-environment.mjs) stays on 0.9.1431; this change is for desktop bundles only.

Problem and expected behavior

On 0.9.1431, three things failed:

  • a bundle whose withheld file is a setting was refused, and stayed refused after the setting was given;
  • Typora's first-boot probe failed at "P4 a click in frame space hits its cell" in most busy-host runs.

On 0.9.1464 both deploy, and a solver run scores.

Change and scope

  • DESKTOP_EXPORT_FRAMEWORK_VERSION is now 0.9.1464. Setup, the doctor and the export read it.
  • The tests' fake agent-env versions and the expected install commands follow.
  • docs/desktop-build-computer.md, the export spec and the export page now name 0.9.1464. Verification records of earlier runs keep the version they ran with.

Contract and boundary impact

  • Semantic owner and earliest changed stage: the desktop export's framework pin.
  • Contribution scope fit and linked maintainer decision: same approved desktop-environments work as feat(desktop): capture a Linux desktop application in use #8874.
  • CLI and MCP/tool-catalog contract: rea doctor --provider desktop_build now expects 0.9.1464, and rea setup --desktop-build --install-agentenv installs it. No MCP input changes.
  • Provider, bridge, target-format, or platform compatibility: a host with 0.9.1431 fails the doctor's version check until it installs 0.9.1464.
  • Evidence, artifact, provenance, or reconstruction contract: exported bundles record framework_version 0.9.1464.
  • Target selection, authority, upstream behavior, and cleanup details (if applicable): not applicable.
  • Generated metadata (docs/public/product-catalog.json), package, or installation impact: setup's install command changes version.

Expected effects (check known effects; use documentation-only on its own).
Unchecked items do not establish absence; leave uncertainties visible.

  • Read existing files or captured data.
  • Launch or attach to a process.
  • Inject instrumentation or run scripts/code.
  • Change process memory, registers, files, or configuration.
  • Contact network services.
  • Recover protected code or work around protections.
  • Documentation or usability only; no target interaction.
  • Not sure yet; investigation or maintainer guidance needed.

Evidence and regression coverage

  • Tests: with the constant changed alone, 7 doctor and setup tests failed on the old version. With the tests updated, they pass.
  • Real builds: on an arm64 Ubuntu 24.04 host with 0.9.1464 in its own virtual environment, run with feat(desktop): isolate declared secrets during app builds #9225's code (7a66b2e7a) through REA's MCP tools (start, capture, export, witness on a copy of the bundle, check_build_task for every stage):
    • KeePassXC: the database was withheld as a setting.
      • Deployed without the setting, the build was refused in 5 s and stayed unverified ("a setting it boots with didn't resolve here"). Given the setting, the same copy re-probed and was ready in 22 s. On 0.9.1431 the same sequence left it failed.
      • All four witness stages held.
      • No file held the typed password (0 of 134).
    • Typora 1.14.9 (vendor .deb, arm64):
      • The first-boot probe passed, the deploy took 96 s, and all four witness stages held.
      • The licence was a made-up value, so Typora ran unregistered. This shows the setting path and the probe, not activation.
    • Gnote:
      • all four witness stages held;
      • agent-env run <bundle> --task add-eggs --agent claude-code --model anthropic/claude-sonnet-5-5 scored 1.0 in 51 s.
  • Differences seen:
    • First starts were slower while agentenv rebuilt its shared base image once: KeePassXC 65 → 118 s, Typora 126 → 228 s, with three builds running at once.
    • No new warnings or refusals.
  • Found on the way: Typora's NSS key4.db tripped feat(desktop): isolate declared secrets during app builds #9225's raw-bytes key scan. That is fixed in feat(desktop): isolate declared secrets during app builds #9225, not here.
  • Remaining proof gaps: amd64 was not rerun on 0.9.1464.

For evidence-bearing changes:

  • Observed, derived, and inferred claims remain distinguishable.
  • Artifact identity, source provenance, and failed attempts remain preserved.
  • Unsupported, incomplete, unavailable, or uncertain outcomes remain visible.

Validation performed

  • npx oxfmt --check .: passed.
  • vitest over the doctor and setup tests and the desktop folders: 872 passed, 12 skipped.
  • Merges cleanly into main.

Compatibility, safety, and release

  • Breaking changes or migration steps: build hosts install 0.9.1464 (rea setup --desktop-build --install-agentenv, or uv tool install agentenv-framework==0.9.1464).
  • Real Hopper/Ghidra, browser, or OS coverage: Linux arm64, real agentenv builds above.
  • Package or release metadata impact: none.
  • Security, privacy, process, or containment review: not applicable.

Latest review follow-up

Review follow-up adds the export-owned lock exclusion (also pushed to #9132), desktop doctor registration comparison and unchecked-path reporting, and corrected gzip scrub documentation. The inherited oversized test group was split to restore lint. Validation: 110 related source tests, 17 JSON-draft tests, 2 CLI boundary tests, check:fast, format:check and docs:check passed. Windows-specific doctor behavior was not exercised.

Remaining stacked findings

The #9199 client-recorded runner finding is addressed below.

Setup lifecycle follow-up

Packing and the uv installer now use owned process-family supervision; a failed cleanup retains the exact owner and packing workspace for retry. Validation: 25 setup and cleanup source tests, a real process-family timeout boundary test, and check:fast passed; #9199 also passed format:check. The uv test uses a fake executable; real publisher installation and Windows were not exercised.

Resolved-default follow-up

Doctor compares registration choices with resolved terminal defaults, so matching PATH commands and the default archive are not marked unchecked (ab84a3f on #9199; 26232ae on #9302). The 23 doctor source tests, 3 CLI tests and check:fast passed on each branch. The client-only runner finding is addressed below; Windows was not exercised.

Client runner follow-up

Doctor checks each selected client’s recorded runner without returning its path, retains unknown for unresolved values, and reuses a probe when the terminal and registration select the same executable. Related source suites and the four CLI doctor/setup boundary tests passed on both branches, as did check:fast. The runner fixture is simulated; real uv installation and Windows were not exercised.

Maintainer follow-up

Integrated setup ownership and finalization fixes from #9199: the command boundary retains earlier failure/output and caller cancellation, with cleanup retry ownership. The earlier doctor-environment allegation was explicitly withdrawn by its reviewer and needs no separate behavioral change. The framework pin remains unchanged; feature siblings remain separate PRs and current-head CI/review still govern merge readiness. The doctor fixture uses the declared framework pin. Recompressed gzip seed-view repair and the corrected log guide are inherited from their owning parents. Additional checks passed: npm run docs:check.

At head db04d33313, the affected tests below completed with 98 passed (98); npm run check:fast, npm run format:check and git diff --check passed. This includes the updated parent stack and main through 25d3c7237f. Checks use source/domain and controlled boundary fixtures; no real desktop provider qualification was performed. Current-head CI and review remain required before auto-merge.

node node_modules/vitest/vitest.mjs run src/application/Setup.desktopBuild.test.ts src/desktop/DesktopBuildOwnedCommand.test.ts src/desktop/DesktopBuildDoctorFacts.test.ts src/application/DesktopBuildDoctor.test.ts src/application/desktop/DesktopTaskExport.test.ts src/application/desktop/DesktopTaskDraftNotes.test.ts src/domain/desktop/stateRoles.test.ts

Author readiness

Human owner: @earakely-scale

  • I reviewed the final diff and relevant existing code, understand the change and its edge cases, and take responsibility for the complete PR, including AI-assisted work.
  • I checked the evidence above, confirmed it supports the current change, and recorded meaningful validation gaps.
  • I declare this PR ready for initial maintainer review.

Before merge

  • This PR addresses a concrete problem or an agreed enhancement.
  • Material scope and authority questions are resolved, and any required maintainer scope decision covers the final diff.
  • The PR has one focused outcome and the title follows type(scope): outcome.
  • Related issue is linked, or the reason for not linking one is stated above.
  • Tests cover changed observable behavior and meaningful failure paths.
  • Owning docs, contracts, and generated metadata are updated where needed.
  • User-visible CLI/MCP changes include representative output.
  • I checked the final diff for secrets, unrelated cleanup, and unsupported claims.

🤖 Generated with Claude Code

# Conflicts:
#	tests/boundary/mcp/buildCaptureRetryMcp.test.ts
# Conflicts:
#	src/domain/desktop/appTaskDraftNoise.test.ts
# Conflicts:
#	src/application/desktop/DesktopApplicationExport.ts
#	src/application/desktop/DesktopBuildComputers.ts
#	src/desktop/AgentEnvComputer.ts
#	src/domain/desktop/stateRoles.ts
# Conflicts:
#	docs/desktop-application-tasks.md
#	docs/desktop-build-witness.md
#	docs/specs/desktop-app-environments/build-witness/spec.md
#	src/domain/desktop/appTaskDraftNamed.ts
#	src/domain/desktop/appTaskDraftNoise.ts
#	src/domain/desktop/appTaskDraftValues.test.ts
# Conflicts:
#	src/domain/desktop/appTaskDraftNamed.ts
#	src/domain/desktop/appTaskDraftNoise.ts
# Conflicts:
#	src/application/Setup.ts
#	src/composition/capabilityServices.ts
#	src/doctorRuntime.ts
# Conflicts:
#	.agents/skills/reverse-engineer-anything/references/desktop-build.md
#	docs/desktop-application-capture.md
#	docs/desktop-application-export.md
#	docs/desktop-application-state.md
#	docs/desktop-application-tasks.md
#	docs/desktop-build-computer.md
#	docs/desktop-build-witness.md
#	docs/specs/desktop-app-environments/build-witness/spec.md
#	docs/specs/desktop-app-environments/build-witness/verification.md
#	src/application/desktop/DesktopApplicationCapture.ts
#	src/application/desktop/DesktopApplicationExport.test.ts
#	src/application/desktop/DesktopApplicationExport.ts
#	src/application/desktop/DesktopBuildBundle.ts
#	src/application/desktop/DesktopBuildCapture.ts
#	src/application/desktop/DesktopBuildComputers.ts
#	src/application/desktop/DesktopBuildOutputRead.test.ts
#	src/application/desktop/DesktopBuildSummary.ts
#	src/application/desktop/DesktopBuildWitness.test.ts
#	src/application/desktop/DesktopExportFiles.ts
#	src/application/desktop/DesktopExportLaunch.ts
#	src/application/desktop/DesktopGzipDocument.test.ts
#	src/application/desktop/DesktopTaskDraft.ts
#	src/application/desktop/DesktopTaskDraftNotes.test.ts
#	src/application/desktop/DesktopTaskExport.test.ts
#	src/composition/capabilityServices.ts
#	src/contracts/desktopBuildToolContracts.ts
#	src/desktop/DesktopApplicationSession.test.ts
#	src/domain/desktop/appExport.test.ts
#	src/domain/desktop/appExport.ts
#	src/domain/desktop/appExportPython.ts
#	src/domain/desktop/appExportUnowned.test.ts
#	src/domain/desktop/appExportUnowned.ts
#	src/domain/desktop/appTaskChecks.fixture.ts
#	src/domain/desktop/appTaskChecks.ts
#	src/domain/desktop/appTaskDraft.fixture.ts
#	src/domain/desktop/appTaskDraft.ts
#	src/domain/desktop/appTaskDraftAdded.test.ts
#	src/domain/desktop/appTaskDraftAdded.ts
#	src/domain/desktop/appTaskDraftFileNotes.test.ts
#	src/domain/desktop/appTaskDraftFileNotes.ts
#	src/domain/desktop/appTaskDraftGuards.test.ts
#	src/domain/desktop/appTaskDraftGuards.ts
#	src/domain/desktop/appTaskDraftLineGuards.ts
#	src/domain/desktop/appTaskDraftNamed.ts
#	src/domain/desktop/appTaskDraftNoise.test.ts
#	src/domain/desktop/appTaskDraftNoise.ts
#	src/domain/desktop/appTaskDraftNotes.ts
#	src/domain/desktop/appTaskDraftPositional.test.ts
#	src/domain/desktop/appTaskDraftScalars.ts
#	src/domain/desktop/appTaskDraftText.ts
#	src/domain/desktop/appTaskDraftTextAdded.test.ts
#	src/domain/desktop/appTaskDraftValues.test.ts
#	src/domain/desktop/appTaskDraftValues.ts
#	src/domain/desktop/appTaskPython.ts
#	src/domain/desktop/attributeRank.ts
#	src/domain/desktop/desktopCapture.test.ts
#	src/domain/desktop/desktopCapture.ts
#	src/domain/desktop/positionalKeys.ts
#	src/domain/desktop/runtimeFiles.ts
#	src/domain/desktop/seedDocument.test.ts
#	src/domain/desktop/seedScrub.ts
#	src/domain/desktop/selectorCandidates.ts
#	src/domain/desktop/stateChanges.ts
#	src/domain/desktop/stateFormats.ts
#	src/domain/desktop/stateRoles.test.ts
#	src/domain/desktop/stateRoles.ts
#	src/domain/desktop/viewPointer.test.ts
#	src/domain/desktop/viewPointer.ts
#	tests/boundary/mcp/buildCaptureDraftMcp.test.ts
#	tests/boundary/mcp/buildCaptureRetryMcp.test.ts
#	tests/boundary/mcp/buildComputerMcp.test.ts
#	tests/boundary/providers/desktopExportPython.test.ts
#	tests/fixtures/buildCaptureFakes.ts
#	tests/fixtures/buildComputerMcp.ts
# Conflicts:
#	.agents/skills/reverse-engineer-anything/references/desktop-build.md
#	docs/desktop-application-export.md
#	docs/desktop-application-tasks.md
#	docs/desktop-build-computer.md
#	src/application/DesktopBuildDoctor.test.ts
#	src/application/Setup.desktopBuild.test.ts
#	src/application/Setup.recovery.test.ts
#	src/application/Setup.ts
#	src/application/desktop/DesktopApplicationExport.ts
#	src/application/desktop/DesktopBuildCapture.ts
#	src/application/desktop/DesktopBuildExport.ts
#	src/application/desktop/DesktopBuildWitness.ts
#	src/application/desktop/DesktopExportFiles.ts
#	src/application/desktop/DesktopExportInstall.ts
#	src/application/desktop/DesktopTaskExport.test.ts
#	src/application/desktop/DesktopTaskExport.ts
#	src/cli/desktopCaptureCommands.ts
#	src/contracts/desktopBuildToolContracts.ts
#	src/desktop/DesktopBuildDoctorFacts.test.ts
#	src/desktop/DesktopBuildSetupHost.test.ts
#	src/domain/desktop/appBuild.test.ts
#	src/domain/desktop/appBuild.ts
#	src/domain/desktop/appExport.ts
#	src/domain/desktop/appExportInstall.ts
#	src/domain/desktop/appExportPython.ts
#	src/domain/desktop/appTask.ts
#	src/domain/desktop/appTaskChecks.fixture.ts
#	src/domain/desktop/appTaskDraft.fixture.ts
#	src/domain/desktop/appTaskDraftJson.test.ts
#	src/domain/desktop/appTaskDraftLineGuards.test.ts
#	src/domain/desktop/appTaskDraftLineGuards.ts
#	src/domain/desktop/appTaskDraftModel.test.ts
#	src/domain/desktop/appTaskPython.ts
#	src/domain/desktop/appTaskPythonPointer.ts
#	tests/boundary/mcp/buildCaptureRetryMcp.test.ts
#	tests/fixtures/buildCaptureFakes.ts
#	tests/fixtures/buildComputerMcp.ts
@morluto
morluto merged commit 018f19d into morluto:main Nov 9, 2026
4 checks passed
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.

2 participants