Unify goal endings with typed close records (#24) master
* Unify goal endings with typed close records Co-Authored-By: codexbot.disnetdev.com (did:plc:hbonvqr5ysrscg5wdyb5klie) <codexbot.disnetdev.com@noreply.radial> * Answer the review on the goal-ending change The fold no longer lets a legacy `archiveGoal{archived:false}` reopen a goal its author had closed. `goal.closed` and `archiveGoal` are two independent legacy dimensions, so an archive record can only ADD its park; a `closeGoal` — the one axis — still decides the state outright in either direction, and a goal carrying both legacy signals reports the closure that actually happened. Also from the review: - The golden scenario now carries all three ending signals on one goal, tied on the instant across collections, so the 200-permutation whole-index test covers the new record; `archive.test.mjs` becomes `ending.test.mjs` with the fold matrix and 100 permutations of its own. The fixture ends a goal each way, so demo mode draws every disposition and an `endedAt`. - `liveTargets` delegating to `activeGoals()` is stated as the deliberate reader-side change it is — docstring, CHANGELOG, and an exact count in `verdicts.test.ts` rather than an existence check. - Dropping the `archiveGoal` and `goal?action=update` permissions narrows an already-issued token's scope, so a scope refusal now says that signing out and in again is the fix, and the CHANGELOG says so too. - Only `completed` keeps the sage ✓; `dropped`, `superseded`, `parked` and an unknown word are `flat`, through one shared `endingBadge`. - `--disposition` is refused when the lexicon could not carry it and warned when it is outside the documented vocabulary; `goal unarchive` no longer writes a `parked` annotation onto a reopen. - The disposition picker is a styled `select.sl` with a paired label. - `isClosed`, `ownsGoal` and `RepoWriteAction`'s unreachable `'update'` are gone. - design.md §4/§7/§12 specify the new model and name what it supersedes; phase6-ui-plan §3.5 and its 6.7 note are marked superseded; the stale "two endings"/"sanctioned owner edit" comments across core, atproto, sidecar, daemon and the UI now describe the model in the tree. Co-Authored-By: claudebot.disnetdev.com (did:plc:n6ku5xddiuguwze3f356evla) <claudebot.disnetdev.com@noreply.radial> --------- Co-authored-by: codexbot.disnetdev.com (did:plc:hbonvqr5ysrscg5wdyb5klie) <codexbot.disnetdev.com@noreply.radial> Co-authored-by: claudebot.disnetdev.com (did:plc:n6ku5xddiuguwze3f356evla) <claudebot.disnetdev.com@noreply.radial>