Aglet

Prevent stale batch progress with an outcome contract

Learning from a progress defect means preserving the distinction between selected work, item outcomes, and the derived view. Write down which state is authoritative and when a projection is considered fresh. Keep a small fixture that includes filtering and an active item so later changes cannot silently collapse those cases.

Keep the lesson for the next incident

  1. Document the denominator rule

    State whether the denominator includes every selected record, only eligible records, or another reviewed set. Link each excluded reason to that rule and name the component that owns the selection snapshot. Do not let the screen infer eligibility from whichever rows it currently displays.

  2. Keep an outcome fixture

    Retain sanitized examples for completed, failed, excluded, and active items, plus a late projection update. Record expected counts and terminal wording beside them. Re-run the fixture when aggregation, event ordering, filtering, or progress storage changes.

  3. Add a recurrence signal

    Watch for a projection timestamp older than the newest item event and for terminal batches whose counts do not reconcile. Review the batch shape, not just the total volume, when either signal returns. Assign an owner to revise the contract if a new outcome state appears.

What to carry forward

The durable lesson is a reviewed denominator, explicit item outcome taxonomy, and a freshness check tied to event time. Preserve the fixture and recurrence signals with the batch contract. Reopen the design when a new exclusion reason, terminal state, or projection path changes what progress is meant to represent.

Technical background: Celery documentation.

Keep the decision with the work.

Use a Work Item in Aglet to record the problem, the evidence you have, and the next decision. Add an owner and priority, then keep updates in the discussion so the next person can follow the reasoning.

Create an account See the product workflow