A weekly goal review is useful when it shows what actually happened, leaves unfinished check-ins visible, and gives you one thing to carry into next week. A bigger scorecard is not automatically better.

PactBuddy's weekly recap is built around a smaller question: what part of this week is worth repeating? It counts only due check-ins for the current member, separates kept, missed, and in-flight goals, then shows the daily rhythm and the strongest day.

A weekly goal review should show the pattern, not just the percentage

Percentages are tidy. They are also easy to misread. A 67 percent week could mean a steady routine with one bad day, or three good mornings followed by a complete collapse. Those weeks need different next steps.

The recap starts with the current calendar week and only includes occurrences that belong to the signed-in member and are due by now. The week boundary comes from Swift's Calendar and DateInterval, not a hard-coded seven-day window. Apple documents that behavior in the Foundation Calendar documentation:

let dueOccurrences = occurrences.filter {
    $0.ownerId == userID && interval.contains($0.dueAt) && $0.dueAt <= now
}

That last comparison matters. A scheduled check-in for tomorrow should not make today's weekly goal review look worse. It is still in flight, not failed.

The summary then counts passed and excused occurrences as kept, failed occurrences as missed, and scheduled or pending verification occurrences as awaiting. The result describes the week so far instead of pretending an unfinished week is finished.

The keep rate is a starting point, not a verdict

PactBuddy calculates the keep rate from kept check-ins divided by due check-ins. An empty week returns zero instead of producing a misleading percentage:

var completionPercentage: Int {
    guard dueCount > 0 else { return 0 }
    return Int((Double(keptCount) / Double(dueCount) * 100).rounded())
}

The UI calls this number KEEP RATE. It also shows the raw counts for kept, missed, and in-flight goals. That is a useful distinction for an accountability app. A person can look at 50 percent and ask whether two of four goals were kept, or whether one goal is still waiting for proof.

The number is not a grade from the app. It is a prompt for the two people in the pact to talk about the next setup. Maybe the deadline was too early. Maybe the proof path was awkward. Maybe the goal was fine and the week was just rough.

A weekly habit review needs a daily rhythm

The recap gives every day in the current week a small status: Kept, Missed, In flight, or No goal. Days without a goal stay visible, which keeps a blank day from looking like a failed one.

For each day, the summary counts due occurrences and then counts the statuses that belong to that day:

return Day(
    date: date,
    dueCount: occurrencesForDay.count,
    keptCount: occurrencesForDay.count { $0.status == .passed || $0.status == .excused },
    missedCount: occurrencesForDay.count { $0.status == .failed }
)

This is the part most weekly habit review screens leave out. The order of the days tells you more than a single total. If the only miss is always Monday, the next experiment probably belongs on Sunday night. If the goal is kept whenever the buddy checks in early, the agreement may need a better reminder rather than a harder target.

The daily view does not expose a public leaderboard or turn the week into a performance feed. The app keeps the review scoped to the member's own commitments and the pact they share with one buddy.

The strongest day gives the next week somewhere to start

The recap chooses a best day from days with at least one kept check-in. It prefers the day with the most kept goals, then the earlier date when there is a tie:

var bestDay: Day? {
    days
        .filter { $0.keptCount > 0 }
        .sorted {
            if $0.keptCount == $1.keptCount { return $0.date < $1.date }
            return $0.keptCount > $1.keptCount
        }
        .first
}

That rule is intentionally plain. It does not claim to discover the perfect habit schedule. It finds one concrete day worth looking at.

The reflection card uses that result to say, "Your strongest day was Tuesday. Keep that setup close." If there is no completed check-in yet, it tells the person to send proof when the goal is ready. A weekly goal review should leave the reader with a next move, not a paragraph of motivational fog.

What this weekly goal review does not solve

The recap does not explain why a goal was missed. It cannot tell whether the target was unrealistic, the reminder arrived at the wrong time, or the person simply changed their mind. It also only covers the current calendar week and the occurrences visible to the dashboard.

That is a boundary worth keeping. A review that invents a reason for every miss becomes another source of noise. The useful follow-up still belongs to the owner and the buddy: look at the day, check the proof, and decide whether next week's pact needs a small change.

The broader accountability loop is covered in our post on what an accountability partner app needs to do after you miss, while the social comparison question is in why a habit tracker with friends needs proof. The weekly recap sits after both ideas. It helps the pair look back without turning private accountability into an audience.

Start with one change you can test next week

Open your weekly goal review and ignore the headline number for a minute. Find the first day that went well. Then find the day that keeps going sideways. Change one part of the setup, write down what changed, and give the new version a full week.

That is enough. A useful review does not need to make the past impressive. It needs to make the next check-in easier to keep.