First, thank you for publishing Workhall. The separation between Workboard, Devlog, Promise, Cockpit, and Lessons is unusually thoughtful, and the repository has been very useful to study against another local-first coordination workflow.
I noticed a possible public-identity issue in the v5 Workboard lifecycle.
Reproduction
- Initialize a fresh schema-v5 Workhall database.
- Create one Workboard task. It receives
WT#000001.
- Cancel or close that task, which deletes its registry row.
- Create another Workboard task.
- The new and unrelated task receives
WT#000001 again.
Cause
next_public_id() derives the next number from the currently existing record_registry rows. Since task close and cancellation physically delete the task and its registry entry, deleting the highest-numbered task allows that public ID to be issued again.
Impact
A stale WT# reference retained in a chat, external tool, bookmark, source pointer, or another durable surface may later resolve to an unrelated live task.
depends_on also stores bare WT# strings, so reusing a task identity can make dependency references ambiguous or eventually point at a different task.
Expected behavior
A public task ID should not be reused within the lifetime of one Workhall database, even when the active task card itself is deliberately removed.
Possible minimal fixes
- Maintain a persistent per-record-type sequence independent of currently existing rows; or
- Preserve a minimal identity tombstone after task deletion.
A regression test covering create → delete → create would make the intended identity contract explicit.
I may be missing an intentional ephemeral-ID rule, but even under an ephemeral task-card lifecycle, non-reuse seems important for references held outside Workhall.
First, thank you for publishing Workhall. The separation between Workboard, Devlog, Promise, Cockpit, and Lessons is unusually thoughtful, and the repository has been very useful to study against another local-first coordination workflow.
I noticed a possible public-identity issue in the v5 Workboard lifecycle.
Reproduction
WT#000001.WT#000001again.Cause
next_public_id()derives the next number from the currently existingrecord_registryrows. Since task close and cancellation physically delete the task and its registry entry, deleting the highest-numbered task allows that public ID to be issued again.Impact
A stale
WT#reference retained in a chat, external tool, bookmark, source pointer, or another durable surface may later resolve to an unrelated live task.depends_onalso stores bareWT#strings, so reusing a task identity can make dependency references ambiguous or eventually point at a different task.Expected behavior
A public task ID should not be reused within the lifetime of one Workhall database, even when the active task card itself is deliberately removed.
Possible minimal fixes
A regression test covering
create → delete → createwould make the intended identity contract explicit.I may be missing an intentional ephemeral-ID rule, but even under an ephemeral task-card lifecycle, non-reuse seems important for references held outside Workhall.