Skip to content

retire the saved-report stack — sys_saved_report / sys_report_schedule, /api/v1/reports, client.reports, IReportService, the reports capability and @objectstack/plugin-reports (zero consumers; not the report metadata kind) #20102

Description

@objectstack-fleet

Ruled: maintainer 「A. 退役」 and 「你直接派发处理这个退役任务。」 · chat with session session_013RWUA7bNq5bRhehLPqXwMg, 2026-09-25

Provenance

  • Who: the maintainer.
  • Where: the maintainer's chat with session session_013RWUA7bNq5bRhehLPqXwMg, 2026-09-25. It came out of the duplicate-endpoint sweep that followed objectstack#19543 door ④.
  • Verbatim: the maintainer asked 「sys_saved_report 和 metadata 中的报表是同一个东西吗」. The session answered that they are different things, and offered A (retire the saved-report stack), B (keep it, renamed) and C (status quo). The maintainer answered 「A. 退役」, then 「你直接派发处理这个退役任务。」.

Two different things share the word "report"

report metadata kind (stays) saved-report stack (retires)
What it is An analytics report bound to a dataset (ADR-0021): rows, columns and values as dimensions and measures; tabular / summary / matrix / joined; chart; drilldown A persisted raw ObjectQL query (object_name + query_json {filter, fields, orderBy, limit, groupBy}), plus a render format (csv / json / html_table) and an owner
Authored by code (*.report.ts, e.g. examples/app-todo/src/reports/task.report.ts), Studio, runtime create only POST /api/v1/reports
Read by objectui ReportView, ReportPreview, sidebar, command palette, app nav IReportService.run() (CSV / email digest) and sys_report_schedule
Consumers many none (below)

task.report.ts records that ADR-0021 removed the report kind's "legacy inline query form", and moved ad-hoc object queries to a ListView lens. The saved-report stack is that same object + raw-query shape, alive in a parallel table under the same name.

Evidence of zero consumers (read on origin/main of all three repos, 2026-09-25)

  • objectstack: saveReport / scheduleReport / unscheduleReport are called only by the REST routes in packages/rest/src/rest-server.ts. Nothing else in packages/** (tests aside) calls IReportService.
  • objectui: no call to /reports, client.reports.*, sys_saved_report or sys_report_schedule (the only hit is a type-comment in packages/types/src/spec-report.ts).
  • cloud: no dependency on @objectstack/plugin-reports. packages/objectos-runtime/src/capability-coverage.test.ts records ['reports', 'no @objectstack/plugin-reports dependency exists in this repo — nothing could mount it'].
  • No app declares requires: ['reports'] in objectstack examples/** or cloud apps/**.

Retire (all of it, immediately — no deprecation window, per the stage posture)

  • packages/plugins/plugin-reports/**: the whole package (reports-plugin.ts, report-service.ts, index.ts), its workspace entry, .changeset/config.json mentions, and scripts/*baseline*.json / scripts/test-shard-timings.json rows.
  • packages/platform-objects/src/audit/sys-saved-report.object.ts and sys-report-schedule.object.ts: their exports in audit/index.ts, the generated translation bundles (regenerate with the repo's generator, ⛔ never by hand), and any object-list pins.
  • packages/rest/src/rest-server.ts: the /api/v1/reports family (list, get, save, delete, run, run ad-hoc, schedules). Also its packages/rest/src/rest-route-ledger.ts rows.
  • packages/client/src/index.ts: the reports namespace (reports.list/get/save/delete/run/listSchedules/schedule/unschedule, whatever exists).
  • packages/spec/src/contracts/report-service.ts (IReportService, SavedReport, ReportSchedule, ReportQuery, SaveReportInput, ScheduleReportInput, ReportRunResult) and its export.
  • packages/spec/src/kernel/platform-capabilities.ts: the reports capability (enum entry and the reports: { package: '@objectstack/plugin-reports', … } row). A manifest that still declares requires: ['reports'] must be refused loudly with a prescription (ADR-0087 migration entry), ⛔ not silently accepted.
  • packages/cli/src/commands/serve.ts: the @objectstack/plugin-reports mount entry and 'reports' in NEEDS_JOB_OR_QUEUE. Also packages/cli/package.json, packages/core/src/fallbacks/index.ts (the comment naming sys_report_schedule) and packages/lint/src/validate-sortable-fields.ts (the comment naming sys_saved_report), where they still reason about the retired objects.
  • Docs: content/docs/api/client-sdk.mdx, content/docs/plugins/packages.mdx, content/docs/permissions/system-context.mdx, content/docs/protocol/objectql/query-syntax.mdx, content/docs/ui/apps.mdx, and wherever else the saved-report API or plugin is described. ⛔ content/docs/releases/ is never edited in a code PR.
  • docs/qa/platform-checklist/areas/dashboards.json: items that exercise the saved-report API.

Out of scope

  • ⛔ The report metadata kind (ReportSchema, /meta/report, defineReport), datasets and the analytics service: unchanged.
  • ⛔ Scheduled delivery for report metadata is not built here. If a real need appears, it is a new card on the metadata kind.
  • Cross-repo follow-up, filed by the PM, not the dev: cloud packages/objectos-runtime/src/capability-coverage.test.ts carries a reports row that must go once a @objectstack/spec release without the capability is installed there.
  • Release-time act, not the dev's: deprecating the published @objectstack/plugin-reports on npm is a maintainer release action (AGENTS.md is authoritative).

Acceptance

  • git grep -n "plugin-reports\|sys_saved_report\|sys_report_schedule\|IReportService\|/api/v1/reports" on the PR head has no live hits outside CHANGELOGs, migration entries and the retirement tests. Each remaining hit is listed in the PR body with its reason.
  • A manifest declaring requires: ['reports'] is refused at parse or validate with a message naming the retirement and the replacement (report metadata / ListView).
  • The /api/v1/reports paths answer the platform's standard 404 for an unmounted route. A pin asserts it.
  • Physical tables: the PR body states what happens to an existing deployment's sys_saved_report / sys_report_schedule tables under the repo's convention for a retired system object, and cites that convention.
  • Clause-②: yes: this narrows the public surface. The PR carries the ADR-0087 entries and a **BREAKING** changeset, per the retirement playbook (spec-property-retirement skill).

Activity

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions