Throwaway prototype · not production

Does today’s Inbox (admit + pipeline) feel right?

Logic: @tyrant/domain · Inbox + PipelineAlgorithm via adapter

Candidates pass admit (owner, not deleted, not done/dismissed/postponed today, cadence relevant, optional context), then a pipeline of stable sorts orders members for Views One (first) and All (full list). Defer stays on the list but sinks. Scrub the clock and press outcomes on each row.

Context filter

Add activity
Contexts

View All · ordered members

    Not admitted

    Same candidates, rejected by admit — with the reason.

      Current recipe

      Admit (all must hold): owned · not deleted · not postponed today · not done today · not dismissed today · cadence relevant · context filter (if any).

      Pipeline (top → bottom, successive stable sorts; later override earlier — last wins):

      1. Postponed-returned (prior day postpone; routines never count)
      2. Among postponed-returned: older postpone first (recent last)
      3. Not deferred today before deferred today
      4. Among deferred today: older defer first (recent last)
      5. Timeframe band: inafter (overdue) → untimedbefore
      6. Among in: shorter length first (open/start-only last)
      7. Among in: earlier window start first
      8. Among in: not deferred before deferred
      9. Among in deferred: older defer first (recent last)

      Walkthroughs

      Each tab resets to a known scene. Press the steps in order.

      Prototype workaround: defer recency on a frozen clock

      The demo clock does not tick. Domain defer stamps deferredAt = clock.now, so several defers at 07:05 would share one instant. Recency would tie and fall back to timeframe order — deferring the top in item would look like a no-op once peers were already deferred.

      Prototype only: each defer in this session adds +1 ms to that stamp (counter resets with the scene). Domain is unchanged. In a live app the wall clock moves, so this offset is unnecessary.