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_secondsis session elapsed time. splits[]are required and represent meaningful work segments.- Each split has its own active
duration_seconds. rest_seconds_afteris 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_secondsfor full session elapsed time. - Use split
duration_secondsfor active work only. - Use
rest_seconds_afteronly 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.
