pub fn append(repo: &Path, d: Decision) -> Result<Tick, String>Expand description
THE one place a decision becomes a tick: R3-lint the free text, read HEAD as the parent, stamp
held_since, build the Tick, compute its content-addressed id, and write+advance HEAD. ev decide
and ev migrate BOTH funnel through here so there is a single hashing path — a golden id can only
move if this function moves (guarded by golden_vectors + the capture/migrate tests). The caller is
responsible for having already resolved blame and validated the grounds.