feat(adapters): writable FolderAdapter + positive write conformance (WP-0008 T1)

FolderAdapter(writable=True) declares WRITE+PER_PAGE, implements write() and
current_rev() (mtime token for drift detection). Conformance gains a
content-preserving positive write probe for WRITE-claiming adapters. 5 tests
green, full suite green, pyflakes clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-15 11:09:43 +02:00
parent e24f0034a0
commit 92d5774baf
4 changed files with 88 additions and 4 deletions

View File

@@ -11,6 +11,7 @@ created: "2026-06-15"
updated: "2026-06-15"
depends_on:
- SHARD-WP-0007
state_hub_workstream_id: "12bed418-39d6-47fa-a359-ff04bae6ec99"
---
# SHARD-WP-0008 — Write path
@@ -41,8 +42,9 @@ propagation, network API, lossy native-syntax overlays. Those are later.
```task
id: SHARD-WP-0008-T1
status: todo
status: done
priority: high
state_hub_task_id: "80492f8e-125c-4015-b3c0-821fbec038e0"
```
Make `FolderAdapter` optionally **writable** (`writable=True`): declare `WRITE` +
@@ -58,6 +60,7 @@ folder still rejects write; conformance passes for both.
id: SHARD-WP-0008-T2
status: todo
priority: high
state_hub_task_id: "cc6bf9a3-667d-468d-972d-dae51931a657"
```
`coordination/overlay.py`: an `Overlay` value type (id, target identity, base_rev, body, state)
@@ -71,6 +74,7 @@ overlays. Tests: draft recorded + retrievable via fold; overlay id stable.
id: SHARD-WP-0008-T3
status: todo
priority: medium
state_hub_task_id: "90d98c16-ed3b-414f-802c-b0400eca6ede"
```
Render an overlay as a reviewable **patch** (a `Patch` with a unified diff of base→overlay body,
@@ -83,6 +87,7 @@ empty patch when unchanged.
id: SHARD-WP-0008-T4
status: todo
priority: high
state_hub_task_id: "2a0179b1-802e-44e6-883d-9f1babefee80"
```
`OverlayEngine.apply(overlay_id)` with §8.6 semantics: compare overlay `base_rev` to the
@@ -97,6 +102,7 @@ Tests: ff apply mutates the shard; drift refuses; read-only keeps draft.
id: SHARD-WP-0008-T5
status: todo
priority: medium
state_hub_task_id: "4536d74f-3860-4b4c-82d2-e8d20e6e2125"
```
When resolving a page that has an **open overlay**, surface it: the read reflects
@@ -110,6 +116,7 @@ overlay. Tests: page with a draft reads with overlay_state DRAFT; applied/none r
id: SHARD-WP-0008-T6
status: todo
priority: medium
state_hub_task_id: "ab01fffb-61ad-416c-9f13-fdfbfd503153"
```
Add `InformationSpace.edit(name, body)` (write-through if the resolved shard supports WRITE,