feat(filebox): Phase 108 FileBox write/write_all implementation

Implement write functionality for FileBox following Phase 108 specification,
completing the read/write pipeline via Ring0.FsApi.

## Implementation Summary

### Task 2: FsApi / Ring0FsFileIo write implementation
- Added write() method to FileIo trait
- Implemented write() in Ring0FsFileIo (truncate mode via Ring0.FsApi.write_all)
- Updated FileCaps to { read: true, write: true } for standard profile
- Added write() stub to CoreRoFileIo (returns Unsupported)

### Task 3: FileBox write/write_all implementation
- Updated FileBox.write_all() to delegate to provider.write()
- Updated FileBox.write() to convert content to text and call provider.write()
- UTF-8 conversion via String::from_utf8_lossy (text-oriented design)
- Returns "OK" on success, "Error: ..." on failure

### Task 4: Test coverage
- Round-trip test (write → read):  PASS
- Truncate mode verification:  PASS
- Write without open error:  PASS
- Read-only provider rejection:  PASS
- Auto-registration test updated:  PASS

### Task 5: Documentation updates
- phase107_fsapi_fileio_bridge.md: Added Phase 108 section
- core_boxes_design.md: Updated Ring0.FsApi relationship section
- CURRENT_TASK.md: Added Phase 108 completion entry

## Design Decisions (from phase108_filebox_write_semantics.md)

- **Write mode**: truncate (overwrite existing file each time)
- **Text-oriented**: UTF-8 conversion via from_utf8_lossy
- **Append mode**: Planned for Phase 109+
- **Error handling**: FileError::Io for failures, Fail-Fast on caps.write=false

## Test Results

```
cargo test --release --lib filebox
test result: ok. 5 passed; 0 failed; 1 ignored
```

All FileBox tests pass, including Phase 107 compatibility tests.

## Pipeline Complete

```
FileBox.write(content)
    ↓
FileBox.write_all(buf)
    ↓
provider.write(text) ← Ring0FsFileIo implementation
    ↓
Ring0.FsApi.write_all()
    ↓
std::fs::write()
```

## Next Steps (Backlog)

- Phase 109: minimal/no-fs profile
- Phase 110: FileHandleBox (multiple files simultaneously)
- Phase 111: append mode implementation

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
nyash-codex
2025-12-03 18:40:33 +09:00
parent d3e43b9a45
commit 61dc4dec9b
8 changed files with 206 additions and 54 deletions

View File

@ -256,7 +256,7 @@ FileBox は selfhost/通常ランタイムでは事実上必須(ログ・ツ
- **PluginHost**: startup 時に CoreBoxId.is_core_required() で provider をチェック
- 未登録なら CoreInitError::MissingService で fail-fast
### Ring0.FsApi との関係Phase 107 完了)✅
### Ring0.FsApi との関係Phase 107-108 完了)✅
**Phase 107 統合完了2025-12-03**:
@ -266,16 +266,22 @@ FileBox の実体 I/O は、以下の層構造で Ring0.FsApi を通す設計が
[FileBox (Ring1)]
↓ provider 経由
[Ring0FsFileIo] (FileIo 実装)
↓ read_to_string/read 呼び出し
↓ read_to_string/write_all 呼び出し
[Ring0.FsApi] (OS I/O 抽象)
[std::fs]
```
**Phase 108 実装完了2025-12-03**:
- FileBox は Ring0FsFileIo 経由で **read/write 両対応**
- write は **truncate mode**(毎回上書き)
- append モードは Phase 109+ で予定
**設計原則**:
- **FileIo = stateful**(現在開いているファイルハンドルに対する操作)
- open() でファイルを開く
- read() で内容を読み込む
- write() で内容を書き込むPhase 108 追加)
- close() でファイルを閉じる
- **FsApi = stateless**Path → データの直接変換)
- read_to_string(path) / write_all(path, data)

View File

@ -316,7 +316,28 @@
---
## 8. 設計原則(Phase 107 で確立)
## 8. Phase 108 以降の進展
### Phase 108 実装完了2025-12-03
**write 実装完了**:
- Ring0FsFileIo に write() メソッド実装
- FileBox.write() / write_all() が Ring0.FsApi.write_all() 経由で動作
- FileCaps.write = true標準プロファイルで書き込み対応
**設計決定**:
- **Write mode**: truncate既存ファイル毎回上書き
- **テキスト前提**: UTF-8 変換from_utf8_lossy
- **append mode**: Phase 109+ で予定
**テスト**:
- Round-trip テストwrite → read
- Truncate mode 検証✅
- Read-only provider 拒否テスト✅
---
## 9. 設計原則Phase 107 で確立)
### 層の棲み分けが完全化