Skip to content

[Decision] the export-job API contract family (ScheduledExport / ScheduleExportRequest / ExportJob…) has zero consumers and, after #16320, an empty schedule block — retire the family, keep the contract, or build the scheduler? #17158

Description

@os-bill

Decision needed

The export-job API contract family in packages/spec/src/api/export.zod.ts (the file's own comment calls it ExportJobApiContracts: ExportJob…, ScheduledExport, ScheduleExportRequest and the request / response bodies of POST /api/v1/data/export/…) declares an API that nothing on the platform serves: rest-server has no /api/v1/data/export route, IExportService (contracts/export-service.ts:15) records "no evidenced provider binding", and no package, example, app or skill outside packages/spec names any of the family's schemas or types.

#16320 (PR #17146) retired the family's two cron positions (ScheduledExport.schedule.cronExpression, ScheduleExportRequest.schedule.cronExpression) under the #15954 ruling. That ruling retires POSITIONS, not defs, so the PR left the blocks — and the tree it leaves makes the family-level question visible:

  • ScheduledExport.schedule and ScheduleExportRequest.schedule are now REQUIRED objects whose only key is an optional timezone (defaulting to UTC): a schedule block with no schedule.
  • ScheduleState (automation/execution.zod.ts, same ruling, same PR) keeps timezone, status and nextRunAt, which describe a cadence the row no longer declares.

Whether to retire the family is a maintainer decision — ADR-0049 enforce-or-remove applied to a def family rather than a key — and the contract review on #17146 asked for it to be filed as a decision, not decided by a dev seat. Nothing here is decided; the dev-seat reading at the end is non-binding.

Options

option what it means cost / risk
A. Retire the family the export-job contracts (and IExportService / ScheduleExportInput) leave the public surface: RETIRED_DEFS_BY_MAJOR[18] rows, one D3 semantic entry, refusal pins, the api-surface/ and json-schema.manifest/ ratchets move, generated reference pages regenerate a **BREAKING** minor on @objectstack/spec (launch-window convention); zero measured in-repo consumers (control below), out-of-repo NOT MEASURED; objectui at the pinned .objectui-sha must be grepped before landing (Post-Task Checklist step 4)
B. Keep the contract, declared-but-unserved no change; the family stays a declared API with no server and the empty schedule blocks stay the ADR-0049 posture this repo has been retiring elsewhere (declared ≠ enforced); the reference page keeps advertising an export scheduler that does not exist
C. Build the export scheduler a rest-server route family plus a provider for IExportService, with Job.schedule.expression as the cadence the largest cost; #15954 rejected "build the schedulers" (its option D) for the cron positions — the family-level question was not put to the maintainer there

Dev-seat reading, non-binding: A is consistent with the rulings that already retired the positions; B is the status quo; C contradicts the #15954 direction unless an export scheduler is wanted on a roadmap.

Evidence (every zero beside a lit control; #17146 branch at 90377d224)

Filed from #16320 (PR #17146) as the boundary flag its contract review asked to become a decision card; not in that card's scope.


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions