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).
Ruled: maintainer 「A. 退役」 and 「你直接派发处理这个退役任务。」 · chat with session
session_013RWUA7bNq5bRhehLPqXwMg, 2026-09-25Provenance
session_013RWUA7bNq5bRhehLPqXwMg, 2026-09-25. It came out of the duplicate-endpoint sweep that followed objectstack#19543 door ④.Two different things share the word "report"
reportmetadata kind (stays)object_name+query_json{filter, fields, orderBy, limit, groupBy}), plus a renderformat(csv / json / html_table) and an owner*.report.ts, e.g.examples/app-todo/src/reports/task.report.ts), Studio, runtime createPOST /api/v1/reportsReportView,ReportPreview, sidebar, command palette, app navIReportService.run()(CSV / email digest) andsys_report_scheduletask.report.tsrecords 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/mainof all three repos, 2026-09-25)saveReport/scheduleReport/unscheduleReportare called only by the REST routes inpackages/rest/src/rest-server.ts. Nothing else inpackages/**(tests aside) callsIReportService./reports,client.reports.*,sys_saved_reportorsys_report_schedule(the only hit is a type-comment inpackages/types/src/spec-report.ts).@objectstack/plugin-reports.packages/objectos-runtime/src/capability-coverage.test.tsrecords['reports', 'no @objectstack/plugin-reports dependency exists in this repo — nothing could mount it'].requires: ['reports']in objectstackexamples/**or cloudapps/**.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.jsonmentions, andscripts/*baseline*.json/scripts/test-shard-timings.jsonrows.packages/platform-objects/src/audit/sys-saved-report.object.tsandsys-report-schedule.object.ts: their exports inaudit/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/reportsfamily (list, get, save, delete, run, run ad-hoc, schedules). Also itspackages/rest/src/rest-route-ledger.tsrows.packages/client/src/index.ts: thereportsnamespace (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: thereportscapability (enum entry and thereports: { package: '@objectstack/plugin-reports', … }row). A manifest that still declaresrequires: ['reports']must be refused loudly with a prescription (ADR-0087 migration entry), ⛔ not silently accepted.packages/cli/src/commands/serve.ts: the@objectstack/plugin-reportsmount entry and'reports'inNEEDS_JOB_OR_QUEUE. Alsopackages/cli/package.json,packages/core/src/fallbacks/index.ts(the comment namingsys_report_schedule) andpackages/lint/src/validate-sortable-fields.ts(the comment namingsys_saved_report), where they still reason about the retired objects.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
reportmetadata kind (ReportSchema,/meta/report,defineReport), datasets and the analytics service: unchanged.reportmetadata is not built here. If a real need appears, it is a new card on the metadata kind.packages/objectos-runtime/src/capability-coverage.test.tscarries areportsrow that must go once a@objectstack/specrelease without the capability is installed there.@objectstack/plugin-reportson 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.requires: ['reports']is refused at parse or validate with a message naming the retirement and the replacement (reportmetadata / ListView)./api/v1/reportspaths answer the platform's standard 404 for an unmounted route. A pin asserts it.sys_saved_report/sys_report_scheduletables 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-retirementskill).