tag/property/closed value should be hard retracted

This commit is contained in:
Tienson Qin
2026-03-18 03:01:38 +08:00
parent 1f30693851
commit e3e54eba3f
19 changed files with 631 additions and 165 deletions

View File

@@ -0,0 +1,69 @@
# ADR 0009: Hybrid Delete Semantics for Schema Entities
Date: 2026-03-18
Status: Accepted
## Context
`delete-blocks` and page deletion now recycle entities instead of hard deleting
them.
That works well for ordinary content because users can restore deleted blocks
and pages from Recycle, and active UI/search can treat recycled content as
hidden state.
It does not work as well for DB-schema entities.
Tag pages, property pages, and closed-value blocks continue to exist after
deletion and can leak into active semantics such as:
- class/property enumeration
- closed-value lookup and scoped choices
- bidirectional/property-derived views
- sync repair logic when schema roots disappear but dependents still reference
them
At the same time, sync still needs to remain robust when `:db/retractEntity`
appears again for this subset of entities and for their descendants.
## Decision
1. Adopt hybrid delete semantics:
- recycle ordinary blocks and ordinary content pages
- hard retract tag/class pages, property pages, and closed-value blocks
2. When deleting a schema root page, retract the schema page tree rather than
moving it to Recycle.
3. When deleting a closed-value block, retract the choice entity directly.
4. Keep raw entity access unchanged; deleted schema entities should disappear by
DB state, not by UI-only filtering.
5. Keep recycle-aware behavior for content entities:
- deleted-state page route for recycled content
- deleted styling for recycled references/embeds
- search/index filtering for recycled content and descendants
6. Make sync robust for missing content locations:
- if a content node loses `:block/parent` or `:block/page` during sync
application, move it to Recycle rather than leaving it structurally
invalid
7. Preserve valid `:db/retractEntity` handling in sync sanitize/rebase/apply for
schema deletions.
## Consequences
- Positive:
- Schema entities return to true disappearance semantics, which matches how
most schema helpers already reason about deletion.
- Content keeps recycle/restore UX.
- Sync has a deterministic repair rule for orphaned content blocks.
- Negative:
- Delete semantics are now mixed by entity kind, so the rule must remain
centralized in the outliner/domain layer.
- Some old recycled schema entities may still need active-use filtering until
users delete them under the new semantics.
- Sync logic is slightly more complex because it must accept both recycle and
hard-retract flows.
## Verification
- Model/helper coverage:
- `bb dev:test -v frontend.db.db-based-model-test/get-all-classes-filters-recycled-test`
- `bb dev:test -v frontend.db.db-based-model-test/get-all-properties-filters-recycled-test`
- Sync repair coverage:
- `bb dev:test -v frontend.worker.db-sync-test/missing-parent-after-remote-retract-moves-child-to-recycle-test`
- Additional targeted coverage to keep or extend:
- page/property/closed-value delete semantics
- bidirectional helper behavior with deleted or recycled entities
- search index invalidation for recycled content