You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 127f091
Browse filesBrowse the repository at this point in the historyBrowse files
* fix(objectql,cli): the integrity audit stops when the engine does (#4747)
Every `os migrate` subcommand ended a SUCCESSFUL run with two
`ERROR Find operation failed` lines and a #4551 report naming
`sys_metadata` / `sys_view_definition` as `unreadableObjects`. That
bucket exists to separate "I could not check" from "I checked and it
was fine"; non-empty on every healthy run, it separated nothing.
Two silent no-ops stacked up:
- `ObjectQLPlugin` put its teardown in `stop()`, but the kernel's Plugin
contract is `init`/`start`/`destroy` — `stop()` is never called by
anyone, so the ADR-0057 sweep timers were never disarmed on any host.
- `bootSchemaStack().shutdown()` called `(runtime as any).stop?.()` and
`Runtime` has no `stop`. The optional call made "no teardown" look
exactly like "teardown performed": the kernel stayed running with
every timer armed while the command closed its driver.
60s after boot the sweep woke inside the still-alive process and read a
pool its own host had already disconnected.
- ObjectQLPlugin: `stop` -> `destroy`, the hook the kernel actually calls.
- bootSchemaStack: tear down via `kernel.shutdown()` — the same path
`os serve` takes on SIGTERM, so one-shot and server exit alike.
- LifecycleService.stop(): raise an abort bit the in-flight sweep holds,
not just clear timers; refuse to start a sweep once stopped.
- The audit takes that bit as `signal` and stops issuing reads. A read
that fails *because* the run was called off is dropped rather than
filed — it is not evidence about the datasource. The new
`DanglingReferenceReport.aborted` keeps the incompleteness loud
without spending the finding bucket on it.
A genuine datasource fault still lands in `unreadableObjects`, and the
audit still runs on CLI hosts: this is a liveness boundary, not the
"one-shot commands skip the audit" switch the issue rejected.
Fixes#4747
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015Br2xsJsczFsTR9bvbh2Ny
* chore(changeset): objectql 定级 minor —— 本 PR 新增了公共 API
`AuditAbortSignal` 从包根导出,加上 `DanglingReferenceAuditOptions.signal`
与 `DanglingReferenceReport.aborted` 两个新字段:新增公开面按仓内先例
(#4791 因新增 `sealNodeTypeVocabulary()` 等公共 API 定 minor)是 minor,
不是 patch。`@objectstack/cli` 只动了内部的 schema-migrate.ts,维持 patch。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015Br2xsJsczFsTR9bvbh2Ny
---------
Co-authored-by: Claude <noreply@anthropic.com>
0 commit comments