quad/.claude/base
qwreey f20922ce39
decide(bind-system): retract fires on every re-dispatch, not just type changes
Corrects a foundational error: "handler type unchanged -> retract skipped,
process diffs" was never actually true. StoreBind unconditionally calls
Dispatch.retractUnder before every re-dispatch (already stated in the
original dispatch model doc) -- Tag's old assert(v==nil) was taken at
face value and the general rule was wrongly back-derived from it.

Tag, Ref, Slot, and Attribute (the last three designed earlier this same
session) all inherited the flawed premise. Fixes across all four:

- Tag: rewritten around kTagMap/tagNameMap reference counting so
  AddTag is entirely process's job, RemoveTag entirely retract's,
  using a Contains hint to skip engine calls that would be immediately
  redone. Also fixes the case where two independent Tag(...) values at
  different positions share a name (union semantics, like className).
- Ref/Slot: drop the incorrect assert(v==nil), split into "retract
  unbinds/destroys the old, process binds/mounts the new" with an
  identity check on both sides to avoid spurious re-fire.
- Attribute: AttributeKeyHandler.retract gated on v==nil so ordinary
  value updates don't flicker the attribute to nil; the group's
  "unchanged name" delegation now also retracts before reprocessing,
  since skipping it was silently stacking chain entries every cycle.

Reversal preserved in archive/retract-always-fires-reversed.md.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-12 16:13:25 +09:00
..
architecture.md decide(tween): confirm natural-completion bookkeeping is left as-is, promote to base/ 2026-08-12 12:19:49 +09:00
attribute-plan.md decide(bind-system): retract fires on every re-dispatch, not just type changes 2026-08-12 16:13:25 +09:00
bind-system-plan.md decide(bind-system): retract fires on every re-dispatch, not just type changes 2026-08-12 16:13:25 +09:00
blocker-plan.md docs: Blocker/Effect를 base/additional-primitives.md에서 별개 파일로 재분리 2026-08-07 14:45:57 +09:00
component-composition-plan.md fix(base): 중간검토(질문 모드)에서 발견된 설계 결함 다수 수정 2026-08-09 23:37:46 +09:00
effect-plan.md decide(bind-system): Compute(fn, ...) trailing-args sugar 확정 2026-08-11 10:29:35 +09:00
lifecycle-pattern.md decide(base): Slot 형제 순서 보장(Length/Offset), bindLifetime/unbindLifetime과 canBound 이중 바인딩 게이트 통합 2026-08-09 20:58:56 +09:00
modifier-plan.md decide(tween): confirm natural-completion bookkeeping is left as-is, promote to base/ 2026-08-12 12:19:49 +09:00
module-lifecycle-plan.md docs(base): 코퍼스 전체 정합성 감사 반영, 기각된 대안 archive 이관 2026-08-08 11:38:29 +09:00
onchange-plan.md decide(attribute): group Attribute(...) primitive, AttributeKey rename, weak-cache identity 2026-08-11 18:22:54 +09:00
purity-and-effects-plan.md 6차 라운드 + 컴포넌트화/Modifier 논의, 문서 코퍼스 전체 정리 결과 반영 2026-08-04 15:49:28 +09:00
relate-plan.md decide(base): Relate 프리미티브 신설, bindLifetime/canExecute 확정, retract 필수화 2026-08-08 00:54:48 +09:00
slot-plan.md decide(bind-system): retract fires on every re-dispatch, not just type changes 2026-08-12 16:13:25 +09:00
store-semantics.md decide(base): canBound 이름 확정, Compute previous 방어/스코핑 명확화, Modifier 핸들러값·State<Modifier> UB→error 전환 2026-08-09 16:00:19 +09:00
tag-plan.md decide(bind-system): retract fires on every re-dispatch, not just type changes 2026-08-12 16:13:25 +09:00
tween-plan.md decide(bind-system): retract fires on every re-dispatch, not just type changes 2026-08-12 16:13:25 +09:00
ui-shorthand-plan.md decide(bind-system): retract fires on every re-dispatch, not just type changes 2026-08-12 16:13:25 +09:00