Drafts persist across a restart with no network
pnpm test src/draftsLosing signal on a trail loses the note you were writing.
Review this agreement, then open /ideation in Pi to approve or revise it. No work starts before confirmation.
Field Notes needs a connection to save. Drop signal mid-sentence and the draft is gone.
Notes save on the device first, sync when signal returns, and flag conflicts instead of overwriting.
4 changed areas. Review changed boundaries and criteria before any new approval.
[
"Real-time collaboration"
][
"Real-time collaboration",
"Syncing attachments"
][
{
"decision": "How is “the offline indicator feels right” checked? A test for the state, plus your airplane-mode walkthrough",
"reason": "A test proves the state; only a person can judge whether it feels right."
}
][
{
"decision": "How is “the offline indicator feels right” checked? A test for the state, plus your airplane-mode walkthrough",
"reason": "A test proves the state; only a person can judge whether it feels right."
},
{
"decision": "Keep both versions when edits conflict",
"reason": "Silently picking a winner is the failure this change exists to fix.",
"rejected": "Last write wins"
}
][
{
"id": "draft-store",
"criterion": "Drafts persist across a restart with no network",
"check": {
"cmd": "pnpm test src/drafts"
}
},
{
"id": "sync-queue",
"criterion": "Queued edits sync in order when signal returns",
"check": {
"cmd": "pnpm test src/sync"
}
},
{
"id": "conflicts",
"criterion": "A conflicting edit shows a banner instead of overwriting",
"check": {
"cmd": "pnpm test src/conflicts"
}
},
{
"id": "status",
"criterion": "The offline indicator reflects real connectivity",
"check": {
"cmd": "pnpm test src/status"
}
},
{
"id": "full-suite",
"criterion": "The whole test suite passes",
"check": {
"cmd": "pnpm test"
}
},
{
"id": "typecheck",
"criterion": "Type checking passes",
"check": {
"cmd": "pnpm typecheck"
}
},
{
"id": "calm",
"criterion": "Writing in airplane mode feels calm",
"check": {
"judgment": "In airplane mode, write a note, reconnect, and confirm nothing was lost."
}
}
][
{
"id": "draft-store",
"criterion": "Drafts persist across a restart with no network",
"check": {
"cmd": "pnpm test src/drafts"
}
},
{
"id": "sync-queue",
"criterion": "Queued edits sync in order when signal returns",
"check": {
"cmd": "pnpm test src/sync"
}
},
{
"id": "conflicts",
"criterion": "A conflicting edit keeps both versions and shows a banner",
"check": {
"cmd": "pnpm test src/conflicts"
}
},
{
"id": "status",
"criterion": "The offline indicator reflects real connectivity",
"check": {
"cmd": "pnpm test src/status"
}
},
{
"id": "full-suite",
"criterion": "The whole test suite passes",
"check": {
"cmd": "pnpm test"
}
},
{
"id": "typecheck",
"criterion": "Type checking passes",
"check": {
"cmd": "pnpm typecheck"
}
},
{
"id": "calm",
"criterion": "Writing in airplane mode feels calm",
"check": {
"judgment": "In airplane mode, write a note, reconnect, and confirm nothing was lost."
}
}
][
{
"id": "store",
"title": "Local draft store",
"goal": "Persist drafts on the device before any network call.",
"risk": "low",
"needs": [],
"acceptanceIds": [
"draft-store"
]
},
{
"id": "queue",
"title": "Sync queue",
"goal": "Replay queued edits in order when connectivity returns.",
"risk": "medium",
"needs": [
"store"
],
"acceptanceIds": [
"sync-queue"
]
},
{
"id": "conflicts",
"title": "Conflict banner",
"goal": "Surface conflicting edits rather than overwriting.",
"risk": "medium",
"needs": [
"queue"
],
"acceptanceIds": [
"conflicts"
]
},
{
"id": "status",
"title": "Offline indicator",
"goal": "Show real connectivity state.",
"risk": "low",
"needs": [],
"acceptanceIds": [
"status",
"full-suite",
"typecheck",
"calm"
]
}
][
{
"id": "store",
"title": "Local draft store",
"goal": "Persist drafts on the device before any network call.",
"risk": "low",
"needs": [],
"acceptanceIds": [
"draft-store"
]
},
{
"id": "queue",
"title": "Sync queue",
"goal": "Replay queued edits in order when connectivity returns.",
"risk": "medium",
"needs": [
"store"
],
"acceptanceIds": [
"sync-queue"
]
},
{
"id": "conflicts",
"title": "Conflict banner",
"goal": "Keep both versions of a conflicting edit and say so, rather than overwriting either.",
"risk": "medium",
"needs": [
"queue"
],
"acceptanceIds": [
"conflicts"
]
},
{
"id": "status",
"title": "Offline indicator",
"goal": "Show real connectivity state.",
"risk": "low",
"needs": [],
"acceptanceIds": [
"status",
"full-suite",
"typecheck",
"calm"
]
}
]Arrows run from prerequisite to dependent deliverable. These are dependencies, not a timeline.
Verification PLAN · Checks to perform, not results. No execution evidence is claimed.
Read each row from commitment → check → evidence state. Grouped by the deliverable responsible for it.
Persist drafts on the device before any network call.
pnpm test src/draftsReplay queued edits in order when connectivity returns.
pnpm test src/syncKeep both versions of a conflicting edit and say so, rather than overwriting either.
pnpm test src/conflictsShow real connectivity state.
pnpm test src/statuspnpm testpnpm typecheckIn airplane mode, write a note, reconnect, and confirm nothing was lost.
Human judgment required.
None specified.
A test proves the state; only a person can judge whether it feels right.
Silently picking a winner is the failure this change exists to fix.
Rejected: Last write wins
Execution mode: strict. Independent review remains required. These are requested boundaries, not proof of approval.
Exact files or trailing-slash directory prefixes. “.” covers ordinary project files only; protected internals and dependency manifests/lockfiles remain excluded.
pnpm test src/draftspnpm test src/syncpnpm test src/conflictspnpm test src/statuspnpm testpnpm typecheckCommands must assert success with exit 0. Expected outcomes are explanatory. Approved scripts execute project code: tool policy is not an OS sandbox.
No time, token or attempt budget applies: work continues until it is verified, you pause or stop it, or it stops to ask because a check keeps failing.
Host-managed local commit: permitted. No push, merge, or deploy.
Persist drafts on the device before any network call.
store · needs: none · criteria: draft-store
Replay queued edits in order when connectivity returns.
queue · needs: store · criteria: sync-queue
Keep both versions of a conflicting edit and say so, rather than overwriting either.
conflicts · needs: queue · criteria: conflicts
Show real connectivity state.
status · needs: none · criteria: status, full-suite, typecheck, calm
Brief fingerprint
f8599f30b7856bd019505905e8ae5410420b52b214f9f0e46987b7591e93e01a