Python edits to filesystem.writeFile-created files are reverted by shadow reconciliation

クローズ
#2,022 コメント 1 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

@ankssjain がすでに取り組んでいます。

2026年10月6日 から。

  • #2023 @ankssjain による — オープン
  • #2070 @eersnington による — オープン

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
20/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
停滞
技術スタック
python, rust

調査の方向性

Start by reading service_owned_python_filesystem_rpc_request and compare the Python Write handling with the wire WriteFile handler that mirrors bytes into the staging tree. The issue says a regression is being prepared for regular writes, read-modify-write, and atomic replacement; verify that host reads after execution preserve Python's edits. A linked open pull request already addresses this work.

索引モデルが issue の本文から書いたものです。

説明

Problem

Python edits to a file seeded with vm.filesystem.writeFile() can succeed and be visible inside the Python execution, then silently revert to the API-seeded bytes when the host reads the file after execution.

This is the Python VFS bridge counterpart of #1961. The JavaScript fix in #1981 is present in the tested source, but Python uses a different write handler. Related: the shell/WASM report #1901 is still open. This report is specifically about Python writes, not the shell-to-Python child-process issue #2012.

Reproduction

With a VM in which Python execution is available:

await vm.filesystem.mkdir('/workspace', { recursive: true });
await vm.filesystem.writeFile(
  '/workspace/data.txt', new TextEncoder().encode('original\n'),
);

const result = await vm.python.execute(`
from pathlib import Path
p = Path('/workspace/data.txt')
p.write_text('EDITED\\n')
print(p.read_text(), end='')
`, { output: { capture: 'all' } });

console.log(result.stdout); // EDITED\n
console.log(new TextDecoder().decode(
  await vm.filesystem.readFile('/workspace/data.txt'),
)); // original\n -- unexpected

Expected: both reads return EDITED\n. Actual: Python sees its edit and exits successfully, but the following filesystem API read returns original\n; subsequent executions also see the reverted data. A read-modify-write (p.write_text(p.read_text() + 'added\\n')) has the same problem. Seeding a fresh file through Python rather than through the filesystem API avoided the stale API-created shadow in our tests.

Verification
  • Reproduced with the published 0.2.22 packages on Linux arm64, including embedded AgentOs.create() without HTTP, Rivet actors, or PostgreSQL. That setup used a command-registration workaround to enable Python; this report starts after Python executes successfully.
  • Independently reproduced against unpatched upstream source at c3698e6a60be0a6fed61d411779930e0a7753fc8 using the native-sidecar Rust wire harness and ExecuteRequest { runtime: Python, ... }. This bypasses SDK interpreter-command registration entirely.
  • The new regression fails with left: "original\n", right: "EDITED\n" on its first post-execution host read. The bridge bundle was built from that checkout; no application storage service is needed.
Suspected cause

The wire WriteFile handler mirrors bytes into the VM's root staging/shadow tree. service_owned_python_filesystem_rpc_request handles Python Write by updating only the kernel VFS. Subsequent shadow-to-kernel reconciliation imports the unchanged staging copy and overwrites the newer Python bytes. The JavaScript mirroring change in #1981 does not run on this Python RPC path.

I am preparing a focused fix and regressions for Python writes, including read-modify-write and atomic replacement. Python append-position/truncate behavior and shell/WASM shadow writes are separate from this fix.

主要言語
Rust
スター
4.8k
フォーク
270
平均マージ
13時間 37分
マージ済み PR(30日)
48

環境構築

このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

rivet-dev/agentos のほかの issue

rivet-dev/agentos の issue をすべて見る

似ている issue

Rust の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。