Skip to content

feat: use configured work days for weekly pace - #1451

Merged
steipete merged 11 commits into
mainfrom
feat/workday-aware-pace-maintainer
Jun 13, 2026
Merged

feat: use configured work days for weekly pace#1451
steipete merged 11 commits into
mainfrom
feat/workday-aware-pace-maintainer

Conversation

@steipete

@steipete steipete commented Jun 11, 2026

Copy link
Copy Markdown
Owner

Summary

  • use configured work days for standard weekly pace calculations
  • keep historical Codex pacing unchanged when historical data is available
  • compute ETA in work time and map it back to wall-clock time
  • preserve exhausted pace output before the first configured workday while retaining early-window noise suppression
  • use the existing persisted weeklyProgressWorkDays value for both weekly markers and fallback pace/ETA; this unified behavior is intentional

Supersedes #1357 because repository CI would not start for the fork head. Preserves @pstanton237's commits and authorship.

Fixes #1356.

Validation

  • exact candidate: 1a60cb5ac26e81153ad00eb12487fc7ac0b13041
  • focused pace, menu-model, historical-authority, settings, and localization suite: 134 tests across 7 suites passed
  • timezone stress under Pacific/Auckland: 65 tests across 3 suites passed
  • full deterministic inventory with capped concurrency: all 427 suites passed (3,753 + 76 + 132 test executions)
  • make check: SwiftFormat clean; SwiftLint 0 violations across 1,077 Swift files
  • swift build
  • exact-head autoreview: no accepted/actionable findings
  • ad-hoc packaged debug app: strict deep codesign verification passed; executable SHA-256 6628e502ada679532bb18a14626f138e035d0732198bfc1234225faca882f1e5
  • built-app proof: selected Off, 4 days, and 5 days in Display settings; verified 5 days persisted across restart; exercised the real Codex-backed app and restored the prior absent preference afterward
  • the available account exposed no weekly rate-limit event, so the exhausted visible menu path is proved by the focused menu-model regression that renders Runs out now
  • Public Model Identifier Gate: PASS over the exact diff, tests, workflows, package, retained settings proof, and public text; no new model identifiers or private account payloads are included

@clawsweeper

clawsweeper Bot commented Jun 11, 2026

Copy link
Copy Markdown

Codex review: needs maintainer review before merge. Reviewed June 13, 2026, 3:26 PM ET / 19:26 UTC.

Summary
This PR threads the existing weeklyProgressWorkDays setting into standard weekly pace and ETA calculations, preserves Codex historical pace authority, updates localized settings copy, and adds focused regressions.

Reproducibility: not applicable. as a feature/product-semantics PR. The current-main source clearly uses linear weekly fallback pace, and the PR proof/tests exercise the new workday-aware behavior.

Review metrics: 2 noteworthy metrics.

  • Changed Surface: 24 files, +811/-33. The diff spans the pace engine, store/menu plumbing, localized settings copy, changelog text, and regression tests.
  • Final Check State: 4/4 reported checks succeeded. The latest head is no longer draft and GitHub reports macOS, Linux x64, Linux arm64, and GitGuardian checks successful.

Merge readiness
Overall: 🐚 platinum hermit
Proof: 🐚 platinum hermit
Patch quality: 🐚 platinum hermit
Result: ready for maintainer review.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • none.

Risk before merge

  • [P2] Merging intentionally changes weekly fallback pace labels and ETA for existing users who previously saved 4- or 5-day weeklyProgressWorkDays for visual markers only; the owner has accepted and documented this upgrade-visible behavior.

Maintainer options:

  1. Accept Unified Work-Day Semantics (recommended)
    Land the current branch with the existing persisted work-day setting controlling both weekly markers and fallback pace/ETA, matching the owner decision and updated copy/tests.
  2. Split Pace Into A Separate Opt-In
    If maintainers decide saved marker preferences must remain visual-only on upgrade, revise the branch to keep existing users on linear pace unless they choose a separate pace setting.

Next step before merge

  • No automated repair is needed; the remaining action is owner/maintainer merge handling for a clean, decision-ready PR with an accepted compatibility tradeoff.

Security
Cleared: The diff changes Swift pace/menu logic, tests, localizations, and changelog text; I found no concrete security or supply-chain concern.

Review details

Best possible solution:

Land the unified work-day pace behavior with the accepted compatibility tradeoff; if maintainers reconsider upgrade semantics later, split pace calculation behind a distinct opt-in setting with migration coverage.

Do we have a high-confidence way to reproduce the issue?

Not applicable as a feature/product-semantics PR. The current-main source clearly uses linear weekly fallback pace, and the PR proof/tests exercise the new workday-aware behavior.

Is this the best way to solve the issue?

Yes for the accepted product direction: the patch reuses the existing setting consistently, preserves historical Codex pace authority, and adds focused math/menu/localization coverage. The safer alternative would be a separate opt-in pace setting if maintainers no longer want persisted marker preferences to affect ETA on upgrade.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against ca948292c164.

Label changes

Label justifications:

  • P3: This is a low-urgency product-semantics improvement to weekly pace display rather than an outage or urgent regression.
  • merge-risk: 🚨 compatibility: Existing persisted 4- or 5-day work-day marker settings will intentionally change fallback pace and ETA behavior after upgrade.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🐚 platinum hermit and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (live_output): The PR body and latest owner comment provide exact-head test/check output plus built-app settings persistence proof with a real Codex-backed app, with the unavailable exhausted live path covered by a visible menu-model regression.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body and latest owner comment provide exact-head test/check output plus built-app settings persistence proof with a real Codex-backed app, with the unavailable exhausted live path covered by a visible menu-model regression.
Evidence reviewed

What I checked:

  • Repository policy read: AGENTS.md was read fully; its guidance to prefer focused state/model tests for menu behavior is relevant because this PR proves the visible exhausted menu case through a menu-model regression rather than live AppKit automation. (AGENTS.md:1, ca948292c164)
  • Current main baseline: Current main computes weekly pace linearly from elapsed wall-clock duration and has no workDays parameter in UsagePace.weekly, so the branch still contains meaningful unique behavior not implemented on main. (Sources/CodexBarCore/UsagePace.swift:40, ca948292c164)
  • Core pace implementation on PR head: The PR head adds optional workDays and calendar inputs, computes workday progress for standard 10080-minute weekly windows, and maps work-time runout back to wall-clock ETA. (Sources/CodexBarCore/UsagePace.swift:40, 1a60cb5ac26e)
  • Settings and display path on PR head: UsageStore.weeklyPace reads settings.weeklyProgressWorkDays for fallback weekly pace while keeping historical Codex pace first, and menu fallback display now preserves exhausted etaSeconds == 0 before early-window suppression. (Sources/CodexBar/UsageStore+HistoricalPace.swift:9, 1a60cb5ac26e)
  • Prior review finding covered: The added menu-model regression constructs a depleted Codex weekly window before the first configured workday and expects the visible detail text 100% in deficit / Runs out now. (Tests/CodexBarTests/MenuCardWorkdayPaceTests.swift:75, 1a60cb5ac26e)
  • Compatibility decision and final state: GitHub reports head 1a60cb5a is mergeable/clean and not draft with macOS, Linux x64, Linux arm64, and GitGuardian checks successful; owner comments explicitly accept unified semantics and recommend landing with the documented tradeoff. (1a60cb5ac26e)

Likely related people:

  • steipete: Peter owns the current PR, appears in current-main blame for the pace/store helper snapshot, and explicitly accepted the unified work-day semantics in the PR discussion. (role: recent area contributor and product-decision owner; confidence: high; commits: 7717813b9eed, 1a60cb5ac26e; files: Sources/CodexBarCore/UsagePace.swift, Sources/CodexBar/UsageStore+HistoricalPace.swift, Sources/CodexBar/MenuCardView+ModelHelpers.swift)
  • pstanton237: The branch preserves pstanton237's original commits that introduced workday-aware pace semantics and fixed day-boundary handling before owner follow-up commits. (role: original proposed-change contributor; confidence: high; commits: 6980ceaa58b8, 23b96662c343, dc41a444f3b9; files: Sources/CodexBarCore/UsagePace.swift, Tests/CodexBarTests/UsagePaceTests.swift)
  • Yuxin-Qiao: Commit e9b7e25f added the existing weekly work-day segmentation setting and marker plumbing that this PR now reuses for pace calculations. (role: introduced work-day marker setting; confidence: high; commits: e9b7e25f851b; files: Sources/CodexBar/PreferencesDisplayPane.swift, Sources/CodexBar/MenuCardQuotaWarningMarkers.swift, Sources/CodexBar/SettingsStore+Defaults.swift)
  • John Larkin: Commit 5cf2ea40 added session pace indicators and touched the menu pace helper/tests adjacent to this PR's fallback pace display changes. (role: pace indicator surface contributor; confidence: medium; commits: 5cf2ea404ae5; files: Sources/CodexBar/MenuCardView+ModelHelpers.swift, Tests/CodexBarTests/UsagePaceTests.swift)
  • Tristan Manchester: Commit a2973265 introduced the historical pace/backfill path that this PR intentionally keeps authoritative over the new workday fallback model. (role: historical pace contributor; confidence: medium; commits: a2973265477e; files: Sources/CodexBar/UsageStore+HistoricalPace.swift, Sources/CodexBar/HistoricalUsagePace.swift, Tests/CodexBarTests/HistoricalUsagePaceTests.swift)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

@clawsweeper clawsweeper Bot added the rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. label Jun 11, 2026
@steipete
steipete force-pushed the feat/workday-aware-pace-maintainer branch 2 times, most recently from 795bfac to 22903e3 Compare June 12, 2026 09:08
@steipete

Copy link
Copy Markdown
Owner Author

Rebased onto current main (8e50e885) and resolved the stale switcher changelog conflict. Exact head: 22903e3f.

Autoreview caught and this head fixes one edge case: a fully depleted quota after the final configured workday now remains exhausted instead of reporting that it lasts through the weekend.

Proof:

  • pace/history focused suite: 58 tests passed
  • added exhausted-weekend regression
  • make check: passed
  • exact-head autoreview: clean, confidence 0.84

Fresh CI is running. Keeping this draft/unmerged for product review of the workday pacing semantics.

@steipete
steipete force-pushed the feat/workday-aware-pace-maintainer branch from 22903e3 to c994ca7 Compare June 12, 2026 10:11
@steipete

Copy link
Copy Markdown
Owner Author

Rebased onto current main (3fdb549a), which includes the deterministic StatusMenuPersistentRefreshTests fix that was the only failure on the previous head.

Exact head: c994ca7d.

Proof:

  • swift test --filter UsagePace: 70 tests passed.
  • make check: clean.
  • exact-head autoreview: clean, 0.83 confidence.

Fresh CI is running. Keeping this draft and unmerged for the existing product decision on changing the semantics of the persisted work-day setting.

@steipete
steipete force-pushed the feat/workday-aware-pace-maintainer branch 2 times, most recently from b695eb5 to 999b083 Compare June 12, 2026 14:00
@clawsweeper clawsweeper Bot added rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. P3 Low-risk cleanup, docs, polish, ergonomics, or speculative feature. merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. and removed rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. labels Jun 12, 2026
@steipete

Copy link
Copy Markdown
Owner Author

Prepared on exact head 999b083de9ba722196b3b1cf4860bcd702b1edb5.

Proof:

  • Rebased onto current main at preparation time.
  • Focused pace suites: 68 tests across 4 suites passed.
  • make check
  • Codex autoreview: no accepted/actionable findings.
  • GitHub CI: both macOS runs, both Linux x64 runs, both Linux ARM64 runs, and GitGuardian passed. The first Linux x64 attempt hit an unrelated Text file busy PTY-test flake; rerun passed.

Not merging autonomously: interpreting configured work days as quota-consumption pace changes user-facing product semantics.

@steipete
steipete force-pushed the feat/workday-aware-pace-maintainer branch from 999b083 to 19a120a Compare June 13, 2026 09:47
@steipete

Copy link
Copy Markdown
Owner Author

Prepared on exact head 19a120a90aeee52b37a82d4ad46cf270a711effd.

Proof:

  • focused pace tests passed, including the pre-first-workday and exhausted-weekend regressions
  • make check passed
  • Codex autoreview reported no accepted/actionable findings
  • GitHub CI is fully green: macOS, Linux x64, Linux ARM64, and GitGuardian

Keeping this draft and unmerged. The remaining question is product/upgrade semantics: whether the existing persisted work-day display preference should also control quota pace and ETA.

@steipete
steipete force-pushed the feat/workday-aware-pace-maintainer branch from 19a120a to 3e83eb4 Compare June 13, 2026 15:49
@steipete

Copy link
Copy Markdown
Owner Author

Rebased onto current main at 1d39e0ca9ec4b53685d6a7c4720df3d9945d68e7.

Exact head: 3e83eb4c.

Proof:

  • swift test --filter UsagePace: 71 tests in 3 suites passed.
  • make check: SwiftFormat clean; SwiftLint 0 violations.
  • exact-head Codex autoreview: no accepted/actionable findings, 0.82 confidence.

Fresh CI is running. Keeping this draft and unmerged for the existing product/upgrade decision: whether the persisted work-day display preference should also control quota pace and ETA.

@steipete

Copy link
Copy Markdown
Owner Author

Exact candidate: 166dc07327cc1216abf7633b8946b9aaa82f42af.

Maintainer decision: accept unified semantics. Existing persisted work-day values intentionally control both weekly markers and fallback pace/ETA. The PR body, localized UI copy, changelog, focused regressions, and built-app proof now state and cover that behavior.

@codex review
@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 13, 2026

Copy link
Copy Markdown

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

