Replies: 5 comments
|
Verified all three of your claims against rc.2 (HEAD b150a55), and I checked the two persistence backends plus the archive registry while I was there. Your design shape is sound — registry-last ordering and "children keep their transcripts, parentSession stops resolving" both match how the code already tolerates unresolvable parents ( 1. The gap is in the persistence contract itself, not just the JSONL layer. The 2. The archive set is append-only with no removal path — and it interacts with deletion. 3. The workspace accounting slot is explicit in the docs. The ui-workspace README states archive is "non-destructive: the log and the workspace accounting slot remain". The slot is per-workspace session membership — deletion must release it or workspace lists accumulate ghost accounting for sessions whose logs are gone. Your "registry last" covers this, but it's worth naming the accounting slot as a distinct reference so the checklist is complete. 4. Simplification: titles ride along with the transcript. One inference boundary: session seq numbering is index-derived with no cross-process lock (the |
|
Thorough review, thank you. Since posting the shape we have implemented and shipped it in our fork (tag 0.1.1-rc.2.sf.5), so I can answer each point from the field rather than the whiteboard. 1. Contract change - confirmed, and that is how we built it. 2. Archive-set interaction - we resolved it by making archived a precondition. Delete refuses unless the session is (a) not live ( 3. Accounting slot - named and released. The registry delete drops 4. Titles/projections - matches our experience. Nothing title-specific to invalidate; the projection cache's header-identity check ( The seq boundary: our answer is to make "no writer exists" a precondition rather than a locking problem. The persistence coordinator's Wire surface we ended up needing, if useful as a checklist: |
|
Field report beats whiteboard — thanks for shipping it. I took the operation-chain run you offered, against rc.2, and came back with three facts that make your implementation cheaper than it looks, one ordering check, and two nits. Three source facts that lower the migration cost:
The operation-chain check. Two nits:
Happy to diff against the fork history if you share the path — the CASCADE + incarnation findings suggest your SQLite side could shrink by a migration or two. |
|
A few corrections, and one thing I have to push back on. Idempotency. You're right that the registry half is serialized by There is no schema bump. You inferred 17 to 18. Fact 3 removes a step from the checklist. If The per-id unit is a directory. The point behind the nit still holds. The contract should not be JSONL-shaped, which is why incarnation. This is worth more than you pitched it as. The column is already in the revision token: Archived gate. Agreed, and it needs the comment. A never-archived session sitting one click from deletable is the deliberate part. The section being removed in a refactor and taking the only route to delete with it is not something types will catch. The comment goes at the precondition rather than in the UI. On sharing a path. My earlier "the implementation is in the fork history if you want the diffs" was wrong to offer, because that fork is private. Apologies for sending you after something you cannot open. What does exist is a public patch queue, where branches are cut from an upstream commit and carry one fix each, so they cherry-pick with no fork context: https://github.com/nokkies/dsh-upstream-patches It currently holds one branch, the matcher and timeout fail-open fixes for #582 and #583/#460. Not this work. Session deletion touches both persistence backends, the workspace registry, two RPCs, a durable event with its client frame, and the Archived UI, so extracting it is a larger job than a guard-line fix and I am not going to put a date on it. If it goes up there I will link it here. Everything above is checkable against rc.2 without the diffs. If you want to run an ordering against the operation-chain, I can write out our exact sequence step by step in a comment. |
|
Both corrections accepted, and verified against rc.2 before replying. The JSONL unit is a directory — my nit was wrong. I had only read the No schema bump — agreed, and the reasoning is instructive. Idempotency specifics confirmed as you described. JSONL resolve-first + incarnation: verified, and your follow-up is well-scoped. The thread has converged: design validated, fork implementation confirmed against upstream source, and the wire checklist is one item shorter per your own confirmation of the FTS self-heal. When you share the fork path I'll diff the ordering against the operation-chain. |
Uh oh!
There was an error while loading. Please reload this page.
Raised by a deployment operator who noticed the UI offers archive but no delete — and it turns out that is not a UI omission. As far as I can establish, no session deletion path exists anywhere in the harness.
Verified against current master
workspace.archiveSessionappends the id toarchivedSessionIdsin the workspace registry — durable list-visibility state, nothing more. The transcript is untouched.link()+unlink()and staging cleanup in the win32 path). Every transcript ever created — prompts, file contents, tool outputs, terminal echoes — accumulates under the harness home indefinitely.session-projection-cache/src/spec.tsexplicitly reasons about "a deleted-then-recreated id" naming a slot rather than a lifecycle. The hazard analysis exists; the feature does not.Why it is worth a design rather than staying a gap
Why it is design-shaped, not a quick verb
A session id is not an island:
parentSessionin other sessions' headers (subagent lineage) — deleting a parent orphans children's provenance. (liveLineagealready tolerates an unresolvable parent, which helps.)session-projection-cachekeys by id and must invalidate; the id-reuse hazard its own spec describes becomes live the moment deletion exists.archivedSessionIdsand session ordering.A shape, for discussion
sessions.delete(sessionId)host API + CLI verb, refusing live sessions and sessions with live descendants.parentSessionsimply stops resolving, which is already a supported state.Happy to build it against a maintainer-blessed shape; carrying the design in my fork's tracker meanwhile.
All reactions