Record that 2d's worked examples no longer exist

The registry reset deleted Lim Seonho and character_afa7623b, so there is nothing
to merge or split until the rerun mints a new set. What was done instead is the
safety net for that rerun, since reconcile runs inside it: a merge retires the
losing row rather than deleting it, and records which assignments moved.

Half-closes caveats/audit-open.md#destructive-reconcile. The unmerge path and the
split stay unwritten on purpose, with the revisit trigger named.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-12 19:27:13 +04:00
parent ca4661763c
commit d63a337f15
3 changed files with 99 additions and 9 deletions
+15 -5
View File
@@ -5,12 +5,22 @@ fixed findings live in `decisions/audit-phase1.md`. Line numbers are from the au
## Reconcile deletes the losing character irreversibly {#destructive-reconcile}
Reconciliation deletes the losing character row (`db.py:506`). Clearing the reconcile stage does not
undo it, and name claims attached to the merged-away character are not repointed.
Reconciliation used to delete the losing character row. Clearing the reconcile stage did not undo it, and
nothing recorded which detections had been the loser's.
Costs: one bad merge is unrecoverable without rebuilding the identity stage for the whole manga.
Revisit when: identity work resumes, or a reviewer reports a wrong merge on a real chapter.
Workaround: none. Clear identity and rerun, which loses the good merges too.
**Half-closed 2026-08-12.** The loss is no longer unrecoverable. `merge_characters` marks the loser
`merged_into = keeper` instead of deleting it, so its embedding, description and gender survive, and every
repointed assignment is stamped `method = merged_from:<loser_id>` in `identity_assignment_sources`. Those
two records are enough to walk a merge backwards. Roster readers filter `merged_into IS NULL`. Lookup by
id does not, so an assignment still pointing at a merged id resolves.
What is still missing is the mechanism that consumes them: there is no unmerge, and no split. Undoing a
merge today means a manual SQL walk of the two records above.
Costs: a wrong merge needs hand-written SQL to undo, not a rebaseline.
Revisit when: a reviewer reports a wrong merge, or the review gates from [#136] get a place to hang
name/merge/split actions. No wrong merge has been seen since the crops were fixed, so building the unmerge
before either trigger would be speculative.
## Clearing a stage does not undo what it wrote {#dishonest-clearing}