Choose when a report runs prototype

Table of Contents

Item Where
Prototype the prototype
Gemini review none
Group Reporting prototypes

1. Summary

This prototype argues where scheduling lives: on the report, in a schedule list, or on a calendar. It carries three structural variants switched with ?variant, and it answers to Choose when a report runs.

It is throwaway. It reads no service, and the page says plainly which parts of a scheduler it cannot show.

2. Detail

2.1. The question

A schedule is one field on a report definition, but "what runs tomorrow morning" is a question about the whole set. Those two readings want different screens, and the open question is which one earns the space.

2.2. The three variants

Switch with the bottom bar, or with ?variant.

Variant Name The structural argument
A On the report Scheduling is a field group on the report: a cadence and a time, edited in place, with the next fire times under it.
B A schedule list One row per schedule, scanned and edited together, so the whole week is answerable in one view.
C A calendar A weekly grid of when reports fire, each report in its slots, so clashes and quiet nights are visible before they happen.

All three carry the same four actions beside a schedule, and none of them folds one action into another.

2.3. The four actions are four

Run now starts one run at once and changes no schedule: it sends reporting.v1.ops.trigger_report_instance. Pause keeps the schedule and stops it firing. Play starts it firing again on the same expression. Unschedule removes the schedule, so the definition becomes on demand: it sends reporting.v1.ops.unschedule_report_definitions.

Pause and Unschedule are the pair people confuse, so the page says what separates them. A paused schedule keeps its expression and its scheduler job, and firing starts again after Play. An unscheduled definition keeps neither, so there is nothing to resume. Pause and Play have no operation. The scheduler job carries is_active in ores_scheduler_job_definitions_tbl, so the data can express a paused schedule and nothing exposes it to a reporting screen. The paused row the page draws, and the Pause and Play buttons, are a fixture, and the amber note says so.

2.4. What the page refuses to invent

Three operations exist: reporting.v1.ops.trigger_report_instance, reporting.v1.ops.schedule_report_definitions and reporting.v1.ops.unschedule_report_definitions, and a definition carries a schedule expression. There is no pause or play operation, no read or write of a scheduler job from this screen, and no time zone on the schedule. The calendar variant shows an installation clock and says the times are derived from the expression, and the note says a built screen could not show a job's state, its last firing or its next due time. A scheduler dashboard drawn as though the server served it would be a lie a reviewer could not see.

2.5. What a schedule does and does not reach

A schedule sets when the run starts. It does not change the report's inputs, its portfolio or its outputs. Run now starts one run and leaves the schedule alone. Pause stops the firing and keeps the schedule, and Unschedule removes it. None of the four touches a run already produced or cancels a run in flight. Only a tenant administrator may schedule, and only for reports their own party owns; every other role reads the cadence and nothing more. The page states the party constraint rather than hiding it behind a disabled button.

2.6. What is fake

The cadences, the next fire times, the reports and the paused schedule are mock. Nothing reads a server, and the application has no reporting UI today. Pause and Play have no operation, so the paused row and those two buttons are a fixture. The next fire times are computed from the expression in the page, which is what a person is actually judging when they set a cadence.

2.7. Where the code lives

doc/prototypes/reporting/choose-when-a-report-runs/. Three files, plain HTML, CSS and JavaScript, no framework and no build step.

2.8. The verdict

None yet. This page is on the branch that proposes it and waits for review.

2.9. What it does not settle

The time zone, which the schedule does not carry at all. Until it does, a calendar that draws a local week is drawing a promise the server cannot keep.

3. See also

Emacs 29.3 (Org mode 9.6.15)