Command reference
oko work forecast
Answers when the open work ends from the holders' estimates, so the answer does not fall silent when nothing moved, and when each release of the waiting graph unblocks.
Invocation#
oko work forecast [--all] [--json]Inputs and options#
- The pool is the build-first defects; --all forecasts every open defect.
- An item a live session holds and estimated counts its estimate, corrected by how far that session's estimates missed on closed items (the median of actual over estimated minutes), else its model's, else every estimator's, less the time since it was taken. An item held without an estimate counts the median of what the repairs the register timed from assignment to repair took beyond the time its live holder has had it, counting only the timed repairs that lasted longer than that; an item held by a session that no longer runs, or by nobody, counts the median timed repair.
- Every live executor of `oko sessions agents` is one queue; the items its live holder took stay in that holder's queue, worked in the order they were taken, oldest take first, whatever order the register lists them in; the rest go, longest first, to the queue that ends soonest. The end is the queue that ends last, and each item's finish is when its queue reaches it.
Output and state effect#
- Prints {hours, why, endsAt, floor, parallelism, queues: [{session, model, added, minutes, items: [{id, minutes, source, finishesInMinutes}]}], unestimated: [{id, product, holder, live, takenAt}], overdue, unforecast, repairNormSeconds, calibration: {outcomes, sessions, models, all, malformedEstimates}, pool, remaining, at, sessionsUnread, releases}. Each item's source says which estimate and correction it stood on.
- An item past its corrected estimate is listed under overdue and adds nothing more; the end is then a floor (`floor: true`, printed as `no sooner than`).
- releases: {forecast: [{release, unblocked, hours, endsAt, unforecast}]} for every release node of `oko blockers graph`: when everything it waits on, directly or through others, has finished, an item never before what it waits on. A release waiting on a task, an item named only in a blocker's words, a defect outside the pool, a refusal that waits on nothing or a loop of waits is not forecast and names each. A graph that cannot be read leaves {refused: …} and the rest stands.
- Text output prints the end, one TAKEN WITHOUT ESTIMATE line per take with none, OVERDUE and UNFORECAST lines, one ESTIMATE LEFT OUT line per estimate note that does not read as one, and one line per release. `oko work progress` carries the same forecast as timeLeft.estimates and answers timeLeft from it, with `source: estimates`, when nothing moved in its window. Oko Desktop → Blockers → Forecast shows the same answer through the native API (`blockers` domain, `work_forecast`), its ESTIMATE LEFT OUT lines among the overdue and unforecast items.
Refusals and safe exits#
- No end is forecast, with why: “no live executor runs and no live session holds an item, so nothing works the pool down”, or “<n> item(s) have no minutes left the register can give, each named with why under unforecast; their holders estimate them with `oko defects estimate`”, where each unforecast item says “no repair in the register was ever timed from its assignment” or “it has been held <m> min, longer than every repair the register timed (<n> of them)”.
- An unreadable defect register refuses with its path. An estimate note that does not read as one refuses nothing: it is left out of the calibration and named, with its defect, the note and what is wrong with it, under calibration.malformedEstimates.