feat(fixture): mirror the goal domain — /goal command, six verbs, projection unit

The keyless fixture now carries the goal chain end to end, mirroring the
host: /goal enters the command catalog and its execute path brackets a
goal/change create with the command lifecycle pair; the six mutation verbs
CAS-check the projected current goal and append whole-value changes (the
shared append path broadcasts the session event and the goal projection
frame); the tail-page projections block and the mux-open baseline always
carry the goal key (null before create / after clear). Connection specs
follow: the lifecycle round-trip replaces the not-implemented stubs, and
the mux baseline expects the third unit frame.

Also: GoalBar inline errors use ASCII parens around the code (review
feedback on #842).
This commit is contained in:
imccyu
2026-07-29 01:40:23 +08:00
parent b0fc3b971b
commit 0477f33079
5 changed files with 204 additions and 28 deletions

View File

@@ -52,7 +52,7 @@ export function GoalBar({ goal, onEdit, onResume, onClear }: GoalBarProps) {
if (result.ok) {
setEditing(false)
} else {
setActionError(`${result.error.message}(${result.error.code})`)
setActionError(`${result.error.message} (${result.error.code})`)
}
}, [draft, onEdit])
@@ -61,7 +61,7 @@ export function GoalBar({ goal, onEdit, onResume, onClear }: GoalBarProps) {
setActionError(null)
const result = await action()
setPending(false)
if (!result.ok) setActionError(`${result.error.message}(${result.error.code})`)
if (!result.ok) setActionError(`${result.error.message} (${result.error.code})`)
}, [])
// Loading, absent, and complete goals have no strip at all.