ADR-011: A greet presents a short happy reaction and then the attentive activity

Date: 2026-07-28

Status: Accepted

Context

A greet is the only route into the attentive activity, and it sets the happy expression in the same call. The presentation mapping answers a known expression ahead of every activity, and PET_HAPPY_FOR_MS was 45000 while PET_ATTENTIVE_FOR_MS was 30000, so the happy expression covered the whole attentive dwell.

The activity_attentive role and sprites/attentive.png therefore never reached a screen in a product run, which LIM-010 recorded. Every layer behaved as its own contract documented, so the gap was a product rule that had never been decided rather than a defect in one component. E22 required the rule to be decided before the TFT direction began depending on the same roles.

Decision

A greet presents a short happy reaction, then the visible remainder of the attentive dwell, then a settled idle pet. PET_HAPPY_FOR_MS becomes 10000 and PET_ATTENTIVE_FOR_MS stays 30000.

The rule is held by an ordering invariant rather than by the two values. An expression dwell that an action starts must be shorter than an activity dwell the same action starts, because the covering expression would otherwise outlast the covered activity. A Core test asserts the ordering, so a later dwell change cannot silently hide an activity role again.

The presentation role priority is unchanged. An expression still answers ahead of an activity.

Consequences

Both roles are reachable in a product run, and the headless scenario now demonstrates the expression region settling while the activity region continues, which is the same independence it demonstrated before with the regions the other way round.

LIM-010 is closed. A future activity that an action starts alongside an expression inherits the invariant and the test that guards it.

A greet reads as a briefer reaction than it did in v0.2.0. That is a deliberate product choice, because the alternative was an attentive animation that no user could ever see.

Alternatives considered

Answer the attentive activity ahead of the happy expression. Rejected because it would hide the happy expression for the whole attentive dwell and trade one unreachable role for another, and because the role priority is a presentation contract that frontends and later display work already read.

Stop the greet from setting the happy expression. Rejected because the happy reaction is the feedback that makes a greet feel answered, and removing it would weaken SPEC-FR-011 to fix a timing problem.

Leave the behaviour and narrow the limitation to documentation. Rejected because an asset and a role that no run can reach would stay in the manifest contract and the TFT direction would inherit them.

References