Skip to content

feat(lifecycle): ADR-0057 follow-ups — retire per-plugin sweepers, dev telemetry datasource + db:clean, Studio lifecycle form (#2834)#2835

Merged
os-zhuang merged 5 commits into
mainfrom
claude/adr-0057-data-lifecycle-azuf45
Jul 11, 2026
Merged

feat(lifecycle): ADR-0057 follow-ups — retire per-plugin sweepers, dev telemetry datasource + db:clean, Studio lifecycle form (#2834)#2835
os-zhuang merged 5 commits into
mainfrom
claude/adr-0057-data-lifecycle-azuf45

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Implements items ①–③ of the ADR-0057 follow-up tracking issue #2834 (④ PG-partition rotation is evaluated + design-sketched on the issue, deferred until CI has a PostgreSQL service — no unverified DDL ships).

① Retire the per-plugin retention sweepers

service-job's JobRunRetention and service-messaging's NotificationRetention (plus their retentionDays/retentionSweepMs options, timers, exports, and tests) are removed — the LifecycleService enforces the same windows from the lifecycle declarations (sys_job_run 30d, notification pipeline 90d), and a window tuned via lifecycle.retention_overrides would otherwise leave the old sweepers enforcing a stale bound. BREAKING, ships as minor per the launch-window convention; migration is the settings namespace.

Includes a real fix found during the retirement: #2791 declared a blanket 30d lifecycle retention on sys_automation_run — but that table interleaves live SUSPENDED runs (an approval may legitimately stay paused for months) with terminal history, so a blanket age reap could strand in-flight approvals. The declaration is removed; bounding stays with the automation store's specialized terminal-only sweep (#2585), which is deliberately NOT retired (the declarative contract has no status predicate yet). launch-readiness.md P1-2 annotated as superseded.

② Dev telemetry datasource + os db clean

  • objectstack dev with a file-backed SQLite primary now provisions <primary>.telemetry.<ext> and registers it as the telemetry datasource — the engine routes every telemetry/event/audit-classed object there, so platform data stops sharing the business dev DB. OS_TELEMETRY_DB=0 opts out; OS_TELEMETRY_DB=<path> opts in anywhere (incl. serve — production stays opt-in by design). Best-effort: a failed provision never blocks boot.
  • New os db clean (ADR §3.4): sets auto_vacuum=INCREMENTAL then runs the one-time VACUUM legacy files need to adopt it, on the primary + telemetry sibling, reporting reclaimed bytes. Smoke-verified end-to-end: a 48.9 MB deleted-rows probe file compacted to 0.01 MB and read back auto_vacuum=2.

③ Studio surface + i18n

object.form.ts gains the lifecycle composite (class select + retention/ttl/rotation/archive/reclaim blocks, field-for-field with LifecycleSchema); the four metadata-forms i18n bundles are regenerated (os i18n extract) with hand-curated zh-CN for the 16 new keys. The *.objects.generated.ts bundles are deliberately untouched: regenerating them would delete curated sys_* translations due to a pre-existing extract-config drift — documented on #2834.

Verification

  • 66 turbo build+test tasks green across spec / cli / objectql / driver-sql / service-job / service-messaging / service-automation / platform-objects / dogfood (incl. the full dogfood suite and the ADR-0057 storage-growth gate)
  • New unit tests: resolveTelemetryDbPath matrix (dev default-on, :memory: skip, env opt-out/override, prod opt-in)
  • os db clean functional smoke against a real bloated SQLite file
  • metadata-forms vocabulary tests green after regen

Refs #2834.

🤖 Generated with Claude Code

https://claude.ai/code/session_01BNBzMWmSECrbiEDdVzwBt3


Generated by Claude Code

claude added 4 commits July 11, 2026 08:20
ADR-0057 §6 rejects per-plugin cleanup jobs; with the LifecycleService
enforcing the same windows from the `lifecycle` declarations (sys_job_run
30d, notification pipeline 90d), the plugin-local sweepers were redundant —
and worse, a window tuned via the `lifecycle.retention_overrides` setting
would leave them enforcing a stale bound.

- service-job: JobRunRetention (+ tests, exports, `retentionDays`/
  `retentionSweepMs` options, sweep timer) removed.
- service-messaging: NotificationRetention (+ tests, exports, options,
  sweep timer) removed.
- BREAKING (ships as minor per the launch-window convention): the
  `retentionDays`/`retentionSweepMs` plugin options are gone. Operators who
  tuned them move to the `lifecycle` settings namespace
  (`retention_overrides`, tenant-scoped) — same knob, now runtime- and
  tenant-configurable.

FIX shipped alongside (found during this retirement): #2791 had declared a
blanket `lifecycle: { class: 'telemetry', retention: { maxAge: '30d' } }`
on sys_automation_run — but that table interleaves live SUSPENDED runs
(resumable workflow state; an approval may legitimately stay paused for
months) with terminal history. A blanket age reap would strand in-flight
approvals. The declaration is removed; bounding stays with the automation
store's specialized default-on sweep (terminal statuses only, by age +
per-flow cap — #2585), documented on the object. sys_automation_run's own
sweeper is deliberately NOT retired: the declarative contract has no status
predicate yet.

launch-readiness.md P1-2 annotated as superseded by ADR-0057.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BNBzMWmSECrbiEDdVzwBt3
Telemetry separation goes live for development (ADR-0057 §3.6): when the
primary datasource is a file-backed SQLite, `objectstack dev` now provisions
a sibling `<primary>.telemetry.<ext>` file and registers it as the
`telemetry` datasource — the engine routes every telemetry/event/audit-
classed object there, so platform-generated growth can never again bloat the
business dev.db. Opt out with OS_TELEMETRY_DB=0; opt in anywhere (incl.
`serve`) with OS_TELEMETRY_DB=<path>. Production stays opt-in: a second
file appearing next to a prod database is a topology change an operator
should choose. Best-effort: a failed provision never blocks boot.

New `os db clean` (ADR-0057 §3.4): auto_vacuum only changes the layout of a
FRESH database, so files created before the INCREMENTAL default stay pinned
at their high-water mark until one full VACUUM rebuilds them. The command
sets the pragma, VACUUMs the primary (and its telemetry sibling when
present), and reports reclaimed bytes. Smoke-verified: a 48.9 MB
deleted-rows file compacted to 0.01 MB and read back auto_vacuum=2.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BNBzMWmSECrbiEDdVzwBt3
…#2834 ③)

object.form.ts (metadata-admin form) gains a `lifecycle` composite in the
Advanced section — class selector (record/audit/telemetry/transient/event)
plus the retention / ttl / rotation storage / archive / reclaim sub-blocks,
matching LifecycleSchema field-for-field.

The four metadata-forms i18n bundles are regenerated via `os i18n extract`
(new lifecycle keys; keys of long-retired form fields pruned by the same
run). zh-CN carries hand-curated translations for the 16 new keys; ja-JP /
es-ES keep the standard English fill pending curation. The
*.objects.generated.ts bundles are deliberately NOT regenerated: the
committed ones carry sys_* translations (e.g. sys_audit_log) whose objects
live outside the extract config's import set, so a regen would drop curated
zh-CN content — that pre-existing extract-config drift is noted on #2834
and left for its own fix.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BNBzMWmSECrbiEDdVzwBt3
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BNBzMWmSECrbiEDdVzwBt3
@vercel

vercel Bot commented Jul 11, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
spec Ready Ready Preview, Comment Jul 11, 2026 8:47am

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation protocol:data tests tooling size/xl labels Jul 11, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 5 package(s): @objectstack/cli, @objectstack/platform-objects, @objectstack/driver-sql, packages/services, @objectstack/spec.

105 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/agents.mdx (via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx (via packages/cli, @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/api/data-flow.mdx (via @objectstack/cli)
  • content/docs/api/environment-routing.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/spec)
  • content/docs/automation/approvals.mdx (via packages/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via packages/cli, packages/spec)
  • content/docs/automation/hooks.mdx (via @objectstack/spec)
  • content/docs/automation/index.mdx (via @objectstack/spec)
  • content/docs/automation/webhooks.mdx (via packages/services, @objectstack/spec)
  • content/docs/automation/workflows.mdx (via @objectstack/spec)
  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via packages/spec)
  • content/docs/concepts/north-star.mdx (via packages/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/driver-sql, @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx (via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx (via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx (via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx (via @objectstack/spec)
  • content/docs/data-modeling/index.mdx (via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx (via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx (via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx (via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx (via @objectstack/spec)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/cli.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/glossary.mdx (via @objectstack/driver-sql)
  • content/docs/getting-started/quick-reference.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/getting-started/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx (via packages/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/audit-service.mdx (via packages/services)
  • content/docs/kernel/runtime-services/data-service.mdx (via packages/cli)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/cli, packages/services, packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/settings-service.mdx (via packages/services)
  • content/docs/kernel/runtime-services/sharing-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via packages/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/spec)
  • content/docs/permissions/authentication.mdx (via @objectstack/cli)
  • content/docs/permissions/authorization.mdx (via @objectstack/spec)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/permissions/positions.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/anatomy.mdx (via @objectstack/driver-sql)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/cli, @objectstack/platform-objects, @objectstack/driver-sql, packages/services, @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/i18n-standard.mdx (via packages/services, @objectstack/spec)
  • content/docs/protocol/objectos/index.mdx (via @objectstack/driver-sql)
  • content/docs/protocol/objectos/lifecycle.mdx (via @objectstack/driver-sql, @objectstack/spec)
  • content/docs/protocol/objectos/plugin-spec.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/protocol/objectos/realtime-protocol.mdx (via @objectstack/cli)
  • content/docs/protocol/objectos/runtime-capabilities.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via packages/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via packages/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/releases/implementation-status.mdx (via @objectstack/cli, @objectstack/driver-sql, @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v12.mdx (via @objectstack/spec)
  • content/docs/releases/v13.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/index.mdx (via @objectstack/spec)
  • content/docs/ui/setup-app.mdx (via @objectstack/platform-objects, @objectstack/spec)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

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

Labels

documentation Improvements or additions to documentation protocol:data size/xl tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants