WorkCapacity
Power Oracle Docs

Compute Model

The session-first, split-aware compute model and the operational rules for deciding splits.

Power Oracle uses a session-first, split-aware compute model.

Core Semantics

  • Top-level duration_seconds is session elapsed time.
  • splits[] are required and represent meaningful work segments.
  • Each split has its own active duration_seconds.
  • rest_seconds_after is optional and captures recovery after a split.

This keeps interval workouts from collapsing into one misleading average.

Why Splits Matter

Splits are first-class because denominator semantics matter. If a client flattens a whole session into one number, the system loses the difference between active work, rest, transitions, and local changes in output.

With splits preserved, Power Oracle can show:

  • session output versus local output
  • stable pacing versus fade
  • isolated movement timing versus grouped movement timing
  • active work versus recovery

Denominator Rules

Two rules matter most:

  • Session average power uses full session elapsed time.
  • Split average power uses split active time only.

That distinction is the reason the API can describe both whole-session output and within-session structure without inventing timing that was never supplied.

Time Accounting

  • Session elapsed time is the full top-level duration_seconds.
  • Split active time is the split-level duration_seconds.
  • Recovery is rest_seconds_after.
  • Any gap between accounted time and session elapsed time is returned as unattributed_duration_seconds.

This makes incomplete timing explicit instead of silently burying it in the denominator.

How To Decide Splits

  • Separate by movement chunk when timing is distinct and you know where one chunk ends and the next begins.
  • Separate by interval or round when pacing meaning matters.
  • Do not invent timing the user does not know.
  • If the user only knows one workout-level time, use one split with that duration as active work.
  • That workout-level time does not define completed rounds or reps. Ask for completed volume if it is still missing.
  • Use top-level duration_seconds for full session elapsed time.
  • Use split duration_seconds for active work only.
  • Use rest_seconds_after only when recovery timing is known.
  • When repeated rounds lack split timing, preserve movement order inside the grouped split.

Common Split Patterns

Couplet

Use one split per round if you only know round timing, or separate movement chunks if you know them distinctly.

Triplet

Treat each round as one grouped split unless you truly know per-movement timings.

EMOM

Use one split per minute or one split per work segment, depending on what timing you actually know. Keep the minute structure explicit.

Interval Row, Run, or Bike

Use one split per interval. Put the work time in split duration_seconds and the recovery in rest_seconds_after when known.

Strength Piece With Rest

Use one split per set. The lift happens in split active time and the between-set rest goes into rest_seconds_after.

Avoid these mistakes: do not flatten a whole session into one denominator when pacing or rest matters. Do not invent per-movement timings inside grouped work. Do not confuse split active time with session elapsed time.

Movement Rollups And Timing

Movement rollups preserve totals across the session, but they only report movement-specific power when timing is directly attributable from isolated splits. If a split groups multiple movements together, the API keeps the totals but does not pretend it knows per-movement timing inside that group.

Why The Model Is Useful

Most workout tools track proxies such as scores, rounds, or finish times.

Power Oracle is designed to preserve the measurement object itself: work over time, with enough structure for software to compare like with like.