The five tiers

Memory is not one bucket. Where a fact lives is information, and the tier an observation sits in is a decision Firsthand makes and revises.

tierAPIwhat lives thererows held
HOTset_statethe live verdict, rewritten in place11
WARMset_entitybehaviour seen three times or more7
COLDwrite_eventevery observation, append-only564
REFERENCEset_referencethings that rarely change2
ARCHIVEarchive_entityretired once its evidence aged out0

Counts are from the current indexed set. ARCHIVE is zero because nothing has aged past the 90 day window yet, which is a fact about the data rather than a missing feature.

COLD is the ledger

Every observation lands in the journal and the journal is never rewritten. When space has to be reclaimed it comes out of HOT, which is arithmetic over the journal and can be recomputed exactly. That distinction is the whole product in one operational decision.

What the SDK does not let you do

archive_entity moves a row out of the entities table rather than flagging it. Afterwards list_entities returns nothing under any status, get_entity raises, and archive is not a valid search tier, so the reason cannot be read back through the client at all. Firsthand therefore journals every archival with the body it retired, or a demotion would leave no auditable trace.

The free tier cap

5,242,880 bytes, enforced by the SDK rather than advisory. The indexed set is scoped to fit and the scope is stated, rather than truncated quietly.