Backlog

Iteration +1

  • Refactor data model: Schedule vs. Payload vs. Metadata

    • Static metadata (optional): Authors, Created/Updated-Timestamps

    • Job: Task + Runtime metadata: Start time, end time, duration, job source, job definition

  • Use regular logging instead of icecream

  • Launch tasks using arbitrary Python files or command-line targets, also using uv and docker. Hint: It’s not the payload per se, but it’s about the dependencies!

  • Improve CLI By default, pass command to sh -c or --exec otherwise. From there, gradually add more levels of isolation/externalization, to go beyond the in-process task scheduling provided by APScheduler Core.

    • supertask list-namespaces

    • supertask list-jobs --ns=e1cd9e64e25c8bdbec85ca242b1fcb32

    • supertask run

    • supertask run --file timetable.yaml (make supertask.yaml the default)

    • supertask run --file taskfile.py [--when=]

    • supertask run --command echo "hello" [--when=once]

    • supertask run --command python:print("hello") [--when=once]

    • supertask run [--when=once] -- python:print("hello")

    • supertask run [--when=@daily] -- cmd:echo "hello"

  • Micro-bookkeeping about namespaces, including metadata about origin (author, source, etc.), to identify individual items amongst an enumeration of many.

  • Documentation:

    Jobs can be any Java class that implements the simple Job interface, leaving infinite possibilities for the work your Jobs can perform. – https://github.com/quartz-scheduler/quartz/blob/main/docs/introduction.adoc

  • Release v0.0.1

Iteration +2

Iteration +3

Done

  • Config: Obtain HTTP listen address

  • Config: Obtain path/URL to seed file per CLI argument --seed=cronjobs.json

  • Config: Obtain job store schema- and table names alongside database address

  • Format code

  • Are short-interval jobs possible? Yes, down to seconds-granularity.

  • Data model: Introduce namespace as multi-tenant identifier entity, and to spawn as many ephemeral / ad hoc timetable schedules as there is demand, by making it cheap by design, like Kotori is doing it for DAQ channels. When no namespace is supplied, per task file, --ns option, or otherwise, generate an ephemeral namespace identifier by using digest(f"{hostname}-{user}-{resource}"), which qualifies the job’s source uniquely even when invoked in multiple instances.