pstanton237 and others added 8 commits June 13, 2026 19:02
The existing weeklyProgressWorkDays setting only affected visual markers
on the progress bar. This change threads the work-days value into
UsagePace.weekly() so that the expected usage curve distributes 100%
across configured work days only. Non-work days contribute zero expected
usage, producing a flat curve on weekends.

Users who work Mon-Fri and consume 100% by Friday now see "on pace"
instead of a misleading ~29% deficit from the 7-day linear model.

Fixes #1356
Address Codex bot review feedback: when the weekly reset time is not at
midnight, the previous 24-hour-slice approach could misclassify hours
near day boundaries. Now uses calendar.startOfDay to split intervals at
local midnight, ensuring each slice is classified by its actual calendar
weekday regardless of reset time offset.
Align the valid workDays range (>= 2) with the UI picker (Off/4/5/7)
and marker path (2...7) to prevent inconsistent behavior from stale
or manual values.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 166dc07327

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread Sources/CodexBar/MenuCardView+ModelHelpers.swift Outdated
@clawsweeper clawsweeper Bot added rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Jun 13, 2026
@steipete
steipete force-pushed the feat/workday-aware-pace-maintainer branch from 166dc07 to 1527044 Compare June 13, 2026 18:11
@steipete

Copy link
Copy Markdown
Owner Author

Exact candidate: 15270444a37b3af1b80f4010653fb76c2a9899f8.

Maintainer decision: accept unified semantics. Existing persisted work-day values intentionally control both weekly markers and fallback pace/ETA. The PR body, localized UI copy, changelog, focused regressions, and built-app proof now state and cover that behavior.

@codex review
@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 13, 2026

Copy link
Copy Markdown

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Bravo.

Reviewed commit: 15270444a3

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@clawsweeper clawsweeper Bot added rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. and removed rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Jun 13, 2026

Copy link
Copy Markdown
Owner Author

Exact candidate: 1a60cb5ac26e81153ad00eb12487fc7ac0b13041.

The depleted pre-first-workday menu finding is fixed and covered by a focused visible menu-model regression. Exact-head focused/full tests, lint, build, package/signature, built-app settings persistence, autoreview, and the Public Model Identifier Gate all pass.

@codex review
@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 13, 2026

Copy link
Copy Markdown

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Nice work!

Reviewed commit: 1a60cb5ac2

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@clawsweeper clawsweeper Bot added proof: sufficient Contributor real behavior proof is sufficient. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Jun 13, 2026
@steipete
steipete marked this pull request as ready for review June 13, 2026 19:21

Copy link
Copy Markdown
Owner Author

Decision-ready on exact head 1a60cb5ac26e81153ad00eb12487fc7ac0b13041.

  • CI: macOS lint/build/test, Linux x64, Linux arm64, and GitGuardian are green.
  • Reviews: exact-head Codex review is clean; ClawSweeper reports sufficient proof and no contributor-facing repair; all inline review threads are resolved.
  • Local proof: focused 134 tests across 7 suites; Auckland timezone stress 65 tests across 3 suites; all 427 suites; lint, build, package, and signature checks passed.
  • Built app: Off, 4-day, and 5-day selection plus restart persistence verified; the prior preference was restored. The available account had no weekly event, so the exhausted menu path is covered by the focused visible menu-model regression.
  • Public Model Identifier Gate: PASS.

Recommendation: land. Tradeoff: existing persisted 4-day or 5-day marker values now intentionally control fallback weekly pace and ETA, as documented.

@steipete
steipete merged commit 2f92ee9 into main Jun 13, 2026
4 checks passed
@steipete
steipete deleted the feat/workday-aware-pace-maintainer branch June 13, 2026 22:31
@steipete

Copy link
Copy Markdown
Owner Author

Landed as 2f92ee97e46edb9d47ee4d2b96d53577f9e1fb21.

Verification on the exact merged head:

  • GitHub CI passed: lint-build-test, Linux x64, Linux arm64, and GitGuardian.
  • Focused pace/menu/history/localization validation: 134 tests across 7 suites passed.
  • Timezone stress under Pacific/Auckland: 65 tests across 3 suites passed.
  • Full deterministic test inventory: all 427 suites passed.
  • make check and swift build passed.
  • Exact-head autoreview reported no accepted/actionable findings.
  • Ad-hoc packaged app passed strict deep codesign verification.
  • Built-app settings proof covered Off, 4-day, and 5-day selections plus restart persistence; prior settings were restored.
  • The exhausted visible menu path was covered by the focused menu-model regression because the available live account had no weekly rate-limit event.

Verification images were not applicable beyond the built-app settings proof already attached in the PR discussion.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. P3 Low-risk cleanup, docs, polish, ergonomics, or speculative feature. proof: sufficient Contributor real behavior proof is sufficient. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: factor weeklyProgressWorkDays into pace calculation

2 participants