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

vercelBot commented Jul 11, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
specReadyReadyPreview, CommentJul 11, 2026 8:47am

Request Review

@github-actionsgithub-actionsBot 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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationprotocol:datasize/xlteststooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@os-zhuang@claude