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
Decision needed
The export-job API contract family in
packages/spec/src/api/export.zod.ts(the file's own comment calls itExportJobApiContracts:ExportJob…,ScheduledExport,ScheduleExportRequestand the request / response bodies ofPOST /api/v1/data/export/…) declares an API that nothing on the platform serves: rest-server has no/api/v1/data/exportroute,IExportService(contracts/export-service.ts:15) records "no evidenced provider binding", and no package, example, app or skill outsidepackages/specnames 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.scheduleandScheduleExportRequest.scheduleare now REQUIRED objects whose only key is an optionaltimezone(defaulting toUTC): a schedule block with no schedule.ScheduleState(automation/execution.zod.ts, same ruling, same PR) keepstimezone,statusandnextRunAt, 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
IExportService/ScheduleExportInput) leave the public surface:RETIRED_DEFS_BY_MAJOR[18]rows, one D3 semantic entry, refusal pins, theapi-surface/andjson-schema.manifest/ratchets move, generated reference pages regenerate**BREAKING**minoron@objectstack/spec(launch-window convention); zero measured in-repo consumers (control below), out-of-repo NOT MEASURED; objectui at the pinned.objectui-shamust be grepped before landing (Post-Task Checklist step 4)scheduleblocks stayIExportService, withJob.schedule.expressionas the cadenceDev-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)git grep -l -P '\b(ScheduledExport|ScheduleExportRequest|ExportJob|ExportJobApiContracts)(Schema)?\b' -- packages examples apps skills ':!packages/spec/**'→ 1 file, and it is two comment lines in the D7 expression-conformance ledger (packages/qa/dogfood/test/expression-conformance.ledger.ts:384-385) recording the spec: retire the seven cron-typed positions nothing reads — export schedules,ScheduleState.cronExpression,DataSyncConfig.schedule,CacheWarmup.schedule, backup/DR schedules — under ADR-0049 (#15954 ruling, option A per family) #16320 retirement. Control:\bConnector(Schema)?\bon the same roots = 43 files.git grep -c 'data/export' -- packages/rest/src→ 0 files. Control:api/v1/reportsinrest-server.tslights.contracts/export-service.ts:15— "IExportServicehas no evidenced provider binding".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