decay_mood applies the AR(1) inertia term phi per turn, not per unit of wall-clock time. A conversation resumed after a week decays exactly as much as a conversation continued after a minute.
Real affect dynamics are continuous-time. The DynAffect account this transform is modelled on (Kuppens, Oravecz & Tuerlinckx 2010) is a continuous-time process; discretising it per turn is our simplification, recorded as a departure in docs/foundations.md section 3.
This is falsification item (1) in that document, and the single most defensible improvement available to appraisal.py.
Shape of the work:
phi_effective = phi ** (elapsed / reference_interval), with reference_interval on AffectDynamics so the current behavior stays reachable.
- Elapsed time has to enter the transform without making it impure — pass it in, do not read a clock inside the kernel.
- Both runtimes, plus a fixture decision: does the default stay per-turn (backwards compatible) or become time-aware (a breaking change)?
Needs someone willing to think about the API, not just the arithmetic.
decay_moodapplies the AR(1) inertia termphiper turn, not per unit of wall-clock time. A conversation resumed after a week decays exactly as much as a conversation continued after a minute.Real affect dynamics are continuous-time. The DynAffect account this transform is modelled on (Kuppens, Oravecz & Tuerlinckx 2010) is a continuous-time process; discretising it per turn is our simplification, recorded as a departure in docs/foundations.md section 3.
This is falsification item (1) in that document, and the single most defensible improvement available to
appraisal.py.Shape of the work:
phi_effective = phi ** (elapsed / reference_interval), withreference_intervalonAffectDynamicsso the current behavior stays reachable.Needs someone willing to think about the API, not just the arithmetic.