Skip to content

Wear history rules

How worn-count and last-worn date influence outfit choice. Phase 4. Today's prototype carries a small first-pass implementation as a foundation.

R1 — Data shape

data/wear_history.json (created in Phase 4):

{
  "C001": { "worn_count": 7, "last_worn_date": "2026-05-10", "last_event": "Team Strategy Meeting" },
  "C006": { "worn_count": 12, "last_worn_date": "2026-05-11", "last_event": "Dinner with Clients" }
}

Keyed by wardrobe item id. Items not in the dict are treated as fresh (never worn).

R2 — Freshness score

For each item:

freshness = 1.0   # never-worn baseline

if item in history:
    # Decay by both frequency and recency
    days_since_last = (today - last_worn_date).days
    freshness -= 0.25 * min(worn_count, 4) / 4      # frequency penalty
    freshness -= 0.25 if days_since_last < 3 else 0  # recency penalty

freshness = clamp(0.4, 1.0)

The floor of 0.4 prevents a much-loved piece from being permanently exiled.

R3 — Tie-breaker, not a filter

Freshness is a tie-breaker within the outfit builder, not a filter. Two equally-eligible items at the same step → prefer the fresher one.

A user's favorite piece is still allowed. The agent doesn't pretend the user doesn't have favorites; it just spreads the love.

R4 — Recently-worn note

If the chosen item has been worn within the last 3 days, surface it in the reasoning trail:

"Selected '{name}' — you've worn this recently, but it's the strongest fit for today's occasion."

This is honest narration, not an apology. The user might genuinely want to wear it again.

R5 — Underused-item nudge

If a high-quality item hasn't been worn in 45+ days and would be eligible today, surface it:

"Considered '{name}' — you haven't worn it in a while and it would suit today's occasion."

The agent doesn't automatically swap it in — it surfaces the option. The user can ask to regenerate with that item if they want.

R6 — Confirmation triggers a write

When the user confirms an outfit (a future "Wear today" button on the outfit screen), history_tool.record_wear(item_ids, event) increments worn_count and updates last_worn_date for every item in the accepted outfit.

The agent never writes to wear history without explicit user confirmation. A user can ignore the recommendation entirely and the history stays unchanged.

R7 — Privacy

Wear history is purely local in the prototype. In production it lives encrypted per-user and is deletable in one tap. The system does not surface aggregated wear-history insights ("you wear black 80% of the time") without opt-in — wear history is decision data, not feedback for the user.


Source basis

Primary category: Wardrobe management / digital closets (docs/evidence-and-references.md §3.7). Secondary: Personalization and user feedback (§3.8). Current basis: Design-informed rotation heuristic. The freshness formula (frequency penalty + recency penalty, floor of 0.4) is calibrated for the prototype's small wardrobe. The 0.4 floor is a deliberate values choice — "a much-loved piece is never exiled." Pending verification: Academic literature on consumer wardrobe utilization (search terms: "wardrobe-30," "Project 333," "cost-per-wear analysis").